summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--chimere/admin.py6
-rw-r--r--chimere/fixtures/initial_data.json91
-rw-r--r--chimere/forms.py31
-rw-r--r--chimere/models.py15
-rw-r--r--chimere/templates/chimere/blocks/alternate_multimedia.html135
-rw-r--r--chimere/templatetags/chimere_tags.py8
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'):