summaryrefslogtreecommitdiff
path: root/archaeological_files_pdl
diff options
context:
space:
mode:
Diffstat (limited to 'archaeological_files_pdl')
-rw-r--r--archaeological_files_pdl/forms.py208
-rw-r--r--archaeological_files_pdl/locale/fr/LC_MESSAGES/django.po139
-rw-r--r--archaeological_files_pdl/templates/ishtar/blocks/JQueryCorporationPerson.js2
-rw-r--r--archaeological_files_pdl/templates/ishtar/blocks/JQueryNaturalPerson.js2
-rw-r--r--archaeological_files_pdl/templates/ishtar/blocks/JQueryPersonOrga.js65
-rw-r--r--archaeological_files_pdl/templates/ishtar/wizard/wizard_generalcontractor.html15
-rw-r--r--archaeological_files_pdl/templates/ishtar/wizard/wizard_instruction.html106
-rw-r--r--archaeological_files_pdl/templates/ishtar/wizard/wizard_person_orga.html66
-rw-r--r--archaeological_files_pdl/templates/ishtar/wizard/wizard_planningservice.html15
-rw-r--r--archaeological_files_pdl/templates/ishtar/wizard/wizard_preventiveplanning.html80
-rw-r--r--archaeological_files_pdl/urls.py8
-rw-r--r--archaeological_files_pdl/views.py79
-rw-r--r--archaeological_files_pdl/wizards.py53
13 files changed, 818 insertions, 20 deletions
diff --git a/archaeological_files_pdl/forms.py b/archaeological_files_pdl/forms.py
index 87221f24c..53d473b96 100644
--- a/archaeological_files_pdl/forms.py
+++ b/archaeological_files_pdl/forms.py
@@ -21,20 +21,22 @@ import datetime
from django import forms
from django.core import validators
+from django.utils.safestring import mark_safe
from django.utils.translation import ugettext_lazy as _
-from ishtar_common.models import Person
+from ishtar_common.models import Person, PersonType, valid_id
from archaeological_files import models
-from ishtar_common.forms import get_now
+from ishtar_common.forms import get_now, reverse_lazy
+from ishtar_common.forms_common import get_advanced_town_field
+from archaeological_files.forms import GENERAL_CONTRACTOR, \
+ RESPONSIBLE_PLANNING_SERVICE
from ishtar_common import widgets
class FileFormGeneral(forms.Form):
form_label = _("General")
- associated_models = {'in_charge':Person,
- 'related_file':models.File,
- 'file_type':models.FileType}
+ associated_models = {'file_type':models.FileType}
file_type = forms.ChoiceField(label=_("File type"), choices=[])
year = forms.IntegerField(label=_("Year"),
initial=lambda:datetime.datetime.now().year,
@@ -43,9 +45,203 @@ class FileFormGeneral(forms.Form):
creation_date = forms.DateField(label=_(u"Creation date"),
initial=get_now, widget=widgets.JQueryDate)
reception_date = forms.DateField(label=_(u"Reception date"),
- initial=get_now, widget=widgets.JQueryDate)
+ widget=widgets.JQueryDate)
def __init__(self, *args, **kwargs):
super(FileFormGeneral, self).__init__(*args, **kwargs)
self.fields['file_type'].choices = models.FileType.get_types()
self.fields['file_type'].help_text = models.FileType.get_help()
+
+class FileFormPreventiveType(forms.Form):
+ form_label = u"Saisine"
+ associated_models = {'saisine_type':models.SaisineType,
+ 'permit_type':models.PermitType}
+ permit_type = forms.ChoiceField(label=_(u"Permit type"), required=False,
+ choices=[])
+ saisine_type = forms.ChoiceField(label=_(u"Saisine type"),
+ choices=[])
+ def __init__(self, *args, **kwargs):
+ super(FileFormPreventiveType, self).__init__(*args, **kwargs)
+ self.fields['saisine_type'].choices = models.SaisineType.get_types()
+ self.fields['saisine_type'].help_text = models.SaisineType.get_help()
+ self.fields['permit_type'].choices = models.PermitType.get_types(
+ default='NP')
+ self.fields['permit_type'].help_text = models.PermitType.get_help()
+
+class FileFormPlanning(forms.Form):
+ form_label = _(u"Planning")
+ associated_models = {'main_town':models.Town}
+ name = forms.CharField(label=_(u"Planning name"), required=False,
+ max_length=100)
+ main_town = get_advanced_town_field(required=True)
+ locality = forms.CharField(label=_(u"Locality"), max_length=100,
+ required=False)
+ address = forms.CharField(label=_(u"Address (number/street)"),
+ widget=forms.Textarea(
+ attrs={"placeholder":_(u"Number/street")}),
+ required=False,
+ )
+ postal_code = forms.CharField(label=_(u"Postal code"), max_length=10,
+ required=False)
+ total_surface = forms.IntegerField(required=False,
+ widget=widgets.AreaWidget,
+ label=_(u"Total surface (m²)"),
+ validators=[validators.MinValueValidator(0),
+ validators.MaxValueValidator(999999999)])
+ total_developed_surface = forms.IntegerField(widget=widgets.AreaWidget,
+ label=_(u"Total developed surface (m²)"),
+ required=False, validators=[validators.MinValueValidator(0),
+ validators.MaxValueValidator(999999999)])
+
+class FileFormResearchAddress(forms.Form):
+ form_label = _(u"Address")
+ associated_models = {'main_town':models.Town}
+ main_town = get_advanced_town_field(required=True)
+ locality = forms.CharField(label=_(u"Locality"), max_length=100,
+ required=False)
+ address = forms.CharField(label=_(u"Address (number/street)"),
+ widget=forms.Textarea(
+ attrs={"placeholder":_(u"Number/street")}),
+ required=False,
+ )
+ postal_code = forms.CharField(label=_(u"Postal code"), max_length=10,
+ required=False)
+
+class PersonOrgaForm(forms.Form):
+ PERSON_FIELD = 'TO BE DEFINED'
+ ORGA_FIELD = 'TO BE DEFINED'
+ PERSON_TYPE = GENERAL_CONTRACTOR
+
+ def _media(self):
+ if self.status == 'corporation':
+ return forms.Media(js=('pdl/JQueryCorporation.js',))
+ media = property(_media)
+
+ def __init__(self, *args, **kwargs):
+
+ # get the status: natural person or corporation
+ DEFAULT_STATUS = 'natural'
+ current_status = ''
+ if 'data' in kwargs:
+ current_item_key = ((kwargs['prefix'] + '-') if kwargs.get('prefix')\
+ else '') + self.PERSON_FIELD
+ if kwargs['data'] and kwargs['data'].get(current_item_key):
+ model = self.associated_models[self.PERSON_FIELD]
+ try:
+ item = model.objects.get(pk=kwargs['data'][current_item_key])
+ current_status = 'natural'
+ except (model.DoesNotExist, ValueError):
+ pass
+ current_item_key = ((kwargs['prefix'] + '-') if kwargs.get('prefix')\
+ else '') + self.ORGA_FIELD
+ if kwargs['data'] and kwargs['data'].get(current_item_key):
+ current_status = 'corporation'
+
+ status = ''
+ if 'status' in kwargs:
+ status = kwargs.pop('status')
+ if current_status != status:
+ if kwargs.get('data'):
+ # status is different from the existing - clear fields
+ kwargs.pop('data')
+ elif current_status:
+ status = current_status
+ else:
+ status = DEFAULT_STATUS
+
+ self.status = status
+
+ if status not in ('natural', 'corporation'):
+ status = DEFAULT_STATUS
+ super(PersonOrgaForm, self).__init__(*args, **kwargs)
+
+ # distinct widget for natural and corporation
+ if status == 'natural':
+ self.fields[self.PERSON_FIELD] = forms.IntegerField(
+ label=self.fields[self.ORGA_FIELD].label,
+ required=False,
+ widget=widgets.JQueryPersonOrganization(
+ reverse_lazy('autocomplete-person',
+ args=[self.PERSON_TYPE.pk]),
+ reverse_lazy('person_create'),
+ model=Person,
+ limit={'person_types':[self.PERSON_TYPE.pk],
+ 'attached_to__isnull':True},
+ js_template='ishtar/blocks/JQueryNaturalPerson.js',
+ new=True),
+ validators=[valid_id(Person)])
+
+class FileFormGeneralContractor(PersonOrgaForm):
+ form_label = _(u"General contractor")
+ associated_models = {'general_contractor':models.Person}
+ raw_general_contractor = forms.CharField(label=_(u"General contractor"),
+ required=False, max_length=200)
+ PERSON_FIELD = 'general_contractor'
+ ORGA_FIELD = 'raw_general_contractor'
+ PERSON_TYPE = GENERAL_CONTRACTOR
+
+class FileFormPlanningService(PersonOrgaForm):
+ form_label = _(u"Town planning service")
+ associated_models = {'responsible_town_planning_service':models.Person}
+
+ reference_number = forms.IntegerField(label=_(u"File reference"),
+ required=False)
+ raw_town_planning_service = forms.CharField(
+ label=_(u"Responsible town planning service"), required=False,
+ max_length=200)
+ PERSON_FIELD = 'responsible_town_planning_service'
+ ORGA_FIELD = 'raw_town_planning_service'
+ PERSON_TYPE = RESPONSIBLE_PLANNING_SERVICE
+
+ def __init__(self, *args, **kwargs):
+ super(FileFormPlanningService, self).__init__(*args, **kwargs)
+ self.fields.keyOrder = []
+ if self.ORGA_FIELD in self.fields:
+ self.fields.keyOrder.append(self.ORGA_FIELD)
+ elif self.PERSON_FIELD in self.fields:
+ self.fields.keyOrder.append(self.PERSON_FIELD)
+ self.fields.keyOrder.append('reference_number')
+
+class FileFormInstruction(forms.Form):
+ form_label = u"Instruction SRA"
+ associated_models = {'in_charge':models.Person}
+ in_charge = forms.IntegerField(label=_("Person in charge"),
+ widget=widgets.JQueryAutoComplete(reverse_lazy('autocomplete-person',
+ args=[PersonType.objects.get(txt_idx='sra_agent').pk]),
+ limit={'person_types':[PersonType.objects.get(txt_idx='sra_agent').pk]},
+ associated_model=Person, new=True),
+ validators=[valid_id(Person)])
+ related_file = forms.IntegerField(label=_("Related file"), required=False,
+ widget=widgets.JQueryAutoComplete(reverse_lazy('autocomplete-file'),
+ associated_model=models.File),
+ validators=[valid_id(models.File)])
+ comment = forms.CharField(label=_(u"Comment"), widget=forms.Textarea,
+ required=False)
+ instruction_deadline = forms.DateField(widget=widgets.JQueryDate,
+ required=False)
+ year = forms.IntegerField(label=_("Year"),
+ validators=[validators.MinValueValidator(1900),
+ validators.MaxValueValidator(2100)])
+ numeric_reference = forms.IntegerField(label=_("Numeric reference"),
+ required=False)
+ end_date = forms.DateField(initial=get_now, widget=widgets.JQueryDate,
+ required=False)
+
+ def __init__(self, *args, **kwargs):
+ c_year = datetime.date.today().year
+ if 'year' in kwargs:
+ c_year = kwargs.pop('year')
+ super(FileFormInstruction, self).__init__(*args, **kwargs)
+ self.fields['year'].initial = c_year
+ self.fields['year'].widget.attrs.update({'readonly':'readonly'})
+ c_num, lasts = 0, ""
+ q = models.File.objects.filter(numeric_reference__isnull=False,
+ year=c_year).order_by('-numeric_reference')
+ if q.count():
+ num = q.all()[0].numeric_reference
+ lasts = u"SRA %s-%d" % (unicode(c_year), num)
+ lbl = self.fields['numeric_reference'].label
+ if lasts:
+ lbl += u"<br/>(dernière entrée : %s)" % lasts
+ self.fields['numeric_reference'].label = mark_safe(lbl)
+ self.fields['numeric_reference'].initial = c_num + 1
diff --git a/archaeological_files_pdl/locale/fr/LC_MESSAGES/django.po b/archaeological_files_pdl/locale/fr/LC_MESSAGES/django.po
new file mode 100644
index 000000000..5d8feb4ab
--- /dev/null
+++ b/archaeological_files_pdl/locale/fr/LC_MESSAGES/django.po
@@ -0,0 +1,139 @@
+# Ishtar po translation.
+# Copyright (C) 2014
+# This file is distributed under the same license as the Ishtar package.
+# Étienne Loks <etienne.loks at peacefrogs net>, 2014.
+#
+#, fuzzy
+msgid ""
+msgstr ""
+"Project-Id-Version: stable\n"
+"Report-Msgid-Bugs-To: \n"
+"POT-Creation-Date: 2014-12-31 12:09+0100\n"
+"PO-Revision-Date: 2014-12-31 12:09+0100\n"
+"Last-Translator: Étienne Loks <etienne.loks at peacefrogs net>\n"
+"Language-Team: \n"
+"Language: \n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"Plural-Forms: nplurals=2; plural=(n > 1)\n"
+
+#: forms.py:38
+msgid "General"
+msgstr "Général"
+
+#: forms.py:40
+msgid "File type"
+msgstr "Type de dossier"
+
+#: forms.py:41 forms.py:199
+msgid "Year"
+msgstr "Année"
+
+#: forms.py:45
+msgid "Creation date"
+msgstr "Date de création"
+
+#: forms.py:47
+msgid "Reception date"
+msgstr "Date de réception"
+
+#: forms.py:59
+msgid "Permit type"
+msgstr "Type de permis"
+
+#: forms.py:61
+msgid "Saisine type"
+msgstr "Type de saisine"
+
+#: forms.py:72
+msgid "Planning"
+msgstr "Aménagement"
+
+#: forms.py:74
+msgid "Planning name"
+msgstr "Nom de l'aménagement"
+
+#: forms.py:77
+msgid "Locality"
+msgstr "Lieu-dit"
+
+#: forms.py:79
+msgid "Address (number/street)"
+msgstr "Adresse (n° / voie)"
+
+#: forms.py:81
+msgid "Number/street"
+msgstr "n° / voie"
+
+#: forms.py:84
+msgid "Postal code"
+msgstr "Code postal"
+
+#: forms.py:88
+msgid "Total surface (m²)"
+msgstr "Surface totale des terrains (m²)"
+
+#: forms.py:92
+msgid "Total developed surface (m²)"
+msgstr "Surface totale aménagée (m²)"
+
+#: forms.py:97 forms.py:136 forms.py:149
+msgid "General contractor"
+msgstr "Aménageur"
+
+#: forms.py:161
+msgid "Town planning service"
+msgstr "Service instructeur"
+
+#: forms.py:163
+msgid "File reference"
+msgstr "Référence du dossier"
+
+#: forms.py:169
+msgid "Responsible town planning service"
+msgstr "Dossier suivi par"
+
+#: forms.py:185
+msgid "Person in charge"
+msgstr "Dossier suivi par"
+
+#: forms.py:191
+msgid "Related file"
+msgstr "Dossier lié à"
+
+#: forms.py:195
+msgid "Comment"
+msgstr "Commentaire"
+
+#: forms.py:202
+msgid "Numeric reference"
+msgstr "Référence numérique"
+
+#: views.py:46
+msgid "New file"
+msgstr "Nouveau dossier"
+
+#: views.py:58 views.py:61
+msgid "File followed by"
+msgstr "Dossier suivi par"
+
+#: templates/ishtar/wizard/wizard_generalcontractor.html:12
+msgid "Corporation"
+msgstr "Personne morale"
+
+#: templates/ishtar/wizard/wizard_generalcontractor.html:16
+msgid "Natural person"
+msgstr "Personne physique"
+
+#: templates/ishtar/wizard/wizard_generalcontractor.html:27
+#: templates/ishtar/wizard/wizard_instruction.html:60
+#: templates/ishtar/wizard/wizard_preventiveplanning.html:76
+msgid "Validate"
+msgstr "Validation"
+
+#: templates/ishtar/wizard/wizard_generalcontractor.html:28
+#: templates/ishtar/wizard/wizard_instruction.html:61
+#: templates/ishtar/wizard/wizard_preventiveplanning.html:77
+msgid "Validate and end"
+msgstr "Terminer"
diff --git a/archaeological_files_pdl/templates/ishtar/blocks/JQueryCorporationPerson.js b/archaeological_files_pdl/templates/ishtar/blocks/JQueryCorporationPerson.js
new file mode 100644
index 000000000..3eb375167
--- /dev/null
+++ b/archaeological_files_pdl/templates/ishtar/blocks/JQueryCorporationPerson.js
@@ -0,0 +1,2 @@
+var current_status = 'corporation';
+{% include "ishtar/blocks/JQueryPersonOrga.js" %}
diff --git a/archaeological_files_pdl/templates/ishtar/blocks/JQueryNaturalPerson.js b/archaeological_files_pdl/templates/ishtar/blocks/JQueryNaturalPerson.js
new file mode 100644
index 000000000..fc4b9a90c
--- /dev/null
+++ b/archaeological_files_pdl/templates/ishtar/blocks/JQueryNaturalPerson.js
@@ -0,0 +1,2 @@
+var current_status = 'natural';
+{% include "ishtar/blocks/JQueryPersonOrga.js" %}
diff --git a/archaeological_files_pdl/templates/ishtar/blocks/JQueryPersonOrga.js b/archaeological_files_pdl/templates/ishtar/blocks/JQueryPersonOrga.js
new file mode 100644
index 000000000..c151a5e4d
--- /dev/null
+++ b/archaeological_files_pdl/templates/ishtar/blocks/JQueryPersonOrga.js
@@ -0,0 +1,65 @@
+person_save_callback = function(item_id, lbl){
+ var url = {{edit_source}};
+ $('#id_{{field_id}}').val(null);
+ $('#id_select_{{field_id}}').val(lbl);
+ if (item_id){
+ url = {{edit_source}}+item_id;
+ $('#id_{{field_id}}').val(item_id);
+ }
+ $("#id_select_{{field_id}}").trigger('autocompletechange');
+ $.get(url , function( data ) {
+ $( "#div-{{field_id}}" ).html( data );
+ });
+};
+
+edit_url = {{edit_source}};
+parent_id = "{{field_id}}";
+
+person_new_callback = function(){
+ var url = {{edit_source}};
+ $('#id_{{field_id}}').val(null);
+ $('#id_select_{{field_id}}').val(null);
+}
+
+$(function() {
+ var $radios = $('input:radio[name=person_type]');
+ if($radios.is(':checked') === false) {
+ $radios.filter('[value='+ current_status +']').prop('checked', true);
+ }
+
+ $radios.change(function(){
+ var loc = window.location;
+ window.location = loc.protocol + '//' + loc.host + loc.pathname + "?status=" + $('input:radio[name=person_type]:checked').val();
+ });
+
+ $("#id_select_{{field_id}}").autocomplete({
+ source: {{source}},
+ select: function( event, ui ) {
+ var url = {{edit_source}};
+ if(ui.item){
+ url = {{edit_source}}+ui.item.id;
+ $('#id_{{field_id}}').val(ui.item.id);
+ } else {
+ $('#id_{{field_id}}').val(null);
+ }
+ $.get(url , function( data ) {
+ $( "#div-{{field_id}}" ).html( data );
+ });
+ },
+ minLength: 2{% if options %},
+ {{options}}
+ {% endif %}
+ });
+
+ $.get( {{edit_source}}{% if selected %}+'{{selected}}'{% endif %}, function( data ) {
+ $( "#div-{{field_id}}" ).html( data );
+ });
+
+ $('#id_select_{{field_id}}').live('click', function(){
+ $('#id_{{field_id}}').val(null);
+ $('#id_select_{{field_id}}').val(null);
+ $.get( {{edit_source}}, function( data ) {
+ $( "#div-{{field_id}}" ).html( data );
+ });
+ });
+});
diff --git a/archaeological_files_pdl/templates/ishtar/wizard/wizard_generalcontractor.html b/archaeological_files_pdl/templates/ishtar/wizard/wizard_generalcontractor.html
new file mode 100644
index 000000000..e43e336c4
--- /dev/null
+++ b/archaeological_files_pdl/templates/ishtar/wizard/wizard_generalcontractor.html
@@ -0,0 +1,15 @@
+{% extends "ishtar/wizard/wizard_person_orga.html" %}
+
+{% block corporation %}
+ <tr class='required'>
+ <th>{{ wizard.form.raw_general_contractor.label_tag }}</th>
+ <td> {{ wizard.form.raw_general_contractor.errors }}{{wizard.form.raw_general_contractor|safe}}</td>
+ </tr>
+{% endblock %}
+
+{% block natural %}
+ <tr class='required'>
+ <th>{{ wizard.form.general_contractor.label_tag }}</th>
+ <td> {{ wizard.form.general_contractor.errors }}{{wizard.form.general_contractor|safe}}</td>
+ </tr>
+{% endblock %}
diff --git a/archaeological_files_pdl/templates/ishtar/wizard/wizard_instruction.html b/archaeological_files_pdl/templates/ishtar/wizard/wizard_instruction.html
new file mode 100644
index 000000000..4162a3764
--- /dev/null
+++ b/archaeological_files_pdl/templates/ishtar/wizard/wizard_instruction.html
@@ -0,0 +1,106 @@
+{% extends "ishtar/wizard/default_wizard.html" %}
+{% load i18n range table_form %}
+{% block wizard_form %}
+<form action="." method="post" name='wizard'{% if wizard.form.file_upload %} enctype="multipart/form-data"{% endif %}>{% csrf_token %}
+<div class='form'>
+{{ wizard.form.media }}
+{{ wizard.management_form }}
+
+<table>
+
+<tr class='required'>
+ <th><label for="id_instruction-{{CURRENT_ACTION}}-in_charge">Dossier suivi par</label></th>
+</tr>
+<tr class='required'>
+ <td>{{wizard.form.in_charge.errors}}{{wizard.form.in_charge|safe}}</td>
+</tr>
+
+<tr>
+ <th><label for="id_instruction-{{CURRENT_ACTION}}-related_file">Dossier lié à</label></th>
+</tr>
+<tr>
+ <td>{{wizard.form.related_file|safe}}</td>
+</tr>
+
+<tr>
+ <th><label for="id_instruction-{{CURRENT_ACTION}}-comment">Commentaire</label></th>
+</tr>
+<tr>
+ <td>{{wizard.form.comment|safe}}</td>
+</tr>
+
+<tr class='required'>
+ <th><label>État du dossier</label></th>
+</tr>
+<tr>
+ <td><input type='radio' name='state' value='open' id='state-open'/> <label for='state-open'>Dossier actif</label></td>
+</tr>
+<tr>
+ <td><input type='radio' name='state' value='closed' id='state-closed'/> <label for='state-closed'>Dossier clos / date de clôture</label> : {{wizard.form.end_date|safe}}</td>
+</tr>
+
+<tr class='required'>
+ <th><label for="id_instruction-{{CURRENT_ACTION}}-instruction_deadline">Date limite d'instruction</label></th>
+</tr>
+<tr class='required'>
+ <td>{{wizard.form.instruction_deadline.errors}}{{wizard.form.instruction_deadline|safe}}</td>
+</tr>
+
+<tr class='required'>
+ <th><label for="id_instruction-{{CURRENT_ACTION}}-year">{{wizard.form.numeric_reference.label}}</label></th>
+</tr>
+<tr>
+ <td>{{wizard.form.numeric_reference.errors}}SRA <span class='small'>{{wizard.form.year|safe}}</span> - <span class='small'>{{wizard.form.numeric_reference|safe}}</span></td>
+</tr>
+</table>
+
+<input type="hidden" name="{{ step_field }}" value="{{ step0 }}" />
+{{ previous_fields|safe }}
+{% block "validation_bar" %}
+{% include 'ishtar/wizard/validation_bar.html' %}
+{% endblock %}
+</div>
+</form>
+<script type='text/javascript'>
+$(function(){
+
+ if ($('#id_instruction-{{CURRENT_ACTION}}-end_date').val()){
+ $("#state-closed").prop('checked', true);
+ } else {
+ $("#state-open").prop('checked', true);
+ }
+
+ check_state = function(){
+ var state = $("input[name=state]:checked").val();
+ if (state == 'closed'){
+ $('#id_instruction-{{CURRENT_ACTION}}-end_date').focus();
+ $('#id_instruction-{{CURRENT_ACTION}}-end_date').prop('disabled', false);
+ } else if (state == 'open'){
+ $('#id_instruction-{{CURRENT_ACTION}}-end_date').val('');
+ $('#id_instruction-{{CURRENT_ACTION}}-end_date').prop('disabled', true);
+ }
+ };
+
+ $('input[name=state]').click(check_state);
+
+ check_state();
+
+ $('#submit_form').click(function(){
+ var state = $("input[name=state]:checked").val();
+ if (state == 'closed'){
+ if (!$('#id_instruction-{{CURRENT_ACTION}}-end_date').val()){
+ alert("Vous devez sélectionner une date de clôture.")
+ return false;
+ }
+ return true;
+ } else if (state == 'open'){
+ return true;
+ } else {
+ alert("Vous devez choisir un état pour ce dossier.")
+ return false;
+ }
+ return true;
+ });
+});
+</script>
+{% endblock %}
diff --git a/archaeological_files_pdl/templates/ishtar/wizard/wizard_person_orga.html b/archaeological_files_pdl/templates/ishtar/wizard/wizard_person_orga.html
new file mode 100644
index 000000000..91dd7e042
--- /dev/null
+++ b/archaeological_files_pdl/templates/ishtar/wizard/wizard_person_orga.html
@@ -0,0 +1,66 @@
+{% extends "ishtar/wizard/default_wizard.html" %}
+{% load i18n range table_form %}
+{% block wizard_form %}
+<script type='text/javascript'>
+function update_form(){
+ if ($('input[name="person_type"]:radio:checked').val() == 'corporation'){
+ $('#natural_div').hide();
+ $('#corporation_div').show();
+ } else {
+ $('#natural_div').show();
+ $('#corporation_div').hide();
+ }
+}
+$(function() {
+ update_form();
+});
+</script>
+<form action="." method="post" name='wizard'{% if wizard.form.file_upload %} enctype="multipart/form-data"{% endif %}>{% csrf_token %}
+<div class='form'>
+{% if wizard.form.media %}{{ wizard.form.media }}{% endif %}
+{{ wizard.management_form }}
+
+<table class='formset'>
+ <caption>Statut</caption>
+ <tr>
+ <th><label>{% trans "Corporation" %}</label></th>
+ <td><input type='radio' name='person_type' value='corporation'/></td>
+ </tr>
+ <tr>
+ <th><label>{% trans "Natural person" %}</label></th>
+ <td><input type='radio' name='person_type' value='natural'/></td>
+ </tr>
+</table>
+
+<table id='corporation_div'>
+ {% if wizard.form.non_field_errors %}<tr class='errors'>
+ <td colspan='3'>{{wizard.form.non_field_errors}}</td>
+ </tr>{%endif%}
+
+{% block corporation %}
+{% endblock %}
+</table>
+
+<div id='natural_div'>
+<table>
+ {% if wizard.form.non_field_errors %}<tr class='errors'>
+ <td colspan='3'>{{wizard.form.non_field_errors}}</td>
+ </tr>{%endif%}
+
+{% block natural %}
+{% endblock %}
+</table>
+</div>
+
+{% block otherfields %}
+{% endblock %}
+
+<input type="hidden" name="{{ step_field }}" value="{{ step0 }}" />
+{{ previous_fields|safe }}
+{% block "validation_bar" %}
+{% include 'ishtar/wizard/validation_bar.html' %}
+{% endblock %}
+</div>
+</form>
+{% endblock %}
+
diff --git a/archaeological_files_pdl/templates/ishtar/wizard/wizard_planningservice.html b/archaeological_files_pdl/templates/ishtar/wizard/wizard_planningservice.html
new file mode 100644
index 000000000..29bc2397c
--- /dev/null
+++ b/archaeological_files_pdl/templates/ishtar/wizard/wizard_planningservice.html
@@ -0,0 +1,15 @@
+{% extends "ishtar/wizard/wizard_person_orga.html" %}
+
+{% block corporation %}
+ <tr class='required'>
+ <th>{{ wizard.form.raw_town_planning_service.label_tag }}</th>
+ <td> {{ wizard.form.raw_town_planning_service.errors }}{{wizard.form.raw_town_planning_service|safe}}</td>
+ </tr>
+{% endblock %}
+
+{% block natural %}
+ <tr class='required'>
+ <th>{{ wizard.form.responsible_town_planning_service.label_tag }}</th>
+ <td> {{ wizard.form.responsible_town_planning_service.errors }}{{wizard.form.responsible_town_planning_service|safe}}</td>
+ </tr>
+{% endblock %}
diff --git a/archaeological_files_pdl/templates/ishtar/wizard/wizard_preventiveplanning.html b/archaeological_files_pdl/templates/ishtar/wizard/wizard_preventiveplanning.html
new file mode 100644
index 000000000..66569a66d
--- /dev/null
+++ b/archaeological_files_pdl/templates/ishtar/wizard/wizard_preventiveplanning.html
@@ -0,0 +1,80 @@
+{% extends "ishtar/wizard/default_wizard.html" %}
+{% load i18n range table_form %}
+{% block wizard_form %}
+<form action="." method="post" name='wizard'{% if wizard.form.file_upload %} enctype="multipart/form-data"{% endif %}>{% csrf_token %}
+<div class='form'>
+{{ wizard.form.media }}
+{{ wizard.management_form }}
+
+<table>
+
+<tr class='required'>
+ <th><label for="id_preventiveplanning-{{CURRENT_ACTION}}-name">Nom de l'aménagement</label></th>
+</tr>
+<tr class='required'>
+ <td>{{wizard.form.name|safe}}</td>
+</tr>
+
+</table>
+
+<h4>Localisation</h4>
+<table>
+
+{% if wizard.form.main_town.errors %}<tr>
+ <td colspan="2">{{wizard.form.main_town.errors}}</td>
+</tr>{% endif %}
+
+<tr>
+ <td>{{wizard.form.main_town|safe}}</td>
+</tr>
+
+<tr>
+ <th colspan='2'><label for="id_preventiveplanning-{{CURRENT_ACTION}}-locality">Lieu-dit</label></th>
+</tr>
+<tr>
+ <td colspan='2'>{{wizard.form.locality|safe}}</td>
+</tr>
+
+<tr>
+ <th colspan='2'><label for="id_preventiveplanning-{{CURRENT_ACTION}}-address">Adresse</label></th>
+</tr>
+<tr>
+ <td colspan='2'>{{wizard.form.address|safe}}</td>
+</tr>
+
+<tr>
+ <th colspan='2'><label for="id_preventiveplanning-{{CURRENT_ACTION}}-postal_code">Code postal</label></th>
+</tr>
+<tr>
+ <td colspan='2'>{{wizard.form.postal_code|safe}}</td>
+</tr>
+
+</table>
+
+<h4>Surfaces</h4>
+<table>
+
+<tr>
+ <th><label for="id_preventiveplanning-{{CURRENT_ACTION}}-total_surface">Surface totale des terrains</label></th>
+</tr>
+<tr>
+ <td>{{wizard.form.total_surface|safe}}</td>
+</tr>
+
+<tr>
+ <th><label for="id_preventiveplanning-{{CURRENT_ACTION}}-total_developed_surface">Surface totale aménagée</label></th>
+</tr>
+<tr>
+ <td>{{wizard.form.total_developed_surface|safe}}</td>
+</tr>
+
+</table>
+
+<input type="hidden" name="{{ step_field }}" value="{{ step0 }}" />
+{{ previous_fields|safe }}
+{% block "validation_bar" %}
+{% include 'ishtar/wizard/validation_bar.html' %}
+{% endblock %}
+</div>
+</form>
+{% endblock %}
diff --git a/archaeological_files_pdl/urls.py b/archaeological_files_pdl/urls.py
index b6878e90b..4cd746e8a 100644
--- a/archaeological_files_pdl/urls.py
+++ b/archaeological_files_pdl/urls.py
@@ -24,4 +24,12 @@ from archaeological_files_pdl import views
urlpatterns = patterns('',
url(r'file_creation/(?P<step>.+)?$',
views.file_creation_wizard, name='file_creation'),
+ url(r'file_modification/(?P<step>.+)?$',
+ views.file_modification_wizard, name='file_modification'),
+ url(r'townplanning-edit/$',
+ views.TownPlanningCreate.as_view(),
+ name='townplanning_create'),
+ url(r'townplanning-edit/(?P<pk>\d+)$',
+ views.TownPlanningEdit.as_view(),
+ name='townplanning_edit'),
)
diff --git a/archaeological_files_pdl/views.py b/archaeological_files_pdl/views.py
index 7d51c8ec5..bcb1c0211 100644
--- a/archaeological_files_pdl/views.py
+++ b/archaeological_files_pdl/views.py
@@ -19,30 +19,81 @@
from django.utils.translation import ugettext_lazy as _
-from archaeological_files.wizards import FileWizard
+from archaeological_files_pdl.wizards import FileWizard, FileModificationWizard
from archaeological_operations.wizards import is_preventive, is_not_preventive
-from ishtar_common.forms_common import TownFormset
+from ishtar_common.views import OrganizationPersonCreate, OrganizationPersonEdit
+
from archaeological_files_pdl import forms
from archaeological_files import forms as ref_forms
from archaeological_operations.forms import ParcelFormSet
from archaeological_files import models
+
+file_creation_wizard_is_preventive = is_preventive('general-file_creation',
+ models.FileType, type_key='file_type')
+file_creation_wizard_is_not_preventive = is_not_preventive(
+ 'general-file_creation', models.FileType, type_key='file_type')
file_creation_wizard = FileWizard.as_view([
- ('general-file_creation', forms.FileFormGeneral),
- ('towns-file_creation', TownFormset),
- ('parcels-file_creation', ParcelFormSet),
- ('preventive-file_creation', ref_forms.FileFormPreventive),
- ('research-file_creation', ref_forms.FileFormResearch),
- ('final-file_creation', ref_forms.FinalForm)],
+ ('general-file_creation', forms.FileFormGeneral),
+ ('preventivetype-file_creation', forms.FileFormPreventiveType),
+ ('preventiveplanning-file_creation', forms.FileFormPlanning),
+ ('researchaddress-file_creation', forms.FileFormResearchAddress),
+ ('parcelspdl-file_creation', ParcelFormSet),
+ ('generalcontractor-file_creation',
+ forms.FileFormGeneralContractor),
+ ('planningservice-file_creation',
+ forms.FileFormPlanningService),
+ ('research-file_creation', ref_forms.FileFormResearch),
+ ('instruction-file_creation',
+ forms.FileFormInstruction),
+ ('final-file_creation', ref_forms.FinalForm)],
label=_(u"New file"),
condition_dict={
- 'preventive-file_creation':\
- is_preventive( 'general-file_creation', models.FileType,
- type_key='file_type'),
- 'research-file_creation':\
- is_not_preventive('general-file_creation', models.FileType,
- type_key='file_type'),
+ 'preventivetype-file_creation':file_creation_wizard_is_preventive,
+ 'preventiveplanning-file_creation':file_creation_wizard_is_preventive,
+ 'generalcontractor-file_creation':file_creation_wizard_is_preventive,
+ 'planningservice-file_creation':file_creation_wizard_is_preventive,
+ 'researchaddress-file_creation':file_creation_wizard_is_not_preventive,
+ 'research-file_creation':file_creation_wizard_is_not_preventive
},
url_name='file_creation',)
+
+file_modification_wizard_is_preventive = is_preventive('general-file_modification',
+ models.FileType, type_key='file_type')
+file_modification_wizard_is_not_preventive = is_not_preventive(
+ 'general-file_modification', models.FileType, type_key='file_type')
+file_modification_wizard = FileModificationWizard.as_view([
+ ('selec-file_modification', ref_forms.FileFormSelection),
+
+ ('general-file_modification', forms.FileFormGeneral),
+ ('preventivetype-file_modification', forms.FileFormPreventiveType),
+ ('preventiveplanning-file_modification', forms.FileFormPlanning),
+ ('researchaddress-file_modification', forms.FileFormResearchAddress),
+ ('parcelspdl-file_modification', ParcelFormSet),
+ ('generalcontractor-file_modification',
+ forms.FileFormGeneralContractor),
+ ('planningservice-file_modification',
+ forms.FileFormPlanningService),
+ ('research-file_modification', ref_forms.FileFormResearch),
+ ('instruction-file_modification',
+ forms.FileFormInstruction),
+ ('final-file_modification', ref_forms.FinalForm)],
+ label=_(u"File modification"),
+ condition_dict={
+ 'preventivetype-file_modification':file_modification_wizard_is_preventive,
+ 'preventiveplanning-file_modification':file_modification_wizard_is_preventive,
+ 'generalcontractor-file_modification':file_modification_wizard_is_preventive,
+ 'planningservice-file_modification':file_modification_wizard_is_preventive,
+ 'researchaddress-file_modification':file_modification_wizard_is_not_preventive,
+ 'research-file_modification':file_modification_wizard_is_not_preventive
+ },
+ url_name='file_modification',)
+
+
+class TownPlanningEdit(OrganizationPersonEdit):
+ relative_label = _("File followed by")
+
+class TownPlanningCreate(OrganizationPersonCreate):
+ relative_label = _("File followed by")
diff --git a/archaeological_files_pdl/wizards.py b/archaeological_files_pdl/wizards.py
new file mode 100644
index 000000000..2d3491c8d
--- /dev/null
+++ b/archaeological_files_pdl/wizards.py
@@ -0,0 +1,53 @@
+#!/usr/bin/env python
+# -*- coding: utf-8 -*-
+# Copyright (C) 2014 Étienne Loks <etienne.loks_AT_peacefrogsDOTnet>
+
+# This program is free software: you can redistribute it and/or modify
+# it under the terms of the GNU Affero General Public License as
+# published by the Free Software Foundation, either version 3 of the
+# License, or (at your option) any later version.
+
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU Affero General Public License for more details.
+
+# You should have received a copy of the GNU Affero General Public License
+# along with this program. If not, see <http://www.gnu.org/licenses/>.
+
+# See the file COPYING for details.
+
+from archaeological_files.wizards import FileWizard as BaseFileWizard
+
+class FileWizard(BaseFileWizard):
+ parcel_step_key = 'parcelspdl-'
+ town_step_keys = ['preventiveplanning-', 'researchaddress-']
+ town_input_id = 'main_town'
+ multi_towns = False
+ wizard_templates = {
+ 'generalcontractor-%(url_name)s':\
+ 'ishtar/wizard/wizard_generalcontractor.html',
+ 'planningservice-%(url_name)s':\
+ 'ishtar/wizard/wizard_planningservice.html',
+ 'instruction-%(url_name)s':\
+ 'ishtar/wizard/wizard_instruction.html',
+ 'preventiveplanning-%(url_name)s':\
+ 'ishtar/wizard/wizard_preventiveplanning.html',
+ }
+
+ def get_current_year(self):
+ general_form_key = 'general-' + self.url_name
+ return self.session_get_value(general_form_key, 'year')
+
+ def get_form_kwargs(self, *args, **kwargs):
+ returned = super(FileWizard, self).get_form_kwargs(*args, **kwargs)
+ if args and (args[0].startswith('generalcontractor-') or
+ args[0].startswith('planningservice-')):
+ if 'status' in self.request.GET:
+ returned['status'] = self.request.GET['status']
+ if args and args[0].startswith('instruction-'):
+ returned['year'] = self.get_current_year()
+ return returned
+
+class FileModificationWizard(FileWizard):
+ modification = True