]> git.parisson.com Git - telemeta.git/commitdiff
separate all views, fix urls, fix js trans
authoryomguy <yomguy@parisson.com>
Wed, 22 Jun 2011 12:57:07 +0000 (14:57 +0200)
committeryomguy <yomguy@parisson.com>
Wed, 22 Jun 2011 12:57:07 +0000 (14:57 +0200)
telemeta/htdocs/js/locale.js
telemeta/locale/de/LC_MESSAGES/django.mo
telemeta/locale/de/LC_MESSAGES/django.po
telemeta/locale/de/LC_MESSAGES/djangojs.mo
telemeta/locale/de/LC_MESSAGES/djangojs.po
telemeta/locale/fr/LC_MESSAGES/django.mo
telemeta/locale/fr/LC_MESSAGES/django.po
telemeta/locale/fr/LC_MESSAGES/djangojs.mo
telemeta/locale/fr/LC_MESSAGES/djangojs.po
telemeta/urls.py
telemeta/web/base.py

index 3e61bfc124c8cac5daf0c66ccbadaafd29f4c126..f22fa83ce8284a91df822c59680fed5901114e3a 100644 (file)
@@ -1,3 +1,20 @@
+var localeStrings = {
+    'title': gettext('title'),
+    'description': gettext('description'),
+    'delete the marker permanently?': gettext('delete the marker permanently?'),
+    'marker added to the selected playlist': gettext('marker added to the selected playlist'),
+    'item added to the selected playlist': gettext('item added to the selected playlist'),
+    'collection added to the selected playlist': gettext('collection added to the selected playlist'),
+    'there are unsaved or modified markers': gettext('there are unsaved or modified markers'),
+    'If you exit the page you will loose your changes' : gettext('If you exit the page you will loose your changes'),
+    'author' : gettext('author')
+};
+
+function gettrans(str){
+    var loc = localeStrings; //instantiate once for faster lookup
+    return str in loc ? loc[str] : str;
+}
+
 /*
  * Copyright (C) 2007-2011 Parisson
  * Copyright (c) 2011 Riccardo Zaccarelli <riccardo.zaccarelli@gmail.com>
  * Class for managing translations in telemeta.
  */
 
-var localeStrings = {
-    'title': gettext('title'),
-    'description': gettext('description'),
-    'delete the marker permanently?': gettext('delete the marker permanently?'),
-    'marker added to the selected playlist': gettext('marker added to the selected playlist'),
-    'item added to the selected playlist': gettext('item added to the selected playlist'),
-    'collection added to the selected playlist': gettext('collection added to the selected playlist'),
-    'there are unsaved or modified markers': gettext('there are unsaved or modified markers'),
-    'If you exit the page you will loose your changes' : gettext('If you exit the page you will loose your changes'),
-    'author' : gettext('author')
-};
 
-function gettrans(str){
-    var loc = localeStrings; //instantiate once for faster lookup
-    return str in loc ? loc[str] : str;
-}
index 636955b68a8f4a80f8a4d085385ef0ce380cdc8e..e3f75cd76f4e68b395f8b10af959ab81992f5ea3 100644 (file)
Binary files a/telemeta/locale/de/LC_MESSAGES/django.mo and b/telemeta/locale/de/LC_MESSAGES/django.mo differ
index 0fabf95224efe54a391f5da9b6fee8596d9b222a..cd9879c0ced655d7e7f3f297f88d3de3a7b75f01 100644 (file)
@@ -8,7 +8,7 @@ msgid ""
 msgstr ""
 "Project-Id-Version: PACKAGE VERSION\n"
 "Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2011-06-22 12:37+0200\n"
+"POT-Creation-Date: 2011-06-22 14:44+0200\n"
 "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
 "Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
 "Language-Team: LANGUAGE <LL@li.org>\n"
@@ -687,7 +687,7 @@ msgid "Save"
 msgstr ""
 
 #: templates/telemeta_default/collection_detail.html:5
-#: templates/telemeta_default/collection_detail_dc.html:5 web/base.py:137
+#: templates/telemeta_default/collection_detail_dc.html:5 web/base.py:324
 msgid "Collection"
 msgstr ""
 
@@ -967,7 +967,7 @@ msgstr ""
 
 #: templates/telemeta_default/mediaitem_add.html:5
 #: templates/telemeta_default/mediaitem_copy.html:5
-#: templates/telemeta_default/mediaitem_detail.html:5 web/base.py:245
+#: templates/telemeta_default/mediaitem_detail.html:5 web/base.py:453
 msgid "Item"
 msgstr ""
 
@@ -1055,7 +1055,7 @@ msgstr ""
 msgid "User Profile"
 msgstr ""
 
-#: templates/telemeta_default/profile_detail.html:8 web/base.py:1129
+#: templates/telemeta_default/profile_detail.html:8 web/base.py:1154
 msgid "User profile"
 msgstr ""
 
@@ -1151,8 +1151,7 @@ msgstr ""
 msgid "No item"
 msgstr ""
 
-#: templates/telemeta_default/inc/module_revisions.html:7 web/base.py:1098
-#: web/base.py:1209
+#: templates/telemeta_default/inc/module_revisions.html:7 web/base.py:1185
 msgid "Last changes"
 msgstr ""
 
@@ -1326,11 +1325,11 @@ msgid_plural "%(count)d collections"
 msgstr[0] ""
 msgstr[1] ""
 
-#: web/base.py:136 web/base.py:244 web/base.py:496 web/base.py:1128
+#: web/base.py:323 web/base.py:452 web/base.py:683 web/base.py:1153
 msgid "Access not allowed"
 msgstr ""
 
-#: web/base.py:138 web/base.py:246 web/base.py:498 web/base.py:1130
+#: web/base.py:325 web/base.py:454 web/base.py:685 web/base.py:1155
 msgid ""
 "Please login or contact the website administator to get a private access."
 msgstr ""
index 3bdb7f26f1e14bbfea9f466b6152b2ff3f82e3dc..e3f75cd76f4e68b395f8b10af959ab81992f5ea3 100644 (file)
Binary files a/telemeta/locale/de/LC_MESSAGES/djangojs.mo and b/telemeta/locale/de/LC_MESSAGES/djangojs.mo differ
index 2b16812067487d73c8cf7cc0f007c62aaf4599b1..6dd7141616d905c98b912abb280b9bbf06263fdd 100644 (file)
@@ -8,7 +8,7 @@ msgid ""
 msgstr ""
 "Project-Id-Version: PACKAGE VERSION\n"
 "Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2011-05-29 21:26+0200\n"
+"POT-Creation-Date: 2011-06-22 14:44+0200\n"
 "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
 "Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
 "Language-Team: LANGUAGE <LL@li.org>\n"
@@ -18,38 +18,38 @@ msgstr ""
 "Content-Transfer-Encoding: 8bit\n"
 "Plural-Forms: nplurals=2; plural=(n != 1)\n"
 
-#: htdocs/js/locale.js:28
+#: htdocs/js/locale.js:2
 msgid "title"
 msgstr ""
 
-#: htdocs/js/locale.js:29
+#: htdocs/js/locale.js:3
 msgid "description"
 msgstr ""
 
-#: htdocs/js/locale.js:30
+#: htdocs/js/locale.js:4
 msgid "delete the marker permanently?"
 msgstr ""
 
-#: htdocs/js/locale.js:31
+#: htdocs/js/locale.js:5
 msgid "marker added to the selected playlist"
 msgstr ""
 
-#: htdocs/js/locale.js:32
+#: htdocs/js/locale.js:6
 msgid "item added to the selected playlist"
 msgstr ""
 
-#: htdocs/js/locale.js:33
+#: htdocs/js/locale.js:7
 msgid "collection added to the selected playlist"
 msgstr ""
 
-#: htdocs/js/locale.js:34
-msgid "there is at least one unsaved marker"
+#: htdocs/js/locale.js:8
+msgid "there are unsaved or modified markers"
 msgstr ""
 
-#: htdocs/js/locale.js:35
+#: htdocs/js/locale.js:9
 msgid "If you exit the page you will loose your changes"
 msgstr ""
 
-#: htdocs/js/locale.js:36
+#: htdocs/js/locale.js:10
 msgid "author"
 msgstr ""
index fb39a1c54fd4110fff8649f069e6a82048da864c..26d53884562f5efc96474e1c5f7617dbeb7decea 100644 (file)
Binary files a/telemeta/locale/fr/LC_MESSAGES/django.mo and b/telemeta/locale/fr/LC_MESSAGES/django.mo differ
index f370c200e41c86b8c07bc2597d4f23d7de5ee24f..9152948db2202ec75d9ca487f537318d095f2466 100644 (file)
@@ -8,7 +8,7 @@ msgid ""
 msgstr ""
 "Project-Id-Version: PACKAGE VERSION\n"
 "Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2011-06-22 12:37+0200\n"
+"POT-Creation-Date: 2011-06-22 14:44+0200\n"
 "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
 "Last-Translator: Olivier Guilyardi <olivier samalyse com>\n"
 "Language-Team: LANGUAGE <LL@li.org>\n"
@@ -695,7 +695,7 @@ msgid "Save"
 msgstr "Enregistrer"
 
 #: templates/telemeta_default/collection_detail.html:5
-#: templates/telemeta_default/collection_detail_dc.html:5 web/base.py:137
+#: templates/telemeta_default/collection_detail_dc.html:5 web/base.py:324
 msgid "Collection"
 msgstr "Collection"
 
@@ -976,7 +976,7 @@ msgstr "Mot de passe oublié"
 
 #: templates/telemeta_default/mediaitem_add.html:5
 #: templates/telemeta_default/mediaitem_copy.html:5
-#: templates/telemeta_default/mediaitem_detail.html:5 web/base.py:245
+#: templates/telemeta_default/mediaitem_detail.html:5 web/base.py:453
 msgid "Item"
 msgstr "Item"
 
@@ -1064,7 +1064,7 @@ msgstr "Formation"
 msgid "User Profile"
 msgstr "Profil utilisateur"
 
-#: templates/telemeta_default/profile_detail.html:8 web/base.py:1129
+#: templates/telemeta_default/profile_detail.html:8 web/base.py:1154
 msgid "User profile"
 msgstr "Profil utilisateur"
 
@@ -1160,8 +1160,7 @@ msgstr "Etat/Continent"
 msgid "No item"
 msgstr "Aucun item"
 
-#: templates/telemeta_default/inc/module_revisions.html:7 web/base.py:1098
-#: web/base.py:1209
+#: templates/telemeta_default/inc/module_revisions.html:7 web/base.py:1185
 msgid "Last changes"
 msgstr "Dernières modifications"
 
@@ -1341,18 +1340,17 @@ msgid_plural "%(count)d collections"
 msgstr[0] "%(count)d collection"
 msgstr[1] "%(count)d collections"
 
-#: web/base.py:136 web/base.py:244 web/base.py:496 web/base.py:1128
+#: web/base.py:323 web/base.py:452 web/base.py:683 web/base.py:1153
 msgid "Access not allowed"
 msgstr "Accès non autorisé"
 
-#: web/base.py:138 web/base.py:246 web/base.py:498 web/base.py:1130
+#: web/base.py:325 web/base.py:454 web/base.py:685 web/base.py:1155
 msgid ""
 "Please login or contact the website administator to get a private access."
 msgstr ""
 "Connectez-vous s'il vous plaît ou bien contactez l'administrateur du site "
 "pour obtenir un accès privé."
 
-
 #~ msgid "username"
 #~ msgstr "nom d'utilisateur"
 
index 8fbb815560e7fd64abb3803c139db5845098bc8e..75dca43e8be0bd7256022fa14ef6752e874c1c68 100644 (file)
Binary files a/telemeta/locale/fr/LC_MESSAGES/djangojs.mo and b/telemeta/locale/fr/LC_MESSAGES/djangojs.mo differ
index 052fb472c6414c3caa9d888bdf3302f12f176a02..e2faab1bba8446c4bd22befec253d219d2083073 100644 (file)
@@ -8,7 +8,7 @@ msgid ""
 msgstr ""
 "Project-Id-Version: PACKAGE VERSION\n"
 "Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2011-05-29 21:26+0200\n"
+"POT-Creation-Date: 2011-06-22 14:44+0200\n"
 "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
 "Last-Translator: Guillaume Pellerin <yomguy@parisson.com>\n"
 "Language-Team: LANGUAGE <LL@li.org>\n"
@@ -18,38 +18,38 @@ msgstr ""
 "Content-Transfer-Encoding: 8bit\n"
 "Plural-Forms: nplurals=2; plural=n>1\n"
 
-#: htdocs/js/locale.js:28
+#: htdocs/js/locale.js:2
 msgid "title"
 msgstr "titre"
 
-#: htdocs/js/locale.js:29
+#: htdocs/js/locale.js:3
 msgid "description"
 msgstr "description"
 
-#: htdocs/js/locale.js:30
+#: htdocs/js/locale.js:4
 msgid "delete the marker permanently?"
 msgstr "supprimer le marqueur définitivement ?"
 
-#: htdocs/js/locale.js:31
+#: htdocs/js/locale.js:5
 msgid "marker added to the selected playlist"
 msgstr "marqueur ajouté à la liste de lecture"
 
-#: htdocs/js/locale.js:32
+#: htdocs/js/locale.js:6
 msgid "item added to the selected playlist"
 msgstr "item ajouté à la liste de lecture"
 
-#: htdocs/js/locale.js:33
+#: htdocs/js/locale.js:7
 msgid "collection added to the selected playlist"
 msgstr "collection ajoutée à la liste de lecture"
 
-#: htdocs/js/locale.js:34
-msgid "there is at least one unsaved marker"
-msgstr "il y a au moins un marqueur non sauvegardé"
+#: htdocs/js/locale.js:8
+msgid "there are unsaved or modified markers"
+msgstr "il y a des marqueurs modifiés ou non sauvegardés"
 
-#: htdocs/js/locale.js:35
+#: htdocs/js/locale.js:9
 msgid "If you exit the page you will loose your changes"
 msgstr "Si vous sortez de la page, vous perdrez vos modifications"
 
-#: htdocs/js/locale.js:36
+#: htdocs/js/locale.js:10
 msgid "author"
 msgstr "auteur"
index f2b9b833e0f5c70f3657da1f2fef00bbe4bf3a8f..70ee6af7e4a9438672559c4c94a890b521ff2bcf 100644 (file)
@@ -36,7 +36,9 @@
 
 from django.conf.urls.defaults import *
 from telemeta.models import MediaItem, MediaCollection, MediaItemMarker
-from telemeta.web.base import WebView, LastestRevisionsFeed
+from telemeta.web.base import GeneralView, AdminView, CollectionView, ItemView, \
+                                InstrumentView, PlaylistView, ProfileView, GeoView, \
+                                LastestRevisionsFeed
 from jsonrpc import jsonrpc_site
 import os.path
 import telemeta.config
@@ -44,7 +46,14 @@ import telemeta.config
 telemeta.config.check()
 
 # initialization
-web_view = WebView()
+general_view = GeneralView()
+admin_view = AdminView()
+collection_view = CollectionView()
+item_view = ItemView()
+instrument_view = InstrumentView()
+playlist_view = PlaylistView()
+profile_view = ProfileView()
+geo_view = GeoView()
 
 # query sets for Django generic views
 all_items = { 'queryset': MediaItem.objects.enriched().order_by('code', 'old_code') }
@@ -56,55 +65,55 @@ all_collections_published = { 'queryset': MediaCollection.objects.filter(code__c
 
 
 # ID's regular expressions
-export_extensions = "|".join(web_view.list_export_extensions())
+export_extensions = "|".join(item_view.list_export_extensions())
 
 htdocs = os.path.dirname(__file__) + '/htdocs'
 
 urlpatterns = patterns('',
-    url(r'^$', web_view.index, name="telemeta-home"),
+    url(r'^$', general_view.index, name="telemeta-home"),
 
     # items
     url(r'^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/(?P<public_id>[A-Za-z0-9._-]+)/$', web_view.item_detail, 
+    url(r'^items/(?P<public_id>[A-Za-z0-9._-]+)/$', item_view.item_detail, 
         name="telemeta-item-detail"),
-    url(r'^items/(?P<public_id>[A-Za-z0-9._-]+)/dc/$', web_view.item_detail, 
+    url(r'^items/(?P<public_id>[A-Za-z0-9._-]+)/dc/$', item_view.item_detail, 
         {'template': 'telemeta/mediaitem_detail_dc.html'},
         name="telemeta-item-dublincore"),
-    url(r'^items/(?P<public_id>[A-Za-z0-9._-]+)/dc/xml/$', web_view.item_detail, 
+    url(r'^items/(?P<public_id>[A-Za-z0-9._-]+)/dc/xml/$', item_view.item_detail, 
         {'format': 'dublin_core_xml'},
         name="telemeta-item-dublincore-xml"),
     url(r'^items/download/(?P<public_id>[A-Za-z0-9._-]+)\.(?P<extension>' 
             + export_extensions + ')$', 
-        web_view.item_export,
+        item_view.item_export,
         name="telemeta-item-export"),
     url(r'^items/(?P<public_id>[A-Za-z0-9._-]+)/visualize/(?P<visualizer_id>[0-9a-z_]+)/(?P<width>[0-9A-Z]+)x(?P<height>[0-9A-Z]+)/$', 
-        web_view.item_visualize,
+        item_view.item_visualize,
         name="telemeta-item-visualize"),
     url(r'^items/(?P<public_id>[A-Za-z0-9._-]+)/analyze/xml/$', 
-        web_view.item_analyze_xml,
+        item_view.item_analyze_xml,
         name="telemeta-item-analyze-xml"),
     url(r'^items/(?P<public_id>[A-Za-z0-9._-]+)/item_xspf.xml$', 
-        web_view.item_playlist, 
+        item_view.item_playlist, 
         dict(template="telemeta/mediaitem_xspf.xml", mimetype="application/xspf+xml"),
         name="telemeta-item-xspf"),
-    url(r'^items/(?P<public_id>[A-Za-z0-9._-]+)/edit/$', web_view.item_edit,
+    url(r'^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'^items/(?P<public_id>[A-Za-z0-9._-]+)/copy/$', web_view.item_copy,
+    url(r'^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'^item/add/$', web_view.item_add,
+    url(r'^item/add/$', item_view.item_add,
         dict(template='telemeta/mediaitem_add.html'), name="telemeta-item-add"),
-    url(r'^items/(?P<public_id>[A-Za-z0-9._-]+)/player/(?P<width>[0-9]+)x(?P<height>[0-9]+)/$', web_view.item_detail,
+    url(r'^items/(?P<public_id>[A-Za-z0-9._-]+)/player/(?P<width>[0-9]+)x(?P<height>[0-9]+)/$', item_view.item_detail,
         dict(template='telemeta/mediaitem_player.html'), name="telemeta-item-player"),
-    url(r'^items/(?P<public_id>[A-Za-z0-9._-]+)/performances/$', web_view.item_performances_edit,
+    url(r'^items/(?P<public_id>[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<public_id>[A-Za-z0-9._-]+)/keywords/$', web_view.item_keywords_edit,
+    url(r'^items/(?P<public_id>[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<public_id>[A-Za-z0-9._-]+)/delete/$', web_view.item_delete, name="telemeta-item-delete"),
+    url(r'^items/(?P<public_id>[A-Za-z0-9._-]+)/delete/$', item_view.item_delete, name="telemeta-item-delete"),
         
     # Markers
-    url(r'^markers/(?P<marker_id>[A-Za-z0-9]+)/$', web_view.item_detail, name="telemeta-item-detail-marker"),
+    url(r'^markers/(?P<marker_id>[A-Za-z0-9]+)/$', item_view.item_detail, name="telemeta-item-detail-marker"),
         
     # collections
     url(r'^collections/$', 'django.views.generic.list_detail.object_list',
@@ -116,92 +125,92 @@ urlpatterns = patterns('',
     url(r'^collections/?page=(?P<page>[0-9]+)$', 
         'django.views.generic.list_detail.object_list',
         dict(all_collections, paginate_by=20)),
-    url(r'^collections/(?P<public_id>[A-Za-z0-9._-]+)/$', web_view.collection_detail,
+    url(r'^collections/(?P<public_id>[A-Za-z0-9._-]+)/$', collection_view.collection_detail,
         dict(template="telemeta/collection_detail.html"), name="telemeta-collection-detail"),
-    url(r'^collections/(?P<public_id>[A-Za-z0-9._-]+)/dc/$', web_view.collection_detail,
+    url(r'^collections/(?P<public_id>[A-Za-z0-9._-]+)/dc/$', collection_view.collection_detail,
         dict(template="telemeta/collection_detail_dc.html"), name="telemeta-collection-dublincore"),
     url(r'^collections/(?P<public_id>[A-Za-z0-9._-]+)/collection_xspf.xml$', 
-        web_view.collection_playlist, 
+        collection_view.collection_playlist, 
         dict(template="telemeta/collection_xspf.xml", mimetype="application/xspf+xml"),
         name="telemeta-collection-xspf"),
     url(r'^collections/(?P<public_id>[A-Za-z0-9._-]+)/collection.m3u$',
-        web_view.collection_playlist, 
+        collection_view.collection_playlist, 
         dict(template="telemeta/collection.m3u", mimetype="audio/mpegurl"),
         name="telemeta-collection-m3u"),
-    url(r'^collections/(?P<public_id>[A-Za-z0-9._-]+)/edit/$', web_view.collection_edit,
+    url(r'^collections/(?P<public_id>[A-Za-z0-9._-]+)/edit/$', collection_view.collection_edit,
         dict(template='telemeta/collection_edit.html'), name="telemeta-collection-edit"),
-    url(r'^collections/(?P<public_id>[A-Za-z0-9._-]+)/copy/$', web_view.collection_copy,
+    url(r'^collections/(?P<public_id>[A-Za-z0-9._-]+)/copy/$', collection_view.collection_copy,
         dict(template='telemeta/collection_edit.html'), name="telemeta-collection-copy"),
-    url(r'^collection/add/$', web_view.collection_add,
+    url(r'^collection/add/$', collection_view.collection_add,
         dict(template='telemeta/collection_add.html'), name="telemeta-collection-add"),
-    url(r'^collection/(?P<public_id>[A-Za-z0-9._-]+)/add_item/$', web_view.item_add,
+    url(r'^collection/(?P<public_id>[A-Za-z0-9._-]+)/add_item/$', item_view.item_add,
         dict(template='telemeta/mediaitem_add.html'), name="telemeta-collection-additem"),
 
     # search
-    url(r'^search/$', web_view.search, name="telemeta-search"),
-    url(r'^search/collections/$', web_view.search, {'type': 'collections'}, 
+    url(r'^search/$', general_view.search, name="telemeta-search"),
+    url(r'^search/collections/$', general_view.search, {'type': 'collections'}, 
         name="telemeta-search-collections"),
-    url(r'^search/items/$', web_view.search, {'type': 'items'}, 
+    url(r'^search/items/$', general_view.search, {'type': 'items'}, 
         name="telemeta-search-items"),
-    url(r'^search/criteria/$', web_view.edit_search, name="telemeta-search-criteria"),
-    url(r'^complete_location/$', web_view.complete_location, name="telemeta-complete-location"),
+    url(r'^search/criteria/$', general_view.edit_search, name="telemeta-search-criteria"),
+    url(r'^complete_location/$', general_view.complete_location, name="telemeta-complete-location"),
 
     # administration        
-    url(r'^admin/$', web_view.admin_index, name="telemeta-admin"),        
-    url(r'^admin/general/$', web_view.admin_general, name="telemeta-admin-general"),        
-    url(r'^admin/enumerations/$', web_view.admin_enumerations, name="telemeta-admin-enumerations"),       
-    url(r'^admin/users/$', web_view.admin_users, name="telemeta-admin-users"),       
+    url(r'^admin/$', admin_view.admin_index, name="telemeta-admin"),        
+    url(r'^admin/general/$', admin_view.admin_general, name="telemeta-admin-general"),        
+    url(r'^admin/enumerations/$', admin_view.admin_enumerations, name="telemeta-admin-enumerations"),       
+    url(r'^admin/users/$', admin_view.admin_users, name="telemeta-admin-users"),       
     
     # instruments administration
     url(r'^admin/instruments/$', 
-        web_view.edit_instrument ,
+        instrument_view.edit_instrument ,
         name="telemeta-instrument-edit"),        
     url(r'^admin/instruments/add/$', 
-        web_view.add_to_instrument,
+        instrument_view.add_to_instrument,
         name="telemeta-instrument-add"),        
     url(r'^admin/instruments/update/$', 
-        web_view.update_instrument,
+        instrument_view.update_instrument,
         name="telemeta-instrument-update"),        
     url(r'^admin/instruments/'
         + r'(?P<value_id>[0-9]+)/$',
-        web_view.edit_instrument_value,
+        instrument_view.edit_instrument_value,
         name="telemeta-instrument-record-edit"),   
     url(r'^admin/instruments/'
         + r'(?P<value_id>[0-9]+)/update/$',
-        web_view.update_instrument_value, 
+        instrument_view.update_instrument_value, 
         name="telemeta-instrument-record-update"),   
         
     # enumerations administration
     url(r'^admin/enumerations/(?P<enumeration_id>[0-9a-z]+)/$', 
-        web_view.edit_enumeration ,
+        admin_view.edit_enumeration ,
         name="telemeta-enumeration-edit"),        
     url(r'^admin/enumerations/(?P<enumeration_id>[0-9a-z]+)/add/$', 
-        web_view.add_to_enumeration,
+        admin_view.add_to_enumeration,
         name="telemeta-enumeration-add"),        
     url(r'^admin/enumerations/(?P<enumeration_id>[0-9a-z]+)/update/$', 
-        web_view.update_enumeration,
+        admin_view.update_enumeration,
         name="telemeta-enumeration-update"),        
     url(r'^admin/enumerations/(?P<enumeration_id>[0-9a-z]+)/'
         + r'(?P<value_id>[0-9]+)/$',
-        web_view.edit_enumeration_value,
+        admin_view.edit_enumeration_value,
         name="telemeta-enumeration-record-edit"),   
     url(r'^admin/enumerations/(?P<enumeration_id>[0-9a-z]+)/'
         + r'(?P<value_id>[0-9]+)/update/$',
-        web_view.update_enumeration_value, 
+        admin_view.update_enumeration_value, 
         name="telemeta-enumeration-record-update"),   
 
     # Geographic browsing
-    url(r'^geo/$', web_view.list_continents, name="telemeta-geo-continents"),
-    url(r'^geo/(?P<continent>[a-z_]+)/$', web_view.list_countries, 
+    url(r'^geo/$', geo_view.list_continents, name="telemeta-geo-continents"),
+    url(r'^geo/(?P<continent>[a-z_]+)/$', geo_view.list_countries, 
         name="telemeta-geo-countries"),
     url(r'^geo/collections/(?P<continent>[a-z_]+)/(?P<country>[a-z_]+)/$', 
-        web_view.list_country_collections, 
+        geo_view.list_country_collections, 
         name="telemeta-geo-country-collections"),
     url(r'^geo/items/(?P<continent>[a-z_]+)/(?P<country>[a-z_]+)/$', 
-        web_view.list_country_items, 
+        geo_view.list_country_items, 
         name="telemeta-geo-country-items"),
     url(r'^geo/country_info/(?P<id>[0-9a-z]+)/$', 
-        web_view.country_info, name="telemeta-country-info"),
+        geo_view.country_info, name="telemeta-country-info"),
 
     # CSS+Images (FIXME: for developement only)
     url(r'^css/(?P<path>.*)$', 'django.views.static.serve', 
@@ -221,19 +230,19 @@ urlpatterns = patterns('',
         name="telemeta-timeside"),
 
     # Flat pages
-    url(r'^pages/(?P<path>.*)$', web_view.render_flatpage, name="telemeta-flatpage"),
+    url(r'^pages/(?P<path>.*)$', general_view.render_flatpage, name="telemeta-flatpage"),
 
     # OAI-PMH Data Provider
-    url(r'^oai/.*$', web_view.handle_oai_request, name="telemeta-oai"),
+    url(r'^oai/.*$', general_view.handle_oai_request, name="telemeta-oai"),
 
     # Authentication
     url(r'^login/$', 'django.contrib.auth.views.login', {'template_name': 'telemeta/login.html'},
         name="telemeta-login"),
-    url(r'^logout/$', web_view.logout, name="telemeta-logout"),
+    url(r'^logout/$', general_view.logout, name="telemeta-logout"),
 
     # Profile
-    url(r'^accounts/(?P<username>[A-Za-z0-9._-]+)/profile/$', web_view.profile_detail, name="telemeta-profile-detail"),
-    url(r'^accounts/(?P<username>[A-Za-z0-9._-]+)/profile/edit/$', web_view.profile_edit, name="telemeta-profile-edit"),
+    url(r'^accounts/(?P<username>[A-Za-z0-9._-]+)/profile/$', profile_view.profile_detail, name="telemeta-profile-detail"),
+    url(r'^accounts/(?P<username>[A-Za-z0-9._-]+)/profile/edit/$', profile_view.profile_edit, name="telemeta-profile-edit"),
     
     # Registration
     url(r'^accounts/password_change/$', 'django.contrib.auth.views.password_change', {'template_name': 'telemeta/registration/password_change_form.html'}, name="telemeta-password-change"),
@@ -251,7 +260,7 @@ urlpatterns = patterns('',
     # url(r'json/browse/', 'jsonrpc.views.browse', name="jsonrpc_browser"), 
     
     # Playlists
-    url(r'^playlists/(?P<public_id>[a-zA-Z0-9]+)/(?P<resource_type>[a-zA-Z0-9]+)/csv/$', web_view.playlist_csv_export, name="telemeta-playlist-csv-export"),
+    url(r'^playlists/(?P<public_id>[a-zA-Z0-9]+)/(?P<resource_type>[a-zA-Z0-9]+)/csv/$', playlist_view.playlist_csv_export, name="telemeta-playlist-csv-export"),
     
     # RSS feeds
     url(r'^rss/$', LastestRevisionsFeed(), name="telemeta-rss"),
index 8bf51032f6eb72520d29c22d24af85d87462b809..ab2496bd055306be8120213f06cb032ff29a1f2b 100644 (file)
@@ -99,16 +99,76 @@ def stream_from_file(__file):
             break
         yield __chunk
     
-    
-class WebView(object):
-    """Provide web UI methods"""
+def get_public_access(access, year_from=None, year_to=None):
+    # Rolling publishing date : public access is given when time between recorded year 
+    # and current year is over the settings value PUBLIC_ACCESS_PERIOD
+    if year_from and not year_from == 0:
+        year = year_from
+    elif year_to and not year_to == 0:
+        year = year_to
+    else:
+        year = 0
+    if access == 'full':
+        public_access = True
+    else:
+        public_access = False
+        if year and not year == 'None':
+            year_now = datetime.datetime.now().strftime("%Y")
+            if int(year_now) - int(year) >= settings.TELEMETA_PUBLIC_ACCESS_PERIOD:
+                public_access = True
+        else:
+            public_access = False        
+    return public_access
 
-    graphers = timeside.core.processors(timeside.api.IGrapher)
-    decoders = timeside.core.processors(timeside.api.IDecoder)
-    encoders = timeside.core.processors(timeside.api.IEncoder)
-    analyzers = timeside.core.processors(timeside.api.IAnalyzer)
-    cache_data = TelemetaCache(settings.TELEMETA_DATA_CACHE_DIR)
-    cache_export = TelemetaCache(settings.TELEMETA_EXPORT_CACHE_DIR)
+def get_revisions(nb):
+    last_revisions = Revision.objects.order_by('-time')[0:nb]
+    revisions = []
+    for revision in last_revisions:
+        if revision.element_type == 'item':
+            try:
+                element = MediaItem.objects.get(pk=revision.element_id)
+            except:
+                element = None
+        if revision.element_type == 'collection':
+            try:
+                element = MediaCollection.objects.get(pk=revision.element_id)
+            except:
+                element = None
+        if revision.element_type == 'marker':
+            try:
+                element = MediaItemMarker.objects.get(pk=revision.element_id)
+            except:
+                element = None
+        if not element == None:
+            revisions.append({'revision': revision, 'element': element})
+    return revisions
+
+def get_playlists(request, user=None):
+    if not user:
+        user = request.user
+    playlists = []
+    if user.is_authenticated():
+        user_playlists = Playlist.objects.filter(author=user)
+        for playlist in user_playlists:
+            playlist_resources = PlaylistResource.objects.filter(playlist=playlist)
+            resources = []
+            for resource in playlist_resources:
+                try:
+                    if resource.resource_type == 'item':
+                        element = MediaItem.objects.get(id=resource.resource_id)
+                    if resource.resource_type == 'collection':
+                        element = MediaCollection.objects.get(id=resource.resource_id)
+                    if resource.resource_type == 'marker':
+                        element = MediaItemMarker.objects.get(id=resource.resource_id)
+                except:
+                    element = None
+                resources.append({'element': element, 'type': resource.resource_type, 'public_id': resource.public_id })
+            playlists.append({'playlist': playlist, 'resources': resources})
+    return playlists
+
+
+class GeneralView(object):
+    """Provide general web UI methods"""
     
     def index(self, request):
         """Render the homepage"""
@@ -123,12 +183,139 @@ class WebView(object):
             return HttpResponse(template.render(context))
         else:
             template='telemeta/home.html'
-            playlists = self.get_playlists(request)
+            playlists = get_playlists(request)
             revisions = get_revisions(15)
             searches = Search.objects.filter(username=request.user)
             return render(request, template, {'playlists': playlists, 'searches': searches, 
                                               'revisions': revisions,})
+
+    def edit_search(self, request, criteria=None):
+        year_min, year_max = MediaCollection.objects.all().recording_year_range()
+        rec_years = year_min and year_max and range(year_min, year_max + 1) or []
+        year_min, year_max = MediaCollection.objects.all().publishing_year_range()
+        pub_years = year_min and year_max and range(year_min, year_max + 1) or []
+        return render(request, 'telemeta/search_criteria.html', {
+            'rec_years': rec_years,
+            'pub_years': pub_years,
+            'ethnic_groups': MediaItem.objects.all().ethnic_groups(),
+            'criteria': criteria
+        })
+
+    def handle_oai_request(self, request):
+        host = request.META['HTTP_HOST']
+        url         = 'http://' + host + request.path
+        datasource  = TelemetaOAIDataSource()
+        admin       = settings.ADMINS[0][1]
+        provider    = oai.DataProvider(datasource, host, url, admin)
+        args        = request.GET.copy()
+        args.update(request.POST)
+        return HttpResponse(provider.handle(args), mimetype='text/xml')
         
+    def render_flatpage(self, request, path):
+        try:
+            content = pages.get_page_content(request, path)
+        except pages.MalformedPagePath:
+            return redirect(request.path + '/')
+
+        if isinstance(content, pages.PageAttachment):
+            return HttpResponse(content, content.mimetype())
+        else:
+            return render(request, 'telemeta/flatpage.html', {'page_content': content })
+
+    def logout(self, request):
+        auth.logout(request)
+        return redirect('telemeta-home')
+
+    def search(self, request, type = None):
+        """Perform a search through collections and items metadata"""
+        collections = MediaCollection.objects.enriched()
+        items = MediaItem.objects.enriched()
+        input = request.REQUEST
+        criteria = {}
+
+        switch = {
+            'pattern': lambda value: ( 
+                collections.quick_search(value), 
+                items.quick_search(value)),
+            'title': lambda value: (
+                collections.word_search('title', value), 
+                items.by_title(value)),
+            'location': lambda value: (
+                collections.by_location(Location.objects.get(name=value)), 
+                items.by_location(Location.objects.get(name=value))),
+            'continent': lambda value: (
+                collections.by_continent(value), 
+                items.filter(continent = value)),
+            'ethnic_group': lambda value: (
+                collections.by_ethnic_group(value), 
+                items.filter(ethnic_group = value),
+                EthnicGroup.objects.get(pk=value)),
+            'creator': lambda value: (
+                collections.word_search('creator', value),
+                items.word_search('collection__creator', value)),
+            'collector': lambda value: (
+                collections.by_fuzzy_collector(value),
+                items.by_fuzzy_collector(value)),
+            'rec_year_from': lambda value: (
+                collections.by_recording_year(int(value), int(input.get('rec_year_to', value))), 
+                items.by_recording_date(datetime.date(int(value), 1, 1), 
+                                        datetime.date(int(input.get('rec_year_to', value)), 12, 31))),
+            'rec_year_to': lambda value: (collections, items),
+            'pub_year_from': lambda value: (
+                collections.by_publish_year(int(value), int(input.get('pub_year_to', value))), 
+                items.by_publish_year(int(value), int(input.get('pub_year_to', value)))),
+            'pub_year_to': lambda value: (collections, items),
+        }
+       
+        for key, value in input.items():
+            func = switch.get(key)
+            if func and value and value != "0":
+                try:
+                    res = func(value)
+                    if len(res)  > 2:
+                        collections, items, value = res
+                    else: 
+                        collections, items = res
+                except ObjectDoesNotExist:
+                    collections = collections.none()
+                    items = items.none()
+
+                criteria[key] = value
+
+        if type is None:
+            if collections.count():
+                type = 'collections'
+            else:
+                type = 'items'
+
+        if type == 'items':
+            objects = items
+        else:
+            objects = collections
+
+        return list_detail.object_list(request, objects, 
+            template_name='telemeta/search_results.html', paginate_by=20,
+            extra_context={'criteria': criteria, 'collections_num': collections.count(), 
+                'items_num': items.count(), 'type' : type})
+
+    def complete_location(self, request, with_items=True):
+        input = request.REQUEST
+       
+        token = input['q']
+        limit = int(input['limit'])
+        if with_items:
+            locations = MediaItem.objects.all().locations()
+        else:
+            locations = Location.objects.all()
+
+        locations = locations.filter(name__istartswith=token).order_by('name')[:limit]
+        data = [unicode(l) + " (%d items)" % l.items().count() for l in locations]
+
+        return HttpResponse("\n".join(data))
+
+class CollectionView(object):
+    """Provide Collections web UI methods"""
+
     def collection_detail(self, request, public_id, template='telemeta/collection_detail.html'):
         collection = MediaCollection.objects.get(public_id=public_id)
         
@@ -139,9 +326,9 @@ class WebView(object):
             messages.error(request, title)
             return render(request, 'telemeta/messages.html', {'description' : description})
 
-        public_access = self.get_public_access(collection.public_access, collection.recorded_from_year, 
+        public_access = get_public_access(collection.public_access, collection.recorded_from_year, 
                                                 collection.recorded_to_year)
-        playlists = self.get_playlists(request)
+        playlists = get_playlists(request)
         return render(request, template, {'collection': collection, 'playlists': playlists, 'public_access': public_access})
 
     @method_decorator(permission_required('telemeta.change_mediacollection'))
@@ -195,7 +382,28 @@ class WebView(object):
             form = MediaCollectionForm(instance=collection)
         
         return render(request, template, {'collection': collection, "form": form,})
-        
+
+    def collection_playlist(self, request, public_id, template, mimetype):
+        try:
+            collection = MediaCollection.objects.get(public_id=public_id)
+        except ObjectDoesNotExist:
+            raise Http404
+
+        template = loader.get_template(template)
+        context = RequestContext(request, {'collection': collection, 'host': request.META['HTTP_HOST']})
+        return HttpResponse(template.render(context), mimetype=mimetype)
+
+
+class ItemView(object):
+    """Provide Collections web UI methods"""
+
+    graphers = timeside.core.processors(timeside.api.IGrapher)
+    decoders = timeside.core.processors(timeside.api.IDecoder)
+    encoders = timeside.core.processors(timeside.api.IEncoder)
+    analyzers = timeside.core.processors(timeside.api.IAnalyzer)
+    cache_data = TelemetaCache(settings.TELEMETA_DATA_CACHE_DIR)
+    cache_export = TelemetaCache(settings.TELEMETA_EXPORT_CACHE_DIR)
+    
     def item_previous_next(self, item):
         # Get previous and next items
         pks = []
@@ -262,8 +470,8 @@ class WebView(object):
         
         previous, next = self.item_previous_next(item)
         self.item_analyze(item)
-        playlists = self.get_playlists(request)
-        public_access = self.get_public_access(item.public_access, str(item.recorded_from_date).split('-')[0], 
+        playlists = get_playlists(request)
+        public_access = get_public_access(item.public_access, str(item.recorded_from_date).split('-')[0], 
                                                 str(item.recorded_to_date).split('-')[0])
                 
         return render(request, template,
@@ -273,27 +481,6 @@ class WebView(object):
                     'previous' : previous, 'next' : next, 'marker': marker_id, 'playlists' : playlists, 
                     'public_access': public_access, 'width': width, 'height': height, 
                     })
-    
-    def get_public_access(self, access, year_from=None, year_to=None):
-        # Rolling publishing date : public access is given when time between recorded year 
-        # and current year is over the settings value PUBLIC_ACCESS_PERIOD
-        if year_from and not year_from == 0:
-            year = year_from
-        elif year_to and not year_to == 0:
-            year = year_to
-        else:
-            year = 0
-        if access == 'full':
-            public_access = True
-        else:
-            public_access = False
-            if year and not year == 'None':
-                year_now = datetime.datetime.now().strftime("%Y")
-                if int(year_now) - int(year) >= settings.TELEMETA_PUBLIC_ACCESS_PERIOD:
-                    public_access = True
-            else:
-                public_access = False        
-        return public_access
         
     @method_decorator(permission_required('telemeta.change_mediaitem'))
     def item_edit(self, request, public_id, template='telemeta/mediaitem_edit.html'):
@@ -488,7 +675,7 @@ class WebView(object):
         """Export a given media item in the specified format (OGG, FLAC, ...)"""
         
         item = MediaItem.objects.get(public_id=public_id)
-        public_access = self.get_public_access(item.public_access, str(item.recorded_from_date).split('-')[0], 
+        public_access = get_public_access(item.public_access, str(item.recorded_from_date).split('-')[0], 
                                                 str(item.recorded_to_date).split('-')[0])
         
         if (not public_access or not extension in settings.TELEMETA_STREAMING_FORMATS) and \
@@ -554,106 +741,47 @@ class WebView(object):
         response['Content-Disposition'] = 'attachment'
         return response
 
-    def edit_search(self, request, criteria=None):
-        year_min, year_max = MediaCollection.objects.all().recording_year_range()
-        rec_years = year_min and year_max and range(year_min, year_max + 1) or []
-        year_min, year_max = MediaCollection.objects.all().publishing_year_range()
-        pub_years = year_min and year_max and range(year_min, year_max + 1) or []
-        return render(request, 'telemeta/search_criteria.html', {
-            'rec_years': rec_years,
-            'pub_years': pub_years,
-            'ethnic_groups': MediaItem.objects.all().ethnic_groups(),
-            'criteria': criteria
-        })
-
-    def complete_location(self, request, with_items=True):
-        input = request.REQUEST
-       
-        token = input['q']
-        limit = int(input['limit'])
-        if with_items:
-            locations = MediaItem.objects.all().locations()
-        else:
-            locations = Location.objects.all()
-
-        locations = locations.filter(name__istartswith=token).order_by('name')[:limit]
-        data = [unicode(l) + " (%d items)" % l.items().count() for l in locations]
-
-        return HttpResponse("\n".join(data))
-
-    def search(self, request, type = None):
-        """Perform a search through collections and items metadata"""
-        collections = MediaCollection.objects.enriched()
-        items = MediaItem.objects.enriched()
-        input = request.REQUEST
-        criteria = {}
-
-        switch = {
-            'pattern': lambda value: ( 
-                collections.quick_search(value), 
-                items.quick_search(value)),
-            'title': lambda value: (
-                collections.word_search('title', value), 
-                items.by_title(value)),
-            'location': lambda value: (
-                collections.by_location(Location.objects.get(name=value)), 
-                items.by_location(Location.objects.get(name=value))),
-            'continent': lambda value: (
-                collections.by_continent(value), 
-                items.filter(continent = value)),
-            'ethnic_group': lambda value: (
-                collections.by_ethnic_group(value), 
-                items.filter(ethnic_group = value),
-                EthnicGroup.objects.get(pk=value)),
-            'creator': lambda value: (
-                collections.word_search('creator', value),
-                items.word_search('collection__creator', value)),
-            'collector': lambda value: (
-                collections.by_fuzzy_collector(value),
-                items.by_fuzzy_collector(value)),
-            'rec_year_from': lambda value: (
-                collections.by_recording_year(int(value), int(input.get('rec_year_to', value))), 
-                items.by_recording_date(datetime.date(int(value), 1, 1), 
-                                        datetime.date(int(input.get('rec_year_to', value)), 12, 31))),
-            'rec_year_to': lambda value: (collections, items),
-            'pub_year_from': lambda value: (
-                collections.by_publish_year(int(value), int(input.get('pub_year_to', value))), 
-                items.by_publish_year(int(value), int(input.get('pub_year_to', value)))),
-            'pub_year_to': lambda value: (collections, items),
-        }
-       
-        for key, value in input.items():
-            func = switch.get(key)
-            if func and value and value != "0":
-                try:
-                    res = func(value)
-                    if len(res)  > 2:
-                        collections, items, value = res
-                    else: 
-                        collections, items = res
-                except ObjectDoesNotExist:
-                    collections = collections.none()
-                    items = items.none()
-
-                criteria[key] = value
+    def item_playlist(self, request, public_id, template, mimetype):
+        try:
+            item = MediaItem.objects.get(public_id=public_id)
+        except ObjectDoesNotExist:
+            raise Http404
 
-        if type is None:
-            if collections.count():
-                type = 'collections'
-            else:
-                type = 'items'
+        template = loader.get_template(template)
+        context = RequestContext(request, {'item': item, 'host': request.META['HTTP_HOST']})
+        return HttpResponse(template.render(context), mimetype=mimetype)
 
-        if type == 'items':
-            objects = items
+    @method_decorator(permission_required('telemeta.change_mediaitem'))
+    def item_performances_edit(self, request, public_id, template):
+        item = MediaItem.objects.get(public_id=public_id)
+        PerformanceFormSet = inlineformset_factory(MediaItem, MediaItemPerformance, form=MediaItemPerformanceForm)
+        if request.method == 'POST':
+            formset = PerformanceFormSet(data=request.POST, instance=item)
+            if formset.is_valid():
+                formset.save()
+                return HttpResponseRedirect('/items/'+public_id)
         else:
-            objects = collections
+            formset = PerformanceFormSet(instance=item)
+        return render(request, template, {'item': item, 'formset': formset,})
+    
+    @method_decorator(permission_required('telemeta.change_mediaitem'))
+    def item_keywords_edit(self, request, public_id, template):
+        item = MediaItem.objects.get(public_id=public_id)
+        FormSet = inlineformset_factory(MediaItem, MediaItemKeyword)
+        if request.method == 'POST':
+            formset = FormSet(data=request.POST, instance=item)
+            if formset.is_valid():
+                formset.save()
+                return HttpResponseRedirect('/items/'+public_id)
+        else:
+            formset = FormSet(instance=item)
+        return render(request, template, {'item': item, 'formset': formset,})
+
 
-        return list_detail.object_list(request, objects, 
-            template_name='telemeta/search_results.html', paginate_by=20,
-            extra_context={'criteria': criteria, 'collections_num': collections.count(), 
-                'items_num': items.count(), 'type' : type})
 
-    # ADMIN
+class AdminView(object):
+    """Provide Admin web UI methods"""
+    
     @method_decorator(permission_required('sites.change_site'))
     def admin_index(self, request):
         return render(request, 'telemeta/admin.html', self.__get_admin_context_vars())
@@ -665,12 +793,12 @@ class WebView(object):
     @method_decorator(permission_required('sites.change_site'))
     def admin_enumerations(self, request):
         return render(request, 'telemeta/admin_enumerations.html', self.__get_admin_context_vars())
+
     @method_decorator(permission_required('sites.change_site'))
     def admin_users(self, request):
         users = User.objects.all()
         return render(request, 'telemeta/admin_users.html', {'users': users})
 
-    # ENUMERATIONS
     def __get_enumerations_list(self):
         from django.db.models import get_models
         models = get_models(telemeta.models)
@@ -687,7 +815,7 @@ class WebView(object):
     
     def __get_admin_context_vars(self):
         return {"enumerations": self.__get_enumerations_list()}
-    
+
     def __get_enumeration(self, id):
         from django.db.models import get_models
         models = get_models(telemeta.models)
@@ -765,7 +893,9 @@ class WebView(object):
         return self.edit_enumeration(request, enumeration_id)
   
 
-    # INSTRUMENTS
+class InstrumentView(object):
+    """Provide Instrument web UI methods"""
+
     @method_decorator(permission_required('telemeta.change_instrument'))
     def edit_instrument(self, request):        
         
@@ -807,25 +937,9 @@ class WebView(object):
 
         return self.edit_instrument(request)
         
-    def collection_playlist(self, request, public_id, template, mimetype):
-        try:
-            collection = MediaCollection.objects.get(public_id=public_id)
-        except ObjectDoesNotExist:
-            raise Http404
-
-        template = loader.get_template(template)
-        context = RequestContext(request, {'collection': collection, 'host': request.META['HTTP_HOST']})
-        return HttpResponse(template.render(context), mimetype=mimetype)
-
-    def item_playlist(self, request, public_id, template, mimetype):
-        try:
-            item = MediaItem.objects.get(public_id=public_id)
-        except ObjectDoesNotExist:
-            raise Http404
-
-        template = loader.get_template(template)
-        context = RequestContext(request, {'item': item, 'host': request.META['HTTP_HOST']})
-        return HttpResponse(template.render(context), mimetype=mimetype)
+        
+class GeoView(object):
+    """Provide Geo web UI methods"""
 
     def list_continents(self, request):
         continents = MediaItem.objects.all().countries(group_by_continent=True)
@@ -862,32 +976,9 @@ class WebView(object):
             template_name='telemeta/geo_country_items.html', paginate_by=20,
             extra_context={'country': country, 'continent': continent})
 
-    def handle_oai_request(self, request):
-        host = request.META['HTTP_HOST']
-        url         = 'http://' + host + request.path
-        datasource  = TelemetaOAIDataSource()
-        admin       = settings.ADMINS[0][1]
-        provider    = oai.DataProvider(datasource, host, url, admin)
-        args        = request.GET.copy()
-        args.update(request.POST)
-        return HttpResponse(provider.handle(args), mimetype='text/xml')
-        
-    def render_flatpage(self, request, path):
-        try:
-            content = pages.get_page_content(request, path)
-        except pages.MalformedPagePath:
-            return redirect(request.path + '/')
-
-        if isinstance(content, pages.PageAttachment):
-            return HttpResponse(content, content.mimetype())
-        else:
-            return render(request, 'telemeta/flatpage.html', {'page_content': content })
-
-    def logout(self, request):
-        auth.logout(request)
-        return redirect('telemeta-home')
+class MarkerView(object):
+    """Provide Collections web UI methods"""
 
-    #MARKERS
     @jsonrpc_method('telemeta.add_marker')
     def add_marker(request, marker):
         # marker must be a dict
@@ -942,7 +1033,9 @@ class WebView(object):
         marker = MediaItemMarker.objects.get(public_id=public_id)
         return marker.id
     
-    # PLAYLISTS
+class PlaylistView(object):
+    """Provide Collections web UI methods"""
+
     @jsonrpc_method('telemeta.add_playlist')
     def add_playlist(request, playlist):
         # playlist must be a dict
@@ -961,29 +1054,6 @@ class WebView(object):
         m = Playlist.objects.get(public_id=public_id)
         m.delete()
         
-    def get_playlists(self, request, user=None):
-        if not user:
-            user = request.user
-        playlists = []
-        if user.is_authenticated():
-            user_playlists = Playlist.objects.filter(author=user)
-            for playlist in user_playlists:
-                playlist_resources = PlaylistResource.objects.filter(playlist=playlist)
-                resources = []
-                for resource in playlist_resources:
-                    try:
-                        if resource.resource_type == 'item':
-                            element = MediaItem.objects.get(id=resource.resource_id)
-                        if resource.resource_type == 'collection':
-                            element = MediaCollection.objects.get(id=resource.resource_id)
-                        if resource.resource_type == 'marker':
-                            element = MediaItemMarker.objects.get(id=resource.resource_id)
-                    except:
-                        element = None
-                    resources.append({'element': element, 'type': resource.resource_type, 'public_id': resource.public_id })
-                playlists.append({'playlist': playlist, 'resources': resources})
-        return playlists
-        
     @jsonrpc_method('telemeta.update_playlist')
     def update_playlist(request, playlist):
         if isinstance(playlist, dict):
@@ -1056,55 +1126,10 @@ class WebView(object):
                 writer.writerow(data)
         return response
         
-    def rss(self, request):
-        "Render the RSS feed of last revisions"
-        rss_item_list = []
-        organization = settings.TELEMETA_ORGANIZATION
-        subjects = settings.TELEMETA_SUBJECTS
-        rss_host = request.META['HTTP_HOST']
-        date_now = datetime.datetime.now()
-        revisions = self.get_revisions(50)
-        tags = ['title', 'description', 'comment']
-        
-        for r in revisions:
-            revision = r['revision']
-            element = r['element']
-            if element:
-                link = 'http://' + rss_host + '/' + revision.element_type + 's/' + str(element.public_id)                
-                description = '<b>modified by ' + revision.user.username + ' on ' + unicode(revision.time) + '</b><br /><br />'
-                dict = element.to_dict()
-                for tag in dict.keys():
-                    try:
-                        value = dict[tag]
-                        if value != '':
-                            description += tag + ' : ' + value + '<br />'
-                    except:
-                        continue
-                    if tag == 'title':
-                        if element.title == '':
-                            title = str(element.public_id)
-                        else:
-                            title = element.title
-                        title = element.element_type + ' : ' + title
-                        
-                rss_item_list.append(RSSItem(
-                        title = title,
-                        link = link,
-                        description = description.encode('utf-8'),
-                        guid = Guid(link),
-                        pubDate = revision.time,)
-                        )
-                        
-        rss = RSS2(title = organization + ' - Telemeta - ' + ugettext('Last changes'),
-                            link = rss_host,
-                            description = ' '.join([subject.decode('utf-8') for subject in subjects]),
-                            lastBuildDate = str(date_now),
-                            items = rss_item_list,)
-        
-        feed = rss.to_xml(encoding='utf-8')
-        response = HttpResponse(feed, mimetype='application/rss+xml')
-        return response
-    
+
+class ProfileView(object):
+    """Provide Collections web UI methods"""
+
     @method_decorator(login_required)
     def profile_detail(self, request, username, template='telemeta/profile_detail.html'):
         user = User.objects.get(username=username)
@@ -1112,7 +1137,7 @@ class WebView(object):
             profile = user.get_profile()
         except:
             profile = None
-        playlists = self.get_playlists(request, user)
+        playlists = get_playlists(request, user)
         return render(request, template, {'profile' : profile, 'usr': user, 'playlists': playlists})
         
     def profile_edit(self, request, username, template='telemeta/profile_edit.html'):
@@ -1149,56 +1174,7 @@ class WebView(object):
             forms = [user_form, profile_form]
         return render(request, template, {'forms': forms, 'usr': user, 'user_hidden_fields': user_hidden_fields})
 
-    @method_decorator(permission_required('telemeta.change_mediaitem'))
-    def item_performances_edit(self, request, public_id, template):
-        item = MediaItem.objects.get(public_id=public_id)
-        PerformanceFormSet = inlineformset_factory(MediaItem, MediaItemPerformance, form=MediaItemPerformanceForm)
-        if request.method == 'POST':
-            formset = PerformanceFormSet(data=request.POST, instance=item)
-            if formset.is_valid():
-                formset.save()
-                return HttpResponseRedirect('/items/'+public_id)
-        else:
-            formset = PerformanceFormSet(instance=item)
-        return render(request, template, {'item': item, 'formset': formset,})
-    
-    @method_decorator(permission_required('telemeta.change_mediaitem'))
-    def item_keywords_edit(self, request, public_id, template):
-        item = MediaItem.objects.get(public_id=public_id)
-        FormSet = inlineformset_factory(MediaItem, MediaItemKeyword)
-        if request.method == 'POST':
-            formset = FormSet(data=request.POST, instance=item)
-            if formset.is_valid():
-                formset.save()
-                return HttpResponseRedirect('/items/'+public_id)
-        else:
-            formset = FormSet(instance=item)
-        return render(request, template, {'item': item, 'formset': formset,})
-    
 
-def get_revisions(nb):
-    last_revisions = Revision.objects.order_by('-time')[0:nb]
-    revisions = []
-    for revision in last_revisions:
-        if revision.element_type == 'item':
-            try:
-                element = MediaItem.objects.get(pk=revision.element_id)
-            except:
-                element = None
-        if revision.element_type == 'collection':
-            try:
-                element = MediaCollection.objects.get(pk=revision.element_id)
-            except:
-                element = None
-        if revision.element_type == 'marker':
-            try:
-                element = MediaItemMarker.objects.get(pk=revision.element_id)
-            except:
-                element = None
-        if not element == None:
-            revisions.append({'revision': revision, 'element': element})
-    return revisions
-    
 
 class LastestRevisionsFeed(Feed):
     "the RSS feed of the lastest revisions"