summaryrefslogtreecommitdiff
path: root/main
diff options
context:
space:
mode:
Diffstat (limited to 'main')
-rw-r--r--main/admin.py13
-rw-r--r--main/forms.py37
-rw-r--r--main/models.py20
-rw-r--r--main/widgets.py76
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