1 from datetime import datetime
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
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
23 from cloudcms.models import Application
24 from cloudcms.cms_utils import get_app_page
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
38 from cloudcms.models import Application
39 from cloudcms.cms_utils import get_app_page
41 # monkeypatch django reverse (feincms 1.5+ solves this issue)
42 urlresolvers.reverse = reverse
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")
51 verbose_name = _('Resource category')
52 verbose_name_plural = _('Resource categories')
53 ordering = ['-ordering',]
55 objects = translations.TranslatedObjectManager()
57 def get_css_class(self):
58 return "resource-cat-%d" % self.pk
60 def get_css_def(self):
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())
69 return "#" + self.color.lstrip("#")
71 def __unicode__(self):
72 trans = translations.TranslatedObjectMixin.__unicode__(self)
73 return trans or _('Unnamed resource category')
76 class ResourceCategoryTranslation(translations.Translation(ResourceCategory)):
80 title = models.CharField(_('category title'), max_length=100)
81 slug = models.SlugField(_('slug'), unique=True)
82 description = models.TextField(_('description'), blank=True)
85 verbose_name = _('Resource category translation')
86 verbose_name_plural = _('Resource category translations')
89 def __unicode__(self):
92 def save(self, *args, **kwargs):
94 self.slug = slugify(self.title)
96 super(ResourceCategoryTranslation, self).save(*args, **kwargs)
99 class Resource(models.Model, translations.TranslatedObjectMixin):
100 is_published = models.BooleanField(default=True)
101 published_on = models.DateTimeField(default=datetime.now)
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,
110 verbose_name = _('Resource')
111 verbose_name_plural = _('Resources')
112 ordering = ['-ordering',]
114 objects = translations.TranslatedObjectManager()
116 def __unicode__(self):
117 trans = translations.TranslatedObjectMixin.__unicode__(self)
118 return trans or _('Unnamed resource')
120 def get_filetype(self):
123 def get_html_id(self):
124 return "resource-obj-%d" % self.pk
127 class ResourceTranslation(translations.Translation(Resource)):
131 title = models.CharField(_('resource title'), max_length=100)
132 slug = models.SlugField(_('slug'), unique=True)
133 description = models.TextField(_('description'), blank=True)
136 verbose_name = _('Resource translation')
137 verbose_name_plural = _('Resource translations')
140 def __unicode__(self):
143 def save(self, *args, **kwargs):
145 self.slug = slugify(self.title)
147 super(ResourceTranslation, self).save(*args, **kwargs)
152 # Feincms content abstract models
153 class ResourcesList(models.Model):
154 filter_title = models.CharField(max_length=255)
158 verbose_name = _('Resources list')
159 verbose_name_plural = _('Resources lists')
163 return forms.Media(js=(
164 settings.MEDIA_URL + 'cloudcmsresources/js/resources_list.js',
167 def render(self, **kwargs):
168 resources = Resource.objects.filter(published_on__lte=datetime.now(),
169 is_published=True).order_by('-published_on')
171 categories = ResourceCategory.objects.filter(display_on_menu=True)
173 context = {'resources': resources, 'categories': categories,
174 'content': self, 'MEDIA_URL': settings.MEDIA_URL}
175 return render_to_string(['content/resources_list.html'], context)