Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/346.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何修复python';奥多的环境_Python_Openerp - Fatal编程技术网

如何修复python';奥多的环境

如何修复python';奥多的环境,python,openerp,Python,Openerp,自2016年以来,我为我的公司开发了一套代码。但现在我不明白我为什么会有这个错误。 让我解释一下。 管理员用户可以创建对象。以前技术用户也可以这样做,但现在无法创建“line.troncon”对象。我的意思是,技术用户可以创建除“line.troncon”模型之外的所有对象。 这是密码 class gc_fibertroncon(models.Model): """Classe qui modelise un troncon""" _name = 'line.troncon' def getS

自2016年以来,我为我的公司开发了一套代码。但现在我不明白我为什么会有这个错误。 让我解释一下。 管理员用户可以创建对象。以前技术用户也可以这样做,但现在无法创建“line.troncon”对象。我的意思是,技术用户可以创建除“line.troncon”模型之外的所有对象。 这是密码

class gc_fibertroncon(models.Model):
"""Classe qui modelise un troncon"""
_name = 'line.troncon'

def getSelectionTypeofTroncon(self):
    """ """
    return TYPEDETRONCONS  

@api.one
@api.depends('node_origin_id','node_destination_id')
def compute_name(self):
    if self.node_origin_id and self.node_destination_id and self.origine and self.destination:
        self.name = str(self.node_origin_id.zone_id.numero_zone) + 'T' + NUM_NOEUD_DICT[self.origine] + NUM_NOEUD_DICT[self.destination] + '-' + str(self.id)

@api.one
def create_default_fourreau(self):
    """"""
    if not self.fourreau_ids:
        self.env['line.fourreau'].create({'name':self.name.replace('T','F')})

@api.one
def delete_default_fourreau(self):
    """"""
    if not self.fourreau_ids:
        fourreau = self.env['line.fourreau'].search({'name':self.name.replace('T','F')})
        fourreau.unlink()


@api.one
@api.depends('origine','destination','liaison_ids','fourreau_ids')  
def _compute_booleans(self):
    """"""
    self.b_liaison_ids = True if len(self.liaison_ids)>0 else False
    self.b_fourreau_ids = True if len(self.fourreau_ids)>0 else False

    self.b_node_destination_id = True if len(self.node_destination_id)>0 else False
    self.b_node_origin_id = True if len(self.node_origin_id)>0 else False

@api.one
def get_fibres_name(self):
    """"""
    res=[]
    if self.fourreau_ids:
        for fourreau in self.fourreau_ids:
            if fourreau.cable_ids:
                for cable in fourreau.cable_ids:
                    if cable.tube_ids:
                        for tube in cable.tube_ids:
                            res.extend(tube.get_fibres_name())
    return res

@api.multi
@api.onchange('origine')
def get_domain_origine(self):
    """"""
    return {
        'domain':{'node_origin_id':[('type','=',self.origine)]}
    }

@api.multi
@api.onchange('destination')
def get_domain_destination(self):
    """"""
    return {
        'domain':{'node_destination_id':[('type','=',self.destination)]}
    }
# @api.one
# @api.depends('node_origin_id')
# def _compute_parent_id(self):
#     """"""
#     if self.node_origin_id:
#         rec = self.env['line.troncon'].search([('node_destination_id.id','=',self.node_origin_id.id)])
#         if rec:
#             _logger.debug('\n' * 3 + str(rec))
#             rec.ensure_one()
#             self.parent_id = rec    
#         else:
#             self.parent_id = False
#     # TODO : Rajouter un controle sur le type!!
#     else:
#         self.parent_id = False


@api.one
@api.depends('name','type','liaison_ids','fourreau_ids','node_origin_id','node_destination_id','geolocate')#,'parent_id','child_ids')
def compute_geojson(self):
    def set_geo_linestring(gs):
        geo_coord_pool = self.env['geo.coord']         
        geo_coord_search = geo_coord_pool.search([('model_id','=',self.id),('model_type','=',self.type),('model_geolocate_json','=',gs)],limit=1)
        if geo_coord_search:
            self.geo_id = geo_coord_search.id                
        else:
            geo_coord = geo_coord_pool.create({'model_geolocate_json':gs})
            self.geo_id = geo_coord.id

    if self.geolocate:
        gs = geojson.loads(self.geolocate)
        gs['type'] = self.name
        for feature in gs['features']:
            feature['id'] = self.id or False
            feature['properties'] = {'NodeType':self.type,'Model':self._name, 'display_name':self.name}
        self.geolocate_json = geojson.dumps(gs)
        set_geo_linestring(geojson.dumps(gs))
    elif self.node_origin_id and self.node_destination_id:
        gs = FeatureCollection([
            Feature(
                geometry=LineString((
                    [self.node_origin_id.longitude,self.node_origin_id.latitude],
                    [self.node_destination_id.longitude,self.node_destination_id.latitude]
                ))
            )
        ])
        gs['type'] = self.name
        for feature in gs['features']:
            feature['id'] = self.id or False
            feature['properties'] = {'NodeType':self.type,'Model':self._name}
        self.geolocate_json = geojson.dumps(gs)
        set_geo_linestring(geojson.dumps(gs))
    else:
        self.geolocate_json = ''
        self.geo_id = False

def populate_features(self, gs):
    gs['type'] = self.name
    for feature in gs['features']:
        feature['id'] = self.id or False
        feature['properties'] = {'NodeType':self.type,'Model':self._name}
    self.geolocate_json = geojson.dumps(gs)

@api.onchange('geolocate_json')
def onchange_geolocate_json(self):
    self.inverse_geojson()

@api.depends('name')
def inverse_geojson(self):
    self.geolocate = self.geolocate_json if self.geolocate_json else ''

def countEqpts(self):
    return{
        "Troncon"               : self.countInside(),
        "Noeud d'origine"       : self.node_origin_id.countInside() if self.node_origin_id else "Aucun",
        "Noeud de destination"  : self.node_destination_id.countInside() if self.node_destination_id else "Aucun",
    }

# Return a dict 
def countInside(self):
    my_point = {
        0 : self.id,
        1 : self.name,
        2 : [ 'line.fourreau', len(self.fourreau_ids), 'fourreaux' ],
        3 : [ 'line.cable', 0, 'cables' ],
        4 : [ 'line.tube', 0, 'tubes' ],
        5 : [ 'line.fibre', 0, 'fibres' ],
        6 : [ 'link.link', 0, 'liaisons']
    }

    for fourreau_id in self.fourreau_ids:
        my_point[3][1] += len(fourreau_id.cable_ids)
        for cable_id in fourreau_id.cable_ids:
            my_point[4][1] += len(cable_id.tube_ids)
            for tube_id in cable_id.tube_ids:
                my_point[5][1] += len(tube_id.fo_ids)
    return my_point

def getDetails(self):
    return{
        "name" : self.display_name,
        "properties" : {
            "diametre" : self.diametre,
            "longueur" : self.longueur,
            "origine" : self.origine,
            "destination" : self.destination
        }
    }

def getList(self, name_model ):
    if( name_model == 'line.fibre' ):
        return self.getFibres()
    elif( name_model == 'line.cable' ):
        return self.getCables()
    elif( name_model == 'line.tube' ):
        return self.getTubes()
    elif( name_model == 'line.fourreau' ):
        return self.getFourreau()

def getFibres(self):
    fibres = {}
    fibre_ids = self.env['line.fibre']

    for fourreau in self.fourreau_ids:
        for cable in fourreau.cable_ids:
            for tube in cable.tube_ids:
                fibre_ids = fibre_ids | tube.fo_ids

    for fibre in fibre_ids:
        fibres[ fibre.id ] = [ fibre.numero_fibre, 'line.fibre', fibre.id, fibre.display_name ]
    return sorted( fibres.values() )
    # self.env.cr.execute( "SELECT id, display_name FROM public.line_fibre WHERE id IN %s LIMIT %s OFFSET %s ", (tuple([x.id for x in fibre_ids]), 12, 0) )
    # _logger.error( self.env.cr.fetchall() )

def getCables(self):
    cables = {}
    cable_ids = self.env['line.cable']

    for fourreau in self.fourreau_ids:
        cable_ids = cable_ids | fourreau.cable_ids

    for cable in cable_ids:
        cables[ cable.id ] = [ cable.numero_cable, 'line.cable', cable.id, cable.display_name ]
    return sorted( cables.values() )
    # self.env.cr.execute( "SELECT id, display_name FROM public.line_cable WHERE id IN %s LIMIT %s OFFSET %s ", (tuple([x.id for x in cable_ids]), limit, offset) )
    # return self.env.cr.fetchall()


def getTubes(self):
    tubes = {}
    tube_ids = self.env['line.tube']

    for fourreau in self.fourreau_ids:
        for cable in fourreau.cable_ids:
            tube_ids = tube_ids | cable.tube_ids

    for tube in tube_ids:
        tubes[ tube.id ] = [ tube.numero_tube, 'line.tube', tube.id, tube.display_name ]
    return sorted( tubes.values() )
    # self.env.cr.execute( "SELECT id, display_name FROM public.line_tube WHERE id IN %s LIMIT %s OFFSET %s ", (tuple([x.id for x in tube_ids]), limit, offset) )
    # return self.env.cr.fetchall()


def getFourreau(self):        
    fourreaux = {}
    # fourreau_ids = self.env['line.fourreau']
    # fourreau_ids = fourreau_ids | self.fourreau_ids

    for fourreau in self.fourreau_ids:
        fourreaux[ fourreau.id ] = [ '', 'line.fourreau', fourreau.id, fourreau.display_name ]
    return sorted( fourreaux.values() )

    # self.env.cr.execute( "SELECT id, name FROM public.line_fourreau WHERE id IN %s LIMIT %s OFFSET %s ", (tuple([x.id for x in fourreau_ids]), limit, offset) )
    # return self.env.cr.fetchall()

def getInfos(self):
    return json.dumps({
        "Nom":str(self.name),
        "Origine":str(self.node_origin_id.name),
        "Destination":str(self.node_destination_id.name),
    })


def create_rel(self,origine=None,destination=None):
    rel = self.env['node.rel']
    rid = rel.create({'nO':origine,'nD':destination})
    return rid or False

def check_rel(self,origine=None,destination=None,rid=None):
    rel = self.env['node.rel']
    rel_search = rel.search([('nO','=',origine),('nD','=',destination)])
    if rel_search:
        troncon = self.search([('rel_id','=',rel_search.id)])
        if self._origin:
            if troncon and troncon.id != self._origin.id:
                raise ValidationError('Le troncon {} possede déjà la meme origine et la meme destination. Veuillez modifier'.format(troncon.name or 'ErrorDB'))
        else:
            raise ValidationError('Le troncon {} possede déjà la meme origine et la meme destination. Veuillez modifier'.format(troncon.name or 'ErrorDB'))
        return True
    else:
        return True

@api.onchange('node_origin_id','node_destination_id')
def onchange_origin_dest(self):
    if self.node_origin_id and self.node_destination_id:
        self.check_rel(self.node_origin_id.id,self.node_destination_id.id)

name = fields.Char(default="Troncon")
type = fields.Selection(selection=getSelectionTypeofTroncon)
diametre= fields.Float(string='Diametre', 
                                           digits=(5, 2))
description=fields.Text()
geolocate_json = fields.Text(string="Geo JSON",             compute=compute_geojson,inverse=inverse_geojson,store=True)
geolocate = fields.Text()
longueur=fields.Float(string='Longueur')

b_liaison_ids = fields.Boolean(compute=_compute_booleans, 
                                                       store=True)
b_fourreau_ids = fields.Boolean(compute=_compute_booleans, 
                                                            store=True)

b_node_destination_id = fields.Boolean(compute=_compute_booleans,
                                                                                 store=True)
b_node_origin_id = fields.Boolean(compute=_compute_booleans,
                                                                                  store=True)
origine = fields.Selection(string="Origine", selection=[('armoire','Armoire'),('chambre','Chambre'),('shelter','Local Technique')])
destination = fields.Selection(string="Destination", selection=    [('armoire','Armoire'),('chambre','Chambre'),('abonne','Abonné'),('boitier','PBO/PTO')])


node_origin_id = fields.Many2one('node.node', string="Noeud - Origine")
node_destination_id = fields.Many2one('node.node', string="Noeud - Destination")

liaison_ids= fields.Many2many(comodel_name='link.link',
                                                          column1='troncon_id',
                                                      column2='link_id',
                                                      string='Liaisons')
fourreau_ids = fields.Many2many(comodel_name='line.fourreau',
                                                            column1='troncon_id',
                                                            column2='fourreau_id',
                                                            string="Fourreau")
rel_id = fields.Many2one('node.rel',string='Relation')
geo_id = fields.Many2one('geo.coord',
    'Geometry',
    compute=compute_geojson,
    ondelete='restrict',
    store=True
)
geo_linestring = geo_fields.GeoLine(readonly=True, store=True, related='geo_id.geo_linestring')
@api.multi
def write(self,vals):
    if 'node_origin_id' in vals and vals.get('node_origin_id') and 'node_destination_id' in vals and vals.get('node_destination_id'):
            if vals.get('node_origin_id') and vals.get('node_destination_id'):
                    self.rel_id.unlink()
                    vals['rel_id'] = self.create_rel(vals.get('node_origin_id'),vals.get('node_destination_id')).id or False
            else:
                    vals['rel_id'] = False

    elif 'node_origin_id' in vals and vals.get('node_origin_id') and self.node_destination_id:
            if vals.get('node_origin_id'):
                    self.rel_id.unlink()
                    vals['rel_id'] = self.create_rel(vals.get('node_origin_id'),self.node_destination_id.id).id or False
            else:
                    vals['rel_id'] = False

    elif 'node_destination_id' in vals and vals.get('node_destination_id') and self.node_origin_id:
            if vals.get('node_destination_id'):
                    self.rel_id.unlink()
                    vals['rel_id'] = self.create_rel(self.node_origin_id.id,vals.get('node_destination_id')).id or False
            else:
                    vals['rel_id'] = False

    # type your code here
    today = datetime.today()
    for rec in self:
            log_pool = self.env['res.log'].create({'date':today,'action':'write','model_name':self._name,'model_id':rec.id,'values':vals})

    return super(gc_fibertroncon,self).write(vals) 

@api.model
def create(self,vals):
    # if 'node_origin_id' in vals and vals.get('node_origin_id') and 'node_destination_id' in vals and vals.get('node_destination_id'):
    #         if values.get('node_origin_id') and values.get('node_destination_id'):
    #                 values.['rel_id'] = self.create_rel(values.get('node_origin_id'),values.get('node_destination_id'))
    #         else:
    #                 values['rel_id'] = False

    res = super(gc_fibertroncon,self).create(vals)
    if res.node_origin_id and res.node_destination_id:
            res.rel_id = self.create_rel(res.node_origin_id,res.node_destination_id)

    # type your code here
    today = datetime.today()
    log_pool = self.env['res.log'].create({'date':today,'action':'create','model_name':self._name,'model_id':res.id,'values':vals})
    return res 

@api.one
def copy(self, default=None):
    res=super(gc_fibertroncon, self).copy(default)
    # type your code here
    today = datetime.today()
    log_pool = self.env['res.log'].create({'date':today,'action':'copy','model_name':self._name,'model_id':self.id,'values':''})
    return res 

@api.multi
def unlink(self):
    # type your code here
    today = datetime.today()
    log_pool = self.env['res.log'].create({'date':today,'action':'unlink','model_name':self._name,'model_id':self.id,'values':''})
    return models.Model.unlink(self)
所有被重写的方法都在我的项目的每个模型上显示

因此,当我的技术用户希望在line.troncon模型上添加插入时,出现了错误

    Traceback (most recent call last): 

    File "/opt/odoo/openerp/http.py", 
line 532, in _handle_exception return super(JsonRequest, self)._handle_exception(exception) 
    File "/opt/odoo/openerp/http.py", 
line 570, in dispatch result = self._call_function(**self.params) 
    File "/opt/odoo/openerp/http.py", 
line 305, in _call_function return checked_call(self.db, *args, **kwargs) 
    File "/opt/odoo/openerp/service/model.py", 
line 113, in wrapper return f(dbname, *args, **kwargs) 
    File "/opt/odoo/openerp/http.py", 
line 302, in checked_call return self.endpoint(*a, **kw) 
    File "/opt/odoo/openerp/http.py", 
line 800, in __call__ return self.method(*args, **kw) 
    File "/opt/odoo/openerp/http.py", 
line 398, in response_wrap response = f(*args, **kw) 
    File "/opt/odoo/addons/web/controllers/main.py", 
line 935, in call_kw return self._call_kw(model, method, args, kwargs) 
    File "/opt/odoo/addons/web/controllers/main.py", 
line 927, in _call_kw return getattr(request.registry.get(model), method)(request.cr, request.uid, *args, **kwargs) 
    File "/opt/odoo/openerp/api.py", 
line 241, in wrapper return old_api(self, *args, **kwargs) 
    File "/opt/odoo/openerp/api.py", 
line 336, in old_api result = method(recs, *args, **kwargs) 
    File "/opt/addons_gc/gc_fiber_network/models/gc_fiber_network.py", 
line 873, in create res = super(gc_fibertroncon,self).create(vals) 
    File "/opt/odoo/openerp/api.py", 
line 239, in wrapper return new_api(self, *args, **kwargs) 
    File "/opt/odoo/openerp/models.py", 
line 4055, in create record = self.browse(self._create(old_vals)) 
    File "/opt/odoo/openerp/api.py", 
line 239, in wrapper return new_api(self, *args, **kwargs) 
    File "/opt/odoo/openerp/api.py", 
line 462, in new_api result = method(self._model, cr, uid, *args, **kwargs) 
    File "/opt/odoo/openerp/models.py", 
line 4259, in _create recs.recompute() 
    File "/opt/odoo/openerp/api.py", 
line 239, in wrapper return new_api(self, *args, **kwargs) 
    File "/opt/odoo/openerp/models.py", 
line 5662, in recompute name: rec[name] for name in names 
    File "/opt/odoo/openerp/models.py", 
line 5662, in <dictcomp> name: rec[name] for name in names 
    File "/opt/odoo/openerp/models.py", 
line 5550, in __getitem__ return self._fields[key].__get__(self, type(self)) 
    File "/opt/odoo/openerp/fields.py", 
line 823, in __get__ return record._cache[self] 
    File "/opt/odoo/openerp/models.py", 
line 5905, in __getitem__ value = self._recs.env.cache[field][self._recs.id] KeyError: 588
回溯(最近一次呼叫最后一次):
文件“/opt/odoo/openerp/http.py”,
第532行,在异常返回super(JsonRequest,self)中。\u handle\u异常(exception)
文件“/opt/odoo/openerp/http.py”,
第570行,调度结果=self.\u调用函数(**self.params)
文件“/opt/odoo/openerp/http.py”,
第305行,函数返回选中的调用(self.db,*args,**kwargs)
文件“/opt/odoo/openerp/service/model.py”,
第113行,包装器返回f(dbname,*args,**kwargs)
文件“/opt/odoo/openerp/http.py”,
第302行,在checked_call return self.endpoint(*a,**kw)中
文件“/opt/odoo/openerp/http.py”,
第800行,在调用返回self.method(*args,**kw)中
文件“/opt/odoo/openerp/http.py”,
第398行,在响应中\u wrap response=f(*args,**kw)
文件“/opt/odoo/addons/web/controllers/main.py”,
第935行,在call_kw return self中。_call_kw(型号、方法、参数、kwargs)
文件“/opt/odoo/addons/web/controllers/main.py”,
第927行,在_call_kw return getattr(request.registry.get(model)、method)中(request.cr、request.uid、*args、**kwargs)
文件“/opt/odoo/openerp/api.py”,
第241行,在包装器中返回旧的_api(self、*args、**kwargs)
文件“/opt/odoo/openerp/api.py”,
第336行,旧的api结果=方法(recs,*args,**kwargs)
文件“/opt/addons\u gc/gc\u fiber\u network/models/gc\u fiber\u network.py”,
第873行,在create res=super(gc_fibertroncon,self)中。create(vals)
文件“/opt/odoo/openerp/api.py”,
第239行,在包装器中返回新的_api(self、*args、**kwargs)
文件“/opt/odoo/openerp/models.py”,
第4055行,在create record=self.browse(self.\u create(old\u vals))中
文件“/opt/odoo/openerp/api.py”,
第239行,在包装器中返回新的_api(self、*args、**kwargs)
文件“/opt/odoo/openerp/api.py”,
第462行,在新的api结果=方法中(self.\u model,cr,uid,*args,**kwargs)
文件“/opt/odoo/openerp/models.py”,
第4259行,在_createrecs.recompute()中
文件“/opt/odoo/openerp/api.py”,
第239行,在包装器中返回新的_api(self、*args、**kwargs)
文件“/opt/odoo/openerp/models.py”,
第5662行,在重新计算名称中:rec[name]代表名称中的名称
文件“/opt/odoo/openerp/models.py”,
第5662行,in name:rec[name]代表name in name
文件“/opt/odoo/openerp/models.py”,
第5550行,在uuuu getitem_uuuu返回self.u字段[键]。uuuu get_uuuu(self,键入(self))
文件“/opt/odoo/openerp/fields.py”,
第823行,在“获取”返回记录中
文件“/opt/odoo/openerp/models.py”,
第5905行,在uuu getitem_uuuuuvalue=self.\u recs.env.cache[field][self.\u recs.id]键中错误:588
“env”变量似乎不同

我怎样才能解决这个问题


各位,我将非常感谢你们的建议。

请提供你们的计算方法定义。..Hi@DexJ,我更新了代码。请提供你们的计算方法定义。..Hi@DexJ,我更新了代码