Merge with 2ade832d146239bf9f24105a93cf7abb023f3daa
authorrougeronj
Fri, 19 Oct 2012 16:10:22 +0200
changeset 883 0d9c00ae2755
parent 879 9eae65727f54 (diff)
parent 882 9520fb2810e2 (current diff)
child 884 1d071843f134
Merge with 2ade832d146239bf9f24105a93cf7abb023f3daa
src/ldt/ldt/ldt_utils/tests.py
src/ldt/ldt/ldt_utils/views/content.py
--- a/.hgtags	Fri Oct 19 16:08:42 2012 +0200
+++ b/.hgtags	Fri Oct 19 16:10:22 2012 +0200
@@ -108,3 +108,7 @@
 626573ed450f361c429b5208011f4285b689646f V01.23
 f8bd692229d72085d262dbaf5708b0fb555d9b95 V01.24
 96b7309ae220055ec844eb047513828842883fbe V01.25
+36d8d68fda811a9020dfcb4794ad42403ab7806b V01.26
+36d8d68fda811a9020dfcb4794ad42403ab7806b V01.26
+3eae57bb42b3d5c8daf3e94331f9ef30cf444693 V01.26
+2151b47c58c3291f82a2e190c474e7f616266742 V01.27
--- a/src/ldt/ldt/__init__.py	Fri Oct 19 16:08:42 2012 +0200
+++ b/src/ldt/ldt/__init__.py	Fri Oct 19 16:10:22 2012 +0200
@@ -1,4 +1,4 @@
-VERSION = (1, 25, 0, "final", 0)
+VERSION = (1, 27, 0, "final", 0)
 
 
 def get_version():
--- a/src/ldt/ldt/api/ldt/handlers.py	Fri Oct 19 16:08:42 2012 +0200
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,291 +0,0 @@
-from ldt.ldt_utils.models import Project, Content, Segment
-from django.db.models import F, Q
-from piston.handler import BaseHandler
-from piston.utils import rc, require_extended
-from ldt.ldt_utils.utils import LdtAnnotation
-from ldt.ldt_utils.stat import add_annotation_to_stat
-from ldt.security import protect_models, unprotect_models
-from ldt.ldt_utils.segmentserializer import SegmentSerializer
-import logging #@UnresolvedImport
-
-
-class ProjectHandler(BaseHandler):
-    allowed_methods = ('GET', 'PUT',)
-    model = Project   
-
-    def read(self, request, project_id):
-        """
-        returns a single project
-        """
-        return Project.objects.get(ldt_id=project_id)
-    
-    @require_extended
-    def update(self, request, project_id):
-        #return rc.ALL_OK
-        logging.debug("request " + repr(request))
-        data = request.data
-        ldt_str = data["ldt"]
-        
-        logging.debug("request data" + repr(ldt_str))
-        
-        if not ldt_str:
-            return rc.BAD_REQUEST
-        
-        project = Project.objects.get(ldt_id=project_id)
-        
-        project.ldt = ldt_str
-        
-        unprotect_models()
-        project.save()
-        protect_models()
-    
-        return rc.ALL_OK
-
-
-class AnnotationHandler(BaseHandler):
-    allowed_methods = ('PUT',)
-    
-    @require_extended
-    def update(self, request, project_id):
-        """
-        This method is called when a PUT request is sent to http://<plateform_location>/api/ldt/projects/<project_id>.<format>. 
-            <project_id> is the ldt_id field of the project. If <projet_id> does not match any project on the platform, a 410 ("Gone")
-            error will be returned.
-            <format> is the format of the data sent back by the server. It can be 'json', 'yaml', 'xml' or 'pickle'.
-            
-        If the request contains a content-type header whose value is set to "application/json" and a valid utf-8 encoded JSON file,
-        the following conditions will be checked before the annotations are added : 
-            If the submitted file is not valid or refers to a media that is not contained in the project, a 500  ("Bad Request")
-            error will be returned. If the "type" field of an annotation matches an already existing cutting, it will be added to that 
-            cutting. Otherwise, a new cutting will be added (as well as a new ensemble if needed). New cuttings are added to the view 
-            "View at the last recording" if it exists, or to the view "Init view" else. If none of those views exist, the server will 
-            not add the cutting to a view. Several annotations can be added at the same time if the submitted file contains multiple 
-            annotations. The server returns the file submitted if all annotations have been added successfully, and adds to this file
-            IDs of created annotations to the file with a 200("OK") error code.
-        
-        If no content-type header is set, the file submitted must be a valid XML file and will replace entirely the ldt field
-        of the project without any verifications.  
-        
-        Example :
-        
-        Remark : The file below contain the minimum necessary fields and attributes for the handler to work. If one field or attribute is
-        missing (e.g. author, or date) during submission, an error will occur.
-        
-        A platform is reachable at http://localhost/. It contains a project with ID a0593b58-f258-11df-80e1-00145ea4a2be. This project has
-        a content milosforman_amadeus, which has a cutting Salieri inside the view "View at the last recording". The following JSON file exists in the current directory :
-    
-        Example of ajax call with 2 differents annotations :
-        $('#mon_ajax').click(function(e) {
-            var url = "{% url project_api project_id='c8448f21-272d-11e1-876b-c8bcc896c290' emitter_format='.json' %}"; // Don't forget the "." before "json" !
-            
-            var monjson = '{\
-                    "annotations": [\
-                        {\
-                            "type": "c_07BA1284-5F24-71A8-1EE2-423EED999B8A",\
-                            "type_title": "New cutting name if necessary",\
-                            "media": "briandepalma_scarfacedepalma",\
-                            "begin": 1600000,\
-                            "end": 2100000,\
-                            "content": {\
-                                "data": "new scar annot"\
-                                "audio": {\
-                                    "mimetype": "audio/mp3",\
-                                    "src": "mic",\
-                                    "href": "rtmp://media.iri.centrepompidou.fr/ddc_micro_record/r_20120606190143793"\
-                                }\
-                            },\
-                            "tags": [ "json","dude" ]\
-                        }\
-                    ],\
-                    "meta": {\
-                        "creator": "John Doe",\
-                        "created": "2011-09-10T09:12:58"\
-                    }\
-                }';
-            var monjson2 = '{\
-                    "annotations": [\
-                        {\
-                            "type": "c_07BA1284-5F24-71A8-1EE2-423EED999B8A",\
-                            "type_title": "New cutting name if necessary",\
-                            "media": "briandepalma_scarfacedepalma",\
-                            "begin": 2400000,\
-                            "end": 3000000,\
-                            "content": {\
-                                "data": "ntm iam 2"\
-                            },\
-                            "tags": [ "jak" ]\
-                        }\
-                    ],\
-                    "meta": {\
-                        "creator": "John Doe",\
-                        "created": "2011-09-10T09:12:58"\
-                    }\
-                }';
-            
-            $.ajax({
-                url: url,
-                type: 'PUT',
-                contentType: 'application/json',
-                data: monjson,
-                // bug with jquery >= 1.5, "json" adds a callback so we don't specify dataType
-                //dataType: 'json',
-                success: function(json, textStatus, XMLHttpRequest) {
-                    alert("success = " + json);
-                },
-                error: function(jqXHR, textStatus, errorThrown) {
-                    alert("ERROR = " + jqXHR.responseText + ", " + errorThrown);
-                }
-            });
-        });
-        
-        If we send a PUT request with curl :    
-        $curl -X PUT http://localhost/api/ldt/projects/a0593b58-f258-11df-80e1-00145ea4a2be.json -d @example.JSON -H  "content-type:application/json"
-        A new cutting titled "New cutting name" will be created with the first annotation inside, and the annotation "Annotation about Salieri"
-        will be added to the Salieri cutting. The returned file is :
-        
-        {
-            "annotations": [
-                {
-                    "id": "6d8baf01-ffb1-11e0-810c-001485352c9a",
-                    "type": "id_annot_type",
-                    "type_title": "New cutting name",
-                    "media": "milosforman_amadeus",
-                    "begin": 50000,
-                    "end": 900000,
-                    "content": {
-                        "data": "new annotation"
-                    },
-                    "tags": [ "json" ]
-                },
-                {
-                    "id": "6d8baf00-ffb1-11e0-8097-001485352c9b",
-                    "type": "another_id_annot_type",
-                    "type_title": "Salieri",
-                    "media": "milosforman_amadeus",
-                    "begin": 700000,
-                    "end": 1200000,
-                    "content": {
-                        "data": "Annotation about Salieri"
-                    },
-                    "tags": [ "xml", "test", "blop" ]
-                }
-            ],
-            
-            "meta": {
-                "creator": "John Doe",
-                "created": "2011-09-10T09:12:58"
-            }
-        }
-        
-        """
-        #return rc.ALL_OK
-        try:
-            project = Project.objects.get(ldt_id=project_id)
-        except Project.DoesNotExist:
-            return rc.NOT_HERE
-    
-        adder = LdtAnnotation(project)
-        logging.debug("request json " + repr(request.data))
-        
-        unprotect_models() # Allows anonymous user to modify models in this request only 
-
-        meta = request.data['meta']
-        author = meta['creator']
-        date = meta['created']
-        new_annotations = request.data['annotations']
-
-        for a in new_annotations:
-            dur = str(a['end'] - a['begin'])
-            begin = str(a['begin'])
-            # We test if the annotation has audio node
-            audio_src = ""
-            audio_href = ""
-            if a['content'].has_key('audio') :
-                if a['content']['audio'].has_key('src') :
-                    audio_src = a['content']['audio']['src']
-                if a['content']['audio'].has_key('href') :
-                    audio_href = a['content']['audio']['href']
-            type_id, new_id = adder.add(a['media'], a['type'], a['type_title'], a['content']['data'], '', a['tags'], begin, dur, author, date, None, "2194379", audio_src, audio_href)
-            if not new_id:
-                protect_models()
-                return rc.BAD_REQUEST
-            
-                            
-            content = project.contents.get(iri_id=a['media'])
-            add_annotation_to_stat(content, a['begin'], a['end'])
-            
-            # We update the ids
-            a['type'] = type_id
-            a['id'] = new_id
-            if not a['content'].has_key('audio') :
-                a['content']['audio'] = {'src':audio_src, 'href':audio_href}
-        
-        # We save if there were added annotation
-        if len(new_annotations)>0 :
-            adder.save()
-        
-        protect_models()
-        
-        return request.data
-            
-
-        
-class ContentHandler(BaseHandler):
-    allowed_methods = ('GET', 'PUT')
-    model = Content
-    exclude = (
-               ("media_obj"),
-               )   
-
-    def read(self, request, iri_id):
-        """
-        returns a single content
-        """
-        return Content.objects.get(iri_id=iri_id)   
-
-    @require_extended
-    def update(self, request, iri_id):
-        """
-        Receives a json exactly like AnnotationHandler, but without any project indicated.
-        We get or set the current content front project, and add the annotation
-        """
-        try:
-            content = Content.objects.get(iri_id=iri_id)
-        except Content.DoesNotExist:
-            return rc.NOT_HERE
-        proj = content.get_or_create_front_project()
-        ah = AnnotationHandler()
-        updated_data = ah.update(request, proj.ldt_id)
-        
-        return updated_data
-    
-
-class SegmentHandler(BaseHandler):
-    allowed_methods = ('GET', )
-    model = Segment
-    exclude = (
-               ("project_obj"),
-               ("content"),
-               )
-    
-    def read(self, request, iri_id, begin, end):
-        """
-        returns segments about content iri_id between timecodes begin and end
-        """
-        begin = int(begin)
-        end = int(end)
-        
-        content = Content.objects.filter(iri_id=iri_id)
-        if not content:
-            return rc.NOT_FOUND
-        content = content[0]
-        
-        segments = Segment.objects.filter(content=content).filter(
-                    Q(start_ts__gte=begin, start_ts__lte=end) |                            # segment starts between begin and end
-                    Q(start_ts__gte=begin-F('duration'), start_ts__lte=end-F('duration')) |# segment ends between begin and end
-                    Q(start_ts__lte=begin, start_ts__gte=end-F('duration'))                # period [begin:end] is included in the segment
-                    )
-        
-        a = SegmentSerializer(content, segments)
-        return a.serialize_to_cinelab()
-    
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/src/ldt/ldt/api/ldt/resources/__init__.py	Fri Oct 19 16:10:22 2012 +0200
@@ -0,0 +1,6 @@
+from annotation import AnnotationResource
+from content import ContentResource
+from project import ProjectResource
+from segment import SegmentResource
+
+__all__ = ["AnnotationResource", "ContentResource", "ProjectResource", "SegmentResource"]
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/src/ldt/ldt/api/ldt/resources/annotation.py	Fri Oct 19 16:10:22 2012 +0200
@@ -0,0 +1,110 @@
+from ldt.ldt_utils.models import Project, Content
+from ldt.ldt_utils.stat import add_annotation_to_stat
+from ldt.ldt_utils.utils import LdtAnnotation
+from ldt.security import protect_models, unprotect_models
+from tastypie import fields
+from tastypie.authorization import Authorization
+from tastypie.exceptions import NotFound, BadRequest
+from tastypie.resources import Resource
+import logging #@UnresolvedImport
+
+
+class AnnotationObject(object):
+    # For the moment, these attributes are useless. We just need to define AnnotationObject
+    id = ""
+    project = ""
+    type = ""
+    type_title = ""
+    media = ""
+    begin = ""
+    end = "" 
+    content = {"title":"", "description":""}
+    tags = []
+    meta = {"creator":"","created":""}
+    
+class AnnotationResource(Resource):
+    # For the moment, these attributes are useless. We just prepare relations to AnnotationObject
+    id = fields.CharField(attribute = 'id')
+    project = fields.CharField(attribute = 'project')
+    type = fields.CharField(attribute = 'type')
+    type_title = fields.CharField(attribute = 'type_title')
+    media = fields.CharField(attribute = 'media')
+    begin = fields.IntegerField(attribute = 'begin')
+    end = fields.IntegerField(attribute = 'end')
+    content = fields.DictField(attribute = 'content')
+    tags = fields.ListField(attribute = 'tags')
+    meta = fields.DictField(attribute = 'meta')
+    
+    class Meta:
+        allowed_methods = ['put']
+        resource_name = 'annotations'
+        object_class = AnnotationObject
+        authorization = Authorization()
+        # always_return_data = True because we want the api returns the data with the updated ids
+        always_return_data = True
+    
+    def obj_delete_list(self, request=None, **kwargs):
+        return True
+    
+    def obj_create(self, bundle, request=None, **kwargs):
+        """
+        """
+        logging.debug("ICI 0-1 bundle.data = " + repr(bundle.data))
+        project_id = ""
+        if bundle.data.has_key('project') :
+            project_id = bundle.data["project"]
+        if project_id and project_id != "" :
+            try:
+                project = Project.objects.get(ldt_id=project_id)
+            except Project.DoesNotExist:
+                raise NotFound("Project not found. project_id = " + project_id)
+        else :
+            # If the project's is not defined, we get or create the content's front project.
+            iri_id = bundle.data["media"]
+            try:
+                content = Content.objects.get(iri_id=iri_id)
+            except Content.DoesNotExist:
+                raise NotFound("Content not found. iri_id = " + iri_id)
+            project = content.get_or_create_front_project()
+            bundle.data["project"] = project.ldt_id
+        
+        adder = LdtAnnotation(project)
+        unprotect_models() # Allows anonymous user to modify models in this request only
+        # Here the bundle.data has the datas for only one annotation. The others api's functions parse the "objects" from the request's json.
+        a = bundle.data
+        dur = str(a['end'] - a['begin'])
+        begin = str(a['begin'])
+        # We test if the annotation has audio node
+        audio_src = ""
+        audio_href = ""
+        if a['content'].has_key('audio') :
+            if a['content']['audio'].has_key('src') :
+                audio_src = a['content']['audio']['src']
+            if a['content']['audio'].has_key('href') :
+                audio_href = a['content']['audio']['href']
+        meta = a['meta']
+        author = meta['creator']
+        date = meta['created']
+        #                       add(media,      cutting_id, cutting_title,  title,               text,                         tags_list,  begin, dur, author, date
+        type_id, new_id = adder.add(a['media'], a['type'], a['type_title'], a['content']['title'], a['content']['description'], a['tags'], begin, dur, author, date, None, "2194379", audio_src, audio_href)
+        if not new_id:
+            protect_models()
+            raise BadRequest
+                        
+        content = project.contents.get(iri_id=a['media'])
+        add_annotation_to_stat(content, a['begin'], a['end'])
+        
+        # We update the ids
+        bundle.data['type'] = type_id
+        bundle.data['id'] = new_id
+        if not bundle.data['content'].has_key('audio') :
+            bundle.data['content']['audio'] = {'src':audio_src, 'href':audio_href}
+        # We reinject the datas in the bundle's response
+        bundle = self.full_hydrate(bundle)
+            
+        # We save the added annotation and reprotect the contents and projects
+        adder.save()
+        protect_models()
+        return bundle
+
+    
\ No newline at end of file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/src/ldt/ldt/api/ldt/resources/content.py	Fri Oct 19 16:10:22 2012 +0200
@@ -0,0 +1,18 @@
+from django.conf.urls.defaults import url
+from ldt.ldt_utils.models import Content
+from tastypie.resources import ModelResource
+
+        
+class ContentResource(ModelResource):
+    class Meta:
+        allowed_methods = ['get']
+        resource_name = 'contents'
+        queryset = Content.objects.all()
+        excludes = ['media_obj']
+
+    def override_urls(self):
+        # WARNING : in tastypie <= 1.0, override_urls is used instead of prepend_urls. From 1.0.0, prepend_urls will be prefered and override_urls deprecated 
+        return [
+            url(r"^(?P<resource_name>%s)/(?P<iri_id>[\w\d_.-]+)/$" % self._meta.resource_name, self.wrap_view('dispatch_detail'), name="api_dispatch_detail"),
+        ]
+            
\ No newline at end of file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/src/ldt/ldt/api/ldt/resources/project.py	Fri Oct 19 16:10:22 2012 +0200
@@ -0,0 +1,23 @@
+from django.conf.urls.defaults import url
+from ldt.ldt_utils.models import Project
+from tastypie.authorization import Authorization
+from tastypie.resources import ModelResource
+
+
+class ProjectResource(ModelResource):
+    class Meta:
+        allowed_methods = ['get', 'put']
+        authorization= Authorization() # BE CAREFUL WITH THAT, it's unsecure
+        resource_name = 'projects'
+        queryset = Project.objects.all()
+    
+#    # WARNING : this project API will only accepts and returns json format, no matter format get parameter.
+#    def determine_format(self, request):
+#        return "application/json"
+    
+    def override_urls(self):
+        # WARNING : in tastypie <= 1.0, override_urls is used instead of prepend_urls. From 1.0.0, prepend_urls will be prefered and override_urls deprecated 
+        return [
+            url(r"^(?P<resource_name>%s)/(?P<ldt_id>[\w\d_.-]+)/$" % self._meta.resource_name, self.wrap_view('dispatch_detail'), name="api_dispatch_detail"),
+        ]
+    
\ No newline at end of file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/src/ldt/ldt/api/ldt/resources/segment.py	Fri Oct 19 16:10:22 2012 +0200
@@ -0,0 +1,99 @@
+from django.conf import settings
+from django.conf.urls.defaults import url
+from django.core.paginator import Paginator, InvalidPage
+from django.db.models import F, Q
+from ldt.indexation import get_results_with_context
+from ldt.ldt_utils.models import Content, Segment
+from ldt.ldt_utils.segmentserializer import SegmentSerializer
+from tastypie.http import HttpNotFound
+from tastypie.resources import ModelResource
+from tastypie.utils import trailing_slash
+
+
+class SegmentResource(ModelResource):
+    class Meta:
+        allowed_methods = ['get']
+        resource_name = 'segments'
+        excludes = ['project_obj', 'content']
+        queryset = Segment.objects.all()
+        filtering = {
+            'iri_id': ['exact'],
+            'start_ts': ['lte', 'gte'],
+        }
+    
+#    # WARNING : this segment API will only return json format, no matter format get parameter.
+#    def determine_format(self, request):
+#        return "application/json"
+    
+    def override_urls(self):
+        # WARNING : in tastypie <= 0.9.11, override_urls is used instead of prepend_urls. From 0.9.12, prepend_urls will be prefered and override_urls deprecated
+        return [
+            url(r"^(?P<resource_name>%s)/search%s$" % (self._meta.resource_name, trailing_slash()), self.wrap_view('get_search'), name="api_get_search"),
+            url(r"^(?P<resource_name>%s)/bytimecode%s$" % (self._meta.resource_name, trailing_slash()), self.wrap_view('get_segments_by_timecode'), name='segment_api_empty'),
+            url(r"^(?P<resource_name>%s)/bytimecode/(?P<iri_id>.*)/(?P<begin>.*)/(?P<end>.*)$" % self._meta.resource_name, self.wrap_view('get_segments_by_timecode'), name='segment_api'),
+        ]
+
+    def get_search(self, request, **kwargs):
+        self.method_check(request, allowed=['get'])
+        # Do the query.
+        search = request.GET.get('q', '')
+        field = "all"
+        content_list = None
+        if u'author:' in search.lower() :
+            sub = search[7:]
+            sub = sub.upper()
+            if sub[0] != u'"':
+                sub = u'"' + sub
+            if sub[-1] != u'"':
+                sub = sub + u'"'
+            search = u'author:' + sub
+        results = get_results_with_context(field, search, content_list)
+        all_segments = Segment.objects.filter(element_id__in=[e['element_id'] for e in results])
+        paginator = Paginator(all_segments, getattr(settings, 'API_LIMIT_PER_PAGE', 20))
+
+        try:
+            page = paginator.page(int(request.GET.get('page', 1)))
+        except InvalidPage:
+            raise HttpNotFound("Sorry, no results on that page.")
+
+        objects = []
+
+        for segment in page.object_list:
+            bundle = self.build_bundle(obj=segment, request=request)
+            bundle = self.full_dehydrate(bundle)
+            objects.append(bundle)
+
+        object_list = {
+            'objects': objects,
+        }
+
+        self.log_throttled_access(request)
+        return self.create_response(request, object_list)
+    
+    
+    
+    def get_segments_by_timecode(self, request, api_name, resource_name, iri_id=None, begin=None, end=None):
+        """
+        returns segments about content iri_id between timecodes begin and end
+        """
+        if not begin:
+            return HttpNotFound("begin timecode argument is missing.")
+        if not end:
+            return HttpNotFound("end timecode argument is missing.")
+        begin = int(begin)
+        end = int(end)
+        
+        content = Content.objects.filter(iri_id=iri_id)
+        if not content:
+            return HttpNotFound("Content does not exist or id is not correct.")
+        content = content[0]
+        
+        segments = Segment.objects.filter(content=content).filter(
+                    Q(start_ts__gte=begin, start_ts__lte=end) |                            # segment starts between begin and end
+                    Q(start_ts__gte=begin-F('duration'), start_ts__lte=end-F('duration')) |# segment ends between begin and end
+                    Q(start_ts__lte=begin, start_ts__gte=end-F('duration'))                # period [begin:end] is included in the segment
+                    )
+        
+        a = SegmentSerializer(content, segments)
+        return self.create_response(request, a.serialize_to_cinelab())
+    
\ No newline at end of file
--- a/src/ldt/ldt/api/ldt/urls.py	Fri Oct 19 16:08:42 2012 +0200
+++ b/src/ldt/ldt/api/ldt/urls.py	Fri Oct 19 16:10:22 2012 +0200
@@ -1,20 +1,13 @@
-from django.conf.urls.defaults import patterns, url
-from django.views.defaults import page_not_found
-from piston.resource import Resource
-from ldt.api.ldt.handlers import ProjectHandler, AnnotationHandler, ContentHandler, SegmentHandler
+from django.conf.urls.defaults import patterns, include
+from ldt.api.ldt.resources import ProjectResource, ContentResource, SegmentResource, AnnotationResource
+from tastypie.api import Api
 
-project_handler    = Resource(ProjectHandler, None)
-annotation_handler = Resource(AnnotationHandler, None)
-content_handler    = Resource(ContentHandler, None)
-segment_handler    = Resource(SegmentHandler, None)
+v1_api = Api(api_name='1.0')
+v1_api.register(ProjectResource())
+v1_api.register(ContentResource())
+v1_api.register(SegmentResource())
+v1_api.register(AnnotationResource())
 
 urlpatterns = patterns('',
-    url(r'projects/(?P<project_id>[^/.]+)\.?(?P<emitter_format>.*)$', project_handler, name='project_api'),
-    url(r'annotations/$', page_not_found, name='annotation_api_empty'),
-    url(r'annotations/(?P<project_id>[^/.]+)\.?(?P<emitter_format>.*)$', annotation_handler, name='annotation_api'),
-    url(r'contents/(?P<iri_id>[^/.]+)\.?(?P<emitter_format>.*)$', content_handler, name='content_api'),
-    url(r'segments/$', page_not_found, name='segment_api_empty'),
-    url(r'segments/(?P<iri_id>.*)/(?P<begin>.*)/(?P<end>.*)$', segment_handler, name='segment_api'),
+    (r'', include(v1_api.urls)),
 )
-
-
--- a/src/ldt/ldt/ldt_utils/contentindexer.py	Fri Oct 19 16:08:42 2012 +0200
+++ b/src/ldt/ldt/ldt_utils/contentindexer.py	Fri Oct 19 16:10:22 2012 +0200
@@ -1,13 +1,14 @@
-from ldt import settings
 from django.db.models.signals import post_save
 from django.dispatch import receiver
+from ldt import settings
 from ldt.ldt_utils.models import Segment, Content, Project
+from ldt.ldt_utils.stat import update_stat_project
 from ldt.ldt_utils.utils import reduce_text_node
-from ldt.ldt_utils.stat import update_stat_project
-import lxml.etree
+from tagging import settings as tagging_settings
+import logging
+import lxml.etree #@UnresolvedImport
 import tagging.utils
 import urllib #@UnresolvedImport
-import logging
 
 logger = logging.getLogger(__name__)
 
@@ -70,7 +71,7 @@
                 if tags is None:
                     tags = u""
                     
-                tags_list = [tag[:settings.MAX_TAG_LENGTH] for tag in tagging.utils.parse_tag_input(tags)]
+                tags_list = [tag[:tagging_settings.MAX_TAG_LENGTH] for tag in tagging.utils.parse_tag_input(tags)]
                 tags = u",".join(tags_list)
                 
 
--- a/src/ldt/ldt/ldt_utils/models.py	Fri Oct 19 16:08:42 2012 +0200
+++ b/src/ldt/ldt/ldt_utils/models.py	Fri Oct 19 16:10:22 2012 +0200
@@ -1,7 +1,6 @@
 from django.conf import settings
 from django.contrib.auth.models import User, Group
 from django.db import models
-from django.db import transaction
 from django.utils.translation import ugettext_lazy as _
 from guardian.shortcuts import assign, remove_perm, get_perms
 from ldt.core.models import Document
@@ -20,10 +19,8 @@
 import os.path
 import re
 import tagging.fields
-import tagging.utils
 import uuid
-import logging
-from shutil import rmtree, move
+from shutil import move
 from django.core.files.storage import default_storage
 #from ldt.core.models import Document, Owner
 
--- a/src/ldt/ldt/ldt_utils/segmentserializer.py	Fri Oct 19 16:08:42 2012 +0200
+++ b/src/ldt/ldt/ldt_utils/segmentserializer.py	Fri Oct 19 16:10:22 2012 +0200
@@ -2,6 +2,7 @@
 from ldt.ldt_utils.models import Project
 from ldt.ldt_utils.stat import get_string_from_buckets
 from ldt.security.utils import use_forbidden_url
+from tagging.utils import parse_tag_input
 import lxml.etree
 import uuid
 
@@ -138,7 +139,7 @@
         for seg in self.segments:
             
             segment_tags = []
-            for tag in seg.tags.split(';'):
+            for tag in parse_tag_input(seg.tags):
                 if not self.tags.has_key(tag):
                     new_tag = {
                         "meta": {
--- a/src/ldt/ldt/ldt_utils/templates/ldt/ldt_utils/partial/embed_player.html	Fri Oct 19 16:08:42 2012 +0200
+++ b/src/ldt/ldt/ldt_utils/templates/ldt/ldt_utils/partial/embed_player.html	Fri Oct 19 16:10:22 2012 +0200
@@ -69,7 +69,7 @@
         },{
             type: "AnnotationsList",
             container: "AnnotationsList_ext",
-            ajax_url: "{{WEB_URL}}{% url segment_api_empty %}{% templatetag openvariable %}media{% templatetag closevariable %}/{% templatetag openvariable %}begin{% templatetag closevariable %}/{% templatetag openvariable %}end{% templatetag closevariable %}",
+            ajax_url: "{{WEB_URL}}{% url segment_api_empty resource_name='segments' api_name='1.0' %}{% templatetag openvariable %}media{% templatetag closevariable %}/{% templatetag openvariable %}begin{% templatetag closevariable %}/{% templatetag openvariable %}end{% templatetag closevariable %}",
             ajax_granularity : 300000,
             default_thumbnail : "{{WEB_URL}}{{LDT_MEDIA_PREFIX}}css/imgs/video_sequence.png",
             show_audio: true,
@@ -89,7 +89,7 @@
             hide_timeout: 5000
         },{% if annotation_block %}{
             type: "CreateAnnotation",
-            api_endpoint_template: "{{WEB_URL}}{% url annotation_api_empty %}{% templatetag openvariable %}id{% templatetag closevariable %}.json",
+            api_endpoint_template: "{{WEB_URL}}{% url api_dispatch_list resource_name='annotations' api_name='1.0' %}",
             api_method: "PUT",
             after_send_timeout: 8000,
             show_mic_record: {% if show_mic_record %}true{% else %}false{% endif %},
--- a/src/ldt/ldt/ldt_utils/views/workspace.py	Fri Oct 19 16:08:42 2012 +0200
+++ b/src/ldt/ldt/ldt_utils/views/workspace.py	Fri Oct 19 16:10:22 2012 +0200
@@ -3,7 +3,7 @@
 from django.contrib.auth.models import Group
 from django.core.urlresolvers import reverse#, resolve
 from django.core.paginator import Paginator, InvalidPage, EmptyPage
-from django.http import (HttpResponseRedirect, HttpResponseForbidden )
+from django.http import HttpResponseForbidden
 from ldt.indexation import get_results_with_context, highlight_documents
 from django.shortcuts import render_to_response
 from django.template import RequestContext
@@ -17,15 +17,12 @@
 from ldt.ldt_utils.views.content import get_contents_page, get_content_tags
 from ldt.ldt_utils.views.project import get_projects_page, get_published_projects_page
 from ldt.security.utils import add_change_attr, get_userlist
-from lxml.html import fragment_fromstring
 from operator import itemgetter
 from itertools import groupby
 import base64
 import django.core.urlresolvers
 import ldt.auth as ldt_auth
-import lxml.etree
-import logging
-from django.utils.safestring import SafeUnicode, mark_safe
+from django.utils.safestring import mark_safe
 
 
 
Binary file src/ldt/ldt/locale/fr/LC_MESSAGES/django.mo has changed
--- a/src/ldt/ldt/locale/fr/LC_MESSAGES/django.po	Fri Oct 19 16:08:42 2012 +0200
+++ b/src/ldt/ldt/locale/fr/LC_MESSAGES/django.po	Fri Oct 19 16:10:22 2012 +0200
@@ -7,418 +7,419 @@
 msgstr ""
 "Project-Id-Version: PACKAGE VERSION\n"
 "Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2012-10-15 23:51+0200\n"
+"POT-Creation-Date: 2012-10-17 18:07+0200\n"
 "PO-Revision-Date: 2010-03-09 15:52+0100\n"
 "Last-Translator: Yves-Marie Haussonne <ymh.work@gmail.com>\n"
 "Language-Team: LANGUAGE <LL@li.org>\n"
-"Language: \n"
 "MIME-Version: 1.0\n"
 "Content-Type: text/plain; charset=UTF-8\n"
 "Content-Transfer-Encoding: 8bit\n"
+"Language: \n"
 
-#: forms/fields.py:17
+#: .\forms\fields.py:17
 msgid "Enter a valid duration format"
 msgstr "Entrez un format de durée valide"
 
-#: forms/widgets.py:21
+#: .\forms\widgets.py:21
 msgid "Date"
 msgstr "Date"
 
-#: forms/widgets.py:21
+#: .\forms\widgets.py:21
 msgid "Time"
 msgstr "Heure"
 
-#: ldt_utils/forms.py:32 ldt_utils/templates/front/front_base.html:52
-#: ldt_utils/templates/ldt/ldt_utils/published_projects.html:53
+#: .\ldt_utils\forms.py:32 .\ldt_utils\templates\front\front_base.html.py:52
+#: .\ldt_utils\templates\ldt\ldt_utils\published_projects.html.py:53
 msgid "Search"
 msgstr "Recherche"
 
-#: ldt_utils/forms.py:33
+#: .\ldt_utils\forms.py:33
 msgid "all"
 msgstr "tous"
 
-#: ldt_utils/forms.py:33 ldt_utils/models.py:58
-#: ldt_utils/templates/ldt/ldt_utils/content_list.html:69
+#: .\ldt_utils\forms.py:33 .\ldt_utils\models.py:58
+#: .\ldt_utils\templates\ldt\ldt_utils\content_list.html.py:69
 msgid "title"
 msgstr "titre"
 
-#: ldt_utils/forms.py:33
+#: .\ldt_utils\forms.py:33
 msgid "resume"
 msgstr "description"
 
-#: ldt_utils/forms.py:33
+#: .\ldt_utils\forms.py:33
 msgid "tags"
 msgstr "tags"
 
-#: ldt_utils/forms.py:33
+#: .\ldt_utils\forms.py:33
 msgid "Fields"
 msgstr "Champs"
 
-#: ldt_utils/forms.py:34
+#: .\ldt_utils\forms.py:34
 msgid "Display the results in Lignes De Temps"
 msgstr "Afficher les résultats dans Lignes De Temps"
 
-#: ldt_utils/forms.py:36
+#: .\ldt_utils\forms.py:36
 msgid "Content Tag"
 msgstr "Catégorie de contenu"
 
-#: ldt_utils/forms.py:52 ldt_utils/models.py:160
+#: .\ldt_utils\forms.py:52 .\ldt_utils\models.py:160
 msgid "content.content_creation_date"
 msgstr "Date de création du contenu"
 
-#: ldt_utils/forms.py:53
+#: .\ldt_utils\forms.py:53
 msgid "content.media_input_type"
 msgstr "Source du média"
 
-#: ldt_utils/forms.py:53
+#: .\ldt_utils\forms.py:53
 msgid "file_upload"
 msgstr "upload fichier"
 
-#: ldt_utils/forms.py:53
+#: .\ldt_utils\forms.py:53
 msgid "url"
 msgstr "url"
 
-#: ldt_utils/forms.py:53
+#: .\ldt_utils\forms.py:53
 msgid "existing_media"
 msgstr "média existant"
 
-#: ldt_utils/forms.py:53
+#: .\ldt_utils\forms.py:53
 msgid "create_media"
 msgstr "source externe : fichier streamé, statique, url youtube..."
 
-#: ldt_utils/forms.py:53
+#: .\ldt_utils\forms.py:53
 msgid "none_media"
 msgstr "Aucun"
 
-#: ldt_utils/forms.py:56
+#: .\ldt_utils\forms.py:56
 msgid "content.front_project"
 msgstr "Choisir le front project"
 
-#: ldt_utils/forms.py:57 ldt_utils/models.py:159
+#: .\ldt_utils\forms.py:57 .\ldt_utils\models.py:159
 msgid "content.duration"
 msgstr "Durée"
 
-#: ldt_utils/models.py:47
+#: .\ldt_utils\models.py:47
 msgid "media.external_id"
 msgstr "id externe"
 
-#: ldt_utils/models.py:48
+#: .\ldt_utils\models.py:48
 msgid "media.external_permalink"
 msgstr "permalien externe"
 
-#: ldt_utils/models.py:49
+#: .\ldt_utils\models.py:49
 msgid "media.external_publication_url"
 msgstr "url de publication externe"
 
-#: ldt_utils/models.py:50
+#: .\ldt_utils\models.py:50
 msgid "media.external_src_url"
 msgstr "url source"
 
-#: ldt_utils/models.py:51
+#: .\ldt_utils\models.py:51
 msgid "media.creation_date"
 msgstr "Date de création"
 
-#: ldt_utils/models.py:52
+#: .\ldt_utils\models.py:52
 msgid "media.media_creation_date"
 msgstr "Date de création du média"
 
-#: ldt_utils/models.py:53
+#: .\ldt_utils\models.py:53
 msgid "media.update_date"
 msgstr "Date de maj"
 
-#: ldt_utils/models.py:54
+#: .\ldt_utils\models.py:54
 msgid "media.videopath"
 msgstr "videopath"
 
-#: ldt_utils/models.py:55
+#: .\ldt_utils\models.py:55
 msgid "media.duration"
 msgstr "Durée du contenu (ms)"
 
-#: ldt_utils/models.py:56
+#: .\ldt_utils\models.py:56
 msgid "media.creator"
 msgstr "Créateur"
 
-#: ldt_utils/models.py:57
+#: .\ldt_utils\models.py:57
 msgid "description"
 msgstr "description"
 
-#: ldt_utils/models.py:59
+#: .\ldt_utils\models.py:59
 msgid "media.src"
 msgstr "Sources"
 
-#: ldt_utils/models.py:61
+#: .\ldt_utils\models.py:61
 msgid "media.src_hash"
 msgstr "Hash de la source"
 
-#: ldt_utils/models.py:62
+#: .\ldt_utils\models.py:62
 msgid "media.mimetype"
 msgstr "mimetype"
 
-#: ldt_utils/models.py:152
+#: .\ldt_utils\models.py:152
 msgid "content.iri_id"
 msgstr "iri id"
 
-#: ldt_utils/models.py:153
+#: .\ldt_utils\models.py:153
 msgid "content.iriurl"
 msgstr "iri url"
 
-#: ldt_utils/models.py:154
+#: .\ldt_utils\models.py:154
 msgid "content.creation_date"
 msgstr "date de création"
 
-#: ldt_utils/models.py:155
+#: .\ldt_utils\models.py:155
 msgid "content.update_date"
 msgstr "Date de maj"
 
-#: ldt_utils/models.py:156
+#: .\ldt_utils\models.py:156
 msgid "content.title"
 msgstr "titre"
 
-#: ldt_utils/models.py:157
+#: .\ldt_utils\models.py:157
 msgid "content.description"
 msgstr "Description"
 
-#: ldt_utils/models.py:158
+#: .\ldt_utils\models.py:158
 msgid "content.authors"
 msgstr "Auteurs"
 
-#: ldt_utils/models.py:526
+#: .\ldt_utils\models.py:526
 msgid "content_stat.content"
 msgstr "statistiques d'annotation"
 
-#: ldt_utils/models.py:527
+#: .\ldt_utils\models.py:527
 msgid "content_stat.annotations_volume"
 msgstr "Volume d'annotations"
 
-#: ldt_utils/models.py:528
+#: .\ldt_utils\models.py:528
 msgid "content_stat.polemics_volume"
 msgstr "Volume d'annotations"
 
-#: ldt_utils/models.py:529
+#: .\ldt_utils\models.py:529
 msgid "content.nb_annotation"
 msgstr "nombre d'annotations"
 
-#: ldt_utils/models.py:530
+#: .\ldt_utils\models.py:530
 msgid "content.last_annotated"
 msgstr "annoté pour la dernière foiss"
 
-#: ldt_utils/models.py:585
+#: .\ldt_utils\models.py:585
 msgid "created by"
 msgstr "créé par"
 
-#: ldt_utils/models.py:586
+#: .\ldt_utils\models.py:586
 msgid "changed by"
 msgstr "modifié par"
 
-#: ldt_utils/utils.py:203 ldt_utils/utils.py:386
+#: .\ldt_utils\utils.py:203 .\ldt_utils\utils.py:386
 msgid "Personal cutting"
 msgstr "Découpages personnels"
 
-#: ldt_utils/templates/admin/ldt_utils/app_action.html:4
-#: templates/admin/cms_change_list.html:7
-#: templates/admin/page_app_index.html:8
-#: templates/admin/page_change_form.html:17
-#: templates/admin/page_change_list.html:25
-#: user/templates/registration/logged_out.html:4
+#: .\ldt_utils\templates\admin\ldt_utils\app_action.html.py:4
+#: .\templates\admin\cms_change_list.html.py:7
+#: .\templates\admin\page_app_index.html.py:8
+#: .\templates\admin\page_change_form.html.py:17
+#: .\templates\admin\page_change_list.html.py:25
+#: .\user\templates\registration\logged_out.html.py:4
 msgid "Home"
 msgstr "Accueil"
 
-#: ldt_utils/templates/front/front_all_contents.html:8
+#: .\ldt_utils\templates\front\front_all_contents.html.py:8
 #, python-format
 msgid "Lignes de temps : %(tag_label)s"
 msgstr "Lignes de temps : %(tag_label)s"
 
-#: ldt_utils/templates/front/front_all_contents.html:10
+#: .\ldt_utils\templates\front\front_all_contents.html.py:10
 msgid "Lignes de temps : all medias"
 msgstr "Lignes de temps : tous les médias"
 
-#: ldt_utils/templates/front/front_all_contents.html:44
-#: ldt_utils/templates/front/front_home.html:39
+#: .\ldt_utils\templates\front\front_all_contents.html.py:44
+#: .\ldt_utils\templates\front\front_home.html.py:39
 msgid "Filter the medias by category"
 msgstr "Filtrer les médias par catégorie"
 
-#: ldt_utils/templates/front/front_all_contents.html:49
-#: ldt_utils/templates/front/front_all_contents.html:50
-#: ldt_utils/templates/front/front_all_contents.html:51
-#: ldt_utils/templates/front/front_home.html:45
+#: .\ldt_utils\templates\front\front_all_contents.html.py:49
+#: .\ldt_utils\templates\front\front_all_contents.html.py:50
+#: .\ldt_utils\templates\front\front_all_contents.html.py:51
+#: .\ldt_utils\templates\front\front_home.html.py:45
 msgid "All medias"
 msgstr "Tous les médias"
 
-#: ldt_utils/templates/front/front_all_contents.html:54
-#: ldt_utils/templates/front/front_home.html:45
+#: .\ldt_utils\templates\front\front_all_contents.html.py:54
+#: .\ldt_utils\templates\front\front_home.html.py:45
 msgid "Filter the medias"
 msgstr "Filtrer les médias"
 
-#: ldt_utils/templates/front/front_all_contents.html:60
-#: ldt_utils/templates/front/front_home.html:51
+#: .\ldt_utils\templates\front\front_all_contents.html.py:60
+#: .\ldt_utils\templates\front\front_home.html.py:51
 msgid "Search in the medias title"
 msgstr "Chercher dans le titre des médias"
 
-#: ldt_utils/templates/front/front_all_contents.html:63
-#: ldt_utils/templates/front/front_all_contents.html:119
-#: ldt_utils/templates/front/front_home.html:54
+#: .\ldt_utils\templates\front\front_all_contents.html.py:63
+#: .\ldt_utils\templates\front\front_all_contents.html.py:119
+#: .\ldt_utils\templates\front\front_home.html.py:54
 msgid "All categories of medias"
 msgstr "Toutes les catégories de médias"
 
-#: ldt_utils/templates/front/front_all_contents.html:71
-#: ldt_utils/templates/front/front_search_results.html:136
-#: ldt_utils/templates/ldt/ldt_utils/search_results.html:101
+#: .\ldt_utils\templates\front\front_all_contents.html.py:71
+#: .\ldt_utils\templates\front\front_search_results.html.py:136
+#: .\ldt_utils\templates\ldt\ldt_utils\search_results.html.py:101
 msgid "previous"
 msgstr "Précedent"
 
-#: ldt_utils/templates/front/front_all_contents.html:89
-#: ldt_utils/templates/front/front_search_results.html:156
-#: ldt_utils/templates/ldt/ldt_utils/search_results.html:111
+#: .\ldt_utils\templates\front\front_all_contents.html.py:89
+#: .\ldt_utils\templates\front\front_search_results.html.py:156
+#: .\ldt_utils\templates\ldt\ldt_utils\search_results.html.py:111
 msgid "next"
 msgstr "Suivant"
 
-#: ldt_utils/templates/front/front_all_contents.html:92
+#: .\ldt_utils\templates\front\front_all_contents.html.py:92
 msgid "All"
 msgstr "Tous"
 
-#: ldt_utils/templates/front/front_all_contents.html:101
-#: ldt_utils/templates/front/front_all_contents.html:114
-#: ldt_utils/templates/front/front_group.html:26
-#: ldt_utils/templates/front/front_group.html:28
-#: ldt_utils/templates/front/front_home.html:62
-#: ldt_utils/templates/front/front_home.html:73
-#: ldt_utils/templates/front/front_home.html:90
-#: ldt_utils/templates/front/front_home.html:99
+#: .\ldt_utils\templates\front\front_all_contents.html.py:101
+#: .\ldt_utils\templates\front\front_all_contents.html.py:114
+#: .\ldt_utils\templates\front\front_group.html.py:26
+#: .\ldt_utils\templates\front\front_group.html.py:28
+#: .\ldt_utils\templates\front\front_home.html.py:62
+#: .\ldt_utils\templates\front\front_home.html.py:73
+#: .\ldt_utils\templates\front\front_home.html.py:90
+#: .\ldt_utils\templates\front\front_home.html.py:99
 msgid "open this media"
 msgstr "voir ce média"
 
-#: ldt_utils/templates/front/front_all_contents.html:113
-#: ldt_utils/templates/front/front_group.html:27
-#: ldt_utils/templates/front/front_home.html:72
-#: ldt_utils/templates/front/front_home.html:98
+#: .\ldt_utils\templates\front\front_all_contents.html.py:113
+#: .\ldt_utils\templates\front\front_group.html.py:27
+#: .\ldt_utils\templates\front\front_home.html.py:72
+#: .\ldt_utils\templates\front\front_home.html.py:98
 #, python-format
 msgid "%(nb)s annotation on this media"
 msgid_plural "%(nb)s annotations on this media"
 msgstr[0] "%(nb)s annotation sur ce média"
 msgstr[1] "%(nb)s annotations sur ce média"
 
-#: ldt_utils/templates/front/front_all_contents.html:115
-#: ldt_utils/templates/front/front_group.html:29
-#: ldt_utils/templates/front/front_home.html:74
-#: ldt_utils/templates/front/front_home.html:100
+#: .\ldt_utils\templates\front\front_all_contents.html.py:115
+#: .\ldt_utils\templates\front\front_group.html.py:29
+#: .\ldt_utils\templates\front\front_home.html.py:74
+#: .\ldt_utils\templates\front\front_home.html.py:100
 msgid "by"
 msgstr "par"
 
-#: ldt_utils/templates/front/front_base.html:44
+#: .\ldt_utils\templates\front\front_base.html.py:44
 msgid "homepage"
 msgstr "Accueil"
 
-#: ldt_utils/templates/front/front_base.html:44
+#: .\ldt_utils\templates\front\front_base.html.py:44
 msgid "<b>Lignes</b> de temps"
 msgstr "<b>Lignes</b> de temps"
 
-#: ldt_utils/templates/front/front_base.html:59
-#: ldt_utils/templates/ldt/ldt_utils/workspace_base.html:68
+#: .\ldt_utils\templates\front\front_base.html.py:59
+#: .\ldt_utils\templates\ldt\ldt_utils\workspace_base.html.py:68
 msgid "My projects"
 msgstr "Mes projets"
 
-#: ldt_utils/templates/front/front_base.html:62
-#: ldt_utils/templates/front/front_player.html:5
+#: .\ldt_utils\templates\front\front_base.html.py:62
+#: .\ldt_utils\templates\front\front_player.html.py:5
 msgid "Annotate"
 msgstr "Annoter"
 
-#: ldt_utils/templates/front/front_base.html:69
-#: templates/cms/admin/cms/page/change_form.html:11
-#: templates/ldt/ldt_base.html:97 user/templates/ldt/user/login_form.html:34
+#: .\ldt_utils\templates\front\front_base.html.py:69
+#: .\templates\cms\admin\cms\page\change_form.html.py:11
+#: .\templates\ldt\ldt_base.html.py:97
+#: .\user\templates\ldt\user\login_form.html.py:34
 msgid "Log out"
 msgstr "Déconnexion"
 
-#: ldt_utils/templates/front/front_base.html:71
-#: templates/admin/page_login.html:32
-#: user/templates/ldt/user/login_form.html:37
-#: user/templates/ldt/user/login_form.html:45
-#: user/templates/registration/login.html:21
-#: user/templates/registration/password_reset_complete.html:14
+#: .\ldt_utils\templates\front\front_base.html.py:71
+#: .\templates\admin\page_login.html.py:32
+#: .\user\templates\ldt\user\login_form.html.py:37
+#: .\user\templates\ldt\user\login_form.html.py:45
+#: .\user\templates\registration\login.html.py:21
+#: .\user\templates\registration\password_reset_complete.html.py:14
 msgid "Log in"
 msgstr "Connexion"
 
-#: ldt_utils/templates/front/front_base.html:80
+#: .\ldt_utils\templates\front\front_base.html.py:80
 #, python-format
 msgid "%(WEB_VERSION)s | %(VERSION)s"
 msgstr "v%(WEB_VERSION)s | v%(VERSION)s "
 
-#: ldt_utils/templates/front/front_base.html:83
+#: .\ldt_utils\templates\front\front_base.html.py:83
 msgid "link IRI"
 msgstr "Site de l'IRI"
 
-#: ldt_utils/templates/front/front_base.html:83
+#: .\ldt_utils\templates\front\front_base.html.py:83
 msgid "about"
 msgstr "A propos"
 
-#: ldt_utils/templates/front/front_group.html:22
+#: .\ldt_utils\templates\front\front_group.html.py:22
 msgid "Medias annotated by the group"
 msgstr "Médias annotés par le groupe"
 
-#: ldt_utils/templates/front/front_group.html:38
+#: .\ldt_utils\templates\front\front_group.html.py:38
 msgid "About the group"
 msgstr "A propos du groupe"
 
-#: ldt_utils/templates/front/front_group.html:47
+#: .\ldt_utils\templates\front\front_group.html.py:47
 msgid "Members"
 msgstr "liste des membres"
 
-#: ldt_utils/templates/front/front_group.html:54
+#: .\ldt_utils\templates\front\front_group.html.py:54
 msgid "active since"
 msgstr "actif depuis"
 
-#: ldt_utils/templates/front/front_home.html:7
+#: .\ldt_utils\templates\front\front_home.html.py:7
 msgid "front.home"
 msgstr "Plateforme ligne de temps"
 
-#: ldt_utils/templates/front/front_home.html:43
+#: .\ldt_utils\templates\front\front_home.html.py:43
 msgid "Last annotated medias"
 msgstr "Derniers médias annotés"
 
-#: ldt_utils/templates/front/front_home.html:45
+#: .\ldt_utils\templates\front\front_home.html.py:45
 msgid "view all medias"
 msgstr "Voir tous les médias"
 
-#: ldt_utils/templates/front/front_home.html:83
+#: .\ldt_utils\templates\front\front_home.html.py:83
 msgid "Most annotated medias"
 msgstr "Médias les plus annotés"
 
-#: ldt_utils/templates/front/front_home.html:107
+#: .\ldt_utils\templates\front\front_home.html.py:107
 msgid "Active groups"
 msgstr "Groupes actifs"
 
-#: ldt_utils/templates/front/front_home.html:112
+#: .\ldt_utils\templates\front\front_home.html.py:112
 msgid "group picture"
 msgstr "image du groupe"
 
-#: ldt_utils/templates/front/front_home.html:112
-#: ldt_utils/templates/front/front_home.html:116
+#: .\ldt_utils\templates\front\front_home.html.py:112
+#: .\ldt_utils\templates\front\front_home.html.py:116
 msgid "view more infos on this group"
 msgstr "Voir plus d'informations sur ce groupe"
 
-#: ldt_utils/templates/front/front_home.html:115
+#: .\ldt_utils\templates\front\front_home.html.py:115
 #, python-format
 msgid "%(nb)s user in this group"
 msgid_plural "%(nb)s users in this group"
 msgstr[0] "%(nb)s utilisateur dans ce groupe"
 msgstr[1] "%(nb)s utilisateurs dans ce groupe"
 
-#: ldt_utils/templates/front/front_player.html:48
+#: .\ldt_utils\templates\front\front_player.html.py:48
 msgid "All annotations on the media"
 msgstr "Toutes les annotations sur le média"
 
-#: ldt_utils/templates/front/front_search_results.html:6
-#: ldt_utils/templates/ldt/ldt_utils/groups.html:101
-#: ldt_utils/templates/ldt/ldt_utils/groups.html:113
-#: ldt_utils/templates/ldt/ldt_utils/ldt_list.html:80
-#: ldt_utils/templates/ldt/ldt_utils/published_projects.html:70
-#: ldt_utils/templates/ldt/ldt_utils/workspace_base.html:56
-#: ldt_utils/templates/ldt/ldt_utils/workspace_base.html:71
-#: ldt_utils/templates/ldt/ldt_utils/partial/permissions.html:129
-#: templates/ldt/ldt_base.html:127
+#: .\ldt_utils\templates\front\front_search_results.html.py:6
+#: .\ldt_utils\templates\ldt\ldt_utils\groups.html.py:101
+#: .\ldt_utils\templates\ldt\ldt_utils\groups.html.py:113
+#: .\ldt_utils\templates\ldt\ldt_utils\ldt_list.html.py:80
+#: .\ldt_utils\templates\ldt\ldt_utils\published_projects.html.py:70
+#: .\ldt_utils\templates\ldt\ldt_utils\workspace_base.html.py:56
+#: .\ldt_utils\templates\ldt\ldt_utils\workspace_base.html.py:71
+#: .\ldt_utils\templates\ldt\ldt_utils\partial\permissions.html.py:129
+#: .\templates\ldt\ldt_base.html.py:127
 msgid "search"
 msgstr "Recherche"
 
-#: ldt_utils/templates/front/front_search_results.html:54
+#: .\ldt_utils\templates\front\front_search_results.html.py:54
 #, python-format
 msgid ""
 " No results for <b>%(search)s</b> with the medias tagged <span class=\"pink"
@@ -427,107 +428,115 @@
 "Aucun résultat pour <b>%(search)s</b> avec les médias taggués <span class="
 "\"pink\">%(tag_label)s</span>"
 
-#: ldt_utils/templates/front/front_search_results.html:55
+#: .\ldt_utils\templates\front\front_search_results.html.py:55
 msgid "See for all medias"
 msgstr "Voir pour tous les médias"
 
-#: ldt_utils/templates/front/front_search_results.html:57
-#: ldt_utils/templates/ldt/ldt_utils/search_results.html:59
+#: .\ldt_utils\templates\front\front_search_results.html.py:57
+#: .\ldt_utils\templates\ldt\ldt_utils\search_results.html.py:59
 #, python-format
 msgid " No results for <b>%(search)s</b>."
 msgstr "Aucun résultat pour <b>%(search)s</b>."
 
-#: ldt_utils/templates/front/front_search_results.html:72
-#: ldt_utils/templates/front/front_search_results.html:74
+#: .\ldt_utils\templates\front\front_search_results.html.py:72
+#: .\ldt_utils\templates\front\front_search_results.html.py:74
 msgid "Search results for "
 msgstr "Résultats de recherche pour "
 
-#: ldt_utils/templates/front/front_search_results.html:79
-#: ldt_utils/templates/ldt/ldt_utils/search_results.html:62
+#: .\ldt_utils\templates\front\front_search_results.html.py:79
+#: .\ldt_utils\templates\ldt\ldt_utils\search_results.html.py:62
 msgid "Result"
 msgstr "Résultat"
 
-#: ldt_utils/templates/front/front_search_results.html:98
+#: .\ldt_utils\templates\front\front_search_results.html.py:98
 msgid "annotation distribution"
 msgstr "Répartition des annotations"
 
-#: ldt_utils/templates/front/front_search_results.html:112
-#: ldt_utils/templates/front/front_search_results.html:117
+#: .\ldt_utils\templates\front\front_search_results.html.py:112
+#: .\ldt_utils\templates\front\front_search_results.html.py:117
 msgid "view this annotation in the player"
 msgstr "Visionner cette annotation"
 
-#: ldt_utils/templates/front/front_search_results.html:113
-#: ldt_utils/templates/front/front_search_results.html:118
-#: ldt_utils/templates/ldt/ldt_utils/search_results.html:80
+#: .\ldt_utils\templates\front\front_search_results.html.py:113
+#: .\ldt_utils\templates\front\front_search_results.html.py:118
+#: .\ldt_utils\templates\ldt\ldt_utils\search_results.html.py:80
 msgid "No title"
 msgstr "Sans titre"
 
-#: ldt_utils/templates/front/front_search_results.html:114
+#: .\ldt_utils\templates\front\front_search_results.html.py:114
 msgid "Begin"
 msgstr "Début"
 
-#: ldt_utils/templates/front/front_search_results.html:114
+#: .\ldt_utils\templates\front\front_search_results.html.py:114
 msgid "duration"
 msgstr "durée"
 
-#: ldt_utils/templates/ldt/ldt_utils/content_list.html:55
-#: templates/admin/page_base.html:19
-#: user/templates/ldt/user/login_form.html:33
+#: .\ldt_utils\templates\ldt\ldt_utils\500.html.py:6
+msgid "Error 500"
+msgstr "Erreur 500"
+
+#: .\ldt_utils\templates\ldt\ldt_utils\500.html.py:10
+msgid "Internal server error"
+msgstr "Erreur interne du serveur"
+
+#: .\ldt_utils\templates\ldt\ldt_utils\content_list.html.py:55
+#: .\templates\admin\page_base.html.py:19
+#: .\user\templates\ldt\user\login_form.html.py:33
 msgid "Space"
 msgstr "Esp. perso"
 
-#: ldt_utils/templates/ldt/ldt_utils/content_list.html:56
+#: .\ldt_utils\templates\ldt\ldt_utils\content_list.html.py:56
 msgid "Ldt Project"
 msgstr "Projet lignes de temps"
 
-#: ldt_utils/templates/ldt/ldt_utils/content_list.html:59
+#: .\ldt_utils\templates\ldt\ldt_utils\content_list.html.py:59
 msgid "Contents"
 msgstr "Liste des contenus"
 
-#: ldt_utils/templates/ldt/ldt_utils/content_list.html:63
+#: .\ldt_utils\templates\ldt\ldt_utils\content_list.html.py:63
 msgid "Create new content"
 msgstr "Créer un nouveau contenu"
 
-#: ldt_utils/templates/ldt/ldt_utils/content_list.html:66
+#: .\ldt_utils\templates\ldt\ldt_utils\content_list.html.py:66
 msgid "Content"
 msgstr "Contenu"
 
-#: ldt_utils/templates/ldt/ldt_utils/content_list.html:70
-#: ldt_utils/templates/ldt/ldt_utils/content_list.html:77
-#: ldt_utils/templates/ldt/ldt_utils/partial/contentslist.html:28
+#: .\ldt_utils\templates\ldt\ldt_utils\content_list.html.py:70
+#: .\ldt_utils\templates\ldt\ldt_utils\content_list.html.py:77
+#: .\ldt_utils\templates\ldt\ldt_utils\partial\contentslist.html.py:28
 msgid "create project"
 msgstr "Créer un nouveau projet d'indexation"
 
-#: ldt_utils/templates/ldt/ldt_utils/copy_ldt.html:12
+#: .\ldt_utils\templates\ldt\ldt_utils\copy_ldt.html.py:12
 msgid "Copy your project"
 msgstr "Copier votre projet"
 
-#: ldt_utils/templates/ldt/ldt_utils/copy_ldt.html:17
-#: ldt_utils/templates/ldt/ldt_utils/create_ldt.html:96
+#: .\ldt_utils\templates\ldt\ldt_utils\copy_ldt.html.py:17
+#: .\ldt_utils\templates\ldt\ldt_utils\create_ldt.html.py:96
 msgid "Title"
 msgstr "Titre"
 
-#: ldt_utils/templates/ldt/ldt_utils/copy_ldt.html:21
+#: .\ldt_utils\templates\ldt\ldt_utils\copy_ldt.html.py:21
 msgid "Copy"
 msgstr "Copier"
 
-#: ldt_utils/templates/ldt/ldt_utils/create_content.html:33
+#: .\ldt_utils\templates\ldt\ldt_utils\create_content.html.py:33
 msgid "Browse"
 msgstr "Parcourir"
 
-#: ldt_utils/templates/ldt/ldt_utils/create_content.html:34
+#: .\ldt_utils\templates\ldt\ldt_utils\create_content.html.py:34
 msgid "File uploaded"
 msgstr "Fichier téléversé"
 
-#: ldt_utils/templates/ldt/ldt_utils/create_content.html:35
+#: .\ldt_utils\templates\ldt\ldt_utils\create_content.html.py:35
 msgid "Please wait, the upload is not finished yet"
 msgstr "Veuillez patienter, le téléversement est en cours"
 
-#: ldt_utils/templates/ldt/ldt_utils/create_content.html:36
+#: .\ldt_utils\templates\ldt\ldt_utils\create_content.html.py:36
 msgid "Cancel upload"
 msgstr "Annuler le téléversement"
 
-#: ldt_utils/templates/ldt/ldt_utils/create_content.html:71
+#: .\ldt_utils\templates\ldt\ldt_utils\create_content.html.py:71
 msgid ""
 "The operation could not be performed because one or more error(s) occurred."
 "<br />Please resubmit the media form after making the following changes:"
@@ -535,210 +544,210 @@
 "opération impossible à cause d'une ou plusieurs erreurs.<br />Veuillez "
 "resoumettre le formulaire media après avoir fait les changements suivants:"
 
-#: ldt_utils/templates/ldt/ldt_utils/create_content.html:85
-#: ldt_utils/templates/ldt/ldt_utils/workspace_base.html:53
+#: .\ldt_utils\templates\ldt\ldt_utils\create_content.html.py:85
+#: .\ldt_utils\templates\ldt\ldt_utils\workspace_base.html.py:53
 msgid "Create content"
 msgstr "Créer un contenu"
 
-#: ldt_utils/templates/ldt/ldt_utils/create_content.html:126
+#: .\ldt_utils\templates\ldt\ldt_utils\create_content.html.py:126
 msgid "Actual front project"
 msgstr "Front project actuel"
 
-#: ldt_utils/templates/ldt/ldt_utils/create_content.html:127
-#: ldt_utils/templates/ldt/ldt_utils/create_ldt.html:149
-#: ldt_utils/templates/ldt/ldt_utils/reset_confirm.html:39
-#: ldt_utils/templates/ldt/ldt_utils/reset_confirm_popup.html:54
+#: .\ldt_utils\templates\ldt\ldt_utils\create_content.html.py:127
+#: .\ldt_utils\templates\ldt\ldt_utils\create_ldt.html.py:149
+#: .\ldt_utils\templates\ldt\ldt_utils\reset_confirm.html.py:39
+#: .\ldt_utils\templates\ldt\ldt_utils\reset_confirm_popup.html.py:54
 msgid "reset_front_project"
 msgstr "Réinitialiser"
 
-#: ldt_utils/templates/ldt/ldt_utils/create_content.html:141
+#: .\ldt_utils\templates\ldt\ldt_utils\create_content.html.py:141
 msgid "media file is being processed please wait."
 msgstr "Le fichier média est en cours de traitement. Veuillez patienter."
 
-#: ldt_utils/templates/ldt/ldt_utils/create_content.html:145
-#: ldt_utils/templates/ldt/ldt_utils/create_group.html:101
-#: ldt_utils/templates/ldt/ldt_utils/create_ldt.html:145
-#: ldt_utils/templates/ldt/ldt_utils/error_confirm.html:37
-#: ldt_utils/templates/ldt/ldt_utils/error_confirm_popup.html:53
-#: ldt_utils/templates/ldt/ldt_utils/reset_confirm.html:38
-#: ldt_utils/templates/ldt/ldt_utils/reset_confirm_popup.html:53
+#: .\ldt_utils\templates\ldt\ldt_utils\create_content.html.py:145
+#: .\ldt_utils\templates\ldt\ldt_utils\create_group.html.py:101
+#: .\ldt_utils\templates\ldt\ldt_utils\create_ldt.html.py:145
+#: .\ldt_utils\templates\ldt\ldt_utils\error_confirm.html.py:37
+#: .\ldt_utils\templates\ldt\ldt_utils\error_confirm_popup.html.py:53
+#: .\ldt_utils\templates\ldt\ldt_utils\reset_confirm.html.py:38
+#: .\ldt_utils\templates\ldt\ldt_utils\reset_confirm_popup.html.py:53
 msgid "close_cancel"
 msgstr "Fermer"
 
-#: ldt_utils/templates/ldt/ldt_utils/create_content.html:146
+#: .\ldt_utils\templates\ldt\ldt_utils\create_content.html.py:146
 msgid "delete"
 msgstr "Effacer"
 
-#: ldt_utils/templates/ldt/ldt_utils/create_content.html:147
+#: .\ldt_utils\templates\ldt\ldt_utils\create_content.html.py:147
 msgid "write"
 msgstr "Enregistrer"
 
-#: ldt_utils/templates/ldt/ldt_utils/create_group.html:57
+#: .\ldt_utils\templates\ldt\ldt_utils\create_group.html.py:57
 msgid "Do you really want to delete this group ?"
 msgstr "Voulez-vous quitter ce groupe ?"
 
-#: ldt_utils/templates/ldt/ldt_utils/create_group.html:78
+#: .\ldt_utils\templates\ldt\ldt_utils\create_group.html.py:78
 msgid "Update a group"
 msgstr "Mettre à jour votre groupe"
 
-#: ldt_utils/templates/ldt/ldt_utils/create_group.html:78
+#: .\ldt_utils\templates\ldt\ldt_utils\create_group.html.py:78
 msgid "Create a group"
 msgstr "Créer un groupe"
 
-#: ldt_utils/templates/ldt/ldt_utils/create_group.html:85
-#: user/templates/ldt/user/change_profile.html:62
+#: .\ldt_utils\templates\ldt\ldt_utils\create_group.html.py:85
+#: .\user\templates\ldt\user\change_profile.html.py:62
 msgid "Name"
 msgstr "Nom"
 
-#: ldt_utils/templates/ldt/ldt_utils/create_group.html:91
+#: .\ldt_utils\templates\ldt\ldt_utils\create_group.html.py:91
 msgid "Description"
 msgstr "Description"
 
-#: ldt_utils/templates/ldt/ldt_utils/create_group.html:103
+#: .\ldt_utils\templates\ldt\ldt_utils\create_group.html.py:103
 msgid "update_group"
 msgstr "Mettre à jour le groupe"
 
-#: ldt_utils/templates/ldt/ldt_utils/create_group.html:105
+#: .\ldt_utils\templates\ldt\ldt_utils\create_group.html.py:105
 msgid "delete_group"
 msgstr "Effacer le groupe"
 
-#: ldt_utils/templates/ldt/ldt_utils/create_group.html:108
+#: .\ldt_utils\templates\ldt\ldt_utils\create_group.html.py:108
 msgid "create_group"
 msgstr "Créer un nouveau groupe"
 
-#: ldt_utils/templates/ldt/ldt_utils/create_ldt.html:48
+#: .\ldt_utils\templates\ldt\ldt_utils\create_ldt.html.py:48
 msgid "more options"
 msgstr "Plus d'options"
 
-#: ldt_utils/templates/ldt/ldt_utils/create_ldt.html:52
+#: .\ldt_utils\templates\ldt\ldt_utils\create_ldt.html.py:52
 msgid "hide"
 msgstr "Réduire"
 
-#: ldt_utils/templates/ldt/ldt_utils/create_ldt.html:90
+#: .\ldt_utils\templates\ldt\ldt_utils\create_ldt.html.py:90
 msgid "Update your project"
 msgstr "Mettre à jour votre projet Lignes de Temps"
 
-#: ldt_utils/templates/ldt/ldt_utils/create_ldt.html:90
+#: .\ldt_utils\templates\ldt\ldt_utils\create_ldt.html.py:90
 msgid "Create your project"
 msgstr "Créer votre projet Lignes de Temps"
 
-#: ldt_utils/templates/ldt/ldt_utils/create_ldt.html:101
+#: .\ldt_utils\templates\ldt\ldt_utils\create_ldt.html.py:101
 msgid "Description :"
 msgstr "Description :"
 
-#: ldt_utils/templates/ldt/ldt_utils/create_ldt.html:106
+#: .\ldt_utils\templates\ldt\ldt_utils\create_ldt.html.py:106
 msgid "List of contents"
 msgstr "Liste de contenus"
 
-#: ldt_utils/templates/ldt/ldt_utils/create_ldt.html:120
-#: ldt_utils/templates/ldt/ldt_utils/partial/contentslist.html:21
-#: ldt_utils/templates/ldt/ldt_utils/partial/projectslist.html:12
-#: ldt_utils/templates/ldt/ldt_utils/partial/publishedprojectslist.html:12
+#: .\ldt_utils\templates\ldt\ldt_utils\create_ldt.html.py:120
+#: .\ldt_utils\templates\ldt\ldt_utils\partial\contentslist.html.py:21
+#: .\ldt_utils\templates\ldt\ldt_utils\partial\projectslist.html.py:12
+#: .\ldt_utils\templates\ldt\ldt_utils\partial\publishedprojectslist.html.py:12
 msgid "name"
 msgstr "Nom"
 
-#: ldt_utils/templates/ldt/ldt_utils/create_ldt.html:136
+#: .\ldt_utils\templates\ldt\ldt_utils\create_ldt.html.py:136
 msgid "More options"
 msgstr "Plus d'options"
 
-#: ldt_utils/templates/ldt/ldt_utils/create_ldt.html:147
+#: .\ldt_utils\templates\ldt\ldt_utils\create_ldt.html.py:147
 msgid "delete_project"
 msgstr "Effacer"
 
-#: ldt_utils/templates/ldt/ldt_utils/create_ldt.html:151
+#: .\ldt_utils\templates\ldt\ldt_utils\create_ldt.html.py:151
 msgid "update_project"
 msgstr "Mettre à jour"
 
-#: ldt_utils/templates/ldt/ldt_utils/create_ldt.html:153
+#: .\ldt_utils\templates\ldt\ldt_utils\create_ldt.html.py:153
 msgid "create_project"
 msgstr "Créer un nouveau projet Ligne de Temps"
 
-#: ldt_utils/templates/ldt/ldt_utils/embed_popup.html:23
-#: ldt_utils/templates/ldt/ldt_utils/embed_popup.html:46
+#: .\ldt_utils\templates\ldt\ldt_utils\embed_popup.html.py:23
+#: .\ldt_utils\templates\ldt\ldt_utils\embed_popup.html.py:46
 msgid "Show Player"
 msgstr "Afficher le Lecteur métadata"
 
-#: ldt_utils/templates/ldt/ldt_utils/embed_popup.html:24
+#: .\ldt_utils\templates\ldt\ldt_utils\embed_popup.html.py:24
 msgid "Hide Player"
 msgstr "Masquer le Lecteur métadata "
 
-#: ldt_utils/templates/ldt/ldt_utils/embed_popup.html:43
+#: .\ldt_utils\templates\ldt\ldt_utils\embed_popup.html.py:43
 msgid "project id"
 msgstr "Identifiant du projet "
 
-#: ldt_utils/templates/ldt/ldt_utils/embed_popup.html:43
+#: .\ldt_utils\templates\ldt\ldt_utils\embed_popup.html.py:43
 msgid "Select"
 msgstr "Sélectionner"
 
-#: ldt_utils/templates/ldt/ldt_utils/embed_popup.html:51
+#: .\ldt_utils\templates\ldt\ldt_utils\embed_popup.html.py:51
 msgid "popup_player"
 msgstr "Code Lecteur métadata"
 
-#: ldt_utils/templates/ldt/ldt_utils/embed_popup.html:51
+#: .\ldt_utils\templates\ldt\ldt_utils\embed_popup.html.py:51
 msgid "popup_seo_body"
 msgstr "Code SEO"
 
-#: ldt_utils/templates/ldt/ldt_utils/embed_popup.html:51
+#: .\ldt_utils\templates\ldt\ldt_utils\embed_popup.html.py:51
 msgid "popup_seo_meta"
 msgstr "Code balise meta en-tête"
 
-#: ldt_utils/templates/ldt/ldt_utils/embed_popup.html:51
+#: .\ldt_utils\templates\ldt\ldt_utils\embed_popup.html.py:51
 msgid "popup_links"
 msgstr "Liste de liens"
 
-#: ldt_utils/templates/ldt/ldt_utils/embed_popup.html:59
+#: .\ldt_utils\templates\ldt\ldt_utils\embed_popup.html.py:59
 msgid "Integration mode"
 msgstr "Utiliser le mode d'intégration "
 
-#: ldt_utils/templates/ldt/ldt_utils/embed_popup.html:60
+#: .\ldt_utils\templates\ldt\ldt_utils\embed_popup.html.py:60
 msgid "div"
 msgstr "div"
 
-#: ldt_utils/templates/ldt/ldt_utils/embed_popup.html:61
+#: .\ldt_utils\templates\ldt\ldt_utils\embed_popup.html.py:61
 msgid "iframe"
 msgstr "iframe"
 
-#: ldt_utils/templates/ldt/ldt_utils/error_confirm.html:21
-#: ldt_utils/templates/ldt/ldt_utils/error_confirm_popup.html:34
-#: ldt_utils/templates/ldt/ldt_utils/reset_confirm.html:22
-#: ldt_utils/templates/ldt/ldt_utils/reset_confirm_popup.html:34
+#: .\ldt_utils\templates\ldt\ldt_utils\error_confirm.html.py:21
+#: .\ldt_utils\templates\ldt\ldt_utils\error_confirm_popup.html.py:34
+#: .\ldt_utils\templates\ldt\ldt_utils\reset_confirm.html.py:22
+#: .\ldt_utils\templates\ldt\ldt_utils\reset_confirm_popup.html.py:34
 msgid "error"
 msgstr "Erreur"
 
-#: ldt_utils/templates/ldt/ldt_utils/error_confirm.html:21
-#: ldt_utils/templates/ldt/ldt_utils/error_confirm_popup.html:34
-#: ldt_utils/templates/ldt/ldt_utils/reset_confirm_popup.html:34
+#: .\ldt_utils\templates\ldt\ldt_utils\error_confirm.html.py:21
+#: .\ldt_utils\templates\ldt\ldt_utils\error_confirm_popup.html.py:34
+#: .\ldt_utils\templates\ldt\ldt_utils\reset_confirm_popup.html.py:34
 msgid "confirm"
 msgstr "Confirmation d'effacement"
 
-#: ldt_utils/templates/ldt/ldt_utils/error_confirm.html:38
-#: ldt_utils/templates/ldt/ldt_utils/error_confirm_popup.html:54
+#: .\ldt_utils\templates\ldt\ldt_utils\error_confirm.html.py:38
+#: .\ldt_utils\templates\ldt\ldt_utils\error_confirm_popup.html.py:54
 msgid "do_delete"
 msgstr "Effacer"
 
-#: ldt_utils/templates/ldt/ldt_utils/error_confirm_popup.html:49
-#: ldt_utils/templates/ldt/ldt_utils/reset_confirm_popup.html:49
+#: .\ldt_utils\templates\ldt\ldt_utils\error_confirm_popup.html.py:49
+#: .\ldt_utils\templates\ldt\ldt_utils\reset_confirm_popup.html.py:49
 msgid "close_error"
 msgstr "Fermer"
 
-#: ldt_utils/templates/ldt/ldt_utils/groups.html:68
+#: .\ldt_utils\templates\ldt\ldt_utils\groups.html.py:68
 msgid "Do you want to leave this group ?"
 msgstr "Voulez-vous quitter ce groupe ?"
 
-#: ldt_utils/templates/ldt/ldt_utils/groups.html:93
-#: templates/ldt/ldt_base.html:115
+#: .\ldt_utils\templates\ldt\ldt_utils\groups.html.py:93
+#: .\templates\ldt\ldt_base.html.py:115
 msgid "My groups"
 msgstr "Groupes"
 
-#: ldt_utils/templates/ldt/ldt_utils/groups.html:95
+#: .\ldt_utils\templates\ldt\ldt_utils\groups.html.py:95
 msgid "Create group"
 msgstr "Créer un nouveau groupe"
 
-#: ldt_utils/templates/ldt/ldt_utils/groups.html:111
+#: .\ldt_utils\templates\ldt\ldt_utils\groups.html.py:111
 msgid "The group's projects"
 msgstr "projets du groupe"
 
-#: ldt_utils/templates/ldt/ldt_utils/init_ldt_full.html:16
+#: .\ldt_utils\templates\ldt\ldt_utils\init_ldt_full.html.py:16
 msgid ""
 "Your current work is modified. Click Cancel and save it one last time before "
 "leaving. Click OK to leave without saving."
@@ -746,255 +755,255 @@
 "Vous avez un travail en cours. Cliquez sur Annuler et sauvegardez votre "
 "travail une dernière fois. Cliquez sur OK pour quitter sans sauvegarder."
 
-#: ldt_utils/templates/ldt/ldt_utils/ldt_list.html:78
+#: .\ldt_utils\templates\ldt\ldt_utils\ldt_list.html.py:78
 msgid "project list"
 msgstr "Liste des projets"
 
-#: ldt_utils/templates/ldt/ldt_utils/published_projects.html:62
+#: .\ldt_utils\templates\ldt\ldt_utils\published_projects.html.py:62
 msgid "Submit"
 msgstr "Chercher"
 
-#: ldt_utils/templates/ldt/ldt_utils/published_projects.html:67
-#: templates/ldt/ldt_base.html:116
+#: .\ldt_utils\templates\ldt\ldt_utils\published_projects.html.py:67
+#: .\templates\ldt\ldt_base.html.py:116
 msgid "Published projects"
 msgstr "Projets publiés"
 
-#: ldt_utils/templates/ldt/ldt_utils/published_projects.html:68
-#: ldt_utils/templates/ldt/ldt_utils/workspace_base.html:69
+#: .\ldt_utils\templates\ldt\ldt_utils\published_projects.html.py:68
+#: .\ldt_utils\templates\ldt\ldt_utils\workspace_base.html.py:69
 msgid "Create project"
 msgstr "Créer un nouveau projet d'indexation"
 
-#: ldt_utils/templates/ldt/ldt_utils/reset_confirm.html:22
+#: .\ldt_utils\templates\ldt\ldt_utils\reset_confirm.html.py:22
 msgid "confirm_reset"
 msgstr "Confirmation de réinitialisation"
 
-#: ldt_utils/templates/ldt/ldt_utils/search_form.html:10
+#: .\ldt_utils\templates\ldt\ldt_utils\search_form.html.py:10
 msgid "The search field can not be empty."
 msgstr "Le champ de recherche ne peut pas être vide."
 
-#: ldt_utils/templates/ldt/ldt_utils/search_results.html:62
+#: .\ldt_utils\templates\ldt\ldt_utils\search_results.html.py:62
 msgid "Results for "
 msgstr "Résultats pour "
 
-#: ldt_utils/templates/ldt/ldt_utils/search_results.html:76
-#: ldt_utils/templates/ldt/ldt_utils/partial/projectslist.html:24
-#: ldt_utils/templates/ldt/ldt_utils/partial/projectslist.html:26
-#: ldt_utils/templates/ldt/ldt_utils/partial/projectslist.html:32
-#: ldt_utils/templates/ldt/ldt_utils/partial/projectslist.html:34
-#: ldt_utils/templates/ldt/ldt_utils/partial/publishedprojectslist.html:21
-#: ldt_utils/templates/ldt/ldt_utils/partial/publishedprojectslist.html:23
+#: .\ldt_utils\templates\ldt\ldt_utils\search_results.html.py:76
+#: .\ldt_utils\templates\ldt\ldt_utils\partial\projectslist.html.py:24
+#: .\ldt_utils\templates\ldt\ldt_utils\partial\projectslist.html.py:26
+#: .\ldt_utils\templates\ldt\ldt_utils\partial\projectslist.html.py:32
+#: .\ldt_utils\templates\ldt\ldt_utils\partial\projectslist.html.py:34
+#: .\ldt_utils\templates\ldt\ldt_utils\partial\publishedprojectslist.html.py:21
+#: .\ldt_utils\templates\ldt\ldt_utils\partial\publishedprojectslist.html.py:23
 msgid "open ldt"
 msgstr "Ouvrir sous Lignes de Temps"
 
-#: ldt_utils/templates/ldt/ldt_utils/search_results.html:87
+#: .\ldt_utils\templates\ldt\ldt_utils\search_results.html.py:87
 msgid "Tags"
 msgstr "Tags"
 
-#: ldt_utils/templates/ldt/ldt_utils/search_results.html:106
+#: .\ldt_utils\templates\ldt\ldt_utils\search_results.html.py:106
 #, python-format
 msgid "Page %(number)s of  %(num_pages)s"
 msgstr "Page %(number)s de  %(num_pages)s"
 
-#: ldt_utils/templates/ldt/ldt_utils/workspace_base.html:52
+#: .\ldt_utils\templates\ldt\ldt_utils\workspace_base.html.py:52
 msgid "content list"
 msgstr "Liste des contenus"
 
-#: ldt_utils/templates/ldt/ldt_utils/partial/contentslist.html:6
+#: .\ldt_utils\templates\ldt\ldt_utils\partial\contentslist.html.py:6
 msgid "All categories"
 msgstr "Toutes les catégories"
 
-#: ldt_utils/templates/ldt/ldt_utils/partial/contentslist.html:29
+#: .\ldt_utils\templates\ldt\ldt_utils\partial\contentslist.html.py:29
 msgid "preview media"
 msgstr "Aperçu"
 
-#: ldt_utils/templates/ldt/ldt_utils/partial/contentslist.html:31
+#: .\ldt_utils\templates\ldt\ldt_utils\partial\contentslist.html.py:31
 msgid "You can't edit this content"
 msgstr "Vous n'avez pas l'autorisation d'éditer ce contenu"
 
-#: ldt_utils/templates/ldt/ldt_utils/partial/groupslist.html:22
+#: .\ldt_utils\templates\ldt\ldt_utils\partial\groupslist.html.py:22
 msgid "Click on the line to see the group's projects"
 msgstr "cliquer ici pour voir les projets du groupe"
 
-#: ldt_utils/templates/ldt/ldt_utils/partial/groupslist.html:33
+#: .\ldt_utils\templates\ldt\ldt_utils\partial\groupslist.html.py:33
 msgid "Change this group"
 msgstr "Modifier ce groupe"
 
-#: ldt_utils/templates/ldt/ldt_utils/partial/groupslist.html:40
+#: .\ldt_utils\templates\ldt\ldt_utils\partial\groupslist.html.py:40
 msgid "You are not allowed to edit this group"
 msgstr "vous n'avez pas l'autorisation de modifier ce groupe"
 
-#: ldt_utils/templates/ldt/ldt_utils/partial/groupslist.html:55
+#: .\ldt_utils\templates\ldt\ldt_utils\partial\groupslist.html.py:55
 msgid "Projects shared with me only"
 msgstr "Projets partagés avec moi uniquement"
 
-#: ldt_utils/templates/ldt/ldt_utils/partial/permissions.html:52
-#: ldt_utils/templates/ldt/ldt_utils/partial/permissions.html:79
-#: ldt_utils/templates/ldt/ldt_utils/partial/permissions.html:174
+#: .\ldt_utils\templates\ldt\ldt_utils\partial\permissions.html.py:52
+#: .\ldt_utils\templates\ldt\ldt_utils\partial\permissions.html.py:79
+#: .\ldt_utils\templates\ldt\ldt_utils\partial\permissions.html.py:174
 msgid "share.eye"
 msgstr "Cet utilisateur ou ce groupe a le droit de voir cet élement"
 
-#: ldt_utils/templates/ldt/ldt_utils/partial/permissions.html:60
-#: ldt_utils/templates/ldt/ldt_utils/partial/permissions.html:172
+#: .\ldt_utils\templates\ldt\ldt_utils\partial\permissions.html.py:60
+#: .\ldt_utils\templates\ldt\ldt_utils\partial\permissions.html.py:172
 msgid "share.pencil"
 msgstr "cet utilisateur ou ce groupe a le droit de modifier cet élement"
 
-#: ldt_utils/templates/ldt/ldt_utils/partial/permissions.html:110
+#: .\ldt_utils\templates\ldt\ldt_utils\partial\permissions.html.py:110
 msgid "share"
 msgstr "partager avec d'autres utilisateurs"
 
-#: ldt_utils/templates/ldt/ldt_utils/partial/permissions.html:119
+#: .\ldt_utils\templates\ldt\ldt_utils\partial\permissions.html.py:119
 msgid "publish for everyone"
 msgstr "publier pour tout le monde"
 
-#: ldt_utils/templates/ldt/ldt_utils/partial/permissions.html:124
+#: .\ldt_utils\templates\ldt\ldt_utils\partial\permissions.html.py:124
 msgid "publish the title on the front"
 msgstr "publier le titre sur le front"
 
-#: ldt_utils/templates/ldt/ldt_utils/partial/permissions.html:127
+#: .\ldt_utils\templates\ldt\ldt_utils\partial\permissions.html.py:127
 msgid "User and group list"
 msgstr "Liste des groupes et des utilisateurs"
 
-#: ldt_utils/templates/ldt/ldt_utils/partial/permissions.html:142
+#: .\ldt_utils\templates\ldt\ldt_utils\partial\permissions.html.py:142
 msgid "select all displayed elements"
 msgstr "ajouter tous les élements affichés"
 
-#: ldt_utils/templates/ldt/ldt_utils/partial/permissions.html:147
+#: .\ldt_utils\templates\ldt\ldt_utils\partial\permissions.html.py:147
 msgid "select users"
 msgstr "choisir des utilisateurs"
 
-#: ldt_utils/templates/ldt/ldt_utils/partial/permissions.html:148
+#: .\ldt_utils\templates\ldt\ldt_utils\partial\permissions.html.py:148
 msgid "remove users"
 msgstr "enlever des utilisateurs"
 
-#: ldt_utils/templates/ldt/ldt_utils/partial/permissions.html:153
+#: .\ldt_utils\templates\ldt\ldt_utils\partial\permissions.html.py:153
 msgid "Members list"
 msgstr "liste des membres"
 
-#: ldt_utils/templates/ldt/ldt_utils/partial/permissions.html:163
-#: ldt_utils/templates/ldt/ldt_utils/partial/sharewith.html:7
+#: .\ldt_utils\templates\ldt\ldt_utils\partial\permissions.html.py:163
+#: .\ldt_utils\templates\ldt\ldt_utils\partial\sharewith.html.py:7
 msgid "user"
 msgstr "utilisateur"
 
-#: ldt_utils/templates/ldt/ldt_utils/partial/permissions.html:165
-#: ldt_utils/templates/ldt/ldt_utils/partial/sharewith.html:9
+#: .\ldt_utils\templates\ldt\ldt_utils\partial\permissions.html.py:165
+#: .\ldt_utils\templates\ldt\ldt_utils\partial\sharewith.html.py:9
 msgid "group"
 msgstr "groupe"
 
-#: ldt_utils/templates/ldt/ldt_utils/partial/permissions.html:185
+#: .\ldt_utils\templates\ldt\ldt_utils\partial\permissions.html.py:185
 msgid "remove all"
 msgstr "tout enlever"
 
-#: ldt_utils/templates/ldt/ldt_utils/partial/picture.html:16
-#: ldt_utils/templates/ldt/ldt_utils/partial/picture.html:17
+#: .\ldt_utils\templates\ldt\ldt_utils\partial\picture.html.py:16
+#: .\ldt_utils\templates\ldt\ldt_utils\partial\picture.html.py:17
 msgid "choose a profile image"
 msgstr "choisir une image de profil"
 
-#: ldt_utils/templates/ldt/ldt_utils/partial/picture.html:24
-#: user/templates/ldt/user/change_profile.html:154
+#: .\ldt_utils\templates\ldt\ldt_utils\partial\picture.html.py:24
+#: .\user\templates\ldt\user\change_profile.html.py:154
 msgid "Current profile picture"
 msgstr "Image de profil"
 
-#: ldt_utils/templates/ldt/ldt_utils/partial/picture.html:32
-#: user/templates/ldt/user/change_profile.html:162
+#: .\ldt_utils\templates\ldt\ldt_utils\partial\picture.html.py:32
+#: .\user\templates\ldt\user\change_profile.html.py:162
 msgid "Upload a new picture"
 msgstr "Téléverser une nouvelle image"
 
-#: ldt_utils/templates/ldt/ldt_utils/partial/projectslist.html:40
+#: .\ldt_utils\templates\ldt\ldt_utils\partial\projectslist.html.py:40
 msgid "copy project"
 msgstr "Copier votre projet"
 
-#: ldt_utils/templates/ldt/ldt_utils/partial/projectslist.html:41
-#: ldt_utils/templates/ldt/ldt_utils/partial/publishedprojectslist.html:26
+#: .\ldt_utils\templates\ldt\ldt_utils\partial\projectslist.html.py:41
+#: .\ldt_utils\templates\ldt\ldt_utils\partial\publishedprojectslist.html.py:26
 msgid "link json by id"
 msgstr "Ouvrir le lecteur de métadata"
 
-#: ldt_utils/templates/ldt/ldt_utils/partial/projectslist.html:44
+#: .\ldt_utils\templates\ldt\ldt_utils\partial\projectslist.html.py:44
 msgid "Project published, click to unpublish"
 msgstr "Projet publié, cliquer pour de-publier"
 
-#: ldt_utils/templates/ldt/ldt_utils/partial/projectslist.html:44
-#: ldt_utils/templates/ldt/ldt_utils/partial/projectslist.html:46
-#: ldt_utils/templates/ldt/ldt_utils/partial/projectslist.html:57
+#: .\ldt_utils\templates\ldt\ldt_utils\partial\projectslist.html.py:44
+#: .\ldt_utils\templates\ldt\ldt_utils\partial\projectslist.html.py:46
+#: .\ldt_utils\templates\ldt\ldt_utils\partial\projectslist.html.py:57
 msgid "You are not allowed to change this project"
 msgstr "vous n'avez pas l'autorisation de modifier ce projet"
 
-#: ldt_utils/templates/ldt/ldt_utils/partial/projectslist.html:46
+#: .\ldt_utils\templates\ldt\ldt_utils\partial\projectslist.html.py:46
 msgid "Project not published, click to publish"
 msgstr "Projet non publié, cliquer pour publier"
 
-#: ldt_utils/templates/ldt/ldt_utils/partial/publishedprojectslist.html:25
+#: .\ldt_utils\templates\ldt\ldt_utils\partial\publishedprojectslist.html.py:25
 msgid "copy the project"
 msgstr "Copier le projet"
 
-#: ldt_utils/templates/ldt/ldt_utils/partial/publishedprojectslist.html:28
+#: .\ldt_utils\templates\ldt\ldt_utils\partial\publishedprojectslist.html.py:28
 msgid "Project published"
 msgstr "Projet publié"
 
-#: ldt_utils/views/content.py:189
+#: .\ldt_utils\views\content.py:189
 msgid "Problem when downloading file from url : "
 msgstr "Problème lors du téléchargement du fichier : "
 
-#: ldt_utils/views/content.py:192
+#: .\ldt_utils\views\content.py:192
 msgid "Problem when uploading file : "
 msgstr "Problème lors de l'upload du fichier : "
 
-#: ldt_utils/views/content.py:297
+#: .\ldt_utils\views\content.py:297
 msgid "Content creation failure"
 msgstr "Echec lors de la creation du contenu"
 
-#: ldt_utils/views/content.py:305
+#: .\ldt_utils\views\content.py:305
 msgid "Commit of the content creation failed"
 msgstr "Echec lors du commit de la creation du contenu"
 
-#: ldt_utils/views/content.py:319
+#: .\ldt_utils\views\content.py:319
 #, python-format
 msgid "There is %(count)d error when deleting content"
 msgid_plural "There are %(count)d errors when deleting content"
 msgstr[0] "Il y a %(count)d erreur lors de l'effacement du contenu"
 msgstr[1] "Il y a %(count)d erreurs lors de l'effacement du contenu"
 
-#: ldt_utils/views/content.py:320
+#: .\ldt_utils\views\content.py:320
 msgid "title error deleting content"
 msgstr "Erreur lors de l'effacement du contenu"
 
-#: ldt_utils/views/content.py:325
+#: .\ldt_utils\views\content.py:325
 #, python-format
 msgid "Confirm delete content %(titles)s"
 msgstr "Veuillez confirmer l'effacement du contenu %(titles)s"
 
-#: ldt_utils/views/content.py:326
+#: .\ldt_utils\views\content.py:326
 msgid "confirm delete content"
 msgstr "Confirmation effacement contenu"
 
-#: ldt_utils/views/content.py:337
+#: .\ldt_utils\views\content.py:337
 #, python-format
 msgid "Please unpublish the front project %(title)s"
 msgstr "Veuillez dépublier le projet : %(title)s"
 
-#: ldt_utils/views/content.py:338
+#: .\ldt_utils\views\content.py:338
 msgid "The front project is published"
 msgstr "Projet publié"
 
-#: ldt_utils/views/content.py:339 ldt_utils/views/content.py:342
-#: ldt_utils/views/project.py:137
+#: .\ldt_utils\views\content.py:339 .\ldt_utils\views\content.py:342
+#: .\ldt_utils\views\project.py:137
 msgid "confirm reset"
 msgstr "Confirmer la réinitialisation"
 
-#: ldt_utils/views/content.py:341 ldt_utils/views/project.py:136
+#: .\ldt_utils\views\content.py:341 .\ldt_utils\views\project.py:136
 #, python-format
 msgid "please confirm reseting project %(title)s"
 msgstr "Veuillez confirmer la réinitialisation du projet %(title)s"
 
-#: ldt_utils/views/content.py:369
+#: .\ldt_utils\views\content.py:369
 msgid "An error occurred - Please try again or contact webmaster"
 msgstr ""
 "Une erreur est apparue - Merci de réessayer ou de contacter le webmaster"
 
-#: ldt_utils/views/content.py:370
+#: .\ldt_utils\views\content.py:370
 msgid "Error"
 msgstr "Erreur"
 
-#: ldt_utils/views/content.py:413
+#: .\ldt_utils\views\content.py:413
 #, python-format
 msgid ""
 "Content '%(title)s' is referenced by this project : %(project_titles)s. "
@@ -1006,10 +1015,10 @@
 "Le contenu '%(title)s' est référencé par le projet '%(project_titles)s'."
 "Veuillez l'effacer préalablement."
 msgstr[1] ""
-"Le contenu '%(title)s' est référencé par les projets suivants : "
-"'%(project_titles)s'.Veuillez les effacer préalablement."
+"Le contenu '%(title)s' est référencé par les projets suivants : '%"
+"(project_titles)s'.Veuillez les effacer préalablement."
 
-#: ldt_utils/views/content.py:416
+#: .\ldt_utils\views\content.py:416
 #, python-format
 msgid ""
 "The project '%(project_title)s' pointing on the content '%(title)s' has "
@@ -1019,34 +1028,34 @@
 "Le projet '%(project_title)s' référençant le contenu '%(title)s' comporte "
 "plusieurs annotations. Voulez vous quand même supprimer le contenu ?"
 
-#: ldt_utils/views/content.py:442
+#: .\ldt_utils\views\content.py:442
 msgid "Content deletion failure"
 msgstr "Echec lors de la suppression du contenu"
 
-#: ldt_utils/views/content.py:452
+#: .\ldt_utils\views\content.py:452
 msgid "Commit of the content deletion failed"
 msgstr "Echec lors du commit de la suppression du contenu"
 
-#: ldt_utils/views/json.py:40 ldt_utils/views/rdf.py:15
-#: ldt_utils/views/workspace.py:174
+#: .\ldt_utils\views\json.py:40 .\ldt_utils\views\rdf.py:15
+#: .\ldt_utils\views\workspace.py:178
 msgid "You can not access this project"
 msgstr "vous n'avez pas l'autorisation d'accéder à ce projet"
 
-#: ldt_utils/views/project.py:117
+#: .\ldt_utils\views\project.py:117
 #, python-format
 msgid "the project %(title)s is published. please unpublish before deleting."
 msgstr "Le projet %(title)s est publié. Déplublier le avant de l'effacer."
 
-#: ldt_utils/views/project.py:118 ldt_utils/views/project.py:122
+#: .\ldt_utils\views\project.py:118 .\ldt_utils\views\project.py:122
 msgid "can not delete the project. Please correct the following error"
 msgstr ""
 "Le projet ne peut pas être effacé. Veuillez corriger les erreurs suivantes."
 
-#: ldt_utils/views/project.py:119 ldt_utils/views/project.py:123
+#: .\ldt_utils\views\project.py:119 .\ldt_utils\views\project.py:123
 msgid "title error deleting project"
 msgstr "Erreur lors de l'effacement du projet"
 
-#: ldt_utils/views/project.py:121
+#: .\ldt_utils\views\project.py:121
 #, python-format
 msgid ""
 "the project %(title)s is the front project of %(content)s. please delete "
@@ -1055,498 +1064,517 @@
 "Le projet %(title)s est référencé par le contenu '%(content)s'.Veuillez "
 "l'effacer préalablement."
 
-#: ldt_utils/views/project.py:125
+#: .\ldt_utils\views\project.py:125
 #, python-format
 msgid "please confirm deleting project %(title)s"
 msgstr "Veuillez confirmer l'effacement du contenu %(title)s"
 
-#: ldt_utils/views/project.py:126
+#: .\ldt_utils\views\project.py:126
 msgid "confirm deletion"
 msgstr "Confirmation d'effacement"
 
-#: ldt_utils/views/workspace.py:124
+#: .\ldt_utils\views\workspace.py:128
 msgid ""
 "The content does not exists or you are not allowed to access this content"
 msgstr "Ce contenu n'existe pas, ou vous n'êtes pas autorisé a y acceder"
 
-#: ldt_utils/views/workspace.py:128
+#: .\ldt_utils\views\workspace.py:132
 msgid "Parameters project_id or content_id must be given in the url"
 msgstr "Les paramètres project_id et content_id doivent être passés dans l'URL"
 
-#: templates/admin/cms_change_form.html:30
+#: .\templates\403.html.py:6
+msgid "403 error"
+msgstr "Erreur 403"
+
+#: .\templates\403.html.py:9
+msgid "You don't have the right permission to access this page"
+msgstr "Vous n'avez pas l'autorisation d'accès à cette page."
+
+#: .\templates\404.html.py:6
+msgid "404 error"
+msgstr "Erreur 404"
+
+#: .\templates\404.html.py:9
+msgid "Sorry, we couldn't find your page"
+msgstr "Désolé, votre page est introuvable"
+
+#: .\templates\admin\cms_change_form.html.py:30
 msgid "Approve page deletion"
 msgstr "Accepter l'effacement de la page"
 
-#: templates/admin/cms_change_form.html:36
+#: .\templates\admin\cms_change_form.html.py:36
 #, python-format
 msgid "(requires approvement at %(moderation_level)s level)"
 msgstr "(Demande l'approbation au niveau %(moderation_level)s)"
 
-#: templates/admin/cms_change_form.html:37
+#: .\templates\admin\cms_change_form.html.py:37
 msgid "(you can perform actions on this page directly)"
 msgstr "(Vous pouvez agir sur cette page directement)"
 
-#: templates/admin/cms_change_form.html:50
+#: .\templates\admin\cms_change_form.html.py:50
 msgid "Remove delete request"
 msgstr "Effacer la requête d'affacement"
 
-#: templates/admin/cms_change_form.html:52
+#: .\templates\admin\cms_change_form.html.py:52
 msgid "Approve delete"
 msgstr "Accepter l'effacement"
 
-#: templates/admin/cms_change_form.html:52
+#: .\templates\admin\cms_change_form.html.py:52
 msgid "Approve"
 msgstr "Accepter"
 
-#: templates/admin/cms_change_form.html:52
-#: templates/admin/cms_change_form.html:53
+#: .\templates\admin\cms_change_form.html.py:52
+#: .\templates\admin\cms_change_form.html.py:53
 msgid "draft"
 msgstr "brouillon"
 
-#: templates/admin/cms_change_form.html:53
+#: .\templates\admin\cms_change_form.html.py:53
 msgid "Preview"
 msgstr "Aperçu"
 
-#: templates/admin/cms_change_form.html:56
-#: templates/admin/page_change_form.html:27
+#: .\templates\admin\cms_change_form.html.py:56
+#: .\templates\admin\page_change_form.html.py:27
 msgid "History"
 msgstr "Historique"
 
-#: templates/admin/cms_change_form.html:57
-#: templates/admin/page_change_form.html:28
+#: .\templates\admin\cms_change_form.html.py:57
+#: .\templates\admin\page_change_form.html.py:28
 msgid "View on site"
 msgstr "Voir sur le site"
 
-#: templates/admin/cms_change_form.html:87
-#: templates/admin/page_change_form.html:38
-#: templates/admin/page_change_list.html:54
-#: templates/cms/admin/cms/page/change_form.html:24
+#: .\templates\admin\cms_change_form.html.py:87
+#: .\templates\admin\page_change_form.html.py:38
+#: .\templates\admin\page_change_list.html.py:54
+#: .\templates\cms\admin\cms\page\change_form.html.py:24
 msgid "Please correct the error below."
 msgid_plural "Please correct the errors below."
 msgstr[0] "Veuillez corriger l'erreur ci-dessous"
 msgstr[1] "Veuillez corriger les erreurs ci-dessous"
 
-#: templates/admin/cms_change_form.html:107
+#: .\templates\admin\cms_change_form.html.py:107
 msgid "All permissions"
 msgstr "Toutes les permissions"
 
-#: templates/admin/cms_change_form.html:108
-#: templates/admin/cms_change_form.html:120
+#: .\templates\admin\cms_change_form.html.py:108
+#: .\templates\admin\cms_change_form.html.py:120
 msgid "Loading..."
 msgstr "Chargement..."
 
-#: templates/admin/cms_change_form.html:119
+#: .\templates\admin\cms_change_form.html.py:119
 msgid "Page states"
 msgstr "Etat de la page"
 
-#: templates/admin/cms_change_form.html:142
+#: .\templates\admin\cms_change_form.html.py:142
 #, python-format
 msgid ""
 "This page must be moderated at level %(moderation_level)s, post a message "
 "for moderator."
 msgstr ""
-"Le niveau nécessaire pour modérer cette page est le niveau "
-"%(moderation_level)s, laisser un message pour le modérateur"
+"Le niveau nécessaire pour modérer cette page est le niveau %"
+"(moderation_level)s, laisser un message pour le modérateur"
 
-#: templates/admin/cms_change_form.html:144
+#: .\templates\admin\cms_change_form.html.py:144
 msgid "Request approvemet"
 msgstr "Demander l'approbation"
 
-#: templates/admin/cms_change_form.html:234
-#: user/templates/registration/registration_form.html:16
+#: .\templates\admin\cms_change_form.html.py:234
+#: .\user\templates\registration\registration_form.html.py:16
 msgid "Save"
 msgstr "Enregistrer"
 
-#: templates/admin/cms_change_form.html:235
+#: .\templates\admin\cms_change_form.html.py:235
 msgid "Save and continue editing"
 msgstr "Sauver et continuer l'édition"
 
-#: templates/admin/cms_change_list.html:51
+#: .\templates\admin\cms_change_list.html.py:51
 msgid "Successfully moved"
 msgstr "Déplacement réussi"
 
-#: templates/admin/cms_change_list.html:76
+#: .\templates\admin\cms_change_list.html.py:76
 #, python-format
 msgid "Recover deleted %(name)s"
 msgstr "Récupérer %(name)s effacé"
 
-#: templates/admin/cms_change_list.html:79
-#: templates/admin/page_change_list.html:46
+#: .\templates\admin\cms_change_list.html.py:79
+#: .\templates\admin\page_change_list.html.py:46
 #, python-format
 msgid "Add %(name)s"
 msgstr "Ajouter %(name)s"
 
-#: templates/admin/cms_change_list.html:91
+#: .\templates\admin\cms_change_list.html.py:91
 msgid "Pages on:"
 msgstr "Pages sur :"
 
-#: templates/admin/cms_change_list.html:108
+#: .\templates\admin\cms_change_list.html.py:108
 msgid "on"
 msgstr "on"
 
-#: templates/admin/cms_change_list.html:108
+#: .\templates\admin\cms_change_list.html.py:108
 msgid "off"
 msgstr "off"
 
-#: templates/admin/cms_change_list.html:110
-#: templates/admin/page_change_list.html:65
+#: .\templates\admin\cms_change_list.html.py:110
+#: .\templates\admin\page_change_list.html.py:65
 msgid "Filter"
 msgstr "Filtre"
 
-#: templates/admin/index.html:18 templates/admin/page_index.html:18
+#: .\templates\admin\index.html.py:18 .\templates\admin\page_index.html.py:18
 #, python-format
 msgid "Models available in the %(name)s application."
 msgstr "Le modèle disponible dans l'application %(name)s."
 
-#: templates/admin/index.html:19 templates/admin/page_app_index.html:10
-#: templates/admin/page_index.html:19
+#: .\templates\admin\index.html.py:19
+#: .\templates\admin\page_app_index.html.py:10
+#: .\templates\admin\page_index.html.py:19
 #, python-format
 msgid "%(name)s"
 msgstr "%(name)s"
 
-#: templates/admin/index.html:29 templates/admin/page_change_form.html:20
-#: templates/admin/page_index.html:29
+#: .\templates\admin\index.html.py:29
+#: .\templates\admin\page_change_form.html.py:20
+#: .\templates\admin\page_index.html.py:29
 msgid "Add"
 msgstr "Ajouter"
 
-#: templates/admin/index.html:35 templates/admin/page_index.html:35
+#: .\templates\admin\index.html.py:35 .\templates\admin\page_index.html.py:35
 msgid "Change"
 msgstr "modifié par"
 
-#: templates/admin/index.html:64 templates/admin/page_index.html:45
+#: .\templates\admin\index.html.py:64 .\templates\admin\page_index.html.py:45
 msgid "You don't have permission to edit anything."
 msgstr "Vous n'avez pas l'autorisation d'édition."
 
-#: templates/admin/index.html:72 templates/admin/page_index.html:53
+#: .\templates\admin\index.html.py:72 .\templates\admin\page_index.html.py:53
 msgid "Recent Actions"
 msgstr "Actions récentes"
 
-#: templates/admin/index.html:73 templates/admin/page_index.html:54
+#: .\templates\admin\index.html.py:73 .\templates\admin\page_index.html.py:54
 msgid "My Actions"
 msgstr "Mes actions"
 
-#: templates/admin/index.html:77 templates/admin/page_index.html:58
+#: .\templates\admin\index.html.py:77 .\templates\admin\page_index.html.py:58
 msgid "None available"
 msgstr "Aucune disponible"
 
-#: templates/admin/index.html:91 templates/admin/page_index.html:72
+#: .\templates\admin\index.html.py:91 .\templates\admin\page_index.html.py:72
 msgid "Unknown content"
 msgstr "Contenu inconnu"
 
-#: templates/admin/page_base.html:20 templates/admin/page_index.html:11
+#: .\templates\admin\page_base.html.py:20
+#: .\templates\admin\page_index.html.py:11
 msgid "Pages"
 msgstr "Pages"
 
-#: templates/admin/page_base_site.html:7
+#: .\templates\admin\page_base_site.html.py:7
 msgid "Django administration"
 msgstr "Administration de Django"
 
-#: templates/admin/page_login.html:8
+#: .\templates\admin\page_login.html.py:8
 msgid "Connexion"
 msgstr "Connexion"
 
-#: templates/admin/page_login.html:20
+#: .\templates\admin\page_login.html.py:20
 msgid "Username:"
 msgstr "Nom de utilisateur :"
 
-#: templates/admin/page_login.html:24
+#: .\templates\admin\page_login.html.py:24
 msgid "Password:"
 msgstr "Mot de passe :"
 
-#: templates/admin/page_login.html:29
-#: user/templates/registration/login.html:39
+#: .\templates\admin\page_login.html.py:29
+#: .\user\templates\registration\login.html.py:39
 msgid "Create an account"
 msgstr "Créer un compte"
 
-#: templates/admin/page_login.html:30
-#: user/templates/registration/login.html:40
+#: .\templates\admin\page_login.html.py:30
+#: .\user\templates\registration\login.html.py:40
 msgid "Forget password?"
 msgstr "mot de pass oublié ?"
 
-#: templates/cms/admin/cms/page/change_form.html:11
+#: .\templates\cms\admin\cms\page\change_form.html.py:11
 msgid "Documentation"
 msgstr "Documentation"
 
-#: templates/cms/admin/cms/page/change_form.html:11
+#: .\templates\cms\admin\cms\page\change_form.html.py:11
 msgid "Change password"
 msgstr "Modifier le mot de passe"
 
-#: templates/cms/admin/cms/page/change_form.html:42
+#: .\templates\cms\admin\cms\page\change_form.html.py:42
 msgid "Ordering"
 msgstr "Ordre"
 
-#: templates/cms/admin/cms/page/change_form.html:45
+#: .\templates\cms\admin\cms\page\change_form.html.py:45
 msgid "Order:"
 msgstr "Ordre :"
 
-#: templates/ldt/ldt_base.html:86
+#: .\templates\ldt\ldt_base.html.py:86
 msgid "header_title"
 msgstr "Plateforme&nbsp;Ldt"
 
-#: templates/ldt/ldt_base.html:90
+#: .\templates\ldt\ldt_base.html.py:90
 msgid "Link to admin"
 msgstr "Administration"
 
-#: templates/ldt/ldt_base.html:90
+#: .\templates\ldt\ldt_base.html.py:90
 msgid "Staff"
 msgstr "admin"
 
-#: templates/ldt/ldt_base.html:93
+#: .\templates\ldt\ldt_base.html.py:93
 msgid "front link"
 msgstr "front"
 
-#: templates/ldt/ldt_base.html:94
-#: user/templates/ldt/user/change_profile.html:95
+#: .\templates\ldt\ldt_base.html.py:94
+#: .\user\templates\ldt\user\change_profile.html.py:95
 msgid "Profile change"
 msgstr "Modification du profil"
 
-#: templates/ldt/ldt_base.html:114 templates/ldt/ldt_base.html.py:115
+#: .\templates\ldt\ldt_base.html.py:114 .\templates\ldt\ldt_base.html.py:115
 msgid "home"
 msgstr "accueil"
 
-#: templates/ldt/ldt_base.html:148
+#: .\templates\ldt\ldt_base.html.py:148
 msgid "Version number"
 msgstr "Numéro de version"
 
-#: templates/ldt/ldt_base.html:148
+#: .\templates\ldt\ldt_base.html.py:148
 #, python-format
 msgid " web %(WEB_VERSION)s | platform %(VERSION)s"
 msgstr "web v%(WEB_VERSION)s | platform v%(VERSION)s "
 
-#: templates/ldt/ldt_raw_base.html:14
+#: .\templates\ldt\ldt_raw_base.html.py:14
 msgid "page_title"
 msgstr "Plateforme Ldt"
 
-#: text/models.py:14
+#: .\text\models.py:14
 msgid "annotation.external_id"
 msgstr "id externe"
 
-#: text/models.py:15
+#: .\text\models.py:15
 msgid "annotation.uri"
 msgstr "uri"
 
-#: text/models.py:16
+#: .\text\models.py:16
 msgid "annotation.tags"
 msgstr "tags"
 
-#: text/models.py:17
+#: .\text\models.py:17
 msgid "annotation.title"
 msgstr "titre"
 
-#: text/models.py:18
+#: .\text\models.py:18
 msgid "annotation.description"
 msgstr "description"
 
-#: text/models.py:19
+#: .\text\models.py:19
 msgid "annotation.text"
 msgstr "texte d'annotation"
 
-#: text/models.py:20
+#: .\text\models.py:20
 msgid "annotation.color"
 msgstr "couleur d'annotation"
 
-#: text/models.py:21
+#: .\text\models.py:21
 msgid "creator.title"
 msgstr "titre"
 
-#: text/models.py:22
+#: .\text\models.py:22
 msgid "contributor.title"
 msgstr "titre"
 
-#: text/models.py:23
+#: .\text\models.py:23
 msgid "annotation.creation_date"
 msgstr "date de création"
 
-#: text/models.py:24
+#: .\text\models.py:24
 msgid "annotation.update_date"
 msgstr "Date de maj"
 
-#: user/admin.py:34
+#: .\user\admin.py:34
 msgid "User details"
 msgstr "Détail utilisateur"
 
-#: user/admin.py:35
+#: .\user\admin.py:35
 msgid "Groups"
 msgstr "Groupes"
 
-#: user/admin.py:36
+#: .\user\admin.py:36
 msgid "Permissions"
 msgstr "Permissions"
 
-#: user/admin.py:47 user/templates/ldt/user/change_profile.html:105
-#: user/templates/ldt/user/login_form.html:61
+#: .\user\admin.py:47 .\user\templates\ldt\user\change_profile.html.py:105
+#: .\user\templates\ldt\user\login_form.html.py:61
 msgid "Password"
 msgstr "Mot de passe"
 
-#: user/forms.py:27 user/templates/ldt/user/change_password.html:40
-#: user/templates/ldt/user/change_profile.html:118
+#: .\user\forms.py:27 .\user\templates\ldt\user\change_password.html.py:40
+#: .\user\templates\ldt\user\change_profile.html.py:118
 msgid "New password"
 msgstr "Nouveau mot de passe"
 
-#: user/forms.py:29 user/templates/ldt/user/change_password.html:50
-#: user/templates/ldt/user/change_profile.html:131
+#: .\user\forms.py:29 .\user\templates\ldt\user\change_password.html.py:50
+#: .\user\templates\ldt\user\change_profile.html.py:131
 msgid "New password confirmation"
 msgstr "Confirmation du nouveau mot de passe"
 
-#: user/forms.py:58 user/forms.py:59
+#: .\user\forms.py:58 .\user\forms.py:59
 msgid "E-mail"
 msgstr "E-mail"
 
-#: user/forms.py:70
+#: .\user\forms.py:70
 msgid "The two emails didn't match."
 msgstr "les deux emails ne correspondent pas"
 
-#: user/forms.py:81 user/templates/ldt/user/change_profile.html:54
+#: .\user\forms.py:81 .\user\templates\ldt\user\change_profile.html.py:54
 msgid "First name"
 msgstr "Prénom"
 
-#: user/forms.py:82
+#: .\user\forms.py:82
 msgid "Last name"
 msgstr "Nom"
 
-#: user/forms.py:109 user/templates/ldt/user/change_profile.html:83
+#: .\user\forms.py:109 .\user\templates\ldt\user\change_profile.html.py:83
 msgid "Language"
 msgstr "Langue"
 
-#: user/forms.py:123
+#: .\user\forms.py:123
 msgid "Profile picture"
 msgstr "Image de profil"
 
-#: user/forms.py:134
+#: .\user\forms.py:134
 #, python-format
 msgid "Image size is limited to %s"
 msgstr "La taille de l'image est limitée à %s"
 
-#: user/views.py:28
+#: .\user\views.py:28
 msgid "Your profile has been updated."
 msgstr "Votre profil a été modifié"
 
-#: user/views.py:52
+#: .\user\views.py:52
 msgid "Your password has been updated."
-msgstr "Votre mot de passe a été changeé."
+msgstr "Votre mot de passe a été changé."
 
-#: user/views.py:76
+#: .\user\views.py:76
 msgid "Your profile picture has been updated."
 msgstr "Votre image de profil a été modifiée"
 
-#: user/views.py:98 user/templates/registration/login.html:24
+#: .\user\views.py:98 .\user\templates\registration\login.html.py:24
 msgid "Sorry, that's not a valid username or password."
 msgstr "Saisissez un nom d'utilisateur et un mot de passe valide."
 
-#: user/templates/ldt/user/change_password.html:31
+#: .\user\templates\ldt\user\change_password.html.py:31
 msgid "Old password"
 msgstr "Ancien mot de passe"
 
-#: user/templates/ldt/user/change_password.html:44
+#: .\user\templates\ldt\user\change_password.html.py:44
 msgid "passwords don't match"
 msgstr "les mots de passe ne correspondent pas"
 
-#: user/templates/ldt/user/change_password.html:57
-#: user/templates/ldt/user/change_profile.html:144
-#: user/templates/registration/password_change_form.html:14
-#: user/templates/registration/password_change_form.html:17
+#: .\user\templates\ldt\user\change_password.html.py:57
+#: .\user\templates\ldt\user\change_profile.html.py:144
+#: .\user\templates\registration\password_change_form.html.py:14
+#: .\user\templates\registration\password_change_form.html.py:17
 msgid "Password change"
 msgstr "Modification du mot de passe"
 
-#: user/templates/ldt/user/change_password.html:61
+#: .\user\templates\ldt\user\change_password.html.py:61
 msgid "Your new password has been saved."
 msgstr "Votre mot de passe a été changé."
 
-#: user/templates/ldt/user/change_profile.html:19
+#: .\user\templates\ldt\user\change_profile.html.py:19
 msgid "Invalid extension ! Your file has to be JPG, JPEG or PNG."
 msgstr "extension invalide ! votre fichier doit être JPG, JPEG ou PNG"
 
-#: user/templates/ldt/user/change_profile.html:43
+#: .\user\templates\ldt\user\change_profile.html.py:43
 msgid "Username"
 msgstr "Nom"
 
-#: user/templates/ldt/user/change_profile.html:70
+#: .\user\templates\ldt\user\change_profile.html.py:70
 msgid "Email"
 msgstr "E-mail"
 
-#: user/templates/ldt/user/change_profile.html:175
+#: .\user\templates\ldt\user\change_profile.html.py:175
 msgid "Profile picture change"
 msgstr "Modification de l'image de profil"
 
-#: user/templates/ldt/user/login_form.html:32
-#: user/templates/registration/password_change_done.html:7
-#: user/templates/registration/password_change_form.html:13
+#: .\user\templates\ldt\user\login_form.html.py:32
+#: .\user\templates\registration\password_change_done.html.py:7
+#: .\user\templates\registration\password_change_form.html.py:13
 msgid "Profiles"
 msgstr "Les profils"
 
-#: user/templates/ldt/user/login_form.html:50
+#: .\user\templates\ldt\user\login_form.html.py:50
 msgid "create account"
 msgstr "Créer un compte"
 
-#: user/templates/ldt/user/login_form.html:54
+#: .\user\templates\ldt\user\login_form.html.py:54
 msgid "Pseudo"
 msgstr "Pseudo"
 
-#: user/templates/ldt/user/login_form.html:57
-#: user/templates/ldt/user/login_form.html:64
+#: .\user\templates\ldt\user\login_form.html.py:57
+#: .\user\templates\ldt\user\login_form.html.py:64
 msgid "this field is compulsory"
 msgstr "Ce champs est obligatoire"
 
-#: user/templates/ldt/user/login_form.html:68
+#: .\user\templates\ldt\user\login_form.html.py:68
 msgid "reset password"
 msgstr "Réinitialiser le mot de passe"
 
-#: user/templates/ldt/user/login_form.html:71
+#: .\user\templates\ldt\user\login_form.html.py:71
 msgid "Connection"
 msgstr "Connexion"
 
-#: user/templates/registration/activate.html:6
-#: user/templates/registration/activate.html:9
+#: .\user\templates\registration\activate.html.py:6
+#: .\user\templates\registration\activate.html.py:9
 msgid "Activate account"
 msgstr "Activer le compte"
 
-#: user/templates/registration/activate.html:12
+#: .\user\templates\registration\activate.html.py:12
 msgid "You have activated your account"
 msgstr "Vous avez bien activé votre compte."
 
-#: user/templates/registration/activate.html:13
+#: .\user\templates\registration\activate.html.py:13
 msgid "Go back to login page"
 msgstr "Retourner à la page de connexion"
 
-#: user/templates/registration/activation_complete.html:4
-#: user/templates/registration/registration_complete.html:8
+#: .\user\templates\registration\activation_complete.html.py:4
+#: .\user\templates\registration\registration_complete.html.py:8
 msgid "Sign up successfully"
 msgstr "Création de compte avec succès"
 
-#: user/templates/registration/activation_complete.html:6
+#: .\user\templates\registration\activation_complete.html.py:6
 msgid "activation completed"
 msgstr "Activation terminée"
 
-#: user/templates/registration/logged_out.html:8
+#: .\user\templates\registration\logged_out.html.py:8
 msgid "Thanks for spending some quality time with the Web site today."
 msgstr "Merci de votre visite."
 
-#: user/templates/registration/logged_out.html:10
+#: .\user\templates\registration\logged_out.html.py:10
 msgid "Log in again"
 msgstr "Se reconnecter"
 
-#: user/templates/registration/login.html:46
+#: .\user\templates\registration\login.html.py:46
 msgid "login"
 msgstr "Connexion"
 
-#: user/templates/registration/password_change_done.html:3
-#: user/templates/registration/password_change_done.html:11
+#: .\user\templates\registration\password_change_done.html.py:3
+#: .\user\templates\registration\password_change_done.html.py:11
 msgid "password change successful"
 msgstr "Changement de mot de passe réussi"
 
-#: user/templates/registration/password_change_done.html:8
+#: .\user\templates\registration\password_change_done.html.py:8
 msgid "password change"
 msgstr "Changement de mot de passe"
 
-#: user/templates/registration/password_change_done.html:14
+#: .\user\templates\registration\password_change_done.html.py:14
 msgid "Your password has been changed."
 msgstr "Votre mot de passe a été changé."
 
-#: user/templates/registration/password_change_done.html:15
+#: .\user\templates\registration\password_change_done.html.py:15
 msgid "Go back to profiles"
 msgstr "Retourner à la page de mon profil"
 
-#: user/templates/registration/password_change_form.html:20
+#: .\user\templates\registration\password_change_form.html.py:20
 msgid ""
 "Please enter your old password, for security's sake, and then enter your new "
 "password twice so we can verify you typed it in correctly."
@@ -1554,56 +1582,56 @@
 "Par sécurité, veuillez enter votre ancien mot de passe puis le nouveau a "
 "deux reprise afin de savoir si vous l'avez taper correctement "
 
-#: user/templates/registration/password_change_form.html:26
+#: .\user\templates\registration\password_change_form.html.py:26
 msgid "Old password:"
 msgstr "Ancien mot de passe :"
 
-#: user/templates/registration/password_change_form.html:32
-#: user/templates/registration/password_reset_confirm.html:19
+#: .\user\templates\registration\password_change_form.html.py:32
+#: .\user\templates\registration\password_reset_confirm.html.py:19
 msgid "New password:"
 msgstr "Nouveau mot de passe :"
 
-#: user/templates/registration/password_change_form.html:38
-#: user/templates/registration/password_reset_confirm.html:21
+#: .\user\templates\registration\password_change_form.html.py:38
+#: .\user\templates\registration\password_reset_confirm.html.py:21
 msgid "Confirm password:"
 msgstr "Confirmer le mot de passe :"
 
-#: user/templates/registration/password_change_form.html:44
-#: user/templates/registration/password_reset_confirm.html:22
+#: .\user\templates\registration\password_change_form.html.py:44
+#: .\user\templates\registration\password_reset_confirm.html.py:22
 msgid "Change my password"
 msgstr "Modifier mon mot de passe"
 
-#: user/templates/registration/password_reset_complete.html:6
-#: user/templates/registration/password_reset_confirm.html:6
-#: user/templates/registration/password_reset_confirm.html:9
-#: user/templates/registration/password_reset_done.html:6
-#: user/templates/registration/password_reset_form.html:13
-#: user/templates/registration/password_reset_form.html:15
-#: user/templates/registration/password_reset_form.html:18
+#: .\user\templates\registration\password_reset_complete.html.py:6
+#: .\user\templates\registration\password_reset_confirm.html.py:6
+#: .\user\templates\registration\password_reset_confirm.html.py:9
+#: .\user\templates\registration\password_reset_done.html.py:6
+#: .\user\templates\registration\password_reset_form.html.py:13
+#: .\user\templates\registration\password_reset_form.html.py:15
+#: .\user\templates\registration\password_reset_form.html.py:18
 msgid "Password reset"
 msgstr "Réinitialiser le mot de passe"
 
-#: user/templates/registration/password_reset_complete.html:9
+#: .\user\templates\registration\password_reset_complete.html.py:9
 msgid "Password reset complete"
 msgstr "Réinitialisation du mot de passe terminée"
 
-#: user/templates/registration/password_reset_complete.html:12
+#: .\user\templates\registration\password_reset_complete.html.py:12
 msgid "Your password has been set.  You may go ahead and log in now."
 msgstr ""
 "Votre mot de passe a été défini. vous pouvez vous connecter maintenant."
 
-#: user/templates/registration/password_reset_confirm.html:15
+#: .\user\templates\registration\password_reset_confirm.html.py:15
 msgid ""
 "Please enter your new password twice so we can verify you typed it in "
 "correctly."
 msgstr ""
 "veuillez enter votre nouveau mot de pass deux fois afin de le vérifier."
 
-#: user/templates/registration/password_reset_confirm.html:27
+#: .\user\templates\registration\password_reset_confirm.html.py:27
 msgid "Password reset unsuccessful"
 msgstr "Reinitialisation du mot de pass a échoué"
 
-#: user/templates/registration/password_reset_confirm.html:29
+#: .\user\templates\registration\password_reset_confirm.html.py:29
 msgid ""
 "The password reset link was invalid, possibly because it has already been "
 "used.  Please request a new password reset."
@@ -1611,11 +1639,11 @@
 "Le lien de réinitialisation du mot de passe n'est pas valide, certainement "
 "car il a déjà été utilisé. veuiller demander une nouvelle réinitialisation."
 
-#: user/templates/registration/password_reset_done.html:8
+#: .\user\templates\registration\password_reset_done.html.py:8
 msgid "Password reset successful"
 msgstr "Réinitialisation du mot de passe réussie"
 
-#: user/templates/registration/password_reset_done.html:12
+#: .\user\templates\registration\password_reset_done.html.py:12
 msgid ""
 "We've e-mailed you instructions for setting your password to the e-mail "
 "address you submitted. You should be receiving it shortly."
@@ -1624,36 +1652,36 @@
 "passe à l'adresse email que vous nous avez fournie. vous devriez les "
 "recevoir bientôt."
 
-#: user/templates/registration/password_reset_email.html:2
+#: .\user\templates\registration\password_reset_email.html.py:2
 msgid "You're receiving this e-mail because you requested a password reset"
 msgstr ""
 "Vous recevez ce mail car vous avez demander la réinitialisation du mot de "
 "passe"
 
-#: user/templates/registration/password_reset_email.html:3
+#: .\user\templates\registration\password_reset_email.html.py:3
 #, python-format
 msgid "for your user account at %(site_name)s"
 msgstr "Pour votre compte sur le site %(site_name)s"
 
-#: user/templates/registration/password_reset_email.html:5
+#: .\user\templates\registration\password_reset_email.html.py:5
 msgid "Please go to the following page and choose a new password:"
 msgstr ""
 "veuillez aller à la page suivante et choisissez un nouveau mot de passe :"
 
-#: user/templates/registration/password_reset_email.html:9
+#: .\user\templates\registration\password_reset_email.html.py:9
 msgid "Your username, in case you've forgotten:"
 msgstr "Pour rappel votre nom d'autilisateur :"
 
-#: user/templates/registration/password_reset_email.html:11
+#: .\user\templates\registration\password_reset_email.html.py:11
 msgid "Thanks for using our site!"
 msgstr "Merci de votre visite."
 
-#: user/templates/registration/password_reset_email.html:13
+#: .\user\templates\registration\password_reset_email.html.py:13
 #, python-format
 msgid "The %(site_name)s team"
 msgstr "L'équipe du site %(site_name)s"
 
-#: user/templates/registration/password_reset_form.html:22
+#: .\user\templates\registration\password_reset_form.html.py:22
 msgid ""
 "Forgotten your password? Enter your e-mail address below, and we'll e-mail "
 "instructions for setting a new one."
@@ -1661,37 +1689,40 @@
 "Mot de passe oublié ? Entrez votre adresse email ci-dessous pour recevoir "
 "les instructions pour en entrer un nouveau."
 
-#: user/templates/registration/password_reset_form.html:27
-msgid "Adresse émail"
+#: .\user\templates\registration\password_reset_form.html.py:27
+#, fuzzy
+msgid "Adresse émail"
 msgstr "Adresse émail"
 
-#: user/templates/registration/password_reset_form.html:32
+#: .\user\templates\registration\password_reset_form.html.py:32
 msgid "Reset my password"
 msgstr "Reinitialiser mon mot de passe"
 
-#: user/templates/registration/registration_active.html:5
-#: user/templates/registration/registration_active.html:7
+#: .\user\templates\registration\registration_active.html.py:5
+#: .\user\templates\registration\registration_active.html.py:7
 msgid "Activate the account"
 msgstr "Activer le compte"
 
-#: user/templates/registration/registration_active.html:9
+#: .\user\templates\registration\registration_active.html.py:9
+#, fuzzy
 msgid ""
-"Vous avez bien activé votre compte, vous pouvez accedez à votre espace "
+"Vous avez bien activé votre compte, vous pouvez accedez à votre espace "
 "personnel."
 msgstr ""
 "Vous avez bien activé votre compte, vous pouvez accedez à votre espace "
 "personnel."
 
-#: user/templates/registration/registration_active.html:10
-msgid "retourner à la page de connexion"
+#: .\user\templates\registration\registration_active.html.py:10
+#, fuzzy
+msgid "retourner à la page de connexion"
 msgstr "retourner à la page de connexion"
 
-#: user/templates/registration/registration_complete.html:6
-#: user/templates/registration/registration_form.html:11
+#: .\user\templates\registration\registration_complete.html.py:6
+#: .\user\templates\registration\registration_form.html.py:11
 msgid "Sign up"
 msgstr "Création d'un compte"
 
-#: user/templates/registration/registration_complete.html:10
+#: .\user\templates\registration\registration_complete.html.py:10
 msgid ""
 "We've e-mailed you instructions for activate your account to the e-mail "
 "address you submitted. You should be receiving it shortly."
--- a/src/ldt/ldt/settings.py	Fri Oct 19 16:08:42 2012 +0200
+++ b/src/ldt/ldt/settings.py	Fri Oct 19 16:10:22 2012 +0200
@@ -30,11 +30,11 @@
     'ldt.indexation',
     'oauth_provider',
     'django_openid_consumer',
-    'piston',
     'social_auth',
     'south',
     'guardian',
     'sorl.thumbnail',
+    'tastypie',
 )
 
 MIDDLEWARE_CLASSES = (
@@ -49,7 +49,6 @@
     'django.contrib.messages.middleware.MessageMiddleware',
     'django_openid_consumer.middleware.OpenIDMiddleware',
     'ldt.ldt_utils.middleware.userprofile.LanguageMiddleware',
-    'ldt.api.middleware.pistonput.PistonPutMiddleware',
 )
 
 
Binary file src/ldt/ldt/static/ldt/img/403_gandalf.gif has changed
Binary file src/ldt/ldt/static/ldt/img/404_gandalf.gif has changed
--- a/src/ldt/ldt/static/ldt/metadataplayer/AnnotationsList.js	Fri Oct 19 16:08:42 2012 +0200
+++ b/src/ldt/ldt/static/ldt/metadataplayer/AnnotationsList.js	Fri Oct 19 16:10:22 2012 +0200
@@ -223,8 +223,15 @@
                 audio : (_this.show_audio && _annotation.audio && _annotation.audio.href && _annotation.audio.href != "null" ? _annotation.audio.href : undefined),
                 l10n: _this.l10n
             };
-            var _html = Mustache.to_html(_this.annotationTemplate, _data);
-            var _el = IriSP.jQuery(_html);
+            var _html = Mustache.to_html(_this.annotationTemplate, _data),
+                _el = IriSP.jQuery(_html),
+                _onselect = function() {
+                    _this.annotations_$.removeClass("selected");
+                    _el.addClass("selected");
+                },
+                _onunselect = function() {
+                    _this.annotations_$.removeClass("selected");
+                };
             _el.mouseover(function() {
                     _annotation.trigger("select");
                 })
@@ -232,13 +239,12 @@
                     _annotation.trigger("unselect");
                 })
                 .appendTo(_this.list_$);
-            _annotation.on("select", function() {
-                _this.annotations_$.removeClass("selected");
-                _el.addClass("selected");
+            _el.on("remove", function() {
+                _annotation.off("select", _onselect);
+                _annotation.off("unselect", _onunselect);
             });
-            _annotation.on("unselect", function() {
-                _this.annotations_$.removeClass("selected");
-            });;
+            _annotation.on("select", _onselect);
+            _annotation.on("unselect", _onunselect);
         });
         
         this.annotations_$ = this.$.find('.Ldt-AnnotationsList-li');
@@ -247,7 +253,7 @@
         this.$.find('.Ldt-AnnotationsList-Tag-Li').each(function() {
             var _el = IriSP.jQuery(this);
             if (!_el.text().replace(/(^\s+|\s+$)/g,'')) {
-                _el.detach();
+                _el.remove();
             }
         });
     
--- a/src/ldt/ldt/static/ldt/metadataplayer/Controller.js	Fri Oct 19 16:08:42 2012 +0200
+++ b/src/ldt/ldt/static/ldt/metadataplayer/Controller.js	Fri Oct 19 16:10:22 2012 +0200
@@ -157,9 +157,6 @@
         });
     
     this.timeDisplayUpdater(new IriSP.Model.Time(0));
-    /* some players - including jwplayer - save the state of the mute button between sessions */
-   //TODO: MOVE TO THE PLAYER/
-    window.setTimeout(this.functionWrapper("volumeUpdater"), 1000);
    
 };
 
@@ -201,11 +198,7 @@
 };
 
 IriSP.Widgets.Controller.prototype.muteHandler = function() {
-    if (this.media.getMuted()) {
-        this.media.unmute();
-    } else {
-        this.media.mute();
-    }
+    this.media.setMuted(!this.media.getMuted());
 };
 
 IriSP.Widgets.Controller.prototype.volumeUpdater = function() {
--- a/src/ldt/ldt/static/ldt/metadataplayer/CreateAnnotation.css	Fri Oct 19 16:08:42 2012 +0200
+++ b/src/ldt/ldt/static/ldt/metadataplayer/CreateAnnotation.css	Fri Oct 19 16:10:22 2012 +0200
@@ -34,6 +34,11 @@
     border-radius: 2px;
 }
 
+.Ldt-CreateAnnotation-Title.empty, .Ldt-CreateAnnotation-Creator.empty {
+    font-style: italic;
+    color: #90b0d0;
+}
+
 .Ldt-CreateAnnotation-Times {
     color: #ff3b77
 }
@@ -67,6 +72,10 @@
     border-radius: 2px;
 }
 
+.Ldt-CreateAnnotation-Description.empty {
+    font-style: italic; color: #999999;
+}
+
 .Ldt-CreateAnnotation-Avatar {
     float: right;
     width: 48px;
--- a/src/ldt/ldt/static/ldt/metadataplayer/CreateAnnotation.js	Fri Oct 19 16:08:42 2012 +0200
+++ b/src/ldt/ldt/static/ldt/metadataplayer/CreateAnnotation.js	Fri Oct 19 16:10:22 2012 +0200
@@ -7,7 +7,7 @@
 IriSP.Widgets.CreateAnnotation.prototype = new IriSP.Widgets.Widget();
 
 IriSP.Widgets.CreateAnnotation.prototype.defaults = {
-    show_title_field : false, /* For the moment, titles can't be sent to ldtplatform */
+    show_title_field : true,
     show_creator_field : true,
     start_visible : true,
     always_visible : false,
@@ -106,12 +106,12 @@
     + '{{^show_slice}}{{#show_arrow}}<div class="Ldt-CreateAnnotation-Arrow"></div>{{/show_arrow}}{{/show_slice}}'
     + '<div class="Ldt-CreateAnnotation"><div class="Ldt-CreateAnnotation-Inner">'
     + '<form class="Ldt-CreateAnnotation-Screen Ldt-CreateAnnotation-Main">'
-    + '<h3><span class="Ldt-CreateAnnotation-h3Left">{{#show_title_field}}<input class="Ldt-CreateAnnotation-Title" placeholder="{{l10n.type_title}}" />{{/show_title_field}}'
+    + '<h3><span class="Ldt-CreateAnnotation-h3Left">{{#show_title_field}}<input class="Ldt-CreateAnnotation-Title empty" placeholder="{{l10n.type_title}}" />{{/show_title_field}}'
     + '{{^show_title_field}}<span class="Ldt-CreateAnnotation-NoTitle">{{l10n.no_title}} </span>{{/show_title_field}}'
-    + ' <span class="Ldt-CreateAnnotation-Times">{{#show_slice}}{{l10n.from_time}} {{/show_slice}}{{^show_slice}}{{l10n.at_time}} {{/show_slice}} <span class="Ldt-CreateAnnotation-Begin">00:00</span>'
+    + '<span class="Ldt-CreateAnnotation-Times"> {{#show_slice}}{{l10n.from_time}} {{/show_slice}}{{^show_slice}}{{l10n.at_time}} {{/show_slice}} <span class="Ldt-CreateAnnotation-Begin">00:00</span>'
     + '{{#show_slice}} {{l10n.to_time}} <span class="Ldt-CreateAnnotation-End">{{end}}</span>{{/show_slice}}</span></span>'
-    + '{{#show_creator_field}}{{l10n.your_name_}} <input class="Ldt-CreateAnnotation-Creator" value="{{creator_name}}" /></h3>{{/show_creator_field}}'
-    + '<textarea class="Ldt-CreateAnnotation-Description" placeholder="{{l10n.type_description}}"></textarea>'
+    + '{{#show_creator_field}}{{l10n.your_name_}} <input class="Ldt-CreateAnnotation-Creator empty" value="{{creator_name}}" /></h3>{{/show_creator_field}}'
+    + '<textarea class="Ldt-CreateAnnotation-Description empty" placeholder="{{l10n.type_description}}"></textarea>'
     + '<div class="Ldt-CreateAnnotation-Avatar"><img src="{{creator_avatar}}" title="{{creator_name}}"></img></div>'
     + '<input type="submit" class="Ldt-CreateAnnotation-Submit" value="{{l10n.submit}}" />'
     + '{{#show_mic_record}}<div class="Ldt-CreateAnnotation-RecBlock"><div class="Ldt-CreateAnnotation-RecLabel">Add voice annotation</div>'
@@ -261,12 +261,15 @@
 IriSP.Widgets.CreateAnnotation.prototype.show = function() {
     this.visible = true;
     this.showScreen('Main');
-    this.$.find(".Ldt-CreateAnnotation-Description").val("").css("border-color", "#666666");
+    this.$.find(".Ldt-CreateAnnotation-Description").val("").css("border-color", "#666666").addClass("empty");
     if (this.show_title_field) {
-        this.$.find(".Ldt-CreateAnnotation-Title").val("").css("border-color", "#666666");
+        this.$.find(".Ldt-CreateAnnotation-Title").val("").css("border-color", "#666666").addClass("empty");
     }
     if (this.show_creator_field) {
         this.$.find(".Ldt-CreateAnnotation-Creator").val(this.creator_name).css("border-color", "#666666");
+        if (!this.creator_name) {
+            this.$.find(".Ldt-CreateAnnotation-Creator").addClass("empty");
+        }
     }
     this.$.find(".Ldt-CreateAnnotation-TagLi, .Ldt-CreateAnnotation-PolemicLi").removeClass("selected");
     this.$.slideDown();
@@ -320,6 +323,11 @@
     var _field = this.$.find(".Ldt-CreateAnnotation-Description"),
         _contents = _field.val();
     _field.css("border-color", !!_contents ? "#666666" : "#ff0000");
+    if (!!_contents) {
+        _field.removeClass("empty");
+    } else {
+        _field.addClass("empty");
+    }
     this.$.find(".Ldt-CreateAnnotation-TagLi, .Ldt-CreateAnnotation-PolemicLi").each(function() {
         var _rx = IriSP.Model.regexpFromTextOrArray(IriSP.jQuery(this).text().replace(/(^\s+|\s+$)/g,''));
         if (_contents.match(_rx)) {
@@ -336,6 +344,11 @@
     var _field = this.$.find(".Ldt-CreateAnnotation-Title"),
         _contents = _field.val();
     _field.css("border-color", !!_contents ? "#666666" : "#ff0000");
+    if (!!_contents) {
+        _field.removeClass("empty");
+    } else {
+        _field.addClass("empty");
+    }
     this.pauseOnWrite();
     return !!_contents;
 }
@@ -345,6 +358,11 @@
     var _field = this.$.find(".Ldt-CreateAnnotation-Creator"),
         _contents = _field.val();
     _field.css("border-color", !!_contents ? "#666666" : "#ff0000");
+    if (!!_contents) {
+        _field.removeClass("empty");
+    } else {
+        _field.addClass("empty");
+    }
     this.pauseOnWrite();
     return !!_contents;
 }
@@ -392,7 +410,6 @@
     _annotation.description = this.$.find(".Ldt-CreateAnnotation-Description").val(); /* Champ description */
     _annotation.setTags(this.$.find(".Ldt-CreateAnnotation-TagLi.selected")
         .map(function() { return IriSP.jQuery(this).attr("tag-id")})); /*Liste des ids de tags */
-    
     if (this.audio_url) {
         _annotation.audio = {
             src: "mic",
@@ -400,14 +417,11 @@
             href: this.audio_url
         };
     }
-    
-    /* Les données créateur/date de création sont envoyées non pas dans l'annotation, mais dans le projet */
     if (this.show_creator_field) {
-        _export.creator = this.$.find(".Ldt-CreateAnnotation-Creator").val();
+        _annotation.creator = this.$.find(".Ldt-CreateAnnotation-Creator").val();
     } else {
-        _export.creator = this.creator_name;
+        _annotation.creator = this.creator_name;
     }
-    _export.created = new Date();
     _exportedAnnotations.push(_annotation); /* Ajout de l'annotation à la liste à exporter */
     _export.addList("annotation",_exportedAnnotations); /* Ajout de la liste à exporter à l'objet Source */
     
@@ -425,7 +439,7 @@
                     function() {
                         _this.close_after_send
                         ? _this.hide()
-                        : _this.showScreen("Main");
+                        : _this.show();
                     },
                     _this.after_send_timeout
                 );
--- a/src/ldt/ldt/static/ldt/metadataplayer/JwpPlayer.js	Fri Oct 19 16:08:42 2012 +0200
+++ b/src/ldt/ldt/static/ldt/metadataplayer/JwpPlayer.js	Fri Oct 19 16:10:22 2012 +0200
@@ -48,46 +48,47 @@
         _pauseState = false;
         this.media.trigger("play");
     }
+
     // Binding functions to jwplayer
 
-    this.media.getCurrentTime = function() {
-        return new IriSP.Model.Time(1000*_player.getPosition() || 0);
-    }
-    this.media.getVolume = function() {
-        return _player.getVolume() / 100;
-    }
-    this.media.getPaused = function() {
-        return _pauseState;
-    }
-    this.media.getMuted = function() {
-        return _player.getMute();
-    }
-    this.media.setCurrentTime = function(_milliseconds) {
+    var _media = this.media;
+    
+    _media.on("setcurrenttime", function(_milliseconds) {
         _seekPause = _pauseState;
-        return _player.seek(_milliseconds / 1000);
-    }
-    this.media.setVolume = function(_vol) {
-        return _player.setVolume(Math.floor(_vol*100));
-    }
-    this.media.mute = function() {
-        return _player.setMute(true);
-    }
-    this.media.unmute = function() {
-        return _player.setMute(false);
-    }
-    this.media.play = function() {
-        return _player.play(true);
-    }
-    this.media.pause = function() {
-        return _player.pause(true);
-    }
+        _player.seek(_milliseconds / 1000);
+    });
+    
+    _media.on("setvolume", function(_vol) {
+        _player.setVolume(Math.floor(_vol*100));
+        _media.volume = _vol;
+    });
+    
+    _media.on("setmuted", function(_muted) {
+        _player.setMute(_muted);
+        _media.muted = _muted;
+    });
+    
+    _media.on("setplay", function() {
+        _player.play(true);
+        _media.paused = false;
+    });
+    
+    _media.on("setpause", function() {
+        _player.pause(true);
+        _media.paused = true;
+    });
     
     // Binding jwplater events to media
     
-    var _media = this.media;
+    function getVolume() {
+        _media.muted = _player.getMute();
+        _media.volume = _player.getVolume() / 100;
+    }
     
     _opts.events = {
         onReady: function() {
+            getVolume();
+            _media.currentTime = new IriSP.Model.Time(1000*_player.getPosition() || 0);
             _media.trigger("loadedmetadata");
         },
         onTime: function(_progress) {
@@ -114,6 +115,14 @@
         },
         onSeek: function() {
             _media.trigger("seeked");
+        },
+        onMute: function(_event) {
+            _media.muted = _event.mute;
+            _media.trigger("volumechange");
+        },
+        onVolume: function(_event) {
+            _media.volume = _event.volume / 100;
+            _media.trigger("volumechange");
         }
     }
     _player.setup(_opts);
--- a/src/ldt/ldt/static/ldt/metadataplayer/LdtPlayer-core.js	Fri Oct 19 16:08:42 2012 +0200
+++ b/src/ldt/ldt/static/ldt/metadataplayer/LdtPlayer-core.js	Fri Oct 19 16:10:22 2012 +0200
@@ -124,12 +124,12 @@
 }
 
 IriSP.Metadataplayer.prototype.loadMetadata = function(_metadataInfo) {
+    if (_metadataInfo.elementType === "source") {
+        return _metadataInfo;
+    }
     if (typeof _metadataInfo.serializer === "undefined" && typeof _metadataInfo.format !== "undefined") {
         _metadataInfo.serializer = IriSP.serializers[_metadataInfo.format];
     }
-    if (typeof _metadataInfo.url === "undefined" && typeof _metadataInfo.src !== "undefined") {
-        _metadataInfo.url = _metadataInfo.src;
-    }
     if (typeof _metadataInfo.url !== "undefined" && typeof _metadataInfo.serializer !== "undefined") {
         return this.sourceManager.remoteSource(_metadataInfo);
     } else {
@@ -235,8 +235,9 @@
 /* TODO: Separate Project-specific data from Source */
 
 /* model.js is where data is stored in a standard form, whatever the serializer */
+IriSP.Model = (function (ns) {
 
-IriSP.Model = {
+var Model = {
     _SOURCE_STATUS_EMPTY : 0,
     _SOURCE_STATUS_WAITING : 1,
     _SOURCE_STATUS_READY : 2,
@@ -262,20 +263,25 @@
         }
         return "autoid-" + this._ID_BASE + '-' + _n;
     },
-    regexpFromTextOrArray : function(_textOrArray, _testOnly) {
-        var _testOnly = _testOnly || false;
+    regexpFromTextOrArray : function(_textOrArray, _testOnly, _iexact) {
+        var _testOnly = _testOnly || false,
+            _iexact = _iexact || false;
         function escapeText(_text) {
             return _text.replace(/([\\\*\+\?\|\{\[\}\]\(\)\^\$\.\#\/])/gm, '\\$1');
         }
         var _source = 
             typeof _textOrArray === "string"
             ? escapeText(_textOrArray)
-            : IriSP._(_textOrArray).map(escapeText).join("|");
-        if (_testOnly) {
-            return new RegExp( _source, 'im');
-        } else {
-            return new RegExp( '(' + _source + ')', 'gim');
+            : ns._(_textOrArray).map(escapeText).join("|"),
+            _flags = 'im';
+        if (!_testOnly) {
+            _source = '(' + _source + ')';
+            _flags += 'g';
         }
+        if (_iexact) {
+            _source = '^' + _source + '$';
+        }
+        return new RegExp( _source, _flags);
     },
     isoToDate : function(_str) {
         // http://delete.me.uk/2005/03/iso8601.html
@@ -314,83 +320,83 @@
 }
 
 /*
- * IriSP.Model.List is a class for a list of elements (e.g. annotations, medias, etc. that each have a distinct ID)
+ * Model.List is a class for a list of elements (e.g. annotations, medias, etc. that each have a distinct ID)
  */
-IriSP.Model.List = function(_directory) {
+Model.List = function(_directory) {
     Array.call(this);
     this.directory = _directory;
     this.idIndex = [];
     this.__events = {};
     if (typeof _directory == "undefined") {
         console.trace();
-        throw "Error : new IriSP.Model.List(directory): directory is undefined";
+        throw "Error : new Model.List(directory): directory is undefined";
     }
 }
 
-IriSP.Model.List.prototype = new Array();
+Model.List.prototype = new Array();
 
-IriSP.Model.List.prototype.hasId = function(_id) {
-    return IriSP._(this.idIndex).include(_id);
+Model.List.prototype.hasId = function(_id) {
+    return ns._(this.idIndex).include(_id);
 }
 
 /* On recent browsers, forEach and map are defined and do what we want.
  * Otherwise, we'll use the Underscore.js functions
  */
 if (typeof Array.prototype.forEach === "undefined") {
-    IriSP.Model.List.prototype.forEach = function(_callback) {
+    Model.List.prototype.forEach = function(_callback) {
         var _this = this;
-        IriSP._(this).forEach(function(_value, _key) {
+        ns._(this).forEach(function(_value, _key) {
             _callback(_value, _key, _this);
         });
     }
 }
 
 if (typeof Array.prototype.map === "undefined") {
-    IriSP.Model.List.prototype.map = function(_callback) {
+    Model.List.prototype.map = function(_callback) {
         var _this = this;
-        return IriSP._(this).map(function(_value, _key) {
+        return ns._(this).map(function(_value, _key) {
             return _callback(_value, _key, _this);
         });
     }
 }
 
-IriSP.Model.List.prototype.pluck = function(_key) {
+Model.List.prototype.pluck = function(_key) {
     return this.map(function(_value) {
         return _value[_key];
     });
 }
 
-/* We override Array's filter function because it doesn't return an IriSP.Model.List
+/* We override Array's filter function because it doesn't return an Model.List
  */
-IriSP.Model.List.prototype.filter = function(_callback) {
+Model.List.prototype.filter = function(_callback) {
     var _this = this,
-        _res = new IriSP.Model.List(this.directory);
-    _res.addElements(IriSP._(this).filter(function(_value, _key) {
+        _res = new Model.List(this.directory);
+    _res.addElements(ns._(this).filter(function(_value, _key) {
         return _callback(_value, _key, _this);
     }));
     return _res;
 }
 
-IriSP.Model.List.prototype.slice = function(_start, _end) {
-    var _res = new IriSP.Model.List(this.directory);
+Model.List.prototype.slice = function(_start, _end) {
+    var _res = new Model.List(this.directory);
     _res.addElements(Array.prototype.slice.call(this, _start, _end));
     return _res;
 }
 
-IriSP.Model.List.prototype.splice = function(_start, _end) {
-    var _res = new IriSP.Model.List(this.directory);
+Model.List.prototype.splice = function(_start, _end) {
+    var _res = new Model.List(this.directory);
     _res.addElements(Array.prototype.splice.call(this, _start, _end));
     this.idIndex.splice(_start, _end);
     return _res;
 }
 
 /* Array has a sort function, but it's not as interesting as Underscore.js's sortBy
- * and won't return a new IriSP.Model.List
+ * and won't return a new Model.List
  */
-IriSP.Model.List.prototype.sortBy = function(_callback) {
+Model.List.prototype.sortBy = function(_callback) {
     var _this = this,
-        _res = new IriSP.Model.List(this.directory);
-    _res.addElements(IriSP._(this).sortBy(function(_value, _key) {
+        _res = new Model.List(this.directory);
+    _res.addElements(ns._(this).sortBy(function(_value, _key) {
         return _callback(_value, _key, _this);
     }));
     return _res;
@@ -399,34 +405,37 @@
 /* Title and Description are basic information for (almost) all element types,
  * here we can search by these criteria
  */
-IriSP.Model.List.prototype.searchByTitle = function(_text) {
-    var _rgxp = IriSP.Model.regexpFromTextOrArray(_text, true);
+Model.List.prototype.searchByTitle = function(_text, _iexact) {
+    var _iexact = _iexact || false,
+        _rgxp = Model.regexpFromTextOrArray(_text, true);
     return this.filter(function(_element) {
         return _rgxp.test(_element.title);
     });
 }
 
-IriSP.Model.List.prototype.searchByDescription = function(_text) {
-    var _rgxp = IriSP.Model.regexpFromTextOrArray(_text, true);
+Model.List.prototype.searchByDescription = function(_text, _iexact) {
+    var _iexact = _iexact || false,
+        _rgxp = Model.regexpFromTextOrArray(_text, true);
     return this.filter(function(_element) {
         return _rgxp.test(_element.description);
     });
 }
 
-IriSP.Model.List.prototype.searchByTextFields = function(_text) {
-    var _rgxp =  IriSP.Model.regexpFromTextOrArray(_text, true);
+Model.List.prototype.searchByTextFields = function(_text, _iexact) {
+    var _iexact = _iexact || false,
+        _rgxp =  Model.regexpFromTextOrArray(_text, true);
     return this.filter(function(_element) {
         return _rgxp.test(_element.description) || _rgxp.test(_element.title);
     });
 }
 
-IriSP.Model.List.prototype.getTitles = function() {
+Model.List.prototype.getTitles = function() {
     return this.map(function(_el) {
         return _el.title;
     });
 }
 
-IriSP.Model.List.prototype.addId = function(_id) {
+Model.List.prototype.addId = function(_id) {
     var _el = this.directory.getElement(_id)
     if (!this.hasId(_id) && typeof _el !== "undefined") {
         this.idIndex.push(_id);
@@ -434,11 +443,11 @@
     }
 }
 
-IriSP.Model.List.prototype.push = function(_el) {
+Model.List.prototype.push = function(_el) {
     if (typeof _el === "undefined") {
         return;
     }
-    var _index = (IriSP._(this.idIndex).indexOf(_el.id));
+    var _index = (ns._(this.idIndex).indexOf(_el.id));
     if (_index === -1) {
         this.idIndex.push(_el.id);
         Array.prototype.push.call(this, _el);
@@ -447,24 +456,24 @@
     }
 }
 
-IriSP.Model.List.prototype.addIds = function(_array) {
+Model.List.prototype.addIds = function(_array) {
     var _l = _array.length,
         _this = this;
-    IriSP._(_array).forEach(function(_id) {
+    ns._(_array).forEach(function(_id) {
         _this.addId(_id);
     });
 }
 
-IriSP.Model.List.prototype.addElements = function(_array) {
+Model.List.prototype.addElements = function(_array) {
     var _this = this;
-    IriSP._(_array).forEach(function(_el) {
+    ns._(_array).forEach(function(_el) {
         _this.push(_el);
     });
 }
 
-IriSP.Model.List.prototype.removeId = function(_id, _deleteFromDirectory) {
+Model.List.prototype.removeId = function(_id, _deleteFromDirectory) {
     var _deleteFromDirectory = _deleteFromDirectory || false,
-        _index = (IriSP._(this.idIndex).indexOf(_id));
+        _index = (ns._(this.idIndex).indexOf(_id));
     if (_index !== -1) {
         this.splice(_index,1);
     }
@@ -473,37 +482,45 @@
     }
 }
 
-IriSP.Model.List.prototype.removeElement = function(_el, _deleteFromDirectory) {
+Model.List.prototype.removeElement = function(_el, _deleteFromDirectory) {
     var _deleteFromDirectory = _deleteFromDirectory || false;
     this.removeId(_el.id);
 }
 
-IriSP.Model.List.prototype.removeIds = function(_list, _deleteFromDirectory) {
+Model.List.prototype.removeIds = function(_list, _deleteFromDirectory) {
     var _deleteFromDirectory = _deleteFromDirectory || false,
         _this = this;
-    IriSP._(_list).forEach(function(_id) {
+    ns._(_list).forEach(function(_id) {
         _this.removeId(_id);
     });
 }
 
-IriSP.Model.List.prototype.removeElements = function(_list, _deleteFromDirectory) {
+Model.List.prototype.removeElements = function(_list, _deleteFromDirectory) {
     var _deleteFromDirectory = _deleteFromDirectory || false,
         _this = this;
-    IriSP._(_list).forEach(function(_el) {
+    ns._(_list).forEach(function(_el) {
         _this.removeElement(_el);
     });
 }
 
-IriSP.Model.List.prototype.on = function(_event, _callback) {
+Model.List.prototype.on = function(_event, _callback) {
     if (typeof this.__events[_event] === "undefined") {
         this.__events[_event] = [];
     }
     this.__events[_event].push(_callback);
 }
 
-IriSP.Model.List.prototype.trigger = function(_event, _data) {
+Model.List.prototype.off = function(_event, _callback) {
+    if (typeof this.__events[_event] !== "undefined") {
+        this.__events[_event] = ns._(this.__events[_event]).reject(function(_fn) {
+            return _fn === _callback;
+        });
+    }
+}
+
+Model.List.prototype.trigger = function(_event, _data) {
     var _list = this;
-    IriSP._(this.__events[_event]).each(function(_callback) {
+    ns._(this.__events[_event]).each(function(_callback) {
         _callback.call(_list, _data);
     });
 }
@@ -512,12 +529,12 @@
  * without the clumsiness of the original Date object.
  */
 
-IriSP.Model.Time = function(_milliseconds) {
+Model.Time = function(_milliseconds) {
     this.milliseconds = 0;
     this.setMilliseconds(_milliseconds);
 }
 
-IriSP.Model.Time.prototype.setMilliseconds = function(_milliseconds) {
+Model.Time.prototype.setMilliseconds = function(_milliseconds) {
     var _ante = _milliseconds;
     switch(typeof _milliseconds) {
         case "string":
@@ -537,15 +554,15 @@
     }
 }
 
-IriSP.Model.Time.prototype.setSeconds = function(_seconds) {
+Model.Time.prototype.setSeconds = function(_seconds) {
     this.milliseconds = 1000 * _seconds;
 }
 
-IriSP.Model.Time.prototype.getSeconds = function() {
+Model.Time.prototype.getSeconds = function() {
     return this.milliseconds / 1000;
 }
 
-IriSP.Model.Time.prototype.getHMS = function() {
+Model.Time.prototype.getHMS = function() {
     var _totalSeconds = Math.abs(Math.floor(this.getSeconds()));
     return {
         hours : Math.floor(_totalSeconds / 3600),
@@ -554,15 +571,15 @@
     } 
 }
 
-IriSP.Model.Time.prototype.add = function(_milliseconds) {
-    this.milliseconds += new IriSP.Model.Time(_milliseconds).milliseconds;
+Model.Time.prototype.add = function(_milliseconds) {
+    this.milliseconds += new Model.Time(_milliseconds).milliseconds;
 }
 
-IriSP.Model.Time.prototype.valueOf = function() {
+Model.Time.prototype.valueOf = function() {
     return this.milliseconds;
 }
 
-IriSP.Model.Time.prototype.toString = function() {
+Model.Time.prototype.toString = function() {
     function pad(_n) {
         var _res = _n.toString();
         while (_res.length < 2) {
@@ -579,10 +596,10 @@
     return _res;
 }
 
-/* IriSP.Model.Reference handles references between elements
+/* Model.Reference handles references between elements
  */
 
-IriSP.Model.Reference = function(_source, _idRef) {
+Model.Reference = function(_source, _idRef) {
     this.source = _source;
     this.id = _idRef;
     if (typeof _idRef === "object") {
@@ -593,9 +610,9 @@
     this.refresh();
 }
 
-IriSP.Model.Reference.prototype.refresh = function() {
+Model.Reference.prototype.refresh = function() {
     if (this.isList) {
-        this.contents = new IriSP.Model.List(this.source.directory);
+        this.contents = new Model.List(this.source.directory);
         this.contents.addIds(this.id);
     } else {
         this.contents = this.source.getElement(this.id);
@@ -603,16 +620,16 @@
     
 }
 
-IriSP.Model.Reference.prototype.getContents = function() {
+Model.Reference.prototype.getContents = function() {
     if (typeof this.contents === "undefined" || (this.isList && this.contents.length != this.id.length)) {
         this.refresh();
     }
     return this.contents;
 }
 
-IriSP.Model.Reference.prototype.isOrHasId = function(_idRef) {
+Model.Reference.prototype.isOrHasId = function(_idRef) {
     if (this.isList) {
-        return (IriSP._(this.id).indexOf(_idRef) !== -1)
+        return (ns._(this.id).indexOf(_idRef) !== -1)
     } else {
         return (this.id == _idRef);
     }
@@ -620,13 +637,13 @@
 
 /* */
 
-IriSP.Model.Element = function(_id, _source) {
+Model.Element = function(_id, _source) {
     this.elementType = 'element';
     if (typeof _source === "undefined") {
         return;
     }
     if (typeof _id === "undefined" || !_id) {
-        _id = IriSP.Model.getUID();
+        _id = Model.getUID();
     }
     this.source = _source;
     this.id = _id;
@@ -636,50 +653,122 @@
     this.source.directory.addElement(this);
 }
 
-IriSP.Model.Element.prototype.toString = function() {
+Model.Element.prototype.toString = function() {
     return this.elementType + (this.elementType !== 'element' ? ', id=' + this.id + ', title="' + this.title + '"' : '');
 }
 
-IriSP.Model.Element.prototype.setReference = function(_elementType, _idRef) {
-    this[_elementType] = new IriSP.Model.Reference(this.source, _idRef);
+Model.Element.prototype.setReference = function(_elementType, _idRef) {
+    this[_elementType] = new Model.Reference(this.source, _idRef);
 }
 
-IriSP.Model.Element.prototype.getReference = function(_elementType) {
+Model.Element.prototype.getReference = function(_elementType) {
     if (typeof this[_elementType] !== "undefined") {
         return this[_elementType].getContents();
     }
 }
 
-IriSP.Model.Element.prototype.getRelated = function(_elementType, _global) {
+Model.Element.prototype.getRelated = function(_elementType, _global) {
     _global = (typeof _global !== "undefined" && _global);
     var _this = this;
     return this.source.getList(_elementType, _global).filter(function(_el) {
         var _ref = _el[_this.elementType];
-        return _ref.isOrHasId(_this.id);
+        return _ref && _ref.isOrHasId(_this.id);
     });
 }
 
-IriSP.Model.Element.prototype.on = function(_event, _callback) {
+Model.Element.prototype.on = function(_event, _callback) {
     if (typeof this.__events[_event] === "undefined") {
         this.__events[_event] = [];
     }
     this.__events[_event].push(_callback);
 }
 
-IriSP.Model.Element.prototype.trigger = function(_event, _data) {
+Model.Element.prototype.off = function(_event, _callback) {
+    if (typeof this.__events[_event] !== "undefined") {
+        this.__events[_event] = ns._(this.__events[_event]).reject(function(_fn) {
+            return _fn === _callback;
+        });
+    }
+}
+
+Model.Element.prototype.trigger = function(_event, _data) {
     var _element = this;
-    IriSP._(this.__events[_event]).each(function(_callback) {
+    ns._(this.__events[_event]).each(function(_callback) {
         _callback.call(_element, _data);
     });
 }
 
 /* */
 
-IriSP.Model.Media = function(_id, _source) {
-    IriSP.Model.Element.call(this, _id, _source);
+Model.Playable = function(_id, _source) {
+    Model.Element.call(this, _id, _source);
+    if (typeof _source === "undefined") {
+        return;
+    }
+    this.elementType = 'playable';
+    this.currentTime = new Model.Time();
+    this.volume = .5;
+    this.paused = true;
+    this.muted = false;
+    var _this = this;
+    this.on("play", function() {
+        _this.paused = false;
+    });
+    this.on("pause", function() {
+        _this.paused = true;
+    });
+    this.on("timeupdate", function(_time) {
+        _this.currentTime = _time;
+    });
+}
+
+Model.Playable.prototype = new Model.Element();
+
+Model.Playable.prototype.getCurrentTime = function() { 
+    return this.currentTime;
+}
+
+Model.Playable.prototype.getVolume = function() {
+    return this.volume;
+}
+
+Model.Playable.prototype.getPaused = function() {
+    return this.paused;
+}
+
+Model.Playable.prototype.getMuted = function() {
+    return this.muted;
+}
+
+Model.Playable.prototype.setCurrentTime = function(_time) {
+    this.trigger("setcurrenttime",_time);
+}
+
+Model.Playable.prototype.setVolume = function(_vol) {
+    this.trigger("setvolume",_vol);
+}
+
+Model.Playable.prototype.setMuted = function(_muted) {
+    this.trigger("setmuted",_muted);
+}
+
+Model.Playable.prototype.play = function() {
+    this.trigger("setplay");
+}
+
+Model.Playable.prototype.pause = function() {
+    this.trigger("setpause");
+}
+
+
+/* */
+
+Model.Media = function(_id, _source) {
+    Model.Playable.call(this, _id, _source);
     this.elementType = 'media';
-    this.duration = new IriSP.Model.Time();
+    this.duration = new Model.Time();
     this.video = '';
+    
     var _this = this;
     this.on("timeupdate", function(_time) {
         _this.getAnnotations().filter(function(_a) {
@@ -697,78 +786,63 @@
     });
 }
 
-IriSP.Model.Media.prototype = new IriSP.Model.Element();
+Model.Media.prototype = new Model.Playable();
 
 /* Default functions to be overriden by players */
-
-IriSP.Model.Media.prototype.getCurrentTime = function() {  return new IriSP.Model.Time(0); }
-
-IriSP.Model.Media.prototype.getVolume = function() { return .5; }
-
-IriSP.Model.Media.prototype.getPaused = function() { return true; }
-
-IriSP.Model.Media.prototype.getMuted = function() { return false; }
-
-IriSP.Model.Media.prototype.setCurrentTime
-    = IriSP.Model.Media.prototype.setVolume
-    = IriSP.Model.Media.prototype.setMuted
-    = IriSP.Model.Media.prototype.play
-    = IriSP.Model.Media.prototype.pause
-    = function() {}
     
-IriSP.Model.Media.prototype.setDuration = function(_durationMs) {
+Model.Media.prototype.setDuration = function(_durationMs) {
     this.duration.setMilliseconds(_durationMs);
 }
 
-IriSP.Model.Media.prototype.getAnnotations = function() {
+Model.Media.prototype.getAnnotations = function() {
     return this.getRelated("annotation");
 }
 
-IriSP.Model.Media.prototype.getAnnotationsByTypeTitle = function(_title) {
+Model.Media.prototype.getAnnotationsByTypeTitle = function(_title) {
     var _annTypes = this.source.getAnnotationTypes().searchByTitle(_title).pluck("id");
     if (_annTypes.length) {
         return this.getAnnotations().filter(function(_annotation) {
-            return IriSP._(_annTypes).indexOf(_annotation.getAnnotationType().id) !== -1;
+            return ns._(_annTypes).indexOf(_annotation.getAnnotationType().id) !== -1;
         });
     } else {
-        return new IriSP.Model.List(this.source.directory)
+        return new Model.List(this.source.directory)
     }
 }
 
 /* */
 
-IriSP.Model.Tag = function(_id, _source) {
-    IriSP.Model.Element.call(this, _id, _source);
+Model.Tag = function(_id, _source) {
+    Model.Element.call(this, _id, _source);
     this.elementType = 'tag';
 }
 
-IriSP.Model.Tag.prototype = new IriSP.Model.Element();
+Model.Tag.prototype = new Model.Element();
 
-IriSP.Model.Tag.prototype.getAnnotations = function() {
+Model.Tag.prototype.getAnnotations = function() {
     return this.getRelated("annotation");
 }
 
 /* */
-
-IriSP.Model.AnnotationType = function(_id, _source) {
-    IriSP.Model.Element.call(this, _id, _source);
+Model.AnnotationType = function(_id, _source) {
+    Model.Element.call(this, _id, _source);
     this.elementType = 'annotationType';
 }
 
-IriSP.Model.AnnotationType.prototype = new IriSP.Model.Element();
+Model.AnnotationType.prototype = new Model.Element();
 
-IriSP.Model.AnnotationType.prototype.getAnnotations = function() {
+Model.AnnotationType.prototype.getAnnotations = function() {
     return this.getRelated("annotation");
 }
 
 /* Annotation
  * */
 
-IriSP.Model.Annotation = function(_id, _source) {
-    IriSP.Model.Element.call(this, _id, _source);
+Model.Annotation = function(_id, _source) {
+    Model.Element.call(this, _id, _source);
     this.elementType = 'annotation';
-    this.begin = new IriSP.Model.Time();
-    this.end = new IriSP.Model.Time();
+    this.begin = new Model.Time();
+    this.end = new Model.Time();
+    this.tag = new Model.Reference(_source, []);
     this.playing = false;
     var _this = this;
     this.on("click", function() {
@@ -776,56 +850,56 @@
     });
 }
 
-IriSP.Model.Annotation.prototype = new IriSP.Model.Element(null);
+Model.Annotation.prototype = new Model.Element();
 
-IriSP.Model.Annotation.prototype.setBegin = function(_beginMs) {
+Model.Annotation.prototype.setBegin = function(_beginMs) {
     this.begin.setMilliseconds(_beginMs);
 }
 
-IriSP.Model.Annotation.prototype.setEnd = function(_beginMs) {
+Model.Annotation.prototype.setEnd = function(_beginMs) {
     this.end.setMilliseconds(_beginMs);
 }
 
-IriSP.Model.Annotation.prototype.setMedia = function(_idRef) {
+Model.Annotation.prototype.setMedia = function(_idRef) {
     this.setReference("media", _idRef);
 }
 
-IriSP.Model.Annotation.prototype.getMedia = function() {
+Model.Annotation.prototype.getMedia = function() {
     return this.getReference("media");
 }
 
-IriSP.Model.Annotation.prototype.setAnnotationType = function(_idRef) {
+Model.Annotation.prototype.setAnnotationType = function(_idRef) {
     this.setReference("annotationType", _idRef);
 }
 
-IriSP.Model.Annotation.prototype.getAnnotationType = function() {
+Model.Annotation.prototype.getAnnotationType = function() {
     return this.getReference("annotationType");
 }
 
-IriSP.Model.Annotation.prototype.setTags = function(_idRefs) {
+Model.Annotation.prototype.setTags = function(_idRefs) {
     this.setReference("tag", _idRefs);
 }
 
-IriSP.Model.Annotation.prototype.getTags = function() {
+Model.Annotation.prototype.getTags = function() {
     return this.getReference("tag");
 }
 
-IriSP.Model.Annotation.prototype.getTagTexts = function() {
+Model.Annotation.prototype.getTagTexts = function() {
     return this.getTags().getTitles();
 }
 
-IriSP.Model.Annotation.prototype.getDuration = function() {
-    return new IriSP.Model.Time(this.end.milliseconds - this.begin.milliseconds)
+Model.Annotation.prototype.getDuration = function() {
+    return new Model.Time(this.end.milliseconds - this.begin.milliseconds)
 }
 
 /* */
 
-IriSP.Model.MashedAnnotation = function(_mashup, _annotation) {
-    IriSP.Model.Element.call(this, _mashup.id + "_" + _annotation.id, _annotation.source);
+Model.MashedAnnotation = function(_mashup, _annotation) {
+    Model.Element.call(this, _mashup.id + "_" + _annotation.id, _annotation.source);
     this.elementType = 'mashedAnnotation';
     this.annotation = _annotation;
-    this.begin = new IriSP.Model.Time(_mashup.duration);
-    this.end = new IriSP.Model.Time(_mashup.duration + _annotation.getDuration());
+    this.begin = new Model.Time(_mashup.duration);
+    this.end = new Model.Time(_mashup.duration + _annotation.getDuration());
     this.title = this.annotation.title;
     this.description = this.annotation.description;
     this.color = this.annotation.color;
@@ -835,36 +909,36 @@
     });
 }
 
-IriSP.Model.MashedAnnotation.prototype = new IriSP.Model.Element(null);
+Model.MashedAnnotation.prototype = new Model.Element(null);
 
-IriSP.Model.MashedAnnotation.prototype.getMedia = function() {
+Model.MashedAnnotation.prototype.getMedia = function() {
     return this.annotation.getReference("media");
 }
 
-IriSP.Model.MashedAnnotation.prototype.getAnnotationType = function() {
+Model.MashedAnnotation.prototype.getAnnotationType = function() {
     return this.annotation.getReference("annotationType");
 }
 
-IriSP.Model.MashedAnnotation.prototype.getTags = function() {
+Model.MashedAnnotation.prototype.getTags = function() {
     return this.annotation.getReference("tag");
 }
 
-IriSP.Model.MashedAnnotation.prototype.getTagTexts = function() {
+Model.MashedAnnotation.prototype.getTagTexts = function() {
     return this.annotation.getTags().getTitles();
 }
 
-IriSP.Model.MashedAnnotation.prototype.getDuration = function() {
+Model.MashedAnnotation.prototype.getDuration = function() {
     return this.annotation.getDuration();
 }
 
 /* */
 
-IriSP.Model.Mashup = function(_id, _source) {
-    IriSP.Model.Element.call(this, _id, _source);
+Model.Mashup = function(_id, _source) {
+    Model.Playable.call(this, _id, _source);
     this.elementType = 'mashup';
-    this.duration = new IriSP.Model.Time();
-    this.segments = new IriSP.Model.List(_source.directory);
-    this.medias = new IriSP.Model.List(_source.directory);
+    this.duration = new Model.Time();
+    this.segments = new Model.List(_source.directory);
+    this.medias = new Model.List(_source.directory);
     var _currentMedia = null;
     var _this = this;
     this.on("timeupdate", function(_time) {
@@ -891,42 +965,42 @@
     });
 }
 
-IriSP.Model.Mashup.prototype = new IriSP.Model.Element();
+Model.Mashup.prototype = new Model.Playable();
 
-IriSP.Model.Mashup.prototype.addSegment = function(_annotation) {
-    var _mashedAnnotation = new IriSP.Model.MashedAnnotation(this, _annotation);
+Model.Mashup.prototype.addSegment = function(_annotation) {
+    var _mashedAnnotation = new Model.MashedAnnotation(this, _annotation);
     this.duration.setMilliseconds(_mashedAnnotation.end);
     this.segments.push(_mashedAnnotation);
     this.medias.push(_annotation.getMedia());
 }
 
-IriSP.Model.Mashup.prototype.addSegmentById = function(_elId) {
+Model.Mashup.prototype.addSegmentById = function(_elId) {
     var _annotation = this.source.getElement(_elId);
     if (typeof _annotation !== "undefined") {
         this.addSegment(_annotation);
     }
 }
 
-IriSP.Model.Mashup.prototype.getAnnotations = function() {
+Model.Mashup.prototype.getAnnotations = function() {
     return this.segments;
 }
 
-IriSP.Model.Mashup.prototype.getMedias = function() {
+Model.Mashup.prototype.getMedias = function() {
     return this.medias;
 }
 
-IriSP.Model.Mashup.prototype.getAnnotationsByTypeTitle = function(_title) {
+Model.Mashup.prototype.getAnnotationsByTypeTitle = function(_title) {
     var _annTypes = this.source.getAnnotationTypes().searchByTitle(_title).pluck("id");
     if (_annTypes.length) {
         return this.getAnnotations().filter(function(_annotation) {
-            return IriSP._(_annTypes).indexOf(_annotation.getAnnotationType().id) !== -1;
+            return ns._(_annTypes).indexOf(_annotation.getAnnotationType().id) !== -1;
         });
     } else {
-        return new IriSP.Model.List(this.source.directory)
+        return new Model.List(this.source.directory)
     }
 }
 
-IriSP.Model.Mashup.prototype.getAnnotationAtTime = function(_time) {
+Model.Mashup.prototype.getAnnotationAtTime = function(_time) {
     var _list = this.segments.filter(function(_annotation) {
         return _annotation.begin <= _time && _annotation.end > _time;
     });
@@ -937,7 +1011,7 @@
     }
 }
 
-IriSP.Model.Mashup.prototype.getMediaAtTime = function(_time) {
+Model.Mashup.prototype.getMediaAtTime = function(_time) {
     var _annotation = this.getAnnotationAtTime(_time);
     if (typeof _annotation !== "undefined") {
         return _annotation.getMedia();
@@ -946,30 +1020,14 @@
     }
 }
 
-/* Default functions to be overriden by players */
-
-IriSP.Model.Mashup.prototype.getCurrentTime = function() { return new IriSP.Model.Time(0); }
-
-IriSP.Model.Mashup.prototype.getVolume = function() { return .5; }
-
-IriSP.Model.Mashup.prototype.getPaused = function() { return true; }
-
-IriSP.Model.Mashup.prototype.getMuted = function() { return false; }
-
-IriSP.Model.Mashup.prototype.setCurrentTime
-    = IriSP.Model.Mashup.prototype.setVolume
-    = IriSP.Model.Mashup.prototype.setMuted
-    = IriSP.Model.Mashup.prototype.play
-    = IriSP.Model.Mashup.prototype.pause
-    = function() {}
-
 /* */
 
-IriSP.Model.Source = function(_config) {
-    this.status = IriSP.Model._SOURCE_STATUS_EMPTY;
+Model.Source = function(_config) {
+    this.status = Model._SOURCE_STATUS_EMPTY;
+    this.elementType = "source";
     if (typeof _config !== "undefined") {
         var _this = this;
-        IriSP._(_config).forEach(function(_v, _k) {
+        ns._(_config).forEach(function(_v, _k) {
             _this[_k] = _v;
         })
         this.callbackQueue = [];
@@ -978,14 +1036,16 @@
     }
 }
 
-IriSP.Model.Source.prototype.addList = function(_listId, _contents) {
+Model.Source.prototype = new Model.Element();
+
+Model.Source.prototype.addList = function(_listId, _contents) {
     if (typeof this.contents[_listId] === "undefined") {
-        this.contents[_listId] = new IriSP.Model.List(this.directory);
+        this.contents[_listId] = new Model.List(this.directory);
     }
     this.contents[_listId].addElements(_contents);
 }
 
-IriSP.Model.Source.prototype.getList = function(_listId, _global) {
+Model.Source.prototype.getList = function(_listId, _global) {
     _global = (typeof _global !== "undefined" && _global);
     if (_global || typeof this.contents[_listId] === "undefined") {
         return this.directory.getGlobalList().filter(function(_e) {
@@ -996,80 +1056,80 @@
     }
 }
 
-IriSP.Model.Source.prototype.forEach = function(_callback) {
+Model.Source.prototype.forEach = function(_callback) {
     var _this = this;
-    IriSP._(this.contents).forEach(function(_value, _key) {
+    ns._(this.contents).forEach(function(_value, _key) {
         _callback.call(_this, _value, _key);
     })
 }
 
-IriSP.Model.Source.prototype.getElement = function(_elId) {
+Model.Source.prototype.getElement = function(_elId) {
     return this.directory.getElement(_elId);
 }
 
-IriSP.Model.Source.prototype.get = function() {
-    this.status = IriSP.Model._SOURCE_STATUS_WAITING;
+Model.Source.prototype.get = function() {
+    this.status = Model._SOURCE_STATUS_WAITING;
     this.handleCallbacks();
 }
 
 /* We defer the callbacks calls so they execute after the queue is cleared */
-IriSP.Model.Source.prototype.deferCallback = function(_callback) {
+Model.Source.prototype.deferCallback = function(_callback) {
     var _this = this;
-    IriSP._.defer(function() {
+    ns._.defer(function() {
         _callback.call(_this);
     });
 }
 
-IriSP.Model.Source.prototype.handleCallbacks = function() {
-    this.status = IriSP.Model._SOURCE_STATUS_READY;
+Model.Source.prototype.handleCallbacks = function() {
+    this.status = Model._SOURCE_STATUS_READY;
     while (this.callbackQueue.length) {
         this.deferCallback(this.callbackQueue.splice(0,1)[0]);
     }
 }
-IriSP.Model.Source.prototype.onLoad = function(_callback) {
-    if (this.status === IriSP.Model._SOURCE_STATUS_READY) {
+Model.Source.prototype.onLoad = function(_callback) {
+    if (this.status === Model._SOURCE_STATUS_READY) {
         this.deferCallback(_callback);
     } else {
         this.callbackQueue.push(_callback);
     }
 }
 
-IriSP.Model.Source.prototype.serialize = function() {
+Model.Source.prototype.serialize = function() {
     return this.serializer.serialize(this);
 }
 
-IriSP.Model.Source.prototype.deSerialize = function(_data) {
+Model.Source.prototype.deSerialize = function(_data) {
     this.serializer.deSerialize(_data, this);
 }
 
-IriSP.Model.Source.prototype.getAnnotations = function(_global) {
+Model.Source.prototype.getAnnotations = function(_global) {
     _global = (typeof _global !== "undefined" && _global);
     return this.getList("annotation", _global);
 }
 
-IriSP.Model.Source.prototype.getMedias = function(_global) {
+Model.Source.prototype.getMedias = function(_global) {
     _global = (typeof _global !== "undefined" && _global);
     return this.getList("media", _global);
 }
 
-IriSP.Model.Source.prototype.getTags = function(_global) {
+Model.Source.prototype.getTags = function(_global) {
     _global = (typeof _global !== "undefined" && _global);
     return this.getList("tag", _global);
 }
 
-IriSP.Model.Source.prototype.getMashups = function(_global) {
+Model.Source.prototype.getMashups = function(_global) {
     _global = (typeof _global !== "undefined" && _global);
     return this.getList("mashup", _global);
 }
 
-IriSP.Model.Source.prototype.getAnnotationTypes = function(_global) {
+Model.Source.prototype.getAnnotationTypes = function(_global) {
     _global = (typeof _global !== "undefined" && _global);
     return this.getList("annotationType", _global);
 }
 
-IriSP.Model.Source.prototype.getAnnotationsByTypeTitle = function(_title, _global) {
+Model.Source.prototype.getAnnotationsByTypeTitle = function(_title, _global) {
     _global = (typeof _global !== "undefined" && _global);
-    var _res = new IriSP.Model.List(this.directory),
+    var _res = new Model.List(this.directory),
         _annTypes = this.getAnnotationTypes(_global).searchByTitle(_title);
     _annTypes.forEach(function(_annType) {
         _res.addElements(_annType.getAnnotations(_global));
@@ -1077,14 +1137,14 @@
     return _res;
 }
 
-IriSP.Model.Source.prototype.getDuration = function() {
+Model.Source.prototype.getDuration = function() {
     var _m = this.currentMedia;
     if (typeof _m !== "undefined") {
         return this.currentMedia.duration;
     }
 }
 
-IriSP.Model.Source.prototype.getCurrentMedia = function(_opts) {
+Model.Source.prototype.getCurrentMedia = function(_opts) {
     if (typeof this.currentMedia === "undefined") {
         if (_opts.is_mashup) {
             var _mashups = this.getMashups();
@@ -1094,14 +1154,14 @@
         } else {
             var _medias = this.getMedias();
             if (_medias.length) {
-                _media = _medias[0];
+                this.currentMedia = _medias[0];
             }
         }
     }
     return this.currentMedia;
 }
 
-IriSP.Model.Source.prototype.merge = function(_source) {
+Model.Source.prototype.merge = function(_source) {
     var _this = this;
     _source.forEach(function(_value, _key) {
         _this.getList(_key).addElements(_value);
@@ -1110,14 +1170,14 @@
 
 /* */
 
-IriSP.Model.RemoteSource = function(_config) {
-    IriSP.Model.Source.call(this, _config);
+Model.RemoteSource = function(_config) {
+    Model.Source.call(this, _config);
 }
 
-IriSP.Model.RemoteSource.prototype = new IriSP.Model.Source();
+Model.RemoteSource.prototype = new Model.Source();
 
-IriSP.Model.RemoteSource.prototype.get = function() {
-    this.status = IriSP.Model._SOURCE_STATUS_WAITING;
+Model.RemoteSource.prototype.get = function() {
+    this.status = Model._SOURCE_STATUS_WAITING;
     var _this = this;
     this.serializer.loadData(this.url, function(_result) {
         _this.deSerialize(_result);
@@ -1127,43 +1187,45 @@
 
 /* */
 
-IriSP.Model.Directory = function() {
+Model.Directory = function() {
     this.remoteSources = {};
     this.elements = {};
 }
 
-IriSP.Model.Directory.prototype.remoteSource = function(_properties) {
+Model.Directory.prototype.remoteSource = function(_properties) {
     if (typeof _properties !== "object" || typeof _properties.url === "undefined") {
-        throw "Error : IriSP.Model.Directory.remoteSource(configuration): configuration.url is undefined";
+        throw "Error : Model.Directory.remoteSource(configuration): configuration.url is undefined";
     }
-    var _config = IriSP._({ directory: this }).extend(_properties);
+    var _config = ns._({ directory: this }).extend(_properties);
     if (typeof this.remoteSources[_properties.url] === "undefined") {
-        this.remoteSources[_properties.url] = new IriSP.Model.RemoteSource(_config);
+        this.remoteSources[_properties.url] = new Model.RemoteSource(_config);
     }
     return this.remoteSources[_properties.url];
 }
 
-IriSP.Model.Directory.prototype.newLocalSource = function(_properties) {
-    var _config = IriSP._({ directory: this }).extend(_properties),
-        _res = new IriSP.Model.Source(_config);
+Model.Directory.prototype.newLocalSource = function(_properties) {
+    var _config = ns._({ directory: this }).extend(_properties),
+        _res = new Model.Source(_config);
     return _res;
 }
 
-IriSP.Model.Directory.prototype.getElement = function(_id) {
+Model.Directory.prototype.getElement = function(_id) {
     return this.elements[_id];
 }
 
-IriSP.Model.Directory.prototype.addElement = function(_element) {
+Model.Directory.prototype.addElement = function(_element) {
     this.elements[_element.id] = _element;
 }
 
-IriSP.Model.Directory.prototype.getGlobalList = function() {
-    var _res = new IriSP.Model.List(this);
-    _res.addIds(IriSP._(this.elements).keys());
+Model.Directory.prototype.getGlobalList = function() {
+    var _res = new Model.List(this);
+    _res.addIds(ns._(this.elements).keys());
     return _res;
 }
 
-/* */
+return Model;
+
+})(IriSP);
 IriSP.language = 'en';
 
 IriSP.libFiles = {
@@ -1225,9 +1287,6 @@
     AutoPlayer: {
         noCss: true
     },
-    MashupPlayer: {
-        noCss: true
-    },
     AnnotationsList: {
         requires: [ "jwplayer" ]
     },
@@ -1649,67 +1708,59 @@
 }
 
 IriSP.serializers.ldt_annotate = {
-    types :  {
-        annotation : {
-            serialized_name : "annotations",
-            serializer : function(_data, _source) {
-                var _annType = _data.getAnnotationType();
-                return {
-                    begin: _data.begin.milliseconds,
-                    end: _data.end.milliseconds,
-                    content: {
-                        data: _data.description,
-                        audio: _data.audio
-                    },
-                    tags: _data.getTagTexts(),
-                    media: _data.getMedia().id,
-                    type_title: _annType.title,
-                    type: ( typeof _annType.dont_send_id !== "undefined" && _annType.dont_send_id ? "" : _annType.id )
-                }
+    serializeAnnotation : function(_data, _source) {
+        var _annType = _data.getAnnotationType();
+        return {
+            begin: _data.begin.milliseconds,
+            end: _data.end.milliseconds,
+            content: {
+                description: _data.description,
+                title: _data.title,
+                audio: _data.audio
+            },
+            tags: _data.getTagTexts(),
+            media: _data.getMedia().id,
+            type_title: _annType.title,
+            type: ( typeof _annType.dont_send_id !== "undefined" && _annType.dont_send_id ? "" : _annType.id ),
+            meta: {
+                created: _data.created,
+                creator: _data.creator
             }
         }
     },
     serialize : function(_source) {
-        var _res = {},
-            _this = this;
-        _source.forEach(function(_list, _typename) {
-            if (typeof _this.types[_typename] !== "undefined") {
-                _res[_this.types[_typename].serialized_name] = _list.map(function(_el) {
-                    return _this.types[_typename].serializer(_el, _source);
-                });
-            }
-        });
-        _res.meta = {
-            creator: _source.creator,
-            created: _source.created
-        }
+        var _this = this
+            _res = {
+                "objects": _source.getAnnotations().map(function(_annotation) {
+                    return _this.serializeAnnotation(_annotation, _source);
+                })
+            };
         return JSON.stringify(_res);
     },
     deSerialize : function(_data, _source) {
         if (typeof _data == "string") {
             _data = JSON.parse(_data);
         }
+        
         _source.addList('tag', new IriSP.Model.List(_source.directory));
         _source.addList('annotationType', new IriSP.Model.List(_source.directory));
         _source.addList('annotation', new IriSP.Model.List(_source.directory));
-        if (typeof _data.annotations == "object" && _data.annotations && _data.annotations.length) {
-            var _anndata = _data.annotations[0],
-                _ann = new IriSP.Model.Annotation(_anndata.id, _source);
-            _ann.description = _anndata.content.data || "";
-            _ann.title = _data.creator || "";
-            _ann.created = new Date(_data.meta.created);
+        IriSP._(_data.objects).each(function(_anndata) {
+            var _ann = new IriSP.Model.Annotation(_anndata.id, _source);
+            _ann.description = _anndata.content.description || "";
+            _ann.title = _anndata.content.title || "";
+            _ann.creator = _anndata.meta.creator || "";
+            _ann.created = new Date(_anndata.meta.created);
             _ann.setMedia(_anndata.media, _source);
-            var _anntypes = _source.getAnnotationTypes(true).searchByTitle(_anndata.type_title);
-            if (_anntypes.length) {
-                var _anntype = _anntypes[0];
-            } else {
-                var _anntype = new IriSP.Model.AnnotationType(_anndata.type, _source);
+            var _anntype = _source.getElement(_anndata.type);
+            if (!_anntype) {
+                _anntype = new IriSP.Model.AnnotationType(_anndata.type, _source);
                 _anntype.title = _anndata.type_title;
                 _source.getAnnotationTypes().push(_anntype);
             }
             _ann.setAnnotationType(_anntype.id);
             var _tagIds = IriSP._(_anndata.tags).map(function(_title) {
-                var _tags = _source.getTags(true).searchByTitle(_title);
+                var _tags = _source.getTags(true).searchByTitle(_title, true);
                 if (_tags.length) {
                     var _tag = _tags[0];
                 }
@@ -1723,11 +1774,10 @@
             _ann.setTags(_tagIds);
             _ann.setBegin(_anndata.begin);
             _ann.setEnd(_anndata.end);
-            _ann.creator = _data.meta.creator;
             if (typeof _anndata.content.audio !== "undefined" && _anndata.content.audio.href) {
                 _ann.audio = _anndata.content.audio;
             }
             _source.getAnnotations().push(_ann);
-        }
+        });
     }
 }
\ No newline at end of file
--- a/src/ldt/ldt/static/ldt/metadataplayer/PopcornPlayer.js	Fri Oct 19 16:08:42 2012 +0200
+++ b/src/ldt/ldt/static/ldt/metadataplayer/PopcornPlayer.js	Fri Oct 19 16:10:22 2012 +0200
@@ -83,57 +83,64 @@
         }
     }
     
-
+    var _media = this.media;
+    
     // Binding functions to Popcorn
     
-    this.media.getCurrentTime = function() {
-        return new IriSP.Model.Time(1000*_popcorn.currentTime());
-    }
-    this.media.getVolume = function() {
-        return _popcorn.volume();
-    }
-    this.media.getPaused = function() {
-        return _popcorn.media.paused;
-    }
-    this.media.getMuted = function() {
-        return _popcorn.muted();
-    }
-    this.media.setCurrentTime = function(_milliseconds) {
-        return _popcorn.currentTime(_milliseconds / 1000);
-    }
-    this.media.setVolume = function(_vol) {
-        return _popcorn.volume(_vol);
-    }
-    this.media.mute = function() {
-        return _popcorn.muted(true);
-    }
-    this.media.unmute = function() {
-        return _popcorn.muted(false);
-    }
-    this.media.play = function() {
-        return _popcorn.play();
-    }
-    this.media.pause = function() {
-        return _popcorn.pause();
-    }
+    _media.on("setcurrenttime", function(_milliseconds) {
+        _popcorn.currentTime(_milliseconds / 1000);
+    });
+    
+    _media.on("setvolume", function(_vol) {
+        _popcorn.volume(_vol);
+        _media.volume = _vol;
+    });
+    
+    _media.on("setmuted", function(_muted) {
+        _popcorn.muted(_muted);
+        _media.muted = _muted;
+    });
+    
+    _media.on("setplay", function() {
+        _popcorn.play();
+    });
+    
+    _media.on("setpause", function() {
+        _popcorn.pause();
+    });
     
     // Binding Popcorn events to media
     
-    var _media = this.media;
+    function getVolume() {
+        _media.muted = _popcorn.muted();
+        _media.volume = _popcorn.volume();
+    }
+    
+    _popcorn.on("loadedmetadata", function() {
+        getVolume();
+        _media.trigger("loadedmetadata");
+        _media.trigger("volumechange");
+    })
+    
     _popcorn.on("timeupdate", function() {
-        _media.trigger("timeupdate", _media.getCurrentTime());
+        _media.trigger("timeupdate", new IriSP.Model.Time(1000*_popcorn.currentTime()));
     });
     
-    function simpleEventBind(_eventname) {
-        _popcorn.on(_eventname, function() {
-            _media.trigger(_eventname);
-        });
-    }
+    _popcorn.on("volumechange", function() {
+        getVolume();
+        _media.trigger("volumechange");
+    })
     
-    simpleEventBind("play");
-    simpleEventBind("pause");
-    simpleEventBind("seeked");
-    simpleEventBind("loadedmetadata");
-    simpleEventBind("volumechange");
+    _popcorn.on("play", function() {
+        _media.trigger("play");
+    });
+    
+    _popcorn.on("pause", function() {
+        _media.trigger("pause");
+    });
+    
+    _popcorn.on("seeked", function() {
+        _media.trigger("seeked");
+    });
     
 }
\ No newline at end of file
--- a/src/ldt/ldt/static/ldt/metadataplayer/Slice.js	Fri Oct 19 16:08:42 2012 +0200
+++ b/src/ldt/ldt/static/ldt/metadataplayer/Slice.js	Fri Oct 19 16:10:22 2012 +0200
@@ -48,7 +48,7 @@
         },
         start: function() {
             _this.sliding = true;
-            if (!_this.media.getPaused) {
+            if (!_this.media.getPaused()) {
                 _this.media.pause();
             }
             _currentTime = _this.media.getCurrentTime();
--- a/src/ldt/ldt/static/ldt/metadataplayer/Slider.css	Fri Oct 19 16:08:42 2012 +0200
+++ b/src/ldt/ldt/static/ldt/metadataplayer/Slider.css	Fri Oct 19 16:10:22 2012 +0200
@@ -14,6 +14,6 @@
 
 .Ldt-Slider-Time {
     position: absolute; top: -16px; background: #ffffc0; color: #000000; border-radius: 3px; z-index: 8;
-    font-size: 9px; width: 34px; border: 1px solid #999999; padding: 1px; margin-left: -20px;
+    font-size: 10px; width: 34px; border: 1px solid #999999; padding: 1px; margin-left: -20px;
     display: none; text-align: center; font-weight: bold;
 }
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/src/ldt/ldt/templates/403.html	Fri Oct 19 16:10:22 2012 +0200
@@ -0,0 +1,11 @@
+{% extends "ldt/ldt_base.html" %}
+{% load i18n %}
+
+{% block content %}
+<div style="text-align:center;vertical-align:middle;">
+	<h1>{% trans '403 error' %}</h1>
+	<img src="{{LDT_MEDIA_PREFIX}}/img/403_gandalf.gif" alt="Gif 404" style="display:block;margin:auto;vertical-align:middle;"/>
+	<br>
+	<h1>{% trans "You don't have the right permission to access this page" %}</h1>
+</div>
+{% endblock %}
\ No newline at end of file
--- a/src/ldt/ldt/templates/404.html	Fri Oct 19 16:08:42 2012 +0200
+++ b/src/ldt/ldt/templates/404.html	Fri Oct 19 16:10:22 2012 +0200
@@ -1,1 +1,11 @@
-<h1>Not Found!</h1>
\ No newline at end of file
+{% extends "ldt/ldt_base.html" %}
+{% load i18n %}
+
+{% block content %}
+<div style="text-align:center;vertical-align:middle;">
+	<h1>{% trans '404 error' %}</h1>
+	<img src="{{LDT_MEDIA_PREFIX}}/img/404_gandalf.gif" alt="Gif 404" style="display:block;margin:auto;vertical-align:middle;"/>
+	<br>
+	<h1>{% trans "Sorry, we couldn't find your page" %}</h1>
+</div>
+{% endblock %}
\ No newline at end of file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/src/ldt/ldt/templates/500.html	Fri Oct 19 16:10:22 2012 +0200
@@ -0,0 +1,403 @@
+
+<html>
+<header>
+<STYLE type="text/css">
+	body {
+	font-family: Arial, Helvetica, sans serif;
+	font-size: 12px;
+	color: #4F5155;
+	margin: 2px;
+	padding: 0px;
+	min-width: 750px;
+	}
+	#general_container {
+		width: 960px;
+		margin: 0 auto;
+		}
+	#header {
+		border-bottom: 1px solid gray;
+		border-left: 1px solid gray;
+		margin: 0px;
+		padding: 0px;
+		padding-left: 1em;
+		height: 55px;
+		background: white;
+		
+	}
+	#header p {
+		margin: 0px;
+		padding: 0px;
+
+		}
+	#header a:hover, #header a:visited, #header a:link, #header a:active, #header a:focus {
+		font-size: 40px;
+		font-weight: bold;
+		text-align: left;
+		text-transform: uppercase;
+		float: left;
+		color: #4F5155;
+		text-decoration: none;
+	}
+	
+	#text_error {
+		text-align:center;
+		vertical-align:middle;
+	}
+	
+	#footer {
+		clear: both;
+		margin: 0;
+		padding: .5em;
+		border-top: 1px solid gray;
+	}
+	
+	#footer li {
+		font-size: 12px;
+		float: right;
+		padding: 5px 20px;
+		border-right: 1px solid #484848;
+	}
+	
+	#footer a, #footer a:visited, #footer a:link, #footer a:active, #footer a:focus {
+		color : #4F5155;
+		text-decoration: none;
+	}
+
+</STYLE>
+</header>
+<body>
+	<div id="general_container"></div>
+	<div id="header"> 
+		<p><a href=".">ldt platform</a></p>
+	</div>
+	<br>
+	<br>
+	<div id="text_error">
+	<h1>Error 500</h1>
+	<img src="data:image/gif;base64,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
+ik+taAcq7t2S3o//2Q=="></img>
+	<h1>We had a problem with our server</h1>
+	<h3>(thank you frodo...)</h3>
+	<br>
+	<br>
+	<br>
+	<ul id="footer">		
+		<div style="float: right; text-align: right;" class="small" id="copyright_version">
+			<li>©2011 IRI</li>
+        <li>
+            <a target="_blank" href="http://www.iri.centrepompidou.fr" title="link IRI">about</a>
+        </li>
+        </div>
+       </ul> 	
+	</div>
+</body>
+</html>
--- a/virtualenv/res/lib/lib_create_env.py	Fri Oct 19 16:08:42 2012 +0200
+++ b/virtualenv/res/lib/lib_create_env.py	Fri Oct 19 16:10:22 2012 +0200
@@ -17,11 +17,10 @@
 URLS = {
     #'': {'setup': '', 'url':'', 'local':''},
     'DISTRIBUTE': {'setup': 'distribute', 'url':'http://pypi.python.org/packages/source/d/distribute/distribute-0.6.28.tar.gz', 'local':"distribute-0.6.28.tar.gz", 'install': {'method': 'pip', 'option_str': None, 'dict_extra_env': None}},
-    'DJANGO': {'setup': 'django', 'url': 'http://www.djangoproject.com/download/1.4.1/tarball/', 'local':"Django-1.4.1.tar.gz", 'install': {'method': 'pip', 'option_str': None, 'dict_extra_env': None}},
+    'DJANGO': {'setup': 'django', 'url': 'http://www.djangoproject.com/download/1.4.2/tarball/', 'local':"Django-1.4.2.tar.gz", 'install': {'method': 'pip', 'option_str': None, 'dict_extra_env': None}},
     'DJANGO-EXTENSIONS': { 'setup': 'django-extensions', 'url':'https://github.com/django-extensions/django-extensions/tarball/0.8', 'local':"django-extensions-0.8.tar.gz", 'install': {'method': 'pip', 'option_str': None, 'dict_extra_env': None}},
     'DJANGO-REGISTRATION': { 'setup': 'django-registration', 'url':'https://bitbucket.org/ubernostrum/django-registration/get/v0.8.tar.gz', 'local':"django-registration-0.8.tar.gz", 'install': {'method': 'easy_install', 'option_str': '-Z', 'dict_extra_env': None}},
     'DJANGO-TAGGING': { 'setup': 'django-tagging', 'url':'http://django-tagging.googlecode.com/files/django-tagging-0.3.1.tar.gz', 'local':"django-tagging-0.3.1.tar.gz", 'install': {'method': 'pip', 'option_str': None, 'dict_extra_env': None}},
-    'DJANGO-PISTON': { 'setup': 'django-piston', 'url':'django-piston-7c90898072ce-modifed.tar.gz', 'local':'django-piston-7c90898072ce-modifed.tar.gz', 'install': {'method': 'easy_install', 'option_str': None, 'dict_extra_env': None}},
     'OAUTH2': { 'setup': 'python-oauth2', 'url':"https://github.com/simplegeo/python-oauth2/tarball/hudson-python-oauth2-211", 'local':"oauth2-1.5.211.tar.gz", 'install': {'method': 'easy_install', 'option_str': None, 'dict_extra_env': None}},
     'HTTPLIB2': { 'setup': 'python-httplib2', 'url':'http://code.google.com/p/httplib2/downloads/detail?name=httplib2-0.7.4.tar.gz&can=2&q=', 'local':"httplib2-0.7.4.tar.gz", 'install': {'method': 'pip', 'option_str': None, 'dict_extra_env': None}},
     'DJANGO-OAUTH-PLUS': { 'setup': 'django-oauth-plus', 'url':'http://pypi.python.org/packages/source/d/django-oauth-plus/django-oauth-plus-2.0.tar.gz', 'local':"django-oauth-plus-2.0.tar.gz", 'install': {'method': 'pip', 'option_str': None, 'dict_extra_env': None}},
@@ -43,6 +42,12 @@
     'WHOOSH': {'setup': 'whoosh', 'url':'https://bitbucket.org/mchaput/whoosh/get/tip.tar.gz', 'local':'whoosh-2.5.tar.gz', 'install' : {'method':'pip', 'option_str': None, 'dict_extra_env': None}},
     'SETUPTOOLS_HG' : {'setup':'setuptools_hg', 'url':'http://pypi.python.org/packages/source/s/setuptools_hg/setuptools_hg-0.4.tar.gz', 'local': 'setuptools_hg-0.4.tar.gz', 'install' : {'method':'pip', 'option_str': None, 'dict_extra_env': None}},
     'WSGIREF' : {'setup':'wsgiref', 'url':'http://pypi.python.org/packages/source/w/wsgiref/wsgiref-0.1.2.zip', 'local': 'wsgiref-0.1.2.zip', 'install' : {'method':'pip', 'option_str': None, 'dict_extra_env': None}},
+    # dependencies for Tastypie : mimeparse>=0.1.3, python-dateutil>=2.1, lxml, PyYAML (not necessary but we never know), python-digest
+    'MIMEPARSE' : {'setup':'mimeparse', 'url':'http://pypi.python.org/packages/source/m/mimeparse/mimeparse-0.1.3.tar.gz', 'local': 'mimeparse-0.1.3.tar.gz', 'install' : {'method':'pip', 'option_str': None, 'dict_extra_env': None}},
+    'PYTHON-DATEUTIL' : {'setup':'python-dateutil', 'url':'http://pypi.python.org/packages/source/p/python-dateutil/python-dateutil-2.1.tar.gz', 'local': 'python-dateutil-2.1.tar.gz', 'install' : {'method':'pip', 'option_str': None, 'dict_extra_env': None}},
+    'PYYAML' : {'setup':'pyyaml', 'url':'http://pypi.python.org/packages/source/P/PyYAML/PyYAML-3.10.tar.gz', 'local': 'PyYAML-3.10.tar.gz', 'install' : {'method':'pip', 'option_str': None, 'dict_extra_env': None}},
+    'PYTHON-DIGEST' : {'setup':'python-digest', 'url':'http://pypi.python.org/packages/source/p/python-digest/python-digest-1.7.tar.gz', 'local': 'python-digest-1.7.tar.gz', 'install' : {'method':'pip', 'option_str': None, 'dict_extra_env': None}},
+    'DJANGO-TASTYPIE' : {'setup':'django-tastypie', 'url':'http://pypi.python.org/packages/source/d/django-tastypie/django-tastypie-0.9.11.tar.gz', 'local': 'django-tastypie-0.9.11.tar.gz', 'install' : {'method':'pip', 'option_str': None, 'dict_extra_env': None}},
 }
 
 if system_str == 'Windows':
Binary file virtualenv/res/src/Django-1.4.1.tar.gz has changed
Binary file virtualenv/res/src/Django-1.4.2.tar.gz has changed
Binary file virtualenv/res/src/PyYAML-3.10.tar.gz has changed
Binary file virtualenv/res/src/django-piston-7c90898072ce-modifed.tar.gz has changed
Binary file virtualenv/res/src/django-tastypie-0.9.11.tar.gz has changed
Binary file virtualenv/res/src/mimeparse-0.1.3.tar.gz has changed
Binary file virtualenv/res/src/python-dateutil-2.1.tar.gz has changed
Binary file virtualenv/res/src/python-digest-1.7.tar.gz has changed
--- a/virtualenv/web/res/res_create_env.py	Fri Oct 19 16:08:42 2012 +0200
+++ b/virtualenv/web/res/res_create_env.py	Fri Oct 19 16:10:22 2012 +0200
@@ -15,7 +15,6 @@
     'DJANGO-EXTENSIONS',
     'DJANGO-REGISTRATION',
     'DJANGO-TAGGING',
-    'DJANGO-PISTON',
     'HTTPLIB2',
     'OAUTH2',
     'SETUPTOOLS_HG',
@@ -30,6 +29,11 @@
     'REQUESTS',
     'PYELASTICSEARCH',
     'WHOOSH',
+    'MIMEPARSE',
+    'PYTHON-DATEUTIL',
+    'PYYAML',
+    'PYTHON-DIGEST',
+    'DJANGO-TASTYPIE',
 ]
 
 if system_str == "Linux":
--- a/web/ldtplatform/config.py.tmpl	Fri Oct 19 16:08:42 2012 +0200
+++ b/web/ldtplatform/config.py.tmpl	Fri Oct 19 16:10:22 2012 +0200
@@ -63,7 +63,51 @@
 #LOG_FILE = os.path.abspath(os.path.join(BASE_DIR,"../log/log.txt"))
 LOG_FILE = '%(log_file)s'
 LOG_LEVEL = logging.DEBUG
-logging.basicConfig(filename=LOG_FILE, level=LOG_LEVEL)
+LOGGING = {
+    'version': 1,
+    'disable_existing_loggers': False,
+    'formatters' : {
+        'simple' : {
+            'format': "%(asctime)s - %(levelname)s : %(message)s",
+        },
+        'semi-verbose': {
+            'format': '%(levelname)s %(asctime)s %(module)s %(message)s'
+        },                    
+    },
+    'handlers': {
+        'mail_admins': {
+            'level': 'ERROR',
+            'class': 'django.utils.log.AdminEmailHandler'
+        },
+        'stream_to_console': {
+            'level': LOG_LEVEL,
+            'class': 'logging.StreamHandler'
+        },
+        'file': {
+            'level': LOG_LEVEL,
+            'class': 'logging.FileHandler',
+            'filename': LOG_FILE,
+            'formatter': 'semi-verbose',
+        },
+    },
+    'loggers': {
+        'django.db.backends':{
+            'handlers': ['file'],
+            'level': LOG_LEVEL,
+            'propagate': True,
+        },                
+        'django.request': {
+            'handlers': ['file'],
+            'level': LOG_LEVEL,
+            'propagate': True,
+        },
+        'ldt': {
+            'handlers': ['file'],
+            'level': LOG_LEVEL,
+            'propagate': True,
+        },
+    }
+}
 
 
 ADMINS = (
--- a/web/ldtplatform/settings.py	Fri Oct 19 16:08:42 2012 +0200
+++ b/web/ldtplatform/settings.py	Fri Oct 19 16:10:22 2012 +0200
@@ -93,7 +93,6 @@
     'django_openid_consumer.middleware.OpenIDMiddleware',
     'ldt.ldt_utils.middleware.userprofile.LanguageMiddleware',
     'ldt.security.middleware.SecurityMiddleware',
-    'ldt.api.middleware.pistonput.PistonPutMiddleware',
 )
 
 TEMPLATE_CONTEXT_PROCESSORS = ( 
@@ -143,11 +142,11 @@
     'ldt.indexation',
     'oauth_provider',
     'django_openid_consumer',
-    'piston',
     'social_auth',
     'south',
     'guardian',
     'sorl.thumbnail',
+    'tastypie',
 )
 
 AUTH_PROFILE_MODULE = 'user.UserProfile'