diff options
author | Étienne Loks <etienne.loks@peacefrogs.net> | 2012-08-29 19:29:48 +0200 |
---|---|---|
committer | Étienne Loks <etienne.loks@peacefrogs.net> | 2012-11-26 15:53:31 +0100 |
commit | c978532f9ac828a812acb6fbb12da978eb55dc28 (patch) | |
tree | 5947d874f1e7e6c0b311075c23a49338e48bb851 /chimere | |
parent | 8a4293f93328ad4aca63a9019f68b41e004fbf18 (diff) | |
download | Chimère-c978532f9ac828a812acb6fbb12da978eb55dc28.tar.bz2 Chimère-c978532f9ac828a812acb6fbb12da978eb55dc28.zip |
Manage auto-detection of multimedia type by extension - improvement on alternate multimedia widget
Conflicts:
chimere/admin.py
chimere/forms.py
chimere/models.py
chimere/templates/chimere/blocks/alternate_multimedia.html
chimere/templatetags/chimere_tags.py
Diffstat (limited to 'chimere')
-rw-r--r-- | chimere/admin.py | 6 | ||||
-rw-r--r-- | chimere/fixtures/initial_data.json | 91 | ||||
-rw-r--r-- | chimere/forms.py | 31 | ||||
-rw-r--r-- | chimere/models.py | 15 | ||||
-rw-r--r-- | chimere/templates/chimere/blocks/alternate_multimedia.html | 135 | ||||
-rw-r--r-- | chimere/templatetags/chimere_tags.py | 8 |
6 files changed, 281 insertions, 5 deletions
diff --git a/chimere/admin.py b/chimere/admin.py index 1d3dcbe..147314e 100644 --- a/chimere/admin.py +++ b/chimere/admin.py @@ -387,6 +387,12 @@ class ColorThemeAdmin(admin.ModelAdmin): class IconAdmin(admin.ModelAdmin): exclude = ['height', 'width'] +class PropertyModelChoiceInline(admin.TabularInline): + model = PropertyModelChoice + extra = 1 +class PropertyModelAdmin(admin.ModelAdmin): + inlines = [PropertyModelChoiceInline] + # register of differents database fields admin.site.register(News, NewsAdmin) admin.site.register(Category, CategoryAdmin) diff --git a/chimere/fixtures/initial_data.json b/chimere/fixtures/initial_data.json index 248349d..883e499 100644 --- a/chimere/fixtures/initial_data.json +++ b/chimere/fixtures/initial_data.json @@ -165,6 +165,97 @@ } }, { + "pk": 16, + "model": "chimere.multimediatype", + "fields": { + "available": false, + "media_type": "O", + "iframe": false, + "name": "auto", + "mime_type": "" + } + }, + { + "pk": 1, + "model": "chimere.multimediaextension", + "fields": { + "multimedia_type": 7, + "name": "mkv" + } + }, + { + "pk": 3, + "model": "chimere.multimediaextension", + "fields": { + "multimedia_type": 2, + "name": "mp3" + } + }, + { + "pk": 4, + "model": "chimere.multimediaextension", + "fields": { + "multimedia_type": 3, + "name": "ogg" + } + }, + { + "pk": 5, + "model": "chimere.multimediaextension", + "fields": { + "multimedia_type": 5, + "name": "mp4" + } + }, + { + "pk": 6, + "model": "chimere.multimediaextension", + "fields": { + "multimedia_type": 4, + "name": "mpg" + } + }, + { + "pk": 7, + "model": "chimere.multimediaextension", + "fields": { + "multimedia_type": 4, + "name": "mpeg" + } + }, + { + "pk": 8, + "model": "chimere.multimediaextension", + "fields": { + "multimedia_type": 8, + "name": "avi" + } + }, + { + "pk": 9, + "model": "chimere.multimediaextension", + "fields": { + "multimedia_type": 6, + "name": "ogm" + } + }, + { + "pk": 10, + "model": "chimere.multimediaextension", + "fields": { + "multimedia_type": 6, + "name": "ogv" + } + }, + { + "pk": 11, + "model": "chimere.multimediaextension", + "fields": { + "multimedia_type": 13, + "name": "webm" + } + } + { "pk": 1, "model": "chimere.layer", "fields": { diff --git a/chimere/forms.py b/chimere/forms.py index efea3dd..813f0f8 100644 --- a/chimere/forms.py +++ b/chimere/forms.py @@ -32,8 +32,9 @@ from django.contrib.admin.widgets import AdminDateWidget from django.core.mail import EmailMessage, BadHeaderError from chimere.models import Marker, Route, PropertyModel, Property, Area,\ - News, Category, SubCategory, RouteFile, MultimediaFile, MultimediaType, \ - PictureFile, Importer, IMPORTER_CHOICES + News, Category, SubCategory, RouteFile, MultimediaFile, MultimediaType, \ + PictureFile, Importer, IMPORTER_CHOICES, PropertyModelChoice, IFRAME_LINKS,\ + MultimediaExtension from chimere.widgets import AreaField, PointField, TextareaWidget, \ ImportFiltrWidget, TextareaAdminWidget, DatePickerWidget, \ ImporterChoicesWidget, RE_XAPI @@ -425,7 +426,31 @@ class MultimediaFileForm(BaseFileForm): def __init__(self, *args, **kwargs): super(MultimediaFileForm, self).__init__(*args, **kwargs) self.fields['multimedia_type'].widget.choices = \ - MultimediaType.get_tuples() + MultimediaType.get_tuples() + + def clean(self): + if not self.cleaned_data.get('multimedia_type') or\ + not self.cleaned_data.get('url'): + return self.cleaned_data + if self.cleaned_data['multimedia_type'].name != 'auto': + return self.cleaned_data + url = self.cleaned_data['url'] + for mm_type in IFRAME_LINKS: + res, embeded_url = IFRAME_LINKS[mm_type] + if [r for r in res if r.search(url)]: + multimedia_type = MultimediaType.objects.get( + name__iexact=mm_type) + self.cleaned_data['multimedia_type'] = multimedia_type + return self.cleaned_data + ext = url.split(".")[-1] + q = MultimediaExtension.objects.filter(name__iendswith=ext) + if q.count(): + self.cleaned_data['multimedia_type'] = q.all()[0].multimedia_type + else: + # default to an iframe + self.cleaned_data['multimedia_type'] = \ + MultimediaType.objects.filter(name__iexact='iframe').all()[0] + return self.cleaned_data MultimediaFileFormSet = formset_factory(MultimediaFileForm, can_delete=True) diff --git a/chimere/models.py b/chimere/models.py index 03b5dce..6b7ffb9 100644 --- a/chimere/models.py +++ b/chimere/models.py @@ -607,7 +607,7 @@ IFRAME_LINKS = { 'youtube':((re.compile(r'youtube.com\/watch\?v=([A-Za-z0-9_-]*)'), re.compile(r'youtu.be\/([A-Za-z0-9_-]*)'), re.compile(r'youtube.com\/embed\/([A-Za-z0-9_-]*)')), - "http://www.youtube.com/embed/%s"), + "http://www.youtube.com/embed/%s"), 'dailymotion':( (re.compile(r'dailymotion.com/video/([A-Za-z0-9]*)_[A-Za-z0-9_-]*'), re.compile(r'dailymotion.com/embed/video/([A-Za-z0-9]*)'), @@ -618,6 +618,19 @@ IFRAME_LINKS = { "http://player.vimeo.com/video/%s") } +class MultimediaExtension(models.Model): + name = models.CharField(_(u"Extension name"), max_length=6) + multimedia_type = models.ForeignKey(MultimediaType, + verbose_name=_(u"Associated multimedia type"), + related_name='extensions') + + class Meta: + verbose_name = _(u"Multimedia extension") + verbose_name_plural = _(u"Multimedia extensions") + + def __unicode__(self): + return self.name + class MultimediaFile(models.Model): name = models.CharField(_(u"Name"), max_length=150) url = models.URLField(_(u"Url"), max_length=200) diff --git a/chimere/templates/chimere/blocks/alternate_multimedia.html b/chimere/templates/chimere/blocks/alternate_multimedia.html new file mode 100644 index 0000000..0662750 --- /dev/null +++ b/chimere/templates/chimere/blocks/alternate_multimedia.html @@ -0,0 +1,135 @@ +{% load i18n %} + <div id='multimedia_list'> + {% for formset in formsets %} + {{ formset.management_form }} + {% if formset.errors %}<div class='errors'> + {% for dict in formset.errors %} + {% for error in dict.values %} + {{ error }} + {% endfor %} + {% endfor %} + </div>{% endif %} + {% endfor %} + <ul id='multimedia_list_content'> + {% for formset in formsets %} + {% for frm in formset%} + {% if not forloop.last %} + <li> + {%if forloop.first %}{% for hidden in frm.hidden_fields %} + {{ hidden }} + {% endfor %}{% endif %} + {% for field in frm.visible_fields %} + {% if field.name == "name" %} + <span class='value'>{{ field.field.value }}</span> + {% endif %} + <span class='hidden'>{{field}}</span> + {% endfor %} + </li> + {% endif %} + {% endfor %} + {% endfor %} + </ul> + <button id='add_multimedia_list'>{% trans "Add" %}</button> + </div> + <div id='multimedia_form' title="{% trans "Add multimedia from your computer or a site"%}"> + <div class='notice'>{% trans "Lorem ipsum dolor sit amet, consectetur adipiscing elit. Nunc eu luctus ipsum. Donec vel urna a turpis consectetur consectetur. Vestibulum ut enim vel odio porta vulputate." %} + </div> + <div class="fieldWrapper"> + <label for="multimedia_name">{% trans "Name" %}</label> + <input type='text' id='multimedia_name' name='multimedia_name'> + </div> + <div class="fieldWrapper"> + <input type='radio' value='image' id='media_type_image' name="multimedia_type"> {% trans "Image" %} + <input type='radio' value='other' id='media_type_other' name="multimedia_type"> {% trans "Audio, video, other..." %} + </div> + <div class="fieldWrapper"> + <label id="multimedia_file_label">{% trans "Download"%}</label> <input type='file' name='picture-0-picture' id='picture-0-picture' class='multimedia_file'> + <p class='notice'>{% trans "Or" %}</p> + <label for='multimedia_url'>{% trans "Web address"%}</label> <input type='text' name='multimedia_url' id='multimedia_url'> + </div> + <button id='add_media'>{% trans "Add" %}</button> + </div> + <script text='text/javascript'> + $(function(){ + var current_image_number = 0; + var current_multi_number = 0; + $("#multimedia_form").dialog({autoOpen:false, + modal:true, + resizable:false, + width:400, + height:250}); + $('#add_multimedia_list').click(function(){ + $("#multimedia_form").dialog("open"); + return false; + }); + $('#media_type_image').click(function(){ + $("#multimedia_file_label").removeClass('disabled'); + $("#multimedia_file").removeAttr('disabled'); + }); + $('#media_type_other').click(function(){ + $("#multimedia_file_label").addClass('disabled'); + $("#multimedia_file").attr('disabled', 'disabled'); + }); + $('#add_media').click(function(){ + // test the validity + if (!$('#multimedia_name').val()){ + alert("{% trans "You must provide a name." %}") + return false; + } + if (!$('#media_type_image:checked').val() && + !$('#media_type_other:checked').val()){ + alert("{% trans "You must choose a media type." %}") + return false; + } + if ($('#media_type_image:checked').val() + && !$("#picture-"+current_image_number+"-picture").val() + && !$("#multimedia_url").val()){ + alert("{% trans "You must provide a file or a web address." %}") + return false; + } + if ($('#media_type_other:checked').val() + && !$("#multimedia_url").val()){ + alert("{% trans "You must provide a web address." %}") + return false; + } + // recopy field in the main form + var prefix = ''; + var contener = $("#multimedia_list_content") + content = '<li'; + if ($('#media_type_image:checked').val()){ + content += ' class="picture">'; + prefix = 'picture-' + current_image_number; + } else { + content += ' class="multimedia">'; + prefix = 'multimedia-' + current_multi_number; + content += '<input type="hidden" name="'+prefix+'-multimedia_type" value="{{auto_type_id}}" />\n'; + content += '<input type="hidden" name="'+prefix+'-url" value="'+$("#multimedia_url").val()+'" />\n'; + } + content += '<input type="hidden" name="'+prefix+'-id"/>\n'; + content += '<input type="hidden" name="'+prefix+'-miniature" value="1"/>\n'; + content += '<input type="hidden" name="'+prefix+'-DELETE" value=""/>\n'; + content += '<input type="hidden" name="'+prefix+'-name" value="'+ $("#multimedia_name").val() +'"/>\n'; + content += $("#multimedia_name").val(); + content += " <img class='remove-media' src='{{STATIC_URL}}chimere/img/close.png'/>"; + content += '</li>'; + contener.append(content); + if ($('#media_type_image:checked').val() + && $("#picture-"+current_image_number+"-picture").val()){ + // the file item cannot be recopied - security issue + // so it is hiden then a new one is added + //$('#picture-'+current_image_number+'-picture').hide(); + var file_item = $('#picture-'+current_image_number+'-picture'); + //var cloned = file_item.clone(true); + //file_item.hide(); + //cloned.insertAfter(file_item); + file_item.appendTo($("#multimedia_list_content li").last()); + } + $("#multimedia_form").dialog("close"); + $(".remove-media").click(function(){ + $(this).parents('li').remove(); + }); + return false; + }); + }); + </script> + diff --git a/chimere/templatetags/chimere_tags.py b/chimere/templatetags/chimere_tags.py index 7753bc0..2b806ca 100644 --- a/chimere/templatetags/chimere_tags.py +++ b/chimere/templatetags/chimere_tags.py @@ -12,7 +12,7 @@ from django.core.urlresolvers import reverse from django.db.models import Q, Count from django.template.loader import render_to_string -from chimere.models import Marker, Area, News, SubCategory +from chimere.models import Marker, Area, News, SubCategory, MultimediaType from chimere.widgets import get_map_layers log = getLogger(__name__) @@ -203,6 +203,12 @@ def multimedia_render(context, multimedia_file): context['multimedia_item'] = multimedia_file return context +@register.inclusion_tag('chimere/blocks/alternate_multimedia.html') +def alternate_multimedia(formset_multi, formset_picture): + return {'formsets':[formset_multi, formset_picture], + "STATIC_URL": settings.STATIC_URL, + 'auto_type_id':MultimediaType.objects.get(name='auto').pk} + @register.simple_tag def get_tinyfied_url(marker, area_name=''): if not marker or not hasattr(marker, 'get_absolute_url'): |