frequently.models: 47 total statements, 97.3% covered

Generated: Fri 2013-09-20 14:38 CEST

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

Stats: 36 executed, 1 missed, 10 excluded, 160 ignored

  1. """Models for the ``frequently`` app."""
  2. from django.db import models
  3. from django.utils import timezone
  4. from django.utils.translation import ugettext_lazy as _
  5. from cms.models import CMSPlugin
  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 EntryCategoryPlugin(CMSPlugin):
  40. """
  41. CMS related Model to get a group of desired categories.
  42. :categories: Categories, which are selected by the cms user.
  43. """
  44. categories = models.ManyToManyField(
  45. EntryCategory,
  46. verbose_name=_('Categories'),
  47. )
  48. def copy_relations(self, oldinstance):
  49. self.categories = oldinstance.categories.all()
  50. class Entry(models.Model):
  51. """
  52. Entry model. Can be added to a category group.
  53. :owner: Foreign key to django auth user.
  54. :category: Entry can appear in different categories.
  55. :question: Title or question of the entry.
  56. :slug: Slugified question of the category.
  57. :answer: Answer or content of the entry.
  58. :creation_date: Date of entry creation.
  59. :last_view_date: Date of the last click/view.
  60. :amount_of_views: Amount of views/clicks.
  61. :fixed_position: Set a position to avoid ordering by views.
  62. :upvotes: Positive vote amount for this entry.
  63. :downvotes: Negative vote amount for this entry.
  64. :published: Shows/hides entries.
  65. """
  66. owner = models.ForeignKey(
  67. 'auth.User',
  68. verbose_name=_('Owner'),
  69. blank=True, null=True,
  70. )
  71. category = models.ManyToManyField(
  72. EntryCategory,
  73. verbose_name=_('Category'),
  74. related_name='entries',
  75. )
  76. question = models.CharField(
  77. max_length=200,
  78. verbose_name=_('Question'),
  79. )
  80. slug = models.SlugField(
  81. max_length=200,
  82. unique=True,
  83. verbose_name=_('Slug'),
  84. )
  85. answer = models.TextField(
  86. verbose_name=_('Answer'),
  87. blank=True, null=True,
  88. )
  89. creation_date = models.DateTimeField(
  90. default=timezone.now(),
  91. verbose_name=_('Creation date'),
  92. )
  93. last_view_date = models.DateTimeField(
  94. default=timezone.now(),
  95. verbose_name=_('Date of last view'),
  96. )
  97. amount_of_views = models.PositiveIntegerField(
  98. default=0,
  99. verbose_name=_('Amount of views'),
  100. )
  101. fixed_position = models.PositiveIntegerField(
  102. verbose_name=_('Fixed position'),
  103. blank=True, null=True,
  104. )
  105. upvotes = models.PositiveIntegerField(
  106. default=0,
  107. verbose_name=_('Upvotes'),
  108. )
  109. downvotes = models.PositiveIntegerField(
  110. default=0,
  111. verbose_name=_('Downvotes'),
  112. )
  113. published = models.BooleanField(
  114. default=False,
  115. verbose_name=_('is published'),
  116. )
  117. submitted_by = models.EmailField(
  118. max_length=100,
  119. verbose_name=_('Submitted by'),
  120. blank=True,
  121. )
  122. class Meta:
  123. ordering = ['fixed_position', 'question']
  124. def __unicode__(self):
  125. return self.question
  126. def rating(self):
  127. return self.upvotes - self.downvotes
  128. class Feedback(models.Model):
  129. """
  130. Feedback model to save and store user feedback related to an entry.
  131. This model can also be used to store general feedback.
  132. :user: Stores user if authenticated at submission.
  133. :entry: Related entry.
  134. :remark: User's feedback text.
  135. :submission_date: Date of feedback creation.
  136. :validation: Is this a positive or negative feedback.
  137. """
  138. user = models.ForeignKey(
  139. 'auth.User',
  140. verbose_name=_('User'),
  141. blank=True, null=True,
  142. )
  143. entry = models.ForeignKey(
  144. Entry,
  145. verbose_name=_('Related entry'),
  146. blank=True, null=True,
  147. )
  148. remark = models.TextField(
  149. verbose_name=_('Remark'),
  150. blank=True,
  151. )
  152. submission_date = models.DateTimeField(
  153. default=timezone.now(),
  154. verbose_name=_('Submission date'),
  155. )
  156. validation = models.CharField(
  157. max_length=1,
  158. choices=(('P', _('Positive')), ('N', _('Negative'))),
  159. verbose_name=_('Validation mood'),
  160. )
  161. def __unicode__(self):
  162. return "%s - %s" % (self.entry, self.submission_date)