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