summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
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
commit7ba31396a8cf7e523537e8f6fb1d8bc4cc41ea12 (patch)
tree7d5391e7eb706d346080ec30a802ebf88bc218bd
parent4f93740ad6bb2f9e47eeab63224651b8b1cbb8c6 (diff)
downloadIshtar-7ba31396a8cf7e523537e8f6fb1d8bc4cc41ea12.tar.bz2
Ishtar-7ba31396a8cf7e523537e8f6fb1d8bc4cc41ea12.zip
Manage treatment state and effective execution
-rw-r--r--archaeological_finds/admin.py6
-rw-r--r--archaeological_finds/forms_treatments.py20
-rw-r--r--archaeological_finds/migrations/0050_auto_20181211_1509.py51
-rw-r--r--archaeological_finds/migrations/0051_auto_20181211_1530.py22
-rw-r--r--archaeological_finds/migrations/0052_auto_20181211_1558.py33
-rw-r--r--archaeological_finds/models_treatments.py46
-rw-r--r--archaeological_finds/views.py2
-rw-r--r--archaeological_finds/wizards.py9
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