From 928c7d2efe93546e735b83711d22f43bd2de82f4 Mon Sep 17 00:00:00 2001 From: Maxime Richez Date: Mon, 2 Oct 2017 16:18:15 +0200 Subject: [PATCH] Add method set_sequence on ModelList This method register the current order into sequence field. issue6133 review43501002 --- CHANGELOG | 1 + README | 22 ++++++++++++++++++++++ proteus/__init__.py | 30 ++++++++++++++++++++++++++++++ 3 files changed, 53 insertions(+) diff --git a/CHANGELOG b/CHANGELOG index 8f659f689a..954b4c2b30 100644 --- a/CHANGELOG +++ b/CHANGELOG @@ -1,3 +1,4 @@ +* Add set_sequence method to ModelList * Add __int__ to Model * Allow to use keyword arguments with trytond configuration diff --git a/README b/README index 91ea807928..39b1222c3c 100644 --- a/README +++ b/README @@ -106,6 +106,28 @@ The report is executed with a list of records and some extra data. >>> type_, data, print_, name = label.execute([party], {}) +Sorting addresses and register order +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + +Addresses are ordered by sequence which means they can be stored following a +specific order. The `set_sequence` method stores the current order. + + >>> address = party.addresses.new(zip='69') + >>> party.save() + >>> address = party.addresses.new(zip='23') + >>> party.save() + +Now changing the order. + + >>> reversed_addresses = list(reversed(party.addresses)) + >>> while party.addresses: + ... _ = party.addresses.pop() + >>> party.addresses.extend(reversed_addresses) + >>> party.addresses.set_sequence() + >>> party.save() + >>> party.addresses == reversed_addresses + True + Support ------- diff --git a/proteus/__init__.py b/proteus/__init__.py index 9b6d350ac2..75b6e8958a 100644 --- a/proteus/__init__.py +++ b/proteus/__init__.py @@ -620,6 +620,36 @@ class ModelList(list): with Relation._config.set_context(self._get_context()): return Relation.find(new_domain, offset, limit, order) + def set_sequence(self, field='sequence'): + changed = False + prev = None + for record in self: + if prev: + index = getattr(prev, field) + else: + index = None + update = False + value = getattr(record, field) + if value is None: + if index: + update = True + elif prev and record.id >= 0: + update = record.id < prev.id + if value == index: + if prev and record.id >= 0: + update = record.id < prev.id + elif value <= (index or 0): + update = True + if update: + if index is None: + index = 0 + index += 1 + setattr(record, field, index) + changed = record + prev = record + if changed: + self._changed() + class Model(object): 'Model class for Tryton records'