models.py 6.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163
  1. from datetime import datetime, timedelta
  2. from dateutil.relativedelta import relativedelta
  3. from django.db import models
  4. from django.utils.translation import ugettext_lazy as _
  5. from django.core.urlresolvers import reverse
  6. from django.template.defaultfilters import slugify
  7. from django.contrib.auth.models import User
  8. from django_extensions.db.models import TimeStampedModel
  9. from remember.managers import PublishedManager
  10. class PublishExpiringModel(TimeStampedModel):
  11. expires_on=models.DateTimeField(_('Expires on'), default=datetime.today()+timedelta(days=7), blank=True, null=True)
  12. published=models.BooleanField(_('Published'), default=False)
  13. published_on=models.DateTimeField(_('Published on'))
  14. objects = PublishedManager()
  15. class Meta:
  16. abstract=True
  17. class RemembrancePhoto(PublishExpiringModel):
  18. name=models.CharField(_('Name'), max_length=100)
  19. image=models.ImageField(_('Image'), upload_to='remember/photos/')
  20. class Meta:
  21. ordering = ('-published_on',)
  22. def __unicode__(self):
  23. return u'%s' % (self.name)
  24. class InMemoriam(PublishExpiringModel):
  25. '''In Memorum model.
  26. Effectively an anniversary obit. Runs anytime, not just at TOD.'''
  27. title=models.CharField(_('Title'), max_length=140)
  28. slug=models.SlugField(_('Slug'), unique=True)
  29. dateline=models.CharField(_('Dateline'), blank=True, null=True, max_length=100)
  30. name=models.CharField(_('Name'), max_length=70, blank=True, null=True)
  31. copy=models.TextField(_('Copy'))
  32. photos=models.ManyToManyField(RemembrancePhoto, blank=True, null=True)
  33. military=models.BooleanField(_('Military service?'), default=False)
  34. class Meta:
  35. ordering = ('-published_on',)
  36. verbose_name = _('In memoriam')
  37. verbose_name_plural = _('In memoriams')
  38. def __unicode__(self):
  39. return u'%s' % (self.title)
  40. #@models.permalink
  41. #def get_absolute_url(self):
  42. # return ('rm-inmemoriam-detail', None, {'slug': self.slug})
  43. class Remembrance(PublishExpiringModel):
  44. '''Remembrance model.
  45. An obituary by any other name.'''
  46. name=models.CharField(_('Name'), max_length=100)
  47. slug=models.SlugField(_('Slug'), unique=True)
  48. dateline=models.CharField(_('Dateline'), blank=True, null=True, max_length=100)
  49. body=models.TextField(_('Body'))
  50. photos=models.ManyToManyField(RemembrancePhoto, blank=True, null=True)
  51. military=models.BooleanField(_('Military service?'), default=False)
  52. class Meta:
  53. ordering = ('-published_on',)
  54. verbose_name = _('Remembrance')
  55. verbose_name_plural = _('Remembrances')
  56. def __unicode__(self):
  57. return u'%s' % self.name
  58. #@models.permalink
  59. #def get_absolute_url(self):
  60. # return ('rm-remembrance-detail', None, {'slug': self.slug})
  61. class Announcement(PublishExpiringModel):
  62. '''Announcement model.
  63. A simple announcement of a death.'''
  64. first_name=models.CharField(_('First name'), max_length=70)
  65. middle_name=models.CharField(_('Middle name'), max_length=70, blank=True, null=True)
  66. last_name=models.CharField(_('Last name'), max_length=70)
  67. slug=models.SlugField(_('Slug'), unique=True)
  68. copy=models.TextField(_('Copy'))
  69. '''
  70. nickname=models.CharField(_('Nickname'), blank=True, null=True, max_length=100)
  71. residence=models.CharField(_('Residence'), blank=True, null=True, max_length=100)
  72. fixed_age=models.IntegerField(_('Age'), max_length=3, blank=True, null=True)
  73. birth_year=models.IntegerField(max_length=4, blank=True, null=True)
  74. birth_date=models.DateField(blank=True, null=True)
  75. death_date=models.DateField(blank=True, null=True)
  76. death_location=models.CharField(_('Death location'), blank=True, null=True, max_length=200)
  77. remembrance=models.ForeignKey(Remembrance, blank=True, null=True)
  78. service_date=models.DateTimeField(blank=True, null=True)
  79. service_location=models.CharField(blank=True, null=True, max_length=200)
  80. armed_service=models.BooleanField(_('Armed service'), default=False)
  81. service_branch=models.CharField(_('Service branch'), blank=True, null=True, max_length=20)'''
  82. class Meta:
  83. ordering = ('-published_on',)
  84. verbose_name=_('announcement')
  85. verbose_name_plural=_('annoucements')
  86. @property
  87. def full_name(self):
  88. if self.middle_name:
  89. name = u'%s %s. %s' % (self.first_name, self.middle_name[0].capitalize(), self.last_name)
  90. else:
  91. name = u'%s %s' % (self.first_name, self.last_name)
  92. return name
  93. def __unicode__(self):
  94. return u'%s' % self.full_name
  95. '''@property
  96. def age(self):
  97. if self.fixed_age:
  98. age = self.fixed_age
  99. else:
  100. if self.death_date:
  101. DELTA=self.death_date
  102. else:
  103. DELTA=datetime.today()
  104. age = relativedelta(DELTA, self.birth_date).years
  105. return u'%s' % relativedelta(DELTA, self.birth_date).years'''
  106. #@models.permalink
  107. #def get_absolute_url(self):
  108. # return ('rm-announcement-detail', None, {'slug': self.slug})
  109. class Service(PublishExpiringModel):
  110. '''Service model.'''
  111. announcement=models.ForeignKey(Announcement, blank=True, null=True)
  112. name=models.CharField(_('Title'), max_length=100, blank=True, null=True)
  113. slug=models.SlugField(_('Slug'), unique=True, blank=True)
  114. location=models.CharField(_('Location'), max_length=200, blank=True, null=True)
  115. date=models.DateTimeField(_('Date and time'), blank=True, null=True)
  116. body=models.TextField(_('Body'))
  117. class Meta:
  118. verbose_name = _('sevice')
  119. verbose_name_plural = _('services')
  120. def __unicode__(self):
  121. if self.announcement:
  122. return self.announcement.slug + " memorial service"
  123. else:
  124. return u'%s' % self.name
  125. def save(self):
  126. if not self.slug and self.announcement:
  127. self.slug = self.announcement.slug
  128. else:
  129. self.slug = slugify(self.name)
  130. super(TimeStampedModel, self).save()
  131. #@models.permalink
  132. #def get_absolute_url(self):
  133. # return ('rm-service-detail', None, {'slug': self.slug})