2015-02-12 2 views
-1

У меня есть таблица, называемая студентами, и мне нужно каждый день проверять возраст студентов-мужчин, чтобы узнать, больше ли их 19 или нет. Я знаю, что я должен работать cron, чтобы каждый день проверять даты рождения мне нужно получить значения в столбце даты рождения, выполните некоторые операции, чтобы получить возраст более 19 лет или нет, добавьте учащихся, возраст которых больше 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 КОД

<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> 
+0

почему вниз голосования на мой вопрос без ответа !! –

ответ

1

это не может быть brightiest путь , но вы должны быть в состоянии сделать что-то вроде этого:

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;''') 

, если вы не хотите отказаться от существующих Stat на строки каждый раз, вы могли бы сделать что-то вроде в 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, он недоступен через API ORM, и мы должны использовать 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 и смешать его в коде.

редактировать: для случая добавил в комментарии

создать статус студента таблицы (несовершеннолетней-getCard-gotCard), если его возраст менее 20 лет, его статус должен быть несовершеннолетним, если он получает карту его статус должен быть getCard, если он получил карточку статус должен быть gotCard..i хочет знать, как статус изменения в коде :)

, если это была единственным что вы хотели сделать, это может быть сделано с:

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

otherway, как это делалось раньше, вы могли бы петля на .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 
+0

спасибо за ваш повтор, но с помощью SQL-операторов очень легко сделать это с помощью ORM python. –

+0

я не вижу никаких преимуществ питона ОРМ в этом случае, особенно если 'stat' не является модель odoo, но я редактировал свой ответ с ним –

+0

спасибо за вашу помощь дорогой дорогой: D \t мог я задайте другой вопрос? если мне нужно просто создать статуи в таблице учеников (underage-getCard-receivedCard), и я хочу, если его возраст превышает 19 лет, его статус должен быть несовершеннолетним, если он получает карту, его статус должен быть получен, если он получит карту статуса должен быть полученCard..и хочу знать, кто изменить статус в коде :) заранее спасибо –