diff options
| -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 | 
