diff options
Diffstat (limited to 'main')
| -rw-r--r-- | main/admin.py | 13 | ||||
| -rw-r--r-- | main/forms.py | 37 | ||||
| -rw-r--r-- | main/models.py | 20 | ||||
| -rw-r--r-- | main/widgets.py | 76 |
4 files changed, 141 insertions, 5 deletions
diff --git a/main/admin.py b/main/admin.py index 21ba3cb..dc5ff06 100644 --- a/main/admin.py +++ b/main/admin.py @@ -22,8 +22,8 @@ Settings for administration pages """ from chimere.main.models import Category, Icon, SubCategory, Marker, \ - PropertyModel, Property, News, Route -from chimere.main.forms import MarkerAdminForm, RouteAdminForm + PropertyModel, Property, News, Route, Area +from chimere.main.forms import MarkerAdminForm, RouteAdminForm, AreaAdminForm from django.contrib import admin class MarkerAdmin(admin.ModelAdmin): @@ -35,7 +35,6 @@ class MarkerAdmin(admin.ModelAdmin): list_filter = ('status', 'subcategory') form = MarkerAdminForm - class RouteAdmin(admin.ModelAdmin): """ Specialized the Route field. @@ -45,6 +44,13 @@ class RouteAdmin(admin.ModelAdmin): list_filter = ('status', 'subcategory') form = RouteAdminForm +class AreaAdmin(admin.ModelAdmin): + """ + Specialized the area field. + """ + form = AreaAdminForm + exclude = ['upper_left_corner', 'lower_right_corner'] + class SubCategoryAdmin(admin.ModelAdmin): """ Specialized the subcategory admin @@ -59,5 +65,6 @@ admin.site.register(Category) admin.site.register(SubCategory, SubCategoryAdmin) admin.site.register(Marker, MarkerAdmin) admin.site.register(Route, RouteAdmin) +admin.site.register(Area, AreaAdmin) admin.site.register(PropertyModel) admin.site.register(Property) diff --git a/main/forms.py b/main/forms.py index 2343869..6c03c7d 100644 --- a/main/forms.py +++ b/main/forms.py @@ -22,8 +22,10 @@ Forms """ from django import forms from django.contrib.gis.db import models +from django.utils.translation import ugettext as _ -from chimere.main.models import Marker, Route, PropertyModel, Property +from chimere.main.models import Marker, Route, PropertyModel, Property, Area +from chimere.main.widgets import AreaField, PointField class MarkerAdminForm(forms.ModelForm): """ @@ -160,3 +162,36 @@ class RouteForm(RouteAdminForm): 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 diff --git a/main/models.py b/main/models.py index ee44a84..a607084 100644 --- a/main/models.py +++ b/main/models.py @@ -24,7 +24,6 @@ from django.utils.translation import ugettext_lazy as _ from django.contrib.gis.db import models from django.contrib import admin -from django.db.models import Q from chimere import settings from chimere.main.widgets import PointField, RouteField @@ -241,6 +240,25 @@ class Route(models.Model): "color":"%(color)s"}}""" % {'id':self.id, 'name':self.name, 'color':color, 'geometry':self.route.geojson,} +class Area(models.Model): + """Rectangular area of the map + """ + name = models.CharField(_("Name"), max_length=150) + order = models.IntegerField(_("Order")) + available = models.BooleanField(_("Available")) + upper_left_corner = models.PointField(_("Upper left corner"), + default='POINT(0 0)') + lower_right_corner = models.PointField(_("Lower right corner"), + default='POINT(0 0)') + objects = models.GeoManager() + + def __unicode__(self): + return self.name + + class Meta: + ordering = ('order', 'name') + verbose_name = _("Area") + class PropertyModel(models.Model): '''Model for a property ''' diff --git a/main/widgets.py b/main/widgets.py index 21dd464..53f365a 100644 --- a/main/widgets.py +++ b/main/widgets.py @@ -112,6 +112,11 @@ class PointField(models.PointField): keys.update(defaults) return super(PointField, self).formfield(**keys) + def clean(self, value): + if len(value) != 2 and self.required: + raise ValidationError(_("Invalid point")) + return value + class RouteChooserWidget(forms.TextInput): """ Manage the edition of route on a map @@ -191,3 +196,74 @@ class RouteField(models.LineStringField): defaults = {'widget': RouteChooserWidget} keys.update(defaults) return super(RouteField, self).formfield(**keys) + +class AreaWidget(forms.TextInput): + """ + Manage the edition of an area on the map + """ + class Media: + css = { + "all": URL_OSM_CSS + ["%sforms.css" % settings.MEDIA_URL,] + } + js = URL_OSM_JS + ["%sedit_area.js" % settings.MEDIA_URL, + "%sbase.js" % settings.MEDIA_URL,] + + def render(self, name, value, attrs=None): + """ + Render a map + """ + upper_left_lat, upper_left_lon = 0, 0 + lower_right_lat, lower_right_lon = 0, 0 + if value: + if len(value) == 2: + upper_left = value[0] + lower_right = value[1] + if hasattr(upper_left, 'x') and hasattr(upper_left, 'y'): + upper_left_lon, upper_left_lat = upper_left.x, upper_left.y + if hasattr(lower_right, 'x') and hasattr(lower_right, 'y'): + lower_right_lon, lower_right_lat = lower_right.x, \ + lower_right.y + tpl = getMapJS() + tpl += u"""<div id='map_edit'></div> +<input type='hidden' name='upper_left_lat' id='upper_left_lat' value='%f'/> +<input type='hidden' name='upper_left_lon' id='upper_left_lon' value='%f'/> +<input type='hidden' name='lower_right_lat' id='lower_right_lat' value='%f'/> +<input type='hidden' name='lower_right_lon' id='lower_right_lon' value='%f'/> +""" % (upper_left_lat, upper_left_lon, lower_right_lat, lower_right_lon) + tpl += """<script type='text/javascript'><!-- +init();""" + if value: + tpl += """var extent = new OpenLayers.Bounds(%f, %f, %f, %f); +map.zoomToExtent(extent, true);""" % (upper_left_lat, upper_left_lon, lower_right_lat, + lower_right_lon) + tpl += """// --></script> +<hr class='spacer'/> +""" + return mark_safe(tpl) + + def value_from_datadict(self, data, files, name): + """ + Return the appropriate values + """ + values = [] + for keys in (('upper_left_lat', 'upper_left_lon',), + ('lower_right_lat', 'lower_right_lon')): + value = [] + for key in keys: + val = data.get(key, None) + if not val: + return [] + value.append(val) + values.append(value) + return values + +class AreaField(forms.MultiValueField): + ''' + Set the widget for the form field + ''' + widget = AreaWidget + + def compress(self, data_list): + if not data_list: + return None + return data_list
\ No newline at end of file |
