Statistics
| Branch: | Tag: | Revision:

root / cloudcms / models.py @ 396cafbb

History | View | Annotate | Download (9.7 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
    show_rss_feed_on_blog = models.BooleanField(default=False)
92
    extra_styles = models.TextField(default="", blank=True)
93
    footer_top = models.TextField(default="", blank=True)
94
    footer_bottom = models.TextField(default="", blank=True)
95
    message_type = models.CharField(max_length=20,
96
                                    choices=MESSAGE_TYPE_CHOICES,
97
                                    default='NM')
98
    custom_message = models.TextField(default="", blank=True)
99

    
100
    @classmethod
101
    def current(cls):
102
        return cls.objects.get(site__pk=settings.SITE_ID)
103

    
104
    def __unicode__(self):
105
        return self.title
106

    
107

    
108
# http://stackoverflow.com/a/2680060/114435
109
dthandler = lambda obj: obj.isoformat() if isinstance(obj, datetime.datetime) else None
110

    
111

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

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

    
127
        return ClientVersions(sources, cache_backend=cache)
128

    
129
    def to_json(self):
130
        return simplejson.dumps(list(self.get_sources().get_latest_versions()),
131
                                default=dthandler)
132

    
133
    def get_default_os(self):
134
        try:
135
            return self.clientversionsource_set.filter(default=True)[0].os
136
        except IndexError:
137
            return self.clientversionsource_set.filter()[0].os
138

    
139
    def __unicode__(self):
140
        return self.name
141

    
142

    
143
class ClientVersionSource(models.Model):
144
    """
145
    Client version source. source_type choices should map to
146
    cloudcms.clients.SOURCE_TYPES.
147
    """
148

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

    
174
    def __unicode__(self):
175
        return "[%s] %s" % (self.get_source_type_display(), self.os)
176

    
177

    
178
# hook for feincms configuration, is this appropriate place ??? who knows
179
from cloudcms.cms import *
180

    
181

    
182
class Service(models.Model, translations.TranslatedObjectMixin):
183
    """
184
    Service.
185
    """
186

    
187
    ordering = models.SmallIntegerField(_('ordering'), default=0)
188
    image_faq = MediaFileForeignKey(MediaFile, blank=True, null=True,
189
                                    related_name='image_faq')
190
    image_userguide = MediaFileForeignKey(MediaFile, blank=True, null=True,
191
                                          related_name='image_userguide')
192
    class_name = models.CharField(_('class name'), max_length=100, blank=True)
193

    
194
    class Meta:
195
        verbose_name = _('service')
196
        verbose_name_plural = _('services')
197
        ordering = ['-ordering', ]
198

    
199
    objects = translations.TranslatedObjectManager()
200

    
201
    def get_first_question(self):
202
        try:
203
            return self.faqs.filter(is_active=True)[0]
204
        except:
205
            return None
206

    
207
    def get_first_entry(self):
208
        try:
209
            return self.userguideentries.filter(is_active=True)[0]
210
        except:
211
            return None
212

    
213
    def __unicode__(self):
214
        trans = translations.TranslatedObjectMixin.__unicode__(self)
215
        return trans or _('Unnamed category')
216

    
217

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

    
232
    class Meta:
233
        verbose_name = _('service translation')
234
        verbose_name_plural = _('service translations')
235
        ordering = ['title']
236

    
237
    def __unicode__(self):
238
        return self.title
239

    
240
    def save(self, *args, **kwargs):
241
        if not self.slug:
242
            self.slug = slugify(self.title)
243

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