diff options
author | Étienne Loks <etienne.loks@iggdrasil.net> | 2018-12-11 18:31:27 +0100 |
---|---|---|
committer | Étienne Loks <etienne.loks@iggdrasil.net> | 2018-12-11 18:32:12 +0100 |
commit | a6744b28502f13b5c66e77c071471e511314e5d6 (patch) | |
tree | 7d5391e7eb706d346080ec30a802ebf88bc218bd | |
parent | d249f79bdfa5eb1599cd55b81b7047ad79dfb19a (diff) | |
download | Ishtar-a6744b28502f13b5c66e77c071471e511314e5d6.tar.bz2 Ishtar-a6744b28502f13b5c66e77c071471e511314e5d6.zip |
Manage treatment state and effective execution
-rw-r--r-- | archaeological_finds/admin.py | 6 | ||||
-rw-r--r-- | archaeological_finds/forms_treatments.py | 20 | ||||
-rw-r--r-- | archaeological_finds/migrations/0050_auto_20181211_1509.py | 51 | ||||
-rw-r--r-- | archaeological_finds/migrations/0051_auto_20181211_1530.py | 22 | ||||
-rw-r--r-- | archaeological_finds/migrations/0052_auto_20181211_1558.py | 33 | ||||
-rw-r--r-- | archaeological_finds/models_treatments.py | 46 | ||||
-rw-r--r-- | archaeological_finds/views.py | 2 | ||||
-rw-r--r-- | archaeological_finds/wizards.py | 9 |
8 files changed, 175 insertions, 14 deletions
diff --git a/archaeological_finds/admin.py b/archaeological_finds/admin.py index 2fb3b492b..45050eb2e 100644 --- a/archaeological_finds/admin.py +++ b/archaeological_finds/admin.py @@ -187,10 +187,14 @@ class TreatmentFileType(GeneralTypeAdmin): list_display = GeneralTypeAdmin.list_display + ["treatment_type"] +@admin.register(models.TreatmentState, site=admin_site) +class TreatmentState(GeneralTypeAdmin): + list_display = GeneralTypeAdmin.list_display[:-1] + ["order", "executed"] + + general_models = [ models.RemarkabilityType, models.IntegrityType, - models.TreatmentState, models.BatchType, models.AlterationCauseType, models.AlterationType, models.TreatmentEmergencyType, models.ObjectTypeQualityType, models.MaterialTypeQualityType diff --git a/archaeological_finds/forms_treatments.py b/archaeological_finds/forms_treatments.py index 59df12df2..10f107814 100644 --- a/archaeological_finds/forms_treatments.py +++ b/archaeological_finds/forms_treatments.py @@ -96,8 +96,7 @@ class BaseTreatmentForm(CustomForm, ManageOldType): treatment_type = widgets.Select2MultipleField( label=_(u"Treatment type"), choices=[], widget=widgets.CheckboxSelectMultiple) - treatment_state = forms.ChoiceField(label=_(u"State"), - choices=[], required=False) + treatment_state = forms.ChoiceField(label=_(u"State"), choices=[]) year = forms.IntegerField(label=_("Year"), initial=lambda: datetime.datetime.now().year, validators=[validators.MinValueValidator(1000), @@ -151,9 +150,11 @@ class BaseTreatmentForm(CustomForm, ManageOldType): required=False) insurance_cost = forms.FloatField(label=_(u"Insurance cost ({currency})"), required=False) + executed = forms.BooleanField(required=False, disabled=True, + widget=forms.HiddenInput) TYPES = [ - FieldType('treatment_state', models.TreatmentState), + FieldType('treatment_state', models.TreatmentState, True), FieldType( 'treatment_type', models.TreatmentType, is_multiple=True, extra_args={'dct': {'upstream_is_many': False, @@ -162,6 +163,7 @@ class BaseTreatmentForm(CustomForm, ManageOldType): def __init__(self, *args, **kwargs): user = kwargs.pop('user') + print(args, kwargs) super(BaseTreatmentForm, self).__init__(*args, **kwargs) # set current currency currency = get_current_profile().currency @@ -170,6 +172,12 @@ class BaseTreatmentForm(CustomForm, ManageOldType): self.fields[key].label = self.fields[key].label.format( currency=currency) + initial = kwargs.get('initial', {}) + if initial.get('executed', False): + self.fields['treatment_state'].choices = \ + models.TreatmentState.get_types(empty_first=False, + dct={'executed': True}) + q = Person.objects.filter(ishtaruser__pk=user.pk) if q.count(): person = q.all()[0] @@ -261,7 +269,8 @@ class N1TreatmentForm(BaseTreatmentForm): form_slug = "treatmentn1-020-general" TYPES = [ - FieldType('treatment_state', models.TreatmentState), + FieldType('treatment_state', models.TreatmentState, True, + extra_args={'dct': {"executed": True}}), FieldType( 'treatment_type', models.TreatmentType, is_multiple=True, extra_args={'dct': {'upstream_is_many': True, @@ -274,7 +283,8 @@ class OneNTreatmentForm(BaseTreatmentForm): form_slug = "treatment1n-020-general" TYPES = [ - FieldType('treatment_state', models.TreatmentState), + FieldType('treatment_state', models.TreatmentState, True, + extra_args={'dct': {"executed": True}}), FieldType( 'treatment_type', models.TreatmentType, is_multiple=True, extra_args={'dct': {'upstream_is_many': False, diff --git a/archaeological_finds/migrations/0050_auto_20181211_1509.py b/archaeological_finds/migrations/0050_auto_20181211_1509.py new file mode 100644 index 000000000..c9928d617 --- /dev/null +++ b/archaeological_finds/migrations/0050_auto_20181211_1509.py @@ -0,0 +1,51 @@ +# -*- coding: utf-8 -*- +# Generated by Django 1.11.10 on 2018-12-11 15:09 +from __future__ import unicode_literals + +from django.db import migrations, models + + +def migrate_treatment_states(apps, schema): + TreatmentState = apps.get_model('archaeological_finds', 'TreatmentState') + q = TreatmentState.objects.filter(txt_idx="completed") + if q.count(): + t = q.all()[0] + t.executed = True + t.save() + for t in TreatmentState.objects.all(): + t.txt_idx = t.txt_idx.replace("_", "-") + t.save() + orders = [(10, "planned"), (20, "to-be-confirmed"), (30, "in-progress"), + (40, "completed"), (50, "cancelled"), (60, "unknown"),] + for order, txt_idx in orders: + q = TreatmentState.objects.filter(txt_idx=txt_idx) + if not q.count(): + continue + t = q.all()[0] + t.order = order + t.save() + + +class Migration(migrations.Migration): + + dependencies = [ + ('archaeological_finds', '0049_auto_20181210_1518'), + ] + + operations = [ + migrations.AlterModelOptions( + name='treatmentstate', + options={'ordering': ('order', 'label'), 'verbose_name': "Type d'\xe9tat de traitement", 'verbose_name_plural': "Types d'\xe9tat de traitement"}, + ), + migrations.AddField( + model_name='treatmentstate', + name='executed', + field=models.BooleanField(default=False, verbose_name='Treatment is executed'), + ), + migrations.AddField( + model_name='treatmentstate', + name='order', + field=models.IntegerField(default=10, verbose_name='Ordre'), + ), + migrations.RunPython(migrate_treatment_states) + ] diff --git a/archaeological_finds/migrations/0051_auto_20181211_1530.py b/archaeological_finds/migrations/0051_auto_20181211_1530.py new file mode 100644 index 000000000..9bcdb60a7 --- /dev/null +++ b/archaeological_finds/migrations/0051_auto_20181211_1530.py @@ -0,0 +1,22 @@ +# -*- coding: utf-8 -*- +# Generated by Django 1.11.10 on 2018-12-11 15:30 +from __future__ import unicode_literals + +import archaeological_finds.models_treatments +from django.db import migrations, models +import django.db.models.deletion + + +class Migration(migrations.Migration): + + dependencies = [ + ('archaeological_finds', '0050_auto_20181211_1509'), + ] + + operations = [ + migrations.AlterField( + model_name='treatment', + name='treatment_state', + field=models.ForeignKey(default=archaeological_finds.models_treatments.TreatmentState.get_default, on_delete=django.db.models.deletion.CASCADE, to='archaeological_finds.TreatmentState', verbose_name='\xc9tat'), + ), + ] diff --git a/archaeological_finds/migrations/0052_auto_20181211_1558.py b/archaeological_finds/migrations/0052_auto_20181211_1558.py new file mode 100644 index 000000000..5c0f63d7c --- /dev/null +++ b/archaeological_finds/migrations/0052_auto_20181211_1558.py @@ -0,0 +1,33 @@ +# -*- coding: utf-8 -*- +# Generated by Django 1.11.10 on 2018-12-11 15:58 +from __future__ import unicode_literals + +from django.db import migrations, models + + +def migrate_treatment_states(apps, schema): + Treatment = apps.get_model('archaeological_finds', 'Treatment') + for t in Treatment.objects.all(): + t.executed = True + t.save() + + +class Migration(migrations.Migration): + + dependencies = [ + ('archaeological_finds', '0051_auto_20181211_1530'), + ] + + operations = [ + migrations.AddField( + model_name='historicaltreatment', + name='executed', + field=models.BooleanField(default=False, verbose_name='Treatment have been executed'), + ), + migrations.AddField( + model_name='treatment', + name='executed', + field=models.BooleanField(default=False, verbose_name='Treatment have been executed'), + ), + migrations.RunPython(migrate_treatment_states) + ] diff --git a/archaeological_finds/models_treatments.py b/archaeological_finds/models_treatments.py index ba1c29dc8..c79ef976c 100644 --- a/archaeological_finds/models_treatments.py +++ b/archaeological_finds/models_treatments.py @@ -41,10 +41,20 @@ from ishtar_common.utils import cached_label_changed, get_current_year, \ class TreatmentState(GeneralType): + executed = models.BooleanField(_(u"Treatment is executed"), default=False) + order = models.IntegerField(verbose_name=_(u"Order"), default=10) + class Meta: verbose_name = _(u"Treatment state type") verbose_name_plural = _(u"Treatment state types") - ordering = ('label',) + ordering = ('order', 'label',) + + @classmethod + def get_default(cls): + q = cls.objects.filter(executed=True) + if not q.count(): + return None + return q.all()[0].pk post_save.connect(post_save_cache, sender=TreatmentState) @@ -132,8 +142,11 @@ class Treatment(DashboardFormItem, ValueGetter, BaseHistorizedItem, treatment_types = models.ManyToManyField( TreatmentType, verbose_name=_(u"Treatment type")) treatment_state = models.ForeignKey( - TreatmentState, verbose_name=_(u"State"), blank=True, null=True, + TreatmentState, verbose_name=_(u"State"), + default=TreatmentState.get_default ) + executed = models.BooleanField( + _(u"Treatment have been executed"), default=False) location = models.ForeignKey( Warehouse, verbose_name=_(u"Location"), blank=True, null=True, help_text=_( @@ -432,30 +445,49 @@ class Treatment(DashboardFormItem, ValueGetter, BaseHistorizedItem, treatment_types = kwargs.pop('treatment_type_list') self.pre_save() super(Treatment, self).save(*args, **kwargs) + to_be_executed = not self.executed and self.treatment_state.executed + updated = [] # baskets if hasattr(items, "items"): items = items.items.all() if hasattr(upstream_items, "items"): upstream_items = upstream_items.items.all() + if not items and self.finds.count(): + items = list(self.finds.all()) + if not treatment_types and self.treatment_types.count(): + treatment_types = list(self.treatment_types.all()) + # execute the treatment if upstream_items and resulting_find: + 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.executed = True + self.save() return if upstream_item and resulting_finds: + if not to_be_executed: + # should not happen but bad validation check... + return self._create_1_n_resulting_find( 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]) + for item in items: - if not create_new_find: + if not create_new_find or not to_be_executed: self.finds.add(item) else: + self.finds.clear() new = item.duplicate(user) item.downstream_treatment = self item.save() @@ -470,6 +502,9 @@ class Treatment(DashboardFormItem, ValueGetter, BaseHistorizedItem, basket.items.remove(item) basket.items.add(new) + if not to_be_executed: + return + if create_new_find: q = Find.objects.filter(upstream_treatment=self) else: @@ -485,6 +520,8 @@ class Treatment(DashboardFormItem, ValueGetter, BaseHistorizedItem, # don't record twice history find.skip_history_when_saving = True find.save() + self.executed = True + self.save() break # manage containers @@ -502,6 +539,7 @@ class Treatment(DashboardFormItem, ValueGetter, BaseHistorizedItem, continue container_attrs.append('container_ref') + print(container_attrs) if not container_attrs: # non consistent treatment return @@ -514,6 +552,8 @@ class Treatment(DashboardFormItem, ValueGetter, BaseHistorizedItem, # don't record twice history find.skip_history_when_saving = True find.save() + self.executed = True + self.save() @property def associated_filename(self): diff --git a/archaeological_finds/views.py b/archaeological_finds/views.py index 20fb8299d..98ac7ee7b 100644 --- a/archaeological_finds/views.py +++ b/archaeological_finds/views.py @@ -526,7 +526,7 @@ def treatment_modify(request, pk): request, 'selec-treatment_modification', 'pk', pk, reset=True) return redirect(reverse( 'treatment_modification', - kwargs={'step': 'basetreatment-treatment_modification'})) + kwargs={'step': 'file-treatment_modification'})) def treatment_add(request, pks, treatment_file=None): diff --git a/archaeological_finds/wizards.py b/archaeological_finds/wizards.py index d523170eb..7f4e1b498 100644 --- a/archaeological_finds/wizards.py +++ b/archaeological_finds/wizards.py @@ -202,10 +202,11 @@ class TreatmentWizard(TreatmentBase): raise PermissionDenied dct['items'] = list(basket.items.all()) - for find in dct['items']: - if 'own' in self.current_right \ - and not find.is_own(dct['history_modifier']): - raise PermissionDenied + 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 |