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?
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)
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With