Add method set_sequence on ModelList

This method register the current order into sequence field.

issue6133
review43501002
This commit is contained in:
Maxime Richez committed 2017-10-02 16:18:15 +02:00
1 parent 789b8483b7
commit 928c7d2efe
3 files changed
+53

No files matched your search

+1
View File
@@ -1,3 +1,4 @@
* Add set_sequence method to ModelList
* Add __int__ to Model
* Allow to use keyword arguments with trytond configuration
+22
View File
@@ -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
-------
+30
View File
@@ -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'