document_library.models: 55 total statements, 97.7% covered

Generated: Sat 2013-02-23 20:08 SGT

Source file: /Users/martin/Repos/django-document-library/document_library/models.py

Stats: 43 executed, 1 missed, 11 excluded, 137 ignored

  1. """Models for the ``document_library`` app."""
  2. from django.conf import settings
  3. from django.db import models
  4. from django.utils.translation import get_language
  5. from django.utils.translation import ugettext_lazy as _
  6. from filer.fields.file import FilerFileField
  7. from simple_translation.middleware import filter_queryset_language
  8. from simple_translation.utils import get_preferred_translation_from_lang
  9. class DocumentCategory(models.Model):
  10. """
  11. Documents can be grouped in categories.
  12. See ``DocumentCategoryTitle`` for translateable fields.
  13. :creation_date: The DateTime when this category was created.
  14. """
  15. creation_date = models.DateTimeField(
  16. auto_now_add=True,
  17. verbose_name=_('Creation date'),
  18. )
  19. slug = models.SlugField(
  20. max_length=32,
  21. verbose_name=_('Slug'),
  22. )
  23. def __unicode__(self):
  24. return self.get_title()
  25. def get_title(self):
  26. lang = get_language()
  27. return get_preferred_translation_from_lang(self, lang).title
  28. class DocumentCategoryTitle(models.Model):
  29. """
  30. Translateable fields for the ``DocumentCategory`` model.
  31. :title: The title of this category.
  32. """
  33. title = models.CharField(
  34. max_length=256,
  35. verbose_name=_('Title'),
  36. )
  37. # Needed by simple-translation
  38. category = models.ForeignKey(
  39. DocumentCategory, verbose_name=_('Category'))
  40. language = models.CharField(
  41. max_length=2, verbose_name=_('Language'), choices=settings.LANGUAGES)
  42. class DocumentManager(models.Manager):
  43. """Custom manager for the ``Document`` model."""
  44. def published(self, request):
  45. """
  46. Returns the published documents in the current language.
  47. :param request: A Request instance.
  48. """
  49. qs = self.get_query_set()
  50. qs = qs.filter(is_published=True)
  51. qs = filter_queryset_language(request, qs)
  52. return qs
  53. class Document(models.Model):
  54. """
  55. A document consists of a title and description and a number of filer-files.
  56. See ``DocumentTitle`` for the translateable fields of this model.
  57. :creation_date: DateTime when this document was created.
  58. :user: Optional FK to the User who created this document.
  59. :position: If you want to order the documents other than by creation date,
  60. enter numbers for positioning here.
  61. :is_published: If ``False`` the object will be excluded from the library
  62. views.
  63. :is_on_front_page: If ``True`` the object will be returned by the
  64. ``get_frontpage_documents`` templatetag.
  65. """
  66. category = models.ForeignKey(
  67. DocumentCategory,
  68. verbose_name=_('Category'),
  69. null=True, blank=True,
  70. )
  71. creation_date = models.DateTimeField(
  72. auto_now_add=True,
  73. verbose_name=_('Creation date'),
  74. )
  75. user = models.ForeignKey(
  76. 'auth.User',
  77. verbose_name=_('User'),
  78. null=True, blank=True,
  79. )
  80. position = models.PositiveIntegerField(
  81. verbose_name=_('Position'),
  82. null=True, blank=True,
  83. )
  84. is_published = models.BooleanField(
  85. default=False,
  86. verbose_name=_('Is published'),
  87. )
  88. is_on_front_page = models.BooleanField(
  89. default=False,
  90. verbose_name=('Is on front page'),
  91. )
  92. source_url = models.URLField(
  93. verbose_name=_('Source URL'),
  94. help_text=_(
  95. 'Use this if you want to give credit for a downloadable file.'),
  96. blank=True,
  97. )
  98. download_url = models.URLField(
  99. verbose_name=_('Download URL'),
  100. help_text=_(
  101. 'Use this if you want to link to a file instead of self-hosting'
  102. ' it'),
  103. blank=True,
  104. )
  105. objects = DocumentManager()
  106. class Meta:
  107. ordering = ('position', '-creation_date', )
  108. def __unicode__(self):
  109. return self.get_title()
  110. def get_filetype(self):
  111. lang = get_language()
  112. title = get_preferred_translation_from_lang(self, lang)
  113. if title.filer_file:
  114. return title.filer_file.extension.upper()
  115. return None
  116. def get_title(self):
  117. lang = get_language()
  118. return get_preferred_translation_from_lang(self, lang).title
  119. class DocumentTitle(models.Model):
  120. """
  121. The translateable fields of the ``Document`` model.
  122. :title: The title of the document.
  123. :description: A short description of the document.
  124. :filer_file: FK to the File of the document version for this language.
  125. """
  126. title = models.CharField(
  127. max_length=512,
  128. verbose_name=_('Title'),
  129. )
  130. description = models.TextField(
  131. verbose_name=_('Description'),
  132. blank=True,
  133. )
  134. filer_file = FilerFileField(
  135. verbose_name=_('File'),
  136. null=True, blank=True,
  137. )
  138. copyright_notice = models.CharField(
  139. max_length=1024,
  140. verbose_name=_('Copyright notice'),
  141. blank=True,
  142. )
  143. # Needed by simple-translation
  144. document = models.ForeignKey(
  145. Document, verbose_name=_('Document'))
  146. language = models.CharField(
  147. max_length=5, verbose_name=('Language'), choices=settings.LANGUAGES)