# HG changeset patch # User grandjoncl # Date 1360849340 -3600 # Node ID f3ba7e0bed68afc4e4b2c9c4e4dc74e5ac2652a1 # Parent 5a91860c5535371216adc2a0081759406d9eff2b simplification of code to create forms and objects that don't depend on the language entered in the settings.py page to create partners modification of event to be able to add organisators and partners diff -r 5a91860c5535 -r f3ba7e0bed68 src/polemictweet/admin.py --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/src/polemictweet/admin.py Thu Feb 14 14:42:20 2013 +0100 @@ -0,0 +1,9 @@ +from django.contrib import admin +from polemictweet.models import Event, Live, Content, Partner, Group, Organisator + +admin.site.register(Event) +admin.site.register(Live) +admin.site.register(Content) +admin.site.register(Partner) +admin.site.register(Group) +admin.site.register(Organisator) \ No newline at end of file diff -r 5a91860c5535 -r f3ba7e0bed68 src/polemictweet/forms.py --- a/src/polemictweet/forms.py Fri Feb 08 18:00:04 2013 +0100 +++ b/src/polemictweet/forms.py Thu Feb 14 14:42:20 2013 +0100 @@ -1,13 +1,16 @@ from django import forms from django.conf import settings -from django.utils.translation import ugettext_lazy as _ +from django.utils.translation import ugettext_lazy as _, get_language from models import Event, Group, Live, Content, Group, Partner from polemictweet.utils.unique_slug import unique_slugify -import logging +from polemictweet.utils.translate_language import get_translation_languages +class ModelMultipleChoiceFieldPartner(forms.ModelMultipleChoiceField): + def label_from_instance(self, obj): + return "%s" % obj.name + class EventForm(forms.ModelForm): title = forms.CharField(required=True, label=_('event.title')) - title_en = forms.CharField(required=False, label=_('event.title')) group = forms.ModelMultipleChoiceField(Group.objects.all(), widget=forms.HiddenInput, required=False) description = forms.CharField(widget=forms.Textarea, required=False, label=_('event.description')) program = forms.CharField(widget=forms.Textarea, required=False, label=_('event.program')) @@ -19,6 +22,17 @@ event_image = forms.ImageField(required=False, label=_("event.event_image")) event_logo = forms.ImageField(required=False, label=_("event.event_logo")) + def __init__(self, *args, **kwargs): + super(EventForm, self).__init__(*args, **kwargs) + translation_languages = get_translation_languages() + for lang in translation_languages: + # generate extra fields in the number specified via extra_fields + self.fields['title_{lang}'.format(lang=lang)] = forms.CharField(required=False, label=_('event.title_{lang}'.format(lang=lang))) + self.fields['program_{lang}'.format(lang=lang)] = forms.CharField(widget=forms.Textarea, required=False, label=_('event.program_{lang}'.format(lang=lang))) + self.fields['description_{lang}'.format(lang=lang)] = forms.CharField(widget=forms.Textarea, required=False, label=_('event.description_{lang}'.format(lang=lang))) + self.fields['event_image_{lang}'.format(lang=lang)] = forms.ImageField(required=False, label=_('event.event_image_{lang}'.format(lang=lang))) + + def clean_event_image(self): event_image = self.cleaned_data['event_image'] @@ -57,12 +71,29 @@ def clean(self): super(EventForm, self).clean() + + default_language = settings.LANGUAGES[0][0] + current_language = get_language().split("-")[0] + if current_language!=default_language : + default_key_title = 'title_'+default_language + default_key_program = 'program_'+default_language + default_key_description = 'description_'+default_language + default_key_event_image='event_image_'+default_language + + if self.cleaned_data[default_key_title] is None or self.cleaned_data[default_key_title]=='': + self.cleaned_data[default_key_title]=self.cleaned_data.get('title') + if self.cleaned_data[default_key_program] is None or self.cleaned_data[default_key_program]=='': + self.cleaned_data[default_key_program]=self.cleaned_data.get('program') + if self.cleaned_data[default_key_description] is None or self.cleaned_data[default_key_description]=='': + self.cleaned_data[default_key_description]=self.cleaned_data.get('description') + if self.cleaned_data[default_key_event_image] is None or self.cleaned_data[default_key_event_image]=='': + self.cleaned_data[default_key_event_image]=self.cleaned_data.get('event_image') cleaned_data = self.cleaned_data return cleaned_data class Meta: model = Event - exclude = ("creator_id") + exclude = ("creator_id, partners") class LiveAddForm(forms.ModelForm): provider = forms.CharField(required = False, initial ='rtmp', label=_('live.provider')) @@ -81,7 +112,34 @@ display = forms.CharField(required = False, label=_('content.display')) program = forms.CharField(widget = forms.Textarea, required = False, label=_('content.program')) url = forms.CharField(required = False, label=_('content.url')) + id = forms.IntegerField(required = False, widget=forms.HiddenInput, label=_("content.id") ) + def __init__(self, *args, **kwargs): + super(ContentAddForm, self).__init__(*args, **kwargs) + + translation_languages = get_translation_languages() + + for lang in translation_languages: + # generate extra fields in the different languages + self.fields['display_{lang}'.format(lang=lang)] = forms.CharField(required=False, label=_('live.title_{lang}'.format(lang=lang))) + self.fields['program_{lang}'.format(lang=lang)] = forms.CharField(required=False, label=_('live.program_{lang}'.format(lang=lang))) + + def clean(self): + super(ContentAddForm, self).clean() + + default_language = settings.LANGUAGES[0][0] + current_language = get_language().split("-")[0] + if current_language!=default_language : + default_key_display = 'display_'+default_language + default_key_program = 'program_'+default_language + + if self.cleaned_data[default_key_display]=='': + self.cleaned_data[default_key_display]=self.cleaned_data.get('display') + if self.cleaned_data[default_key_program]=='': + self.cleaned_data[default_key_program]=self.cleaned_data.get('program') + cleaned_data = self.cleaned_data + return cleaned_data + class Meta: model = Content exclude = ("events") @@ -97,6 +155,16 @@ events = ModelMultipleChoiceFieldEvent(Event.objects.all(), required=False, label=_("group.events")) slug = forms.SlugField(required = False, widget=forms.HiddenInput, label=_('group.slug')) + def __init__(self, *args, **kwargs): + super(GroupForm, self).__init__(*args, **kwargs) + + translation_languages = get_translation_languages() + + for lang in translation_languages: + # generate extra fields in the different languages + self.fields['title_{lang}'.format(lang=lang)] = forms.CharField(required=False, label=_('group.title_{lang}'.format(lang=lang))) + self.fields['description_{lang}'.format(lang=lang)] = forms.CharField(required=False, label=_('group.description_{lang}'.format(lang=lang))) + def clean_image(self): image = self.cleaned_data['image'] @@ -112,5 +180,29 @@ slug = unique_slugify(self, slug_str) return slug + def clean(self): + super(GroupForm, self).clean() + + default_language = settings.LANGUAGES[0][0] + default_key_title = 'title_'+default_language + default_key_description = 'description_'+default_language + current_language = get_language().split("-")[0] + if current_language!=default_language : + if self.cleaned_data[default_key_title]=='': + self.cleaned_data[default_key_title]=self.cleaned_data.get('title') + if self.cleaned_data[default_key_description]=='': + self.cleaned_data[default_key_description]=self.cleaned_data.get('description') + cleaned_data = self.cleaned_data + return cleaned_data + class Meta: - model = Group \ No newline at end of file + model = Group + +class PartnerForm(forms.ModelForm): + name = forms.CharField(required=True, label=_('partner.name')) + url = forms.CharField(required=True, label=_('partner.url')) + partner_image = forms.ImageField(required=False, label=_("partner.image")) + + class Meta: + model = Partner + \ No newline at end of file diff -r 5a91860c5535 -r f3ba7e0bed68 src/polemictweet/models.py --- a/src/polemictweet/models.py Fri Feb 08 18:00:04 2013 +0100 +++ b/src/polemictweet/models.py Thu Feb 14 14:42:20 2013 +0100 @@ -4,7 +4,19 @@ from django.contrib.auth.models import User from polemictweet.utils.unique_slug import unique_slugify from sorl.thumbnail import ImageField -import logging + +class Partner(models.Model): + name = models.CharField(max_length=1024, verbose_name=_('partner.name')) + url = models.CharField(max_length=1024, verbose_name=_('partner.url')) + partner_image = ImageField(upload_to="thumbnails/partner/", max_length=200) + + def __unicode__(self): + return self.name + +class Organisator(models.Model): + event = models.ForeignKey('Event', verbose_name=_('organisator.event')) + partner = models.ForeignKey('Partner', verbose_name=_('organisator.partner')) + orga = models.BooleanField(default = False, verbose_name=_('organisator.orga')) class Event(models.Model): @@ -26,12 +38,16 @@ creator = models.ForeignKey(User, blank=True, null=True, verbose_name=_('event.creator')) event_image = ImageField(upload_to="thumbnails/event/", max_length=200) event_logo = ImageField(upload_to="thumbnails/logo/", max_length=200) + partners = models.ManyToManyField(Partner, through='Organisator', verbose_name=_('event.partners')) def save(self, *args, **kwargs): if not self.slug or self.slug == "" : slug_str = "%s" % (self.title) self.slug = unique_slugify(self, slug_str) super(Event, self).save(*args, **kwargs) + + def __unicode__(self): + return self.slug class Live(models.Model): TYPE_CHOICES = ( @@ -65,6 +81,7 @@ live.save() return live + class Content(models.Model): display = models.CharField(max_length=1024, null=True, blank=True, verbose_name=_('content.display')) program = models.TextField(null=True, blank=True, verbose_name=_('content.program')) @@ -72,15 +89,25 @@ events = models.ManyToManyField(Event) @staticmethod - def create_content(display, program, url, events): - content = Content(display = display, program=program, url=url) - content.display_fr = display - content.program_fr = program - content.save() - for event in events: - content.events.add(event) + def create_or_change_content(data, events): + + if data['id'] is not None : + content = Content.objects.get(id=int(data['id'])) + else : + content = Content(display = data['display'], program=data['program'], url=data['url']) + content.save() + for event in events: + content.events.add(event) + + for field,value in data.items(): + if field!='id': + setattr(content, field, value) content.save() + return content + + def __unicode__(self): + return self.display class Group(models.Model): title = models.CharField(max_length=1024, null=True, blank=True, verbose_name=_('group.title')) @@ -94,16 +121,10 @@ slug_str = "%s" % (self.title) self.slug = unique_slugify(self, slug_str) super(Group, self).save(*args, **kwargs) + + def __unicode__(self): + return self.slug -class Partner(models.Model): - name = models.CharField(max_length=1024, verbose_name=_('partner.name')) - url = models.CharField(max_length=1024, verbose_name=_('partner.url')) - partner_image = ImageField(upload_to="thumbnails/partner/", max_length=200) - -class Organisator(models.Model): - event = models.ForeignKey('Event', verbose_name=_('organisator.event')) - partner = models.ForeignKey('Partner', verbose_name=_('organisator.partner')) - orga = models.BooleanField(verbose_name=_('organisator.orga')) diff -r 5a91860c5535 -r f3ba7e0bed68 src/polemictweet/static/css/blueprint/ie.css --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/src/polemictweet/static/css/blueprint/ie.css Thu Feb 14 14:42:20 2013 +0100 @@ -0,0 +1,35 @@ +/* ----------------------------------------------------------------------- + + + Blueprint CSS Framework 0.9 + http://blueprintcss.org + + * Copyright (c) 2007-Present. See LICENSE for more info. + * See README for instructions on how to use Blueprint. + * For credits and origins, see AUTHORS. + * This is a compressed file. See the sources in the 'src' directory. + +----------------------------------------------------------------------- */ + +/* ie.css */ +body {text-align:center;} +.container {text-align:left;} +* html .column, * html .span-1, * html .span-2, * html .span-3, * html .span-4, * html .span-5, * html .span-6, * html .span-7, * html .span-8, * html .span-9, * html .span-10, * html .span-11, * html .span-12, * html .span-13, * html .span-14, * html .span-15, * html .span-16, * html .span-17, * html .span-18, * html .span-19, * html .span-20, * html .span-21, * html .span-22, * html .span-23, * html .span-24 {display:inline;overflow-x:hidden;} +* html legend {margin:0px -8px 16px 0;padding:0;} +sup {vertical-align:text-top;} +sub {vertical-align:text-bottom;} +html>body p code {*white-space:normal;} +hr {margin:-8px auto 11px;} +img {-ms-interpolation-mode:bicubic;} +.clearfix, .container {display:inline-block;} +* html .clearfix, * html .container {height:1%;} +fieldset {padding-top:0;} +textarea {overflow:auto;} +input.text, input.title, textarea {background-color:#fff;border:1px solid #bbb;} +input.text:focus, input.title:focus {border-color:#666;} +input.text, input.title, textarea, select {margin:0.5em 0;} +input.checkbox, input.radio {position:relative;top:.25em;} +form.inline div, form.inline p {vertical-align:middle;} +form.inline label {position:relative;top:-0.25em;} +form.inline input.checkbox, form.inline input.radio, form.inline input.button, form.inline button {margin:0.5em 0;} +button, input.button {position:relative;top:0.25em;} \ No newline at end of file diff -r 5a91860c5535 -r f3ba7e0bed68 src/polemictweet/static/css/blueprint/plugins/buttons/icons/cross.png Binary file src/polemictweet/static/css/blueprint/plugins/buttons/icons/cross.png has changed diff -r 5a91860c5535 -r f3ba7e0bed68 src/polemictweet/static/css/blueprint/plugins/buttons/icons/key.png Binary file src/polemictweet/static/css/blueprint/plugins/buttons/icons/key.png has changed diff -r 5a91860c5535 -r f3ba7e0bed68 src/polemictweet/static/css/blueprint/plugins/buttons/icons/tick.png Binary file src/polemictweet/static/css/blueprint/plugins/buttons/icons/tick.png has changed diff -r 5a91860c5535 -r f3ba7e0bed68 src/polemictweet/static/css/blueprint/plugins/buttons/readme.txt --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/src/polemictweet/static/css/blueprint/plugins/buttons/readme.txt Thu Feb 14 14:42:20 2013 +0100 @@ -0,0 +1,32 @@ +Buttons + +* Gives you great looking CSS buttons, for both and + + + Change Password + + + + Cancel + diff -r 5a91860c5535 -r f3ba7e0bed68 src/polemictweet/static/css/blueprint/plugins/buttons/screen.css --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/src/polemictweet/static/css/blueprint/plugins/buttons/screen.css Thu Feb 14 14:42:20 2013 +0100 @@ -0,0 +1,97 @@ +/* -------------------------------------------------------------- + + buttons.css + * Gives you some great CSS-only buttons. + + Created by Kevin Hale [particletree.com] + * particletree.com/features/rediscovering-the-button-element + + See Readme.txt in this folder for instructions. + +-------------------------------------------------------------- */ + +a.button, button { + display:block; + float:left; + margin: 0.7em 0.5em 0.7em 0; + padding:5px 10px 5px 7px; /* Links */ + + border:1px solid #dedede; + border-top:1px solid #eee; + border-left:1px solid #eee; + + background-color:#f5f5f5; + font-family:"Lucida Grande", Tahoma, Arial, Verdana, sans-serif; + font-size:100%; + line-height:130%; + text-decoration:none; + font-weight:bold; + color:#565656; + cursor:pointer; +} +button { + width:auto; + overflow:visible; + padding:4px 10px 3px 7px; /* IE6 */ +} +button[type] { + padding:4px 10px 4px 7px; /* Firefox */ + line-height:17px; /* Safari */ +} +*:first-child+html button[type] { + padding:4px 10px 3px 7px; /* IE7 */ +} +button img, a.button img{ + margin:0 3px -3px 0 !important; + padding:0; + border:none; + width:16px; + height:16px; + float:none; +} + + +/* Button colors +-------------------------------------------------------------- */ + +/* Standard */ +button:hover, a.button:hover{ + background-color:#dff4ff; + border:1px solid #c2e1ef; + color:#336699; +} +a.button:active{ + background-color:#6299c5; + border:1px solid #6299c5; + color:#fff; +} + +/* Positive */ +body .positive { + color:#529214; +} +a.positive:hover, button.positive:hover { + background-color:#E6EFC2; + border:1px solid #C6D880; + color:#529214; +} +a.positive:active { + background-color:#529214; + border:1px solid #529214; + color:#fff; +} + +/* Negative */ +body .negative { + color:#d12f19; +} +a.negative:hover, button.negative:hover { + background-color:#fbe3e4; + border:1px solid #fbc2c4; + color:#d12f19; +} +a.negative:active { + background-color:#d12f19; + border:1px solid #d12f19; + color:#fff; +} diff -r 5a91860c5535 -r f3ba7e0bed68 src/polemictweet/static/css/blueprint/plugins/fancy-type/readme.txt --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/src/polemictweet/static/css/blueprint/plugins/fancy-type/readme.txt Thu Feb 14 14:42:20 2013 +0100 @@ -0,0 +1,14 @@ +Fancy Type + +* Gives you classes to use if you'd like some + extra fancy typography. + +Credits and instructions are specified above each class +in the fancy-type.css file in this directory. + + +Usage +---------------------------------------------------------------- + +1) Add this plugin to lib/settings.yml. + See compress.rb for instructions. diff -r 5a91860c5535 -r f3ba7e0bed68 src/polemictweet/static/css/blueprint/plugins/fancy-type/screen.css --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/src/polemictweet/static/css/blueprint/plugins/fancy-type/screen.css Thu Feb 14 14:42:20 2013 +0100 @@ -0,0 +1,71 @@ +/* -------------------------------------------------------------- + + fancy-type.css + * Lots of pretty advanced classes for manipulating text. + + See the Readme file in this folder for additional instructions. + +-------------------------------------------------------------- */ + +/* Indentation instead of line shifts for sibling paragraphs. */ + p + p { text-indent:2em; margin-top:-1.5em; } + form p + p { text-indent: 0; } /* Don't want this in forms. */ + + +/* For great looking type, use this code instead of asdf: + asdf + Best used on prepositions and ampersands. */ + +.alt { + color: #666; + font-family: "Warnock Pro", "Goudy Old Style","Palatino","Book Antiqua", Georgia, serif; + font-style: italic; + font-weight: normal; +} + + +/* For great looking quote marks in titles, replace "asdf" with: + asdf” + (That is, when the title starts with a quote mark). + (You may have to change this value depending on your font size). */ + +.dquo { margin-left: -.5em; } + + +/* Reduced size type with incremental leading + (http://www.markboulton.co.uk/journal/comments/incremental_leading/) + + This could be used for side notes. For smaller type, you don't necessarily want to + follow the 1.5x vertical rhythm -- the line-height is too much. + + Using this class, it reduces your font size and line-height so that for + every four lines of normal sized type, there is five lines of the sidenote. eg: + + New type size in em's: + 10px (wanted side note size) / 12px (existing base size) = 0.8333 (new type size in ems) + + New line-height value: + 12px x 1.5 = 18px (old line-height) + 18px x 4 = 72px + 72px / 5 = 14.4px (new line height) + 14.4px / 10px = 1.44 (new line height in em's) */ + +p.incr, .incr p { + font-size: 10px; + line-height: 1.44em; + margin-bottom: 1.5em; +} + + +/* Surround uppercase words and abbreviations with this class. + Based on work by Jørgen Arnor Gårdsø Lom [http://twistedintellect.com/] */ + +.caps { + font-variant: small-caps; + letter-spacing: 1px; + text-transform: lowercase; + font-size:1.2em; + line-height:1%; + font-weight:bold; + padding:0 2px; +} diff -r 5a91860c5535 -r f3ba7e0bed68 src/polemictweet/static/css/blueprint/plugins/link-icons/icons/doc.png Binary file src/polemictweet/static/css/blueprint/plugins/link-icons/icons/doc.png has changed diff -r 5a91860c5535 -r f3ba7e0bed68 src/polemictweet/static/css/blueprint/plugins/link-icons/icons/email.png Binary file src/polemictweet/static/css/blueprint/plugins/link-icons/icons/email.png has changed diff -r 5a91860c5535 -r f3ba7e0bed68 src/polemictweet/static/css/blueprint/plugins/link-icons/icons/external.png Binary file src/polemictweet/static/css/blueprint/plugins/link-icons/icons/external.png has changed diff -r 5a91860c5535 -r f3ba7e0bed68 src/polemictweet/static/css/blueprint/plugins/link-icons/icons/feed.png Binary file src/polemictweet/static/css/blueprint/plugins/link-icons/icons/feed.png has changed diff -r 5a91860c5535 -r f3ba7e0bed68 src/polemictweet/static/css/blueprint/plugins/link-icons/icons/im.png Binary file src/polemictweet/static/css/blueprint/plugins/link-icons/icons/im.png has changed diff -r 5a91860c5535 -r f3ba7e0bed68 src/polemictweet/static/css/blueprint/plugins/link-icons/icons/pdf.png Binary file src/polemictweet/static/css/blueprint/plugins/link-icons/icons/pdf.png has changed diff -r 5a91860c5535 -r f3ba7e0bed68 src/polemictweet/static/css/blueprint/plugins/link-icons/icons/visited.png Binary file src/polemictweet/static/css/blueprint/plugins/link-icons/icons/visited.png has changed diff -r 5a91860c5535 -r f3ba7e0bed68 src/polemictweet/static/css/blueprint/plugins/link-icons/icons/xls.png Binary file src/polemictweet/static/css/blueprint/plugins/link-icons/icons/xls.png has changed diff -r 5a91860c5535 -r f3ba7e0bed68 src/polemictweet/static/css/blueprint/plugins/link-icons/readme.txt --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/src/polemictweet/static/css/blueprint/plugins/link-icons/readme.txt Thu Feb 14 14:42:20 2013 +0100 @@ -0,0 +1,18 @@ +Link Icons +* Icons for links based on protocol or file type. + +This is not supported in IE versions < 7. + + +Credits +---------------------------------------------------------------- + +* Marc Morgan +* Olav Bjorkoy [bjorkoy.com] + + +Usage +---------------------------------------------------------------- + +1) Add this line to your HTML: + diff -r 5a91860c5535 -r f3ba7e0bed68 src/polemictweet/static/css/blueprint/plugins/link-icons/screen.css --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/src/polemictweet/static/css/blueprint/plugins/link-icons/screen.css Thu Feb 14 14:42:20 2013 +0100 @@ -0,0 +1,40 @@ +/* -------------------------------------------------------------- + + link-icons.css + * Icons for links based on protocol or file type. + + See the Readme file in this folder for additional instructions. + +-------------------------------------------------------------- */ + +/* Use this class if a link gets an icon when it shouldn't. */ +body a.noicon { + background:transparent none !important; + padding:0 !important; + margin:0 !important; +} + +/* Make sure the icons are not cut */ +a[href^="http:"], a[href^="mailto:"], a[href^="http:"]:visited, +a[href$=".pdf"], a[href$=".doc"], a[href$=".xls"], a[href$=".rss"], +a[href$=".rdf"], a[href^="aim:"] { + padding:2px 22px 2px 0; + margin:-2px 0; + background-repeat: no-repeat; + background-position: right center; +} + +/* External links */ +a[href^="http:"] { background-image: url(icons/external.png); } +a[href^="mailto:"] { background-image: url(icons/email.png); } +a[href^="http:"]:visited { background-image: url(icons/visited.png); } + +/* Files */ +a[href$=".pdf"] { background-image: url(icons/pdf.png); } +a[href$=".doc"] { background-image: url(icons/doc.png); } +a[href$=".xls"] { background-image: url(icons/xls.png); } + +/* Misc */ +a[href$=".rss"], +a[href$=".rdf"] { background-image: url(icons/feed.png); } +a[href^="aim:"] { background-image: url(icons/im.png); } diff -r 5a91860c5535 -r f3ba7e0bed68 src/polemictweet/static/css/blueprint/plugins/rtl/readme.txt --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/src/polemictweet/static/css/blueprint/plugins/rtl/readme.txt Thu Feb 14 14:42:20 2013 +0100 @@ -0,0 +1,10 @@ +RTL +* Mirrors Blueprint, so it can be used with Right-to-Left languages. + +By Ran Yaniv Hartstein, ranh.co.il + +Usage +---------------------------------------------------------------- + +1) Add this line to your HTML: + diff -r 5a91860c5535 -r f3ba7e0bed68 src/polemictweet/static/css/blueprint/plugins/rtl/screen.css --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/src/polemictweet/static/css/blueprint/plugins/rtl/screen.css Thu Feb 14 14:42:20 2013 +0100 @@ -0,0 +1,110 @@ +/* -------------------------------------------------------------- + + rtl.css + * Mirrors Blueprint for left-to-right languages + + By Ran Yaniv Hartstein [ranh.co.il] + +-------------------------------------------------------------- */ + +body .container { direction: rtl; } +body .column, body .span-1, body .span-2, body .span-3, body .span-4, body .span-5, body .span-6, body .span-7, body .span-8, body .span-9, body .span-10, body .span-11, body .span-12, body .span-13, body .span-14, body .span-15, body .span-16, body .span-17, body .span-18, body .span-19, body .span-20, body .span-21, body .span-22, body .span-23, body .span-24 { + float: right; + margin-right: 0; + margin-left: 10px; + text-align:right; +} + +body div.last { margin-left: 0; } +body table .last { padding-left: 0; } + +body .append-1 { padding-right: 0; padding-left: 40px; } +body .append-2 { padding-right: 0; padding-left: 80px; } +body .append-3 { padding-right: 0; padding-left: 120px; } +body .append-4 { padding-right: 0; padding-left: 160px; } +body .append-5 { padding-right: 0; padding-left: 200px; } +body .append-6 { padding-right: 0; padding-left: 240px; } +body .append-7 { padding-right: 0; padding-left: 280px; } +body .append-8 { padding-right: 0; padding-left: 320px; } +body .append-9 { padding-right: 0; padding-left: 360px; } +body .append-10 { padding-right: 0; padding-left: 400px; } +body .append-11 { padding-right: 0; padding-left: 440px; } +body .append-12 { padding-right: 0; padding-left: 480px; } +body .append-13 { padding-right: 0; padding-left: 520px; } +body .append-14 { padding-right: 0; padding-left: 560px; } +body .append-15 { padding-right: 0; padding-left: 600px; } +body .append-16 { padding-right: 0; padding-left: 640px; } +body .append-17 { padding-right: 0; padding-left: 680px; } +body .append-18 { padding-right: 0; padding-left: 720px; } +body .append-19 { padding-right: 0; padding-left: 760px; } +body .append-20 { padding-right: 0; padding-left: 800px; } +body .append-21 { padding-right: 0; padding-left: 840px; } +body .append-22 { padding-right: 0; padding-left: 880px; } +body .append-23 { padding-right: 0; padding-left: 920px; } + +body .prepend-1 { padding-left: 0; padding-right: 40px; } +body .prepend-2 { padding-left: 0; padding-right: 80px; } +body .prepend-3 { padding-left: 0; padding-right: 120px; } +body .prepend-4 { padding-left: 0; padding-right: 160px; } +body .prepend-5 { padding-left: 0; padding-right: 200px; } +body .prepend-6 { padding-left: 0; padding-right: 240px; } +body .prepend-7 { padding-left: 0; padding-right: 280px; } +body .prepend-8 { padding-left: 0; padding-right: 320px; } +body .prepend-9 { padding-left: 0; padding-right: 360px; } +body .prepend-10 { padding-left: 0; padding-right: 400px; } +body .prepend-11 { padding-left: 0; padding-right: 440px; } +body .prepend-12 { padding-left: 0; padding-right: 480px; } +body .prepend-13 { padding-left: 0; padding-right: 520px; } +body .prepend-14 { padding-left: 0; padding-right: 560px; } +body .prepend-15 { padding-left: 0; padding-right: 600px; } +body .prepend-16 { padding-left: 0; padding-right: 640px; } +body .prepend-17 { padding-left: 0; padding-right: 680px; } +body .prepend-18 { padding-left: 0; padding-right: 720px; } +body .prepend-19 { padding-left: 0; padding-right: 760px; } +body .prepend-20 { padding-left: 0; padding-right: 800px; } +body .prepend-21 { padding-left: 0; padding-right: 840px; } +body .prepend-22 { padding-left: 0; padding-right: 880px; } +body .prepend-23 { padding-left: 0; padding-right: 920px; } + +body .border { + padding-right: 0; + padding-left: 4px; + margin-right: 0; + margin-left: 5px; + border-right: none; + border-left: 1px solid #eee; +} + +body .colborder { + padding-right: 0; + padding-left: 24px; + margin-right: 0; + margin-left: 25px; + border-right: none; + border-left: 1px solid #eee; +} + +body .pull-1 { margin-left: 0; margin-right: -40px; } +body .pull-2 { margin-left: 0; margin-right: -80px; } +body .pull-3 { margin-left: 0; margin-right: -120px; } +body .pull-4 { margin-left: 0; margin-right: -160px; } + +body .push-0 { margin: 0 18px 0 0; } +body .push-1 { margin: 0 18px 0 -40px; } +body .push-2 { margin: 0 18px 0 -80px; } +body .push-3 { margin: 0 18px 0 -120px; } +body .push-4 { margin: 0 18px 0 -160px; } +body .push-0, body .push-1, body .push-2, +body .push-3, body .push-4 { float: left; } + + +/* Typography with RTL support */ +body h1,body h2,body h3, +body h4,body h5,body h6 { font-family: Arial, sans-serif; } +html body { font-family: Arial, sans-serif; } +body pre,body code,body tt { font-family: monospace; } + +/* Mirror floats and margins on typographic elements */ +body p img { float: right; margin: 1.5em 0 1.5em 1.5em; } +body dd, body ul, body ol { margin-left: 0; margin-right: 1.5em;} +body td, body th { text-align:right; } diff -r 5a91860c5535 -r f3ba7e0bed68 src/polemictweet/static/css/blueprint/print.css --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/src/polemictweet/static/css/blueprint/print.css Thu Feb 14 14:42:20 2013 +0100 @@ -0,0 +1,29 @@ +/* ----------------------------------------------------------------------- + + + Blueprint CSS Framework 0.9 + http://blueprintcss.org + + * Copyright (c) 2007-Present. See LICENSE for more info. + * See README for instructions on how to use Blueprint. + * For credits and origins, see AUTHORS. + * This is a compressed file. See the sources in the 'src' directory. + +----------------------------------------------------------------------- */ + +/* print.css */ +body {line-height:1.5;font-family:"Helvetica Neue", Arial, Helvetica, sans-serif;color:#000;background:none;font-size:10pt;} +.container {background:none;} +hr {background:#ccc;color:#ccc;width:100%;height:2px;margin:2em 0;padding:0;border:none;} +hr.space {background:#fff;color:#fff;visibility:hidden;} +h1, h2, h3, h4, h5, h6 {font-family:"Helvetica Neue", Arial, "Lucida Grande", sans-serif;} +code {font:.9em "Courier New", Monaco, Courier, monospace;} +a img {border:none;} +p img.top {margin-top:0;} +blockquote {margin:1.5em;padding:1em;font-style:italic;font-size:.9em;} +.small {font-size:.9em;} +.large {font-size:1.1em;} +.quiet {color:#999;} +.hide {display:none;} +a:link, a:visited {background:transparent;font-weight:700;text-decoration:underline;} +a:link:after, a:visited:after {content:" (" attr(href) ")";font-size:90%;} \ No newline at end of file diff -r 5a91860c5535 -r f3ba7e0bed68 src/polemictweet/static/css/blueprint/screen.css --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/src/polemictweet/static/css/blueprint/screen.css Thu Feb 14 14:42:20 2013 +0100 @@ -0,0 +1,258 @@ +/* ----------------------------------------------------------------------- + + + Blueprint CSS Framework 0.9 + http://blueprintcss.org + + * Copyright (c) 2007-Present. See LICENSE for more info. + * See README for instructions on how to use Blueprint. + * For credits and origins, see AUTHORS. + * This is a compressed file. See the sources in the 'src' directory. + +----------------------------------------------------------------------- */ + +/* reset.css */ +html, body, div, span, object, iframe, h1, h2, h3, h4, h5, h6, p, blockquote, pre, a, abbr, acronym, address, code, del, dfn, em, img, q, dl, dt, dd, ol, ul, li, fieldset, form, label, legend, table, caption, tbody, tfoot, thead, tr, th, td, article, aside, dialog, figure, footer, header, hgroup, nav, section {margin:0;padding:0;border:0;font-weight:inherit;font-style:inherit;font-size:100%;font-family:inherit;vertical-align:baseline;} +article, aside, dialog, figure, footer, header, hgroup, nav, section {display:block;} +body {line-height:1.5;} +table {border-collapse:separate;border-spacing:0;} +caption, th, td {text-align:left;font-weight:normal;} +table, td, th {vertical-align:middle;} +blockquote:before, blockquote:after, q:before, q:after {content:"";} +blockquote, q {quotes:"" "";} +a img {border:none;} + +/* typography.css */ +html {font-size:100.01%;} +body {font-size:75%;color:#222;background:#fff;font-family:"Helvetica Neue", Arial, Helvetica, sans-serif;} +h1, h2, h3, h4, h5, h6 {font-weight:normal;color:#111;} +h1 {font-size:3em;line-height:1;margin-bottom:0.5em;} +h2 {font-size:2em;margin-bottom:0.75em;} +h3 {font-size:1.5em;line-height:1;margin-bottom:1em;} +h4 {font-size:1.2em;line-height:1.25;margin-bottom:1.25em;} +h5 {font-size:1em;font-weight:bold;margin-bottom:1.5em;} +h6 {font-size:1em;font-weight:bold;} +h1 img, h2 img, h3 img, h4 img, h5 img, h6 img {margin:0;} +p {margin:0 0 1.5em;} +p img.left {float:left;margin:1.5em 1.5em 1.5em 0;padding:0;} +p img.right {float:right;margin:1.5em 0 1.5em 1.5em;} +a:focus, a:hover {color:#000;} +a {color:#009;text-decoration:underline;} +blockquote {margin:1.5em;color:#666;font-style:italic;} +strong {font-weight:bold;} +em, dfn {font-style:italic;} +dfn {font-weight:bold;} +sup, sub {line-height:0;} +abbr, acronym {border-bottom:1px dotted #666;} +address {margin:0 0 1.5em;font-style:italic;} +del {color:#666;} +pre {margin:1.5em 0;white-space:pre;} +pre, code, tt {font:1em 'andale mono', 'lucida console', monospace;line-height:1.5;} +li ul, li ol {margin:0;} +ul, ol {margin:0 1.5em 1.5em 0;padding-left:3.333em;} +ul {list-style-type:disc;} +ol {list-style-type:decimal;} +dl {margin:0 0 1.5em 0;} +dl dt {font-weight:bold;} +dd {margin-left:1.5em;} +table {margin-bottom:1.4em;width:100%;} +th {font-weight:bold;} +thead th {background:#c3d9ff;} +th, td, caption {padding:4px 10px 4px 5px;} +tr.even td {background:#e5ecf9;} +tfoot {font-style:italic;} +caption {background:#eee;} +.small {font-size:.8em;margin-bottom:1.875em;line-height:1.875em;} +.large {font-size:1.2em;line-height:2.5em;margin-bottom:1.25em;} +.hide {display:none;} +.quiet {color:#666;} +.loud {color:#000;} +.highlight {background:#ff0;} +.added {background:#060;color:#fff;} +.removed {background:#900;color:#fff;} +.first {margin-left:0;padding-left:0;} +.last {margin-right:0;padding-right:0;} +.top {margin-top:0;padding-top:0;} +.bottom {margin-bottom:0;padding-bottom:0;} + +/* forms.css */ +label {font-weight:bold;} +fieldset {padding:1.4em;margin:0 0 1.5em 0;border:1px solid #ccc;} +legend {font-weight:bold;font-size:1.2em;} +input[type=text], input[type=password], input.text, input.title, textarea, select {background-color:#fff;border:1px solid #bbb;} +input[type=text]:focus, input[type=password]:focus, input.text:focus, input.title:focus, textarea:focus, select:focus {border-color:#666;} +input[type=text], input[type=password], input.text, input.title, textarea, select {margin:0.5em 0;} +input.text, input.title {width:300px;padding:5px;} +input.title {font-size:1.5em;} +textarea {width:390px;height:250px;padding:5px;} +input[type=checkbox], input[type=radio], input.checkbox, input.radio {position:relative;top:.25em;} +form.inline {line-height:3;} +form.inline p {margin-bottom:0;} +.error, .notice, .success {padding:.8em;margin-bottom:1em;border:2px solid #ddd;} +.error {background:#FBE3E4;color:#8a1f11;border-color:#FBC2C4;} +.notice {background:#FFF6BF;color:#514721;border-color:#FFD324;} +.success {background:#E6EFC2;color:#264409;border-color:#C6D880;} +.error a {color:#8a1f11;} +.notice a {color:#514721;} +.success a {color:#264409;} + +/* grid.css */ +.container {width:950px;margin:0 auto;} +.showgrid {background:url(src/grid.png);} +.column, .span-1, .span-2, .span-3, .span-4, .span-5, .span-6, .span-7, .span-8, .span-9, .span-10, .span-11, .span-12, .span-13, .span-14, .span-15, .span-16, .span-17, .span-18, .span-19, .span-20, .span-21, .span-22, .span-23, .span-24 {float:left;margin-right:10px;} +.last {margin-right:0;} +.span-1 {width:30px;} +.span-2 {width:70px;} +.span-3 {width:110px;} +.span-4 {width:150px;} +.span-5 {width:190px;} +.span-6 {width:230px;} +.span-7 {width:270px;} +.span-8 {width:310px;} +.span-9 {width:350px;} +.span-10 {width:390px;} +.span-11 {width:430px;} +.span-12 {width:470px;} +.span-13 {width:510px;} +.span-14 {width:550px;} +.span-15 {width:590px;} +.span-16 {width:630px;} +.span-17 {width:670px;} +.span-18 {width:710px;} +.span-19 {width:750px;} +.span-20 {width:790px;} +.span-21 {width:830px;} +.span-22 {width:870px;} +.span-23 {width:910px;} +.span-24 {width:950px;margin-right:0;} +input.span-1, textarea.span-1, input.span-2, textarea.span-2, input.span-3, textarea.span-3, input.span-4, textarea.span-4, input.span-5, textarea.span-5, input.span-6, textarea.span-6, input.span-7, textarea.span-7, input.span-8, textarea.span-8, input.span-9, textarea.span-9, input.span-10, textarea.span-10, input.span-11, textarea.span-11, input.span-12, textarea.span-12, input.span-13, textarea.span-13, input.span-14, textarea.span-14, input.span-15, textarea.span-15, input.span-16, textarea.span-16, input.span-17, textarea.span-17, input.span-18, textarea.span-18, input.span-19, textarea.span-19, input.span-20, textarea.span-20, input.span-21, textarea.span-21, input.span-22, textarea.span-22, input.span-23, textarea.span-23, input.span-24, textarea.span-24 {border-left-width:1px!important;border-right-width:1px!important;padding-left:5px!important;padding-right:5px!important;} +input.span-1, textarea.span-1 {width:18px!important;} +input.span-2, textarea.span-2 {width:58px!important;} +input.span-3, textarea.span-3 {width:98px!important;} +input.span-4, textarea.span-4 {width:138px!important;} +input.span-5, textarea.span-5 {width:178px!important;} +input.span-6, textarea.span-6 {width:218px!important;} +input.span-7, textarea.span-7 {width:258px!important;} +input.span-8, textarea.span-8 {width:298px!important;} +input.span-9, textarea.span-9 {width:338px!important;} +input.span-10, textarea.span-10 {width:378px!important;} +input.span-11, textarea.span-11 {width:418px!important;} +input.span-12, textarea.span-12 {width:458px!important;} +input.span-13, textarea.span-13 {width:498px!important;} +input.span-14, textarea.span-14 {width:538px!important;} +input.span-15, textarea.span-15 {width:578px!important;} +input.span-16, textarea.span-16 {width:618px!important;} +input.span-17, textarea.span-17 {width:658px!important;} +input.span-18, textarea.span-18 {width:698px!important;} +input.span-19, textarea.span-19 {width:738px!important;} +input.span-20, textarea.span-20 {width:778px!important;} +input.span-21, textarea.span-21 {width:818px!important;} +input.span-22, textarea.span-22 {width:858px!important;} +input.span-23, textarea.span-23 {width:898px!important;} +input.span-24, textarea.span-24 {width:938px!important;} +.append-1 {padding-right:40px;} +.append-2 {padding-right:80px;} +.append-3 {padding-right:120px;} +.append-4 {padding-right:160px;} +.append-5 {padding-right:200px;} +.append-6 {padding-right:240px;} +.append-7 {padding-right:280px;} +.append-8 {padding-right:320px;} +.append-9 {padding-right:360px;} +.append-10 {padding-right:400px;} +.append-11 {padding-right:440px;} +.append-12 {padding-right:480px;} +.append-13 {padding-right:520px;} +.append-14 {padding-right:560px;} +.append-15 {padding-right:600px;} +.append-16 {padding-right:640px;} +.append-17 {padding-right:680px;} +.append-18 {padding-right:720px;} +.append-19 {padding-right:760px;} +.append-20 {padding-right:800px;} +.append-21 {padding-right:840px;} +.append-22 {padding-right:880px;} +.append-23 {padding-right:920px;} +.prepend-1 {padding-left:40px;} +.prepend-2 {padding-left:80px;} +.prepend-3 {padding-left:120px;} +.prepend-4 {padding-left:160px;} +.prepend-5 {padding-left:200px;} +.prepend-6 {padding-left:240px;} +.prepend-7 {padding-left:280px;} +.prepend-8 {padding-left:320px;} +.prepend-9 {padding-left:360px;} +.prepend-10 {padding-left:400px;} +.prepend-11 {padding-left:440px;} +.prepend-12 {padding-left:480px;} +.prepend-13 {padding-left:520px;} +.prepend-14 {padding-left:560px;} +.prepend-15 {padding-left:600px;} +.prepend-16 {padding-left:640px;} +.prepend-17 {padding-left:680px;} +.prepend-18 {padding-left:720px;} +.prepend-19 {padding-left:760px;} +.prepend-20 {padding-left:800px;} +.prepend-21 {padding-left:840px;} +.prepend-22 {padding-left:880px;} +.prepend-23 {padding-left:920px;} +.border {padding-right:4px;margin-right:5px;border-right:1px solid #eee;} +.colborder {padding-right:24px;margin-right:25px;border-right:1px solid #eee;} +.pull-1 {margin-left:-40px;} +.pull-2 {margin-left:-80px;} +.pull-3 {margin-left:-120px;} +.pull-4 {margin-left:-160px;} +.pull-5 {margin-left:-200px;} +.pull-6 {margin-left:-240px;} +.pull-7 {margin-left:-280px;} +.pull-8 {margin-left:-320px;} +.pull-9 {margin-left:-360px;} +.pull-10 {margin-left:-400px;} +.pull-11 {margin-left:-440px;} +.pull-12 {margin-left:-480px;} +.pull-13 {margin-left:-520px;} +.pull-14 {margin-left:-560px;} +.pull-15 {margin-left:-600px;} +.pull-16 {margin-left:-640px;} +.pull-17 {margin-left:-680px;} +.pull-18 {margin-left:-720px;} +.pull-19 {margin-left:-760px;} +.pull-20 {margin-left:-800px;} +.pull-21 {margin-left:-840px;} +.pull-22 {margin-left:-880px;} +.pull-23 {margin-left:-920px;} +.pull-24 {margin-left:-960px;} +.pull-1, .pull-2, .pull-3, .pull-4, .pull-5, .pull-6, .pull-7, .pull-8, .pull-9, .pull-10, .pull-11, .pull-12, .pull-13, .pull-14, .pull-15, .pull-16, .pull-17, .pull-18, .pull-19, .pull-20, .pull-21, .pull-22, .pull-23, .pull-24 {float:left;position:relative;} +.push-1 {margin:0 -40px 1.5em 40px;} +.push-2 {margin:0 -80px 1.5em 80px;} +.push-3 {margin:0 -120px 1.5em 120px;} +.push-4 {margin:0 -160px 1.5em 160px;} +.push-5 {margin:0 -200px 1.5em 200px;} +.push-6 {margin:0 -240px 1.5em 240px;} +.push-7 {margin:0 -280px 1.5em 280px;} +.push-8 {margin:0 -320px 1.5em 320px;} +.push-9 {margin:0 -360px 1.5em 360px;} +.push-10 {margin:0 -400px 1.5em 400px;} +.push-11 {margin:0 -440px 1.5em 440px;} +.push-12 {margin:0 -480px 1.5em 480px;} +.push-13 {margin:0 -520px 1.5em 520px;} +.push-14 {margin:0 -560px 1.5em 560px;} +.push-15 {margin:0 -600px 1.5em 600px;} +.push-16 {margin:0 -640px 1.5em 640px;} +.push-17 {margin:0 -680px 1.5em 680px;} +.push-18 {margin:0 -720px 1.5em 720px;} +.push-19 {margin:0 -760px 1.5em 760px;} +.push-20 {margin:0 -800px 1.5em 800px;} +.push-21 {margin:0 -840px 1.5em 840px;} +.push-22 {margin:0 -880px 1.5em 880px;} +.push-23 {margin:0 -920px 1.5em 920px;} +.push-24 {margin:0 -960px 1.5em 960px;} +.push-1, .push-2, .push-3, .push-4, .push-5, .push-6, .push-7, .push-8, .push-9, .push-10, .push-11, .push-12, .push-13, .push-14, .push-15, .push-16, .push-17, .push-18, .push-19, .push-20, .push-21, .push-22, .push-23, .push-24 {float:right;position:relative;} +.prepend-top {margin-top:1.5em;} +.append-bottom {margin-bottom:1.5em;} +.box {padding:1.5em;margin-bottom:1.5em;background:#E5ECF9;} +hr {background:#ddd;color:#ddd;clear:both;float:none;width:100%;height:.1em;margin:0 0 1.45em;border:none;} +hr.space {background:#fff;color:#fff;visibility:hidden;} +.clearfix:after, .container:after {content:"\0020";display:block;height:0;clear:both;visibility:hidden;overflow:hidden;} +.clearfix, .container {display:block;} +.clear {clear:both;} \ No newline at end of file diff -r 5a91860c5535 -r f3ba7e0bed68 src/polemictweet/static/css/create_event.css --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/src/polemictweet/static/css/create_event.css Thu Feb 14 14:42:20 2013 +0100 @@ -0,0 +1,37 @@ +.partner_selector{ + max-height: 200px; + min-height: 200px; + width: 15%; + float: left; + position : relative; + margin-left: 10px; +} + +.multiple_choice_box{ + border: 1px solid #B8B8B8; + max-height: 200px; + min-height: 200px; + width: 15%; + +} + +.multiple_choice_box td{ + vertical-align: baseline; + border: none; +} + +.multiple_choice_box .ui-selected { + background-color: #EDEDED; +} + +.choice_button{ + position : relative; + float: left; + margin-left: 10px; +} + +.multiple_choice_box{ + height: 150px; + width: 150px; +} + diff -r 5a91860c5535 -r f3ba7e0bed68 src/polemictweet/static/js/add_content.js --- a/src/polemictweet/static/js/add_content.js Fri Feb 08 18:00:04 2013 +0100 +++ b/src/polemictweet/static/js/add_content.js Thu Feb 14 14:42:20 2013 +0100 @@ -2,38 +2,49 @@ var number_form = parseInt($j('#id_' + init_prefix + '-TOTAL_FORMS').val()); var links_display = document.getElementsByName('displayTranslateDisplay'); var links_program = document.getElementsByName('displayTranslateProgram'); + var translations_display=document.getElementsByName("translate_display"); + for(var i=0;i'); + }); + }); + + $j("#removepartners").click(function () { + var selection = $j("#selectedpartnercontainer .ui-selected"); + $j("#elemslistcontainer").append(selection); + $j("#selectedpartnercontainer").remove(".ui-selected"); + + selection.each(function () { + var id_item = $j("input",$j(this)).val(); + $j("#partners_event input[value=" + id_item + "]").remove(); + }); + + }); + + $j("#selectorganisator").click(function () { + var selection = $j("#selectedpartnercontainer .ui-selected"); + $j("#selectedorganisatorcontainer").append(selection); + $j("#selectedpartnercontainer").remove(".ui-selected"); + + selection.each(function () { + var id_item = $j("input",$j(this)).val(); + $j("#organisators_event").append(''); + $j("#partners_event input[value=" + id_item + "]").remove(); + }); + + }); + + $j("#removeorganisator").click(function () { + var selection = $j("#selectedorganisatorcontainer .ui-selected"); + $j("#selectedpartnercontainer").append(selection); + $j("#selectedorganisatorcontainer").remove(".ui-selected"); + + selection.each(function () { + var id_item = $j("input",$j(this)).val(); + $j("#organisators_event input[value=" + id_item + "]").remove(); + $j("#partners_event").append(''); + }); + + }); + +} + +$('#add').click(function() { + return !$('#select1 option:selected').remove().appendTo('#select2'); + }); + $('#remove').click(function() { + return !$('#select2 option:selected').remove().appendTo('#select1'); + }); + + diff -r 5a91860c5535 -r f3ba7e0bed68 src/polemictweet/templates/create_event.html --- a/src/polemictweet/templates/create_event.html Fri Feb 08 18:00:04 2013 +0100 +++ b/src/polemictweet/templates/create_event.html Thu Feb 14 14:42:20 2013 +0100 @@ -2,10 +2,17 @@ {% load i18n %} {% load thumbnail %} + {% block css_import %} + + + {% endblock %} {% block js_import %} + + + {% endblock %} @@ -30,7 +37,6 @@ theme_advanced_buttons1 : "save,newdocument,bold,italic,underline,strikethrough,justifyleft,justifycenter,justifyright,justifyfull,formatselect,fontselect,fontsizeselect", theme_advanced_buttons2 : "cut,copy,paste,pastetext,pasteword,search,replace,bullist,numlist,outdent,indent,blockquote,undo,redo,link,unlink,anchor,cleanup,help,code,insertdate,inserttime,preview,forecolor,backcolor", theme_advanced_buttons3 : "tablecontrols,hr,removeformat,visualaid,sub,sup,charmap,emotions,iespell,advhr,ltr,rtl,fullscreen", - //theme_advanced_buttons4 : "insertlayer,moveforward,movebackward,absolute,styleprops,spellchecker,cite,abbr,acronym,del,ins,attribs,visualchars,nonbreaking,template,blockquote", theme_advanced_toolbar_location : "top", theme_advanced_toolbar_align : "left", theme_advanced_statusbar_location : "bottom", @@ -38,7 +44,21 @@ }); $j(document).ready(function(){ - init_events() + init_events(); + + $j("#elemslistcontainer").selectable({ + filter: ".shareline", + }); + + $j("#selectedpartnercontainer").selectable({ + filter: ".shareline", + }); + + $j("#selectedorganisatorcontainer").selectable({ + filter: ".shareline", + }); + + }); document.onkeypress = stopRKey; @@ -68,8 +88,8 @@
{{ event_form.title.errors }}{{ event_form.title.label_tag }}{{event_form.title}}
-
{{ event_form.title_en.errors }}{{ event_form.title_en.label_tag }}{{event_form.title_en}}
- +
{{ event_form.description.errors }}{{ event_form.description.label_tag }}{{event_form.description}}
{% trans "Add translations" %} @@ -115,11 +135,6 @@
-
{% trans "Upload a new picture" %}
(JPG, PNG, < 1 Mo) @@ -147,12 +162,7 @@ {% trans "choose an image for the organisator" %} - - +
{% trans "Upload a new picture" %}
(JPG, PNG, < 1 Mo) @@ -174,11 +184,84 @@ {% endif %} {% endfor %} - + +
+
+
+
+ +
+
+ +
+ + + + {% for partner in partners %} + {% if partner not in old_partners and partner not in old_organisators %} + + + + + {% endif %} + {% endfor %} +
{{ partner.name }}
+
+ + +
+
+ + + {% for partner in old_partners %} + + + + + {% endfor %} +
{{ partner.name }}
+
+ + +
+
+ + + {% for organisator in old_organisators %} + + + + + {% endfor %} +
{{ organisator.name }}
+
+
+ +
+ {% for partner in old_partners %} + + {% endfor %} + +
+ +
+ {% for organisator in old_organisators %} + + {% endfor %} +
+ - -
-
+
+ + +
+
diff -r 5a91860c5535 -r f3ba7e0bed68 src/polemictweet/templates/create_partner.html --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/src/polemictweet/templates/create_partner.html Thu Feb 14 14:42:20 2013 +0100 @@ -0,0 +1,74 @@ +{% extends "polemictweet_base.html" %} +{% load i18n %} +{% load thumbnail %} + + {% block js_import %} + + + + + {% endblock %} + {% block js_declaration %} + + + + + {% endblock %} + {% block content %} + {{ event_form.errors }} + +
+
{% trans "Create a new partner" %}
+ +
+ {% csrf_token %} +
+
+ + {% for hidden in partner_form.hidden_fields %} + {{ hidden }} + {% endfor %} +
+
+
{{ partner_form.name.errors }}{{ partner_form.name.label_tag }}{{partner_form.name}}
+
{{ partner_form.url.errors }}{{ partner_form.url.label_tag }}{{partner_form.url}}
+ + + + + + + +
+ {% trans "Upload a new picture" %}
(JPG, PNG, < 1 Mo) +
+
{{ partner_form.partner_image.errors }}{{partner_form.partner_image.label_tag}}{{partner_form.partner_image}}
+
+ +
+
+ +
+
+ + +
+
+ +
+
+ {% endblock %} \ No newline at end of file diff -r 5a91860c5535 -r f3ba7e0bed68 src/polemictweet/urls.py --- a/src/polemictweet/urls.py Fri Feb 08 18:00:04 2013 +0100 +++ b/src/polemictweet/urls.py Thu Feb 14 14:42:20 2013 +0100 @@ -2,6 +2,7 @@ from polemictweet.views.home import root_home from polemictweet.views.event import create_event, display_event, add_live, add_content from polemictweet.views.group import create_group, display_group +from polemictweet.views.partner import create_partner # Uncomment the next two lines to enable the admin: from django.contrib import admin @@ -25,6 +26,7 @@ url(r'^event_admin/add_content/(?P.*)$', add_content, name='add_content'), url(r'^event/(?P.*)$', display_event, name='display_event'), url(r'^group_admin/create_group/$', create_group, name="create_group"), + url(r'^partner_admin/create_partner/$', create_partner, name="create_partner"), url(r'^group_admin/modif_group/(?P.*)$', create_group, name='modif_group'), url(r'^group/(?P.*)$', display_group, name='display_group'), (r'^i18n/', include('django.conf.urls.i18n')), diff -r 5a91860c5535 -r f3ba7e0bed68 src/polemictweet/utils/translate_language.py --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/src/polemictweet/utils/translate_language.py Thu Feb 14 14:42:20 2013 +0100 @@ -0,0 +1,12 @@ +from django.conf import settings +from django.utils.translation import get_language + +def get_translation_languages() : + current_language = get_language().split("-")[0] + all_languages = settings.LANGUAGES + translation_languages = [] + + for l in all_languages: + if l[0] != current_language: + translation_languages.append(l[0]) + return translation_languages \ No newline at end of file diff -r 5a91860c5535 -r f3ba7e0bed68 src/polemictweet/views/event.py --- a/src/polemictweet/views/event.py Fri Feb 08 18:00:04 2013 +0100 +++ b/src/polemictweet/views/event.py Thu Feb 14 14:42:20 2013 +0100 @@ -3,11 +3,12 @@ from django.core.urlresolvers import reverse from django.shortcuts import render_to_response, redirect, render, get_object_or_404 from django.template import RequestContext -from polemictweet.models import Event, Live, Content, Group +from polemictweet.models import Event, Live, Content, Group, Partner, Organisator from polemictweet.forms import EventForm, LiveAddForm, ContentAddForm from django.utils.translation import ugettext as _, get_language from django.forms.formsets import formset_factory from django.forms.models import model_to_dict +from polemictweet.utils.translate_language import get_translation_languages import sys import logging @@ -16,13 +17,33 @@ @transaction.commit_manually def write_event_base(request, translation_languages, current_language, event_slug=None): event = None - default_language = settings.LANGUAGES[0][0] old_groups = [] + old_partners = [] + old_partners_id = [] + old_organisators = [] + old_organisators_id = [] + + if event_slug: instance_event = Event.objects.get(slug=event_slug) #@UndefinedVariable init_groups = instance_event.group_set.all() + init_partners = Organisator.objects.filter(event=instance_event, orga=False) + init_organisators = Organisator.objects.filter(event=instance_event, orga=True) + + logger.debug("init_partners : "+str(init_partners)) for group in init_groups : old_groups.append(group.id) + + for partner in init_partners : + old_partners.append(partner.partner) + logger.debug('name '+str(partner.partner.name)) + old_partners_id.append(partner.partner.id) + + for organisator in init_organisators : + old_organisators.append(organisator.partner) + old_organisators_id.append(organisator.partner.id) + logger.debug('name '+str(organisator.partner.name)) + else: logger.debug("No event_slug") #@UndefinedVariable @@ -31,7 +52,7 @@ form_status = 'none' if request.method == "POST": - logger.debug("post : "+repr(request.POST)) + logger.debug("post : "+str(request.POST)) try: if instance_event is not None: event_instance_val = model_to_dict(instance_event, exclude=EventForm.Meta.exclude) @@ -42,106 +63,80 @@ logger.debug("write_event_base : valid form: for instance : " + repr(instance_event)) #@UndefinedVariable if event_valid : #ajouter picture_valid si image - if form_status != "error": - event = event_form.save() - + if form_status != "error": + event = event_form.save() #add the event to a group : #groups list : group_list = [] + partner_list = [] + organisator_list = [] for group in request.POST.getlist('groups') : group_list.append(int(group)) + + for partner in request.POST.getlist('partners') : + partner_list.append(int(partner)) + + for organisator in request.POST.getlist('organisators') : + organisator_list.append(int(organisator)) #if the event already existed : if event_slug : # groups to remove : the one that are in the old list but not in the new list - to_remove = list(set(old_groups)-set(group_list)) - for group_id in to_remove : + group_to_remove = list(set(old_groups)-set(group_list)) + group_to_add = list(set(group_list)-set(old_groups)) + + partner_to_remove = list(set(old_partners_id)-set(partner_list)) + partner_to_add = list(set(partner_list)-set(old_partners_id)) + + organisator_to_remove = list(set(old_organisators_id)-set(organisator_list)) + organisator_to_add = list(set(organisator_list)-set(old_organisators_id)) + + # groups to remove : the one that are in the new list but not in the old list + for group_id in group_to_remove : group = Group.objects.get(id=group_id) group.events.remove(event) - # groups to remove : the one that are in the new list but not in the old list - to_add = list(set(group_list)-set(old_groups)) - for group_id in to_add : + for group_id in group_to_add : group = Group.objects.get(id=group_id) - group.events.add(event) + group.events.add(event) + + for partner_id in partner_to_remove : + partner = Partner.objects.get(id=partner_id) + Organisator.objects.filter(event=event, partner = partner).delete() + + for partner_id in partner_to_add : + partner = Partner.objects.get(id=partner_id) + Organisator.objects.create(partner = partner, event = event, orga = False) + + for organisator_id in organisator_to_remove : + organisator = Partner.objects.get(id=organisator_id) + Organisator.objects.filter(event=event, partner = organisator).delete() + + + for organisator_id in organisator_to_add : + organisator = Partner.objects.get(id=organisator_id) + Organisator.objects.create(partner = organisator, event = event, orga = True) else : for group_id in group_list : group = Group.objects.get(id=group_id) group.events.add(event) - translation_added = False - #if the user entered translations for title, description or program - for language_code in translation_languages : - key_title = "title_"+language_code - key_description = "description_"+language_code - key_program = "program_"+language_code - key_event_image = "event_image_"+language_code - value_title = request.POST.get(key_title) - value_description = request.POST.get(key_description) - value_program = request.POST.get(key_program) + for partner_id in partner_list : + partner = Partner.objects.get(id=partner_id) + Organisator.objects.create(partner = partner, event = event, orga = False) - if key_event_image in request.FILES : - translation_added = True - value_event_image = request.FILES[key_event_image] - if key_event_image == "event_image_fr" : - event.event_image_fr = value_event_image - elif key_event_image == "event_image_en" : - event.event_image_en = value_event_image - else : - event.event_image_ja = value_event_image - - if value_title and value_title!="" : - translation_added = True - if key_title == "title_fr" : - event.title_fr = value_title - elif key_title == "title_en" : - event.title_en = value_title - else : - event.title_ja = value_title - - if value_description and value_description!="" : - translation_added = True - if key_description == "description_fr" : - event.description_fr = value_description - elif key_description == "description_en" : - event.description_en = value_description - else : - event.description_ja = value_description - if value_program and value_program!="" : - translation_added = True - if key_program == "program_fr" : - event.program_fr = value_program - elif key_program == "program_en" : - event.program_en = value_program - else : - event.program_ja = value_program - - # if the current language isn't the default one whici is french is this case - # the fields for the french will be empty which means that there is no default - # value when there is no translation. For exemple : if the user created an event - # in japanese and tries to display it in an other language, there will be nothing displayed - # this lines solve this problem - if current_language != default_language : - if request.POST.get('title_fr') == '' : - translation_added = True - event.title_fr = request.POST.get('title') - if request.POST.get('description_fr') == '' : - translation_added = True - event.description_fr = request.POST.get('description') - if request.POST.get('program_fr') == '' : - translation_added = True - event.program_fr = request.POST.get('program') - - if translation_added : - event.save() + for organisator_id in organisator_list : + organisator = Partner.objects.get(id=organisator_id) + Organisator.objects.create(partner = organisator, event = event, orga = True) + form_status = 'saved' else: form_status = 'error' except Exception, e: transaction.rollback() __, value, traceback = sys.exc_info() - return False, False, False, e, traceback, init_groups + return False, False, False, e, traceback, init_groups, old_partners, old_organisators else: form_status = 'empty' @@ -152,28 +147,24 @@ except Exception, e: transaction.rollback() __, __, traceback = sys.exc_info() - return False, False, False, e, traceback, init_groups + return False, False, False, e, traceback, init_groups, old_partners, old_organisators - return event, event_form, form_status, "", "", init_groups + return event, event_form, form_status, "", "", init_groups, old_partners, old_organisators def create_event(request, event_slug = None): groups = Group.objects.all() - logger.debug("groups : "+str(groups)) + partners = Partner.objects.all() + logger.debug("partner : "+str(partners)) submit_action = request.REQUEST.get("submit_button", False) current_language = get_language().split("-")[0] + translation_languages = get_translation_languages() - all_languages = settings.LANGUAGES - translation_languages = [] - - for l in all_languages: - if l[0] != current_language: - translation_languages.append(l[0]) if submit_action=="close": return render_to_response('home.html', {'message': "You saved your event", 'translation_languages' : translation_languages, 'current_language' : current_language}, context_instance=RequestContext(request)) else: - event, event_form, form_status, e, traceback, init_groups = write_event_base(request, translation_languages, current_language, event_slug) + event, event_form, form_status, e, traceback, init_groups, old_partners, old_organisators = write_event_base(request, translation_languages, current_language, event_slug) if event_slug: event_temp = Event.objects.get(slug=event_slug) @@ -191,7 +182,7 @@ if form_status=='saved' or form_status=='deleted': return redirect('add_live', event_slug = event.slug) else: - return render_to_response('create_event.html', {'event_form': event_form, 'form_status': form_status, 'create_event_action': create_event_action, + return render_to_response('create_event.html', {'event_form': event_form, 'form_status': form_status, 'create_event_action': create_event_action, 'partners' : partners, 'old_partners' : old_partners, 'old_organisators' : old_organisators, 'event_slug': event_slug, 'translation_languages' : translation_languages, 'current_language' : current_language, 'groups' : groups, 'init_groups' : init_groups}, context_instance=RequestContext(request)) @@ -201,12 +192,8 @@ current_language = get_language().split("-")[0] if submit_action=="close": - all_languages = settings.LANGUAGES - translation_languages = [] - - for l in all_languages: - if l[0] != current_language: - translation_languages.append(l[0]) + translation_languages = get_translation_languages() + return render_to_response('home.html', {'message': "You didn't add any live", 'translation_languages' : translation_languages, 'current_language' : current_language}, context_instance=RequestContext(request)) else : @@ -217,13 +204,13 @@ old_live = [] for live in init_live : old_live.append(live.id) - logger.debug("addlive_init : "+str(init_live)) form_status = "none" if request.method == "POST" : AddLiveFormSet = formset_factory(LiveAddForm) add_live_form_set = AddLiveFormSet(request.POST) new_live = [] + for form in add_live_form_set : form.empty_permitted = False if add_live_form_set.is_valid() : @@ -265,24 +252,23 @@ def add_content(request, event_slug) : submit_action = request.REQUEST.get("submit_button", False) current_language = get_language().split("-")[0] - default_language = settings.LANGUAGES[0][0] - all_languages = settings.LANGUAGES - translation_languages = [] - - - for l in all_languages: - if l[0] != current_language: - translation_languages.append(l[0]) + translation_languages = get_translation_languages() if submit_action=="close" : return render_to_response('home.html', {'message': "You didn't add any content", 'translation_languages' : translation_languages, 'current_language' : current_language}, context_instance=RequestContext(request)) else : event = get_object_or_404(Event.objects, slug=event_slug) - init_content = event.content_set.all().values() events = [event, ] - translation_added = False + init_content = event.content_set.all() + init_value = init_content.values() + old_content = [] + + for content in init_content : + old_content.append(content.id) + form_status = "none" + new_content = [] if request.method == "POST" : AddContentFormSet = formset_factory(ContentAddForm) add_content_form_set = AddContentFormSet(request.POST) @@ -290,44 +276,24 @@ form.empty_permitted = False if add_content_form_set.is_valid() : for form in add_content_form_set : - content = Content.create_content(display=form.cleaned_data['display'], - program=form.cleaned_data['program'], - url=form.cleaned_data['url'], + content = Content.create_or_change_content(data=form.cleaned_data, events=events) - - for language_code in translation_languages : - key_display = "display_"+language_code - key_program = "program_"+language_code - - value_display = request.POST.get(key_display) - value_program = request.POST.get(key_program) - - if value_display and value_display!="" : - translation_added = True - if key_display == "display_fr" : - content.display_fr = value_display - elif key_display == "display_en" : - content.display_en = value_display - else : - content.display_ja = value_display - - if value_program and value_program!="" : - translation_added = True - if key_program == "program_fr" : - content.program_fr = value_program - elif key_program == "program_en" : - content.program_en = value_program - else : - content.program_ja = value_program - - if translation_added : - content.save() + new_content.append(content.id) + + to_remove = list(set(old_content)-set(new_content)) + for content_id in to_remove : + content = Content.objects.get(id=content_id) + content.events.remove(event) form_status = "saved" else: AddContentFormSet = formset_factory(ContentAddForm) #add_content_form_set = AddContentFormSet(initial = init_content) - add_content_form_set = AddContentFormSet() + if len(init_content)>0 : + add_content_form_set = AddContentFormSet(initial = init_value) + else : + add_content_form_set = AddContentFormSet() + for form in add_content_form_set : form.empty_permitted = False diff -r 5a91860c5535 -r f3ba7e0bed68 src/polemictweet/views/group.py --- a/src/polemictweet/views/group.py Fri Feb 08 18:00:04 2013 +0100 +++ b/src/polemictweet/views/group.py Thu Feb 14 14:42:20 2013 +0100 @@ -36,46 +36,6 @@ if group_valid : if form_status != "error": group = group_form.save() - logger.debug("group : "+str(group)) - translation_added = False - - #if the user entered translations for title, description or program - for language_code in translation_languages : - key_title = "title_"+language_code - key_description = "description_"+language_code - value_title = request.POST.get(key_title) - value_description = request.POST.get(key_description) - - if value_title and value_title!="" : - translation_added = True - logger.debug("title translation exists") - if key_title == "title_fr" : - group.title_fr = value_title - elif key_title == "title_en" : - logger.debug("title english exists") - group.title_en = value_title - else : - group.title_ja = value_title - - if value_description and value_description!="" : - translation_added = True - if key_description == "description_fr" : - group.description_fr = value_description - elif key_description == "description_en" : - group.description_en = value_description - else : - group.description_ja = value_description - - if current_language != default_language : - if request.POST.get('title_fr') == '' : - translation_added = True - group.title_fr = request.POST.get('title') - if request.POST.get('description_fr') == '' : - translation_added = True - group.description_fr = request.POST.get('description') - - if translation_added : - group.save() form_status = 'saved' else: form_status = 'error' diff -r 5a91860c5535 -r f3ba7e0bed68 src/polemictweet/views/partner.py --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/src/polemictweet/views/partner.py Thu Feb 14 14:42:20 2013 +0100 @@ -0,0 +1,39 @@ +from django.conf import settings +from django.core.urlresolvers import reverse +from django.shortcuts import render_to_response +from django.template import RequestContext +from polemictweet.forms import PartnerForm +from django.utils.translation import get_language +from polemictweet.utils.translate_language import get_translation_languages +import sys +import logging + +logger = logging.getLogger(__name__) + + +def create_partner(request): + submit_action = request.REQUEST.get("submit_button", False) + current_language = get_language().split("-")[0] + translation_languages = get_translation_languages() + + if submit_action=="close": + return render_to_response('home.html', {'message': "You didn't create any partner", 'translation_languages' : translation_languages, 'current_language' : current_language}, context_instance=RequestContext(request)) + + else : + + form_status = "none" + if request.method == "POST" : + partner_form = PartnerForm(request.POST, request.FILES) + is_valid = partner_form.is_valid() + if is_valid : + partner_form.save() + form_status = "saved" + else: + partner_form = PartnerForm() + + if form_status=='saved' or form_status=='deleted': + return render_to_response('home.html', {'message': "You creates a partner", 'translation_languages' : translation_languages, 'current_language' : current_language}, context_instance=RequestContext(request)) + else : + create_partner_action = reverse('polemictweet.views.partner.create_partner') + return render_to_response('create_partner.html', {'partner_form':partner_form, 'form_status': form_status, + 'create_partner_action': create_partner_action, 'current_language' : current_language }, context_instance=RequestContext(request))