summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorÉtienne Loks <etienne.loks@peacefrogs.net>2012-03-01 14:43:52 +0100
committerÉtienne Loks <etienne.loks@peacefrogs.net>2012-03-01 14:43:52 +0100
commita11b858cdec741c595d3fcc9849eef617061c19b (patch)
treeab34297fa527a2a9ac9e55b9f7a1b84512b94ba9
parenta5073fc3ad169b7f0f68d486fc6f7bd89365fb7f (diff)
downloadChimère-a11b858cdec741c595d3fcc9849eef617061c19b.tar.bz2
Chimère-a11b858cdec741c595d3fcc9849eef617061c19b.zip
Manage mimetypes, order of multimedia types
-rw-r--r--apache/apache-wsgi.conf1
-rw-r--r--chimere/admin.py23
-rw-r--r--chimere/fixtures/initial_data.json80
-rw-r--r--chimere/migrations/0006_auto__add_multimediatype__add_field_picturefile_order__del_field_multi.py226
-rw-r--r--chimere/models.py43
-rw-r--r--chimere/static/chimere/css/styles.css3
-rw-r--r--chimere/templates/chimere/detail.html31
-rw-r--r--debian/control2
-rw-r--r--example_project/settings.py.example2
9 files changed, 403 insertions, 8 deletions
diff --git a/apache/apache-wsgi.conf b/apache/apache-wsgi.conf
index 16a893c..9ff7024 100644
--- a/apache/apache-wsgi.conf
+++ b/apache/apache-wsgi.conf
@@ -4,6 +4,7 @@
WSGIProcessGroup chimere
WSGIScriptAlias / /var/local/chimere/chimere/apache/django.wsgi
Alias /static "/var/local/chimere/chimere/static"
+ Alias /admin-media "/usr/lib/python2.7/dist-packages/django/contrib/admin/media/"
Alias /tinymce "/usr/share/tinymce/www"
<Directory "/usr/share/tinymce/www/">
Options Indexes MultiViews FollowSymLinks
diff --git a/chimere/admin.py b/chimere/admin.py
index 28f768d..70853d4 100644
--- a/chimere/admin.py
+++ b/chimere/admin.py
@@ -1,6 +1,6 @@
#!/usr/bin/env python
# -*- coding: utf-8 -*-
-# Copyright (C) 2008-2010 Étienne Loks <etienne.loks_AT_peacefrogsDOTnet>
+# Copyright (C) 2008-2012 Étienne Loks <etienne.loks_AT_peacefrogsDOTnet>
# This program is free software: you can redistribute it and/or modify
# it under the terms of the GNU General Public License as
@@ -25,7 +25,8 @@ from django.conf import settings
from django.contrib import admin
from chimere.models import Category, Icon, SubCategory, Marker, \
- PropertyModel, News, Route, Area, ColorTheme, Color, RouteFile
+ PropertyModel, News, Route, Area, ColorTheme, Color, RouteFile,\
+ MultimediaType, MultimediaFile, PictureFile
from chimere.forms import MarkerAdminForm, RouteAdminForm, AreaAdminForm,\
NewsAdminForm, CategoryAdminForm
from chimere.widgets import TextareaWidget
@@ -129,6 +130,21 @@ class IconAdmin(admin.ModelAdmin):
class RouteFileAdmin(admin.ModelAdmin):
list_display = ['name', 'file_type']
+class MultimediaTypeAdmin(admin.ModelAdmin):
+ search_fields = ("name",)
+ list_display = ('name', 'media_type', 'mime_type', 'available')
+ list_filter = ('media_type', 'available')
+
+class MultimediaFileAdmin(admin.ModelAdmin):
+ search_fields = ("name",)
+ list_display = ('name', 'multimedia_type', 'order')
+ list_filter = ('multimedia_type',)
+
+class PictureFileAdmin(admin.ModelAdmin):
+ search_fields = ("name",)
+ list_display = ('name', 'picture', 'miniature', 'order')
+ list_filter = ('miniature',)
+
# register of differents database fields
admin.site.register(News, NewsAdmin)
admin.site.register(Category, CategoryAdmin)
@@ -140,3 +156,6 @@ admin.site.register(Route, RouteAdmin)
admin.site.register(PropertyModel)
admin.site.register(Area, AreaAdmin)
admin.site.register(ColorTheme, ColorThemeAdmin)
+admin.site.register(MultimediaType, MultimediaTypeAdmin)
+admin.site.register(MultimediaFile, MultimediaFileAdmin)
+admin.site.register(PictureFile, PictureFileAdmin)
diff --git a/chimere/fixtures/initial_data.json b/chimere/fixtures/initial_data.json
index b306e58..43664fb 100644
--- a/chimere/fixtures/initial_data.json
+++ b/chimere/fixtures/initial_data.json
@@ -935,5 +935,85 @@
"email": "etienne@peacefrogs.net",
"date_joined": "2012-02-18 19:13:42"
}
+ },
+ {
+ "pk": 7,
+ "model": "chimere.multimediatype",
+ "fields": {
+ "available": true,
+ "media_type": "V",
+ "name": "Matroska (mkv)",
+ "mime_type": "video/x-matroska"
+ }
+ },
+ {
+ "pk": 1,
+ "model": "chimere.multimediatype",
+ "fields": {
+ "available": true,
+ "media_type": "A",
+ "name": "MP4 (mp4)",
+ "mime_type": "audio/mp4"
+ }
+ },
+ {
+ "pk": 2,
+ "model": "chimere.multimediatype",
+ "fields": {
+ "available": true,
+ "media_type": "A",
+ "name": "MP3 (mp3)",
+ "mime_type": "audio/mpeg"
+ }
+ },
+ {
+ "pk": 3,
+ "model": "chimere.multimediatype",
+ "fields": {
+ "available": true,
+ "media_type": "A",
+ "name": "Ogg Vorbis (ogg)",
+ "mime_type": "audio/ogg"
+ }
+ },
+ {
+ "pk": 5,
+ "model": "chimere.multimediatype",
+ "fields": {
+ "available": true,
+ "media_type": "V",
+ "name": "MP4 (mp4)",
+ "mime_type": "video/mp4"
+ }
+ },
+ {
+ "pk": 4,
+ "model": "chimere.multimediatype",
+ "fields": {
+ "available": true,
+ "media_type": "V",
+ "name": "MPEG-1 (mpg, mpeg)",
+ "mime_type": "video/mpeg"
+ }
+ },
+ {
+ "pk": 8,
+ "model": "chimere.multimediatype",
+ "fields": {
+ "available": true,
+ "media_type": "V",
+ "name": "AVI - xvid, mp3 (avi)",
+ "mime_type": "video/msvideo; codecs='xvid,mp3'"
+ }
+ },
+ {
+ "pk": 6,
+ "model": "chimere.multimediatype",
+ "fields": {
+ "available": true,
+ "media_type": "V",
+ "name": "Ogg Theora (ogg, ogm, ogv)",
+ "mime_type": "video/ogg"
+ }
}
]
diff --git a/chimere/migrations/0006_auto__add_multimediatype__add_field_picturefile_order__del_field_multi.py b/chimere/migrations/0006_auto__add_multimediatype__add_field_picturefile_order__del_field_multi.py
new file mode 100644
index 0000000..9e369f7
--- /dev/null
+++ b/chimere/migrations/0006_auto__add_multimediatype__add_field_picturefile_order__del_field_multi.py
@@ -0,0 +1,226 @@
+# encoding: utf-8
+import datetime
+from south.db import db
+from south.v2 import SchemaMigration
+from django.db import models
+
+class Migration(SchemaMigration):
+
+ def forwards(self, orm):
+
+ # Adding model 'MultimediaType'
+ db.create_table('chimere_multimediatype', (
+ ('id', self.gf('django.db.models.fields.AutoField')(primary_key=True)),
+ ('media_type', self.gf('django.db.models.fields.CharField')(max_length=1)),
+ ('name', self.gf('django.db.models.fields.CharField')(max_length=150)),
+ ('mime_type', self.gf('django.db.models.fields.CharField')(max_length=50)),
+ ('available', self.gf('django.db.models.fields.BooleanField')(default=True)),
+ ))
+ db.send_create_signal('chimere', ['MultimediaType'])
+
+ # Adding field 'PictureFile.order'
+ db.add_column('chimere_picturefile', 'order', self.gf('django.db.models.fields.IntegerField')(default=1), keep_default=False)
+
+ # Deleting field 'MultimediaFile.file_type'
+ db.delete_column('chimere_multimediafile', 'file_type')
+
+ # Adding field 'MultimediaFile.iframe'
+ db.add_column('chimere_multimediafile', 'iframe', self.gf('django.db.models.fields.CharField')(max_length=1000, null=True, blank=True), keep_default=False)
+
+ # Adding field 'MultimediaFile.order'
+ db.add_column('chimere_multimediafile', 'order', self.gf('django.db.models.fields.IntegerField')(default=1), keep_default=False)
+
+ # Adding field 'MultimediaFile.multimedia_type'
+ db.add_column('chimere_multimediafile', 'multimedia_type', self.gf('django.db.models.fields.related.ForeignKey')(to=orm['chimere.MultimediaType'], null=True, blank=True), keep_default=False)
+
+ # Changing field 'MultimediaFile.url'
+ db.alter_column('chimere_multimediafile', 'url', self.gf('django.db.models.fields.CharField')(max_length=200, null=True))
+
+ # Removing M2M table for field multimedia_files on 'Marker'
+ db.delete_table('chimere_marker_multimedia_files')
+
+
+ def backwards(self, orm):
+
+ # Deleting model 'MultimediaType'
+ db.delete_table('chimere_multimediatype')
+
+ # Deleting field 'PictureFile.order'
+ db.delete_column('chimere_picturefile', 'order')
+
+ # User chose to not deal with backwards NULL issues for 'MultimediaFile.file_type'
+ raise RuntimeError("Cannot reverse this migration. 'MultimediaFile.file_type' and its values cannot be restored.")
+
+ # Deleting field 'MultimediaFile.iframe'
+ db.delete_column('chimere_multimediafile', 'iframe')
+
+ # Deleting field 'MultimediaFile.order'
+ db.delete_column('chimere_multimediafile', 'order')
+
+ # Deleting field 'MultimediaFile.multimedia_type'
+ db.delete_column('chimere_multimediafile', 'multimedia_type_id')
+
+ # User chose to not deal with backwards NULL issues for 'MultimediaFile.url'
+ raise RuntimeError("Cannot reverse this migration. 'MultimediaFile.url' and its values cannot be restored.")
+
+ # Adding M2M table for field multimedia_files on 'Marker'
+ db.create_table('chimere_marker_multimedia_files', (
+ ('id', models.AutoField(verbose_name='ID', primary_key=True, auto_created=True)),
+ ('marker', models.ForeignKey(orm['chimere.marker'], null=False)),
+ ('multimediafile', models.ForeignKey(orm['chimere.multimediafile'], null=False))
+ ))
+ db.create_unique('chimere_marker_multimedia_files', ['marker_id', 'multimediafile_id'])
+
+
+ models = {
+ 'chimere.area': {
+ 'Meta': {'ordering': "('order', 'name')", 'object_name': 'Area'},
+ 'available': ('django.db.models.fields.BooleanField', [], {'default': 'False'}),
+ 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
+ 'lower_right_corner': ('django.contrib.gis.db.models.fields.PointField', [], {'default': "'POINT(0 0)'"}),
+ 'name': ('django.db.models.fields.CharField', [], {'max_length': '150'}),
+ 'order': ('django.db.models.fields.IntegerField', [], {}),
+ 'upper_left_corner': ('django.contrib.gis.db.models.fields.PointField', [], {'default': "'POINT(0 0)'"}),
+ 'urn': ('django.db.models.fields.SlugField', [], {'db_index': 'True', 'unique': 'True', 'max_length': '50', 'blank': 'True'})
+ },
+ 'chimere.category': {
+ 'Meta': {'ordering': "['order']", 'object_name': 'Category'},
+ 'available': ('django.db.models.fields.BooleanField', [], {'default': 'False'}),
+ 'description': ('django.db.models.fields.TextField', [], {'null': 'True', 'blank': 'True'}),
+ 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
+ 'name': ('django.db.models.fields.CharField', [], {'max_length': '150'}),
+ 'order': ('django.db.models.fields.IntegerField', [], {})
+ },
+ 'chimere.color': {
+ 'Meta': {'ordering': "['order']", 'object_name': 'Color'},
+ 'code': ('django.db.models.fields.CharField', [], {'max_length': '6'}),
+ 'color_theme': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['chimere.ColorTheme']"}),
+ 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
+ 'order': ('django.db.models.fields.IntegerField', [], {})
+ },
+ 'chimere.colortheme': {
+ 'Meta': {'object_name': 'ColorTheme'},
+ 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
+ 'name': ('django.db.models.fields.CharField', [], {'max_length': '150'})
+ },
+ 'chimere.icon': {
+ 'Meta': {'object_name': 'Icon'},
+ 'height': ('django.db.models.fields.IntegerField', [], {}),
+ 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
+ 'image': ('django.db.models.fields.files.ImageField', [], {'max_length': '100'}),
+ 'name': ('django.db.models.fields.CharField', [], {'max_length': '150'}),
+ 'width': ('django.db.models.fields.IntegerField', [], {})
+ },
+ 'chimere.marker': {
+ 'Meta': {'ordering': "('status', 'name')", 'object_name': 'Marker'},
+ 'available_date': ('django.db.models.fields.DateTimeField', [], {'null': 'True', 'blank': 'True'}),
+ 'categories': ('chimere.widgets.SelectMultipleField', [], {'to': "orm['chimere.SubCategory']", 'symmetrical': 'False'}),
+ 'end_date': ('django.db.models.fields.DateField', [], {'null': 'True', 'blank': 'True'}),
+ 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
+ 'name': ('django.db.models.fields.CharField', [], {'max_length': '150'}),
+ 'pictures': ('django.db.models.fields.related.ManyToManyField', [], {'symmetrical': 'False', 'to': "orm['chimere.PictureFile']", 'null': 'True', 'blank': 'True'}),
+ 'point': ('chimere.widgets.PointField', [], {}),
+ 'ref_item': ('django.db.models.fields.related.ForeignKey', [], {'blank': 'True', 'related_name': "'submited_marker'", 'null': 'True', 'to': "orm['chimere.Marker']"}),
+ 'route': ('django.db.models.fields.related.ForeignKey', [], {'blank': 'True', 'related_name': "'associated_marker'", 'null': 'True', 'to': "orm['chimere.Route']"}),
+ 'start_date': ('django.db.models.fields.DateField', [], {'null': 'True', 'blank': 'True'}),
+ 'status': ('django.db.models.fields.CharField', [], {'max_length': '1'}),
+ 'submiter_comment': ('django.db.models.fields.CharField', [], {'max_length': '200', 'null': 'True', 'blank': 'True'}),
+ 'submiter_email': ('django.db.models.fields.EmailField', [], {'max_length': '75', 'null': 'True', 'blank': 'True'}),
+ 'submiter_session_key': ('django.db.models.fields.CharField', [], {'max_length': '40', 'null': 'True', 'blank': 'True'})
+ },
+ 'chimere.multimediafile': {
+ 'Meta': {'object_name': 'MultimediaFile'},
+ 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
+ 'iframe': ('django.db.models.fields.CharField', [], {'max_length': '1000', 'null': 'True', 'blank': 'True'}),
+ 'multimedia_type': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['chimere.MultimediaType']", 'null': 'True', 'blank': 'True'}),
+ 'name': ('django.db.models.fields.CharField', [], {'max_length': '150', 'null': 'True', 'blank': 'True'}),
+ 'order': ('django.db.models.fields.IntegerField', [], {'default': '1'}),
+ 'url': ('django.db.models.fields.CharField', [], {'max_length': '200', 'null': 'True', 'blank': 'True'})
+ },
+ 'chimere.multimediatype': {
+ 'Meta': {'object_name': 'MultimediaType'},
+ 'available': ('django.db.models.fields.BooleanField', [], {'default': 'True'}),
+ 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
+ 'media_type': ('django.db.models.fields.CharField', [], {'max_length': '1'}),
+ 'mime_type': ('django.db.models.fields.CharField', [], {'max_length': '50'}),
+ 'name': ('django.db.models.fields.CharField', [], {'max_length': '150'})
+ },
+ 'chimere.news': {
+ 'Meta': {'object_name': 'News'},
+ 'available': ('django.db.models.fields.BooleanField', [], {'default': 'False'}),
+ 'content': ('django.db.models.fields.TextField', [], {}),
+ 'date': ('django.db.models.fields.DateField', [], {'auto_now_add': 'True', 'blank': 'True'}),
+ 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
+ 'title': ('django.db.models.fields.CharField', [], {'max_length': '150'})
+ },
+ 'chimere.picturefile': {
+ 'Meta': {'object_name': 'PictureFile'},
+ 'height': ('django.db.models.fields.IntegerField', [], {}),
+ 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
+ 'miniature': ('django.db.models.fields.BooleanField', [], {'default': 'False'}),
+ 'name': ('django.db.models.fields.CharField', [], {'max_length': '150', 'null': 'True', 'blank': 'True'}),
+ 'order': ('django.db.models.fields.IntegerField', [], {'default': '1'}),
+ 'picture': ('django.db.models.fields.files.ImageField', [], {'max_length': '100'}),
+ 'width': ('django.db.models.fields.IntegerField', [], {})
+ },
+ 'chimere.property': {
+ 'Meta': {'object_name': 'Property'},
+ 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
+ 'marker': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['chimere.Marker']"}),
+ 'propertymodel': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['chimere.PropertyModel']"}),
+ 'value': ('django.db.models.fields.TextField', [], {})
+ },
+ 'chimere.propertymodel': {
+ 'Meta': {'ordering': "('order',)", 'object_name': 'PropertyModel'},
+ 'available': ('django.db.models.fields.BooleanField', [], {'default': 'False'}),
+ 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
+ 'name': ('django.db.models.fields.CharField', [], {'max_length': '150'}),
+ 'order': ('django.db.models.fields.IntegerField', [], {}),
+ 'type': ('django.db.models.fields.CharField', [], {'max_length': '1'})
+ },
+ 'chimere.route': {
+ 'Meta': {'ordering': "('status', 'name')", 'object_name': 'Route'},
+ 'associated_file': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['chimere.RouteFile']", 'null': 'True', 'blank': 'True'}),
+ 'categories': ('chimere.widgets.SelectMultipleField', [], {'to': "orm['chimere.SubCategory']", 'symmetrical': 'False'}),
+ 'end_date': ('django.db.models.fields.DateField', [], {'null': 'True', 'blank': 'True'}),
+ 'height': ('django.db.models.fields.IntegerField', [], {'null': 'True', 'blank': 'True'}),
+ 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
+ 'name': ('django.db.models.fields.CharField', [], {'max_length': '150'}),
+ 'picture': ('django.db.models.fields.files.ImageField', [], {'max_length': '100', 'null': 'True', 'blank': 'True'}),
+ 'ref_item': ('django.db.models.fields.related.ForeignKey', [], {'blank': 'True', 'related_name': "'submited_route'", 'null': 'True', 'to': "orm['chimere.Route']"}),
+ 'route': ('chimere.widgets.RouteField', [], {}),
+ 'start_date': ('django.db.models.fields.DateField', [], {'null': 'True', 'blank': 'True'}),
+ 'status': ('django.db.models.fields.CharField', [], {'max_length': '1'}),
+ 'submiter_comment': ('django.db.models.fields.CharField', [], {'max_length': '200', 'null': 'True', 'blank': 'True'}),
+ 'submiter_email': ('django.db.models.fields.EmailField', [], {'max_length': '75', 'null': 'True', 'blank': 'True'}),
+ 'submiter_session_key': ('django.db.models.fields.CharField', [], {'max_length': '40', 'null': 'True', 'blank': 'True'}),
+ 'width': ('django.db.models.fields.IntegerField', [], {'null': 'True', 'blank': 'True'})
+ },
+ 'chimere.routefile': {
+ 'Meta': {'ordering': "('name',)", 'object_name': 'RouteFile'},
+ 'file_type': ('django.db.models.fields.CharField', [], {'max_length': '1'}),
+ 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
+ 'name': ('django.db.models.fields.CharField', [], {'max_length': '150'}),
+ 'raw_file': ('django.db.models.fields.files.FileField', [], {'max_length': '100'}),
+ 'simplified_file': ('django.db.models.fields.files.FileField', [], {'max_length': '100', 'null': 'True', 'blank': 'True'})
+ },
+ 'chimere.subcategory': {
+ 'Meta': {'ordering': "['category', 'order']", 'object_name': 'SubCategory'},
+ 'areas': ('chimere.widgets.SelectMultipleField', [], {'symmetrical': 'False', 'related_name': "'areas'", 'blank': 'True', 'to': "orm['chimere.Area']"}),
+ 'available': ('django.db.models.fields.BooleanField', [], {'default': 'False'}),
+ 'category': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['chimere.Category']"}),
+ 'color_theme': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['chimere.ColorTheme']", 'null': 'True', 'blank': 'True'}),
+ 'icon': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['chimere.Icon']"}),
+ 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
+ 'item_type': ('django.db.models.fields.CharField', [], {'max_length': '1'}),
+ 'name': ('django.db.models.fields.CharField', [], {'max_length': '150'}),
+ 'order': ('django.db.models.fields.IntegerField', [], {})
+ },
+ 'chimere.tinyurl': {
+ 'Meta': {'object_name': 'TinyUrl'},
+ 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
+ 'parameters': ('django.db.models.fields.CharField', [], {'max_length': '500'})
+ }
+ }
+
+ complete_apps = ['chimere']
diff --git a/chimere/models.py b/chimere/models.py
index f33772c..5282fca 100644
--- a/chimere/models.py
+++ b/chimere/models.py
@@ -30,6 +30,7 @@ from django.contrib.gis.db import models
from django.contrib.gis.gdal import SpatialReference
from django.contrib import admin
from django.core.files import File
+from django.core.exceptions import ValidationError
from django import forms
from django.utils.translation import ugettext_lazy as _
@@ -351,18 +352,54 @@ class Marker(GeographicItem):
self.default_category.pk)
return settings.BASE_URL + 'ty/' + TinyUrl.getUrnByParameters(parameters)
+class MultimediaType(models.Model):
+ MEDIA_TYPES = (('A', _(u"Audio")),
+ ('V', _(u"Video")),
+ ('I', _(u"Image")))
+ media_type = models.CharField(_(u"Media type"), max_length=1,
+ choices=MEDIA_TYPES)
+ name = models.CharField(_(u"Name"), max_length=150)
+ mime_type = models.CharField(_(u"Mime type"), max_length=50)
+ available = models.BooleanField(_(u"Available"), default=True)
+
+ def __unicode__(self):
+ return self.name
+
class MultimediaFile(models.Model):
name = models.CharField(_(u"Name"), max_length=150, blank=True, null=True)
- url = models.CharField(_(u"Url"), max_length=200)
- file_type = models.CharField(_(u"File type"), max_length=6)
+ url = models.CharField(_(u"Url"), max_length=200, blank=True, null=True)
+ iframe = models.CharField(_(u"Iframe"), max_length=1000, blank=True,
+ null=True)
+ order = models.IntegerField(_(u"Order"), default=1)
+ multimedia_type = models.ForeignKey(MultimediaType, blank=True,
+ null=True)
+
+ def __unicode__(self):
+ return self.name
+
+ def clean(self):
+ if self.url and not self.multimedia_type:
+ raise ValidationError(_(u"Multimedia type is mandatory if you "\
+ u"provide an url."))
+ if not self.url and not self.iframe:
+ raise ValidationError(_(u"You must provide at least provide an "\
+ u" url or an iframe."))
+ if self.url and self.iframe:
+ raise ValidationError(_(u"You must provide an url OR an"\
+ u"iframe."))
+
class PictureFile(models.Model):
- miniature = models.BooleanField(u"Miniature")
+ miniature = models.BooleanField(_(u"Miniature"))
name = models.CharField(_(u"Name"), max_length=150, blank=True, null=True)
picture = models.ImageField(_(u"Image"), upload_to='upload',
height_field='height', width_field='width')
height = models.IntegerField(_(u"Height"))
width = models.IntegerField(_(u"Width"))
+ order = models.IntegerField(_(u"Order"), default=1)
+
+ def __unicode__(self):
+ return self.name
class RouteFile(models.Model):
name = models.CharField(_(u"Name"), max_length=150)
diff --git a/chimere/static/chimere/css/styles.css b/chimere/static/chimere/css/styles.css
index 744f920..ef13e7d 100644
--- a/chimere/static/chimere/css/styles.css
+++ b/chimere/static/chimere/css/styles.css
@@ -523,3 +523,6 @@ a#welcome_button{
.simple .cloud img{display:None;}
+#gallery{
+ display:none;
+}
diff --git a/chimere/templates/chimere/detail.html b/chimere/templates/chimere/detail.html
index d88e88a..3218d63 100644
--- a/chimere/templates/chimere/detail.html
+++ b/chimere/templates/chimere/detail.html
@@ -11,7 +11,7 @@
<p id='{{property.propertymodel.getNamedId}}'>{{ property.value|sanitize:"p b i br hr strong em span:style a:href:target ul li ol h1 h2 h3 h4"|safe}}</p>
{% endfor %}
{% if multimedia_files or multimedia_pictures %}
- <a href=''>{% trans "Show multimedia gallery" %}</a>
+ <a href='#' id='show_gallery_link'>{% trans "Show multimedia gallery" %}</a>
{% endif %}
</div>{% if share_networks %}
{% if simple %}{% trans "Share on"%}{% for share_network in share_networks %}
@@ -26,5 +26,34 @@
</a>
{% endif %}
</div>
+{% if multimedia_files or multimedia_pictures %}
<div id='gallery'>
+ <ul>{% for multimedia_picture in multimedia_pictures %}
+ <li><a href="#tab-picture-{% forloop.counter0 %}">{{ multimedia_picture.name }}</a></li>{% endfor %}
+ {% for multimedia_file in multimedia_files %}
+ <li><a href="#tab-multi-{% forloop.counter0 %}">{{ multimedia_file.name }}</a></li>{% endfor %}
+ </ul>
+ {% for multimedia_picture in multimedia_pictures %}
+ <div id="tab-picture-{% forloop.counter0 %}">
+ <img alt="{{multimedia_picture.name}}" src='{{MEDIA_URL}}{{multimedia_picture}}'/>
+ </div>{% endfor %}
+ {% for multimedia_file in multimedia_files %}
+ <div id="tab-multi-{% forloop.counter0 %}">
+ <div class="media-player">
+ <span class="media-label">{{multimedia_file.name}}</span>
+
+ <video preload="none" controls="controls">
+ <source src="{{multimedia_file.url}}" type="video/mp4" />
+ <div class="fallback">
+ <div class="fallback-text">
+ <p>{% trans "Please use a modern browser or install the non free Flash-Plugin."}</p>
+ <ul>
+ <li><a class="source" href="{{multimedia_file.url}}">{{multimedia_file.name}}</a></li>
+ </ul>
+ </div>
+ </div>
+ </video>
+ </div>
+ </div>{% endfor %}
</div>
+{% endif %}
diff --git a/debian/control b/debian/control
index e8b57c5..54fb16f 100644
--- a/debian/control
+++ b/debian/control
@@ -3,6 +3,6 @@ Version: 2.0
Depends: python-django (>=1.3), python-gdal, python-psycopg2,
python-beautifulsoup, python-imaging, libjs-jquery,
libjs-jquery-ui, libjs-jquery-ui-theme-base,
- postgresql-9.1, postgresql-9.1-postgis
+ postgresql-9.1, postgresql-9.1-postgis, gettext
Recommends: tinymce, gpsbabel
Suggests: libjs-jquery-ui-theme-south-street
diff --git a/example_project/settings.py.example b/example_project/settings.py.example
index 3467d54..6cef223 100644
--- a/example_project/settings.py.example
+++ b/example_project/settings.py.example
@@ -128,7 +128,7 @@ SHARE_NETWORKS = (
# URL prefix for admin media -- CSS, JavaScript and images. Make sure to use a
# trailing slash.
# Examples: "http://foo.com/media/", "/media/".
-ADMIN_MEDIA_PREFIX = '/' + EXTRA_URL + 'media/'
+ADMIN_MEDIA_PREFIX = '/' + EXTRA_URL + '/admin-media/'
# Make this unique, and don't share it with anybody.
SECRET_KEY = 'achanger_!ToChange!'