Territorios

apps.territory.models – Territory

# -*- 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)

Contenidos

Tema anterior

Procesos

Próximo tema

Importación de datos

Esta página