root / cloudcmsguide / models.py @ 5bd27846
History | View | Annotate | Download (5.4 kB)
1 | b5eefa35 | Kostas Papadimitriou | # Copyright 2012 GRNET S.A. All rights reserved.
|
---|---|---|---|
2 | b5eefa35 | Kostas Papadimitriou | #
|
3 | b5eefa35 | Kostas Papadimitriou | # Redistribution and use in source and binary forms, with or
|
4 | b5eefa35 | Kostas Papadimitriou | # without modification, are permitted provided that the following
|
5 | b5eefa35 | Kostas Papadimitriou | # conditions are met:
|
6 | b5eefa35 | Kostas Papadimitriou | #
|
7 | b5eefa35 | Kostas Papadimitriou | # 1. Redistributions of source code must retain the above
|
8 | b5eefa35 | Kostas Papadimitriou | # copyright notice, this list of conditions and the following
|
9 | b5eefa35 | Kostas Papadimitriou | # disclaimer.
|
10 | b5eefa35 | Kostas Papadimitriou | #
|
11 | b5eefa35 | Kostas Papadimitriou | # 2. Redistributions in binary form must reproduce the above
|
12 | b5eefa35 | Kostas Papadimitriou | # copyright notice, this list of conditions and the following
|
13 | b5eefa35 | Kostas Papadimitriou | # disclaimer in the documentation and/or other materials
|
14 | b5eefa35 | Kostas Papadimitriou | # provided with the distribution.
|
15 | b5eefa35 | Kostas Papadimitriou | #
|
16 | b5eefa35 | Kostas Papadimitriou | # THIS SOFTWARE IS PROVIDED BY GRNET S.A. ``AS IS'' AND ANY EXPRESS
|
17 | b5eefa35 | Kostas Papadimitriou | # OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
|
18 | b5eefa35 | Kostas Papadimitriou | # WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
|
19 | b5eefa35 | Kostas Papadimitriou | # PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL GRNET S.A OR
|
20 | b5eefa35 | Kostas Papadimitriou | # CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
|
21 | b5eefa35 | Kostas Papadimitriou | # SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
|
22 | b5eefa35 | Kostas Papadimitriou | # LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF
|
23 | b5eefa35 | Kostas Papadimitriou | # USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED
|
24 | b5eefa35 | Kostas Papadimitriou | # AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
|
25 | b5eefa35 | Kostas Papadimitriou | # LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN
|
26 | b5eefa35 | Kostas Papadimitriou | # ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
|
27 | b5eefa35 | Kostas Papadimitriou | # POSSIBILITY OF SUCH DAMAGE.
|
28 | b5eefa35 | Kostas Papadimitriou | #
|
29 | b5eefa35 | Kostas Papadimitriou | # The views and conclusions contained in the software and
|
30 | b5eefa35 | Kostas Papadimitriou | # documentation are those of the authors and should not be
|
31 | b5eefa35 | Kostas Papadimitriou | # interpreted as representing official policies, either expressed
|
32 | b5eefa35 | Kostas Papadimitriou | # or implied, of GRNET S.A.
|
33 | b5eefa35 | Kostas Papadimitriou | |
34 | b5eefa35 | Kostas Papadimitriou | |
35 | b5eefa35 | Kostas Papadimitriou | from datetime import datetime |
36 | b5eefa35 | Kostas Papadimitriou | |
37 | b5eefa35 | Kostas Papadimitriou | from django.db import models |
38 | b5eefa35 | Kostas Papadimitriou | from django.conf import settings |
39 | b5eefa35 | Kostas Papadimitriou | from django.contrib.auth.models import User |
40 | b5eefa35 | Kostas Papadimitriou | from django.utils.translation import ugettext_lazy as _, ugettext, ungettext |
41 | b5eefa35 | Kostas Papadimitriou | from django.template.loader import render_to_string |
42 | b5eefa35 | Kostas Papadimitriou | from django.core import urlresolvers |
43 | b5eefa35 | Kostas Papadimitriou | |
44 | b5eefa35 | Kostas Papadimitriou | from feincms import translations |
45 | b5eefa35 | Kostas Papadimitriou | from feincms.models import Base |
46 | b5eefa35 | Kostas Papadimitriou | from feincms.module.page.models import Page |
47 | b5eefa35 | Kostas Papadimitriou | from feincms.content.application.models import reverse |
48 | b5eefa35 | Kostas Papadimitriou | from feincms.content.richtext.models import RichTextContent |
49 | b5eefa35 | Kostas Papadimitriou | from feincms.content.section.models import SectionContent |
50 | b5eefa35 | Kostas Papadimitriou | from feincms.module.medialibrary.fields import MediaFileForeignKey |
51 | b5eefa35 | Kostas Papadimitriou | from feincms.module.medialibrary.models import MediaFile |
52 | b5eefa35 | Kostas Papadimitriou | from feincms.module.page.extensions.navigation import NavigationExtension |
53 | b5eefa35 | Kostas Papadimitriou | from feincms.module.page.extensions.navigation import PagePretender |
54 | b5eefa35 | Kostas Papadimitriou | from feincms.content.application.models import ApplicationContent |
55 | b5eefa35 | Kostas Papadimitriou | from feincms.models import Base, create_base_model |
56 | b5eefa35 | Kostas Papadimitriou | |
57 | b5eefa35 | Kostas Papadimitriou | from cloudcms.cms_utils import get_app_page |
58 | b5eefa35 | Kostas Papadimitriou | |
59 | b5eefa35 | Kostas Papadimitriou | class UserGuideEntryManager(models.Manager): |
60 | b5eefa35 | Kostas Papadimitriou | |
61 | b5eefa35 | Kostas Papadimitriou | def active(self): |
62 | b5eefa35 | Kostas Papadimitriou | return self.filter(is_active=True) |
63 | b5eefa35 | Kostas Papadimitriou | |
64 | b5eefa35 | Kostas Papadimitriou | def latest(self, limit=3): |
65 | b5eefa35 | Kostas Papadimitriou | return self.filter()[:limit] |
66 | b5eefa35 | Kostas Papadimitriou | |
67 | b5eefa35 | Kostas Papadimitriou | |
68 | b5eefa35 | Kostas Papadimitriou | def get_guide_page(): |
69 | b5eefa35 | Kostas Papadimitriou | """
|
70 | b5eefa35 | Kostas Papadimitriou | Returns Page model that has been associated with userguide application
|
71 | b5eefa35 | Kostas Papadimitriou | """
|
72 | b5eefa35 | Kostas Papadimitriou | return get_app_page(Page, "cloudcmsguide") |
73 | b5eefa35 | Kostas Papadimitriou | |
74 | b5eefa35 | Kostas Papadimitriou | |
75 | b5eefa35 | Kostas Papadimitriou | try:
|
76 | b5eefa35 | Kostas Papadimitriou | # MPTT 0.4
|
77 | b5eefa35 | Kostas Papadimitriou | from mptt.models import MPTTModel |
78 | b5eefa35 | Kostas Papadimitriou | mptt_register = False
|
79 | b5eefa35 | Kostas Papadimitriou | Base = create_base_model(MPTTModel) |
80 | b5eefa35 | Kostas Papadimitriou | except ImportError: |
81 | b5eefa35 | Kostas Papadimitriou | # MPTT 0.3
|
82 | b5eefa35 | Kostas Papadimitriou | mptt_register = True
|
83 | b5eefa35 | Kostas Papadimitriou | |
84 | b5eefa35 | Kostas Papadimitriou | class UserGuideEntry(Base): |
85 | b5eefa35 | Kostas Papadimitriou | """
|
86 | b5eefa35 | Kostas Papadimitriou | User guide entry
|
87 | b5eefa35 | Kostas Papadimitriou | """
|
88 | b5eefa35 | Kostas Papadimitriou | is_active = models.BooleanField(_('is active'), default=True) |
89 | b5eefa35 | Kostas Papadimitriou | is_featured = models.BooleanField(_('is featured'), default=False) |
90 | b5eefa35 | Kostas Papadimitriou | |
91 | b5eefa35 | Kostas Papadimitriou | title = models.CharField(_('title'), max_length=100) |
92 | b5eefa35 | Kostas Papadimitriou | slug = models.SlugField(_('slug'), max_length=100, unique_for_date='published_on') |
93 | b5eefa35 | Kostas Papadimitriou | author = models.ForeignKey(User, related_name='guide_pages', verbose_name=_('author')) |
94 | b5eefa35 | Kostas Papadimitriou | language = models.CharField(max_length=255, choices=settings.LANGUAGES)
|
95 | b5eefa35 | Kostas Papadimitriou | |
96 | 5bd27846 | Olga Brani | published_on = models.DateTimeField(_('published on'), blank=True, null=False, default=datetime.now, |
97 | b5eefa35 | Kostas Papadimitriou | help_text=_('Will be filled in automatically when entry gets published.'))
|
98 | b5eefa35 | Kostas Papadimitriou | last_changed = models.DateTimeField(_('last change'), auto_now=True, editable=False) |
99 | b5eefa35 | Kostas Papadimitriou | |
100 | b5eefa35 | Kostas Papadimitriou | service = models.ForeignKey('cloudcms.Service', verbose_name=_('service'), |
101 | b5eefa35 | Kostas Papadimitriou | related_name='userguideentries', null=True, blank=False) |
102 | b5eefa35 | Kostas Papadimitriou | |
103 | b5eefa35 | Kostas Papadimitriou | parent = models.ForeignKey('self', verbose_name=_('Parent'), blank=True, null=True, related_name='children') |
104 | b5eefa35 | Kostas Papadimitriou | |
105 | b5eefa35 | Kostas Papadimitriou | objects = UserGuideEntryManager() |
106 | b5eefa35 | Kostas Papadimitriou | |
107 | b5eefa35 | Kostas Papadimitriou | class Meta: |
108 | b5eefa35 | Kostas Papadimitriou | get_latest_by = 'published_on'
|
109 | b5eefa35 | Kostas Papadimitriou | ordering = ['service', '-published_on'] |
110 | b5eefa35 | Kostas Papadimitriou | verbose_name = _('User guide entry')
|
111 | b5eefa35 | Kostas Papadimitriou | verbose_name_plural = _('User guide entries')
|
112 | b5eefa35 | Kostas Papadimitriou | |
113 | b5eefa35 | Kostas Papadimitriou | def __unicode__(self): |
114 | b5eefa35 | Kostas Papadimitriou | return self.title |
115 | 5bd27846 | Olga Brani | |
116 | 5bd27846 | Olga Brani | def get_next(self): |
117 | 5bd27846 | Olga Brani | return self.get_next_by_published_on(service=self.service) |
118 | 5bd27846 | Olga Brani | |
119 | 5bd27846 | Olga Brani | def get_previous(self): |
120 | 5bd27846 | Olga Brani | return self.get_previous_by_published_on(service=self.service) |
121 | b5eefa35 | Kostas Papadimitriou | |
122 | b5eefa35 | Kostas Papadimitriou | def get_absolute_url(self): |
123 | b5eefa35 | Kostas Papadimitriou | try:
|
124 | b5eefa35 | Kostas Papadimitriou | r = reverse('cloudcmsguide_entry_detail', 'cloudcmsguide.urls', (), |
125 | b5eefa35 | Kostas Papadimitriou | { |
126 | b5eefa35 | Kostas Papadimitriou | 'service': self.service.translation.slug, |
127 | b5eefa35 | Kostas Papadimitriou | 'slug': self.slug, |
128 | b5eefa35 | Kostas Papadimitriou | }) |
129 | b5eefa35 | Kostas Papadimitriou | except Exception, e: |
130 | b5eefa35 | Kostas Papadimitriou | print e
|
131 | b5eefa35 | Kostas Papadimitriou | return "" |
132 | b5eefa35 | Kostas Papadimitriou | |
133 | b5eefa35 | Kostas Papadimitriou | # ugly hack to fix proper application reverse url
|
134 | b5eefa35 | Kostas Papadimitriou | GUIDE_URL = ""
|
135 | b5eefa35 | Kostas Papadimitriou | try:
|
136 | b5eefa35 | Kostas Papadimitriou | GUIDE_URL = get_guide_page().get_navigation_url() |
137 | b5eefa35 | Kostas Papadimitriou | except Exception, e: |
138 | b5eefa35 | Kostas Papadimitriou | pass
|
139 | b5eefa35 | Kostas Papadimitriou | |
140 | b5eefa35 | Kostas Papadimitriou | if r.startswith(GUIDE_URL):
|
141 | b5eefa35 | Kostas Papadimitriou | return r
|
142 | b5eefa35 | Kostas Papadimitriou | else:
|
143 | b5eefa35 | Kostas Papadimitriou | return GUIDE_URL + r.lstrip('/') |
144 | b5eefa35 | Kostas Papadimitriou | |
145 | b5eefa35 | Kostas Papadimitriou | def back_url(self): |
146 | b5eefa35 | Kostas Papadimitriou | return get_guide_page().get_navigation_url()
|
147 | b5eefa35 | Kostas Papadimitriou | |
148 | b5eefa35 | Kostas Papadimitriou | if mptt_register: # MPTT 0.3 legacy support |
149 | b5eefa35 | Kostas Papadimitriou | mptt.register(Page) |
150 | b5eefa35 | Kostas Papadimitriou | |
151 | b5eefa35 | Kostas Papadimitriou | UserGuideEntry.register_extensions( |
152 | b5eefa35 | Kostas Papadimitriou | 'changedate',
|
153 | b5eefa35 | Kostas Papadimitriou | 'seo'
|
154 | b5eefa35 | Kostas Papadimitriou | ) |