diff options
Diffstat (limited to 'archaeological_files')
-rw-r--r-- | archaeological_files/forms.py | 188 | ||||
-rw-r--r-- | archaeological_files/migrations/0106_auto_20210622_1456.py (renamed from archaeological_files/migrations/0106_auto_20210423_1206.py) | 175 | ||||
-rw-r--r-- | archaeological_files/models.py | 65 | ||||
-rw-r--r-- | archaeological_files/templates/ishtar/forms/preventive_detail.html | 2 | ||||
-rw-r--r-- | archaeological_files/urls.py | 7 | ||||
-rw-r--r-- | archaeological_files/views.py | 84 |
6 files changed, 434 insertions, 87 deletions
diff --git a/archaeological_files/forms.py b/archaeological_files/forms.py index 2cb08b5d7..51d1fdeb0 100644 --- a/archaeological_files/forms.py +++ b/archaeological_files/forms.py @@ -20,12 +20,13 @@ """ Files forms definitions """ + import datetime from django import forms from django.conf import settings from django.core import validators -from django.forms.formsets import formset_factory +from django.forms.formsets import formset_factory, BaseFormSet from django.utils.functional import lazy from django.utils.safestring import mark_safe from ishtar_common.utils import ugettext_lazy as _ @@ -57,6 +58,7 @@ from ishtar_common.forms import ( LockForm, CustomFormSearch, DocumentItemSelect, + FormHeader, ) from ishtar_common.forms_common import get_town_field from archaeological_operations.forms import ( @@ -506,6 +508,190 @@ class FinalFileDeleteForm(FinalForm): confirm_end_msg = _("Would you like to delete this archaeological file ?") +class FileFormPreventiveDetail(forms.ModelForm, CustomForm, ManageOldType): + form_label = _("Preventive file") + form_admin_name = _("Preventive file - 020 - Edition form") + form_slug = "preventive-020-edition-form" + + associated_models = {} + + HEADERS = { + "start_date": FormHeader(_("Dates")), + "total_developed_surface": FormHeader(_("Surfaces")), + } + + class Meta: + model = models.File + fields = ["start_date", "end_date", "ground_start_date", + "ground_end_date", "study_period", "execution_report_date", + "total_developed_surface", "total_surface", "linear_meter"] + + pk = forms.IntegerField(label="", required=False, widget=forms.HiddenInput) + start_date = forms.DateField( + label=_("Start date"), widget=DatePicker, required=False + ) + end_date = forms.DateField(label=_("End date"), widget=DatePicker, required=False) + ground_start_date = forms.DateField( + label=_("Ground start date"), widget=DatePicker, required=False + ) + ground_end_date = forms.DateField( + label=_("Ground end date"), widget=DatePicker, required=False + ) + study_period = forms.CharField( + label=_("Study period"), + max_length=200, + required=False, + ) + execution_report_date = forms.DateField( + label=_("Execution report date"), widget=DatePicker, required=False + ) + total_developed_surface = forms.FloatField( + widget=widgets.AreaWidget, + label=_("Total developed surface (m2)"), + required=False, + validators=[ + validators.MinValueValidator(0), + validators.MaxValueValidator(999999999), + ], + ) + total_surface = forms.FloatField( + required=False, + widget=widgets.AreaWidget, + label=_("Total surface (m2)"), + validators=[ + validators.MinValueValidator(0), + validators.MaxValueValidator(999999999), + ], + ) + linear_meter = forms.IntegerField( + label=_("Linear meter (m)"), required=False, + widget=widgets.MeterKilometerWidget, + ) + + def __init__(self, *args, **kwargs): + self.user = None + if kwargs.get("user", None): + self.user = kwargs.pop("user") + super(FileFormPreventiveDetail, self).__init__(*args, **kwargs) + + +class FileBaseFormset(forms.BaseModelFormSet): + def __init__(self, *args, **kwargs): + self.instance = None + if "instance" in kwargs: + self.instance = kwargs.pop("instance") + super().__init__(*args, **kwargs) + self.queryset = self.model.objects.filter(pk=None) + if self.instance: + self.queryset = self.model.objects.filter(file_id=self.instance.pk) + + +class PreventiveFileJobForm(forms.ModelForm): + file_id = forms.IntegerField(widget=forms.HiddenInput) + job = forms.ChoiceField(choices=[]) + man_by_day_planned = forms.FloatField(_("Man by day - planned"), required=False) + days_planned = forms.FloatField(_("Days - planned"), required=False) + man_by_day_worked = forms.FloatField(_("Man by day - worked"), required=False) + days_worked = forms.FloatField(_("Days - worked"), required=False) + + class Meta: + model = models.PreventiveFileJob + exclude = ["file"] + + +class PreventiveFileJobBaseFormSet(FileBaseFormset): + model = models.PreventiveFileJob + + +PreventiveFileJobFormSet = formset_factory( + PreventiveFileJobForm, formset=PreventiveFileJobBaseFormSet, can_delete=True) +PreventiveFileJobFormSet.form_label = _("Preventive - Jobs") +PreventiveFileJobFormSet.form_admin_name = _("Preventive file - 030 - Jobs") +PreventiveFileJobFormSet.form_slug = "preventive-030-jobs" + + +class PreventiveFileGroundJobForm(forms.ModelForm): + file_id = forms.IntegerField(widget=forms.HiddenInput) + ground_job = forms.ChoiceField(choices=[]) + man_by_day_planned = forms.FloatField(_("Man by day - planned"), required=False) + days_planned = forms.FloatField(_("Days - planned"), required=False) + man_by_day_worked = forms.FloatField(_("Man by day - worked"), required=False) + days_worked = forms.FloatField(_("Days - worked"), required=False) + + class Meta: + model = models.PreventiveFileGroundJob + exclude = ["file"] + + +class PreventiveFileGroundJobBaseFormSet(FileBaseFormset): + model = models.PreventiveFileGroundJob + + +PreventiveFileGroundJobFormSet = formset_factory( + PreventiveFileGroundJobForm, formset=PreventiveFileGroundJobBaseFormSet, + can_delete=True +) +PreventiveFileGroundJobFormSet.form_label = _("Preventive - Ground jobs") +PreventiveFileGroundJobFormSet.form_admin_name = _( + "Preventive file - 040 - Ground jobs" +) +PreventiveFileGroundJobFormSet.form_slug = "preventive-040-ground-jobs" + + +class PreventiveFileEquipmentForm(forms.ModelForm): + file_id = forms.IntegerField(widget=forms.HiddenInput) + equipment = forms.ChoiceField(choices=[]) + man_by_day_planned = forms.FloatField(_("Man by day - planned"), required=False) + days_planned = forms.FloatField(_("Days - planned"), required=False) + man_by_day_worked = forms.FloatField(_("Man by day - worked"), required=False) + days_worked = forms.FloatField(_("Days - worked"), required=False) + + class Meta: + model = models.PreventiveFileEquipmentCost + exclude = ["file"] + + +class PreventiveFileEquipmentBaseFormSet(FileBaseFormset): + model = models.PreventiveFileEquipmentCost + + +PreventiveFileEquipmentFormSet = formset_factory( + PreventiveFileEquipmentForm, formset=PreventiveFileEquipmentBaseFormSet, + can_delete=True +) +PreventiveFileEquipmentFormSet.form_label = _("Preventive - Equipment") +PreventiveFileEquipmentFormSet.form_admin_name = _("Preventive file - 050 - Equipments") +PreventiveFileEquipmentFormSet.form_slug = "preventive-050-equipments" + + +class PreventiveFileTechnicalServiceForm(forms.ModelForm): + file_id = forms.IntegerField(widget=forms.HiddenInput) + technical_service = forms.ChoiceField(choices=[]) + man_by_day_planned = forms.FloatField(_("Man by day - planned"), required=False) + days_planned = forms.FloatField(_("Days - planned"), required=False) + man_by_day_worked = forms.FloatField(_("Man by day - worked"), required=False) + days_worked = forms.FloatField(_("Days - worked"), required=False) + + class Meta: + model = models.PreventiveFileTechnicalServiceCost + exclude = ["file"] + + +class PreventiveFileTechnicalServiceBaseFormSet(FileBaseFormset): + model = models.PreventiveFileTechnicalServiceCost + + +PreventiveFileTechnicalServiceFormSet = formset_factory( + PreventiveFileTechnicalServiceForm, + formset=PreventiveFileTechnicalServiceBaseFormSet, can_delete=True +) +PreventiveFileTechnicalServiceFormSet.form_label = _("Preventive - Technical Services") +PreventiveFileTechnicalServiceFormSet.form_admin_name = _( + "Preventive file - 060 - TechnicalServices" +) +PreventiveFileTechnicalServiceFormSet.form_slug = "preventive-060-technical_services" + + class AdministrativeActFileModifySelect(TableSelect): _model = AdministrativeAct diff --git a/archaeological_files/migrations/0106_auto_20210423_1206.py b/archaeological_files/migrations/0106_auto_20210622_1456.py index 5d147781e..2667a705d 100644 --- a/archaeological_files/migrations/0106_auto_20210423_1206.py +++ b/archaeological_files/migrations/0106_auto_20210622_1456.py @@ -1,5 +1,5 @@ # -*- coding: utf-8 -*- -# Generated by Django 1.11.27 on 2021-04-23 12:06 +# Generated by Django 1.11.28 on 2021-06-22 14:56 from __future__ import unicode_literals import django.core.validators @@ -88,62 +88,14 @@ class Migration(migrations.Migration): bases=(ishtar_common.models_common.Cached, models.Model), ), migrations.CreateModel( - name='PreventiveFile', + name='ManDays', fields=[ ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), - ('study_period', models.CharField(blank=True, default='', max_length=200, verbose_name='Study period')), - ('start_date', models.DateField(blank=True, null=True, verbose_name='Start date')), - ('end_date', models.DateField(blank=True, null=True, verbose_name='End date')), - ('ground_start_date', models.DateField(blank=True, null=True, verbose_name='Ground start date')), - ('ground_end_date', models.DateField(blank=True, null=True, verbose_name='Ground end date')), - ('execution_report_date', models.DateField(blank=True, null=True, verbose_name='Execution report date')), - ('linear_meter', models.IntegerField(blank=True, null=True, verbose_name='Linear meter')), - ('file', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='archaeological_files.File', verbose_name='File')), + ('man_by_day_planned', models.FloatField(blank=True, null=True, verbose_name='Man by day - planned')), + ('days_planned', models.FloatField(blank=True, null=True, verbose_name='Days - planned')), + ('man_by_day_worked', models.FloatField(blank=True, null=True, verbose_name='Man by day - worked')), + ('days_worked', models.FloatField(blank=True, null=True, verbose_name='Days - worked')), ], - options={ - 'verbose_name': 'Preventive file', - 'verbose_name_plural': 'Preventive files', - }, - ), - migrations.CreateModel( - name='PreventiveFileEquipmentCost', - fields=[ - ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), - ('man_days_planned', models.FloatField(blank=True, null=True, verbose_name='Man-day planned')), - ('man_days_worked', models.FloatField(blank=True, null=True, verbose_name='Man-day worked')), - ('equipment_cost', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='archaeological_files.EquipmentCost')), - ('file', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='archaeological_files.PreventiveFile')), - ], - options={ - 'abstract': False, - }, - ), - migrations.CreateModel( - name='PreventiveFileJob', - fields=[ - ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), - ('man_days_planned', models.FloatField(blank=True, null=True, verbose_name='Man-day planned')), - ('man_days_worked', models.FloatField(blank=True, null=True, verbose_name='Man-day worked')), - ('ground_man_days_planned', models.FloatField(blank=True, null=True, verbose_name='Ground man-day planned')), - ('ground_man_days_worked', models.FloatField(blank=True, null=True, verbose_name='Ground man-day worked')), - ('file', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='archaeological_files.PreventiveFile')), - ('job', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='archaeological_files.Job')), - ], - options={ - 'abstract': False, - }, - ), - migrations.CreateModel( - name='PreventiveFileTechnicalServiceCost', - fields=[ - ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), - ('man_days_planned', models.FloatField(blank=True, null=True, verbose_name='Man-day planned')), - ('man_days_worked', models.FloatField(blank=True, null=True, verbose_name='Man-day worked')), - ('file', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='archaeological_files.PreventiveFile')), - ], - options={ - 'abstract': False, - }, ), migrations.CreateModel( name='TechnicalService', @@ -177,9 +129,108 @@ class Migration(migrations.Migration): }, ), migrations.AddField( - model_name='preventivefiletechnicalservicecost', - name='technical_service_cost', - field=models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='archaeological_files.TechnicalServiceCost'), + model_name='file', + name='execution_report_date', + field=models.DateField(blank=True, null=True, verbose_name='Execution report date'), + ), + migrations.AddField( + model_name='file', + name='ground_end_date', + field=models.DateField(blank=True, null=True, verbose_name='Ground end date'), + ), + migrations.AddField( + model_name='file', + name='ground_start_date', + field=models.DateField(blank=True, null=True, verbose_name='Ground start date'), + ), + migrations.AddField( + model_name='file', + name='linear_meter', + field=models.IntegerField(blank=True, null=True, verbose_name='Linear meter'), + ), + migrations.AddField( + model_name='file', + name='start_date', + field=models.DateField(blank=True, null=True, verbose_name='Start date'), + ), + migrations.AddField( + model_name='file', + name='study_period', + field=models.CharField(blank=True, default='', max_length=200, verbose_name='Study period'), + ), + migrations.AddField( + model_name='historicalfile', + name='execution_report_date', + field=models.DateField(blank=True, null=True, verbose_name='Execution report date'), + ), + migrations.AddField( + model_name='historicalfile', + name='ground_end_date', + field=models.DateField(blank=True, null=True, verbose_name='Ground end date'), + ), + migrations.AddField( + model_name='historicalfile', + name='ground_start_date', + field=models.DateField(blank=True, null=True, verbose_name='Ground start date'), + ), + migrations.AddField( + model_name='historicalfile', + name='linear_meter', + field=models.IntegerField(blank=True, null=True, verbose_name='Linear meter'), + ), + migrations.AddField( + model_name='historicalfile', + name='start_date', + field=models.DateField(blank=True, null=True, verbose_name='Start date'), + ), + migrations.AddField( + model_name='historicalfile', + name='study_period', + field=models.CharField(blank=True, default='', max_length=200, verbose_name='Study period'), + ), + migrations.AlterField( + model_name='file', + name='end_date', + field=models.DateField(blank=True, null=True, verbose_name='End date'), + ), + migrations.AlterField( + model_name='historicalfile', + name='end_date', + field=models.DateField(blank=True, null=True, verbose_name='End date'), + ), + migrations.CreateModel( + name='PreventiveFileEquipmentCost', + fields=[ + ('mandays_ptr', models.OneToOneField(auto_created=True, on_delete=django.db.models.deletion.CASCADE, parent_link=True, primary_key=True, serialize=False, to='archaeological_files.ManDays')), + ], + bases=('archaeological_files.mandays',), + ), + migrations.CreateModel( + name='PreventiveFileGroundJob', + fields=[ + ('mandays_ptr', models.OneToOneField(auto_created=True, on_delete=django.db.models.deletion.CASCADE, parent_link=True, primary_key=True, serialize=False, to='archaeological_files.ManDays')), + ('file', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name='ground_jobs', to='archaeological_files.File')), + ('job', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='archaeological_files.Job')), + ], + bases=('archaeological_files.mandays',), + ), + migrations.CreateModel( + name='PreventiveFileJob', + fields=[ + ('mandays_ptr', models.OneToOneField(auto_created=True, on_delete=django.db.models.deletion.CASCADE, parent_link=True, primary_key=True, serialize=False, to='archaeological_files.ManDays')), + ('file', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name='jobs', to='archaeological_files.File')), + ('job', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='archaeological_files.Job')), + ], + bases=('archaeological_files.mandays',), + ), + migrations.CreateModel( + name='PreventiveFileTechnicalServiceCost', + fields=[ + ('mandays_ptr', models.OneToOneField(auto_created=True, on_delete=django.db.models.deletion.CASCADE, parent_link=True, primary_key=True, serialize=False, to='archaeological_files.ManDays')), + ('file', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name='technical_service_costs', to='archaeological_files.File')), + ('technical_service_cost', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='archaeological_files.TechnicalServiceCost')), + ], + bases=('archaeological_files.mandays',), ), migrations.AddField( model_name='equipmenttype', @@ -191,4 +242,14 @@ class Migration(migrations.Migration): name='equipment_type', field=models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='archaeological_files.EquipmentType', verbose_name='Equipment'), ), + migrations.AddField( + model_name='preventivefileequipmentcost', + name='equipment_cost', + field=models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='archaeological_files.EquipmentCost'), + ), + migrations.AddField( + model_name='preventivefileequipmentcost', + name='file', + field=models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name='equipment_costs', to='archaeological_files.File'), + ), ] diff --git a/archaeological_files/models.py b/archaeological_files/models.py index db46c1ca7..fde527ae1 100644 --- a/archaeological_files/models.py +++ b/archaeological_files/models.py @@ -521,6 +521,18 @@ class File( ) # <-- research archaeology + # --> preventive detail + study_period = models.CharField(_("Study period"), max_length=200, + default="", blank=True) + start_date = models.DateField(_("Start date"), blank=True, null=True) + end_date = models.DateField(_("End date"), blank=True, null=True) + ground_start_date = models.DateField(_("Ground start date"), blank=True, null=True) + ground_end_date = models.DateField(_("Ground end date"), blank=True, null=True) + execution_report_date = models.DateField(_("Execution report date"), blank=True, + null=True) + linear_meter = models.IntegerField(_("Linear meter"), blank=True, null=True) + # <-- preventive detail + documents = models.ManyToManyField( Document, related_name="files", verbose_name=_("Documents"), blank=True ) @@ -1142,47 +1154,44 @@ class FileDashboard: ) -class PreventiveFile(models.Model): - file = models.ForeignKey(File, verbose_name=_("File")) - study_period = models.CharField(_("Study period"), max_length=200, - default="", blank=True) - start_date = models.DateField(_("Start date"), blank=True, null=True) - end_date = models.DateField(_("End date"), blank=True, null=True) - ground_start_date = models.DateField(_("Ground start date"), blank=True, null=True) - ground_end_date = models.DateField(_("Ground end date"), blank=True, null=True) - execution_report_date = models.DateField(_("Execution report date"), blank=True, - null=True) - linear_meter = models.IntegerField(_("Linear meter"), blank=True, null=True) +class ManDays(models.Model): + man_by_day_planned = models.FloatField( + _("Man by day - planned"), null=True, blank=True) + days_planned = models.FloatField( + _("Days - planned"), null=True, blank=True) + man_by_day_worked = models.FloatField( + _("Man by day - worked"), null=True, blank=True) + days_worked = models.FloatField( + _("Days - worked"), null=True, blank=True) - class Meta: - verbose_name = _("Preventive file") - verbose_name_plural = _("Preventive files") + @property + def man_days_planned(self): + if not self.days_planned or not self.man_by_day_planned: + return 0 + return self.days_planned * self.man_by_day_planned + @property + def man_days_worked(self): + if not self.days_worked or not self.man_by_day_worked: + return 0 + return self.days_worked * self.man_by_day_worked -class ManDays(models.Model): - man_days_planned = models.FloatField( - _("Man-day planned"), null=True, blank=True) - man_days_worked = models.FloatField( - _("Man-day worked"), null=True, blank=True) - class Meta: - abstract = True +class PreventiveFileGroundJob(ManDays): + file = models.ForeignKey(File, related_name="ground_jobs") + job = models.ForeignKey(Job) class PreventiveFileJob(ManDays): - file = models.ForeignKey(PreventiveFile) + file = models.ForeignKey(File, related_name="jobs") job = models.ForeignKey(Job) - ground_man_days_planned = models.FloatField( - _("Ground man-day planned"), null=True, blank=True) - ground_man_days_worked = models.FloatField( - _("Ground man-day worked"), null=True, blank=True) class PreventiveFileEquipmentCost(ManDays): - file = models.ForeignKey(PreventiveFile) + file = models.ForeignKey(File, related_name="equipment_costs") equipment_cost = models.ForeignKey(EquipmentCost) class PreventiveFileTechnicalServiceCost(ManDays): - file = models.ForeignKey(PreventiveFile) + file = models.ForeignKey(File, related_name="technical_service_costs") technical_service_cost = models.ForeignKey(TechnicalServiceCost) diff --git a/archaeological_files/templates/ishtar/forms/preventive_detail.html b/archaeological_files/templates/ishtar/forms/preventive_detail.html new file mode 100644 index 000000000..3cdfb3da0 --- /dev/null +++ b/archaeological_files/templates/ishtar/forms/preventive_detail.html @@ -0,0 +1,2 @@ +{% extends "ishtar/forms/base_form.html" %} +{% load i18n %} diff --git a/archaeological_files/urls.py b/archaeological_files/urls.py index b245b0aea..3fcf9a42c 100644 --- a/archaeological_files/urls.py +++ b/archaeological_files/urls.py @@ -137,4 +137,11 @@ urlpatterns = [ check_rights(["add_operation"])(views.file_add_operation), name="file-add-operation", ), + url( + r'^file/edit-preventive/(?P<pk>.+)/$', + check_rights(["change_file", "change_own_file"])( + views.PreventiveEditView.as_view() + ), + name="file-edit-preventive", + ) ] diff --git a/archaeological_files/views.py b/archaeological_files/views.py index 35bd9d7c8..a927a94e6 100644 --- a/archaeological_files/views.py +++ b/archaeological_files/views.py @@ -23,11 +23,12 @@ import re from django.core.urlresolvers import reverse from django.db.models import Q from django.http import HttpResponse, Http404, HttpResponseRedirect +from django.views.generic.edit import UpdateView from django.shortcuts import redirect, render from ishtar_common.utils import ugettext_lazy as _ from ishtar_common.views import wizard_is_available -from ishtar_common.views_item import get_item, show_item, revert_item +from ishtar_common.views_item import get_item, show_item, revert_item, check_permission from archaeological_operations.wizards import ( AdministrativeActDeletionWizard, @@ -45,6 +46,7 @@ from archaeological_files.wizards import ( FileAdministrativeActWizard, FileEditAdministrativeActWizard, ) +from ishtar_common.views import IshtarMixin, LoginRequiredMixin from archaeological_operations.wizards import OperationWizard from archaeological_operations.views import operation_creation_wizard @@ -354,3 +356,83 @@ def reset_wizards(request): (AdministrativeActDeletionWizard, "file_administrativeactfile_deletion_wizard"), ): wizard_class.session_reset(request, url_name) + + +class MixFormFormsetUpdateView(UpdateView): + form_inlines_class = [] + + def get(self, request, *args, **kwargs): + self.object = self.get_object() + self.inline_forms = [ + inline(instance=self.object) for inline in self.form_inlines_class + ] + return super(MixFormFormsetUpdateView, self).get(request, *args, **kwargs) + + def post(self, request, *args, **kwargs): + self.object = self.get_object() + form = self.form_class(data=request.POST, instance=self.object) + inline_forms = [ + inline(instance=self.object, data=request.POST) + for inline in self.form_inlines_class + ] + if form.is_valid() and all((inline.is_valid() for inline in inline_forms)): + return self.form_valid(form, inline_forms) + else: + return self.form_invalid(form, inline_forms) + + def form_valid(self, form, inline_forms): + self.object = form.save() + for inline in inline_forms: + # save inlines... + pass + return HttpResponseRedirect(self.get_success_url()) + + def form_invalid(self, form, inline_forms): + return self.render_to_response( + self.get_context_data(form=form, inlines=inline_forms) + ) + + def get_context_data(self, *args, **kwargs): + data = super(MixFormFormsetUpdateView, self).get_context_data(*args, **kwargs) + data["inline_forms"] = self.inline_forms + return data + + +class PreventiveEditView(IshtarMixin, LoginRequiredMixin, MixFormFormsetUpdateView): + page_name = _("Preventive modification") + form_class = forms.FileFormPreventiveDetail + form_inlines_class = [ + forms.PreventiveFileJobFormSet, + forms.PreventiveFileGroundJobFormSet, + forms.PreventiveFileEquipmentFormSet, + forms.PreventiveFileTechnicalServiceFormSet + ] + template_name = "ishtar/forms/preventive_detail.html" + model = models.File + + + def get_success_url(self): + return reverse("file_modification") + "?open_item={}".format(self.object.pk) + + def get_form_kwargs(self): + kwargs = super(PreventiveEditView, self).get_form_kwargs() + try: + file = models.File.objects.get(pk=self.kwargs.get("pk")) + except models.Document.DoesNotExist: + raise Http404() + if not check_permission(self.request, "file/edit-preventive/", file.pk): + raise Http404() + initial = {} + 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()]) + if hasattr(value, "pk"): + value = value.pk + initial[k] = value + kwargs["initial"] = initial + kwargs["user"] = self.request.user + self.file = file + return kwargs
\ No newline at end of file |