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 | baf29e1bb4b18fb9830956c53f3475db2f828e3f (patch) | |
tree | 31b6b0a838b83efce2437d956a4f8d1a54f0aae6 /archaeological_finds/models_treatments.py | |
parent | 9d662a73d94264e2129195018d230481e1e2272f (diff) | |
download | Ishtar-baf29e1bb4b18fb9830956c53f3475db2f828e3f.tar.bz2 Ishtar-baf29e1bb4b18fb9830956c53f3475db2f828e3f.zip |
Format - black: finds
Diffstat (limited to 'archaeological_finds/models_treatments.py')
-rw-r--r-- | archaeological_finds/models_treatments.py | 800 |
1 files changed, 465 insertions, 335 deletions
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) |