summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
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
commit8cc2fa3f7df67daa316621e645ea0988732c5730 (patch)
tree957459e629548774b434d8e7fd9734aa83b15dc0
parente180ed275c9b907a90ba98a0e60c2c746c264e48 (diff)
downloadIshtar-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.py2
-rw-r--r--archaeological_files/urls.py9
-rw-r--r--archaeological_files/views.py76
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}))