multilingual_events.models: 108 total statements, 64.8% covered

Generated: Thu 2013-02-28 16:32 SGT

Source file: /Users/martin/Repos/django-multilingual-events/multilingual_events/models.py

Stats: 57 executed, 31 missed, 20 excluded, 224 ignored

  1. """Models for the ``multilingual_events`` app."""
  2. from django.conf import settings
  3. from django.core.urlresolvers import reverse
  4. from django.db import models
  5. from django.utils.translation import get_language
  6. from django.utils.translation import ugettext_lazy as _
  7. from cms.models import CMSPlugin
  8. from django_countries import CountryField
  9. from djangocms_utils.fields import M2MPlaceholderField
  10. from simple_translation.actions import SimpleTranslationPlaceholderActions
  11. from simple_translation.utils import get_preferred_translation_from_lang
  12. class EventCategory(models.Model):
  13. """
  14. Events are grouped in categories.
  15. For translateable fields see ``EventCategoryTitle``.
  16. :position: Use this if you want to change the ordering of categories.
  17. """
  18. position = models.PositiveIntegerField(
  19. verbose_name=_('Position'),
  20. null=True, blank=True,
  21. )
  22. slug = models.CharField(
  23. max_length=32,
  24. verbose_name=_('Slug'),
  25. )
  26. def __unicode__(self):
  27. return self.get_translation().title
  28. def get_translation(self):
  29. lang = get_language()
  30. return get_preferred_translation_from_lang(self, lang)
  31. class EventCategoryTitle(models.Model):
  32. """
  33. Translateable fields of the ``EventCategory`` model.
  34. """
  35. title = models.CharField(
  36. max_length=256,
  37. verbose_name=_('Title'),
  38. )
  39. # Needed by simple-translation
  40. category = models.ForeignKey(EventCategory, verbose_name=_('Category'))
  41. language = models.CharField(max_length=2, verbose_name=_('Language'))
  42. class Event(models.Model):
  43. """
  44. An event is something that happens on a specific start date.
  45. For translateable fields see ``EventTitle``.
  46. :start_date: The DateTime when this event starts.
  47. :is_published: If ``True``, the event would be returned by the
  48. ``get_events`` templatetag.
  49. :creation_date: The DateTime when this event was created.
  50. :user: The user who created this event.
  51. """
  52. placeholders = M2MPlaceholderField(
  53. actions=SimpleTranslationPlaceholderActions(),
  54. placeholders=('content', ),
  55. )
  56. # Allow null for once but remove this later, when data is setup.
  57. category = models.ForeignKey(
  58. EventCategory,
  59. verbose_name=_('Category'),
  60. )
  61. start_date = models.DateField(
  62. verbose_name=_('Start date'),
  63. )
  64. start_time = models.TimeField(
  65. verbose_name=_('Start time'),
  66. null=True, blank=True,
  67. )
  68. end_date = models.DateField(
  69. verbose_name=_('End date'),
  70. null=True, blank=True
  71. )
  72. end_time = models.TimeField(
  73. verbose_name=_('End time'),
  74. null=True, blank=True,
  75. )
  76. timezone = models.CharField(
  77. max_length=65,
  78. verbose_name=_('Timezone'),
  79. blank=True,
  80. )
  81. url = models.URLField(
  82. verbose_name=_('External URL'),
  83. blank=True,
  84. )
  85. url_name = models.CharField(
  86. max_length=256,
  87. verbose_name=_('External URL name'),
  88. blank=True,
  89. )
  90. venue_url = models.URLField(
  91. verbose_name=_('Venue URL'),
  92. blank=True,
  93. )
  94. google_maps_embed_code = models.CharField(
  95. max_length=4000,
  96. verbose_name=_('Google Maps embed code'),
  97. blank=True,
  98. )
  99. is_published = models.BooleanField(
  100. default=False,
  101. verbose_name=_('Is published'),
  102. )
  103. creation_date = models.DateTimeField(
  104. auto_now_add=True,
  105. verbose_name=('Creation date'),
  106. )
  107. last_update = models.DateTimeField(
  108. auto_now=True,
  109. )
  110. user = models.ForeignKey(
  111. 'auth.User',
  112. verbose_name=_('User'),
  113. null=True, blank=True,
  114. )
  115. country = CountryField(
  116. verbose_name=_('Country'),
  117. null=True, blank=True,
  118. )
  119. class Meta:
  120. ordering = ('start_date', )
  121. def __unicode__(self):
  122. return self.get_title()
  123. def get_address(self):
  124. """Returns the address with country."""
  125. trans = self.get_translation()
  126. full_address = u''
  127. if trans.venue_name:
  128. full_address += u'{0}<br />'.format(trans.venue_name)
  129. if trans.address_1:
  130. full_address += u'{0}<br />'.format(trans.address_1)
  131. if trans.address_2:
  132. full_address += u'{0}<br />'.format(trans.address_2)
  133. if trans.city:
  134. if trans.postal_code:
  135. full_address += u'{0} '.format(trans.postal_code)
  136. full_address += u'{0}<br />'.format(trans.city)
  137. full_address += u'{0}'.format(self.country.name.encode())
  138. return full_address
  139. def get_alternative_events(self):
  140. return Event.objects.filter(category=self.category).exclude(
  141. pk=self.pk).order_by('start_date')
  142. def get_city_and_country(self):
  143. trans = self.get_translation()
  144. result = u''
  145. if trans.city:
  146. result += u'{0}, '.format(trans.city)
  147. result += self.country.name.encode()
  148. return result
  149. def get_number_of_days(self):
  150. """Returns the number of days for this event."""
  151. if not self.end_date:
  152. return 1
  153. amount = self.end_date - self.start_date
  154. return amount.days + 1
  155. def get_title(self):
  156. lang = get_language()
  157. return get_preferred_translation_from_lang(self, lang).title
  158. def get_translation(self):
  159. lang = get_language()
  160. return get_preferred_translation_from_lang(self, lang)
  161. class EventTitle(models.Model):
  162. """
  163. Translateable fields of the ``Event`` model.
  164. """
  165. title = models.CharField(
  166. max_length=512,
  167. verbose_name=_('Title'),
  168. )
  169. venue_name = models.CharField(
  170. max_length=256,
  171. verbose_name=_('Venue name'),
  172. blank=True,
  173. )
  174. city = models.CharField(
  175. max_length=256,
  176. verbose_name=_('City'),
  177. blank=True,
  178. )
  179. postal_code = models.CharField(
  180. max_length=256,
  181. verbose_name=_('Postal code'),
  182. blank=True,
  183. )
  184. address_1 = models.CharField(
  185. max_length=256,
  186. verbose_name=_('Address 1'),
  187. blank=True,
  188. )
  189. address_2 = models.CharField(
  190. max_length=256,
  191. verbose_name=_('Address 2'),
  192. blank=True,
  193. )
  194. room = models.CharField(
  195. max_length=256,
  196. verbose_name=_('Block / Room'),
  197. blank=True,
  198. )
  199. description = models.TextField(
  200. verbose_name=_('Description'),
  201. blank=True,
  202. )
  203. # Needed by simple_translation
  204. event = models.ForeignKey(Event, verbose_name=_('Event'))
  205. language = models.CharField(max_length=5, verbose_name=('Language'))
  206. def get_absolute_url(self):
  207. middleware = (
  208. 'simple_translation.middleware.MultilingualGenericsMiddleware')
  209. language_namespace = middleware in settings.MIDDLEWARE_CLASSES \
  210. and '%s:' % self.language or ''
  211. return reverse(
  212. '%ssimple_events_detail' % language_namespace,
  213. args=(),
  214. kwargs={'pk': self.event.pk, }
  215. )
  216. class EventAgendaDay(CMSPlugin):
  217. """The day and title of an event."""
  218. date = models.DateField(
  219. verbose_name=_('Date'),
  220. )
  221. title = models.CharField(
  222. max_length=256,
  223. verbose_name=_('Title'),
  224. )
  225. def __unicode__(self):
  226. return self.title
  227. class EventAgendaSession(CMSPlugin):
  228. """A day can consist of several sessions."""
  229. start_time = models.DateTimeField(
  230. verbose_name=_('Start time'),
  231. )
  232. end_time = models.DateTimeField(
  233. verbose_name=_('End time'),
  234. )
  235. title = models.CharField(
  236. max_length=256,
  237. verbose_name=_('Title'),
  238. )
  239. description = models.TextField(
  240. max_length=4000,
  241. verbose_name=_('Description'),
  242. blank=True,
  243. )
  244. document = models.ForeignKey(
  245. 'document_library.Document',
  246. verbose_name=_('Document'),
  247. null=True, blank=True,
  248. )
  249. class EventAgendaTalk(CMSPlugin):
  250. """A session can have several talks."""
  251. title = models.CharField(
  252. max_length=256,
  253. verbose_name=_('Title'),
  254. )
  255. description = models.TextField(
  256. max_length=4000,
  257. verbose_name=_('Description'),
  258. blank=True,
  259. )
  260. document = models.ForeignKey(
  261. 'document_library.Document',
  262. verbose_name=_('Document'),
  263. null=True, blank=True,
  264. )