From: Guillaume Pellerin Date: Fri, 19 Sep 2014 10:23:27 +0000 (+0200) Subject: add item edit CBV X-Git-Tag: 1.5.0rc1~27^2~92 X-Git-Url: https://git.parisson.com/?a=commitdiff_plain;h=16657c3b4225882a1b1c4ec35d62243a7fe55f17;p=telemeta.git add item edit CBV --- diff --git a/example/sandbox/settings.py b/example/sandbox/settings.py index 798f661f..4b55a270 100644 --- a/example/sandbox/settings.py +++ b/example/sandbox/settings.py @@ -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, diff --git a/setup.py b/setup.py index 8f16f0fb..19338307 100644 --- 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', diff --git a/telemeta/forms/media.py b/telemeta/forms/media.py index 7fb4ba0a..67cde3a6 100644 --- a/telemeta/forms/media.py +++ b/telemeta/forms/media.py @@ -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 + diff --git a/telemeta/templates/telemeta/mediaitem_detail.html b/telemeta/templates/telemeta/mediaitem_detail.html index 69fd31a8..f486b730 100644 --- a/telemeta/templates/telemeta/mediaitem_detail.html +++ b/telemeta/templates/telemeta/mediaitem_detail.html @@ -92,7 +92,7 @@ Item : {{ item }} {% block title_buttons %}
{% if user.is_authenticated and perms.telemeta.change_mediaitem %} - {% trans "Edit" %} + {% trans "Edit" %} {% trans "Copy" %} {% endif %} {% if user.is_authenticated %} diff --git a/telemeta/templates/telemeta/mediaitem_edit.html b/telemeta/templates/telemeta/mediaitem_edit.html index a40fffdf..c3a9b08b 100644 --- a/telemeta/templates/telemeta/mediaitem_edit.html +++ b/telemeta/templates/telemeta/mediaitem_edit.html @@ -1,6 +1,7 @@ {% extends "telemeta/mediaitem_detail.html" %} {% load i18n %} {% load telemeta_utils %} +{% load bootstrap3 %} {% block title %} Item : {{ item }} @@ -17,65 +18,55 @@ {% endblock %} {% block infos %} -
+ + +
{% csrf_token %} - - {% for form in forms %} - - - - {% for field in form %} - - - - {% if field.html_name == "item-collection" %} - - {% elif field.html_name == "item-public_access" %} - - {% else %} - - {% endif %} - - {% if form.prefix == "item" and forloop.last %} - - - - - - - - - - - - - - {% endif %} - {% endfor %} - {% endfor %} -
{% for error in form.non_field_errors %}
  • {{ error }}
  • {% endfor %}

    {{ form.prefix|capitalize }}


    {{ field.errors }}
    {% if field.blank %} - {{ field.label_tag }}: - {% else %} - {{ field.label_tag }}: - {% endif %} -  {% trans "Title" %} : {{ item.collection.title }}
    -  {% trans "Code" %} : {{ item.collection.code }}
    - {{ field }}
    -  {% trans "Collection access status" %} : {% trans item.collection.public_access %}
    -  {% trans "Context access status" %} : {% trans access %}
    -  {% trans "Item access status" %} :
    - {{ field }} -
    {{ field }}
    {% trans "Keywords" %}:{% trans "Edit" %} {% trans "keywords" %}
    {% trans "Performance" %}:{% trans "Edit"%} {% trans "performance"%}
    {% trans "Related media" %}:{% trans "Edit"%} {% trans "related media"%}
    -
    + + + +
    + +
    + + + + {{ form.media }} + {% bootstrap_form form %} +
    + + {% for formset in inlines %} + +
    + {{ formset.management_form }} + {% for form in formset %} +
    + {% bootstrap_form form %} + {# {{ form.as_table }} #} + {% endfor %} +
    + {% endfor %} + +
    + +
    - {% trans "Cancel" %} - {% if perms.telemeta.change_mediaitem %} - {% trans "Save" %} - {% endif %} - + {% trans "Cancel" %} + {% if perms.telemeta.change_mediaitem %} + + + {% endif %}
    -
    -
    + + +
    + {% endblock infos %} {% block related %} diff --git a/telemeta/urls.py b/telemeta/urls.py index 728005bf..79ebb00a 100644 --- a/telemeta/urls.py +++ b/telemeta/urls.py @@ -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[A-Za-z0-9._-]+)/edit/$', item_view.item_edit, - dict(template='telemeta/mediaitem_edit.html'), name="telemeta-item-edit"), + url(r'^archives/items/(?P[A-Za-z0-9._-]+)/edit/$', ItemEditView.as_view(), name="telemeta-item-edit"), url(r'^archives/items/(?P[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, diff --git a/telemeta/views/item.py b/telemeta/views/item.py index 7a95d561..26451293 100644 --- a/telemeta/views/item.py +++ b/telemeta/views/item.py @@ -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 +