Пишите не работает Odoo 8

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

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

Также он работал раньше, но без видимой причины он больше не работает.

Кто-нибудь имеет представление о том, что может вызвать это?

# -*- 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

1 ответ

Решение

Очевидно, это не сработает. В двух словах, причина в том, что вы вызываете ошибку в функции, и это заставляет Odoo думать, что в вашей функции что-то идет не так, и фактическая запись в базу данных не происходит (вместо этого происходит откат). Чтобы убедиться, что данные записываются в базу данных, вы должны позвонить 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!")

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

Другие вопросы по тегам