# -*- coding: utf-8 -*-
# Django settings for sandbox project.
-import os
+import os, sys
from django.core.urlresolvers import reverse_lazy, reverse
DEBUG = True
TEMPLATE_DEBUG = DEBUG
+sys.dont_write_bytecode = True
ADMINS = (
('Guillaume Pellerin', 'yomguy@parisson.com'),
'django.contrib.staticfiles',
'django_extensions',
'telemeta',
- 'timeside',
+ 'timeside.player',
'jsonrpc',
'south',
'sorl.thumbnail',
'timezones',
'jqchat',
'extra_views',
- # 'pagination',
# 'breadcrumbs',
'debug_toolbar',
'bootstrap3',
- 'pure_pagination',
+ 'bootstrap_pagination',
)
TEMPLATE_CONTEXT_PROCESSORS = (
SESSION_EXPIRE_AT_BROWSER_CLOSE = False
+# Settings for django-bootstrap3
+
+BOOTSTRAP3 = {
+ 'set_required': False,
+ 'error_css_class': 'bootstrap3-error',
+ 'required_css_class': 'bootstrap3-required',
+ 'javascript_in_head': True,
+}
+
PAGINATION_SETTINGS = {
'PAGE_RANGE_DISPLAYED': 10,
'MARGIN_PAGES_DISPLAYED': 2,
'pyyaml',
'python-ebml',
'django-extra-views',
- 'django-ajax-selects',
'django-breadcrumbs',
- 'django-pagination',
+ 'django-bootstrap3',
+ 'django-bootstrap-pagination',
],
dependency_links = ['https://github.com/yomguy/django-json-rpc/tarball/0.6.2',
'https://github.com/elo80ka/django-dynamic-formset/tarball/master',
class Meta:
model = MediaItem
-
exclude = ('copied_from_item',)
def clean_code(self):
model = MediaItemRelated
+
+class ItemPerformanceInline(InlineFormSet):
+
+ model = MediaItemPerformance
+
+
+class ItemKeywordInline(InlineFormSet):
+
+ model = MediaItemKeyword
+
+
+class ItemFormatInline(InlineFormSet):
+
+ model = Format
+
{% block title_buttons %}
<div class="fixedWidthAsPlayer">
{% if user.is_authenticated and perms.telemeta.change_mediaitem %}
- <a href="{% url "telemeta-item-edit" item.public_id %}" class="component_icon button icon_edit">{% trans "Edit" %}</a>
+ <a href="{% url "telemeta-item-edit" item.id %}" class="component_icon button icon_edit">{% trans "Edit" %}</a>
<a href="{% url "telemeta-item-copy" item.public_id %}" class="component_icon button icon_copy">{% trans "Copy" %}</a>
{% endif %}
{% if user.is_authenticated %}
{% extends "telemeta/mediaitem_detail.html" %}
{% load i18n %}
{% load telemeta_utils %}
+{% load bootstrap3 %}
{% block title %}
<img src="{{ STATIC_URL }}telemeta/images/item.png" style="vertical-align:middle" /> Item : {{ item }}
{% endblock %}
{% block infos %}
-<div class="infos">
+
+
+ <div>
<form enctype="multipart/form-data" id="_editItemForm" method="post" action="">{% csrf_token %}
- <table>
- {% for form in forms %}
- <tr><td colspan="2">{% for error in form.non_field_errors %}<li class="error">{{ error }}</li>{% endfor %}</td></tr>
- <tr><td colspan="2"><h2>{{ form.prefix|capitalize }}</h2><hr /></td></tr>
-
- {% for field in form %}
- <tr>
- <tr><td class="error">{{ field.errors }}</td></tr>
- <td>{% if field.blank %}
- <span style="font-weight:bold">{{ field.label_tag }}:</span>
- {% else %}
- {{ field.label_tag }}:
- {% endif %}
- </td>
- {% if field.html_name == "item-collection" %}
- <td> {% trans "Title" %} : {{ item.collection.title }}<br />
- {% trans "Code" %} : {{ item.collection.code }}<br />
- {{ field }}</td>
- {% elif field.html_name == "item-public_access" %}
- <td>
- {% trans "Collection access status" %} : {% trans item.collection.public_access %}<br />
- {% trans "Context access status" %} : {% trans access %}<br />
- {% trans "Item access status" %} :<br />
- {{ field }}
- </td>
- {% else %}
- <td>{{ field }}</td>
- {% endif %}
- </tr>
- {% if form.prefix == "item" and forloop.last %}
- <tr>
- <td style="padding-top: 1em">{% trans "Keywords" %}:</td>
- <td style="padding-top: 1em"><a href="{% url "telemeta-item-keywords_edit" item.public_id %}" class="component_icon button icon_edit">{% trans "Edit" %} {% trans "keywords" %}</a></td>
- </tr>
- <tr>
- <td style="padding-top: 1em">{% trans "Performance" %}:</td>
- <td style="padding-top: 1em"><a href="{% url "telemeta-item-performances_edit" item.public_id %}" class="component_icon button icon_edit">{% trans "Edit"%} {% trans "performance"%}</a></td>
- </tr>
-
- <tr>
- <td style="padding-top: 1em">{% trans "Related media" %}:</td>
- <td style="padding-top: 1em"><a href="{% url "telemeta-item-related_edit" item.public_id %}" class="component_icon button icon_edit">{% trans "Edit"%} {% trans "related media"%}</a></td>
- </tr>
- {% endif %}
- {% endfor %}
- {% endfor %}
- </table>
- <hr />
+
+ <ul class="nav nav-tabs" role="tablist">
+ <li class="active"><a href="#general" role="tab" data-toggle="tab">{% trans "General" %}</a></li>
+ <li><a href="#related" role="tab" data-toggle="tab">{% trans "Related media" %}</a></li>
+ <li><a href="#keyword_relations" role="tab" data-toggle="tab">{% trans "Keywords" %}</a></li>
+ <li><a href="#performances" role="tab" data-toggle="tab">{% trans "Performance" %}</a></li>
+ <li><a href="#format" role="tab" data-toggle="tab">{% trans "Format" %}</a></li>
+ </ul>
+
+ <div class="tab-content">
+
+ <div class="tab-pane fade in active" id="general">
+ <script type="text/javascript" src="/static/admin/js/jquery.min.js"></script>
+ <script type="text/javascript" src="/static/admin/js/jquery.init.js"></script>
+ <script type="text/javascript" src="/static/admin/js/actions.min.js"></script>
+ {{ form.media }}
+ {% bootstrap_form form %}
+ </div>
+
+ {% for formset in inlines %}
+
+ <div class="tab-pane" id="{{ formset.prefix }}">
+ {{ formset.management_form }}
+ {% for form in formset %}
+ <hr />
+ {% bootstrap_form form %}
+ {# {{ form.as_table }} #}
+ {% endfor %}
+ </div>
+ {% endfor %}
+
+ </div>
+
+
<div align="center" style="margin-top:3ex;">
- <a href="{% url "telemeta-item-detail" item.public_id %}" class="component_icon button icon_cancel">{% trans "Cancel" %}</a>
- {% if perms.telemeta.change_mediaitem %}
- <a href="#" class="component_icon button icon_save" onclick="var d=document; d.getElementById('wait-img2').style.display='inline'; setTimeout(function(){d.getElementById('_editItemForm').submit();},300); return false;">{% trans "Save" %}</a>
- {% endif %}
- <img id="wait-img2" style="display:none" style="vertical-align:middle" alt="wait" src="{{ STATIC_URL }}telemeta/images/wait.gif" />
+ <a href="{% url "telemeta-collection-detail" object.public_id %}" class="component_icon button icon_cancel">{% trans "Cancel" %}</a>
+ {% if perms.telemeta.change_mediaitem %}
+ <input type="submit" value="Enregistrer" class="default" name="_save" onclick="var d=document; d.getElementById('wait-img').style.display='inline'; setTimeout(function(){d.getElementById('_editItemForm').submit();},300); return false;"/>
+ <img id="wait-img" style="display:none" style="vertical-align:middle" alt="wait" src="{{ STATIC_URL }}telemeta/images/wait.gif" />
+ {% endif %}
</div>
- </form>
-</div>
+
+ </form>
+ </div>
+
{% endblock infos %}
{% block related %}
item_view.item_playlist,
dict(template="telemeta/mediaitem_xspf.xml", mimetype="application/xspf+xml"),
name="telemeta-item-xspf"),
- url(r'^archives/items/(?P<public_id>[A-Za-z0-9._-]+)/edit/$', item_view.item_edit,
- dict(template='telemeta/mediaitem_edit.html'), name="telemeta-item-edit"),
+ url(r'^archives/items/(?P<pk>[A-Za-z0-9._-]+)/edit/$', ItemEditView.as_view(), name="telemeta-item-edit"),
url(r'^archives/items/(?P<public_id>[A-Za-z0-9._-]+)/copy/$', item_view.item_copy,
dict(template='telemeta/mediaitem_copy.html'), name="telemeta-item-copy"),
url(r'^archives/item_new/add/$', item_view.item_add,
class ItemSoundListView(ItemListView):
queryset = MediaItem.objects.sound().order_by('code', 'old_code')
+
+
+class ItemViewMixin(ItemBaseMixin):
+
+ model = MediaItem
+
+ def get_export_formats(self):
+ formats = []
+ for encoder in self.encoders:
+ if encoder.file_extension() in self.export_formats:
+ formats.append({'name': encoder.format(),
+ 'extension': encoder.file_extension()})
+ return formats
+
+ def item_previous_next(self, item):
+ """Get previous and next items inside the collection of the item"""
+
+ pks = []
+ items = MediaItem.objects.filter(collection=item.collection)
+ items = items.order_by('code', 'old_code')
+
+ if len(items) > 1:
+ for it in items:
+ pks.append(it.pk)
+ for pk in pks:
+ if pk == item.pk:
+ if pk == pks[0]:
+ previous_pk = pks[-1]
+ next_pk = pks[1]
+ elif pk == pks[-1]:
+ previous_pk = pks[-2]
+ next_pk = pks[0]
+ else:
+ previous_pk = pks[pks.index(pk)-1]
+ next_pk = pks[pks.index(pk)+1]
+ for it in items:
+ if it.pk == previous_pk:
+ previous = it
+ if it.pk == next_pk:
+ next = it
+ previous = previous.public_id
+ next = next.public_id
+ else:
+ previous = item.public_id
+ next = item.public_id
+
+ return previous, next
+
+ def get_graphers(self):
+ graphers = []
+ for grapher in self.graphers:
+ if grapher.id() == self.default_grapher_id:
+ graphers.insert(0, {'name':grapher.name(), 'id': grapher.id()})
+ else:
+ graphers.append({'name':grapher.name(), 'id': grapher.id()})
+ return graphers
+
+ def get_grapher(self, id):
+ for grapher in self.graphers:
+ if grapher.id() == id:
+ break
+ return grapher
+
+
+ def get_object(self):
+ if 'public_id' in self.kwargs.keys():
+ self.pk = self.model.objects.get(code=self.kwargs['public_id']).pk
+ return get_object_or_404(self.model, pk=self.pk)
+ else:
+ return get_object_or_404(self.model, pk=self.kwargs['pk'])
+
+
+class ItemEditView(ItemViewMixin, UpdateWithInlinesView):
+
+ template_name = 'telemeta/mediaitem_edit.html'
+ inlines = [ItemRelatedInline, ItemPerformanceInline, ItemKeywordInline, ItemFormatInline]
+
+ def form_valid(self, form):
+ messages.info(self.request, _("You have successfully updated your item."))
+ return super(ItemEditView, self).form_valid(form)
+
+ def get_success_url(self):
+ return reverse_lazy('telemeta-item-detail', kwargs={'public_id':self.get_object().code})
+
+ def get_context_data(self, **kwargs):
+ context = super(ItemEditView, self).get_context_data(**kwargs)
+ item = self.get_object()
+ context['item'] = item
+ context['access'] = get_item_access(item, self.request.user)
+ context['previous'], context['next'] = self.item_previous_next(item)
+ #FIXME
+ context['mime_type'] = 'audio/mp3'
+ context['export_formats'] = self.get_export_formats()
+ context['visualizers'] = self.get_graphers()
+ context['audio_export_enabled'] = self.export_enabled
+ return context
+