diff options
author | Étienne Loks <etienne.loks@iggdrasil.net> | 2018-02-14 18:03:56 +0100 |
---|---|---|
committer | Étienne Loks <etienne.loks@iggdrasil.net> | 2018-02-15 17:20:19 +0100 |
commit | 300cac90732e559ef6b900f48ddb606c1ff5aefc (patch) | |
tree | 92b533c6b223a7fa9d6a7e4e00b057c5c3195a40 | |
parent | 7c3a4661c5a783cce329210fad5af2db6ea48155 (diff) | |
download | Ishtar-300cac90732e559ef6b900f48ddb606c1ff5aefc.tar.bz2 Ishtar-300cac90732e559ef6b900f48ddb606c1ff5aefc.zip |
Archaeological site: simple creation wizard (refs #3913)
-rw-r--r-- | archaeological_operations/forms.py | 26 | ||||
-rw-r--r-- | archaeological_operations/ishtar_menu.py | 10 | ||||
-rw-r--r-- | archaeological_operations/urls.py | 5 | ||||
-rw-r--r-- | archaeological_operations/views.py | 18 | ||||
-rw-r--r-- | archaeological_operations/wizards.py | 10 | ||||
-rw-r--r-- | ishtar_common/forms.py | 144 |
6 files changed, 133 insertions, 80 deletions
diff --git a/archaeological_operations/forms.py b/archaeological_operations/forms.py index 38efb269f..bf69a74b5 100644 --- a/archaeological_operations/forms.py +++ b/archaeological_operations/forms.py @@ -1288,6 +1288,32 @@ class SiteFormSelection(IshtarForm): return cleaned_data +class SiteForm(ManageOldType): + form_label = _(u"General") + form_admin_name = _(u"Archaeological site - 010 - General") + associated_models = {'period': models.Period, 'remain': models.RemainType} + reference = forms.CharField(label=_(u"Reference"), max_length=20) + name = forms.CharField(label=_(u"Name"), max_length=200, required=False) + period = forms.MultipleChoiceField( + label=_("Periods"), choices=[], widget=widgets.Select2Multiple, + required=False) + remain = forms.MultipleChoiceField( + label=_("Remains"), choices=[], widget=widgets.Select2Multiple, + required=False) + + TYPES = [ + FieldType('period', models.Period, True), + FieldType('remain', models.RemainType, True), + ] + + def clean_reference(self): + reference = self.cleaned_data['reference'] + if models.ArchaeologicalSite.objects.filter( + reference=reference).count(): + raise forms.ValidationError(_(u"This reference already exists.")) + return reference + + #################################### # Source management for operations # #################################### diff --git a/archaeological_operations/ishtar_menu.py b/archaeological_operations/ishtar_menu.py index 5c2cca383..55acf810b 100644 --- a/archaeological_operations/ishtar_menu.py +++ b/archaeological_operations/ishtar_menu.py @@ -28,11 +28,6 @@ from archaeological_operations import models """ MenuItem( - 'operation_creation', _(u"Creation"), - model=models.Operation, - access_controls=['add_operation', - 'add_own_operation']), -MenuItem( 'operation_modification', _(u"Modification"), model=models.Operation, access_controls=['change_operation', @@ -116,6 +111,11 @@ MENU_SECTIONS = [ model=models.ArchaeologicalSite, access_controls=['view_archaeologicalsite', 'view_own_archaeologicalsite']), + MenuItem( + 'site_creation', _(u"Creation"), + model=models.ArchaeologicalSite, + access_controls=['add_archaeologicalsite', + 'add_own_archaeologicalsite']), ]), ), (30, SectionItem( diff --git a/archaeological_operations/urls.py b/archaeological_operations/urls.py index 8075296e8..fbca132d4 100644 --- a/archaeological_operations/urls.py +++ b/archaeological_operations/urls.py @@ -163,6 +163,11 @@ urlpatterns = [ check_rights(['view_archaeologicalsite', 'view_own_archaeologicalsite'])( views.site_search_wizard), name='site_search'), + url(r'site_creation/(?P<step>.+)?$', + check_rights(['add_archaeologicalsite', + 'add_own_archaeologicalsite'])( + views.site_creation_wizard), + name='site_creation'), url(r'autocomplete-patriarche/$', views.autocomplete_patriarche, name='autocomplete-patriarche'), diff --git a/archaeological_operations/views.py b/archaeological_operations/views.py index 8ca97826e..76f712613 100644 --- a/archaeological_operations/views.py +++ b/archaeological_operations/views.py @@ -42,7 +42,8 @@ from archaeological_operations.forms import ArchaeologicalSiteForm, \ SourceOperationFormSelection, OperationSourceForm, \ AdministrativeActOpeFormSelection, AdministrativeActOpeForm, \ AdministrativeActOpeModifForm, FinalAdministrativeActDeleteForm, \ - AdministrativeActRegisterFormSelection, DocumentGenerationAdminActForm + AdministrativeActRegisterFormSelection, DocumentGenerationAdminActForm, \ + SiteForm from ishtar_common.views import get_item, show_item, revert_item, new_item @@ -52,7 +53,7 @@ from archaeological_operations.wizards import has_associated_file, \ OperationClosingWizard, OperationDeletionWizard, SiteSearch, \ OperationSourceWizard, OperationSourceDeletionWizard, \ OperationAdministrativeActWizard, OperationEditAdministrativeActWizard, \ - AdministrativeActDeletionWizard + AdministrativeActDeletionWizard, SiteWizard def autocomplete_patriarche(request): @@ -333,6 +334,7 @@ operation_deletion_wizard = OperationDeletionWizard.as_view( def site_extra_context(request, item): return {'SITE_LABEL': IshtarSiteProfile.get_default_site_label()} + get_site = get_item(models.ArchaeologicalSite, 'get_site', 'site') show_site = show_item( models.ArchaeologicalSite, 'site', @@ -344,6 +346,18 @@ site_search_wizard = SiteSearch.as_view( label=_(u"{} search"), url_name='site_search',) + +site_creation_steps = [ + ('general-site_creation', SiteForm), + ('final-site_creation', FinalForm) +] + +site_creation_wizard = SiteWizard.as_view( + site_creation_steps, + label=_(u"New {}"), + url_name='site_creation', +) + # operation sources operation_source_search_wizard = SearchWizard.as_view([ diff --git a/archaeological_operations/wizards.py b/archaeological_operations/wizards.py index 01c9cbc2e..9f8ca3f6a 100644 --- a/archaeological_operations/wizards.py +++ b/archaeological_operations/wizards.py @@ -448,13 +448,21 @@ class OperationEditAdministrativeActWizard(OperationAdministrativeActWizard): return self.get_current_object().operation -class SiteSearch(SearchWizard): +class SiteLabel(object): def get_label(self): return unicode(_(u"Search {}")).format( get_current_profile().get_site_label() ) +class SiteSearch(SiteLabel, SearchWizard): + pass + + +class SiteWizard(SiteLabel, Wizard): + model = models.ArchaeologicalSite + + class AdministrativeActDeletionWizard(ClosingWizard): wizard_templates = { 'final-operation_administrativeactop_deletion': diff --git a/ishtar_common/forms.py b/ishtar_common/forms.py index 13e8457f6..eb548f70c 100644 --- a/ishtar_common/forms.py +++ b/ishtar_common/forms.py @@ -263,78 +263,7 @@ class IshtarForm(forms.Form): widget.options['todayHighlight'] = 'true' -class FieldType(object): - def __init__(self, key, model, is_multiple=False, extra_args=None): - self.key = key - self.model = model - self.is_multiple = is_multiple - self.extra_args = extra_args - - def get_choices(self, initial=None): - args = { - 'empty_first': not self.is_multiple, - 'initial': initial - } - if self.extra_args: - args.update(self.extra_args) - return self.model.get_types(**args) - - def get_help(self): - args = {} - if self.extra_args: - args.update(self.extra_args) - return self.model.get_help(**args) - - -class ManageOldType(IshtarForm): - TYPES = [] # FieldType list - - def __init__(self, *args, **kwargs): - """ - init_data is used to manage deactivated items in list when editing - old data - """ - prefix = kwargs.get('prefix') or '' - self.init_data = {} - if 'data' in kwargs and kwargs['data']: - for k in kwargs['data']: - if prefix not in k: - continue - new_k = k[len(prefix) + 1:] - if hasattr(kwargs['data'], 'getlist'): - items = kwargs['data'].getlist(k) - else: - items = [kwargs['data'][k]] - for val in items: - if not val: - continue - if new_k not in self.init_data: - self.init_data[new_k] = [] - self.init_data[new_k].append(val) - if 'initial' in kwargs and kwargs['initial']: - for k in kwargs['initial']: - if k not in self.init_data or not self.init_data[k]: - if hasattr(kwargs['initial'], 'getlist'): - items = kwargs['initial'].getlist(k) - else: - items = [kwargs['initial'][k]] - for val in items: - if not val: - continue - if k not in self.init_data: - self.init_data[k] = [] - self.init_data[k].append(val) - self.init_data = MultiValueDict(self.init_data) - super(ManageOldType, self).__init__(*args, **kwargs) - for field in self.TYPES: - if field.key not in self.fields: - continue - self.fields[field.key].choices = field.get_choices( - initial=self.init_data.get(field.key)) - self.fields[field.key].help_text = field.get_help() - - -class TableSelect(ManageOldType): +class TableSelect(IshtarForm): def __init__(self, *args, **kwargs): super(TableSelect, self).__init__(*args, **kwargs) # no field is required for search @@ -432,6 +361,77 @@ def get_data_from_formset(data): return values +class FieldType(object): + def __init__(self, key, model, is_multiple=False, extra_args=None): + self.key = key + self.model = model + self.is_multiple = is_multiple + self.extra_args = extra_args + + def get_choices(self, initial=None): + args = { + 'empty_first': not self.is_multiple, + 'initial': initial + } + if self.extra_args: + args.update(self.extra_args) + return self.model.get_types(**args) + + def get_help(self): + args = {} + if self.extra_args: + args.update(self.extra_args) + return self.model.get_help(**args) + + +class ManageOldType(IshtarForm): + TYPES = [] # FieldType list + + def __init__(self, *args, **kwargs): + """ + init_data is used to manage deactivated items in list when editing + old data + """ + prefix = kwargs.get('prefix') or '' + self.init_data = {} + if 'data' in kwargs and kwargs['data']: + for k in kwargs['data']: + if prefix not in k: + continue + new_k = k[len(prefix) + 1:] + if hasattr(kwargs['data'], 'getlist'): + items = kwargs['data'].getlist(k) + else: + items = [kwargs['data'][k]] + for val in items: + if not val: + continue + if new_k not in self.init_data: + self.init_data[new_k] = [] + self.init_data[new_k].append(val) + if 'initial' in kwargs and kwargs['initial']: + for k in kwargs['initial']: + if k not in self.init_data or not self.init_data[k]: + if hasattr(kwargs['initial'], 'getlist'): + items = kwargs['initial'].getlist(k) + else: + items = [kwargs['initial'][k]] + for val in items: + if not val: + continue + if k not in self.init_data: + self.init_data[k] = [] + self.init_data[k].append(val) + self.init_data = MultiValueDict(self.init_data) + super(ManageOldType, self).__init__(*args, **kwargs) + for field in self.TYPES: + if field.key not in self.fields: + continue + self.fields[field.key].choices = field.get_choices( + initial=self.init_data.get(field.key)) + self.fields[field.key].help_text = field.get_help() + + class DocumentGenerationForm(forms.Form): """ Form to generate document by choosing the template |