Overide write function

2019-09-19 01:53发布

He there i tried to override write function to change the student 'standard' in 'fci_student' model and 'fci_standard' model but no luck :( could i have some help ?

and here is my student table model:

from openerp.osv import osv, fields
from datetime import date
from dateutil.relativedelta import relativedelta


class fci_student(osv.osv):
    _name = 'fci.student'
    _columns = {
        'photo': fields.binary(string='Photo'),
        'name': fields.char(size=128, string='First Name', required=True),
        'middle_name': fields.char(size=128, string='Middle Name', required=True),
        'last_name': fields.char(size=128, string='Last Name', required=True),
        'status': fields.selection([('under_Age', 'Under Age'), ('get_card', 'Get Card'), ('got_card', 'Got Card')],
                                   string='Military Status'
                                   , default='under_Age'),
        # basic details
        'user_id': fields.many2one('res.users', 'User'),
        "birth_date": fields.date(string='Birth Date', required=True),
        'gender': fields.selection([('m', 'Male'), ('f', 'Female'), ('o', 'Other')], string='Gender', required=True),
        'title': fields.selection([('mr', 'Mr.'), ('ms', 'Mrs.')], string='Title'),
        'Paid': fields.boolean('Paid Student'),
        'nationality': fields.many2one('res.country', string='Nationality'),
        'id_number': fields.char(size=64, string='ID Card Number', required=True),
        'phone': fields.char(string='Phone Number', size=256, required=True),
        'email_address': fields.char(string='E-mail', size=256, required=True),
        'pay_amount': fields.char(size=64, string='Payment', required=True),
        # Edictional details
        'standard_id': fields.many2one('fci.standard', string='Standard', required=True),
        'group_id': fields.many2one('fci.standard.groups',string='Groups(s)'),

        'terms_id': fields.many2one('fci.terms', string='Term'),
        'sit_number': fields.integer(size=128, string='Sit Number',required=True),
        'subject_id':fields.many2many('fci.subject','student_sub_rel','sub_student_rel','sub_stu_id','Subjects'),
        # Parent details
        'parent_name': fields.char(size=128, string='Parent First Name'),
        'parent_middle_name': fields.char(size=128, string='Parent First Name'),
        'parent_last_name': fields.char(size=128, string='Parent First Name'),
        'parent_phone': fields.integer(size=128, string='Parent Number'),
        'parent_ids': fields.char(size=128, string='Parent E-mail'),
        # Library details
        'library_card_number': fields.char(size=64, string='Library Card Number'),
        'library_card_type': fields.char(size=64, string='Library Card type'),
        'number_of_books_allow': fields.char(size=64, string='Number of books allow'),
        # Address details
        'street_name': fields.char(size=128, string='Street', required=True),
        'city_name': fields.char(size=128, string='City', required=True),
        'state_name': fields.char(size=128, string='State', required=True),
        'Zip': fields.char(size=128, string='Zip Code'),
        'country': fields.char(size=128, string='country', required=True),
        #Exams
        'exam_res': fields.char(size=128, string='Results'),
        'grade': fields.char(size=128, string='Results'),
        'percentage': fields.char(size=128, string='Results'),

    }
#write function to edit student and move him from Standard A to standard B
   def write(self, cr, uid, ids, values, context = None):
       res = super(fci_student, self).write(cr, uid, ids, values, context = context)
       if values.get('standard_id'):
           self.pool.get('fci.standard').write(cr, uid, values['standard_id'], {'student_ids' : [(0, 0, values)]}, context=context)

       return res
#create function to add student to standard model
def create(self, cr, uid, vals, context=None):
        context = context or {}
        created_id = super(fci_student, self).create(cr, uid, vals, context=context)
        if vals.get('standard_id') and vals.get('group_id'):
            self.pool.get('fci.standard').write(cr, uid, vals['standard_id'],
                                                {'student_ids': [(4, created_id)]}, context=context)
            self.pool.get('fci.standard.groups').write(cr, uid, vals['group_id'],
                                                {'student_ids': [(4, created_id)]}, context=context)

and here is my standard table model :

from openerp.osv import osv, fields

class fci_standard(osv.osv):
    _name = 'fci.standard'
    _order = 'sequence'
    _columns = {
        'code': fields.char(size=8, string='Code', required=True),
        'name': fields.char(size=32, string='Name', required=True),
        'sequence': fields.integer('Sequence'),
        'student_ids': fields.many2many('fci.student', 'student_standard_rel', 'fci_student_standard_id', 'standard_id',
                                        string='Student(s)'),
        'groups_ids': fields.many2many('fci.standard.groups', 'standard_group_rel', 'fci_standard_group_id', 'standard_group_id',
                                        string='Groups(s)'),

    }
fci_standard()

it only change the standard in 'fci_student' but it didn't move the student from standard 'A' to standard 'B ' in the standard model!!

1条回答
混吃等死
2楼-- · 2019-09-19 02:09

You have defined wrong relationship between student and standard, in fci.student there is standard_id is many2one then there must be one2many relation in fci.standard for student_ids then and only then you will get auto effect while you changed the standard of any students.

In your case no need to override write method just changed the fields definition like below,

'student_ids': fields.one2many('fci.student', 'standard_id','Student(s)'),

When you changed standard of any students then you will see effect at both side. you need to restart server and update module as well.

查看更多
登录 后发表回答