diff options
-rw-r--r-- | archaeological_context_records/models.py | 6 | ||||
-rw-r--r-- | archaeological_finds/models_finds.py | 10 | ||||
-rw-r--r-- | archaeological_finds/models_treatments.py | 6 | ||||
-rw-r--r-- | archaeological_operations/models.py | 36 | ||||
-rw-r--r-- | ishtar_common/models.py | 5 |
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) |