2016-06-29 4 views
0

У меня есть проблема, когда я пытаюсь изменить информацию для res.partner, но только в этом файле, в других моих модулях .WRITE работает ...Написать не работает Odoo 8

Я знаю, что это происходит в пишите и что он приносит информацию, но это просто не спасает.

Также он работал до этого, но по какой-либо очевидной причине он больше не работает.

У кого-нибудь есть представление о том, что может это сделать?

# -*- coding: utf-8 -*- 
from openerp import models, fields, api, tools, exceptions 
from openerp.exceptions import Warning 
import json, urllib, time 


class MAJClientsWizard(models.Model): 
    _name = "maj.clients" 

    @api.one 
    def maj_clients(self): 
     erreur = "" 
     clients = self.env["res.partner"].search([['is_company', '=', True], ['customer', '=', True]]) 
     for client in clients: 
      retour = maj_coordonnees(client) 
      if retour: 
       erreur += retour + ", " 
     if erreur: 
      raise Warning("Les détaillants qui ont une erreur dans leur code postal sont: ", erreur, "Tous les autres ont été mis à jour!") 
     else: 
      raise Warning("Tous les détaillants ont été mis à jour avec succès!") 


def maj_coordonnees(client): 
    if client.date_localization < time.strftime("%Y-%m-%d"): 
     if client.zip: 
      result = geo_find(client.zip) 

      if result: 
       client.write({ 
        'partner_latitude': result[0], 
        'partner_longitude': result[1], 
        'date_localization': (time.strftime("%Y-%m-%d")) 
       }) 
      else: 
       return client.name 
     else: 
      return client.name 


def geo_find(addr): 
    url = 'https://maps.googleapis.com/maps/api/geocode/json?sensor=false&key=*****&address=' 
    url += urllib.quote(addr.encode('utf8')) 

    try: 
     result = json.load(urllib.urlopen(url)) 
    except Exception, e: 
     return 'Network error, Cannot contact geolocation servers. Please make sure that your internet connection is up and running (%s).' + e 
    if result['status'] != 'OK': 
     return None 

    try: 
     geo = result['results'][0]['geometry']['location'] 
     return float(geo['lat']), float(geo['lng']) 
    except (KeyError, ValueError): 
     return None 

ответ

0

Очевидно, что это не сработает. Вкратце причина заключается в том, что вы вызываете ошибку из функции, и это заставляет Оду думать, что в вашей функции все пошло не так, и фактическая запись в базу данных не происходит (что происходит, а это откат). Для того, чтобы убедиться, что получает данные записываются в базу данных, вы должны вызвать функцию commit() явно перед поднятием об ошибке, например, так:

class MAJClientsWizard(models.Model): 
    _name = "maj.clients" 

    @api.one 
    def maj_clients(self): 
     erreur = "" 
     clients = self.env["res.partner"].search([['is_company', '=', True], ['customer', '=', True]]) 
     for client in clients: 
      retour = maj_coordonnees(client) 
      if retour: 
       erreur += retour + ", " 

     self.env.cr.commit() #NOTE: commit changes to database before raising an error in order to prevent rollback 

     if erreur: 
      raise Warning("Les détaillants qui ont une erreur dans leur code postal sont: ", erreur, "Tous les autres ont été mis à jour!") 
     else: 
      raise Warning("Tous les détaillants ont été mis à jour avec succès!") 

P.S.
Хотя это не связано с сообщением о проблеме, я хотел бы отметить, что в общем случае @ api.multi следует использовать вместо @ api.one по соображениям производительности.

+0

Спасибо, что он работает сейчас! – Zada1100

+0

Добро пожаловать! –