diff options
| author | Étienne Loks <etienne.loks@iggdrasil.net> | 2021-07-30 17:50:44 +0200 | 
|---|---|---|
| committer | Étienne Loks <etienne.loks@iggdrasil.net> | 2021-10-25 12:06:02 +0200 | 
| commit | 0447e9db6178cd7defa456e71654010ce56dd6d4 (patch) | |
| tree | 9cd241830a4b4030cfbb52fa98ff453fe29ccc5e | |
| parent | c07a2b21082048c63432634318dedc7b9cd55ce4 (diff) | |
| download | Ishtar-0447e9db6178cd7defa456e71654010ce56dd6d4.tar.bz2 Ishtar-0447e9db6178cd7defa456e71654010ce56dd6d4.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})) | 
