Proteus stock_move and move.origin

je bloque encore sur l’importation des mouvements sans origine.

j’ai tenté Create initial stock moves with proteus - #5 by DancesWithHaggises

TypeError: ‘<’ not supported between instances of ‘stock.move’ and ‘stock.move’

et je ne sais pas ou implémenter def _lt_(self, other):

j’ai alors essayé Create initial stock moves with proteus - #3 by DancesWithHaggises

mais il me dit

except trytond.modules.stock.exceptions.MoveOriginWarning as e:
       ^^^^^^^
NameError: name ‘trytond’ is not defined

malgré le fait que j’ai bien

from trytond import modules
from trytond.modules.stock.exceptions import MoveOriginWarning

Alors j’ai un peu avancé, dans ma version (6.0.4)

dans move.py j’ai

       def no_origin(move):
            return ((move.from_location.type in types)
                ^ (move.to_location.type in types)
                and not move.origin)
        moves = sorted(filter(no_origin, moves))
        if moves:
            names = ', '.join(m.rec_name for m in moves[:5])
            if len(moves) > 5:
                names += '...'
            warning_name = '%s.done' % hashlib.md5(
                str(moves).encode('utf-8')).hexdigest()
            if Warning.check(warning_name):
                raise MoveOriginWarning(warning_name,
                    gettext('stock.msg_move_no_origin',
                        moves=names))

et moi j’ai implémenté

types = {'customer', 'supplier'}
def no_origin(move):
    print(move)
    return ((move.from_location.type in types)
        ^ (move.to_location.type in types)
        and not move.origin)

movesw = sorted(filter(no_origin, moves))
key = ', '.join(m.rec_name for m in moves[:5])
if len(moves) > 5:
    key += '...'
warning_name = '%s.done' % hashlib.md5(str(movesw).encode('utf-8')).hexdigest()
Model.get('res.user.warning')(user=admin_user, name=warning_name, always=True).save()

et il continue à me dire 

trytond.modules.stock.exceptions.MoveOriginWarning:.... n'ont pas d'origine 


movesw = sorted(filter(no_origin, moves))
warning_name = '%s.done' % hashlib.md5(
    str(moves).encode('utf-8')).hexdigest()
print(str(moves).replace('proteus.Model','Pool()'));
print(warning_name)

cela donne

[Pool().get(‘stock.move’)(3212), Pool().get(‘stock.move’)(3213)]
a2f7dac551a708edd8edd4f913af3e9b.done

et si je débug dans move.py, je trouve

[Pool().get(‘stock.move’)(3212), Pool().get(‘stock.move’)(3213)]
2f1129c107bf09c94e181159718b3542.done

pourquoi je ne trouve pas le même hash ?

Pourquoi utiliser ‘moves’ pour générer ta clé et pas ‘movesw’ ?

parce que je le suis emmêlé car dans proteus movesw est les moves classés et que dans move.py c’est moves qui l’est.

mais j’ai eu de la chance des 2 cotés j’ai la même clé, mais pas le même hash

il faut que je regarde bien mes 2 chaînes, elles semblent identiques mais ne le sont pas. car si je fais l’expérience avec une AZERT5678UIOIPO j’ai le même hash

ce serait tellement simple de pouvoir choisit stock move comme origine, comme dans l’interface, SAO mais je n’ai pas réussi à remonter et comprendre comment faire.

Si c’est un mouvement d’entrée, logiquement ce doit être un Purchase comme origine, les mouvements de stock avec un stock move comme origine sont des mouvements d’inventaire.

Pourquoi ne pas reproduire la clé comme dans l’exemple de @DancesWithHaggises ?

key = '|'.join(map(str, movesw)).encode('utf-8')
   warning_name = "%s.done" % (hashlib.md5(key).hexdigest())

C’est ce que j’essaye de faire je ne dois pas être bien loin..

Si on choisit un achat, il veut une facture alors que nous produisons. nous même.

Le plus simple est de se mettre à jour et avoir Support skip warning globaly with proteus (#12954) · Issues · Tryton / Tryton · GitLab
Ou bien de faire comme certain tests qui est de récupérer le clé de l’exception de warning et de refaire l’appel (modules/account/tests/scenario_move_line_group.rst · branch/default · Tryton / Tryton · GitLab)

Comme explique plus haut, c’est pour cela que je donne le code ET que je donne les étapes que j’ai suivi j’ai tenté. et j’ai déjà tenté

except trytond.modules.stock.exceptions.MoveOriginWarning as e:
       ^^^^^^^
NameError: name ‘trytond’ is not defined

malgré le fait que j’ai bien

from trytond import modules
from trytond.modules.stock.exceptions import MoveOriginWarning

d’ailleurs il faut importer ces lignes après la config de la base de donnée sinon il la zappe et recherche une base sqlite et plante.

Pour mettre à jour, il y a une multitude d’étape de non régression et de re-vérification de ce qui a déjà été vérifié. il faut que toutes les bibliothèques soient disponibles et soient aussi compatibles avec les autres logiciels qui interagissent.

ce n’est pas un simple clic dans l’interface : une mise à jour sur le dev puis du travail et une mise à jour sur la prod, ce n’est pas aussi simple, la prod ne peut pas être en rade.

Dans l’interface on peut choisir stock move comme origine, qui donne stock.move,-1 dans la table, mais j’ai essayé 1/4 de journée à le faire tomber en marche sans succès

Alors j’ai trouvé, pour une raison que j’ignore l’excellent code de Profile - maxx - Tryton Discussion

    def __lt__(self, other):
        if isinstance(other, Model):
            return ((self.__class__.__name__, self.id)
                  < (other.__class__.__name__, other.id))
        return NotImplemented

a du être modifié pour que ce marche en changeant l’ordre de comparaison

 def __lt__(self, other):
        if isinstance(other, Model):
            return ((self.__class__.__name__, self.id)
                  > (other.__class__.__name__, other.id))
        return NotImplemented

c’est un mystère mystérieux

pour les pauvres neewbies comme moi qui galèrent un peu, c’est dans le fichier init.py du module proteus dans la classe Model

This topic was automatically closed 24 hours after the last reply. New replies are no longer allowed.