summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorÉtienne Loks <etienne.loks@iggdrasil.net>2018-05-23 12:58:38 +0200
committerÉtienne Loks <etienne.loks@iggdrasil.net>2018-06-12 08:49:06 +0200
commit88c9aeaeafd9bc77decbf0982be0fd9d20fd3993 (patch)
tree1e9650dcdfb9359e6c1a70031f7705d18700374d
parentb40361b7c1b8e98690b1f4cf6b5154f8b22395ff (diff)
downloadIshtar-88c9aeaeafd9bc77decbf0982be0fd9d20fd3993.tar.bz2
Ishtar-88c9aeaeafd9bc77decbf0982be0fd9d20fd3993.zip
Wizards - JSON fields: inlines for custom form in admin pages (refs #4089)
-rw-r--r--archaeological_context_records/forms.py6
-rw-r--r--archaeological_context_records/views.py6
-rw-r--r--archaeological_files/forms.py6
-rw-r--r--archaeological_finds/forms.py14
-rw-r--r--archaeological_finds/forms_treatments.py16
-rw-r--r--archaeological_finds/views.py4
-rw-r--r--archaeological_operations/forms.py11
-rw-r--r--ishtar_common/admin.py30
-rw-r--r--ishtar_common/forms_common.py1
-rw-r--r--ishtar_common/models.py45
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')