diff options
Diffstat (limited to 'chimere/forms.py')
-rw-r--r-- | chimere/forms.py | 116 |
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]) |