Q:

Return form dynamically

Hi any help please how can I return values of One2many  in a new form dynamically.
I have three class I define a function where I return  the values of many2many(rubrique_ids) and One2many(critere_ids) exist recently in a new form  how can I  return(generate) form dynamically from values of One2many fields 
file xml
    <button name="evaluer" string="Evaluer" type="object"/>

first class
    class A(models.Model):
        _name='risques.risque'
        _rec_name='nom_risque'

        nom_risque = fields.Char(required=True, string="Nom du Risque")
        rubrique_ids = fields.Many2many('risques.rubrique', string="Rubrique", required=True)

Second class : 
    class B(models.Model):
        _name='risques.rubrique'
        _rec_name='nom_rubrique'

        critere_ids = fields.One2many('risques.critere','rubrique_id',required=True, string="Critére d'évaluation")
        nom_rubrique = fields.Char(string="Rubrique")

Third class
    class C(models.Model):
        _name='risques.critere'
        _rec_name='nom_critere'

        nom_critere = fields.Char(string="Nom du Critere")
        note = fields.Float(string="Note", readonly=True, compute='_onchange_mesure')
        rubrique_id = fields.Many2one('risque.rubrique',
                                    string='Rubrique')

    class etude(models.Model):
        _name = 'etude.risque'
        client = fields.Many2one('res.partner', string="Client",required=True, index=True)
        risque = fields.Many2one('risques.risque', string="Risque",required=True)
        def evaluer(self):
            context = self._context.copy()
            rubriques=self.risque.risque_id
            nom_rub=[]
            rubs = self.env['risques.rubrique'].browse(rubriques)
            critere_etude =[]
            my_vals = []
            for a in enumerate(rubs):

                i = a[0]
                r = self.env['risques.rubrique'].search([('id','=',self.risque.risque_id[i].id)])
                cr = self.risque.risque_id[i].critere
                for b in enumerate(cr):
                    j = b[0]
                    critere_etude.append(cr.search([('id','=',cr[j].id)]).nom_critere)
                    print cr.search([('id','=',cr[j].id)]).id

                nom_rub.append({'etude_id' : 1,
                                'rubrique_etude':r.nom_categorie,
                                'critere_etude':critere_etude
                                })
                critere_etude = []
                my_vals.append(nom_rub)
                nom_rub = []

            self.env['risque.evaluation'].create({'risque_etude': self.risque.nom_risque,
                                                  'etude': my_vals})

            return {
                'name': 'Evaluation',
                'view_type': 'form',
                'view_mode': 'tree,form',
                #'views': [{'view_mode': 'form', 'view_id': 'rub_id'}],
                'res_model': 'risque.evaluation',
                'type': 'ir.actions.act_window',
                'res_id': self.id,
                #'target': 'new',
                'context': context,
            }

how can I return rubrique_ids and critere_ids dynamically

A:

first of all when you search for form user this:
  form_id = self.evn.ref('addon_name.form_xml_id').id # form_id must be integer value not object
  # ex:   form_id = self.env.ref('sale.some_form_id').id
  # ex:   form_id = self.env.ref('point_of_sale.some_other_form_id').id
  # same thing for any view always look for it by the xml id.

Now when you open the action in return if you are opening the record in one view
for example in form view:
     form_id = self.evn.ref('addon_name.form_xml_id').id
     return {
            'name': 'Evaluation',
            'view_type': 'form',
            'view_mode': 'form',
            'view_id': form_id, 
            'res_id': record_id, # integer value if you want to open a specific record 
                                 # if not just put False or remove res_id this will open the form
                                 # in create mode but when you specify the id in edit mode
            ....
            ...
            }

Now if you want to open the more than one record and in  more than one view.
        form_id = self.evn.ref('addon_name.form_xml_id').id
        tree_id = self.evn.ref('addon_name.tree_xml_id').id
        return {
            'name': 'Evaluation',
            'view_type': 'form',
            'view_mode': 'tree,form',
            'view_id': form_id,
            'views': [(tree_id, 'tree'), (form_id, 'form')] # list of tuple (id, view_code)
            'domain': [some_domain], # when you open more than one record we don't user res_id
                                     # we use domain to filter just those record that we want ot see
            .....
            .....

Hope this gives you an idea how to specify witch view to user:
Note: for search view:
      'search_view_id': search_id, # integer value don't pass the object will give json error in client

