frequently.models: 49 total statements, 97.2% covered

Generated: Sun 2013-11-24 13:53 SGT

Source file: /Users/martin/Repos/django-frequently/frequently/models.py

Stats: 35 executed, 1 missed, 13 excluded, 153 ignored

  1. """Models for the ``frequently`` app."""
  2. from django.conf import settings
  3. from django.core.urlresolvers import reverse
  4. from django.db import models
  5. from django.utils import timezone
  6. from django.utils.translation import ugettext_lazy as _
  7. class EntryCategory(models.Model):
  8. """
  9. Model to gather answers in topic groups.
  10. :name: Name or title of the category.
  11. :slug: Slugified name of the category.
  12. :fixed_position: Set a position to avoid ordering by views.
  13. :last_rank: Last rank calculated at the category list view.
  14. """
  15. name = models.CharField(
  16. max_length=100,
  17. verbose_name=_('Name'),
  18. )
  19. slug = models.SlugField(
  20. max_length=100,
  21. unique=True,
  22. verbose_name=_('Slug'),
  23. )
  24. fixed_position = models.PositiveIntegerField(
  25. verbose_name=_('Fixed position'),
  26. blank=True, null=True,
  27. )
  28. last_rank = models.FloatField(
  29. default=0,
  30. verbose_name=_('Last calculated rank'),
  31. )
  32. def __unicode__(self):
  33. return self.name
  34. class Meta:
  35. ordering = ['fixed_position', 'name']
  36. def get_entries(self):
  37. return self.entries.filter(published=True).annotate(
  38. null_position=models.Count('fixed_position')).order_by(
  39. '-null_position', 'fixed_position', '-amount_of_views')
  40. class Entry(models.Model):
  41. """
  42. Entry model. Can be added to a category group.
  43. :owner: Foreign key to django auth user.
  44. :category: Entry can appear in different categories.
  45. :question: Title or question of the entry.
  46. :slug: Slugified question of the category.
  47. :answer: Answer or content of the entry.
  48. :creation_date: Date of entry creation.
  49. :last_view_date: Date of the last click/view.
  50. :amount_of_views: Amount of views/clicks.
  51. :fixed_position: Set a position to avoid ordering by views.
  52. :upvotes: Positive vote amount for this entry.
  53. :downvotes: Negative vote amount for this entry.
  54. :published: Shows/hides entries.
  55. """
  56. owner = models.ForeignKey(
  57. 'auth.User',
  58. verbose_name=_('Owner'),
  59. blank=True, null=True,
  60. )
  61. category = models.ManyToManyField(
  62. EntryCategory,
  63. verbose_name=_('Category'),
  64. related_name='entries',
  65. )
  66. question = models.TextField(
  67. max_length=2000,
  68. verbose_name=_('Question'),
  69. )
  70. slug = models.SlugField(
  71. max_length=200,
  72. unique=True,
  73. verbose_name=_('Slug'),
  74. )
  75. answer = models.TextField(
  76. verbose_name=_('Answer'),
  77. blank=True, null=True,
  78. )
  79. creation_date = models.DateTimeField(
  80. default=timezone.now(),
  81. verbose_name=_('Creation date'),
  82. )
  83. last_view_date = models.DateTimeField(
  84. default=timezone.now(),
  85. verbose_name=_('Date of last view'),
  86. )
  87. amount_of_views = models.PositiveIntegerField(
  88. default=0,
  89. verbose_name=_('Amount of views'),
  90. )
  91. fixed_position = models.PositiveIntegerField(
  92. verbose_name=_('Fixed position'),
  93. blank=True, null=True,
  94. )
  95. upvotes = models.PositiveIntegerField(
  96. default=0,
  97. verbose_name=_('Upvotes'),
  98. )
  99. downvotes = models.PositiveIntegerField(
  100. default=0,
  101. verbose_name=_('Downvotes'),
  102. )
  103. published = models.BooleanField(
  104. default=False,
  105. verbose_name=_('is published'),
  106. )
  107. submitted_by = models.EmailField(
  108. max_length=100,
  109. verbose_name=_('Submitted by'),
  110. blank=True,
  111. )
  112. class Meta:
  113. ordering = ['fixed_position', 'question']
  114. def __unicode__(self):
  115. return self.question
  116. def get_absolute_url(self):
  117. return reverse('frequently_entry_detail', kwargs={'slug': self.slug, })
  118. def rating(self):
  119. return self.upvotes - self.downvotes
  120. class Feedback(models.Model):
  121. """
  122. Feedback model to save and store user feedback related to an entry.
  123. This model can also be used to store general feedback.
  124. :user: Stores user if authenticated at submission.
  125. :entry: Related entry.
  126. :remark: User's feedback text.
  127. :submission_date: Date of feedback creation.
  128. :validation: Is this a positive or negative feedback.
  129. """
  130. user = models.ForeignKey(
  131. 'auth.User',
  132. verbose_name=_('User'),
  133. blank=True, null=True,
  134. )
  135. entry = models.ForeignKey(
  136. Entry,
  137. verbose_name=_('Related entry'),
  138. blank=True, null=True,
  139. )
  140. remark = models.TextField(
  141. verbose_name=_('Remark'),
  142. blank=True,
  143. )
  144. submission_date = models.DateTimeField(
  145. default=timezone.now(),
  146. verbose_name=_('Submission date'),
  147. )
  148. validation = models.CharField(
  149. max_length=1,
  150. choices=(('P', _('Positive')), ('N', _('Negative'))),
  151. verbose_name=_('Validation mood'),
  152. )
  153. def __unicode__(self):
  154. return "%s - %s" % (self.entry, self.submission_date)
  155. is_ready = getattr(settings, 'FREQUENTLY_READY_FOR_V2', False)
  156. if not is_ready:
  157. raise Exception(
  158. 'ERROR: There are backwards incompatible changes in django-frequently.'
  159. ' Please visit http://github.com/bitmazk/cmsplugin_frequently/ to'
  160. ' find out more')