]> git.parisson.com Git - telemeta.git/commitdiff
add item edit CBV
authorGuillaume Pellerin <yomguy@parisson.com>
Fri, 19 Sep 2014 10:23:27 +0000 (12:23 +0200)
committerGuillaume Pellerin <yomguy@parisson.com>
Fri, 19 Sep 2014 10:23:27 +0000 (12:23 +0200)
example/sandbox/settings.py
setup.py
telemeta/forms/media.py
telemeta/templates/telemeta/mediaitem_detail.html
telemeta/templates/telemeta/mediaitem_edit.html
telemeta/urls.py
telemeta/views/item.py

index 798f661f919a5285f88b341108b1b46a1b586099..4b55a270c2df5b388bd55ab08e46d45bc6177578 100644 (file)
@@ -1,11 +1,12 @@
 # -*- 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'),
@@ -125,18 +126,17 @@ INSTALLED_APPS = (
     '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 = (
@@ -184,6 +184,15 @@ BOOTSTRAP3 = {
 
 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,
index 8f16f0fb164c76067d63b377dc55e7bc5a7d7a92..193383076b8b21150f7f75931744246030678bba 100644 (file)
--- a/setup.py
+++ b/setup.py
@@ -41,9 +41,9 @@ setup(
         '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',
index 7fb4ba0a426a7a0f3bafbcfad5914dff38c391c5..67cde3a62d455caa542971a5bb3098e06ee861c9 100644 (file)
@@ -101,7 +101,6 @@ class MediaItemForm(ModelForm):
 
     class Meta:
         model = MediaItem
-
         exclude = ('copied_from_item',)
 
     def clean_code(self):
@@ -160,3 +159,18 @@ class ItemRelatedInline(InlineFormSet):
 
     model = MediaItemRelated
 
+
+class ItemPerformanceInline(InlineFormSet):
+
+    model = MediaItemPerformance
+
+
+class ItemKeywordInline(InlineFormSet):
+
+    model = MediaItemKeyword
+
+
+class ItemFormatInline(InlineFormSet):
+
+    model = Format
+
index 69fd31a8d7023ff85b511205b76dd4fca6003ac0..f486b730408b5dbf66e3f1c9d90692d755e50241 100644 (file)
@@ -92,7 +92,7 @@ Item : <a href="{% url "telemeta-item-detail" item.public_id %}">{{ item }}</a>
 {% 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 %}
index a40fffdf5f181f67e0b9dd50589b6d53a32e631b..c3a9b08bc4ce70bc65e978d0ada2c68b217670e2 100644 (file)
@@ -1,6 +1,7 @@
 {% 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>&nbsp;{% trans "Title" %} : {{ item.collection.title }}<br />
-                &nbsp;{% trans "Code" %} : {{ item.collection.code }}<br />
-                {{ field }}</td>
-            {% elif field.html_name == "item-public_access" %}
-            <td>
-                &nbsp;{% trans "Collection access status" %} : {% trans item.collection.public_access %}<br />
-                &nbsp;{% trans "Context access status" %} : {% trans access %}<br />
-                &nbsp;{% 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 %}
index 728005bf4406d8f53d17dd246eebbdafbea3eceb..79ebb00a402d6fd176187f5f73203b16cba95d88 100644 (file)
@@ -96,8 +96,7 @@ urlpatterns = patterns('',
         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,
index 7a95d56151ff06e800269fee20b0f983c838999f..2645129371bdc3f933be133ab291e82cdf252a35 100644 (file)
@@ -637,3 +637,100 @@ class ItemPublishedListView(ItemListView):
 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
+