summaryrefslogtreecommitdiff
path: root/chimere/forms.py
diff options
context:
space:
mode:
Diffstat (limited to 'chimere/forms.py')
-rw-r--r--chimere/forms.py189
1 files changed, 154 insertions, 35 deletions
diff --git a/chimere/forms.py b/chimere/forms.py
index b62859c..8b86df1 100644
--- a/chimere/forms.py
+++ b/chimere/forms.py
@@ -38,7 +38,7 @@ if hasattr(settings, 'CHIMERE_SEARCH_ENGINE') and \
from chimere.models import Marker, Route, PropertyModel, Area,\
News, Category, RouteFile, MultimediaFile, MultimediaType, \
PictureFile, Importer, PropertyModelChoice, Page, IMPORTER_CHOICES, \
- get_areas_for_user, SubCategoryUserLimit
+ get_areas_for_user, SubCategoryUserLimit, Polygon
from chimere.widgets import AreaField, PointField, TextareaWidget, \
FullTextareaWidget, DatePickerWidget, ButtonSelectWidget, NominatimWidget,\
TextareaAdminWidget, ImportFiltrWidget, ImporterChoicesWidget, RE_XAPI
@@ -203,7 +203,7 @@ class ImporterAdminForm(forms.ModelForm):
model = Importer
widgets = {
'source': forms.TextInput(attrs={'size': 80}),
- 'filtr': forms.TextInput(attrs={'size': 80}),
+ 'filtr': forms.Textarea(attrs={'size': 80}),
}
def clean(self):
@@ -256,20 +256,69 @@ class CategoryAdminForm(forms.ModelForm):
model = Category
+def get_properties(queryset):
+ # As we have dynamic fields, it's cleaner to make the class dynamic too
+ fields = {}
+ for prop in queryset:
+ key = "property_%d_%d" % (prop.order, prop.id)
+ if prop.type == 'C':
+ choices = PropertyModelChoice.objects.filter(propertymodel=prop,
+ available=True
+ ).order_by('value')
+ fields[key] = forms.ChoiceField(
+ label=prop.name, choices=[('', '--')] +
+ [(choice.pk, unicode(choice)) for choice in choices],
+ required=False)
+ elif prop.type == 'A':
+ widget = PropertyModel.TYPE_WIDGET[prop.type]
+ widget = widget(slug=prop.slug)
+ fields[key] = forms.CharField(label=prop.name, widget=widget,
+ required=False)
+ else:
+ widget = PropertyModel.TYPE_WIDGET[prop.type]
+ fields[key] = forms.CharField(
+ label=prop.name, widget=widget,
+ required=False)
+ return fields
+
+
class MarkerAdminFormBase(forms.ModelForm):
"""
Main form for marker
"""
+ is_admin = True
+ name = forms.CharField(_(u"Name"), required=True)
description = forms.CharField(widget=TextareaAdminWidget, required=False)
+ _PROPERTY_FILTERS = {}
class Meta:
model = Marker
+ @classmethod
+ def _set_cls_fields(cls):
+ fields = get_properties(
+ PropertyModel.objects.filter(**cls._PROPERTY_FILTERS).all())
+ for key in fields:
+ print(key)
+ setattr(cls, key, fields[key])
+
+ def _set_fields(self):
+ fields = get_properties(
+ PropertyModel.objects.filter(**self._PROPERTY_FILTERS).all())
+ for key in fields:
+ self.fields[key] = fields[key]
+
def __init__(self, *args, **keys):
"""
Custom initialization method in order to manage properties
"""
- self.pms = [pm for pm in PropertyModel.objects.filter(available=True)]
+ area_name = None
+ if 'area_name' in keys:
+ area_name = keys.pop('area_name')
+ querys = PropertyModel.getAvailable(area_name=area_name)
+ self.pms = []
+ for query in querys:
+ self.pms += [pm for pm in query.all()]
if 'instance' in keys and keys['instance']:
instance = keys['instance']
property_dct = {}
@@ -284,13 +333,45 @@ class MarkerAdminFormBase(forms.ModelForm):
subcategories = keys.pop('subcategories') \
if 'subcategories' in keys else []
super(MarkerAdminFormBase, self).__init__(*args, **keys)
+ self._set_fields()
if settings.CHIMERE_DAYS_BEFORE_EVENT:
self.fields['start_date'].widget = DatePickerWidget()
self.fields['end_date'].widget = DatePickerWidget()
+ if self.is_admin:
+ return
if subcategories:
self.fields['categories'].choices = subcategories
- elif hasattr(self, 'categories_choices'):
- self.fields['categories'].choices = self.categories_choices
+ # auto select if there is only one category
+ choices = list(self.fields['categories'].choices)
+ self.fields['categories'].choices = choices
+ self.fields['categories'].label = ""
+ if (len(choices) == 1):
+ self.fields['categories'].widget = forms.MultipleHiddenInput()
+ choices = list(self.fields['categories'].choices)
+ if type(choices[0][1]) in (list, tuple):
+ # hierarchical choices
+ self.fields['categories'].label = u"{} / {}".format(
+ choices[0][0], choices[0][1][0][1])
+ self.fields['categories'].initial = \
+ [self.fields['categories'].choices[0][1][0][0]]
+ else:
+ self.fields['categories'].label = u"{}".format(
+ choices[0][1])
+ self.fields['categories'].initial = \
+ [self.fields['categories'].choices[0][0]]
+ if not settings.CHIMERE_SEARCH_ENGINE and 'keywords' in self.fields:
+ self.fields.pop('keywords')
+ if not settings.CHIMERE_DAYS_BEFORE_EVENT:
+ self.fields.pop('start_date')
+ self.fields.pop('end_date')
+ # not a clean way to filter properties...
+ # to do: change creation process
+ pms = [pm.getNamedId() for pm in self.pms]
+ for k in self.fields.keys():
+ if not k.startswith('property_') or \
+ k in pms:
+ continue
+ self.fields.pop(k)
def clean(self):
'''
@@ -341,46 +422,34 @@ class MarkerAdminFormBase(forms.ModelForm):
return new_marker
-def get_properties(queryset):
- # As we have dynamic fields, it's cleaner to make the class dynamic too
- fields = {}
- for prop in queryset:
- key = "property_%d_%d" % (prop.order, prop.id)
- if prop.type == 'C':
- choices = PropertyModelChoice.objects.filter(propertymodel=prop,
- available=True
- ).order_by('value')
- fields[key] = forms.ChoiceField(
- label=prop.name, choices=[('', '--')] +
- [(choice.pk, unicode(choice)) for choice in choices],
- required=False)
- else:
- fields[key] = forms.CharField(
- label=prop.name, widget=PropertyModel.TYPE_WIDGET[prop.type],
- required=False)
- return fields
+class MarkerAdminForm(MarkerAdminFormBase):
+ pass
+
-# in admin all fields are displayed
-MarkerAdminForm = type(
- "MarkerAdminForm", (MarkerAdminFormBase,),
- get_properties(PropertyModel.objects.all()))
-MarkerBaseForm = type(
- "MarkerBaseForm", (MarkerAdminFormBase,),
- get_properties(PropertyModel.objects.filter(available=True)))
+class MarkerBaseForm(MarkerAdminFormBase):
+ # in public form only visible fields are displayed
+ _PROPERTY_FILTERS = {'available': True}
+
+
+EXCLUDED_FIELDS = ['status']
+if not settings.CHIMERE_SEARCH_ENGINE:
+ EXCLUDED_FIELDS.append('keywords')
class MarkerForm(MarkerBaseForm):
"""
Form for the edit page
"""
+ is_admin = False
ref_pk = forms.IntegerField(label=u" ", widget=forms.HiddenInput(),
required=False)
description = forms.CharField(widget=TextareaWidget, required=False)
- keywords = forms.CharField(max_length=200, required=False)
+ keywords = forms.CharField(widget=TextareaWidget, max_length=200,
+ required=False)
class Meta:
model = Marker
- exclude = ('status',)
+ exclude = EXCLUDED_FIELDS
widgets = {
'description': TextareaWidget(),
}
@@ -390,6 +459,9 @@ class RouteAdminForm(forms.ModelForm):
"""
Main form for route
"""
+ is_admin = True
+ name = forms.CharField(_(u"Name"), required=True)
+
class Meta:
model = Route
@@ -397,6 +469,13 @@ class RouteAdminForm(forms.ModelForm):
"""
Custom initialization method in order to manage properties
"""
+ area_name = None
+ if 'area_name' in keys:
+ area_name = keys.pop('area_name')
+ querys = PropertyModel.getAvailable(area_name=area_name)
+ self.pms = []
+ for query in querys:
+ self.pms += [pm for pm in query.all()]
if 'instance' in keys and keys['instance']:
instance = keys['instance']
property_dct = {}
@@ -411,11 +490,24 @@ class RouteAdminForm(forms.ModelForm):
subcategories = keys.pop('subcategories') \
if 'subcategories' in keys else []
super(RouteAdminForm, self).__init__(*args, **keys)
+ if self.is_admin:
+ return
+ if not settings.CHIMERE_SEARCH_ENGINE and 'keywords' in self.fields:
+ self.fields.pop('keywords')
if settings.CHIMERE_DAYS_BEFORE_EVENT:
self.fields['start_date'].widget = DatePickerWidget()
self.fields['end_date'].widget = DatePickerWidget()
+ self.fields['categories'].choices = []
if subcategories:
self.fields['categories'].choices = subcategories
+ # not a clean way to filter properties...
+ # to do: change creation process
+ pms = [pm.getNamedId() for pm in self.pms]
+ for k in self.fields.keys():
+ if not k.startswith('property_') or \
+ k in pms:
+ continue
+ self.fields.pop(k)
def save(self, *args, **keys):
"""
@@ -432,15 +524,18 @@ class RouteForm(RouteAdminForm):
"""
Form for the edit page
"""
+ is_admin = False
description = forms.CharField(widget=TextareaWidget, required=False)
point = forms.CharField(label=" ", required=False,
widget=forms.HiddenInput)
associated_file_id = forms.CharField(
label=" ", required=False, widget=forms.HiddenInput)
+ keywords = forms.CharField(widget=TextareaWidget, max_length=200,
+ required=False)
class Meta:
model = Route
- exclude = ('status',)
+ exclude = EXCLUDED_FIELDS
def __init__(self, *args, **kwargs):
if kwargs.get('instance'):
@@ -493,6 +588,26 @@ class RouteForm(RouteAdminForm):
return new_route
+class PolygonAdminForm(MarkerAdminForm):
+ """
+ Main form for polygon
+ """
+ class Meta:
+ model = Polygon
+
+
+class PolygonForm(PolygonAdminForm):
+ """
+ Form for the edit page
+ """
+ is_admin = False
+ description = forms.CharField(widget=TextareaWidget, required=False)
+
+ class Meta:
+ model = Polygon
+ exclude = EXCLUDED_FIELDS
+
+
class BaseFileForm(forms.ModelForm):
id = forms.IntegerField(label=u"", widget=forms.HiddenInput(),
required=False)
@@ -502,8 +617,9 @@ class BaseFileForm(forms.ModelForm):
raise ImproperlyConfigured
super(BaseFileForm, self).__init__(*args, **kwargs)
self.fields.pop('marker')
+ self.fields.pop('polygon')
- def save(self, associated_marker):
+ def save(self, associated_item):
if not hasattr(self, 'cleaned_data') or not self.cleaned_data:
return
instance = None
@@ -519,7 +635,10 @@ class BaseFileForm(forms.ModelForm):
instance.delete()
return
self.cleaned_data.pop('DELETE')
- self.cleaned_data['marker'] = associated_marker
+ if type(associated_item) == Marker:
+ self.cleaned_data['marker'] = associated_item
+ if type(associated_item) == Polygon:
+ self.cleaned_data['polygon'] = associated_item
if instance:
for k in self.cleaned_data:
setattr(instance, k, self.cleaned_data[k])