summaryrefslogtreecommitdiff
path: root/archaeological_finds/models_finds.py
diff options
context:
space:
mode:
Diffstat (limited to 'archaeological_finds/models_finds.py')
-rw-r--r--archaeological_finds/models_finds.py89
1 files changed, 66 insertions, 23 deletions
diff --git a/archaeological_finds/models_finds.py b/archaeological_finds/models_finds.py
index 4c02b170f..8d4945a0b 100644
--- a/archaeological_finds/models_finds.py
+++ b/archaeological_finds/models_finds.py
@@ -31,7 +31,8 @@ from ishtar_common.utils import cached_label_changed, post_save_point
from ishtar_common.models import GeneralType, ImageModel, BaseHistorizedItem, \
ShortMenuItem, LightHistorizedItem, HistoricalRecords, OwnPerms, Source, \
- Person, Basket, get_external_id, post_save_cache, ValueGetter
+ Person, Basket, get_external_id, post_save_cache, ValueGetter, \
+ get_current_profile
from archaeological_operations.models import AdministrativeAct
from archaeological_context_records.models import ContextRecord, Dating
@@ -213,13 +214,31 @@ class BaseFind(BulkUpdatedItem, BaseHistorizedItem, OwnPerms):
finds = self.find.filter().order_by("-order").all()
return finds and finds[0]
- @classmethod
- def get_max_index(cls, operation):
- q = BaseFind.objects \
- .filter(context_record__operation=operation)
+ def generate_index(self):
+ """
+ Generate index based on operation or context record (based on
+ the configuration)
+
+ :return: True if index has been changed.
+ """
+ profile = get_current_profile()
+ if profile.find_index == u'O':
+ operation = self.context_record.operation
+ q = Find.objects \
+ .filter(base_finds__context_record__operation=operation)
+ elif profile.find_index == u'CR':
+ cr = self.context_record
+ q = Find.objects \
+ .filter(base_finds__context_record=cr)
+ else:
+ return False
+ if self.pk:
+ q = q.exclude(pk=self.pk)
if q.count():
- return q.aggregate(Max('index'))['index__max']
- return 0
+ self.index = q.aggregate(Max('index'))['index__max'] + 1
+ else:
+ self.index = 1
+ return True
def _ope_code(self):
if not self.context_record.operation:
@@ -998,6 +1017,43 @@ class Find(BulkUpdatedItem, ValueGetter, BaseHistorizedItem, ImageModel,
with connection.cursor() as c:
c.execute(sql, args)
+ def generate_index(self):
+ """
+ Generate index based on operation or context record (based on
+ the configuration)
+
+ :return: True if index has been changed.
+ """
+ bfs = self.base_finds
+ profile = get_current_profile()
+ if profile.find_index == u'O':
+ bfs = bfs.filter(
+ context_record__operation__pk__isnull=False).order_by(
+ '-context_record__operation__start_date')
+ if not bfs.count():
+ return False
+ operation = bfs.all()[0].context_record.operation
+ q = Find.objects \
+ .filter(base_finds__context_record__operation=operation)
+ elif profile.find_index == u'CR':
+ bfs = bfs.filter(
+ context_record__pk__isnull=False).order_by(
+ 'context_record__pk')
+ if not bfs.count():
+ return False
+ cr = bfs.all()[0].context_record
+ q = Find.objects \
+ .filter(base_finds__context_record=cr)
+ else:
+ return False
+ if self.pk:
+ q = q.exclude(pk=self.pk)
+ if q.count():
+ self.index = q.aggregate(Max('index'))['index__max'] + 1
+ else:
+ self.index = 1
+ return True
+
def save(self, *args, **kwargs):
super(Find, self).save(*args, **kwargs)
@@ -1016,28 +1072,15 @@ class Find(BulkUpdatedItem, ValueGetter, BaseHistorizedItem, ImageModel,
q = self.base_finds
if not self.index and q.count():
- operation = q.filter(
- context_record__operation__pk__isnull=False).order_by(
- '-context_record__operation__start_date')
- if operation.count():
- operation = operation.all()[0].context_record.operation
- q = Find.objects \
- .filter(base_finds__context_record__operation=operation)
- if self.pk:
- q = q.exclude(pk=self.pk)
- if q.count():
- self.index = q.aggregate(Max('index'))['index__max'] + 1
- else:
- self.index = 1
+ changed = self.generate_index()
+ if changed:
self._cached_label_checked = False
self.save()
for base_find in self.base_finds.filter(
context_record__operation__pk__isnull=False).all():
modified = False
if not base_find.index:
- modified = True
- base_find.index = BaseFind.get_max_index(
- base_find.context_record.operation) + 1
+ modified = base_find.generate_index()
short_id = base_find.short_id()
if base_find.cache_short_id != short_id:
base_find.cache_short_id = short_id