summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorÉtienne Loks <etienne.loks@iggdrasil.net>2018-10-16 12:10:17 +0200
committerÉtienne Loks <etienne.loks@iggdrasil.net>2018-10-16 12:10:17 +0200
commit5aa11c751acecb6d5a3a56f45f74d17d64a358d1 (patch)
treead04d9e574e9d1523ae3b967fc781f0b9d2c3238
parentb6f5261620d6518a0e5a9da1e638ab97be716609 (diff)
downloadIshtar-5aa11c751acecb6d5a3a56f45f74d17d64a358d1.tar.bz2
Ishtar-5aa11c751acecb6d5a3a56f45f74d17d64a358d1.zip
Natural keys for operations, context records, finds, etc.
-rw-r--r--archaeological_context_records/models.py6
-rw-r--r--archaeological_finds/models_finds.py10
-rw-r--r--archaeological_finds/models_treatments.py6
-rw-r--r--archaeological_operations/models.py36
-rw-r--r--ishtar_common/models.py5
5 files changed, 61 insertions, 2 deletions
diff --git a/archaeological_context_records/models.py b/archaeological_context_records/models.py
index 080fa54da..58acfd148 100644
--- a/archaeological_context_records/models.py
+++ b/archaeological_context_records/models.py
@@ -35,7 +35,7 @@ from ishtar_common.models import Document, GeneralType, \
BaseHistorizedItem, HistoricalRecords, OwnPerms, ShortMenuItem, \
GeneralRelationType, GeneralRecordRelations, post_delete_record_relation,\
post_save_cache, ValueGetter, BulkUpdatedItem, \
- RelationItem, Town, get_current_profile
+ RelationItem, Town, get_current_profile, ExternalIdManager
from archaeological_operations.models import Operation, Period, Parcel, \
ArchaeologicalSite
@@ -396,6 +396,7 @@ class ContextRecord(BulkUpdatedItem, BaseHistorizedItem,
blank=True)
cached_label = models.TextField(_(u"Cached name"), null=True, blank=True,
db_index=True)
+ objects = ExternalIdManager()
class Meta:
verbose_name = _(u"Context Record")
@@ -409,6 +410,9 @@ class ContextRecord(BulkUpdatedItem, BaseHistorizedItem,
)
ordering = ('cached_label',)
+ def natural_key(self):
+ return (self.external_id, )
+
@property
def name(self):
return self.label or ""
diff --git a/archaeological_finds/models_finds.py b/archaeological_finds/models_finds.py
index bda25f97c..539ba2325 100644
--- a/archaeological_finds/models_finds.py
+++ b/archaeological_finds/models_finds.py
@@ -44,7 +44,7 @@ from archaeological_operations.models import AdministrativeAct, Operation
from archaeological_context_records.models import ContextRecord, Dating
from ishtar_common.models import PRIVATE_FIELDS, SpatialReferenceSystem, \
- BulkUpdatedItem
+ BulkUpdatedItem, ExternalIdManager
class MaterialType(HierarchicalType):
@@ -302,6 +302,7 @@ class BaseFind(BulkUpdatedItem, BaseHistorizedItem, OwnPerms):
PARENT_SEARCH_VECTORS = ['context_record']
BASE_SEARCH_VECTORS = ["label", "description", "comment", "cache_short_id",
"cache_complete_id", "excavation_id"]
+ objects = ExternalIdManager()
class Meta:
verbose_name = _(u"Base find")
@@ -317,6 +318,9 @@ class BaseFind(BulkUpdatedItem, BaseHistorizedItem, OwnPerms):
def __unicode__(self):
return self.label
+ def natural_key(self):
+ return (self.external_id, )
+
def get_last_find(self):
# TODO: manage virtuals - property(last_find) ?
finds = self.find.filter().order_by("-order").all()
@@ -874,6 +878,7 @@ class Find(BulkUpdatedItem, ValueGetter, BaseHistorizedItem, OwnPerms,
M2M_SEARCH_VECTORS = [
"datings__period__label", "object_types__label", "integrities__label",
"remarkabilities__label", "material_types__label"]
+ objects = ExternalIdManager()
# fields
base_finds = models.ManyToManyField(BaseFind, verbose_name=_(u"Base find"),
@@ -1018,6 +1023,9 @@ class Find(BulkUpdatedItem, ValueGetter, BaseHistorizedItem, OwnPerms,
)
ordering = ('cached_label',)
+ def natural_key(self):
+ return (self.external_id, )
+
@property
def short_class_name(self):
return _(u"FIND")
diff --git a/archaeological_finds/models_treatments.py b/archaeological_finds/models_treatments.py
index 291a75d4c..93a45164b 100644
--- a/archaeological_finds/models_treatments.py
+++ b/archaeological_finds/models_treatments.py
@@ -27,6 +27,7 @@ from django.template.defaultfilters import slugify
from django.utils.translation import ugettext_lazy as _, pgettext_lazy, \
activate, deactivate
+from ishtar_common.models import ExternalIdManager
from archaeological_finds.models_finds import Find, FindBasket, TreatmentType
from archaeological_operations.models import ClosedItem, Operation
from archaeological_warehouse.models import Warehouse, Container
@@ -113,6 +114,8 @@ class Treatment(DashboardFormItem, ValueGetter, BaseHistorizedItem,
INT_SEARCH_VECTORS = ["year", "index"]
M2M_SEARCH_VECTORS = ['downstream__cached_label', 'upstream__cached_label']
PARENT_SEARCH_VECTORS = ['person', 'organization']
+ objects = ExternalIdManager()
+
label = models.CharField(_(u"Label"), blank=True, null=True,
max_length=200)
other_reference = models.CharField(_(u"Other ref."), blank=True, null=True,
@@ -187,6 +190,9 @@ class Treatment(DashboardFormItem, ValueGetter, BaseHistorizedItem,
def short_class_name(self):
return _(u"TREATMENT")
+ def natural_key(self):
+ return (self.external_id, )
+
@classmethod
def get_query_owns(cls, ishtaruser):
return (Q(history_creator=ishtaruser.user_ptr) |
diff --git a/archaeological_operations/models.py b/archaeological_operations/models.py
index 637bbb7be..c4d7e489c 100644
--- a/archaeological_operations/models.py
+++ b/archaeological_operations/models.py
@@ -84,6 +84,9 @@ class ReportState(GeneralType):
post_save.connect(post_save_cache, sender=ReportState)
post_delete.connect(post_save_cache, sender=ReportState)
+class SiteManager(models.Manager):
+ def get_by_natural_key(self, txt_idx):
+ return self.get(reference=txt_idx)
class RecordQualityType(GeneralType):
order = models.IntegerField(_(u"Order"))
@@ -185,6 +188,7 @@ class ArchaeologicalSite(BaseHistorizedItem, OwnPerms, ValueGetter,
activate(language_code)
EXTRA_REQUEST_KEYS[unicode(v[0])] = v[1]
deactivate()
+ objects = SiteManager()
reference = models.CharField(_(u"Reference"), max_length=200, unique=True)
name = models.CharField(_(u"Name"), max_length=200,
@@ -265,6 +269,9 @@ class ArchaeologicalSite(BaseHistorizedItem, OwnPerms, ValueGetter,
]))
return name
+ def natural_key(self):
+ return (self.reference, )
+
@property
def external_id(self):
return self.reference
@@ -379,6 +386,10 @@ class ClosedItem(object):
user = q.all()[0]
return {'date': date, 'user': user}
+class OperationManager(models.Manager):
+ def get_by_natural_key(self, txt_idx):
+ return self.get(code_patriarche=txt_idx)
+
class Operation(ClosedItem, BaseHistorizedItem, OwnPerms, ValueGetter,
ShortMenuItem, DashboardFormItem, RelationItem):
@@ -481,6 +492,7 @@ class Operation(ClosedItem, BaseHistorizedItem, OwnPerms, ValueGetter,
)
},
}
+ objects = OperationManager()
# alternative names of fields for searches
ALT_NAMES = {
@@ -783,6 +795,9 @@ class Operation(ClosedItem, BaseHistorizedItem, OwnPerms, ValueGetter,
)
ordering = ('cached_label',)
+ def natural_key(self):
+ return (self.code_patriarche, )
+
@classmethod
def get_owns(cls, user, menu_filtr=None, limit=None, values=None,
get_short_menu_class=None):
@@ -1811,10 +1826,24 @@ def strip_zero(value):
return value
+class ParcelManager(models.Manager):
+ def get_by_natural_key(self, associated_file, operation, year, town_insee,
+ town_year, section, parcel_number):
+ q = {"year": year, "town__numero_insee": town_insee,
+ "town__year": town_year,
+ "section": section, "parcel_number": parcel_number}
+ if associated_file:
+ q['associated_file__external_id'] = associated_file
+ if operation:
+ q['operation__code_patriarche'] = operation
+ return self.get(**q)
+
+
class Parcel(LightHistorizedItem):
EXTERNAL_ID_KEY = 'parcel_external_id'
BASE_SEARCH_VECTORS = ['section', 'parcel_number']
PARENT_SEARCH_VECTORS = ['operation']
+ objects = ParcelManager()
associated_file = models.ForeignKey(
'archaeological_files.File',
@@ -1855,6 +1884,13 @@ class Parcel(LightHistorizedItem):
def __unicode__(self):
return self.short_label
+ def natural_key(self):
+ return (
+ self.associated_file.external_id if self.associated_file else '',
+ self.operation.code_patriarche if self.operation else '',
+ self.year, self.town.numero_insee, self.town.year, self.section,
+ self.parcel_number)
+
"""
def merge(self, parcel):
# cannot automatically merge
diff --git a/ishtar_common/models.py b/ishtar_common/models.py
index 0eade6891..a73ba8155 100644
--- a/ishtar_common/models.py
+++ b/ishtar_common/models.py
@@ -441,6 +441,11 @@ def post_save_cache(sender, **kwargs):
sender.refresh_cache()
+class ExternalIdManager(models.Manager):
+ def get_by_natural_key(self, external_id):
+ return self.get(external_id=external_id)
+
+
class SlugModelManager(models.Manager):
def get_by_natural_key(self, slug):
return self.get(slug=slug)