summaryrefslogtreecommitdiff
path: root/chimere/forms.py
diff options
context:
space:
mode:
Diffstat (limited to 'chimere/forms.py')
-rw-r--r--chimere/forms.py116
1 files changed, 106 insertions, 10 deletions
diff --git a/chimere/forms.py b/chimere/forms.py
index b62859c..599f88a 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):
@@ -260,6 +260,8 @@ 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)
class Meta:
@@ -269,7 +271,13 @@ class MarkerAdminFormBase(forms.ModelForm):
"""
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 = {}
@@ -287,10 +295,41 @@ class MarkerAdminFormBase(forms.ModelForm):
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):
'''
@@ -369,18 +408,25 @@ MarkerBaseForm = type(
get_properties(PropertyModel.objects.filter(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 +436,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 +446,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 +467,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 +501,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 +565,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 +594,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 +612,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])