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 | 
