Source code for concepts.models
from django.db import models
from django.contrib.contenttypes.models import ContentType
optional = { 'blank': True, 'null': True }
[docs]class HeritableObject(models.Model):
    """
    An object that is aware of its "real" type, i.e. the subclass that it
    instantiates.
    """
    real_type = models.ForeignKey(ContentType, editable=False)
    label = models.CharField(max_length=255, **optional)
[docs]    def save(self, *args, **kwargs):
        if not self.id or not self.real_type:
            self.real_type = self._get_real_type()
        super(HeritableObject, self).save(*args, **kwargs) 
    def _get_real_type(self):
        return ContentType.objects.get_for_model(type(self))
[docs]    def cast(self):
        """
        Re-cast this object using its "real" subclass.
        """
        return self.real_type.get_object_for_this_type(pk=self.pk) 
    def __unicode__(self):
        return unicode(self.label)
 
[docs]class Concept(HeritableObject):
    uri = models.CharField(max_length=255, unique=True)
    resolved = models.BooleanField(default=False)
    typed = models.ForeignKey('Type', related_name='instances', **optional )
    description = models.TextField(**optional)
    authority = models.CharField(max_length=255)
    pos = models.CharField(max_length=255, **optional)
    PENDING = 'Pending'
    REJECTED = 'Rejected'
    APPROVED = 'Approved'
    RESOLVED = 'Resolved'
    concept_state_choices=  (
        (PENDING, 'Pending'),
        (REJECTED, 'Rejected'),
        (APPROVED, 'Approved'),
        (RESOLVED, 'Resolved'),
    )
    concept_state=models.CharField(max_length=10, choices=concept_state_choices,
                                   default='Pending')
    merged_with = models.ForeignKey('Concept', related_name='merged_concepts',
                                    **optional)
    @property
    def typed_label(self):
        if self.typed:
            return self.typed.label
        return None 
[docs]class Type(Concept):
    pass