frequently.models: 48 total statements, 100.0% covered

Generated: Thu 2015-09-10 13:30 CEST

Source file: /home/tyrdall/projects/django-frequently/src/frequently/models.py

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