diff options
author | Étienne Loks <etienne.loks@iggdrasil.net> | 2021-03-19 11:17:58 +0100 |
---|---|---|
committer | Étienne Loks <etienne.loks@iggdrasil.net> | 2021-03-19 11:17:58 +0100 |
commit | 33e342679b59fa48607c5acdc1fe826b666a1a5f (patch) | |
tree | 31b6b0a838b83efce2437d956a4f8d1a54f0aae6 /archaeological_finds | |
parent | 0b3d9bb13c3a7d9bab959e8a734d2ba89e48d359 (diff) | |
download | Ishtar-33e342679b59fa48607c5acdc1fe826b666a1a5f.tar.bz2 Ishtar-33e342679b59fa48607c5acdc1fe826b666a1a5f.zip |
Format - black: finds
Diffstat (limited to 'archaeological_finds')
-rw-r--r-- | archaeological_finds/ishtar_menu.py | 398 | ||||
-rw-r--r-- | archaeological_finds/lookups.py | 51 | ||||
-rw-r--r-- | archaeological_finds/models.py | 88 | ||||
-rw-r--r-- | archaeological_finds/models_finds.py | 2490 | ||||
-rw-r--r-- | archaeological_finds/models_treatments.py | 800 | ||||
-rw-r--r-- | archaeological_finds/serializers.py | 92 | ||||
-rw-r--r-- | archaeological_finds/tests.py | 1733 | ||||
-rw-r--r-- | archaeological_finds/urls.py | 825 | ||||
-rw-r--r-- | archaeological_finds/views.py | 1065 | ||||
-rw-r--r-- | archaeological_finds/wizards.py | 350 |
10 files changed, 4458 insertions, 3434 deletions
diff --git a/archaeological_finds/ishtar_menu.py b/archaeological_finds/ishtar_menu.py index ee0d1b908..aa658023d 100644 --- a/archaeological_finds/ishtar_menu.py +++ b/archaeological_finds/ishtar_menu.py @@ -1,4 +1,4 @@ -#!/usr/bin/env python +#!/usr/bin/env python3 # -*- coding: utf-8 -*- # Copyright (C) 2012-2016 Étienne Loks <etienne.loks_AT_peacefrogsDOTnet> @@ -27,173 +27,231 @@ from . import models # be careful: each access_controls must be relevant with check_rights in urls MENU_SECTIONS = [ - (50, - SectionItem( - 'find_management', _("Find"), - profile_restriction='find', - css='menu-find', - childs=[ - MenuItem( - 'find_search', _("Search"), - model=models.Find, - access_controls=['view_find', - 'view_own_find']), - MenuItem( - 'find_creation', _("Creation"), - model=models.Find, - access_controls=['add_find', - 'add_own_find']), - MenuItem( - 'find_modification', _("Modification"), - model=models.Find, - access_controls=['change_find', - 'change_own_find']), - MenuItem( - 'find_deletion', _("Deletion"), - model=models.Find, - access_controls=['change_find', - 'change_own_find']), - SectionItem( - 'find_basket', _("Basket"), - childs=[ - MenuItem('find_basket_search', - _("Search"), - model=models.FindBasket, - access_controls=['view_find', - 'view_own_find']), - MenuItem('find_basket_creation', - _("Creation"), - model=models.FindBasket, - access_controls=['view_find', - 'view_own_find']), - MenuItem('find_basket_modification', - _("Modification"), - model=models.FindBasket, - access_controls=[ - 'view_find', - 'view_own_find']), - MenuItem('find_basket_modification_add', - _("Manage items"), - model=models.FindBasket, - access_controls=[ - 'view_find', - 'view_own_find']), - MenuItem('find_basket_deletion', - _("Deletion"), - model=models.FindBasket, - access_controls=['view_find', - 'view_own_find']), - ]), - # MenuItem( - # 'treatment_creation', _("Add a treatment"), - # model=models.Treatment, - # access_controls=['change_find', - # 'change_own_find']), - ])), - (60, - SectionItem( - 'treatmentfle_management', _("Treatment request"), - profile_restriction='warehouse', - css='menu-warehouse', - childs=[ - MenuItem('treatmentfle_search', - _("Search"), - model=models.TreatmentFile, - access_controls=['view_treatmentfile', - 'view_own_treatmentfile']), - MenuItem('treatmentfle_creation', - _("Creation"), - model=models.TreatmentFile, - access_controls=['change_treatmentfile', - 'change_own_treatmentfile']), - MenuItem('treatmentfle_modification', - _("Modification"), - model=models.TreatmentFile, - access_controls=['change_treatmentfile', - 'change_own_treatmentfile']), - MenuItem('treatmentfle_deletion', - _("Deletion"), - model=models.TreatmentFile, - access_controls=['change_treatmentfile', - 'change_own_treatmentfile']), - SectionItem( - 'admin_act_fletreatments', _("Administrative act"), - childs=[ - MenuItem('treatmentfle_admacttreatmentfle_search', - _("Search"), - model=AdministrativeAct, - access_controls=['change_administrativeact']), - MenuItem('treatmentfle_admacttreatmentfle', - _("Creation"), - model=AdministrativeAct, - access_controls=['change_administrativeact']), - MenuItem('treatmentfle_admacttreatmentfle_modification', - _("Modification"), model=AdministrativeAct, - access_controls=['change_administrativeact']), - MenuItem('treatmentfle_admacttreatmentfle_deletion', - _("Deletion"), - model=AdministrativeAct, - access_controls=['change_administrativeact']), - ] - ), - ] - )), - (70, - SectionItem( - 'treatment_management', _("Treatment"), - profile_restriction='warehouse', - css='menu-warehouse', - childs=[ - MenuItem('treatment_search', - _("Search"), - model=models.Treatment, - access_controls=['view_treatment', - 'view_own_treatment']), - MenuItem( - 'treatment_creation', - _("Simple treatment - creation"), - model=models.Treatment, - access_controls=['change_find', 'change_own_find']), - MenuItem( - 'treatment_creation_n1', - _("Treatment many to one - creation"), - model=models.Treatment, - access_controls=['change_find', 'change_own_find']), - MenuItem( - 'treatment_creation_1n', - _("Treatment one to many - creation"), - model=models.Treatment, - access_controls=['change_find', 'change_own_find']), - MenuItem('treatment_modification', - _("Modification"), - model=models.Treatment, - access_controls=['change_treatment', - 'change_own_treatment']), - MenuItem('treatment_deletion', - _("Deletion"), - model=models.Treatment, - access_controls=['change_treatment', - 'change_own_treatment']), - SectionItem( - 'admin_act_treatments', _("Administrative act"), - childs=[ - MenuItem('treatment_admacttreatment_search', - _("Search"), - model=AdministrativeAct, - access_controls=['view_administrativeact']), - MenuItem('treatment_admacttreatment', - _("Creation"), - model=AdministrativeAct, - access_controls=['add_administrativeact']), - MenuItem( - 'treatment_admacttreatment_modification', - _("Modification"), model=AdministrativeAct, - access_controls=['change_administrativeact']), - MenuItem('treatment_admacttreatment_deletion', - _("Deletion"), - model=AdministrativeAct, - access_controls=['change_administrativeact']), - ]), - ] - )), + ( + 50, + SectionItem( + "find_management", + _("Find"), + profile_restriction="find", + css="menu-find", + childs=[ + MenuItem( + "find_search", + _("Search"), + model=models.Find, + access_controls=["view_find", "view_own_find"], + ), + MenuItem( + "find_creation", + _("Creation"), + model=models.Find, + access_controls=["add_find", "add_own_find"], + ), + MenuItem( + "find_modification", + _("Modification"), + model=models.Find, + access_controls=["change_find", "change_own_find"], + ), + MenuItem( + "find_deletion", + _("Deletion"), + model=models.Find, + access_controls=["change_find", "change_own_find"], + ), + SectionItem( + "find_basket", + _("Basket"), + childs=[ + MenuItem( + "find_basket_search", + _("Search"), + model=models.FindBasket, + access_controls=["view_find", "view_own_find"], + ), + MenuItem( + "find_basket_creation", + _("Creation"), + model=models.FindBasket, + access_controls=["view_find", "view_own_find"], + ), + MenuItem( + "find_basket_modification", + _("Modification"), + model=models.FindBasket, + access_controls=["view_find", "view_own_find"], + ), + MenuItem( + "find_basket_modification_add", + _("Manage items"), + model=models.FindBasket, + access_controls=["view_find", "view_own_find"], + ), + MenuItem( + "find_basket_deletion", + _("Deletion"), + model=models.FindBasket, + access_controls=["view_find", "view_own_find"], + ), + ], + ), + # MenuItem( + # 'treatment_creation', _("Add a treatment"), + # model=models.Treatment, + # access_controls=['change_find', + # 'change_own_find']), + ], + ), + ), + ( + 60, + SectionItem( + "treatmentfle_management", + _("Treatment request"), + profile_restriction="warehouse", + css="menu-warehouse", + childs=[ + MenuItem( + "treatmentfle_search", + _("Search"), + model=models.TreatmentFile, + access_controls=["view_treatmentfile", "view_own_treatmentfile"], + ), + MenuItem( + "treatmentfle_creation", + _("Creation"), + model=models.TreatmentFile, + access_controls=[ + "change_treatmentfile", + "change_own_treatmentfile", + ], + ), + MenuItem( + "treatmentfle_modification", + _("Modification"), + model=models.TreatmentFile, + access_controls=[ + "change_treatmentfile", + "change_own_treatmentfile", + ], + ), + MenuItem( + "treatmentfle_deletion", + _("Deletion"), + model=models.TreatmentFile, + access_controls=[ + "change_treatmentfile", + "change_own_treatmentfile", + ], + ), + SectionItem( + "admin_act_fletreatments", + _("Administrative act"), + childs=[ + MenuItem( + "treatmentfle_admacttreatmentfle_search", + _("Search"), + model=AdministrativeAct, + access_controls=["change_administrativeact"], + ), + MenuItem( + "treatmentfle_admacttreatmentfle", + _("Creation"), + model=AdministrativeAct, + access_controls=["change_administrativeact"], + ), + MenuItem( + "treatmentfle_admacttreatmentfle_modification", + _("Modification"), + model=AdministrativeAct, + access_controls=["change_administrativeact"], + ), + MenuItem( + "treatmentfle_admacttreatmentfle_deletion", + _("Deletion"), + model=AdministrativeAct, + access_controls=["change_administrativeact"], + ), + ], + ), + ], + ), + ), + ( + 70, + SectionItem( + "treatment_management", + _("Treatment"), + profile_restriction="warehouse", + css="menu-warehouse", + childs=[ + MenuItem( + "treatment_search", + _("Search"), + model=models.Treatment, + access_controls=["view_treatment", "view_own_treatment"], + ), + MenuItem( + "treatment_creation", + _("Simple treatment - creation"), + model=models.Treatment, + access_controls=["change_find", "change_own_find"], + ), + MenuItem( + "treatment_creation_n1", + _("Treatment many to one - creation"), + model=models.Treatment, + access_controls=["change_find", "change_own_find"], + ), + MenuItem( + "treatment_creation_1n", + _("Treatment one to many - creation"), + model=models.Treatment, + access_controls=["change_find", "change_own_find"], + ), + MenuItem( + "treatment_modification", + _("Modification"), + model=models.Treatment, + access_controls=["change_treatment", "change_own_treatment"], + ), + MenuItem( + "treatment_deletion", + _("Deletion"), + model=models.Treatment, + access_controls=["change_treatment", "change_own_treatment"], + ), + SectionItem( + "admin_act_treatments", + _("Administrative act"), + childs=[ + MenuItem( + "treatment_admacttreatment_search", + _("Search"), + model=AdministrativeAct, + access_controls=["view_administrativeact"], + ), + MenuItem( + "treatment_admacttreatment", + _("Creation"), + model=AdministrativeAct, + access_controls=["add_administrativeact"], + ), + MenuItem( + "treatment_admacttreatment_modification", + _("Modification"), + model=AdministrativeAct, + access_controls=["change_administrativeact"], + ), + MenuItem( + "treatment_admacttreatment_deletion", + _("Deletion"), + model=AdministrativeAct, + access_controls=["change_administrativeact"], + ), + ], + ), + ], + ), + ), ] diff --git a/archaeological_finds/lookups.py b/archaeological_finds/lookups.py index b8ce8400d..acf8895cb 100644 --- a/archaeological_finds/lookups.py +++ b/archaeological_finds/lookups.py @@ -9,39 +9,33 @@ from django.utils.html import escape from archaeological_finds import models -@register('base_find') +@register("base_find") class BaseFindLookup(LookupChannel): model = models.BaseFind def get_query(self, q, request): query = Q() - for term in q.strip().split(' '): - subquery = ( - Q(cache_complete_id__icontains=term) | - Q(label__icontains=term) - ) + for term in q.strip().split(" "): + subquery = Q(cache_complete_id__icontains=term) | Q(label__icontains=term) query &= subquery - return self.model.objects.filter(query).order_by( - 'cache_complete_id')[:20] + return self.model.objects.filter(query).order_by("cache_complete_id")[:20] def format_item_display(self, item): return "<span class='ajax-label'>%s</span>" % item.cache_complete_id -@register('find') +@register("find") class FindLookup(LookupChannel): model = models.Find def get_query(self, q, request): query = Q() - for term in q.strip().split(' '): - subquery = ( - Q(cached_label__icontains=term) | - Q(base_finds__cache_complete_id__icontains=term) + for term in q.strip().split(" "): + subquery = Q(cached_label__icontains=term) | Q( + base_finds__cache_complete_id__icontains=term ) query &= subquery - return self.model.objects.filter(query).order_by( - 'cached_label')[:20] + return self.model.objects.filter(query).order_by("cached_label")[:20] def format_item_display(self, item): return "<span class='ajax-label'>%s</span>" % item.full_label @@ -50,48 +44,41 @@ class FindLookup(LookupChannel): return escape(force_text(obj.full_label)) -@register('treatment') +@register("treatment") class TreatmentLookup(LookupChannel): model = models.Treatment def get_query(self, q, request): query = Q() - for term in q.strip().split(' '): - subquery = ( - Q(cached_label__icontains=term) - ) + for term in q.strip().split(" "): + subquery = Q(cached_label__icontains=term) query &= subquery - return self.model.objects.filter(query).order_by( - 'cached_label')[:20] + return self.model.objects.filter(query).order_by("cached_label")[:20] def format_item_display(self, item): return "<span class='ajax-label'>%s</span>" % item.cached_label -@register('treatment_file') +@register("treatment_file") class TreatmentFileLookup(LookupChannel): model = models.TreatmentFile def get_query(self, q, request): query = Q() - for term in q.strip().split(' '): - subquery = ( - Q(cached_label__icontains=term) - ) + for term in q.strip().split(" "): + subquery = Q(cached_label__icontains=term) query &= subquery - return self.model.objects.filter(query).order_by( - 'cached_label')[:20] + return self.model.objects.filter(query).order_by("cached_label")[:20] def format_item_display(self, item): return "<span class='ajax-label'>%s</span>" % item.cached_label -@register('material_type') +@register("material_type") class MaterialTypeLookup(TypeLookupChannel): model = models.MaterialType -@register('object_type') +@register("object_type") class MaterialTypeLookup(TypeLookupChannel): model = models.ObjectType - diff --git a/archaeological_finds/models.py b/archaeological_finds/models.py index 53fa35c40..cd8100aaa 100644 --- a/archaeological_finds/models.py +++ b/archaeological_finds/models.py @@ -1,21 +1,69 @@ -from archaeological_finds.models_finds import MaterialType, ConservatoryState, \ - CheckedType, IntegrityType, RemarkabilityType, ObjectType, BaseFind, \ - FindBasket, Find, Property, BatchType, BFBulkView, FBulkView, \ - FirstBaseFindView, AlterationType, AlterationCauseType, \ - TreatmentEmergencyType, TreatmentType, CommunicabilityType, \ - MaterialTypeQualityType, ObjectTypeQualityType, FindInsideContainer -from archaeological_finds.models_treatments import Treatment, \ - AbsFindTreatments, FindUpstreamTreatments, FindDownstreamTreatments, \ - FindTreatments, TreatmentFile, TreatmentFileType, \ - TreatmentState, FindNonModifTreatments +from archaeological_finds.models_finds import ( + MaterialType, + ConservatoryState, + CheckedType, + IntegrityType, + RemarkabilityType, + ObjectType, + BaseFind, + FindBasket, + Find, + Property, + BatchType, + BFBulkView, + FBulkView, + FirstBaseFindView, + AlterationType, + AlterationCauseType, + TreatmentEmergencyType, + TreatmentType, + CommunicabilityType, + MaterialTypeQualityType, + ObjectTypeQualityType, + FindInsideContainer, +) +from archaeological_finds.models_treatments import ( + Treatment, + AbsFindTreatments, + FindUpstreamTreatments, + FindDownstreamTreatments, + FindTreatments, + TreatmentFile, + TreatmentFileType, + TreatmentState, + FindNonModifTreatments, +) -__all__ = ['MaterialType', 'ConservatoryState', 'IntegrityType', 'CheckedType', - 'RemarkabilityType', 'ObjectType', 'BaseFind', 'FindBasket', 'Find', - 'Property', 'BFBulkView', 'FBulkView', 'FirstBaseFindView', - 'AlterationType', 'AlterationCauseType', 'TreatmentEmergencyType', - 'BatchType', 'TreatmentType', 'TreatmentState', - 'Treatment', 'AbsFindTreatments', 'FindUpstreamTreatments', - 'FindNonModifTreatments', 'FindDownstreamTreatments', - 'FindTreatments', 'TreatmentFile', 'TreatmentFileType', - 'CommunicabilityType', 'MaterialTypeQualityType', - 'ObjectTypeQualityType', 'FindInsideContainer'] +__all__ = [ + "MaterialType", + "ConservatoryState", + "IntegrityType", + "CheckedType", + "RemarkabilityType", + "ObjectType", + "BaseFind", + "FindBasket", + "Find", + "Property", + "BFBulkView", + "FBulkView", + "FirstBaseFindView", + "AlterationType", + "AlterationCauseType", + "TreatmentEmergencyType", + "BatchType", + "TreatmentType", + "TreatmentState", + "Treatment", + "AbsFindTreatments", + "FindUpstreamTreatments", + "FindNonModifTreatments", + "FindDownstreamTreatments", + "FindTreatments", + "TreatmentFile", + "TreatmentFileType", + "CommunicabilityType", + "MaterialTypeQualityType", + "ObjectTypeQualityType", + "FindInsideContainer", +] diff --git a/archaeological_finds/models_finds.py b/archaeological_finds/models_finds.py index 152e572f9..cf521c2b6 100644 --- a/archaeological_finds/models_finds.py +++ b/archaeological_finds/models_finds.py @@ -1,4 +1,4 @@ -#!/usr/bin/env python +#!/usr/bin/env python3 # -*- coding: utf-8 -*- # Copyright (C) 2012-2017 Étienne Loks <etienne.loks_AT_peacefrogsDOTnet> @@ -28,44 +28,66 @@ from django.contrib.postgres.indexes import GinIndex from django.core.urlresolvers import reverse from django.db import connection from django.db.models import Max, Q, F -from django.db.models.signals import m2m_changed, post_save, post_delete, \ - pre_delete +from django.db.models.signals import m2m_changed, post_save, post_delete, pre_delete from django.core.exceptions import ObjectDoesNotExist from ishtar_common.utils import ugettext_lazy as _, pgettext_lazy from ishtar_common.data_importer import post_importer_action, ImporterError -from ishtar_common.utils import cached_label_changed, post_save_geo, \ - m2m_historization_changed +from ishtar_common.utils import ( + cached_label_changed, + post_save_geo, + m2m_historization_changed, +) from ishtar_common.alternative_configs import ALTERNATE_CONFIGS from ishtar_common.model_managers import ExternalIdManager, UUIDModelManager -from ishtar_common.models import Document, GeneralType, \ - HierarchicalType, BaseHistorizedItem, LightHistorizedItem, \ - OwnPerms, Person, Basket, post_save_cache, \ - ValueGetter, get_current_profile, IshtarSiteProfile, \ - GeoItem, BulkUpdatedItem, QuickAction, \ - MainItem, document_attached_changed, HistoryModel, DynamicRequest, \ - SearchAltName, CompleteIdentifierItem, SearchVectorConfig, DocumentItem +from ishtar_common.models import ( + Document, + GeneralType, + HierarchicalType, + BaseHistorizedItem, + LightHistorizedItem, + OwnPerms, + Person, + Basket, + post_save_cache, + ValueGetter, + get_current_profile, + IshtarSiteProfile, + GeoItem, + BulkUpdatedItem, + QuickAction, + MainItem, + document_attached_changed, + HistoryModel, + DynamicRequest, + SearchAltName, + CompleteIdentifierItem, + SearchVectorConfig, + DocumentItem, +) from ishtar_common.models_common import HistoricalRecords from ishtar_common.utils import PRIVATE_FIELDS -from archaeological_operations.models import AdministrativeAct, Operation, \ - CulturalAttributionType +from archaeological_operations.models import ( + AdministrativeAct, + Operation, + CulturalAttributionType, +) from archaeological_context_records.models import ContextRecord, Dating from archaeological_warehouse.models import Warehouse class MaterialType(HierarchicalType): code = models.CharField(_("Code"), max_length=100, blank=True, null=True) - recommendation = models.TextField( - _("Recommendation"), blank=True, default="") + recommendation = models.TextField(_("Recommendation"), blank=True, default="") class Meta: verbose_name = _("Material type") verbose_name_plural = _("Material types") - ordering = ('label',) + ordering = ("label",) post_save.connect(post_save_cache, sender=MaterialType) @@ -78,7 +100,7 @@ class MaterialTypeQualityType(GeneralType): class Meta: verbose_name = _("Material type quality type") verbose_name_plural = _("Material type quality types") - ordering = ('order',) + ordering = ("order",) post_save.connect(post_save_cache, sender=MaterialTypeQualityType) @@ -91,7 +113,10 @@ class ConservatoryState(HierarchicalType): class Meta: verbose_name = _("Conservatory state type") verbose_name_plural = _("Conservatory state types") - ordering = ('order', 'label',) + ordering = ( + "order", + "label", + ) post_save.connect(post_save_cache, sender=ConservatoryState) @@ -103,43 +128,76 @@ class TreatmentType(HierarchicalType): virtual = models.BooleanField(_("Virtual")) destructive = models.BooleanField(_("Destructive"), default=False) create_new_find = models.BooleanField( - _("Create a new find"), default=False, - help_text=_("If True when this treatment is applied a new version " - "of the object will be created.")) + _("Create a new find"), + default=False, + help_text=_( + "If True when this treatment is applied a new version " + "of the object will be created." + ), + ) upstream_is_many = models.BooleanField( - _("Upstream is many"), default=False, + _("Upstream is many"), + default=False, help_text=_( - "Check this if for this treatment from many finds you'll get " - "one.")) + "Check this if for this treatment from many finds you'll get " "one." + ), + ) downstream_is_many = models.BooleanField( - _("Downstream is many"), default=False, + _("Downstream is many"), + default=False, help_text=_( - "Check this if for this treatment from one find you'll get " - "many.")) + "Check this if for this treatment from one find you'll get " "many." + ), + ) change_reference_location = models.BooleanField( - _("Change reference location"), default=False, - help_text=_("The treatment change the reference location.")) + _("Change reference location"), + default=False, + help_text=_("The treatment change the reference location."), + ) change_current_location = models.BooleanField( - _("Change current location"), default=False, - help_text=_("The treatment change the current location.")) + _("Change current location"), + default=False, + help_text=_("The treatment change the current location."), + ) restore_reference_location = models.BooleanField( - _("Restore the reference location"), default=False, - help_text=_("The treatment change restore reference location to the " - "current location.")) + _("Restore the reference location"), + default=False, + help_text=_( + "The treatment change restore reference location to the " + "current location." + ), + ) class Meta: verbose_name = _("Treatment type") verbose_name_plural = _("Treatment types") - ordering = ('order', 'label',) + ordering = ( + "order", + "label", + ) @classmethod - def get_types(cls, dct=None, instances=False, exclude=None, - empty_first=True, default=None, initial=None, force=False, - full_hierarchy=False): + def get_types( + cls, + dct=None, + instances=False, + exclude=None, + empty_first=True, + default=None, + initial=None, + force=False, + full_hierarchy=False, + ): types = super(TreatmentType, cls).get_types( - dct=dct, instances=instances, exclude=exclude, - empty_first=empty_first, default=default, initial=initial, - force=force, full_hierarchy=full_hierarchy) + dct=dct, + instances=instances, + exclude=exclude, + empty_first=empty_first, + default=default, + initial=initial, + force=force, + full_hierarchy=full_hierarchy, + ) if dct and not exclude: rank = 0 if instances: @@ -167,7 +225,7 @@ class IntegrityType(GeneralType): class Meta: verbose_name = _("Integrity / interest type") verbose_name_plural = _("Integrity / interest types") - ordering = ('label',) + ordering = ("label",) post_save.connect(post_save_cache, sender=IntegrityType) @@ -178,7 +236,7 @@ class RemarkabilityType(GeneralType): class Meta: verbose_name = _("Remarkability type") verbose_name_plural = _("Remarkability types") - ordering = ('label',) + ordering = ("label",) post_save.connect(post_save_cache, sender=RemarkabilityType) @@ -187,10 +245,11 @@ post_delete.connect(post_save_cache, sender=RemarkabilityType) class BatchType(GeneralType): order = models.IntegerField(_("Order"), default=10) + class Meta: verbose_name = _("Batch type") verbose_name_plural = _("Batch types") - ordering = ('order',) + ordering = ("order",) post_save.connect(post_save_cache, sender=BatchType) @@ -201,7 +260,10 @@ class ObjectType(HierarchicalType): class Meta: verbose_name = _("Object type") verbose_name_plural = _("Object types") - ordering = ('parent__label', 'label',) + ordering = ( + "parent__label", + "label", + ) post_save.connect(post_save_cache, sender=ObjectType) @@ -214,7 +276,7 @@ class ObjectTypeQualityType(GeneralType): class Meta: verbose_name = _("Object type quality type") verbose_name_plural = _("Object type quality types") - ordering = ('order',) + ordering = ("order",) post_save.connect(post_save_cache, sender=ObjectTypeQualityType) @@ -225,7 +287,10 @@ class AlterationType(HierarchicalType): class Meta: verbose_name = _("Alteration type") verbose_name_plural = _("Alteration types") - ordering = ('parent__label', 'label',) + ordering = ( + "parent__label", + "label", + ) post_save.connect(post_save_cache, sender=AlterationType) @@ -236,7 +301,10 @@ class AlterationCauseType(HierarchicalType): class Meta: verbose_name = _("Alteration cause type") verbose_name_plural = _("Alteration cause types") - ordering = ('parent__label', 'label',) + ordering = ( + "parent__label", + "label", + ) post_save.connect(post_save_cache, sender=AlterationCauseType) @@ -247,7 +315,7 @@ class TreatmentEmergencyType(GeneralType): class Meta: verbose_name = _("Treatment emergency type") verbose_name_plural = _("Treatment emergency types") - ordering = ('label',) + ordering = ("label",) post_save.connect(post_save_cache, sender=TreatmentEmergencyType) @@ -258,7 +326,10 @@ class CommunicabilityType(HierarchicalType): class Meta: verbose_name = _("Communicability type") verbose_name_plural = _("Communicability types") - ordering = ('parent__label', 'label',) + ordering = ( + "parent__label", + "label", + ) post_save.connect(post_save_cache, sender=CommunicabilityType) @@ -271,7 +342,7 @@ class CheckedType(GeneralType): class Meta: verbose_name = _("Checked type") verbose_name_plural = _("Checked types") - ordering = ('order',) + ordering = ("order",) post_save.connect(post_save_cache, sender=CheckedType) @@ -298,51 +369,71 @@ class BFBulkView(object): """ -class BaseFind(BulkUpdatedItem, BaseHistorizedItem, GeoItem, - CompleteIdentifierItem, OwnPerms, ValueGetter): - EXTERNAL_ID_KEY = 'base_find_external_id' - EXTERNAL_ID_DEPENDENCIES = ['find'] - SLUG = 'basefind' +class BaseFind( + BulkUpdatedItem, + BaseHistorizedItem, + GeoItem, + CompleteIdentifierItem, + OwnPerms, + ValueGetter, +): + EXTERNAL_ID_KEY = "base_find_external_id" + EXTERNAL_ID_DEPENDENCIES = ["find"] + SLUG = "basefind" uuid = models.UUIDField(default=uuid.uuid4) label = models.TextField(_("Free ID")) external_id = models.TextField(_("External ID"), blank=True, default="") auto_external_id = models.BooleanField( - _("External ID is set automatically"), default=False) - excavation_id = models.TextField( - _("Excavation ID"), blank=True, default="") - description = models.TextField( - _("Description"), blank=True, default="") + _("External ID is set automatically"), default=False + ) + excavation_id = models.TextField(_("Excavation ID"), blank=True, default="") + description = models.TextField(_("Description"), blank=True, default="") comment = models.TextField(_("Comment"), blank=True, default="") special_interest = models.CharField( - _("Special interest"), blank=True, default="", max_length=120) + _("Special interest"), blank=True, default="", max_length=120 + ) context_record = models.ForeignKey( - ContextRecord, related_name='base_finds', - verbose_name=_("Context Record")) - discovery_date = models.DateField(_("Discovery date (exact or TPQ)"), - blank=True, null=True) - discovery_date_taq = models.DateField(_("Discovery date (TAQ)"), - blank=True, null=True) - batch = models.ForeignKey(BatchType, verbose_name=_("Batch/object"), - on_delete=models.SET_NULL, - blank=True, null=True) + ContextRecord, related_name="base_finds", verbose_name=_("Context Record") + ) + discovery_date = models.DateField( + _("Discovery date (exact or TPQ)"), blank=True, null=True + ) + discovery_date_taq = models.DateField( + _("Discovery date (TAQ)"), blank=True, null=True + ) + batch = models.ForeignKey( + BatchType, + verbose_name=_("Batch/object"), + on_delete=models.SET_NULL, + blank=True, + null=True, + ) index = models.IntegerField("Index", default=0) material_index = models.IntegerField(_("Material index"), default=0) topographic_localisation = models.CharField( - _("Point of topographic reference"), blank=True, null=True, - max_length=120) + _("Point of topographic reference"), blank=True, null=True, max_length=120 + ) # gis line = models.LineStringField(_("Line"), blank=True, null=True) cache_short_id = models.TextField( - _("Short ID"), blank=True, default="", db_index=True, - help_text=_("Cached value - do not edit")) + _("Short ID"), + blank=True, + default="", + db_index=True, + help_text=_("Cached value - do not edit"), + ) cache_complete_id = models.TextField( - _("Complete ID"), blank=True, default="", db_index=True, - help_text=_("Cached value - do not edit")) + _("Complete ID"), + blank=True, + default="", + db_index=True, + help_text=_("Cached value - do not edit"), + ) history = HistoricalRecords() - RELATED_POST_PROCESS = ['find'] - CACHED_LABELS = ['cache_short_id', 'cache_complete_id'] + RELATED_POST_PROCESS = ["find"] + CACHED_LABELS = ["cache_short_id", "cache_complete_id"] CACHED_COMPLETE_ID = "cache_complete_id" - PARENT_SEARCH_VECTORS = ['context_record'] + PARENT_SEARCH_VECTORS = ["context_record"] BASE_SEARCH_VECTORS = [ SearchVectorConfig("label"), SearchVectorConfig("description", "local"), @@ -364,14 +455,14 @@ class BaseFind(BulkUpdatedItem, BaseHistorizedItem, GeoItem, ("delete_own_basefind", "Can delete own Base find"), ) indexes = [ - GinIndex(fields=['data']), + GinIndex(fields=["data"]), ] def __str__(self): return self.label def natural_key(self): - return (self.uuid, ) + return (self.uuid,) def regenerate_external_id(self): self.skip_history_when_saving = True @@ -386,24 +477,27 @@ class BaseFind(BulkUpdatedItem, BaseHistorizedItem, GeoItem, def public_representation(self): dct = super(BaseFind, self).public_representation() - dct.update({ - "context-record": self.context_record.public_representation(), - "description": self.description, - "comment": self.comment, - "discovery-date": self.discovery_date and - self.discovery_date.strftime("%Y/%m/%d"), - "discovery-date-taq": self.discovery_date_taq and - self.discovery_date_taq.strftime("%Y/%m/%d"), - "discovery-date-tpq": self.discovery_date_taq and - self.discovery_date and - self.discovery_date.strftime("%Y/%m/%d"), - }) + dct.update( + { + "context-record": self.context_record.public_representation(), + "description": self.description, + "comment": self.comment, + "discovery-date": self.discovery_date + and self.discovery_date.strftime("%Y/%m/%d"), + "discovery-date-taq": self.discovery_date_taq + and self.discovery_date_taq.strftime("%Y/%m/%d"), + "discovery-date-tpq": self.discovery_date_taq + and self.discovery_date + and self.discovery_date.strftime("%Y/%m/%d"), + } + ) return dct - def get_values(self, prefix='', no_values=False, filtr=None, **kwargs): + def get_values(self, prefix="", no_values=False, filtr=None, **kwargs): no_find = kwargs.get("no_find", False) values = super(BaseFind, self).get_values( - prefix=prefix, no_values=no_values, filtr=filtr, **kwargs) + prefix=prefix, no_values=no_values, filtr=filtr, **kwargs + ) if not filtr or prefix + "complete_id" in filtr: values[prefix + "complete_id"] = self.complete_id() if no_find: @@ -412,7 +506,7 @@ class BaseFind(BulkUpdatedItem, BaseHistorizedItem, GeoItem, kwargs["no_base_finds"] = True values[prefix + "finds"] = [ find.get_values(no_values=True, filtr=None, **kwargs) - for find in self.find.order_by('pk').all() + for find in self.find.order_by("pk").all() ] return values @@ -425,7 +519,7 @@ class BaseFind(BulkUpdatedItem, BaseHistorizedItem, GeoItem, """ Get the last find which is not related to many base_find """ - for find in self.find.order_by('-pk'): + for find in self.find.order_by("-pk"): if find.base_finds.count() == 1: return find return @@ -452,49 +546,48 @@ class BaseFind(BulkUpdatedItem, BaseHistorizedItem, GeoItem, """ 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 == 'O': + if profile.find_index == "O": operation = self.context_record.operation - q = BaseFind.objects \ - .filter(context_record__operation=operation) - elif profile.find_index == 'CR': + q = BaseFind.objects.filter(context_record__operation=operation) + elif profile.find_index == "CR": cr = self.context_record - q = BaseFind.objects \ - .filter(context_record=cr) + q = BaseFind.objects.filter(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 + 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: - return '' + return "" profile = get_current_profile() ope = self.context_record.operation c_id = [] if ope.code_patriarche: - c_id.append(profile.operation_prefix + - ope.code_patriarche) + c_id.append(profile.operation_prefix + ope.code_patriarche) elif ope.year and ope.operation_code: c_id.append( - profile.default_operation_prefix + - str(ope.year or '') + "-" + - str(ope.operation_code or '')) + profile.default_operation_prefix + + str(ope.year or "") + + "-" + + str(ope.operation_code or "") + ) else: - c_id.append('') + c_id.append("") return settings.JOINT.join(c_id) def complete_id(self): profile = get_current_profile() - if profile.has_overload('basefind_complete_id'): + if profile.has_overload("basefind_complete_id"): return ALTERNATE_CONFIGS[profile.config].basefind_complete_id(self) # OPE|MAT.CODE|UE|FIND_index c_id = [self._ope_code()] @@ -504,12 +597,15 @@ class BaseFind(BulkUpdatedItem, BaseHistorizedItem, GeoItem, for mat in find.material_types.all(): if mat.code: materials.add(mat.code) - c_id.append('-'.join(sorted(list(materials)))) + c_id.append("-".join(sorted(list(materials)))) c_id.append(self.context_record.label) - c_id.append(('{:0' + str(settings.ISHTAR_FINDS_INDEX_ZERO_LEN) + 'd}' - ).format(self.index)) + c_id.append( + ("{:0" + str(settings.ISHTAR_FINDS_INDEX_ZERO_LEN) + "d}").format( + self.index + ) + ) return settings.JOINT.join(c_id) def _generate_cache_complete_id(self): @@ -517,12 +613,15 @@ class BaseFind(BulkUpdatedItem, BaseHistorizedItem, GeoItem, def short_id(self): profile = get_current_profile() - if profile.has_overload('basefind_short_id'): + if profile.has_overload("basefind_short_id"): return ALTERNATE_CONFIGS[profile.config].basefind_short_id(self) # OPE|FIND_index c_id = [self._ope_code()] - c_id.append(('{:0' + str(settings.ISHTAR_FINDS_INDEX_ZERO_LEN) + 'd}' - ).format(self.index)) + c_id.append( + ("{:0" + str(settings.ISHTAR_FINDS_INDEX_ZERO_LEN) + "d}").format( + self.index + ) + ) return settings.JOINT.join(c_id) def _generate_cache_short_id(self): @@ -533,24 +632,32 @@ class BaseFind(BulkUpdatedItem, BaseHistorizedItem, GeoItem, def material_type_label(self): find = self.get_last_find() - finds = [find and find.material_type.code or ''] + finds = [find and find.material_type.code or ""] ope = self.context_record.operation - finds += [ope.code_patriarche or - (str(ope.year) + "-" + ope.operation_code)] + finds += [ope.code_patriarche or (str(ope.year) + "-" + ope.operation_code)] finds += [self.context_record.label, str(self.material_index)] return settings.JOINT.join(finds) def _real_label(self): - if not self.context_record.parcel \ - or not self.context_record.operation \ - or not self.context_record.operation.code_patriarche: + if ( + not self.context_record.parcel + or not self.context_record.operation + or not self.context_record.operation.code_patriarche + ): return find = self.get_last_find() lbl = find.label or self.label return settings.JOINT.join( - [it for it in ( - self.context_record.operation.code_patriarche, - self.context_record.label, lbl) if it]) + [ + it + for it in ( + self.context_record.operation.code_patriarche, + self.context_record.label, + lbl, + ) + if it + ] + ) def _temp_label(self): if not self.context_record.parcel: @@ -558,19 +665,33 @@ class BaseFind(BulkUpdatedItem, BaseHistorizedItem, GeoItem, find = self.get_last_find() lbl = find.label or self.label return settings.JOINT.join( - [str(it) for it in ( - self.context_record.parcel.year, self.index, - self.context_record.label, lbl) if it]) + [ + str(it) + for it in ( + self.context_record.parcel.year, + self.index, + self.context_record.label, + lbl, + ) + if it + ] + ) @property def name(self): return self.label @classmethod - def cached_label_bulk_update(cls, operation_id=None, parcel_id=None, - context_record_id=None, transaction_id=None): + def cached_label_bulk_update( + cls, + operation_id=None, + parcel_id=None, + context_record_id=None, + transaction_id=None, + ): transaction_id, is_recursion = cls.bulk_recursion( - transaction_id, [operation_id, parcel_id, context_record_id]) + transaction_id, [operation_id, parcel_id, context_record_id] + ) if is_recursion: return @@ -580,23 +701,23 @@ class BaseFind(BulkUpdatedItem, BaseHistorizedItem, GeoItem, ON acr.operation_id = %s AND acr.id = mybf.context_record_id """ args = [int(operation_id)] - kwargs = {'operation_id': operation_id} + kwargs = {"operation_id": operation_id} elif parcel_id: filters = """ INNER JOIN archaeological_context_records_contextrecord acr ON acr.parcel_id = %s AND acr.id = mybf.context_record_id """ args = [int(parcel_id)] - kwargs = {'parcel_id': parcel_id} + kwargs = {"parcel_id": parcel_id} elif context_record_id: filters = """ WHERE mybf.context_record_id = %s """ args = [int(context_record_id)] - kwargs = {'context_record_id': context_record_id} + kwargs = {"context_record_id": context_record_id} else: return - kwargs['transaction_id'] = transaction_id + kwargs["transaction_id"] = transaction_id profile = get_current_profile() @@ -672,10 +793,13 @@ class BaseFind(BulkUpdatedItem, BaseHistorizedItem, GeoItem, SELECT mybf.id FROM archaeological_finds_basefind mybf {filters} ); - """.format(main_ope_prefix=profile.operation_prefix, - ope_prefix=profile.default_operation_prefix, - join=settings.JOINT, filters=filters, - zeros=settings.ISHTAR_FINDS_INDEX_ZERO_LEN * "0") + """.format( + main_ope_prefix=profile.operation_prefix, + ope_prefix=profile.default_operation_prefix, + join=settings.JOINT, + filters=filters, + zeros=settings.ISHTAR_FINDS_INDEX_ZERO_LEN * "0", + ) with connection.cursor() as c: c.execute(sql, args) Find.cached_label_bulk_update(**kwargs) @@ -689,37 +813,43 @@ def post_save_basefind(sender, **kwargs): post_save.connect(post_save_basefind, sender=BaseFind) -WEIGHT_UNIT = (('g', _("g")), - ('kg', _("kg")),) +WEIGHT_UNIT = ( + ("g", _("g")), + ("kg", _("kg")), +) class FindBasket(Basket, MainItem, ValueGetter): - SHOW_URL = 'show-findbasket' + SHOW_URL = "show-findbasket" SLUG = "findbasket" - items = models.ManyToManyField('Find', blank=True, related_name='basket') + items = models.ManyToManyField("Find", blank=True, related_name="basket") QUICK_ACTIONS = [ QuickAction( - url="findbasket-qa-duplicate", icon_class="fa fa-clone", - text=_("Duplicate"), target="one", - rights=['view_find', 'view_own_find']), + url="findbasket-qa-duplicate", + icon_class="fa fa-clone", + text=_("Duplicate"), + target="one", + rights=["view_find", "view_own_find"], + ), ] class Meta: verbose_name = _("Basket") - ordering = ('label', ) + ordering = ("label",) permissions = ( ("view_find", "Can view all Finds"), ("view_own_find", "Can view own Find"), ) - def get_values(self, prefix='', no_values=False, filtr=None, **kwargs): + def get_values(self, prefix="", no_values=False, filtr=None, **kwargs): base_exclude = kwargs["exclude"][:] if "exclude" in kwargs else [] base_exclude.append(prefix + "items") kw = kwargs.copy() kw["exclude"] = base_exclude values = super(FindBasket, self).get_values( - prefix=prefix, no_values=no_values, filtr=filtr, **kw) + prefix=prefix, no_values=no_values, filtr=filtr, **kw + ) if not filtr or prefix + "items" in filtr: values[prefix + "items"] = [ item.get_values(no_values=True, filtr=filtr, **kwargs) @@ -739,30 +869,53 @@ class FindBasket(Basket, MainItem, ValueGetter): ishtaruser = request.user.ishtaruser actions = [] if self.user == ishtaruser or ishtaruser.pk in [ - user.pk for user in self.shared_write_with.all()]: + user.pk for user in self.shared_write_with.all() + ]: actions = [ - (reverse("select_itemsinbasket", args=[self.pk]), - _("Manage basket"), - "fa fa-shopping-basket", "", "", False), + ( + reverse("select_itemsinbasket", args=[self.pk]), + _("Manage basket"), + "fa fa-shopping-basket", + "", + "", + False, + ), ] - can_edit_find = self.can_do(request, 'change_find') + can_edit_find = self.can_do(request, "change_find") if can_edit_find: actions += [ - (reverse('findbasket-add-treatment', args=[self.pk]), - _("Add treatment"), "fa fa-flask", "", "", False), + ( + reverse("findbasket-add-treatment", args=[self.pk]), + _("Add treatment"), + "fa fa-flask", + "", + "", + False, + ), ] if self.can_do(request, "add_treatmentfile"): actions += [ - (reverse('findbasket-add-treatmentfile', args=[self.pk]), - _("Add treatment file"), "fa fa-file-text-o", "", "", False), + ( + reverse("findbasket-add-treatmentfile", args=[self.pk]), + _("Add treatment file"), + "fa fa-file-text-o", + "", + "", + False, + ), ] if can_edit_find: duplicate = self.get_quick_action_by_url("findbasket-qa-duplicate") actions += [ - (reverse(duplicate.url, args=[self.pk]), - duplicate.text, duplicate.icon_class, - "", "", True), + ( + reverse(duplicate.url, args=[self.pk]), + duplicate.text, + duplicate.icon_class, + "", + "", + True, + ), ] return actions @@ -813,129 +966,153 @@ def query_loan(is_true=True): :return: (filter, exclude, extra) """ if is_true: - return Q(container_ref__isnull=False, container__isnull=False), \ - Q(container_ref=F('container')), None + return ( + Q(container_ref__isnull=False, container__isnull=False), + Q(container_ref=F("container")), + None, + ) else: - return Q(container_ref__isnull=False, container__isnull=False, - container_ref=F('container')), None, None + return ( + Q( + container_ref__isnull=False, + container__isnull=False, + container_ref=F("container"), + ), + None, + None, + ) -class Find(BulkUpdatedItem, ValueGetter, DocumentItem, BaseHistorizedItem, - CompleteIdentifierItem, OwnPerms, MainItem): - SLUG = 'find' +class Find( + BulkUpdatedItem, + ValueGetter, + DocumentItem, + BaseHistorizedItem, + CompleteIdentifierItem, + OwnPerms, + MainItem, +): + SLUG = "find" APP = "archaeological-finds" MODEL = "find" - SHOW_URL = 'show-find' - DELETE_URL = 'delete-find' - EXTERNAL_ID_KEY = 'find_external_id' - TABLE_COLS = ['external_id', 'label', - 'base_finds__context_record__town__name', - 'base_finds__context_record__operation__common_name', - 'base_finds__context_record__label', - 'cached_materials', 'cached_object_types', - 'cached_periods', - 'container__cached_label'] - if settings.COUNTRY == 'fr': - TABLE_COLS.insert( - 3, 'base_finds__context_record__operation__code_patriarche') + SHOW_URL = "show-find" + DELETE_URL = "delete-find" + EXTERNAL_ID_KEY = "find_external_id" + TABLE_COLS = [ + "external_id", + "label", + "base_finds__context_record__town__name", + "base_finds__context_record__operation__common_name", + "base_finds__context_record__label", + "cached_materials", + "cached_object_types", + "cached_periods", + "container__cached_label", + ] + if settings.COUNTRY == "fr": + TABLE_COLS.insert(3, "base_finds__context_record__operation__code_patriarche") TABLE_COLS_FOR_OPE = [ - 'base_finds__cache_short_id', - 'base_finds__cache_complete_id', - 'previous_id', 'label', - 'cached_materials', - 'cached_periods', - 'find_number', - 'cached_object_types', - 'container__cached_label', - 'container_ref__cached_label', - 'description', - 'base_finds__context_record__town__name', - 'base_finds__context_record__parcel', ] + "base_finds__cache_short_id", + "base_finds__cache_complete_id", + "previous_id", + "label", + "cached_materials", + "cached_periods", + "find_number", + "cached_object_types", + "container__cached_label", + "container_ref__cached_label", + "description", + "base_finds__context_record__town__name", + "base_finds__context_record__parcel", + ] TABLE_COLS_FOR_CR = [ - 'base_finds__cache_short_id', - 'base_finds__cache_complete_id', - 'previous_id', 'label', - 'base_finds__context_record__label', - 'cached_materials', - 'cached_periods', - 'find_number', - 'cached_object_types', - 'container__cached_label', - 'container_ref__cached_label', - 'description', - 'base_finds__context_record__town__name', - 'base_finds__context_record__parcel', ] + "base_finds__cache_short_id", + "base_finds__cache_complete_id", + "previous_id", + "label", + "base_finds__context_record__label", + "cached_materials", + "cached_periods", + "find_number", + "cached_object_types", + "container__cached_label", + "container_ref__cached_label", + "description", + "base_finds__context_record__town__name", + "base_finds__context_record__parcel", + ] NEW_QUERY_ENGINE = True COL_LABELS = { - 'base_finds__context_record__label': _("Context record"), - 'base_finds__cache_short_id': _("Base find - Short ID"), - 'base_finds__cache_complete_id': _("Base find - Complete ID"), - 'base_finds__context_record__operation__code_patriarche': _( - "Operation (code)" - ), - 'base_finds__context_record__town__name': _("Town"), - 'base_finds__context_record__operation__common_name': _( - "Operation (name)" - ), - 'base_finds__context_record__archaeological_site__name': - IshtarSiteProfile.get_default_site_label, - 'base_finds__context_record__parcel': _("Parcel"), - 'base_finds__batch': _("Batch"), - 'base_finds__comment': _("Base find - Comment"), - 'base_finds__description': _("Base find - Description"), - 'base_finds__topographic_localisation': _("Base find - " - "Topographic localisation"), - 'base_finds__special_interest': _("Base find - Special interest"), - 'base_finds__discovery_date': _( - "Base find - Discovery date (exact or TPQ)"), - 'base_finds__discovery_date_taq': _( - "Base find - Discovery date (TAQ)"), - 'container__cached_label': _("Current container"), - 'container_ref__cached_label': _("Reference container"), - 'datings__period__label': _("Periods"), - 'cached_periods': _("Periods"), - 'material_types__label': _("Material types"), - 'cached_materials': _("Material types"), - 'object_types__label': _("Object types"), - 'cached_object_types': _("Object types"), + "base_finds__context_record__label": _("Context record"), + "base_finds__cache_short_id": _("Base find - Short ID"), + "base_finds__cache_complete_id": _("Base find - Complete ID"), + "base_finds__context_record__operation__code_patriarche": _("Operation (code)"), + "base_finds__context_record__town__name": _("Town"), + "base_finds__context_record__operation__common_name": _("Operation (name)"), + "base_finds__context_record__archaeological_site__name": IshtarSiteProfile.get_default_site_label, + "base_finds__context_record__parcel": _("Parcel"), + "base_finds__batch": _("Batch"), + "base_finds__comment": _("Base find - Comment"), + "base_finds__description": _("Base find - Description"), + "base_finds__topographic_localisation": _( + "Base find - " "Topographic localisation" + ), + "base_finds__special_interest": _("Base find - Special interest"), + "base_finds__discovery_date": _("Base find - Discovery date (exact or TPQ)"), + "base_finds__discovery_date_taq": _("Base find - Discovery date (TAQ)"), + "container__cached_label": _("Current container"), + "container_ref__cached_label": _("Reference container"), + "datings__period__label": _("Periods"), + "cached_periods": _("Periods"), + "material_types__label": _("Material types"), + "cached_materials": _("Material types"), + "object_types__label": _("Object types"), + "cached_object_types": _("Object types"), } EXTRA_FULL_FIELDS = [ - 'datings', - 'base_finds__cache_short_id', 'base_finds__cache_complete_id', - 'base_finds__comment', 'base_finds__description', - 'base_finds__topographic_localisation', - 'base_finds__special_interest', - 'base_finds__discovery_date', - 'base_finds__discovery_date_taq', + "datings", + "base_finds__cache_short_id", + "base_finds__cache_complete_id", + "base_finds__comment", + "base_finds__description", + "base_finds__topographic_localisation", + "base_finds__special_interest", + "base_finds__discovery_date", + "base_finds__discovery_date_taq", ] - ATTRS_EQUIV = {'get_first_base_find': 'base_finds'} + ATTRS_EQUIV = {"get_first_base_find": "base_finds"} # statistics - STATISTIC_MODALITIES_OPTIONS = OrderedDict([ - ("base_finds__context_record__operation__operation_type__label", - _("Operation type")), - ('base_finds__context_record__operation__year', _("Year")), - ("base_finds__context_record__operation__towns__areas__label", - _("Area")), - ("base_finds__context_record__operation__towns__areas__parent__label", - _("Extended area")), - ("datings__period__label", _("Period")), - ("material_types__label", _("Material type")), - ("object_types__label", _("Object type")), - ("preservation_to_considers__label", _("Recommended treatments")), - ("conservatory_state__label", _("Conservatory state")), - ("integrities__label", _("Integrity / interest")), - ("remarkabilities__label", _("Remarkability")), - ("communicabilities__label", _("Communicability")), - ("checked_type__label", _("Check")), - ("alterations__label", _("Alteration")), - ("alteration_causes__label", _("Alteration cause")), - ("treatment_emergency__label", _("Treatment emergency")), - ("documents__source_type__label", _("Associated document type")), - ]) - STATISTIC_MODALITIES = [ - key for key, lbl in STATISTIC_MODALITIES_OPTIONS.items()] + STATISTIC_MODALITIES_OPTIONS = OrderedDict( + [ + ( + "base_finds__context_record__operation__operation_type__label", + _("Operation type"), + ), + ("base_finds__context_record__operation__year", _("Year")), + ("base_finds__context_record__operation__towns__areas__label", _("Area")), + ( + "base_finds__context_record__operation__towns__areas__parent__label", + _("Extended area"), + ), + ("datings__period__label", _("Period")), + ("material_types__label", _("Material type")), + ("object_types__label", _("Object type")), + ("preservation_to_considers__label", _("Recommended treatments")), + ("conservatory_state__label", _("Conservatory state")), + ("integrities__label", _("Integrity / interest")), + ("remarkabilities__label", _("Remarkability")), + ("communicabilities__label", _("Communicability")), + ("checked_type__label", _("Check")), + ("alterations__label", _("Alteration")), + ("alteration_causes__label", _("Alteration cause")), + ("treatment_emergency__label", _("Treatment emergency")), + ("documents__source_type__label", _("Associated document type")), + ] + ) + STATISTIC_MODALITIES = [key for key, lbl in STATISTIC_MODALITIES_OPTIONS.items()] STATISTIC_SUM_VARIABLE = OrderedDict( ( ("pk", (_("Number"), 1)), @@ -946,65 +1123,54 @@ class Find(BulkUpdatedItem, ValueGetter, DocumentItem, BaseHistorizedItem, ) # search parameters - REVERSED_BOOL_FIELDS = ['documents__image__isnull', - 'documents__associated_url__isnull', - 'documents__associated_file__isnull'] - BOOL_FIELDS = ['is_complete'] + REVERSED_BOOL_FIELDS = [ + "documents__image__isnull", + "documents__associated_url__isnull", + "documents__associated_file__isnull", + ] + BOOL_FIELDS = ["is_complete"] RELATION_TYPES_PREFIX = { - 'ope_relation_types': - 'base_finds__context_record__operation__', - 'cr_relation_types': - 'base_finds__context_record__', + "ope_relation_types": "base_finds__context_record__operation__", + "cr_relation_types": "base_finds__context_record__", } DATED_FIELDS = [ - 'last_modified__gte', - 'treatments__file__end_date__lte', - 'treatments__end_date__lte', - 'base_finds__discovery_date__lte', - 'base_finds__discovery_date__gte', - 'base_finds__discovery_date_tpq__lte', - 'base_finds__discovery_date_tpq__gte', - 'base_finds__discovery_date_taq__lte', - 'base_finds__discovery_date_taq__gte', - 'check_date__lte', - 'check_date__gte', - 'appraisal_date__lte', - 'appraisal_date__gte', + "last_modified__gte", + "treatments__file__end_date__lte", + "treatments__end_date__lte", + "base_finds__discovery_date__lte", + "base_finds__discovery_date__gte", + "base_finds__discovery_date_tpq__lte", + "base_finds__discovery_date_tpq__gte", + "base_finds__discovery_date_taq__lte", + "base_finds__discovery_date_taq__gte", + "check_date__lte", + "check_date__gte", + "appraisal_date__lte", + "appraisal_date__gte", ] - BASE_REQUEST = {'downstream_treatment__isnull': True} + BASE_REQUEST = {"downstream_treatment__isnull": True} EXTRA_REQUEST_KEYS = { - 'all_base_finds__context_record': - 'base_finds__context_record__context_record_tree_parent__cr_parent_id', - 'base_finds__context_record': - 'base_finds__context_record__pk', - 'base_finds__context_record__archaeological_site': - 'base_finds__context_record__archaeological_site__pk', - 'archaeological_sites_context_record': - 'base_finds__context_record__archaeological_site__pk', - 'base_finds__context_record__operation__year': - 'base_finds__context_record__operation__year__contains', - 'base_finds__context_record__operation': - 'base_finds__context_record__operation__pk', - 'base_finds__context_record__operation__operation_type': - 'base_finds__context_record__operation__operation_type__pk', - 'archaeological_sites': - 'base_finds__context_record__operation__archaeological_sites__pk', - 'base_finds__context_record__operation__code_patriarche': - 'base_finds__context_record__operation__code_patriarche', - 'base_finds__context_record__town__areas': - 'base_finds__context_record__town__areas__pk', - 'base_finds__context_record__archaeological_site__name': - 'base_finds__context_record__archaeological_site__name', - 'datings__period': 'datings__period__pk', - 'description': 'description__icontains', - 'base_finds__batch': 'base_finds__batch', - 'basket_id': 'basket__pk', - 'denomination': 'denomination', - 'cached_label': 'cached_label__icontains', - 'documents__image__isnull': 'documents__image__isnull', - 'container__location': 'container__location__pk', - 'container_ref__location': 'container_ref__location__pk', + "all_base_finds__context_record": "base_finds__context_record__context_record_tree_parent__cr_parent_id", + "base_finds__context_record": "base_finds__context_record__pk", + "base_finds__context_record__archaeological_site": "base_finds__context_record__archaeological_site__pk", + "archaeological_sites_context_record": "base_finds__context_record__archaeological_site__pk", + "base_finds__context_record__operation__year": "base_finds__context_record__operation__year__contains", + "base_finds__context_record__operation": "base_finds__context_record__operation__pk", + "base_finds__context_record__operation__operation_type": "base_finds__context_record__operation__operation_type__pk", + "archaeological_sites": "base_finds__context_record__operation__archaeological_sites__pk", + "base_finds__context_record__operation__code_patriarche": "base_finds__context_record__operation__code_patriarche", + "base_finds__context_record__town__areas": "base_finds__context_record__town__areas__pk", + "base_finds__context_record__archaeological_site__name": "base_finds__context_record__archaeological_site__name", + "datings__period": "datings__period__pk", + "description": "description__icontains", + "base_finds__batch": "base_finds__batch", + "basket_id": "basket__pk", + "denomination": "denomination", + "cached_label": "cached_label__icontains", + "documents__image__isnull": "documents__image__isnull", + "container__location": "container__location__pk", + "container_ref__location": "container_ref__location__pk", } for table in (TABLE_COLS, TABLE_COLS_FOR_OPE): for key in table: @@ -1013,421 +1179,373 @@ class Find(BulkUpdatedItem, ValueGetter, DocumentItem, BaseHistorizedItem, # alternative names of fields for searches ALT_NAMES = { - 'base_finds__cache_short_id': - SearchAltName(pgettext_lazy("key for text search", "short-id"), - 'base_finds__cache_short_id__iexact'), - 'base_finds__cache_complete_id': - SearchAltName(pgettext_lazy("key for text search", "complete-id"), - 'base_finds__cache_complete_id__iexact'), - 'label': - SearchAltName(pgettext_lazy("key for text search", "free-id"), - 'label__iexact'), - 'denomination': - SearchAltName(pgettext_lazy("key for text search", "denomination"), - 'denomination__iexact'), - 'base_finds__context_record__town': - SearchAltName( - pgettext_lazy("key for text search", "town"), - 'base_finds__context_record__town__cached_label__iexact'), - 'base_finds__context_record__operation__year': - SearchAltName(pgettext_lazy("key for text search", "year"), - 'base_finds__context_record__operation__year'), - 'base_finds__context_record__operation__operation_code': - SearchAltName( - pgettext_lazy("key for text search", "operation-code"), - 'base_finds__context_record__operation__operation_code'), - 'base_finds__context_record__operation__code_patriarche': - SearchAltName( - pgettext_lazy("key for text search", "code-patriarche"), - 'base_finds__context_record__operation__code_patriarche__iexact' - ), - 'base_finds__context_record__operation__operation_type': - SearchAltName( - pgettext_lazy("key for text search", "operation-type"), - 'base_finds__context_record__operation__operation_type' - '__label__iexact'), - 'base_finds__context_record__town__areas': - SearchAltName( - pgettext_lazy("key for text search", "area"), - 'base_finds__context_record__town__areas__label__iexact'), - 'archaeological_sites': - SearchAltName( - pgettext_lazy("key for text search", "site"), - 'base_finds__context_record__operation__archaeological_sites__' - 'cached_label__icontains'), - 'archaeological_sites_name': - SearchAltName( - pgettext_lazy("key for text search", "site-name"), - 'base_finds__context_record__operation__archaeological_sites__' - 'name__iexact'), - 'archaeological_sites_context_record': - SearchAltName( - pgettext_lazy("key for text search", "context-record-site"), - 'base_finds__context_record__archaeological_site__' - 'cached_label__icontains'), - 'archaeological_sites_context_record_name': - SearchAltName( - pgettext_lazy("key for text search", - "context-record-site-name"), - 'base_finds__context_record__archaeological_site__' - 'name__iexact'), - 'base_finds__context_record': - SearchAltName( - pgettext_lazy("key for text search", "context-record"), - 'base_finds__context_record__cached_label__icontains'), - 'ope_relation_types': - SearchAltName( - pgettext_lazy("key for text search", "operation-relation-type"), - 'ope_relation_types'), - 'cr_relation_types': - SearchAltName( - pgettext_lazy("key for text search", - "context-record-relation-type"), - 'cr_relation_types'), - 'material_types': - SearchAltName( - pgettext_lazy("key for text search", "material"), - 'material_types__label__iexact'), - 'object_types': - SearchAltName( - pgettext_lazy("key for text search", "object-type"), - 'object_types__label__iexact'), - 'preservation_to_considers': - SearchAltName( - pgettext_lazy("key for text search", "recommended-treatments"), - 'preservation_to_considers__label__iexact'), - 'conservatory_state': - SearchAltName( - pgettext_lazy("key for text search", "conservatory"), - 'conservatory_state__label__iexact'), - 'integrities': - SearchAltName( - pgettext_lazy("key for text search", "integrity"), - 'integrities__label__iexact'), - 'remarkabilities': - SearchAltName( - pgettext_lazy("key for text search", "remarkability"), - 'remarkabilities__label__iexact'), - 'description': - SearchAltName( - pgettext_lazy("key for text search", "description"), - 'description__iexact'), - 'base_finds__batch': - SearchAltName( - pgettext_lazy("key for text search", "batch"), - 'base_finds__batch__label__iexact'), - 'checked_type': - SearchAltName( - pgettext_lazy("key for text search", "checked"), - 'checked_type__label__iexact'), - 'container_ref': - SearchAltName( - pgettext_lazy("key for text search", "container"), - 'container_ref__cached_label__iexact'), - 'container_ref__location': - SearchAltName( - pgettext_lazy("key for text search", "location"), - 'container_ref__location__name__iexact'), - 'container__location': - SearchAltName( - pgettext_lazy("key for text search", "current-location"), - 'container__location__name__iexact'), - 'container': - SearchAltName( - pgettext_lazy("key for text search", "current-container"), - 'container__cached_label__iexact'), - 'basket': - SearchAltName( - pgettext_lazy("key for text search", "basket"), - 'basket__label__iexact'), - 'base_finds__context_record__operation__cached_label': - SearchAltName( - pgettext_lazy("key for text search", "operation"), - 'base_finds__context_record__operation__cached_label__icontains' - ), - 'history_modifier': - SearchAltName( - pgettext_lazy("key for text search", "last-modified-by"), - 'history_modifier__ishtaruser__person__cached_label__icontains' - ), - 'history_creator': - SearchAltName( - pgettext_lazy("key for text search", "created-by"), - 'history_creator__ishtaruser__person__cached_label__iexact' - ), - 'loan': - SearchAltName( - pgettext_lazy("key for text search", "loan"), query_loan), - 'treatments_file_end_date': - SearchAltName( - pgettext_lazy("key for text search", - "treatment-file-end-date-before"), - 'treatments__file__end_date__lte'), - 'treatments_end_date': - SearchAltName( - pgettext_lazy("key for text search", - "treatment-end-date-before"), - 'treatments__end_date__lte'), - 'previous_id': - SearchAltName( - pgettext_lazy("key for text search", "previous-id"), - 'previous_id__iexact'), + "base_finds__cache_short_id": SearchAltName( + pgettext_lazy("key for text search", "short-id"), + "base_finds__cache_short_id__iexact", + ), + "base_finds__cache_complete_id": SearchAltName( + pgettext_lazy("key for text search", "complete-id"), + "base_finds__cache_complete_id__iexact", + ), + "label": SearchAltName( + pgettext_lazy("key for text search", "free-id"), "label__iexact" + ), + "denomination": SearchAltName( + pgettext_lazy("key for text search", "denomination"), "denomination__iexact" + ), + "base_finds__context_record__town": SearchAltName( + pgettext_lazy("key for text search", "town"), + "base_finds__context_record__town__cached_label__iexact", + ), + "base_finds__context_record__operation__year": SearchAltName( + pgettext_lazy("key for text search", "year"), + "base_finds__context_record__operation__year", + ), + "base_finds__context_record__operation__operation_code": SearchAltName( + pgettext_lazy("key for text search", "operation-code"), + "base_finds__context_record__operation__operation_code", + ), + "base_finds__context_record__operation__code_patriarche": SearchAltName( + pgettext_lazy("key for text search", "code-patriarche"), + "base_finds__context_record__operation__code_patriarche__iexact", + ), + "base_finds__context_record__operation__operation_type": SearchAltName( + pgettext_lazy("key for text search", "operation-type"), + "base_finds__context_record__operation__operation_type" "__label__iexact", + ), + "base_finds__context_record__town__areas": SearchAltName( + pgettext_lazy("key for text search", "area"), + "base_finds__context_record__town__areas__label__iexact", + ), + "archaeological_sites": SearchAltName( + pgettext_lazy("key for text search", "site"), + "base_finds__context_record__operation__archaeological_sites__" + "cached_label__icontains", + ), + "archaeological_sites_name": SearchAltName( + pgettext_lazy("key for text search", "site-name"), + "base_finds__context_record__operation__archaeological_sites__" + "name__iexact", + ), + "archaeological_sites_context_record": SearchAltName( + pgettext_lazy("key for text search", "context-record-site"), + "base_finds__context_record__archaeological_site__" + "cached_label__icontains", + ), + "archaeological_sites_context_record_name": SearchAltName( + pgettext_lazy("key for text search", "context-record-site-name"), + "base_finds__context_record__archaeological_site__" "name__iexact", + ), + "base_finds__context_record": SearchAltName( + pgettext_lazy("key for text search", "context-record"), + "base_finds__context_record__cached_label__icontains", + ), + "ope_relation_types": SearchAltName( + pgettext_lazy("key for text search", "operation-relation-type"), + "ope_relation_types", + ), + "cr_relation_types": SearchAltName( + pgettext_lazy("key for text search", "context-record-relation-type"), + "cr_relation_types", + ), + "material_types": SearchAltName( + pgettext_lazy("key for text search", "material"), + "material_types__label__iexact", + ), + "object_types": SearchAltName( + pgettext_lazy("key for text search", "object-type"), + "object_types__label__iexact", + ), + "preservation_to_considers": SearchAltName( + pgettext_lazy("key for text search", "recommended-treatments"), + "preservation_to_considers__label__iexact", + ), + "conservatory_state": SearchAltName( + pgettext_lazy("key for text search", "conservatory"), + "conservatory_state__label__iexact", + ), + "integrities": SearchAltName( + pgettext_lazy("key for text search", "integrity"), + "integrities__label__iexact", + ), + "remarkabilities": SearchAltName( + pgettext_lazy("key for text search", "remarkability"), + "remarkabilities__label__iexact", + ), + "description": SearchAltName( + pgettext_lazy("key for text search", "description"), "description__iexact" + ), + "base_finds__batch": SearchAltName( + pgettext_lazy("key for text search", "batch"), + "base_finds__batch__label__iexact", + ), + "checked_type": SearchAltName( + pgettext_lazy("key for text search", "checked"), + "checked_type__label__iexact", + ), + "container_ref": SearchAltName( + pgettext_lazy("key for text search", "container"), + "container_ref__cached_label__iexact", + ), + "container_ref__location": SearchAltName( + pgettext_lazy("key for text search", "location"), + "container_ref__location__name__iexact", + ), + "container__location": SearchAltName( + pgettext_lazy("key for text search", "current-location"), + "container__location__name__iexact", + ), + "container": SearchAltName( + pgettext_lazy("key for text search", "current-container"), + "container__cached_label__iexact", + ), + "basket": SearchAltName( + pgettext_lazy("key for text search", "basket"), "basket__label__iexact" + ), + "base_finds__context_record__operation__cached_label": SearchAltName( + pgettext_lazy("key for text search", "operation"), + "base_finds__context_record__operation__cached_label__icontains", + ), + "history_modifier": SearchAltName( + pgettext_lazy("key for text search", "last-modified-by"), + "history_modifier__ishtaruser__person__cached_label__icontains", + ), + "history_creator": SearchAltName( + pgettext_lazy("key for text search", "created-by"), + "history_creator__ishtaruser__person__cached_label__iexact", + ), + "loan": SearchAltName(pgettext_lazy("key for text search", "loan"), query_loan), + "treatments_file_end_date": SearchAltName( + pgettext_lazy("key for text search", "treatment-file-end-date-before"), + "treatments__file__end_date__lte", + ), + "treatments_end_date": SearchAltName( + pgettext_lazy("key for text search", "treatment-end-date-before"), + "treatments__end_date__lte", + ), + "previous_id": SearchAltName( + pgettext_lazy("key for text search", "previous-id"), "previous_id__iexact" + ), #'collection': # SearchAltName( # pgettext_lazy("key for text search", "collection"), # 'collection__name__iexact'), - 'seal_number': - SearchAltName( - pgettext_lazy("key for text search", "seal-number"), - 'seal_number__iexact'), - 'base_finds__excavation_id': - SearchAltName( - pgettext_lazy("key for text search", "excavation-id"), - 'base_finds__excavation_id__iexact'), - 'museum_id': - SearchAltName( - pgettext_lazy("key for text search", "museum-id"), - 'museum_id__iexact'), - 'laboratory_id': - SearchAltName( - pgettext_lazy("key for text search", "laboratory-id"), - 'laboratory_id__iexact'), - 'mark': - SearchAltName( - pgettext_lazy("key for text search", "mark"), - 'mark__iexact'), - 'base_finds__discovery_date__before': - SearchAltName( - pgettext_lazy("key for text search", "discovery-date-before"), - 'base_finds__discovery_date__lte'), - 'base_finds__discovery_date__after': - SearchAltName( - pgettext_lazy("key for text search", "discovery-date-after"), - 'base_finds__discovery_date__gte'), - 'base_finds__discovery_date_tpq__before': - SearchAltName( - pgettext_lazy("key for text search", - "discovery-date-tpq-before"), - 'base_finds__discovery_date_tpq__lte'), - 'base_finds__discovery_date_tpq__after': - SearchAltName( - pgettext_lazy("key for text search", - "discovery-date-tpq-after"), - 'base_finds__discovery_date_tpq__gte'), - 'base_finds__discovery_date_taq__before': - SearchAltName( - pgettext_lazy("key for text search", - "discovery-date-taq-before"), - 'base_finds__discovery_date_taq__lte'), - 'base_finds__discovery_date_taq__after': - SearchAltName( - pgettext_lazy("key for text search", - "discovery-date-taq-after"), - 'base_finds__discovery_date_taq__gte'), - 'is_complete': - SearchAltName( - pgettext_lazy("key for text search", "is-complete"), - 'is_complete'), - 'material_type_quality': - SearchAltName( - pgettext_lazy("key for text search", "material-type-quality"), - 'material_type_quality__label__iexact'), - 'object_type_quality': - SearchAltName( - pgettext_lazy("key for text search", "object-type-quality"), - 'object_type_quality__label__iexact'), - 'find_number': - SearchAltName( - pgettext_lazy("key for text search", "find-number"), - 'find_number'), - 'min_number_of_individuals': - SearchAltName( - pgettext_lazy("key for text search", - "min-number-of-individuals"), - 'min_number_of_individuals'), - 'decoration': - SearchAltName( - pgettext_lazy("key for text search", "decoration"), - 'decoration__iexact'), - 'inscription': - SearchAltName( - pgettext_lazy("key for text search", "inscription"), - 'inscription__iexact'), - 'manufacturing_place': - SearchAltName( - pgettext_lazy("key for text search", "manufacturing-place"), - 'manufacturing_place__iexact'), - 'communicabilities': - SearchAltName( - pgettext_lazy("key for text search", "communicabilities"), - 'communicabilities__label__iexact'), - 'comment': - SearchAltName( - pgettext_lazy("key for text search", "comment"), - 'comment__iexact'), - 'material_comment': - SearchAltName( - pgettext_lazy("key for text search", "material-comment"), - 'material_comment__iexact'), - 'dating_comment': - SearchAltName( - pgettext_lazy("key for text search", "dating-comment"), - 'dating_comment__iexact'), - 'conservatory_comment': - SearchAltName( - pgettext_lazy("key for text search", "conservatory-comment"), - 'conservatory_comment__iexact'), - 'length__lower': - SearchAltName( - pgettext_lazy("key for text search", "length-lower"), - 'length__lte'), - 'width__lower': - SearchAltName( - pgettext_lazy("key for text search", "width-lower"), - 'width__lte'), - 'height__lower': - SearchAltName( - pgettext_lazy("key for text search", "height-lower"), - 'height__lte'), - 'thickness__lower': - SearchAltName( - pgettext_lazy("key for text search", "thickness-lower"), - 'thickness__lte'), - 'diameter__lower': - SearchAltName( - pgettext_lazy("key for text search", "diameter-lower"), - 'diameter__lte'), - 'circumference__lower': - SearchAltName( - pgettext_lazy("key for text search", "circumference-lower"), - 'circumference__lte'), - 'volume__lower': - SearchAltName( - pgettext_lazy("key for text search", "volume-lower"), - 'volume__lte'), - 'weight__lower': - SearchAltName( - pgettext_lazy("key for text search", "weight-lower"), - 'weight__lte'), - 'clutter_long_side__lower': - SearchAltName( - pgettext_lazy("key for text search", - "clutter-long-side-lower"), - 'clutter_long_side__lte'), - 'clutter_short_side__lower': - SearchAltName( - pgettext_lazy("key for text search", - "clutter-short-side-lower"), - 'clutter_short_side__lte'), - 'clutter_height__lower': - SearchAltName( - pgettext_lazy("key for text search", "clutter-height-lower"), - 'clutter_height__lte'), - 'length__higher': - SearchAltName( - pgettext_lazy("key for text search", "length-higher"), - 'length__gte'), - 'width__higher': - SearchAltName( - pgettext_lazy("key for text search", "width-higher"), - 'width__gte'), - 'height__higher': - SearchAltName( - pgettext_lazy("key for text search", "height-higher"), - 'height__gte'), - 'thickness__higher': - SearchAltName( - pgettext_lazy("key for text search", "thickness-higher"), - 'thickness__gte'), - 'diameter__higher': - SearchAltName( - pgettext_lazy("key for text search", "diameter-higher"), - 'diameter__gte'), - 'circumference__higher': - SearchAltName( - pgettext_lazy("key for text search", "circumference-higher"), - 'circumference__gte'), - 'volume__higher': - SearchAltName( - pgettext_lazy("key for text search", "volume-higher"), - 'volume__gte'), - 'weight__higher': - SearchAltName( - pgettext_lazy("key for text search", "weight-higher"), - 'weight__gte'), - 'clutter_long_side__higher': - SearchAltName( - pgettext_lazy("key for text search", - "clutter-long-side-higher"), - 'clutter_long_side__gte'), - 'clutter_short_side__higher': - SearchAltName( - pgettext_lazy("key for text search", - "clutter-short-side-higher"), - 'clutter_short_side__gte'), - 'clutter_height__higher': - SearchAltName( - pgettext_lazy("key for text search", "clutter-height-higher"), - 'clutter_height__gte'), - - 'dimensions_comment': - SearchAltName( - pgettext_lazy("key for text search", "dimensions-comment"), - 'dimensions_comment__icontains'), - 'base_finds__topographic_localisation': - SearchAltName( - pgettext_lazy("key for text search", - "topographic-localisation"), - 'base_finds__topographic_localisation__iexact'), - 'check_date__before': - SearchAltName( - pgettext_lazy("key for text search", "check-date-before"), - 'check_date__lte'), - 'check_date__after': - SearchAltName( - pgettext_lazy("key for text search", "check-date-after"), - 'check_date__gte'), - 'alterations': - SearchAltName( - pgettext_lazy("key for text search", "alterations"), - 'alterations__label__iexact'), - 'alteration_causes': - SearchAltName( - pgettext_lazy("key for text search", "alteration-causes"), - 'alteration_causes__label__iexact'), - 'treatment_emergency': - SearchAltName( - pgettext_lazy("key for text search", "treatment-emergency"), - 'treatment_emergency__label__iexact'), - 'estimated_value__higher': - SearchAltName( - pgettext_lazy("key for text search", - "estimated-value-higher"), - 'estimated_value__gte'), - 'estimated_value__lower': - SearchAltName( - pgettext_lazy("key for text search", "estimated-value-lower"), - 'estimated_value__lte'), - 'insurance_value__higher': - SearchAltName( - pgettext_lazy("key for text search", - "insurance-value-higher"), - 'insurance_value__gte'), - 'insurance_value__lower': - SearchAltName( - pgettext_lazy("key for text search", "insurance-value-lower"), - 'insurance_value__lte'), - 'appraisal_date__before': - SearchAltName( - pgettext_lazy("key for text search", "appraisal-date-before"), - 'appraisal_date__lte'), - 'appraisal_date__after': - SearchAltName( - pgettext_lazy("key for text search", "appraisal-date-after"), - 'appraisal_date__gte'), - 'cultural_attributions': SearchAltName( + "seal_number": SearchAltName( + pgettext_lazy("key for text search", "seal-number"), "seal_number__iexact" + ), + "base_finds__excavation_id": SearchAltName( + pgettext_lazy("key for text search", "excavation-id"), + "base_finds__excavation_id__iexact", + ), + "museum_id": SearchAltName( + pgettext_lazy("key for text search", "museum-id"), "museum_id__iexact" + ), + "laboratory_id": SearchAltName( + pgettext_lazy("key for text search", "laboratory-id"), + "laboratory_id__iexact", + ), + "mark": SearchAltName( + pgettext_lazy("key for text search", "mark"), "mark__iexact" + ), + "base_finds__discovery_date__before": SearchAltName( + pgettext_lazy("key for text search", "discovery-date-before"), + "base_finds__discovery_date__lte", + ), + "base_finds__discovery_date__after": SearchAltName( + pgettext_lazy("key for text search", "discovery-date-after"), + "base_finds__discovery_date__gte", + ), + "base_finds__discovery_date_tpq__before": SearchAltName( + pgettext_lazy("key for text search", "discovery-date-tpq-before"), + "base_finds__discovery_date_tpq__lte", + ), + "base_finds__discovery_date_tpq__after": SearchAltName( + pgettext_lazy("key for text search", "discovery-date-tpq-after"), + "base_finds__discovery_date_tpq__gte", + ), + "base_finds__discovery_date_taq__before": SearchAltName( + pgettext_lazy("key for text search", "discovery-date-taq-before"), + "base_finds__discovery_date_taq__lte", + ), + "base_finds__discovery_date_taq__after": SearchAltName( + pgettext_lazy("key for text search", "discovery-date-taq-after"), + "base_finds__discovery_date_taq__gte", + ), + "is_complete": SearchAltName( + pgettext_lazy("key for text search", "is-complete"), "is_complete" + ), + "material_type_quality": SearchAltName( + pgettext_lazy("key for text search", "material-type-quality"), + "material_type_quality__label__iexact", + ), + "object_type_quality": SearchAltName( + pgettext_lazy("key for text search", "object-type-quality"), + "object_type_quality__label__iexact", + ), + "find_number": SearchAltName( + pgettext_lazy("key for text search", "find-number"), "find_number" + ), + "min_number_of_individuals": SearchAltName( + pgettext_lazy("key for text search", "min-number-of-individuals"), + "min_number_of_individuals", + ), + "decoration": SearchAltName( + pgettext_lazy("key for text search", "decoration"), "decoration__iexact" + ), + "inscription": SearchAltName( + pgettext_lazy("key for text search", "inscription"), "inscription__iexact" + ), + "manufacturing_place": SearchAltName( + pgettext_lazy("key for text search", "manufacturing-place"), + "manufacturing_place__iexact", + ), + "communicabilities": SearchAltName( + pgettext_lazy("key for text search", "communicabilities"), + "communicabilities__label__iexact", + ), + "comment": SearchAltName( + pgettext_lazy("key for text search", "comment"), "comment__iexact" + ), + "material_comment": SearchAltName( + pgettext_lazy("key for text search", "material-comment"), + "material_comment__iexact", + ), + "dating_comment": SearchAltName( + pgettext_lazy("key for text search", "dating-comment"), + "dating_comment__iexact", + ), + "conservatory_comment": SearchAltName( + pgettext_lazy("key for text search", "conservatory-comment"), + "conservatory_comment__iexact", + ), + "length__lower": SearchAltName( + pgettext_lazy("key for text search", "length-lower"), "length__lte" + ), + "width__lower": SearchAltName( + pgettext_lazy("key for text search", "width-lower"), "width__lte" + ), + "height__lower": SearchAltName( + pgettext_lazy("key for text search", "height-lower"), "height__lte" + ), + "thickness__lower": SearchAltName( + pgettext_lazy("key for text search", "thickness-lower"), "thickness__lte" + ), + "diameter__lower": SearchAltName( + pgettext_lazy("key for text search", "diameter-lower"), "diameter__lte" + ), + "circumference__lower": SearchAltName( + pgettext_lazy("key for text search", "circumference-lower"), + "circumference__lte", + ), + "volume__lower": SearchAltName( + pgettext_lazy("key for text search", "volume-lower"), "volume__lte" + ), + "weight__lower": SearchAltName( + pgettext_lazy("key for text search", "weight-lower"), "weight__lte" + ), + "clutter_long_side__lower": SearchAltName( + pgettext_lazy("key for text search", "clutter-long-side-lower"), + "clutter_long_side__lte", + ), + "clutter_short_side__lower": SearchAltName( + pgettext_lazy("key for text search", "clutter-short-side-lower"), + "clutter_short_side__lte", + ), + "clutter_height__lower": SearchAltName( + pgettext_lazy("key for text search", "clutter-height-lower"), + "clutter_height__lte", + ), + "length__higher": SearchAltName( + pgettext_lazy("key for text search", "length-higher"), "length__gte" + ), + "width__higher": SearchAltName( + pgettext_lazy("key for text search", "width-higher"), "width__gte" + ), + "height__higher": SearchAltName( + pgettext_lazy("key for text search", "height-higher"), "height__gte" + ), + "thickness__higher": SearchAltName( + pgettext_lazy("key for text search", "thickness-higher"), "thickness__gte" + ), + "diameter__higher": SearchAltName( + pgettext_lazy("key for text search", "diameter-higher"), "diameter__gte" + ), + "circumference__higher": SearchAltName( + pgettext_lazy("key for text search", "circumference-higher"), + "circumference__gte", + ), + "volume__higher": SearchAltName( + pgettext_lazy("key for text search", "volume-higher"), "volume__gte" + ), + "weight__higher": SearchAltName( + pgettext_lazy("key for text search", "weight-higher"), "weight__gte" + ), + "clutter_long_side__higher": SearchAltName( + pgettext_lazy("key for text search", "clutter-long-side-higher"), + "clutter_long_side__gte", + ), + "clutter_short_side__higher": SearchAltName( + pgettext_lazy("key for text search", "clutter-short-side-higher"), + "clutter_short_side__gte", + ), + "clutter_height__higher": SearchAltName( + pgettext_lazy("key for text search", "clutter-height-higher"), + "clutter_height__gte", + ), + "dimensions_comment": SearchAltName( + pgettext_lazy("key for text search", "dimensions-comment"), + "dimensions_comment__icontains", + ), + "base_finds__topographic_localisation": SearchAltName( + pgettext_lazy("key for text search", "topographic-localisation"), + "base_finds__topographic_localisation__iexact", + ), + "check_date__before": SearchAltName( + pgettext_lazy("key for text search", "check-date-before"), "check_date__lte" + ), + "check_date__after": SearchAltName( + pgettext_lazy("key for text search", "check-date-after"), "check_date__gte" + ), + "alterations": SearchAltName( + pgettext_lazy("key for text search", "alterations"), + "alterations__label__iexact", + ), + "alteration_causes": SearchAltName( + pgettext_lazy("key for text search", "alteration-causes"), + "alteration_causes__label__iexact", + ), + "treatment_emergency": SearchAltName( + pgettext_lazy("key for text search", "treatment-emergency"), + "treatment_emergency__label__iexact", + ), + "estimated_value__higher": SearchAltName( + pgettext_lazy("key for text search", "estimated-value-higher"), + "estimated_value__gte", + ), + "estimated_value__lower": SearchAltName( + pgettext_lazy("key for text search", "estimated-value-lower"), + "estimated_value__lte", + ), + "insurance_value__higher": SearchAltName( + pgettext_lazy("key for text search", "insurance-value-higher"), + "insurance_value__gte", + ), + "insurance_value__lower": SearchAltName( + pgettext_lazy("key for text search", "insurance-value-lower"), + "insurance_value__lte", + ), + "appraisal_date__before": SearchAltName( + pgettext_lazy("key for text search", "appraisal-date-before"), + "appraisal_date__lte", + ), + "appraisal_date__after": SearchAltName( + pgettext_lazy("key for text search", "appraisal-date-after"), + "appraisal_date__gte", + ), + "cultural_attributions": SearchAltName( pgettext_lazy("key for text search", "cultural-attribution"), - 'cultural_attributions__label__iexact'), + "cultural_attributions__label__iexact", + ), } ALT_NAMES.update(BaseHistorizedItem.ALT_NAMES) ALT_NAMES.update(DocumentItem.ALT_NAMES) @@ -1457,7 +1575,7 @@ class Find(BulkUpdatedItem, ValueGetter, DocumentItem, BaseHistorizedItem, } """ - PARENT_SEARCH_VECTORS = ['base_finds'] + PARENT_SEARCH_VECTORS = ["base_finds"] BASE_SEARCH_VECTORS = [ SearchVectorConfig("cached_label"), SearchVectorConfig("label"), @@ -1483,240 +1601,333 @@ class Find(BulkUpdatedItem, ValueGetter, DocumentItem, BaseHistorizedItem, ] QA_EDIT = QuickAction( - url="find-qa-bulk-update", icon_class="fa fa-pencil", - text=_("Bulk update"), target="many", - rights=['change_find', 'change_own_find']) + url="find-qa-bulk-update", + icon_class="fa fa-pencil", + text=_("Bulk update"), + target="many", + rights=["change_find", "change_own_find"], + ) QA_LOCK = QuickAction( - url="find-qa-lock", icon_class="fa fa-lock", - text=_("Lock/Unlock"), target="many", - rights=['change_find', 'change_own_find'] + url="find-qa-lock", + icon_class="fa fa-lock", + text=_("Lock/Unlock"), + target="many", + rights=["change_find", "change_own_find"], ) QUICK_ACTIONS = [ QA_EDIT, QuickAction( - url="find-qa-duplicate", icon_class="fa fa-clone", - text=_("Duplicate"), target="one", - rights=['change_find', 'change_own_find']), + url="find-qa-duplicate", + icon_class="fa fa-clone", + text=_("Duplicate"), + target="one", + rights=["change_find", "change_own_find"], + ), QuickAction( - url="find-qa-basket", icon_class="fa fa-shopping-basket", - text=_("Basket"), target="many", - rights=['change_find', 'change_own_find']), + url="find-qa-basket", + icon_class="fa fa-shopping-basket", + text=_("Basket"), + target="many", + rights=["change_find", "change_own_find"], + ), QuickAction( - url="find-qa-packaging", icon_class="fa fa-gift", - text=_("Packaging"), target="many", - rights=['change_find', 'change_own_find'], - module='warehouse' + url="find-qa-packaging", + icon_class="fa fa-gift", + text=_("Packaging"), + target="many", + rights=["change_find", "change_own_find"], + module="warehouse", ), - QA_LOCK + QA_LOCK, ] UP_MODEL_QUERY = { - "operation": (pgettext_lazy("key for text search", "operation"), - 'cached_label'), + "operation": ( + pgettext_lazy("key for text search", "operation"), + "cached_label", + ), "contextrecord": ( pgettext_lazy("key for text search", "context-record"), - 'cached_label'), - "warehouse": ( - pgettext_lazy("key for text search", "location"), - 'name'), + "cached_label", + ), + "warehouse": (pgettext_lazy("key for text search", "location"), "name"), "site": ( pgettext_lazy("key for text search", "context-record-site"), - 'cached_label'), + "cached_label", + ), } RELATIVE_SESSION_NAMES = [ - ('contextrecord', 'base_finds__context_record__pk'), - ('operation', 'base_finds__context_record__operation__pk'), - ('file', 'base_finds__context_record__operation__associated_file__pk'), - ('warehouse', 'container__location__pk'), - ('site', 'base_finds__context_record__archaeological_site__pk') + ("contextrecord", "base_finds__context_record__pk"), + ("operation", "base_finds__context_record__operation__pk"), + ("file", "base_finds__context_record__operation__associated_file__pk"), + ("warehouse", "container__location__pk"), + ("site", "base_finds__context_record__archaeological_site__pk"), ] HISTORICAL_M2M = [ - 'material_types', 'datings', 'object_types', 'integrities', - 'remarkabilities', 'communicabilities', 'preservation_to_considers', - 'alterations', 'alteration_causes', "cultural_attributions" + "material_types", + "datings", + "object_types", + "integrities", + "remarkabilities", + "communicabilities", + "preservation_to_considers", + "alterations", + "alteration_causes", + "cultural_attributions", ] GET_VALUES_EXTRA_TYPES = ValueGetter.GET_VALUES_EXCLUDE_FIELDS + [ - 'material_types', 'object_types', 'integrities', - 'remarkabilities', 'communicabilities', 'preservation_to_considers', - 'alterations', 'alteration_causes' + "material_types", + "object_types", + "integrities", + "remarkabilities", + "communicabilities", + "preservation_to_considers", + "alterations", + "alteration_causes", + ] + CACHED_LABELS = [ + "cached_label", + "cached_periods", + "cached_object_types", + "cached_materials", ] - CACHED_LABELS = ['cached_label', 'cached_periods', - 'cached_object_types', 'cached_materials'] objects = UUIDModelManager() # fields uuid = models.UUIDField(default=uuid.uuid4) - base_finds = models.ManyToManyField(BaseFind, verbose_name=_("Base find"), - related_name='find') + base_finds = models.ManyToManyField( + BaseFind, verbose_name=_("Base find"), related_name="find" + ) external_id = models.TextField(_("External ID"), blank=True, default="") auto_external_id = models.BooleanField( - _("External ID is set automatically"), default=False) + _("External ID is set automatically"), default=False + ) # judiciary operation seal_number = models.TextField(_("Seal number"), blank=True, default="") order = models.IntegerField(_("Order"), default=1) label = models.TextField(_("Free ID")) - denomination = models.TextField( - _("Denomination"), blank=True, default="") - museum_id = models.TextField( - _("Museum ID"), blank=True, default="") - laboratory_id = models.TextField( - _("Laboratory ID"), blank=True, default="") - description = models.TextField( - _("Description"), blank=True, default="") - decoration = models.TextField( - _("Decoration"), blank=True, default="") - inscription = models.TextField( - _("Inscription"), blank=True, default="") + denomination = models.TextField(_("Denomination"), blank=True, default="") + museum_id = models.TextField(_("Museum ID"), blank=True, default="") + laboratory_id = models.TextField(_("Laboratory ID"), blank=True, default="") + description = models.TextField(_("Description"), blank=True, default="") + decoration = models.TextField(_("Decoration"), blank=True, default="") + inscription = models.TextField(_("Inscription"), blank=True, default="") manufacturing_place = models.TextField( - _("Manufacturing place"), blank=True, default="") + _("Manufacturing place"), blank=True, default="" + ) material_types = models.ManyToManyField( - MaterialType, verbose_name=_("Material types"), related_name='finds', - blank=True + MaterialType, verbose_name=_("Material types"), related_name="finds", blank=True ) material_type_quality = models.ForeignKey( MaterialTypeQualityType, - verbose_name=_("Material type quality"), related_name='finds', + verbose_name=_("Material type quality"), + related_name="finds", on_delete=models.SET_NULL, - blank=True, null=True + blank=True, + null=True, ) material_comment = models.TextField( - _("Comment on the material"), blank=True, default="") + _("Comment on the material"), blank=True, default="" + ) volume = models.FloatField(_("Volume (l)"), blank=True, null=True) weight = models.FloatField(_("Weight"), blank=True, null=True) - weight_unit = models.CharField(_("Weight unit"), max_length=4, - blank=True, null=True, choices=WEIGHT_UNIT) + weight_unit = models.CharField( + _("Weight unit"), max_length=4, blank=True, null=True, choices=WEIGHT_UNIT + ) find_number = models.IntegerField(_("Find number"), blank=True, null=True) upstream_treatment = models.ForeignKey( - "Treatment", blank=True, null=True, - related_name='downstream', on_delete=models.SET_NULL, - verbose_name=_("Upstream treatment")) + "Treatment", + blank=True, + null=True, + related_name="downstream", + on_delete=models.SET_NULL, + verbose_name=_("Upstream treatment"), + ) downstream_treatment = models.ForeignKey( - "Treatment", blank=True, null=True, related_name='upstream', - verbose_name=_("Downstream treatment"), on_delete=models.SET_NULL) - datings = models.ManyToManyField(Dating, verbose_name=_("Dating"), - related_name='find') + "Treatment", + blank=True, + null=True, + related_name="upstream", + verbose_name=_("Downstream treatment"), + on_delete=models.SET_NULL, + ) + datings = models.ManyToManyField( + Dating, verbose_name=_("Dating"), related_name="find" + ) cultural_attributions = models.ManyToManyField( - CulturalAttributionType, verbose_name=_("Cultural attribution"), - blank=True) + CulturalAttributionType, verbose_name=_("Cultural attribution"), blank=True + ) container = models.ForeignKey( - "archaeological_warehouse.Container", verbose_name=_("Container"), - blank=True, null=True, related_name='finds', on_delete=models.SET_NULL) + "archaeological_warehouse.Container", + verbose_name=_("Container"), + blank=True, + null=True, + related_name="finds", + on_delete=models.SET_NULL, + ) container_ref = models.ForeignKey( "archaeological_warehouse.Container", verbose_name=_("Reference container"), - blank=True, null=True, - related_name='finds_ref', on_delete=models.SET_NULL) - is_complete = models.NullBooleanField(_("Is complete?"), blank=True, - null=True) + blank=True, + null=True, + related_name="finds_ref", + on_delete=models.SET_NULL, + ) + is_complete = models.NullBooleanField(_("Is complete?"), blank=True, null=True) object_types = models.ManyToManyField( - ObjectType, verbose_name=_("Object types"), related_name='find', - blank=True + ObjectType, verbose_name=_("Object types"), related_name="find", blank=True ) object_type_quality = models.ForeignKey( ObjectTypeQualityType, - verbose_name=_("Object type quality"), related_name='finds', - on_delete=models.SET_NULL, blank=True, null=True + verbose_name=_("Object type quality"), + related_name="finds", + on_delete=models.SET_NULL, + blank=True, + null=True, ) integrities = models.ManyToManyField( - IntegrityType, verbose_name=_("Integrity / interest"), - related_name='find', blank=True) + IntegrityType, + verbose_name=_("Integrity / interest"), + related_name="find", + blank=True, + ) remarkabilities = models.ManyToManyField( - RemarkabilityType, verbose_name=_("Remarkability"), - related_name='find', blank=True) + RemarkabilityType, + verbose_name=_("Remarkability"), + related_name="find", + blank=True, + ) communicabilities = models.ManyToManyField( - CommunicabilityType, verbose_name=_("Communicability"), - related_name='find', blank=True) + CommunicabilityType, + verbose_name=_("Communicability"), + related_name="find", + blank=True, + ) min_number_of_individuals = models.IntegerField( - _("Minimum number of individuals (MNI)"), blank=True, null=True) + _("Minimum number of individuals (MNI)"), blank=True, null=True + ) length = models.FloatField(_("Length (cm)"), blank=True, null=True) width = models.FloatField(_("Width (cm)"), blank=True, null=True) height = models.FloatField(_("Height (cm)"), blank=True, null=True) diameter = models.FloatField(_("Diameter (cm)"), blank=True, null=True) - circumference = models.FloatField(_("Circumference (cm)"), blank=True, - null=True) + circumference = models.FloatField(_("Circumference (cm)"), blank=True, null=True) thickness = models.FloatField(_("Thickness (cm)"), blank=True, null=True) clutter_long_side = models.FloatField( - _("Clutter - long side (cm)"), blank=True, null=True) + _("Clutter - long side (cm)"), blank=True, null=True + ) clutter_short_side = models.FloatField( - _("Clutter - short side (cm)"), blank=True, null=True) + _("Clutter - short side (cm)"), blank=True, null=True + ) clutter_height = models.FloatField( - _("Clutter - height (cm)"), blank=True, null=True) + _("Clutter - height (cm)"), blank=True, null=True + ) dimensions_comment = models.TextField( - _("Dimensions comment"), blank=True, default="") + _("Dimensions comment"), blank=True, default="" + ) mark = models.TextField(_("Mark"), blank=True, default="") comment = models.TextField(_("Comment"), blank=True, default="") - dating_comment = models.TextField(_("Comment on dating"), blank=True, - default="") + dating_comment = models.TextField(_("Comment on dating"), blank=True, default="") previous_id = models.TextField(_("Previous ID"), blank=True, default="") index = models.IntegerField("Index", default=0) - checked_type = models.ForeignKey(CheckedType, verbose_name=_("Check"), - on_delete=models.SET_NULL, - blank=True, null=True) - check_date = models.DateField(_("Check date"), - default=datetime.date.today) - estimated_value = models.FloatField(_("Estimated value"), blank=True, - null=True) + checked_type = models.ForeignKey( + CheckedType, + verbose_name=_("Check"), + on_delete=models.SET_NULL, + blank=True, + null=True, + ) + check_date = models.DateField(_("Check date"), default=datetime.date.today) + estimated_value = models.FloatField(_("Estimated value"), blank=True, null=True) collection = models.ForeignKey( - "archaeological_warehouse.Warehouse", verbose_name=_("Collection"), - blank=True, null=True, related_name='finds', on_delete=models.SET_NULL, + "archaeological_warehouse.Warehouse", + verbose_name=_("Collection"), + blank=True, + null=True, + related_name="finds", + on_delete=models.SET_NULL, help_text=_("Do not use - need evolutions"), ) # preservation module conservatory_state = models.ForeignKey( - ConservatoryState, verbose_name=_("Conservatory state"), blank=True, - null=True, on_delete=models.SET_NULL) - conservatory_comment = models.TextField(_("Conservatory comment"), - blank=True, default="") + ConservatoryState, + verbose_name=_("Conservatory state"), + blank=True, + null=True, + on_delete=models.SET_NULL, + ) + conservatory_comment = models.TextField( + _("Conservatory comment"), blank=True, default="" + ) preservation_to_considers = models.ManyToManyField( TreatmentType, verbose_name=_("Recommended treatments"), - related_name='finds_recommended', blank=True) + related_name="finds_recommended", + blank=True, + ) alterations = models.ManyToManyField( - AlterationType, verbose_name=_("Alteration"), blank=True, - related_name='finds' + AlterationType, verbose_name=_("Alteration"), blank=True, related_name="finds" ) alteration_causes = models.ManyToManyField( - AlterationCauseType, verbose_name=_("Alteration cause"), blank=True, - related_name='finds' + AlterationCauseType, + verbose_name=_("Alteration cause"), + blank=True, + related_name="finds", ) treatment_emergency = models.ForeignKey( - TreatmentEmergencyType, verbose_name=_("Treatment emergency"), + TreatmentEmergencyType, + verbose_name=_("Treatment emergency"), on_delete=models.SET_NULL, - blank=True, null=True + blank=True, + null=True, ) - insurance_value = models.FloatField(_("Insurance value"), blank=True, - null=True) - appraisal_date = models.DateField(_("Appraisal date"), blank=True, - null=True) + insurance_value = models.FloatField(_("Insurance value"), blank=True, null=True) + appraisal_date = models.DateField(_("Appraisal date"), blank=True, null=True) public_description = models.TextField( - _("Public description"), blank=True, default="") + _("Public description"), blank=True, default="" + ) documents = models.ManyToManyField( - Document, related_name='finds', verbose_name=_("Documents"), - blank=True) + Document, related_name="finds", verbose_name=_("Documents"), blank=True + ) main_image = models.ForeignKey( - Document, related_name='main_image_finds', + Document, + related_name="main_image_finds", on_delete=models.SET_NULL, - verbose_name=_("Main image"), blank=True, null=True) + verbose_name=_("Main image"), + blank=True, + null=True, + ) treatments = models.ManyToManyField( - "Treatment", verbose_name=_("Treatments"), - related_name='finds', blank=True, - help_text=_("Related treatments when no new find is created")) + "Treatment", + verbose_name=_("Treatments"), + related_name="finds", + blank=True, + help_text=_("Related treatments when no new find is created"), + ) cached_label = models.TextField( - _("Cached name"), blank=True, default="", db_index=True, - help_text=_("Generated automatically - do not edit") + _("Cached name"), + blank=True, + default="", + db_index=True, + help_text=_("Generated automatically - do not edit"), ) cached_periods = models.TextField( - _("Cached periods label"), blank=True, default="", - help_text=_("Generated automatically - do not edit") + _("Cached periods label"), + blank=True, + default="", + help_text=_("Generated automatically - do not edit"), ) cached_object_types = models.TextField( - _("Cached object types label"), blank=True, default="", - help_text=_("Generated automatically - do not edit") + _("Cached object types label"), + blank=True, + default="", + help_text=_("Generated automatically - do not edit"), ) cached_materials = models.TextField( - _("Cached material types label"), blank=True, default="", - help_text=_("Generated automatically - do not edit") + _("Cached material types label"), + blank=True, + default="", + help_text=_("Generated automatically - do not edit"), ) history = HistoricalRecords(bases=[HistoryModel]) BASKET_MODEL = FindBasket @@ -1731,13 +1942,13 @@ class Find(BulkUpdatedItem, ValueGetter, DocumentItem, BaseHistorizedItem, ("change_own_find", "Can change own Find"), ("delete_own_find", "Can delete own Find"), ) - ordering = ('cached_label',) + ordering = ("cached_label",) indexes = [ - GinIndex(fields=['data']), + GinIndex(fields=["data"]), ] def natural_key(self): - return (self.uuid, ) + return (self.uuid,) @property def short_class_name(self): @@ -1757,10 +1968,14 @@ class Find(BulkUpdatedItem, ValueGetter, DocumentItem, BaseHistorizedItem, @property def excavation_ids(self): return " - ".join( - [base_find['excavation_id'] - for base_find in self.base_finds.values( - 'excavation_id').order_by('pk').all() - if base_find['excavation_id']]) + [ + base_find["excavation_id"] + for base_find in self.base_finds.values("excavation_id") + .order_by("pk") + .all() + if base_find["excavation_id"] + ] + ) @classmethod def hierarchic_fields(cls): @@ -1768,8 +1983,7 @@ class Find(BulkUpdatedItem, ValueGetter, DocumentItem, BaseHistorizedItem, @property def materials(self): - return " ; ".join([str(material) - for material in self.material_types.all()]) + return " ; ".join([str(material) for material in self.material_types.all()]) def get_first_material_type(self): model = self.__class__.material_types.through @@ -1782,35 +1996,38 @@ class Find(BulkUpdatedItem, ValueGetter, DocumentItem, BaseHistorizedItem, @property def show_url(self): - return reverse('show-find', args=[self.pk, '']) + return reverse("show-find", args=[self.pk, ""]) def public_representation(self): dct = super(Find, self).public_representation() - dct.update({ - "denomination": self.denomination, - "free-id": self.label, - "description": self.description, - "public-description": self.public_description, - "materials": [str(mt) for mt in self.material_types.all()], - "material-comment": self.material_comment, - "object-types": [str(ot) for ot in self.object_types.all()], - "find-number": self.find_number, - "decoration": self.decoration, - "inscription": self.inscription, - "manufacturing-place":self.manufacturing_place, - "comment": self.comment, - "length": self.length, - "width": self.width, - "height": self.height, - "thickness": self.thickness, - "diameter": self.diameter, - "circumference": self.circumference, - "volume": self.volume, - "weight": self.weight, - "datings": [str(dating) for dating in self.datings.all()], - "base-finds": [bf.public_representation() - for bf in self.base_finds.all()] - }) + dct.update( + { + "denomination": self.denomination, + "free-id": self.label, + "description": self.description, + "public-description": self.public_description, + "materials": [str(mt) for mt in self.material_types.all()], + "material-comment": self.material_comment, + "object-types": [str(ot) for ot in self.object_types.all()], + "find-number": self.find_number, + "decoration": self.decoration, + "inscription": self.inscription, + "manufacturing-place": self.manufacturing_place, + "comment": self.comment, + "length": self.length, + "width": self.width, + "height": self.height, + "thickness": self.thickness, + "diameter": self.diameter, + "circumference": self.circumference, + "volume": self.volume, + "weight": self.weight, + "datings": [str(dating) for dating in self.datings.all()], + "base-finds": [ + bf.public_representation() for bf in self.base_finds.all() + ], + } + ) # images return dct @@ -1828,20 +2045,21 @@ class Find(BulkUpdatedItem, ValueGetter, DocumentItem, BaseHistorizedItem, @property def full_label(self): lbl = " - ".join( - getattr(self, attr) for attr in ( - 'label', 'denomination', 'administrative_index') - if getattr(self, attr)) + getattr(self, attr) + for attr in ("label", "denomination", "administrative_index") + if getattr(self, attr) + ) base = " - ".join( base_find.complete_id() for base_find in self.base_finds.all() ) if base: - lbl += ' ({})'.format(base) + lbl += " ({})".format(base) return lbl def get_first_base_find(self): if not self.base_finds.count(): return - return self.base_finds.order_by('-pk').all()[0] + return self.base_finds.order_by("-pk").all()[0] DOC_VALUES = [ ("base_finds", _("List of associated base finds")), @@ -1854,8 +2072,9 @@ class Find(BulkUpdatedItem, ValueGetter, DocumentItem, BaseHistorizedItem, Return pipe separated material type code inside a container """ materials = set() - for material in self.material_types.exclude( - code__isnull=True).values_list("code", flat=True): + for material in self.material_types.exclude(code__isnull=True).values_list( + "code", flat=True + ): materials.add(material) return "|".join(sorted(materials)) @@ -1864,22 +2083,23 @@ class Find(BulkUpdatedItem, ValueGetter, DocumentItem, BaseHistorizedItem, Return comma separated string of material types inside a container """ materials = set() - for material in self.material_types.exclude( - label__isnull=True).values_list("label", flat=True): + for material in self.material_types.exclude(label__isnull=True).values_list( + "label", flat=True + ): materials.add(material) return ", ".join(sorted(materials)) - def get_values(self, prefix='', no_values=False, filtr=None, **kwargs): + def get_values(self, prefix="", no_values=False, filtr=None, **kwargs): no_base_finds = False if "no_base_finds" in kwargs: no_base_finds = kwargs["no_base_finds"] values = super(Find, self).get_values( - prefix=prefix, no_values=no_values, filtr=filtr, **kwargs) - if not filtr or prefix + 'material_types_label' in filtr: - values[prefix + 'material_types_label'] = self.get_material_types() - if not filtr or prefix + 'material_types_code' in filtr: - values[prefix + 'material_types_code'] = \ - self.get_material_types_code() + prefix=prefix, no_values=no_values, filtr=filtr, **kwargs + ) + if not filtr or prefix + "material_types_label" in filtr: + values[prefix + "material_types_label"] = self.get_material_types() + if not filtr or prefix + "material_types_code" in filtr: + values[prefix + "material_types_code"] = self.get_material_types_code() if no_base_finds: return values # by default attach first basefind data @@ -1887,21 +2107,18 @@ class Find(BulkUpdatedItem, ValueGetter, DocumentItem, BaseHistorizedItem, bf = self.get_first_base_find() if not bf: return values - v = bf.get_values( - prefix=prefix, - no_values=True, filtr=filtr, **kwargs) + v = bf.get_values(prefix=prefix, no_values=True, filtr=filtr, **kwargs) v.update(values) values = v kwargs["no_find"] = True values[prefix + "base_finds"] = [ base_find.get_values(no_values=True, filtr=filtr, **kwargs) - for base_find in self.base_finds.distinct().order_by('-pk').all() + for base_find in self.base_finds.distinct().order_by("-pk").all() ] return values - def get_values_for_datings(self, prefix=''): - return [dating.get_values(prefix=prefix) - for dating in self.datings.all()] + def get_values_for_datings(self, prefix=""): + return [dating.get_values(prefix=prefix) for dating in self.datings.all()] @property def reference(self): @@ -1921,24 +2138,52 @@ class Find(BulkUpdatedItem, ValueGetter, DocumentItem, BaseHistorizedItem, actions = super(Find, self).get_extra_actions(request) is_locked = hasattr(self, "is_locked") and self.is_locked(request.user) - can_edit_find = self.can_do(request, 'change_find') + can_edit_find = self.can_do(request, "change_find") if can_edit_find and not is_locked: actions += [ - (reverse("find-qa-duplicate", args=[self.pk]), - _("Duplicate"), "fa fa-clone", "", "", True), - (reverse("find-qa-basket", args=[self.pk]), - _("Add to basket"), - "fa fa-shopping-basket", "", "", True), - (reverse('find-add-treatment', args=[self.pk]), - _("Simple treatment"), "fa fa-flask", "", "", False), - (reverse('find-add-divide-treatment', args=[self.pk]), - _("Divide treatment"), "fa fa-scissors", "", "", False), + ( + reverse("find-qa-duplicate", args=[self.pk]), + _("Duplicate"), + "fa fa-clone", + "", + "", + True, + ), + ( + reverse("find-qa-basket", args=[self.pk]), + _("Add to basket"), + "fa fa-shopping-basket", + "", + "", + True, + ), + ( + reverse("find-add-treatment", args=[self.pk]), + _("Simple treatment"), + "fa fa-flask", + "", + "", + False, + ), + ( + reverse("find-add-divide-treatment", args=[self.pk]), + _("Divide treatment"), + "fa fa-scissors", + "", + "", + False, + ), ] if get_current_profile().warehouse: actions.append( - (reverse("find-qa-packaging", args=[self.pk]), - _("Packaging"), - "fa fa-gift", "", "", True) + ( + reverse("find-qa-packaging", args=[self.pk]), + _("Packaging"), + "fa fa-gift", + "", + "", + True, + ) ) return actions @@ -1949,22 +2194,20 @@ class Find(BulkUpdatedItem, ValueGetter, DocumentItem, BaseHistorizedItem, if not bf: return "detached/{}".format(self.SLUG) ope = bf.context_record.operation - find_idx = '{:0' + str(settings.ISHTAR_FINDS_INDEX_ZERO_LEN) + 'd}' + find_idx = "{:0" + str(settings.ISHTAR_FINDS_INDEX_ZERO_LEN) + "d}" return ("{}/{}/" + find_idx).format( - ope._get_base_image_path(), self.SLUG, self.index) + ope._get_base_image_path(), self.SLUG, self.index + ) @property def administrative_index(self): profile = get_current_profile() - if profile.has_overload('find_administrative_index'): - return ALTERNATE_CONFIGS[profile.config].find_administrative_index( - self) + if profile.has_overload("find_administrative_index"): + return ALTERNATE_CONFIGS[profile.config].find_administrative_index(self) bf = self.get_first_base_find() if not bf or not bf.context_record or not bf.context_record.operation: return "" - return "{}-{}".format( - bf.context_record.operation.get_reference(), - self.index) + return "{}-{}".format(bf.context_record.operation.get_reference(), self.index) @property def operation(self): @@ -1977,52 +2220,52 @@ class Find(BulkUpdatedItem, ValueGetter, DocumentItem, BaseHistorizedItem, return " - ".join( [bf.context_record.cached_label for bf in self.base_finds.all()] ) + context_records_lbl.short_description = _("Context record") - context_records_lbl.admin_order_field = \ - "base_finds__context_record__cached_label" + context_records_lbl.admin_order_field = "base_finds__context_record__cached_label" def operations_lbl(self): return " - ".join( - [bf.context_record.operation.cached_label - for bf in self.base_finds.all()] + [bf.context_record.operation.cached_label for bf in self.base_finds.all()] ) + operations_lbl.short_description = _("Operation") - operations_lbl.admin_order_field = \ + operations_lbl.admin_order_field = ( "base_finds__context_record__operation__cached_label" + ) - def _get_treatments(self, model, rel='upstream', limit=None, count=False): + def _get_treatments(self, model, rel="upstream", limit=None, count=False): treatments, findtreats = [], [] - q = model.objects.filter( - find_id=self.pk).order_by( - '-treatment__year', '-treatment__index', '-treatment__start_date', - '-treatment__end_date') + q = model.objects.filter(find_id=self.pk).order_by( + "-treatment__year", + "-treatment__index", + "-treatment__start_date", + "-treatment__end_date", + ) if count: return q.count() for findtreat in q.distinct().all(): if findtreat.pk in findtreats: continue findtreats.append(findtreat.pk) - q = getattr(findtreat.treatment, rel).distinct().order_by( - 'label') + q = getattr(findtreat.treatment, rel).distinct().order_by("label") if limit: q = q[:limit] treatments.append((q.all(), findtreat.treatment)) return treatments def upstream_treatments(self, limit=None): - from archaeological_finds.models_treatments import \ - FindUpstreamTreatments - return self._get_treatments(FindUpstreamTreatments, 'upstream', - limit=limit) + from archaeological_finds.models_treatments import FindUpstreamTreatments + + return self._get_treatments(FindUpstreamTreatments, "upstream", limit=limit) def limited_upstream_treatments(self): return self.upstream_treatments(15) def downstream_treatments(self, limit=None): - from archaeological_finds.models_treatments import \ - FindDownstreamTreatments - return self._get_treatments(FindDownstreamTreatments, 'downstream', - limit=limit) + from archaeological_finds.models_treatments import FindDownstreamTreatments + + return self._get_treatments(FindDownstreamTreatments, "downstream", limit=limit) def limited_downstream_treatments(self): return self.downstream_treatments(15) @@ -2031,26 +2274,24 @@ class Find(BulkUpdatedItem, ValueGetter, DocumentItem, BaseHistorizedItem, return self.upstream_treatments() + self.downstream_treatments() def non_modif_treatments(self, limit=None): - from archaeological_finds.models_treatments import \ - FindNonModifTreatments - return self._get_treatments(FindNonModifTreatments, 'finds', - limit=limit) + from archaeological_finds.models_treatments import FindNonModifTreatments + + return self._get_treatments(FindNonModifTreatments, "finds", limit=limit) def non_modif_treatments_count(self): - from archaeological_finds.models_treatments import \ - FindNonModifTreatments - return self._get_treatments(FindNonModifTreatments, 'finds', - count=True) + from archaeological_finds.models_treatments import FindNonModifTreatments + + return self._get_treatments(FindNonModifTreatments, "finds", count=True) def limited_non_modif_treatments(self): return self.non_modif_treatments(15) def associated_treatment_files(self): - from archaeological_finds.models_treatments import \ - TreatmentFile + from archaeological_finds.models_treatments import TreatmentFile + return TreatmentFile.objects.filter( - associated_basket__items__pk=self.pk).order_by( - 'reception_date', 'creation_date', 'end_date') + associated_basket__items__pk=self.pk + ).order_by("reception_date", "creation_date", "end_date") def associated_treatment_files_count(self): return self.associated_treatment_files().count() @@ -2074,13 +2315,13 @@ class Find(BulkUpdatedItem, ValueGetter, DocumentItem, BaseHistorizedItem, return bf.context_record.operation.get_town_label() @classmethod - def get_periods(cls, slice='year', fltr=None): + def get_periods(cls, slice="year", fltr=None): if not fltr: fltr = {} q = cls.objects if fltr: q = q.filter(**fltr) - if slice == 'year': + if slice == "year": years = set() finds = q.filter(downstream_treatment__isnull=True) for find in finds: @@ -2102,7 +2343,8 @@ class Find(BulkUpdatedItem, ValueGetter, DocumentItem, BaseHistorizedItem, q = q.filter(**fltr) return q.filter( downstream_treatment__isnull=True, - base_finds__context_record__operation__start_date__year=year) + base_finds__context_record__operation__start_date__year=year, + ) @classmethod def get_operations(cls): @@ -2121,7 +2363,8 @@ class Find(BulkUpdatedItem, ValueGetter, DocumentItem, BaseHistorizedItem, def get_by_operation(cls, operation_id): return cls.objects.filter( downstream_treatment__isnull=True, - base_finds__context_record__operation__pk=operation_id) + base_finds__context_record__operation__pk=operation_id, + ) @classmethod def get_total_number(cls, fltr=None): @@ -2130,8 +2373,9 @@ class Find(BulkUpdatedItem, ValueGetter, DocumentItem, BaseHistorizedItem, q = q.filter(**fltr) return q.filter(downstream_treatment__isnull=True).count() - def duplicate(self, user, copy_datings=True, duplicate_for_treatment=True, - data=None): + def duplicate( + self, user, copy_datings=True, duplicate_for_treatment=True, data=None + ): model = self.__class__ new = model.objects.get(pk=self.pk) @@ -2150,16 +2394,20 @@ class Find(BulkUpdatedItem, ValueGetter, DocumentItem, BaseHistorizedItem, setattr(new, k, data[k]) # remove associated treatments if not duplicate_for_treatment and ( - new.upstream_treatment or new.downstream_treatment): + new.upstream_treatment or new.downstream_treatment + ): new.upstream_treatment, new.downstream_treatment = None, None new.uuid = uuid.uuid4() new.save() # m2m fields - m2m = [field.name for field in model._meta.many_to_many - if field.name not in PRIVATE_FIELDS] + m2m = [ + field.name + for field in model._meta.many_to_many + if field.name not in PRIVATE_FIELDS + ] for field in m2m: - if field == 'datings' and copy_datings: + if field == "datings" and copy_datings: for dating in self.datings.all(): is_present = False for current_dating in new.datings.all(): @@ -2179,8 +2427,11 @@ class Find(BulkUpdatedItem, ValueGetter, DocumentItem, BaseHistorizedItem, bf = self.get_first_base_find() new.base_finds.clear() if bf: - new.base_finds.add(bf.duplicate( - user=user, data={"label": new.label, "external_id": ''})) + new.base_finds.add( + bf.duplicate( + user=user, data={"label": new.label, "external_id": ""} + ) + ) # remove documents for this kind of duplicate (data entry) new.documents.clear() # remove associated treatments @@ -2189,45 +2440,53 @@ class Find(BulkUpdatedItem, ValueGetter, DocumentItem, BaseHistorizedItem, @classmethod def get_query_owns(cls, ishtaruser): - q = cls._construct_query_own( - 'container__location__', - Warehouse._get_query_owns_dicts(ishtaruser) - ) | cls._construct_query_own( - 'container__responsible__', - Warehouse._get_query_owns_dicts(ishtaruser) - ) | cls._construct_query_own( - 'base_finds__context_record__operation__', - Operation._get_query_owns_dicts(ishtaruser) - ) | cls._construct_query_own( - 'basket__', - [{"shared_with": ishtaruser, "shared_write_with": ishtaruser}] - ) | cls._construct_query_own('', [ - {'history_creator': ishtaruser.user_ptr}, - {'base_finds__context_record__operation__end_date__isnull': True} - ]) + q = ( + cls._construct_query_own( + "container__location__", Warehouse._get_query_owns_dicts(ishtaruser) + ) + | cls._construct_query_own( + "container__responsible__", Warehouse._get_query_owns_dicts(ishtaruser) + ) + | cls._construct_query_own( + "base_finds__context_record__operation__", + Operation._get_query_owns_dicts(ishtaruser), + ) + | cls._construct_query_own( + "basket__", + [{"shared_with": ishtaruser, "shared_write_with": ishtaruser}], + ) + | cls._construct_query_own( + "", + [ + {"history_creator": ishtaruser.user_ptr}, + {"base_finds__context_record__operation__end_date__isnull": True}, + ], + ) + ) return q @classmethod - def get_owns(cls, user, menu_filtr=None, limit=None, - values=None, get_short_menu_class=None): + def get_owns( + cls, user, menu_filtr=None, limit=None, values=None, get_short_menu_class=None + ): replace_query = None - if menu_filtr and 'contextrecord' in menu_filtr: - replace_query = Q( - base_finds__context_record=menu_filtr['contextrecord'] - ) + if menu_filtr and "contextrecord" in menu_filtr: + replace_query = Q(base_finds__context_record=menu_filtr["contextrecord"]) owns = super(Find, cls).get_owns( - user, replace_query=replace_query, limit=limit, values=values, - get_short_menu_class=get_short_menu_class) + user, + replace_query=replace_query, + limit=limit, + values=values, + get_short_menu_class=get_short_menu_class, + ) return cls._return_get_owns(owns, values, get_short_menu_class) def _generate_cached_label(self): self.cached_label_bulk_update(find_id=self.pk) - return Find.objects.filter(pk=self.pk).values( - 'cached_label')[0]['cached_label'] + return Find.objects.filter(pk=self.pk).values("cached_label")[0]["cached_label"] def _generate_cached_periods(self): - return " & ".join([dating.period.label - for dating in self.datings.all()]) + return " & ".join([dating.period.label for dating in self.datings.all()]) def _generate_cached_object_types(self): return " & ".join([str(obj) for obj in self.object_types.all()]) @@ -2237,11 +2496,16 @@ class Find(BulkUpdatedItem, ValueGetter, DocumentItem, BaseHistorizedItem, @classmethod def cached_label_bulk_update( - cls, operation_id=None, parcel_id=None, context_record_id=None, - find_id=None, transaction_id=None): + cls, + operation_id=None, + parcel_id=None, + context_record_id=None, + find_id=None, + transaction_id=None, + ): transaction_id, is_recursion = cls.bulk_recursion( - transaction_id, [operation_id, parcel_id, context_record_id, - find_id]) + transaction_id, [operation_id, parcel_id, context_record_id, find_id] + ) if is_recursion: return @@ -2287,7 +2551,9 @@ class Find(BulkUpdatedItem, ValueGetter, DocumentItem, BaseHistorizedItem, if profile.find_use_index: index = """|| '-' || to_char(find_cached_bulk_update.index, 'fm{zeros}') - """.format(zeros=settings.ISHTAR_FINDS_INDEX_ZERO_LEN * "0") + """.format( + zeros=settings.ISHTAR_FINDS_INDEX_ZERO_LEN * "0" + ) sql = """ UPDATE "archaeological_finds_find" AS f @@ -2322,10 +2588,13 @@ class Find(BulkUpdatedItem, ValueGetter, DocumentItem, BaseHistorizedItem, SELECT myf.id FROM archaeological_finds_find myf {filters} ); - """.format(main_ope_prefix=profile.operation_prefix, - ope_prefix=profile.default_operation_prefix, - join=settings.JOINT, filters=filters, - index=index) + """.format( + main_ope_prefix=profile.operation_prefix, + ope_prefix=profile.default_operation_prefix, + join=settings.JOINT, + filters=filters, + index=index, + ) with connection.cursor() as c: c.execute(sql, args) @@ -2421,8 +2690,7 @@ class Find(BulkUpdatedItem, ValueGetter, DocumentItem, BaseHistorizedItem, def localisation_9(self): return self.get_localisation(8) - def set_localisation(self, place, context, value, is_ref=False, - static=False): + def set_localisation(self, place, context, value, is_ref=False, static=False): """ Get localisation reference in the warehouse @@ -2443,240 +2711,269 @@ class Find(BulkUpdatedItem, ValueGetter, DocumentItem, BaseHistorizedItem, return if is_ref: raise ImporterError( - _("No reference container have been set - the " - "localisation cannot be set.")) + _( + "No reference container have been set - the " + "localisation cannot be set." + ) + ) else: raise ImporterError( - _("No container have been set - the localisation cannot " - "be set.")) + _("No container have been set - the localisation cannot " "be set.") + ) localisation, error = container.set_localisation( - place, value, static=static, return_errors=True) + place, value, static=static, return_errors=True + ) if error: raise ImporterError(error) @post_importer_action def set_reference_localisation_1(self, context, value): return self.set_localisation(0, context, value, is_ref=True) + set_reference_localisation_1.post_save = True @post_importer_action def set_reference_localisation_2(self, context, value): return self.set_localisation(1, context, value, is_ref=True) + set_reference_localisation_2.post_save = True @post_importer_action def set_reference_localisation_3(self, context, value): return self.set_localisation(2, context, value, is_ref=True) + set_reference_localisation_3.post_save = True @post_importer_action def set_reference_localisation_4(self, context, value): return self.set_localisation(3, context, value, is_ref=True) + set_reference_localisation_4.post_save = True @post_importer_action def set_reference_localisation_5(self, context, value): return self.set_localisation(4, context, value, is_ref=True) + set_reference_localisation_5.post_save = True @post_importer_action def set_reference_localisation_6(self, context, value): return self.set_localisation(5, context, value, is_ref=True) + set_reference_localisation_6.post_save = True @post_importer_action def set_reference_localisation_7(self, context, value): return self.set_localisation(6, context, value, is_ref=True) + set_reference_localisation_7.post_save = True @post_importer_action def set_reference_localisation_8(self, context, value): return self.set_localisation(7, context, value, is_ref=True) + set_reference_localisation_8.post_save = True @post_importer_action def set_reference_localisation_9(self, context, value): return self.set_localisation(8, context, value, is_ref=True) + set_reference_localisation_9.post_save = True @post_importer_action def set_reference_static_localisation_1(self, context, value): - return self.set_localisation(0, context, value, is_ref=True, - static=True) + return self.set_localisation(0, context, value, is_ref=True, static=True) + set_reference_static_localisation_1.post_save = True @post_importer_action def set_reference_static_localisation_2(self, context, value): - return self.set_localisation(1, context, value, is_ref=True, - static=True) + return self.set_localisation(1, context, value, is_ref=True, static=True) + set_reference_static_localisation_2.post_save = True @post_importer_action def set_reference_static_localisation_3(self, context, value): - return self.set_localisation(2, context, value, is_ref=True, - static=True) + return self.set_localisation(2, context, value, is_ref=True, static=True) + set_reference_static_localisation_3.post_save = True @post_importer_action def set_reference_static_localisation_4(self, context, value): - return self.set_localisation(3, context, value, is_ref=True, - static=True) + return self.set_localisation(3, context, value, is_ref=True, static=True) + set_reference_static_localisation_4.post_save = True @post_importer_action def set_reference_static_localisation_5(self, context, value): - return self.set_localisation(4, context, value, is_ref=True, - static=True) + return self.set_localisation(4, context, value, is_ref=True, static=True) + set_reference_static_localisation_5.post_save = True @post_importer_action def set_reference_static_localisation_6(self, context, value): - return self.set_localisation(5, context, value, is_ref=True, - static=True) + return self.set_localisation(5, context, value, is_ref=True, static=True) + set_reference_static_localisation_6.post_save = True @post_importer_action def set_reference_static_localisation_7(self, context, value): - return self.set_localisation(6, context, value, is_ref=True, - static=True) + return self.set_localisation(6, context, value, is_ref=True, static=True) + set_reference_static_localisation_7.post_save = True @post_importer_action def set_reference_static_localisation_8(self, context, value): - return self.set_localisation(7, context, value, is_ref=True, - static=True) + return self.set_localisation(7, context, value, is_ref=True, static=True) + set_reference_static_localisation_8.post_save = True @post_importer_action def set_reference_static_localisation_9(self, context, value): - return self.set_localisation(8, context, value, is_ref=True, - static=True) + return self.set_localisation(8, context, value, is_ref=True, static=True) + set_reference_static_localisation_9.post_save = True @post_importer_action def set_localisation_1(self, context, value): return self.set_localisation(0, context, value) + set_localisation_1.post_save = True @post_importer_action def set_localisation_2(self, context, value): return self.set_localisation(1, context, value) + set_localisation_2.post_save = True @post_importer_action def set_localisation_3(self, context, value): return self.set_localisation(2, context, value) + set_localisation_3.post_save = True @post_importer_action def set_localisation_4(self, context, value): return self.set_localisation(3, context, value) + set_localisation_4.post_save = True @post_importer_action def set_localisation_5(self, context, value): return self.set_localisation(4, context, value) + set_localisation_5.post_save = True @post_importer_action def set_localisation_6(self, context, value): return self.set_localisation(5, context, value) + set_localisation_6.post_save = True @post_importer_action def set_localisation_7(self, context, value): return self.set_localisation(6, context, value) + set_localisation_7.post_save = True @post_importer_action def set_localisation_8(self, context, value): return self.set_localisation(7, context, value) + set_localisation_8.post_save = True @post_importer_action def set_localisation_9(self, context, value): return self.set_localisation(8, context, value) + set_localisation_9.post_save = True @post_importer_action def set_static_localisation_1(self, context, value): return self.set_localisation(0, context, value, static=True) + set_static_localisation_1.post_save = True @post_importer_action def set_static_localisation_2(self, context, value): return self.set_localisation(1, context, value, static=True) + set_static_localisation_2.post_save = True @post_importer_action def set_static_localisation_3(self, context, value): return self.set_localisation(2, context, value, static=True) + set_static_localisation_3.post_save = True @post_importer_action def set_static_localisation_4(self, context, value): return self.set_localisation(3, context, value, static=True) + set_static_localisation_4.post_save = True @post_importer_action def set_static_localisation_5(self, context, value): return self.set_localisation(4, context, value, static=True) + set_static_localisation_5.post_save = True @post_importer_action def set_static_localisation_6(self, context, value): return self.set_localisation(5, context, value, static=True) + set_static_localisation_6.post_save = True @post_importer_action def set_static_localisation_7(self, context, value): return self.set_localisation(6, context, value, static=True) + set_static_localisation_7.post_save = True @post_importer_action def set_static_localisation_8(self, context, value): return self.set_localisation(7, context, value, static=True) + set_static_localisation_8.post_save = True @post_importer_action def set_static_localisation_9(self, context, value): return self.set_localisation(8, context, value, static=True) + set_static_localisation_9.post_save = True 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 == 'O': - bfs = bfs.filter( - context_record__operation__pk__isnull=False).order_by( - '-context_record__operation__start_date') + if profile.find_index == "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 == 'CR': - bfs = bfs.filter( - context_record__pk__isnull=False).order_by( - 'context_record__pk') + q = Find.objects.filter(base_finds__context_record__operation=operation) + elif profile.find_index == "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) + 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 + self.index = q.aggregate(Max("index"))["index__max"] + 1 else: self.index = 1 return True @@ -2685,8 +2982,9 @@ class Find(BulkUpdatedItem, ValueGetter, DocumentItem, BaseHistorizedItem, old_container = None # fetch in db if self.pk: - old_container = self.__class__.objects.filter( - pk=self.pk).values_list("container_id", flat=True)[0] + old_container = self.__class__.objects.filter(pk=self.pk).values_list( + "container_id", flat=True + )[0] super(Find, self).save(*args, **kwargs) self.skip_history_when_saving = True @@ -2715,7 +3013,8 @@ class Find(BulkUpdatedItem, ValueGetter, DocumentItem, BaseHistorizedItem, self._cached_label_checked = False self.save() for base_find in self.base_finds.filter( - context_record__operation__pk__isnull=False).all(): + context_record__operation__pk__isnull=False + ).all(): modified = False if self.label and not base_find.label: base_find.label = self.label @@ -2752,9 +3051,9 @@ class Find(BulkUpdatedItem, ValueGetter, DocumentItem, BaseHistorizedItem, def pre_clean_find(sender, **kwargs): - if not kwargs.get('instance'): + if not kwargs.get("instance"): return - instance = kwargs.get('instance') + instance = kwargs.get("instance") for bf in instance.base_finds.all(): # no other find is associated @@ -2782,7 +3081,7 @@ pre_delete.connect(pre_clean_find, sender=Find) def base_find_find_changed(sender, **kwargs): - obj = kwargs.get('instance', None) + obj = kwargs.get("instance", None) if not obj: return obj.skip_history_when_saving = True @@ -2792,8 +3091,7 @@ def base_find_find_changed(sender, **kwargs): m2m_changed.connect(base_find_find_changed, sender=Find.base_finds.through) -m2m_changed.connect(document_attached_changed, - sender=Find.documents.through) +m2m_changed.connect(document_attached_changed, sender=Find.documents.through) class FindInsideContainer(models.Model): @@ -2818,39 +3116,39 @@ class FindInsideContainer(models.Model): DROP VIEW IF EXISTS find_inside_container; """ TABLE_COLS = ["find__" + t for t in Find.TABLE_COLS] - COL_LABELS = { - "find__" + k: Find.COL_LABELS[k] for k in Find.COL_LABELS.keys() - } + COL_LABELS = {"find__" + k: Find.COL_LABELS[k] for k in Find.COL_LABELS.keys()} EXTRA_REQUEST_KEYS = { - "find__" + k: - "find__" + Find.EXTRA_REQUEST_KEYS[k] + "find__" + k: "find__" + Find.EXTRA_REQUEST_KEYS[k] for k in Find.EXTRA_REQUEST_KEYS.keys() } SLUG = "find_inside_container" find = models.OneToOneField( - Find, verbose_name=_("Find"), related_name="inside_container", - primary_key=True) - container = models.ForeignKey("archaeological_warehouse.Container", - verbose_name=_("Container"), - related_name="container_content") + Find, verbose_name=_("Find"), related_name="inside_container", primary_key=True + ) + container = models.ForeignKey( + "archaeological_warehouse.Container", + verbose_name=_("Container"), + related_name="container_content", + ) class Meta: managed = False - db_table = 'find_inside_container' + db_table = "find_inside_container" for attr in Find.HISTORICAL_M2M: - m2m_changed.connect(m2m_historization_changed, - sender=getattr(Find, attr).through) + m2m_changed.connect(m2m_historization_changed, sender=getattr(Find, attr).through) class Property(LightHistorizedItem): find = models.ForeignKey(Find, verbose_name=_("Find")) administrative_act = models.ForeignKey( - AdministrativeAct, verbose_name=_("Administrative act")) - person = models.ForeignKey(Person, verbose_name=_("Person"), - related_name='properties') + AdministrativeAct, verbose_name=_("Administrative act") + ) + person = models.ForeignKey( + Person, verbose_name=_("Person"), related_name="properties" + ) start_date = models.DateField(_("Start date")) end_date = models.DateField(_("End date")) @@ -2858,7 +3156,7 @@ class Property(LightHistorizedItem): verbose_name = _("Property") verbose_name_plural = _("Properties") indexes = [ - GinIndex(fields=['data']), + GinIndex(fields=["data"]), ] def __str__(self): diff --git a/archaeological_finds/models_treatments.py b/archaeological_finds/models_treatments.py index 7f3aab284..be7b07ee5 100644 --- a/archaeological_finds/models_treatments.py +++ b/archaeological_finds/models_treatments.py @@ -1,4 +1,4 @@ -#!/usr/bin/env python +#!/usr/bin/env python3 # -*- coding: utf-8 -*- # Copyright (C) 2016-2017 Étienne Loks <etienne.loks_AT_peacefrogsDOTnet> @@ -24,8 +24,7 @@ from django.contrib.gis.db import models from django.contrib.postgres.indexes import GinIndex from django.core.urlresolvers import reverse from django.db.models import Max, Q -from django.db.models.signals import post_save, post_delete, pre_delete, \ - m2m_changed +from django.db.models.signals import post_save, post_delete, pre_delete, m2m_changed from django.template.defaultfilters import slugify from ishtar_common.utils import ugettext_lazy as _, pgettext_lazy @@ -34,14 +33,31 @@ from archaeological_operations.models import ClosedItem, Operation from archaeological_context_records.models import Dating from archaeological_warehouse.models import Warehouse, Container from ishtar_common.model_managers import ExternalIdManager -from ishtar_common.models import Document, GeneralType, \ - ImageModel, BaseHistorizedItem, OwnPerms, Person, \ - Organization, ValueGetter, post_save_cache, ShortMenuItem, \ - DashboardFormItem, document_attached_changed, \ - HistoryModel, SearchAltName, SearchVectorConfig, DocumentItem +from ishtar_common.models import ( + Document, + GeneralType, + ImageModel, + BaseHistorizedItem, + OwnPerms, + Person, + Organization, + ValueGetter, + post_save_cache, + ShortMenuItem, + DashboardFormItem, + document_attached_changed, + HistoryModel, + SearchAltName, + SearchVectorConfig, + DocumentItem, +) from ishtar_common.models_common import HistoricalRecords -from ishtar_common.utils import cached_label_changed, get_current_year, \ - update_data, m2m_historization_changed +from ishtar_common.utils import ( + cached_label_changed, + get_current_year, + update_data, + m2m_historization_changed, +) class TreatmentState(GeneralType): @@ -51,7 +67,10 @@ class TreatmentState(GeneralType): class Meta: verbose_name = _("Treatment state type") verbose_name_plural = _("Treatment state types") - ordering = ('order', 'label',) + ordering = ( + "order", + "label", + ) @classmethod def get_default(cls): @@ -65,27 +84,39 @@ post_save.connect(post_save_cache, sender=TreatmentState) post_delete.connect(post_save_cache, sender=TreatmentState) -class Treatment(DashboardFormItem, ValueGetter, DocumentItem, - BaseHistorizedItem, ImageModel, OwnPerms, ShortMenuItem): - SLUG = 'treatment' - SHOW_URL = 'show-treatment' - TABLE_COLS = ('year', 'index', 'treatment_types__label', - 'treatment_state__label', - 'label', 'scientific_monitoring_manager__cached_label', - 'person__cached_label', - 'start_date', 'downstream_cached_label', - 'upstream_cached_label') +class Treatment( + DashboardFormItem, + ValueGetter, + DocumentItem, + BaseHistorizedItem, + ImageModel, + OwnPerms, + ShortMenuItem, +): + SLUG = "treatment" + SHOW_URL = "show-treatment" + TABLE_COLS = ( + "year", + "index", + "treatment_types__label", + "treatment_state__label", + "label", + "scientific_monitoring_manager__cached_label", + "person__cached_label", + "start_date", + "downstream_cached_label", + "upstream_cached_label", + ) REVERSED_BOOL_FIELDS = [ - 'documents__image__isnull', - 'documents__associated_file__isnull', - 'documents__associated_url__isnull', + "documents__image__isnull", + "documents__associated_file__isnull", + "documents__associated_url__isnull", ] EXTRA_REQUEST_KEYS = { "downstream_cached_label": "downstream__cached_label", "upstream_cached_label": "upstream__cached_label", - 'person__cached_label': 'person__cached_label', - 'scientific_monitoring_manager__cached_label': - 'scientific_monitoring_manager__cached_label', + "person__cached_label": "person__cached_label", + "scientific_monitoring_manager__cached_label": "scientific_monitoring_manager__cached_label", "person__pk": "person__pk", # used by dynamic_table_documents } COL_LABELS = { @@ -95,44 +126,44 @@ class Treatment(DashboardFormItem, ValueGetter, DocumentItem, "treatment_state__label": _("State"), "person__cached_label": _("Responsible"), "scientific_monitoring_manager__cached_label": _( - "Scientific monitoring manager"), + "Scientific monitoring manager" + ), } # extra keys than can be passed to save method - EXTRA_SAVED_KEYS = ('items', 'user', 'resulting_find', 'upstream_items', - 'resulting_finds', 'upstream_item', - 'treatment_type_list') + EXTRA_SAVED_KEYS = ( + "items", + "user", + "resulting_find", + "upstream_items", + "resulting_finds", + "upstream_item", + "treatment_type_list", + ) # alternative names of fields for searches ALT_NAMES = { - 'label': SearchAltName( - pgettext_lazy("key for text search", "label"), - 'label__iexact' + "label": SearchAltName( + pgettext_lazy("key for text search", "label"), "label__iexact" ), - 'other_reference': SearchAltName( + "other_reference": SearchAltName( pgettext_lazy("key for text search", "other-reference"), - 'other_reference__iexact' - ), - 'year': SearchAltName( - pgettext_lazy("key for text search", "year"), - 'year' + "other_reference__iexact", ), - 'index': SearchAltName( - pgettext_lazy("key for text search", "index"), - 'index' - ), - 'treatment_types': SearchAltName( + "year": SearchAltName(pgettext_lazy("key for text search", "year"), "year"), + "index": SearchAltName(pgettext_lazy("key for text search", "index"), "index"), + "treatment_types": SearchAltName( pgettext_lazy("key for text search", "type"), - 'treatment_types__label__iexact' + "treatment_types__label__iexact", ), - 'scientific_monitoring_manager': SearchAltName( + "scientific_monitoring_manager": SearchAltName( pgettext_lazy("key for text search", "scientific-manager"), - 'scientific_monitoring_manager__cached_label__iexact' + "scientific_monitoring_manager__cached_label__iexact", ), } ALT_NAMES.update(BaseHistorizedItem.ALT_NAMES) ALT_NAMES.update(DocumentItem.ALT_NAMES) HISTORICAL_M2M = [ - 'treatment_types', + "treatment_types", ] BASE_SEARCH_VECTORS = [ @@ -156,77 +187,104 @@ class Treatment(DashboardFormItem, ValueGetter, DocumentItem, SearchVectorConfig("downstream__cached_label"), SearchVectorConfig("upstream__cached_label"), ] - PARENT_SEARCH_VECTORS = ['person', 'organization'] + PARENT_SEARCH_VECTORS = ["person", "organization"] objects = ExternalIdManager() - label = models.CharField(_("Label"), blank=True, null=True, - max_length=200) - other_reference = models.CharField(_("Other ref."), blank=True, null=True, - max_length=200) + label = models.CharField(_("Label"), blank=True, null=True, max_length=200) + other_reference = models.CharField( + _("Other ref."), blank=True, null=True, max_length=200 + ) year = models.IntegerField(_("Year"), default=get_current_year) index = models.IntegerField(_("Index"), default=1) file = models.ForeignKey( - 'TreatmentFile', related_name='treatments', blank=True, null=True, + "TreatmentFile", + related_name="treatments", + blank=True, + null=True, on_delete=models.SET_NULL, - verbose_name=_("Associated request")) + verbose_name=_("Associated request"), + ) treatment_types = models.ManyToManyField( - TreatmentType, verbose_name=_("Treatment type")) + TreatmentType, verbose_name=_("Treatment type") + ) treatment_state = models.ForeignKey( - TreatmentState, verbose_name=_("State"), - default=TreatmentState.get_default + TreatmentState, verbose_name=_("State"), default=TreatmentState.get_default ) - executed = models.BooleanField( - _("Treatment have been executed"), default=False) + executed = models.BooleanField(_("Treatment have been executed"), default=False) location = models.ForeignKey( - Warehouse, verbose_name=_("Location"), blank=True, null=True, + Warehouse, + verbose_name=_("Location"), + blank=True, + null=True, on_delete=models.SET_NULL, help_text=_( - "Location where the treatment is done. Target warehouse for " - "a move.")) + "Location where the treatment is done. Target warehouse for " "a move." + ), + ) person = models.ForeignKey( - Person, verbose_name=_("Responsible"), blank=True, null=True, - on_delete=models.SET_NULL, related_name='treatments') + Person, + verbose_name=_("Responsible"), + blank=True, + null=True, + on_delete=models.SET_NULL, + related_name="treatments", + ) scientific_monitoring_manager = models.ForeignKey( - Person, verbose_name=_('Scientific monitoring manager'), blank=True, - null=True, on_delete=models.SET_NULL, - related_name='manage_treatments') + Person, + verbose_name=_("Scientific monitoring manager"), + blank=True, + null=True, + on_delete=models.SET_NULL, + related_name="manage_treatments", + ) organization = models.ForeignKey( - Organization, verbose_name=_("Organization"), blank=True, null=True, - on_delete=models.SET_NULL, related_name='treatments') - external_id = models.CharField(_("External ID"), blank=True, null=True, - max_length=200) + Organization, + verbose_name=_("Organization"), + blank=True, + null=True, + on_delete=models.SET_NULL, + related_name="treatments", + ) + external_id = models.CharField( + _("External ID"), blank=True, null=True, max_length=200 + ) comment = models.TextField(_("Comment"), blank=True, default="") description = models.TextField(_("Description"), blank=True, default="") goal = models.TextField(_("Goal"), blank=True, default="") start_date = models.DateField(_("Start date"), blank=True, null=True) end_date = models.DateField(_("Closing date"), blank=True, null=True) creation_date = models.DateTimeField(default=datetime.datetime.now) - container = models.ForeignKey(Container, verbose_name=_("Container"), - on_delete=models.SET_NULL, - blank=True, null=True) - estimated_cost = models.FloatField(_("Estimated cost"), - blank=True, null=True) - quoted_cost = models.FloatField(_("Quoted cost"), - blank=True, null=True) - realized_cost = models.FloatField(_("Realized cost"), - blank=True, null=True) - insurance_cost = models.FloatField(_("Insurance cost"), - blank=True, null=True) + container = models.ForeignKey( + Container, + verbose_name=_("Container"), + on_delete=models.SET_NULL, + blank=True, + null=True, + ) + estimated_cost = models.FloatField(_("Estimated cost"), blank=True, null=True) + quoted_cost = models.FloatField(_("Quoted cost"), blank=True, null=True) + realized_cost = models.FloatField(_("Realized cost"), blank=True, null=True) + insurance_cost = models.FloatField(_("Insurance cost"), blank=True, null=True) documents = models.ManyToManyField( - Document, related_name='treatments', verbose_name=_("Documents"), - blank=True) + Document, related_name="treatments", verbose_name=_("Documents"), blank=True + ) main_image = models.ForeignKey( - Document, related_name='main_image_treatments', + Document, + related_name="main_image_treatments", on_delete=models.SET_NULL, - verbose_name=_("Main image"), blank=True, null=True) - cached_label = models.TextField(_("Cached name"), blank=True, default="", - db_index=True) + verbose_name=_("Main image"), + blank=True, + null=True, + ) + cached_label = models.TextField( + _("Cached name"), blank=True, default="", db_index=True + ) history = HistoricalRecords(bases=[HistoryModel]) class Meta: verbose_name = _("Treatment") verbose_name_plural = _("Treatments") - unique_together = ('year', 'index') + unique_together = ("year", "index") permissions = ( ("view_treatment", "Can view all Treatments"), ("view_own_treatment", "Can view own Treatment"), @@ -236,7 +294,7 @@ class Treatment(DashboardFormItem, ValueGetter, DocumentItem, ) ordering = ("-year", "-index", "-start_date") indexes = [ - GinIndex(fields=['data']), + GinIndex(fields=["data"]), ] def __str__(self): @@ -251,7 +309,7 @@ class Treatment(DashboardFormItem, ValueGetter, DocumentItem, return self.finds.all()[:15] def natural_key(self): - return (self.external_id, ) + return (self.external_id,) @property def year_index(self): @@ -259,38 +317,46 @@ class Treatment(DashboardFormItem, ValueGetter, DocumentItem, @classmethod def get_query_owns(cls, ishtaruser): - return (Q(history_creator=ishtaruser.user_ptr) | - Q(person__ishtaruser=ishtaruser)) \ - & Q(end_date__isnull=True) + return ( + Q(history_creator=ishtaruser.user_ptr) | Q(person__ishtaruser=ishtaruser) + ) & Q(end_date__isnull=True) @classmethod - def get_owns(cls, user, menu_filtr=None, limit=None, values=None, - get_short_menu_class=None): + def get_owns( + cls, user, menu_filtr=None, limit=None, values=None, get_short_menu_class=None + ): replace_query = None if menu_filtr: - if 'treatmentfile' in menu_filtr: - replace_query = Q(file=menu_filtr['treatmentfile']) - if 'find' in menu_filtr and \ - 'basket' not in str(menu_filtr['find']): - q = Q(upstream=menu_filtr['find']) | Q( - downstream=menu_filtr['find']) + if "treatmentfile" in menu_filtr: + replace_query = Q(file=menu_filtr["treatmentfile"]) + if "find" in menu_filtr and "basket" not in str(menu_filtr["find"]): + q = Q(upstream=menu_filtr["find"]) | Q(downstream=menu_filtr["find"]) replace_query = replace_query | q if replace_query else q owns = super(Treatment, cls).get_owns( - user, replace_query=replace_query, limit=limit, - values=values, get_short_menu_class=get_short_menu_class) + user, + replace_query=replace_query, + limit=limit, + values=values, + get_short_menu_class=get_short_menu_class, + ) return cls._return_get_owns(owns, values, get_short_menu_class) def get_query_operations(self): return Operation.objects.filter( - context_record__base_finds__find__downstream_treatment=self) + context_record__base_finds__find__downstream_treatment=self + ) def _generate_cached_label(self): - items = [str(getattr(self, k)) - for k in ['year', 'index', 'other_reference', 'label'] if - getattr(self, k)] - return '{} | {}'.format("-".join(items), self.treatment_types_lbl()) + items = [ + str(getattr(self, k)) + for k in ["year", "index", "other_reference", "label"] + if getattr(self, k) + ] + return "{} | {}".format("-".join(items), self.treatment_types_lbl()) - def _get_base_image_path(self,): + def _get_base_image_path( + self, + ): return "{}/{}/{}".format(self.SLUG, self.year, self.index) def treatment_types_lbl(self): @@ -299,8 +365,9 @@ class Treatment(DashboardFormItem, ValueGetter, DocumentItem, :return: string """ return " ; ".join(str(t) for t in self.treatment_types.all()) + treatment_types_lbl.short_description = _("Treatment types") - treatment_types_lbl.admin_order_field = 'treatment_types__label' + treatment_types_lbl.admin_order_field = "treatment_types__label" def downstream_lbl(self): """ @@ -308,8 +375,9 @@ class Treatment(DashboardFormItem, ValueGetter, DocumentItem, :return: string """ return " ; ".join(f.cached_label for f in self.downstream.all()) + downstream_lbl.short_description = _("Downstream finds") - downstream_lbl.admin_order_field = 'downstream__cached_label' + downstream_lbl.admin_order_field = "downstream__cached_label" def upstream_lbl(self): """ @@ -317,23 +385,30 @@ class Treatment(DashboardFormItem, ValueGetter, DocumentItem, :return: string """ return " ; ".join(f.cached_label for f in self.upstream.all()) + upstream_lbl.short_description = _("Upstream finds") - upstream_lbl.admin_order_field = 'upstream__cached_label' + upstream_lbl.admin_order_field = "upstream__cached_label" def get_extra_actions(self, request): # url, base_text, icon, extra_text, extra css class, is a quick action actions = super(Treatment, self).get_extra_actions(request) - if self.can_do(request, 'add_administrativeact'): + if self.can_do(request, "add_administrativeact"): actions += [ - (reverse('treatment-add-adminact', args=[self.pk]), - _("Add associated administrative act"), "fa fa-plus", - _("admin. act"), "", False), + ( + reverse("treatment-add-adminact", args=[self.pk]), + _("Add associated administrative act"), + "fa fa-plus", + _("admin. act"), + "", + False, + ), ] return actions - def get_values(self, prefix='', no_values=False, filtr=None, **kwargs): + def get_values(self, prefix="", no_values=False, filtr=None, **kwargs): values = super(Treatment, self).get_values( - prefix=prefix, no_values=no_values, filtr=filtr, **kwargs) + prefix=prefix, no_values=no_values, filtr=filtr, **kwargs + ) if not filtr or prefix + "upstream_finds" in filtr: values[prefix + "upstream_finds"] = " ; ".join( str(up) for up in self.upstream.all() @@ -344,18 +419,19 @@ class Treatment(DashboardFormItem, ValueGetter, DocumentItem, str(up) for up in self.downstream.all() ) - if not filtr or prefix + "operations" in filtr: values[prefix + "operations"] = " ; ".join( str(ope) for ope in self.get_query_operations().all() ) - if 'associatedfind_' not in prefix and self.upstream.count(): + if "associatedfind_" not in prefix and self.upstream.count(): find = self.upstream.all()[0] - new_prefix = prefix + 'associatedfind_' + new_prefix = prefix + "associatedfind_" values.update( - find.get_values(prefix=new_prefix, no_values=True, - filtr=filtr, **kwargs)) + find.get_values( + prefix=new_prefix, no_values=True, filtr=filtr, **kwargs + ) + ) return values def pre_save(self): @@ -366,10 +442,11 @@ class Treatment(DashboardFormItem, ValueGetter, DocumentItem, self.index = 1 q = Treatment.objects.filter(year=self.year) if q.count(): - self.index = q.all().aggregate(Max('index'))['index__max'] + 1 + self.index = q.all().aggregate(Max("index"))["index__max"] + 1 - def _create_n_1_resulting_find(self, resulting_find, upstream_items, - treatment_types): + def _create_n_1_resulting_find( + self, resulting_find, upstream_items, treatment_types + ): """ Manage creation of n<->1 treatment """ @@ -382,7 +459,7 @@ class Treatment(DashboardFormItem, ValueGetter, DocumentItem, if values: m2m[k + "s"] = values - resulting_find['history_modifier'] = self.history_modifier + resulting_find["history_modifier"] = self.history_modifier new_find = Find.objects.create(**resulting_find) for k, v in m2m.items(): @@ -393,8 +470,7 @@ class Treatment(DashboardFormItem, ValueGetter, DocumentItem, except TypeError: m2m_field.add(v) - create_new_find = bool([tp for tp in treatment_types - if tp.create_new_find]) + create_new_find = bool([tp for tp in treatment_types if tp.create_new_find]) current_base_finds = [] current_documents = [] @@ -428,8 +504,7 @@ class Treatment(DashboardFormItem, ValueGetter, DocumentItem, new_find.documents.add(document) # data - new_find.data = update_data(new_find.data, upstream_item.data, - merge=True) + new_find.data = update_data(new_find.data, upstream_item.data, merge=True) if create_new_find: upstream_item.downstream_treatment = self @@ -442,25 +517,24 @@ class Treatment(DashboardFormItem, ValueGetter, DocumentItem, new_find.skip_history_when_saving = True new_find.save() - def _create_1_n_resulting_find(self, resulting_finds, upstream_item, user, - treatment_types): + def _create_1_n_resulting_find( + self, resulting_finds, upstream_item, user, treatment_types + ): """ Manage creation of 1<->n treatment """ new_items = [] - start_number = resulting_finds['start_number'] - for idx in range(resulting_finds['number']): - label = resulting_finds['label'] + str(start_number + idx) - new_find = Find.objects.get( - pk=upstream_item.pk).duplicate(user) + start_number = resulting_finds["start_number"] + for idx in range(resulting_finds["number"]): + label = resulting_finds["label"] + str(start_number + idx) + new_find = Find.objects.get(pk=upstream_item.pk).duplicate(user) new_find.upstream_treatment = self new_find.label = label new_find.skip_history_when_saving = True new_find.save() new_items.append(new_find) - create_new_find = bool([tp for tp in treatment_types - if tp.create_new_find]) + create_new_find = bool([tp for tp in treatment_types if tp.create_new_find]) if create_new_find: upstream_item.downstream_treatment = self @@ -469,9 +543,10 @@ class Treatment(DashboardFormItem, ValueGetter, DocumentItem, else: self.finds.add(upstream_item) - if getattr(user, 'ishtaruser', None): + if getattr(user, "ishtaruser", None): b = FindBasket.objects.create( - label=resulting_finds['basket_name'], user=user.ishtaruser) + label=resulting_finds["basket_name"], user=user.ishtaruser + ) for item in new_items: b.items.add(item) @@ -480,23 +555,23 @@ class Treatment(DashboardFormItem, ValueGetter, DocumentItem, upstream_items, upstream_item, resulting_finds = [], None, None treatment_types, return_new = [], False if "items" in kwargs: - items = kwargs.pop('items') + items = kwargs.pop("items") if "resulting_find" in kwargs: - resulting_find = kwargs.pop('resulting_find') + resulting_find = kwargs.pop("resulting_find") if "resulting_finds" in kwargs: - resulting_finds = kwargs.pop('resulting_finds') + resulting_finds = kwargs.pop("resulting_finds") if "upstream_items" in kwargs: - upstream_items = kwargs.pop('upstream_items') + upstream_items = kwargs.pop("upstream_items") if "upstream_item" in kwargs: - upstream_item = kwargs.pop('upstream_item') + upstream_item = kwargs.pop("upstream_item") if "user" in kwargs: - user = kwargs.pop('user') + user = kwargs.pop("user") if "extra_args_for_new" in kwargs: - extra_args_for_new = kwargs.pop('extra_args_for_new') + extra_args_for_new = kwargs.pop("extra_args_for_new") if "treatment_type_list" in kwargs: - treatment_types = kwargs.pop('treatment_type_list') + treatment_types = kwargs.pop("treatment_type_list") if "return_new" in kwargs: - return_new = kwargs.pop('return_new') + return_new = kwargs.pop("return_new") self.pre_save() super(Treatment, self).save(*args, **kwargs) to_be_executed = not self.executed and self.treatment_state.executed @@ -517,8 +592,9 @@ class Treatment(DashboardFormItem, ValueGetter, DocumentItem, if not to_be_executed: # should not happen but bad validation check... return - self._create_n_1_resulting_find(resulting_find, upstream_items, - treatment_types) + self._create_n_1_resulting_find( + resulting_find, upstream_items, treatment_types + ) self.executed = True self.save() return @@ -528,14 +604,13 @@ class Treatment(DashboardFormItem, ValueGetter, DocumentItem, # should not happen but bad validation check... return self._create_1_n_resulting_find( - resulting_finds, upstream_item, self.history_modifier, - treatment_types) + resulting_finds, upstream_item, self.history_modifier, treatment_types + ) self.executed = True self.save() return - create_new_find = bool([tp for tp in treatment_types - if tp.create_new_find]) + create_new_find = bool([tp for tp in treatment_types if tp.create_new_find]) new_items = [] for item in items: @@ -553,8 +628,7 @@ class Treatment(DashboardFormItem, ValueGetter, DocumentItem, updated.append(new.pk) new_items.append(new) # update baskets - for basket in \ - FindBasket.objects.filter(items__pk=item.pk).all(): + for basket in FindBasket.objects.filter(items__pk=item.pk).all(): basket.items.remove(item) basket.items.add(new) @@ -591,13 +665,13 @@ class Treatment(DashboardFormItem, ValueGetter, DocumentItem, container_attrs = [] for tp in treatment_types: if tp.change_current_location: - if 'container' in container_attrs: + if "container" in container_attrs: continue - container_attrs.append('container') + container_attrs.append("container") if tp.change_reference_location: - if 'container_ref' in container_attrs: + if "container_ref" in container_attrs: continue - container_attrs.append('container_ref') + container_attrs.append("container_ref") if not container_attrs: # non consistent treatment @@ -621,8 +695,7 @@ class Treatment(DashboardFormItem, ValueGetter, DocumentItem, @property def associated_filename(self): return "-".join( - str(slugify(getattr(self, attr))) - for attr in ('year', 'index', 'label') + str(slugify(getattr(self, attr))) for attr in ("year", "index", "label") ) @@ -630,7 +703,7 @@ post_save.connect(cached_label_changed, sender=Treatment) def pre_delete_treatment(sender, **kwargs): - treatment = kwargs.get('instance') + treatment = kwargs.get("instance") for find in Find.objects.filter(upstream_treatment=treatment).all(): if find.downstream_treatment: # a new treatment have be done since the deleted treatment @@ -645,41 +718,43 @@ def pre_delete_treatment(sender, **kwargs): pre_delete.connect(pre_delete_treatment, sender=Treatment) -m2m_changed.connect(document_attached_changed, - sender=Treatment.documents.through) +m2m_changed.connect(document_attached_changed, sender=Treatment.documents.through) for attr in Treatment.HISTORICAL_M2M: - m2m_changed.connect(m2m_historization_changed, - sender=getattr(Treatment, attr).through) + m2m_changed.connect( + m2m_historization_changed, sender=getattr(Treatment, attr).through + ) class AbsFindTreatments(models.Model): - find = models.ForeignKey(Find, verbose_name=_("Find"), - related_name='%(class)s_related') - treatment = models.OneToOneField(Treatment, verbose_name=_("Treatment"), - primary_key=True) + find = models.ForeignKey( + Find, verbose_name=_("Find"), related_name="%(class)s_related" + ) + treatment = models.OneToOneField( + Treatment, verbose_name=_("Treatment"), primary_key=True + ) # primary_key is set to prevent django to ask for an id column # treatment is not a real primary key treatment_nb = models.IntegerField(_("Order")) - TABLE_COLS = ["treatment__" + col for col in Treatment.TABLE_COLS] + \ - ['treatment_nb'] + TABLE_COLS = ["treatment__" + col for col in Treatment.TABLE_COLS] + [ + "treatment_nb" + ] COL_LABELS = { - 'treatment__treatment_type': _("Treatment type"), - 'treatment__start_date': _("Start date"), - 'treatment__end_date': _("End date"), - 'treatment__location': _("Location"), - 'treatment__container': _("Container"), - 'treatment__person': _("Doer"), - 'treatment__upstream': _("Related finds"), - 'treatment__downstream': _("Related finds"), + "treatment__treatment_type": _("Treatment type"), + "treatment__start_date": _("Start date"), + "treatment__end_date": _("End date"), + "treatment__location": _("Location"), + "treatment__container": _("Container"), + "treatment__person": _("Doer"), + "treatment__upstream": _("Related finds"), + "treatment__downstream": _("Related finds"), } class Meta: abstract = True def __str__(self): - return "{} - {} [{}]".format( - self.find, self.treatment, self.treatment_nb) + return "{} - {} [{}]".format(self.find, self.treatment, self.treatment_nb) class FindNonModifTreatments(AbsFindTreatments): @@ -734,20 +809,25 @@ class FindNonModifTreatments(AbsFindTreatments): DROP VIEW IF EXISTS find_nonmodif_treatments; DROP VIEW IF EXISTS find_nonmodif_treatments_tree; """ - TABLE_COLS = ['treatment__treatment_type', - 'treatment__upstream', - 'treatment__start_date', 'treatment__end_date', - 'treatment__location', 'treatment__container', - 'treatment__person', 'treatment_nb'] + TABLE_COLS = [ + "treatment__treatment_type", + "treatment__upstream", + "treatment__start_date", + "treatment__end_date", + "treatment__location", + "treatment__container", + "treatment__person", + "treatment_nb", + ] # search parameters - EXTRA_REQUEST_KEYS = {'find_id': 'find_id'} + EXTRA_REQUEST_KEYS = {"find_id": "find_id"} class Meta: managed = False - db_table = 'find_nonmodif_treatments' - unique_together = ('find', 'treatment') - ordering = ('find', '-treatment_nb') + db_table = "find_nonmodif_treatments" + unique_together = ("find", "treatment") + ordering = ("find", "-treatment_nb") class FindUpstreamTreatments(AbsFindTreatments): @@ -791,20 +871,25 @@ class FindUpstreamTreatments(AbsFindTreatments): DROP VIEW IF EXISTS find_uptreatments; DROP VIEW IF EXISTS find_uptreatments_tree; """ - TABLE_COLS = ['treatment__treatment_type', - 'treatment__upstream', - 'treatment__start_date', 'treatment__end_date', - 'treatment__location', 'treatment__container', - 'treatment__person', 'treatment_nb'] + TABLE_COLS = [ + "treatment__treatment_type", + "treatment__upstream", + "treatment__start_date", + "treatment__end_date", + "treatment__location", + "treatment__container", + "treatment__person", + "treatment_nb", + ] # search parameters - EXTRA_REQUEST_KEYS = {'find_id': 'find_id'} + EXTRA_REQUEST_KEYS = {"find_id": "find_id"} class Meta: managed = False - db_table = 'find_uptreatments' - unique_together = ('find', 'treatment') - ordering = ('find', '-treatment_nb') + db_table = "find_uptreatments" + unique_together = ("find", "treatment") + ordering = ("find", "-treatment_nb") class FindDownstreamTreatments(AbsFindTreatments): @@ -848,20 +933,25 @@ class FindDownstreamTreatments(AbsFindTreatments): DROP VIEW IF EXISTS find_downtreatments; DROP VIEW IF EXISTS find_downtreatments_tree; """ - TABLE_COLS = ['treatment__treatment_type', - 'treatment__downstream', - 'treatment__start_date', 'treatment__end_date', - 'treatment__location', 'treatment__container', - 'treatment__person', 'treatment_nb'] + TABLE_COLS = [ + "treatment__treatment_type", + "treatment__downstream", + "treatment__start_date", + "treatment__end_date", + "treatment__location", + "treatment__container", + "treatment__person", + "treatment_nb", + ] # search parameters - EXTRA_REQUEST_KEYS = {'find_id': 'find_id'} + EXTRA_REQUEST_KEYS = {"find_id": "find_id"} class Meta: managed = False - db_table = 'find_downtreatments' - unique_together = ('find', 'treatment') - ordering = ('find', '-treatment_nb') + db_table = "find_downtreatments" + unique_together = ("find", "treatment") + ordering = ("find", "-treatment_nb") class FindTreatments(AbsFindTreatments): @@ -885,9 +975,9 @@ class FindTreatments(AbsFindTreatments): class Meta: managed = False - db_table = 'find_treatments' - unique_together = ('find', 'treatment') - ordering = ('find', 'upstream', '-treatment_nb') + db_table = "find_treatments" + unique_together = ("find", "treatment") + ordering = ("find", "upstream", "-treatment_nb") class TreatmentFileType(GeneralType): @@ -896,19 +986,26 @@ class TreatmentFileType(GeneralType): class Meta: verbose_name = _("Treatment request type") verbose_name_plural = _("Treatment request types") - ordering = ('label',) + ordering = ("label",) post_save.connect(post_save_cache, sender=TreatmentFileType) post_delete.connect(post_save_cache, sender=TreatmentFileType) -class TreatmentFile(DashboardFormItem, ClosedItem, DocumentItem, - BaseHistorizedItem, OwnPerms, ValueGetter, ShortMenuItem): - SLUG = 'treatmentfile' - SHOW_URL = 'show-treatmentfile' - DELETE_URL = 'delete-treatmentfile' - TABLE_COLS = ['type', 'year', 'index', 'internal_reference', 'name'] +class TreatmentFile( + DashboardFormItem, + ClosedItem, + DocumentItem, + BaseHistorizedItem, + OwnPerms, + ValueGetter, + ShortMenuItem, +): + SLUG = "treatmentfile" + SHOW_URL = "show-treatmentfile" + DELETE_URL = "delete-treatmentfile" + TABLE_COLS = ["type", "year", "index", "internal_reference", "name"] BASE_SEARCH_VECTORS = [ SearchVectorConfig("type__label"), SearchVectorConfig("internal_reference"), @@ -919,147 +1016,162 @@ class TreatmentFile(DashboardFormItem, ClosedItem, DocumentItem, SearchVectorConfig("year"), SearchVectorConfig("index"), ] - PARENT_SEARCH_VECTORS = ['in_charge', 'applicant', 'applicant_organisation'] + PARENT_SEARCH_VECTORS = ["in_charge", "applicant", "applicant_organisation"] EXTRA_REQUEST_KEYS = { "in_charge__pk": "in_charge__pk", # used by dynamic_table_documents "applicant__pk": "applicant__pk", # used by dynamic_table_documents } REVERSED_BOOL_FIELDS = [ - 'documents__image__isnull', - 'documents__associated_file__isnull', - 'documents__associated_url__isnull', + "documents__image__isnull", + "documents__associated_file__isnull", + "documents__associated_url__isnull", ] # alternative names of fields for searches ALT_NAMES = { - 'name': SearchAltName( - pgettext_lazy("key for text search", "name"), - 'name__iexact' + "name": SearchAltName( + pgettext_lazy("key for text search", "name"), "name__iexact" ), - 'internal_reference': SearchAltName( + "internal_reference": SearchAltName( pgettext_lazy("key for text search", "reference"), - 'internal_reference__iexact' - ), - 'year': SearchAltName( - pgettext_lazy("key for text search", "year"), - 'year' - ), - 'index': SearchAltName( - pgettext_lazy("key for text search", "index"), - 'index' + "internal_reference__iexact", ), - 'type': SearchAltName( - pgettext_lazy("key for text search", "type"), - 'type__label__iexact' + "year": SearchAltName(pgettext_lazy("key for text search", "year"), "year"), + "index": SearchAltName(pgettext_lazy("key for text search", "index"), "index"), + "type": SearchAltName( + pgettext_lazy("key for text search", "type"), "type__label__iexact" ), - 'in_charge': SearchAltName( + "in_charge": SearchAltName( pgettext_lazy("key for text search", "in-charge"), - 'in_charge__cached_label__iexact' + "in_charge__cached_label__iexact", ), - 'applicant': SearchAltName( + "applicant": SearchAltName( pgettext_lazy("key for text search", "applicant"), - 'applicant__cached_label__iexact' + "applicant__cached_label__iexact", ), - 'applicant_organisation': SearchAltName( + "applicant_organisation": SearchAltName( pgettext_lazy("key for text search", "applicant-organisation"), - 'applicant_organisation__cached_label__iexact' + "applicant_organisation__cached_label__iexact", ), - 'exhibition_start_before': SearchAltName( + "exhibition_start_before": SearchAltName( pgettext_lazy("key for text search", "exhibition-start-before"), - 'exhibition_start_date__lte' + "exhibition_start_date__lte", ), - 'exhibition_start_after': SearchAltName( + "exhibition_start_after": SearchAltName( pgettext_lazy("key for text search", "exhibition-start-after"), - 'exhibition_start_date__gte' + "exhibition_start_date__gte", ), - 'exhibition_end_before': SearchAltName( + "exhibition_end_before": SearchAltName( pgettext_lazy("key for text search", "exhibition-end-before"), - 'exhibition_end_date__lte' + "exhibition_end_date__lte", ), - 'exhibition_end_after': SearchAltName( + "exhibition_end_after": SearchAltName( pgettext_lazy("key for text search", "exhibition-end-after"), - 'exhibition_end_date__gte' + "exhibition_end_date__gte", ), } ALT_NAMES.update(BaseHistorizedItem.ALT_NAMES) ALT_NAMES.update(DocumentItem.ALT_NAMES) - DATED_FIELDS = ['exhibition_start_date__lte', - 'exhibition_start_date__gte', - 'exhibition_end_date__lte', - 'exhibition_end_date__gte'] + DATED_FIELDS = [ + "exhibition_start_date__lte", + "exhibition_start_date__gte", + "exhibition_end_date__lte", + "exhibition_end_date__gte", + ] # fields year = models.IntegerField(_("Year"), default=get_current_year) index = models.IntegerField(_("Index"), default=1) - internal_reference = models.CharField(_("Internal reference"), blank=True, - null=True, max_length=200) - external_id = models.CharField(_("External ID"), blank=True, null=True, - max_length=200) + internal_reference = models.CharField( + _("Internal reference"), blank=True, null=True, max_length=200 + ) + external_id = models.CharField( + _("External ID"), blank=True, null=True, max_length=200 + ) name = models.TextField(_("Name"), blank=True, default="") - type = models.ForeignKey(TreatmentFileType, - verbose_name=_("Treatment request type")) + type = models.ForeignKey( + TreatmentFileType, verbose_name=_("Treatment request type") + ) in_charge = models.ForeignKey( - Person, related_name='treatmentfile_responsability', - verbose_name=_("Person in charge"), on_delete=models.SET_NULL, - blank=True, null=True) + Person, + related_name="treatmentfile_responsability", + verbose_name=_("Person in charge"), + on_delete=models.SET_NULL, + blank=True, + null=True, + ) applicant = models.ForeignKey( - Person, related_name='treatmentfile_applicant', - verbose_name=_("Applicant"), on_delete=models.SET_NULL, - blank=True, null=True) + Person, + related_name="treatmentfile_applicant", + verbose_name=_("Applicant"), + on_delete=models.SET_NULL, + blank=True, + null=True, + ) applicant_organisation = models.ForeignKey( - Organization, related_name='treatmentfile_applicant', - verbose_name=_("Applicant organisation"), on_delete=models.SET_NULL, - blank=True, null=True) + Organization, + related_name="treatmentfile_applicant", + verbose_name=_("Applicant organisation"), + on_delete=models.SET_NULL, + blank=True, + null=True, + ) end_date = models.DateField(_("Closing date"), null=True, blank=True) creation_date = models.DateField( - _("Creation date"), default=datetime.date.today, blank=True, - null=True) - reception_date = models.DateField(_('Reception date'), blank=True, - null=True) + _("Creation date"), default=datetime.date.today, blank=True, null=True + ) + reception_date = models.DateField(_("Reception date"), blank=True, null=True) # exhibition - exhibition_name = models.TextField(_("Exhibition name"), blank=True, - default="") - exhibition_start_date = models.DateField(_("Exhibition start date"), - blank=True, null=True) - exhibition_end_date = models.DateField(_("Exhibition end date"), - blank=True, null=True) + exhibition_name = models.TextField(_("Exhibition name"), blank=True, default="") + exhibition_start_date = models.DateField( + _("Exhibition start date"), blank=True, null=True + ) + exhibition_end_date = models.DateField( + _("Exhibition end date"), blank=True, null=True + ) comment = models.TextField(_("Comment"), blank=True, default="") documents = models.ManyToManyField( - Document, related_name='treatment_files', verbose_name=_("Documents"), - blank=True) + Document, + related_name="treatment_files", + verbose_name=_("Documents"), + blank=True, + ) main_image = models.ForeignKey( - Document, related_name='main_image_treatment_files', + Document, + related_name="main_image_treatment_files", on_delete=models.SET_NULL, - verbose_name=_("Main image"), blank=True, null=True) + verbose_name=_("Main image"), + blank=True, + null=True, + ) associated_basket = models.ForeignKey( - FindBasket, null=True, blank=True, on_delete=models.SET_NULL, - related_name='treatment_files' + FindBasket, + null=True, + blank=True, + on_delete=models.SET_NULL, + related_name="treatment_files", + ) + cached_label = models.TextField( + _("Cached name"), blank=True, default="", db_index=True ) - cached_label = models.TextField(_("Cached name"), blank=True, default="", - db_index=True) history = HistoricalRecords() class Meta: verbose_name = _("Treatment request") verbose_name_plural = _("Treatment requests") - unique_together = ('year', 'index') + unique_together = ("year", "index") permissions = ( - ("view_treatmentfile", - "Can view all Treatment requests"), - ("view_own_treatmentfile", - "Can view own Treatment request"), - ("add_own_treatmentfile", - "Can add own Treatment request"), - ("change_own_treatmentfile", - "Can change own Treatment request"), - ("delete_own_treatmentfile", - "Can delete own Treatment request"), + ("view_treatmentfile", "Can view all Treatment requests"), + ("view_own_treatmentfile", "Can view own Treatment request"), + ("add_own_treatmentfile", "Can add own Treatment request"), + ("change_own_treatmentfile", "Can change own Treatment request"), + ("delete_own_treatmentfile", "Can delete own Treatment request"), ) - ordering = ('cached_label',) + ordering = ("cached_label",) indexes = [ - GinIndex(fields=['data']), + GinIndex(fields=["data"]), ] def __str__(self): @@ -1071,57 +1183,76 @@ class TreatmentFile(DashboardFormItem, ClosedItem, DocumentItem, @classmethod def get_query_owns(cls, ishtaruser): - return (Q(history_creator=ishtaruser.user_ptr) | - Q(in_charge__ishtaruser=ishtaruser)) \ - & Q(end_date__isnull=True) + return ( + Q(history_creator=ishtaruser.user_ptr) | Q(in_charge__ishtaruser=ishtaruser) + ) & Q(end_date__isnull=True) @property def associated_filename(self): return "-".join( str(slugify(getattr(self, attr))) - for attr in ('year', 'index', 'internal_reference', 'name') + for attr in ("year", "index", "internal_reference", "name") if getattr(self, attr) ) def get_extra_actions(self, request): # url, base_text, icon, extra_text, extra css class, is a quick action actions = super(TreatmentFile, self).get_extra_actions(request) - if self.can_do(request, 'add_administrativeact'): + if self.can_do(request, "add_administrativeact"): actions += [ - (reverse('treatmentfile-add-adminact', args=[self.pk]), - _("Add associated administrative act"), "fa fa-plus", - _("admin. act"), "", False), + ( + reverse("treatmentfile-add-adminact", args=[self.pk]), + _("Add associated administrative act"), + "fa fa-plus", + _("admin. act"), + "", + False, + ), ] if not self.associated_basket: return actions - if self.type.treatment_type and self.treatments.filter( - treatment_types__pk=self.type.treatment_type.pk).count(): + if ( + self.type.treatment_type + and self.treatments.filter( + treatment_types__pk=self.type.treatment_type.pk + ).count() + ): # a treatment of this type already exists return actions - can_edit_find = self.can_do(request, 'change_find') + can_edit_find = self.can_do(request, "change_find") if can_edit_find: actions += [ - (reverse('treatmentfile-add-treatment', args=[self.pk]), - _("Add associated treatment"), "fa fa-flask", "", "", - False), + ( + reverse("treatmentfile-add-treatment", args=[self.pk]), + _("Add associated treatment"), + "fa fa-flask", + "", + "", + False, + ), ] return actions @classmethod - def get_owns(cls, user, menu_filtr=None, limit=None, values=None, - get_short_menu_class=None): + def get_owns( + cls, user, menu_filtr=None, limit=None, values=None, get_short_menu_class=None + ): owns = super(TreatmentFile, cls).get_owns( - user, limit=limit, values=values, - get_short_menu_class=get_short_menu_class) + user, limit=limit, values=values, get_short_menu_class=get_short_menu_class + ) return cls._return_get_owns(owns, values, get_short_menu_class) def _generate_cached_label(self): - items = [str(getattr(self, k)) - for k in ['year', 'index', 'internal_reference', 'name'] if - getattr(self, k)] + items = [ + str(getattr(self, k)) + for k in ["year", "index", "internal_reference", "name"] + if getattr(self, k) + ] return settings.JOINT.join(items) - def _get_base_image_path(self,): + def _get_base_image_path( + self, + ): return "{}/{}/{}".format(self.SLUG, self.year, self.index) def pre_save(self): @@ -1131,14 +1262,13 @@ class TreatmentFile(DashboardFormItem, ClosedItem, DocumentItem, self.index = 1 q = TreatmentFile.objects.filter(year=self.year) if q.count(): - self.index = q.all().aggregate(Max('index'))['index__max'] + 1 + self.index = q.all().aggregate(Max("index"))["index__max"] + 1 def save(self, *args, **kwargs): self.pre_save() super(TreatmentFile, self).save(*args, **kwargs) -m2m_changed.connect(document_attached_changed, - sender=TreatmentFile.documents.through) +m2m_changed.connect(document_attached_changed, sender=TreatmentFile.documents.through) post_save.connect(cached_label_changed, sender=TreatmentFile) diff --git a/archaeological_finds/serializers.py b/archaeological_finds/serializers.py index e130a0ef8..54e9108b3 100644 --- a/archaeological_finds/serializers.py +++ b/archaeological_finds/serializers.py @@ -1,13 +1,10 @@ from django.db.models import Q -from ishtar_common.serializers_utils import generic_get_results, \ - archive_serialization +from ishtar_common.serializers_utils import generic_get_results, archive_serialization from archaeological_finds import models -FIND_MODEL_LIST = [ - models.BaseFind, models.Find -] +FIND_MODEL_LIST = [models.BaseFind, models.Find] # TODO: associated documents, property, findbasket, treatments @@ -17,12 +14,10 @@ def generate_warehouse_queryset(ids): for container_key in ("container", "container_ref"): for warehouse_key in ("location", "responsible"): - q_f = Q(** - {"{}__{}__id__in".format( - container_key, warehouse_key): ids}) - q_bf = Q(** - {"find__{}__{}__id__in".format( - container_key, warehouse_key): ids}) + q_f = Q(**{"{}__{}__id__in".format(container_key, warehouse_key): ids}) + q_bf = Q( + **{"find__{}__{}__id__in".format(container_key, warehouse_key): ids} + ) if not q_find: q_find = q_f q_basefind = q_bf @@ -31,30 +26,36 @@ def generate_warehouse_queryset(ids): q_basefind |= q_bf result_queryset = { - models.BaseFind.__name__: - models.BaseFind.objects.filter(q_basefind), - models.Find.__name__: - models.Find.objects.filter(q_find), + models.BaseFind.__name__: models.BaseFind.objects.filter(q_basefind), + models.Find.__name__: models.Find.objects.filter(q_find), } return result_queryset -def find_serialization(archive=False, return_empty_types=False, - archive_name=None, operation_queryset=None, - site_queryset=None, cr_queryset=None, - find_queryset=None, warehouse_queryset=None, - get_queryset=False, no_geo=True, - put_locks=False, lock_user=None): +def find_serialization( + archive=False, + return_empty_types=False, + archive_name=None, + operation_queryset=None, + site_queryset=None, + cr_queryset=None, + find_queryset=None, + warehouse_queryset=None, + get_queryset=False, + no_geo=True, + put_locks=False, + lock_user=None, +): result_queryset = {} if operation_queryset: operation_ids = operation_queryset.values_list("id", flat=True) result_queryset = { - models.BaseFind.__name__: - models.BaseFind.objects.filter( - context_record__operation_id__in=operation_ids), - models.Find.__name__: - models.Find.objects.filter( - base_finds__context_record__operation_id__in=operation_ids), + models.BaseFind.__name__: models.BaseFind.objects.filter( + context_record__operation_id__in=operation_ids + ), + models.Find.__name__: models.Find.objects.filter( + base_finds__context_record__operation_id__in=operation_ids + ), } elif site_queryset: sites = site_queryset.values_list("id", flat=True) @@ -62,28 +63,27 @@ def find_serialization(archive=False, return_empty_types=False, "base_finds__context_record__operation__archaeological_sites__id__in": sites } result_queryset = { - models.BaseFind.__name__: - models.BaseFind.objects.filter( - context_record__operation__archaeological_sites__id__in=sites - ), - models.Find.__name__: - models.Find.objects.filter(**f_q), + models.BaseFind.__name__: models.BaseFind.objects.filter( + context_record__operation__archaeological_sites__id__in=sites + ), + models.Find.__name__: models.Find.objects.filter(**f_q), } elif cr_queryset: cr_ids = cr_queryset.values_list("id", flat=True) result_queryset = { - models.BaseFind.__name__: - models.BaseFind.objects.filter( - context_record__in=cr_ids), - models.Find.__name__: - models.Find.objects.filter( - base_finds__context_record__in=cr_ids), + models.BaseFind.__name__: models.BaseFind.objects.filter( + context_record__in=cr_ids + ), + models.Find.__name__: models.Find.objects.filter( + base_finds__context_record__in=cr_ids + ), } elif find_queryset: find_ids = find_queryset.values_list("id", flat=True) result_queryset = { models.BaseFind.__name__: models.BaseFind.objects.filter( - find__id__in=find_ids), + find__id__in=find_ids + ), models.Find.__name__: find_queryset, } elif warehouse_queryset: @@ -93,8 +93,9 @@ def find_serialization(archive=False, return_empty_types=False, if get_queryset: return result_queryset - result = generic_get_results(FIND_MODEL_LIST, "finds", - result_queryset=result_queryset, no_geo=no_geo) + result = generic_get_results( + FIND_MODEL_LIST, "finds", result_queryset=result_queryset, no_geo=no_geo + ) if put_locks: for model in FIND_MODEL_LIST: if not hasattr(model, "locked"): @@ -105,7 +106,10 @@ def find_serialization(archive=False, return_empty_types=False, q.update(locked=True, lock_user=lock_user) full_archive = archive_serialization( - result, archive_dir="operations", archive=archive, - return_empty_types=return_empty_types, archive_name=archive_name, + result, + archive_dir="operations", + archive=archive, + return_empty_types=return_empty_types, + archive_name=archive_name, ) return full_archive diff --git a/archaeological_finds/tests.py b/archaeological_finds/tests.py index 61caca858..bb249e2ea 100644 --- a/archaeological_finds/tests.py +++ b/archaeological_finds/tests.py @@ -1,4 +1,4 @@ -#!/usr/bin/env python +#!/usr/bin/env python3 # -*- coding: utf-8 -*- # Copyright (C) 2015-2017 Étienne Loks <etienne.loks_AT_peacefrogsDOTnet> @@ -35,27 +35,63 @@ from django.core.files.uploadedfile import SimpleUploadedFile from django.core.urlresolvers import reverse from django.test import tag from django.test.client import Client -from ishtar_common.models import ImporterType, IshtarUser, ImporterColumn,\ - FormaterType, ImportTarget, IshtarSiteProfile, ProfileType, ImporterModel, \ - DocumentTemplate +from ishtar_common.models import ( + ImporterType, + IshtarUser, + ImporterColumn, + FormaterType, + ImportTarget, + IshtarSiteProfile, + ProfileType, + ImporterModel, + DocumentTemplate, +) from django.utils.text import slugify from django.utils.translation import pgettext_lazy, gettext_lazy as _ -from ishtar_common.models import Person, get_current_profile, UserProfile, \ - Town, Area, Document, SpatialReferenceSystem -from archaeological_context_records.models import Period, Dating, \ - ContextRecord, DatingType, DatingQuality +from ishtar_common.models import ( + Person, + get_current_profile, + UserProfile, + Town, + Area, + Document, + SpatialReferenceSystem, +) +from archaeological_context_records.models import ( + Period, + Dating, + ContextRecord, + DatingType, + DatingQuality, +) from archaeological_finds import models, views -from archaeological_warehouse.models import Warehouse, WarehouseType, \ - ContainerType, Container, WarehouseDivisionLink +from archaeological_warehouse.models import ( + Warehouse, + WarehouseType, + ContainerType, + Container, + WarehouseDivisionLink, +) from archaeological_operations.models import Operation, OperationType from ishtar_common import forms_common -from ishtar_common.tests import WizardTest, WizardTestFormData as FormData, \ - TestCase, create_user, create_superuser, AutocompleteTestBase, AcItem, \ - FIND_FIXTURES, FIND_TOWNS_FIXTURES, WAREHOUSE_FIXTURES, \ - COMMON_FIXTURES, GenericSerializationTest, SearchText +from ishtar_common.tests import ( + WizardTest, + WizardTestFormData as FormData, + TestCase, + create_user, + create_superuser, + AutocompleteTestBase, + AcItem, + FIND_FIXTURES, + FIND_TOWNS_FIXTURES, + WAREHOUSE_FIXTURES, + COMMON_FIXTURES, + GenericSerializationTest, + SearchText, +) from archaeological_operations.tests import ImportTest, create_operation from archaeological_context_records.tests import ContextRecordInit @@ -72,22 +108,25 @@ class FindInit(ContextRecordInit): data_base = {} if not data: data = {} - if not getattr(self, 'finds', None): + if not getattr(self, "finds", None): self.finds = [] - if not getattr(self, 'base_finds', None): + if not getattr(self, "base_finds", None): self.base_finds = [] - default = {'label': "Base find"} + default = {"label": "Base find"} if user: - data_base['history_modifier'] = user - elif not data_base.get('history_modifier') or not data_base[ - 'history_modifier'].pk: + data_base["history_modifier"] = user + elif ( + not data_base.get("history_modifier") + or not data_base["history_modifier"].pk + ): user = self.get_default_user() user.save() - data_base['history_modifier'] = user - if force or not data_base.get('context_record'): - data_base['context_record'] = self.get_default_context_record( - force=force, user=user) + data_base["history_modifier"] = user + if force or not data_base.get("context_record"): + data_base["context_record"] = self.get_default_context_record( + force=force, user=user + ) default.update(data_base) base_find = models.BaseFind.objects.create(**default) self.base_finds.append(base_find) @@ -106,14 +145,14 @@ class FindInit(ContextRecordInit): def tearDown(self): super(FindInit, self).tearDown() - if hasattr(self, 'finds'): + if hasattr(self, "finds"): for f in self.finds: try: f.delete() except: pass self.finds = [] - if hasattr(self, 'base_finds'): + if hasattr(self, "base_finds"): for f in self.base_finds: try: f.delete() @@ -128,12 +167,8 @@ class SerializationTest(GenericSerializationTest, FindInit, TestCase): def setUp(self): ope1 = self.create_operation()[0] ope2 = self.create_operation()[1] - cr = self.create_context_record( - data={"label": "CR 1", "operation": ope1} - )[0] - cr2 = self.create_context_record( - data={"label": "CR 2", "operation": ope2} - )[1] + cr = self.create_context_record(data={"label": "CR 1", "operation": ope1})[0] + cr2 = self.create_context_record(data={"label": "CR 2", "operation": ope2})[1] self.create_finds(data_base={"context_record": cr})[0] self.create_finds(data_base={"context_record": cr2})[1] # basket = models.FindBasket.objects.create(label="Hophop") @@ -142,164 +177,145 @@ class SerializationTest(GenericSerializationTest, FindInit, TestCase): def test_serialization(self): res = self.generic_serialization_test(serializers.find_serialization) - find_json = json.loads( - res[('finds', 'archaeological_finds__Find')] - ) + find_json = json.loads(res[("finds", "archaeological_finds__Find")]) self.assertEqual(len(find_json), 2) - bfind_json = json.loads( - res[('finds', 'archaeological_finds__BaseFind')] - ) + bfind_json = json.loads(res[("finds", "archaeological_finds__BaseFind")]) self.assertEqual(len(bfind_json), 2) result_queryset = Operation.objects.filter(uuid=self.operations[0].uuid) res = self.generic_serialization_test( - serializers.find_serialization, no_test=True, - kwargs={"operation_queryset": result_queryset} - ) - find_json = json.loads( - res[('finds', 'archaeological_finds__Find')] + serializers.find_serialization, + no_test=True, + kwargs={"operation_queryset": result_queryset}, ) + find_json = json.loads(res[("finds", "archaeological_finds__Find")]) self.assertEqual(len(find_json), 1) - bfind_json = json.loads( - res[('finds', 'archaeological_finds__BaseFind')] - ) + bfind_json = json.loads(res[("finds", "archaeological_finds__BaseFind")]) self.assertEqual(len(bfind_json), 1) result_queryset = ContextRecord.objects.filter( - uuid=self.context_records[0].uuid) - res = self.generic_serialization_test( - serializers.find_serialization, no_test=True, - kwargs={"cr_queryset": result_queryset} + uuid=self.context_records[0].uuid ) - find_json = json.loads( - res[('finds', 'archaeological_finds__Find')] + res = self.generic_serialization_test( + serializers.find_serialization, + no_test=True, + kwargs={"cr_queryset": result_queryset}, ) + find_json = json.loads(res[("finds", "archaeological_finds__Find")]) self.assertEqual(len(find_json), 1) - bfind_json = json.loads( - res[('finds', 'archaeological_finds__BaseFind')] - ) + bfind_json = json.loads(res[("finds", "archaeological_finds__BaseFind")]) self.assertEqual(len(bfind_json), 1) - result_queryset = models.Find.objects.filter( - uuid=self.finds[0].uuid) + result_queryset = models.Find.objects.filter(uuid=self.finds[0].uuid) res = self.generic_serialization_test( - serializers.find_serialization, no_test=True, - kwargs={"find_queryset": result_queryset} - ) - find_json = json.loads( - res[('finds', 'archaeological_finds__Find')] + serializers.find_serialization, + no_test=True, + kwargs={"find_queryset": result_queryset}, ) + find_json = json.loads(res[("finds", "archaeological_finds__Find")]) self.assertEqual(len(find_json), 1) - bfind_json = json.loads( - res[('finds', 'archaeological_finds__BaseFind')] - ) + bfind_json = json.loads(res[("finds", "archaeological_finds__BaseFind")]) self.assertEqual(len(bfind_json), 1) def test_ope_serialization_with_find_filter(self): res = self.generic_serialization_test( - operation_serialization, no_test=True, + operation_serialization, + no_test=True, ) ope_json = json.loads( - res[('operations', 'archaeological_operations__Operation')] + res[("operations", "archaeological_operations__Operation")] ) self.assertEqual(len(ope_json), 2) - result_queryset = models.Find.objects.filter( - uuid=self.finds[0].uuid) + result_queryset = models.Find.objects.filter(uuid=self.finds[0].uuid) res = self.generic_serialization_test( - operation_serialization, no_test=True, - kwargs={"find_queryset": result_queryset} + operation_serialization, + no_test=True, + kwargs={"find_queryset": result_queryset}, ) ope_json = json.loads( - res[('operations', 'archaeological_operations__Operation')] + res[("operations", "archaeological_operations__Operation")] ) self.assertEqual(len(ope_json), 1) def test_cr_serialization_with_find_filter(self): res = self.generic_serialization_test( - cr_serialization, no_test=True, + cr_serialization, + no_test=True, ) cr_json = json.loads( - res[('context_records', - 'archaeological_context_records__ContextRecord')] + res[("context_records", "archaeological_context_records__ContextRecord")] ) self.assertEqual(len(cr_json), 2) - result_queryset = models.Find.objects.filter( - uuid=self.finds[0].uuid) + result_queryset = models.Find.objects.filter(uuid=self.finds[0].uuid) res = self.generic_serialization_test( - cr_serialization, no_test=True, - kwargs={"find_queryset": result_queryset} + cr_serialization, no_test=True, kwargs={"find_queryset": result_queryset} ) cr_json = json.loads( - res[('context_records', - 'archaeological_context_records__ContextRecord')] + res[("context_records", "archaeological_context_records__ContextRecord")] ) self.assertEqual(len(cr_json), 1) def test_restore(self): current_number, zip_filename = self.generic_restore_test_genzip( - serializers.FIND_MODEL_LIST, - serializers.find_serialization) - self.generic_restore_test(zip_filename, current_number, - serializers.FIND_MODEL_LIST) + serializers.FIND_MODEL_LIST, serializers.find_serialization + ) + self.generic_restore_test( + zip_filename, current_number, serializers.FIND_MODEL_LIST + ) class FindWizardCreationTest(WizardTest, FindInit, TestCase): fixtures = WAREHOUSE_FIXTURES - url_name = 'find_creation' - wizard_name = 'find_wizard' + url_name = "find_creation" + wizard_name = "find_wizard" steps = views.find_creation_steps - redirect_url = "/find_modification/selec-find_modification?open_item="\ - "{last_id}" + redirect_url = "/find_modification/selec-find_modification?open_item=" "{last_id}" model = models.Find form_datas = [ FormData( - 'Find creation', + "Find creation", form_datas={ - 'selecrecord-find_creation': {'pk': 1}, - 'find-find_creation': { - 'label': 'hop', - 'checked': 'NC', - 'check_date': '2016-01-01' + "selecrecord-find_creation": {"pk": 1}, + "find-find_creation": { + "label": "hop", + "checked": "NC", + "check_date": "2016-01-01", }, - 'dating-find_creation': [ + "dating-find_creation": [ { - 'period': None, - 'start_date': '0', - 'end_date': '200', + "period": None, + "start_date": "0", + "end_date": "200", }, { - 'period': None, - 'start_date': '0', - 'end_date': '200', - } - ] + "period": None, + "start_date": "0", + "end_date": "200", + }, + ], }, - ignored=['preservation-find_creation'] + ignored=["preservation-find_creation"], ) ] def pre_wizard(self): cr = self.create_context_record( - data={'parcel': self.create_parcel()[-1]}, force=True)[-1] + data={"parcel": self.create_parcel()[-1]}, force=True + )[-1] - self.form_datas[0].form_datas['selecrecord-find_creation']['pk'] = \ - cr.pk + self.form_datas[0].form_datas["selecrecord-find_creation"]["pk"] = cr.pk period = Period.objects.all()[0].pk - self.form_datas[0].form_datas['dating-find_creation'][0]['period'] = \ - period - self.form_datas[0].form_datas['dating-find_creation'][1]['period'] = \ - period + self.form_datas[0].form_datas["dating-find_creation"][0]["period"] = period + self.form_datas[0].form_datas["dating-find_creation"][1]["period"] = period self.find_number = models.Find.objects.count() self.basefind_number = models.BaseFind.objects.count() super(FindWizardCreationTest, self).pre_wizard() def post_wizard(self): - self.assertEqual(models.BaseFind.objects.count(), - self.basefind_number + 1) - self.assertEqual(models.Find.objects.count(), - self.find_number + 1) + self.assertEqual(models.BaseFind.objects.count(), self.basefind_number + 1) + self.assertEqual(models.Find.objects.count(), self.find_number + 1) # identical datings, only one should be finaly save f = models.Find.objects.order_by("-pk").all()[0] self.assertEqual(f.datings.count(), 1) @@ -307,42 +323,44 @@ class FindWizardCreationTest(WizardTest, FindInit, TestCase): class FindWizardModificationTest(WizardTest, FindInit, TestCase): fixtures = WAREHOUSE_FIXTURES - url_name = 'find_modification' - wizard_name = url_name + '_wizard' + url_name = "find_modification" + wizard_name = url_name + "_wizard" steps = views.find_modification_steps - redirect_url = "/find_modification/selec-find_modification?open_item=" \ - "{last_id}" + redirect_url = "/find_modification/selec-find_modification?open_item=" "{last_id}" model = models.Find form_datas = [ FormData( - 'Find modification', + "Find modification", form_datas={ - 'selec-find_modification': {'pk': ''}, - 'selecrecord-find_modification': { + "selec-find_modification": {"pk": ""}, + "selecrecord-find_modification": { "get_first_base_find__context_record": "" }, - 'find-find_modification': { - 'label': 'hop', - 'checked': 'NC', - 'check_date': '2016-01-01' + "find-find_modification": { + "label": "hop", + "checked": "NC", + "check_date": "2016-01-01", }, - 'dating-find_modification': [ + "dating-find_modification": [ { - 'period': None, - 'start_date': '', - 'end_date': '', + "period": None, + "start_date": "", + "end_date": "", }, - ] + ], }, - ignored=['preservation-find_modification', - 'selecw-find_modification', - 'simplefind-find_modification'] + ignored=[ + "preservation-find_modification", + "selecw-find_modification", + "simplefind-find_modification", + ], ) ] def pre_wizard(self): profile, created = IshtarSiteProfile.objects.get_or_create( - slug='default', active=True) + slug="default", active=True + ) profile.warehouse = False profile.save() find, __ = self.get_default_find(force=True) @@ -352,29 +370,28 @@ class FindWizardModificationTest(WizardTest, FindInit, TestCase): find.save() data = self.form_datas[0].form_datas - data['selec-find_modification']['pk'] = find.pk - data['selecrecord-find_modification'][ - 'get_first_base_find__context_record'] = \ - find.base_finds.all()[0].context_record.pk + data["selec-find_modification"]["pk"] = find.pk + data["selecrecord-find_modification"][ + "get_first_base_find__context_record" + ] = find.base_finds.all()[0].context_record.pk self.period = Period.objects.all()[0] self.period2 = Period.objects.all()[1] - find.datings.add(Dating.objects.create( - period=self.period, start_date='0', end_date='200')) + find.datings.add( + Dating.objects.create(period=self.period, start_date="0", end_date="200") + ) find.datings.add(Dating.objects.create(period=self.period2)) - data['dating-find_modification'][0]['period'] = self.period.pk + data["dating-find_modification"][0]["period"] = self.period.pk self.find_number = models.Find.objects.count() self.basefind_number = models.BaseFind.objects.count() super(FindWizardModificationTest, self).pre_wizard() def post_wizard(self): # no creation - self.assertEqual(models.BaseFind.objects.count(), - self.basefind_number) - self.assertEqual(models.Find.objects.count(), - self.find_number) + self.assertEqual(models.BaseFind.objects.count(), self.basefind_number) + self.assertEqual(models.Find.objects.count(), self.find_number) f = models.Find.objects.get(pk=self.find.pk) self.assertEqual(f.datings.count(), 1) dating = f.datings.all()[0] @@ -385,109 +402,109 @@ class FindWizardModificationTest(WizardTest, FindInit, TestCase): class FindWizardDeletionWithWarehouseModTest(WizardTest, FindInit, TestCase): fixtures = WAREHOUSE_FIXTURES - url_name = 'find_deletion' - wizard_name = 'find_deletion_wizard' + url_name = "find_deletion" + wizard_name = "find_deletion_wizard" steps = views.find_deletion_steps redirect_url = "/{}/selecw-{}".format(url_name, url_name) form_datas = [ FormData( - 'Find deletion', + "Find deletion", form_datas={ - 'selecw': {}, + "selecw": {}, }, - ignored=['selec-find_deletion'] + ignored=["selec-find_deletion"], ) ] def pre_wizard(self): profile, created = IshtarSiteProfile.objects.get_or_create( - slug='default', active=True) + slug="default", active=True + ) profile.warehouse = True profile.save() find, bf = self.get_default_find(force=True) - self.form_datas[0].set('selecw', 'pks', find.pk) + self.form_datas[0].set("selecw", "pks", find.pk) self.find_number = models.Find.objects.count() super(FindWizardDeletionWithWarehouseModTest, self).pre_wizard() def post_wizard(self): - self.assertEqual(models.Find.objects.count(), - self.find_number - 1) + self.assertEqual(models.Find.objects.count(), self.find_number - 1) class TreatmentWizardCreationTest(WizardTest, FindInit, TestCase): fixtures = WAREHOUSE_FIXTURES - url_name = 'treatment_creation' - wizard_name = 'treatment_wizard' + url_name = "treatment_creation" + wizard_name = "treatment_wizard" steps = views.treatment_wizard_steps - redirect_url = "/treatment_search/general-treatment_search?" \ - "open_item={last_id}" + redirect_url = "/treatment_search/general-treatment_search?" "open_item={last_id}" model = models.Treatment form_datas = [ FormData( - 'Move treatment (planned)', + "Move treatment (planned)", form_datas={ - 'file': {}, - 'basetreatment': { - 'treatment_type': None, - 'person': 1, # doer - 'location': 1, # associated warehouse - 'year': 2016, - 'container': None, + "file": {}, + "basetreatment": { + "treatment_type": None, + "person": 1, # doer + "location": 1, # associated warehouse + "year": 2016, + "container": None, }, - 'selecfind': { - 'pk': 1, - 'resulting_pk': 1 - } + "selecfind": {"pk": 1, "resulting_pk": 1}, }, - ignored=('resultfind-treatment_creation', - 'selecbasket-treatment_creation', - 'resultfinds-treatment_creation')), + ignored=( + "resultfind-treatment_creation", + "selecbasket-treatment_creation", + "resultfinds-treatment_creation", + ), + ), FormData( - 'Move treatment (done)', + "Move treatment (done)", form_datas={ - 'file': {}, - 'basetreatment': { - 'treatment_type': None, - 'person': 1, # doer - 'location': 1, # associated warehouse - 'year': 2016, - 'container': None, + "file": {}, + "basetreatment": { + "treatment_type": None, + "person": 1, # doer + "location": 1, # associated warehouse + "year": 2016, + "container": None, }, - 'selecfind': { - 'pk': 1, - 'resulting_pk': 1 - } + "selecfind": {"pk": 1, "resulting_pk": 1}, }, - ignored=('resultfind-treatment_creation', - 'selecbasket-treatment_creation', - 'resultfinds-treatment_creation')), + ignored=( + "resultfind-treatment_creation", + "selecbasket-treatment_creation", + "resultfinds-treatment_creation", + ), + ), FormData( - 'Loan treatment (done)', + "Loan treatment (done)", form_datas={ - 'file': {}, - 'basetreatment': { - 'treatment_type': None, - 'person': 1, # doer - 'location': 1, # associated warehouse - 'year': 2016, - 'container': None, + "file": {}, + "basetreatment": { + "treatment_type": None, + "person": 1, # doer + "location": 1, # associated warehouse + "year": 2016, + "container": None, }, - 'selecfind': { - 'pk': 1, - 'resulting_pk': 1 - } + "selecfind": {"pk": 1, "resulting_pk": 1}, }, - ignored=('resultfind-treatment_creation', - 'selecbasket-treatment_creation', - 'resultfinds-treatment_creation')), + ignored=( + "resultfind-treatment_creation", + "selecbasket-treatment_creation", + "resultfinds-treatment_creation", + ), + ), ] def pre_wizard(self): q = Warehouse.objects.filter(pk=1) if not q.count(): warehouse = Warehouse.objects.create( - name="default", warehouse_type=WarehouseType.objects.all()[0]) + name="default", warehouse_type=WarehouseType.objects.all()[0] + ) warehouse.id = 1 warehouse.save() else: @@ -501,19 +518,19 @@ class TreatmentWizardCreationTest(WizardTest, FindInit, TestCase): self.container_ref = Container.objects.create( location=warehouse, responsible=warehouse, - container_type=ContainerType.objects.all()[0] + container_type=ContainerType.objects.all()[0], ) self.container1 = Container.objects.create( location=warehouse, responsible=warehouse, - container_type=ContainerType.objects.all()[0] + container_type=ContainerType.objects.all()[0], ) self.container2 = Container.objects.create( location=warehouse, responsible=warehouse, - container_type=ContainerType.objects.all()[0] + container_type=ContainerType.objects.all()[0], ) self.find, base_find = self.get_default_find(force=True) @@ -521,50 +538,44 @@ class TreatmentWizardCreationTest(WizardTest, FindInit, TestCase): self.find.container = self.container_ref self.find.save() for idx in (0, 1): - self.form_datas[idx].form_datas['selecfind']["pk"] = self.find.pk - self.form_datas[idx].form_datas['selecfind']["resulting_pk"] = \ - self.find.pk - self.form_datas[idx].set('basetreatment', 'container', - self.container1.pk) + self.form_datas[idx].form_datas["selecfind"]["pk"] = self.find.pk + self.form_datas[idx].form_datas["selecfind"]["resulting_pk"] = self.find.pk + self.form_datas[idx].set("basetreatment", "container", self.container1.pk) self.find_2, base_find = self.get_default_find(force=True) self.find_2.container_ref = self.container_ref self.find_2.container = self.container_ref self.find_2.save() - self.form_datas[2].form_datas['selecfind']["pk"] = self.find_2.pk - self.form_datas[2].form_datas['selecfind']["resulting_pk"] = \ - self.find_2.pk - self.form_datas[2].set('basetreatment', 'container', self.container2.pk) + self.form_datas[2].form_datas["selecfind"]["pk"] = self.find_2.pk + self.form_datas[2].form_datas["selecfind"]["resulting_pk"] = self.find_2.pk + self.form_datas[2].set("basetreatment", "container", self.container2.pk) - moving = models.TreatmentType.objects.get(txt_idx='moving') + moving = models.TreatmentType.objects.get(txt_idx="moving") moving.change_reference_location = True moving.change_current_location = True moving.save() - self.form_datas[0].set('basetreatment', 'treatment_type', - moving.pk) - self.form_datas[1].set('basetreatment', 'treatment_type', - moving.pk) - loan = models.TreatmentType.objects.get(txt_idx='loan') + self.form_datas[0].set("basetreatment", "treatment_type", moving.pk) + self.form_datas[1].set("basetreatment", "treatment_type", moving.pk) + loan = models.TreatmentType.objects.get(txt_idx="loan") loan.change_reference_location = False loan.change_current_location = True loan.save() - self.form_datas[2].set('basetreatment', 'treatment_type', - loan.pk) + self.form_datas[2].set("basetreatment", "treatment_type", loan.pk) planned, __ = models.TreatmentState.objects.get_or_create( - txt_idx='planned', defaults={"executed": False, "label": "Planned"} + txt_idx="planned", defaults={"executed": False, "label": "Planned"} ) planned.executed = False planned.save() - self.form_datas[0].set('basetreatment', 'treatment_state', planned.pk) + self.form_datas[0].set("basetreatment", "treatment_state", planned.pk) completed, created = models.TreatmentState.objects.get_or_create( - txt_idx='completed', defaults={"executed": True, "label": "Done"} + txt_idx="completed", defaults={"executed": True, "label": "Done"} ) completed.executed = True completed.save() - self.form_datas[1].set('basetreatment', 'treatment_state', completed.pk) - self.form_datas[2].set('basetreatment', 'treatment_state', completed.pk) + self.form_datas[1].set("basetreatment", "treatment_state", completed.pk) + self.form_datas[2].set("basetreatment", "treatment_state", completed.pk) self.treatment_number = models.Treatment.objects.count() @@ -572,8 +583,8 @@ class TreatmentWizardCreationTest(WizardTest, FindInit, TestCase): # treatment planned - no changes find = models.Find.objects.get(pk=test_object.find.pk) test_object.assertEqual(find.container, test_object.container_ref) - test_object.assertEqual(find.container_ref, - test_object.container_ref) + test_object.assertEqual(find.container_ref, test_object.container_ref) + self.form_datas[0].extra_tests = [post_first_wizard] def post_second_wizard(test_object, final_step_response): @@ -581,21 +592,21 @@ class TreatmentWizardCreationTest(WizardTest, FindInit, TestCase): find = models.Find.objects.get(pk=test_object.find.pk) test_object.assertEqual(find.container, test_object.container1) test_object.assertEqual(find.container_ref, test_object.container1) + self.form_datas[1].extra_tests = [post_second_wizard] def post_third_wizard(test_object, final_step_response): # loan done find = models.Find.objects.get(pk=test_object.find_2.pk) - test_object.assertEqual(find.container_ref, - test_object.container_ref) + test_object.assertEqual(find.container_ref, test_object.container_ref) test_object.assertEqual(find.container, test_object.container2) + self.form_datas[2].extra_tests = [post_third_wizard] super(TreatmentWizardCreationTest, self).pre_wizard() def post_wizard(self): - self.assertEqual(models.Treatment.objects.count(), - self.treatment_number + 3) + self.assertEqual(models.Treatment.objects.count(), self.treatment_number + 3) self.find = models.Find.objects.get(pk=self.find.pk) self.assertEqual(self.find.treatments.count(), 2) self.find_2 = models.Find.objects.get(pk=self.find_2.pk) @@ -608,8 +619,7 @@ class TreatmentWizardCreationTest(WizardTest, FindInit, TestCase): class ImportFindTest(ImportTest, FindInit, TestCase): fixtures = FIND_TOWNS_FIXTURES + [ - settings.ROOT_PATH + - '../archaeological_finds/tests/import_loca_test.json', + settings.ROOT_PATH + "../archaeological_finds/tests/import_loca_test.json", ] def setUp(self): @@ -623,38 +633,42 @@ class ImportFindTest(ImportTest, FindInit, TestCase): old_nb_find = models.Find.objects.count() MCC = ImporterType.objects.get(name="MCC - Mobilier") - col = ImporterColumn.objects.create(col_number=25, - importer_type_id=MCC.pk) - formater = FormaterType.objects.filter( - formater_type='FileFormater').all()[0] - ImportTarget.objects.create(target='documents__image', - formater_type_id=formater.pk, - column_id=col.pk) + col = ImporterColumn.objects.create(col_number=25, importer_type_id=MCC.pk) + formater = FormaterType.objects.filter(formater_type="FileFormater").all()[0] + ImportTarget.objects.create( + target="documents__image", formater_type_id=formater.pk, column_id=col.pk + ) mcc_file = open( - settings.ROOT_PATH + - '../archaeological_finds/tests/MCC-finds-example.csv', 'rb') + settings.ROOT_PATH + "../archaeological_finds/tests/MCC-finds-example.csv", + "rb", + ) mcc_images = open( - settings.ROOT_PATH + - '../archaeological_finds/tests/images.zip', 'rb') - file_dict = {'imported_file': SimpleUploadedFile(mcc_file.name, - mcc_file.read()), - 'imported_images': SimpleUploadedFile(mcc_images.name, - mcc_images.read())} - post_dict = {'importer_type': MCC.pk, 'skip_lines': 1, - "encoding": 'utf-8', "name": 'init_find_import', - "csv_sep": ","} - form = forms_common.NewImportForm(data=post_dict, files=file_dict, - user=self.user) + settings.ROOT_PATH + "../archaeological_finds/tests/images.zip", "rb" + ) + file_dict = { + "imported_file": SimpleUploadedFile(mcc_file.name, mcc_file.read()), + "imported_images": SimpleUploadedFile(mcc_images.name, mcc_images.read()), + } + post_dict = { + "importer_type": MCC.pk, + "skip_lines": 1, + "encoding": "utf-8", + "name": "init_find_import", + "csv_sep": ",", + } + form = forms_common.NewImportForm( + data=post_dict, files=file_dict, user=self.user + ) form.is_valid() self.assertTrue(form.is_valid()) impt = form.save(self.ishtar_user) impt.initialize() # doing manual connections - ceram = models.MaterialType.objects.get(txt_idx='ceramic').pk - glass = models.MaterialType.objects.get(txt_idx='glass').pk - self.set_target_key('material_types', 'terre-cuite', ceram) - self.set_target_key('material_types', 'verre', glass) + ceram = models.MaterialType.objects.get(txt_idx="ceramic").pk + glass = models.MaterialType.objects.get(txt_idx="glass").pk + self.set_target_key("material_types", "terre-cuite", ceram) + self.set_target_key("material_types", "verre", glass) impt.importation() # new finds has now been imported current_nb = models.BaseFind.objects.count() @@ -662,9 +676,11 @@ class ImportFindTest(ImportTest, FindInit, TestCase): current_nb = models.Find.objects.count() self.assertEqual(current_nb, (old_nb_find + 4)) self.assertEqual( - models.Find.objects.filter(material_types__pk=ceram).count(), 4) + models.Find.objects.filter(material_types__pk=ceram).count(), 4 + ) self.assertEqual( - models.Find.objects.filter(material_types__pk=glass).count(), 1) + models.Find.objects.filter(material_types__pk=glass).count(), 1 + ) images = [] for find in models.Find.objects.all(): images += [1 for im in find.images.all() if im.image.name] @@ -676,15 +692,19 @@ class ImportFindTest(ImportTest, FindInit, TestCase): bf = bfs[idx] expected_index = 4 - idx self.assertEqual( - bf.index, expected_index, + bf.index, + expected_index, "Bad index for imported base find: {} where {} is " - "expected".format(bf.index, expected_index)) + "expected".format(bf.index, expected_index), + ) f = bf.find.all()[0] self.assertEqual( - f.index, expected_index, + f.index, + expected_index, "Bad index for imported find: {} where {} is expected".format( f.index, expected_index - )) + ), + ) def test_import_locations(self): self.create_finds() @@ -701,8 +721,7 @@ class ImportFindTest(ImportTest, FindInit, TestCase): warehouse, __ = Warehouse.objects.get_or_create( external_id="warehouse-test", - defaults={"name": "Warehouse test", - "warehouse_type": wt} + defaults={"name": "Warehouse test", "warehouse_type": wt}, ) container_types = [] @@ -717,7 +736,7 @@ class ImportFindTest(ImportTest, FindInit, TestCase): WarehouseDivisionLink.objects.get_or_create( warehouse=warehouse, container_type=container_types[idx], - order=(idx + 1) * 10 + order=(idx + 1) * 10, ) old_nb = models.BaseFind.objects.count() @@ -730,29 +749,56 @@ class ImportFindTest(ImportTest, FindInit, TestCase): with open(imp_filename, "w") as impfile: w = csv.writer(impfile) - w.writerow(['External ID', "Warehouse", "Ref.", - "Container type", "Localisation 1", "Localisation 2", - "Localisation 3"]) + w.writerow( + [ + "External ID", + "Warehouse", + "Ref.", + "Container type", + "Localisation 1", + "Localisation 2", + "Localisation 3", + ] + ) for idx, ext_id in enumerate(external_ids): if idx < 2: - w.writerow([ext_id, "warehouse-test", - "Réf. {}".format((idx + 1) * 10), - container_types[-1].name, - "A", "42", idx + 1]) + w.writerow( + [ + ext_id, + "warehouse-test", + "Réf. {}".format((idx + 1) * 10), + container_types[-1].name, + "A", + "42", + idx + 1, + ] + ) else: - w.writerow([ext_id, "warehouse-test", - "Réf. {}".format((idx + 1) * 10), - container_types[-1].name, - "A", 43]) + w.writerow( + [ + ext_id, + "warehouse-test", + "Réf. {}".format((idx + 1) * 10), + container_types[-1].name, + "A", + 43, + ] + ) imp_file = open(imp_filename, "rb") - file_dict = {'imported_file': SimpleUploadedFile(imp_file.name, - imp_file.read())} - post_dict = {'importer_type': importer_type.pk, 'skip_lines': 1, - "encoding": 'utf-8', "name": 'init_find_import', - "csv_sep": ","} - form = forms_common.NewImportForm(data=post_dict, files=file_dict, - user=self.user) + file_dict = { + "imported_file": SimpleUploadedFile(imp_file.name, imp_file.read()) + } + post_dict = { + "importer_type": importer_type.pk, + "skip_lines": 1, + "encoding": "utf-8", + "name": "init_find_import", + "csv_sep": ",", + } + form = forms_common.NewImportForm( + data=post_dict, files=file_dict, user=self.user + ) form.is_valid() self.assertTrue(form.is_valid()) impt = form.save(self.ishtar_user) @@ -807,12 +853,15 @@ class ImportFindTest(ImportTest, FindInit, TestCase): self.assertIn(box.parent_id, [s.pk for s in areas]) importer_type = ImporterType.objects.get(slug="importeur-test") - cols = list(ImporterColumn.objects.filter( - importer_type=importer_type, - col_number__gte=5).values_list("id", flat=True)) + cols = list( + ImporterColumn.objects.filter( + importer_type=importer_type, col_number__gte=5 + ).values_list("id", flat=True) + ) for target in ImportTarget.objects.filter(column_id__in=cols): - target.target = target.target.replace("set_localisation", - "set_static_localisation") + target.target = target.target.replace( + "set_localisation", "set_static_localisation" + ) target.save() # delete area 43 and all boxes @@ -826,9 +875,9 @@ class ImportFindTest(ImportTest, FindInit, TestCase): self.assertEqual(len(impt.errors), 2) for error in impt.errors: self.assertEqual( - error['error'], - "The division Area 43 do not exist for the location Warehouse " - "test.") + error["error"], + "The division Area 43 do not exist for the location Warehouse " "test.", + ) def tearDown(self): self.tmpdir.cleanup() @@ -840,10 +889,9 @@ class FindTest(FindInit, TestCase): def setUp(self): self.create_finds(force=True) - self.password = 'mypassword' - self.username = 'myuser' - User.objects.create_superuser(self.username, 'myemail@test.com', - self.password) + self.password = "mypassword" + self.username = "myuser" + User.objects.create_superuser(self.username, "myemail@test.com", self.password) self.client = Client() self.client.login(username=self.username, password=self.password) @@ -853,21 +901,20 @@ class FindTest(FindInit, TestCase): self.assertEqual( find.external_id, "{}-{}".format( - find.get_first_base_find().context_record.external_id, - find.label)) + find.get_first_base_find().context_record.external_id, find.label + ), + ) self.assertEqual( base_find.external_id, - "{}-{}".format( - base_find.context_record.external_id, - base_find.label)) + "{}-{}".format(base_find.context_record.external_id, base_find.label), + ) base_find.label = "New label" base_find.save() base_find = models.BaseFind.objects.get(pk=base_find.pk) self.assertEqual( base_find.external_id, - "{}-{}".format( - base_find.context_record.external_id, - "New label")) + "{}-{}".format(base_find.context_record.external_id, "New label"), + ) cr = ContextRecord.objects.get(pk=base_find.context_record.pk) cr.label = "new-label-too" cr.skip_history_when_saving = True @@ -893,22 +940,21 @@ class FindTest(FindInit, TestCase): # default: {get_first_base_find__context_record__external_id}-{label} self.assertEqual(find.external_id, "PAT-12345-A1-new-label-too-hop") profile = get_current_profile(force=True) - profile.find_external_id = \ - "{get_first_base_find__context_record__external_id}-{label}-"\ - "{label}" + profile.find_external_id = ( + "{get_first_base_find__context_record__external_id}-{label}-" "{label}" + ) profile.save() find.save() find = models.Find.objects.get(pk=find.pk) - self.assertEqual(find.external_id, - "PAT-12345-A1-new-label-too-hop-hop") - profile.find_external_id = \ - "{get_first_base_find__context_record__external_id}-{label}-" \ + self.assertEqual(find.external_id, "PAT-12345-A1-new-label-too-hop-hop") + profile.find_external_id = ( + "{get_first_base_find__context_record__external_id}-{label}-" "{label}||lower||deduplicate" + ) profile.save() find.save() find = models.Find.objects.get(pk=find.pk) - self.assertEqual(find.external_id, - "pat-12345-a1-new-label-too-hop") + self.assertEqual(find.external_id, "pat-12345-a1-new-label-too-hop") def testIndex(self): profile = get_current_profile() @@ -918,26 +964,29 @@ class FindTest(FindInit, TestCase): op1 = self.create_operation()[-1] op2 = self.create_operation()[-1] - op1_cr1 = self.create_context_record(data={'label': "CR1", - 'operation': op1})[-1] - op1_cr2 = self.create_context_record(data={'label': "CR2", - 'operation': op1})[-1] - op2_cr1 = self.create_context_record(data={'label': "CR3", - 'operation': op2})[-1] - self.create_finds(data_base={'context_record': op1_cr1}) + op1_cr1 = self.create_context_record(data={"label": "CR1", "operation": op1})[ + -1 + ] + op1_cr2 = self.create_context_record(data={"label": "CR2", "operation": op1})[ + -1 + ] + op2_cr1 = self.create_context_record(data={"label": "CR3", "operation": op2})[ + -1 + ] + self.create_finds(data_base={"context_record": op1_cr1}) find_1 = self.finds[-1] bf_1 = models.BaseFind.objects.get(pk=self.base_finds[-1].pk) self.assertEqual(find_1.index, 1) self.assertEqual(bf_1.index, 1) # index is based on operations - self.create_finds(data_base={'context_record': op1_cr2}) + self.create_finds(data_base={"context_record": op1_cr2}) find_2 = self.finds[-1] bf_2 = models.BaseFind.objects.get(pk=self.base_finds[-1].pk) self.assertEqual(find_2.index, 2) self.assertEqual(bf_2.index, 2) - self.create_finds(data_base={'context_record': op2_cr1}) + self.create_finds(data_base={"context_record": op2_cr1}) find_3 = self.finds[-1] bf_3 = models.BaseFind.objects.get(pk=self.base_finds[-1].pk) self.assertEqual(find_3.index, 1) @@ -949,24 +998,26 @@ class FindTest(FindInit, TestCase): profile = get_current_profile(force=True) op3 = self.create_operation()[-1] - op3_cr1 = self.create_context_record(data={'label': "CR1", - 'operation': op3})[-1] - op3_cr2 = self.create_context_record(data={'label': "CR2", - 'operation': op3})[-1] - self.create_finds(data_base={'context_record': op3_cr1}) + op3_cr1 = self.create_context_record(data={"label": "CR1", "operation": op3})[ + -1 + ] + op3_cr2 = self.create_context_record(data={"label": "CR2", "operation": op3})[ + -1 + ] + self.create_finds(data_base={"context_record": op3_cr1}) find_1b = self.finds[-1] bf_1b = models.BaseFind.objects.get(pk=self.base_finds[-1].pk) self.assertEqual(find_1b.index, 1) self.assertEqual(bf_1b.index, 1) # index now based on context records - self.create_finds(data_base={'context_record': op3_cr2}) + self.create_finds(data_base={"context_record": op3_cr2}) find_2b = self.finds[-1] bf_2b = models.BaseFind.objects.get(pk=self.base_finds[-1].pk) self.assertEqual(find_2b.index, 1) self.assertEqual(bf_2b.index, 1) - self.create_finds(data_base={'context_record': op3_cr2}) + self.create_finds(data_base={"context_record": op3_cr2}) find_3b = self.finds[-1] bf_3b = models.BaseFind.objects.get(pk=self.base_finds[-1].pk) self.assertEqual(find_3b.index, 2) @@ -974,17 +1025,18 @@ class FindTest(FindInit, TestCase): def test_show(self): obj = self.finds[0] - response = self.client.get(reverse('display-find', args=[obj.pk])) + response = self.client.get(reverse("display-find", args=[obj.pk])) self.assertEqual(response.status_code, 200) - self.assertIn('load_window("/show-find/{}/");'.format(obj.pk), - response.content.decode()) + self.assertIn( + 'load_window("/show-find/{}/");'.format(obj.pk), response.content.decode() + ) c = Client() - response = c.get(reverse('show-find', kwargs={'pk': obj.pk})) + response = c.get(reverse("show-find", kwargs={"pk": obj.pk})) # empty content when not allowed self.assertRedirects(response, "/") c.login(username=self.username, password=self.password) - response = self.client.get(reverse('show-find', kwargs={'pk': obj.pk})) + response = self.client.get(reverse("show-find", kwargs={"pk": obj.pk})) self.assertEqual(response.status_code, 200) self.assertIn(b'class="card sheet"', response.content) @@ -996,11 +1048,13 @@ class FindTest(FindInit, TestCase): self.finds[0].delete() # on delete the selected base find is not deleted if another find # is related to it - self.assertEqual(models.BaseFind.objects.filter( - pk=self.base_finds[0].pk).count(), 1) + self.assertEqual( + models.BaseFind.objects.filter(pk=self.base_finds[0].pk).count(), 1 + ) self.finds[1].delete() - self.assertEqual(models.BaseFind.objects.filter( - pk=self.base_finds[0].pk).count(), 0) + self.assertEqual( + models.BaseFind.objects.filter(pk=self.base_finds[0].pk).count(), 0 + ) def test_get_material_types(self): mat0 = models.MaterialType.objects.all()[0] @@ -1014,71 +1068,68 @@ class FindTest(FindInit, TestCase): find0.material_types.add(mat1) self.assertEqual( - find0.get_material_types(), - ", ".join(sorted([mat0.label, mat1.label]))) + find0.get_material_types(), ", ".join(sorted([mat0.label, mat1.label])) + ) self.assertEqual( - find0.get_material_types_code(), - "|".join(sorted([mat0.code, mat1.code]))) + find0.get_material_types_code(), "|".join(sorted([mat0.code, mat1.code])) + ) class FindSearchTest(FindInit, TestCase, SearchText): fixtures = WAREHOUSE_FIXTURES model = models.Find - SEARCH_URL = 'get-find' + SEARCH_URL = "get-find" def setUp(self): self.create_finds(force=True) self.create_finds(force=True) - self.username = 'myuser' - self.password = 'mypassword' - User.objects.create_superuser(self.username, 'myemail@test.com', - self.password) + self.username = "myuser" + self.password = "mypassword" + User.objects.create_superuser(self.username, "myemail@test.com", self.password) self.client = Client() def test_material_type_hierarchic_search(self): find = self.finds[0] c = Client() - metal = models.MaterialType.objects.get(txt_idx='metal') - iron_metal = models.MaterialType.objects.get(txt_idx='iron_metal') - not_iron_metal = models.MaterialType.objects.get( - txt_idx='not_iron_metal') + metal = models.MaterialType.objects.get(txt_idx="metal") + iron_metal = models.MaterialType.objects.get(txt_idx="iron_metal") + not_iron_metal = models.MaterialType.objects.get(txt_idx="not_iron_metal") find.material_types.add(iron_metal) find = models.Find.objects.get(pk=find.pk) find.save() - search = {'material_types': iron_metal.pk} + search = {"material_types": iron_metal.pk} # no result when no authentication - response = c.get(reverse('get-find'), search) + response = c.get(reverse("get-find"), search) self.assertRedirects(response, "/") c.login(username=self.username, password=self.password) # one result for exact search - response = c.get(reverse('get-find'), search) + response = c.get(reverse("get-find"), search) self.assertEqual(response.status_code, 200) content = response.content.decode() res = json.loads(content) - self.assertEqual(res['recordsTotal'], 1) - self.assertEqual(res["rows"][0]["cached_materials"], - str(iron_metal)) + self.assertEqual(res["recordsTotal"], 1) + self.assertEqual(res["rows"][0]["cached_materials"], str(iron_metal)) # no result for the brother - search = {'material_types': not_iron_metal.pk} - response = c.get(reverse('get-find'), search) + search = {"material_types": not_iron_metal.pk} + response = c.get(reverse("get-find"), search) self.assertEqual(response.status_code, 200) content = response.content.decode() - self.assertEqual(json.loads(content)['recordsTotal'], 0) + self.assertEqual(json.loads(content)["recordsTotal"], 0) # one result for the father - search = {'material_types': metal.pk} - response = c.get(reverse('get-find'), search) + search = {"material_types": metal.pk} + response = c.get(reverse("get-find"), search) self.assertEqual(response.status_code, 200) content = response.content.decode() - self.assertEqual(json.loads(content)['recordsTotal'], 1) + self.assertEqual(json.loads(content)["recordsTotal"], 1) # test on text search - material_key = str(pgettext_lazy("key for text search", 'material')) + material_key = str(pgettext_lazy("key for text search", "material")) result = [ ('{}="{}"'.format(material_key, str(iron_metal)), 1), ('{}="{}"'.format(material_key, str(not_iron_metal)), 0), @@ -1093,67 +1144,67 @@ class FindSearchTest(FindInit, TestCase, SearchText): # operation with no associated find operation = create_operation(self.user, values={"year": 2017}) c.get(reverse("pin", args=["operation", operation.pk])) - response = c.get(reverse('get-find'), {}) # empty search -> check pined + response = c.get(reverse("get-find"), {}) # empty search -> check pined self.assertEqual(response.status_code, 200) content = response.content.decode() - self.assertEqual(json.loads(content)['recordsTotal'], 0) + self.assertEqual(json.loads(content)["recordsTotal"], 0) # pinned operation with current find find = self.finds[0] - c.get(reverse( - "pin", - args=["operation", - find.get_first_base_find().context_record.operation.pk])) - response = c.get(reverse('get-find'), {}) # empty search -> check pined + c.get( + reverse( + "pin", + args=[ + "operation", + find.get_first_base_find().context_record.operation.pk, + ], + ) + ) + response = c.get(reverse("get-find"), {}) # empty search -> check pined self.assertEqual(response.status_code, 200) content = response.content.decode() - self.assertEqual(json.loads(content)['recordsTotal'], 1) + self.assertEqual(json.loads(content)["recordsTotal"], 1) def test_period_hierarchic_search(self): find = self.finds[0] c = Client() - neo = Period.objects.get(txt_idx='neolithic') - final_neo = Period.objects.get(txt_idx='final-neolithic') - recent_neo = Period.objects.get(txt_idx='recent-neolithic') - dating = Dating.objects.create( - period=final_neo - ) + neo = Period.objects.get(txt_idx="neolithic") + final_neo = Period.objects.get(txt_idx="final-neolithic") + recent_neo = Period.objects.get(txt_idx="recent-neolithic") + dating = Dating.objects.create(period=final_neo) find.datings.add(dating) find = models.Find.objects.get(pk=find.pk) find.save() - search = {'datings__period': final_neo.pk} + search = {"datings__period": final_neo.pk} # no result when no authentication - response = c.get(reverse('get-find'), search) + response = c.get(reverse("get-find"), search) self.assertRedirects(response, "/") # one result for exact search c.login(username=self.username, password=self.password) - response = c.get(reverse('get-find'), search) + response = c.get(reverse("get-find"), search) self.assertEqual(response.status_code, 200) res = json.loads(response.content.decode()) - self.assertEqual(res['recordsTotal'], 1) - self.assertEqual(res["rows"][0]["cached_periods"], - str(final_neo)) + self.assertEqual(res["recordsTotal"], 1) + self.assertEqual(res["rows"][0]["cached_periods"], str(final_neo)) # no result for the brother - search = {'datings__period': recent_neo.pk} - response = c.get(reverse('get-find'), search) + search = {"datings__period": recent_neo.pk} + response = c.get(reverse("get-find"), search) self.assertEqual(response.status_code, 200) - self.assertEqual( - json.loads(response.content.decode())['recordsTotal'], 0) + self.assertEqual(json.loads(response.content.decode())["recordsTotal"], 0) # one result for the father - search = {'datings__period': neo.pk} - response = c.get(reverse('get-find'), search) + search = {"datings__period": neo.pk} + response = c.get(reverse("get-find"), search) self.assertEqual(response.status_code, 200) - self.assertEqual( - json.loads(response.content.decode())['recordsTotal'], 1) + self.assertEqual(json.loads(response.content.decode())["recordsTotal"], 1) # test on text search - period_key = str(pgettext_lazy("key for text search", 'datings-period')) + period_key = str(pgettext_lazy("key for text search", "datings-period")) result = [ ('{}="{}"'.format(period_key, str(final_neo)), 1), ('{}="{}"'.format(period_key, str(recent_neo)), 0), @@ -1176,36 +1227,36 @@ class FindSearchTest(FindInit, TestCase, SearchText): find.conservatory_state = cs2 find.save() - search = {'search_vector': f'conservatory="{cs2.name}"'} + search = {"search_vector": f'conservatory="{cs2.name}"'} # no result when no authentication - response = c.get(reverse('get-find'), search) + response = c.get(reverse("get-find"), search) self.assertRedirects(response, "/") c.login(username=self.username, password=self.password) # one result for exact search - response = c.get(reverse('get-find'), search) + response = c.get(reverse("get-find"), search) self.assertEqual(response.status_code, 200) content = response.content.decode() - self.assertEqual(json.loads(content)['recordsTotal'], 1) + self.assertEqual(json.loads(content)["recordsTotal"], 1) # no result for the brother - search = {'search_vector': f'conservatory="{cs3.name}"'} - response = c.get(reverse('get-find'), search) + search = {"search_vector": f'conservatory="{cs3.name}"'} + response = c.get(reverse("get-find"), search) self.assertEqual(response.status_code, 200) content = response.content.decode() - self.assertEqual(json.loads(content)['recordsTotal'], 0) + self.assertEqual(json.loads(content)["recordsTotal"], 0) # one result for the father - search = {'search_vector': f'conservatory="{cs1.name}"'} - response = c.get(reverse('get-find'), search) + search = {"search_vector": f'conservatory="{cs1.name}"'} + response = c.get(reverse("get-find"), search) self.assertEqual(response.status_code, 200) content = response.content.decode() - self.assertEqual(json.loads(content)['recordsTotal'], 1) + self.assertEqual(json.loads(content)["recordsTotal"], 1) # test on text search - key = str(pgettext_lazy("key for text search", 'conservatory')) + key = str(pgettext_lazy("key for text search", "conservatory")) result = [ ('{}="{}"'.format(key, str(cs2)), 1), ('{}="{}"'.format(key, str(cs3)), 0), @@ -1216,27 +1267,30 @@ class FindSearchTest(FindInit, TestCase, SearchText): def test_image_search(self): c = Client() c.login(username=self.username, password=self.password) - search = {'documents__image__isnull': 2} # 2 for nullboolfield is None - response = c.get(reverse('get-find'), search) + search = {"documents__image__isnull": 2} # 2 for nullboolfield is None + response = c.get(reverse("get-find"), search) self.assertEqual(response.status_code, 200) res = json.loads(response.content.decode()) - self.assertEqual(res['recordsTotal'], 0) + self.assertEqual(res["recordsTotal"], 0) # add an image to the first find document = Document.objects.create(title="Image!") - image_path = settings.ROOT_PATH + \ - '../ishtar_common/static/media/images/ishtar-bg.jpg' + image_path = ( + settings.ROOT_PATH + "../ishtar_common/static/media/images/ishtar-bg.jpg" + ) document.image = SimpleUploadedFile( - name='ishtar-bg.jpg', content=open(image_path, 'rb').read(), - content_type='image/jpeg') + name="ishtar-bg.jpg", + content=open(image_path, "rb").read(), + content_type="image/jpeg", + ) document.save() self.finds[0].documents.add(document) self.finds[0].save() - response = c.get(reverse('get-find'), search) + response = c.get(reverse("get-find"), search) self.assertEqual(response.status_code, 200) res = json.loads(response.content.decode()) - self.assertEqual(res['recordsTotal'], 1) + self.assertEqual(res["recordsTotal"], 1) def test_search_with_callable(self): find = self.finds[0] @@ -1244,21 +1298,21 @@ class FindSearchTest(FindInit, TestCase, SearchText): c = Client() c.login(username=self.username, password=self.password) - loan_key = str(pgettext_lazy("key for text search", 'loan')) + loan_key = str(pgettext_lazy("key for text search", "loan")) result = [ ('{}="{}"'.format(loan_key, str(_("Yes"))), 0), ('{}="{}"'.format(loan_key, str(_("No"))), 0), - ] + ] self._test_search(c, result, context="No container defined") warehouse = Warehouse.objects.create( - name="Lambda warehouse", - warehouse_type=WarehouseType.objects.all()[0]) + name="Lambda warehouse", warehouse_type=WarehouseType.objects.all()[0] + ) container = Container.objects.create( location=warehouse, responsible=warehouse, - container_type=ContainerType.objects.all()[0] + container_type=ContainerType.objects.all()[0], ) find.container_ref = container find.container = container @@ -1266,7 +1320,7 @@ class FindSearchTest(FindInit, TestCase, SearchText): container2 = Container.objects.create( location=warehouse, responsible=warehouse, - container_type=ContainerType.objects.all()[0] + container_type=ContainerType.objects.all()[0], ) find2.container_ref = container2 find2.container = container2 @@ -1276,8 +1330,9 @@ class FindSearchTest(FindInit, TestCase, SearchText): ('{}="{}"'.format(loan_key, str(_("Yes"))), 0), ('{}="{}"'.format(loan_key, str(_("No"))), 2), ] - self._test_search(c, result, context="All container in their " - "reference location") + self._test_search( + c, result, context="All container in their " "reference location" + ) find2.container = container find2.save() @@ -1285,8 +1340,9 @@ class FindSearchTest(FindInit, TestCase, SearchText): ('{}="{}"'.format(loan_key, str(_("Yes"))), 1), ('{}="{}"'.format(loan_key, str(_("No"))), 1), ] - self._test_search(c, result, context="One container in his " - "reference location") + self._test_search( + c, result, context="One container in his " "reference location" + ) class FindAutocompleteTest(FindInit, TestCase): @@ -1298,10 +1354,9 @@ class FindAutocompleteTest(FindInit, TestCase): self.create_finds(force=True) self.create_finds(force=True) self.create_finds(force=True) - self.username = 'myuser' - self.password = 'mypassword' - User.objects.create_superuser(self.username, 'myemail@test.com', - self.password) + self.username = "myuser" + self.password = "mypassword" + User.objects.create_superuser(self.username, "myemail@test.com", self.password) self.client = Client() def test_autocomplete(self): @@ -1319,14 +1374,14 @@ class FindAutocompleteTest(FindInit, TestCase): find4.save() c = Client() c.login(username=self.username, password=self.password) - response = c.get(reverse('autocomplete-find') + "?term=12") + response = c.get(reverse("autocomplete-find") + "?term=12") self.assertEqual(response.status_code, 200) content = response.content.decode() res = json.loads(content) self.assertEqual(len(res), 3) - self.assertEqual(res[0]['id'], find2.pk) # " 12" - startswith - self.assertEqual(res[1]['id'], find.pk) # 12 - endswith - self.assertEqual(res[2]['id'], find4.pk) # 12 - contains + self.assertEqual(res[0]["id"], find2.pk) # " 12" - startswith + self.assertEqual(res[1]["id"], find.pk) # 12 - endswith + self.assertEqual(res[2]["id"], find4.pk) # 12 - contains class FindPermissionTest(FindInit, TestCase): @@ -1336,23 +1391,26 @@ class FindPermissionTest(FindInit, TestCase): def setUp(self): self.username, self.password, self.user = create_superuser() self.alt_username, self.alt_password, self.alt_user = create_user() - ct_find = ContentType.objects.get(app_label='archaeological_finds', - model='find') - self.alt_user.user_permissions.add(Permission.objects.get( - codename='view_own_find', content_type=ct_find)) - self.alt_user.user_permissions.add(Permission.objects.get( - codename='change_own_find', content_type=ct_find)) + ct_find = ContentType.objects.get( + app_label="archaeological_finds", model="find" + ) + self.alt_user.user_permissions.add( + Permission.objects.get(codename="view_own_find", content_type=ct_find) + ) + self.alt_user.user_permissions.add( + Permission.objects.get(codename="change_own_find", content_type=ct_find) + ) self.alt_username2, self.alt_password2, self.alt_user2 = create_user( - username='luke', password='iamyourfather' + username="luke", password="iamyourfather" ) profile = UserProfile.objects.create( - profile_type=ProfileType.objects.get(txt_idx='collaborator'), + profile_type=ProfileType.objects.get(txt_idx="collaborator"), person=self.alt_user2.ishtaruser.person, - current=True + current=True, ) - town = Town.objects.create(name='Tatouine', numero_insee='66000') - area = Area.objects.create(label='Galaxie', txt_idx='galaxie') + town = Town.objects.create(name="Tatouine", numero_insee="66000") + area = Area.objects.create(label="Galaxie", txt_idx="galaxie") area.towns.add(town) profile.areas.add(area) @@ -1361,18 +1419,20 @@ class FindPermissionTest(FindInit, TestCase): self.create_operation(self.alt_user, self.orgas[0]) self.create_context_record( - user=self.user, - data={"label": "CR 1", "operation": self.operations[0]}) + user=self.user, data={"label": "CR 1", "operation": self.operations[0]} + ) self.create_context_record( - user=self.alt_user, - data={"label": "CR 2", "operation": self.operations[1]}) + user=self.alt_user, data={"label": "CR 2", "operation": self.operations[1]} + ) self.cr_1 = self.context_records[-2] self.cr_2 = self.context_records[-1] - self.create_finds(data_base={'context_record': self.cr_1}, - user=self.user, force=True) - self.create_finds(data_base={'context_record': self.cr_2}, - user=self.alt_user, force=True) + self.create_finds( + data_base={"context_record": self.cr_1}, user=self.user, force=True + ) + self.create_finds( + data_base={"context_record": self.cr_2}, user=self.alt_user, force=True + ) self.find_1 = self.finds[-2] self.find_2 = self.finds[-1] @@ -1381,27 +1441,26 @@ class FindPermissionTest(FindInit, TestCase): def test_own_search(self): # no result when no authentification c = Client() - response = c.get(reverse('get-find')) - self.assertTrue(not response.content or - not json.loads(response.content)) + response = c.get(reverse("get-find")) + self.assertTrue(not response.content or not json.loads(response.content)) # possession c = Client() c.login(username=self.alt_username, password=self.alt_password) - response = c.get(reverse('get-find')) + response = c.get(reverse("get-find")) # only one "own" context record available content = response.content.decode() self.assertTrue(json.loads(content)) - self.assertEqual(json.loads(content)['recordsTotal'], 1) + self.assertEqual(json.loads(content)["recordsTotal"], 1) # area filter c = Client() c.login(username=self.alt_username2, password=self.alt_password2) - response = c.get(reverse('get-find')) + response = c.get(reverse("get-find")) # only one "own" operation available content = response.content.decode() self.assertTrue(json.loads(content)) - self.assertEqual(json.loads(content)['recordsTotal'], 1) + self.assertEqual(json.loads(content)["recordsTotal"], 1) class FindQATest(FindInit, TestCase): @@ -1413,17 +1472,16 @@ class FindQATest(FindInit, TestCase): self.create_finds(data_base={"label": "Find 2"}, force=True) self.username, self.password, self.user = create_superuser() self.alt_username, self.alt_password, self.alt_user = create_user() - self.alt_user.user_permissions.add(Permission.objects.get( - codename='change_find')) + self.alt_user.user_permissions.add( + Permission.objects.get(codename="change_find") + ) def test_duplicate(self): t1, __ = models.Treatment.objects.get_or_create( - label="Treatment 1", - treatment_state=models.TreatmentState.objects.all()[0] + label="Treatment 1", treatment_state=models.TreatmentState.objects.all()[0] ) t2, __ = models.Treatment.objects.get_or_create( - label="Treatment 1", - treatment_state=models.TreatmentState.objects.all()[0] + label="Treatment 1", treatment_state=models.TreatmentState.objects.all()[0] ) find = self.finds[0] default_desc = "Description for duplicate" @@ -1435,9 +1493,9 @@ class FindQATest(FindInit, TestCase): find.treatments.add(t2) c = Client() - url = reverse('find-qa-duplicate', args=[find.pk]) + url = reverse("find-qa-duplicate", args=[find.pk]) response = c.get(url) - self.assertRedirects(response, '/') + self.assertRedirects(response, "/") c = Client() c.login(username=self.username, password=self.password) @@ -1449,19 +1507,16 @@ class FindQATest(FindInit, TestCase): response = c.get(url) self.assertEqual(response.status_code, 200) - data = { - "denomination": "clone", - "label": "clone - free id" - } + data = {"denomination": "clone", "label": "clone - free id"} nb_find = models.Find.objects.count() nb_bf = models.BaseFind.objects.count() response = c.post(url, data) self.assertEqual(response.status_code, 302) # success redirect self.assertEqual(models.Find.objects.count(), nb_find + 1) self.assertEqual(models.BaseFind.objects.count(), nb_bf + 1) - new = models.Find.objects.order_by('-pk').all()[0] + new = models.Find.objects.order_by("-pk").all()[0] self.assertEqual(new.description, default_desc) - new_bf = models.BaseFind.objects.order_by('-pk').all()[0] + new_bf = models.BaseFind.objects.order_by("-pk").all()[0] base_bf = find.get_first_base_find() self.assertEqual(new_bf.context_record, base_bf.context_record) self.assertNotIn(d, list(new.documents.all())) @@ -1473,17 +1528,17 @@ class FindQATest(FindInit, TestCase): def test_bulk_update(self): c = Client() pks = "{}-{}".format(self.finds[0].pk, self.finds[1].pk) - response = c.get(reverse('find-qa-bulk-update', args=[pks])) - self.assertRedirects(response, '/') + response = c.get(reverse("find-qa-bulk-update", args=[pks])) + self.assertRedirects(response, "/") c = Client() c.login(username=self.username, password=self.password) - response = c.get(reverse('find-qa-bulk-update', args=[pks])) + response = c.get(reverse("find-qa-bulk-update", args=[pks])) self.assertEqual(response.status_code, 200) c = Client() c.login(username=self.alt_username, password=self.alt_password) - response = c.get(reverse('find-qa-bulk-update', args=[pks])) + response = c.get(reverse("find-qa-bulk-update", args=[pks])) self.assertEqual(response.status_code, 200) find_0 = self.finds[0] @@ -1496,51 +1551,45 @@ class FindQATest(FindInit, TestCase): find_1.save() period = Period.objects.all()[0].pk - self.assertNotIn(period, - [dating.period.pk for dating in find_0.datings.all()]) - self.assertNotIn(period, - [dating.period.pk for dating in find_1.datings.all()]) + self.assertNotIn(period, [dating.period.pk for dating in find_0.datings.all()]) + self.assertNotIn(period, [dating.period.pk for dating in find_1.datings.all()]) extra_desc = "Extra description" response = c.post( - reverse('find-qa-bulk-update-confirm', args=[pks]), - {'qa_period': period, 'qa_description': extra_desc} + reverse("find-qa-bulk-update-confirm", args=[pks]), + {"qa_period": period, "qa_description": extra_desc}, ) if response.status_code != 200: - self.assertRedirects(response, '/success/') - self.assertIn(period, - [dating.period.pk for dating in find_0.datings.all()]) - self.assertIn(period, - [dating.period.pk for dating in find_1.datings.all()]) - self.assertEqual(models.Find.objects.get(pk=find_0.pk).description, - base_desc_0 + "\n" + extra_desc) - self.assertEqual(models.Find.objects.get(pk=find_1.pk).description, - base_desc_1 + "\n" + extra_desc) + self.assertRedirects(response, "/success/") + self.assertIn(period, [dating.period.pk for dating in find_0.datings.all()]) + self.assertIn(period, [dating.period.pk for dating in find_1.datings.all()]) + self.assertEqual( + models.Find.objects.get(pk=find_0.pk).description, + base_desc_0 + "\n" + extra_desc, + ) + self.assertEqual( + models.Find.objects.get(pk=find_1.pk).description, + base_desc_1 + "\n" + extra_desc, + ) def test_basket(self): find_0 = self.finds[0] find_1 = self.finds[1] nb_basket = models.FindBasket.objects.count() - url = reverse('find-qa-basket', args=[find_0.pk]) + url = reverse("find-qa-basket", args=[find_0.pk]) c = Client() response = c.get(url) - self.assertRedirects(response, '/') + self.assertRedirects(response, "/") c.login(username=self.username, password=self.password) response = c.get(url) self.assertEqual(response.status_code, 200) label = "Test - basket" - data = { - "qa_bf_create_or_update": "create", - "qa_bf_label": label - } + data = {"qa_bf_create_or_update": "create", "qa_bf_label": label} response = c.post(url, data) if response.status_code != 200: - self.assertRedirects(response, '/success/') - self.assertEqual( - nb_basket + 1, - models.FindBasket.objects.count()) - q = models.FindBasket.objects.filter( - user=self.user.ishtaruser, label=label) + self.assertRedirects(response, "/success/") + self.assertEqual(nb_basket + 1, models.FindBasket.objects.count()) + q = models.FindBasket.objects.filter(user=self.user.ishtaruser, label=label) self.assertEqual(q.count(), 1) # no duplicate with same user, same name c.post(url, data) @@ -1549,12 +1598,9 @@ class FindQATest(FindInit, TestCase): self.assertEqual(basket.items.count(), 1) # update - url = reverse('find-qa-basket', args=[find_1.pk]) + url = reverse("find-qa-basket", args=[find_1.pk]) self.assertEqual(basket.items.count(), 1) - data = { - "qa_bf_create_or_update": "update", - "qa_bf_basket": basket.pk - } + data = {"qa_bf_create_or_update": "update", "qa_bf_basket": basket.pk} c.post(url, data) self.assertEqual(basket.items.count(), 2) self.assertIn(find_1, list(basket.items.all())) @@ -1578,11 +1624,12 @@ class FindQATest(FindInit, TestCase): find_0 = self.finds[0] find_1 = self.finds[1] pks = "{}-{}".format(find_0.pk, find_1.pk) - url = reverse('find-qa-packaging', args=[pks]) + url = reverse("find-qa-packaging", args=[pks]) response = c.get(url) - self.assertRedirects(response, '/') + self.assertRedirects(response, "/") profile, created = IshtarSiteProfile.objects.get_or_create( - slug='default', active=True) + slug="default", active=True + ) profile.warehouse = False profile.save() @@ -1603,60 +1650,61 @@ class FindQATest(FindInit, TestCase): self.assertEqual(response.status_code, 200) main_warehouse = Warehouse.objects.create( - name="Main", - warehouse_type=WarehouseType.objects.all()[0] + name="Main", warehouse_type=WarehouseType.objects.all()[0] ) container = Container.objects.create( - reference="Test", responsible=main_warehouse, + reference="Test", + responsible=main_warehouse, location=main_warehouse, - container_type=ContainerType.objects.all()[0] + container_type=ContainerType.objects.all()[0], ) container2 = Container.objects.create( - reference="Test2", responsible=main_warehouse, + reference="Test2", + responsible=main_warehouse, location=main_warehouse, - container_type=ContainerType.objects.all()[0] + container_type=ContainerType.objects.all()[0], ) - packaging = models.TreatmentType.objects.get(txt_idx='packaging') + packaging = models.TreatmentType.objects.get(txt_idx="packaging") packaging.change_reference_location = True packaging.save() data_check_lst = [ - ({ - 'qa-packaging-container': container.pk, - 'qa-packaging-container_to_change': 'reference', - }, - { - 'container_ref': container, - 'container': None - }, 0), - ({ - 'qa-packaging-container': container2.pk, - 'qa-packaging-container_to_change': 'current', - }, - { - 'container_ref': None, - 'container': container2 - }, 0), - ({ - 'qa-packaging-container': container.pk, - 'qa-packaging-container_to_change': 'current-and-reference', - }, - { - 'container_ref': container, - 'container': container - }, 0), - ({ - 'qa-packaging-container': container2.pk, - 'qa-packaging-container_to_change': 'reference', - 'qa-packaging-create_treatment': True, - 'qa-packaging-year': 2019, - 'qa-packaging-treatment_type': packaging.pk - }, - { - 'container_ref': container2, - 'container': None - }, 1), + ( + { + "qa-packaging-container": container.pk, + "qa-packaging-container_to_change": "reference", + }, + {"container_ref": container, "container": None}, + 0, + ), + ( + { + "qa-packaging-container": container2.pk, + "qa-packaging-container_to_change": "current", + }, + {"container_ref": None, "container": container2}, + 0, + ), + ( + { + "qa-packaging-container": container.pk, + "qa-packaging-container_to_change": "current-and-reference", + }, + {"container_ref": container, "container": container}, + 0, + ), + ( + { + "qa-packaging-container": container2.pk, + "qa-packaging-container_to_change": "reference", + "qa-packaging-create_treatment": True, + "qa-packaging-year": 2019, + "qa-packaging-treatment_type": packaging.pk, + }, + {"container_ref": container2, "container": None}, + 1, + ), ] for data, check, nb_treat in data_check_lst: @@ -1670,10 +1718,8 @@ class FindQATest(FindInit, TestCase): init_nb_treat = models.Treatment.objects.count() - response = c.post( - reverse('find-qa-packaging', args=[pks]), - data) - self.assertRedirects(response, '/success/') + response = c.post(reverse("find-qa-packaging", args=[pks]), data) + self.assertRedirects(response, "/success/") for k in check: find = models.Find.objects.get(pk=find_0.pk) self.assertEqual(getattr(find, k), check[k]) @@ -1696,31 +1742,29 @@ class FindHistoryTest(FindInit, TestCase): def _add_datings(self, find): d1_attrs = { - "period": Period.objects.get(txt_idx='neolithic'), + "period": Period.objects.get(txt_idx="neolithic"), "start_date": 5000, - 'end_date': 5001, - 'dating_type': DatingType.objects.get( - txt_idx='from_absolute_dating'), - "quality": DatingQuality.objects.get(txt_idx='sure'), - "precise_dating": "Blah !!!" + "end_date": 5001, + "dating_type": DatingType.objects.get(txt_idx="from_absolute_dating"), + "quality": DatingQuality.objects.get(txt_idx="sure"), + "precise_dating": "Blah !!!", } d1 = Dating.objects.create(**d1_attrs) d2_attrs = { - "period": Period.objects.get(txt_idx='paleolithic'), + "period": Period.objects.get(txt_idx="paleolithic"), } d2 = Dating.objects.create(**d2_attrs) d1_dct, d2_dct = {}, {} for k in Dating.HISTORY_ATTR: - for dct, attr in ((d1_dct, d1_attrs) , - (d2_dct, d2_attrs)): + for dct, attr in ((d1_dct, d1_attrs), (d2_dct, d2_attrs)): if k in attr: - if hasattr(attr[k], 'txt_idx'): + if hasattr(attr[k], "txt_idx"): dct[k] = attr[k].txt_idx else: dct[k] = str(attr[k]) else: - dct[k] = '' + dct[k] = "" find.datings.add(d1) find.datings.add(d2) @@ -1730,8 +1774,8 @@ class FindHistoryTest(FindInit, TestCase): find = self.finds[0] user = self.get_default_user() - ceram = models.MaterialType.objects.get(txt_idx='ceramic').pk - glass = models.MaterialType.objects.get(txt_idx='glass').pk + ceram = models.MaterialType.objects.get(txt_idx="ceramic").pk + glass = models.MaterialType.objects.get(txt_idx="glass").pk find = models.Find.objects.get(pk=find.pk) nb_hist = find.history.count() @@ -1745,49 +1789,50 @@ class FindHistoryTest(FindInit, TestCase): find = models.Find.objects.get(pk=find.pk) self.assertIsNotNone(find.history_m2m) - self.assertIn('material_types', find.history_m2m) + self.assertIn("material_types", find.history_m2m) self.assertIn( - find.history_m2m['material_types'], - [['ceramic', 'glass'], # order do not - ['glass', 'ceramic']]) # matter - self.assertIn('datings', find.history_m2m) + find.history_m2m["material_types"], + [["ceramic", "glass"], ["glass", "ceramic"]], # order do not + ) # matter + self.assertIn("datings", find.history_m2m) self.assertIn( - find.history_m2m['datings'], - [[d1_txt, d2_txt], # order do not - [d2_txt, d1_txt]]) # matter + find.history_m2m["datings"], + [[d1_txt, d2_txt], [d2_txt, d1_txt]], # order do not + ) # matter self.assertEqual(find.history.count(), nb_hist + 1) - historical_material_types = find.history_m2m['material_types'] + historical_material_types = find.history_m2m["material_types"] find = models.Find.objects.get(pk=find.pk) find.label = "hop hop hop2" find.history_modifier = user - if hasattr(find, 'skip_history_when_saving'): - delattr(find, 'skip_history_when_saving') + if hasattr(find, "skip_history_when_saving"): + delattr(find, "skip_history_when_saving") find._force_history = True find.save() find.material_types.remove(ceram) find.datings.clear() find = models.Find.objects.get(pk=find.pk) - self.assertEqual(find.history_m2m['material_types'], ['glass']) - self.assertEqual(find.history_m2m['datings'], []) + self.assertEqual(find.history_m2m["material_types"], ["glass"]) + self.assertEqual(find.history_m2m["datings"], []) self.assertEqual(find.history.count(), nb_hist + 2) - self.assertEqual(find.history.all()[1].history_m2m['material_types'], - historical_material_types) - self.assertEqual(find.history.all()[0].history_m2m['material_types'], - ["glass"]) + self.assertEqual( + find.history.all()[1].history_m2m["material_types"], + historical_material_types, + ) + self.assertEqual(find.history.all()[0].history_m2m["material_types"], ["glass"]) def _init_m2m(self, find, user): - ceram = models.MaterialType.objects.get(txt_idx='ceramic').pk - glass = models.MaterialType.objects.get(txt_idx='glass').pk + ceram = models.MaterialType.objects.get(txt_idx="ceramic").pk + glass = models.MaterialType.objects.get(txt_idx="glass").pk find = models.Find.objects.get(pk=find.pk) find.history_modifier = user find.label = "hop hop hop1" find._force_history = True - if hasattr(find, 'skip_history_when_saving'): - delattr(find, 'skip_history_when_saving') + if hasattr(find, "skip_history_when_saving"): + delattr(find, "skip_history_when_saving") find.save() find.material_types.add(ceram) find.material_types.add(glass) @@ -1797,8 +1842,8 @@ class FindHistoryTest(FindInit, TestCase): find.history_modifier = user find.label = "hop hop hop2" find._force_history = True - if hasattr(find, 'skip_history_when_saving'): - delattr(find, 'skip_history_when_saving') + if hasattr(find, "skip_history_when_saving"): + delattr(find, "skip_history_when_saving") find.save() find.datings.clear() find.material_types.remove(ceram) @@ -1810,32 +1855,35 @@ class FindHistoryTest(FindInit, TestCase): self._init_m2m(find, user) find = models.Find.objects.get(pk=find.pk) - history_date = find.history.order_by('-history_date').all()[ - 1].history_date.strftime('%Y-%m-%dT%H:%M:%S.%f') + history_date = ( + find.history.order_by("-history_date") + .all()[1] + .history_date.strftime("%Y-%m-%dT%H:%M:%S.%f") + ) c.login(username=self.username, password=self.password) - response = c.get(reverse('show-find', - kwargs={'pk': find.pk})) + response = c.get(reverse("show-find", kwargs={"pk": find.pk})) self.assertEqual(response.status_code, 200) self.assertIn(b'class="card sheet"', response.content) - content = response.content.decode('utf-8') - self.assertNotIn( - Period.objects.get(txt_idx='neolithic').label, content) + content = response.content.decode("utf-8") + self.assertNotIn(Period.objects.get(txt_idx="neolithic").label, content) self.assertNotIn("5001", content) - response = c.get(reverse('show-historized-find', - kwargs={'pk': find.pk, - 'date': history_date})) + response = c.get( + reverse( + "show-historized-find", kwargs={"pk": find.pk, "date": history_date} + ) + ) self.assertEqual(response.status_code, 200) - content = response.content.decode('utf-8') + content = response.content.decode("utf-8") self.assertIn('class="card sheet"', content) self.assertIn( - models.MaterialType.objects.get(txt_idx='ceramic').label, content, - msg="ceramic not found in historical sheet") - self.assertIn("5001", content, msg="5001 not found in historical " - "sheet") - self.assertIn( - Period.objects.get(txt_idx='neolithic').label, content) + models.MaterialType.objects.get(txt_idx="ceramic").label, + content, + msg="ceramic not found in historical sheet", + ) + self.assertIn("5001", content, msg="5001 not found in historical " "sheet") + self.assertIn(Period.objects.get(txt_idx="neolithic").label, content) def test_m2m_history_restore(self): user = self.get_default_user() @@ -1843,16 +1891,15 @@ class FindHistoryTest(FindInit, TestCase): self._init_m2m(find, user) find = models.Find.objects.get(pk=find.pk) - ceram = models.MaterialType.objects.get(txt_idx='ceramic') - glass = models.MaterialType.objects.get(txt_idx='glass') + ceram = models.MaterialType.objects.get(txt_idx="ceramic") + glass = models.MaterialType.objects.get(txt_idx="glass") materials = list(find.material_types.all()) self.assertNotIn(ceram, materials) self.assertIn(glass, materials) self.assertEqual(list(find.datings.all()), []) - history_date = find.history.order_by('-history_date').all()[ - 1].history_date + history_date = find.history.order_by("-history_date").all()[1].history_date find.rollback(history_date) find = models.Find.objects.get(pk=find.pk) @@ -1865,10 +1912,10 @@ class FindHistoryTest(FindInit, TestCase): dating_dct = {} for k in self.d1_dct.keys(): if not getattr(dating, k): - dating_dct[k] = '' + dating_dct[k] = "" continue dating_dct[k] = getattr(dating, k) - if hasattr(dating_dct[k], 'txt_idx'): + if hasattr(dating_dct[k], "txt_idx"): dating_dct[k] = dating_dct[k].txt_idx dating_dct[k] = str(dating_dct[k]) @@ -1883,31 +1930,34 @@ class TreatmentTest(FindInit, TestCase): model = models.Find def setUp(self): - base_img = settings.ROOT_PATH + \ - '../ishtar_common/static/media/images/ishtar-bg.jpg' + base_img = ( + settings.ROOT_PATH + "../ishtar_common/static/media/images/ishtar-bg.jpg" + ) temp_dir = tempfile.gettempdir() - img = os.path.join(temp_dir, 'ishtar-bg.jpg') + img = os.path.join(temp_dir, "ishtar-bg.jpg") shutil.copy2(base_img, img) self.create_finds(data_base={"label": "Find 1"}, force=True) self.create_finds(data_base={"label": "Find 2"}, force=True) image = Document.objects.create(title="Image!") - image.image.save('ishtar-bg.jpg', File(open(img, "rb"))) + image.image.save("ishtar-bg.jpg", File(open(img, "rb"))) self.finds[0].documents.add(image) self.finds[0].save() self.basket = models.FindBasket.objects.create( - label="My basket", user=IshtarUser.objects.get( - pk=self.get_default_user().pk)) + label="My basket", + user=IshtarUser.objects.get(pk=self.get_default_user().pk), + ) self.other_basket = models.FindBasket.objects.create( - label="My other basket", user=IshtarUser.objects.get( - pk=self.get_default_user().pk)) + label="My other basket", + user=IshtarUser.objects.get(pk=self.get_default_user().pk), + ) for find in self.finds: self.basket.items.add(find) self.other_basket.items.add(find) def test_packaging_with_new_find_creation(self): - treatment_type = models.TreatmentType.objects.get(txt_idx='packaging') + treatment_type = models.TreatmentType.objects.get(txt_idx="packaging") # make packaging a treatment with a new version of the find created treatment_type.create_new_find = True treatment_type.save() @@ -1918,45 +1968,52 @@ class TreatmentTest(FindInit, TestCase): first_find = self.finds[0] completed, created = models.TreatmentState.objects.get_or_create( - txt_idx='completed', defaults={"executed": True, "label": "Done"} + txt_idx="completed", defaults={"executed": True, "label": "Done"} ) completed.executed = True completed.save() treatment.treatment_state = completed treatment.save( - user=self.get_default_user(), items=self.basket, + user=self.get_default_user(), + items=self.basket, treatment_type_list=[treatment_type], ) treatment.treatment_types.add(treatment_type) - self.assertEqual(items_nb + self.basket.items.count(), - models.Find.objects.count(), - msg="Packaging doesn't generate enough new finds") + self.assertEqual( + items_nb + self.basket.items.count(), + models.Find.objects.count(), + msg="Packaging doesn't generate enough new finds", + ) resulting_find = models.Find.objects.get( upstream_treatment__upstream=first_find, - base_finds__pk=first_find.base_finds.all()[0].pk + base_finds__pk=first_find.base_finds.all()[0].pk, ) # image names used to be altered on save: check for this bug self.assertEqual( resulting_find.documents.all()[0].title, - models.Find.objects.get(pk=first_find.pk).documents.all()[0].title + models.Find.objects.get(pk=first_find.pk).documents.all()[0].title, ) # new version of the find is in the basket for item in self.basket.items.all(): self.assertNotIn( - item, self.finds, - msg="Original basket have not been upgraded after packaging") + item, + self.finds, + msg="Original basket have not been upgraded after packaging", + ) for item in self.other_basket.items.all(): self.assertNotIn( - item, self.finds, - msg="Other basket have not been upgraded after packaging") + item, + self.finds, + msg="Other basket have not been upgraded after packaging", + ) def test_simple_delete(self): - treatment_type = models.TreatmentType.objects.get(txt_idx='packaging') + treatment_type = models.TreatmentType.objects.get(txt_idx="packaging") treatment_type.create_new_find = False treatment_type.save() @@ -1966,14 +2023,15 @@ class TreatmentTest(FindInit, TestCase): initial_find = self.finds[0] completed, created = models.TreatmentState.objects.get_or_create( - txt_idx='completed', defaults={"executed": True, "label": "Done"} + txt_idx="completed", defaults={"executed": True, "label": "Done"} ) completed.executed = True completed.save() treatment.treatment_state = completed treatment.save( - user=self.get_default_user(), items=self.basket, + user=self.get_default_user(), + items=self.basket, treatment_type_list=[treatment_type], ) treatment.treatment_types.add(treatment_type) @@ -1981,8 +2039,7 @@ class TreatmentTest(FindInit, TestCase): self.assertEqual(nb_find, models.Find.objects.count()) treatment.delete() - self.assertEqual( - models.Treatment.objects.filter(pk=treatment.pk).count(), 0) + self.assertEqual(models.Treatment.objects.filter(pk=treatment.pk).count(), 0) q = models.Find.objects.filter(pk=initial_find.pk) # initial find not deleted @@ -1991,7 +2048,7 @@ class TreatmentTest(FindInit, TestCase): self.assertEqual(initial_find.upstream_treatment, None) def test_upstream_find_delete(self): - treatment_type = models.TreatmentType.objects.get(txt_idx='packaging') + treatment_type = models.TreatmentType.objects.get(txt_idx="packaging") # make packaging a treatment with a new version of the find created treatment_type.create_new_find = True treatment_type.save() @@ -2002,30 +2059,29 @@ class TreatmentTest(FindInit, TestCase): initial_find = self.finds[0] completed, created = models.TreatmentState.objects.get_or_create( - txt_idx='completed', defaults={"executed": True, "label": "Done"} + txt_idx="completed", defaults={"executed": True, "label": "Done"} ) completed.executed = True completed.save() treatment.treatment_state = completed treatment.save( - user=self.get_default_user(), items=self.basket, + user=self.get_default_user(), + items=self.basket, treatment_type_list=[treatment_type], ) treatment.treatment_types.add(treatment_type) nb_b = self.basket.items.count() - self.assertEqual( - nb_find + nb_b, models.Find.objects.count()) + self.assertEqual(nb_find + nb_b, models.Find.objects.count()) resulting_find = models.Find.objects.get( upstream_treatment__upstream=initial_find, - base_finds__pk=initial_find.base_finds.all()[0].pk + base_finds__pk=initial_find.base_finds.all()[0].pk, ) resulting_find.delete() - self.assertEqual( - models.Treatment.objects.filter(pk=treatment.pk).count(), 0) + self.assertEqual(models.Treatment.objects.filter(pk=treatment.pk).count(), 0) q = models.Find.objects.filter(pk=initial_find.pk) # initial find not deleted self.assertEqual(q.count(), 1) @@ -2033,7 +2089,7 @@ class TreatmentTest(FindInit, TestCase): self.assertEqual(initial_find.upstream_treatment, None) def test_treatment_delete(self): - treatment_type = models.TreatmentType.objects.get(txt_idx='packaging') + treatment_type = models.TreatmentType.objects.get(txt_idx="packaging") treatment_type.create_new_find = True treatment_type.save() @@ -2043,28 +2099,27 @@ class TreatmentTest(FindInit, TestCase): initial_find = self.finds[0] completed, created = models.TreatmentState.objects.get_or_create( - txt_idx='completed', defaults={"executed": True, "label": "Done"} + txt_idx="completed", defaults={"executed": True, "label": "Done"} ) completed.executed = True completed.save() treatment.treatment_state = completed treatment.save( - user=self.get_default_user(), items=self.basket, + user=self.get_default_user(), + items=self.basket, treatment_type_list=[treatment_type], ) treatment.treatment_types.add(treatment_type) nb_b = self.basket.items.count() - self.assertEqual( - nb_find + nb_b, models.Find.objects.count()) + self.assertEqual(nb_find + nb_b, models.Find.objects.count()) treatment.delete() self.assertEqual(nb_find, models.Find.objects.count()) - self.assertEqual( - models.Treatment.objects.filter(pk=treatment.pk).count(), 0) + self.assertEqual(models.Treatment.objects.filter(pk=treatment.pk).count(), 0) q = models.Find.objects.filter(pk=initial_find.pk) # initial find not deleted self.assertEqual(q.count(), 1) @@ -2081,12 +2136,12 @@ class GeomaticTest(FindInit, TestCase): self.create_finds(data_base={"label": "Find 1"}, force=True) def test_point_precision(self): - self.username = 'myuser' - self.password = 'mypassword' - User.objects.create_superuser(self.username, 'myemail@test.com', - self.password) + self.username = "myuser" + self.password = "mypassword" + User.objects.create_superuser(self.username, "myemail@test.com", self.password) profile, created = IshtarSiteProfile.objects.get_or_create( - slug='default', active=True) + slug="default", active=True + ) profile.mapping = True profile.save() wgs84 = SpatialReferenceSystem.objects.get(srid=4326) @@ -2101,19 +2156,18 @@ class GeomaticTest(FindInit, TestCase): find = base_find.find.all()[0] c = Client() c.login(username=self.username, password=self.password) - response = c.get( - reverse('show-find', kwargs={'pk': find.pk})) - self.assertIn(b'33.12999', response.content) + response = c.get(reverse("show-find", kwargs={"pk": find.pk})) + self.assertIn(b"33.12999", response.content) profile.point_precision = 2 profile.save() - response = c.get( - reverse('show-find', kwargs={'pk': find.pk})) - self.assertIn(b'33.13', response.content) + response = c.get(reverse("show-find", kwargs={"pk": find.pk})) + self.assertIn(b"33.13", response.content) def test_update_container_localisation_on_warehouse_update(self): profile, created = IshtarSiteProfile.objects.get_or_create( - slug='default', active=True) + slug="default", active=True + ) profile.mapping = True profile.save() wgs84 = SpatialReferenceSystem.objects.get(srid=4326) @@ -2122,17 +2176,15 @@ class GeomaticTest(FindInit, TestCase): base_find = find.base_finds.all()[0] self.assertEqual(base_find.x, None) - operation = Operation.objects.get( - pk=base_find.context_record.operation.pk - ) + operation = Operation.objects.get(pk=base_find.context_record.operation.pk) operation.x, operation.y = 33, 42 operation.spatial_reference_system = wgs84 operation.save() # an update is pending for the linked context record q = ContextRecord.objects.filter( - pk=base_find.context_record.pk, - need_update=True) + pk=base_find.context_record.pk, need_update=True + ) self.assertEqual(q.count(), 1) # process pending update @@ -2163,15 +2215,15 @@ class GeomaticTest(FindInit, TestCase): base_find = find.base_finds.all()[0] srs, __ = SpatialReferenceSystem.objects.get_or_create( - txt_idx='wgs84', defaults={"srid": 4326, "label": 'WGS84', - 'auth_name': 'EPSG'} + txt_idx="wgs84", + defaults={"srid": 4326, "label": "WGS84", "auth_name": "EPSG"}, ) profile = get_current_profile() profile.mapping = True profile.save() # db source - geom = GEOSGeometry('POINT({} {} {})'.format(2, 43, 1), srid=4326) + geom = GEOSGeometry("POINT({} {} {})".format(2, 43, 1), srid=4326) base_find.point = geom base_find.save() base_find = models.BaseFind.objects.get(pk=base_find.pk) @@ -2180,9 +2232,10 @@ class GeomaticTest(FindInit, TestCase): self.assertIsNotNone(base_find.x) self.assertIsNotNone(base_find.y) self.assertIsNotNone(base_find.z) - self.assertEqual(base_find.point_source, 'P') # precise - self.assertEqual(base_find.point_source_item, - str(models.BaseFind._meta.verbose_name)) + self.assertEqual(base_find.point_source, "P") # precise + self.assertEqual( + base_find.point_source_item, str(models.BaseFind._meta.verbose_name) + ) # re-save do not change sources base_find.save() @@ -2192,9 +2245,10 @@ class GeomaticTest(FindInit, TestCase): self.assertIsNotNone(base_find.x) self.assertIsNotNone(base_find.y) self.assertIsNotNone(base_find.z) - self.assertEqual(base_find.point_source, 'P') # precise - self.assertEqual(base_find.point_source_item, - str(models.BaseFind._meta.verbose_name)) + self.assertEqual(base_find.point_source, "P") # precise + self.assertEqual( + base_find.point_source_item, str(models.BaseFind._meta.verbose_name) + ) # form input base_find.x = 2 @@ -2205,17 +2259,19 @@ class GeomaticTest(FindInit, TestCase): base_find = models.BaseFind.objects.get(pk=base_find.pk) self.assertIsNotNone(base_find.point_2d) self.assertIsNotNone(base_find.point) - self.assertEqual(base_find.point_source, 'P') # precise - self.assertEqual(base_find.point_source_item, - str(models.BaseFind._meta.verbose_name)) + self.assertEqual(base_find.point_source, "P") # precise + self.assertEqual( + base_find.point_source_item, str(models.BaseFind._meta.verbose_name) + ) # re-save do not change sources base_find.save() base_find = models.BaseFind.objects.get(pk=base_find.pk) self.assertIsNotNone(base_find.point_2d) self.assertIsNotNone(base_find.point) - self.assertEqual(base_find.point_source, 'P') # precise - self.assertEqual(base_find.point_source_item, - str(models.BaseFind._meta.verbose_name)) + self.assertEqual(base_find.point_source, "P") # precise + self.assertEqual( + base_find.point_source_item, str(models.BaseFind._meta.verbose_name) + ) # reinit base_find.x = None @@ -2229,18 +2285,21 @@ class GeomaticTest(FindInit, TestCase): self.assertEqual(base_find.point_source_item, None) profile, created = IshtarSiteProfile.objects.get_or_create( - slug='default', active=True) + slug="default", active=True + ) profile.use_town_for_geo = True profile.save() # geom from context record town - center = 'POINT(6 10)' - limit = 'MULTIPOLYGON(((1 1,5 1,5 5,1 5,1 1),(2 2,2 3,3 3,3 2,2 2)),'\ - '((6 3,9 2,9 4,6 3)))' + center = "POINT(6 10)" + limit = ( + "MULTIPOLYGON(((1 1,5 1,5 5,1 5,1 1),(2 2,2 3,3 3,3 2,2 2))," + "((6 3,9 2,9 4,6 3)))" + ) cr = ContextRecord.objects.get(pk=base_find.context_record.pk) t = cr.town - t.center = 'SRID=4326;' + center - t.limit = 'SRID=4326;' + limit + t.center = "SRID=4326;" + center + t.limit = "SRID=4326;" + limit t.save() cr = ContextRecord.objects.get(pk=base_find.context_record.pk) base_find = models.BaseFind.objects.get(pk=base_find.pk) @@ -2252,9 +2311,10 @@ class GeomaticTest(FindInit, TestCase): tp.transform(4326) self.assertLess(bfp.distance(tp), 0.0001) self.assertEqual(base_find.multi_polygon, cr.town.limit) - self.assertEqual(base_find.point_source, 'T') # town - self.assertEqual(base_find.point_source_item, - str(ContextRecord._meta.verbose_name)) + self.assertEqual(base_find.point_source, "T") # town + self.assertEqual( + base_find.point_source_item, str(ContextRecord._meta.verbose_name) + ) # re-save do not change sources base_find.save() base_find = models.BaseFind.objects.get(pk=base_find.pk) @@ -2264,15 +2324,16 @@ class GeomaticTest(FindInit, TestCase): tp.transform(4326) self.assertTrue(bfp.distance(tp) < 0.0001) self.assertEqual(base_find.multi_polygon, cr.town.limit) - self.assertEqual(base_find.point_source, 'T') # town - self.assertEqual(base_find.point_source_item, - str(ContextRecord._meta.verbose_name)) + self.assertEqual(base_find.point_source, "T") # town + self.assertEqual( + base_find.point_source_item, str(ContextRecord._meta.verbose_name) + ) # geom from context record - center = 'POINT(8 6)' + center = "POINT(8 6)" cr = ContextRecord.objects.get(pk=base_find.context_record.pk) - cr.point_2d = 'SRID=4326;' + center - cr.point_source = 'P' + cr.point_2d = "SRID=4326;" + center + cr.point_source = "P" cr.point_source_item = str(ContextRecord._meta.verbose_name) cr.save() cr = ContextRecord.objects.get(pk=base_find.context_record.pk) @@ -2289,9 +2350,10 @@ class GeomaticTest(FindInit, TestCase): tp.transform(4326) self.assertTrue(bfp.distance(tp) < 0.0001) self.assertEqual(base_find.multi_polygon, cr.multi_polygon) - self.assertEqual(base_find.point_source, 'P') # precise - self.assertEqual(base_find.point_source_item, - str(ContextRecord._meta.verbose_name)) + self.assertEqual(base_find.point_source, "P") # precise + self.assertEqual( + base_find.point_source_item, str(ContextRecord._meta.verbose_name) + ) # overload of coordinates by form base_find = models.BaseFind.objects.get(pk=base_find.pk) @@ -2304,19 +2366,21 @@ class GeomaticTest(FindInit, TestCase): base_find = models.BaseFind.objects.get(pk=base_find.pk) self.assertIsNotNone(base_find.point_2d) self.assertIsNotNone(base_find.point) - self.assertEqual(base_find.point_2d.wkt, 'POINT (5 6)') - self.assertEqual(base_find.point_source, 'P') # precise - self.assertEqual(base_find.point_source_item, - str(models.BaseFind._meta.verbose_name)) + self.assertEqual(base_find.point_2d.wkt, "POINT (5 6)") + self.assertEqual(base_find.point_source, "P") # precise + self.assertEqual( + base_find.point_source_item, str(models.BaseFind._meta.verbose_name) + ) # re-save do not change sources base_find.save() base_find = models.BaseFind.objects.get(pk=base_find.pk) self.assertIsNotNone(base_find.point_2d) self.assertIsNotNone(base_find.point) - self.assertEqual(base_find.point_2d.wkt, 'POINT (5 6)') - self.assertEqual(base_find.point_source, 'P') # precise - self.assertEqual(base_find.point_source_item, - str(models.BaseFind._meta.verbose_name)) + self.assertEqual(base_find.point_2d.wkt, "POINT (5 6)") + self.assertEqual(base_find.point_source, "P") # precise + self.assertEqual( + base_find.point_source_item, str(models.BaseFind._meta.verbose_name) + ) def test_post_save_polygon(self): profile = get_current_profile() @@ -2326,16 +2390,18 @@ class GeomaticTest(FindInit, TestCase): find = self.finds[0] base_find = find.base_finds.all()[0] srs, __ = SpatialReferenceSystem.objects.get_or_create( - txt_idx='wgs84', defaults={"srid": 4326, "label": 'WGS84', - 'auth_name': 'EPSG'} + txt_idx="wgs84", + defaults={"srid": 4326, "label": "WGS84", "auth_name": "EPSG"}, ) base_find = models.BaseFind.objects.get(pk=base_find.pk) # get centroid geom from poly - limit = 'MULTIPOLYGON(((1 1,5 1,5 5,1 5,1 1),(2 2,2 3,3 3,3 2,2 2)),' \ - '((6 3,9 2,9 4,6 3)))' - base_find.multi_polygon = 'SRID=4326;' + limit + limit = ( + "MULTIPOLYGON(((1 1,5 1,5 5,1 5,1 1),(2 2,2 3,3 3,3 2,2 2))," + "((6 3,9 2,9 4,6 3)))" + ) + base_find.multi_polygon = "SRID=4326;" + limit base_find.point_source = None base_find.point_2d = None base_find.point = None @@ -2343,19 +2409,21 @@ class GeomaticTest(FindInit, TestCase): base_find = models.BaseFind.objects.get(pk=base_find.pk) self.assertIsNotNone(base_find.point_2d) - self.assertEqual(base_find.point_source, 'M') # from multi polygon + self.assertEqual(base_find.point_source, "M") # from multi polygon # resaving do not change source base_find.save() base_find = models.BaseFind.objects.get(pk=base_find.pk) self.assertIsNotNone(base_find.point_2d) - self.assertEqual(base_find.point_source, 'M') # from multi polygon + self.assertEqual(base_find.point_source, "M") # from multi polygon # geom from context record - limit = 'MULTIPOLYGON(((1 1,5 1,5 5,1 5,1 1),(2 2,2 3,3 3,3 2,2 2)),' \ - '((6 3,9 2,9 4,6 3)))' + limit = ( + "MULTIPOLYGON(((1 1,5 1,5 5,1 5,1 1),(2 2,2 3,3 3,3 2,2 2))," + "((6 3,9 2,9 4,6 3)))" + ) cr = ContextRecord.objects.get(pk=base_find.context_record.pk) - cr.multi_polygon = 'SRID=4326;' + limit - cr.multi_polygon_source = 'P' + cr.multi_polygon = "SRID=4326;" + limit + cr.multi_polygon_source = "P" cr.multi_polygon_source_item = str(ContextRecord._meta.verbose_name) cr.save() cr = ContextRecord.objects.get(pk=base_find.context_record.pk) @@ -2364,9 +2432,10 @@ class GeomaticTest(FindInit, TestCase): base_find.save() base_find = models.BaseFind.objects.get(pk=base_find.pk) self.assertEqual(base_find.multi_polygon, cr.multi_polygon) - self.assertEqual(base_find.multi_polygon_source, 'P') # precise - self.assertEqual(base_find.multi_polygon_source_item, - str(ContextRecord._meta.verbose_name)) + self.assertEqual(base_find.multi_polygon_source, "P") # precise + self.assertEqual( + base_find.multi_polygon_source_item, str(ContextRecord._meta.verbose_name) + ) base_find = models.BaseFind.objects.get(pk=base_find.pk) base_find.point_source = None @@ -2376,42 +2445,50 @@ class GeomaticTest(FindInit, TestCase): base_find.save() base_find = models.BaseFind.objects.get(pk=base_find.pk) self.assertEqual(base_find.point_2d.ewkt, "SRID=4326;POINT (42 3)") - self.assertEqual(base_find.point_source, 'P') + self.assertEqual(base_find.point_source, "P") # resaving do not change source base_find.save() base_find = models.BaseFind.objects.get(pk=base_find.pk) self.assertEqual(base_find.point_2d.ewkt, "SRID=4326;POINT (42 3)") - self.assertEqual(base_find.point_source, 'P') + self.assertEqual(base_find.point_source, "P") class AutocompleteTest(AutocompleteTestBase, TestCase): fixtures = FIND_FIXTURES models = [ - AcItem(models.ObjectType, 'autocomplete-objecttype'), - AcItem(models.MaterialType, 'autocomplete-materialtype'), - AcItem(models.TreatmentType, 'autocomplete-treatmenttype', - default_values={"virtual": False}), - AcItem(models.IntegrityType, 'autocomplete-integritytype'), - AcItem(models.TreatmentFile, 'autocomplete-treatmentfile', - prepare_func="create_treatmentfile"), - AcItem(models.FindBasket, 'autocomplete-findbasket', - prepare_func="create_findbasket"), - AcItem(models.Find, 'autocomplete-find', prepare_func="create_find"), - AcItem(models.Treatment, 'autocomplete-treatment', - prepare_func='create_treatment'), + AcItem(models.ObjectType, "autocomplete-objecttype"), + AcItem(models.MaterialType, "autocomplete-materialtype"), + AcItem( + models.TreatmentType, + "autocomplete-treatmenttype", + default_values={"virtual": False}, + ), + AcItem(models.IntegrityType, "autocomplete-integritytype"), + AcItem( + models.TreatmentFile, + "autocomplete-treatmentfile", + prepare_func="create_treatmentfile", + ), + AcItem( + models.FindBasket, + "autocomplete-findbasket", + prepare_func="create_findbasket", + ), + AcItem(models.Find, "autocomplete-find", prepare_func="create_find"), + AcItem( + models.Treatment, "autocomplete-treatment", prepare_func="create_treatment" + ), ] def create_treatmentfile(self, base_name): item, __ = models.TreatmentFile.objects.get_or_create( - name=base_name, - type=models.TreatmentFileType.objects.all()[0] + name=base_name, type=models.TreatmentFileType.objects.all()[0] ) return item, None def create_treatment(self, base_name): item, __ = models.Treatment.objects.get_or_create( - label=base_name, - treatment_state=models.TreatmentState.objects.all()[0] + label=base_name, treatment_state=models.TreatmentState.objects.all()[0] ) return item, None @@ -2425,13 +2502,9 @@ class AutocompleteTest(AutocompleteTestBase, TestCase): def create_find(self, base_name): ope, __ = Operation.objects.get_or_create( - common_name="Test", - operation_type=OperationType.objects.all()[0] - ) - cr, __ = ContextRecord.objects.get_or_create( - operation=ope, - label=base_name + common_name="Test", operation_type=OperationType.objects.all()[0] ) + cr, __ = ContextRecord.objects.get_or_create(operation=ope, label=base_name) base_find = models.BaseFind.objects.create(context_record=cr) find = models.Find.objects.create( label=base_name, @@ -2447,38 +2520,44 @@ class PublicAPITest(FindInit, APITestCase): def setUp(self): self.create_finds(data_base={"label": "Find 1"}, force=True) self.basket = models.FindBasket.objects.create( - slug="my-basket", label="My basket", - user=IshtarUser.objects.get(pk=self.get_default_user().pk)) + slug="my-basket", + label="My basket", + user=IshtarUser.objects.get(pk=self.get_default_user().pk), + ) for find in self.finds: self.basket.items.add(find) - self.username = 'myuser' - self.password = 'mypassword' - user = User.objects.create_user(self.username, 'myemail@test.com', - self.password) - self.auth_token = 'Token '+ Token.objects.create(user=user).key + self.username = "myuser" + self.password = "mypassword" + user = User.objects.create_user( + self.username, "myemail@test.com", self.password + ) + self.auth_token = "Token " + Token.objects.create(user=user).key def test_authentication(self): - url = reverse('api-public-find') + "?basket=my-basket" - response = self.client.get(url, format='json') + url = reverse("api-public-find") + "?basket=my-basket" + response = self.client.get(url, format="json") self.assertEqual(response.status_code, 401) - response = self.client.get(url, format='json', - HTTP_AUTHORIZATION=self.auth_token) + response = self.client.get( + url, format="json", HTTP_AUTHORIZATION=self.auth_token + ) self.assertEqual(response.status_code, 200) def test_basket(self): # unknown basket - url = reverse('api-public-find') + "?basket=non-exist-basket" - response = self.client.get(url, format='json', - HTTP_AUTHORIZATION=self.auth_token) + url = reverse("api-public-find") + "?basket=non-exist-basket" + response = self.client.get( + url, format="json", HTTP_AUTHORIZATION=self.auth_token + ) self.assertEqual(response.status_code, 200) content = response.content.decode() res = json.loads(content) self.assertEqual(res, []) # basket is not public - url = reverse('api-public-find') + "?basket=my-basket" - response = self.client.get(url, format='json', - HTTP_AUTHORIZATION=self.auth_token) + url = reverse("api-public-find") + "?basket=my-basket" + response = self.client.get( + url, format="json", HTTP_AUTHORIZATION=self.auth_token + ) self.assertEqual(response.status_code, 200) content = response.content.decode() res = json.loads(content) @@ -2487,8 +2566,9 @@ class PublicAPITest(FindInit, APITestCase): # ok self.basket.public = True self.basket.save() - response = self.client.get(url, format='json', - HTTP_AUTHORIZATION=self.auth_token) + response = self.client.get( + url, format="json", HTTP_AUTHORIZATION=self.auth_token + ) self.assertEqual(response.status_code, 200) content = response.content.decode() res = json.loads(content) @@ -2497,26 +2577,31 @@ class PublicAPITest(FindInit, APITestCase): def test_basket_content(self): find = self.finds[0] find.denomination = "denomination" - ceram = models.MaterialType.objects.get(txt_idx='ceramic') + ceram = models.MaterialType.objects.get(txt_idx="ceramic") find.material_types.add(ceram) find.save() - url = reverse('api-public-find') + "?basket=my-basket" + url = reverse("api-public-find") + "?basket=my-basket" self.basket.public = True self.basket.save() - response = self.client.get(url, format='json', - HTTP_AUTHORIZATION=self.auth_token) + response = self.client.get( + url, format="json", HTTP_AUTHORIZATION=self.auth_token + ) self.assertEqual(response.status_code, 200) content = response.content.decode() res = json.loads(content) expected_results = [ - ((0, 'denomination',), 'denomination'), - ((0, 'materials', 0), 'Céramique'), - ((0, 'base-finds', 0, 'context-record', 'label'), - 'Context record'), - ((0, 'base-finds', 0, 'context-record', 'town'), - 'default_town (12345)'), - ((0, 'base-finds', 0, 'context-record', 'operation', 'year'), 2010), + ( + ( + 0, + "denomination", + ), + "denomination", + ), + ((0, "materials", 0), "Céramique"), + ((0, "base-finds", 0, "context-record", "label"), "Context record"), + ((0, "base-finds", 0, "context-record", "town"), "default_town (12345)"), + ((0, "base-finds", 0, "context-record", "operation", "year"), 2010), ] for path, result in expected_results: path = list(reversed(path)) @@ -2537,19 +2622,24 @@ class LabelTest(FindInit, TestCase): def setUp(self): templates = [ - settings.ROOT_PATH + '../archaeological_finds/tests/' + t - for t in ("etiquettes-mobilier.odt", "etiquettes-mobilier", - "etiquettes-mobilier.txt", "bad_lo.zip", - "truncated_xml.zip") + settings.ROOT_PATH + "../archaeological_finds/tests/" + t + for t in ( + "etiquettes-mobilier.odt", + "etiquettes-mobilier", + "etiquettes-mobilier.txt", + "bad_lo.zip", + "truncated_xml.zip", + ) ] self.templates = [] for template in templates: filename = template.split("/")[-1] - shutil.copy(template, - os.path.join(settings.MEDIA_ROOT, filename), - follow_symlinks=True) - self.templates.append( - os.path.join(settings.MEDIA_ROOT, filename)) + shutil.copy( + template, + os.path.join(settings.MEDIA_ROOT, filename), + follow_symlinks=True, + ) + self.templates.append(os.path.join(settings.MEDIA_ROOT, filename)) def tearDown(self): for tpl in self.templates: @@ -2563,19 +2653,22 @@ class LabelTest(FindInit, TestCase): (base_tpl, base_targets, True, "OK"), (base_tpl, "", False, "no target"), (base_tpl, "-;Cadre2;Cadre3", False, "bad first target"), - (base_tpl, "Cadre1;Frame2;Frame3", True, - "first target OK, silently failed other targets"), + ( + base_tpl, + "Cadre1;Frame2;Frame3", + True, + "first target OK, silently failed other targets", + ), (missing_ext, base_targets, True, "missing extension"), (text_file, base_targets, False, "text file"), (bad_lo, base_targets, False, "missing content.xml"), (trunc_xml, base_targets, False, "truncated content.xml"), ) for tpl_file, targets, is_ok, msg in dataset: - with open(tpl_file, 'rb') as tpl: - template = SimpleUploadedFile("etiquettes-mobilier.odt", - tpl.read()) + with open(tpl_file, "rb") as tpl: + template = SimpleUploadedFile("etiquettes-mobilier.odt", tpl.read()) model, __ = ImporterModel.objects.get_or_create( - klass='archaeological_finds.models.Find' + klass="archaeological_finds.models.Find" ) q = DocumentTemplate.objects.filter(slug="test") if q.count(): @@ -2586,7 +2679,8 @@ class LabelTest(FindInit, TestCase): associated_model=model, available=True, label_targets=targets, - label_template=template) + label_template=template, + ) self.templates.append(doc.label_template.path) doc = DocumentTemplate.objects.get(pk=doc.pk) msg = "Fail on dataset: " + msg @@ -2602,22 +2696,19 @@ class TemplateTest(FindInit, TestCase): model = models.Find def setUp(self): - template = settings.ROOT_PATH + \ - '../archaeological_finds/tests/notices-panier.odt' + template = ( + settings.ROOT_PATH + "../archaeological_finds/tests/notices-panier.odt" + ) filename = template.split("/")[-1] - shutil.copy(template, - os.path.join(settings.MEDIA_ROOT, filename), - follow_symlinks=True) + shutil.copy( + template, os.path.join(settings.MEDIA_ROOT, filename), follow_symlinks=True + ) self.template = os.path.join(settings.MEDIA_ROOT, filename) self.templates = [self.template] ope1 = self.create_operation()[0] ope2 = self.create_operation()[1] - cr = self.create_context_record( - data={"label": "CR 1", "operation": ope1} - )[0] - cr2 = self.create_context_record( - data={"label": "CR 2", "operation": ope2} - )[1] + cr = self.create_context_record(data={"label": "CR 1", "operation": ope1})[0] + cr2 = self.create_context_record(data={"label": "CR 2", "operation": ope2})[1] self.create_finds(data_base={"context_record": cr})[0] self.create_finds(data_base={"context_record": cr2})[1] self.basket = models.FindBasket.objects.create(label="Hophop") @@ -2627,17 +2718,14 @@ class TemplateTest(FindInit, TestCase): location = Warehouse.objects.create(name="Warehouse", warehouse_type=wt) ct, __ = ContainerType.objects.get_or_create(label="CT", txt_idx="CT") self.container = Container.objects.create( - location=location, - reference="Reférence", - container_type=ct + location=location, reference="Reférence", container_type=ct ) def test_label(self): - with open(self.template, 'rb') as tpl: - template = SimpleUploadedFile("template.odt", - tpl.read()) + with open(self.template, "rb") as tpl: + template = SimpleUploadedFile("template.odt", tpl.read()) model, __ = ImporterModel.objects.get_or_create( - klass='archaeological_finds.models.Find' + klass="archaeological_finds.models.Find" ) q = DocumentTemplate.objects.filter(slug="test") if q.count(): @@ -2647,7 +2735,8 @@ class TemplateTest(FindInit, TestCase): slug="test", associated_model=model, available=True, - template=template) + template=template, + ) self.templates.append(doc.template.path) doc = DocumentTemplate.objects.get(pk=doc.pk) diff --git a/archaeological_finds/urls.py b/archaeological_finds/urls.py index 7bf85d9a4..8d49e7acb 100644 --- a/archaeological_finds/urls.py +++ b/archaeological_finds/urls.py @@ -1,4 +1,4 @@ -#!/usr/bin/env python +#!/usr/bin/env python3 # -*- coding: utf-8 -*- # Copyright (C) 2010-2016 Étienne Loks <etienne.loks_AT_peacefrogsDOTnet> @@ -29,316 +29,545 @@ from archaeological_finds import models # forms urlpatterns = [ - url(r'find_search/(?P<step>.+)?$', - check_rights(['view_find', 'view_own_find'])( - views.find_search_wizard), name='find_search'), - url(r'find_creation/(?P<step>.+)?$', - check_rights(['add_find', 'add_own_find'])( - views.find_creation_wizard), name='find_creation'), - url(r'find_modification/(?P<step>.+)?$', - check_rights(['change_find', 'change_own_find'])( - views.find_modification_wizard), name='find_modification'), - url(r'find_modify/(?P<pk>.+)/$', - views.find_modify, name='find_modify'), - url(r'find_deletion/(?P<step>.+)?$', - check_rights(['change_find', 'change_own_find'])( - views.find_deletion_wizard), name='find_deletion'), - url(r'find_delete/(?P<pk>.+)/$', - views.find_delete, name='delete-find'), - url(r'^find-qa-duplicate/(?P<pks>[0-9-]+)?/$', - check_rights(['change_find', 'change_own_find'])( - views.QAFindDuplicateFormView.as_view()), - name='find-qa-duplicate'), - url(r'get-findbasket/$', views.get_find_basket, - name='get-findbasket'), - url(r'get-findbasket-write/$', views.get_find_basket_for_write, - name='get-findbasket-write'), - url(r'find_basket_search/(?P<step>.+)?$', - check_rights(['view_find', 'view_own_find'])( - views.basket_search_wizard), name='find_basket_search'), - url(r'^find_basket_creation/$', - check_rights(['view_find', 'view_own_find'])( - views.NewFindBasketView.as_view()), name='new_findbasket'), - url(r'^find_basket_modification/(?P<step>.+)?$', - check_rights(['view_find', 'view_own_find'])( - views.basket_modify_wizard), - name='find_basket_modification'), - url(r'find_basket_modify/(?P<pk>.+)/$', - views.find_basket_modify, name='find_basket_modify'), - url(r'^find_basket_modification_add/$', - check_rights(['view_find', 'view_own_find'])( - views.SelectBasketForManagement.as_view()), - name='select_findbasketforadd'), - url(r'^find_basket_modification_add/(?P<pk>[0-9]+)?/$', - check_rights(['view_find', 'view_own_find'])( - views.SelectItemsInBasket.as_view()), - name='select_itemsinbasket'), - url(r'^find_basket_modification_add_item/$', - check_rights(['view_find', 'view_own_find'])( - views.FindBasketAddItemView.as_view()), - name='add_iteminbasket'), - url(r'^find_basket_modification_delete_item/(?P<basket>[0-9]+)?' - r'/(?P<find_pk>[0-9]+)?/$', - check_rights(['view_find', 'view_own_find'])( - views.FindBasketDeleteItemView.as_view()), - name='delete_iteminbasket'), - url(r'^find_basket_list/(?P<pk>[0-9]+)?/$', - check_rights(['view_find', 'view_own_find'])( - views.FindBasketListView.as_view()), - name='list_iteminbasket'), - url(r'^find_basket_deletion/(?P<step>.+)?$', - check_rights(['view_find', 'view_own_find'])( - views.basket_delete_wizard), - name='find_basket_deletion'), - url(r'^findbasket-qa-duplicate/(?P<pks>[0-9-]+)?/$', - check_rights(['view_find', 'view_own_find'])( - views.QAFindbasketDuplicateFormView.as_view()), - name='findbasket-qa-duplicate'), - - url(r'^findbasket-add-treatment/(?P<pk>[0-9-]+)/$', - check_rights(['change_find', 'change_own_find'])( - views.findbasket_treatment_add), - name='findbasket-add-treatment'), - url(r'^findbasket-add-treatmentfile/(?P<pk>[0-9-]+)/$', + url( + r"find_search/(?P<step>.+)?$", + check_rights(["view_find", "view_own_find"])(views.find_search_wizard), + name="find_search", + ), + url( + r"find_creation/(?P<step>.+)?$", + check_rights(["add_find", "add_own_find"])(views.find_creation_wizard), + name="find_creation", + ), + url( + r"find_modification/(?P<step>.+)?$", + check_rights(["change_find", "change_own_find"])( + views.find_modification_wizard + ), + name="find_modification", + ), + url(r"find_modify/(?P<pk>.+)/$", views.find_modify, name="find_modify"), + url( + r"find_deletion/(?P<step>.+)?$", + check_rights(["change_find", "change_own_find"])(views.find_deletion_wizard), + name="find_deletion", + ), + url(r"find_delete/(?P<pk>.+)/$", views.find_delete, name="delete-find"), + url( + r"^find-qa-duplicate/(?P<pks>[0-9-]+)?/$", + check_rights(["change_find", "change_own_find"])( + views.QAFindDuplicateFormView.as_view() + ), + name="find-qa-duplicate", + ), + url(r"get-findbasket/$", views.get_find_basket, name="get-findbasket"), + url( + r"get-findbasket-write/$", + views.get_find_basket_for_write, + name="get-findbasket-write", + ), + url( + r"find_basket_search/(?P<step>.+)?$", + check_rights(["view_find", "view_own_find"])(views.basket_search_wizard), + name="find_basket_search", + ), + url( + r"^find_basket_creation/$", + check_rights(["view_find", "view_own_find"])(views.NewFindBasketView.as_view()), + name="new_findbasket", + ), + url( + r"^find_basket_modification/(?P<step>.+)?$", + check_rights(["view_find", "view_own_find"])(views.basket_modify_wizard), + name="find_basket_modification", + ), + url( + r"find_basket_modify/(?P<pk>.+)/$", + views.find_basket_modify, + name="find_basket_modify", + ), + url( + r"^find_basket_modification_add/$", + check_rights(["view_find", "view_own_find"])( + views.SelectBasketForManagement.as_view() + ), + name="select_findbasketforadd", + ), + url( + r"^find_basket_modification_add/(?P<pk>[0-9]+)?/$", + check_rights(["view_find", "view_own_find"])( + views.SelectItemsInBasket.as_view() + ), + name="select_itemsinbasket", + ), + url( + r"^find_basket_modification_add_item/$", + check_rights(["view_find", "view_own_find"])( + views.FindBasketAddItemView.as_view() + ), + name="add_iteminbasket", + ), + url( + r"^find_basket_modification_delete_item/(?P<basket>[0-9]+)?" + r"/(?P<find_pk>[0-9]+)?/$", + check_rights(["view_find", "view_own_find"])( + views.FindBasketDeleteItemView.as_view() + ), + name="delete_iteminbasket", + ), + url( + r"^find_basket_list/(?P<pk>[0-9]+)?/$", + check_rights(["view_find", "view_own_find"])( + views.FindBasketListView.as_view() + ), + name="list_iteminbasket", + ), + url( + r"^find_basket_deletion/(?P<step>.+)?$", + check_rights(["view_find", "view_own_find"])(views.basket_delete_wizard), + name="find_basket_deletion", + ), + url( + r"^findbasket-qa-duplicate/(?P<pks>[0-9-]+)?/$", + check_rights(["view_find", "view_own_find"])( + views.QAFindbasketDuplicateFormView.as_view() + ), + name="findbasket-qa-duplicate", + ), + url( + r"^findbasket-add-treatment/(?P<pk>[0-9-]+)/$", + check_rights(["change_find", "change_own_find"])( + views.findbasket_treatment_add + ), + name="findbasket-add-treatment", + ), + url( + r"^findbasket-add-treatmentfile/(?P<pk>[0-9-]+)/$", check_rights(["add_treatmentfile", "add_own_treatmentfile"])( - views.findbasket_treatmentfile_add), - name='findbasket-add-treatmentfile'), - - url(r'^find-add-treatment/(?P<pk>[0-9-]+)/$', - check_rights(['change_find', 'change_own_find'])( - views.find_treatment_add), - name='find-add-treatment'), - url(r'^find-add-divide-treatment/(?P<pk>[0-9-]+)/$', - check_rights(['change_find', 'change_own_find'])( - views.find_divide_treatment_add), - name='find-add-divide-treatment'), - url(r'^treatmentfile-add-treatment/(?P<pk>[0-9-]+)/$', - check_rights(['change_find', 'change_own_find'])( - views.treatmentfile_treatment_add), - name='treatmentfile-add-treatment'), - url(r'^treatment-add-adminact/(?P<pk>[0-9-]+)/$', - check_rights(['add_administrativeact'])( - views.treatment_adminact_add), - name='treatment-add-adminact'), - - url(r'^treatmentfile-add-adminact/(?P<pk>[0-9-]+)/$', - check_rights(['add_administrativeact'])( - views.treatmentfile_adminact_add), - name='treatmentfile-add-adminact'), - - url(r'^find-qa-bulk-update/(?P<pks>[0-9-]+)?/$', - check_rights(['change_find', 'change_own_find'])( - views.QAFindForm.as_view()), - name='find-qa-bulk-update'), - url(r'^find-qa-bulk-update/(?P<pks>[0-9-]+)?/confirm/$', - check_rights(['change_find', 'change_own_find'])( - views.QAFindForm.as_view()), - name='find-qa-bulk-update-confirm', kwargs={"confirm": True}), - url(r'^find-qa-basket/(?P<pks>[0-9-]+)?/$', - check_rights(['change_find', 'change_own_find'])( - views.QAFindBasketFormView.as_view()), - name='find-qa-basket'), - - url(r'^find-qa-packaging/(?P<pks>[0-9-]+)?/$', - check_rights(['change_find', 'change_own_find'])( - views.QAFindTreatmentFormView.as_view()), - name='find-qa-packaging'), - - url(r'^find-qa-lock/(?P<pks>[0-9-]+)?/$', - views.QAFindLockView.as_view(), name='find-qa-lock', - kwargs={"model": models.Find}), - - url(r'^treatment_creation/(?P<step>.+)?$', - check_rights(['change_find', 'change_own_find'])( - views.treatment_creation_wizard), name='treatment_creation'), - url(r'^treatment_creation_n1/(?P<step>.+)?$', - check_rights(['change_find', 'change_own_find'])( - views.treatment_creation_n1_wizard), name='treatment_creation_n1'), - url(r'^treatment_creation_1n/(?P<step>.+)?$', - check_rights(['change_find', 'change_own_find'])( - views.treatment_creation_1n_wizard), name='treatment_creation_1n'), - - url(r'^treatment_modification/(?P<step>.+)?$', - check_rights(['change_find', 'change_own_find'])( - views.treatment_modification_wizard), - name='treatment_modification'), - url(r'treatment_modify/(?P<pk>.+)/$', - views.treatment_modify, name='treatment_modify'), - url(r'^treatment_search/(?P<step>.+)?$', - check_rights(['view_find', 'view_own_find'])( - views.treatment_search_wizard), name='treatment_search'), - url(r'^treatment_deletion/(?P<step>.+)?$', - check_rights(['change_find', 'change_own_find'])( - views.treatment_deletion_wizard), name='treatment_deletion'), - url(r'treatment_delete/(?P<pk>.+)/$', - views.treatment_delete, name='delete-treatment'), - - url(r'^treatment_admacttreatment_search/(?P<step>.+)?$', - check_rights(['change_administrativeact'])( - views.treatment_administrativeact_search_wizard), - name='treatment_admacttreatment_search'), - url(r'^treatment_admacttreatment/(?P<step>.+)?$', - check_rights(['change_administrativeact'])( - views.treatment_administrativeact_wizard), - name='treatment_admacttreatment'), - url(r'^treatment_admacttreatment_modification/(?P<step>.+)?$', - check_rights(['change_administrativeact'])( - views.treatment_administrativeact_modification_wizard), - name='treatment_admacttreatment_modification'), - url(r'^treatment_administrativeacttreatment_modify/(?P<pk>.+)/$', + views.findbasket_treatmentfile_add + ), + name="findbasket-add-treatmentfile", + ), + url( + r"^find-add-treatment/(?P<pk>[0-9-]+)/$", + check_rights(["change_find", "change_own_find"])(views.find_treatment_add), + name="find-add-treatment", + ), + url( + r"^find-add-divide-treatment/(?P<pk>[0-9-]+)/$", + check_rights(["change_find", "change_own_find"])( + views.find_divide_treatment_add + ), + name="find-add-divide-treatment", + ), + url( + r"^treatmentfile-add-treatment/(?P<pk>[0-9-]+)/$", + check_rights(["change_find", "change_own_find"])( + views.treatmentfile_treatment_add + ), + name="treatmentfile-add-treatment", + ), + url( + r"^treatment-add-adminact/(?P<pk>[0-9-]+)/$", + check_rights(["add_administrativeact"])(views.treatment_adminact_add), + name="treatment-add-adminact", + ), + url( + r"^treatmentfile-add-adminact/(?P<pk>[0-9-]+)/$", + check_rights(["add_administrativeact"])(views.treatmentfile_adminact_add), + name="treatmentfile-add-adminact", + ), + url( + r"^find-qa-bulk-update/(?P<pks>[0-9-]+)?/$", + check_rights(["change_find", "change_own_find"])(views.QAFindForm.as_view()), + name="find-qa-bulk-update", + ), + url( + r"^find-qa-bulk-update/(?P<pks>[0-9-]+)?/confirm/$", + check_rights(["change_find", "change_own_find"])(views.QAFindForm.as_view()), + name="find-qa-bulk-update-confirm", + kwargs={"confirm": True}, + ), + url( + r"^find-qa-basket/(?P<pks>[0-9-]+)?/$", + check_rights(["change_find", "change_own_find"])( + views.QAFindBasketFormView.as_view() + ), + name="find-qa-basket", + ), + url( + r"^find-qa-packaging/(?P<pks>[0-9-]+)?/$", + check_rights(["change_find", "change_own_find"])( + views.QAFindTreatmentFormView.as_view() + ), + name="find-qa-packaging", + ), + url( + r"^find-qa-lock/(?P<pks>[0-9-]+)?/$", + views.QAFindLockView.as_view(), + name="find-qa-lock", + kwargs={"model": models.Find}, + ), + url( + r"^treatment_creation/(?P<step>.+)?$", + check_rights(["change_find", "change_own_find"])( + views.treatment_creation_wizard + ), + name="treatment_creation", + ), + url( + r"^treatment_creation_n1/(?P<step>.+)?$", + check_rights(["change_find", "change_own_find"])( + views.treatment_creation_n1_wizard + ), + name="treatment_creation_n1", + ), + url( + r"^treatment_creation_1n/(?P<step>.+)?$", + check_rights(["change_find", "change_own_find"])( + views.treatment_creation_1n_wizard + ), + name="treatment_creation_1n", + ), + url( + r"^treatment_modification/(?P<step>.+)?$", + check_rights(["change_find", "change_own_find"])( + views.treatment_modification_wizard + ), + name="treatment_modification", + ), + url( + r"treatment_modify/(?P<pk>.+)/$", + views.treatment_modify, + name="treatment_modify", + ), + url( + r"^treatment_search/(?P<step>.+)?$", + check_rights(["view_find", "view_own_find"])(views.treatment_search_wizard), + name="treatment_search", + ), + url( + r"^treatment_deletion/(?P<step>.+)?$", + check_rights(["change_find", "change_own_find"])( + views.treatment_deletion_wizard + ), + name="treatment_deletion", + ), + url( + r"treatment_delete/(?P<pk>.+)/$", + views.treatment_delete, + name="delete-treatment", + ), + url( + r"^treatment_admacttreatment_search/(?P<step>.+)?$", + check_rights(["change_administrativeact"])( + views.treatment_administrativeact_search_wizard + ), + name="treatment_admacttreatment_search", + ), + url( + r"^treatment_admacttreatment/(?P<step>.+)?$", + check_rights(["change_administrativeact"])( + views.treatment_administrativeact_wizard + ), + name="treatment_admacttreatment", + ), + url( + r"^treatment_admacttreatment_modification/(?P<step>.+)?$", + check_rights(["change_administrativeact"])( + views.treatment_administrativeact_modification_wizard + ), + name="treatment_admacttreatment_modification", + ), + url( + r"^treatment_administrativeacttreatment_modify/(?P<pk>.+)/$", views.treatment_administrativeacttreatment_modify, - name='treatment_administrativeacttreatment_modify'), - url(r'^treatment_admacttreatment_deletion/(?P<step>.+)?$', - check_rights(['change_administrativeact'])( - views.treatment_admacttreatment_deletion_wizard), - name='treatment_admacttreatment_deletion'), - url(r'^get-administrativeacttreatment/(?P<type>.+)?$', + name="treatment_administrativeacttreatment_modify", + ), + url( + r"^treatment_admacttreatment_deletion/(?P<step>.+)?$", + check_rights(["change_administrativeact"])( + views.treatment_admacttreatment_deletion_wizard + ), + name="treatment_admacttreatment_deletion", + ), + url( + r"^get-administrativeacttreatment/(?P<type>.+)?$", views.get_administrativeacttreatment, - name='get-administrativeacttreatment'), - url(r'^treatment_administrativeacttreatment_delete/(?P<pk>.+)/$', + name="get-administrativeacttreatment", + ), + url( + r"^treatment_administrativeacttreatment_delete/(?P<pk>.+)/$", views.treatment_administrativeacttreatment_delete, - name='delete-administrativeact-treatment'), - - url(r'^treatmentfle_admacttreatmentfle_search/(?P<step>.+)?$', - check_rights(['change_administrativeact'])( - views.treatmentfile_admacttreatmentfile_search_wizard), - name='treatmentfle_admacttreatmentfle_search'), - url(r'^treatmentfle_admacttreatmentfle_modification/(?P<step>.+)?$', - check_rights(['change_administrativeact'])( - views.treatmentfile_admacttreatmentfile_modification_wizard), - name='treatmentfle_admacttreatmentfle_modification'), - url(r'^treatmentfle_admacttreatmentfle/(?P<step>.+)?$', - check_rights(['change_administrativeact'])( - views.treatmentfile_admacttreatmentfile_wizard), - name='treatmentfle_admacttreatmentfle'), - url(r'^treatmentfile_administrativeacttreatmentfile_modify/(?P<pk>.+)/$', + name="delete-administrativeact-treatment", + ), + url( + r"^treatmentfle_admacttreatmentfle_search/(?P<step>.+)?$", + check_rights(["change_administrativeact"])( + views.treatmentfile_admacttreatmentfile_search_wizard + ), + name="treatmentfle_admacttreatmentfle_search", + ), + url( + r"^treatmentfle_admacttreatmentfle_modification/(?P<step>.+)?$", + check_rights(["change_administrativeact"])( + views.treatmentfile_admacttreatmentfile_modification_wizard + ), + name="treatmentfle_admacttreatmentfle_modification", + ), + url( + r"^treatmentfle_admacttreatmentfle/(?P<step>.+)?$", + check_rights(["change_administrativeact"])( + views.treatmentfile_admacttreatmentfile_wizard + ), + name="treatmentfle_admacttreatmentfle", + ), + url( + r"^treatmentfile_administrativeacttreatmentfile_modify/(?P<pk>.+)/$", views.treatmentfile_administrativeacttreatmentfile_modify, - name='treatmentfile_administrativeacttreatmentfile_modify'), - url(r'^treatmentfle_admacttreatmentfle_deletion/(?P<step>.+)?$', - check_rights(['change_administrativeact'])( - views.treatmentfile_admacttreatmentfile_deletion_wizard), - name='treatmentfle_admacttreatmentfle_deletion'), - url(r'^treatmentfile_administrativeacttreatmentfile_delete/(?P<pk>.+)/$', + name="treatmentfile_administrativeacttreatmentfile_modify", + ), + url( + r"^treatmentfle_admacttreatmentfle_deletion/(?P<step>.+)?$", + check_rights(["change_administrativeact"])( + views.treatmentfile_admacttreatmentfile_deletion_wizard + ), + name="treatmentfle_admacttreatmentfle_deletion", + ), + url( + r"^treatmentfile_administrativeacttreatmentfile_delete/(?P<pk>.+)/$", views.treatmentfile_administrativeacttreatmentfile_delete, - name='delete-administrativeact-treatmentfile'), - - url(r'^treatmentfle_search/(?P<step>.+)?$', - check_rights(['change_find', 'change_own_find'])( - views.treatmentfile_search_wizard), - name='treatmentfile_search'), - url(r'treatmentfle_creation/(?P<step>.+)?$', - check_rights(['change_find', 'change_own_find'])( - views.treatmentfile_creation_wizard), - name='treatmentfile_creation'), - url(r'treatmentfle_modification/(?P<step>.+)?$', - check_rights(['change_find', 'change_own_find'])( - views.treatmentfile_modification_wizard), - name='treatmentfile_modification'), - url(r'^treatmentfile_modify/(?P<pk>.+)/$', - views.treatmentfile_modify, name='treatmentfile_modify'), - url(r'^treatmentfle_deletion/(?P<step>.+)?$', - check_rights(['change_find', 'change_own_find'])( - views.treatmentfile_deletion_wizard), - name='treatmentfile_deletion'), - url(r'^treatmentfle_delete/(?P<pk>.+)/$', - views.treatmentfile_delete, name='delete-treatmentfile'), - - url(r'get-administrativeacttreatmentfile/(?P<type>.+)?$', + name="delete-administrativeact-treatmentfile", + ), + url( + r"^treatmentfle_search/(?P<step>.+)?$", + check_rights(["change_find", "change_own_find"])( + views.treatmentfile_search_wizard + ), + name="treatmentfile_search", + ), + url( + r"treatmentfle_creation/(?P<step>.+)?$", + check_rights(["change_find", "change_own_find"])( + views.treatmentfile_creation_wizard + ), + name="treatmentfile_creation", + ), + url( + r"treatmentfle_modification/(?P<step>.+)?$", + check_rights(["change_find", "change_own_find"])( + views.treatmentfile_modification_wizard + ), + name="treatmentfile_modification", + ), + url( + r"^treatmentfile_modify/(?P<pk>.+)/$", + views.treatmentfile_modify, + name="treatmentfile_modify", + ), + url( + r"^treatmentfle_deletion/(?P<step>.+)?$", + check_rights(["change_find", "change_own_find"])( + views.treatmentfile_deletion_wizard + ), + name="treatmentfile_deletion", + ), + url( + r"^treatmentfle_delete/(?P<pk>.+)/$", + views.treatmentfile_delete, + name="delete-treatmentfile", + ), + url( + r"get-administrativeacttreatmentfile/(?P<type>.+)?$", views.get_administrativeacttreatmentfile, - name='get-administrativeacttreatmentfile'), - url(r'get-upstreamtreatment/(?P<type>.+)?$', views.get_upstreamtreatment, - name='get-upstreamtreatment'), - url(r'get-downstreamtreatment/(?P<type>.+)?$', + name="get-administrativeacttreatmentfile", + ), + url( + r"get-upstreamtreatment/(?P<type>.+)?$", + views.get_upstreamtreatment, + name="get-upstreamtreatment", + ), + url( + r"get-downstreamtreatment/(?P<type>.+)?$", views.get_downstreamtreatment, - name='get-downstreamtreatment'), - url(r'autocomplete-objecttype/$', views.autocomplete_objecttype, - name='autocomplete-objecttype'), - url(r'autocomplete-materialtype/$', views.autocomplete_materialtype, - name='autocomplete-materialtype'), - url(r'autocomplete-treatmenttype/$', views.autocomplete_treatmenttype, - name='autocomplete-treatmenttype'), - url(r'autocomplete-integritytype/$', views.autocomplete_integritytype, - name='autocomplete-integritytype'), - url(r'autocomplete-treatmentfile/$', views.autocomplete_treatmentfile, - name='autocomplete-treatmentfile'), - url(r'get-find-for-ope/own/(?P<type>.+)?$', views.get_find_for_ope, - name='get-own-find-for-ope', kwargs={'force_own': True}), - url(r'get-find-for-ope/(?P<type>.+)?$', views.get_find_for_ope, - name='get-find-for-ope'), - url(r'get-find-for-cr/cr/(?P<type>.+)?$', views.get_find_for_cr, - name='get-own-find-for-cr', kwargs={'force_own': True}), - url(r'get-find-for-cr/(?P<type>.+)?$', views.get_find_for_cr, - name='get-find-for-cr'), - url(r'get-find-for-treatment/own/(?P<type>.+)?$', + name="get-downstreamtreatment", + ), + url( + r"autocomplete-objecttype/$", + views.autocomplete_objecttype, + name="autocomplete-objecttype", + ), + url( + r"autocomplete-materialtype/$", + views.autocomplete_materialtype, + name="autocomplete-materialtype", + ), + url( + r"autocomplete-treatmenttype/$", + views.autocomplete_treatmenttype, + name="autocomplete-treatmenttype", + ), + url( + r"autocomplete-integritytype/$", + views.autocomplete_integritytype, + name="autocomplete-integritytype", + ), + url( + r"autocomplete-treatmentfile/$", + views.autocomplete_treatmentfile, + name="autocomplete-treatmentfile", + ), + url( + r"get-find-for-ope/own/(?P<type>.+)?$", + views.get_find_for_ope, + name="get-own-find-for-ope", + kwargs={"force_own": True}, + ), + url( + r"get-find-for-ope/(?P<type>.+)?$", + views.get_find_for_ope, + name="get-find-for-ope", + ), + url( + r"get-find-for-cr/cr/(?P<type>.+)?$", + views.get_find_for_cr, + name="get-own-find-for-cr", + kwargs={"force_own": True}, + ), + url( + r"get-find-for-cr/(?P<type>.+)?$", views.get_find_for_cr, name="get-find-for-cr" + ), + url( + r"get-find-for-treatment/own/(?P<type>.+)?$", + views.get_find_for_treatment, + name="get-own-find-for-treatment", + kwargs={"force_own": True}, + ), + url( + r"get-find-for-treatment/(?P<type>.+)?$", views.get_find_for_treatment, - name='get-own-find-for-treatment', kwargs={'force_own': True}), - url(r'get-find-for-treatment/(?P<type>.+)?$', views.get_find_for_treatment, - name='get-find-for-treatment'), - url(r'get-find-inside-container/own/(?P<type>.+)?$', + name="get-find-for-treatment", + ), + url( + r"get-find-inside-container/own/(?P<type>.+)?$", views.get_find_inside_container, - name='get-find-inside-container', kwargs={'force_own': True}), - url(r'get-find-inside-container/(?P<type>.+)?$', - views.get_find_inside_container, name='get-find-inside-container'), - url(r'get-find-full/own/(?P<type>.+)?$', views.get_find, - name='get-own-find-full', kwargs={'full': True, 'force_own': True}), - url(r'get-find-full/(?P<type>.+)?$', views.get_find, - name='get-find-full', kwargs={'full': True}), - url(r'get-find-shortcut/(?P<type>.+)?$', - views.get_find, name='get-find-shortcut', - kwargs={'full': 'shortcut'}), - url(r'^show-find/basket-(?:(?P<pk>.+)/(?P<type>.+)?)?$', + name="get-find-inside-container", + kwargs={"force_own": True}, + ), + url( + r"get-find-inside-container/(?P<type>.+)?$", + views.get_find_inside_container, + name="get-find-inside-container", + ), + url( + r"get-find-full/own/(?P<type>.+)?$", + views.get_find, + name="get-own-find-full", + kwargs={"full": True, "force_own": True}, + ), + url( + r"get-find-full/(?P<type>.+)?$", + views.get_find, + name="get-find-full", + kwargs={"full": True}, + ), + url( + r"get-find-shortcut/(?P<type>.+)?$", + views.get_find, + name="get-find-shortcut", + kwargs={"full": "shortcut"}, + ), + url( + r"^show-find/basket-(?:(?P<pk>.+)/(?P<type>.+)?)?$", views.show_findbasket, - name='show-findbasket'), - url(r'^show-basefind/(?:(?P<pk>.+)/(?P<type>.+)?)?$', - views.show_basefind, name='show-basefind'), - url(r'^display-find/basket-(?P<pk>.+)/$', views.display_findbasket, - name='display-findbasket'), - url(r'^show-historized-find/(?P<pk>.+)?/(?P<date>.+)?$', - views.show_find, name='show-historized-find'), - url(r'^revert-find/(?P<pk>.+)/(?P<date>.+)$', - views.revert_find, name='revert-find'), - url(r'get-treatment-shortcut/(?P<type>.+)?$', - views.get_treatment, name='get-treatment-shortcut', - kwargs={'full': 'shortcut'}), - url(r'show-historized-treatment/(?P<pk>.+)?/(?P<date>.+)?$', - views.show_treatment, name='show-historized-treatment'), - url(r'^revert-treatment/(?P<pk>.+)/(?P<date>.+)$', - views.revert_treatment, name='revert-treatment'), - url(r'get-treatmentfile/(?P<type>.+)?$', - views.get_treatmentfile, name='get-treatmentfile'), - url(r'get-treatmentfile-shortcut/(?P<type>.+)?$', - views.get_treatmentfile, name='get-treatmentfile-shortcut', - kwargs={'full': 'shortcut'}), - url(r'^show-treatmentfile(?:/(?P<pk>.+))?/(?P<type>.+)?$', + name="show-findbasket", + ), + url( + r"^show-basefind/(?:(?P<pk>.+)/(?P<type>.+)?)?$", + views.show_basefind, + name="show-basefind", + ), + url( + r"^display-find/basket-(?P<pk>.+)/$", + views.display_findbasket, + name="display-findbasket", + ), + url( + r"^show-historized-find/(?P<pk>.+)?/(?P<date>.+)?$", + views.show_find, + name="show-historized-find", + ), + url( + r"^revert-find/(?P<pk>.+)/(?P<date>.+)$", views.revert_find, name="revert-find" + ), + url( + r"get-treatment-shortcut/(?P<type>.+)?$", + views.get_treatment, + name="get-treatment-shortcut", + kwargs={"full": "shortcut"}, + ), + url( + r"show-historized-treatment/(?P<pk>.+)?/(?P<date>.+)?$", + views.show_treatment, + name="show-historized-treatment", + ), + url( + r"^revert-treatment/(?P<pk>.+)/(?P<date>.+)$", + views.revert_treatment, + name="revert-treatment", + ), + url( + r"get-treatmentfile/(?P<type>.+)?$", + views.get_treatmentfile, + name="get-treatmentfile", + ), + url( + r"get-treatmentfile-shortcut/(?P<type>.+)?$", + views.get_treatmentfile, + name="get-treatmentfile-shortcut", + kwargs={"full": "shortcut"}, + ), + url( + r"^show-treatmentfile(?:/(?P<pk>.+))?/(?P<type>.+)?$", + views.show_treatmentfile, + name=models.TreatmentFile.SHOW_URL, + ), + url( + r"show-historized-treatmentfile/(?P<pk>.+)?/(?P<date>.+)?$", views.show_treatmentfile, - name=models.TreatmentFile.SHOW_URL), - url(r'show-historized-treatmentfile/(?P<pk>.+)?/(?P<date>.+)?$', - views.show_treatmentfile, name='show-historized-treatmentfile'), - url(r'^revert-treatmentfile/(?P<pk>.+)/(?P<date>.+)$', - views.revert_treatmentfile, name='revert-treatmentfile'), - url(r'^treatment_administrativeact_document/$', + name="show-historized-treatmentfile", + ), + url( + r"^revert-treatmentfile/(?P<pk>.+)/(?P<date>.+)$", + views.revert_treatmentfile, + name="revert-treatmentfile", + ), + url( + r"^treatment_administrativeact_document/$", administrativeactfile_document, - name='treatment-administrativeact-document', - kwargs={'treatment': True}), - url(r'^treatmentfle_administrativeact_document/$', + name="treatment-administrativeact-document", + kwargs={"treatment": True}, + ), + url( + r"^treatmentfle_administrativeact_document/$", administrativeactfile_document, - name='treatmentfle-administrativeact-document', - kwargs={'treatment_file': True}), - url(r'autocomplete-findbasket/$', - check_rights(['change_find', 'change_own_find'])( - views.autocomplete_findbasket), - name='autocomplete-findbasket'), - url(r'autocomplete-findbasket-write/$', - check_rights(['change_find', 'change_own_find'])( - views.autocomplete_findbasket_write), - name='autocomplete-findbasket-write'), - - url(r'api/public/find/$', views.PublicFindAPI.as_view(), - name='api-public-find'), + name="treatmentfle-administrativeact-document", + kwargs={"treatment_file": True}, + ), + url( + r"autocomplete-findbasket/$", + check_rights(["change_find", "change_own_find"])(views.autocomplete_findbasket), + name="autocomplete-findbasket", + ), + url( + r"autocomplete-findbasket-write/$", + check_rights(["change_find", "change_own_find"])( + views.autocomplete_findbasket_write + ), + name="autocomplete-findbasket-write", + ), + url(r"api/public/find/$", views.PublicFindAPI.as_view(), name="api-public-find"), ] -urlpatterns += get_urls_for_model(models.Find, views, own=True, - autocomplete=True) -urlpatterns += get_urls_for_model(models.Treatment, views, - autocomplete=True) - +urlpatterns += get_urls_for_model(models.Find, views, own=True, autocomplete=True) +urlpatterns += get_urls_for_model(models.Treatment, views, autocomplete=True) diff --git a/archaeological_finds/views.py b/archaeological_finds/views.py index 978afc759..561227f7c 100644 --- a/archaeological_finds/views.py +++ b/archaeological_finds/views.py @@ -1,4 +1,4 @@ -#!/usr/bin/env python +#!/usr/bin/env python3 # -*- coding: utf-8 -*- # Copyright (C) 2010-2018 Étienne Loks <etienne.loks_AT_peacefrogsDOTnet> @@ -41,22 +41,34 @@ from archaeological_operations.models import AdministrativeAct from archaeological_finds import models from ishtar_common.forms import FinalForm -from archaeological_context_records.forms \ - import RecordFormSelection as RecordFormSelectionTable +from archaeological_context_records.forms import ( + RecordFormSelection as RecordFormSelectionTable, +) from archaeological_operations.forms import FinalAdministrativeActDeleteForm from archaeological_finds import forms -from ishtar_common.views import get_autocomplete_generic, IshtarMixin, \ - LoginRequiredMixin, QAItemEditForm, QAItemForm, QABaseLockView, \ - wizard_is_available -from ishtar_common.views_item import display_item, get_item, show_item, \ - revert_item, get_autocomplete_item, get_autocomplete_queries +from ishtar_common.views import ( + get_autocomplete_generic, + IshtarMixin, + LoginRequiredMixin, + QAItemEditForm, + QAItemForm, + QABaseLockView, + wizard_is_available, +) +from ishtar_common.views_item import ( + display_item, + get_item, + show_item, + revert_item, + get_autocomplete_item, + get_autocomplete_queries, +) from archaeological_operations.wizards import AdministrativeActDeletionWizard from archaeological_finds import wizards -get_find = get_item(models.Find, 'get_find', 'find', - search_form=forms.FindSelect) +get_find = get_item(models.Find, "get_find", "find", search_form=forms.FindSelect) def get_table_cols_for_ope(): @@ -75,77 +87,95 @@ def get_table_cols_for_cr(): def get_table_cols_for_container(): table_cols = models.Find.TABLE_COLS - tb_key = ("find", 'TABLE_COLS') + tb_key = ("find", "TABLE_COLS") if tb_key in settings.TABLE_COLS: table_cols = settings.TABLE_COLS[tb_key] return ["find__" + tc for tc in table_cols] -get_find_for_ope = get_item(models.Find, 'get_find', 'find', - own_table_cols=get_table_cols_for_ope()) +get_find_for_ope = get_item( + models.Find, "get_find", "find", own_table_cols=get_table_cols_for_ope() +) -get_find_for_cr = get_item(models.Find, 'get_find', 'find', - own_table_cols=get_table_cols_for_cr()) +get_find_for_cr = get_item( + models.Find, "get_find", "find", own_table_cols=get_table_cols_for_cr() +) get_find_for_treatment = get_item( - models.Find, 'get_find', 'find', - own_table_cols=get_table_cols_for_ope(), base_request={}) + models.Find, + "get_find", + "find", + own_table_cols=get_table_cols_for_ope(), + base_request={}, +) get_find_inside_container = get_item( - models.FindInsideContainer, 'get_find_inside_container', - 'find', + models.FindInsideContainer, + "get_find_inside_container", + "find", extra_request_keys=models.FindInsideContainer.EXTRA_REQUEST_KEYS, - own_table_cols=get_table_cols_for_container()) + own_table_cols=get_table_cols_for_container(), +) autocomplete_find = get_autocomplete_item(model=models.Find) -show_treatment = show_item(models.Treatment, 'treatment') +show_treatment = show_item(models.Treatment, "treatment") revert_treatment = revert_item(models.Treatment) get_treatment = get_item( - models.Treatment, 'get_treatment', 'treatment', - search_form=forms.TreatmentSelect + models.Treatment, "get_treatment", "treatment", search_form=forms.TreatmentSelect ) display_treatment = display_item(models.Treatment) autocomplete_treatment = get_autocomplete_item(model=models.Treatment) get_administrativeacttreatment = get_item( - AdministrativeAct, 'get_administrativeacttreatment', - 'administrativeacttreatment', - base_request={"treatment__pk__isnull": False}) + AdministrativeAct, + "get_administrativeacttreatment", + "administrativeacttreatment", + base_request={"treatment__pk__isnull": False}, +) -show_treatmentfile = show_item(models.TreatmentFile, 'treatmentfile') +show_treatmentfile = show_item(models.TreatmentFile, "treatmentfile") revert_treatmentfile = revert_item(models.TreatmentFile) get_treatmentfile = get_item( - models.TreatmentFile, 'get_treatmentfile', 'treatmentfile', - search_form=forms.TreatmentFileSelect + models.TreatmentFile, + "get_treatmentfile", + "treatmentfile", + search_form=forms.TreatmentFileSelect, ) get_administrativeacttreatmentfile = get_item( - AdministrativeAct, 'get_administrativeacttreatmentfile', - 'administrativeacttreatmentfile', - base_request={"treatment_file__pk__isnull": False}) + AdministrativeAct, + "get_administrativeacttreatmentfile", + "administrativeacttreatmentfile", + base_request={"treatment_file__pk__isnull": False}, +) def autocomplete_treatmentfile(request): - if not request.user.has_perm('ishtar_common.view_treatment', - models.Treatment) and \ - not request.user.has_perm('ishtar_common.view_own_treatment', - models.Treatment) \ - and not request.user.ishtaruser.has_right('treatmentfile_search', - session=request.session): - return HttpResponse(content_type='text/plain') - if not request.GET.get('term'): - return HttpResponse(content_type='text/plain') - q = request.GET.get('term') + if ( + not request.user.has_perm("ishtar_common.view_treatment", models.Treatment) + and not request.user.has_perm( + "ishtar_common.view_own_treatment", models.Treatment + ) + and not request.user.ishtaruser.has_right( + "treatmentfile_search", session=request.session + ) + ): + return HttpResponse(content_type="text/plain") + if not request.GET.get("term"): + return HttpResponse(content_type="text/plain") + q = request.GET.get("term") query = Q() - for q1 in q.split(' '): - for q in q1.split(' '): - extra = Q(internal_reference__icontains=q) | \ - Q(external_id__icontains=q) | \ - Q(name__icontains=q) + for q1 in q.split(" "): + for q in q1.split(" "): + extra = ( + Q(internal_reference__icontains=q) + | Q(external_id__icontains=q) + | Q(name__icontains=q) + ) try: int(q) extra = extra | Q(year=q) | Q(index=q) @@ -154,52 +184,53 @@ def autocomplete_treatmentfile(request): query = query & extra limit = 20 files = models.TreatmentFile.objects.filter(query)[:limit] - data = json.dumps([{'id': file.pk, 'value': str(file)} - for file in files]) - return HttpResponse(data, content_type='text/plain') + data = json.dumps([{"id": file.pk, "value": str(file)} for file in files]) + return HttpResponse(data, content_type="text/plain") def show_basefind(request, pk, **dct): - q = models.Find.objects.filter(base_finds__pk=pk, - downstream_treatment__isnull=True) + q = models.Find.objects.filter(base_finds__pk=pk, downstream_treatment__isnull=True) if not q.count(): return Http404() - find_pk = q.values("pk").order_by('-pk')[0]["pk"] - return show_item(models.Find, 'find')(request, find_pk, **dct) + find_pk = q.values("pk").order_by("-pk")[0]["pk"] + return show_item(models.Find, "find")(request, find_pk, **dct) def show_find_extra(request, find): if not request.user or not request.user.ishtaruser: return {} user = request.user.ishtaruser - q = models.FindBasket.objects.filter(items__pk=find.pk).filter( - Q(user=user) | Q(shared_with__pk=user.pk) | - Q(shared_write_with__pk=user.pk) - ).distinct() + q = ( + models.FindBasket.objects.filter(items__pk=find.pk) + .filter( + Q(user=user) | Q(shared_with__pk=user.pk) | Q(shared_write_with__pk=user.pk) + ) + .distinct() + ) return {"baskets": [(basket.pk, basket.full_label) for basket in q.all()]} -show_find = show_item(models.Find, 'find', extra_dct=show_find_extra) +show_find = show_item(models.Find, "find", extra_dct=show_find_extra) display_find = display_item(models.Find) revert_find = revert_item(models.Find) -show_findbasket = show_item(models.FindBasket, 'findbasket', - model_for_perms=models.Find) -display_findbasket = display_item(models.FindBasket, - show_url='show-find/basket-') +show_findbasket = show_item( + models.FindBasket, "findbasket", model_for_perms=models.Find +) +display_findbasket = display_item(models.FindBasket, show_url="show-find/basket-") def autocomplete_findbasket(request, current_right=None): - if not request.GET.get('term'): - return HttpResponse(content_type='text/plain') + if not request.GET.get("term"): + return HttpResponse(content_type="text/plain") limit = 20 result = OrderedDict() - for query in get_autocomplete_queries(request, ['label']): - query = query & models.FindBasket.get_query_owns( - request.user.ishtaruser) - objects = models.FindBasket.objects.filter(query).distinct().order_by( - 'label')[:limit] + for query in get_autocomplete_queries(request, ["label"]): + query = query & models.FindBasket.get_query_owns(request.user.ishtaruser) + objects = ( + models.FindBasket.objects.filter(query).distinct().order_by("label")[:limit] + ) for obj in objects: if obj.id not in list(result.keys()): result[obj.id] = obj.label @@ -208,22 +239,21 @@ def autocomplete_findbasket(request, current_right=None): break if not limit: break - data = json.dumps([{'id': obj[0], 'value': obj[1]} - for obj in list(result.items())]) - return HttpResponse(data, content_type='text/plain') + data = json.dumps([{"id": obj[0], "value": obj[1]} for obj in list(result.items())]) + return HttpResponse(data, content_type="text/plain") def autocomplete_findbasket_write(request, current_right=None): - if not request.GET.get('term'): - return HttpResponse(content_type='text/plain') + if not request.GET.get("term"): + return HttpResponse(content_type="text/plain") limit = 20 result = OrderedDict() - for query in get_autocomplete_queries(request, ['label']): - query = query & models.FindBasket.get_write_query_owns( - request.user.ishtaruser) - objects = models.FindBasket.objects.filter(query).distinct().order_by( - 'label')[:limit] + for query in get_autocomplete_queries(request, ["label"]): + query = query & models.FindBasket.get_write_query_owns(request.user.ishtaruser) + objects = ( + models.FindBasket.objects.filter(query).distinct().order_by("label")[:limit] + ) for obj in objects: if obj.id not in list(result.keys()): result[obj.id] = obj.label @@ -232,63 +262,64 @@ def autocomplete_findbasket_write(request, current_right=None): break if not limit: break - data = json.dumps([{'id': obj[0], 'value': obj[1]} - for obj in list(result.items())]) - return HttpResponse(data, content_type='text/plain') + data = json.dumps([{"id": obj[0], "value": obj[1]} for obj in list(result.items())]) + return HttpResponse(data, content_type="text/plain") get_find_basket = get_item( - models.FindBasket, 'get_findbasket', 'findbasket', - model_for_perms=models.Find + models.FindBasket, "get_findbasket", "findbasket", model_for_perms=models.Find ) get_findbasket = get_find_basket get_find_basket_for_write = get_item( - models.FindBasket, 'get_findbasket', 'findbasket', - model_for_perms=models.Find, alt_query_own='get_write_query_owns' + models.FindBasket, + "get_findbasket", + "findbasket", + model_for_perms=models.Find, + alt_query_own="get_write_query_owns", ) basket_search_wizard = wizards.FindBasketSearch.as_view( - [('selec-find_basket_search', forms.FindBasketFormSelection)], + [("selec-find_basket_search", forms.FindBasketFormSelection)], label=_("Basket search"), - url_name='find_basket_search', + url_name="find_basket_search", ) basket_modify_wizard = wizards.FindBasketEditWizard.as_view( [ - ('selec-find_basket_modification', - forms.FindBasketForWriteFormSelection), - ('basket-find_basket_modification', forms.FindBasketForm), - ('final-find_basket_modification', FinalForm) + ("selec-find_basket_modification", forms.FindBasketForWriteFormSelection), + ("basket-find_basket_modification", forms.FindBasketForm), + ("final-find_basket_modification", FinalForm), ], label=_("Basket modify"), - url_name='find_basket_modification', + url_name="find_basket_modification", ) def find_basket_modify(request, pk): - if not wizard_is_available(basket_modify_wizard, request, models.FindBasket, - pk): + if not wizard_is_available(basket_modify_wizard, request, models.FindBasket, pk): return HttpResponseRedirect("/") - key = 'selec-find_basket_modification' - wizards.FindBasketEditWizard.session_set_value( - request, key, 'pk', pk, reset=True) + key = "selec-find_basket_modification" + wizards.FindBasketEditWizard.session_set_value(request, key, "pk", pk, reset=True) return redirect( - reverse('find_basket_modification', - kwargs={'step': 'basket-find_basket_modification'})) + reverse( + "find_basket_modification", + kwargs={"step": "basket-find_basket_modification"}, + ) + ) findbasket_deletion_steps = [ - ('selec-find_basket_deletion', forms.FindBasketForWriteFormSelection), - ('final-find_basket_deletion', FinalForm) + ("selec-find_basket_deletion", forms.FindBasketForWriteFormSelection), + ("final-find_basket_deletion", FinalForm), ] basket_delete_wizard = wizards.FindBasketDeletionWizard.as_view( findbasket_deletion_steps, label=_("Basket deletion"), - url_name='find_basket_deletion', + url_name="find_basket_deletion", ) @@ -305,34 +336,37 @@ def check_not_warehouse_module(self): find_creation_steps = [ - ('selecrecord-find_creation', RecordFormSelectionTable), - ('find-find_creation', forms.FindForm), - ('preservation-find_creation', forms.PreservationForm), - ('dating-find_creation', forms.DatingFormSet), - ('final-find_creation', FinalForm) + ("selecrecord-find_creation", RecordFormSelectionTable), + ("find-find_creation", forms.FindForm), + ("preservation-find_creation", forms.PreservationForm), + ("dating-find_creation", forms.DatingFormSet), + ("final-find_creation", FinalForm), ] find_creation_condition_dict = { - 'preservation-find_creation': check_preservation_module, + "preservation-find_creation": check_preservation_module, } find_creation_wizard = wizards.FindWizard.as_view( find_creation_steps, label=_("New find"), condition_dict=find_creation_condition_dict, - url_name='find_creation',) + url_name="find_creation", +) find_search_condition_dict = { - 'general-find_search': check_not_warehouse_module, - 'generalwarehouse-find_search': check_warehouse_module, + "general-find_search": check_not_warehouse_module, + "generalwarehouse-find_search": check_warehouse_module, } -find_search_wizard = wizards.FindSearch.as_view([ - ('general-find_search', forms.FindFormSelection), - ('generalwarehouse-find_search', forms.FindFormSelectionWarehouseModule)], +find_search_wizard = wizards.FindSearch.as_view( + [ + ("general-find_search", forms.FindFormSelection), + ("generalwarehouse-find_search", forms.FindFormSelectionWarehouseModule), + ], label=_("Find search"), - url_name='find_search', - condition_dict=find_search_condition_dict + url_name="find_search", + condition_dict=find_search_condition_dict, ) @@ -348,83 +382,80 @@ def has_only_one_base_find(wizard): find_modification_condition_dict = { - 'selec-find_modification': check_not_warehouse_module, - 'selecw-find_modification': check_warehouse_module, - 'preservation-find_modification': check_preservation_module, - 'selecrecord-find_modification': has_only_one_base_find, - 'find-find_modification': has_only_one_base_find, - 'simplefind-find_modification': has_many_base_find, + "selec-find_modification": check_not_warehouse_module, + "selecw-find_modification": check_warehouse_module, + "preservation-find_modification": check_preservation_module, + "selecrecord-find_modification": has_only_one_base_find, + "find-find_modification": has_only_one_base_find, + "simplefind-find_modification": has_many_base_find, } find_modification_steps = [ - ('selec-find_modification', forms.FindFormSelection), - ('selecw-find_modification', forms.FindFormSelectionWarehouseModule), - ('selecrecord-find_modification', forms.RecordFormSelection), - ('find-find_modification', forms.FindForm), - ('simplefind-find_modification', forms.SimpleFindForm), - ('preservation-find_modification', forms.PreservationForm), - ('dating-find_modification', forms.DatingFormSet), - ('final-find_modification', FinalForm) + ("selec-find_modification", forms.FindFormSelection), + ("selecw-find_modification", forms.FindFormSelectionWarehouseModule), + ("selecrecord-find_modification", forms.RecordFormSelection), + ("find-find_modification", forms.FindForm), + ("simplefind-find_modification", forms.SimpleFindForm), + ("preservation-find_modification", forms.PreservationForm), + ("dating-find_modification", forms.DatingFormSet), + ("final-find_modification", FinalForm), ] find_modification_wizard = wizards.FindModificationWizard.as_view( find_modification_steps, condition_dict=find_modification_condition_dict, label=_("Find modification"), - url_name='find_modification' + url_name="find_modification", ) def find_modify(request, pk): - find = wizard_is_available(find_modification_wizard, request, - models.Find, pk) + find = wizard_is_available(find_modification_wizard, request, models.Find, pk) if not find: return HttpResponseRedirect("/") find_modification_wizard(request) - key = 'selec-find_modification' + key = "selec-find_modification" if get_current_profile().warehouse: - key = 'selecw-find_modification' - wizards.FindModificationWizard.session_set_value( - request, key, 'pk', pk, reset=True) + key = "selecw-find_modification" + wizards.FindModificationWizard.session_set_value(request, key, "pk", pk, reset=True) - step = 'find-find_modification' + step = "find-find_modification" if find.base_finds.count() > 1: - step = 'simplefind-find_modification' - - return redirect( - reverse('find_modification', kwargs={'step': step})) + step = "simplefind-find_modification" + + return redirect(reverse("find_modification", kwargs={"step": step})) + find_deletion_condition_dict = { - 'selec-find_deletion': check_not_warehouse_module, - 'selecw-find_deletion': check_warehouse_module, + "selec-find_deletion": check_not_warehouse_module, + "selecw-find_deletion": check_warehouse_module, } find_deletion_steps = [ - ('selec-find_deletion', forms.FindFormMultiSelection), - ('selecw-find_deletion', forms.FindFormMultiSelectionWarehouseModule), - ('final-find_deletion', forms.FindDeletionForm)] + ("selec-find_deletion", forms.FindFormMultiSelection), + ("selecw-find_deletion", forms.FindFormMultiSelectionWarehouseModule), + ("final-find_deletion", forms.FindDeletionForm), +] find_deletion_wizard = wizards.FindDeletionWizard.as_view( find_deletion_steps, condition_dict=find_deletion_condition_dict, label=_("Find deletion"), - url_name='find_deletion',) + url_name="find_deletion", +) def find_delete(request, pk): - find = wizard_is_available(find_deletion_wizard, request, - models.Find, pk) + find = wizard_is_available(find_deletion_wizard, request, models.Find, pk) if not find: return HttpResponseRedirect("/") - key = 'selec-find_deletion' + key = "selec-find_deletion" if get_current_profile().warehouse: - key = 'selecw-find_deletion' - wizards.FindDeletionWizard.session_set_value( - request, key, 'pks', pk, reset=True) + key = "selecw-find_deletion" + wizards.FindDeletionWizard.session_set_value(request, key, "pks", pk, reset=True) - step = 'final-find_deletion' - return redirect( - reverse('find_deletion', kwargs={'step': step})) + step = "final-find_deletion" + return redirect(reverse("find_deletion", kwargs={"step": step})) autocomplete_objecttype = get_autocomplete_generic(models.ObjectType) @@ -434,19 +465,18 @@ autocomplete_integritytype = get_autocomplete_generic(models.IntegrityType) class NewFindBasketView(IshtarMixin, LoginRequiredMixin, CreateView): - template_name = 'ishtar/form.html' + template_name = "ishtar/form.html" model = models.FindBasket form_class = forms.NewFindBasketForm page_name = _("New basket") def get_form_kwargs(self): kwargs = super(NewFindBasketView, self).get_form_kwargs() - kwargs['user'] = IshtarUser.objects.get(pk=self.request.user.pk) + kwargs["user"] = IshtarUser.objects.get(pk=self.request.user.pk) return kwargs def get_success_url(self): - return reverse('select_itemsinbasket', - kwargs={'pk': self.object.pk}) + return reverse("select_itemsinbasket", kwargs={"pk": self.object.pk}) def form_valid(self, form): self.object = form.save() @@ -456,54 +486,53 @@ class NewFindBasketView(IshtarMixin, LoginRequiredMixin, CreateView): class OwnBasket(object): def get_basket(self, user, pk): try: - return models.FindBasket.objects.filter( - Q(user=user) | Q(shared_with=user) | Q(shared_write_with=user) - ).distinct().get(pk=pk) + return ( + models.FindBasket.objects.filter( + Q(user=user) | Q(shared_with=user) | Q(shared_write_with=user) + ) + .distinct() + .get(pk=pk) + ) except models.FindBasket.DoesNotExist: raise PermissionDenied class SelectBasketForManagement(IshtarMixin, LoginRequiredMixin, FormView): - template_name = 'ishtar/form.html' + template_name = "ishtar/form.html" form_class = forms.SelectFindBasketWriteForm page_name = _("Manage items in basket") def get_form_kwargs(self): kwargs = super(SelectBasketForManagement, self).get_form_kwargs() - kwargs['user'] = IshtarUser.objects.get(pk=self.request.user.pk) - if 'pk' in self.kwargs: - kwargs['initial'].update({'basket': self.kwargs['pk']}) + kwargs["user"] = IshtarUser.objects.get(pk=self.request.user.pk) + if "pk" in self.kwargs: + kwargs["initial"].update({"basket": self.kwargs["pk"]}) return kwargs def get_success_url(self, basket): - return reverse('select_itemsinbasket', - kwargs={'pk': basket}) + return reverse("select_itemsinbasket", kwargs={"pk": basket}) def form_valid(self, form): - return HttpResponseRedirect(self.get_success_url( - form.cleaned_data['basket'])) + return HttpResponseRedirect(self.get_success_url(form.cleaned_data["basket"])) -class SelectItemsInBasket(OwnBasket, IshtarMixin, LoginRequiredMixin, - TemplateView): - template_name = 'ishtar/manage_basket.html' +class SelectItemsInBasket(OwnBasket, IshtarMixin, LoginRequiredMixin, TemplateView): + template_name = "ishtar/manage_basket.html" page_name = _("Manage basket") def get_context_data(self, *args, **kwargs): - context = super(SelectItemsInBasket, self).get_context_data( - *args, **kwargs) + context = super(SelectItemsInBasket, self).get_context_data(*args, **kwargs) self.user = IshtarUser.objects.get(pk=self.request.user.pk) - self.basket = self.get_basket( - user=self.user, pk=self.kwargs['pk'] - ) - context['basket'] = self.basket + self.basket = self.get_basket(user=self.user, pk=self.kwargs["pk"]) + context["basket"] = self.basket if get_current_profile().warehouse: - context['form'] = forms.MultipleFindFormSelectionWarehouseModule() + context["form"] = forms.MultipleFindFormSelectionWarehouseModule() else: - context['form'] = forms.MultipleFindFormSelection() - context['add_url'] = reverse('add_iteminbasket') - context['list_url'] = reverse('list_iteminbasket', - kwargs={'pk': self.basket.pk}) + context["form"] = forms.MultipleFindFormSelection() + context["add_url"] = reverse("add_iteminbasket") + context["list_url"] = reverse( + "list_iteminbasket", kwargs={"pk": self.basket.pk} + ) return context def form_valid(self, form): @@ -511,11 +540,11 @@ class SelectItemsInBasket(OwnBasket, IshtarMixin, LoginRequiredMixin, class FindBasketAddItemView(IshtarMixin, LoginRequiredMixin, FormView): - template_name = 'ishtar/simple_form.html' + template_name = "ishtar/simple_form.html" form_class = forms.FindBasketAddItemForm def get_success_url(self, basket): - return reverse('list_iteminbasket', kwargs={'pk': basket.pk}) + return reverse("list_iteminbasket", kwargs={"pk": basket.pk}) def form_valid(self, form): user = IshtarUser.objects.get(pk=self.request.user.pk) @@ -524,135 +553,146 @@ class FindBasketAddItemView(IshtarMixin, LoginRequiredMixin, FormView): return HttpResponseRedirect(self.get_success_url(basket)) -class FindBasketListView(OwnBasket, IshtarMixin, LoginRequiredMixin, - TemplateView): - template_name = 'ishtar/basket_list.html' +class FindBasketListView(OwnBasket, IshtarMixin, LoginRequiredMixin, TemplateView): + template_name = "ishtar/basket_list.html" def get_context_data(self, *args, **kwargs): - context = super(FindBasketListView, self).get_context_data( - *args, **kwargs) + context = super(FindBasketListView, self).get_context_data(*args, **kwargs) self.user = IshtarUser.objects.get(pk=self.request.user.pk) - self.basket = self.get_basket( - user=self.user, pk=self.kwargs['pk'] + self.basket = self.get_basket(user=self.user, pk=self.kwargs["pk"]) + context["basket"] = self.basket + context["item_url"] = "/".join( + reverse(models.Find.SHOW_URL, args=[1]).split("/")[:-1] + ) + context["delete_url"] = "/".join( + reverse("delete_iteminbasket", args=[1, 1]).split("/")[:-3] ) - context['basket'] = self.basket - context['item_url'] = '/'.join( - reverse(models.Find.SHOW_URL, args=[1]).split('/')[:-1]) - context['delete_url'] = '/'.join( - reverse('delete_iteminbasket', args=[1, 1]).split('/')[:-3]) return context -class FindBasketDeleteItemView(OwnBasket, IshtarMixin, LoginRequiredMixin, - TemplateView): - template_name = 'ishtar/simple_form.html' +class FindBasketDeleteItemView( + OwnBasket, IshtarMixin, LoginRequiredMixin, TemplateView +): + template_name = "ishtar/simple_form.html" def get_success_url(self, basket): - return reverse('list_iteminbasket', kwargs={'pk': basket.pk}) + return reverse("list_iteminbasket", kwargs={"pk": basket.pk}) def get(self, *args, **kwargs): user = self.request.user ishtaruser = IshtarUser.objects.get(pk=self.request.user.pk) try: - find = models.Find.objects.get( - pk=self.kwargs['find_pk']) + find = models.Find.objects.get(pk=self.kwargs["find_pk"]) except models.Find.DoesNotExist: raise PermissionDenied - basket = self.get_basket( - user=ishtaruser, pk=self.kwargs['basket'] - ) - if not user.is_superuser and \ - not ishtaruser.has_right('view_find') and \ - not (ishtaruser.has_right('view_own_find') - and find.is_own(user)): + basket = self.get_basket(user=ishtaruser, pk=self.kwargs["basket"]) + if ( + not user.is_superuser + and not ishtaruser.has_right("view_find") + and not (ishtaruser.has_right("view_own_find") and find.is_own(user)) + ): raise PermissionDenied basket.items.remove(find) return HttpResponseRedirect(self.get_success_url(basket)) + get_upstreamtreatment = get_item( - models.FindUpstreamTreatments, 'get_upstreamtreatment', 'uptreatment') + models.FindUpstreamTreatments, "get_upstreamtreatment", "uptreatment" +) get_downstreamtreatment = get_item( - models.FindDownstreamTreatments, 'get_downstreamtreatment', - 'downtreatment') + models.FindDownstreamTreatments, "get_downstreamtreatment", "downtreatment" +) treatment_wizard_steps = [ - ('selecfind-treatment_creation', forms.UpstreamFindFormSelection), - ('file-treatment_creation', forms.TreatmentFormFileChoice), - ('basetreatment-treatment_creation', forms.BaseTreatmentForm), - ('final-treatment_creation', FinalForm) + ("selecfind-treatment_creation", forms.UpstreamFindFormSelection), + ("file-treatment_creation", forms.TreatmentFormFileChoice), + ("basetreatment-treatment_creation", forms.BaseTreatmentForm), + ("final-treatment_creation", FinalForm), ] -treatment_search_wizard = wizards.TreatmentSearch.as_view([ - ('general-treatment_search', forms.TreatmentFormSelection)], +treatment_search_wizard = wizards.TreatmentSearch.as_view( + [("general-treatment_search", forms.TreatmentFormSelection)], label=_("Treatment search"), - url_name='treatment_search',) + url_name="treatment_search", +) treatment_creation_wizard = wizards.TreatmentWizard.as_view( treatment_wizard_steps, label=_("New treatment"), - url_name='treatment_creation',) + url_name="treatment_creation", +) treatment_n1_wizard_steps = [ - ('selecfind-treatment_creation_n1', forms.UpstreamFindFormSelection), - ('file-treatment_creation_n1', forms.TreatmentFormFileChoice), - ('basetreatment-treatment_creation_n1', forms.N1TreatmentForm), - ('resultingfind-treatment_creation_n1', forms.ResultingFindForm), - ('final-treatment_creation_n1', FinalForm) + ("selecfind-treatment_creation_n1", forms.UpstreamFindFormSelection), + ("file-treatment_creation_n1", forms.TreatmentFormFileChoice), + ("basetreatment-treatment_creation_n1", forms.N1TreatmentForm), + ("resultingfind-treatment_creation_n1", forms.ResultingFindForm), + ("final-treatment_creation_n1", FinalForm), ] treatment_creation_n1_wizard = wizards.TreatmentN1Wizard.as_view( treatment_n1_wizard_steps, label=_("New treatment"), - url_name='treatment_creation_n1',) + url_name="treatment_creation_n1", +) treatment_1n_wizard_steps = [ - ('selecfind-treatment_creation_1n', forms.SingleUpstreamFindFormSelection), - ('file-treatment_creation_1n', forms.TreatmentFormFileChoice), - ('basetreatment-treatment_creation_1n', forms.OneNTreatmentForm), - ('resultingfinds-treatment_creation_1n', forms.ResultingFindsForm), - ('final-treatment_creation_1n', FinalForm) + ("selecfind-treatment_creation_1n", forms.SingleUpstreamFindFormSelection), + ("file-treatment_creation_1n", forms.TreatmentFormFileChoice), + ("basetreatment-treatment_creation_1n", forms.OneNTreatmentForm), + ("resultingfinds-treatment_creation_1n", forms.ResultingFindsForm), + ("final-treatment_creation_1n", FinalForm), ] treatment_creation_1n_wizard = wizards.Treatment1NWizard.as_view( treatment_1n_wizard_steps, label=_("New treatment"), - url_name='treatment_creation_1n',) + url_name="treatment_creation_1n", +) treatment_modification_wizard = wizards.TreatmentModificationWizard.as_view( - [('selec-treatment_modification', forms.TreatmentFormSelection), - ('file-treatment_modification', forms.TreatmentFormFileChoice), - ('basetreatment-treatment_modification', forms.TreatmentModifyForm), - ('final-treatment_modification', FinalForm)], + [ + ("selec-treatment_modification", forms.TreatmentFormSelection), + ("file-treatment_modification", forms.TreatmentFormFileChoice), + ("basetreatment-treatment_modification", forms.TreatmentModifyForm), + ("final-treatment_modification", FinalForm), + ], label=_("Treatment modification"), - url_name='treatment_modification', + url_name="treatment_modification", ) def treatment_modify(request, pk): - if not wizard_is_available(treatment_modification_wizard, request, - models.Treatment, pk): + if not wizard_is_available( + treatment_modification_wizard, request, models.Treatment, pk + ): return HttpResponseRedirect("/") wizards.TreatmentModificationWizard.session_set_value( - request, 'selec-treatment_modification', 'pk', pk, reset=True) - return redirect(reverse( - 'treatment_modification', - kwargs={'step': 'file-treatment_modification'})) + request, "selec-treatment_modification", "pk", pk, reset=True + ) + return redirect( + reverse( + "treatment_modification", kwargs={"step": "file-treatment_modification"} + ) + ) def treatment_add(request, pks, treatment_file=None): treatment_creation_wizard(request) wizards.TreatmentWizard.session_set_value( - request, 'selecfind-treatment_creation', - 'resulting_pk', pks, reset=True) + request, "selecfind-treatment_creation", "resulting_pk", pks, reset=True + ) if treatment_file: wizards.TreatmentWizard.session_set_value( - request, 'file-treatment_creation', 'file', treatment_file.pk) + request, "file-treatment_creation", "file", treatment_file.pk + ) else: wizards.TreatmentWizard.session_set_value( - request, 'file-treatment_creation', 'file', '') + request, "file-treatment_creation", "file", "" + ) if treatment_file: in_charge = treatment_file.in_charge if not in_charge: @@ -676,24 +716,29 @@ def treatment_add(request, pks, treatment_file=None): dct["location"] = locas[0] for k in dct: wizards.TreatmentWizard.session_set_value( - request, 'basetreatment-treatment_creation', k, dct[k]) - return redirect(reverse( - 'treatment_creation', - kwargs={'step': 'basetreatment-treatment_creation'})) + request, "basetreatment-treatment_creation", k, dct[k] + ) + return redirect( + reverse( + "treatment_creation", kwargs={"step": "basetreatment-treatment_creation"} + ) + ) def divide_treatment_add(request, pks, treatment_file=None): treatment_creation_1n_wizard(request) wizards.Treatment1NWizard.session_set_value( - request, 'selecfind-treatment_creation_1n', - 'resulting_pk', pks, reset=True) + request, "selecfind-treatment_creation_1n", "resulting_pk", pks, reset=True + ) if treatment_file: wizards.Treatment1NWizard.session_set_value( - request, 'file-treatment_creation_1n', 'file', treatment_file.pk) + request, "file-treatment_creation_1n", "file", treatment_file.pk + ) else: wizards.Treatment1NWizard.session_set_value( - request, 'file-treatment_creation_1n', 'file', '') + request, "file-treatment_creation_1n", "file", "" + ) if treatment_file: in_charge = treatment_file.in_charge if not in_charge: @@ -717,10 +762,14 @@ def divide_treatment_add(request, pks, treatment_file=None): dct["location"] = locas[0] for k in dct: wizards.Treatment1NWizard.session_set_value( - request, 'basetreatment-treatment_creation_1n', k, dct[k]) - return redirect(reverse( - 'treatment_creation_1n', - kwargs={'step': 'basetreatment-treatment_creation_1n'})) + request, "basetreatment-treatment_creation_1n", k, dct[k] + ) + return redirect( + reverse( + "treatment_creation_1n", + kwargs={"step": "basetreatment-treatment_creation_1n"}, + ) + ) def find_treatment_add(request, pk, current_right=None): @@ -774,86 +823,111 @@ def treatmentfile_treatment_add(request, pk, current_right=None): ) -treatment_deletion_wizard = wizards.TreatmentDeletionWizard.as_view([ - ('selec-treatment_deletion', forms.TreatmentFormSelection), - ('final-treatment_deletion', forms.TreatmentDeletionForm)], +treatment_deletion_wizard = wizards.TreatmentDeletionWizard.as_view( + [ + ("selec-treatment_deletion", forms.TreatmentFormSelection), + ("final-treatment_deletion", forms.TreatmentDeletionForm), + ], label=_("Treatment deletion"), - url_name='treatment_deletion',) + url_name="treatment_deletion", +) def treatment_delete(request, pk): - if not wizard_is_available(treatment_deletion_wizard, request, - models.Treatment, pk): + if not wizard_is_available( + treatment_deletion_wizard, request, models.Treatment, pk + ): return HttpResponseRedirect("/") wizards.TreatmentDeletionWizard.session_set_value( - request, 'selec-treatment_deletion', 'pk', pk, reset=True) - return redirect(reverse( - 'treatment_deletion', - kwargs={'step': 'final-treatment_deletion'})) - - -treatment_administrativeact_search_wizard = \ - wizards.SearchWizard.as_view([ - ('selec-treatment_admacttreatment_search', - forms.AdministrativeActTreatmentFormSelection)], - label=_("Treatment: search administrative act"), - url_name='treatment_admacttreatment_search',) - -treatment_administrativeact_wizard = \ - wizards.TreatmentAdministrativeActWizard.as_view([ - ('selec-treatment_admacttreatment', forms.TreatmentFormSelection), - ('administrativeact-treatment_admacttreatment', - forms.AdministrativeActTreatmentForm), - ('final-treatment_admacttreatment', FinalForm)], - label=_("Treatment: new administrative act"), - url_name='treatment_admacttreatment',) - -treatment_administrativeact_modification_wizard = \ - wizards.TreatmentEditAdministrativeActWizard.as_view([ - ('selec-treatment_admacttreatment_modification', - forms.AdministrativeActTreatmentFormSelection), - ('administrativeact-treatment_admacttreatment_modification', - forms.AdministrativeActTreatmentModifForm), - ('final-treatment_admacttreatment_modification', FinalForm)], + request, "selec-treatment_deletion", "pk", pk, reset=True + ) + return redirect( + reverse("treatment_deletion", kwargs={"step": "final-treatment_deletion"}) + ) + + +treatment_administrativeact_search_wizard = wizards.SearchWizard.as_view( + [ + ( + "selec-treatment_admacttreatment_search", + forms.AdministrativeActTreatmentFormSelection, + ) + ], + label=_("Treatment: search administrative act"), + url_name="treatment_admacttreatment_search", +) + +treatment_administrativeact_wizard = wizards.TreatmentAdministrativeActWizard.as_view( + [ + ("selec-treatment_admacttreatment", forms.TreatmentFormSelection), + ( + "administrativeact-treatment_admacttreatment", + forms.AdministrativeActTreatmentForm, + ), + ("final-treatment_admacttreatment", FinalForm), + ], + label=_("Treatment: new administrative act"), + url_name="treatment_admacttreatment", +) + +treatment_administrativeact_modification_wizard = ( + wizards.TreatmentEditAdministrativeActWizard.as_view( + [ + ( + "selec-treatment_admacttreatment_modification", + forms.AdministrativeActTreatmentFormSelection, + ), + ( + "administrativeact-treatment_admacttreatment_modification", + forms.AdministrativeActTreatmentModifForm, + ), + ("final-treatment_admacttreatment_modification", FinalForm), + ], label=_("Treatment: administrative act modification"), - url_name='treatment_admacttreatment_modification',) + url_name="treatment_admacttreatment_modification", + ) +) def treatment_administrativeacttreatment_modify(request, pk): - if not wizard_is_available(treatment_administrativeact_modification_wizard, - request, AdministrativeAct, pk): + if not wizard_is_available( + treatment_administrativeact_modification_wizard, request, AdministrativeAct, pk + ): return HttpResponseRedirect("/") wizards.TreatmentEditAdministrativeActWizard.session_set_value( - request, - 'selec-treatment_admacttreatment_modification', - 'pk', pk, reset=True) + request, "selec-treatment_admacttreatment_modification", "pk", pk, reset=True + ) return redirect( reverse( - 'treatment_admacttreatment_modification', - kwargs={ - 'step': - 'administrativeact-treatment_admacttreatment_modification' - })) - -treatment_admacttreatment_deletion_wizard = \ - AdministrativeActDeletionWizard.as_view([ - ('selec-treatment_admacttreatment_deletion', - forms.AdministrativeActTreatmentFormSelection), - ('final-treatment_admacttreatment_deletion', - FinalAdministrativeActDeleteForm)], - label=_("Treatment: administrative act deletion"), - url_name='treatment_admacttreatment_deletion',) + "treatment_admacttreatment_modification", + kwargs={"step": "administrativeact-treatment_admacttreatment_modification"}, + ) + ) + + +treatment_admacttreatment_deletion_wizard = AdministrativeActDeletionWizard.as_view( + [ + ( + "selec-treatment_admacttreatment_deletion", + forms.AdministrativeActTreatmentFormSelection, + ), + ("final-treatment_admacttreatment_deletion", FinalAdministrativeActDeleteForm), + ], + label=_("Treatment: administrative act deletion"), + url_name="treatment_admacttreatment_deletion", +) def treatment_administrativeacttreatment_delete(request, pk): - if not wizard_is_available(treatment_admacttreatment_deletion_wizard, - request, AdministrativeAct, pk): + if not wizard_is_available( + treatment_admacttreatment_deletion_wizard, request, AdministrativeAct, pk + ): return HttpResponseRedirect("/") wizard_url = "treatment_admacttreatment_deletion" AdministrativeActDeletionWizard.session_set_value( - request, 'selec-' + wizard_url, 'pk', pk, reset=True) - return redirect( - reverse(wizard_url, kwargs={'step': 'final-' + wizard_url})) + request, "selec-" + wizard_url, "pk", pk, reset=True + ) + return redirect(reverse(wizard_url, kwargs={"step": "final-" + wizard_url})) def treatment_adminact_add(request, pk, current_right=None): @@ -864,125 +938,169 @@ def treatment_adminact_add(request, pk, current_right=None): treatment_administrativeact_wizard(request) wizards.TreatmentAdministrativeActWizard.session_set_value( - request, 'selec-treatment_admacttreatment', 'pk', pk, reset=True) - return redirect(reverse( - 'treatment_admacttreatment', - kwargs={'step': 'administrativeact-treatment_admacttreatment'})) + request, "selec-treatment_admacttreatment", "pk", pk, reset=True + ) + return redirect( + reverse( + "treatment_admacttreatment", + kwargs={"step": "administrativeact-treatment_admacttreatment"}, + ) + ) # treatment request -treatmentfile_search_wizard = wizards.TreatmentFileSearch.as_view([ - ('general-treatmentfile_search', forms.TreatmentFileFormSelection)], +treatmentfile_search_wizard = wizards.TreatmentFileSearch.as_view( + [("general-treatmentfile_search", forms.TreatmentFileFormSelection)], label=_("Treatment request search"), - url_name='treatmentfile_search',) + url_name="treatmentfile_search", +) treatmentfile_wizard_steps = [ - ('treatmentfile-treatmentfile_creation', forms.TreatmentFileForm), - ('final-treatmentfile_creation', FinalForm)] + ("treatmentfile-treatmentfile_creation", forms.TreatmentFileForm), + ("final-treatmentfile_creation", FinalForm), +] treatmentfile_creation_wizard = wizards.TreatmentFileWizard.as_view( treatmentfile_wizard_steps, label=_("New treatment request"), - url_name='treatmentfile_creation',) - -treatmentfile_modification_wizard = \ - wizards.TreatmentFileModificationWizard.as_view( - [('selec-treatmentfile_modification', forms.TreatmentFileFormSelection), - ('treatmentfile-treatmentfile_modification', - forms.TreatmentFileModifyForm), - ('final-treatmentfile_modification', FinalForm)], - label=_("Treatment request modification"), - url_name='treatmentfile_modification', - ) + url_name="treatmentfile_creation", +) + +treatmentfile_modification_wizard = wizards.TreatmentFileModificationWizard.as_view( + [ + ("selec-treatmentfile_modification", forms.TreatmentFileFormSelection), + ("treatmentfile-treatmentfile_modification", forms.TreatmentFileModifyForm), + ("final-treatmentfile_modification", FinalForm), + ], + label=_("Treatment request modification"), + url_name="treatmentfile_modification", +) def treatmentfile_modify(request, pk): - if not wizard_is_available(treatmentfile_modification_wizard, request, - models.TreatmentFile, pk): + if not wizard_is_available( + treatmentfile_modification_wizard, request, models.TreatmentFile, pk + ): return HttpResponseRedirect("/") wizards.TreatmentFileModificationWizard.session_set_value( - request, 'selec-treatmentfile_modification', 'pk', pk, reset=True) - return redirect(reverse( - 'treatmentfile_modification', - kwargs={'step': 'treatmentfile-treatmentfile_modification'})) + request, "selec-treatmentfile_modification", "pk", pk, reset=True + ) + return redirect( + reverse( + "treatmentfile_modification", + kwargs={"step": "treatmentfile-treatmentfile_modification"}, + ) + ) def treatmentfile_add(request, basket_pk=None): treatmentfile_creation_wizard(request) wizards.TreatmentFileWizard.session_set_value( - request, 'treatmentfile-treatmentfile_creation', - 'associated_basket', basket_pk, reset=True) - url = reverse('treatmentfile_creation', - kwargs={'step': 'treatmentfile-treatmentfile_creation'}) + request, + "treatmentfile-treatmentfile_creation", + "associated_basket", + basket_pk, + reset=True, + ) + url = reverse( + "treatmentfile_creation", + kwargs={"step": "treatmentfile-treatmentfile_creation"}, + ) url += "?associated_basket={}".format(basket_pk) return redirect(url) -treatmentfile_deletion_wizard = wizards.TreatmentFileDeletionWizard.as_view([ - ('selec-treatmentfile_deletion', forms.TreatmentFileFormSelectionMultiple), - ('final-treatmentfile_deletion', forms.TreatmentFileDeletionForm)], +treatmentfile_deletion_wizard = wizards.TreatmentFileDeletionWizard.as_view( + [ + ("selec-treatmentfile_deletion", forms.TreatmentFileFormSelectionMultiple), + ("final-treatmentfile_deletion", forms.TreatmentFileDeletionForm), + ], label=_("Treatment request deletion"), - url_name='treatmentfile_deletion',) + url_name="treatmentfile_deletion", +) def treatmentfile_delete(request, pk): - if not wizard_is_available(treatmentfile_deletion_wizard, - request, models.TreatmentFile, pk): + if not wizard_is_available( + treatmentfile_deletion_wizard, request, models.TreatmentFile, pk + ): return HttpResponseRedirect("/") wizard_url = "treatmentfile_deletion" wizards.TreatmentFileDeletionWizard.session_set_value( - request, 'selec-' + wizard_url, 'pks', pk, reset=True) - return redirect( - reverse(wizard_url, kwargs={'step': 'final-' + wizard_url})) + request, "selec-" + wizard_url, "pks", pk, reset=True + ) + return redirect(reverse(wizard_url, kwargs={"step": "final-" + wizard_url})) -treatmentfile_admacttreatmentfile_search_wizard = \ - wizards.SearchWizard.as_view([ - ('selec-treatmentfle_admacttreatmentfle_search', - forms.AdministrativeActTreatmentFileFormSelection)], - label=_("Treatment request: search administrative act"), - url_name='treatmentfle_admacttreatmentfle_search',) +treatmentfile_admacttreatmentfile_search_wizard = wizards.SearchWizard.as_view( + [ + ( + "selec-treatmentfle_admacttreatmentfle_search", + forms.AdministrativeActTreatmentFileFormSelection, + ) + ], + label=_("Treatment request: search administrative act"), + url_name="treatmentfle_admacttreatmentfle_search", +) -treatmentfile_admacttreatmentfile_wizard = \ - wizards.TreatmentFileAdministrativeActWizard.as_view([ - ('selec-treatmentfle_admacttreatmentfle', - forms.TreatmentFileFormSelection), - ('admact-treatmentfle_admacttreatmentfle', - forms.AdministrativeActTreatmentFileForm), - ('final-treatmentfle_admacttreatmentfle', FinalForm)], +treatmentfile_admacttreatmentfile_wizard = ( + wizards.TreatmentFileAdministrativeActWizard.as_view( + [ + ("selec-treatmentfle_admacttreatmentfle", forms.TreatmentFileFormSelection), + ( + "admact-treatmentfle_admacttreatmentfle", + forms.AdministrativeActTreatmentFileForm, + ), + ("final-treatmentfle_admacttreatmentfle", FinalForm), + ], label=_("Treatment request: new administrative act"), - url_name='treatmentfle_admacttreatmentfle',) - -treatmentfile_admacttreatmentfile_modification_wizard = \ - wizards.TreatmentFileEditAdministrativeActWizard.as_view([ - ('selec-treatmentfle_admacttreatmentfle_modification', - forms.AdministrativeActTreatmentFileFormSelection), - ('admact-treatmentfle_admacttreatmentfle_modification', - forms.AdministrativeActTreatmentFileModifForm), - ('final-treatmentfle_admacttreatmentfle_modification', FinalForm)], + url_name="treatmentfle_admacttreatmentfle", + ) +) + +treatmentfile_admacttreatmentfile_modification_wizard = ( + wizards.TreatmentFileEditAdministrativeActWizard.as_view( + [ + ( + "selec-treatmentfle_admacttreatmentfle_modification", + forms.AdministrativeActTreatmentFileFormSelection, + ), + ( + "admact-treatmentfle_admacttreatmentfle_modification", + forms.AdministrativeActTreatmentFileModifForm, + ), + ("final-treatmentfle_admacttreatmentfle_modification", FinalForm), + ], label=_("Treatment request: administrative act modification"), - url_name='treatmentfle_admacttreatmentfle_modification',) + url_name="treatmentfle_admacttreatmentfle_modification", + ) +) def treatmentfile_administrativeacttreatmentfile_modify(request, pk): if not wizard_is_available( - treatmentfile_admacttreatmentfile_modification_wizard, - request, AdministrativeAct, pk): + treatmentfile_admacttreatmentfile_modification_wizard, + request, + AdministrativeAct, + pk, + ): return HttpResponseRedirect("/") wizards.TreatmentFileEditAdministrativeActWizard.session_set_value( request, - 'selec-treatmentfle_admacttreatmentfle_modification', - 'pk', pk, reset=True) + "selec-treatmentfle_admacttreatmentfle_modification", + "pk", + pk, + reset=True, + ) return redirect( reverse( - 'treatmentfle_admacttreatmentfle_modification', - kwargs={ - 'step': - 'admact-treatmentfle_admacttreatmentfle_modification' - })) + "treatmentfle_admacttreatmentfle_modification", + kwargs={"step": "admact-treatmentfle_admacttreatmentfle_modification"}, + ) + ) def treatmentfile_adminact_add(request, pk, current_right=None): @@ -993,59 +1111,75 @@ def treatmentfile_adminact_add(request, pk, current_right=None): treatmentfile_admacttreatmentfile_wizard(request) wizards.TreatmentFileAdministrativeActWizard.session_set_value( - request, 'selec-treatmentfle_admacttreatmentfle', 'pk', pk, reset=True) - return redirect(reverse( - 'treatmentfle_admacttreatmentfle', - kwargs={'step': 'admact-treatmentfle_admacttreatmentfle'})) - - -treatmentfile_admacttreatmentfile_deletion_wizard = \ - AdministrativeActDeletionWizard.as_view([ - ('selec-treatmentfle_admacttreatmentfle_deletion', - forms.AdministrativeActTreatmentFileFormSelection), - ('final-treatmentfle_admacttreatmentfle_deletion', - FinalAdministrativeActDeleteForm)], + request, "selec-treatmentfle_admacttreatmentfle", "pk", pk, reset=True + ) + return redirect( + reverse( + "treatmentfle_admacttreatmentfle", + kwargs={"step": "admact-treatmentfle_admacttreatmentfle"}, + ) + ) + + +treatmentfile_admacttreatmentfile_deletion_wizard = ( + AdministrativeActDeletionWizard.as_view( + [ + ( + "selec-treatmentfle_admacttreatmentfle_deletion", + forms.AdministrativeActTreatmentFileFormSelection, + ), + ( + "final-treatmentfle_admacttreatmentfle_deletion", + FinalAdministrativeActDeleteForm, + ), + ], label=_("Treatment request: administrative act deletion"), - url_name='treatmentfle_admacttreatmentfle_deletion',) + url_name="treatmentfle_admacttreatmentfle_deletion", + ) +) def treatmentfile_administrativeacttreatmentfile_delete(request, pk): if not wizard_is_available( - treatmentfile_admacttreatmentfile_deletion_wizard, request, - AdministrativeAct, pk): + treatmentfile_admacttreatmentfile_deletion_wizard, + request, + AdministrativeAct, + pk, + ): return HttpResponseRedirect("/") wizard_url = "treatmentfle_admacttreatmentfle_deletion" AdministrativeActDeletionWizard.session_set_value( - request, 'selec-' + wizard_url, 'pk', pk, reset=True) - return redirect( - reverse(wizard_url, kwargs={'step': 'final-' + wizard_url})) + request, "selec-" + wizard_url, "pk", pk, reset=True + ) + return redirect(reverse(wizard_url, kwargs={"step": "final-" + wizard_url})) def reset_wizards(request): for wizard_class, url_name in ( - (wizards.FindWizard, 'find_creation'), - (wizards.FindModificationWizard, 'find_modification'), - (wizards.FindDeletionWizard, 'find_deletion'), - (wizards.TreatmentWizard, 'treatement_creation'), - (wizards.TreatmentModificationWizard, 'treatment_modification'), - (wizards.TreatmentDeletionWizard, 'treatment_deletion'), - (wizards.TreatmentAdministrativeActWizard, - 'treatment_admacttreatment'), - (wizards.TreatmentEditAdministrativeActWizard, - 'treatment_admacttreatment_modification'), - (wizards.TreatmentDeletionWizard, - 'treatment_admacttreatment_deletion'), - (wizards.TreatmentFileWizard, - 'treatmentfile_creation'), - (wizards.TreatmentFileModificationWizard, - 'treatmentfile_modification'), - (wizards.TreatmentFileDeletionWizard, 'treatmentfile_deletion'), - (wizards.TreatmentFileAdministrativeActWizard, - 'treatmentfle_admacttreatmentfle'), - (wizards.TreatmentFileEditAdministrativeActWizard, - 'treatmentfle_admacttreatmentfle_modification'), - (AdministrativeActDeletionWizard, - 'treatmentfle_admacttreatmentfle_deletion'), + (wizards.FindWizard, "find_creation"), + (wizards.FindModificationWizard, "find_modification"), + (wizards.FindDeletionWizard, "find_deletion"), + (wizards.TreatmentWizard, "treatement_creation"), + (wizards.TreatmentModificationWizard, "treatment_modification"), + (wizards.TreatmentDeletionWizard, "treatment_deletion"), + (wizards.TreatmentAdministrativeActWizard, "treatment_admacttreatment"), + ( + wizards.TreatmentEditAdministrativeActWizard, + "treatment_admacttreatment_modification", + ), + (wizards.TreatmentDeletionWizard, "treatment_admacttreatment_deletion"), + (wizards.TreatmentFileWizard, "treatmentfile_creation"), + (wizards.TreatmentFileModificationWizard, "treatmentfile_modification"), + (wizards.TreatmentFileDeletionWizard, "treatmentfile_deletion"), + ( + wizards.TreatmentFileAdministrativeActWizard, + "treatmentfle_admacttreatmentfle", + ), + ( + wizards.TreatmentFileEditAdministrativeActWizard, + "treatmentfle_admacttreatmentfle_modification", + ), + (AdministrativeActDeletionWizard, "treatmentfle_admacttreatmentfle_deletion"), ): wizard_class.session_reset(request, url_name) @@ -1053,11 +1187,11 @@ def reset_wizards(request): class QAFindForm(QAItemEditForm): model = models.Find form_class = forms.QAFindFormMulti - template_name = 'ishtar/forms/qa_find_edit_form.html' + template_name = "ishtar/forms/qa_find_edit_form.html" class QAFindBasketFormView(QAItemForm): - template_name = 'ishtar/forms/qa_find_basket.html' + template_name = "ishtar/forms/qa_find_basket.html" model = models.Find form_class = forms.QAFindBasketForm page_name = _("Basket") @@ -1066,7 +1200,7 @@ class QAFindBasketFormView(QAItemForm): def get_form_kwargs(self): kwargs = super(QAFindBasketFormView, self).get_form_kwargs() - kwargs['user'] = self.request.user + kwargs["user"] = self.request.user return kwargs def form_valid(self, form): @@ -1075,7 +1209,7 @@ class QAFindBasketFormView(QAItemForm): class QAFindDuplicateFormView(QAItemForm): - template_name = 'ishtar/forms/qa_find_duplicate.html' + template_name = "ishtar/forms/qa_find_duplicate.html" model = models.Find page_name = _("Duplicate") form_class = forms.QAFindDuplicateForm @@ -1083,7 +1217,7 @@ class QAFindDuplicateFormView(QAItemForm): def get_form_kwargs(self): kwargs = super(QAFindDuplicateFormView, self).get_form_kwargs() - kwargs['user'] = self.request.user + kwargs["user"] = self.request.user return kwargs def form_valid(self, form): @@ -1091,18 +1225,17 @@ class QAFindDuplicateFormView(QAItemForm): return HttpResponseRedirect(reverse("success")) def get_context_data(self, **kwargs): - data = super(QAFindDuplicateFormView, self).get_context_data( - **kwargs) - data['action_name'] = _("Duplicate") + data = super(QAFindDuplicateFormView, self).get_context_data(**kwargs) + data["action_name"] = _("Duplicate") bf = self.items[0].get_first_base_find() if bf: - data['context_record'] = bf.context_record - data['operation'] = bf.context_record.operation + data["context_record"] = bf.context_record + data["operation"] = bf.context_record.operation return data class QAFindTreatmentFormView(QAItemForm): - template_name = 'ishtar/forms/qa_find_treatment.html' + template_name = "ishtar/forms/qa_find_treatment.html" model = models.Find form_class = forms.QAFindTreatmentForm page_name = _("Packaging") @@ -1110,7 +1243,8 @@ class QAFindTreatmentFormView(QAItemForm): def dispatch(self, request, *args, **kwargs): returned = super(QAFindTreatmentFormView, self).dispatch( - request, *args, **kwargs) + request, *args, **kwargs + ) for item in self.items: if item.is_locked(request.user): return HttpResponseRedirect(reverse("qa-not-available")) @@ -1118,8 +1252,8 @@ class QAFindTreatmentFormView(QAItemForm): def get_form_kwargs(self): kwargs = super(QAFindTreatmentFormView, self).get_form_kwargs() - kwargs['user'] = self.request.user - kwargs['prefix'] = "qa-packaging" + kwargs["user"] = self.request.user + kwargs["prefix"] = "qa-packaging" return kwargs def form_valid(self, form): @@ -1128,7 +1262,7 @@ class QAFindTreatmentFormView(QAItemForm): class QAFindbasketDuplicateFormView(QAItemForm): - template_name = 'ishtar/forms/qa_findbasket_duplicate.html' + template_name = "ishtar/forms/qa_findbasket_duplicate.html" model = models.FindBasket page_name = _("Duplicate") modal_size = "small" @@ -1137,7 +1271,7 @@ class QAFindbasketDuplicateFormView(QAItemForm): def get_form_kwargs(self): kwargs = super(QAFindbasketDuplicateFormView, self).get_form_kwargs() - kwargs['user'] = self.request.user + kwargs["user"] = self.request.user return kwargs def form_valid(self, form): @@ -1145,9 +1279,8 @@ class QAFindbasketDuplicateFormView(QAItemForm): return HttpResponseRedirect(reverse("success")) def get_context_data(self, **kwargs): - data = super(QAFindbasketDuplicateFormView, self).get_context_data( - **kwargs) - data['action_name'] = _("Duplicate") + data = super(QAFindbasketDuplicateFormView, self).get_context_data(**kwargs) + data["action_name"] = _("Duplicate") return data @@ -1166,22 +1299,24 @@ class PublicFindAPI(APIView): if not basket_slug: return empty try: - basket = models.FindBasket.objects.get( - slug=basket_slug, public=True) + basket = models.FindBasket.objects.get(slug=basket_slug, public=True) except models.FindBasket.DoesNotExist: return empty - q = models.FindBasket.items.through.objects.filter( - findbasket_id=basket.id).values("find_id").order_by("id") + q = ( + models.FindBasket.items.through.objects.filter(findbasket_id=basket.id) + .values("find_id") + .order_by("id") + ) id_list = [bi["find_id"] for bi in q] - clauses = ' '.join( - 'WHEN id=%s THEN %s' % (pk, i) for i, pk in enumerate(id_list) + clauses = " ".join( + "WHEN id=%s THEN %s" % (pk, i) for i, pk in enumerate(id_list) ) - ordering = 'CASE {} END'.format(clauses) + ordering = "CASE {} END".format(clauses) return models.Find.objects.filter(id__in=id_list).extra( - select={'ordering': ordering}, order_by=('ordering',)) + select={"ordering": ordering}, order_by=("ordering",) + ) def get(self, request, format=None): serializer = PublicSerializer(self.get_queryset(), many=True) return Response(serializer.data) - diff --git a/archaeological_finds/wizards.py b/archaeological_finds/wizards.py index d49529bf8..c4c191e4e 100644 --- a/archaeological_finds/wizards.py +++ b/archaeological_finds/wizards.py @@ -1,4 +1,4 @@ -#!/usr/bin/env python +#!/usr/bin/env python3 # -*- coding: utf-8 -*- # Copyright (C) 2012-2016 Étienne Loks <etienne.loks_AT_peacefrogsDOTnet> @@ -22,8 +22,12 @@ from django.core.exceptions import ObjectDoesNotExist, PermissionDenied from ishtar_common.utils import ugettext_lazy as _, pgettext from ishtar_common.forms import reverse_lazy -from ishtar_common.wizards import Wizard, DeletionWizard, SearchWizard, \ - MultipleDeletionWizard +from ishtar_common.wizards import ( + Wizard, + DeletionWizard, + SearchWizard, + MultipleDeletionWizard, +) from archaeological_operations.wizards import OperationAdministrativeActWizard from archaeological_operations.models import AdministrativeAct @@ -37,19 +41,19 @@ class FindSearch(SearchWizard): class FindWizard(Wizard): model = models.Find - wizard_done_window = reverse_lazy('show-find') + wizard_done_window = reverse_lazy("show-find") redirect_url = "find_modification" def get_current_contextrecord(self): step = self.steps.current if not step: return - if step.endswith('_creation'): # a context record has been selected - main_form_key = 'selecrecord-' + self.url_name + if step.endswith("_creation"): # a context record has been selected + main_form_key = "selecrecord-" + self.url_name try: - idx = int(self.session_get_value(main_form_key, 'pk')) + idx = int(self.session_get_value(main_form_key, "pk")) return ContextRecord.objects.get(pk=idx) - except(TypeError, ValueError, ObjectDoesNotExist): + except (TypeError, ValueError, ObjectDoesNotExist): pass current_item = self.get_current_object() if current_item: @@ -66,12 +70,14 @@ class FindWizard(Wizard): def get_form_kwargs(self, step=None): kwargs = super(FindWizard, self).get_form_kwargs(step) if step not in ( - 'find-find_creation', 'find-find_modification', - 'simplefind-find_modification',): + "find-find_creation", + "find-find_modification", + "simplefind-find_modification", + ): return kwargs - kwargs['context_record'] = self.get_current_contextrecord() - if step == 'simplefind-find_modification': - kwargs['base_finds'] = self.get_current_basefinds() + kwargs["context_record"] = self.get_current_contextrecord() + if step == "simplefind-find_modification": + kwargs["base_finds"] = self.get_current_basefinds() return kwargs def get_context_data(self, form, **kwargs): @@ -80,42 +86,57 @@ class FindWizard(Wizard): """ context = super(FindWizard, self).get_context_data(form, **kwargs) current_cr = self.get_current_contextrecord() - if not current_cr or self.steps.current.startswith('select-'): + if not current_cr or self.steps.current.startswith("select-"): return context - context['reminders'] = ( + context["reminders"] = ( (_("Operation"), str(current_cr.operation)), - (_("Context record"), str(current_cr))) + (_("Context record"), str(current_cr)), + ) return context def get_extra_model(self, dct, m2m, form_list): dct = super(FindWizard, self).get_extra_model(dct, m2m, form_list) - dct['order'] = 1 - if 'pk' in dct and type(dct['pk']) == ContextRecord: - dct['base_finds__context_record'] = dct.pop('pk') + dct["order"] = 1 + if "pk" in dct and type(dct["pk"]) == ContextRecord: + dct["base_finds__context_record"] = dct.pop("pk") return dct class FindModificationWizard(FindWizard): modification = True - main_item_select_keys = ('selec-', 'selecw-') + main_item_select_keys = ("selec-", "selecw-") filter_owns = { - 'selec-find_modification': ['pk'], - 'selecw-find_modification': ['pk'], + "selec-find_modification": ["pk"], + "selecw-find_modification": ["pk"], } wizard_templates = { - 'simplefind-find_modification': - 'ishtar/wizard/wizard_simplefind.html', + "simplefind-find_modification": "ishtar/wizard/wizard_simplefind.html", } class FindDeletionWizard(MultipleDeletionWizard): model = models.Find - main_item_select_keys = ('selec-', 'selecw-') - fields = ['label', 'material_types', 'datings', 'find_number', - 'object_types', 'description', 'conservatory_state', 'mark', - 'preservation_to_considers', 'integrities', 'remarkabilities', - 'volume', 'weight', 'length', 'width', 'height', 'diameter', - 'comment'] + main_item_select_keys = ("selec-", "selecw-") + fields = [ + "label", + "material_types", + "datings", + "find_number", + "object_types", + "description", + "conservatory_state", + "mark", + "preservation_to_considers", + "integrities", + "remarkabilities", + "volume", + "weight", + "length", + "width", + "height", + "diameter", + "comment", + ] redirect_url = "find_deletion" @@ -125,7 +146,7 @@ class TreatmentSearch(SearchWizard): class TreatmentBase(Wizard): model = models.Treatment - wizard_done_window = reverse_lazy('show-treatment') + wizard_done_window = reverse_lazy("show-treatment") base_url = "" saved_args = {"treatment_type_list": []} redirect_url = "treatment_search" @@ -134,55 +155,54 @@ class TreatmentBase(Wizard): step = self.steps.current if not step: return - find_form_key = 'selecfind-' + self.base_url + find_form_key = "selecfind-" + self.base_url find_ids = self.session_get_value(find_form_key, "resulting_pk") try: return [ models.Find.objects.get(pk=int(find_id.strip())) - for find_id in find_ids.split(',') + for find_id in find_ids.split(",") ] - except(TypeError, ValueError, AttributeError, ObjectDoesNotExist): + except (TypeError, ValueError, AttributeError, ObjectDoesNotExist): pass def get_form_initial(self, step, data=None): initial = super(TreatmentBase, self).get_form_initial(step) - base_step = 'basetreatment-' + self.base_url + base_step = "basetreatment-" + self.base_url if step != base_step: return initial finds = self.get_current_finds() if not finds: return initial - locations = [find.container.location.pk for find in finds - if find.container] + locations = [find.container.location.pk for find in finds if find.container] # no location or multiple locations if not locations or len(set(locations)) != 1: return initial if not initial: initial = {} - initial['location'] = locations[0] + initial["location"] = locations[0] return initial def get_extra_model(self, dct, m2m, form_list): dct = super(TreatmentBase, self).get_extra_model(dct, m2m, form_list) - dct['treatment_type_list'] = [] + dct["treatment_type_list"] = [] for k, v in m2m: - if k == 'treatment_type': + if k == "treatment_type": if type(v) not in (list, tuple): v = [v] - dct['treatment_type_list'] += v + dct["treatment_type_list"] += v return dct class TreatmentWizard(TreatmentBase): - basket_step = 'basetreatment-treatment_creation' + basket_step = "basetreatment-treatment_creation" saved_args = {"items": [], "treatment_type_list": []} - base_url = 'treatment_creation' + base_url = "treatment_creation" def get_form_kwargs(self, step, **kwargs): kwargs = super(TreatmentWizard, self).get_form_kwargs(step, **kwargs) if self.basket_step not in step: return kwargs - kwargs['user'] = self.request.user + kwargs["user"] = self.request.user return kwargs def get_extra_model(self, dct, m2m, form_list): @@ -190,13 +210,13 @@ class TreatmentWizard(TreatmentBase): Get items concerned by the treatment """ dct = super(TreatmentWizard, self).get_extra_model(dct, m2m, form_list) - if 'resulting_pk' in dct: - dct['items'] = [] - pks = dct.pop('resulting_pk') + if "resulting_pk" in dct: + dct["items"] = [] + pks = dct.pop("resulting_pk") if isinstance(pks, models.Find): pks = [pks] if not isinstance(pks, (list, tuple)): - pks = str(pks).split(',') + pks = str(pks).split(",") for pk in pks: if isinstance(pk, models.Find): @@ -206,17 +226,18 @@ class TreatmentWizard(TreatmentBase): find = models.Find.objects.get(pk=pk) except models.Find.DoesNotExist: raise PermissionDenied - dct['items'].append(find) - if 'basket' in dct: - basket = dct.pop('basket') - if basket.user.pk != dct['history_modifier'].pk: + dct["items"].append(find) + if "basket" in dct: + basket = dct.pop("basket") + if basket.user.pk != dct["history_modifier"].pk: raise PermissionDenied - dct['items'] = list(basket.items.all()) + dct["items"] = list(basket.items.all()) - if 'items' in dct: - for find in dct['items']: - if 'own' in self.current_right \ - and not find.is_own(dct['history_modifier']): + if "items" in dct: + for find in dct["items"]: + if "own" in self.current_right and not find.is_own( + dct["history_modifier"] + ): raise PermissionDenied return dct @@ -226,9 +247,12 @@ class TreatmentModificationWizard(TreatmentWizard): class TreatmentN1Wizard(TreatmentBase): - saved_args = {"upstream_items": [], "resulting_find": None, - "treatment_type_list": []} - base_url = 'treatment_creation_n1' + saved_args = { + "upstream_items": [], + "resulting_find": None, + "treatment_type_list": [], + } + base_url = "treatment_creation_n1" def _update_simple_initial_from_finds(self, initial, find, k): r_k = "resulting_" + k @@ -242,7 +266,7 @@ class TreatmentN1Wizard(TreatmentBase): def _update_multi_initial_from_finds(self, initial, find, k): r_k = "resulting_" + k - for value in getattr(find, k + 's').all(): + for value in getattr(find, k + "s").all(): if value.pk not in initial[r_k]: initial[r_k].append(value.pk) return initial @@ -256,7 +280,7 @@ class TreatmentN1Wizard(TreatmentBase): initial[r_k] += getattr(find, k) return initial - def _update_char_initial_from_finds(self, initial, find, k, sep=' ; '): + def _update_char_initial_from_finds(self, initial, find, k, sep=" ; "): r_k = "resulting_" + k value = getattr(find, k) if not value: @@ -266,24 +290,27 @@ class TreatmentN1Wizard(TreatmentBase): initial[r_k] = value else: # new value is entirely inside the current value - if value == initial[r_k] or (value + sep) in initial[r_k] or \ - (sep + value) in initial[r_k]: + if ( + value == initial[r_k] + or (value + sep) in initial[r_k] + or (sep + value) in initial[r_k] + ): return initial initial[r_k] += sep + value return initial def get_form_initial(self, step, data=None): initial = super(TreatmentN1Wizard, self).get_form_initial(step) - if step != 'resultingfind-treatment_creation_n1': + if step != "resultingfind-treatment_creation_n1": return initial finds = self.get_current_finds() if not finds: return initial - simple_key = ['material_type_quality'] - multi_key = ['material_type', 'object_type', 'communicabilitie'] - numeric_key = ['find_number', 'min_number_of_individuals'] - desc_key = ['decoration', 'inscription', 'comment', 'dating_comment'] - char_key = ['manufacturing_place'] + simple_key = ["material_type_quality"] + multi_key = ["material_type", "object_type", "communicabilitie"] + numeric_key = ["find_number", "min_number_of_individuals"] + desc_key = ["decoration", "inscription", "comment", "dating_comment"] + char_key = ["manufacturing_place"] for k in simple_key + numeric_key + desc_key + char_key: initial["resulting_" + k] = None @@ -292,20 +319,19 @@ class TreatmentN1Wizard(TreatmentBase): for find in finds: for k in simple_key: - initial = self._update_simple_initial_from_finds( - initial, find, k) + initial = self._update_simple_initial_from_finds(initial, find, k) for k in multi_key: - initial = self._update_multi_initial_from_finds( - initial, find, k) + initial = self._update_multi_initial_from_finds(initial, find, k) for k in numeric_key: - initial = self._update_num_initial_from_finds( - initial, find, k) + initial = self._update_num_initial_from_finds(initial, find, k) for k in char_key: initial = self._update_char_initial_from_finds( - initial, find, k, sep=' ; ') + initial, find, k, sep=" ; " + ) for k in desc_key: initial = self._update_char_initial_from_finds( - initial, find, k, sep='\n') + initial, find, k, sep="\n" + ) for k in list(initial.keys()): if initial[k] is None: @@ -316,16 +342,15 @@ class TreatmentN1Wizard(TreatmentBase): """ Get items concerned by the treatment """ - dct = super(TreatmentN1Wizard, self).get_extra_model( - dct, m2m, form_list) - if 'resulting_pk' not in dct: + dct = super(TreatmentN1Wizard, self).get_extra_model(dct, m2m, form_list) + if "resulting_pk" not in dct: return dct - dct['upstream_items'] = [] + dct["upstream_items"] = [] # manage upstream items - pks = dct.pop('resulting_pk') - if hasattr(pks, 'split'): - pks = pks.split(',') # string + pks = dct.pop("resulting_pk") + if hasattr(pks, "split"): + pks = pks.split(",") # string for pk in pks: if isinstance(pk, models.Find): find = pk @@ -334,60 +359,59 @@ class TreatmentN1Wizard(TreatmentBase): find = models.Find.objects.get(pk=pk) except models.Find.DoesNotExist: raise PermissionDenied - dct['upstream_items'].append(find) + dct["upstream_items"].append(find) - for find in dct['upstream_items']: - if 'own' in self.current_right \ - and not find.is_own(dct['history_modifier']): + for find in dct["upstream_items"]: + if "own" in self.current_right and not find.is_own(dct["history_modifier"]): raise PermissionDenied # extract data of the new find - dct['resulting_find'] = {} + dct["resulting_find"] = {} for k in list(dct.keys()): - if k.startswith('resulting_') and k != "resulting_find": - dct['resulting_find'][ - k[len('resulting_'):] - ] = dct.pop(k) + if k.startswith("resulting_") and k != "resulting_find": + dct["resulting_find"][k[len("resulting_") :]] = dct.pop(k) return dct class Treatment1NWizard(TreatmentBase): - saved_args = {"upstream_item": None, "resulting_finds": None, - "treatment_type_list": []} - base_url = 'treatment_creation_1n' + saved_args = { + "upstream_item": None, + "resulting_finds": None, + "treatment_type_list": [], + } + base_url = "treatment_creation_1n" redirect_url = "find_modification" open_created_in_redirect = False def get_form_kwargs(self, step, **kwargs): kwargs = super(Treatment1NWizard, self).get_form_kwargs(step, **kwargs) - if step != 'resultingfind-treatment_creation_1n': + if step != "resultingfind-treatment_creation_1n": return kwargs - kwargs['user'] = self.request.user + kwargs["user"] = self.request.user return kwargs def get_form_initial(self, step, data=None): initial = super(Treatment1NWizard, self).get_form_initial(step) - if step != 'resultingfinds-treatment_creation_1n': + if step != "resultingfinds-treatment_creation_1n": return initial finds = self.get_current_finds() if not finds: return initial lbl = finds[0].label - initial['resultings_basket_name'] = str(_("Basket")) + " - " + lbl - initial['resultings_label'] = lbl + "-" + initial["resultings_basket_name"] = str(_("Basket")) + " - " + lbl + initial["resultings_label"] = lbl + "-" return initial def get_extra_model(self, dct, m2m, form_list): """ Get items concerned by the treatment """ - dct = super(Treatment1NWizard, self).get_extra_model( - dct, m2m, form_list) - if 'resulting_pk' not in dct: + dct = super(Treatment1NWizard, self).get_extra_model(dct, m2m, form_list) + if "resulting_pk" not in dct: return dct # manage upstream item - pk = dct.pop('resulting_pk') + pk = dct.pop("resulting_pk") if isinstance(pk, models.Find): find = pk else: @@ -395,46 +419,61 @@ class Treatment1NWizard(TreatmentBase): find = models.Find.objects.get(pk=pk) except models.Find.DoesNotExist: raise PermissionDenied - dct['upstream_item'] = find + dct["upstream_item"] = find - if 'own' in self.current_right \ - and not find.is_own(dct['history_modifier']): + if "own" in self.current_right and not find.is_own(dct["history_modifier"]): raise PermissionDenied # extract attributes to generate the new find - dct['resulting_finds'] = {} + dct["resulting_finds"] = {} for k in list(dct.keys()): - if k.startswith('resultings_'): - dct['resulting_finds'][ - k[len('resultings_'):] - ] = dct.pop(k) + if k.startswith("resultings_"): + dct["resulting_finds"][k[len("resultings_") :]] = dct.pop(k) messages.add_message( - self.request, messages.INFO, - str(_("The new basket: \"{}\" have been created with the " - "resulting items. This search have been pinned.") - ).format(dct["resulting_finds"]["basket_name"]) + self.request, + messages.INFO, + str( + _( + 'The new basket: "{}" have been created with the ' + "resulting items. This search have been pinned." + ) + ).format(dct["resulting_finds"]["basket_name"]), ) self.request.session["pin-search-find"] = '{}="{}"'.format( str(pgettext("key for text search", "basket")), - dct["resulting_finds"]["basket_name"]) - self.request.session['find'] = '' + dct["resulting_finds"]["basket_name"], + ) + self.request.session["find"] = "" return dct class TreatmentDeletionWizard(DeletionWizard): model = models.Treatment - wizard_confirm = 'ishtar/wizard/wizard_treatement_deletion.html' - fields = ['label', 'other_reference', 'year', 'index', - 'treatment_types', 'location', 'person', 'organization', - 'external_id', 'comment', 'description', - 'goal', 'start_date', 'end_date', 'container'] + wizard_confirm = "ishtar/wizard/wizard_treatement_deletion.html" + fields = [ + "label", + "other_reference", + "year", + "index", + "treatment_types", + "location", + "person", + "organization", + "external_id", + "comment", + "description", + "goal", + "start_date", + "end_date", + "container", + ] redirect_url = "treatment_deletion" class TreatmentAdministrativeActWizard(OperationAdministrativeActWizard): model = models.Treatment - current_obj_slug = 'administrativeacttreatment' - ref_object_key = 'treatment' + current_obj_slug = "administrativeacttreatment" + ref_object_key = "treatment" redirect_url = "treatment_admacttreatment_modification" def get_reminder(self): @@ -455,7 +494,7 @@ class TreatmentFileSearch(SearchWizard): class TreatmentFileWizard(Wizard): model = models.TreatmentFile - wizard_done_window = reverse_lazy('show-treatmentfile') + wizard_done_window = reverse_lazy("show-treatmentfile") redirect_url = "treatmentfile_modification" @@ -465,29 +504,40 @@ class TreatmentFileModificationWizard(TreatmentFileWizard): class TreatmentFileDeletionWizard(MultipleDeletionWizard): model = models.TreatmentFile - fields = ['name', 'internal_reference', 'external_id', 'year', - 'index', 'type', 'in_charge', 'reception_date', - 'creation_date', 'end_date', 'comment'] + fields = [ + "name", + "internal_reference", + "external_id", + "year", + "index", + "type", + "in_charge", + "reception_date", + "creation_date", + "end_date", + "comment", + ] redirect_url = "treatmentfile_deletion" -class TreatmentFileAdministrativeActWizard( - OperationAdministrativeActWizard): +class TreatmentFileAdministrativeActWizard(OperationAdministrativeActWizard): model = models.TreatmentFile - current_obj_slug = 'administrativeacttreatmentfile' - ref_object_key = 'treatment_file' + current_obj_slug = "administrativeacttreatmentfile" + ref_object_key = "treatment_file" redirect_url = "treatmentfle_admacttreatmentfle_modification" def get_reminder(self): - form_key = 'selec-' + self.url_name - if self.url_name.endswith('_administrativeactop'): + form_key = "selec-" + self.url_name + if self.url_name.endswith("_administrativeactop"): # modification and deletion are suffixed with '_modification' # and '_deletion' so it is creation pk = self.session_get_value(form_key, "pk") try: return ( - (_("Treatment request"), - str(models.TreatmentFile.objects.get(pk=pk))), + ( + _("Treatment request"), + str(models.TreatmentFile.objects.get(pk=pk)), + ), ) except models.TreatmentFile.DoesNotExist: return @@ -497,15 +547,12 @@ class TreatmentFileAdministrativeActWizard( admin = AdministrativeAct.objects.get(pk=admin_id) if not admin.operation: return - return ( - (_("Operation"), str(admin.operation)), - ) + return ((_("Operation"), str(admin.operation)),) except AdministrativeAct.DoesNotExist: return -class TreatmentFileEditAdministrativeActWizard( - TreatmentFileAdministrativeActWizard): +class TreatmentFileEditAdministrativeActWizard(TreatmentFileAdministrativeActWizard): model = AdministrativeAct edit = True @@ -519,25 +566,24 @@ class FindBasketSearch(SearchWizard): class FindBasketWizard(Wizard): model = models.FindBasket - wizard_done_window = reverse_lazy('show-findbasket') + wizard_done_window = reverse_lazy("show-findbasket") redirect_url = "find_basket_modification" class FindBasketEditWizard(FindBasketWizard): edit = True - alt_is_own_method = 'get_write_query_owns' + alt_is_own_method = "get_write_query_owns" def get_form_kwargs(self, step, **kwargs): - kwargs = super(FindBasketEditWizard, self).get_form_kwargs( - step, **kwargs) - if step != 'basket-find_basket_modification': + kwargs = super(FindBasketEditWizard, self).get_form_kwargs(step, **kwargs) + if step != "basket-find_basket_modification": return kwargs - kwargs['basket_pk'] = self.get_current_object().pk - kwargs['user'] = self.request.user + kwargs["basket_pk"] = self.get_current_object().pk + kwargs["user"] = self.request.user return kwargs class FindBasketDeletionWizard(DeletionWizard): model = models.FindBasket redirect_url = "find_basket_deletion" - wizard_confirm = 'ishtar/wizard/wizard_findbasket_deletion.html' + wizard_confirm = "ishtar/wizard/wizard_findbasket_deletion.html" |