#!/usr/bin/env python # -*- coding: utf-8 -*- # Copyright (C) 2008 Étienne Loks # This program is free software: you can redistribute it and/or modify # it under the terms of the GNU General Public License as # published by the Free Software Foundation, either version 3 of the # License, or (at your option) any later version. # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # You should have received a copy of the GNU General Public License # along with this program. If not, see . # See the file COPYING for details. """ Forms """ from django import forms from django.contrib.gis.db import models from django.utils.translation import ugettext as _ from django.contrib.auth.models import User from django.core.mail import send_mail from chimere import settings from chimere.main.models import Marker, Route, PropertyModel, Property, Area,\ News from chimere.main.widgets import AreaField, PointField, TextareaWidget def notifyStaff(geo_object): category = unicode(geo_object.subcategory) subject = u'[Chimère] %s %s' % (_(u"New submission for"), category) user_list = [u.email for u in User.objects.filter(is_staff=True).exclude(email="").order_by('id')] message = _(u'The new item "%s" has been submited in the category: ') % \ geo_object.name + category message += "\n\n" + _(u"To valid, precise or unvalid this item: ") message += settings.BASE_URL + 'admin' message += u"\n\n--\nChimère" send_mail(subject, message, user_list[0], user_list) class NewsAdminForm(forms.ModelForm): """ Main form for news """ content = forms.CharField(widget=TextareaWidget) class Meta: model = News class MarkerAdminForm(forms.ModelForm): """ Main form for marker """ # declare properties for property in PropertyModel.objects.filter(available=True): exec('property_%d_%d = forms.CharField(label="%s", widget=%s, \ required=False)' % (property.order, property.id, property.name, PropertyModel.TYPE_WIDGET[property.type])) class Meta: model = Marker def __init__(self, *args, **keys): """ Custom initialization method in order to manage properties """ if 'instance' in keys and keys['instance']: instance = keys['instance'] property_dct = {} for pm in PropertyModel.objects.filter(available=True): property = instance.getProperty(pm) if property: property_dct[pm.getNamedId()] = property.value if 'initial' in keys: keys['initial'].update(property_dct) else: keys['initial'] = property_dct super(MarkerAdminForm, self).__init__(*args, **keys) def save(self, *args, **keys): """ Custom save method in order to manage associeted properties """ new_marker = super(MarkerAdminForm, self).save(*args, **keys) if 'status' not in self.cleaned_data: new_marker.status = 'S' new_marker.save() # save each property for propertymodel in PropertyModel.objects.filter(available=True): properties = Property.objects.filter(marker=new_marker, propertymodel=propertymodel) # new property if not properties: new_property = Property.objects.create(marker=new_marker, propertymodel=propertymodel, value=self.cleaned_data['property_%d_%d' % ( propertymodel.order, propertymodel.id)]) new_property.save() else: # in case of multiple edition as the same time delete arbitrary # the others if len(properties) > 1: for property in properties[1:]: property.delete() property = properties[0] property.value = self.cleaned_data['property_%d_%d' % ( propertymodel.order, propertymodel.id)] property.save() return new_marker class MarkerForm(MarkerAdminForm): """ Form for the edit page """ class Meta: model = Marker exclude = ('status',) class RouteAdminForm(forms.ModelForm): """ Main form for route """ """ # declare properties for property in PropertyModel.objects.filter(available=True): exec('property_%d_%d = forms.CharField(label="%s", widget=%s, \ required=False)' % (property.order, property.id, property.name, PropertyModel.TYPE_WIDGET[property.type]))""" class Meta: model = Route def __init__(self, *args, **keys): """ Custom initialization method in order to manage properties """ if 'instance' in keys and keys['instance']: instance = keys['instance'] property_dct = {} for pm in PropertyModel.objects.filter(available=True): property = instance.getProperty(pm) if property: property_dct[pm.getNamedId()] = property.value if 'initial' in keys: keys['initial'].update(property_dct) else: keys['initial'] = property_dct super(RouteAdminForm, self).__init__(*args, **keys) def save(self, *args, **keys): """ Custom save method in order to manage associeted properties """ new_marker = super(RouteAdminForm, self).save(*args, **keys) if 'status' not in self.cleaned_data: new_marker.status = 'S' new_marker.save() """ # save each property for propertymodel in PropertyModel.objects.filter(available=True): properties = Property.objects.filter(marker=new_marker, propertymodel=propertymodel) # new property if not properties: new_property = Property.objects.create(marker=new_marker, propertymodel=propertymodel, value=self.cleaned_data['property_%d_%d' % ( propertymodel.order, propertymodel.id)]) new_property.save() else: # in case of multiple edition as the same time delete arbitrary # the others if len(properties) > 1: for property in properties[1:]: property.delete() property = properties[0] property.value = self.cleaned_data['property_%d_%d' % ( propertymodel.order, propertymodel.id)] property.save()""" return new_marker class RouteForm(RouteAdminForm): """ Form for the edit page """ class Meta: model = Route exclude = ('status',) class AreaAdminForm(forms.ModelForm): """ Admin page to create an area """ area = AreaField(label=_("Area"), fields=(PointField(), PointField())) class Meta: model = Area def __init__(self, *args, **keys): """ Custom initialization method in order to manage area """ if 'instance' in keys and keys['instance']: instance = keys['instance'] dct = {'area':(instance.upper_left_corner, instance.lower_right_corner)} if 'initial' in keys: keys['initial'].update(dct) else: keys['initial'] = dct super(AreaAdminForm, self).__init__(*args, **keys) def save(self, *args, **keys): """ Custom save method in order to manage area """ new_area = super(AreaAdminForm, self).save(*args, **keys) area = self.cleaned_data['area'] new_area.upper_left_corner = 'POINT(%s %s)' % (area[0][0], area[0][1]) new_area.lower_right_corner = 'POINT(%s %s)' % (area[1][0], area[1][1]) return new_area