diff options
author | Étienne Loks <etienne.loks@iggdrasil.net> | 2021-07-30 17:50:44 +0200 |
---|---|---|
committer | Étienne Loks <etienne.loks@iggdrasil.net> | 2021-07-30 17:50:44 +0200 |
commit | 8cc2fa3f7df67daa316621e645ea0988732c5730 (patch) | |
tree | 957459e629548774b434d8e7fd9734aa83b15dc0 | |
parent | e180ed275c9b907a90ba98a0e60c2c746c264e48 (diff) | |
download | Ishtar-8cc2fa3f7df67daa316621e645ea0988732c5730.tar.bz2 Ishtar-8cc2fa3f7df67daa316621e645ea0988732c5730.zip |
Preventive file: add default costs
-rw-r--r-- | archaeological_files/migrations/0106_auto_20210730_1749.py (renamed from archaeological_files/migrations/0106_auto_20210729_1616.py) | 5 | ||||
-rw-r--r-- | archaeological_files/models.py | 2 | ||||
-rw-r--r-- | archaeological_files/urls.py | 9 | ||||
-rw-r--r-- | archaeological_files/views.py | 76 |
4 files changed, 72 insertions, 20 deletions
diff --git a/archaeological_files/migrations/0106_auto_20210729_1616.py b/archaeological_files/migrations/0106_auto_20210730_1749.py index 3891b5d30..8af41ba91 100644 --- a/archaeological_files/migrations/0106_auto_20210729_1616.py +++ b/archaeological_files/migrations/0106_auto_20210730_1749.py @@ -1,5 +1,5 @@ # -*- coding: utf-8 -*- -# Generated by Django 1.11.28 on 2021-07-29 16:16 +# Generated by Django 1.11.28 on 2021-07-30 17:49 from __future__ import unicode_literals import django.core.validators @@ -26,6 +26,7 @@ class Migration(migrations.Migration): ('unitary_cost', models.FloatField(blank=True, null=True, verbose_name='Unitary cost')), ('unit', models.CharField(blank=True, choices=[('D', 'days'), ('W', 'weeks'), ('M', 'months'), ('L', 'linear meter')], max_length=1, null=True, verbose_name='Unit')), ('specificity', models.CharField(blank=True, default='', max_length=200, verbose_name='Specificity')), + ('default_quantity_by_day', models.IntegerField(default=0, verbose_name='Default quantity by day')), ('order', models.IntegerField(default=10, verbose_name='Order')), ('available', models.BooleanField(default=True, verbose_name='Available')), ], @@ -83,7 +84,7 @@ class Migration(migrations.Migration): ('default_daily_need_on_ground', models.FloatField(default=0, verbose_name='Def. daily number on ground')), ('default_daily_need', models.FloatField(default=0, verbose_name='Def. daily number')), ('order', models.IntegerField(default=10, verbose_name='Order')), - ('child', models.ForeignKey(blank=True, help_text='Auto-add this job when a parent is added', null=True, on_delete=django.db.models.deletion.CASCADE, to='archaeological_files.Job', verbose_name='Child')), + ('child', models.ForeignKey(blank=True, help_text='Auto-add this job when a parent is added', null=True, on_delete=django.db.models.deletion.CASCADE, related_name='parents', to='archaeological_files.Job', verbose_name='Child')), ], options={ 'verbose_name': 'Job', diff --git a/archaeological_files/models.py b/archaeological_files/models.py index 5129189cf..3237f594c 100644 --- a/archaeological_files/models.py +++ b/archaeological_files/models.py @@ -190,6 +190,8 @@ class EquipmentServiceCost(models.Model): specificity = models.CharField( _("Specificity"), blank=True, max_length=200, default="" ) + default_quantity_by_day = models.IntegerField( + _("Default quantity by day"), default=0) order = models.IntegerField(_("Order"), default=10) available = models.BooleanField(_("Available"), default=True) parent = models.ForeignKey( diff --git a/archaeological_files/urls.py b/archaeological_files/urls.py index 3fcf9a42c..1b1c4c771 100644 --- a/archaeological_files/urls.py +++ b/archaeological_files/urls.py @@ -143,5 +143,12 @@ urlpatterns = [ views.PreventiveEditView.as_view() ), name="file-edit-preventive", - ) + ), + url( + r'^file/edit-preventive/(?P<pk>.+)/add-default-cost/$', + check_rights(["change_file", "change_own_file"])( + views.file_edit_preventive_add_default + ), + name="file-edit-preventive-default-cost", + ), ] diff --git a/archaeological_files/views.py b/archaeological_files/views.py index 4cf3ce390..26787142f 100644 --- a/archaeological_files/views.py +++ b/archaeological_files/views.py @@ -368,8 +368,7 @@ class MixFormFormsetUpdateView(UpdateView): def get(self, request, *args, **kwargs): self.object = self.get_object() self.inline_forms = [ - inline(instance=self.object, - prefix=getattr(inline, "form_slug", "form")) + inline(instance=self.object, prefix=getattr(inline, "form_slug", "form")) for inline in self.get_form_inlines_class() ] return super(MixFormFormsetUpdateView, self).get(request, *args, **kwargs) @@ -378,8 +377,11 @@ class MixFormFormsetUpdateView(UpdateView): self.object = self.get_object() form = self.form_class(data=request.POST, instance=self.object) self.inline_forms = [ - inline(instance=self.object, data=request.POST, - prefix=getattr(inline, "form_slug", "form")) + inline( + instance=self.object, + data=request.POST, + prefix=getattr(inline, "form_slug", "form"), + ) for inline in self.get_form_inlines_class() ] if form.is_valid() and all((inline.is_valid() for inline in self.inline_forms)): @@ -416,19 +418,30 @@ class PreventiveEditView(IshtarMixin, LoginRequiredMixin, MixFormFormsetUpdateVi forms.PreventiveFileJobFormSet, ] self.inline_types = list( - models.GenericEquipmentServiceType.objects.filter(available=True).all()) + models.GenericEquipmentServiceType.objects.filter(available=True).all() + ) for inline_type in self.inline_types: - form_class_name = "".join([ - t.capitalize() - for t in inline_type.txt_idx.replace( - '-', ' ').replace('_', ' ').split(" ")]) + "Formset" - form = type(form_class_name, - (forms.PreventiveFileEquipmentServiceForm,), - {"type_filter": inline_type.txt_idx}) + form_class_name = ( + "".join( + [ + t.capitalize() + for t in inline_type.txt_idx.replace("-", " ") + .replace("_", " ") + .split(" ") + ] + ) + + "Formset" + ) + form = type( + form_class_name, + (forms.PreventiveFileEquipmentServiceForm,), + {"type_filter": inline_type.txt_idx}, + ) formset = formset_factory( - form, formset=forms.PreventiveFileEquipmentServiceBaseFormSet, - can_delete=True + form, + formset=forms.PreventiveFileEquipmentServiceBaseFormSet, + can_delete=True, ) formset.form_label = str(inline_type) formset.form_slug = inline_type.txt_idx @@ -449,9 +462,7 @@ class PreventiveEditView(IshtarMixin, LoginRequiredMixin, MixFormFormsetUpdateVi if not check_permission(self.request, "file/edit-preventive/", file.pk): raise Http404() initial = {} - for k in ( - list(self.form_class.base_fields.keys()) - ): + for k in list(self.form_class.base_fields.keys()): value = getattr(file, k) if hasattr(value, "all"): value = ",".join([str(v.pk) for v in value.all()]) @@ -476,3 +487,34 @@ class PreventiveEditView(IshtarMixin, LoginRequiredMixin, MixFormFormsetUpdateVi context["form_unities"] = unities.items() context["form_flat_rates"] = flat_rates return context + + +def file_edit_preventive_add_default(request, pk): + job_attrs = ( + ("default_daily_need_on_ground", models.PreventiveFileGroundJob), + ("default_daily_need", models.PreventiveFileJob), + ) + for attr, job_model in job_attrs: + jobs = models.Job.objects.exclude(**{attr: 0}) + for job in jobs: + q = job_model.objects.filter(job=job, file_id=pk) + if not q.count(): + dct = { + "job": job, + "file_id": pk, + "days_planned": 1, + "man_by_day_planned": getattr(job, attr) + } + job_model.create(**dct) + q = models.EquipmentServiceCost.exclude(default_quantity_by_day=0) + for cost in list(q.all()): + q = models.PreventiveFileEquipmentServiceCost.objects.filter( + equipment_service_cost=cost, file_id=pk) + if not q.count(): + models.PreventiveFileEquipmentServiceCost.objects.create( + equipment_service_cost=cost, file_id=pk, + quantity_by_day_planned=cost.default_quantity_by_day, + days_planned=1 + ) + + return redirect(reverse("file-edit-preventive", kwargs={"pk": pk})) |