0
votes

Comment filtrer la colonne par une autre colonne dans odoo 12?

J'essaye de filtrer une colonne "item" qui a un type many2one basé sur les noms qui existent déjà dans une autre colonne "itemsnames" qui a un type char, je ne peux pas écrire le domaine dans le fichier xml, voici mon fichier xml:

class class2(models.Model):
    _name = 'module.item'
    name = fields.Char(string='item')


class class3(models.Model):
    _name = 'module.categorieitem'
    name = fields.Many2one('module.categorie', string='Categorie')
    item = fields.Many2one('module.item', string='Item')


class class4(models.Model):
    _inherit = 'sale.order.line'
    categorie = fields.Many2one('module.categorie')

    # list1=[1,2]
    # item = fields.Many2one('module.item', domain=[('id', '=', list1)])
    item = fields.Many2one('module.item')
    itemsids = fields.Char()
    itemsnames = fields.Char()

    @api.onchange('categorie')
    def _onchange_categorie(self):
        print('»»» call onchange_categorie')
        res = {}
        items_ids = []
        items_names = []
        records = self.env['module.categorieitem'].search([('name','=',self.categorie .id)])
        for record in records:
            print(record.item.name)
            items_ids.append(record.item.id)
            items_names.append(record.item.name)
        self.itemsids = items_ids
        self.itemsnames = items_names
        print('itemsnames: ',self.itemsnames)
        res['domain'] = {'item':[('id','in',items_ids)]}
        return res

Voici le fichier python:

<record id="sale_order_line_form_inherited" model="ir.ui.view">
            <field name="name">sale_order.line.form.inherited</field>
            <field name="model">sale.order</field>
            <field name="inherit_id" ref="sale.view_order_form"/>
            <field name="arch" type="xml">
                <xpath expr="//tree//field[@name='name']" position="after">
                    <field name="categorie"/>
                    <!--<field name="item" domain="[('item.name','=', 'name.name')]"/>-->
                    <!--<field name="item" domain="[('item.name','in',items)]"/>-->
                    <field name="item" domain="[('item.name','in',itemsnames)]"/>
                    <field name="itemsids"/>
                    <field name="itemsnames"/>
                </xpath>
            </field>
        </record>

Voici une capture d'écran pour la vue

view


0 commentaires

3 Réponses :


0
votes

Cela me semble un problème de diffusion.

Vous déclarez itemsnames comme char,

class class4(models.Model):
  ...
  item_id = fields.Many2one('module.item', domain="[('item_name','in',self.items_names_list)]")
  item_name = fields.Char(related="item_id.name", store=False)

et même si items_names type est liste

domain="[('item.name','in',items_names_list)]

lorsque vous attribuez une liste à un champ Char , une conversion de type doit avoir lieu . Ainsi, self.itemsnames obtient une représentation sous forme de chaîne de votre liste, pas une liste.

import simplejson as json
...
class class4(models.Model):
  ...
  def _onchange_categorie(self):
    ...
    self.itemsnames = jsons.dumps(items_names)

  @property  
  def items_names_list(self):
    return json.loads(self.itemsnames)

Ensuite, vous utilisez itemsnames comme s'il avait un tableau alors qu'il n'en a pas

domain="[('item.name','in',itemsnames)]

Puis-je suggérer de stocker dans itemsnames une représentation JSON de items_names? Ainsi, vous pourrez à nouveau obtenir une liste plus tard. Le code Python peut ressembler à quelque chose comme:

self.itemsnames = items_names

et changez le domaine en

items_names = []
...
items_names.append(record.item.name)

Modifié pour adresser le Champ non valide exception:

Il y a d'autres problèmes:

  1. Lorsque vous utilisez des champs Many2one, le nom du champ doit se terminer par _id car sinon, Odoo ne générera pas la table pour stocker la relation dans la base de données.
  2. item (maintenant item_id ) est un champ mais item.name ne l'est pas. Vous devez utiliser un champ connexe pour avoir ces informations dans ce modèle (voir https://www.odoo.com/documentation/12.0/reference/orm.html#related-fields )
  3. items_names_list a été défini comme une propriété de classe donc, dans votre classe, il doit être appelé comme self.items_names_list

Alors, essayez quelque chose comme:

class class4(models.Model):
  ...
  itemsnames = fields.Char()


1 commentaires

merci, mais j'obtiens cette erreur: augmenter ValueError ("Champ non valide% r dans la feuille% r"% (gauche, str (feuille)))



0
votes
XXX

1 commentaires

Puis-je suggérer d'utiliser _logger.info ou _logger.debug au lieu de print ?



0
votes

classe SalesController (http.Controller):

@http.route('/rounds/details', type='http', auth="public", website=True)
def pos_details_json(self):
    rounds = http.request.env['sale.order.line'].search([])
    my_list = []
    for data in rounds:
        my_list.append({'Line Name': data.item.name})

    return json.dumps(my_list)


0 commentaires