# -*- coding: utf-8 -*-
"""
============================
:mod:`apps.territory.models`
============================
.. todo:: Añadir datos geográficos
http://www.djangosnippets.org/snippets/327/
Classes :class:`SupraState`, :class:`State`,
:class:`TerritorialCategory`, :class:`TerritorialEntity` and
:class:`Capital` are modeled to allow any territory defined by any
political system.
"""
from django.db import models
from django.db.models import permalink
from django.contrib.contenttypes.models import ContentType
from django.contrib.contenttypes import generic
from django.template.defaultfilters import slugify
from django.utils.translation import ugettext_lazy as _
import mptt
power_models = {
'model__in': ('parliament',
'executiveorgan',
'executiveorgancategory',
'court',
'courtcategory')
}
class TerritoryCategory(models.Model):
"""
Represents the abstract divisions of the :class:`Territory`.
Allows a state to be categorized into its particular (or peculiar
:-)) subdivisions.
"""
name = models.CharField(_('name'), max_length=255)
slug = models.SlugField(_('slug'))
parent = models.ForeignKey(
'self',
verbose_name=_('parent category'),
blank=True,
null=True,
related_name='children')
class Meta:
verbose_name = _('Territorial category')
verbose_name_plural = _('Territorial categories')
ordering = ['name', ]
def __unicode__(self):
return self.name
@permalink
def get_absolute_url(self):
return ('territory-category', (), { 'slug': self.slug })
class Territory(models.Model):
name = models.CharField(_('name'), max_length=255)
slug = models.SlugField(_('slug'))
url = models.URLField(blank=True, null=True, verify_exists=False)
abbreviation = models.CharField(
_('abbreviation'),
max_length=20,
blank=True,
null=True)
iso_code2 = models.PositiveIntegerField(_('iso code'), blank=True, null=True)
iso_code3 = models.PositiveIntegerField(_('iso code'), blank=True, null=True)
parent = models.ForeignKey(
'self',
verbose_name=_('parent'),
null=True,
blank=True,
related_name='children')
category = models.ForeignKey(TerritoryCategory, verbose_name=_('category'))
class Meta:
verbose_name = _('Territory')
verbose_name_plural = _('Territories')
ordering = ['tree_id', 'lft'] # The TreeEditor needs this ordering definition
def save(self):
slug_str = "%s-%s" % (self.category.name, self.name)
self.slug = slugify(slug_str)
super(Territory, self).save()
def __unicode__(self):
return "%s [%s]" % (self.name, self.category.name)
@permalink
def get_absolute_url(self):
return ('territory-slug', (), { 'slug': self.slug })
mptt.register(Territory, order_insertion_by=['name'])
class Capital(models.Model):
"""
Represents the capital of any :class:`Territory`.
Allows multiple capitalities (administrative, political) as
happens in countries like Netherlands.
"""
territory = models.ForeignKey(
Territory,
related_name= 'territory',
verbose_name=_('territory'))
capital_type = models.CharField(_('capital type'), max_length=255)
capital = models.ForeignKey(
Territory,
related_name= 'capital',
verbose_name=_('capital'))
class Meta:
verbose_name = _('Capital')
verbose_name_plural = _('Capitals')
ordering = ['territory', ]
def __unicode__(self):
return "%s of %s" % (self.capital_type, self.territory.name)
@permalink
def get_absolute_url(self):
return ('capital', (), { 'slug': self.slug })
class Power(models.Model):
name = models.CharField(_('name'), max_length=255)
content_type = models.ForeignKey(
ContentType,
limit_choices_to=power_models,
related_name="power_set")
object_id = models.PositiveIntegerField()
content_object = generic.GenericForeignKey('content_type', 'object_id')
territory = models.ForeignKey(Territory)
class Meta:
verbose_name = _('Power')
verbose_name_plural = _('Powers')
ordering = ['name', ]
def __unicode__(self):
return u'%s %s: %s' % (self.name, self.territory.name, self.content_object.name)