Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

create and edit items of a one2many field through on_change method

Tags:

openerp

I have this class (evaluation)

class schoolem_evaluation(osv.Model):
_name = 'schoolem.evaluation'
_columns = {
    'name' : fields.char('Evaluation',help="Champ automatique = periodeN_ExamenN_CoursX_SalleDeClasseS"),
    'aca_id' : fields.many2one('schoolem.aca','Annee Academique',required=True),
    'periode_id' : fields.many2one('schoolem.periode','Periode',required=True,help="Par exemple : trimestre01"),
    'examen_id' : fields.many2one('schoolem.examen','Examen',required=True),
    'salle_de_classe_id' : fields.many2one('schoolem.salle_de_classe','Salle de Classe',required=True),
    'cours_id' : fields.many2one('schoolem.cours','Cours',required=True),
    'note_ids' : fields.one2many('schoolem.note_evaluation','evaluation_id','Notes'),
}   

and this class (note_evaluation)

class schoolem_note_evaluation(osv.Model):
    _name = 'schoolem.note_evaluation'
    _order = 'etudiant_id'
    _columns = {
        'name' : fields.float('Note',digits=(6,2),required=True),
        'evaluation_id' : fields.many2one('schoolem.evaluation','Evaluation',),
        'etudiant_id' : fields.many2one('schoolem.etudiant','Etudiant',required=True),
        'rang' : fields.integer('Rang'),
        'observation' : fields.text('Observation'),
    }

And I would like the user to be able to generate one2many note_evaluation lines through an on_change method when selecting the value of the last field(cours_id) in the Evaluation_form; and to make that the generated lines appear directly in the view, so that he can insert the name value (note) of each note_evaluation line. And save all.

Is it possible? This is my current XML view file

<field name="cours_id"  context="{'evaluation_id': active_id, 'test': 1}" on_change="on_change_cours_id(examen_id,salle_de_classe_id,cours_id,aca_id)"/>
                    </group>
                    <notebook>
                        <page string="Inserer des notes">
                            <field nolabel="1" name="note_ids" context="{'evaluation_id': active_id}"/>
                        </page>

and this is the onchange function:

def on_change_cours_id(self,cr, uid, ids,examen_id,salle_de_classe_id,cours_id,aca_id,context=None):

        context=context or {}

        #if context is None:

         #   context = {}
                for etud_id in etudiant_ids:

                    note_eval = self.pool.get('schoolem.note_evaluation')

                    if not context.get('id', False): #id de l'evaluation

                        context['id'] = context.get('evaluation_id')

                    eval_id = context.get('id', False)
                    raise osv.except_osv(('the form!'), (context.get('active_id')))

                    id = note_eval.create(cr, uid, {'name':0,'etudiant_id':etud_id,'evaluation_id':eval_id}, context=context)

With this, it the on_change method create the note_evaluation in the database but the user interface do not load them and the one2many field remain empty. I observe the note_evaluation in teh database donnot have the evaluation_id.

How to do?

like image 471
levolutionniste Avatar asked Jan 06 '14 16:01

levolutionniste


1 Answers

For loading the one2many data using onchange, you dont have to create the one2many data from the onchange function. You just need to create the values to the one2many field. For example

def on_change_cours_id(self,cr, uid, ids,examen_id,salle_de_classe_id,cours_id,aca_id,context=None):
    context=context or {}
    note_ids = []
    value = {}
    if ids:
        old_note_ids = self.pool.get('schoolem.note_evaluation').search(cr, uid,[('evaluation_id','in',ids)])
        self.pool.get('schoolem.note_evaluation').unlink(cr, uid, old_note_ids)
    etudiant_ids = []
    #search for etudiant_ids with the conditions examen_id,salle_de_classe_id,cours_id,aca_id etc
    for etud_id in etudiant_ids:
        note_ids.append((0,0,{'name':0,'etudiant_id':etud_id}))
    value.update(note_ids=note_ids)
    return {'value':value}

Here I have done an unlink because when you save this record and again somehow loads the onchange, the new one2many list will be showed. but when a saving, you can see the old records and new one.SO unlink will remove the old records.ALso when appending to note_ids, i have used tuples with 0,0,{values}, following is the explanation for that

(0, 0,  { values })    link to a new record that needs to be created with the given values dictionary
(1, ID, { values })    update the linked record with id = ID (write *values* on it)
(2, ID)                remove and delete the linked record with id = ID (calls unlink on ID, that will delete the object completely, and the link to it as well)
(3, ID)                cut the link to the linked record with id = ID (delete the relationship between the two objects but does not delete the target object itself)
(4, ID)                link to existing record with id = ID (adds a relationship)
(5)                    unlink all (like using (3,ID) for all linked records)
(6, 0, [IDs])          replace the list of linked IDs (like using (5) then (4,ID) for each ID in the list of IDs)
like image 120
OmaL Avatar answered Nov 23 '22 17:11

OmaL