自动行动生日= 19

时间:2015-02-12 18:06:45

标签: python orm openerp odoo openerp-8

我有一张叫做学生的桌子,我需要每天检查一下男生的年龄,知道他们是否超过19岁。我知道我应该运行cron功能来检查每天的出生日期,但我需要得到出生日期栏中的值,做一些操作以使年龄超过19岁,将年龄超过19岁的学生添加到另一个表格。

这就是我所做的:D请在评论中帮助我:)

Python代码

def get_age_comp(self, cr, uid, birth_date,gender , context=None):


  # birth_date and gender are names of columns in fci.students table like :

  #'birth_date': fields.date(string='Birth Date', required=True)

  #'gender': fields.selection([('m', 'Male'), ('f', 'Female')], string='Gender', required=True)


  student_obj = self.pool.get('fci.student')

  current_date = datetime.now()

  current_year = current_date.year

  birth_dates = parser.parse(birth_date)

  current_age = current_year - birth_dates.year

  gender = student_obj.search(cr, uid, [('gender', '=', True), ('gender', 'like', 'm')])

  if current_age > 19 & gender=='m':


  #i don't know if i do it right and i need to insert these students (name ,age ) to table called 'stat'

XML CODE

<record id="ir_cron_actions" model="ir.cron">
  <field name="name">Check age Job</field>
  <field eval="True" name="active"/>
  <field name="user_id" ref="base.user_root"/>
  <field name="interval_number">1</field>
  <field name="interval_type">days</field>
  <field name="numbercall">-1</field>
  <field eval="'fci.student'" name="model"/>
  <field eval="'get_age_comp'" name="function"/>
  <field eval="'()'" name="args"/>
</record>

1 个答案:

答案 0 :(得分:1)

它可能不是最明亮的方式,但你应该能够做到这样的事情:

def get_age_comp(self, cr, uid, context=None):
    cr.execute('DELETE FROM stat;')
    cr.execute('''INSERT INTO stat(name, age)
                  SELECT name, date_part('years',age(birth_date))
                  FROM fci_student
                  WHERE gender='m'
                  AND date_part('years',age(birth_date)) > 18;''')

如果你不想每次都删除现有的统计行,你可以在these answers中做一些关于postgresql'插入或更新'的内容

编辑:如果您想使用new api

你可以添加这些导入:

from openerp import api
from datetime import date
from dateutil.relativedelta import relativedelta

然后该方法可以成为:

@api.model
def get_age_comp(self):
    for student in self.search([('gender','=','m'), ('birth_date', '<=', date.today() - relativedelta(years=20))]):
        self.env.cr.execute('INSERT INTO stat VALUES(%s,%s)', (student.name, student.birthdate))

因为stat似乎不是odoo模型,所以无法通过ORM API访问它,我们必须使用sql。

如果我弄错了,stat是一个odoo模型,代码可能会变成:

@api.model
def get_age_comp(self):
    to_add = {}
    # getting all male older than 19 years from fci.student
    for student in self.search([('gender','=','m'), ('birth_date', '<=', date.today() - relativedelta(years=20))]):
        to_add[student.name] = student.birth_date
    # ignoring the students already in stat
    for stat in self.env['stat'].search([('name', 'in', to_add.keys())]):
        del to_add[stat.name]
    # adding the new ones
    for name, birth_date in to_add.iteritems():
        stat_model.create({'name': name, 'birth_date': birth_date})

我没有在stat使用年龄,因为这是一个不好的做法(每个人每年至少更改一次)但你可以看到关于calculating age from date的这个问题并将其混合在一起代码。

编辑:针对评论中添加的案例

  

如果他的话,在学生表(underage-getCard-gotCard)中创建状态   年龄不到20岁,他的身份应该是   未成年人,如果他拿到卡,他的身份应该是getCard,如果他   得到卡的状态应该是gotCard ..我想知道如何   更改代码中的状态:)

如果这是你唯一想做的事情,可以通过以下方式完成:

@api.model
def get_age_comp(self):
    self.search([('gender','=','m'), ('status', '=', 'underage'),
                 ('birth_date', '<=', date.today() - relativedelta(years=20))
                ]).write({'status': 'getCard'})

另外,就像之前所做的那样,你可以循环.search()结果:

@api.model
def get_age_comp(self):
    for student in self.search([('gender','=','m'), ('birth_date', '<=', date.today() - relativedelta(years=20)), ('status', '=', 'underage')]):
        student.status = 'getCard'
        # do other things here