summaryrefslogtreecommitdiff
path: root/chimere/main/models.py
diff options
context:
space:
mode:
Diffstat (limited to 'chimere/main/models.py')
-rw-r--r--chimere/main/models.py325
1 files changed, 325 insertions, 0 deletions
diff --git a/chimere/main/models.py b/chimere/main/models.py
new file mode 100644
index 0000000..14f3481
--- /dev/null
+++ b/chimere/main/models.py
@@ -0,0 +1,325 @@
+#!/usr/bin/env python
+# -*- coding: utf-8 -*-
+# Copyright (C) 2008 Étienne Loks <etienne.loks_AT_peacefrogsDOTnet>
+
+# 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 <http://www.gnu.org/licenses/>.
+
+# See the file COPYING for details.
+
+"""
+Models description
+"""
+from django.utils.translation import ugettext_lazy as _
+
+from django.contrib.gis.db import models
+from django.contrib import admin
+
+from chimere import settings
+from chimere.main.widgets import PointField, RouteField
+
+
+class News(models.Model):
+ """News of the site
+ """
+ title = models.CharField(_("Name"), max_length=150)
+ available = models.BooleanField(_("Available"))
+ date = models.DateField(_("Date"), auto_now_add=True)
+ content = models.TextField()
+ def __unicode__(self):
+ ordering = ["-date"]
+ return self.title
+ class Meta:
+ verbose_name = _("News")
+
+class ColorTheme(models.Model):
+ """Color theme
+ """
+ name = models.CharField(_("Name"), max_length=150)
+ def __unicode__(self):
+ return self.name
+ class Meta:
+ verbose_name = _("Color theme")
+
+class Color(models.Model):
+ """Color
+ """
+ code = models.CharField(_("Code"), max_length=6)
+ order = models.IntegerField(_("Order"))
+ color_theme = models.ForeignKey(ColorTheme, verbose_name=_("Color theme"))
+ def __unicode__(self):
+ return self.code
+ class Meta:
+ ordering = ["order"]
+ verbose_name = _("Color")
+
+class Category(models.Model):
+ """Category of Point Of Interest (POI)
+ """
+ name = models.CharField(_("Name"), max_length=150)
+ available = models.BooleanField(_("Available"))
+ order = models.IntegerField(_("Order"))
+ description = models.TextField(blank=True, null=True)
+ def __unicode__(self):
+ return self.name
+ class Meta:
+ ordering = ["order"]
+ verbose_name = _("Category")
+
+class Icon(models.Model):
+ '''Icon
+ '''
+ name = models.CharField(_("Name"), max_length=150)
+ image = models.ImageField(_("Image"), upload_to='icons',
+ height_field='height', width_field='width')
+ def __unicode__(self):
+ return self.name
+ class Meta:
+ verbose_name = _("Icon")
+
+class SubCategory(models.Model):
+ '''Sub-category
+ '''
+ category = models.ForeignKey(Category, verbose_name=_("Category"))
+ name = models.CharField(_("Name"), max_length=150)
+ available = models.BooleanField(_("Available"))
+ icon = models.ForeignKey(Icon, verbose_name=_("Icon"))
+ color_theme = models.ForeignKey(ColorTheme, verbose_name=_("Color theme"),
+ blank=True, null=True)
+ order = models.IntegerField(_("Order"))
+ TYPE = (('M', _('Marker')),
+ ('R', _('Route')),
+ ('B', _('Both')),)
+ item_type = models.CharField(_("Item type"), max_length=1, choices=TYPE)
+ def __unicode__(self):
+ return u"%s / %s" % (self.category.name, self.name)
+ class Meta:
+ ordering = ["category", "order"]
+ verbose_name = _("Subcategory")
+
+ def getAvailable(item_types=None):
+ '''Get list of tuples with first the category and second the associated
+ subcategories
+ '''
+ sub_categories = {}
+ subcategories = None
+ if not item_types:
+ subcategories = SubCategory.objects.filter(category__available=True,
+ available=True)
+ else:
+ subcategories = SubCategory.objects.filter(category__available=True,
+ item_type__in=item_types)
+ for sub_category in subcategories:
+ if sub_category.category not in sub_categories:
+ sub_categories[sub_category.category] = []
+ sub_categories[sub_category.category].append(sub_category)
+ return [(category, sub_cats) for category, sub_cats \
+ in sub_categories.items()]
+ getAvailable = staticmethod(getAvailable)
+
+class Marker(models.Model):
+ '''Marker for a POI
+ '''
+ name = models.CharField(_("Name"), max_length=150)
+ subcategory = models.ForeignKey(SubCategory, verbose_name=_("Subcategory"))
+ point = PointField(_("Localisation"))
+ picture = models.ImageField(_("Image"), upload_to='upload', blank=True,
+ height_field='height', width_field='width')
+ STATUS = (('S', _('Submited')),
+ ('A', _('Available')),
+ ('D', _('Disabled')),)
+ STATUS_DCT = {}
+ for key, label in STATUS:
+ STATUS_DCT[key] = label
+ status = models.CharField(_("Status"), max_length=1, choices=STATUS)
+ objects = models.GeoManager()
+
+ def __unicode__(self):
+ return self.name
+
+ class Meta:
+ ordering = ('subcategory__category', 'subcategory', 'status', 'name')
+ verbose_name = _("Point of interest")
+
+ def getLatitude(self):
+ '''Return the latitude
+ '''
+ return self.point.y
+
+ def getLongitude(self):
+ '''Return the longitude
+ '''
+ return self.point.x
+
+ def getProperty(self, propertymodel, safe=None):
+ """Get the property of an associated property model.
+ If safe set to True, verify if the property is available
+ """
+ if safe and not propertymodel.available:
+ return
+ try:
+ property = Property.objects.get(propertymodel=propertymodel,
+ marker=self)
+ except Property.DoesNotExist:
+ return
+ return property
+
+ def getProperties(self):
+ """Get all the property availables
+ """
+ properties = []
+ for pm in PropertyModel.objects.filter(available=True):
+ property = self.getProperty(pm)
+ if property:
+ properties.append(property)
+ return properties
+
+ def getGeoJSON(self):
+ '''Return a GeoJSON string
+ '''
+ return """{"type":"Feature", "geometry":%(geometry)s, \
+"properties":{"pk": %(id)d, "name": "%(name)s", \
+"icon_path":"%(icon_path)s", "icon_width":%(icon_width)d, \
+"icon_height":%(icon_height)d}}""" % {'id':self.id, 'name':self.name,
+'icon_path':self.subcategory.icon.image, 'geometry':self.point.geojson,
+'icon_width':self.subcategory.icon.image.width,
+'icon_height':self.subcategory.icon.image.height,}
+
+class Route(models.Model):
+ '''Route on the map
+ '''
+ name = models.CharField(_("Name"), max_length=150)
+ subcategory = models.ForeignKey(SubCategory, verbose_name=_("Subcategory"))
+ route = RouteField(_("Route"))
+ picture = models.ImageField(_("Image"), upload_to='upload', blank=True,
+ height_field='height', width_field='width')
+ STATUS = (('S', _('Submited')),
+ ('A', _('Available')),
+ ('D', _('Disabled')),)
+ STATUS_DCT = {}
+ for key, label in STATUS:
+ STATUS_DCT[key] = label
+ status = models.CharField(_("Status"), max_length=1, choices=STATUS)
+ objects = models.GeoManager()
+
+ def __unicode__(self):
+ return self.name
+
+ class Meta:
+ ordering = ('subcategory__category', 'subcategory', 'status', 'name')
+ verbose_name = _("Route")
+
+ def getLatitude(self):
+ '''Return the latitude
+ '''
+ return self.point.y
+
+ def getLongitude(self):
+ '''Return the longitude
+ '''
+ return self.point.x
+
+ def getProperty(self, propertymodel, safe=None):
+ """Get the property of an associated property model.
+ If safe set to True, verify if the property is available
+ """
+ if safe and not propertymodel.available:
+ return
+ try:
+ property = Property.objects.get(propertymodel=propertymodel,
+ marker=self)
+ except Property.DoesNotExist:
+ return
+ return property
+
+ def getProperties(self):
+ """Get all the property availables
+ """
+ properties = []
+ for pm in PropertyModel.objects.filter(available=True):
+ property = self.getProperty(pm)
+ if property:
+ properties.append(property)
+ return properties
+
+ def getGeoJSON(self, color="#000"):
+ '''Return a GeoJSON string
+ '''
+ if '#' not in color:
+ color = '#' + color
+ return """{"type":"Feature", "geometry":%(geometry)s, \
+"properties":{"pk": %(id)d, "name": "%(name)s", \
+"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")
+
+ def getAvailable():
+ '''Get available areas
+ '''
+ return Area.objects.filter(available=True)
+ getAvailable = staticmethod(getAvailable)
+
+class PropertyModel(models.Model):
+ '''Model for a property
+ '''
+ name = models.CharField(_("Name"), max_length=150)
+ order = models.IntegerField(_("Order"))
+ available = models.BooleanField(_("Available"))
+ TYPE = (('T', _('Text')),
+ ('L', _('Long text')),
+ ('P', _('Password')))
+ TYPE_WIDGET = {'T':'forms.TextInput',
+ 'L':'TextareaWidget',
+ 'P':'forms.PasswordInput'}
+ type = models.CharField(_("Type"), max_length=1, choices=TYPE)
+ def __unicode__(self):
+ return self.name
+ class Meta:
+ ordering = ('order',)
+ verbose_name = _("Property model")
+
+ def getNamedId(self):
+ '''Get the name used as named id (easily sortable)
+ '''
+ return 'property_%d_%d' % (self.order, self.id)
+
+class Property(models.Model):
+ '''Property for a POI
+ '''
+ marker = models.ForeignKey(Marker, verbose_name=_("Point of interest"))
+ propertymodel = models.ForeignKey(PropertyModel,
+ verbose_name=_("Property model"))
+ value = models.CharField(_("Value"), max_length=1000)
+ def __unicode__(self):
+ return "%s : %s" % (str(self.propertymodel), self.value)
+ class Meta:
+ verbose_name = _("Property")
+