From da152b871020c3139dfcf1d23501eac7b03ac25e Mon Sep 17 00:00:00 2001 From: Guillaume Pellerin Date: Fri, 27 Jan 2012 14:58:45 +0100 Subject: [PATCH] add 'Archives' tab, make a drop down menu for resources, *WARNING* change media resource urls ! --- telemeta/htdocs/css/telemeta.css | 88 +++++++++++++++++++ telemeta/htdocs/js/application.js | 18 ++++ telemeta/templates/telemeta_default/base.html | 28 +++++- .../inc/module_revisions.html | 2 + telemeta/urls.py | 82 ++++++++++------- telemeta/views/base.py | 36 +++----- 6 files changed, 199 insertions(+), 55 deletions(-) diff --git a/telemeta/htdocs/css/telemeta.css b/telemeta/htdocs/css/telemeta.css index 6409121b..7d78fe02 100644 --- a/telemeta/htdocs/css/telemeta.css +++ b/telemeta/htdocs/css/telemeta.css @@ -201,6 +201,12 @@ a img { border: none; } max-height: 500px; overflow-y: scroll; } + +.vscroll { + max-height: 500px; + overflow-y: scroll; + width: 100%; +} .analyzer-title { @@ -476,6 +482,86 @@ form.login .submit { * html #menu :link, * html #menu :visited { background-position: 1px 0 } + +/* Drop Down Menus */ +.clear {clear:both} + +#nav { + margin:0; + padding:0; + list-style:none; +} + +/* make the LI display inline */ +/* it's position relative so that position absolute */ +/* can be used in submenu */ + +#nav li { +display:inline-block; +position:relative; +z-index:500; +} + +/* this is the parent menu */ +#nav li a { +display:block; +text-align:center; +} + +/* you can make a different style for default selected value */ +#nav a.selected { +color:#f00; +} + +/* submenu, it's hidden by default */ +#nav ul { + position:absolute; + left:0; + display:none; + margin:0 0 0 -1px; + padding:0; + list-style:none; + border-left:2px solid #6a0307; + border-right:2px solid #6a0307; + border-bottom:2px solid #6a0307; + background-color: #6a0307; + color: #FFF; +} + +#nav ul li { + width:100px; + float:left; + border-bottom:0px solid #fff; +} + +/* display block will make the link fill the whole area of LI */ +#nav ul a { + display:block; + height:15px; + padding: 5px 5px; + font-size: 11px; + text-align:left; + -webkit-border-top-left-radius:0px 0px; + moz-border-radius-topleft: 0px 0px; + border-top-left-radius: 0px 0px; + -webkit-border-top-right-radius:0px 0px; + moz-border-radius-topright: 0px 0px; + border-top-right-radius: 0px 0px; + border-bottom-width: 0px; +} + +#nav ul a:hover { + background-color: #FFF ; + color: #6a0307 ; +} + +#nav ul a:active{ + background-color: #FFF; + color: #6a0307 ; +} + + + /* Footer (borrowed from Trac) */ #footer { background: #6a0307; @@ -1178,3 +1264,5 @@ a:focus,div:focus{ input,textarea{ outline: none !important; } + + diff --git a/telemeta/htdocs/js/application.js b/telemeta/htdocs/js/application.js index 7d3e07d9..9ddf1971 100644 --- a/telemeta/htdocs/js/application.js +++ b/telemeta/htdocs/js/application.js @@ -219,3 +219,21 @@ function consolelog(text){ } } } + +// Drop down menus + +$(document).ready(function () { + + $('#nav li').hover( + function () { + //show its submenu + $('ul', this).slideDown(200); + + }, + function () { + //hide its submenu + $('ul', this).slideUp(100); + } + ); + +}); \ No newline at end of file diff --git a/telemeta/templates/telemeta_default/base.html b/telemeta/templates/telemeta_default/base.html index 3f3d1010..12959fa2 100644 --- a/telemeta/templates/telemeta_default/base.html +++ b/telemeta/templates/telemeta_default/base.html @@ -78,9 +78,11 @@ {% block menu %} {# spaces between li and a elements breaks layout #} + + + + +
{% endblock %} diff --git a/telemeta/templates/telemeta_default/inc/module_revisions.html b/telemeta/templates/telemeta_default/inc/module_revisions.html index 3e9f97a3..5df16154 100644 --- a/telemeta/templates/telemeta_default/inc/module_revisions.html +++ b/telemeta/templates/telemeta_default/inc/module_revisions.html @@ -6,6 +6,7 @@ rss {% trans "Last changes" %}    +
@@ -37,4 +38,5 @@ {% endfor %}
{% trans "Date" %}
+
\ No newline at end of file diff --git a/telemeta/urls.py b/telemeta/urls.py index e13f4667..7b5be526 100644 --- a/telemeta/urls.py +++ b/telemeta/urls.py @@ -35,7 +35,8 @@ # Guillaume Pellerin from django.conf.urls.defaults import * -from telemeta.models import MediaItem, MediaCollection, MediaItemMarker +from django.views.generic.simple import redirect_to +from telemeta.models import MediaItem, MediaCollection, MediaItemMarker, MediaCorpus, MediaFund from telemeta.views.base import GeneralView, AdminView, CollectionView, ItemView, \ InstrumentView, PlaylistView, ProfileView, GeoView, \ LastestRevisionsFeed @@ -62,6 +63,8 @@ all_collections = { 'queryset': MediaCollection.objects.enriched(), } all_collections_unpublished = { 'queryset': MediaCollection.objects.filter(code__contains='_I_'), } all_collections_published = { 'queryset': MediaCollection.objects.filter(code__contains='_E_'), } all_collections_sound = { 'queryset': MediaCollection.objects.sound().order_by('code', 'old_code') } +all_corpus = { 'queryset': MediaCorpus.objects.all().order_by('title') } +all_funds = { 'queryset': MediaFund.objects.all().order_by('title') } # ID's regular expressions export_extensions = "|".join(item_view.list_export_extensions()) @@ -71,87 +74,104 @@ htdocs = os.path.dirname(__file__) + '/htdocs' urlpatterns = patterns('', url(r'^$', general_view.index, name="telemeta-home"), + # archives + # TODO: make a real archives tree view + url(r'^archives/$', redirect_to, {'url': '/archives/collections/'}, + name="telemeta-archives"), + # items - url(r'^items/$', 'django.views.generic.list_detail.object_list', + url(r'^archives/items/$', 'django.views.generic.list_detail.object_list', dict(all_items, paginate_by=20, template_name="telemeta/mediaitem_list.html"), name="telemeta-items"), - url(r'^items_sound/$', 'django.views.generic.list_detail.object_list', + url(r'^archives/items_sound/$', 'django.views.generic.list_detail.object_list', dict(all_items_sound, paginate_by=20, template_name="telemeta/mediaitem_list.html"), name="telemeta-items-sound"), - url(r'^items/(?P[A-Za-z0-9._-]+)/$', item_view.item_detail, + url(r'^archives/items/(?P[A-Za-z0-9._-]+)/$', item_view.item_detail, name="telemeta-item-detail"), - url(r'^items/(?P[A-Za-z0-9._-]+)/dc/$', item_view.item_detail, + url(r'^archives/items/(?P[A-Za-z0-9._-]+)/dc/$', item_view.item_detail, {'template': 'telemeta/mediaitem_detail_dc.html'}, name="telemeta-item-dublincore"), - url(r'^items/(?P[A-Za-z0-9._-]+)/dc/xml/$', item_view.item_detail, + url(r'^archives/items/(?P[A-Za-z0-9._-]+)/dc/xml/$', item_view.item_detail, {'format': 'dublin_core_xml'}, name="telemeta-item-dublincore-xml"), - url(r'^items/download/(?P[A-Za-z0-9._-]+)\.(?P' + url(r'^archives/items/download/(?P[A-Za-z0-9._-]+)\.(?P' + export_extensions + ')$', item_view.item_export, name="telemeta-item-export"), - url(r'^items/(?P[A-Za-z0-9._-]+)/visualize/(?P[0-9a-z_]+)/(?P[0-9A-Z]+)x(?P[0-9A-Z]+)/$', + url(r'^archives/items/(?P[A-Za-z0-9._-]+)/visualize/(?P[0-9a-z_]+)/(?P[0-9A-Z]+)x(?P[0-9A-Z]+)/$', item_view.item_visualize, name="telemeta-item-visualize"), - url(r'^items/(?P[A-Za-z0-9._-]+)/analyze/xml/$', + url(r'^archives/items/(?P[A-Za-z0-9._-]+)/analyze/xml/$', item_view.item_analyze_xml, name="telemeta-item-analyze-xml"), - url(r'^items/(?P[A-Za-z0-9._-]+)/item_xspf.xml$', + url(r'^archives/items/(?P[A-Za-z0-9._-]+)/item_xspf.xml$', item_view.item_playlist, dict(template="telemeta/mediaitem_xspf.xml", mimetype="application/xspf+xml"), name="telemeta-item-xspf"), - url(r'^items/(?P[A-Za-z0-9._-]+)/edit/$', item_view.item_edit, + 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'^items/(?P[A-Za-z0-9._-]+)/copy/$', item_view.item_copy, + 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'^item/add/$', item_view.item_add, dict(template='telemeta/mediaitem_add.html'), name="telemeta-item-add"), - url(r'^items/(?P[A-Za-z0-9._-]+)/player/(?P[0-9]+)x(?P[0-9]+)/$', item_view.item_detail, + url(r'^archives/items/(?P[A-Za-z0-9._-]+)/player/(?P[0-9]+)x(?P[0-9]+)/$', item_view.item_detail, dict(template='telemeta/mediaitem_player.html'), name="telemeta-item-player"), - url(r'^items/(?P[A-Za-z0-9._-]+)/performances/$', item_view.item_performances_edit, + url(r'^archives/items/(?P[A-Za-z0-9._-]+)/performances/$', item_view.item_performances_edit, dict(template='telemeta/mediaitem_performances_edit.html'), name="telemeta-item-performances_edit"), - url(r'^items/(?P[A-Za-z0-9._-]+)/keywords/$', item_view.item_keywords_edit, + url(r'^archives/items/(?P[A-Za-z0-9._-]+)/keywords/$', item_view.item_keywords_edit, dict(template='telemeta/mediaitem_keywords_edit.html'), name="telemeta-item-keywords_edit"), - url(r'^items/(?P[A-Za-z0-9._-]+)/delete/$', item_view.item_delete, name="telemeta-item-delete"), - url(r'^items/(?P[A-Za-z0-9._-]+)/related/(?P[A-Za-z0-9._-]+)$', item_view.related_media_item_stream, name="telemeta-item-related"), - url(r'^items/(?P[A-Za-z0-9._-]+)/related_edit/$', item_view.related_media_edit, dict(template='telemeta/mediaitem_related_edit.html'), name="telemeta-item-related_edit"), + url(r'^archives/items/(?P[A-Za-z0-9._-]+)/delete/$', item_view.item_delete, name="telemeta-item-delete"), + url(r'^archives/items/(?P[A-Za-z0-9._-]+)/related/(?P[A-Za-z0-9._-]+)$', item_view.related_media_item_stream, name="telemeta-item-related"), + url(r'^archives/items/(?P[A-Za-z0-9._-]+)/related_edit/$', item_view.related_media_edit, dict(template='telemeta/mediaitem_related_edit.html'), name="telemeta-item-related_edit"), # Markers url(r'^markers/(?P[A-Za-z0-9]+)/$', item_view.item_detail, name="telemeta-item-detail-marker"), + # FIXME: need all paths + url(r'^items/(?P[A-Za-z0-9._-s/]+)/$', redirect_to, {'url': '/archives/items/%(path)s/', 'permanent': False}, name="telemeta-item-redir"), # collections - url(r'^collections/$', 'django.views.generic.list_detail.object_list', + url(r'^archives/collections/$', 'django.views.generic.list_detail.object_list', dict(all_collections, paginate_by=20, template_name="telemeta/collection_list.html"), name="telemeta-collections"), url(r'^collections_unpublished/$', 'django.views.generic.list_detail.object_list', dict(all_collections_unpublished, paginate_by=20, template_name="telemeta/collection_list.html"), name="telemeta-collections-unpublished"), url(r'^collections_published/$', 'django.views.generic.list_detail.object_list', dict(all_collections_published, paginate_by=20, template_name="telemeta/collection_list.html"), name="telemeta-collections-published"), - url(r'^collections/?page=(?P[0-9]+)$', + url(r'^archives/collections/?page=(?P[0-9]+)$', 'django.views.generic.list_detail.object_list', dict(all_collections, paginate_by=20)), - url(r'^collections/(?P[A-Za-z0-9._-]+)/$', collection_view.collection_detail, + url(r'^archives/collections/(?P[A-Za-z0-9._-]+)/$', collection_view.collection_detail, dict(template="telemeta/collection_detail.html"), name="telemeta-collection-detail"), - url(r'^collections/(?P[A-Za-z0-9._-]+)/dc/$', collection_view.collection_detail, + url(r'^archives/collections/(?P[A-Za-z0-9._-]+)/dc/$', collection_view.collection_detail, dict(template="telemeta/collection_detail_dc.html"), name="telemeta-collection-dublincore"), - url(r'^collections/(?P[A-Za-z0-9._-]+)/collection_xspf.xml$', + url(r'^archives/collections/(?P[A-Za-z0-9._-]+)/collection_xspf.xml$', collection_view.collection_playlist, dict(template="telemeta/collection_xspf.xml", mimetype="application/xspf+xml"), name="telemeta-collection-xspf"), - url(r'^collections/(?P[A-Za-z0-9._-]+)/collection.m3u$', + url(r'^archives/collections/(?P[A-Za-z0-9._-]+)/collection.m3u$', collection_view.collection_playlist, dict(template="telemeta/collection.m3u", mimetype="audio/mpegurl"), name="telemeta-collection-m3u"), - url(r'^collections/(?P[A-Za-z0-9._-]+)/edit/$', collection_view.collection_edit, + url(r'^archives/collections/(?P[A-Za-z0-9._-]+)/edit/$', collection_view.collection_edit, dict(template='telemeta/collection_edit.html'), name="telemeta-collection-edit"), - url(r'^collections/(?P[A-Za-z0-9._-]+)/copy/$', collection_view.collection_copy, + url(r'^archives/collections/(?P[A-Za-z0-9._-]+)/copy/$', collection_view.collection_copy, dict(template='telemeta/collection_edit.html'), name="telemeta-collection-copy"), url(r'^collection/add/$', collection_view.collection_add, dict(template='telemeta/collection_add.html'), name="telemeta-collection-add"), - url(r'^collections/(?P[A-Za-z0-9._-]+)/add_item/$', item_view.item_add, + url(r'^archives/collections/(?P[A-Za-z0-9._-]+)/add_item/$', item_view.item_add, dict(template='telemeta/mediaitem_add.html'), name="telemeta-collection-additem"), - url(r'^collections/(?P[A-Za-z0-9._-]+)/delete/$', collection_view.collection_delete, name="telemeta-collection-delete"), - url(r'^collections/(?P[A-Za-z0-9._-]+)/related/(?P[A-Za-z0-9._-]+)$', collection_view.related_media_collection_stream, name="telemeta-collection-related"), - url(r'^collections/(?P[A-Za-z0-9._-]+)/related_edit/$', collection_view.related_media_edit, dict(template='telemeta/collection_related_edit.html'), name="telemeta-collection-related_edit"), - url(r'^collections_sound/$', 'django.views.generic.list_detail.object_list', + url(r'^archives/collections/(?P[A-Za-z0-9._-]+)/delete/$', collection_view.collection_delete, name="telemeta-collection-delete"), + url(r'^archives/collections/(?P[A-Za-z0-9._-]+)/related/(?P[A-Za-z0-9._-]+)$', collection_view.related_media_collection_stream, name="telemeta-collection-related"), + url(r'^archives/collections/(?P[A-Za-z0-9._-]+)/related_edit/$', collection_view.related_media_edit, dict(template='telemeta/collection_related_edit.html'), name="telemeta-collection-related_edit"), + url(r'^archives/collections_sound/$', 'django.views.generic.list_detail.object_list', dict(all_collections_sound, paginate_by=20, template_name="telemeta/collection_list.html"), name="telemeta-collections-sound"), + # FIXME: need all paths + url(r'^collections/(?P[A-Za-z0-9._-s/]+)/$', redirect_to, {'url': '/archives/collections/%(path)s/', 'permanent': False}, name="telemeta-collection-redir"), + + # Corpus + url(r'^archives/corpus/$', 'django.views.generic.list_detail.object_list', + dict(all_corpus, paginate_by=20, template_name="telemeta/corpus_list.html"), name="telemeta-corpus"), + + # Funds + url(r'^archives/funds/$', 'django.views.generic.list_detail.object_list', + dict(all_funds, paginate_by=20, template_name="telemeta/fund_list.html"), name="telemeta-fund"), # search url(r'^search/$', general_view.search, name="telemeta-search"), diff --git a/telemeta/views/base.py b/telemeta/views/base.py index 6948d02a..188de05a 100644 --- a/telemeta/views/base.py +++ b/telemeta/views/base.py @@ -225,7 +225,7 @@ class GeneralView(object): else: template='telemeta/home.html' playlists = get_playlists(request) - revisions = get_revisions(15) + revisions = get_revisions(50) searches = Search.objects.filter(username=request.user) return render(request, template, {'playlists': playlists, 'searches': searches, 'revisions': revisions,}) @@ -397,7 +397,7 @@ class CollectionView(object): code = public_id form.save() collection.set_revision(request.user) - return HttpResponseRedirect('/collections/'+code) + return HttpResponseRedirect('/archives/collections/'+code) else: form = MediaCollectionForm(instance=collection) @@ -414,7 +414,7 @@ class CollectionView(object): code = public_id form.save() collection.set_revision(request.user) - return HttpResponseRedirect('/collections/'+code) + return HttpResponseRedirect('/archives/collections/'+code) else: form = MediaCollectionForm(instance=collection) @@ -431,7 +431,7 @@ class CollectionView(object): code = public_id form.save() collection.set_revision(request.user) - return HttpResponseRedirect('/collections/'+code) + return HttpResponseRedirect('/archives/collections/'+code) else: collection = MediaCollection.objects.get(public_id=public_id) form = MediaCollectionForm(instance=collection) @@ -453,7 +453,7 @@ class CollectionView(object): """Delete a given collection""" collection = MediaCollection.objects.get(public_id=public_id) collection.delete() - return HttpResponseRedirect('/collections/') + return HttpResponseRedirect('/archives/collections/') def related_media_collection_stream(self, request, collection_public_id, media_id): collection = MediaCollection.objects.get(public_id=collection_public_id) @@ -471,7 +471,7 @@ class CollectionView(object): if formset.is_valid(): formset.save() collection.set_revision(request.user) - return HttpResponseRedirect('/collections/'+public_id) + return HttpResponseRedirect('/archives/collections/'+public_id) else: formset = MediaCollectionRelatedFormSet(instance=collection) @@ -609,7 +609,7 @@ class ItemView(object): for analysis in analyses: analysis.delete() item.set_revision(request.user) - return HttpResponseRedirect('/items/'+code) + return HttpResponseRedirect('/archives/items/'+code) else: form = MediaItemForm(instance=item) @@ -636,7 +636,7 @@ class ItemView(object): if formset.is_valid(): formset.save() item.set_revision(request.user) - return HttpResponseRedirect('/items/'+public_id) + return HttpResponseRedirect('/archives/items/'+public_id) else: formset = MediaItemRelatedFormSet(instance=item) @@ -658,7 +658,7 @@ class ItemView(object): code = form.cleaned_data['code'] if not code: code = str(item.id) - return HttpResponseRedirect('/items/'+code) + return HttpResponseRedirect('/archives/items/'+code) else: form = MediaItemForm(instance=item) @@ -692,7 +692,7 @@ class ItemView(object): keyword.save() item.set_revision(request.user) - return HttpResponseRedirect('/items/'+code) + return HttpResponseRedirect('/archives/items/'+code) else: item = MediaItem.objects.get(public_id=public_id) form = MediaItemForm(instance=item) @@ -706,7 +706,7 @@ class ItemView(object): item = MediaItem.objects.get(public_id=public_id) collection = item.collection item.delete() - return HttpResponseRedirect('/collections/'+collection.code) + return HttpResponseRedirect('/archives/collections/'+collection.code) def item_analyze(self, item): analyses = MediaItemAnalysis.objects.filter(item=item) @@ -908,7 +908,7 @@ class ItemView(object): formset = PerformanceFormSet(data=request.POST, instance=item) if formset.is_valid(): formset.save() - return HttpResponseRedirect('/items/'+public_id) + return HttpResponseRedirect('/archives/items/'+public_id) else: formset = PerformanceFormSet(instance=item) return render(request, template, {'item': item, 'formset': formset,}) @@ -921,7 +921,7 @@ class ItemView(object): formset = FormSet(data=request.POST, instance=item) if formset.is_valid(): formset.save() - return HttpResponseRedirect('/items/'+public_id) + return HttpResponseRedirect('/archives/items/'+public_id) else: formset = FormSet(instance=item) return render(request, template, {'item': item, 'formset': formset,}) @@ -1443,16 +1443,6 @@ class CorpusView(object): return render(request, template, {'corpus': corpus, "form": form,}) - def corpus_playlist(self, request, public_id, template, mimetype): - try: - corpus = MediaCorpus.objects.get(public_id=public_id) - except ObjectDoesNotExist: - raise Http404 - - template = loader.get_template(template) - context = RequestContext(request, {'corpus': corpus, 'host': request.META['HTTP_HOST']}) - return HttpResponse(template.render(context), mimetype=mimetype) - @method_decorator(permission_required('telemeta.delete_mediacorpus')) def corpus_delete(self, request, public_id): """Delete a given corpus""" -- 2.39.5