frequently.models: 44 total statements, 97.1% covered

Generated: Mon 2013-04-29 09:50 CEST

Source file: /home/tobi/Projects/django-frequently/src/frequently/models.py

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