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) | 
