diff options
author | Étienne Loks <etienne.loks@iggdrasil.net> | 2018-11-21 10:22:04 +0100 |
---|---|---|
committer | Étienne Loks <etienne.loks@iggdrasil.net> | 2018-11-28 11:40:17 +0100 |
commit | 3e14b1202b3435113d070fa53f93ab62b2833c8d (patch) | |
tree | 502ce32ca69676471356322b03f3a83febd9caec | |
parent | c943fb4cbfa56163f93f88e50614613839fc77c8 (diff) | |
download | Ishtar-3e14b1202b3435113d070fa53f93ab62b2833c8d.tar.bz2 Ishtar-3e14b1202b3435113d070fa53f93ab62b2833c8d.zip |
Manage treatment with no creation new of item
-rw-r--r-- | archaeological_files/wizards.py | 4 | ||||
-rw-r--r-- | archaeological_finds/admin.py | 5 | ||||
-rw-r--r-- | archaeological_finds/forms.py | 7 | ||||
-rw-r--r-- | archaeological_finds/migrations/0040_auto_20181120_1027.py | 33 | ||||
-rw-r--r-- | archaeological_finds/models_finds.py | 4 | ||||
-rw-r--r-- | archaeological_finds/models_treatments.py | 51 | ||||
-rw-r--r-- | archaeological_finds/wizards.py | 38 | ||||
-rw-r--r-- | archaeological_operations/wizards.py | 2 | ||||
-rw-r--r-- | archaeological_warehouse/wizards.py | 2 | ||||
-rw-r--r-- | ishtar_common/wizards.py | 8 |
10 files changed, 115 insertions, 39 deletions
diff --git a/archaeological_files/wizards.py b/archaeological_files/wizards.py index 106008192..c9b1ba9c2 100644 --- a/archaeological_files/wizards.py +++ b/archaeological_files/wizards.py @@ -43,8 +43,8 @@ class FileWizard(OperationWizard): town_step_keys = ['towns-'] wizard_done_window = reverse_lazy('show-file') - def get_extra_model(self, dct, form_list): - dct = super(FileWizard, self).get_extra_model(dct, form_list) + def get_extra_model(self, dct, m2m, form_list): + dct = super(FileWizard, self).get_extra_model(dct, m2m, form_list) if not dct.get('numeric_reference'): current_ref = models.File.objects.filter(year=dct['year'])\ .aggregate(Max('numeric_reference'))["numeric_reference__max"] diff --git a/archaeological_finds/admin.py b/archaeological_finds/admin.py index 1513c7eeb..033d5bb96 100644 --- a/archaeological_finds/admin.py +++ b/archaeological_finds/admin.py @@ -157,7 +157,10 @@ admin_site.register(models.CommunicabilityType, HierarchicalTypeAdmin) class TreatmentTypeAdmin(GeneralTypeAdmin): list_display = HierarchicalTypeAdmin.list_display + [ - 'order', 'virtual', 'upstream_is_many', 'downstream_is_many'] + 'order', 'virtual', 'destructive', 'create_new_find', + 'upstream_is_many', 'downstream_is_many'] + list_filter = ['virtual', 'destructive', 'create_new_find', + 'upstream_is_many', 'downstream_is_many'] model = models.TreatmentType diff --git a/archaeological_finds/forms.py b/archaeological_finds/forms.py index b95ac90c6..90e1390bf 100644 --- a/archaeological_finds/forms.py +++ b/archaeological_finds/forms.py @@ -532,19 +532,20 @@ class QAFindFormMulti(QAForm): MULTI = True REPLACE_FIELDS = [ - 'qa_ue', 'qa_manufacturing_place', 'qa_checked_type', 'qa_check_date' + 'qa_denomination', 'qa_ue', 'qa_manufacturing_place', 'qa_checked_type', + 'qa_check_date' ] HEADERS = { 'qa_ue': FormHeader(_(u"Context record")), - 'qa_label': FormHeader(_(u"Identification")), + 'qa_denomination': FormHeader(_(u"Identification")), 'qa_description': FormHeader(_(u"Description")), 'qa_checked_type': FormHeader(_(u"Sheet")), 'qa_period': FormHeader(_(u"Datation")), } SINGLE_FIELDS = [ - 'qa_label', 'qa_denomination', 'qa_previous_id', + 'qa_label', 'qa_previous_id', 'qa_get_first_base_find__excavation_id', 'qa_museum_id', 'qa_seal_number', 'qa_mark' ] diff --git a/archaeological_finds/migrations/0040_auto_20181120_1027.py b/archaeological_finds/migrations/0040_auto_20181120_1027.py new file mode 100644 index 000000000..fd649dd8f --- /dev/null +++ b/archaeological_finds/migrations/0040_auto_20181120_1027.py @@ -0,0 +1,33 @@ +# -*- coding: utf-8 -*- +# Generated by Django 1.11.10 on 2018-11-20 10:27 +from __future__ import unicode_literals + +from django.db import migrations, models + + +def init_create_new_find(apps, schema): + TreatmentType = apps.get_model('archaeological_finds', 'TreatmentType') + for tp in TreatmentType.objects.all(): + if (tp.upstream_is_many or tp.downstream_is_many) and not tp.virtual: + tp.create_new_find = True + tp.save() + + +class Migration(migrations.Migration): + + dependencies = [ + ('archaeological_finds', '0039_auto_20181115_1649'), + ] + + operations = [ + migrations.AlterModelOptions( + name='treatment', + options={'ordering': ('start_date',), 'permissions': (('view_treatment', 'Can view all Treatments'), ('view_own_treatment', 'Can view own Treatment'), ('add_own_treatment', 'Can add own Treatment'), ('change_own_treatment', 'Can change own Treatment'), ('delete_own_treatment', 'Can delete own Treatment')), 'verbose_name': 'Treatment', 'verbose_name_plural': 'Treatments'}, + ), + migrations.AddField( + model_name='treatmenttype', + name='create_new_find', + field=models.BooleanField(default=False, help_text='If True when this treatment is applied a new version of the object will be created.', verbose_name='Create a new find'), + ), + migrations.RunPython(init_create_new_find) + ] diff --git a/archaeological_finds/models_finds.py b/archaeological_finds/models_finds.py index e856cb8ca..c7bd3f64e 100644 --- a/archaeological_finds/models_finds.py +++ b/archaeological_finds/models_finds.py @@ -92,6 +92,10 @@ class TreatmentType(HierarchicalType): order = models.IntegerField(_(u"Order"), default=10) virtual = models.BooleanField(_(u"Virtual")) destructive = models.BooleanField(_(u"Destructive"), default=False) + create_new_find = models.BooleanField( + _(u"Create a new find"), default=False, + help_text=_(u"If True when this treatment is applied a new version " + u"of the object will be created.")) upstream_is_many = models.BooleanField( _(u"Upstream is many"), default=False, help_text=_( diff --git a/archaeological_finds/models_treatments.py b/archaeological_finds/models_treatments.py index 68935f142..b1ad5fa41 100644 --- a/archaeological_finds/models_treatments.py +++ b/archaeological_finds/models_treatments.py @@ -74,7 +74,8 @@ class Treatment(DashboardFormItem, ValueGetter, BaseHistorizedItem, } # extra keys than can be passed to save method EXTRA_SAVED_KEYS = ('items', 'user', 'resulting_find', 'upstream_items', - 'resulting_finds', 'upstream_item') + 'resulting_finds', 'upstream_item', + 'treatment_type_list') # alternative names of fields for searches ALT_NAMES = { @@ -295,7 +296,8 @@ class Treatment(DashboardFormItem, ValueGetter, BaseHistorizedItem, if q.count(): self.index = q.all().aggregate(Max('index'))['index__max'] + 1 - def _create_n_1_resulting_find(self, resulting_find, upstream_items): + def _create_n_1_resulting_find(self, resulting_find, upstream_items, + treatment_types): """ Manage creation of n<->1 treatment """ @@ -319,6 +321,9 @@ class Treatment(DashboardFormItem, ValueGetter, BaseHistorizedItem, except TypeError: m2m_field.add(m2m[k]) + create_new_find = bool([tp for tp in treatment_types + if tp.create_new_find]) + dating_keys = ["period", "start_date", "end_date", "dating_type", "quality", "precise_dating"] current_datings = [] @@ -361,14 +366,19 @@ class Treatment(DashboardFormItem, ValueGetter, BaseHistorizedItem, new_find.data = update_data(new_find.data, upstream_item.data, merge=True) - upstream_item.downstream_treatment = self - upstream_item.history_modifier = self.history_modifier - upstream_item.save() + if create_new_find: + upstream_item.downstream_treatment = self + upstream_item.history_modifier = self.history_modifier + upstream_item.save() + else: + self.finds.add(upstream_item) + new_find.upstream_treatment = self new_find.skip_history_when_saving = True new_find.save() - def _create_1_n_resulting_find(self, resulting_finds, upstream_item, user): + def _create_1_n_resulting_find(self, resulting_finds, upstream_item, user, + treatment_types): """ Manage creation of 1<->n treatment """ @@ -384,9 +394,15 @@ class Treatment(DashboardFormItem, ValueGetter, BaseHistorizedItem, new_find.save() new_items.append(new_find) - upstream_item.downstream_treatment = self - upstream_item.skip_history_when_saving = True - upstream_item.save() + create_new_find = bool([tp for tp in treatment_types + if tp.create_new_find]) + + if create_new_find: + upstream_item.downstream_treatment = self + upstream_item.skip_history_when_saving = True + upstream_item.save() + else: + self.finds.add(upstream_item) if getattr(user, 'ishtaruser', None): b = FindBasket.objects.create( @@ -397,6 +413,7 @@ class Treatment(DashboardFormItem, ValueGetter, BaseHistorizedItem, def save(self, *args, **kwargs): items, user, extra_args_for_new, resulting_find = [], None, [], None upstream_items, upstream_item, resulting_finds = [], None, None + treatment_types = [] if "items" in kwargs: items = kwargs.pop('items') if "resulting_find" in kwargs: @@ -411,6 +428,8 @@ class Treatment(DashboardFormItem, ValueGetter, BaseHistorizedItem, user = kwargs.pop('user') if "extra_args_for_new" in kwargs: extra_args_for_new = kwargs.pop('extra_args_for_new') + if "treatment_type_list" in kwargs: + treatment_types = kwargs.pop('treatment_type_list') self.pre_save() super(Treatment, self).save(*args, **kwargs) updated = [] @@ -421,18 +440,20 @@ class Treatment(DashboardFormItem, ValueGetter, BaseHistorizedItem, upstream_items = upstream_items.items.all() if upstream_items and resulting_find: - self._create_n_1_resulting_find(resulting_find, upstream_items) + self._create_n_1_resulting_find(resulting_find, upstream_items, + treatment_types) return if upstream_item and resulting_finds: - self._create_1_n_resulting_find(resulting_finds, upstream_item, - self.history_modifier) + self._create_1_n_resulting_find( + resulting_finds, upstream_item, self.history_modifier, + treatment_types) return - tps = list(self.treatment_types.all()) - has_destructive_tp = bool([tp for tp in tps if tp.destructive]) + create_new_find = bool([tp for tp in treatment_types + if tp.create_new_find]) for item in items: - if not has_destructive_tp: + if not create_new_find: self.finds.add(item) else: new = item.duplicate(user) diff --git a/archaeological_finds/wizards.py b/archaeological_finds/wizards.py index bd16a55de..29ca50056 100644 --- a/archaeological_finds/wizards.py +++ b/archaeological_finds/wizards.py @@ -86,8 +86,8 @@ class FindWizard(Wizard): (_(u"Context record"), unicode(current_cr))) return context - def get_extra_model(self, dct, form_list): - dct = super(FindWizard, self).get_extra_model(dct, form_list) + 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') @@ -125,6 +125,7 @@ class TreatmentBase(Wizard): model = models.Treatment wizard_done_window = reverse_lazy('show-treatment') base_url = "" + saved_args = {"treatment_type_list": []} def get_current_finds(self): step = self.steps.current @@ -158,10 +159,20 @@ class TreatmentBase(Wizard): 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'] = [] + for k, v in m2m: + if k == 'treatment_type': + if type(v) not in (list, tuple): + v = [v] + dct['treatment_type_list'] += v + return dct + class TreatmentWizard(TreatmentBase): basket_step = 'basetreatment-treatment_creation' - saved_args = {"items": []} + saved_args = {"items": [], "treatment_type_list": []} base_url = 'treatment_creation' def get_form_kwargs(self, step, **kwargs): @@ -171,11 +182,11 @@ class TreatmentWizard(TreatmentBase): kwargs['user'] = self.request.user return kwargs - def get_extra_model(self, dct, form_list): + def get_extra_model(self, dct, m2m, form_list): """ Get items concerned by the treatment """ - dct = super(TreatmentWizard, self).get_extra_model(dct, form_list) + dct = super(TreatmentWizard, self).get_extra_model(dct, m2m, form_list) if 'resulting_pk' in dct: dct['items'] = [] pks = dct.pop('resulting_pk').split(u',') @@ -203,7 +214,8 @@ class TreatmentModificationWizard(TreatmentWizard): class TreatmentN1Wizard(TreatmentBase): - saved_args = {"upstream_items": [], "resulting_find": None} + 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): @@ -282,11 +294,12 @@ class TreatmentN1Wizard(TreatmentBase): initial.pop(k) return initial - def get_extra_model(self, dct, form_list): + def get_extra_model(self, dct, m2m, form_list): """ Get items concerned by the treatment """ - dct = super(TreatmentN1Wizard, self).get_extra_model(dct, form_list) + dct = super(TreatmentN1Wizard, self).get_extra_model( + dct, m2m, form_list) if 'resulting_pk' not in dct: return dct @@ -318,7 +331,8 @@ class TreatmentN1Wizard(TreatmentBase): class Treatment1NWizard(TreatmentBase): - saved_args = {"upstream_item": None, "resulting_finds": None} + saved_args = {"upstream_item": None, "resulting_finds": None, + "treatment_type_list": []} base_url = 'treatment_creation_1n' def get_form_kwargs(self, step, **kwargs): @@ -340,11 +354,12 @@ class Treatment1NWizard(TreatmentBase): initial['resultings_label'] = lbl + u"-" return initial - def get_extra_model(self, dct, form_list): + def get_extra_model(self, dct, m2m, form_list): """ Get items concerned by the treatment """ - dct = super(Treatment1NWizard, self).get_extra_model(dct, form_list) + dct = super(Treatment1NWizard, self).get_extra_model( + dct, m2m, form_list) if 'resulting_pk' not in dct: return dct @@ -373,7 +388,6 @@ class Treatment1NWizard(TreatmentBase): u"resulting items. This search have been pinned.") ).format(dct["resulting_finds"]["basket_name"]) ) - self.request.session["pin-search-find"] = u'{}="{}"'.format( unicode(pgettext("key for text search", u"basket")), dct["resulting_finds"]["basket_name"]) diff --git a/archaeological_operations/wizards.py b/archaeological_operations/wizards.py index de38beb95..798e622b4 100644 --- a/archaeological_operations/wizards.py +++ b/archaeological_operations/wizards.py @@ -332,7 +332,7 @@ class OperationAdministrativeActWizard(OperationWizard): except models.AdministrativeAct.DoesNotExist: return - def get_extra_model(self, dct, form_list): + def get_extra_model(self, dct, m2m, form_list): dct['history_modifier'] = self.request.user return dct diff --git a/archaeological_warehouse/wizards.py b/archaeological_warehouse/wizards.py index 8ee2c2972..a0d46e892 100644 --- a/archaeological_warehouse/wizards.py +++ b/archaeological_warehouse/wizards.py @@ -49,7 +49,7 @@ class PackagingWizard(TreatmentWizard): def save_model(self, dct, m2m, whole_associated_models, form_list, return_object): - dct = self.get_extra_model(dct, form_list) + dct = self.get_extra_model(dct, m2m, form_list) obj = self.get_current_saved_object() dct['location'] = dct['container'].location items = None diff --git a/ishtar_common/wizards.py b/ishtar_common/wizards.py index 7fd19f721..b3fc4b55a 100644 --- a/ishtar_common/wizards.py +++ b/ishtar_common/wizards.py @@ -439,7 +439,7 @@ class Wizard(IshtarWizard): datas.append((form.form_label, form_datas)) return datas - def get_extra_model(self, dct, form_list): + def get_extra_model(self, dct, m2m, form_list): dct['history_modifier'] = self.request.user return dct @@ -552,7 +552,7 @@ class Wizard(IshtarWizard): def save_model(self, dct, m2m, whole_associated_models, form_list, return_object): - dct = self.get_extra_model(dct, form_list) + dct = self.get_extra_model(dct, m2m, form_list) obj = self.get_current_saved_object() data = {} if obj and hasattr(obj, 'data'): @@ -1787,8 +1787,8 @@ class AccountWizard(Wizard): class SourceWizard(Wizard): model = None - def get_extra_model(self, dct, form_list): - dct = super(SourceWizard, self).get_extra_model(dct, form_list) + def get_extra_model(self, dct, m2m, form_list): + dct = super(SourceWizard, self).get_extra_model(dct, m2m, form_list) if 'history_modifier' in dct: dct.pop('history_modifier') return dct |