Statistics
| Branch: | Tag: | Revision:

root / cloudcms / models.py @ 67114d6e

History | View | Annotate | Download (9.8 kB)

1
# Copyright 2012 GRNET S.A. All rights reserved.
2
#
3
# Redistribution and use in source and binary forms, with or
4
# without modification, are permitted provided that the following
5
# conditions are met:
6
#
7
#   1. Redistributions of source code must retain the above
8
#      copyright notice, this list of conditions and the following
9
#      disclaimer.
10
#
11
#   2. Redistributions in binary form must reproduce the above
12
#      copyright notice, this list of conditions and the following
13
#      disclaimer in the documentation and/or other materials
14
#      provided with the distribution.
15
#
16
# THIS SOFTWARE IS PROVIDED BY GRNET S.A. ``AS IS'' AND ANY EXPRESS
17
# OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
18
# WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
19
# PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL GRNET S.A OR
20
# CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
21
# SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
22
# LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF
23
# USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED
24
# AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
25
# LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN
26
# ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
27
# POSSIBILITY OF SUCH DAMAGE.
28
#
29
# The views and conclusions contained in the software and
30
# documentation are those of the authors and should not be
31
# interpreted as representing official policies, either expressed
32
# or implied, of GRNET S.A.
33

    
34
import datetime
35

    
36
from django.db import models
37
from django.conf import settings
38
from django.contrib.sites import models as sites_models
39
from django.utils.translation import ugettext_lazy as _, ugettext, ungettext
40
from django.core.cache import cache
41
from django.utils import simplejson
42

    
43
from feincms import translations
44
from feincms.module.medialibrary.fields import MediaFileForeignKey
45
from feincms.module.medialibrary.models import MediaFile
46

    
47

    
48
class Application(models.Model):
49
    """
50
    Application object refers to the application each cms is deployed for.
51

52
    Each cms deployment should contain at least one application object linked
53
    to the site object the cms is deployed for.
54

55
    Enabling cloudcms.context_processors.application in CONTEXT_PROCESSROS
56
    setting let you can access the application object throughout the html
57
    templates.
58
    """
59

    
60
    MESSAGE_TYPE_CHOICES = (
61
        ('NM', 'No Message'),
62
        ('success', 'Success'),
63
        ('error', 'Error'),
64
        ('warning', 'Warning'),
65
        ('info', 'Info'),
66
    )
67

    
68
    code = models.CharField('Identifier', max_length=100, null=False,
69
                            blank=False, help_text="""Just a codename of the
70
                            application, to be used in several places where"
71
                            to be used in several places where no free text is
72
                            allowed (e.g. urls, paths, etc)""")
73
    title = models.CharField(max_length=255, null=False, blank=False,
74
                             help_text="The title of the application")
75

    
76
    logo = MediaFileForeignKey(MediaFile, blank=True, null=True)
77
    favicon = MediaFileForeignKey(MediaFile, blank=True, null=True,
78
                                  related_name="as_favicon")
79
    site = models.ForeignKey(sites_models.Site)
80
    app_url = models.URLField(help_text="""The url of the application UI (not
81
                              the cms)""", verify_exists=False, blank=True,
82
                              null=True)
83
    accounts_url = models.CharField(max_length=255, default="/", blank=True,
84
                                    null=True, help_text="""Tha accounts login
85
                                    page""")
86
    index_url = models.CharField(max_length=255, default="/", blank=False,
87
                                 null=False)
88
    linked_in_username = models.CharField(max_length=255, blank=True)
89
    twitter_username = models.CharField(max_length=255, blank=True)
90
    facebook_username = models.CharField(max_length=255, blank=True)
91

    
92
    show_twitter_feed_on_top = models.BooleanField(default=False)
93
    show_rss_feed_on_blog = models.BooleanField(default=False)
94
    extra_styles = models.TextField(default="", blank=True)
95

    
96
    footer_top = models.TextField(default="", blank=True)
97
    footer_bottom = models.TextField(default="", blank=True)
98

    
99
    message_type = models.CharField(max_length=20,
100
                                    choices=MESSAGE_TYPE_CHOICES,
101
                                    default='NM')
102
    custom_message = models.TextField(default="", blank=True)
103

    
104
    @classmethod
105
    def current(cls):
106
        return cls.objects.get(site__pk=settings.SITE_ID)
107

    
108
    def __unicode__(self):
109
        return self.title
110

    
111

    
112
# http://stackoverflow.com/a/2680060/114435
113
dthandler = lambda obj: obj.isoformat() if isinstance(obj, datetime.datetime) else None
114

    
115

    
116
class Client(models.Model):
117
    """
118
    Model which refers to a service/application client. Client model contains
119
    multiple ClientVersionSource to identify it's version downloads.
120
    """
121
    uid = models.CharField(max_length=255)
122
    name = models.CharField(max_length=255)
123

    
124
    def get_sources(self):
125
        sources = {}
126
        from cloudcms.clients import ClientVersions
127
        for s in self.clientversionsource_set.all():
128
            sources[s.os] = {'type': s.source_type,
129
                             'args': [s.link], 'source': s}
130

    
131
        return ClientVersions(sources, cache_backend=cache)
132

    
133
    def to_json(self):
134
        return simplejson.dumps(list(self.get_sources().get_latest_versions()),
135
                                default=dthandler)
136

    
137
    def get_default_os(self):
138
        try:
139
            return self.clientversionsource_set.filter(default=True)[0].os
140
        except IndexError:
141
            return self.clientversionsource_set.filter()[0].os
142

    
143
    def __unicode__(self):
144
        return self.name
145

    
146

    
147
class ClientVersionSource(models.Model):
148
    """
149
    Client version source. source_type choices should map to
150
    cloudcms.clients.SOURCE_TYPES.
151
    """
152

    
153
    default = models.BooleanField(default=True)
154
    source_type = models.CharField(max_length=60,
155
                                   choices=(('link', 'Link'),
156
                                            ('direct', 'Direct'),
157
                                            ('pithos_xml', 'Pithos XML'),
158
                                            ('url_extract',
159
                                             'Extract url using regex'),
160
                                            ('redmine_files','Redmine files')))
161
    os = models.CharField(max_length=255)
162
    link = models.CharField(max_length=255)
163
    logo = MediaFileForeignKey(MediaFile, blank=True, null=True)
164
    architecture = models.CharField(max_length=255, null=True, blank=True,
165
                                    help_text="""Depending the source type this
166
                                    can be left empty and let source type
167
                                    identify the architecture""")
168
    client = models.ForeignKey(Client)
169
    version_regex = models.CharField(max_length=255, help_text="""Regular
170
                                     expression to match the version of the
171
                                     file based on retrieved source filenames
172
                                     (used in redmine source types)""",
173
                                     null=True, blank=True)
174
    file_regex = models.CharField(max_length=255, help_text="""Return only
175
                                  files that match this expression""",
176
                                  null=True, blank=True)
177

    
178
    def __unicode__(self):
179
        return "[%s] %s" % (self.get_source_type_display(), self.os)
180

    
181

    
182
# hook for feincms configuration, is this appropriate place ??? who knows
183
from cloudcms.cms import *
184

    
185

    
186
class Service(models.Model, translations.TranslatedObjectMixin):
187
    """
188
    Service.
189
    """
190

    
191
    ordering = models.SmallIntegerField(_('ordering'), default=0)
192
    image_faq = MediaFileForeignKey(MediaFile, blank=True, null=True,
193
                                    related_name='image_faq')
194
    image_userguide = MediaFileForeignKey(MediaFile, blank=True, null=True,
195
                                          related_name='image_userguide')
196
    class_name = models.CharField(_('class name'), max_length=100, blank=True)
197

    
198
    class Meta:
199
        verbose_name = _('service')
200
        verbose_name_plural = _('services')
201
        ordering = ['-ordering', ]
202

    
203
    objects = translations.TranslatedObjectManager()
204

    
205
    def get_first_question(self):
206
        try:
207
            return self.faqs.filter(is_active=True)[0]
208
        except:
209
            return None
210

    
211
    def get_first_entry(self):
212
        try:
213
            return self.userguideentries.filter(is_active=True)[0]
214
        except:
215
            return None
216

    
217
    def __unicode__(self):
218
        trans = translations.TranslatedObjectMixin.__unicode__(self)
219
        return trans or _('Unnamed category')
220

    
221

    
222
class ServiceTranslation(translations.Translation(Service)):
223
    """
224
    Service translation
225
    """
226
    title = models.CharField(_('service title'), max_length=100)
227
    slug = models.SlugField(_('slug'), unique=True)
228
    description = models.CharField(_('description'), max_length=250,
229
                                   blank=True)
230
    cms_page = models.ForeignKey(Page, null=True, blank=True)
231
    title_faq = models.CharField(_('service title (faq section)'),
232
                                 max_length=100, blank=True)
233
    title_userguide = models.CharField(_('service title (userguide section)'),
234
                                       max_length=100, blank=True)
235

    
236
    class Meta:
237
        verbose_name = _('service translation')
238
        verbose_name_plural = _('service translations')
239
        ordering = ['title']
240

    
241
    def __unicode__(self):
242
        return self.title
243

    
244
    def save(self, *args, **kwargs):
245
        if not self.slug:
246
            self.slug = slugify(self.title)
247

    
248
        super(ServiceTranslation, self).save(*args, **kwargs)