--- 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 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'