3513cb42cd1336c9f4c14eee4a66c7ef644ff835
[philo.git] / philo / models / collections.py
1 from django.contrib.contenttypes import generic
2 from django.contrib.contenttypes.models import ContentType
3 from django.db import models
4 from django.template import add_to_builtins as register_templatetags
5
6 from philo.models.base import value_content_type_limiter, register_value_model
7 from philo.utils import fattr
8
9
10 class Collection(models.Model):
11         name = models.CharField(max_length=255)
12         description = models.TextField(blank=True, null=True)
13         
14         @fattr(short_description='Members')
15         def get_count(self):
16                 return self.members.count()
17         
18         def __unicode__(self):
19                 return self.name
20         
21         class Meta:
22                 app_label = 'philo'
23
24
25 class CollectionMemberManager(models.Manager):
26         use_for_related_fields = True
27
28         def with_model(self, model):
29                 return model._default_manager.filter(pk__in=self.filter(member_content_type=ContentType.objects.get_for_model(model)).values_list('member_object_id', flat=True))
30
31
32 class CollectionMember(models.Model):
33         objects = CollectionMemberManager()
34         collection = models.ForeignKey(Collection, related_name='members')
35         index = models.PositiveIntegerField(verbose_name='Index', help_text='This will determine the ordering of the item within the collection. (Optional)', null=True, blank=True)
36         member_content_type = models.ForeignKey(ContentType, limit_choices_to=value_content_type_limiter, verbose_name='Member type')
37         member_object_id = models.PositiveIntegerField(verbose_name='Member ID')
38         member = generic.GenericForeignKey('member_content_type', 'member_object_id')
39         
40         def __unicode__(self):
41                 return u'%s - %s' % (self.collection, self.member)
42         
43         class Meta:
44                 app_label = 'philo'
45
46
47 register_templatetags('philo.templatetags.collections')
48 register_value_model(Collection)