Resources application initial commit
[snf-cloudcms] / cloudcmsresources / models.py
1 from datetime import datetime
2
3 from django.db import models
4 from django.conf import settings
5 from django.contrib.auth.models import User
6 from django.utils.translation import ugettext_lazy as _, ugettext, ungettext
7 from django.template.loader import render_to_string
8 from django.core import urlresolvers
9 from django import forms
10
11 from feincms import translations
12 from feincms.models import Base
13 from feincms.module.page.models import Page
14 from feincms.content.richtext.models import RichTextContent
15 from feincms.content.section.models import SectionContent
16 from feincms.content.application.models import reverse
17 from feincms.module.medialibrary.fields import MediaFileForeignKey
18 from feincms.module.medialibrary.models import MediaFile
19 from feincms.module.page.extensions.navigation import NavigationExtension
20 from feincms.module.page.extensions.navigation import PagePretender
21 from feincms.content.application.models import ApplicationContent
22
23 from cloudcms.models import Application
24 from cloudcms.cms_utils import get_app_page
25
26 from feincms import translations
27 from feincms.models import Base
28 from feincms.module.page.models import Page
29 from feincms.content.richtext.models import RichTextContent
30 from feincms.content.section.models import SectionContent
31 from feincms.content.application.models import reverse
32 from feincms.module.medialibrary.fields import MediaFileForeignKey
33 from feincms.module.medialibrary.models import MediaFile
34 from feincms.module.page.extensions.navigation import NavigationExtension
35 from feincms.module.page.extensions.navigation import PagePretender
36 from feincms.content.application.models import ApplicationContent
37
38 from cloudcms.models import Application
39 from cloudcms.cms_utils import get_app_page
40
41 # monkeypatch django reverse (feincms 1.5+ solves this issue)
42 urlresolvers.reverse = reverse
43
44
45 class ResourceCategory(models.Model, translations.TranslatedObjectMixin):
46     ordering = models.SmallIntegerField(_('ordering'), default=0)
47     display_on_menu = models.BooleanField(default=True)
48     color = models.CharField(max_length=255, default="#FAAF40")
49
50     class Meta:
51         verbose_name = _('Resource category')
52         verbose_name_plural = _('Resource categories')
53         ordering = ['-ordering',]
54
55     objects = translations.TranslatedObjectManager()
56
57     def get_css_class(self):
58         return "resource-cat-%d" % self.pk
59
60     def get_css_def(self):
61         return """
62         .%(cls)s.resource { border-color: %(color)s !important;}
63         .%(cls)s.resource .title { color: %(color)s !important;}
64         .%(cls)s.resource .description { background-color: %(color)s !important;}
65         .%(cls)s.filter-item a { color: %(color)s !important;}
66         """ % dict(cls=self.get_css_class(), color=self.get_color())
67
68     def get_color(self):
69         return "#" + self.color.lstrip("#")
70
71     def __unicode__(self):
72         trans = translations.TranslatedObjectMixin.__unicode__(self)
73         return trans or _('Unnamed resource category')
74
75
76 class ResourceCategoryTranslation(translations.Translation(ResourceCategory)):
77     """
78     Category translation
79     """
80     title = models.CharField(_('category title'), max_length=100)
81     slug = models.SlugField(_('slug'), unique=True)
82     description = models.TextField(_('description'), blank=True)
83
84     class Meta:
85         verbose_name = _('Resource category translation')
86         verbose_name_plural = _('Resource category translations')
87         ordering = ['title']
88
89     def __unicode__(self):
90         return self.title
91
92     def save(self, *args, **kwargs):
93         if not self.slug:
94             self.slug = slugify(self.title)
95
96         super(ResourceCategoryTranslation, self).save(*args, **kwargs)
97
98
99 class Resource(models.Model, translations.TranslatedObjectMixin):
100     is_published = models.BooleanField(default=True)
101     published_on = models.DateTimeField(default=datetime.now)
102
103     ordering = models.SmallIntegerField(_('ordering'), default=0)
104     category = models.ForeignKey(ResourceCategory)
105     media_file = MediaFileForeignKey(MediaFile, null=False, blank=False)
106     filetype = models.CharField(max_length=255, null=True, blank=True,
107                                 default="PDF")
108
109     class Meta:
110         verbose_name = _('Resource')
111         verbose_name_plural = _('Resources')
112         ordering = ['-ordering',]
113
114     objects = translations.TranslatedObjectManager()
115
116     def __unicode__(self):
117         trans = translations.TranslatedObjectMixin.__unicode__(self)
118         return trans or _('Unnamed resource')
119
120     def get_filetype(self):
121         return self.filetype
122
123     def get_html_id(self):
124         return "resource-obj-%d" % self.pk
125
126
127 class ResourceTranslation(translations.Translation(Resource)):
128     """
129     Category translation
130     """
131     title = models.CharField(_('resource title'), max_length=100)
132     slug = models.SlugField(_('slug'), unique=True)
133     description = models.TextField(_('description'), blank=True)
134
135     class Meta:
136         verbose_name = _('Resource translation')
137         verbose_name_plural = _('Resource translations')
138         ordering = ['title']
139
140     def __unicode__(self):
141         return self.title
142
143     def save(self, *args, **kwargs):
144         if not self.slug:
145             self.slug = slugify(self.title)
146
147         super(ResourceTranslation, self).save(*args, **kwargs)
148
149
150
151
152 # Feincms content abstract models
153 class ResourcesList(models.Model):
154     filter_title = models.CharField(max_length=255)
155
156     class Meta:
157         abstract = True
158         verbose_name = _('Resources list')
159         verbose_name_plural = _('Resources lists')
160
161     @property
162     def media(self):
163         return forms.Media(js=(
164                 settings.MEDIA_URL + 'cloudcmsresources/js/resources_list.js',
165             ))
166
167     def render(self, **kwargs):
168         resources = Resource.objects.filter(published_on__lte=datetime.now(),
169                 is_published=True).order_by('-published_on')
170
171         categories = ResourceCategory.objects.filter(display_on_menu=True)
172
173         context = {'resources': resources, 'categories': categories,
174                 'content': self, 'MEDIA_URL': settings.MEDIA_URL}
175         return render_to_string(['content/resources_list.html'], context)
176