Statistics
| Branch: | Tag: | Revision:

root / cloudcmsresources / models.py @ 7fa8ecdf

History | View | Annotate | Download (6 kB)

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