Statistics
| Branch: | Tag: | Revision:

root / cloudcmsguide / models.py @ bd9ce789

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 c7c2110e 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
)