diff options
| -rw-r--r-- | archaeological_context_records/forms.py | 6 | ||||
| -rw-r--r-- | archaeological_context_records/views.py | 6 | ||||
| -rw-r--r-- | archaeological_files/forms.py | 6 | ||||
| -rw-r--r-- | archaeological_finds/forms.py | 14 | ||||
| -rw-r--r-- | archaeological_finds/forms_treatments.py | 16 | ||||
| -rw-r--r-- | archaeological_finds/views.py | 4 | ||||
| -rw-r--r-- | archaeological_operations/forms.py | 11 | ||||
| -rw-r--r-- | ishtar_common/admin.py | 30 | ||||
| -rw-r--r-- | ishtar_common/forms_common.py | 1 | ||||
| -rw-r--r-- | ishtar_common/models.py | 45 | 
10 files changed, 109 insertions, 30 deletions
diff --git a/archaeological_context_records/forms.py b/archaeological_context_records/forms.py index fc865ba25..59700bf15 100644 --- a/archaeological_context_records/forms.py +++ b/archaeological_context_records/forms.py @@ -40,7 +40,7 @@ from ishtar_common.forms import FinalForm, FormSet, \      reverse_lazy, get_form_selection, TableSelect, ManageOldType, CustomForm, \      FieldType  from ishtar_common.forms_common import get_town_field, SourceSelect, \ -    BaseImageForm, BaseImageFormset +    BaseImageForm, BaseImageFormset, SourceForm  from archaeological_operations.forms import OperationSelect, ParcelField,\      RecordRelationsForm as OpeRecordRelationsForm, RecordRelationsFormSetBase @@ -409,3 +409,7 @@ RecordSourceFormSelection = get_form_selection(      models.ContextRecordSource, RecordSourceSelect, 'get-contextrecordsource',      _(u"You should select a document."),      get_full_url='get-contextrecordsource-full') + + +class ContextRecordSourceForm(SourceForm): +    form_slug = "contextrecordsource-general" diff --git a/archaeological_context_records/views.py b/archaeological_context_records/views.py index d8c19a287..f1c3913c7 100644 --- a/archaeological_context_records/views.py +++ b/archaeological_context_records/views.py @@ -26,7 +26,7 @@ from django.shortcuts import redirect  from django.views.generic import RedirectView  from django.utils.translation import ugettext_lazy as _ -from ishtar_common.forms_common import AuthorFormset, SourceForm +from ishtar_common.forms_common import AuthorFormset  from ishtar_common.views import get_item, show_item, revert_item, \      IshtarMixin, LoginRequiredMixin, display_item  from archaeological_operations.views import site_extra_context @@ -168,7 +168,7 @@ record_source_search_wizard = SearchWizard.as_view([  record_source_creation_wizard = RecordSourceWizard.as_view([      ('selec-record_source_creation', SourceRecordFormSelection), -    ('source-record_source_creation', SourceForm), +    ('source-record_source_creation', ContextRecordSourceForm),      ('authors-record_source_creation', AuthorFormset),      ('final-record_source_creation', FinalForm)],      label=_(u"Context record: new source"), @@ -176,7 +176,7 @@ record_source_creation_wizard = RecordSourceWizard.as_view([  record_source_modification_wizard = RecordSourceWizard.as_view([      ('selec-record_source_modification', RecordSourceFormSelection), -    ('source-record_source_modification', SourceForm), +    ('source-record_source_modification', ContextRecordSourceForm),      ('authors-record_source_modification', AuthorFormset),      ('final-record_source_modification', FinalForm)],      label=_(u"Context record: source modification"), diff --git a/archaeological_files/forms.py b/archaeological_files/forms.py index 5583e7277..96f12b9f5 100644 --- a/archaeological_files/forms.py +++ b/archaeological_files/forms.py @@ -39,7 +39,7 @@ import models  from ishtar_common.forms import FinalForm, get_now, reverse_lazy, TableSelect, \      ManageOldType, CustomForm, FieldType, IshtarForm  from ishtar_common.forms_common import get_town_field -from archaeological_operations.forms import AdministrativeActOpeForm, \ +from archaeological_operations.forms import AdministrativeActForm, \      AdministrativeActOpeFormSelection, \      ParcelField, SLICING, AdministrativeActModifForm, ParcelForm, ParcelFormSet  from ishtar_common import widgets @@ -282,7 +282,7 @@ ParcelFormset = formset_factory(ParcelForm, can_delete=True,                                  formset=ParcelFormSet)  ParcelFormset.form_label = _(u"Parcels")  ParcelFormset.form_admin_name = _("Archaeological file - 020 - Parcel") -ParcelFormset.form_slug = "source-general" +ParcelFormset.form_slug = "file-020-parcels"  class FileFormPreventive(ManageOldType, forms.Form): @@ -549,7 +549,7 @@ class AdministrativeActFileModifyFormSelection(          validators=[valid_id(AdministrativeAct)]) -class AdministrativeActFileForm(AdministrativeActOpeForm): +class AdministrativeActFileForm(AdministrativeActForm):      form_admin_name = _(u"Archaeological file - Administrative act - General")      form_slug = "file-adminact-general"      act_type = forms.ChoiceField(label=_(u"Act type"), choices=[]) diff --git a/archaeological_finds/forms.py b/archaeological_finds/forms.py index 44d883b0f..8cb2fd0aa 100644 --- a/archaeological_finds/forms.py +++ b/archaeological_finds/forms.py @@ -43,7 +43,7 @@ from ishtar_common.forms import FormSet, FloatField, \      ManageOldType, FieldType, IshtarForm, FormHeader  from ishtar_common.forms_common import get_town_field, \ -    SourceSelect, CustomForm, BaseImageForm, BaseImageFormset +    SourceSelect, CustomForm, BaseImageForm, BaseImageFormset, SourceForm  from ishtar_common.utils import convert_coordinates_to_point  from ishtar_common import widgets  from bootstrap_datepicker.widgets import DatePicker @@ -63,7 +63,8 @@ from archaeological_finds.forms_treatments import TreatmentSelect, \      AdministrativeActTreatmentFileModifForm, SourceTreatmentFormSelection, \      SourceTreatmentFileFormSelection, TreatmentSourceFormSelection, \      TreatmentFileSourceFormSelection, DashboardForm as DashboardTreatmentForm, \ -    DashboardTreatmentFileForm, TreatmentImagesFormset +    DashboardTreatmentFileForm, TreatmentImagesFormset, \ +    TreatmentFileSourceForm, TreatmentSourceForm  __all__ = [      'TreatmentSelect', 'TreatmentFormSelection', 'BaseTreatmentForm', @@ -78,7 +79,8 @@ __all__ = [      'AdministrativeActTreatmentFileModifForm', 'SourceTreatmentFormSelection',      'SourceTreatmentFileFormSelection', 'TreatmentSourceFormSelection',      'TreatmentFileSourceFormSelection', 'DashboardTreatmentForm', -    'DashboardTreatmentFileForm', +    'DashboardTreatmentFileForm', 'TreatmentSourceForm', +    'TreatmentFileSourceForm',      'RecordFormSelection', 'FindForm', 'DateForm', 'DatingFormSet',      'PreservationForm', 'ImagesFormset',      'FindSelect', 'FindFormSelection', 'FindFormSelectionWarehouseModule', @@ -89,7 +91,7 @@ __all__ = [      'FindDeletionForm', 'UpstreamFindFormSelection', 'SourceFindFormSelection',      'FindSourceSelect', 'FindSourceFormSelection', 'NewFindBasketForm',      'SelectFindBasketForm', 'DeleteFindBasketForm', 'FindBasketAddItemForm', -    'TreatmentImagesFormset' +    'TreatmentImagesFormset', 'FindSourceForm'  ]  logger = logging.getLogger(__name__) @@ -864,3 +866,7 @@ class FindBasketAddItemForm(forms.Form):              raise PermissionDenied          basket.items.add(item)          return basket + + +class FindSourceForm(SourceForm): +    form_slug = "findsource-general" diff --git a/archaeological_finds/forms_treatments.py b/archaeological_finds/forms_treatments.py index b5daf146f..a61e56f5e 100644 --- a/archaeological_finds/forms_treatments.py +++ b/archaeological_finds/forms_treatments.py @@ -32,13 +32,13 @@ from archaeological_operations.models import ActType, AdministrativeAct  from archaeological_warehouse.models import Warehouse, Container  import models -from archaeological_operations.forms import AdministrativeActOpeForm, \ +from archaeological_operations.forms import AdministrativeActForm, \      AdministrativeActOpeFormSelection, AdministrativeActModifForm  from ishtar_common.forms import reverse_lazy, TableSelect, FinalForm, \      ManageOldType, get_form_selection, CustomForm, FieldType, IshtarForm  from ishtar_common.forms_common import SourceSelect, BaseImageForm, \ -    BaseImageFormset +    BaseImageFormset, SourceForm  from ishtar_common import widgets  from bootstrap_datepicker.widgets import DatePicker @@ -386,7 +386,7 @@ class AdministrativeActTreatmentFormSelection(          validators=[valid_id(AdministrativeAct)]) -class AdministrativeActTreatmentForm(AdministrativeActOpeForm): +class AdministrativeActTreatmentForm(AdministrativeActForm):      form_admin_name = _(u"Treatment - Administrative act - General")      form_slug = "treatment-adminact-general"      act_type = forms.ChoiceField(label=_(u"Act type"), choices=[]) @@ -647,7 +647,7 @@ class AdministrativeActTreatmentFileFormSelection(          validators=[valid_id(AdministrativeAct)]) -class AdministrativeActTreatmentFileForm(AdministrativeActOpeForm): +class AdministrativeActTreatmentFileForm(AdministrativeActForm):      form_admin_name = _(u"Treatment request - Administrative act - General")      form_slug = "treatmentfile-adminact-general"      act_type = forms.ChoiceField(label=_(u"Act type"), choices=[]) @@ -700,6 +700,10 @@ TreatmentSourceFormSelection = get_form_selection(      _(u"You should select a document.")) +class TreatmentSourceForm(SourceForm): +    form_slug = "treatmentsource-general" + +  class TreatmentFileSourceSelect(SourceSelect):      treatment_file__name = forms.CharField(          label=_(u"Treatment request name"), max_length=200) @@ -724,3 +728,7 @@ TreatmentFileSourceFormSelection = get_form_selection(      'TreatmentFileSourceFormSelection', _(u"Documentation search"), 'pk',      models.TreatmentFileSource, TreatmentFileSourceSelect,      'get-treatmentfilesource', _(u"You should select a document.")) + + +class TreatmentFileSourceForm(SourceForm): +    form_slug = "treatmentfilesource-general" diff --git a/archaeological_finds/views.py b/archaeological_finds/views.py index 99b2968f3..04264080e 100644 --- a/archaeological_finds/views.py +++ b/archaeological_finds/views.py @@ -222,7 +222,7 @@ find_source_search_wizard = SearchWizard.as_view([  find_source_creation_wizard = FindSourceWizard.as_view([      ('selec-find_source_creation', SourceFindFormSelection), -    ('source-find_source_creation', SourceForm), +    ('source-find_source_creation', FindSourceForm),      ('authors-find_source_creation', AuthorFormset),      ('final-find_source_creation', FinalForm)],      label=_(u"Find: new source"), @@ -230,7 +230,7 @@ find_source_creation_wizard = FindSourceWizard.as_view([  find_source_modification_wizard = FindSourceWizard.as_view([      ('selec-find_source_modification', FindSourceFormSelection), -    ('source-find_source_modification', SourceForm), +    ('source-find_source_modification', FindSourceForm),      ('authors-find_source_modification', AuthorFormset),      ('final-find_source_modification', FinalForm)],      label=_(u"Find: source modification"), diff --git a/archaeological_operations/forms.py b/archaeological_operations/forms.py index ea0db0908..6aa1da77b 100644 --- a/archaeological_operations/forms.py +++ b/archaeological_operations/forms.py @@ -1385,6 +1385,7 @@ class SiteUnderwaterForm(ManageOldType):  class OperationSourceForm(SourceForm): +    form_slug = "operationsource-general"      pk = forms.IntegerField(required=False, widget=forms.HiddenInput)      index = forms.IntegerField(label=_(u"Index"))      hidden_operation_id = forms.IntegerField(label="", @@ -1536,11 +1537,8 @@ class AdministrativeActOpeFormSelection(IshtarForm):          return cleaned_data -class AdministrativeActOpeForm(CustomForm, ManageOldType): +class AdministrativeActForm(CustomForm, ManageOldType):      form_label = _("General") -    form_admin_name = _(u"Operation - Administrative act - General") -    form_slug = "operation-adminact-general" -      associated_models = {'act_type': models.ActType, }      #                     'signatory':Person}      act_type = forms.ChoiceField(label=_("Act type"), choices=[]) @@ -1562,6 +1560,11 @@ class AdministrativeActOpeForm(CustomForm, ManageOldType):      ] +class AdministrativeActOpeForm(AdministrativeActForm): +    form_admin_name = _(u"Operation - Administrative act - General") +    form_slug = "operation-adminact-general" + +  class AdministrativeActModifForm(object):      def __init__(self, *args, **kwargs):          super(AdministrativeActModifForm, self).__init__(*args, **kwargs) diff --git a/ishtar_common/admin.py b/ishtar_common/admin.py index 1edbd0f68..48847b804 100644 --- a/ishtar_common/admin.py +++ b/ishtar_common/admin.py @@ -874,13 +874,41 @@ class ExcludeFieldInline(admin.TabularInline):      formset = ExcludeFieldFormset +class JsonFieldFormset(BaseInlineFormSet): +    def get_form_kwargs(self, index): +        kwargs = super(JsonFieldFormset, self).get_form_kwargs(index) +        if not self.instance or not self.instance.pk: +            return kwargs +        kwargs['choices'] = [('', '--')] + \ +            self.instance.get_available_json_fields() +        return kwargs + + +class JsonFieldForm(forms.ModelForm): +    class Meta: +        model = models.CustomFormJsonField +        exclude = [] + +    def __init__(self, *args, **kwargs): +        choices = kwargs.pop('choices') +        super(JsonFieldForm, self).__init__(*args, **kwargs) +        self.fields['json_field'].choices = choices + + +class JsonFieldInline(admin.TabularInline): +    model = models.CustomFormJsonField +    extra = 2 +    form = JsonFieldForm +    formset = JsonFieldFormset + +  class CustomFormAdmin(admin.ModelAdmin):      list_display = ['name', 'form', 'available', 'enabled', 'apply_to_all',                      'users_lbl', 'user_types_lbl']      fields = ('name', 'form', 'available', 'enabled', 'apply_to_all', 'users',                'user_types')      form = CustomFormForm -    inlines = [ExcludeFieldInline] +    inlines = [ExcludeFieldInline, JsonFieldInline]      def get_inline_instances(self, request, obj=None):          # no inline on creation diff --git a/ishtar_common/forms_common.py b/ishtar_common/forms_common.py index 23b29aef4..5b4566a31 100644 --- a/ishtar_common/forms_common.py +++ b/ishtar_common/forms_common.py @@ -994,7 +994,6 @@ def get_image_help():  class SourceForm(CustomForm, ManageOldType):      form_label = _(u"Documentation informations")      form_admin_name = _("Source - General") -    form_slug = "source-general"      file_upload = True      associated_models = {'source_type': models.SourceType} diff --git a/ishtar_common/models.py b/ishtar_common/models.py index 0900b2d9a..bb285883f 100644 --- a/ishtar_common/models.py +++ b/ishtar_common/models.py @@ -1817,19 +1817,25 @@ class CustomForm(models.Model):      @classmethod      def register(cls): -        if hasattr(cls, '_register'): -            return cls._register +        if hasattr(cls, '_register') and hasattr(cls, '_register_fields'): +            return cls._register, cls._register_fields          cache_key, value = get_cache(cls.__class__, ['dct-forms'],                                       app_label='ishtar_common') -        if value: +        cache_key_fields, value_fields = get_cache( +            cls.__class__, ['dct-fields'], app_label='ishtar_common') +        if value and value_fields:              cls._register = value -            return cls._register -        cls._register = {} +            cls._register_fields = value_fields +            return cls._register, cls._register_fields +        cls._register, cls._register_fields = {}, {}          # ideally should be improved but only used in admin          from ishtar_common.admin import ISHTAR_FORMS          from ishtar_common.forms import CustomForm as CustomFormForm          for app_form in ISHTAR_FORMS: +            app_name = app_form.__package__ +            if app_name == "archaeological_files_pdl": +                app_name = "archaeological_files"              for form in dir(app_form):                  if 'Form' not in form:                      # not very clean... but do not treat inappropriate items @@ -1839,15 +1845,40 @@ class CustomForm(models.Model):                          or not issubclass(form, CustomFormForm) \                          or not getattr(form, 'form_slug', None):                      continue +                model_name = form.form_slug.split('-')[0].replace('_', '') +                if app_name not in cls._register_fields: +                    cls._register_fields[app_name] = [] +                if model_name not in cls._register_fields[app_name]: +                    cls._register_fields[app_name].append(model_name)                  cls._register[form.form_slug] = form -        return cls._register +        return cls._register, cls._register_fields      def get_form_class(self): -        register = self.register() +        register, register_fields = self.register()          if self.form not in self._register:              return          return register[self.form] +    def get_available_json_fields(self): +        register, register_fields = self.register() +        if self.form not in self._register: +            return [] +        current_form = register[self.form] +        app_name = current_form.__module__.split('.')[0] +        if app_name == "archaeological_files_pdl": +            app_name = "archaeological_files" +        if app_name not in register_fields: +            return [] +        res = [] +        for model_name in register_fields[app_name]: +            ct = ContentType.objects.get(app_label=app_name, model=model_name) +            for json_field in JsonDataField.objects.filter( +                    content_type=ct).all(): +                res.append((json_field.pk, u"{} ({})".format( +                    json_field.name, +                    dict(JSON_VALUE_TYPES)[json_field.value_type]))) +        return res +  class ExcludedField(models.Model):      custom_form = models.ForeignKey(CustomForm, related_name='excluded_fields')  | 
