summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--archaeological_context_records/forms.py30
-rw-r--r--archaeological_files/forms.py32
-rw-r--r--archaeological_files/templates/ishtar/wizard/wizard_file_deletion.html14
-rw-r--r--archaeological_files/views.py4
-rw-r--r--archaeological_files/wizards.py42
-rw-r--r--ishtar_common/forms.py31
6 files changed, 84 insertions, 69 deletions
diff --git a/archaeological_context_records/forms.py b/archaeological_context_records/forms.py
index fef256b68..72877c2e2 100644
--- a/archaeological_context_records/forms.py
+++ b/archaeological_context_records/forms.py
@@ -35,7 +35,7 @@ from archaeological_context_records import models
from ishtar_common.forms import FinalForm, FormSet, \
reverse_lazy, get_form_selection, ManageOldType, CustomForm, \
FieldType, CustomFormSearch, IshtarForm, FormHeader, HistorySelect, \
- MultiSearchForm
+ MultiSearchForm, LockForm
from ishtar_common.forms_common import get_town_field
from archaeological_operations.forms import OperationSelect, ParcelField, \
RecordRelationsForm as OpeRecordRelationsForm, RecordRelationsFormSetBase
@@ -113,32 +113,8 @@ class RecordSelect(HistorySelect):
ids.append('ope_relation_types_{}'.format(idx))
return ids
-class BaseRecordFormSelection(object):
- pk_key = None
- def clean(self):
- cleaned_data = self.cleaned_data
- print(self.cleaned_data, self.pk_key)
- if self.pk_key not in cleaned_data or not cleaned_data[self.pk_key]:
- raise forms.ValidationError(_(u"You should at least select one "
- u"context record."))
- pks = self.cleaned_data[self.pk_key]
- if isinstance(pks, int):
- pks = [pks]
- else:
- pks = pks.split(",")
- for pk in pks:
- try:
- cr = models.ContextRecord.objects.get(pk=pk)
- except models.ContextRecord.DoesNotExist:
- raise forms.ValidationError(_("Invalid selection."))
- if cr.locked:
- raise forms.ValidationError(_("This context record is locked "
- "for edition."))
- return self.cleaned_data
-
-
-class RecordFormSelection(BaseRecordFormSelection, CustomFormSearch):
+class RecordFormSelection(LockForm, CustomFormSearch):
SEARCH_AND_SELECT = True
form_label = _("Context record search")
pk_key = 'pk'
@@ -155,7 +131,7 @@ class RecordFormSelection(BaseRecordFormSelection, CustomFormSearch):
validators=[valid_id(models.ContextRecord)])
-class RecordFormMultiSelection(BaseRecordFormSelection, MultiSearchForm):
+class RecordFormMultiSelection(LockForm, MultiSearchForm):
form_label = _("Context record search")
associated_models = {'pks': models.ContextRecord}
pk_key = 'pks'
diff --git a/archaeological_files/forms.py b/archaeological_files/forms.py
index 640e2cab1..4d8ab749a 100644
--- a/archaeological_files/forms.py
+++ b/archaeological_files/forms.py
@@ -30,14 +30,15 @@ from django.utils.translation import ugettext_lazy as _
from django.utils.safestring import mark_safe
from ishtar_common.models import Person, Organization, \
- valid_id, Department, person_type_pks_lazy, \
+ valid_id, valid_ids, Department, person_type_pks_lazy, \
person_type_pk_lazy, organization_type_pks_lazy
from archaeological_operations.models import ActType, AdministrativeAct, \
OperationType
from . import models
from ishtar_common.forms import FinalForm, get_now, reverse_lazy, TableSelect, \
- ManageOldType, CustomForm, FieldType, IshtarForm, HistorySelect
+ ManageOldType, CustomForm, FieldType, IshtarForm, HistorySelect, \
+ MultiSearchForm, LockForm, CustomFormSearch
from ishtar_common.forms_common import get_town_field
from archaeological_operations.forms import AdministrativeActForm, \
AdministrativeActOpeFormSelection, SLICING, AdministrativeActModifForm, \
@@ -123,7 +124,7 @@ class FileSelect(HistorySelect):
('', '--')] + list(settings.ISHTAR_DPTS)
-class FileFormSelection(forms.Form):
+class FileFormSelection(LockForm, CustomFormSearch):
SEARCH_AND_SELECT = True
form_label = _("Archaeological file search")
associated_models = {'pk': models.File}
@@ -136,18 +137,19 @@ class FileFormSelection(forms.Form):
source_full=reverse_lazy('get-file-full')),
validators=[valid_id(models.File)])
- def clean(self):
- cleaned_data = self.cleaned_data
- if 'pk' not in cleaned_data or not cleaned_data['pk']:
- raise forms.ValidationError(_(u"You should select a file."))
- pk = self.cleaned_data["pk"]
- try:
- file = models.File.objects.get(pk=pk)
- except models.File.DoesNotExist:
- raise forms.ValidationError(_("Invalid selection."))
- if file.locked:
- raise forms.ValidationError(_("This file is locked for edition."))
- return self.cleaned_data
+
+class FileFormMultiSelection(LockForm, MultiSearchForm):
+ form_label = _("Archaeological file search")
+ associated_models = {'pks': models.File}
+
+ pk = forms.CharField(
+ label="", required=False,
+ widget=widgets.DataTable(
+ reverse_lazy('get-file'),
+ FileSelect, models.File,
+ multiple_select=True,
+ source_full=reverse_lazy('get-file-full')),
+ validators=[valid_ids(models.File)])
DATE_SOURCE = (('creation', _(u"Creation date")),
diff --git a/archaeological_files/templates/ishtar/wizard/wizard_file_deletion.html b/archaeological_files/templates/ishtar/wizard/wizard_file_deletion.html
new file mode 100644
index 000000000..a29436e1d
--- /dev/null
+++ b/archaeological_files/templates/ishtar/wizard/wizard_file_deletion.html
@@ -0,0 +1,14 @@
+{% extends "ishtar/wizard/delete_wizard.html" %}
+{% load i18n %}
+{% block "detailled_extra_info" %}
+
+{% if current_object.operations.count %}
+<h3>{% trans "Associated operations" %}</h3>
+<ul class='list'>
+{% for item in current_object.operations.all %}
+ <li>{{person}} <a class='display_details_inline' href="#"
+ onclick='load_window("{% url "show-operation" item.pk "" %}")'><i class="fa fa-info-circle" aria-hidden="true"></i></a></li>{% endfor %}
+</ul>
+{% endif %}
+
+{% endblock %}
diff --git a/archaeological_files/views.py b/archaeological_files/views.py
index 08f875d54..a23475c3e 100644
--- a/archaeological_files/views.py
+++ b/archaeological_files/views.py
@@ -160,7 +160,7 @@ file_closing_wizard = FileClosingWizard.as_view(
label=_(u"File closing"), url_name='file_closing',)
file_deletion_wizard = FileDeletionWizard.as_view(
- [('selec-file_deletion', forms.FileFormSelection),
+ [('selec-file_deletion', forms.FileFormMultiSelection),
('final-file_deletion', forms.FinalFileDeleteForm)],
label=_(u"File deletion"),
url_name='file_deletion',)
@@ -171,7 +171,7 @@ def file_delete(request, pk):
return HttpResponseRedirect("/")
FileDeletionWizard.session_set_value(
- request, 'selec-file_deletion', 'pk', pk, reset=True)
+ request, 'selec-file_deletion', 'pks', pk, reset=True)
return redirect(reverse('file_deletion',
kwargs={'step': 'final-file_deletion'}))
diff --git a/archaeological_files/wizards.py b/archaeological_files/wizards.py
index 9f1f59a4b..c1aaf9037 100644
--- a/archaeological_files/wizards.py
+++ b/archaeological_files/wizards.py
@@ -20,15 +20,14 @@
from django.conf import settings
from django.core.exceptions import ObjectDoesNotExist
from django.db.models import Max
-from django.shortcuts import render
from django.utils.translation import ugettext_lazy as _
from ishtar_common.forms import reverse_lazy
-from ishtar_common.wizards import ClosingWizard, SearchWizard
+from ishtar_common.wizards import ClosingWizard, SearchWizard, \
+ MultipleDeletionWizard
from archaeological_operations.wizards import OperationWizard,\
OperationAdministrativeActWizard
-from archaeological_operations.models import AdministrativeAct, Parcel, \
- Operation
+from archaeological_operations.models import AdministrativeAct, Parcel
from . import models
@@ -42,6 +41,7 @@ class FileWizard(OperationWizard):
parcel_step_key = 'parcels-'
town_step_keys = ['towns-']
wizard_done_window = reverse_lazy('show-file')
+ redirect_url = "file_modification"
def get_extra_model(self, dct, m2m, form_list):
dct = super(FileWizard, self).get_extra_model(dct, m2m, form_list)
@@ -110,34 +110,26 @@ class FileModificationWizard(FileWizard):
modification = True
+FILE_FIELDS = ['year', 'numeric_reference', 'internal_reference',
+ 'file_type', 'in_charge', 'general_contractor', 'creation_date',
+ 'reception_date', 'total_surface', 'total_developed_surface',
+ 'address', 'address_complement', 'postal_code', 'comment']
+
+
class FileClosingWizard(ClosingWizard):
model = models.File
- fields = ['year', 'numeric_reference', 'internal_reference',
- 'file_type', 'in_charge', 'general_contractor', 'creation_date',
- 'reception_date', 'total_surface', 'total_developed_surface',
- 'address', 'address_complement', 'postal_code', 'comment']
+ fields = FILE_FIELDS
if settings.COUNTRY == 'fr':
fields += ['saisine_type', 'permit_reference']
fields += ['towns']
-class FileDeletionWizard(FileClosingWizard):
- def get_formated_datas(self, forms):
- datas = super(FileDeletionWizard, self).get_formated_datas(forms)
- datas.append((_("Associated operations"), []))
- for operation in Operation.objects.filter(
- associated_file=self.current_obj).all():
-
- if operation.end_date:
- datas[-1][1].append(('', str(operation)))
- return datas
-
- def done(self, form_list, **kwargs):
- obj = self.get_current_object()
- for operation in Operation.objects.filter(associated_file=obj).all():
- operation.delete()
- obj.delete()
- return render(self.request, 'ishtar/wizard/wizard_delete_done.html', {})
+class FileDeletionWizard(MultipleDeletionWizard, FileClosingWizard):
+ model = models.File
+ redirect_url = "file_deletion"
+ fields = FILE_FIELDS
+ wizard_templates = {
+ 'final-file_deletion': 'ishtar/wizard/wizard_file_deletion.html'}
class FileAdministrativeActWizard(OperationAdministrativeActWizard):
diff --git a/ishtar_common/forms.py b/ishtar_common/forms.py
index 5be5deafe..973a61228 100644
--- a/ishtar_common/forms.py
+++ b/ishtar_common/forms.py
@@ -384,6 +384,37 @@ class CustomFormSearch(forms.Form):
self.fields['pk'].widget.user = user
+class LockForm(object):
+ associated_models = {}
+
+ def clean(self):
+ cleaned_data = self.cleaned_data
+ pk_key = None
+ if hasattr(self, "pk_key"):
+ pk_key = self.pk_key
+ elif len(self.associated_models.keys()) == 1:
+ pk_key = list(self.associated_models.keys())[0]
+ if not pk_key:
+ raise NotImplementedError("pk_key must be set")
+ if pk_key not in cleaned_data or not cleaned_data[pk_key]:
+ raise forms.ValidationError(_(u"You should select an item."))
+ model = self.associated_models[pk_key]
+ pks = self.cleaned_data[pk_key]
+ if isinstance(pks, int):
+ pks = [pks]
+ else:
+ pks = pks.split(",")
+ for pk in pks:
+ try:
+ item = model.objects.get(pk=pk)
+ except model.DoesNotExist:
+ raise forms.ValidationError(_("Invalid selection."))
+ if item.locked:
+ raise forms.ValidationError(_("This item is locked "
+ "for edition."))
+ return self.cleaned_data
+
+
class MultiSearchForm(CustomFormSearch):
SEARCH_AND_SELECT = True
pk_key = 'pks'