1 # Copyright 2012 GRNET S.A. All rights reserved.
3 # Redistribution and use in source and binary forms, with or
4 # without modification, are permitted provided that the following
7 # 1. Redistributions of source code must retain the above
8 # copyright notice, this list of conditions and the following
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.
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.
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.
35 from django.contrib.markup.templatetags.markup import textile
36 from django.db import models
37 from django import forms
38 from django.conf import settings
39 from django.utils.translation import ugettext_lazy as _
40 from django.template.loader import render_to_string
41 from django.utils import simplejson
42 from django.utils.html import mark_safe
44 from feincms.admin.editor import ItemEditorForm
45 from feincms.module.page.models import Page
46 from feincms.module.medialibrary.models import MediaFile
47 from feincms.content.medialibrary.models import MediaFileWidget
48 from feincms.module.medialibrary.fields import MediaFileForeignKey
51 TWITTER_LOAD_CODE = getattr(settings, 'CLOUDCMS_TWITTER_LOAD_CODE',
52 """!function(d,s,id){var js,fjs=d.getElementsByTagName(s)[0],p=/^http:/.test(d.location)?'http':'https';if(!d.getElementById(id)){js=d.createElement(s);js.id=id;js.src=p+"://platform.twitter.com/widgets.js";fjs.parentNode.insertBefore(js,fjs);}}(document,"script","twitter-wjs");""")
54 class VideoSection(models.Model):
55 section_title = models.CharField(max_length=200, blank=True)
56 video_title = models.CharField(max_length=200, blank=True)
57 video_link = models.CharField(max_length=200, blank=True)
58 video_width = models.PositiveIntegerField(default=700)
59 video_height = models.PositiveIntegerField(default=550)
60 image = MediaFileForeignKey(MediaFile, blank=True, null=True,
61 related_name="as_image_for_video_section")
62 image_hover = MediaFileForeignKey(MediaFile, blank=True, null=True,
63 related_name="as_hover_for_video_section")
64 alt_text = models.TextField(null=True, blank=True)
65 extra_url_params = models.CharField(max_length=200, blank=True)
69 verbose_name = _('video section')
70 verbose_name_plural = _('video sections')
72 def render(self, **kwargs):
73 return render_to_string(['content/videosection.html'], {'content': self})
76 TWITTER_HELP_DESC = mark_safe("""
78 href="https://dev.twitter.com/docs/embedded-timelines">embedded timelines
82 class TwitterFeed(models.Model):
83 title = models.CharField(max_length=200, blank=True)
84 widget_id = models.CharField(max_length=200, blank=True,
85 help_text= mark_safe(_("""
87 <a href=https://twitter.com/settings/widgets>Twitter widgets</a>
90 limit = models.PositiveIntegerField(default=10,
91 help_text="Number of tweets to be displayed")
92 theme = models.CharField(max_length=200, blank=True, default="light",
93 help_text=TWITTER_HELP_DESC)
94 link_color = models.CharField(max_length=200, blank=True, default="#F89A1C",
95 help_text=TWITTER_HELP_DESC)
96 chrome = models.CharField(max_length=200, blank=True, default="noscrollbar nofooter noheader noborders",
97 help_text=TWITTER_HELP_DESC)
98 screen_name = models.CharField(max_length=200, blank=True,
99 help_text=TWITTER_HELP_DESC)
100 custom_timeline_id = models.CharField(max_length=200, blank=True,
101 help_text=TWITTER_HELP_DESC)
102 favorites_screen_name = models.CharField(max_length=200, blank=True,
103 help_text=TWITTER_HELP_DESC)
104 list_owner_screen_name = models.CharField(max_length=200, blank=True,
105 help_text=TWITTER_HELP_DESC)
106 list_slug = models.CharField(max_length=200, blank=True,
107 help_text=TWITTER_HELP_DESC)
108 aria_politeness = models.CharField(max_length=200, blank=True,
109 help_text=TWITTER_HELP_DESC)
110 border_color = models.CharField(max_length=200, blank=True,
111 help_text=TWITTER_HELP_DESC)
112 height = models.CharField(max_length=200, blank=True,
113 help_text=TWITTER_HELP_DESC)
114 extra_attributes = models.TextField(blank=True,
115 help_text="Extra code to be applied within the html element")
117 code = models.TextField(blank=True,
118 help_text="Twitter loading code. "
119 "Leave empty for default javascript code to be used.")
123 verbose_name = _('twitter feed')
124 verbose_name_plural = _('twitter feeds')
126 def render(self, **kwargs):
127 return render_to_string(['content/twitter_feed.html'], {
129 'load_code': self.code if self.code else "<script>%s</script>" % (TWITTER_LOAD_CODE)
133 class AboutBlock(models.Model):
135 title = models.CharField(max_length=200, blank=False)
136 content = models.TextField(blank=False)
137 image = MediaFileForeignKey(MediaFile, blank=True, null=True)
138 image_position = models.CharField(max_length=200,
139 choices=(('top', 'Top'), ('left', 'Left'), ('right', 'Right')))
140 color = models.CharField(max_length=200, blank=False)
141 offset_left = models.IntegerField(null=True, blank=True)
142 offset_top = models.IntegerField(null=True, blank=True)
146 verbose_name = _('about page block')
147 verbose_name_plural = _('about page blocks')
149 def render(self, **kwargs):
150 return render_to_string(['content/about_block.html'], {'content': self})
153 class LoginForm(models.Model):
158 title = models.CharField(_('title'), max_length=200, blank=False)
159 action_url = models.CharField(_('im url'), max_length=100, blank=False)
160 display_forgot_password = models.BooleanField(default=False, null=False)
161 next_url = models.CharField(max_length=255, null=True, blank=True)
162 bottom_content = models.TextField(blank=True)
163 logged_in_content = models.TextField(blank=True)
167 verbose_name = _('login form')
168 verbose_name_plural = _('login forms')
170 def render(self, **kwargs):
171 return render_to_string(['content/login_form.html'], {'content': self})
174 class IntroButton(models.Model):
178 verbose_name = _('intro images')
179 verbose_name_plural = _('intro images')
181 image_1 = MediaFileForeignKey(MediaFile, blank=True, null=True,
182 related_name="as_image1")
183 image_2 = MediaFileForeignKey(MediaFile, blank=True, null=True,
184 related_name="as_image2")
185 image_3 = MediaFileForeignKey(MediaFile, blank=True, null=True,
186 related_name="as_image3")
187 link = models.CharField(max_length=255, blank=False, default="/welcome")
188 link_title = models.CharField(max_length=255, blank=False, default="~okeanos")
190 def render(self, **kwargs):
191 return render_to_string(['content/intro_images.html'], {'content': self})
195 class TextileContent(models.Model):
196 content = models.TextField()
201 def render(self, **kwargs):
202 return textile(self.content)
204 class IntroBlock(models.Model):
205 title = models.CharField(_('title'), max_length=200, blank=False)
206 content = models.TextField()
207 class_name = models.CharField(_('class_name'), max_length=200, blank=True, null=True)
208 image = MediaFileForeignKey(MediaFile, blank=True, null=True)
213 def render(self, **kwargs):
214 return render_to_string(['content/intro_block.html'], {'content': self})
217 class BlockColor(models.Model):
218 title = models.CharField(_('title'), max_length=200, blank=False)
219 content = models.TextField()
220 color = models.CharField(max_length=200, blank=True, null=True)
221 image = MediaFileForeignKey(MediaFile, blank=True, null=True)
226 def render(self, **kwargs):
227 return render_to_string(['content/block_with_color.html'], {'content': self})
230 class ClientDownload(models.Model):
232 client = models.ForeignKey('cloudcms.Client')
236 return forms.Media(js=(
237 settings.MEDIA_URL + 'cloudcms/' + 'js/' + 'client-downloads.js',))
241 verbose_name = _('client download')
242 verbose_name_plural = _('client downloads')
244 def render(self, **kwrags):
245 return render_to_string(['content/client_downloads.html'], {'content': self})
248 class StatsBlock(models.Model):
252 return forms.Media(js=(
253 settings.MEDIA_URL + 'cloudcms/' + 'js/' + 'service-stats.js',))
255 title = models.CharField(_('title'), max_length=200, blank=True)
256 color = models.CharField(max_length=200, blank=True, null=True)
257 running_vms = models.BooleanField(default=False, help_text = "ACTIVE VMs")
258 spawned_vms = models.BooleanField(default=True, help_text= "All VMs")
259 active_vms = models.BooleanField(default=True, help_text ="All VMs - \
261 running_networks = models.BooleanField(default=False, help_text = "ACTIVE \
263 spawned_networks = models.BooleanField(default=True,help_text= "All \
265 active_networks = models.BooleanField(default=False, help_text ="All \
266 Networks - DELETED Networks")
267 title_running_vms = models.CharField(max_length=255,blank=True, null=True)
268 title_spawned_vms = models.CharField(max_length=255,blank=True, null=True)
269 title_active_vms = models.CharField(max_length=255,blank=True, null=True)
270 title_running_networks = models.CharField(max_length=255,blank=True, null=True)
271 title_spawned_networks = models.CharField(max_length=255,blank=True, null=True)
272 title_active_networks = models.CharField(max_length=255,blank=True, null=True)
273 compute_url = models.CharField(max_length=255,blank=True, null=True)
278 def render(self, **kwargs):
279 return render_to_string(['content/stats_block.html'], {'content': self})
281 class IntroVideo(models.Model):
285 return forms.Media(js=(
286 settings.MEDIA_URL + 'cloudcms/' + 'js/' + 'youtube.js',))
288 image = MediaFileForeignKey(MediaFile, blank=True, null=True)
289 youtube_id = models.CharField(max_length=255,blank=True, null=True)
294 def render(self, **kwargs):
295 return render_to_string(['content/intro_video.html'], {'content': self})