# HG changeset patch # User wakimd # Date 1289762722 -3600 # Node ID 3a30d255c23506c65d9268a69acc3d94e1802530 # Parent 40eddcc3d0638839f86069568d5bd909b04825d2 First version of API with tests diff -r 40eddcc3d063 -r 3a30d255c235 .hgignore --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/.hgignore Sun Nov 14 20:25:22 2010 +0100 @@ -0,0 +1,18 @@ + +syntax: regexp +^sbin/virtualenv/project-boot\.py$ +^sbin/virtualenv/env +^web/\.htaccess$ +^web/leezam/\.htaccess$ +^web/leezam/config\.py$ +^web/static/media/ +^sbin/virtualenv/distribute.*\.tar\.gz$ +^.*\.pyc$ +^.*\.old$ +^.*\.orig$ + +syntax: regexp +^web/leezam/modwsgi\.wsgi$ +syntax: regexp +^web/log/log\.txt$ +^web/index/.*$ diff -r 40eddcc3d063 -r 3a30d255c235 .project --- a/.project Fri Oct 29 15:11:09 2010 +0200 +++ b/.project Sun Nov 14 20:25:22 2010 +0100 @@ -5,7 +5,14 @@ + + org.python.pydev.PyDevBuilder + + + + org.python.pydev.pythonNature + org.python.pydev.django.djangoNature diff -r 40eddcc3d063 -r 3a30d255c235 .pydevproject --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/.pydevproject Sun Nov 14 20:25:22 2010 +0100 @@ -0,0 +1,7 @@ + + + + +Leezam-venv +python 2.6 + diff -r 40eddcc3d063 -r 3a30d255c235 .settings/org.eclipse.core.resources.prefs --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/.settings/org.eclipse.core.resources.prefs Sun Nov 14 20:25:22 2010 +0100 @@ -0,0 +1,3 @@ +#Sat Nov 13 17:35:26 CET 2010 +eclipse.preferences.version=1 +encoding//web/ldt/ldt_utils/tests.py=UTF-8 diff -r 40eddcc3d063 -r 3a30d255c235 sbin/.DS_Store Binary file sbin/.DS_Store has changed diff -r 40eddcc3d063 -r 3a30d255c235 sbin/build/client.xml --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/sbin/build/client.xml Sun Nov 14 20:25:22 2010 +0100 @@ -0,0 +1,27 @@ + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff -r 40eddcc3d063 -r 3a30d255c235 sbin/build/compil.bat --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/sbin/build/compil.bat Sun Nov 14 20:25:22 2010 +0100 @@ -0,0 +1,1 @@ +ant -f client.xml \ No newline at end of file diff -r 40eddcc3d063 -r 3a30d255c235 sbin/res/compiler.jar Binary file sbin/res/compiler.jar has changed diff -r 40eddcc3d063 -r 3a30d255c235 sbin/res/jquery-1.3.2.externs.js --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/sbin/res/jquery-1.3.2.externs.js Sun Nov 14 20:25:22 2010 +0100 @@ -0,0 +1,715 @@ +/* + * Copyright 2009 Google Inc. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +/** + * @fileoverview Externs for jQuery 1.3.2. + * The externs defined here are in the order of the jQuery documentation pages. + * Note that some functions use different return types depending on the number + * of parameters passed in. In this cases, you may need to annotate the type + * of the result in your code, so the JSCompiler understands which type you're + * expecting. For example: + * var elt = /** @type {Element} * / (foo.get(0)); + * @see http://docs.jquery.com/ +* + */ + +/** + * @param {string|Node|Element|Array.|Function} arg + * @param {(jQueryObject|Document)=} opt_arg + * @return {jQueryObject} + */ +var $ = function(arg, opt_arg) {}; + +var jQuery = {}; + +/** @constructor */ +function jQueryObject() {}; + + +// http://docs.jquery.com/Core - Object accessors + +/** + * @param {Function} callback + * @return {jQueryObject} + */ +jQueryObject.prototype.each = function(callback) {}; + +/** @return {number} */ +jQueryObject.prototype.size = function() {}; + +/** @type {number} */ +jQueryObject.prototype.length; + +/** @return {string} */ +jQueryObject.prototype.selector = function() {}; + +/** @return {Element} */ +jQueryObject.prototype.context = function() {}; + +/** + * @param {number=} opt_index + * @return {Element|Array.} + */ +jQueryObject.prototype.get = function(opt_index) {}; + +/** + * @param {Element|jQueryObject} subject + * @return {number} + */ +jQueryObject.prototype.index = function(subject) {}; + + +// http://docs.jquery.com/Core - Data + +/** + * @param {string} name + * @param {string=} opt_value + * @return {*} + */ +jQueryObject.prototype.data = function(name, opt_value) {}; + +/** + * @param {string} name + * @return {jQueryObject} + */ +jQueryObject.prototype.removeData = function(name) {}; + +/** + * @param {(string|Function|Array.)=} opt_arg1 + * @param {(Function|Array.)=} opt_arg2 + * @return {Array.|jQueryObject} + */ +jQueryObject.prototype.queue = function(opt_arg1, opt_arg2) {}; + +/** + * @param {string=} opt_name + * @return {jQueryObject} + */ +jQueryObject.prototype.dequeue = function(opt_name) {}; + + +// http://docs.jquery.com/Attributes - Attr + +/** + * @param {string|Object} nameOrProperties + * @param {*=} opt_value + * @return {Object|jQueryObject} + */ +jQueryObject.prototype.attr = function(nameOrProperties, opt_value) {}; + +/** + * @param {string} name + * @return {jQueryObject} + */ +jQueryObject.prototype.removeAttr = function(name) {}; + + +// http://docs.jquery.com/Attributes - Class + +/** + * @param {string} klass + * @return {jQueryObject} + */ +jQueryObject.prototype.addClass = function(klass) {}; + +/** + * @param {string} klass + * @return {boolean} + */ +jQueryObject.prototype.hasClass = function(klass) {}; + +/** + * @param {string=} opt_klass + * @return {jQueryObject} + */ +jQueryObject.prototype.removeClass = function(opt_klass) {}; + +/** + * @param {string} klass + * @param {boolean=} opt_switch + * @return {jQueryObject} + */ +jQueryObject.prototype.toggleClass = function(klass, opt_switch) {}; + + +// http://docs.jquery.com/Attributes - HTML, Text, Value + +/** + * @param {string} opt_val + * @return {string|jQueryObject} + */ +jQueryObject.prototype.html = function(opt_val) {}; + +/** + * @param {string=} opt_val + * @return {string|jQueryObject} + */ +jQueryObject.prototype.text = function(opt_val) {}; + +/** + * @param {string|Array.} opt_val + * @return {string|Array|jQueryObject} + */ +jQueryObject.prototype.val = function(opt_val) {}; + + +// http://docs.jquery.com/Traversing - Filtering + +/** + * @param {number} index + * @return {jQueryObject} + */ +jQueryObject.prototype.eq = function(index) {}; + +/** + * @param {string|Function} arg + * @return {jQueryObject} + */ +jQueryObject.prototype.filter = function(arg) {}; + +/** + * @param {string} expr + * @return {boolean} + */ +jQueryObject.prototype.is = function(expr) {}; + +/** + * @param {Function} callback + * @return {jQueryObject} + */ +jQueryObject.prototype.map = function(callback) {}; + +/** + * @param {string} expr + * @return {jQueryObject} + */ +jQueryObject.prototype.not = function(expr) {}; + +/** + * @param {number} start + * @param {number=} opt_end + * @return {jQueryObject} + */ +jQueryObject.prototype.slice = function(start, opt_end) {}; + + +// http://docs.jquery.com/Traversing - Finding, Chaining + +/** + * @param {string|Element|Array.} expr + * @return {jQueryObject} + */ +jQueryObject.prototype.add = function(expr) {}; + +/** + * @param {string=} opt_expr + * @return {jQueryObject} + */ +jQueryObject.prototype.children = function(opt_expr) {}; + +/** + * @param {string} expr + * @return {jQueryObject} + */ +jQueryObject.prototype.closest = function(expr) {}; + +/** + * @return {jQueryObject} + */ +jQueryObject.prototype.contents = function() {}; + +/** + * @param {string} expr + * @return {jQueryObject} + */ +jQueryObject.prototype.find = function(expr) {}; + +/** + * @param {string=} opt_expr + * @return {jQueryObject} + */ +jQueryObject.prototype.next = function(opt_expr) {}; + +/** + * @param {string=} opt_expr + * @return {jQueryObject} + */ +jQueryObject.prototype.nextAll = function(opt_expr) {}; + +/** + * @return {jQueryObject} + */ +jQueryObject.prototype.offsetParent = function() {}; + +/** + * @param {string=} opt_expr + * @return {jQueryObject} + */ +jQueryObject.prototype.parent = function(opt_expr) {}; + +/** + * @param {string=} opt_expr + * @return {jQueryObject} + */ +jQueryObject.prototype.parents = function(opt_expr) {}; + +/** + * @param {string=} opt_expr + * @return {jQueryObject} + */ +jQueryObject.prototype.prev = function(opt_expr) {}; + +/** + * @param {string=} opt_expr + * @return {jQueryObject} + */ +jQueryObject.prototype.prevAll = function(opt_expr) {}; + +/** + * @param {string=} opt_expr + * @return {jQueryObject} + */ +jQueryObject.prototype.siblings = function(opt_expr) {}; + +/** + * @return {jQueryObject} + */ +jQueryObject.prototype.andSelf = function() {}; + +/** + * @return {jQueryObject} + */ +jQueryObject.prototype.end = function() {}; + + +// http://docs.jquery.com/Manipulation + +/** + * @param {string|Node|Element|jQueryObject} content + * @return {jQueryObject} + */ +jQueryObject.prototype.append = function(content) {}; + +/** + * @param {string} selector + * @return {jQueryObject} + */ +jQueryObject.prototype.appendTo = function(selector) {}; + +/** + * @param {string|Node|Element|jQueryObject} content + * @return {jQueryObject} + */ +jQueryObject.prototype.prepend = function(content) {}; + +/** + * @param {string} selector + * @return {jQueryObject} + */ +jQueryObject.prototype.prependTo = function(selector) {}; + +/** + * @param {string|Node|Element|jQueryObject} content + * @return {jQueryObject} + */ +jQueryObject.prototype.after = function(content) {}; + +/** + * @param {string|Node|Element|jQueryObject} content + * @return {jQueryObject} + */ +jQueryObject.prototype.before = function(content) {}; + +/** + * @param {string} selector + * @return {jQueryObject} + */ +jQueryObject.prototype.insertAfter = function(selector) {}; + +/** + * @param {string} selector + * @return {jQueryObject} + */ +jQueryObject.prototype.insertBefore = function(selector) {}; + +/** + * @param {string|Element} arg + * @return {jQueryObject} + */ +jQueryObject.prototype.wrap = function(arg) {}; + +/** + * @param {string|Element} arg + * @return {jQueryObject} + */ +jQueryObject.prototype.wrapAll = function(arg) {}; + +/** + * @param {string|Element} arg + * @return {jQueryObject} + */ +jQueryObject.prototype.wrapInner = function(arg) {}; + +/** + * @param {string|Node|Element|jQueryObject} content + * @return {jQueryObject} + */ +jQueryObject.prototype.replaceWith = function(content) {}; + +/** + * @param {string} selector + * @return {jQueryObject} + */ +jQueryObject.prototype.replaceAll = function(selector) {}; + +/** + * @return {jQueryObject} + */ +jQueryObject.prototype.empty = function() {}; + +/** + * @param {string=} opt_expr + * @return {jQueryObject} + */ +jQueryObject.prototype.remove = function(opt_expr) {}; + +/** + * @param {boolean=} opt_cloneEvents + * @return {jQueryObject} + */ +jQueryObject.prototype.clone = function(opt_cloneEvents) {}; + + +// http://docs.jquery.com/CSS + +/** + * @param {string|Object} nameOrProperties + * @param {(string|number|Function)=} opt_value + * @return {Object|jQueryObject|string} + */ +jQueryObject.prototype.css = function(nameOrProperties, opt_value) {}; + +/** + * @return {Object} + */ +jQueryObject.prototype.offset = function() {}; + +/** + * @return {Object} + */ +jQueryObject.prototype.position = function() {}; + +/** + * @param {number=} opt_val + * @return {number|jQueryObject} + */ +jQueryObject.prototype.scrollTop = function(opt_val) {}; + +/** + * @param {number=} opt_val + * @return {number|jQueryObject} + */ +jQueryObject.prototype.scrollLeft = function(opt_val) {}; + +/** + * @param {number=} opt_val + * @return {number|jQueryObject} + */ +jQueryObject.prototype.height = function(opt_val) {}; + +/** + * @param {number=} opt_val + * @return {number|jQueryObject} + */ +jQueryObject.prototype.width = function(opt_val) {}; + +/** + * @return {number} + */ +jQueryObject.prototype.innerHeight = function() {}; + +/** + * @return {number} + */ +jQueryObject.prototype.innerWidth = function() {}; + +/** + * @param {boolean=} opt_margin + * @return {number} + */ +jQueryObject.prototype.outerHeight = function(opt_margin) {}; + +/** + * @param {boolean=} opt_margin + * @return {number} + */ +jQueryObject.prototype.outerWidth = function(opt_margin) {}; + + +// http://docs.jquery.com/Events + +/** + * @param {string} type + * @param {Function} fn + * @return {jQueryObject} + */ +jQueryObject.prototype.live = function(type, fn) {}; + +/** + * @param {string=} opt_type + * @param {Function=} opt_fn + * @return {jQueryObject} + */ +jQueryObject.prototype.die = function(opt_type, opt_fn) {}; + +/** + * @param {Function} over + * @param {Function} out + * @return {jQueryObject} + */ +jQueryObject.prototype.hover = function(over, out) {}; + +/** + * @param {Function=} opt_fn + * @return {jQueryObject} + */ +jQueryObject.prototype.blur = function(opt_fn) {}; + +/** + * @param {Function=} opt_fn + * @return {jQueryObject} + */ +jQueryObject.prototype.change = function(opt_fn) {}; + +/** + * @param {Function=} opt_fn + * @return {jQueryObject} + */ +jQueryObject.prototype.click = function(opt_fn) {}; + +/** + * @param {Function=} opt_fn + * @return {jQueryObject} + */ +jQueryObject.prototype.dblclick = function(opt_fn) {}; + +/** + * @param {Function=} opt_fn + * @return {jQueryObject} + */ +jQueryObject.prototype.error = function(opt_fn) {}; + +/** + * @param {Function=} opt_fn + * @return {jQueryObject} + */ +jQueryObject.prototype.focus = function(opt_fn) {}; + +/** + * @param {Function=} opt_fn + * @return {jQueryObject} + */ +jQueryObject.prototype.keydown = function(opt_fn) {}; + +/** + * @param {Function=} opt_fn + * @return {jQueryObject} + */ +jQueryObject.prototype.keypress = function(opt_fn) {}; + +/** + * @param {Function} fn + * @return {jQueryObject} + */ +jQueryObject.prototype.keyup = function(fn) {}; + +/** + * @param {Function} fn + * @return {jQueryObject} + */ +jQueryObject.prototype.load = function(fn) {}; + +/** + * @param {Function} fn + * @return {jQueryObject} + */ +jQueryObject.prototype.mousedown = function(fn) {}; + +/** + * @param {Function} fn + * @return {jQueryObject} + */ +jQueryObject.prototype.mouseenter = function(fn) {}; + +/** + * @param {Function} fn + * @return {jQueryObject} + */ +jQueryObject.prototype.mouseleave = function(fn) {}; + +/** + * @param {Function} fn + * @return {jQueryObject} + */ +jQueryObject.prototype.mousemove = function(fn) {}; + +/** + * @param {Function} fn + * @return {jQueryObject} + */ +jQueryObject.prototype.mouseout = function(fn) {}; + +/** + * @param {Function} fn + * @return {jQueryObject} + */ +jQueryObject.prototype.mouseover = function(fn) {}; + +/** + * @param {Function} fn + * @return {jQueryObject} + */ +jQueryObject.prototype.mouseup = function(fn) {}; + +/** + * @param {Function} fn + * @return {jQueryObject} + */ +jQueryObject.prototype.resize = function(fn) {}; + +/** + * @param {Function} fn + * @return {jQueryObject} + */ +jQueryObject.prototype.scroll = function(fn) {}; + +/** + * @param {Function=} opt_fn + * @return {jQueryObject} + */ +jQueryObject.prototype.select = function(opt_fn) {}; + +/** + * @param {Function=} opt_fn + * @return {jQueryObject} + */ +jQueryObject.prototype.submit = function(opt_fn) {}; + +/** + * @param {Function} fn + * @return {jQueryObject} + */ +jQueryObject.prototype.unload = function(fn) {}; + + +// http://docs.jquery.com/Effects + +/** + * @param {(number|string)=} opt_speed + * @param {Function=} opt_fn + * @return {jQueryObject} + */ +jQueryObject.prototype.show = function(opt_speed, opt_fn) {}; + +/** + * @param {(number|string)=} opt_speed + * @param {Function=} opt_fn + * @return {jQueryObject} + */ +jQueryObject.prototype.hide = function(opt_speed, opt_fn) {}; + +/** + * toggle() is defined as both an event and an effect... sigh. + * @param {(Function|boolean|number|string)=} opt_arg1 + * @param {Function=} opt_fn2 + * @param {...Function} var_args + * @return {jQueryObject} + */ +jQueryObject.prototype.toggle = function(opt_arg1, opt_fn2, var_args) {}; + +/** + * @param {(number|string)=} opt_speed + * @param {Function=} opt_fn + * @return {jQueryObject} + */ +jQueryObject.prototype.slideDown = function(opt_speed, opt_fn) {}; + +/** + * @param {(number|string)=} opt_speed + * @param {Function=} opt_fn + * @return {jQueryObject} + */ +jQueryObject.prototype.slideUp = function(opt_speed, opt_fn) {}; + +/** + * @param {(number|string)=} opt_speed + * @param {Function=} opt_fn + * @return {jQueryObject} + */ +jQueryObject.prototype.slideToggle = function(opt_speed, opt_fn) {}; + +/** + * @param {(number|string)=} opt_speed + * @param {Function=} opt_fn + * @return {jQueryObject} + */ +jQueryObject.prototype.fadeIn = function(opt_speed, opt_fn) {}; + +/** + * @param {(number|string)=} opt_speed + * @param {Function=} opt_fn + * @return {jQueryObject} + */ +jQueryObject.prototype.fadeOut = function(opt_speed, opt_fn) {}; + +/** + * @param {(number|string)=} opt_speed + * @param {number=} opt_opacity + * @param {Function=} opt_fn + * @return {jQueryObject} + */ +jQueryObject.prototype.fadeTo = function(opt_speed, opt_opacity, opt_fn) {}; + +/** + * @param {Object} params + * @param {(number|string|Object)=} opt_durationOrOptions + * @param {string=} opt_easing + * @param {Function=} opt_fn + * @return {jQueryObject} + */ +jQueryObject.prototype.animate = function( + params, opt_durationOrOptions, opt_easing, opt_fn) {}; + +/** + * @param {boolean} opt_clearQueue + * @param {boolean} opt_gotoEnd + * @return {jQueryObject} + */ +jQueryObject.prototype.stop = function(opt_clearQueue, opt_gotoEnd) {}; + +jQuery.fx = {}; + +/** @type {boolean} */ +jQuery.fx.off; + +// http://docs.jquery.com/Utilities + +/** + * @param {number|string|Object} value + * @param {Array} array + * @return {number} + */ +jQueryObject.prototype.inArray = function(value, array) {}; diff -r 40eddcc3d063 -r 3a30d255c235 sbin/sync/sync_ldt_platform --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/sbin/sync/sync_ldt_platform Sun Nov 14 20:25:22 2010 +0100 @@ -0,0 +1,32 @@ +#!/usr/bin/env bash +set -e +if [ -d ~/tmp/leezam_V$1 ]; then + rm -fr ~/tmp/leezam_V$1; +fi + +hg archive -r V$1 ~/tmp/leezam_V$1 + +#text2unix ~/tmp/leezam_V$1 + +if [ -d ~/tmp/leezam_V$1 ]; then + cat < +- For Linux : +python project-boot.py --unzip-setuptools --no-site-packages --index-url=http://pypi.websushi.org/ --clear --type-install=local + +""" + +import os +import subprocess +import re +import sys + + +here = os.path.dirname(os.path.abspath(__file__)) +base_dir = here +script_name = os.path.join(base_dir, 'project-boot.py') + +import virtualenv + +# things to install +# - psycopg2 -> pip +# - PIL -> pip +# - pyxml -> pip +# - 4Suite-xml - easy_install ftp://ftp.4suite.org/pub/4Suite/4Suite-XML-1.0.2.tar.bz2 +# - pylucene - script + +src_base = os.path.join(here,"res","src") +lib_path = os.path.abspath(os.path.join(here,"res","lib")) +patch_path = os.path.abspath(os.path.join(here,"res","patch")) + +EXTRA_TEXT = "URLS = { \n" + +EXTRA_TEXT += " 'DISTRIBUTE' : { 'setup': 'distribute', 'url': 'http://pypi.python.org/packages/source/d/distribute/distribute-0.6.13.tar.gz', 'local': '"+ os.path.abspath(os.path.join(src_base,"distribute-0.6.13.tar.gz"))+"'},\n" +EXTRA_TEXT += " 'PSYCOPG2' : { 'setup': 'psycopg2','url': 'http://initd.org/pub/software/psycopg/psycopg2-2.2.1.tar.gz', 'local': '"+ os.path.abspath(os.path.join(src_base,"psycopg2-2.2.1.tar.gz"))+"'},\n" +EXTRA_TEXT += " 'MYSQL' : { 'setup': 'mysql-python', 'url': 'http://sourceforge.net/projects/mysql-python/files/mysql-python-test/1.2.3c1/MySQL-python-1.2.3c1.tar.gz/download', 'local' : '"+ os.path.abspath(os.path.join(src_base,"MySQL-python-1.2.3c1.tar.gz"))+"'},\n" +EXTRA_TEXT += " 'FOURSUITE_XML' : { 'setup': '4Suite-XML', 'url': 'ftp://ftp.4suite.org/pub/4Suite/4Suite-XML-1.0.2.tar.bz2', 'local': '"+ os.path.abspath(os.path.join(src_base,"4Suite-XML-1.0.2.tar.bz2"))+"'},\n" +EXTRA_TEXT += " 'PYLUCENE' : { 'setup': 'http://apache.crihan.fr/dist/lucene/pylucene/pylucene-3.0.1-1-src.tar.gz', 'url': 'http://apache.crihan.fr/dist/lucene/pylucene/pylucene-3.0.1-1-src.tar.gz', 'local': '"+ os.path.abspath(os.path.join(src_base,"pylucene-3.0.1-1-src.tar.gz"))+"'},\n" +EXTRA_TEXT += " 'PIL' : { 'setup': 'pil', 'url': 'http://effbot.org/downloads/Imaging-1.1.7.tar.gz', 'local': '"+ os.path.abspath(os.path.join(src_base,"Imaging-1.1.7.tar.gz"))+"'},\n" +EXTRA_TEXT += " 'PYXML' : { 'setup': 'http://sourceforge.net/projects/pyxml/files/pyxml/0.8.4/PyXML-0.8.4.tar.gz/download', 'url': 'http://sourceforge.net/projects/pyxml/files/pyxml/0.8.4/PyXML-0.8.4.tar.gz/download', 'local': '"+ os.path.abspath(os.path.join(src_base,"PyXML-0.8.4.tar.gz"))+"', 'patch': '"+os.path.join(patch_path,"pyxml.patch")+"'},\n" +EXTRA_TEXT += " 'DJANGO' : { 'setup': 'django', 'url': 'http://www.djangoproject.com/download/1.2.3/tarball/', 'local': '"+ os.path.abspath(os.path.join(src_base,"Django-1.2.3.tar.gz"))+"'},\n" +EXTRA_TEXT += " 'JOGGING' : { 'setup': 'jogging', 'url': 'http://github.com/zain/jogging/tarball/v0.2.2', 'local': '"+ os.path.abspath(os.path.join(src_base,"jogging-0.2.2.tar.gz"))+"'},\n" +EXTRA_TEXT += " 'DJANGO-EXTENSIONS' : { 'setup': 'django-extensions', 'url':'http://django-command-extensions.googlecode.com/files/django-extensions-0.4.1.tar.gz', 'local':'"+ os.path.abspath(os.path.join(src_base,"django-extensions-0.4.1.tar.gz"))+"' },\n" +EXTRA_TEXT += " 'DJANGO-REGISTRATION' : { 'setup': 'django-registration', 'url':'http://bitbucket.org/ubernostrum/django-registration/get/tip.tar.gz', 'local':'"+ os.path.abspath(os.path.join(src_base,"django-registration.tar.gz"))+"' },\n" +EXTRA_TEXT += " 'DJANGO-TAGGING' : { 'setup': 'django-tagging', 'url':'http://django-tagging.googlecode.com/files/django-tagging-0.3.1.tar.gz', 'local':'"+ os.path.abspath(os.path.join(src_base,"django-tagging-0.3.1.tar.gz"))+"' },\n" +EXTRA_TEXT += " 'LXML' : { 'setup': 'lxml', 'url': '"+ os.path.abspath(os.path.join(src_base,"lxml_2.2.7.tar.gz"))+"', 'local': '"+ os.path.abspath(os.path.join(src_base,"lxml-2.2.7.tar.gz"))+"'},\n" +EXTRA_TEXT += "}\n" + +EXTRA_TEXT += "import sys\n" +EXTRA_TEXT += "sys.path.append('"+lib_path+"')\n" + +EXTRA_TEXT += """ + +import shutil +import tarfile +import urllib +import platform +import patch + + +INDEX_URL = 'http://pypi.python.org/simple/' + + +def extend_parser(parser): + parser.add_option( + '--index-url', + metavar='INDEX_URL', + dest='index_url', + default='', + help='base URL of Python Package Index') + parser.add_option( + '--type-install', + metavar='type_install', + dest='type_install', + default='local', + help='type install : local, url, setup') + parser.add_option( + '--ignore-packages', + metavar='ignore_packages', + dest='ignore_packages', + default=None, + help='list of comma separated keys for package to ignore') + + + +def adjust_options(options, args): + pass + + +def after_install(options, home_dir): + home_dir, lib_dir, inc_dir, bin_dir = path_locations(home_dir) + base_dir = os.path.dirname(home_dir) + src_dir = join(home_dir, 'src') + tmp_dir = join(home_dir, 'tmp') + ensure_dir(src_dir) + ensure_dir(tmp_dir) + system_str = platform.system() + + res_source_key = options.type_install + + ignore_packages = [] + + if options.ignore_packages : + ignore_packages = options.ignore_packages.split(",") + + logger.indent += 2 + try: + + if 'PYLUCENE' not in ignore_packages: + #get pylucene + logger.notify("Get Pylucene from %s " % URLS['PYLUCENE'][res_source_key]) + pylucene_src = os.path.join(src_dir,"pylucene.tar.gz") + urllib.urlretrieve(URLS['PYLUCENE'][res_source_key], pylucene_src) + tf = tarfile.open(pylucene_src,'r:gz') + pylucene_base_path = os.path.join(src_dir,"pylucene") + logger.notify("Extract Pylucene to %s " % pylucene_base_path) + tf.extractall(pylucene_base_path) + tf.close() + + pylucene_src_path = os.path.join(pylucene_base_path, os.listdir(pylucene_base_path)[0]) + jcc_src_path = os.path.abspath(os.path.join(pylucene_src_path,"jcc")) + + #install jcc + + #patch for linux + if system_str == 'Linux' : + olddir = os.getcwd() + patch_dest_path = os.path.join(lib_dir,'site-packages','setuptools-0.6c11-py'+'%s.%s' % (sys.version_info[0], sys.version_info[1])+'.egg') + if os.path.isfile(patch_dest_path): + # must unzip egg + # rename file and etract all + shutil.move(patch_dest_path, patch_dest_path + ".zip") + zf = zipfile.ZipFile(patch_dest_path + ".zip",'r') + zf.extractall(patch_dest_path) + os.remove(patch_dest_path + ".zip") + logger.notify("Patch jcc : %s " % (patch_dest_path)) + os.chdir(patch_dest_path) + p = patch.fromfile(os.path.join(jcc_src_path,"jcc","patches","patch.43.0.6c11")) + p.apply() + os.chdir(olddir) + + logger.notify("Install jcc") + call_subprocess([os.path.abspath(os.path.join(home_dir, 'bin', 'python')), 'setup.py', 'install'], + cwd=jcc_src_path, + filter_stdout=filter_python_develop, + show_stdout=True) + #install pylucene + + logger.notify("Install pylucene") + #modify makefile + makefile_path = os.path.join(pylucene_src_path,"Makefile") + logger.notify("Modify makefile %s " % makefile_path) + shutil.move( makefile_path, makefile_path+"~" ) + + destination= open( makefile_path, "w" ) + source= open( makefile_path+"~", "r" ) + destination.write("PREFIX_PYTHON="+os.path.abspath(home_dir)+"\\n") + destination.write("ANT=ant\\n") + destination.write("PYTHON=$(PREFIX_PYTHON)/bin/python\\n") + + if system_str == "Darwin": + if sys.version_info >= (2,6): + destination.write("JCC=$(PYTHON) -m jcc.__main__ --shared --arch x86_64 --arch i386\\n") + else: + destination.write("JCC=$(PYTHON) -m jcc --shared --arch x86_64 --arch i386\\n") + destination.write("NUM_FILES=2\\n") + elif system_str == "Windows": + destination.write("JCC=$(PYTHON) -m jcc.__main__ --shared --arch x86_64 --arch i386\\n") + destination.write("NUM_FILES=2\\n") + else: + if sys.version_info >= (2,6) and sys.version_info < (2,7): + destination.write("JCC=$(PYTHON) -m jcc.__main__ --shared\\n") + else: + destination.write("JCC=$(PYTHON) -m jcc --shared\\n") + destination.write("NUM_FILES=2\\n") + for line in source: + destination.write( line ) + source.close() + destination.close() + os.remove(makefile_path+"~" ) + + logger.notify("pylucene make") + call_subprocess(['make'], + cwd=os.path.abspath(pylucene_src_path), + filter_stdout=filter_python_develop, + show_stdout=True) + + logger.notify("pylucene make install") + call_subprocess(['make', 'install'], + cwd=os.path.abspath(pylucene_src_path), + filter_stdout=filter_python_develop, + show_stdout=True) + + if system_str == 'Linux' and 'DISTRIBUTE' not in ignore_packages: + normal_install('DISTRIBUTE', 'pip', None, None, res_source_key, home_dir, tmp_dir) + + if 'PYXML' not in ignore_packages: + logger.notify("PyXML install : %s " % URLS['PYXML'][res_source_key]) + if sys.version_info >= (2,6): + logger.notify("PyXML -> python version >= 2.6 : patching") + pyxml_src = os.path.join(src_dir,"pyxml.tar.gz") + urllib.urlretrieve(URLS['PYXML'][res_source_key], pyxml_src) + logger.notify("PyXML -> python version >= 2.6 : extract archive") + tf = tarfile.open(pyxml_src,'r:gz') + pyxml_base_path = os.path.join(src_dir,"pyxml") + tf.extractall(pyxml_base_path) + tf.close() + + #patch + pyxml_version = os.listdir(pyxml_base_path)[0] + pyxml_path = os.path.join(pyxml_base_path, pyxml_version) + olddir = os.getcwd() + os.chdir(pyxml_path) + logger.notify("PyXML -> python version >= 2.6 : do patch %s : %s " % (pyxml_path, URLS['PYXML']['patch'])) + p = patch.fromfile(URLS['PYXML']['patch']) + p.apply() + os.chdir(olddir) + logger.notify("PyXML -> python version >= 2.6 : install") + call_subprocess([os.path.abspath(os.path.join(home_dir, 'bin', 'pip')), 'install', '-E', os.path.abspath(home_dir), '--build='+os.path.abspath(pyxml_base_path), '--no-download', pyxml_version], + cwd=os.path.abspath(tmp_dir), + filter_stdout=filter_python_develop, + show_stdout=True) + else: + call_subprocess([os.path.abspath(os.path.join(home_dir, 'bin', 'pip')), 'install', '-E', os.path.abspath(home_dir), URLS['PYXML'][res_source_key]], + cwd=os.path.abspath(tmp_dir), + filter_stdout=filter_python_develop, + show_stdout=True) + + + NORMAL_INSTALL = [ #(key,method, option_str, extra_env) + #('LXML', 'easy_install', None, {'STATIC_DEPS': 'true'}), + ('PSYCOPG2', 'pip', None, None), + ('MYSQL', 'pip', None, None), + ('PIL', 'pip', None, None), + ('FOURSUITE_XML','easy_install', None, None), + ('DJANGO','pip', None, None), + ('JOGGING','pip', None, None), + ('DJANGO-EXTENSIONS', 'pip', None, None), + ('DJANGO-REGISTRATION', 'easy_install', '-Z', None), + ('DJANGO-TAGGING', 'pip', None, None), + ] + + if system_str == "Darwin": + NORMAL_INSTALL.append(('LXML', 'easy_install', None, {'STATIC_DEPS': 'true'})) + else: + NORMAL_INSTALL.append(('LXML', 'easy_install', None, None)) + + + for key, method, option_str, extra_env in NORMAL_INSTALL: + if key not in ignore_packages: + normal_install(key, method, option_str, extra_env, res_source_key, home_dir, tmp_dir) + + logger.notify("Clear source dir") + shutil.rmtree(src_dir) + + finally: + logger.indent -= 2 + script_dir = join(base_dir, 'bin') + logger.notify('Run "%s Package" to install new packages that provide builds' + % join(script_dir, 'easy_install')) + + +def normal_install(key, method, option_str, extra_env, res_source_key, home_dir, tmp_dir): + logger.notify("Install %s from %s with %s" % (key,URLS[key][res_source_key],method)) + if method == 'pip': + args = [os.path.abspath(os.path.join(home_dir, 'bin', 'pip')), 'install', '-E', os.path.abspath(home_dir), URLS[key][res_source_key]] + if option_str : + args.insert(4,option_str) + call_subprocess(args, + cwd=os.path.abspath(tmp_dir), + filter_stdout=filter_python_develop, + show_stdout=True, + extra_env=extra_env) + else: + args = [os.path.abspath(os.path.join(home_dir, 'bin', 'easy_install')), URLS[key][res_source_key]] + if option_str : + args.insert(1,option_str) + call_subprocess(args, + cwd=os.path.abspath(tmp_dir), + filter_stdout=filter_python_develop, + show_stdout=True, + extra_env=extra_env) + + +def ensure_dir(dir): + if not os.path.exists(dir): + logger.notify('Creating directory %s' % dir) + os.makedirs(dir) + +def filter_python_develop(line): + if not line.strip(): + return Logger.DEBUG + for prefix in ['Searching for', 'Reading ', 'Best match: ', 'Processing ', + 'Moving ', 'Adding ', 'running ', 'writing ', 'Creating ', + 'creating ', 'Copying ']: + if line.startswith(prefix): + return Logger.DEBUG + return Logger.NOTIFY +""" + +def main(): + python_version = ".".join(map(str,sys.version_info[0:2])) + text = virtualenv.create_bootstrap_script(EXTRA_TEXT, python_version=python_version) + if os.path.exists(script_name): + f = open(script_name) + cur_text = f.read() + f.close() + else: + cur_text = '' + print 'Updating %s' % script_name + if cur_text == 'text': + print 'No update' + else: + print 'Script changed; updating...' + f = open(script_name, 'w') + f.write(text) + f.close() + +if __name__ == '__main__': + main() + diff -r 40eddcc3d063 -r 3a30d255c235 sbin/virtualenv/res/lib/patch.py --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/sbin/virtualenv/res/lib/patch.py Sun Nov 14 20:25:22 2010 +0100 @@ -0,0 +1,589 @@ +""" Patch utility to apply unified diffs + + Brute-force line-by-line non-recursive parsing + + Copyright (c) 2008-2010 anatoly techtonik + Available under the terms of MIT license + + Project home: http://code.google.com/p/python-patch/ + + + $Id: patch.py 76 2010-04-08 19:10:21Z techtonik $ + $HeadURL: https://python-patch.googlecode.com/svn/trunk/patch.py $ +""" + +__author__ = "techtonik.rainforce.org" +__version__ = "10.04" + +import copy +import logging +import re +# cStringIO doesn't support unicode in 2.5 +from StringIO import StringIO +from logging import debug, info, warning + +from os.path import exists, isfile, abspath +from os import unlink + + +#------------------------------------------------ +# Logging is controlled by "python_patch" logger + +debugmode = False + +logger = logging.getLogger("python_patch") +loghandler = logging.StreamHandler() +logger.addHandler(loghandler) + +debug = logger.debug +info = logger.info +warning = logger.warning + +#: disable library logging by default +logger.setLevel(logging.CRITICAL) + +#------------------------------------------------ + + +def fromfile(filename): + """ Parse patch file and return Patch() object + """ + + info("reading patch from file %s" % filename) + fp = open(filename, "rb") + patch = Patch(fp) + fp.close() + return patch + + +def fromstring(s): + """ Parse text string and return Patch() object + """ + + return Patch( + StringIO.StringIO(s) + ) + + + +class HunkInfo(object): + """ Parsed hunk data container (hunk starts with @@ -R +R @@) """ + + def __init__(self): + self.startsrc=None #: line count starts with 1 + self.linessrc=None + self.starttgt=None + self.linestgt=None + self.invalid=False + self.text=[] + + def copy(self): + return copy.copy(self) + +# def apply(self, estream): +# """ write hunk data into enumerable stream +# return strings one by one until hunk is +# over +# +# enumerable stream are tuples (lineno, line) +# where lineno starts with 0 +# """ +# pass + + + +class Patch(object): + + def __init__(self, stream=None): + + # define Patch data members + # table with a row for every source file + + #: list of source filenames + self.source=None + self.target=None + #: list of lists of hunks + self.hunks=None + #: file endings statistics for every hunk + self.hunkends=None + + if stream: + self.parse(stream) + + def copy(self): + return copy.copy(self) + + def parse(self, stream): + """ parse unified diff """ + self.source = [] + self.target = [] + self.hunks = [] + self.hunkends = [] + + # define possible file regions that will direct the parser flow + header = False # comments before the patch body + filenames = False # lines starting with --- and +++ + + hunkhead = False # @@ -R +R @@ sequence + hunkbody = False # + hunkskip = False # skipping invalid hunk mode + + header = True + lineends = dict(lf=0, crlf=0, cr=0) + nextfileno = 0 + nexthunkno = 0 #: even if index starts with 0 user messages number hunks from 1 + + # hunkinfo holds parsed values, hunkactual - calculated + hunkinfo = HunkInfo() + hunkactual = dict(linessrc=None, linestgt=None) + + fe = enumerate(stream) + for lineno, line in fe: + + # analyze state + if header and line.startswith("--- "): + header = False + # switch to filenames state + filenames = True + #: skip hunkskip and hunkbody code until you read definition of hunkhead + if hunkbody: + # process line first + if re.match(r"^[- \+\\]", line): + # gather stats about line endings + if line.endswith("\r\n"): + self.hunkends[nextfileno-1]["crlf"] += 1 + elif line.endswith("\n"): + self.hunkends[nextfileno-1]["lf"] += 1 + elif line.endswith("\r"): + self.hunkends[nextfileno-1]["cr"] += 1 + + if line.startswith("-"): + hunkactual["linessrc"] += 1 + elif line.startswith("+"): + hunkactual["linestgt"] += 1 + elif not line.startswith("\\"): + hunkactual["linessrc"] += 1 + hunkactual["linestgt"] += 1 + hunkinfo.text.append(line) + # todo: handle \ No newline cases + else: + warning("invalid hunk no.%d at %d for target file %s" % (nexthunkno, lineno+1, self.target[nextfileno-1])) + # add hunk status node + self.hunks[nextfileno-1].append(hunkinfo.copy()) + self.hunks[nextfileno-1][nexthunkno-1]["invalid"] = True + # switch to hunkskip state + hunkbody = False + hunkskip = True + + # check exit conditions + if hunkactual["linessrc"] > hunkinfo.linessrc or hunkactual["linestgt"] > hunkinfo.linestgt: + warning("extra hunk no.%d lines at %d for target %s" % (nexthunkno, lineno+1, self.target[nextfileno-1])) + # add hunk status node + self.hunks[nextfileno-1].append(hunkinfo.copy()) + self.hunks[nextfileno-1][nexthunkno-1]["invalid"] = True + # switch to hunkskip state + hunkbody = False + hunkskip = True + elif hunkinfo.linessrc == hunkactual["linessrc"] and hunkinfo.linestgt == hunkactual["linestgt"]: + self.hunks[nextfileno-1].append(hunkinfo.copy()) + # switch to hunkskip state + hunkbody = False + hunkskip = True + + # detect mixed window/unix line ends + ends = self.hunkends[nextfileno-1] + if ((ends["cr"]!=0) + (ends["crlf"]!=0) + (ends["lf"]!=0)) > 1: + warning("inconsistent line ends in patch hunks for %s" % self.source[nextfileno-1]) + if debugmode: + debuglines = dict(ends) + debuglines.update(file=self.target[nextfileno-1], hunk=nexthunkno) + debug("crlf: %(crlf)d lf: %(lf)d cr: %(cr)d\t - file: %(file)s hunk: %(hunk)d" % debuglines) + + if hunkskip: + match = re.match("^@@ -(\d+)(,(\d+))? \+(\d+)(,(\d+))?", line) + if match: + # switch to hunkhead state + hunkskip = False + hunkhead = True + elif line.startswith("--- "): + # switch to filenames state + hunkskip = False + filenames = True + if debugmode and len(self.source) > 0: + debug("- %2d hunks for %s" % (len(self.hunks[nextfileno-1]), self.source[nextfileno-1])) + + if filenames: + if line.startswith("--- "): + if nextfileno in self.source: + warning("skipping invalid patch for %s" % self.source[nextfileno]) + del self.source[nextfileno] + # double source filename line is encountered + # attempt to restart from this second line + re_filename = "^--- ([^\t]+)" + match = re.match(re_filename, line) + # todo: support spaces in filenames + if match: + self.source.append(match.group(1).strip()) + else: + warning("skipping invalid filename at line %d" % lineno) + # switch back to header state + filenames = False + header = True + elif not line.startswith("+++ "): + if nextfileno in self.source: + warning("skipping invalid patch with no target for %s" % self.source[nextfileno]) + del self.source[nextfileno] + else: + # this should be unreachable + warning("skipping invalid target patch") + filenames = False + header = True + else: + if nextfileno in self.target: + warning("skipping invalid patch - double target at line %d" % lineno) + del self.source[nextfileno] + del self.target[nextfileno] + nextfileno -= 1 + # double target filename line is encountered + # switch back to header state + filenames = False + header = True + else: + re_filename = "^\+\+\+ ([^\t]+)" + match = re.match(re_filename, line) + if not match: + warning("skipping invalid patch - no target filename at line %d" % lineno) + # switch back to header state + filenames = False + header = True + else: + self.target.append(match.group(1).strip()) + nextfileno += 1 + # switch to hunkhead state + filenames = False + hunkhead = True + nexthunkno = 0 + self.hunks.append([]) + self.hunkends.append(lineends.copy()) + continue + + if hunkhead: + match = re.match("^@@ -(\d+)(,(\d+))? \+(\d+)(,(\d+))?", line) + if not match: + if nextfileno-1 not in self.hunks: + warning("skipping invalid patch with no hunks for file %s" % self.target[nextfileno-1]) + # switch to header state + hunkhead = False + header = True + continue + else: + # switch to header state + hunkhead = False + header = True + else: + hunkinfo.startsrc = int(match.group(1)) + hunkinfo.linessrc = 1 + if match.group(3): hunkinfo.linessrc = int(match.group(3)) + hunkinfo.starttgt = int(match.group(4)) + hunkinfo.linestgt = 1 + if match.group(6): hunkinfo.linestgt = int(match.group(6)) + hunkinfo.invalid = False + hunkinfo.text = [] + + hunkactual["linessrc"] = hunkactual["linestgt"] = 0 + + # switch to hunkbody state + hunkhead = False + hunkbody = True + nexthunkno += 1 + continue + else: + if not hunkskip: + warning("patch file incomplete - %s" % filename) + # sys.exit(?) + else: + # duplicated message when an eof is reached + if debugmode and len(self.source) > 0: + debug("- %2d hunks for %s" % (len(self.hunks[nextfileno-1]), self.source[nextfileno-1])) + + info("total files: %d total hunks: %d" % (len(self.source), sum(len(hset) for hset in self.hunks))) + + + def apply(self): + """ apply parsed patch """ + + total = len(self.source) + for fileno, filename in enumerate(self.source): + + f2patch = filename + if not exists(f2patch): + f2patch = self.target[fileno] + if not exists(f2patch): + warning("source/target file does not exist\n--- %s\n+++ %s" % (filename, f2patch)) + continue + if not isfile(f2patch): + warning("not a file - %s" % f2patch) + continue + filename = f2patch + + info("processing %d/%d:\t %s" % (fileno+1, total, filename)) + + # validate before patching + f2fp = open(filename) + hunkno = 0 + hunk = self.hunks[fileno][hunkno] + hunkfind = [] + hunkreplace = [] + validhunks = 0 + canpatch = False + for lineno, line in enumerate(f2fp): + if lineno+1 < hunk.startsrc: + continue + elif lineno+1 == hunk.startsrc: + hunkfind = [x[1:].rstrip("\r\n") for x in hunk.text if x[0] in " -"] + hunkreplace = [x[1:].rstrip("\r\n") for x in hunk.text if x[0] in " +"] + #pprint(hunkreplace) + hunklineno = 0 + + # todo \ No newline at end of file + + # check hunks in source file + if lineno+1 < hunk.startsrc+len(hunkfind)-1: + if line.rstrip("\r\n") == hunkfind[hunklineno]: + hunklineno+=1 + else: + debug("hunk no.%d doesn't match source file %s" % (hunkno+1, filename)) + # file may be already patched, but we will check other hunks anyway + hunkno += 1 + if hunkno < len(self.hunks[fileno]): + hunk = self.hunks[fileno][hunkno] + continue + else: + break + + # check if processed line is the last line + if lineno+1 == hunk.startsrc+len(hunkfind)-1: + debug("file %s hunk no.%d -- is ready to be patched" % (filename, hunkno+1)) + hunkno+=1 + validhunks+=1 + if hunkno < len(self.hunks[fileno]): + hunk = self.hunks[fileno][hunkno] + else: + if validhunks == len(self.hunks[fileno]): + # patch file + canpatch = True + break + else: + if hunkno < len(self.hunks[fileno]): + warning("premature end of source file %s at hunk %d" % (filename, hunkno+1)) + + f2fp.close() + + if validhunks < len(self.hunks[fileno]): + if self._match_file_hunks(filename, self.hunks[fileno]): + warning("already patched %s" % filename) + else: + warning("source file is different - %s" % filename) + if canpatch: + backupname = filename+".orig" + if exists(backupname): + warning("can't backup original file to %s - aborting" % backupname) + else: + import shutil + shutil.move(filename, backupname) + if self.write_hunks(backupname, filename, self.hunks[fileno]): + warning("successfully patched %s" % filename) + unlink(backupname) + else: + warning("error patching file %s" % filename) + shutil.copy(filename, filename+".invalid") + warning("invalid version is saved to %s" % filename+".invalid") + # todo: proper rejects + shutil.move(backupname, filename) + + # todo: check for premature eof + + + def can_patch(self, filename): + """ Check if specified filename can be patched. Returns None if file can + not be found among source filenames. False if patch can not be applied + clearly. True otherwise. + + :returns: True, False or None + """ + idx = self._get_file_idx(filename, source=True) + if idx == None: + return None + return self._match_file_hunks(filename, self.hunks[idx]) + + + def _match_file_hunks(self, filepath, hunks): + matched = True + fp = open(abspath(filepath)) + + class NoMatch(Exception): + pass + + lineno = 1 + line = fp.readline() + hno = None + try: + for hno, h in enumerate(hunks): + # skip to first line of the hunk + while lineno < h.starttgt: + if not len(line): # eof + debug("check failed - premature eof before hunk: %d" % (hno+1)) + raise NoMatch + line = fp.readline() + lineno += 1 + for hline in h.text: + if hline.startswith("-"): + continue + if not len(line): + debug("check failed - premature eof on hunk: %d" % (hno+1)) + # todo: \ No newline at the end of file + raise NoMatch + if line.rstrip("\r\n") != hline[1:].rstrip("\r\n"): + debug("file is not patched - failed hunk: %d" % (hno+1)) + raise NoMatch + line = fp.readline() + lineno += 1 + + except NoMatch: + matched = False + # todo: display failed hunk, i.e. expected/found + + fp.close() + return matched + + + def patch_stream(self, instream, hunks): + """ Generator that yields stream patched with hunks iterable + + Converts lineends in hunk lines to the best suitable format + autodetected from input + """ + + # todo: At the moment substituted lineends may not be the same + # at the start and at the end of patching. Also issue a + # warning/throw about mixed lineends (is it really needed?) + + hunks = iter(hunks) + + srclineno = 1 + + lineends = {'\n':0, '\r\n':0, '\r':0} + def get_line(): + """ + local utility function - return line from source stream + collecting line end statistics on the way + """ + line = instream.readline() + # 'U' mode works only with text files + if line.endswith("\r\n"): + lineends["\r\n"] += 1 + elif line.endswith("\n"): + lineends["\n"] += 1 + elif line.endswith("\r"): + lineends["\r"] += 1 + return line + + for hno, h in enumerate(hunks): + debug("hunk %d" % (hno+1)) + # skip to line just before hunk starts + while srclineno < h.startsrc: + yield get_line() + srclineno += 1 + + for hline in h.text: + # todo: check \ No newline at the end of file + if hline.startswith("-") or hline.startswith("\\"): + get_line() + srclineno += 1 + continue + else: + if not hline.startswith("+"): + get_line() + srclineno += 1 + line2write = hline[1:] + # detect if line ends are consistent in source file + if sum([bool(lineends[x]) for x in lineends]) == 1: + newline = [x for x in lineends if lineends[x] != 0][0] + yield line2write.rstrip("\r\n")+newline + else: # newlines are mixed + yield line2write + + for line in instream: + yield line + + + def write_hunks(self, srcname, tgtname, hunks): + src = open(srcname, "rb") + tgt = open(tgtname, "wb") + + debug("processing target file %s" % tgtname) + + tgt.writelines(self.patch_stream(src, hunks)) + + tgt.close() + src.close() + return True + + + def _get_file_idx(self, filename, source=None): + """ Detect index of given filename within patch. + + :param filename: + :param source: search filename among sources (True), + targets (False), or both (None) + :returns: int or None + """ + filename = abspath(filename) + if source == True or source == None: + for i,fnm in enumerate(self.source): + if filename == abspath(fnm): + return i + if source == False or source == None: + for i,fnm in enumerate(self.target): + if filename == abspath(fnm): + return i + + + + +from optparse import OptionParser +from os.path import exists +import sys + +if __name__ == "__main__": + opt = OptionParser(usage="%prog [options] unipatch-file", version="python-patch %s" % __version__) + opt.add_option("--debug", action="store_true", dest="debugmode", help="debug mode") + (options, args) = opt.parse_args() + + if not args: + opt.print_version() + opt.print_help() + sys.exit() + debugmode = options.debugmode + patchfile = args[0] + if not exists(patchfile) or not isfile(patchfile): + sys.exit("patch file does not exist - %s" % patchfile) + + + if debugmode: + loglevel = logging.DEBUG + logformat = "%(levelname)8s %(message)s" + else: + loglevel = logging.INFO + logformat = "%(message)s" + logger.setLevel(loglevel) + loghandler.setFormatter(logging.Formatter(logformat)) + + + + patch = fromfile(patchfile) + #pprint(patch) + patch.apply() + + # todo: document and test line ends handling logic - patch.py detects proper line-endings + # for inserted hunks and issues a warning if patched file has incosistent line ends diff -r 40eddcc3d063 -r 3a30d255c235 sbin/virtualenv/res/patch/pyxml.patch --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/sbin/virtualenv/res/patch/pyxml.patch Sun Nov 14 20:25:22 2010 +0100 @@ -0,0 +1,28 @@ +diff -ur xml/xpath/ParsedAbbreviatedAbsoluteLocationPath.py b/xml/xpath/ParsedAbbreviatedAbsoluteLocationPath.py +--- xml/xpath/ParsedAbbreviatedAbsoluteLocationPath.py 2003-03-11 15:01:34.000000000 +0100 ++++ xml/xpath/ParsedAbbreviatedAbsoluteLocationPath.py 2009-05-25 16:32:26.000000000 +0200 +@@ -24,8 +24,8 @@ + self._rel = rel + nt = ParsedNodeTest.ParsedNodeTest('node', '') + ppl = ParsedPredicateList.ParsedPredicateList([]) +- as = ParsedAxisSpecifier.ParsedAxisSpecifier('descendant-or-self') +- self._step = ParsedStep.ParsedStep(as, nt, ppl) ++ asp = ParsedAxisSpecifier.ParsedAxisSpecifier('descendant-or-self') ++ self._step = ParsedStep.ParsedStep(asp, nt, ppl) + return + + def evaluate(self, context): +diff -ur a/xml/xpath/ParsedAbbreviatedRelativeLocationPath.py b/xml/xpath/ParsedAbbreviatedRelativeLocationPath.py +--- xml/xpath/ParsedAbbreviatedRelativeLocationPath.py 2003-03-11 15:01:34.000000000 +0100 ++++ xml/xpath/ParsedAbbreviatedRelativeLocationPath.py 2009-05-25 16:27:55.000000000 +0200 +@@ -28,8 +28,8 @@ + self._right = right + nt = ParsedNodeTest.ParsedNodeTest('node','') + ppl = ParsedPredicateList.ParsedPredicateList([]) +- as = ParsedAxisSpecifier.ParsedAxisSpecifier('descendant-or-self') +- self._middle = ParsedStep.ParsedStep(as, nt, ppl) ++ asp = ParsedAxisSpecifier.ParsedAxisSpecifier('descendant-or-self') ++ self._middle = ParsedStep.ParsedStep(asp, nt, ppl) + + def evaluate(self, context): + res = [] diff -r 40eddcc3d063 -r 3a30d255c235 sbin/virtualenv/res/src/4Suite-XML-1.0.2.tar.bz2 Binary file sbin/virtualenv/res/src/4Suite-XML-1.0.2.tar.bz2 has changed diff -r 40eddcc3d063 -r 3a30d255c235 sbin/virtualenv/res/src/Django-1.2.3.tar.gz Binary file sbin/virtualenv/res/src/Django-1.2.3.tar.gz has changed diff -r 40eddcc3d063 -r 3a30d255c235 sbin/virtualenv/res/src/Imaging-1.1.7.tar.gz Binary file sbin/virtualenv/res/src/Imaging-1.1.7.tar.gz has changed diff -r 40eddcc3d063 -r 3a30d255c235 sbin/virtualenv/res/src/MySQL-python-1.2.3c1.tar.gz Binary file sbin/virtualenv/res/src/MySQL-python-1.2.3c1.tar.gz has changed diff -r 40eddcc3d063 -r 3a30d255c235 sbin/virtualenv/res/src/PyXML-0.8.4.tar.gz Binary file sbin/virtualenv/res/src/PyXML-0.8.4.tar.gz has changed diff -r 40eddcc3d063 -r 3a30d255c235 sbin/virtualenv/res/src/distribute-0.6.13.tar.gz Binary file sbin/virtualenv/res/src/distribute-0.6.13.tar.gz has changed diff -r 40eddcc3d063 -r 3a30d255c235 sbin/virtualenv/res/src/django-extensions-0.4.1.tar.gz Binary file sbin/virtualenv/res/src/django-extensions-0.4.1.tar.gz has changed diff -r 40eddcc3d063 -r 3a30d255c235 sbin/virtualenv/res/src/django-registration.tar.gz Binary file sbin/virtualenv/res/src/django-registration.tar.gz has changed diff -r 40eddcc3d063 -r 3a30d255c235 sbin/virtualenv/res/src/django-tagging-0.3.1.tar.gz Binary file sbin/virtualenv/res/src/django-tagging-0.3.1.tar.gz has changed diff -r 40eddcc3d063 -r 3a30d255c235 sbin/virtualenv/res/src/jogging-0.2.2.tar.gz Binary file sbin/virtualenv/res/src/jogging-0.2.2.tar.gz has changed diff -r 40eddcc3d063 -r 3a30d255c235 sbin/virtualenv/res/src/lxml-2.2.7.tar.gz Binary file sbin/virtualenv/res/src/lxml-2.2.7.tar.gz has changed diff -r 40eddcc3d063 -r 3a30d255c235 sbin/virtualenv/res/src/psycopg2-2.2.1.tar.gz Binary file sbin/virtualenv/res/src/psycopg2-2.2.1.tar.gz has changed diff -r 40eddcc3d063 -r 3a30d255c235 sbin/virtualenv/res/src/pylucene-3.0.1-1-src.tar.gz Binary file sbin/virtualenv/res/src/pylucene-3.0.1-1-src.tar.gz has changed diff -r 40eddcc3d063 -r 3a30d255c235 web/.htaccess.tmpl --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/web/.htaccess.tmpl Sun Nov 14 20:25:22 2010 +0100 @@ -0,0 +1,1 @@ +RedirectMatch permanent /~ymh/leezam/?$ /~ymh/leezam/leezam diff -r 40eddcc3d063 -r 3a30d255c235 web/ldt/.htaccess --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/web/ldt/.htaccess Sun Nov 14 20:25:22 2010 +0100 @@ -0,0 +1,16 @@ +SetEnv DJANGO_SETTINGS_MODULE ldt.settings +SetEnv PY_USE_XMLPLUS true +SetEnv PROJECT_PATH /iridata/users/wakimd/hg/leezam/web +SetEnv PYTHON_PATH /iridata/users/wakimd/Env/Efculture/lib/python2.6/site-packages + +Options ExecCGI FollowSymLinks +SetHandler wsgi-script + +RewriteEngine On +RewriteCond %{REQUEST_FILENAME} !-f +RewriteRule ^(.*)$ /dev/~wakimd/leezam/leezam/modwsgi.wsgi/$1 [QSA,PT,L] + +Header set Pragma "no-cache" +Header set Cache-Control "no-cache" +Header set Expires "-1" + diff -r 40eddcc3d063 -r 3a30d255c235 web/ldt/.htaccess.tmpl --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/web/ldt/.htaccess.tmpl Sun Nov 14 20:25:22 2010 +0100 @@ -0,0 +1,11 @@ +SetHandler python-program +PythonPath "['D:/wuj/dev/ldt', 'D:/wuj/dev/ldt/lib'] + sys.path" +PythonHandler django.core.handlers.modpython +SetEnv DJANGO_SETTINGS_MODULE ldt.settings +SetEnv PY_USE_XMLPLUS true +PythonInterpreter ldt +PythonOption django.root /dev/ldt/ldt +PythonDebug on +Header set Pragma "no-cache" +Header set Cache-Control "no-cache" +Header set Expires "-1" \ No newline at end of file diff -r 40eddcc3d063 -r 3a30d255c235 web/ldt/__init__.py --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/web/ldt/__init__.py Sun Nov 14 20:25:22 2010 +0100 @@ -0,0 +1,16 @@ +VERSION = (0, 2, 0, "final", 0) + + +def get_version(): + version = '%s.%s' % (VERSION[0], VERSION[1]) + if VERSION[2]: + version = '%s.%s' % (version, VERSION[2]) + if VERSION[3:] == ('alpha', 0): + version = '%s pre-alpha' % version + else: + if VERSION[3] != 'final': + version = '%s %s %s' % (version, VERSION[3], VERSION[4]) + return version + + +__version__ = get_version() diff -r 40eddcc3d063 -r 3a30d255c235 web/ldt/admin.py --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/web/ldt/admin.py Sun Nov 14 20:25:22 2010 +0100 @@ -0,0 +1,30 @@ +from django.contrib import admin +from ldt.management import test_cms + +""" +site admin pour cms page +""" +if test_cms(): + class AdminSite(admin.AdminSite): + index_template = 'admin/page_index.html' + login_template = 'admin/page_login.html' + app_index_template = 'admin/page_app_index.html' + + admin_site = AdminSite() + + from cms.models import Page + from cms.admin import pageadmin + + class CmsPageAdmin(pageadmin.PageAdmin): + change_list_template = "admin/cms_change_list.html" + change_form_template = "admin/cms_change_form.html" + + admin_site.register(Page, CmsPageAdmin) + + from cms.plugins.snippet.models import Snippet + from cms.plugins.snippet.admin import SnippetAdmin + + class CmsSnippetAdmin(SnippetAdmin): + change_form_template = "admin/page_change_form.html" + change_list_template = "admin/page_change_list.html" + admin_site.register(Snippet, CmsSnippetAdmin) \ No newline at end of file diff -r 40eddcc3d063 -r 3a30d255c235 web/ldt/auth/__init__.py --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/web/ldt/auth/__init__.py Sun Nov 14 20:25:22 2010 +0100 @@ -0,0 +1,7 @@ + +def checkAccess(user, obj): + check_meth = getattr(obj, 'checkAccess', False) + if check_meth: + return check_meth(user) + else: + return user.is_staff \ No newline at end of file diff -r 40eddcc3d063 -r 3a30d255c235 web/ldt/core/__init__.py diff -r 40eddcc3d063 -r 3a30d255c235 web/ldt/core/handlers/__init__.py diff -r 40eddcc3d063 -r 3a30d255c235 web/ldt/core/handlers/modpython.py --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/web/ldt/core/handlers/modpython.py Sun Nov 14 20:25:22 2010 +0100 @@ -0,0 +1,8 @@ + +def handler(req): + activate_this = req.get_options().get("virtualenv.activate_path") + execfile(activate_this, dict(__file__=activate_this)) + + import django.core.handlers.modpython + + return django.core.handlers.modpython.handler(req) \ No newline at end of file diff -r 40eddcc3d063 -r 3a30d255c235 web/ldt/core/handlers/modwsgi.py --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/web/ldt/core/handlers/modwsgi.py Sun Nov 14 20:25:22 2010 +0100 @@ -0,0 +1,24 @@ +import os, sys, site + +def application(environ, start_response): + os.environ['DJANGO_SETTINGS_MODULE'] = environ['DJANGO_SETTINGS_MODULE'] + os.environ['PY_USE_XMLPLUS'] = environ['PY_USE_XMLPLUS'] + + prev_sys_path = list(sys.path) + + sys.path.append(environ['PROJECT_PATH']) + site.addsitedir(environ['PYTHON_PATH']) + + new_sys_path = [] + for item in list(sys.path): + if item not in prev_sys_path: + new_sys_path.append(item) + sys.path.remove(item) + sys.path[:0] = new_sys_path + + import django.core.handlers.wsgi + + _application = django.core.handlers.wsgi.WSGIHandler() + + return _application(environ, start_response) + diff -r 40eddcc3d063 -r 3a30d255c235 web/ldt/core/models.py --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/web/ldt/core/models.py Sun Nov 14 20:25:22 2010 +0100 @@ -0,0 +1,22 @@ +from django.db import models +from django.contrib.auth.models import * + + +class Owner(models.Model): + user = models.ForeignKey(User, blank=True, null=True) + group = models.ForeignKey(Group, blank=True, null=True) + + def __unicode__(self): + if self.user: + return self.user.username + else: + return self.group.name + + +class Document(models.Model): + owner= models.ForeignKey(Owner, blank = True, null=True) + + class Meta: + abstract = True + + diff -r 40eddcc3d063 -r 3a30d255c235 web/ldt/core/tests.py --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/web/ldt/core/tests.py Sun Nov 14 20:25:22 2010 +0100 @@ -0,0 +1,23 @@ +""" +This file demonstrates two different styles of tests (one doctest and one +unittest). These will both pass when you run "manage.py test". + +Replace these with more appropriate tests for your application. +""" + +from django.test import TestCase + +class SimpleTest(TestCase): + def test_basic_addition(self): + """ + Tests that 1 + 1 always equals 2. + """ + self.failUnlessEqual(1 + 1, 2) + +__test__ = {"doctest": """ +Another way to test that 1 + 1 is equal to 2. + +>>> 1 + 1 == 2 +True +"""} + diff -r 40eddcc3d063 -r 3a30d255c235 web/ldt/core/views.py --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/web/ldt/core/views.py Sun Nov 14 20:25:22 2010 +0100 @@ -0,0 +1,1 @@ +# Create your views here. diff -r 40eddcc3d063 -r 3a30d255c235 web/ldt/forms/__init__.py diff -r 40eddcc3d063 -r 3a30d255c235 web/ldt/forms/widgets.py --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/web/ldt/forms/widgets.py Sun Nov 14 20:25:22 2010 +0100 @@ -0,0 +1,17 @@ +""" +Some useful form widgets +""" + +from django.contrib.admin.widgets import AdminSplitDateTime +from django.utils.safestring import mark_safe +from django.utils.translation import ugettext as _ + + +class LdtSplitDateTime(AdminSplitDateTime): + """ + A widget that extend the AdminSplitDateTime to improve the html outputted + """ + + def format_output(self, rendered_widgets): + return mark_safe(u'
%s
%s
%s
%s
' % \ + (_('Date'), rendered_widgets[0], _('Time'), rendered_widgets[1])) diff -r 40eddcc3d063 -r 3a30d255c235 web/ldt/ldt_utils/__init__.py --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/web/ldt/ldt_utils/__init__.py Sun Nov 14 20:25:22 2010 +0100 @@ -0,0 +1,15 @@ +import lucene +from django.conf import settings + +lucene.initVM(lucene.CLASSPATH) + +STORE = lucene.SimpleFSDirectory(lucene.File(settings.INDEX_PATH)) +ANALYZER = lucene.PerFieldAnalyzerWrapper(lucene.StandardAnalyzer(lucene.Version.LUCENE_CURRENT)) +ANALYZER.addAnalyzer("tags",lucene.FrenchAnalyzer(lucene.Version.LUCENE_CURRENT)) +ANALYZER.addAnalyzer("title",lucene.FrenchAnalyzer(lucene.Version.LUCENE_CURRENT)) +ANALYZER.addAnalyzer("abstract",lucene.FrenchAnalyzer(lucene.Version.LUCENE_CURRENT)) +ANALYZER.addAnalyzer("all",lucene.FrenchAnalyzer(lucene.Version.LUCENE_CURRENT)) + + +VERSION = (0,1) +VERSION_STR = unicode(".".join(map(lambda i:"%02d" % (i,), VERSION))) diff -r 40eddcc3d063 -r 3a30d255c235 web/ldt/ldt_utils/admin.py --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/web/ldt/ldt_utils/admin.py Sun Nov 14 20:25:22 2010 +0100 @@ -0,0 +1,82 @@ +from django.contrib import admin +from django.conf.urls.defaults import * +from django.shortcuts import render_to_response +from django.template import RequestContext +from django.conf import settings +from models import * +from forms import * +from fileimport import * +from ldt.ldt_utils import STORE +from ldt.ldt_utils import ANALYZER + +import lucene + +admin.site.register(Project) + +class ContentAdmin(admin.ModelAdmin): + + def import_file(self, request): + if request.method =='POST': + form = LdtImportForm(request.POST, request.FILES) + if form.is_valid(): + filetoprocess =form.cleaned_data['importFile'] + flatten = form.cleaned_data['flatten'] + videoPath = form.cleaned_data['videoPath'] + # fi = None + fi = FileImport(filetoprocess, videoPath, flatten) + try: + fi.processFile() + args = {'message': "File imported"} + except FileImportError: + non_field_errors = form.non_field_errors() + non_field_errors.append("Error when importing : unknown file type") + form._errors["__all__"] = non_field_errors + args = {'message': "Can not import file, unknown file type", 'form': form} + + else: + non_field_errors = form.non_field_errors() + non_field_errors.append("Error when importing : invalid form") + form._errors["__all__"] = non_field_errors + args = {'message': "Error when importing : invalid form", 'form': form} + else: + form = LdtImportForm() + args = {'form': form, 'current_app': self.admin_site.name, 'current_action' : 'import_file'} + return render_to_response('admin/ldt_utils/content/upload_form.html', args, context_instance=RequestContext(request)) + + def reindex(self, request): + message = None + if request.method == "POST": + form = ReindexForm(request.POST) + if form.is_valid(): + # try: + writer = lucene.IndexWriter(STORE, ANALYZER, True, lucene.IndexWriter.MaxFieldLength.UNLIMITED) + contentList = form.cleaned_data["contents"] + indexer = ContentIndexer(contentList,writer) + indexer.index_all() + + writer.close() + message = "Indexation ok : " + repr(form.cleaned_data["contents"]) + form = ReindexForm() + # except Exception, inst: + # non_field_errors = form.non_field_errors() + # non_field_errors.append("Error when reindexing : " + cgi.escape(repr(inst))) + # form._errors["__all__"] = non_field_errors + #message = "ERROR : " + repr(non_field_errors) + else: + form = ReindexForm() + + return render_to_response('admin/ldt_utils/content/reindex_form.html', {'form': form, 'message':message, 'current_app': self.admin_site.name, 'current_action' : 'reindex' }, context_instance=RequestContext(request)) + + def get_urls(self): + urls = super(ContentAdmin, self).get_urls() + content_urls = patterns('', + url(r'^reindex/$', self.admin_site.admin_view(self.reindex), name="ldt_content_reindex"), + # (r'^admin/ldt/content/import/upload/$', 'ldt.ldt_utils.views.uploadFile'), + url(r'^import/$', self.admin_site.admin_view(self.import_file), name="ldt_content_import_file") + ) + return content_urls + urls + + +admin.site.register(Content, ContentAdmin) +admin.site.register(Media) +admin.site.register(Author) diff -r 40eddcc3d063 -r 3a30d255c235 web/ldt/ldt_utils/contentindexer.py --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/web/ldt/ldt_utils/contentindexer.py Sun Nov 14 20:25:22 2010 +0100 @@ -0,0 +1,231 @@ +import tempfile +import os +import os.path +import shutil +from ldt.utils import zipfileext +import urllib +# import ldt.utils.log +import ldt.utils.xml +from django.conf import settings +from models import Content +import fnmatch +import uuid +import shutil +import lucene +from ldt.ldt_utils import STORE +from ldt.ldt_utils import ANALYZER +import lxml.etree + +def Property(func): + return property(**func()) + + +class ContentIndexer(object): + + def __init__(self, contentList, writer, decoupage_blackList = settings.DECOUPAGE_BLACKLIST): + self.__contentList = contentList + self.__decoupage_blacklist = decoupage_blackList + self.__writer = writer + + @Property + def decoupage_blacklist(): #@NoSelf + doc = """get blacklist""" #@UnusedVariable + + def fget(self): + if self.__decoupage_blacklist is None: + self.__decoupage_blacklist = () + return self.__decoupage_blacklist + + def fset(self, value): + self.__decoupage_blacklist = value + + def fdel(self): + del self.__decoupage_blacklist + + return locals() + + def index_all(self): + for content in self.__contentList: + self.index_content(content) + + def index_content(self, content): + url =content.iri_url() + filepath = urllib.urlopen(url) + doc = lxml.etree.fromstring(filepath) + + self.__writer.deleteDocuments(lucene.Term("iri_id", content.iri_id)) + + res = doc.xpath("/iri/body/ensembles/ensemble") + + for ensemble in res: + ensembleId = ensemble.get(None,u"id") + + for decoupageNode in ensemble.getchildren(): + if decoupageNode.tag != "decoupage" or decoupageNode.get(None,u"id") in self.decoupage_blacklist: + + continue + + decoupId = decoupageNode.get(None,u"id") + res = decoupageNode.xpath("elements/element") + for elementNode in res: + doc = lucene.Document() + elementId = elementNode.get(None,u"id") + tags = elementNode.get(None,u"tags") + + if tags is not None: + tags.replace(",", ";") + + if tags is None or len(tags) == 0: + tags = "" + restagnode = elementNode.xpath("tag/text()") + for tagnode in restagnode: + tags = tags + " ; " + tagnode.text() + + if tags is None or len(tags) == 0: + tags = "" + restagnode = elementNode.xpath("tags/tag/text()") + + for tagnode in restagnode: + tags = tags + " ; " + tagnode.text() + + title = "" + for txtRes in elementNode.xpath("title/text()"): + title = title + txtRes.text() + + abstract = "" + for txtRes in elementNode.xpath("abstract/text()"): + abstract = abstract + txtRes.text() + + doc.add(lucene.Field("iri_id", content.iri_id, lucene.Field.Store.YES, lucene.Field.Index.NOT_ANALYZED)) + doc.add(lucene.Field("ensemble_id", ensembleId, lucene.Field.Store.YES, lucene.Field.Index.NO)) + doc.add(lucene.Field("decoupage_id", decoupId, lucene.Field.Store.YES, lucene.Field.Index.NO)) + doc.add(lucene.Field("element_id", elementId, lucene.Field.Store.YES, lucene.Field.Index.NO)) + doc.add(lucene.Field("tags", tags, lucene.Field.Store.NO, lucene.Field.Index.ANALYZED)) + doc.add(lucene.Field("title", title, lucene.Field.Store.NO, lucene.Field.Index.ANALYZED)) + doc.add(lucene.Field("abstract", abstract, lucene.Field.Store.NO, lucene.Field.Index.ANALYZED)) + doc.add(lucene.Field("all", " ".join([tags, title, abstract]), lucene.Field.Store.NO, lucene.Field.Index.ANALYZED)) + + seg = Segment(content=content, + iri_id=content.iri_id, + ensemble_id=ensembleId, + cutting_id=decoupId, + element_id=elementId, + tags=tags, + title=title, + abstract=abstract, + duration=duration, + author=author, + start_ts=start_ts, + date=date_str) + seg.save() + + + self.__writer.addDocument(doc) + + self.__writer.commit() + + +class ProjectIndexer(object): + + def __init__(self, projectList, writer, decoupage_blackList = settings.DECOUPAGE_BLACKLIST): + self.__projectList = projectList + self.__decoupage_blacklist = decoupage_blackList + self.__writer = writer + + @Property + def decoupage_blacklist(): #@NoSelf + doc = """get blacklist""" #@UnusedVariable + + def fget(self): + if self.__decoupage_blacklist is None: + self.__decoupage_blacklist = () + return self.__decoupage_blacklist + + def fset(self, value): + self.__decoupage_blacklist = value + + def fdel(self): + del self.__decoupage_blacklist + + return locals() + + def index_all(self): + for project in self.__projectList: + self.index_project(project) + + def index_project(self, project): + + # pocketfilms.utils.log.debug("Indexing project : "+str(project.iri_id)) + doc = lxml.etree.fromstring(project.ldt) + + self.__writer.deleteDocuments(lucene.Term("iri_id", project.iri_id)) + + res = doc.xpath("/iri/annotations/content") + + for content in res: + contentId = content.get(None,u"id") + + ensembleId = "ens_perso" + + for decoupageNode in content.getchildren(): + # pocketfilms.utils.log.debug("Indexing content decoupage : "+ repr(decoupageNode.nodeType) + " in " + repr(self.decoupage_blacklist)) + if decoupageNode.tag != "decoupage" or decoupageNode.get(None,"id") in self.decoupage_blacklist: + continue + + decoupId = decoupageNode.get(None,u"id") + res = decoupageNode.xpath("elements/element") + for elementNode in res: + doc = lucene.Document() + elementId = elementNode.get(None,u"id") + tags = elementNode.get(None,u"tags") + + if tags is not None: + tags.replace(",", ";") + + if tags is None or len(tags) == 0: + tags = "" + restagnode = elementNode.xpath("tag/text()") + for tagnode in restagnode: + tags = tags + " ; " + tagnode.text() + + if tags is None or len(tags) == 0: + tags = "" + restagnode = elementNode.xpath("tags/tag/text()") + for tagnode in restagnode: + tags = tags + " ; " + tagnode.text() + + title = "" + for txtRes in elementNode.xpath("title/text()"): + title = title + txtRes.text() + + abstract = "" + for txtRes in elementNode.xpath("abstract/text()"): + abstract = abstract + txtRes.text() + + doc.add(lucene.Field("project_id", project.iri_id, lucene.Field.Store.YES, lucene.Field.Index.NOT_ANALYZED)) + doc.add(lucene.Field("iri_id", contentId, lucene.Field.Store.YES, lucene.Field.Index.NOT_ANALYZED)) + doc.add(lucene.Field("ensemble_id", ensembleId, lucene.Field.Store.YES, lucene.Field.Index.NO)) + doc.add(lucene.Field("decoupage_id", decoupId, lucene.Field.Store.YES, lucene.Field.Index.NO)) + doc.add(lucene.Field("element_id", elementId, lucene.Field.Store.YES, lucene.Field.Index.NO)) + doc.add(lucene.Field("tags", tags, lucene.Field.Store.NO, lucene.Field.Index.ANALYZED)) + doc.add(lucene.Field("title", title, lucene.Field.Store.NO, lucene.Field.Index.ANALYZED)) + doc.add(lucene.Field("abstract", abstract, lucene.Field.Store.NO, lucene.Field.Index.ANALYZED)) + doc.add(lucene.Field("all", " ".join([tags, title, abstract]), lucene.Field.Store.NO, lucene.Field.Index.ANALYZED)) + + seg = Segment(content=content, + iri_id=content.iri_id, + ensemble_id=ensembleId, + cutting_id=decoupId, + element_id=elementId, + tags=tags, + title=title, + abstract=abstract, + duration=duration, + author=author, + start_ts=start_ts, + date=date_str) + seg.save() + + self.__writer.addDocument(doc) + + self.__writer.commit() diff -r 40eddcc3d063 -r 3a30d255c235 web/ldt/ldt_utils/fileimport.py --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/web/ldt/ldt_utils/fileimport.py Sun Nov 14 20:25:22 2010 +0100 @@ -0,0 +1,398 @@ +from copy import deepcopy +from django.conf import settings +from django.core.exceptions import ObjectDoesNotExist +from ldt.utils import zipfileext +from models import Content, Media +import fnmatch +import lxml.etree +import os.path +import shutil +import tempfile +import urllib +import uuid + +class FileImportError(Exception): + def __init__(self, value): + self.value = value + def __str__(self): + return repr(self.value) + + +def Property(func): + return property(**func()) + +class IriInfo(object): + + + def __init__(self, id, order, titledesc, basepath="", videopath=settings.STREAM_URL, decoupage_blacklist = settings.DECOUPAGE_BLACKLIST, flatten = True): + self.id = id + self.basepath = basepath + self.order = order + self.src = "" + self.annotations = None + self.videopath = videopath + self.videourl = "" + self.title = None + self.desc = None + self.duration = None + self.created = False + self.content = None + self.decoupage_blacklist = decoupage_blacklist + if self.decoupage_blacklist is None: + self.decoupage_blacklist = () + self.flatten = flatten + + + + def processIri(self): + # for just import a file ldt and get the title for every media + if 'http' in self.src: + #url = urllib.urlopen(self.src) + path = url + #doc = xml.dom.minidom.parse(url) + #for import a zip, get title and copy file .iri in the media directory + else: + path = os.path.join(self.basepath, self.src) + #doc = xml.dom.minidom.parse(path) + + doc = lxml.etree.parse(path) + + + #doc = Ft.Xml.Domlette.ConvertDocument(doc) + #con = xml.xpath.Context.Context(doc, 1, 1, None) + + res = doc.xpath("/iri/head/meta[@name='title']/@content") + #res = xml.xpath.Evaluate("/iri/head/meta[@name='title']/@content", context=con) + #self.title = res[0].value + self.title = res[0] + + + #res = xml.xpath.Evaluate("/iri/body/ensembles",context=con) + res = doc.xpath("/iri/body/ensembles") + ensemblesnode = res[0] + + ensembleids = [] + + for node in ensemblesnode: #ensemblesnode.childNodes: + #if node.nodeType == xml.dom.Node.ELEMENT_NODE and node.tagName == "ensemble": + if node.tag == "ensemble": + #id = node.getAttributeNS(None,u"id") + id = node.attrib["id"] + if id not in ensembleids: + ensembleids.append(id) + + if self.annotations is not None: + newEnsemble = None + #for cnode in self.annotations.childNodes: + for cnode in self.annotations: + #if cnode.nodeType == xml.dom.Node.ELEMENT_NODE and cnode.tagName == "decoupage": + if cnode.tag == "decoupage": + if newEnsemble is None: + #newensemble = doc.createElementNS(None,'ensemble') + ensembleid = self.id+"_"+str(uuid.uuid1()) + newensemble = lxml.etree.SubElement(ensemblesnode, + 'ensemble', + {'id' : ensembleid, + 'title' : self.annotations.get('title') or "", + 'author' : self.annotations.get('author') or "", + 'date' : self.annotations.get('date') or "", + 'abstract' : self.annotations.get('abstract') or "" + } + ) + ensembleids.append(ensembleid) + newDecoupageNode = deepcopy(cnode) + newensemble.append(newDecoupageNode) + #elif cnode.nodeType == xml.dom.Node.ELEMENT_NODE and cnode.tagName == "ensemble": + elif cnode.tag == "ensemble": + #ensembleid = cnode.getAttribute(u"id") + ensembleid = cnode.attrib['id'] + cloneNode = deepcopy(cnode) + if ensembleid in ensembleids: + ensembleid = self.id+"_"+str(uuid.uuid1()) + cloneNode.set(u"id", ensembleid) + ensembleids.append(ensembleid) + ensemblesnode.append(cloneNode) + + res = doc.xpath("/iri/body/medias/media[@id='video']/video") + if self.flatten: + src_video = res[0].get('src') + self.videourl = os.path.basename(src_video) + res[0].set('src', self.videourl) + self.duration = res[0].get(u'dur') + + f = open(path, "w") + try: + #etree = lxml.etree.ElementTree(doc) + doc.write(f, encoding="UTF-8", pretty_print=True, xml_declaration=True) +# xml.dom.ext.Print(doc, stream=f) + finally: + f.close() + + + destPath = os.path.join(os.path.join(os.path.join(settings.MEDIA_ROOT, "media"), "ldt"), self.id); + if not os.path.exists(destPath): + os.makedirs(destPath) + shutil.move(os.path.join(self.basepath, self.src), os.path.join(destPath, os.path.basename(self.src))) + self.src = self.id + u"/" + os.path.basename(self.src) + + + + def saveContent(self): + + defaults_media = {'src':unicode(self.videourl), 'title':unicode(self.title), 'description':unicode(self.desc), 'videopath': unicode(self.videopath.rstrip("/") + "/")} + media, media_created = Media.objects.get_or_create(src=unicode(self.videourl), defaults = defaults_media) + if not media_created: + for key, value in defaults_media.items(): + setattr(media, key, value) + + media.save() + + defaults_content = { + 'iriurl': unicode(self.src), + 'title':unicode(self.title), + 'description':unicode(self.desc), + 'media':media, + 'iri':unicode(self.id + u"/" + os.path.basename(self.src)), + 'duration':int(self.duration) + } + content, self.created = Content.objects.get_or_create(iri_id=self.id, defaults = defaults_content) + if not self.created: + for key, value in defaults_content.items(): + setattr(content, key, value) + + content.save() + + self.content = content + + def process(self): + self.processIri() + self.saveContent() + +class BaseFileImport(object): + + def __init__(self, filepath, videopath): + self.__filepath = filepath + self.__tempdir = "" + self.__videopath = videopath + self.__author = None + + + def filepath(): #@NoSelf + doc = """Docstring""" #@UnusedVariable + + def fget(self): + return self.__filepath + + def fset(self, value): + self.__filepath = value + + def fdel(self): + del self.__filepath + + return locals() + + filepath = property(**filepath()) + + def videopath(): #@NoSelf + doc = """Docstring""" #@UnusedVariable + + def fget(self): + return self.__videopath + + def fset(self, value): + self.__videopath = value + + def fdel(self): + del self.__videopath + + return locals() + + videopath = property(**videopath()) + + def author(): #@NoSelf + doc = """Docstring""" #@UnusedVariable + + def fget(self): + return self.__author + + def fset(self, value): + self.__author = value + + def fdel(self): + del self.__author + + return locals() + + author = property(**author()) + + +class FileImport(BaseFileImport): + + def __init__(self, filepath, videopath, flatten): + BaseFileImport.__init__(self, filepath, videopath) + self.__checkExistingMedia = False + self.__flatten = flatten + + def checkExistingMedia(): #@NoSelf + doc = """Docstring""" #@UnusedVariable + + def fget(self): + return self.__checkExistingMedia + + def fset(self, value): + self.__checkExistingMedia = value + + def fdel(self): + del self.__checkExistingMedia + + return locals() + + checkExistingMedia = property(**checkExistingMedia()) + + def flatten(): #@NoSelf + doc = """Docstring""" #@UnusedVariable + + def fget(self): + return self.__flatten + + def fset(self, value): + self.__flatten = value + + def fdel(self): + del self.__flatten + + return locals() + flatten = property(**flatten()) + + def processLdt(self, ldtpath=None): + + # list iri + # see if there is some comments + # inject comment in iri + # copy iri in folder + # create or update content + contents = {} + filepath = ldtpath if ldtpath else self.filepath + doc = lxml.etree.parse(filepath) + #if ldtpath: + #doc = xml.dom.minidom.parse(ldtpath) + # doc = lxml.etree.parse(ldtpath) + #else: + #doc = xml.dom.minidom.parse(self.filepath) + + #con = xml.xpath.Context.Context(doc, 1, 1, None) + + #get author from file ldt + #result = xml.xpath.Evaluate("/iri/project", context=con) + result = doc.xpath("/iri/project") + for pnode in result: + #author = pnode.getAttributeNS(None,u"user") + author = pnode.attrib[u"user"] + if author: + self.author = unicode(author) + break + + result = doc.xpath("/iri/medias/media") + + for i, medianode in enumerate(result): + # get iri file's id from file ldt + #id = medianode.attributes['id'].value + id = medianode.attrib['id'] + if self.checkExistingMedia: + try: + Content.objects.get(iri_id=id) + do_pass = True + except ObjectDoesNotExist: #Content.DoesNotExist + do_pass = False + else: + do_pass = False + if not do_pass: + if not (contents.has_key(id)): + # Create instance iriInfo(id, order, titledesc, basepath="", videopath=settings.STREAM_URL) + if ldtpath: + contents[id] = IriInfo(id, i, "", os.path.dirname(ldtpath), flatten=self.flatten) + else: + contents[id] = IriInfo(id, i, "", flatten=self.flatten) + # Get iri file's url from ldt. This url can be relative path or absolute path. + #contents[id].src = medianode.attributes['src'].value + contents[id].src = medianode.attrib['src'] + if medianode.attrib['video'] !="": + contents[id].videopath = medianode.attrib['video'] + elif self.videopath !="" or self.videopath: + contents[id].videopath = self.videopath + else: + contents[id].videopath =settings.STREAM_URL + + + #get annotation of file ldt + result = doc.xpath("/iri/annotations/content") + + for contentnode in result: + id = contentnode.attrib['id'] + if contents.has_key(id): + if self.author: + contentnode.set("author", unicode(self.author)) + contents[id].annotations = contentnode + + #go throught values + for iriinfo in contents.values(): + + iriinfo.process() + + # if yes update + # if no create + # move iri file to the proper place + #return list of iriInfo + + def processFile(self): + if self.filepath.name.endswith(".ldt"): + self.processLdt() + elif self.filepath.name.endswith(".zip"): + self.processZip() + else: + raise FileImportError("Bad file type") + + + def processZip(self): + # """ extraire .zip, pass to method processLdt""" + # create temp directory + self.__tempdir = tempfile.mkdtemp() + openfiles = [] + flvfiles = [] + processedids = [] + + try: + zipfile = zipfileext.ZipFileExt(self.filepath) + zipfile.unzip_into_dir(self.__tempdir) + #load ldt + foldersToProcess = [self.__tempdir] + while len(foldersToProcess): + currentFolder = foldersToProcess.pop() + for entry in os.listdir(currentFolder): + if entry in settings.ZIP_BLACKLIST: + continue + entryPath = os.path.join(currentFolder, entry) + if(os.path.isdir(entryPath)): + foldersToProcess.append(entryPath) + elif fnmatch.fnmatch(entry, "*.ldt"): + ldtid = self.processLdt(entryPath) + processedids.append(ldtid) + elif fnmatch.fnmatch(entry, "*.flv"): + flvfiles.append(entryPath) + + if settings.CONTENT_ROOT and os.path.exists(settings.CONTENT_ROOT): + for entry in flvfiles: + shutil.copy(entry, settings.CONTENT_ROOT) + + finally: + for f in openfiles: + f.close() + shutil.rmtree(self.__tempdir) + # delete directory + return processedids + + # def processFileLdt(self): + # processedids = [] + # ldtid = self.processLdt(self.filepath) + # processedids.append(ldtid) + # return processedids diff -r 40eddcc3d063 -r 3a30d255c235 web/ldt/ldt_utils/forms.py --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/web/ldt/ldt_utils/forms.py Sun Nov 14 20:25:22 2010 +0100 @@ -0,0 +1,86 @@ +from django import forms +from models import Project, Content, Media +import uuid +from utils import generate_uuid +from django.forms.widgets import Widget, RadioSelect +from django.contrib.admin import widgets as admin_widgets +from django.core.urlresolvers import reverse +from ldt.settings import BASE_URL +from ldt.forms import widgets as ldt_widgets +from django.utils.translation import ugettext_lazy as _ + +class LdtImportForm(forms.Form): + importFile = forms.FileField() + videoPath = forms.CharField(required=False) + flatten = forms.BooleanField(required=False, initial=True) + +class LdtAddForm(forms.ModelForm): + title = forms.CharField() + # contents = forms.ModelMultipleChoiceField(Content.objects.all()) + # owner = forms.ModelChoiceField(Author.objects.all()) + class Meta: + model = Project + exclude = ("ldt_id", "ldt", "created_by", "changed_by", "creation_date", "modification_date", "state", "owner") + +class ReindexForm(forms.Form): + contents = forms.ModelMultipleChoiceField(Content.objects.all()) + +class SearchForm(forms.Form): + search = forms.CharField() + field = forms.ChoiceField([(u"all", u"all"), (u"title", u"title"), (u"abstract", u"resume"), (u"tags", u"tags")]) + +class AddProjectForm (forms.Form): + title = forms.CharField(widget=forms.TextInput(attrs={'class':'inputbox required'})) + +class CopyProjectForm (forms.Form): + title = forms.CharField() + + +class ContentForm(forms.ModelForm): + + #iri_id = forms.CharField(max_length=1024, widget=forms.HiddenInput, initial=generate_uuid) + iriurl = forms.CharField(max_length=1024, widget=forms.HiddenInput, required=False) + content_creation_date = forms.SplitDateTimeField(widget=ldt_widgets.LdtSplitDateTime, required=False, label=_("content.content_creation_date")) + media_input_type = forms.ChoiceField(required=False, label=_("content.media_input_type"), choices=(("upload",_("file_upload")),("url",_("url")),("link",_("existing_media")),("create",_("create_media")),("none",_("none_media")) )) + + def clean_iri_id(self): + data = self.cleaned_data.get('iri_id') + if not data: + data = generate_uuid() + return data + + def clean(self): + cleaned_data = self.cleaned_data + iriurl_data = cleaned_data.get('iriurl') + iri_id_data = cleaned_data['iri_id'] + if not iriurl_data: + iriurl_data = "%s/%s.iri" % (iri_id_data, iri_id_data) + cleaned_data['iriurl'] = iriurl_data + return cleaned_data + + class Meta: + model = Content + exclude = ("creation_date", "update_date", "authors") + widgets = { + 'iri_id': forms.HiddenInput, + } + + class Media: + css = { + 'all' : ('admin/css/forms.css','admin/css/base.css', 'admin/css/widgets.css') + } + +class MediaForm(forms.ModelForm): + + media_creation_date = forms.SplitDateTimeField(widget=ldt_widgets.LdtSplitDateTime, required=False) + media_file = forms.FileField(required=False); + src = forms.CharField(required=False, max_length=1024) + + class Meta: + model = Media + exclude = ("creation_date", "update_date", "creator") + + class Media: + css = { + 'all' : ('admin/css/forms.css','admin/css/base.css', 'admin/css/widgets.css') + } diff -r 40eddcc3d063 -r 3a30d255c235 web/ldt/ldt_utils/models.py --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/web/ldt/ldt_utils/models.py Sun Nov 14 20:25:22 2010 +0100 @@ -0,0 +1,51 @@ +from django.conf import settings +from django.db import models +from django.utils.translation import ugettext_lazy as _ +from ldt.core.models import Document, Owner +from django.contrib.auth.models import User +import tagging.fields +from utils import generate_uuid +import lxml.etree +import os.path +import uuid +import lucene +from ldt.ldt_utils import STORE, ANALYZER +#from django.core.management.validation import max_length + + + +class Annotation(models.Model): + id = models.CharField(max_length=1024, primary_key=True, unique=True, default=generate_uuid, verbose_name=_('annotation.id')) + uri = models.CharField(max_length=1024, verbose_name=_('annotation.uri')) + tags = models.CharField(max_length=1024, null=True, blank=True, verbose_name=_('annotation.tags')) + title = models.CharField(max_length=1024, null=True, blank=True, verbose_name=_('annotation.title')) + description = models.TextField(null=True, blank=True, verbose_name=_('annotation.description')) + text = models.TextField(null=True, blank=True, verbose_name=_('annotation.text')) + color = models.CharField(max_length=1024, verbose_name=_('annotation.color')) + creator = models.CharField(max_length=1024, null=True, blank=True, verbose_name=_('creator.title')) + contributor = models.CharField(max_length=1024, null=True, blank=True, verbose_name=_('contributor.title')) + creation_date = models.DateTimeField(auto_now_add=True, verbose_name=_('annotation.creation_date')) + update_date = models.DateTimeField(auto_now=True, verbose_name=_('annotation.update_date')) + + + def __unicode__(self): + return unicode(self.id) + u": " + unicode(self.title) + + @staticmethod + def create_annotation(id, uri=None, tags=None, title=None, description=None, text=None, color=None, creator=None, contributor=None, creation_date=None, update_date=None): + annotation = Annotation(id=id, uri=uri, tags=tags, title=title, description=description, text=text, color=color, creator=creator, contributor=contributor, creation_date=creation_date, update_date=update_date) + annotation.save() + + return annotation + + +#class Author(models.Model): +# +# handle = models.CharField(max_length=512, unique=True, blank=True, null=True) +# email = models.EmailField(unique=False, blank=True, null=True) +# firstname = models.CharField(max_length=512, blank=True, null=True) +# lastname = models.CharField(max_length=512, blank=True, null=True) +# +# def __unicode__(self): +# return unicode(self.id) + " - " + self.handle + ", " + self.email + ", " + self.firstname + " " + self.lastname + diff -r 40eddcc3d063 -r 3a30d255c235 web/ldt/ldt_utils/projectindexer.py --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/web/ldt/ldt_utils/projectindexer.py Sun Nov 14 20:25:22 2010 +0100 @@ -0,0 +1,108 @@ +import tempfile +import os +import os.path +import shutil +import ldt.utils.xml +from ldt import settings +import lucene +from ldt.ldt_utils import STORE +from ldt.ldt_utils import ANALYZER +import lxml.etree + +def Property(func): + return property(**func()) + +class ProjectIndexer(object): + def __init__(self, projectList, writer, decoupage_blackList = settings.DECOUPAGE_BLACKLIST): + self.__projectList = projectList + self.__decoupage_blacklist = decoupage_blackList + self.__writer = writer + + @Property + def decoupage_blacklist(): #@NoSelf + doc = """get blacklist""" #@UnusedVariable + + def fget(self): + if self.__decoupage_blacklist is None: + self.__decoupage_blacklist = () + return self.__decoupage_blacklist + + def fset(self, value): + self.__decoupage_blacklist = value + + def fdel(self): + del self.__decoupage_blacklist + + return locals() + + def index_all(self): + for project in self.__projectList: + self.index_project(project) + + def index_project(self, project): + # ldt.utils.log.debug("Indexing project : "+str(project.ldt_id)) + + ldt=project.ldt + doc = lxml.etree.fromstring(ldt.encode( "utf-8" )) + + self.__writer.deleteDocuments(lucene.Term("ldt_id", project.ldt_id)) + + res = doc.xpath("/iri/annotations/content") + project.ldt.encode( "utf-8 " ) + + for content in res: + contentId = content.get("id") + + res =content.xpath("ensemble") + for ensemble in res: + ensembleId = ensemble.get("id") + + for decoupageNode in ensemble.getchildren(): + # ldt.utils.log.debug("Indexing project decoupage : "+ repr(decoupageNode.nodeType) + " in " + repr(self.decoupage_blacklist)) + if decoupageNode.tag != "decoupage" or decoupageNode.get("id") in self.decoupage_blacklist: + continue + + decoupId = decoupageNode.get("id") + res = decoupageNode.xpath("elements/element") + + for elementNode in res: + doc = lucene.Document() + elementId = elementNode.get("id") + tags = elementNode.get("tags") + + if tags is not None: + tags.replace(",", ";") + + if tags is None or len(tags) == 0: + tags = "" + restagnode = elementNode.xpath("tag/text()") + for tagnode in restagnode: + tags = tags + " ; " + tagnode.text() + + if tags is None or len(tags) == 0: + tags = "" + restagnode = elementNode.xpath("tags/tag/text()") + for tagnode in restagnode: + tags = tags + " ; " + tagnode.text() + + title = "" + for txtRes in elementNode.xpath("title/text()"): + title = title + txtRes.text() + + abstract = "" + for txtRes in elementNode.xpath("abstract/text()"): + abstract = abstract + txtRes.text() + + doc.add(lucene.Field("ldt_id", project.ldt_id, lucene.Field.Store.YES, lucene.Field.Index.NOT_ANALYZED)) + doc.add(lucene.Field("iri_id", contentId, lucene.Field.Store.YES, lucene.Field.Index.NOT_ANALYZED)) + doc.add(lucene.Field("ensemble_id", ensembleId, lucene.Field.Store.YES, lucene.Field.Index.NO)) + doc.add(lucene.Field("decoupage_id", decoupId, lucene.Field.Store.YES, lucene.Field.Index.NO)) + doc.add(lucene.Field("element_id", elementId, lucene.Field.Store.YES, lucene.Field.Index.NO)) + doc.add(lucene.Field("tags", tags, lucene.Field.Store.NO, lucene.Field.Index.ANALYZED)) + doc.add(lucene.Field("title", title, lucene.Field.Store.NO, lucene.Field.Index.ANALYZED)) + doc.add(lucene.Field("abstract", abstract, lucene.Field.Store.NO, lucene.Field.Index.ANALYZED)) + doc.add(lucene.Field("all", " ".join([tags, title, abstract]), lucene.Field.Store.NO, lucene.Field.Index.ANALYZED)) + + self.__writer.addDocument(doc) + + self.__writer.commit() diff -r 40eddcc3d063 -r 3a30d255c235 web/ldt/ldt_utils/projectserializer.py --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/web/ldt/ldt_utils/projectserializer.py Sun Nov 14 20:25:22 2010 +0100 @@ -0,0 +1,426 @@ +from datetime import datetime +from django.utils.datastructures import SortedDict +from ldt.ldt_utils.models import Content, Project +import logging +import lxml.etree +import uuid + +DATE_FORMATS = ["%d/%m/%Y","%Y-%m-%d"] + +""" +Serialize a project object to a cinelab compatible array +""" +class ProjectSerializer: + + def __init__(self, project, from_contents=True, from_display=True): + self.project = project + self.parsed = False + self.ldt_doc = None + self.medias_dict = SortedDict() + self.annotations_dict = SortedDict() + self.annotations_by_annotation_types = {} + self.tags = {} + self.tags_dict = SortedDict() + self.annotation_types_dict = SortedDict() + self.views_dict = SortedDict() + self.lists_dict = SortedDict() + self.serialize_contents = from_contents + self.from_display = from_display + self.display_contents_list = [] + self.display_cuttings_list = [] + self.display_ensemble_list = [] + + + def __parse_views(self, display_node_list): + for display_node in display_node_list: + display_id = display_node.get(u"id", None) + if not display_id: + continue + content_list = [] + cuttings_list = [] + new_display = { + "id": display_id, + "contents": content_list, + "annotation_types": cuttings_list, + } + + for content_node in display_node.xpath("content"): + content_id = content_node.get("id") + if content_id not in content_list: + content_list.append(content_id) + if content_id not in self.display_contents_list: + self.display_contents_list.append(content_id) + for cutting_node in content_node.xpath("decoupage"): + cutting_id = cutting_node.get("id") + if cutting_id not in cuttings_list: + cuttings_list.append(cutting_id) + if cutting_id not in self.display_cuttings_list: + self.display_cuttings_list.append(cutting_id) + ensemble_id = cutting_node.get("idens") + if ensemble_id not in self.display_ensemble_list: + self.display_ensemble_list.append(ensemble_id) + self.views_dict[display_id] = new_display + + + + def __parse_ensemble(self, ensemble_node, content): + + ensemble_id = ensemble_node.attrib[u"id"] + ensemble_author = ensemble_node.attrib[u"author"] + ensemble_title = ensemble_node.attrib[u"title"] + ensemble_description = ensemble_node.attrib[u"abstract"] + ensemble_created = datetime.utcnow().isoformat() + ensemble_modified = ensemble_created + + list_items = [] + new_list = { + "id" : ensemble_id, + "items" : list_items, + "meta" : { + "dc:creator":ensemble_author, + "dc:created": ensemble_created, + "dc:contributor":"undefined", + "dc:modified": ensemble_modified, + "dc:title":ensemble_title, + "dc:description": ensemble_description, + "id-ref":content.iri_id, + "editable":"false" + } + } + + + for decoupage_node in ensemble_node: + if decoupage_node.tag != "decoupage" : + continue + + decoupage_id = decoupage_node.attrib[ u"id"] + if self.from_display and decoupage_id not in self.display_cuttings_list: + continue + decoupage_creator = decoupage_node.attrib[u"author"] + if not decoupage_creator: + decoupage_creator = "IRI" + decoupage_contributor = decoupage_creator + date_str = decoupage_node.get(u"date") + decoupage_created = None + if date_str : + for date_format in DATE_FORMATS: + try: + decoupage_created = datetime.strptime(date_str,date_format).isoformat() + break + except Exception: + decoupage_created = None + if decoupage_created is None: + decoupage_created = datetime.utcnow().isoformat() + decoupage_modified = decoupage_created + + decoupage_title = "" + for txtRes in decoupage_node.xpath("title/text()", smart_strings=False): + decoupage_title += txtRes + + decoupage_description = "" + for txtRes in decoupage_node.xpath("abstract/text()", smart_strings=False): + decoupage_description += txtRes + + + list_items.append({"id-ref":decoupage_id}) + + new_annotation_types = { + "id":decoupage_id, + "dc:creator":decoupage_creator, + "dc:created":decoupage_created, + "dc:contributor":decoupage_contributor, + "dc:modified":decoupage_modified, + "dc:title":decoupage_title, + "dc:description":decoupage_description + } + + self.annotation_types_dict[decoupage_id] = new_annotation_types + self.annotations_by_annotation_types[decoupage_id] = [] + + res = decoupage_node.xpath("elements/element") + for element_node in res: + + element_id = element_node.attrib[u"id"] + element_begin = element_node.attrib[u"begin"] + element_duration = element_node.attrib[u"dur"] + element_media = content.iri_id + element_color = element_node.attrib[u"color"] + + element_title = "" + for txtRes in element_node.xpath("title/text()", smart_strings=False): + element_title += txtRes + + element_description = "" + for txtRes in element_node.xpath("abstract/text()", smart_strings=False): + element_description += txtRes + + element_audio_src = "" + element_audio_href = "" + res = element_node.xpath("audio") + if len(res) > 0: + element_audio_src = res[0].get(u"source",u"") + element_audio_href = res[0].text + + element_tags = [] + + tags = element_node.get(u"tags",u"") + + tags_list = map(lambda s:s.strip(),tags.split(",")) + + #tags + if tags is None or len(tags) == 0: + tags_list = [] + restagnode = element_node.xpath("tag/text()", smart_strings=False) + for tagnode in restagnode: + tags_list.append(tagnode) + + if tags_list is None or len(tags_list) == 0: + tags_list = [] + restagnode = element_node.xpath("tags/tag/text()", smart_strings=False) + for tagnode in restagnode: + tags_list.append(tagnode) + + tag_date = datetime.utcnow().isoformat() + for tag_title in tags_list: + if tag_title not in self.tags: + tag_id = unicode(uuid.uuid1()) + new_tag = { + "id":tag_id, + "meta" : { + "dc:creator":"IRI", + "dc:created": tag_date, + "dc:contributor":"IRI", + "dc:modified": tag_date, + "dc:title":tag_title + } + } + self.tags[tag_title] = new_tag + self.tags_dict[tag_id] = new_tag + element_tags.append({"id-ref":tag_id}) + + if not element_tags: + element_tags = None + + new_annotation = { + "begin": element_begin, + "end": int(element_begin) + int(element_duration), + "id": element_id, + "media": element_media, + "content": { + "mimetype": "application/x-ldt-structured", + "title": element_title, + "description": element_description, + "color": element_color, + "audio": { + "src" : element_audio_src, + "mimetype": "audio/mp3", + "href": element_audio_href + }, + }, + "tags": element_tags, + "meta": { + "id-ref": decoupage_id, + "dc:creator": decoupage_creator, + "dc:contributor": decoupage_contributor, + "dc:created": decoupage_created, + "dc:modified": decoupage_modified + } + } + + self.annotations_dict[element_id] = new_annotation + self.annotations_by_annotation_types[decoupage_id].append(new_annotation) + + if not list_items: + new_list["items"] = None + self.lists_dict[ensemble_id] = new_list + + + def __parse_ldt(self): + + self.ldt_doc = lxml.etree.fromstring(self.project.ldt.encode("utf-8")) + + if self.from_display: + xpath_str = "/iri/displays/display[position()=1]" + if isinstance(self.from_display, basestring): + xpath_str = "/iri/displays/display[@id='%s']" % self.from_display + + self.__parse_views(self.ldt_doc.xpath(xpath_str)) + + res = self.ldt_doc.xpath("/iri/medias/media") + for mediaNode in res: + iri_id = mediaNode.attrib[u"id"] + if self.from_display and iri_id not in self.display_contents_list: + continue + content = Content.objects.get(iri_id=iri_id) + self.__parse_content(content) + + res = self.ldt_doc.xpath("/iri/annotations/content") + for content_node in res: + content_id = content_node.attrib[u"id"] + if self.from_display and content_id not in self.display_contents_list: + continue + content = Content.objects.get(iri_id=content_id) + for ensemble_node in content_node: + if ensemble_node.tag != "ensemble" : + continue + ensemble_id = ensemble_node.get("id") + if self.from_display and ensemble_id not in self.display_ensemble_list: + continue + self.__parse_ensemble(ensemble_node, content) + + #reorder annotations and annotation type from view + if self.from_display and len(self.views_dict) > 0: + new_annotation_types_dict = SortedDict() + new_annotations_dict = SortedDict() + for annotation_type in self.display_cuttings_list: + if annotation_type in self.annotation_types_dict: + new_annotation_types_dict[annotation_type] = self.annotation_types_dict[annotation_type] + for annot in self.annotations_by_annotation_types[annotation_type]: + new_annotations_dict[annot['id']] = annot + + self.annotations_dict = new_annotations_dict + self.annotation_types_dict = new_annotation_types_dict + + self.parsed = True + + def __parse_content(self, content): + + doc = lxml.etree.parse(content.iri_file_path()) + + authors = content.authors.all() + + if len(authors) > 0 : + author = authors[0].handle + else : + author = "IRI" + + if len(authors) > 1 : + contributor = authors[1].handle + else : + contributor = author + + content_author = "" + + res = doc.xpath("/iri/head/meta[@name='author']/@content") + if len(res) > 0: + content_author = res[0] + + + content_date = "" + + res = doc.xpath("/iri/head/meta[@name='date']/@content") + if len(res) > 0: + content_date = res[0] + + href = "" + meta_item_value = "" + if content.videopath: + href = content.videopath.rstrip('/') + "/" + content.src + meta_item_value = content.videopath.rstrip('/') + "/" + + new_media = { + "http://advene.liris.cnrs.fr/ns/frame_of_reference/ms" : "o=0", + "id" : content.iri_id, + "href" : href, + "unit" : "ms", + "origin" : "0", + "meta": { + "dc:creator" : author, + "dc:created" : content.creation_date.isoformat(), + "dc:contributor" : contributor, + "dc:modified" : content.update_date.isoformat(), + "dc:creator.contents" : content_author, + "dc:created.contents" : content_date, + "dc:title" : content.title, + "dc:description" : content.description, + "dc:duration" : content.get_duration(), + "item": { + "name" : "streamer", + "value": meta_item_value, + }, + } + } + + self.medias_dict[content.iri_id] = new_media + + if self.serialize_contents: + res = doc.xpath("/iri/body/ensembles/ensemble") + for ensemble_node in res: + self.__parse_ensemble(ensemble_node, content) + + + def serialize_to_cinelab(self): + + res = {} + + if not self.parsed: + self.__parse_ldt() + + + project_main_media = "" + if len(self.medias_dict) > 0: + project_main_media = self.medias_dict.value_for_index(0)["id"] + + res['meta'] = { + 'id': self.project.ldt_id, + 'dc:created':self.project.creation_date.isoformat(), + 'dc:modified':self.project.modification_date.isoformat(), + 'dc:contributor':self.project.changed_by, + 'dc:creator':self.project.created_by, + 'dc:title':self.project.title, + 'dc:description':self.project.get_description(self.ldt_doc), # get from doc, parse ldt + 'main_media': {"id-ref":project_main_media} + } + + + res['medias'] = self.medias_dict.values() if len(self.medias_dict) > 0 else None + res['lists'] = self.lists_dict.values() if len(self.lists_dict) > 0 else None + res['tags'] = self.tags.values() if len(self.tags) > 0 else None + res['views'] = self.views_dict.values() if len(self.views_dict) > 0 else None + + res['annotation-types'] = self.annotation_types_dict.values() if len(self.annotation_types_dict) > 0 else None + res['annotations'] = self.annotations_dict.values() if len(self.annotations_dict) > 0 else None + + + + return res + + def getAnnotations(self, first_cutting=True): + + if not self.parsed: + self.__parse_ldt() + + annotations = [] + + current_cutting = None + uri = None + for annot in self.annotations_dict.values(): + logging.debug("current cutting" + repr(current_cutting) + " : annot " + annot['meta']['id-ref']) + if first_cutting and current_cutting and current_cutting != annot['meta']['id-ref'] : + break + current_cutting = annot['meta']['id-ref'] + content_id = annot['media'] + content = Content.objects.get(iri_id=content_id) + if annot['tags']: + tags_list = map(lambda tag_entry: self.tags_dict[tag_entry['id-ref']]['meta']['dc:title'],annot['tags']) + else: + tags_list = [] + begin = int(annot['begin']) + duration = int(annot['end'])-begin + if content.media_obj and content.media_obj.external_publication_url: + uri = "%s#t=%d" % (content.media_obj.external_publication_url, begin) + + + annotations.append({ + 'begin': begin, + 'duration':duration, + 'title':annot['content']['title'], + 'desc':annot['content']['description'], + 'tags': tags_list, + 'id':annot['id'], + 'uri':uri + }) + + return annotations + + diff -r 40eddcc3d063 -r 3a30d255c235 web/ldt/ldt_utils/templates/admin/ldt_utils/app_action.html --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/web/ldt/ldt_utils/templates/admin/ldt_utils/app_action.html Sun Nov 14 20:25:22 2010 +0100 @@ -0,0 +1,6 @@ +{% extends "admin/base_site.html" %} +{% load i18n %} +{% block breadcrumbs %} + +{% endblock %} + diff -r 40eddcc3d063 -r 3a30d255c235 web/ldt/ldt_utils/templates/admin/ldt_utils/app_index.html --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/web/ldt/ldt_utils/templates/admin/ldt_utils/app_index.html Sun Nov 14 20:25:22 2010 +0100 @@ -0,0 +1,32 @@ +{% extends "admin/app_index.html" %} +{% block extrastyle %} + {{ block.super }} + +{% endblock %} +{% load i18n %} +{% block content %} +{{ block.super }} +
+
+ + + + + + + + + + +
Import
Import + an ldt 
Reindex +  
+
+
+ +{% endblock %} diff -r 40eddcc3d063 -r 3a30d255c235 web/ldt/ldt_utils/templates/admin/ldt_utils/content/reindex_form.html --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/web/ldt/ldt_utils/templates/admin/ldt_utils/content/reindex_form.html Sun Nov 14 20:25:22 2010 +0100 @@ -0,0 +1,23 @@ +{% extends "admin/ldt_utils/app_action.html" %} +{% load i18n %} +{# reindex contents #} +{% block content %} +{% if message %} +
+

{{ message }}

+
+{% endif %} {% if form. %} +
+{% endif %} +
+
{% csrf_token %} + + {{ form.as_table }} +
+
+
+ +Back to administration page + +{% endblock %} diff -r 40eddcc3d063 -r 3a30d255c235 web/ldt/ldt_utils/templates/admin/ldt_utils/content/upload_form.html --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/web/ldt/ldt_utils/templates/admin/ldt_utils/content/upload_form.html Sun Nov 14 20:25:22 2010 +0100 @@ -0,0 +1,27 @@ +{% extends "admin/ldt_utils/app_action.html" %} +{# import an ldt #} +{% block content %} +

Vous pouvez importer un fichier ldt ou un zip qui compresse un +fichier .ldt et plusieurs fichiers .iri.

+

Bien verifiez vous que le chemin de source est absolute pour un +fichier ldt lors qu'il est tout seul, alors qu'il est relatif s'il est +dans le zip

+

Vous pouvez indiquer le chemin de video si vous avez besoin

+{% if message %} +
+

{{ message }}

+
+{% endif %} + +{% if form %} + +
{% csrf_token %} + + {{ form.as_table }} +
+
+{% endif %} + +Back to administration page + +{% endblock %} diff -r 40eddcc3d063 -r 3a30d255c235 web/ldt/ldt_utils/templates/ldt/ldt_utils/content_list.html --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/web/ldt/ldt_utils/templates/ldt/ldt_utils/content_list.html Sun Nov 14 20:25:22 2010 +0100 @@ -0,0 +1,84 @@ +{% extends "ldt/user/user_base.html" %} +{% load i18n %} + +{% block js_declaration %} +{{block.super}} + + +{% endblock %} + +{% block css_import %} +{{block.super}} + +{% endblock %} + +{% block breadcrumb %} +
  • +
  • {% trans "Space" %}
  • +
  • {% trans "Ldt Project" %}
  • +{% endblock %} + +{% block content_title %}{% trans "Contents" %}{%endblock %} + +{% block iricontent %} +
    {% trans 'Create new content'%} + + + + + + + + + + +{% for content in contents %} + + + + +{% endfor %} + +
    {% trans "Content" %}
    {% trans "title" %}{% trans "create project" %}
    {{ content.title }}{% trans "create project" %}
    +
    + +{% endblock %} diff -r 40eddcc3d063 -r 3a30d255c235 web/ldt/ldt_utils/templates/ldt/ldt_utils/copy_ldt.html --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/web/ldt/ldt_utils/templates/ldt/ldt_utils/copy_ldt.html Sun Nov 14 20:25:22 2010 +0100 @@ -0,0 +1,19 @@ +{% load i18n %} {# form of copy of project ldt #} + + + + + + + +
    +
    {% trans "Copy your project" %}
    + +
    {% csrf_token %} + + +
    +
    + + diff -r 40eddcc3d063 -r 3a30d255c235 web/ldt/ldt_utils/templates/ldt/ldt_utils/create_content.html --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/web/ldt/ldt_utils/templates/ldt/ldt_utils/create_content.html Sun Nov 14 20:25:22 2010 +0100 @@ -0,0 +1,116 @@ +{% extends "ldt/ldt_raw_base.html" %} + +{% load i18n %} {# form of creation of content #} +{% load adminmedia %} + +{% block js_import %} + {{ block.super }} + + + + {{ content_form.media.js }} +{% endblock %} + +{% block css_import %} + {{ block.super }} + {{ content_form.media.css }} + + +{% endblock %} + + +{% block js_declaration %} + +{% endblock %} + +{% block body %} + {% if content_form.errors %} +
    +

    {% trans "The operation could not be performed because one or more error(s) occurred.
    Please resubmit the content form after making the following changes:" %}

    +
      + {% for field in content_form %} + {% if field.errors%}
    • {{field.name}} : {{ field.errors|striptags }}
    • {% endif %} + {% endfor %} +
    +
    + {% endif %} + + {% if media_form.errors %} +
    +

    {% trans "The operation could not be performed because one or more error(s) occurred.
    Please resubmit the media form after making the following changes:" %}

    +
      + {% for field in media_form %} + {% if field.errors%}
    • {{field.name}} : {{ field.errors|striptags }}
    • {% endif %} + {% endfor %} +
    +
    + {% endif %} + +
    +
    {% trans "Create content" %}
    +
    +
    + {% csrf_token %} + + {% for hidden in form.hidden_fields %} + {{ hidden }} + {% endfor %} + {{content_form.iri_id}} +
    +
    +
    +
    {{ content_form.src.errors }}{{ content_form.src.label_tag }}{{content_form.src}}
    +
    {{ content_form.videopath.errors }}{{ content_form.videopath.label_tag }}{{content_form.videopath}}
    +
    {{ content_form.title.errors }}{{ content_form.title.label_tag }}{{content_form.title}}
    +
    {{ content_form.description.errors }}{{ content_form.description.label_tag }}{{content_form.description}}
    +
    {{ media_form.external_id.errors }}{{ media_form.external_id.label_tag }}{{media_form.external_id}}
    +
    {{ media_form.external_publication_url.errors }}{{ media_form.external_publication_url.label_tag }}{{media_form.external_publication_url}}
    +
    +
    +
    {{ content_form.external_id.errors }}{{ content_form.external_id.label_tag }}{{content_form.external_id}}
    +
    {{ content_form.duration.errors }}{{ content_form.duration.label_tag }}{{content_form.duration}}
    +
    {{ content_form.content_creation_date.errors }}{{ content_form.content_creation_date.label_tag }}{{content_form.content_creation_date}}
    +
    {{ content_form.tags.errors }}{{ content_form.tags.label_tag }}{{content_form.tags}}
    +
    {{ content_form.media_input_type.errors }}{{ content_form.media_input_type.label_tag }}{{content_form.media_input_type}}
    +
    + +
    {{ media_form.media_file.errors }}{{ media_form.media_file.label_tag }}{{media_form.media_file}}
    +
    {{ media_form.external_src_url.errors }}{{ media_form.external_src_url.label_tag }}{{ media_form.external_src_url }}
    +
    {{ media_form.src.errors }}{{ media_form.src.label_tag }}{{ media_form.src }}
    +
    + +
    +
    +
    +
    +
    loader
    +
    {% trans "media file is being processed please wait." %}
    +   +
    +
    + + {% if iri_id %}{% endif %} + +
    +
    +
    +
    +{% endblock %} diff -r 40eddcc3d063 -r 3a30d255c235 web/ldt/ldt_utils/templates/ldt/ldt_utils/create_ldt.html --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/web/ldt/ldt_utils/templates/ldt/ldt_utils/create_ldt.html Sun Nov 14 20:25:22 2010 +0100 @@ -0,0 +1,71 @@ +{% extends "ldt/ldt_raw_base.html" %} + +{% load i18n %} {# form of creation of content #} +{% load adminmedia %} + +{% block js_import %} + {{ block.super }} + + {{ content_form.media.js }} +{% endblock %} + +{% block css_import %} + {{ block.super }} + {{ content_form.media.css }} + + + +{% endblock %} + +{% block js_declaration %} + {{ block.super }} + +{% endblock %} + +{% block body %} +
    +
    {% if ldt_id %}{% trans "Update your project" %}{% else %}{% trans "Create your project" %}{% endif %}
    +
    + {% csrf_token %} + + + {{form.title}} + +
    +
    {% trans "name" %}
    +
    +
    + + + {% for content in contents %} + + + + + {% endfor %} + +
    {{ content.title }}
    +
    +
    +
    +
    + + {% if ldt_id %} + + + {% else %} + + {% endif %} +
    +
    +
    + +{% endblock %} + diff -r 40eddcc3d063 -r 3a30d255c235 web/ldt/ldt_utils/templates/ldt/ldt_utils/embed_popup.html --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/web/ldt/ldt_utils/templates/ldt/ldt_utils/embed_popup.html Sun Nov 14 20:25:22 2010 +0100 @@ -0,0 +1,60 @@ +{% load i18n %} + + + + + + + + Ligne de Temps - IRI + + + + + + + + + + + + + +
    + {% include "ldt/ldt_utils/partial/embed_player.html" %} +
    + +
     
    + + +
    +
    + +
    +
    + +
    + +
    {{ embed_rendered.player }}
    +
    {{ embed_rendered.seo_body }}
    +
    {{ embed_rendered.seo_meta }}
    +
    + + +
    + + {% trans 'clik here to see the project content' %} + + + + diff -r 40eddcc3d063 -r 3a30d255c235 web/ldt/ldt_utils/templates/ldt/ldt_utils/error_confirm.html --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/web/ldt/ldt_utils/templates/ldt/ldt_utils/error_confirm.html Sun Nov 14 20:25:22 2010 +0100 @@ -0,0 +1,55 @@ +{% extends "ldt/ldt_raw_base.html" %} + +{% load i18n %} {# form of creation of content #} + +{% block js_import %} + {{ block.super }} +{% endblock %} + +{% block css_import %} + {{ block.super }} + {{ content_form.media.css }} + + +{% endblock %} + + +{% block js_declaration %} + +{% endblock %} + +{% block body %} + +
    +
    {% if errors|length > 0 %}{% trans "error" %}{% else %}{% trans "confirm" %}{% endif %}
    +
    + {{ message }} + {% if errors|length > 0 %} +
      + {% for error_msg in errors %} +
    • {{ error_msg }}
    • + {% endfor %} +
    + {% endif %} +
    + +
    +
    + {% if errors|length > 0 %} + + {% else %} +
    + {% csrf_token %} + + +
    + {% endif %} +
    +
    +{% endblock %} diff -r 40eddcc3d063 -r 3a30d255c235 web/ldt/ldt_utils/templates/ldt/ldt_utils/init_ldt.html --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/web/ldt/ldt_utils/templates/ldt/ldt_utils/init_ldt.html Sun Nov 14 20:25:22 2010 +0100 @@ -0,0 +1,48 @@ + + + + + + + +Ligne de Temps - IRI + + + + + +
     
    + + + diff -r 40eddcc3d063 -r 3a30d255c235 web/ldt/ldt_utils/templates/ldt/ldt_utils/ldt_list.html --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/web/ldt/ldt_utils/templates/ldt/ldt_utils/ldt_list.html Sun Nov 14 20:25:22 2010 +0100 @@ -0,0 +1,89 @@ +{% extends "ldt/ldt_base.html" %} +{% load i18n %} + +{% block js_import %} +{{block.super}} + +{% endblock %} + + +{% block js_declaration %} +{{block.super}} + + +{% endblock %} + +{% block css_import %} +{{block.super}} + +{% endblock %} + +{% block content %} +
    +
    +
    +
    {% trans "project list" %}
    +
    +
    +
    +
    +
    + {% include "ldt/ldt_utils/projectslist.html" %} +
    +
    +
    +
    +
    +{% endblock %} diff -r 40eddcc3d063 -r 3a30d255c235 web/ldt/ldt_utils/templates/ldt/ldt_utils/loading.html --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/web/ldt/ldt_utils/templates/ldt/ldt_utils/loading.html Sun Nov 14 20:25:22 2010 +0100 @@ -0,0 +1,26 @@ + + + + + + + +
    +
    loading
    +
    + + diff -r 40eddcc3d063 -r 3a30d255c235 web/ldt/ldt_utils/templates/ldt/ldt_utils/partial/contentslist.html --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/web/ldt/ldt_utils/templates/ldt/ldt_utils/partial/contentslist.html Sun Nov 14 20:25:22 2010 +0100 @@ -0,0 +1,23 @@ +{% load i18n %} +
    +{% trans "name" %} +
    +
    +
    + + + {% for content in contents %} + + + + + + {% endfor %} + +
    {% trans 'create project' %}
    {% trans 'preview media'%}
    {{ content.title|default:"_" }}
    +
    +
    + + diff -r 40eddcc3d063 -r 3a30d255c235 web/ldt/ldt_utils/templates/ldt/ldt_utils/partial/embed_links.html --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/web/ldt/ldt_utils/templates/ldt/ldt_utils/partial/embed_links.html Sun Nov 14 20:25:22 2010 +0100 @@ -0,0 +1,9 @@ +{% spaceless %} + +{% endspaceless %} \ No newline at end of file diff -r 40eddcc3d063 -r 3a30d255c235 web/ldt/ldt_utils/templates/ldt/ldt_utils/partial/embed_player.html --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/web/ldt/ldt_utils/templates/ldt/ldt_utils/partial/embed_player.html Sun Nov 14 20:25:22 2010 +0100 @@ -0,0 +1,27 @@ +{% spaceless %} +{% load i18n %} +
    +
     
    +
    +
    + +
    +{% endspaceless %} diff -r 40eddcc3d063 -r 3a30d255c235 web/ldt/ldt_utils/templates/ldt/ldt_utils/partial/embed_seo_body.html --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/web/ldt/ldt_utils/templates/ldt/ldt_utils/partial/embed_seo_body.html Sun Nov 14 20:25:22 2010 +0100 @@ -0,0 +1,9 @@ +{% spaceless %} + +{% endspaceless %} \ No newline at end of file diff -r 40eddcc3d063 -r 3a30d255c235 web/ldt/ldt_utils/templates/ldt/ldt_utils/partial/embed_seo_meta.html --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/web/ldt/ldt_utils/templates/ldt/ldt_utils/partial/embed_seo_meta.html Sun Nov 14 20:25:22 2010 +0100 @@ -0,0 +1,3 @@ +{% spaceless %} + +{% endspaceless %} \ No newline at end of file diff -r 40eddcc3d063 -r 3a30d255c235 web/ldt/ldt_utils/templates/ldt/ldt_utils/partial/projectslist.html --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/web/ldt/ldt_utils/templates/ldt/ldt_utils/partial/projectslist.html Sun Nov 14 20:25:22 2010 +0100 @@ -0,0 +1,37 @@ +{% load i18n %} +
    +{% trans "name" %} +
    +
    +
    + + +{% for project in projects %} + + {% url ldt.ldt_utils.views.project_json_id project.ldt_id as json_url_id %} + + + + + + +{% endfor %} + +
    {% trans 'open ldt' %}
    {% trans 'copy project' %}
    {% trans 'link json by id' %}
    + {% ifequal project.state 2 %} + {% trans 'Project published, click to unpublish' %} + {% else %} + {% trans 'Project not published, click to publish' %} + {% endifequal %} + + {% ifequal project.state 2 %} + {{ project.title }} + {% else %} + {{ project.title }} + {% endifequal %} +
    +
    +
    + diff -r 40eddcc3d063 -r 3a30d255c235 web/ldt/ldt_utils/templates/ldt/ldt_utils/save_done.html --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/web/ldt/ldt_utils/templates/ldt/ldt_utils/save_done.html Sun Nov 14 20:25:22 2010 +0100 @@ -0,0 +1,5 @@ +

    done

    +

    {{ldt}} +

    +

    {{id}}

    +

    title:{{title}}

    \ No newline at end of file diff -r 40eddcc3d063 -r 3a30d255c235 web/ldt/ldt_utils/templates/ldt/ldt_utils/search_form.html --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/web/ldt/ldt_utils/templates/ldt/ldt_utils/search_form.html Sun Nov 14 20:25:22 2010 +0100 @@ -0,0 +1,13 @@ +{% extends "ldt/base.html" %} {% block content %} + +
    + + + {{ form.as_table }} +
    +
    + + +{% endblock %} diff -r 40eddcc3d063 -r 3a30d255c235 web/ldt/ldt_utils/templates/ldt/ldt_utils/workspace.html --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/web/ldt/ldt_utils/templates/ldt/ldt_utils/workspace.html Sun Nov 14 20:25:22 2010 +0100 @@ -0,0 +1,1 @@ +{% extends "ldt/ldt_utils/workspace_base.html" %} diff -r 40eddcc3d063 -r 3a30d255c235 web/ldt/ldt_utils/templates/ldt/ldt_utils/workspace_base.html --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/web/ldt/ldt_utils/templates/ldt/ldt_utils/workspace_base.html Sun Nov 14 20:25:22 2010 +0100 @@ -0,0 +1,73 @@ +{% extends "ldt/ldt_base.html" %} +{% load i18n %} + +{% block js_import %} +{{block.super}} + +{% endblock %} + + +{% block js_declaration %} +{{block.super}} + + +{% endblock %} + +{% block css_import %} +{{block.super}} + +{% endblock %} + +{% block content %} +
    +
    +
    +
    {% trans "content list" %}
    +
    +
    loader
    +
    +
    +
    + {% include "ldt/ldt_utils/partial/contentslist.html" %} +
    +
    +
    +
    +
    {% trans "project list" %}
    +
    +
    loader
    +
    +
    +
    + {% include "ldt/ldt_utils/partial/projectslist.html" %} +
    +
    +
    +{% endblock %} diff -r 40eddcc3d063 -r 3a30d255c235 web/ldt/ldt_utils/tests.py --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/web/ldt/ldt_utils/tests.py Sun Nov 14 20:25:22 2010 +0100 @@ -0,0 +1,206 @@ +#encoding:UTF-8 + +""" Run these tests with 'python manage.py test ldt_utils' """ + +from django.test import TestCase +import unittest +import lxml.etree +from ldt.ldt_utils.models import * +from ldt.core.models import Owner +from views import * +import base64 +import uuid +import tempfile +import datetime +from django.contrib.auth.models import * +from django.conf import settings +from django.test.client import Client + + + +# This test creates an annotation and checks that: +# 1. the annotation was created in the database (by trying to access it through a 'get') +# 2. the returned xml contains correct data +class CreateTest(unittest.TestCase): + def setUp(self): + self.content = base64.urlsafe_b64encode('f2c1d1fa-629d-4520-a3d2-955b4f2582c0http://www.leezam.com/pub/epub/123456!/OPS/chapter2.xhtml#pos=56,168tag1tag2#AAAAAA<![CDATA[titre de l�annotation]]>oaubert79cd0532-1dda-4130-b351-6a181130a7c92010-09-06 12:33:53.417550oaubert79cd0532-1dda-4130-b351-6a181130a7c92010-09-06 12:33:53.420459') + self.c = Client() + def tearDown(self): + annotlist=Annotation.objects.all() + for annot in annotlist: + annot.delete() + + def test_create_annotation(self): + response = self.c.post('/create/', {'content':self.content}) + self.annot1 = lxml.etree.fromstring(response.content) + #self.assertEqual(lxml.etree.tostring(self.annot1),"lala") + self.assertEqual(self.annot1.xpath("/iri/text-annotation/id/text()")[0],"f2c1d1fa-629d-4520-a3d2-955b4f2582c0") + self.assertEqual(self.annot1.xpath("/iri/text-annotation/content")[0].tag,"content") + self.assertEqual(self.annot1.xpath("/iri/text-annotation/tags/tag/text()")[0],"tag1") + self.assertEqual(self.annot1.xpath("/iri/text-annotation/content/text/text()")[0],u"texte selectionne lors de la creation de l\'annotation") + self.assertEqual(self.annot1.xpath("/iri/text-annotation/meta/created/text()")[0],"2010-09-06 12:33:53.417550") + annot = Annotation.objects.get(id="f2c1d1fa-629d-4520-a3d2-955b4f2582c0") + self.assertEqual(annot.uri, "http://www.leezam.com/pub/epub/123456!/OPS/chapter2.xhtml#pos=56,168") + + +# This test creates an annotation, then gets it, and checks that the returned xml contains correct data +class GetTest(unittest.TestCase): + def setUp(self): + self.annotation = Annotation(id="d2c1d1fa-629d-4520-a3d2-955b4f2582c0", tags=[u"tag1",u"tag2",u"tag3"], title="titre de l\'annotation",text="texte selectionne lors de la creation de l\'annotation",color="#AAAAAA", creation_date="2010-09-06T12:33:53.417550", update_date="2010-09-06T12:33:53.420459") + self.annotation.save() + def tearDown(self): + annotlist=Annotation.objects.all() + for annot in annotlist: + annot.delete() + + def test_get_annotation(self): + response = self.c.get('/get/', {'id':'d2c1d1fa-629d-4520-a3d2-955b4f2582c0'}) + self.annot1 = lxml.etree.fromstring(response.content) + #self.annot1 = get_annotation("d2c1d1fa-629d-4520-a3d2-955b4f2582c0") + #self.assertEqual(lxml.etree.tostring(self.annot1),"lala") + self.assertEqual(self.annot1.xpath("/iri/text-annotation/id/text()")[0],self.annotation.id) + self.assertEqual(self.annot1.xpath("/iri/text-annotation/tags/tag/text()")[1], self.annotation.tags[1]) + self.assertEqual(self.annot1.xpath("/iri/text-annotation/content/color/text()")[0],self.annotation.color) + #self.assertEqual(self.annot1.xpath("/iri/text-annotation/meta/created/text()"), self.annotation.creation_date) + + +class FilterTest(unittest.TestCase): + def setUp(self): + self.annotation = Annotation(id="k2c1d1fa-629d-4520-a3d2-955b4f2582c0",title="titre de l\'annotation",text="texte selectionne lors de la creation de l\'annotation",color="#AAAAAA", uri="http://www.leezam.com/pub/epub/123456!/OPS/chapter2.xhtml#pos=56,168", creator="wakimd") + self.annotation.save() + self.annotation2 = Annotation(id="l2c1d1fa-629d-4520-a3d2-955b4f2582c0",title="titre de l\'annotation2",text="texte selectionne lors de la creation de l\'annotation2",color="#BBBBBB", uri="http://www.leezam.com/pub/epub/123456!/OPS/chapter2.xhtml#pos=56,168", creator="wakimd") + self.annotation2.save() + self.annotation3 = Annotation(id="m2c1d1fa-629d-4520-a3d2-955b4f2582c0", title="titre3", text="texte3", color="#CCCCCC", uri="http://blabla", creator="wakimd") + self.annotation3.save() + def tearDown(self): + annotlist=Annotation.objects.all() + for annot in annotlist: + annot.delete() + + def test_filter_annotation_creator(self): + user = 'wakimd' + uri = None + limit= 2 + doc = filter_annotation(uri,None,limit,user) + cpt = 0 + for elem in doc.xpath("/iri/text-annotation"): + cpt = cpt + 1 + #self.assertEqual(lxml.etree.tostring(doc),"lala") + if limit is not None: + self.assertEqual(cpt,limit) + for elem in doc.xpath("/iri/text-annotation/meta/creator/text()"): + self.assertEqual(elem,user) + + def test_filter_annotation_uri(self): + uri = "http://www.leezam.com/pub/epub/123456!/OPS/chapter2.xhtml#pos=56,168" + limit = None + doc = filter_annotation(uri,None,limit,None) + for elem in doc.xpath("/iri/text-annotation/uri/text()"): + self.assertEqual(elem[:57],"http://www.leezam.com/pub/epub/123456!/OPS/chapter2.xhtml") + + def test_filter_annotation_filter(self): + user = 'wakimd' + uri = None + filter = 'lors' + limit = None + doc = filter_annotation(uri,filter,limit,user) + #self.assertEqual(lxml.etree.tostring(doc),"lala") + for elem in doc.xpath("/iri/text-annotation/content/text/text()"): + self.assertTrue('lors' in elem) + for elem in doc.xpath("/iri/text-annotation/meta/creator/text()"): + self.assertEqual(elem,user) + + +# This test creates an annotation, then deletes it, and checks that: +# 1. the annotation doesn't exist anymore in the database (by trying to access it through a 'get') +# 2. the returned xml contains no data +class DeleteTest(unittest.TestCase): + def setUp(self): + self.annotation = Annotation(id="d2c1d1fa-629d-4520-a3d2-955b4f2582c0",title="titre de l\'annotation",text="texte selectionne lors de la creation de l\'annotation",color="#AAAAAA", creation_date="2010-09-06T12:33:53.417550", update_date="2010-09-06T12:33:53.420459") + self.annotation.save() + def tearDown(self): + annotlist=Annotation.objects.all() + for annot in annotlist: + annot.delete() + + def test_delete_annotation(self): + response = self.c.post('/delete/', {'id':'d2c1d1fa-629d-4520-a3d2-955b4f2582c0'}) + response2 - self.c.get('/get/', {'id':'d2c1d1fa-629d-4520-a3d2-955b4f2582c0'}) + doc = lxml.etree.fromstring(response.content) + #doc=delete_annotation("d2c1d1fa-629d-4520-a3d2-955b4f2582c0") + self.assertEqual(self.annot1.xpath("/iri/text-annotation/id/text()")[0],'') + self.assertEqual(self.annot1.xpath("/iri/text-annotation/tags/tag/text()")[1], '') + self.assertEqual(self.annot1.xpath("/iri/text-annotation/content/color/text()")[0],'') + self.assertEqual(self.annot1.xpath("/iri/text-annotation/meta/creator/text()")[0],'') + self.assertEqual(response2.status_code, '404') + + +# This test creates an annotation, then updates it with new content, and checks that the returned xml contains the updated data +class UpdateTest(unittest.TestCase): + def setUp(self): + self.annotation = Annotation(id="d2c1d1fa-629d-4520-a3d2-955b4f2582c0", tags=['tag1','mytag'],title="titre de l\'annotation",text="texte selectionne lors de la creation de l\'annotation",color="#AAAAAA", creation_date="2010-09-06T12:33:53.417550", update_date="2010-09-06T12:33:53.420459") + self.annotation.save() + def tearDown(self): + annotlist=Annotation.objects.all() + for annot in annotlist: + annot.delete() + + def test_update_annotation(self): + content = base64.urlsafe_b64encode('tag1tag2newtag3#DDDDDDoaubert80cd0532-1dda-4130-b351-6a181130a7c92010-11-06 12:33:53.420459') + response = self.c.post('/update/', {'content':content,'id':'d2c1d1fa-629d-4520-a3d2-955b4f2582c0'}) + doc = lxml.etree.fromstring(response.content) + #doc = update_annotation(content,'d2c1d1fa-629d-4520-a3d2-955b4f2582c0') + #self.assertEqual(lxml.etree.tostring(doc),"lala") + self.assertEqual(doc.xpath("/iri/text-annotation/id/text()")[0],"d2c1d1fa-629d-4520-a3d2-955b4f2582c0") + self.assertEqual(doc.xpath("/iri/text-annotation/tags/tag/text()")[1], "mytag") + self.assertEqual(doc.xpath("/iri/text-annotation/content/color/text()")[0],"#DDDDDD") + + +#class AnnotTest(unittest.TestCase): +# def setUp(self): +# self.annot = Annotation(id=u'd2c1d1fa-629d-4520-a3d2-955b4f2582c0', uri=u'http://iri.blabla', tags=[u'tag1',u'tag2'], title=u'montitre', description=u'madesc', text=u'letexteselectionne', color=u'#AAAAAA', creator=u'wakimd', contributor=u'wakimd', creation_date=u'2010-09-06 12:33:53.417550', update_date=u'2010-09-06 12:33:53.417550') +# self.annot.save() +# def tearDown(self): +# annotlist=Annotation.objects.all() +# for annot in annotlist: +# annot.delete() +# +# def test_create_annotation(self): +# b = Annotation.objects.get(id=u'd2c1d1fa-629d-4520-a3d2-955b4f2582c0') +# self.assertEqual(b.title, 'montitre') +# + +# These tests check common error codes are raised when needed +class ErrorTest(unittest.TestCase): + def setUp(self): + self.annot = Annotation(id=u'd2c1d1fa-629d-4520-a3d2-955b4f2582c0', uri=u'http://iri.blabla', tags=[u'tag1',u'tag2'], title=u'montitre', description=u'madesc', text=u'letexteselectionne', color=u'#AAAAAA', creator=u'wakimd', contributor=u'wakimd', creation_date=u'2010-09-06 12:33:53.417550', update_date=u'2010-09-06 12:33:53.417550') + self.annot.save() + + def tearDown(self): + annotlist=Annotation.objects.all() + for annot in annotlist: + annot.delete() + + def test_error_create(self): + content = base64.urlsafe_b64encode('d2c1d1fa-629d-4520-a3d2-955b4f2582c0http://www.leezam.com/pub/epub/123456!/OPS/chapter2.xhtml#pos=56,168tag1tag2#AAAAAA<![CDATA[titre de l�annotation]]>oaubert79cd0532-1dda-4130-b351-6a181130a7c92010-09-06 12:33:53.417550oaubert79cd0532-1dda-4130-b351-6a181130a7c92010-09-06 12:33:53.420459') + response = self.c.post('/create/', {'content':self.content}) + #annot2 = create_annotation(content) + self.assertEqual(response.status_code, '409') + + def test_error_get(self): + response = self.c.get('/get/', {'id':'d2c1d1fa-629d-4520-a3d2-955b4f2582c0'}) + #annot3 = get_annotation('d2c1d1fa-629d-4520-a3d2-955b4f2582c0') + resp = response.status_code + self.assertEqual(response.status_code,'404') + + def test_error_delete(self): + response = self.c.post('/delete/', {'id':'f2c1d1fa-629d-4520-a3d2-955b4f2582c0'}) + #annot4 = delete_annotation('f2c1d1fa-629d-4520-a3d2-955b4f2582c0') + self.assertEqual(response.status_code,'404') + + def test_error_update(self): + content = base64.urlsafe_b64encode('d2c1d1fa-629d-4520-a3d2-955b4f2582c0http://www.leezam.com/pub/epub/123456!/OPS/chapter2.xhtml#pos=56,168tag1tag2#AAAAAA<![CDATA[titre de l�annotation]]>oaubert79cd0532-1dda-4130-b351-6a181130a7c92010-09-06 12:33:53.417550oaubert79cd0532-1dda-4130-b351-6a181130a7c92010-09-06 12:33:53.420459') + response = self.c.post('/update/', {'content':content,'id':'dfc1d1fa-629d-4520-a3d2-955b4f2582c0'}) + #annot5=update_annotation() + self.assertEqual(response.status_code,'404') + diff -r 40eddcc3d063 -r 3a30d255c235 web/ldt/ldt_utils/urls.py --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/web/ldt/ldt_utils/urls.py Sun Nov 14 20:25:22 2010 +0100 @@ -0,0 +1,17 @@ +from django.conf.urls.defaults import * +from ldt.management import test_ldt + +# Uncomment the next two lines to enable the admin: +# from django.contrib import admin +# admin.autodiscover() + +urlpatterns = patterns('ldt.ldt_utils', + url(r'^create/(?P.*)$', 'views.create_annotation'), + url(r'^filter/$', 'views.filter_annotation'), + url(r'^get/(?P.*)$', 'views.get_annotation'), + url(r'^delete/(?P.*)$', 'views.delete_annotation'), + url(r'^update/(?P.*)/(?P.*)$', 'views.update_annotation'), + #url(r'^oauth/', include('oauth_provider.urls')), + #url(r'^filterprojects/_(?P[\w\%\_\-\+]*?)/(?Ptrue|false)/(?P\d)$', "views.projectsfilter", ), + #url(r'^filtercontents/_(?P[\w\%\_\-\+]*?)/$', "views.contentsfilter", ), +) \ No newline at end of file diff -r 40eddcc3d063 -r 3a30d255c235 web/ldt/ldt_utils/utils.py --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/web/ldt/ldt_utils/utils.py Sun Nov 14 20:25:22 2010 +0100 @@ -0,0 +1,67 @@ +import lucene +from ldt.ldt_utils import STORE +from ldt.ldt_utils import ANALYZER +import uuid +import django.core.urlresolvers +from django.conf import settings +from ldt.ldt_utils.models import * +import urllib +import datetime +import lxml.etree +import base64 + +__BOOLEAN_DICT = { + 'false':False, + 'true':True, + '0':False, + '1':True, + 't': True, + 'f':False +} + +def boolean_convert(bool): + if bool is None: + return False + if bool is True or bool is False: + return bool + key = str(bool).lower() + return __BOOLEAN_DICT.get(key, False) + + +def generate_uuid(): + return unicode(uuid.uuid1()) + + +def normalize_tags(list): + nlist=[] + for tag in list: + tag = tag.lower() + nlist.append(tag) + taglist = dict().fromkeys(nlist).keys() + + return taglist + + +def create_empty_annotation(): + iri = lxml.etree.Element('iri') + doc = lxml.etree.ElementTree(iri) + + textannotation = lxml.etree.SubElement(iri, 'text-annotation') + id = lxml.etree.SubElement(textannotation,'id') + uri = lxml.etree.SubElement(textannotation,'uri') + tags = lxml.etree.SubElement(textannotation,'tags') + + content = lxml.etree.SubElement(textannotation,'content') + color = lxml.etree.SubElement(content,'color') + description = lxml.etree.SubElement(content,'description') + title = lxml.etree.SubElement(content,'title') + text = lxml.etree.SubElement(content,'text') + + meta = lxml.etree.SubElement(textannotation,'meta') + contributor = lxml.etree.SubElement(meta, "contributor") + creator = lxml.etree.SubElement(meta, "creator") + creationdate = lxml.etree.SubElement(meta, "created") + updatedate = lxml.etree.SubElement(meta, "modified") + + return doc + diff -r 40eddcc3d063 -r 3a30d255c235 web/ldt/ldt_utils/views.py --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/web/ldt/ldt_utils/views.py Sun Nov 14 20:25:22 2010 +0100 @@ -0,0 +1,241 @@ +from django.conf import settings +from django.contrib.auth.decorators import login_required +from django.core import serializers +from django.core.urlresolvers import reverse +from django.db import IntegrityError +from django.db.models import Q +from django.forms.util import ErrorList +from django.http import HttpResponse, HttpResponseRedirect, \ + HttpResponseForbidden, HttpResponseServerError, HttpResponseBadRequest +from django.shortcuts import render_to_response, get_object_or_404, \ + get_list_or_404 +from django.template import RequestContext +from django.template.loader import render_to_string +from django.utils import simplejson +from django.utils.html import escape +from django.utils.translation import ugettext as _, ungettext +from ldt.core.models import Owner +from ldt.ldt_utils.utils import boolean_convert +from lxml import etree +from lxml.html import fromstring, fragment_fromstring +from ldt.ldt_utils.models import * +from string import Template +from urllib2 import urlparse +from utils import * +import StringIO +import base64 +import cgi +import django.core.urlresolvers +import ldt.auth as ldt_auth +import ldt.utils.path as ldt_utils_path +import logging +import lucene +import tempfile +import uuid + + +## Filters the annotation depending on the request parameters +## Returns an xml containing the resulting annotations +def filter_annotation(request, uri=None, filter=None, limit=None, creator=None): + annotlist = None + query = Q() + + if uri: + query &= Q(uri=uri) + if creator: + query &= Q(creator=creator) + if filter and len(filter) > 0: + query &= Q(text__icontains=filter) + + annotlist = Annotation.objects.filter(query) + + if limit: + annotlist = annotlist[:limit] + + #create xml + iri = lxml.etree.Element('iri') + doc = lxml.etree.ElementTree(iri) + + for annot in annotlist: + textannotation = lxml.etree.SubElement(iri, 'text-annotation') + id = lxml.etree.SubElement(textannotation,'id') + id.text = annot.id + uri = lxml.etree.SubElement(textannotation,'uri') + uri.text = annot.uri + + if annot.tags: + tags = lxml.etree.SubElement(textannotation,'tags') + ltags = normalize_tags(annot.tags) + for t in ltags: + tag = lxml.etree.SubElement(tags, 'tag') + tag.text = t + + content = lxml.etree.SubElement(textannotation,'content') + color = lxml.etree.SubElement(content,'color') + color.text = annot.color + description = lxml.etree.SubElement(content,'description') + description.text = annot.description + title = lxml.etree.SubElement(content,'title') + title.text = annot.title + text = lxml.etree.SubElement(content,'text') + text.text = annot.text + + meta = lxml.etree.SubElement(textannotation,'meta') + contributor = lxml.etree.SubElement(meta, "contributor") + contributor.text = annot.contributor + creator = lxml.etree.SubElement(meta, "contributor") + creator.text = annot.creator + creationdate = lxml.etree.SubElement(meta, "created") + #creationdate.text = annot.creation_date + updatedate = lxml.etree.SubElement(meta, "modified") + #updatedate.text = annot.update_date + + return HttpResponse(lxml.etree.tostring(doc, pretty_print=True), mimetype="text/xml;charset=utf-8") + + +## Creates an annotation from a urlencoded xml content +## Returns an xml-structured annotation +#@login_required +def create_annotation(request, content): + cont = base64.urlsafe_b64decode(content) + doc = lxml.etree.fromstring(cont) + + id = unicode(doc.xpath("/iri/text-annotation/id/text()")[0]) + if id is None: + id = generate_uuid() + + uri = unicode(doc.xpath("/iri/text-annotation/uri/text()")[0]) + ltags = [] + for tag in doc.xpath("/iri/text-annotation/tags/tag/text()"): + ltags.append(unicode(tag)) + tags=normalize_tags(ltags) + + title = unicode(doc.xpath("/iri/text-annotation/content/title/text()")[0]) + desc = unicode(doc.xpath("/iri/text-annotation/content/description/text()")[0]) + text = unicode(doc.xpath("/iri/text-annotation/content/text/text()")[0]) + color = unicode(doc.xpath("/iri/text-annotation/content/color/text()")[0]) + + creator = unicode(doc.xpath("/iri/text-annotation/meta/creator/text()")[0]) + contributor = unicode(doc.xpath("/iri/text-annotation/meta/contributor/text()")[0]) + creation_date = unicode(doc.xpath("/iri/text-annotation/meta/created/text()")[0]) + update_date = unicode(doc.xpath("/iri/text-annotation/meta/modified/text()")[0]) + + try: + annotation = Annotation.create_annotation(id=id, uri=uri, tags=tags, title=title, description=desc, text=text, color=color, creator=creator, contributor=contributor, creation_date=creation_date, update_date=update_date) + annotation.save() + return HttpResponse(lxml.etree.tostring(doc, pretty_print=True), mimetype="text/xml;charset=utf-8") + #return doc + except: + #raise IntegrityError + #print 'This id is already used! Please choose another one!' + raise HttpResponseBadRequest('This id is already used! Please chose another one!') + + + #return HttpResponse(lxml.etree.tostring(doc, pretty_print=True), mimetype="text/xml;charset=utf-8") + + +## Gets an annotation from an id +## Returns the xml-structured annotation +def get_annotation(request, id): + annot = Annotation.objects.get_object_or_404(id=id) + iri = lxml.etree.Element('iri') + doc = lxml.etree.ElementTree(iri) + + textannotation = lxml.etree.SubElement(iri, 'text-annotation') + id = lxml.etree.SubElement(textannotation,'id') + id.text = annot.id + uri = lxml.etree.SubElement(textannotation,'uri') + uri.text = annot.uri + + if annot.tags: + if type(annot.tags) is unicode: + annot.tags = eval(annot.tags) + tags = lxml.etree.SubElement(textannotation,'tags') + ltags = normalize_tags(annot.tags) + for t in ltags: + tag = lxml.etree.SubElement(tags, 'tag') + tag.text = t + + content = lxml.etree.SubElement(textannotation,'content') + color = lxml.etree.SubElement(content,'color') + color.text = annot.color + description = lxml.etree.SubElement(content,'description') + description.text = annot.description + title = lxml.etree.SubElement(content,'title') + title.text = annot.title + text = lxml.etree.SubElement(content,'text') + text.text = annot.text + + meta = lxml.etree.SubElement(textannotation,'meta') + contributor = lxml.etree.SubElement(meta, "contributor") + contributor.text = annot.contributor + creator = lxml.etree.SubElement(meta, "creator") + creator.text = annot.creator + creationdate = lxml.etree.SubElement(meta, "created") + #creationdate.text = annot.creation_date + updatedate = lxml.etree.SubElement(meta, "modified") + #updatedate.text = annot.update_date + + #return doc + return HttpResponse(lxml.etree.tostring(doc, pretty_print=True), mimetype="text/xml;charset=utf-8") + + +## Delete an annotation from an id +## Returns an empty xml-structured annotation +#@login_required +def delete_annotation(request, id): + annot = Annotation.objects.get_object_or_404(id=id) + annot.delete() + + doc=create_empty_annotation() + #return doc + return HttpResponse(lxml.etree.tostring(doc, pretty_print=True), mimetype="text/xml;charset=utf-8") + + +## Updates the content of an annotation +## Returns the xml-structured updated annotation +#@login_required +def update_annotation(request, content, id): + annot = Annotation.objects.get_object_or_404(id=id) + + cont = base64.urlsafe_b64decode(content) + doc = lxml.etree.fromstring(cont) + + uri = doc.xpath("/iri/text-annotation/uri/text()") + if uri != [] and annot.uri != uri[0]: + annot.uri = unicode(uri[0]) + + tags = [] + for tag in doc.xpath("/iri/text-annotation/tags/tag"): + tags.append(unicode(tag.text)) + if annot.tags is not None: + if type(annot.tags) is unicode: + annot.tags = eval(annot.tags) + tags += annot.tags + tags = normalize_tags(tags) + annot.tags=tags + + title = doc.xpath("/iri/text-annotation/content/title/text()") + if title != [] and annot.title != title[0]: + annot.title = unicode(title[0]) + desc = doc.xpath("/iri/text-annotation/content/description/text()") + if desc != [] and annot.description != desc[0]: + annot.description = unicode(desc[0]) + text = doc.xpath("/iri/text-annotation/content/text/text()") + if text != [] and annot.text != text[0]: + annot.text = unicode(text[0]) + color = doc.xpath("/iri/text-annotation/content/color/text()") + if color != [] and annot.color != color[0]: + annot.color = unicode(color[0]) + + contributor = doc.xpath("/iri/text-annotation/meta/contributor/text()") + if contributor != [] and annot.contributor != contributor[0]: + annot.contributor = unicode(contributor[0]) + update_date = doc.xpath("/iri/text-annotation/meta/modified/text()") + if update_date != [] and annot.update_date != update_date[0]: + annot.update_date = unicode(update_date[0]) + + annot.save() + + return get_annotation(id) + diff -r 40eddcc3d063 -r 3a30d255c235 web/ldt/locale/en/LC_MESSAGES/django.mo Binary file web/ldt/locale/en/LC_MESSAGES/django.mo has changed diff -r 40eddcc3d063 -r 3a30d255c235 web/ldt/locale/en/LC_MESSAGES/django.po --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/web/ldt/locale/en/LC_MESSAGES/django.po Sun Nov 14 20:25:22 2010 +0100 @@ -0,0 +1,1012 @@ +# SOME DESCRIPTIVE TITLE. +# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER +# This file is distributed under the same license as the PACKAGE package. +# FIRST AUTHOR , YEAR. +# +msgid "" +msgstr "" +"Project-Id-Version: PACKAGE VERSION\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2010-10-19 19:43+0200\n" +"PO-Revision-Date: 2010-02-17 03:53+0100\n" +"Last-Translator: Yves-Marie Haussonne \n" +"Language-Team: LANGUAGE \n" +"Language: \n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" + +#: forms/widgets.py:17 +msgid "Date" +msgstr "Date" + +#: forms/widgets.py:17 +msgid "Time" +msgstr "Time" + +#: ldt_utils/forms.py:43 ldt_utils/models.py:82 +msgid "content.content_creation_date" +msgstr "content creation date" + +#: ldt_utils/forms.py:44 +msgid "content.media_input_type" +msgstr "Media source type" + +#: ldt_utils/forms.py:44 +msgid "file_upload" +msgstr "file upload" + +#: ldt_utils/forms.py:44 +msgid "url" +msgstr "url" + +#: ldt_utils/forms.py:44 +msgid "existing_media" +msgstr "existing media" + +#: ldt_utils/forms.py:44 +msgid "create_media" +msgstr "create media" + +#: ldt_utils/forms.py:44 +msgid "none_media" +msgstr "no media" + +#: ldt_utils/models.py:25 +msgid "media.external_id" +msgstr "external id" + +#: ldt_utils/models.py:26 +msgid "media.external_permalink" +msgstr "media permalink" + +#: ldt_utils/models.py:27 +msgid "media.external_publication_url" +msgstr "media publication url" + +#: ldt_utils/models.py:28 +msgid "media.external_src_url" +msgstr "media external source url" + +#: ldt_utils/models.py:29 +msgid "media.creation_date" +msgstr "media object creation date" + +#: ldt_utils/models.py:30 +msgid "media.media_creation_date" +msgstr "media creation date" + +#: ldt_utils/models.py:31 +msgid "media.update_date" +msgstr "update date" + +#: ldt_utils/models.py:32 +msgid "media.videopath" +msgstr "videopath" + +#: ldt_utils/models.py:33 +msgid "media.duration" +msgstr "duration (ms)" + +#: ldt_utils/models.py:34 +msgid "media.creator" +msgstr "media creator" + +#: ldt_utils/models.py:35 +msgid "description" +msgstr "description" + +#: ldt_utils/models.py:36 +#: ldt_utils/templates/ldt/ldt_utils/content_list.html:69 +msgid "title" +msgstr "Title" + +#: ldt_utils/models.py:37 +msgid "media.src" +msgstr "media source" + +#: ldt_utils/models.py:74 +msgid "content.iri_id" +msgstr "iri id" + +#: ldt_utils/models.py:75 +msgid "content.iriurl" +msgstr "iri url" + +#: ldt_utils/models.py:76 +msgid "content.creation_date" +msgstr "content creation date" + +#: ldt_utils/models.py:77 +msgid "content.update_date" +msgstr "content update date" + +#: ldt_utils/models.py:78 +msgid "content.title" +msgstr "title" + +#: ldt_utils/models.py:79 +msgid "content.description" +msgstr "description" + +#: ldt_utils/models.py:80 +msgid "content.authors" +msgstr "authors" + +#: ldt_utils/models.py:81 +msgid "content.duration" +msgstr "duration (ms)" + +#: ldt_utils/models.py:256 +msgid "created by" +msgstr "created by" + +#: ldt_utils/models.py:257 +msgid "changed by" +msgstr "changed by" + +#: ldt_utils/views.py:72 ldt_utils/views.py:332 ldt_utils/views.py:378 +msgid "You can not access this project" +msgstr "You can not access this project" + +#: ldt_utils/views.py:536 +#, python-format +msgid "the project %(title)s is published. please unpublish before deleting." +msgstr "the project %(title)s is published. please unpublish before deleting." + +#: ldt_utils/views.py:537 +msgid "can not delete the project. Please correct the following error" +msgstr "can not delete the project. Please correct the following error" + +#: ldt_utils/views.py:538 +msgid "title error deleting project" +msgstr "Error when deleting project" + +#: ldt_utils/views.py:540 +#, python-format +msgid "please confirm deleting project %(title)s" +msgstr "Please confirm deleting project %(title)s" + +#: ldt_utils/views.py:541 +msgid "confirm deletion" +msgstr "Confirm deletion" + +#: ldt_utils/views.py:683 +msgid "Problem when downloading file from url : " +msgstr "Problem when downloading file from url: " + +#: ldt_utils/views.py:686 +msgid "Problem when uploading file : " +msgstr "Problem when uploading file: " + +#: ldt_utils/views.py:756 +#, python-format +msgid "There is %(count)d error when deleting content" +msgid_plural "There are %(count)d errors when deleting content" +msgstr[0] "There is %(count)d error when deleting content" +msgstr[1] "There are %(count)d errors when deleting content" + +#: ldt_utils/views.py:757 +msgid "title error deleting content" +msgstr "Error when deleting content" + +#: ldt_utils/views.py:759 +#, python-format +msgid "Confirm delete content %(titles)s" +msgstr "Confirm delete content %(titles)s" + +#: ldt_utils/views.py:760 +msgid "confirm delete content" +msgstr "Confirm delete content" + +#: ldt_utils/views.py:791 +#, python-format +msgid "" +"Content '%(title)s' is referenced by this project : %(project_titles)s. " +"Please delete it beforehand." +msgid_plural "" +"Content '%(title)s' is referenced by %(count)d projects: %(project_titles)s. " +"Please delete them beforehand." +msgstr[0] "" +"Content '%(title)s' is referenced by this project : %(project_titles)s. " +"Please delete it beforehand." +msgstr[1] "" +"Content '%(title)s' is referenced by %(count)d projects: %(project_titles)s. " +"Please delete them beforehand." + +#: 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 +msgid "Home" +msgstr "Home" + +#: ldt_utils/templates/ldt/ldt_utils/content_list.html:55 +#: templates/admin/page_base.html:19 +#: user/templates/ldt/user/login_form.html:33 +#: user/templates/ldt/user/space.html:6 user/templates/ldt/user/space.html:9 +msgid "Space" +msgstr "Space" + +#: ldt_utils/templates/ldt/ldt_utils/content_list.html:56 +msgid "Ldt Project" +msgstr "Ldt Project" + +#: ldt_utils/templates/ldt/ldt_utils/content_list.html:59 +msgid "Contents" +msgstr "Contents" + +#: ldt_utils/templates/ldt/ldt_utils/content_list.html:63 +msgid "Create new content" +msgstr "Create new content" + +#: ldt_utils/templates/ldt/ldt_utils/content_list.html:66 +msgid "Content" +msgstr "Content" + +#: 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:11 +msgid "create project" +msgstr "Create new project" + +#: ldt_utils/templates/ldt/ldt_utils/copy_ldt.html:11 +msgid "Copy your project" +msgstr "Copy your project" + +#: ldt_utils/templates/ldt/ldt_utils/copy_ldt.html:14 +#: ldt_utils/templates/ldt/ldt_utils/create_ldt.html:38 +msgid "Title" +msgstr "Title" + +#: ldt_utils/templates/ldt/ldt_utils/copy_ldt.html:16 +msgid "Copy" +msgstr "Copy" + +#: ldt_utils/templates/ldt/ldt_utils/create_content.html:47 +msgid "" +"The operation could not be performed because one or more error(s) occurred." +"
    Please resubmit the content form after making the following changes:" +msgstr "" +"The operation could not be performed because one or more error(s) occurred." +"
    Please resubmit the content form after making the following changes:" + +#: ldt_utils/templates/ldt/ldt_utils/create_content.html:58 +msgid "" +"The operation could not be performed because one or more error(s) occurred." +"
    Please resubmit the media form after making the following changes:" +msgstr "" +"The operation could not be performed because one or more error(s) occurred." +"
    Please resubmit the media form after making the following changes:" + +#: ldt_utils/templates/ldt/ldt_utils/create_content.html:68 +#: ldt_utils/templates/ldt/ldt_utils/partial/contentslist.html:21 +msgid "Create content" +msgstr "Create content" + +#: ldt_utils/templates/ldt/ldt_utils/create_content.html:105 +msgid "media file is being processed please wait." +msgstr "media file is being processed please wait." + +#: ldt_utils/templates/ldt/ldt_utils/create_content.html:109 +#: ldt_utils/templates/ldt/ldt_utils/create_ldt.html:59 +#: ldt_utils/templates/ldt/ldt_utils/error_confirm.html:49 +msgid "close_cancel" +msgstr "Close" + +#: ldt_utils/templates/ldt/ldt_utils/create_content.html:110 +msgid "delete" +msgstr "Approve delete" + +#: ldt_utils/templates/ldt/ldt_utils/create_content.html:111 +msgid "write" +msgstr "write" + +#: ldt_utils/templates/ldt/ldt_utils/create_ldt.html:34 +msgid "Update your project" +msgstr "Create your project" + +#: ldt_utils/templates/ldt/ldt_utils/create_ldt.html:34 +msgid "Create your project" +msgstr "Create your project" + +#: ldt_utils/templates/ldt/ldt_utils/create_ldt.html:40 +msgid "List of contents" +msgstr "List of contents" + +#: ldt_utils/templates/ldt/ldt_utils/create_ldt.html:42 +#: ldt_utils/templates/ldt/ldt_utils/partial/contentslist.html:3 +#: ldt_utils/templates/ldt/ldt_utils/partial/projectslist.html:3 +msgid "name" +msgstr "name" + +#: ldt_utils/templates/ldt/ldt_utils/create_ldt.html:61 +msgid "delete_project" +msgstr "delete project" + +#: ldt_utils/templates/ldt/ldt_utils/create_ldt.html:62 +msgid "update_project" +msgstr "update project" + +#: ldt_utils/templates/ldt/ldt_utils/create_ldt.html:64 +msgid "create_project" +msgstr "Create new project" + +#: ldt_utils/templates/ldt/ldt_utils/embed_popup.html:42 +msgid "popup_player" +msgstr "player" + +#: ldt_utils/templates/ldt/ldt_utils/embed_popup.html:42 +msgid "popup_seo_body" +msgstr "seo" + +#: ldt_utils/templates/ldt/ldt_utils/embed_popup.html:42 +msgid "popup_seo_meta" +msgstr "meta" + +#: ldt_utils/templates/ldt/ldt_utils/embed_popup.html:42 +msgid "popup_links" +msgstr "links" + +#: ldt_utils/templates/ldt/ldt_utils/embed_popup.html:56 +msgid "clik here to see the project content" +msgstr "clik here to see the project content" + +#: ldt_utils/templates/ldt/ldt_utils/error_confirm.html:30 +msgid "error" +msgstr "Error" + +#: ldt_utils/templates/ldt/ldt_utils/error_confirm.html:30 +msgid "confirm" +msgstr "Confirm deletion" + +#: ldt_utils/templates/ldt/ldt_utils/error_confirm.html:45 +msgid "close_error" +msgstr "Close" + +#: ldt_utils/templates/ldt/ldt_utils/error_confirm.html:50 +msgid "do_delete" +msgstr "Approve delete" + +#: ldt_utils/templates/ldt/ldt_utils/ldt_list.html:77 +#: ldt_utils/templates/ldt/ldt_utils/workspace_base.html:63 +msgid "project list" +msgstr "Projects" + +#: ldt_utils/templates/ldt/ldt_utils/ldt_list.html:79 +#: ldt_utils/templates/ldt/ldt_utils/workspace_base.html:54 +#: ldt_utils/templates/ldt/ldt_utils/workspace_base.html:65 +msgid "search" +msgstr "search" + +#: ldt_utils/templates/ldt/ldt_utils/workspace_base.html:52 +msgid "content list" +msgstr "contents" + +#: ldt_utils/templates/ldt/ldt_utils/partial/contentslist.html:12 +msgid "preview media" +msgstr "preview media" + +#: ldt_utils/templates/ldt/ldt_utils/partial/projectslist.html:12 +msgid "open ldt" +msgstr "open ldt" + +#: ldt_utils/templates/ldt/ldt_utils/partial/projectslist.html:13 +msgid "copy project" +msgstr "Copy your project" + +#: ldt_utils/templates/ldt/ldt_utils/partial/projectslist.html:14 +msgid "link json by id" +msgstr "link json by id" + +#: ldt_utils/templates/ldt/ldt_utils/partial/projectslist.html:17 +msgid "Project published, click to unpublish" +msgstr "Project published, click to unpublish" + +#: ldt_utils/templates/ldt/ldt_utils/partial/projectslist.html:19 +msgid "Project not published, click to publish" +msgstr "Project not published, click to publish" + +#: ldt_utils/templates/ldt/ldt_utils/partial/projectslist.html:36 +msgid "Create project" +msgstr "Create new project" + +#: templates/admin/cms_change_form.html:30 +msgid "Approve page deletion" +msgstr "Approve page deletion" + +#: templates/admin/cms_change_form.html:36 +#, python-format +msgid "(requires approvement at %(moderation_level)s level)" +msgstr "(requires approvement at %(moderation_level)s level)" + +#: templates/admin/cms_change_form.html:37 +msgid "(you can perform actions on this page directly)" +msgstr "(you can perform actions on this page directly)" + +#: templates/admin/cms_change_form.html:50 +msgid "Remove delete request" +msgstr "Remove delete request" + +#: templates/admin/cms_change_form.html:52 +msgid "Approve delete" +msgstr "Approve delete" + +#: templates/admin/cms_change_form.html:52 +msgid "Approve" +msgstr "Approve" + +#: templates/admin/cms_change_form.html:52 +#: templates/admin/cms_change_form.html:53 +msgid "draft" +msgstr "draft" + +#: templates/admin/cms_change_form.html:53 +msgid "Preview" +msgstr "Preview" + +#: templates/admin/cms_change_form.html:56 +#: templates/admin/page_change_form.html:27 +msgid "History" +msgstr "History" + +#: templates/admin/cms_change_form.html:57 +#: templates/admin/page_change_form.html:28 +msgid "View on site" +msgstr "View on 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 +msgid "Please correct the error below." +msgid_plural "Please correct the errors below." +msgstr[0] "Please correct the error below." +msgstr[1] "Please correct the errors below." + +#: templates/admin/cms_change_form.html:107 +msgid "All permissions" +msgstr "All permissions" + +#: templates/admin/cms_change_form.html:108 +#: templates/admin/cms_change_form.html:120 +msgid "Loading..." +msgstr "Loading..." + +#: templates/admin/cms_change_form.html:119 +msgid "Page states" +msgstr "Page states" + +#: templates/admin/cms_change_form.html:142 +#, python-format +msgid "" +"This page must be moderated at level %(moderation_level)s, post a message " +"for moderator." +msgstr "" +"This page must be moderated at level %(moderation_level)s, post a message " +"for moderator." + +#: templates/admin/cms_change_form.html:144 +msgid "Request approvemet" +msgstr "Request approvemet" + +#: templates/admin/cms_change_form.html:234 +#: user/templates/registration/registration_form.html:16 +msgid "Save" +msgstr "Save" + +#: templates/admin/cms_change_form.html:235 +msgid "Save and continue editing" +msgstr "Save and continue editing" + +#: templates/admin/cms_change_list.html:51 +msgid "Successfully moved" +msgstr "Successfully moved" + +#: templates/admin/cms_change_list.html:76 +#, python-format +msgid "Recover deleted %(name)s" +msgstr "Recover deleted %(name)s" + +#: templates/admin/cms_change_list.html:79 +#: templates/admin/page_change_list.html:46 +#, python-format +msgid "Add %(name)s" +msgstr "Add %(name)s" + +#: templates/admin/cms_change_list.html:91 +msgid "Pages on:" +msgstr "Pages on:" + +#: templates/admin/cms_change_list.html:108 +msgid "on" +msgstr "on" + +#: templates/admin/cms_change_list.html:108 +msgid "off" +msgstr "off" + +#: templates/admin/cms_change_list.html:110 +#: templates/admin/page_change_list.html:65 +msgid "Filter" +msgstr "Filter" + +#: templates/admin/index.html:18 templates/admin/page_index.html:18 +#, python-format +msgid "Models available in the %(name)s application." +msgstr "Models available in the %(name)s application." + +#: templates/admin/index.html:19 templates/admin/page_app_index.html:10 +#: templates/admin/page_index.html: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 +msgid "Add" +msgstr "Add" + +#: templates/admin/index.html:35 templates/admin/page_index.html:35 +msgid "Change" +msgstr "changed by" + +#: templates/admin/index.html:64 templates/admin/page_index.html:45 +msgid "You don't have permission to edit anything." +msgstr "You don't have permission to edit anything." + +#: templates/admin/index.html:72 templates/admin/page_index.html:53 +msgid "Recent Actions" +msgstr "Recent Actions" + +#: templates/admin/index.html:73 templates/admin/page_index.html:54 +msgid "My Actions" +msgstr "My Actions" + +#: templates/admin/index.html:77 templates/admin/page_index.html:58 +msgid "None available" +msgstr "None available" + +#: templates/admin/index.html:91 templates/admin/page_index.html:72 +msgid "Unknown content" +msgstr "Unknown content" + +#: templates/admin/page_base.html:20 templates/admin/page_index.html:11 +msgid "Pages" +msgstr "Pages" + +#: templates/admin/page_base_site.html:7 +msgid "Django administration" +msgstr "Django administration" + +#: templates/admin/page_login.html:8 +msgid "Connexion" +msgstr "Login" + +#: templates/admin/page_login.html:20 +msgid "Username:" +msgstr "Username:" + +#: templates/admin/page_login.html:24 +msgid "Password:" +msgstr "Password:" + +#: templates/admin/page_login.html:29 +#: user/templates/registration/login.html:29 +msgid "Create an account" +msgstr "Create an account" + +#: templates/admin/page_login.html:30 +#: user/templates/registration/login.html:30 +msgid "Forget password?" +msgstr "Forget password?" + +#: 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:14 +#: user/templates/registration/password_reset_complete.html:14 +msgid "Log in" +msgstr "Log in" + +#: templates/cms/admin/cms/page/change_form.html:11 +msgid "Documentation" +msgstr "Documentation" + +#: templates/cms/admin/cms/page/change_form.html:11 +msgid "Change password" +msgstr "Change password" + +#: templates/cms/admin/cms/page/change_form.html:11 +#: templates/ldt/ldt_base.html:54 user/templates/ldt/user/login_form.html:34 +msgid "Log out" +msgstr "Log out" + +#: templates/cms/admin/cms/page/change_form.html:42 +msgid "Ordering" +msgstr "Ordering" + +#: templates/cms/admin/cms/page/change_form.html:45 +msgid "Order:" +msgstr "Order:" + +#: templates/ldt/ldt_base.html:26 +msgid "header_title" +msgstr "Ldt Platform" + +#: templates/ldt/ldt_base.html:44 +msgid "home" +msgstr "home" + +#: templates/ldt/ldt_base.html:45 +msgid "contents" +msgstr "Contents" + +#: templates/ldt/ldt_base.html:46 +msgid "indexation projects" +msgstr "indexation projects" + +#: templates/ldt/ldt_base.html:47 +msgid "accounts" +msgstr "accounts" + +#: templates/ldt/ldt_base.html:48 user/templates/ldt/user/change_email.html:6 +#: user/templates/ldt/user/change_email_done.html:6 +#: user/templates/ldt/user/login_form.html:32 +#: user/templates/registration/password_change_done.html:7 +#: user/templates/registration/password_change_form.html:13 +msgid "Profiles" +msgstr "Profiles" + +#: templates/ldt/ldt_base.html:62 +msgid "Langue" +msgstr "Langue" + +#: templates/ldt/ldt_raw_base.html:13 +msgid "page_title" +msgstr "Ldt Platform" + +#: user/admin.py:15 +msgid "User details" +msgstr "User details" + +#: user/admin.py:16 +msgid "Groups" +msgstr "Groups" + +#: user/admin.py:17 +msgid "Permissions" +msgstr "Permissions" + +#: user/admin.py:27 user/templates/ldt/user/login_form.html:61 +msgid "Password" +msgstr "Password" + +#: user/forms.py:31 +msgid "New password" +msgstr "New password" + +#: user/forms.py:33 +msgid "New password confirmation" +msgstr "New password confirmation" + +#: user/forms.py:78 user/forms.py:79 +msgid "E-mail" +msgstr "E-mail" + +#: user/forms.py:90 +msgid "The two emails didn't match." +msgstr "The two emails didn't match." + +#: user/views.py:45 user/templates/registration/login.html:17 +msgid "Sorry, that's not a valid username or password." +msgstr "Sorry, that's not a valid username or password." + +#: user/templates/ldt/user/change_email.html:7 +#: user/templates/ldt/user/change_email.html:10 +msgid "Modification de l'adresse émail" +msgstr "E-mail change" + +#: user/templates/ldt/user/change_email.html:26 +msgid "" +"Please enter your new e-mail twice so we can verify you typed it in " +"correctly." +msgstr "" +"Please enter your new e-mail twice so we can verify you typed it in " +"correctly." + +#: user/templates/ldt/user/change_email.html:32 +msgid "email" +msgstr "email" + +#: user/templates/ldt/user/change_email.html:41 +msgid "Confirmation de l'adresse émail" +msgstr "E-mail confirmation" + +#: user/templates/ldt/user/change_email.html:48 +msgid "change my e-mail" +msgstr "Change my e-mail" + +#: user/templates/ldt/user/change_email_done.html:7 +#: user/templates/ldt/user/change_email_done.html:10 +msgid "email change" +msgstr "email change" + +#: user/templates/ldt/user/change_email_done.html:12 +msgid "email changed" +msgstr "changed by" + +#: user/templates/ldt/user/change_email_done.html:13 +msgid "back to profile" +msgstr "back to profile" + +#: user/templates/ldt/user/home.html:9 +msgid "Se connecter" +msgstr "Login" + +#: user/templates/ldt/user/home.html:10 +msgid "Créer un compte" +msgstr "Create an account" + +#: user/templates/ldt/user/home.html:11 +msgid "récupérer mot de passe" +msgstr "Forget password?" + +#: user/templates/ldt/user/login_form.html:50 +msgid "create account" +msgstr "create account" + +#: user/templates/ldt/user/login_form.html:54 +msgid "Pseudo" +msgstr "Username" + +#: user/templates/ldt/user/login_form.html:57 +#: user/templates/ldt/user/login_form.html:64 +msgid "this field is compulsory" +msgstr "this field is compulsory" + +#: user/templates/ldt/user/login_form.html:68 +msgid "reset password" +msgstr "reset password" + +#: user/templates/ldt/user/login_form.html:71 +msgid "Connection" +msgstr "Login" + +#: user/templates/ldt/user/profile.html:6 +#: user/templates/registration/password_change_form.html:14 +#: user/templates/registration/password_change_form.html:17 +msgid "Password change" +msgstr "Password change" + +#: user/templates/ldt/user/profile.html:7 +msgid "Mail change" +msgstr "Mail change" + +#: user/templates/ldt/user/space.html:13 +msgid "Page" +msgstr "Pages" + +#: user/templates/ldt/user/space.html:16 +msgid "Projets Lignes de temps" +msgstr "Lignes de temps projects" + +#: user/templates/registration/activate.html:6 +#: user/templates/registration/activate.html:9 +msgid "Activate account" +msgstr "Activate account" + +#: user/templates/registration/activate.html:12 +msgid "You have activated your account" +msgstr "You have activated your account" + +#: user/templates/registration/activate.html:13 +msgid "Go back to login page" +msgstr "Go back to login page" + +#: user/templates/registration/activation_complete.html:4 +#: user/templates/registration/registration_complete.html:8 +msgid "Sign up successfully" +msgstr "Sign up successfully" + +#: user/templates/registration/activation_complete.html:6 +msgid "activation completed" +msgstr "activation completed" + +#: user/templates/registration/logged_out.html:8 +msgid "Thanks for spending some quality time with the Web site today." +msgstr "Thanks for spending some quality time with the Web site today." + +#: user/templates/registration/logged_out.html:10 +msgid "Log in again" +msgstr "Log in again" + +#: user/templates/registration/login.html:25 +msgid "login" +msgstr "login" + +#: user/templates/registration/password_change_done.html:3 +#: user/templates/registration/password_change_done.html:11 +msgid "password change successful" +msgstr "password change successful" + +#: user/templates/registration/password_change_done.html:8 +msgid "password change" +msgstr "password change" + +#: user/templates/registration/password_change_done.html:14 +msgid "Your password has been changed." +msgstr "Your password has been changed." + +#: user/templates/registration/password_change_done.html:15 +msgid "Go back to profiles" +msgstr "Go back to profiles" + +#: user/templates/registration/password_change_form.html: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." +msgstr "" +"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." + +#: user/templates/registration/password_change_form.html:26 +msgid "Old password:" +msgstr "Old password:" + +#: user/templates/registration/password_change_form.html:32 +#: user/templates/registration/password_reset_confirm.html:19 +msgid "New password:" +msgstr "New password:" + +#: user/templates/registration/password_change_form.html:38 +#: user/templates/registration/password_reset_confirm.html:21 +msgid "Confirm password:" +msgstr "Confirm password:" + +#: user/templates/registration/password_change_form.html:44 +#: user/templates/registration/password_reset_confirm.html:22 +msgid "Change my password" +msgstr "Change my password" + +#: 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 +msgid "Password reset" +msgstr "Password reset" + +#: user/templates/registration/password_reset_complete.html:9 +msgid "Password reset complete" +msgstr "Password reset complete" + +#: user/templates/registration/password_reset_complete.html:12 +msgid "Your password has been set. You may go ahead and log in now." +msgstr "Your password has been set. You may go ahead and log in now." + +#: user/templates/registration/password_reset_confirm.html:15 +msgid "" +"Please enter your new password twice so we can verify you typed it in " +"correctly." +msgstr "" +"Please enter your new password twice so we can verify you typed it in " +"correctly." + +#: user/templates/registration/password_reset_confirm.html:27 +msgid "Password reset unsuccessful" +msgstr "Password reset unsuccessful" + +#: user/templates/registration/password_reset_confirm.html:29 +msgid "" +"The password reset link was invalid, possibly because it has already been " +"used. Please request a new password reset." +msgstr "" +"The password reset link was invalid, possibly because it has already been " +"used. Please request a new password reset." + +#: user/templates/registration/password_reset_done.html:8 +msgid "Password reset successful" +msgstr "Password reset successful" + +#: user/templates/registration/password_reset_done.html: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." +msgstr "" +"We've e-mailed you instructions for setting your password to the e-mail " +"address you submitted. You should be receiving it shortly." + +#: user/templates/registration/password_reset_email.html:2 +msgid "You're receiving this e-mail because you requested a password reset" +msgstr "You're receiving this e-mail because you requested a password reset" + +#: user/templates/registration/password_reset_email.html:3 +#, python-format +msgid "for your user account at %(site_name)s" +msgstr "for your user account at %(site_name)s" + +#: user/templates/registration/password_reset_email.html:5 +msgid "Please go to the following page and choose a new password:" +msgstr "Please go to the following page and choose a new password:" + +#: user/templates/registration/password_reset_email.html:9 +msgid "Your username, in case you've forgotten:" +msgstr "Your username, in case you've forgotten:" + +#: user/templates/registration/password_reset_email.html:11 +msgid "Thanks for using our site!" +msgstr "Thanks for using our site!" + +#: user/templates/registration/password_reset_email.html:13 +#, python-format +msgid "The %(site_name)s team" +msgstr "The %(site_name)s team" + +#: user/templates/registration/password_reset_form.html:22 +msgid "" +"Forgotten your password? Enter your e-mail address below, and we'll e-mail " +"instructions for setting a new one." +msgstr "" +"Forgotten your password? Enter your e-mail address below, and we'll e-mail " +"instructions for setting a new one." + +#: user/templates/registration/password_reset_form.html:27 +msgid "Adresse émail" +msgstr "E-mail" + +#: user/templates/registration/password_reset_form.html:32 +msgid "Reset my password" +msgstr "Reset my password" + +#: user/templates/registration/registration_active.html:5 +#: user/templates/registration/registration_active.html:7 +msgid "Activate the account" +msgstr "Activate the account" + +#: user/templates/registration/registration_active.html:9 +msgid "" +"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" +msgstr "go back to login page" + +#: user/templates/registration/registration_complete.html:6 +#: user/templates/registration/registration_form.html:11 +msgid "Sign up" +msgstr "Sign up" + +#: user/templates/registration/registration_complete.html: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." +msgstr "" +"We've e-mailed you instructions for activate your account to the e-mail " +"address you submitted. You should be receiving it shortly." + +#~ msgid "Create" +#~ msgstr "Create" + +#~ msgid "Create new project" +#~ msgstr "Create new project" + +#~ msgid " published" +#~ msgstr " published" + +#~ msgid "Changement de l'adresse émail" +#~ msgstr "E-mail change" + +#~ msgid "Mot de passe" +#~ msgstr "Password" + +#~ msgid "Déconnexion" +#~ msgstr "Logout" diff -r 40eddcc3d063 -r 3a30d255c235 web/ldt/locale/fr/LC_MESSAGES/django.mo Binary file web/ldt/locale/fr/LC_MESSAGES/django.mo has changed diff -r 40eddcc3d063 -r 3a30d255c235 web/ldt/locale/fr/LC_MESSAGES/django.po --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/web/ldt/locale/fr/LC_MESSAGES/django.po Sun Nov 14 20:25:22 2010 +0100 @@ -0,0 +1,1010 @@ +# SOME DESCRIPTIVE TITLE. +# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER +# This file is distributed under the same license as the PACKAGE package. +# FIRST AUTHOR , YEAR. +# +msgid "" +msgstr "" +"Project-Id-Version: PACKAGE VERSION\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2010-10-19 19:43+0200\n" +"PO-Revision-Date: 2010-03-09 15:52+0100\n" +"Last-Translator: Yves-Marie Haussonne \n" +"Language-Team: LANGUAGE \n" +"Language: \n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" + +#: forms/widgets.py:17 +msgid "Date" +msgstr "Date" + +#: forms/widgets.py:17 +msgid "Time" +msgstr "Time" + +#: ldt_utils/forms.py:43 ldt_utils/models.py:82 +msgid "content.content_creation_date" +msgstr "Date de creation du contenu" + +#: ldt_utils/forms.py:44 +msgid "content.media_input_type" +msgstr "Source du média" + +#: ldt_utils/forms.py:44 +msgid "file_upload" +msgstr "upload fichier" + +#: ldt_utils/forms.py:44 +msgid "url" +msgstr "url" + +#: ldt_utils/forms.py:44 +msgid "existing_media" +msgstr "média existant" + +#: ldt_utils/forms.py:44 +msgid "create_media" +msgstr "source serveur de stream" + +#: ldt_utils/forms.py:44 +msgid "none_media" +msgstr "Aucun" + +#: ldt_utils/models.py:25 +msgid "media.external_id" +msgstr "id externe" + +#: ldt_utils/models.py:26 +msgid "media.external_permalink" +msgstr "permalien externe" + +#: ldt_utils/models.py:27 +msgid "media.external_publication_url" +msgstr "url de publication externe" + +#: ldt_utils/models.py:28 +msgid "media.external_src_url" +msgstr "url source" + +#: ldt_utils/models.py:29 +msgid "media.creation_date" +msgstr "Date de création" + +#: ldt_utils/models.py:30 +msgid "media.media_creation_date" +msgstr "Date de création du média" + +#: ldt_utils/models.py:31 +msgid "media.update_date" +msgstr "Date de maj" + +#: ldt_utils/models.py:32 +msgid "media.videopath" +msgstr "videopath" + +#: ldt_utils/models.py:33 +msgid "media.duration" +msgstr "Durée du contenu (ms)" + +#: ldt_utils/models.py:34 +msgid "media.creator" +msgstr "Créateur" + +#: ldt_utils/models.py:35 +msgid "description" +msgstr "description" + +#: ldt_utils/models.py:36 +#: ldt_utils/templates/ldt/ldt_utils/content_list.html:69 +msgid "title" +msgstr "Titre" + +#: ldt_utils/models.py:37 +msgid "media.src" +msgstr "Sources" + +#: ldt_utils/models.py:74 +msgid "content.iri_id" +msgstr "iri id" + +#: ldt_utils/models.py:75 +msgid "content.iriurl" +msgstr "iri url" + +#: ldt_utils/models.py:76 +msgid "content.creation_date" +msgstr "date de création" + +#: ldt_utils/models.py:77 +msgid "content.update_date" +msgstr "Date de maj" + +#: ldt_utils/models.py:78 +msgid "content.title" +msgstr "titre" + +#: ldt_utils/models.py:79 +msgid "content.description" +msgstr "Description" + +#: ldt_utils/models.py:80 +msgid "content.authors" +msgstr "Autheurs" + +#: ldt_utils/models.py:81 +msgid "content.duration" +msgstr "Durée (ms)" + +#: ldt_utils/models.py:256 +msgid "created by" +msgstr "créé par" + +#: ldt_utils/models.py:257 +msgid "changed by" +msgstr "modifié par" + +#: ldt_utils/views.py:72 ldt_utils/views.py:332 ldt_utils/views.py:378 +msgid "You can not access this project" +msgstr "vous n'avez pas l'autorisation d'accéder à ce projet" + +#: ldt_utils/views.py:536 +#, 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.py:537 +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.py:538 +msgid "title error deleting project" +msgstr "Erreur lors de l'effacement du projet" + +#: ldt_utils/views.py:540 +#, python-format +msgid "please confirm deleting project %(title)s" +msgstr "Confirmer l'efaccement du projet intitulé %(title)s" + +#: ldt_utils/views.py:541 +msgid "confirm deletion" +msgstr "Confirmation d'effacement" + +#: ldt_utils/views.py:683 +msgid "Problem when downloading file from url : " +msgstr "Problème lors du téléchargement du fichier : " + +#: ldt_utils/views.py:686 +msgid "Problem when uploading file : " +msgstr "Problème lors de l'upload du fichier : " + +#: ldt_utils/views.py:756 +#, 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.py:757 +msgid "title error deleting content" +msgstr "Erreur lors de l'effacement du contenu" + +#: ldt_utils/views.py:759 +#, python-format +msgid "Confirm delete content %(titles)s" +msgstr "Veuillez confirmer l'effacement du contenu %(titles)s" + +#: ldt_utils/views.py:760 +msgid "confirm delete content" +msgstr "Confirmation effacement contenu" + +#: ldt_utils/views.py:791 +#, python-format +msgid "" +"Content '%(title)s' is referenced by this project : %(project_titles)s. " +"Please delete it beforehand." +msgid_plural "" +"Content '%(title)s' is referenced by %(count)d projects: %(project_titles)s. " +"Please delete them beforehand." +msgstr[0] "" +"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." + +#: 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 +msgid "Home" +msgstr "Accueil" + +#: ldt_utils/templates/ldt/ldt_utils/content_list.html:55 +#: templates/admin/page_base.html:19 +#: user/templates/ldt/user/login_form.html:33 +#: user/templates/ldt/user/space.html:6 user/templates/ldt/user/space.html:9 +msgid "Space" +msgstr "Esp. perso" + +#: ldt_utils/templates/ldt/ldt_utils/content_list.html:56 +msgid "Ldt Project" +msgstr "Projet lignes de temps" + +#: ldt_utils/templates/ldt/ldt_utils/content_list.html:59 +msgid "Contents" +msgstr "Liste des contenus" + +#: ldt_utils/templates/ldt/ldt_utils/content_list.html:63 +msgid "Create new content" +msgstr "Créer un nouveau contenu" + +#: ldt_utils/templates/ldt/ldt_utils/content_list.html: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:11 +msgid "create project" +msgstr "Créer un nouveau projet d'indexation" + +#: ldt_utils/templates/ldt/ldt_utils/copy_ldt.html:11 +msgid "Copy your project" +msgstr "Copier votre projet" + +#: ldt_utils/templates/ldt/ldt_utils/copy_ldt.html:14 +#: ldt_utils/templates/ldt/ldt_utils/create_ldt.html:38 +msgid "Title" +msgstr "Titre" + +#: ldt_utils/templates/ldt/ldt_utils/copy_ldt.html:16 +msgid "Copy" +msgstr "Copier" + +#: ldt_utils/templates/ldt/ldt_utils/create_content.html:47 +msgid "" +"The operation could not be performed because one or more error(s) occurred." +"
    Please resubmit the content form after making the following changes:" +msgstr "" +"Opération impossible à cause d'une ou plusieurs erreurs.
    Veuillez " +"resoumettre le formulaire contenu après avoir fait les changements suivants:" + +#: ldt_utils/templates/ldt/ldt_utils/create_content.html:58 +msgid "" +"The operation could not be performed because one or more error(s) occurred." +"
    Please resubmit the media form after making the following changes:" +msgstr "" +"opération impossible à cause d'une ou plusieurs erreurs.
    Veuillez " +"resoumettre le formulaire media après avoir fait les changements suivants:" + +#: ldt_utils/templates/ldt/ldt_utils/create_content.html:68 +#: ldt_utils/templates/ldt/ldt_utils/partial/contentslist.html:21 +msgid "Create content" +msgstr "Créer un contenu" + +#: ldt_utils/templates/ldt/ldt_utils/create_content.html:105 +msgid "media file is being processed please wait." +msgstr "Le fichier média est en cours de traitement. Veullez patienter." + +#: ldt_utils/templates/ldt/ldt_utils/create_content.html:109 +#: ldt_utils/templates/ldt/ldt_utils/create_ldt.html:59 +#: ldt_utils/templates/ldt/ldt_utils/error_confirm.html:49 +msgid "close_cancel" +msgstr "Fermer" + +#: ldt_utils/templates/ldt/ldt_utils/create_content.html:110 +msgid "delete" +msgstr "Effacer" + +#: ldt_utils/templates/ldt/ldt_utils/create_content.html:111 +msgid "write" +msgstr "Enregistrer" + +#: ldt_utils/templates/ldt/ldt_utils/create_ldt.html:34 +msgid "Update your project" +msgstr "Mettre à jour votre projet Lignes de Temps" + +#: ldt_utils/templates/ldt/ldt_utils/create_ldt.html:34 +msgid "Create your project" +msgstr "Créer votre projet Lignes de Temps" + +#: ldt_utils/templates/ldt/ldt_utils/create_ldt.html:40 +msgid "List of contents" +msgstr "Liste de contenus" + +#: ldt_utils/templates/ldt/ldt_utils/create_ldt.html:42 +#: ldt_utils/templates/ldt/ldt_utils/partial/contentslist.html:3 +#: ldt_utils/templates/ldt/ldt_utils/partial/projectslist.html:3 +msgid "name" +msgstr "nom" + +#: ldt_utils/templates/ldt/ldt_utils/create_ldt.html:61 +msgid "delete_project" +msgstr "Effacer" + +#: ldt_utils/templates/ldt/ldt_utils/create_ldt.html:62 +msgid "update_project" +msgstr "Mettre à jour" + +#: ldt_utils/templates/ldt/ldt_utils/create_ldt.html:64 +msgid "create_project" +msgstr "Créer un nouveau projet Ligne de Temps" + +#: ldt_utils/templates/ldt/ldt_utils/embed_popup.html:42 +msgid "popup_player" +msgstr "Code Lecteur métadata" + +#: ldt_utils/templates/ldt/ldt_utils/embed_popup.html:42 +msgid "popup_seo_body" +msgstr "Code SEO" + +#: ldt_utils/templates/ldt/ldt_utils/embed_popup.html:42 +msgid "popup_seo_meta" +msgstr "Code balise meta en-tête" + +#: ldt_utils/templates/ldt/ldt_utils/embed_popup.html:42 +msgid "popup_links" +msgstr "Liste de liens" + +#: ldt_utils/templates/ldt/ldt_utils/embed_popup.html:56 +msgid "clik here to see the project content" +msgstr "cliquer ici pour voir le contenu du projet" + +#: ldt_utils/templates/ldt/ldt_utils/error_confirm.html:30 +msgid "error" +msgstr "Erreur" + +#: ldt_utils/templates/ldt/ldt_utils/error_confirm.html:30 +msgid "confirm" +msgstr "Confirmation d'effacement" + +#: ldt_utils/templates/ldt/ldt_utils/error_confirm.html:45 +msgid "close_error" +msgstr "Fermer" + +#: ldt_utils/templates/ldt/ldt_utils/error_confirm.html:50 +msgid "do_delete" +msgstr "Effacer" + +#: ldt_utils/templates/ldt/ldt_utils/ldt_list.html:77 +#: ldt_utils/templates/ldt/ldt_utils/workspace_base.html:63 +msgid "project list" +msgstr "Liste des projets" + +#: ldt_utils/templates/ldt/ldt_utils/ldt_list.html:79 +#: ldt_utils/templates/ldt/ldt_utils/workspace_base.html:54 +#: ldt_utils/templates/ldt/ldt_utils/workspace_base.html:65 +msgid "search" +msgstr "Recherche" + +#: ldt_utils/templates/ldt/ldt_utils/workspace_base.html:52 +msgid "content list" +msgstr "Liste des contenus" + +#: ldt_utils/templates/ldt/ldt_utils/partial/contentslist.html:12 +msgid "preview media" +msgstr "aperçu" + +#: ldt_utils/templates/ldt/ldt_utils/partial/projectslist.html:12 +msgid "open ldt" +msgstr "Ouvrir sous Lignes de Temps" + +#: ldt_utils/templates/ldt/ldt_utils/partial/projectslist.html:13 +msgid "copy project" +msgstr "Copier votre projet" + +#: ldt_utils/templates/ldt/ldt_utils/partial/projectslist.html:14 +msgid "link json by id" +msgstr "Ouvrir le lecteur de métadata" + +#: ldt_utils/templates/ldt/ldt_utils/partial/projectslist.html:17 +msgid "Project published, click to unpublish" +msgstr "Projet publié, cliquer pour de-publier" + +#: ldt_utils/templates/ldt/ldt_utils/partial/projectslist.html:19 +msgid "Project not published, click to publish" +msgstr "Projet non publié, cliquer pour publier" + +#: ldt_utils/templates/ldt/ldt_utils/partial/projectslist.html:36 +msgid "Create project" +msgstr "Créer un nouveau projet d'indexation" + +#: templates/admin/cms_change_form.html:30 +msgid "Approve page deletion" +msgstr "Accepter l'effacement de la page" + +#: templates/admin/cms_change_form.html: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 +msgid "(you can perform actions on this page directly)" +msgstr "(Vous pouvez agir sur cette page directement)" + +#: templates/admin/cms_change_form.html:50 +msgid "Remove delete request" +msgstr "Effacer la requête d'affacement" + +#: templates/admin/cms_change_form.html:52 +msgid "Approve delete" +msgstr "Accepter l'effacement" + +#: templates/admin/cms_change_form.html:52 +msgid "Approve" +msgstr "Accepter" + +#: templates/admin/cms_change_form.html:52 +#: templates/admin/cms_change_form.html:53 +msgid "draft" +msgstr "brouillon" + +#: templates/admin/cms_change_form.html:53 +msgid "Preview" +msgstr "Aperçu" + +#: templates/admin/cms_change_form.html:56 +#: templates/admin/page_change_form.html:27 +msgid "History" +msgstr "Histoire" + +#: templates/admin/cms_change_form.html:57 +#: templates/admin/page_change_form.html: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 +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 +msgid "All permissions" +msgstr "Toutes le parmissions" + +#: templates/admin/cms_change_form.html:108 +#: templates/admin/cms_change_form.html:120 +msgid "Loading..." +msgstr "Chargement..." + +#: templates/admin/cms_change_form.html:119 +msgid "Page states" +msgstr "Etat de la page" + +#: templates/admin/cms_change_form.html: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" + +#: templates/admin/cms_change_form.html:144 +msgid "Request approvemet" +msgstr "Demander l'approbation" + +#: templates/admin/cms_change_form.html:234 +#: user/templates/registration/registration_form.html:16 +msgid "Save" +msgstr "Enregistrer" + +#: templates/admin/cms_change_form.html:235 +msgid "Save and continue editing" +msgstr "Sauver et continuer l'édition" + +#: templates/admin/cms_change_list.html:51 +msgid "Successfully moved" +msgstr "Déplacement réussi" + +#: templates/admin/cms_change_list.html: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 +#, python-format +msgid "Add %(name)s" +msgstr "Ajouter %(name)s" + +#: templates/admin/cms_change_list.html:91 +msgid "Pages on:" +msgstr "Pages sur:" + +#: templates/admin/cms_change_list.html:108 +msgid "on" +msgstr "on" + +#: templates/admin/cms_change_list.html:108 +msgid "off" +msgstr "off" + +#: templates/admin/cms_change_list.html:110 +#: templates/admin/page_change_list.html:65 +msgid "Filter" +msgstr "Filtre" + +#: templates/admin/index.html:18 templates/admin/page_index.html: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 +#, 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 +msgid "Add" +msgstr "Ajouter" + +#: templates/admin/index.html:35 templates/admin/page_index.html:35 +msgid "Change" +msgstr "modifié par" + +#: templates/admin/index.html:64 templates/admin/page_index.html:45 +msgid "You don't have permission to edit anything." +msgstr "Vous n'aver pas l'autorisation d'éditer quoi que ce soit." + +#: templates/admin/index.html:72 templates/admin/page_index.html:53 +msgid "Recent Actions" +msgstr "Actions récentes" + +#: templates/admin/index.html:73 templates/admin/page_index.html:54 +msgid "My Actions" +msgstr "Mes actions" + +#: templates/admin/index.html:77 templates/admin/page_index.html:58 +msgid "None available" +msgstr "Aucune disponible" + +#: templates/admin/index.html:91 templates/admin/page_index.html:72 +msgid "Unknown content" +msgstr "Contenu inconnu" + +#: templates/admin/page_base.html:20 templates/admin/page_index.html:11 +msgid "Pages" +msgstr "Pages" + +#: templates/admin/page_base_site.html:7 +msgid "Django administration" +msgstr "Administration de Django" + +#: templates/admin/page_login.html:8 +msgid "Connexion" +msgstr "Connexion" + +#: templates/admin/page_login.html:20 +msgid "Username:" +msgstr "Nom de utilisateur :" + +#: templates/admin/page_login.html:24 +msgid "Password:" +msgstr "Mot de passe :" + +#: templates/admin/page_login.html:29 +#: user/templates/registration/login.html:29 +msgid "Create an account" +msgstr "Créer un compte" + +#: templates/admin/page_login.html:30 +#: user/templates/registration/login.html:30 +msgid "Forget password?" +msgstr "Oubliez le mot de passe?" + +#: 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:14 +#: user/templates/registration/password_reset_complete.html:14 +msgid "Log in" +msgstr "Connexion" + +#: templates/cms/admin/cms/page/change_form.html:11 +msgid "Documentation" +msgstr "Documentation" + +#: templates/cms/admin/cms/page/change_form.html:11 +msgid "Change password" +msgstr "Modifier le mot de passe" + +#: templates/cms/admin/cms/page/change_form.html:11 +#: templates/ldt/ldt_base.html:54 user/templates/ldt/user/login_form.html:34 +msgid "Log out" +msgstr "Déconnexion" + +#: templates/cms/admin/cms/page/change_form.html:42 +msgid "Ordering" +msgstr "Ordre" + +#: templates/cms/admin/cms/page/change_form.html:45 +msgid "Order:" +msgstr "Ordre :" + +#: templates/ldt/ldt_base.html:26 +msgid "header_title" +msgstr "Plateforme Ldt" + +#: templates/ldt/ldt_base.html:44 +msgid "home" +msgstr "accueil" + +#: templates/ldt/ldt_base.html:45 +msgid "contents" +msgstr "Liste des contenus" + +#: templates/ldt/ldt_base.html:46 +msgid "indexation projects" +msgstr "Projets d'indexation" + +#: templates/ldt/ldt_base.html:47 +msgid "accounts" +msgstr "Comptes" + +#: templates/ldt/ldt_base.html:48 user/templates/ldt/user/change_email.html:6 +#: user/templates/ldt/user/change_email_done.html:6 +#: user/templates/ldt/user/login_form.html:32 +#: user/templates/registration/password_change_done.html:7 +#: user/templates/registration/password_change_form.html:13 +msgid "Profiles" +msgstr "Mon profil" + +#: templates/ldt/ldt_base.html:62 +msgid "Langue" +msgstr "Langue" + +#: templates/ldt/ldt_raw_base.html:13 +msgid "page_title" +msgstr "Plateforme Ldt" + +#: user/admin.py:15 +msgid "User details" +msgstr "Détail utilisateur" + +#: user/admin.py:16 +msgid "Groups" +msgstr "Groupes" + +#: user/admin.py:17 +msgid "Permissions" +msgstr "Permissions" + +#: user/admin.py:27 user/templates/ldt/user/login_form.html:61 +msgid "Password" +msgstr "Mot de passe" + +#: user/forms.py:31 +msgid "New password" +msgstr "Nouveau mot de passe" + +#: user/forms.py:33 +msgid "New password confirmation" +msgstr "Confirmation du nouveau mot de passe" + +#: user/forms.py:78 user/forms.py:79 +msgid "E-mail" +msgstr "E-mail" + +#: user/forms.py:90 +msgid "The two emails didn't match." +msgstr "les deux emails ne correspondent pas" + +#: user/views.py:45 user/templates/registration/login.html:17 +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_email.html:7 +#: user/templates/ldt/user/change_email.html:10 +msgid "Modification de l'adresse émail" +msgstr "Modification de l'adresse email" + +#: user/templates/ldt/user/change_email.html:26 +msgid "" +"Please enter your new e-mail twice so we can verify you typed it in " +"correctly." +msgstr "" +"Saisissez deux fois votre nouvelle adresse émail afin de vérifier qu'il est " +"correctment" + +#: user/templates/ldt/user/change_email.html:32 +msgid "email" +msgstr "adresse émail" + +#: user/templates/ldt/user/change_email.html:41 +msgid "Confirmation de l'adresse émail" +msgstr "Confirmation de l'adresse email" + +#: user/templates/ldt/user/change_email.html:48 +msgid "change my e-mail" +msgstr "Changer l'adresse émail" + +#: user/templates/ldt/user/change_email_done.html:7 +#: user/templates/ldt/user/change_email_done.html:10 +msgid "email change" +msgstr "Modification de l'adresse émail" + +#: user/templates/ldt/user/change_email_done.html:12 +msgid "email changed" +msgstr "email modifié" + +#: user/templates/ldt/user/change_email_done.html:13 +msgid "back to profile" +msgstr "Retourner à mon profil" + +#: user/templates/ldt/user/home.html:9 +msgid "Se connecter" +msgstr "Se connecter" + +#: user/templates/ldt/user/home.html:10 +msgid "Créer un compte" +msgstr "Créer un compte" + +#: user/templates/ldt/user/home.html:11 +msgid "récupérer mot de passe" +msgstr "Récupérer le mot de passe" + +#: user/templates/ldt/user/login_form.html:50 +msgid "create account" +msgstr "Créer un compte" + +#: user/templates/ldt/user/login_form.html:54 +msgid "Pseudo" +msgstr "Pseudo" + +#: user/templates/ldt/user/login_form.html:57 +#: user/templates/ldt/user/login_form.html:64 +msgid "this field is compulsory" +msgstr "Ce champs est obligatoire" + +#: user/templates/ldt/user/login_form.html:68 +msgid "reset password" +msgstr "Réinitialiser le mot de passe" + +#: user/templates/ldt/user/login_form.html:71 +msgid "Connection" +msgstr "Connexion" + +#: user/templates/ldt/user/profile.html:6 +#: user/templates/registration/password_change_form.html:14 +#: user/templates/registration/password_change_form.html:17 +msgid "Password change" +msgstr "Modification du mot de passe" + +#: user/templates/ldt/user/profile.html:7 +msgid "Mail change" +msgstr "Modification de l'adresse émail" + +#: user/templates/ldt/user/space.html:13 +msgid "Page" +msgstr "Pages" + +#: user/templates/ldt/user/space.html:16 +msgid "Projets Lignes de temps" +msgstr "Projets Lignes de temps" + +#: user/templates/registration/activate.html:6 +#: user/templates/registration/activate.html:9 +msgid "Activate account" +msgstr "Activer le compte" + +#: user/templates/registration/activate.html:12 +msgid "You have activated your account" +msgstr "Vous avez bien activé votre compte." + +#: user/templates/registration/activate.html: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 +msgid "Sign up successfully" +msgstr "Création de compte avec succès" + +#: user/templates/registration/activation_complete.html:6 +msgid "activation completed" +msgstr "Activation terminée" + +#: user/templates/registration/logged_out.html: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 +msgid "Log in again" +msgstr "Se reconnecter" + +#: user/templates/registration/login.html:25 +msgid "login" +msgstr "Connexion" + +#: user/templates/registration/password_change_done.html:3 +#: user/templates/registration/password_change_done.html:11 +msgid "password change successful" +msgstr "Changement de mot de passe réussi" + +#: user/templates/registration/password_change_done.html:8 +msgid "password change" +msgstr "Changement de mot de passe" + +#: user/templates/registration/password_change_done.html:14 +msgid "Your password has been changed." +msgstr "Votre mot de passe a été changeé." + +#: user/templates/registration/password_change_done.html:15 +msgid "Go back to profiles" +msgstr "Retourner à la page de mon profil" + +#: user/templates/registration/password_change_form.html: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." +msgstr "" +"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 +msgid "Old password:" +msgstr "Ancien mot de passe :" + +#: user/templates/registration/password_change_form.html:32 +#: user/templates/registration/password_reset_confirm.html: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 +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 +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 +msgid "Password reset" +msgstr "réinitialiser e mot de passe" + +#: user/templates/registration/password_reset_complete.html:9 +msgid "Password reset complete" +msgstr "Réinitialisation du mot de passe terminée" + +#: user/templates/registration/password_reset_complete.html:12 +msgid "Your password has been set. You may go ahead and log in now." +msgstr "Votre mot de passe a été fixé. vous pouvez vous connecter maintenant." + +#: user/templates/registration/password_reset_confirm.html: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 +msgid "Password reset unsuccessful" +msgstr "Reinitialisation du mot de pass a échoué" + +#: user/templates/registration/password_reset_confirm.html:29 +msgid "" +"The password reset link was invalid, possibly because it has already been " +"used. Please request a new password reset." +msgstr "" +"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 +msgid "Password reset successful" +msgstr "Réinitialisation du mot de passe réussie" + +#: user/templates/registration/password_reset_done.html: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." +msgstr "" +"Nous vous avons envoyer les instructions de reinitialisation de votre mot de " +"passe à l'adresse email que vous nous avez fournie. vous devriez les " +"recevoir bientôt." + +#: user/templates/registration/password_reset_email.html:2 +msgid "You're receiving this e-mail because you requested a password reset" +msgstr "" +"Vous recevez ce mail car vous avez damender la réinitialisation du mot de " +"passe" + +#: user/templates/registration/password_reset_email.html: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 +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 +msgid "Your username, in case you've forgotten:" +msgstr "Pour rappel votre nom d'autilisateur :" + +#: user/templates/registration/password_reset_email.html:11 +msgid "Thanks for using our site!" +msgstr "Merci de votre visite." + +#: user/templates/registration/password_reset_email.html: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 +msgid "" +"Forgotten your password? Enter your e-mail address below, and we'll e-mail " +"instructions for setting a new one." +msgstr "" +"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" +msgstr "Adresse email" + +#: user/templates/registration/password_reset_form.html: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 +msgid "Activate the account" +msgstr "Activer le compte" + +#: user/templates/registration/registration_active.html:9 +msgid "" +"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" +msgstr "retourner à la page de connexion" + +#: user/templates/registration/registration_complete.html:6 +#: user/templates/registration/registration_form.html:11 +msgid "Sign up" +msgstr "Création d'un compte" + +#: user/templates/registration/registration_complete.html: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." +msgstr "" +"Nous vous avons envoyé par courriel les instructions pour activer le compte " +"à l'adresse que vous avez indiquée. Vous devriez le recevoir rapidement." + +#~ msgid "Create" +#~ msgstr "Créer" + +#~ msgid "Create new project" +#~ msgstr "Créer un nouveau projet Ligne de Temps" + +#~ msgid " published" +#~ msgstr "Publié" + +#~ msgid "Password (Verification)" +#~ msgstr "Mot de passe (Vérification)" diff -r 40eddcc3d063 -r 3a30d255c235 web/ldt/management/__init__.py --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/web/ldt/management/__init__.py Sun Nov 14 20:25:22 2010 +0100 @@ -0,0 +1,66 @@ +from django.db.models import signals +from django.conf import settings +from django.contrib.auth.models import User, Group +from ldt.core.models import Owner +from ldt.user.models import ldt, IriGroup +from django.contrib.contenttypes.models import ContentType +# import logging +from django.core.exceptions import ObjectDoesNotExist + + +def post_save_ldt(instance, raw, created, **kwargs): + signals.post_save.send(sender=User, instance=instance, raw=raw, created=created) + +signals.post_save.connect(post_save_ldt, ldt) + +def post_save_irigroup(instance, raw, created, **kwargs): + signals.post_save.send(sender=Group, instance=instance, raw=raw, created=created) + +signals.post_save.connect(post_save_irigroup, IriGroup) + +def post_save_user(instance, raw, created, **kwargs): + if created: + try: + owner = Owner.objects.get(user=instance) + except ObjectDoesNotExist: + owner=Owner(user=instance) + owner.save() + +signals.post_save.connect(post_save_user, User) + +def post_save_group(instance, raw, created, **kwargs): + if created: + try: + owner = Owner.objects.get(group=instance) + except ObjectDoesNotExist: + owner=Owner(group=instance) + owner.save() + +signals.post_save.connect(post_save_group, Group) + + +def test_cms(): + if 'cms' in settings.INSTALLED_APPS: + return True + else: + return False + +def test_ldt(): + if 'ldt.ldt_utils' in settings.INSTALLED_APPS: + return True + else: + return False + +def get_content_type_list() : + content_type_list = [] + if test_cms(): + content_type = ContentType.objects.get(app_label='cms', model='page') + content_type_list.append(content_type) + content_type = ContentType.objects.get(app_label='snippet', model='snippet') + content_type_list.append(content_type) + # if test_ldt(): + # content_type = ContentType.objects.get(app_label='ldt', model='content') + # content_type_list.append(content_type) + return content_type_list + + diff -r 40eddcc3d063 -r 3a30d255c235 web/ldt/media/css/LdtPlayer.css --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/web/ldt/media/css/LdtPlayer.css Sun Nov 14 20:25:22 2010 +0100 @@ -0,0 +1,175 @@ + #demo-frame > div.demo { padding: 5px !important; }; + + button.ui-button-icon-only { + height:1.5em; + width:1.5em; + } + + #Ldt-loader{ + background:url(imgs/transBlack.gif); + width:10px; + height:10px; + } + + #Ldt-controler { + font-size: 62.5%; + font-family: "Trebuchet MS", "Helvetica", "Arial", "Verdana", "sans-serif"; + background-color:#DECFE2; + height:35px; + padding:5px; + } + + .Ldt-iri-chapter{ + padding-top:10px; + padding-bottom:5px; + border-left:solid 1px #000; + border-right:solid 1px #000; + } + + #Ldt-loader { + background:url(imgs/loader_fc.gif) no-repeat; + width:20px; + height:16px; + float:left; + } + + .tooltip { + display:none; + background:transparent url(imgs/white_arrow_mini.png); + font-size:12px; + height:55px; + width:180px; + padding:10px; + padding-left:15px; + padding-top:15px; + padding-right:15px; + color:#000; + font-family: "Trebuchet MS", "Helvetica", "Arial", "Verdana", "sans-serif"; + } + #Ldt-Root{ + font-family: "Trebuchet MS", "Helvetica", "Arial", "Verdana", "sans-serif"; + } + #Ldt-Hat{ + height:3px; + } + #Ldt-Annotations{ + padding-left:5px; + width:470px; + float:left; + font-size: 62.5%; + } + #Ldt-SaTitle{ + padding-top:2px; + padding-bottom:5px; + font-size:18px; + height:22p; + color:#FFF; + } + #Ldt-SaDescription{ + font-size:12px; + } + #Ldt-Show-Arrow-container{ + margin-left:60px; + } + #Ldt-Show-Arrow{ + position:relative; + background:url(imgs/grey_arrow_Show.png); + width:27px; + height:13px; + margin-top:12px; + margin-left:-10px; + } + + #Ldt-output{ + display:none; + } + #Ldt-Show-Tags{ + position:relative; + height:13px; + margin-top:-10px; + border: solid 1px #000; + } + #Ldt-ShowAnnotation-video{ + position:absolute; + z-index: 999; + padding:5px; + background:url(imgs/transBlack.png); + font-family: "Trebuchet MS", "Helvetica", "Arial", "Verdana", "sans-serif"; + color:#FFF; + } + #Ldt-ShowAnnotation-audio{ + position:relative; + padding:5px; + background-color:#773584; + font-family: "Trebuchet MS", "Helvetica", "Arial", "Verdana", "sans-serif"; + color:#000000; + } + #Ldt-SaKeyword{ + background-color:#28042D; + color:#FFFFFF; + padding:5px; + font-weight:bold; + text-align:left; + float:left; + font-size:10px; + } + #Ldt-SaShareTools{ + text-align:right; + float:right; + } + + + #Ldt-PlaceHolder{ + position:absolue; + float:none; + } + + .Ldt-mode-radio{ + visibility:hidden; + height:0px; + display:none + } + + .Ldt-Control1{ + width:60px; + float:left; + } + .Ldt-Control2{ + padding-left:10px; + width:60px; + float:left; + } + .Ldt-cleaner { + clear:both; + } + .share { + background:url('imgs/widget20.png') no-repeat scroll 0 0 transparent ; + display:block; + height:16px; + line-height:16px !important; + overflow:hidden; + width:16px; + float:left; + cursor:pointer; + margin:2px; + } + .shareFacebook{ + background-position:0 -704px; + } + .shareMySpace{ + background-position:0 -736px; + } + .shareTwitter{ + background-position:0 -1072px; + } + .shareGoogle{ + background-position:0 -752px; + } + .shareDelicious{ + background-position:0 -672px; + } + .shareJamesPot{ + background-position:0 -1808px; + } + + \ No newline at end of file diff -r 40eddcc3d063 -r 3a30d255c235 web/ldt/media/css/blueprint/ie.css --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/web/ldt/media/css/blueprint/ie.css Sun Nov 14 20:25:22 2010 +0100 @@ -0,0 +1,35 @@ +/* ----------------------------------------------------------------------- + + + Blueprint CSS Framework 0.9 + http://blueprintcss.org + + * Copyright (c) 2007-Present. See LICENSE for more info. + * See README for instructions on how to use Blueprint. + * For credits and origins, see AUTHORS. + * This is a compressed file. See the sources in the 'src' directory. + +----------------------------------------------------------------------- */ + +/* ie.css */ +body {text-align:center;} +.container {text-align:left;} +* html .column, * html .span-1, * html .span-2, * html .span-3, * html .span-4, * html .span-5, * html .span-6, * html .span-7, * html .span-8, * html .span-9, * html .span-10, * html .span-11, * html .span-12, * html .span-13, * html .span-14, * html .span-15, * html .span-16, * html .span-17, * html .span-18, * html .span-19, * html .span-20, * html .span-21, * html .span-22, * html .span-23, * html .span-24 {display:inline;overflow-x:hidden;} +* html legend {margin:0px -8px 16px 0;padding:0;} +sup {vertical-align:text-top;} +sub {vertical-align:text-bottom;} +html>body p code {*white-space:normal;} +hr {margin:-8px auto 11px;} +img {-ms-interpolation-mode:bicubic;} +.clearfix, .container {display:inline-block;} +* html .clearfix, * html .container {height:1%;} +fieldset {padding-top:0;} +textarea {overflow:auto;} +input.text, input.title, textarea {background-color:#fff;border:1px solid #bbb;} +input.text:focus, input.title:focus {border-color:#666;} +input.text, input.title, textarea, select {margin:0.5em 0;} +input.checkbox, input.radio {position:relative;top:.25em;} +form.inline div, form.inline p {vertical-align:middle;} +form.inline label {position:relative;top:-0.25em;} +form.inline input.checkbox, form.inline input.radio, form.inline input.button, form.inline button {margin:0.5em 0;} +button, input.button {position:relative;top:0.25em;} \ No newline at end of file diff -r 40eddcc3d063 -r 3a30d255c235 web/ldt/media/css/blueprint/plugins/buttons/icons/cross.png Binary file web/ldt/media/css/blueprint/plugins/buttons/icons/cross.png has changed diff -r 40eddcc3d063 -r 3a30d255c235 web/ldt/media/css/blueprint/plugins/buttons/icons/key.png Binary file web/ldt/media/css/blueprint/plugins/buttons/icons/key.png has changed diff -r 40eddcc3d063 -r 3a30d255c235 web/ldt/media/css/blueprint/plugins/buttons/icons/tick.png Binary file web/ldt/media/css/blueprint/plugins/buttons/icons/tick.png has changed diff -r 40eddcc3d063 -r 3a30d255c235 web/ldt/media/css/blueprint/plugins/buttons/readme.txt --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/web/ldt/media/css/blueprint/plugins/buttons/readme.txt Sun Nov 14 20:25:22 2010 +0100 @@ -0,0 +1,32 @@ +Buttons + +* Gives you great looking CSS buttons, for both and + + + Change Password + + + + Cancel + diff -r 40eddcc3d063 -r 3a30d255c235 web/ldt/media/css/blueprint/plugins/buttons/screen.css --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/web/ldt/media/css/blueprint/plugins/buttons/screen.css Sun Nov 14 20:25:22 2010 +0100 @@ -0,0 +1,97 @@ +/* -------------------------------------------------------------- + + buttons.css + * Gives you some great CSS-only buttons. + + Created by Kevin Hale [particletree.com] + * particletree.com/features/rediscovering-the-button-element + + See Readme.txt in this folder for instructions. + +-------------------------------------------------------------- */ + +a.button, button { + display:block; + float:left; + margin: 0.7em 0.5em 0.7em 0; + padding:5px 10px 5px 7px; /* Links */ + + border:1px solid #dedede; + border-top:1px solid #eee; + border-left:1px solid #eee; + + background-color:#f5f5f5; + font-family:"Lucida Grande", Tahoma, Arial, Verdana, sans-serif; + font-size:100%; + line-height:130%; + text-decoration:none; + font-weight:bold; + color:#565656; + cursor:pointer; +} +button { + width:auto; + overflow:visible; + padding:4px 10px 3px 7px; /* IE6 */ +} +button[type] { + padding:4px 10px 4px 7px; /* Firefox */ + line-height:17px; /* Safari */ +} +*:first-child+html button[type] { + padding:4px 10px 3px 7px; /* IE7 */ +} +button img, a.button img{ + margin:0 3px -3px 0 !important; + padding:0; + border:none; + width:16px; + height:16px; + float:none; +} + + +/* Button colors +-------------------------------------------------------------- */ + +/* Standard */ +button:hover, a.button:hover{ + background-color:#dff4ff; + border:1px solid #c2e1ef; + color:#336699; +} +a.button:active{ + background-color:#6299c5; + border:1px solid #6299c5; + color:#fff; +} + +/* Positive */ +body .positive { + color:#529214; +} +a.positive:hover, button.positive:hover { + background-color:#E6EFC2; + border:1px solid #C6D880; + color:#529214; +} +a.positive:active { + background-color:#529214; + border:1px solid #529214; + color:#fff; +} + +/* Negative */ +body .negative { + color:#d12f19; +} +a.negative:hover, button.negative:hover { + background-color:#fbe3e4; + border:1px solid #fbc2c4; + color:#d12f19; +} +a.negative:active { + background-color:#d12f19; + border:1px solid #d12f19; + color:#fff; +} diff -r 40eddcc3d063 -r 3a30d255c235 web/ldt/media/css/blueprint/plugins/fancy-type/readme.txt --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/web/ldt/media/css/blueprint/plugins/fancy-type/readme.txt Sun Nov 14 20:25:22 2010 +0100 @@ -0,0 +1,14 @@ +Fancy Type + +* Gives you classes to use if you'd like some + extra fancy typography. + +Credits and instructions are specified above each class +in the fancy-type.css file in this directory. + + +Usage +---------------------------------------------------------------- + +1) Add this plugin to lib/settings.yml. + See compress.rb for instructions. diff -r 40eddcc3d063 -r 3a30d255c235 web/ldt/media/css/blueprint/plugins/fancy-type/screen.css --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/web/ldt/media/css/blueprint/plugins/fancy-type/screen.css Sun Nov 14 20:25:22 2010 +0100 @@ -0,0 +1,71 @@ +/* -------------------------------------------------------------- + + fancy-type.css + * Lots of pretty advanced classes for manipulating text. + + See the Readme file in this folder for additional instructions. + +-------------------------------------------------------------- */ + +/* Indentation instead of line shifts for sibling paragraphs. */ + p + p { text-indent:2em; margin-top:-1.5em; } + form p + p { text-indent: 0; } /* Don't want this in forms. */ + + +/* For great looking type, use this code instead of asdf: + asdf + Best used on prepositions and ampersands. */ + +.alt { + color: #666; + font-family: "Warnock Pro", "Goudy Old Style","Palatino","Book Antiqua", Georgia, serif; + font-style: italic; + font-weight: normal; +} + + +/* For great looking quote marks in titles, replace "asdf" with: + asdf” + (That is, when the title starts with a quote mark). + (You may have to change this value depending on your font size). */ + +.dquo { margin-left: -.5em; } + + +/* Reduced size type with incremental leading + (http://www.markboulton.co.uk/journal/comments/incremental_leading/) + + This could be used for side notes. For smaller type, you don't necessarily want to + follow the 1.5x vertical rhythm -- the line-height is too much. + + Using this class, it reduces your font size and line-height so that for + every four lines of normal sized type, there is five lines of the sidenote. eg: + + New type size in em's: + 10px (wanted side note size) / 12px (existing base size) = 0.8333 (new type size in ems) + + New line-height value: + 12px x 1.5 = 18px (old line-height) + 18px x 4 = 72px + 72px / 5 = 14.4px (new line height) + 14.4px / 10px = 1.44 (new line height in em's) */ + +p.incr, .incr p { + font-size: 10px; + line-height: 1.44em; + margin-bottom: 1.5em; +} + + +/* Surround uppercase words and abbreviations with this class. + Based on work by Jørgen Arnor Gårdsø Lom [http://twistedintellect.com/] */ + +.caps { + font-variant: small-caps; + letter-spacing: 1px; + text-transform: lowercase; + font-size:1.2em; + line-height:1%; + font-weight:bold; + padding:0 2px; +} diff -r 40eddcc3d063 -r 3a30d255c235 web/ldt/media/css/blueprint/plugins/link-icons/icons/doc.png Binary file web/ldt/media/css/blueprint/plugins/link-icons/icons/doc.png has changed diff -r 40eddcc3d063 -r 3a30d255c235 web/ldt/media/css/blueprint/plugins/link-icons/icons/email.png Binary file web/ldt/media/css/blueprint/plugins/link-icons/icons/email.png has changed diff -r 40eddcc3d063 -r 3a30d255c235 web/ldt/media/css/blueprint/plugins/link-icons/icons/external.png Binary file web/ldt/media/css/blueprint/plugins/link-icons/icons/external.png has changed diff -r 40eddcc3d063 -r 3a30d255c235 web/ldt/media/css/blueprint/plugins/link-icons/icons/feed.png Binary file web/ldt/media/css/blueprint/plugins/link-icons/icons/feed.png has changed diff -r 40eddcc3d063 -r 3a30d255c235 web/ldt/media/css/blueprint/plugins/link-icons/icons/im.png Binary file web/ldt/media/css/blueprint/plugins/link-icons/icons/im.png has changed diff -r 40eddcc3d063 -r 3a30d255c235 web/ldt/media/css/blueprint/plugins/link-icons/icons/pdf.png Binary file web/ldt/media/css/blueprint/plugins/link-icons/icons/pdf.png has changed diff -r 40eddcc3d063 -r 3a30d255c235 web/ldt/media/css/blueprint/plugins/link-icons/icons/visited.png Binary file web/ldt/media/css/blueprint/plugins/link-icons/icons/visited.png has changed diff -r 40eddcc3d063 -r 3a30d255c235 web/ldt/media/css/blueprint/plugins/link-icons/icons/xls.png Binary file web/ldt/media/css/blueprint/plugins/link-icons/icons/xls.png has changed diff -r 40eddcc3d063 -r 3a30d255c235 web/ldt/media/css/blueprint/plugins/link-icons/readme.txt --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/web/ldt/media/css/blueprint/plugins/link-icons/readme.txt Sun Nov 14 20:25:22 2010 +0100 @@ -0,0 +1,18 @@ +Link Icons +* Icons for links based on protocol or file type. + +This is not supported in IE versions < 7. + + +Credits +---------------------------------------------------------------- + +* Marc Morgan +* Olav Bjorkoy [bjorkoy.com] + + +Usage +---------------------------------------------------------------- + +1) Add this line to your HTML: + diff -r 40eddcc3d063 -r 3a30d255c235 web/ldt/media/css/blueprint/plugins/link-icons/screen.css --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/web/ldt/media/css/blueprint/plugins/link-icons/screen.css Sun Nov 14 20:25:22 2010 +0100 @@ -0,0 +1,40 @@ +/* -------------------------------------------------------------- + + link-icons.css + * Icons for links based on protocol or file type. + + See the Readme file in this folder for additional instructions. + +-------------------------------------------------------------- */ + +/* Use this class if a link gets an icon when it shouldn't. */ +body a.noicon { + background:transparent none !important; + padding:0 !important; + margin:0 !important; +} + +/* Make sure the icons are not cut */ +a[href^="http:"], a[href^="mailto:"], a[href^="http:"]:visited, +a[href$=".pdf"], a[href$=".doc"], a[href$=".xls"], a[href$=".rss"], +a[href$=".rdf"], a[href^="aim:"] { + padding:2px 22px 2px 0; + margin:-2px 0; + background-repeat: no-repeat; + background-position: right center; +} + +/* External links */ +a[href^="http:"] { background-image: url(icons/external.png); } +a[href^="mailto:"] { background-image: url(icons/email.png); } +a[href^="http:"]:visited { background-image: url(icons/visited.png); } + +/* Files */ +a[href$=".pdf"] { background-image: url(icons/pdf.png); } +a[href$=".doc"] { background-image: url(icons/doc.png); } +a[href$=".xls"] { background-image: url(icons/xls.png); } + +/* Misc */ +a[href$=".rss"], +a[href$=".rdf"] { background-image: url(icons/feed.png); } +a[href^="aim:"] { background-image: url(icons/im.png); } diff -r 40eddcc3d063 -r 3a30d255c235 web/ldt/media/css/blueprint/plugins/rtl/readme.txt --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/web/ldt/media/css/blueprint/plugins/rtl/readme.txt Sun Nov 14 20:25:22 2010 +0100 @@ -0,0 +1,10 @@ +RTL +* Mirrors Blueprint, so it can be used with Right-to-Left languages. + +By Ran Yaniv Hartstein, ranh.co.il + +Usage +---------------------------------------------------------------- + +1) Add this line to your HTML: + diff -r 40eddcc3d063 -r 3a30d255c235 web/ldt/media/css/blueprint/plugins/rtl/screen.css --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/web/ldt/media/css/blueprint/plugins/rtl/screen.css Sun Nov 14 20:25:22 2010 +0100 @@ -0,0 +1,110 @@ +/* -------------------------------------------------------------- + + rtl.css + * Mirrors Blueprint for left-to-right languages + + By Ran Yaniv Hartstein [ranh.co.il] + +-------------------------------------------------------------- */ + +body .container { direction: rtl; } +body .column, body .span-1, body .span-2, body .span-3, body .span-4, body .span-5, body .span-6, body .span-7, body .span-8, body .span-9, body .span-10, body .span-11, body .span-12, body .span-13, body .span-14, body .span-15, body .span-16, body .span-17, body .span-18, body .span-19, body .span-20, body .span-21, body .span-22, body .span-23, body .span-24 { + float: right; + margin-right: 0; + margin-left: 10px; + text-align:right; +} + +body div.last { margin-left: 0; } +body table .last { padding-left: 0; } + +body .append-1 { padding-right: 0; padding-left: 40px; } +body .append-2 { padding-right: 0; padding-left: 80px; } +body .append-3 { padding-right: 0; padding-left: 120px; } +body .append-4 { padding-right: 0; padding-left: 160px; } +body .append-5 { padding-right: 0; padding-left: 200px; } +body .append-6 { padding-right: 0; padding-left: 240px; } +body .append-7 { padding-right: 0; padding-left: 280px; } +body .append-8 { padding-right: 0; padding-left: 320px; } +body .append-9 { padding-right: 0; padding-left: 360px; } +body .append-10 { padding-right: 0; padding-left: 400px; } +body .append-11 { padding-right: 0; padding-left: 440px; } +body .append-12 { padding-right: 0; padding-left: 480px; } +body .append-13 { padding-right: 0; padding-left: 520px; } +body .append-14 { padding-right: 0; padding-left: 560px; } +body .append-15 { padding-right: 0; padding-left: 600px; } +body .append-16 { padding-right: 0; padding-left: 640px; } +body .append-17 { padding-right: 0; padding-left: 680px; } +body .append-18 { padding-right: 0; padding-left: 720px; } +body .append-19 { padding-right: 0; padding-left: 760px; } +body .append-20 { padding-right: 0; padding-left: 800px; } +body .append-21 { padding-right: 0; padding-left: 840px; } +body .append-22 { padding-right: 0; padding-left: 880px; } +body .append-23 { padding-right: 0; padding-left: 920px; } + +body .prepend-1 { padding-left: 0; padding-right: 40px; } +body .prepend-2 { padding-left: 0; padding-right: 80px; } +body .prepend-3 { padding-left: 0; padding-right: 120px; } +body .prepend-4 { padding-left: 0; padding-right: 160px; } +body .prepend-5 { padding-left: 0; padding-right: 200px; } +body .prepend-6 { padding-left: 0; padding-right: 240px; } +body .prepend-7 { padding-left: 0; padding-right: 280px; } +body .prepend-8 { padding-left: 0; padding-right: 320px; } +body .prepend-9 { padding-left: 0; padding-right: 360px; } +body .prepend-10 { padding-left: 0; padding-right: 400px; } +body .prepend-11 { padding-left: 0; padding-right: 440px; } +body .prepend-12 { padding-left: 0; padding-right: 480px; } +body .prepend-13 { padding-left: 0; padding-right: 520px; } +body .prepend-14 { padding-left: 0; padding-right: 560px; } +body .prepend-15 { padding-left: 0; padding-right: 600px; } +body .prepend-16 { padding-left: 0; padding-right: 640px; } +body .prepend-17 { padding-left: 0; padding-right: 680px; } +body .prepend-18 { padding-left: 0; padding-right: 720px; } +body .prepend-19 { padding-left: 0; padding-right: 760px; } +body .prepend-20 { padding-left: 0; padding-right: 800px; } +body .prepend-21 { padding-left: 0; padding-right: 840px; } +body .prepend-22 { padding-left: 0; padding-right: 880px; } +body .prepend-23 { padding-left: 0; padding-right: 920px; } + +body .border { + padding-right: 0; + padding-left: 4px; + margin-right: 0; + margin-left: 5px; + border-right: none; + border-left: 1px solid #eee; +} + +body .colborder { + padding-right: 0; + padding-left: 24px; + margin-right: 0; + margin-left: 25px; + border-right: none; + border-left: 1px solid #eee; +} + +body .pull-1 { margin-left: 0; margin-right: -40px; } +body .pull-2 { margin-left: 0; margin-right: -80px; } +body .pull-3 { margin-left: 0; margin-right: -120px; } +body .pull-4 { margin-left: 0; margin-right: -160px; } + +body .push-0 { margin: 0 18px 0 0; } +body .push-1 { margin: 0 18px 0 -40px; } +body .push-2 { margin: 0 18px 0 -80px; } +body .push-3 { margin: 0 18px 0 -120px; } +body .push-4 { margin: 0 18px 0 -160px; } +body .push-0, body .push-1, body .push-2, +body .push-3, body .push-4 { float: left; } + + +/* Typography with RTL support */ +body h1,body h2,body h3, +body h4,body h5,body h6 { font-family: Arial, sans-serif; } +html body { font-family: Arial, sans-serif; } +body pre,body code,body tt { font-family: monospace; } + +/* Mirror floats and margins on typographic elements */ +body p img { float: right; margin: 1.5em 0 1.5em 1.5em; } +body dd, body ul, body ol { margin-left: 0; margin-right: 1.5em;} +body td, body th { text-align:right; } diff -r 40eddcc3d063 -r 3a30d255c235 web/ldt/media/css/blueprint/print.css --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/web/ldt/media/css/blueprint/print.css Sun Nov 14 20:25:22 2010 +0100 @@ -0,0 +1,29 @@ +/* ----------------------------------------------------------------------- + + + Blueprint CSS Framework 0.9 + http://blueprintcss.org + + * Copyright (c) 2007-Present. See LICENSE for more info. + * See README for instructions on how to use Blueprint. + * For credits and origins, see AUTHORS. + * This is a compressed file. See the sources in the 'src' directory. + +----------------------------------------------------------------------- */ + +/* print.css */ +body {line-height:1.5;font-family:"Helvetica Neue", Arial, Helvetica, sans-serif;color:#000;background:none;font-size:10pt;} +.container {background:none;} +hr {background:#ccc;color:#ccc;width:100%;height:2px;margin:2em 0;padding:0;border:none;} +hr.space {background:#fff;color:#fff;visibility:hidden;} +h1, h2, h3, h4, h5, h6 {font-family:"Helvetica Neue", Arial, "Lucida Grande", sans-serif;} +code {font:.9em "Courier New", Monaco, Courier, monospace;} +a img {border:none;} +p img.top {margin-top:0;} +blockquote {margin:1.5em;padding:1em;font-style:italic;font-size:.9em;} +.small {font-size:.9em;} +.large {font-size:1.1em;} +.quiet {color:#999;} +.hide {display:none;} +a:link, a:visited {background:transparent;font-weight:700;text-decoration:underline;} +a:link:after, a:visited:after {content:" (" attr(href) ")";font-size:90%;} \ No newline at end of file diff -r 40eddcc3d063 -r 3a30d255c235 web/ldt/media/css/blueprint/screen.css --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/web/ldt/media/css/blueprint/screen.css Sun Nov 14 20:25:22 2010 +0100 @@ -0,0 +1,258 @@ +/* ----------------------------------------------------------------------- + + + Blueprint CSS Framework 0.9 + http://blueprintcss.org + + * Copyright (c) 2007-Present. See LICENSE for more info. + * See README for instructions on how to use Blueprint. + * For credits and origins, see AUTHORS. + * This is a compressed file. See the sources in the 'src' directory. + +----------------------------------------------------------------------- */ + +/* reset.css */ +html, body, div, span, object, iframe, h1, h2, h3, h4, h5, h6, p, blockquote, pre, a, abbr, acronym, address, code, del, dfn, em, img, q, dl, dt, dd, ol, ul, li, fieldset, form, label, legend, table, caption, tbody, tfoot, thead, tr, th, td, article, aside, dialog, figure, footer, header, hgroup, nav, section {margin:0;padding:0;border:0;font-weight:inherit;font-style:inherit;font-size:100%;font-family:inherit;vertical-align:baseline;} +article, aside, dialog, figure, footer, header, hgroup, nav, section {display:block;} +body {line-height:1.5;} +table {border-collapse:separate;border-spacing:0;} +caption, th, td {text-align:left;font-weight:normal;} +table, td, th {vertical-align:middle;} +blockquote:before, blockquote:after, q:before, q:after {content:"";} +blockquote, q {quotes:"" "";} +a img {border:none;} + +/* typography.css */ +html {font-size:100.01%;} +body {font-size:75%;color:#222;background:#fff;font-family:"Helvetica Neue", Arial, Helvetica, sans-serif;} +h1, h2, h3, h4, h5, h6 {font-weight:normal;color:#111;} +h1 {font-size:3em;line-height:1;margin-bottom:0.5em;} +h2 {font-size:2em;margin-bottom:0.75em;} +h3 {font-size:1.5em;line-height:1;margin-bottom:1em;} +h4 {font-size:1.2em;line-height:1.25;margin-bottom:1.25em;} +h5 {font-size:1em;font-weight:bold;margin-bottom:1.5em;} +h6 {font-size:1em;font-weight:bold;} +h1 img, h2 img, h3 img, h4 img, h5 img, h6 img {margin:0;} +p {margin:0 0 1.5em;} +p img.left {float:left;margin:1.5em 1.5em 1.5em 0;padding:0;} +p img.right {float:right;margin:1.5em 0 1.5em 1.5em;} +a:focus, a:hover {color:#000;} +a {color:#009;text-decoration:underline;} +blockquote {margin:1.5em;color:#666;font-style:italic;} +strong {font-weight:bold;} +em, dfn {font-style:italic;} +dfn {font-weight:bold;} +sup, sub {line-height:0;} +abbr, acronym {border-bottom:1px dotted #666;} +address {margin:0 0 1.5em;font-style:italic;} +del {color:#666;} +pre {margin:1.5em 0;white-space:pre;} +pre, code, tt {font:1em 'andale mono', 'lucida console', monospace;line-height:1.5;} +li ul, li ol {margin:0;} +ul, ol {margin:0 1.5em 1.5em 0;padding-left:3.333em;} +ul {list-style-type:disc;} +ol {list-style-type:decimal;} +dl {margin:0 0 1.5em 0;} +dl dt {font-weight:bold;} +dd {margin-left:1.5em;} +table {margin-bottom:1.4em;width:100%;} +th {font-weight:bold;} +thead th {background:#c3d9ff;} +th, td, caption {padding:4px 10px 4px 5px;} +tr.even td {background:#e5ecf9;} +tfoot {font-style:italic;} +caption {background:#eee;} +.small {font-size:.8em;margin-bottom:1.875em;line-height:1.875em;} +.large {font-size:1.2em;line-height:2.5em;margin-bottom:1.25em;} +.hide {display:none;} +.quiet {color:#666;} +.loud {color:#000;} +.highlight {background:#ff0;} +.added {background:#060;color:#fff;} +.removed {background:#900;color:#fff;} +.first {margin-left:0;padding-left:0;} +.last {margin-right:0;padding-right:0;} +.top {margin-top:0;padding-top:0;} +.bottom {margin-bottom:0;padding-bottom:0;} + +/* forms.css */ +label {font-weight:bold;} +fieldset {padding:1.4em;margin:0 0 1.5em 0;border:1px solid #ccc;} +legend {font-weight:bold;font-size:1.2em;} +input[type=text], input[type=password], input.text, input.title, textarea, select {background-color:#fff;border:1px solid #bbb;} +input[type=text]:focus, input[type=password]:focus, input.text:focus, input.title:focus, textarea:focus, select:focus {border-color:#666;} +input[type=text], input[type=password], input.text, input.title, textarea, select {margin:0.5em 0;} +input.text, input.title {width:300px;padding:5px;} +input.title {font-size:1.5em;} +textarea {width:390px;height:250px;padding:5px;} +input[type=checkbox], input[type=radio], input.checkbox, input.radio {position:relative;top:.25em;} +form.inline {line-height:3;} +form.inline p {margin-bottom:0;} +.error, .notice, .success {padding:.8em;margin-bottom:1em;border:2px solid #ddd;} +.error {background:#FBE3E4;color:#8a1f11;border-color:#FBC2C4;} +.notice {background:#FFF6BF;color:#514721;border-color:#FFD324;} +.success {background:#E6EFC2;color:#264409;border-color:#C6D880;} +.error a {color:#8a1f11;} +.notice a {color:#514721;} +.success a {color:#264409;} + +/* grid.css */ +.container {width:950px;margin:0 auto;} +.showgrid {background:url(src/grid.png);} +.column, .span-1, .span-2, .span-3, .span-4, .span-5, .span-6, .span-7, .span-8, .span-9, .span-10, .span-11, .span-12, .span-13, .span-14, .span-15, .span-16, .span-17, .span-18, .span-19, .span-20, .span-21, .span-22, .span-23, .span-24 {float:left;margin-right:10px;} +.last {margin-right:0;} +.span-1 {width:30px;} +.span-2 {width:70px;} +.span-3 {width:110px;} +.span-4 {width:150px;} +.span-5 {width:190px;} +.span-6 {width:230px;} +.span-7 {width:270px;} +.span-8 {width:310px;} +.span-9 {width:350px;} +.span-10 {width:390px;} +.span-11 {width:430px;} +.span-12 {width:470px;} +.span-13 {width:510px;} +.span-14 {width:550px;} +.span-15 {width:590px;} +.span-16 {width:630px;} +.span-17 {width:670px;} +.span-18 {width:710px;} +.span-19 {width:750px;} +.span-20 {width:790px;} +.span-21 {width:830px;} +.span-22 {width:870px;} +.span-23 {width:910px;} +.span-24 {width:950px;margin-right:0;} +input.span-1, textarea.span-1, input.span-2, textarea.span-2, input.span-3, textarea.span-3, input.span-4, textarea.span-4, input.span-5, textarea.span-5, input.span-6, textarea.span-6, input.span-7, textarea.span-7, input.span-8, textarea.span-8, input.span-9, textarea.span-9, input.span-10, textarea.span-10, input.span-11, textarea.span-11, input.span-12, textarea.span-12, input.span-13, textarea.span-13, input.span-14, textarea.span-14, input.span-15, textarea.span-15, input.span-16, textarea.span-16, input.span-17, textarea.span-17, input.span-18, textarea.span-18, input.span-19, textarea.span-19, input.span-20, textarea.span-20, input.span-21, textarea.span-21, input.span-22, textarea.span-22, input.span-23, textarea.span-23, input.span-24, textarea.span-24 {border-left-width:1px!important;border-right-width:1px!important;padding-left:5px!important;padding-right:5px!important;} +input.span-1, textarea.span-1 {width:18px!important;} +input.span-2, textarea.span-2 {width:58px!important;} +input.span-3, textarea.span-3 {width:98px!important;} +input.span-4, textarea.span-4 {width:138px!important;} +input.span-5, textarea.span-5 {width:178px!important;} +input.span-6, textarea.span-6 {width:218px!important;} +input.span-7, textarea.span-7 {width:258px!important;} +input.span-8, textarea.span-8 {width:298px!important;} +input.span-9, textarea.span-9 {width:338px!important;} +input.span-10, textarea.span-10 {width:378px!important;} +input.span-11, textarea.span-11 {width:418px!important;} +input.span-12, textarea.span-12 {width:458px!important;} +input.span-13, textarea.span-13 {width:498px!important;} +input.span-14, textarea.span-14 {width:538px!important;} +input.span-15, textarea.span-15 {width:578px!important;} +input.span-16, textarea.span-16 {width:618px!important;} +input.span-17, textarea.span-17 {width:658px!important;} +input.span-18, textarea.span-18 {width:698px!important;} +input.span-19, textarea.span-19 {width:738px!important;} +input.span-20, textarea.span-20 {width:778px!important;} +input.span-21, textarea.span-21 {width:818px!important;} +input.span-22, textarea.span-22 {width:858px!important;} +input.span-23, textarea.span-23 {width:898px!important;} +input.span-24, textarea.span-24 {width:938px!important;} +.append-1 {padding-right:40px;} +.append-2 {padding-right:80px;} +.append-3 {padding-right:120px;} +.append-4 {padding-right:160px;} +.append-5 {padding-right:200px;} +.append-6 {padding-right:240px;} +.append-7 {padding-right:280px;} +.append-8 {padding-right:320px;} +.append-9 {padding-right:360px;} +.append-10 {padding-right:400px;} +.append-11 {padding-right:440px;} +.append-12 {padding-right:480px;} +.append-13 {padding-right:520px;} +.append-14 {padding-right:560px;} +.append-15 {padding-right:600px;} +.append-16 {padding-right:640px;} +.append-17 {padding-right:680px;} +.append-18 {padding-right:720px;} +.append-19 {padding-right:760px;} +.append-20 {padding-right:800px;} +.append-21 {padding-right:840px;} +.append-22 {padding-right:880px;} +.append-23 {padding-right:920px;} +.prepend-1 {padding-left:40px;} +.prepend-2 {padding-left:80px;} +.prepend-3 {padding-left:120px;} +.prepend-4 {padding-left:160px;} +.prepend-5 {padding-left:200px;} +.prepend-6 {padding-left:240px;} +.prepend-7 {padding-left:280px;} +.prepend-8 {padding-left:320px;} +.prepend-9 {padding-left:360px;} +.prepend-10 {padding-left:400px;} +.prepend-11 {padding-left:440px;} +.prepend-12 {padding-left:480px;} +.prepend-13 {padding-left:520px;} +.prepend-14 {padding-left:560px;} +.prepend-15 {padding-left:600px;} +.prepend-16 {padding-left:640px;} +.prepend-17 {padding-left:680px;} +.prepend-18 {padding-left:720px;} +.prepend-19 {padding-left:760px;} +.prepend-20 {padding-left:800px;} +.prepend-21 {padding-left:840px;} +.prepend-22 {padding-left:880px;} +.prepend-23 {padding-left:920px;} +.border {padding-right:4px;margin-right:5px;border-right:1px solid #eee;} +.colborder {padding-right:24px;margin-right:25px;border-right:1px solid #eee;} +.pull-1 {margin-left:-40px;} +.pull-2 {margin-left:-80px;} +.pull-3 {margin-left:-120px;} +.pull-4 {margin-left:-160px;} +.pull-5 {margin-left:-200px;} +.pull-6 {margin-left:-240px;} +.pull-7 {margin-left:-280px;} +.pull-8 {margin-left:-320px;} +.pull-9 {margin-left:-360px;} +.pull-10 {margin-left:-400px;} +.pull-11 {margin-left:-440px;} +.pull-12 {margin-left:-480px;} +.pull-13 {margin-left:-520px;} +.pull-14 {margin-left:-560px;} +.pull-15 {margin-left:-600px;} +.pull-16 {margin-left:-640px;} +.pull-17 {margin-left:-680px;} +.pull-18 {margin-left:-720px;} +.pull-19 {margin-left:-760px;} +.pull-20 {margin-left:-800px;} +.pull-21 {margin-left:-840px;} +.pull-22 {margin-left:-880px;} +.pull-23 {margin-left:-920px;} +.pull-24 {margin-left:-960px;} +.pull-1, .pull-2, .pull-3, .pull-4, .pull-5, .pull-6, .pull-7, .pull-8, .pull-9, .pull-10, .pull-11, .pull-12, .pull-13, .pull-14, .pull-15, .pull-16, .pull-17, .pull-18, .pull-19, .pull-20, .pull-21, .pull-22, .pull-23, .pull-24 {float:left;position:relative;} +.push-1 {margin:0 -40px 1.5em 40px;} +.push-2 {margin:0 -80px 1.5em 80px;} +.push-3 {margin:0 -120px 1.5em 120px;} +.push-4 {margin:0 -160px 1.5em 160px;} +.push-5 {margin:0 -200px 1.5em 200px;} +.push-6 {margin:0 -240px 1.5em 240px;} +.push-7 {margin:0 -280px 1.5em 280px;} +.push-8 {margin:0 -320px 1.5em 320px;} +.push-9 {margin:0 -360px 1.5em 360px;} +.push-10 {margin:0 -400px 1.5em 400px;} +.push-11 {margin:0 -440px 1.5em 440px;} +.push-12 {margin:0 -480px 1.5em 480px;} +.push-13 {margin:0 -520px 1.5em 520px;} +.push-14 {margin:0 -560px 1.5em 560px;} +.push-15 {margin:0 -600px 1.5em 600px;} +.push-16 {margin:0 -640px 1.5em 640px;} +.push-17 {margin:0 -680px 1.5em 680px;} +.push-18 {margin:0 -720px 1.5em 720px;} +.push-19 {margin:0 -760px 1.5em 760px;} +.push-20 {margin:0 -800px 1.5em 800px;} +.push-21 {margin:0 -840px 1.5em 840px;} +.push-22 {margin:0 -880px 1.5em 880px;} +.push-23 {margin:0 -920px 1.5em 920px;} +.push-24 {margin:0 -960px 1.5em 960px;} +.push-1, .push-2, .push-3, .push-4, .push-5, .push-6, .push-7, .push-8, .push-9, .push-10, .push-11, .push-12, .push-13, .push-14, .push-15, .push-16, .push-17, .push-18, .push-19, .push-20, .push-21, .push-22, .push-23, .push-24 {float:right;position:relative;} +.prepend-top {margin-top:1.5em;} +.append-bottom {margin-bottom:1.5em;} +.box {padding:1.5em;margin-bottom:1.5em;background:#E5ECF9;} +hr {background:#ddd;color:#ddd;clear:both;float:none;width:100%;height:.1em;margin:0 0 1.45em;border:none;} +hr.space {background:#fff;color:#fff;visibility:hidden;} +.clearfix:after, .container:after {content:"\0020";display:block;height:0;clear:both;visibility:hidden;overflow:hidden;} +.clearfix, .container {display:block;} +.clear {clear:both;} \ No newline at end of file diff -r 40eddcc3d063 -r 3a30d255c235 web/ldt/media/css/border-radius.htc --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/web/ldt/media/css/border-radius.htc Sun Nov 14 20:25:22 2010 +0100 @@ -0,0 +1,143 @@ +--Do not remove this if you are using-- +Original Author: Remiz Rahnas +Original Author URL: http://www.htmlremix.com +Published date: 2008/09/24 + +Changes by Nick Fetchak: +- IE8 standards mode compatibility +- VML elements now positioned behind original box rather than inside of it - should be less prone to breakage +Published date : 2009/11/18 + + + + + diff -r 40eddcc3d063 -r 3a30d255c235 web/ldt/media/css/custom_player.css --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/web/ldt/media/css/custom_player.css Sun Nov 14 20:25:22 2010 +0100 @@ -0,0 +1,59 @@ +@charset "UTF-8"; + +#demo-frame > div.demo { padding: 5px !important; }; +.iri-chapter{ + padding-top:10px; + padding-bottom:5px; + border-left:solid 1px #aaaaaa; + border-right:solid 1px #aaaaaa;' +} + +.tooltip { + display:none; + background:transparent url(css/jq-css/tooltip/white_arrow.png); + font-size:12px; + height:100px; + width:180px; + padding:10px; + padding-left:15px; + padding-right:15px; + color:#000; +} + +#Annotations{ + padding-left:5px; + width:470px; + float:left; +} +#ldtSaTitle{ + padding-top:2px; + padding-bottom:5px; + font-size:18px; + color:#FFF; + height:22p; +} +#ldtSaDescription{ + font-size:12px; + color:#FFF; +} +#ShowAnnotation{ + position:absolute; + z-index: 999; + padding:5px; + background:url(css/custom/images/transBlack.png); +} + +#ldtPlaceHolder{ + position:absolue; + float:none; +} +.ldtControl1{ + width:70px; + float:left; +} +.ldtControl2{ + padding-left:10px; + width:70px; + float:left; +} + diff -r 40eddcc3d063 -r 3a30d255c235 web/ldt/media/css/dashboard.css --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/web/ldt/media/css/dashboard.css Sun Nov 14 20:25:22 2010 +0100 @@ -0,0 +1,5 @@ + +#content-main-app-ldt-utils { + float: left; + width: 100%; +} \ No newline at end of file diff -r 40eddcc3d063 -r 3a30d255c235 web/ldt/media/css/embed_popup.css --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/web/ldt/media/css/embed_popup.css Sun Nov 14 20:25:22 2010 +0100 @@ -0,0 +1,33 @@ +pre { +white-space: pre-wrap; /* css-3 */ +white-space: -moz-pre-wrap !important; /* Mozilla, since 1999 */ +white-space: -pre-wrap; /* Opera 4-6 */ +white-space: -o-pre-wrap; /* Opera 7 */ +word-wrap: break-word; /* Internet Explorer 5.5+ */ +} + +input +{ + background: #ededed; +} + +input[type="button"] { + background-color: #656565; + color: white; + width: auto; + font-weight: bold; + padding: 5px 10px; +} + +#button_row input { + margin: 10px; +} + +#display_select { + float: left; +} + +#copy_div { + float: right; +} + diff -r 40eddcc3d063 -r 3a30d255c235 web/ldt/media/css/imgs/black.png Binary file web/ldt/media/css/imgs/black.png has changed diff -r 40eddcc3d063 -r 3a30d255c235 web/ldt/media/css/imgs/black_arrow.png Binary file web/ldt/media/css/imgs/black_arrow.png has changed diff -r 40eddcc3d063 -r 3a30d255c235 web/ldt/media/css/imgs/black_arrow_big.png Binary file web/ldt/media/css/imgs/black_arrow_big.png has changed diff -r 40eddcc3d063 -r 3a30d255c235 web/ldt/media/css/imgs/black_big.png Binary file web/ldt/media/css/imgs/black_big.png has changed diff -r 40eddcc3d063 -r 3a30d255c235 web/ldt/media/css/imgs/delicious.png Binary file web/ldt/media/css/imgs/delicious.png has changed diff -r 40eddcc3d063 -r 3a30d255c235 web/ldt/media/css/imgs/facebook.png Binary file web/ldt/media/css/imgs/facebook.png has changed diff -r 40eddcc3d063 -r 3a30d255c235 web/ldt/media/css/imgs/grey_arrow_Show.png Binary file web/ldt/media/css/imgs/grey_arrow_Show.png has changed diff -r 40eddcc3d063 -r 3a30d255c235 web/ldt/media/css/imgs/linkedin.png Binary file web/ldt/media/css/imgs/linkedin.png has changed diff -r 40eddcc3d063 -r 3a30d255c235 web/ldt/media/css/imgs/loader.gif Binary file web/ldt/media/css/imgs/loader.gif has changed diff -r 40eddcc3d063 -r 3a30d255c235 web/ldt/media/css/imgs/loader_fc.gif Binary file web/ldt/media/css/imgs/loader_fc.gif has changed diff -r 40eddcc3d063 -r 3a30d255c235 web/ldt/media/css/imgs/transBlack.png Binary file web/ldt/media/css/imgs/transBlack.png has changed diff -r 40eddcc3d063 -r 3a30d255c235 web/ldt/media/css/imgs/twitter.png Binary file web/ldt/media/css/imgs/twitter.png has changed diff -r 40eddcc3d063 -r 3a30d255c235 web/ldt/media/css/imgs/white.png Binary file web/ldt/media/css/imgs/white.png has changed diff -r 40eddcc3d063 -r 3a30d255c235 web/ldt/media/css/imgs/white_arrow.png Binary file web/ldt/media/css/imgs/white_arrow.png has changed diff -r 40eddcc3d063 -r 3a30d255c235 web/ldt/media/css/imgs/white_arrow_big.png Binary file web/ldt/media/css/imgs/white_arrow_big.png has changed diff -r 40eddcc3d063 -r 3a30d255c235 web/ldt/media/css/imgs/white_arrow_mini.png Binary file web/ldt/media/css/imgs/white_arrow_mini.png has changed diff -r 40eddcc3d063 -r 3a30d255c235 web/ldt/media/css/imgs/white_big.png Binary file web/ldt/media/css/imgs/white_big.png has changed diff -r 40eddcc3d063 -r 3a30d255c235 web/ldt/media/css/imgs/widget20.png Binary file web/ldt/media/css/imgs/widget20.png has changed diff -r 40eddcc3d063 -r 3a30d255c235 web/ldt/media/css/jq-css/themes/base/images/ui-bg_flat_0_aaaaaa_40x100.png Binary file web/ldt/media/css/jq-css/themes/base/images/ui-bg_flat_0_aaaaaa_40x100.png has changed diff -r 40eddcc3d063 -r 3a30d255c235 web/ldt/media/css/jq-css/themes/base/images/ui-bg_flat_75_ffffff_40x100.png Binary file web/ldt/media/css/jq-css/themes/base/images/ui-bg_flat_75_ffffff_40x100.png has changed diff -r 40eddcc3d063 -r 3a30d255c235 web/ldt/media/css/jq-css/themes/base/images/ui-bg_glass_55_fbf9ee_1x400.png Binary file web/ldt/media/css/jq-css/themes/base/images/ui-bg_glass_55_fbf9ee_1x400.png has changed diff -r 40eddcc3d063 -r 3a30d255c235 web/ldt/media/css/jq-css/themes/base/images/ui-bg_glass_65_ffffff_1x400.png Binary file web/ldt/media/css/jq-css/themes/base/images/ui-bg_glass_65_ffffff_1x400.png has changed diff -r 40eddcc3d063 -r 3a30d255c235 web/ldt/media/css/jq-css/themes/base/images/ui-bg_glass_75_dadada_1x400.png Binary file web/ldt/media/css/jq-css/themes/base/images/ui-bg_glass_75_dadada_1x400.png has changed diff -r 40eddcc3d063 -r 3a30d255c235 web/ldt/media/css/jq-css/themes/base/images/ui-bg_glass_75_e6e6e6_1x400.png Binary file web/ldt/media/css/jq-css/themes/base/images/ui-bg_glass_75_e6e6e6_1x400.png has changed diff -r 40eddcc3d063 -r 3a30d255c235 web/ldt/media/css/jq-css/themes/base/images/ui-bg_glass_95_fef1ec_1x400.png Binary file web/ldt/media/css/jq-css/themes/base/images/ui-bg_glass_95_fef1ec_1x400.png has changed diff -r 40eddcc3d063 -r 3a30d255c235 web/ldt/media/css/jq-css/themes/base/images/ui-bg_highlight-soft_75_cccccc_1x100.png Binary file web/ldt/media/css/jq-css/themes/base/images/ui-bg_highlight-soft_75_cccccc_1x100.png has changed diff -r 40eddcc3d063 -r 3a30d255c235 web/ldt/media/css/jq-css/themes/base/images/ui-icons_222222_256x240.png Binary file web/ldt/media/css/jq-css/themes/base/images/ui-icons_222222_256x240.png has changed diff -r 40eddcc3d063 -r 3a30d255c235 web/ldt/media/css/jq-css/themes/base/images/ui-icons_2e83ff_256x240.png Binary file web/ldt/media/css/jq-css/themes/base/images/ui-icons_2e83ff_256x240.png has changed diff -r 40eddcc3d063 -r 3a30d255c235 web/ldt/media/css/jq-css/themes/base/images/ui-icons_454545_256x240.png Binary file web/ldt/media/css/jq-css/themes/base/images/ui-icons_454545_256x240.png has changed diff -r 40eddcc3d063 -r 3a30d255c235 web/ldt/media/css/jq-css/themes/base/images/ui-icons_888888_256x240.png Binary file web/ldt/media/css/jq-css/themes/base/images/ui-icons_888888_256x240.png has changed diff -r 40eddcc3d063 -r 3a30d255c235 web/ldt/media/css/jq-css/themes/base/images/ui-icons_cd0a0a_256x240.png Binary file web/ldt/media/css/jq-css/themes/base/images/ui-icons_cd0a0a_256x240.png has changed diff -r 40eddcc3d063 -r 3a30d255c235 web/ldt/media/css/jq-css/themes/base/jquery-ui.css --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/web/ldt/media/css/jq-css/themes/base/jquery-ui.css Sun Nov 14 20:25:22 2010 +0100 @@ -0,0 +1,570 @@ +/* + * jQuery UI CSS Framework @VERSION + * + * Copyright 2010, AUTHORS.txt (http://jqueryui.com/about) + * Dual licensed under the MIT or GPL Version 2 licenses. + * http://jquery.org/license + * + * http://docs.jquery.com/UI/Theming/API + */ + +/* Layout helpers +----------------------------------*/ +.ui-helper-hidden { display: none; } +.ui-helper-hidden-accessible { position: absolute; left: -99999999px; } +.ui-helper-reset { margin: 0; padding: 0; border: 0; outline: 0; line-height: 1.3; text-decoration: none; font-size: 100%; list-style: none; } +.ui-helper-clearfix:after { content: "."; display: block; height: 0; clear: both; visibility: hidden; } +.ui-helper-clearfix { display: inline-block; } +/* required comment for clearfix to work in Opera \*/ +* html .ui-helper-clearfix { height:1%; } +.ui-helper-clearfix { display:block; } +/* end clearfix */ +.ui-helper-zfix { width: 100%; height: 100%; top: 0; left: 0; position: absolute; opacity: 0; filter:Alpha(Opacity=0); } + + +/* Interaction Cues +----------------------------------*/ +.ui-state-disabled { cursor: default !important; } + + +/* Icons +----------------------------------*/ + +/* states and images */ +.ui-icon { display: block; text-indent: -99999px; overflow: hidden; background-repeat: no-repeat; } + + +/* Misc visuals +----------------------------------*/ + +/* Overlays */ +.ui-widget-overlay { position: absolute; top: 0; left: 0; width: 100%; height: 100%; } +/* + * jQuery UI Accordion @VERSION + * + * Copyright 2010, AUTHORS.txt (http://jqueryui.com/about) + * Dual licensed under the MIT or GPL Version 2 licenses. + * http://jquery.org/license + * + * http://docs.jquery.com/UI/Accordion#theming + */ +/* IE/Win - Fix animation bug - #4615 */ +.ui-accordion { width: 100%; } +.ui-accordion .ui-accordion-header { cursor: pointer; position: relative; margin-top: 1px; zoom: 1; } +.ui-accordion .ui-accordion-li-fix { display: inline; } +.ui-accordion .ui-accordion-header-active { border-bottom: 0 !important; } +.ui-accordion .ui-accordion-header a { display: block; font-size: 1em; padding: .5em .5em .5em .7em; } +.ui-accordion-icons .ui-accordion-header a { padding-left: 2.2em; } +.ui-accordion .ui-accordion-header .ui-icon { position: absolute; left: .5em; top: 50%; margin-top: -8px; } +.ui-accordion .ui-accordion-content { padding: 1em 2.2em; border-top: 0; margin-top: -2px; position: relative; top: 1px; margin-bottom: 2px; overflow: auto; display: none; zoom: 1; } +.ui-accordion .ui-accordion-content-active { display: block; }/* + * jQuery UI Autocomplete @VERSION + * + * Copyright 2010, AUTHORS.txt (http://jqueryui.com/about) + * Dual licensed under the MIT or GPL Version 2 licenses. + * http://jquery.org/license + * + * http://docs.jquery.com/UI/Autocomplete#theming + */ +.ui-autocomplete { position: absolute; cursor: default; } + +/* workarounds */ +* html .ui-autocomplete { width:1px; } /* without this, the menu expands to 100% in IE6 */ + +/* + * jQuery UI Menu @VERSION + * + * Copyright 2010, AUTHORS.txt (http://jqueryui.com/about) + * Dual licensed under the MIT or GPL Version 2 licenses. + * http://jquery.org/license + * + * http://docs.jquery.com/UI/Menu#theming + */ +.ui-menu { + list-style:none; + padding: 2px; + margin: 0; + display:block; + float: left; +} +.ui-menu .ui-menu { + margin-top: -3px; +} +.ui-menu .ui-menu-item { + margin:0; + padding: 0; + zoom: 1; + float: left; + clear: left; + width: 100%; +} +.ui-menu .ui-menu-item a { + text-decoration:none; + display:block; + padding:.2em .4em; + line-height:1.5; + zoom:1; +} +.ui-menu .ui-menu-item a.ui-state-hover, +.ui-menu .ui-menu-item a.ui-state-active { + font-weight: normal; + margin: -1px; +} +/* + * jQuery UI Button @VERSION + * + * Copyright 2010, AUTHORS.txt (http://jqueryui.com/about) + * Dual licensed under the MIT or GPL Version 2 licenses. + * http://jquery.org/license + * + * http://docs.jquery.com/UI/Button#theming + */ +.ui-button { display: inline-block; position: relative; padding: 0; margin-right: .1em; text-decoration: none !important; cursor: pointer; text-align: center; zoom: 1; overflow: visible; } /* the overflow property removes extra width in IE */ +.ui-button-icon-only { width: 2.2em; } /* to make room for the icon, a width needs to be set here */ +button.ui-button-icon-only { width: 2.4em; } /* button elements seem to need a little more width */ +.ui-button-icons-only { width: 3.4em; } +button.ui-button-icons-only { width: 3.7em; } + +/*button text element */ +.ui-button .ui-button-text { display: block; line-height: 1.4; } +.ui-button-text-only .ui-button-text { padding: .4em 1em; } +.ui-button-icon-only .ui-button-text, .ui-button-icons-only .ui-button-text { padding: .4em; text-indent: -9999999px; } +.ui-button-text-icon-primary .ui-button-text, .ui-button-text-icons .ui-button-text { padding: .4em 1em .4em 2.1em; } +.ui-button-text-icon-secondary .ui-button-text, .ui-button-text-icons .ui-button-text { padding: .4em 2.1em .4em 1em; } +.ui-button-text-icons .ui-button-text { padding-left: 2.1em; padding-right: 2.1em; } +/* no icon support for input elements, provide padding by default */ +input.ui-button { padding: .4em 1em; } + +/*button icon element(s) */ +.ui-button-icon-only .ui-icon, .ui-button-text-icon-primary .ui-icon, .ui-button-text-icon-secondary .ui-icon, .ui-button-text-icons .ui-icon, .ui-button-icons-only .ui-icon { position: absolute; top: 50%; margin-top: -8px; } +.ui-button-icon-only .ui-icon { left: 50%; margin-left: -8px; } +.ui-button-text-icon-primary .ui-button-icon-primary, .ui-button-text-icons .ui-button-icon-primary, .ui-button-icons-only .ui-button-icon-primary { left: .5em; } +.ui-button-text-icon-secondary .ui-button-icon-secondary, .ui-button-text-icons .ui-button-icon-secondary, .ui-button-icons-only .ui-button-icon-secondary { right: .5em; } +.ui-button-text-icons .ui-button-icon-secondary, .ui-button-icons-only .ui-button-icon-secondary { right: .5em; } + +/*button sets*/ +.ui-buttonset { margin-right: 7px; } +.ui-buttonset .ui-button { margin-left: 0; margin-right: -.3em; } + +/* workarounds */ +button.ui-button::-moz-focus-inner { border: 0; padding: 0; } /* reset extra padding in Firefox */ +/* + * jQuery UI Datepicker @VERSION + * + * Copyright 2010, AUTHORS.txt (http://jqueryui.com/about) + * Dual licensed under the MIT or GPL Version 2 licenses. + * http://jquery.org/license + * + * http://docs.jquery.com/UI/Datepicker#theming + */ +.ui-datepicker { width: 17em; padding: .2em .2em 0; } +.ui-datepicker .ui-datepicker-header { position:relative; padding:.2em 0; } +.ui-datepicker .ui-datepicker-prev, .ui-datepicker .ui-datepicker-next { position:absolute; top: 2px; width: 1.8em; height: 1.8em; } +.ui-datepicker .ui-datepicker-prev-hover, .ui-datepicker .ui-datepicker-next-hover { top: 1px; } +.ui-datepicker .ui-datepicker-prev { left:2px; } +.ui-datepicker .ui-datepicker-next { right:2px; } +.ui-datepicker .ui-datepicker-prev-hover { left:1px; } +.ui-datepicker .ui-datepicker-next-hover { right:1px; } +.ui-datepicker .ui-datepicker-prev span, .ui-datepicker .ui-datepicker-next span { display: block; position: absolute; left: 50%; margin-left: -8px; top: 50%; margin-top: -8px; } +.ui-datepicker .ui-datepicker-title { margin: 0 2.3em; line-height: 1.8em; text-align: center; } +.ui-datepicker .ui-datepicker-title select { font-size:1em; margin:1px 0; } +.ui-datepicker select.ui-datepicker-month-year {width: 100%;} +.ui-datepicker select.ui-datepicker-month, +.ui-datepicker select.ui-datepicker-year { width: 49%;} +.ui-datepicker table {width: 100%; font-size: .9em; border-collapse: collapse; margin:0 0 .4em; } +.ui-datepicker th { padding: .7em .3em; text-align: center; font-weight: bold; border: 0; } +.ui-datepicker td { border: 0; padding: 1px; } +.ui-datepicker td span, .ui-datepicker td a { display: block; padding: .2em; text-align: right; text-decoration: none; } +.ui-datepicker .ui-datepicker-buttonpane { background-image: none; margin: .7em 0 0 0; padding:0 .2em; border-left: 0; border-right: 0; border-bottom: 0; } +.ui-datepicker .ui-datepicker-buttonpane button { float: right; margin: .5em .2em .4em; cursor: pointer; padding: .2em .6em .3em .6em; width:auto; overflow:visible; } +.ui-datepicker .ui-datepicker-buttonpane button.ui-datepicker-current { float:left; } + +/* with multiple calendars */ +.ui-datepicker.ui-datepicker-multi { width:auto; } +.ui-datepicker-multi .ui-datepicker-group { float:left; } +.ui-datepicker-multi .ui-datepicker-group table { width:95%; margin:0 auto .4em; } +.ui-datepicker-multi-2 .ui-datepicker-group { width:50%; } +.ui-datepicker-multi-3 .ui-datepicker-group { width:33.3%; } +.ui-datepicker-multi-4 .ui-datepicker-group { width:25%; } +.ui-datepicker-multi .ui-datepicker-group-last .ui-datepicker-header { border-left-width:0; } +.ui-datepicker-multi .ui-datepicker-group-middle .ui-datepicker-header { border-left-width:0; } +.ui-datepicker-multi .ui-datepicker-buttonpane { clear:left; } +.ui-datepicker-row-break { clear:both; width:100%; } + +/* RTL support */ +.ui-datepicker-rtl { direction: rtl; } +.ui-datepicker-rtl .ui-datepicker-prev { right: 2px; left: auto; } +.ui-datepicker-rtl .ui-datepicker-next { left: 2px; right: auto; } +.ui-datepicker-rtl .ui-datepicker-prev:hover { right: 1px; left: auto; } +.ui-datepicker-rtl .ui-datepicker-next:hover { left: 1px; right: auto; } +.ui-datepicker-rtl .ui-datepicker-buttonpane { clear:right; } +.ui-datepicker-rtl .ui-datepicker-buttonpane button { float: left; } +.ui-datepicker-rtl .ui-datepicker-buttonpane button.ui-datepicker-current { float:right; } +.ui-datepicker-rtl .ui-datepicker-group { float:right; } +.ui-datepicker-rtl .ui-datepicker-group-last .ui-datepicker-header { border-right-width:0; border-left-width:1px; } +.ui-datepicker-rtl .ui-datepicker-group-middle .ui-datepicker-header { border-right-width:0; border-left-width:1px; } + +/* IE6 IFRAME FIX (taken from datepicker 1.5.3 */ +.ui-datepicker-cover { + display: none; /*sorry for IE5*/ + display/**/: block; /*sorry for IE5*/ + position: absolute; /*must have*/ + z-index: -1; /*must have*/ + filter: mask(); /*must have*/ + top: -4px; /*must have*/ + left: -4px; /*must have*/ + width: 200px; /*must have*/ + height: 200px; /*must have*/ +}/* + * jQuery UI Dialog @VERSION + * + * Copyright 2010, AUTHORS.txt (http://jqueryui.com/about) + * Dual licensed under the MIT or GPL Version 2 licenses. + * http://jquery.org/license + * + * http://docs.jquery.com/UI/Dialog#theming + */ +.ui-dialog { position: absolute; padding: .2em; width: 300px; overflow: hidden; } +.ui-dialog .ui-dialog-titlebar { padding: .5em 1em .3em; position: relative; } +.ui-dialog .ui-dialog-title { float: left; margin: .1em 16px .2em 0; } +.ui-dialog .ui-dialog-titlebar-close { position: absolute; right: .3em; top: 50%; width: 19px; margin: -10px 0 0 0; padding: 1px; height: 18px; } +.ui-dialog .ui-dialog-titlebar-close span { display: block; margin: 1px; } +.ui-dialog .ui-dialog-titlebar-close:hover, .ui-dialog .ui-dialog-titlebar-close:focus { padding: 0; } +.ui-dialog .ui-dialog-content { position: relative; border: 0; padding: .5em 1em; background: none; overflow: auto; zoom: 1; } +.ui-dialog .ui-dialog-buttonpane { text-align: left; border-width: 1px 0 0 0; background-image: none; margin: .5em 0 0 0; padding: .3em 1em .5em .4em; } +.ui-dialog .ui-dialog-buttonpane .ui-dialog-buttonset { float: right; } +.ui-dialog .ui-dialog-buttonpane button { margin: .5em .4em .5em 0; cursor: pointer; } +.ui-dialog .ui-resizable-se { width: 14px; height: 14px; right: 3px; bottom: 3px; } +.ui-draggable .ui-dialog-titlebar { cursor: move; } +/* + * jQuery UI Progressbar @VERSION + * + * Copyright 2010, AUTHORS.txt (http://jqueryui.com/about) + * Dual licensed under the MIT or GPL Version 2 licenses. + * http://jquery.org/license + * + * http://docs.jquery.com/UI/Progressbar#theming + */ +.ui-progressbar { height:2em; text-align: left; } +.ui-progressbar .ui-progressbar-value {margin: -1px; height:100%; }/* + * jQuery UI Resizable @VERSION + * + * Copyright 2010, AUTHORS.txt (http://jqueryui.com/about) + * Dual licensed under the MIT or GPL Version 2 licenses. + * http://jquery.org/license + * + * http://docs.jquery.com/UI/Resizable#theming + */ +.ui-resizable { position: relative;} +.ui-resizable-handle { position: absolute;font-size: 0.1px;z-index: 99999; display: block;} +.ui-resizable-disabled .ui-resizable-handle, .ui-resizable-autohide .ui-resizable-handle { display: none; } +.ui-resizable-n { cursor: n-resize; height: 7px; width: 100%; top: -5px; left: 0; } +.ui-resizable-s { cursor: s-resize; height: 7px; width: 100%; bottom: -5px; left: 0; } +.ui-resizable-e { cursor: e-resize; width: 7px; right: -5px; top: 0; height: 100%; } +.ui-resizable-w { cursor: w-resize; width: 7px; left: -5px; top: 0; height: 100%; } +.ui-resizable-se { cursor: se-resize; width: 12px; height: 12px; right: 1px; bottom: 1px; } +.ui-resizable-sw { cursor: sw-resize; width: 9px; height: 9px; left: -5px; bottom: -5px; } +.ui-resizable-nw { cursor: nw-resize; width: 9px; height: 9px; left: -5px; top: -5px; } +.ui-resizable-ne { cursor: ne-resize; width: 9px; height: 9px; right: -5px; top: -5px;}/* + * jQuery UI Selectable @VERSION + * + * Copyright 2010, AUTHORS.txt (http://jqueryui.com/about) + * Dual licensed under the MIT or GPL Version 2 licenses. + * http://jquery.org/license + * + * http://docs.jquery.com/UI/Selectable#theming + */ +.ui-selectable-helper { position: absolute; z-index: 100; border:1px dotted black; } +/* + * jQuery UI Slider @VERSION + * + * Copyright 2010, AUTHORS.txt (http://jqueryui.com/about) + * Dual licensed under the MIT or GPL Version 2 licenses. + * http://jquery.org/license + * + * http://docs.jquery.com/UI/Slider#theming + */ +.ui-slider { position: relative; text-align: left; } +.ui-slider .ui-slider-handle { position: absolute; z-index: 2; width: 1.2em; height: 1.2em; cursor: default; } +.ui-slider .ui-slider-range { position: absolute; z-index: 1; font-size: .7em; display: block; border: 0; background-position: 0 0; } + +.ui-slider-horizontal { height: .8em; } +.ui-slider-horizontal .ui-slider-handle { top: -.3em; margin-left: -.6em; } +.ui-slider-horizontal .ui-slider-range { top: 0; height: 100%; } +.ui-slider-horizontal .ui-slider-range-min { left: 0; } +.ui-slider-horizontal .ui-slider-range-max { right: 0; } + +.ui-slider-vertical { width: .8em; height: 100px; } +.ui-slider-vertical .ui-slider-handle { left: -.3em; margin-left: 0; margin-bottom: -.6em; } +.ui-slider-vertical .ui-slider-range { left: 0; width: 100%; } +.ui-slider-vertical .ui-slider-range-min { bottom: 0; } +.ui-slider-vertical .ui-slider-range-max { top: 0; }/* + * jQuery UI Tabs @VERSION + * + * Copyright 2010, AUTHORS.txt (http://jqueryui.com/about) + * Dual licensed under the MIT or GPL Version 2 licenses. + * http://jquery.org/license + * + * http://docs.jquery.com/UI/Tabs#theming + */ +.ui-tabs { position: relative; padding: .2em; zoom: 1; } /* position: relative prevents IE scroll bug (element with position: relative inside container with overflow: auto appear as "fixed") */ +.ui-tabs .ui-tabs-nav { margin: 0; padding: .2em .2em 0; } +.ui-tabs .ui-tabs-nav li { list-style: none; float: left; position: relative; top: 1px; margin: 0 .2em 1px 0; border-bottom: 0 !important; padding: 0; white-space: nowrap; } +.ui-tabs .ui-tabs-nav li a { float: left; padding: .5em 1em; text-decoration: none; } +.ui-tabs .ui-tabs-nav li.ui-tabs-selected { margin-bottom: 0; padding-bottom: 1px; } +.ui-tabs .ui-tabs-nav li.ui-tabs-selected a, .ui-tabs .ui-tabs-nav li.ui-state-disabled a, .ui-tabs .ui-tabs-nav li.ui-state-processing a { cursor: text; } +.ui-tabs .ui-tabs-nav li a, .ui-tabs.ui-tabs-collapsible .ui-tabs-nav li.ui-tabs-selected a { cursor: pointer; } /* first selector in group seems obsolete, but required to overcome bug in Opera applying cursor: text overall if defined elsewhere... */ +.ui-tabs .ui-tabs-panel { display: block; border-width: 0; padding: 1em 1.4em; background: none; } +.ui-tabs .ui-tabs-hide { display: none !important; } +/* + * jQuery UI CSS Framework @VERSION + * + * Copyright 2010, AUTHORS.txt (http://jqueryui.com/about) + * Dual licensed under the MIT or GPL Version 2 licenses. + * http://jquery.org/license + * + * http://docs.jquery.com/UI/Theming/API + * + * To view and modify this theme, visit http://jqueryui.com/themeroller/ + */ + + +/* Component containers +----------------------------------*/ +.ui-widget { font-family: Verdana,Arial,sans-serif/*{ffDefault}*/; font-size: 1.1em/*{fsDefault}*/; } +.ui-widget .ui-widget { font-size: 1em; } +.ui-widget input, .ui-widget select, .ui-widget textarea, .ui-widget button { font-family: Verdana,Arial,sans-serif/*{ffDefault}*/; font-size: 1em; } +.ui-widget-content { border: 1px solid #aaaaaa/*{borderColorContent}*/; background: #ffffff/*{bgColorContent}*/ url(images/ui-bg_flat_75_ffffff_40x100.png)/*{bgImgUrlContent}*/ 50%/*{bgContentXPos}*/ 50%/*{bgContentYPos}*/ repeat-x/*{bgContentRepeat}*/; color: #222222/*{fcContent}*/; } +.ui-widget-content a { color: #222222/*{fcContent}*/; } +.ui-widget-header { border: 1px solid #aaaaaa/*{borderColorHeader}*/; background: #cccccc/*{bgColorHeader}*/ url(images/ui-bg_highlight-soft_75_cccccc_1x100.png)/*{bgImgUrlHeader}*/ 50%/*{bgHeaderXPos}*/ 50%/*{bgHeaderYPos}*/ repeat-x/*{bgHeaderRepeat}*/; color: #222222/*{fcHeader}*/; font-weight: bold; } +.ui-widget-header a { color: #222222/*{fcHeader}*/; } + +/* Interaction states +----------------------------------*/ +.ui-state-default, .ui-widget-content .ui-state-default, .ui-widget-header .ui-state-default { border: 1px solid #d3d3d3/*{borderColorDefault}*/; background: #e6e6e6/*{bgColorDefault}*/ url(images/ui-bg_glass_75_e6e6e6_1x400.png)/*{bgImgUrlDefault}*/ 50%/*{bgDefaultXPos}*/ 50%/*{bgDefaultYPos}*/ repeat-x/*{bgDefaultRepeat}*/; font-weight: normal/*{fwDefault}*/; color: #555555/*{fcDefault}*/; } +.ui-state-default a, .ui-state-default a:link, .ui-state-default a:visited { color: #555555/*{fcDefault}*/; text-decoration: none; } +.ui-state-hover, .ui-widget-content .ui-state-hover, .ui-widget-header .ui-state-hover, .ui-state-focus, .ui-widget-content .ui-state-focus, .ui-widget-header .ui-state-focus { border: 1px solid #999999/*{borderColorHover}*/; background: #dadada/*{bgColorHover}*/ url(images/ui-bg_glass_75_dadada_1x400.png)/*{bgImgUrlHover}*/ 50%/*{bgHoverXPos}*/ 50%/*{bgHoverYPos}*/ repeat-x/*{bgHoverRepeat}*/; font-weight: normal/*{fwDefault}*/; color: #212121/*{fcHover}*/; } +.ui-state-hover a, .ui-state-hover a:hover { color: #212121/*{fcHover}*/; text-decoration: none; } +.ui-state-active, .ui-widget-content .ui-state-active, .ui-widget-header .ui-state-active { border: 1px solid #aaaaaa/*{borderColorActive}*/; background: #ffffff/*{bgColorActive}*/ url(images/ui-bg_glass_65_ffffff_1x400.png)/*{bgImgUrlActive}*/ 50%/*{bgActiveXPos}*/ 50%/*{bgActiveYPos}*/ repeat-x/*{bgActiveRepeat}*/; font-weight: normal/*{fwDefault}*/; color: #212121/*{fcActive}*/; } +.ui-state-active a, .ui-state-active a:link, .ui-state-active a:visited { color: #212121/*{fcActive}*/; text-decoration: none; } +.ui-widget :active { outline: none; } + +/* Interaction Cues +----------------------------------*/ +.ui-state-highlight, .ui-widget-content .ui-state-highlight, .ui-widget-header .ui-state-highlight {border: 1px solid #fcefa1/*{borderColorHighlight}*/; background: #fbf9ee/*{bgColorHighlight}*/ url(images/ui-bg_glass_55_fbf9ee_1x400.png)/*{bgImgUrlHighlight}*/ 50%/*{bgHighlightXPos}*/ 50%/*{bgHighlightYPos}*/ repeat-x/*{bgHighlightRepeat}*/; color: #363636/*{fcHighlight}*/; } +.ui-state-highlight a, .ui-widget-content .ui-state-highlight a,.ui-widget-header .ui-state-highlight a { color: #363636/*{fcHighlight}*/; } +.ui-state-error, .ui-widget-content .ui-state-error, .ui-widget-header .ui-state-error {border: 1px solid #cd0a0a/*{borderColorError}*/; background: #fef1ec/*{bgColorError}*/ url(images/ui-bg_glass_95_fef1ec_1x400.png)/*{bgImgUrlError}*/ 50%/*{bgErrorXPos}*/ 50%/*{bgErrorYPos}*/ repeat-x/*{bgErrorRepeat}*/; color: #cd0a0a/*{fcError}*/; } +.ui-state-error a, .ui-widget-content .ui-state-error a, .ui-widget-header .ui-state-error a { color: #cd0a0a/*{fcError}*/; } +.ui-state-error-text, .ui-widget-content .ui-state-error-text, .ui-widget-header .ui-state-error-text { color: #cd0a0a/*{fcError}*/; } +.ui-priority-primary, .ui-widget-content .ui-priority-primary, .ui-widget-header .ui-priority-primary { font-weight: bold; } +.ui-priority-secondary, .ui-widget-content .ui-priority-secondary, .ui-widget-header .ui-priority-secondary { opacity: .7; filter:Alpha(Opacity=70); font-weight: normal; } +.ui-state-disabled, .ui-widget-content .ui-state-disabled, .ui-widget-header .ui-state-disabled { opacity: .35; filter:Alpha(Opacity=35); background-image: none; } + +/* Icons +----------------------------------*/ + +/* states and images */ +.ui-icon { width: 16px; height: 16px; background-image: url(images/ui-icons_222222_256x240.png)/*{iconsContent}*/; } +.ui-widget-content .ui-icon {background-image: url(images/ui-icons_222222_256x240.png)/*{iconsContent}*/; } +.ui-widget-header .ui-icon {background-image: url(images/ui-icons_222222_256x240.png)/*{iconsHeader}*/; } +.ui-state-default .ui-icon { background-image: url(images/ui-icons_888888_256x240.png)/*{iconsDefault}*/; } +.ui-state-hover .ui-icon, .ui-state-focus .ui-icon {background-image: url(images/ui-icons_454545_256x240.png)/*{iconsHover}*/; } +.ui-state-active .ui-icon {background-image: url(images/ui-icons_454545_256x240.png)/*{iconsActive}*/; } +.ui-state-highlight .ui-icon {background-image: url(images/ui-icons_2e83ff_256x240.png)/*{iconsHighlight}*/; } +.ui-state-error .ui-icon, .ui-state-error-text .ui-icon {background-image: url(images/ui-icons_cd0a0a_256x240.png)/*{iconsError}*/; } + +/* positioning */ +.ui-icon-carat-1-n { background-position: 0 0; } +.ui-icon-carat-1-ne { background-position: -16px 0; } +.ui-icon-carat-1-e { background-position: -32px 0; } +.ui-icon-carat-1-se { background-position: -48px 0; } +.ui-icon-carat-1-s { background-position: -64px 0; } +.ui-icon-carat-1-sw { background-position: -80px 0; } +.ui-icon-carat-1-w { background-position: -96px 0; } +.ui-icon-carat-1-nw { background-position: -112px 0; } +.ui-icon-carat-2-n-s { background-position: -128px 0; } +.ui-icon-carat-2-e-w { background-position: -144px 0; } +.ui-icon-triangle-1-n { background-position: 0 -16px; } +.ui-icon-triangle-1-ne { background-position: -16px -16px; } +.ui-icon-triangle-1-e { background-position: -32px -16px; } +.ui-icon-triangle-1-se { background-position: -48px -16px; } +.ui-icon-triangle-1-s { background-position: -64px -16px; } +.ui-icon-triangle-1-sw { background-position: -80px -16px; } +.ui-icon-triangle-1-w { background-position: -96px -16px; } +.ui-icon-triangle-1-nw { background-position: -112px -16px; } +.ui-icon-triangle-2-n-s { background-position: -128px -16px; } +.ui-icon-triangle-2-e-w { background-position: -144px -16px; } +.ui-icon-arrow-1-n { background-position: 0 -32px; } +.ui-icon-arrow-1-ne { background-position: -16px -32px; } +.ui-icon-arrow-1-e { background-position: -32px -32px; } +.ui-icon-arrow-1-se { background-position: -48px -32px; } +.ui-icon-arrow-1-s { background-position: -64px -32px; } +.ui-icon-arrow-1-sw { background-position: -80px -32px; } +.ui-icon-arrow-1-w { background-position: -96px -32px; } +.ui-icon-arrow-1-nw { background-position: -112px -32px; } +.ui-icon-arrow-2-n-s { background-position: -128px -32px; } +.ui-icon-arrow-2-ne-sw { background-position: -144px -32px; } +.ui-icon-arrow-2-e-w { background-position: -160px -32px; } +.ui-icon-arrow-2-se-nw { background-position: -176px -32px; } +.ui-icon-arrowstop-1-n { background-position: -192px -32px; } +.ui-icon-arrowstop-1-e { background-position: -208px -32px; } +.ui-icon-arrowstop-1-s { background-position: -224px -32px; } +.ui-icon-arrowstop-1-w { background-position: -240px -32px; } +.ui-icon-arrowthick-1-n { background-position: 0 -48px; } +.ui-icon-arrowthick-1-ne { background-position: -16px -48px; } +.ui-icon-arrowthick-1-e { background-position: -32px -48px; } +.ui-icon-arrowthick-1-se { background-position: -48px -48px; } +.ui-icon-arrowthick-1-s { background-position: -64px -48px; } +.ui-icon-arrowthick-1-sw { background-position: -80px -48px; } +.ui-icon-arrowthick-1-w { background-position: -96px -48px; } +.ui-icon-arrowthick-1-nw { background-position: -112px -48px; } +.ui-icon-arrowthick-2-n-s { background-position: -128px -48px; } +.ui-icon-arrowthick-2-ne-sw { background-position: -144px -48px; } +.ui-icon-arrowthick-2-e-w { background-position: -160px -48px; } +.ui-icon-arrowthick-2-se-nw { background-position: -176px -48px; } +.ui-icon-arrowthickstop-1-n { background-position: -192px -48px; } +.ui-icon-arrowthickstop-1-e { background-position: -208px -48px; } +.ui-icon-arrowthickstop-1-s { background-position: -224px -48px; } +.ui-icon-arrowthickstop-1-w { background-position: -240px -48px; } +.ui-icon-arrowreturnthick-1-w { background-position: 0 -64px; } +.ui-icon-arrowreturnthick-1-n { background-position: -16px -64px; } +.ui-icon-arrowreturnthick-1-e { background-position: -32px -64px; } +.ui-icon-arrowreturnthick-1-s { background-position: -48px -64px; } +.ui-icon-arrowreturn-1-w { background-position: -64px -64px; } +.ui-icon-arrowreturn-1-n { background-position: -80px -64px; } +.ui-icon-arrowreturn-1-e { background-position: -96px -64px; } +.ui-icon-arrowreturn-1-s { background-position: -112px -64px; } +.ui-icon-arrowrefresh-1-w { background-position: -128px -64px; } +.ui-icon-arrowrefresh-1-n { background-position: -144px -64px; } +.ui-icon-arrowrefresh-1-e { background-position: -160px -64px; } +.ui-icon-arrowrefresh-1-s { background-position: -176px -64px; } +.ui-icon-arrow-4 { background-position: 0 -80px; } +.ui-icon-arrow-4-diag { background-position: -16px -80px; } +.ui-icon-extlink { background-position: -32px -80px; } +.ui-icon-newwin { background-position: -48px -80px; } +.ui-icon-refresh { background-position: -64px -80px; } +.ui-icon-shuffle { background-position: -80px -80px; } +.ui-icon-transfer-e-w { background-position: -96px -80px; } +.ui-icon-transferthick-e-w { background-position: -112px -80px; } +.ui-icon-folder-collapsed { background-position: 0 -96px; } +.ui-icon-folder-open { background-position: -16px -96px; } +.ui-icon-document { background-position: -32px -96px; } +.ui-icon-document-b { background-position: -48px -96px; } +.ui-icon-note { background-position: -64px -96px; } +.ui-icon-mail-closed { background-position: -80px -96px; } +.ui-icon-mail-open { background-position: -96px -96px; } +.ui-icon-suitcase { background-position: -112px -96px; } +.ui-icon-comment { background-position: -128px -96px; } +.ui-icon-person { background-position: -144px -96px; } +.ui-icon-print { background-position: -160px -96px; } +.ui-icon-trash { background-position: -176px -96px; } +.ui-icon-locked { background-position: -192px -96px; } +.ui-icon-unlocked { background-position: -208px -96px; } +.ui-icon-bookmark { background-position: -224px -96px; } +.ui-icon-tag { background-position: -240px -96px; } +.ui-icon-home { background-position: 0 -112px; } +.ui-icon-flag { background-position: -16px -112px; } +.ui-icon-calendar { background-position: -32px -112px; } +.ui-icon-cart { background-position: -48px -112px; } +.ui-icon-pencil { background-position: -64px -112px; } +.ui-icon-clock { background-position: -80px -112px; } +.ui-icon-disk { background-position: -96px -112px; } +.ui-icon-calculator { background-position: -112px -112px; } +.ui-icon-zoomin { background-position: -128px -112px; } +.ui-icon-zoomout { background-position: -144px -112px; } +.ui-icon-search { background-position: -160px -112px; } +.ui-icon-wrench { background-position: -176px -112px; } +.ui-icon-gear { background-position: -192px -112px; } +.ui-icon-heart { background-position: -208px -112px; } +.ui-icon-star { background-position: -224px -112px; } +.ui-icon-link { background-position: -240px -112px; } +.ui-icon-cancel { background-position: 0 -128px; } +.ui-icon-plus { background-position: -16px -128px; } +.ui-icon-plusthick { background-position: -32px -128px; } +.ui-icon-minus { background-position: -48px -128px; } +.ui-icon-minusthick { background-position: -64px -128px; } +.ui-icon-close { background-position: -80px -128px; } +.ui-icon-closethick { background-position: -96px -128px; } +.ui-icon-key { background-position: -112px -128px; } +.ui-icon-lightbulb { background-position: -128px -128px; } +.ui-icon-scissors { background-position: -144px -128px; } +.ui-icon-clipboard { background-position: -160px -128px; } +.ui-icon-copy { background-position: -176px -128px; } +.ui-icon-contact { background-position: -192px -128px; } +.ui-icon-image { background-position: -208px -128px; } +.ui-icon-video { background-position: -224px -128px; } +.ui-icon-script { background-position: -240px -128px; } +.ui-icon-alert { background-position: 0 -144px; } +.ui-icon-info { background-position: -16px -144px; } +.ui-icon-notice { background-position: -32px -144px; } +.ui-icon-help { background-position: -48px -144px; } +.ui-icon-check { background-position: -64px -144px; } +.ui-icon-bullet { background-position: -80px -144px; } +.ui-icon-radio-off { background-position: -96px -144px; } +.ui-icon-radio-on { background-position: -112px -144px; } +.ui-icon-pin-w { background-position: -128px -144px; } +.ui-icon-pin-s { background-position: -144px -144px; } +.ui-icon-play { background-position: 0 -160px; } +.ui-icon-pause { background-position: -16px -160px; } +.ui-icon-seek-next { background-position: -32px -160px; } +.ui-icon-seek-prev { background-position: -48px -160px; } +.ui-icon-seek-end { background-position: -64px -160px; } +.ui-icon-seek-start { background-position: -80px -160px; } +/* ui-icon-seek-first is deprecated, use ui-icon-seek-start instead */ +.ui-icon-seek-first { background-position: -80px -160px; } +.ui-icon-stop { background-position: -96px -160px; } +.ui-icon-eject { background-position: -112px -160px; } +.ui-icon-volume-off { background-position: -128px -160px; } +.ui-icon-volume-on { background-position: -144px -160px; } +.ui-icon-power { background-position: 0 -176px; } +.ui-icon-signal-diag { background-position: -16px -176px; } +.ui-icon-signal { background-position: -32px -176px; } +.ui-icon-battery-0 { background-position: -48px -176px; } +.ui-icon-battery-1 { background-position: -64px -176px; } +.ui-icon-battery-2 { background-position: -80px -176px; } +.ui-icon-battery-3 { background-position: -96px -176px; } +.ui-icon-circle-plus { background-position: 0 -192px; } +.ui-icon-circle-minus { background-position: -16px -192px; } +.ui-icon-circle-close { background-position: -32px -192px; } +.ui-icon-circle-triangle-e { background-position: -48px -192px; } +.ui-icon-circle-triangle-s { background-position: -64px -192px; } +.ui-icon-circle-triangle-w { background-position: -80px -192px; } +.ui-icon-circle-triangle-n { background-position: -96px -192px; } +.ui-icon-circle-arrow-e { background-position: -112px -192px; } +.ui-icon-circle-arrow-s { background-position: -128px -192px; } +.ui-icon-circle-arrow-w { background-position: -144px -192px; } +.ui-icon-circle-arrow-n { background-position: -160px -192px; } +.ui-icon-circle-zoomin { background-position: -176px -192px; } +.ui-icon-circle-zoomout { background-position: -192px -192px; } +.ui-icon-circle-check { background-position: -208px -192px; } +.ui-icon-circlesmall-plus { background-position: 0 -208px; } +.ui-icon-circlesmall-minus { background-position: -16px -208px; } +.ui-icon-circlesmall-close { background-position: -32px -208px; } +.ui-icon-squaresmall-plus { background-position: -48px -208px; } +.ui-icon-squaresmall-minus { background-position: -64px -208px; } +.ui-icon-squaresmall-close { background-position: -80px -208px; } +.ui-icon-grip-dotted-vertical { background-position: 0 -224px; } +.ui-icon-grip-dotted-horizontal { background-position: -16px -224px; } +.ui-icon-grip-solid-vertical { background-position: -32px -224px; } +.ui-icon-grip-solid-horizontal { background-position: -48px -224px; } +.ui-icon-gripsmall-diagonal-se { background-position: -64px -224px; } +.ui-icon-grip-diagonal-se { background-position: -80px -224px; } + + +/* Misc visuals +----------------------------------*/ + +/* Corner radius */ +.ui-corner-tl { -moz-border-radius-topleft: 4px/*{cornerRadius}*/; -webkit-border-top-left-radius: 4px/*{cornerRadius}*/; border-top-left-radius: 4px/*{cornerRadius}*/; } +.ui-corner-tr { -moz-border-radius-topright: 4px/*{cornerRadius}*/; -webkit-border-top-right-radius: 4px/*{cornerRadius}*/; border-top-right-radius: 4px/*{cornerRadius}*/; } +.ui-corner-bl { -moz-border-radius-bottomleft: 4px/*{cornerRadius}*/; -webkit-border-bottom-left-radius: 4px/*{cornerRadius}*/; border-bottom-left-radius: 4px/*{cornerRadius}*/; } +.ui-corner-br { -moz-border-radius-bottomright: 4px/*{cornerRadius}*/; -webkit-border-bottom-right-radius: 4px/*{cornerRadius}*/; border-bottom-right-radius: 4px/*{cornerRadius}*/; } +.ui-corner-top { -moz-border-radius-topleft: 4px/*{cornerRadius}*/; -webkit-border-top-left-radius: 4px/*{cornerRadius}*/; border-top-left-radius: 4px/*{cornerRadius}*/; -moz-border-radius-topright: 4px/*{cornerRadius}*/; -webkit-border-top-right-radius: 4px/*{cornerRadius}*/; border-top-right-radius: 4px/*{cornerRadius}*/; } +.ui-corner-bottom { -moz-border-radius-bottomleft: 4px/*{cornerRadius}*/; -webkit-border-bottom-left-radius: 4px/*{cornerRadius}*/; border-bottom-left-radius: 4px/*{cornerRadius}*/; -moz-border-radius-bottomright: 4px/*{cornerRadius}*/; -webkit-border-bottom-right-radius: 4px/*{cornerRadius}*/; border-bottom-right-radius: 4px/*{cornerRadius}*/; } +.ui-corner-right { -moz-border-radius-topright: 4px/*{cornerRadius}*/; -webkit-border-top-right-radius: 4px/*{cornerRadius}*/; border-top-right-radius: 4px/*{cornerRadius}*/; -moz-border-radius-bottomright: 4px/*{cornerRadius}*/; -webkit-border-bottom-right-radius: 4px/*{cornerRadius}*/; border-bottom-right-radius: 4px/*{cornerRadius}*/; } +.ui-corner-left { -moz-border-radius-topleft: 4px/*{cornerRadius}*/; -webkit-border-top-left-radius: 4px/*{cornerRadius}*/; border-top-left-radius: 4px/*{cornerRadius}*/; -moz-border-radius-bottomleft: 4px/*{cornerRadius}*/; -webkit-border-bottom-left-radius: 4px/*{cornerRadius}*/; border-bottom-left-radius: 4px/*{cornerRadius}*/; } +.ui-corner-all { -moz-border-radius: 4px/*{cornerRadius}*/; -webkit-border-radius: 4px/*{cornerRadius}*/; border-radius: 4px/*{cornerRadius}*/; } + +/* Overlays */ +.ui-widget-overlay { background: #aaaaaa/*{bgColorOverlay}*/ url(images/ui-bg_flat_0_aaaaaa_40x100.png)/*{bgImgUrlOverlay}*/ 50%/*{bgOverlayXPos}*/ 50%/*{bgOverlayYPos}*/ repeat-x/*{bgOverlayRepeat}*/; opacity: .3;filter:Alpha(Opacity=30)/*{opacityOverlay}*/; } +.ui-widget-shadow { margin: -8px/*{offsetTopShadow}*/ 0 0 -8px/*{offsetLeftShadow}*/; padding: 8px/*{thicknessShadow}*/; background: #aaaaaa/*{bgColorShadow}*/ url(images/ui-bg_flat_0_aaaaaa_40x100.png)/*{bgImgUrlShadow}*/ 50%/*{bgShadowXPos}*/ 50%/*{bgShadowYPos}*/ repeat-x/*{bgShadowRepeat}*/; opacity: .3;filter:Alpha(Opacity=30)/*{opacityShadow}*/; -moz-border-radius: 8px/*{cornerRadiusShadow}*/; -webkit-border-radius: 8px/*{cornerRadiusShadow}*/; border-radius: 8px/*{cornerRadiusShadow}*/; } \ No newline at end of file diff -r 40eddcc3d063 -r 3a30d255c235 web/ldt/media/css/jquery.qtip.css --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/web/ldt/media/css/jquery.qtip.css Sun Nov 14 20:25:22 2010 +0100 @@ -0,0 +1,337 @@ +/* +* qTip - The jQuery tooltip plugin +* http://craigsworks.com/projects/qtip/ +* +* Version: 2.0.0pre +* Copyright 2009 Craig Michael Thompson - http://craigsworks.com +* +* Dual licensed under MIT or GPL Version 2 licenses +* http://en.wikipedia.org/wiki/MIT_License +* http://en.wikipedia.org/wiki/GNU_General_Public_License +* +* Date: Mon Sep 6 15:10:26 2010 +0100 +*/ + +.ui-tooltip-accessible{ + left: -10000em !important; + top: -10000em !important; + display: block !important; + visibility: hidden !important; +} + + /* IE6 ONLY - Width detection fix */ + * html .ui-tooltip-accessible{ + position: static !important; + float: left !important; + } + +.ui-tooltip, .qtip{ + position: absolute; + display: none; + + max-width: 280px; + min-width: 50px; +} + + .ui-tooltip .ui-tooltip-wrapper{ + position: relative; + overflow: hidden; + + border-width: 3px; + border-style: solid; + } + + .ui-tooltip .ui-tooltip-content{ + position: relative; + padding: 5px 9px; + + text-align: left; + word-wrap: break-word; + overflow: hidden; + } + + .ui-tooltip .ui-tooltip-titlebar{ + position: relative; + padding: 6px 35px 6px 10px; + + font-weight: bold; + } + + /*! Default close button class */ + .ui-tooltip .ui-tooltip-close{ + position: absolute; + height: 16px; + width: 16px; + padding: 1px; + right: 5px; + top: 5px; + + cursor: pointer; + line-height: 0px; + font-size: 0px; + } + + .ui-tooltip .ui-tooltip-close .ui-icon{ + height: 16px; + width: 16px; + display: block; + + opacity: 0.8; + -ms-filter: "progid:DXImageTransform.Microsoft.Alpha(Opacity=80)"; + filter: alpha(opacity=80); + } + .ui-tooltip .ui-tooltip-close:hover .ui-icon{ + opacity: 1; + -ms-filter: "progid:DXImageTransform.Microsoft.Alpha(Opacity=100)"; + filter: alpha(opacity=100); + } + + /*! Custom button class */ + .ui-tooltip .ui-tooltip-button{ + float: right; + } + + /* Applied to 'focused' tooltips e.g. most recently displayed/interacted with */ + .ui-tooltip-focus{ + + } + + +/*! Default tooltip style */ +.ui-tooltip-wrapper{ + border-color: #F9E98E; + background-color: #FBF7AA; + color: #A27D35; +} + + .ui-tooltip .ui-tooltip-titlebar{ + background-color: #F0DE7D; + } + + .ui-tooltip .ui-tooltip-close .ui-icon{ + background: #A27D35 url('images/close.png') no-repeat 50% 50%; + } + +/*! Plain tooltip style */ +.ui-tooltip-plain .ui-tooltip-wrapper{ + border-color: black; + border-width: 1px; + + background-color: white; + color: black; +} + + .ui-tooltip-plain .ui-tooltip-titlebar{ + background-color: white; + } + + .ui-tooltip-plain .ui-tooltip-close .ui-icon{ + background: black; + } + +/*! Light tooltip style */ +.ui-tooltip-light .ui-tooltip-wrapper{ + border-color: #E2E2E2; + background-color: white; + color: #454545; +} + + .ui-tooltip-light .ui-tooltip-titlebar{ + background-color: #f1f1f1; + } + + .ui-tooltip-light .ui-tooltip-close .ui-icon{ + background: #454545 url('images/close-light.png') no-repeat 50% 50%; + } + + +/*! Dark tooltip style */ +.ui-tooltip-dark .ui-tooltip-wrapper{ + border-color: #303030; + background-color: #505050; + color: #f3f3f3; +} + + .ui-tooltip-dark .ui-tooltip-titlebar{ + background-color: #404040; + } + + .ui-tooltip-dark .ui-tooltip-close .ui-icon{ + background: #f3f3f3 url('images/close-dark.png') no-repeat 50% 50%; + } + + +/*! Red tooltip style */ +.ui-tooltip-red .ui-tooltip-wrapper{ + border-color: #D95252; + background-color: #F78B83; + color: #912323; +} + + .ui-tooltip-red .ui-tooltip-titlebar{ + background-color: #F06D65; + } + + .ui-tooltip-red .ui-tooltip-close .ui-icon{ + background: #9C2F2F url('images/close-red.png') no-repeat 50% 50%; + } + + +/*! Green tooltip style */ +.ui-tooltip-green .ui-tooltip-wrapper{ + border-color: #90D93F; + background-color: #CAED9E; + color: #3F6219; +} + + .ui-tooltip-green .ui-tooltip-titlebar{ + background-color: #B0DE78; + } + + .ui-tooltip-green .ui-tooltip-close .ui-icon{ + background: #58792E url('images/close-green.png') no-repeat 50% 50%; + } + + +/*! Blue tooltip style */ +.ui-tooltip-blue .ui-tooltip-wrapper{ + border-color: #ADD9ED; + background-color: #E5F6FE; + color: #5E99BD; +} + + .ui-tooltip-blue .ui-tooltip-titlebar{ + background-color: #D0E9F5; + } + + .ui-tooltip-blue .ui-tooltip-close .ui-icon{ + background: #4D9FBF url('images/close-blue.png') no-repeat 50% 50%; + } + + +/*! Add shadows to your tooltips in all supported browsers */ +.ui-tooltip-shadow{ + -webkit-box-shadow: 5px 5px 5px rgba(0, 0, 0, 0.3); + -moz-box-shadow: 5px 5px 5px rgba(0, 0, 0, 0.3); + box-shadow: 5px 5px 5px rgba(0, 0, 0, 0.3); + + filter:progid:DXImageTransform.Microsoft.dropshadow(OffX=5, OffY=5, Color='gray'); + -ms-filter:"progid:DXImageTransform.Microsoft.dropshadow(OffX=5, OffY=5, Color='gray')"; +} + +div.ui-tooltip-tip{ + position: absolute; + margin: 0 auto; + overflow: hidden; + + line-height: 0.1px; + font-size: 1px; + + background: transparent !important; + border: 0px !important; + z-index: 10; +} + + div.ui-tooltip-tip *{ + line-height: 0.1px; + font-size: 0.1px; + } + + div.ui-tooltip-tip div{ + background: transparent !important; + border: 0px dashed transparent; + } + +#qtip-overlay{ + position: absolute; + left: -10000em; + top: -10000em; + + background-color: black; + cursor: pointer; + + /* Set this to any below 15000 (default starting z-index for qTips) */ + z-index: 14999; +} + +/*! Youtube tooltip style */ +div.ui-tooltip-youtube .ui-tooltip-wrapper{ + -moz-border-radius: 5px; + -webkit-border-radius: 5px; + border-radius: 5px; + + -webkit-box-shadow: 0 0 3px #333; + -moz-box-shadow: 0 0 3px #333; + box-shadow: 0 0 3px #333; + + border-color: #CCCCCC; + border-width: 1px; + + color: white; +} + + div.ui-tooltip-youtube .ui-tooltip-close .ui-icon{ + background: #4D9FBF url('images/close-dark.png') no-repeat 50% 50%; + } + + div.ui-tooltip-youtube .ui-tooltip-titlebar, + div.ui-tooltip-youtube .ui-tooltip-content{ + background-color: rgba(0, 0, 0, 0.85); + } + + /* IE6 Fallback */ + * html div.ui-tooltip-youtube-wrapper{ + background-color: black; + } + + +/* jQuery TOOLS Tooltip style */ +div.ui-tooltip-jtools .ui-tooltip-wrapper{ + -moz-border-radius: 2px; + -webkit-border-radius: 2px; + border-radius: 2px; + + border-color: white; + border-width: 2px; + + -webkit-box-shadow: 0 0 12px #333; + -moz-box-shadow: 0 0 12px #333; + box-shadow: 0 0 12px #333; + + background-color: rgba(0, 0, 0, 0.7); + background-image: -moz-linear-gradient(top, #717171, #232323); + background-image: -webkit-gradient(linear, left top, left bottom, from(#717171), to(#232323)); + filter:progid:DXImageTransform.Microsoft.gradient(startColorstr=#717171,endColorstr=#232323); + -ms-filter: "progid:DXImageTransform.Microsoft.gradient(startColorstr=#717171,endColorstr=#232323)"; + + color: white; +} + + div.ui-tooltip-jtools .ui-tooltip-titlebar, + div.ui-tooltip-jtools .ui-tooltip-content{ + background: none; + } + + div.ui-tooltip-jtools .ui-tooltip-close .ui-icon{ + background: black url('images/close-dark.png') no-repeat 50% 50%; + } + + +/* Cluetip style */ +div.ui-tooltip-cluetip .ui-tooltip-wrapper{ + border-width: 0; + + -webkit-box-shadow: 4px 4px 5px rgba(0, 0, 0, 0.4); + -moz-box-shadow: 4px 4px 5px rgba(0, 0, 0, 0.4); + box-shadow: 4px 4px 5px rgba(0, 0, 0, 0.4); +} + + div.ui-tooltip-cluetip .ui-tooltip-titlebar{ + background-color: #87876A; + color: white; + } + div.ui-tooltip-cluetip .ui-tooltip-content{ + background-color: #D9D9C2; + color: #111; + } + diff -r 40eddcc3d063 -r 3a30d255c235 web/ldt/media/css/ldt.css --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/web/ldt/media/css/ldt.css Sun Nov 14 20:25:22 2010 +0100 @@ -0,0 +1,122 @@ +#addldtform +{ + font-size: 16px; + background: #ffffff scroll repeat 0 0; + border: 1px solid #666666; + text-align: left; + width: 700px; +} + +#addldtform .title +{ + color: #666666; + font-weight:bold !important; + font-size:16px; + position: relative; + padding:8px 12px; +} + +#addldtform .title .closebutton +{ + float: right; + text-decoration: none; + color:#666666; +} + + +#addldtform .form-row +{ + border-bottom: 1px solid #eeeeee; + font-size: 15px; + padding: 8px 12px; +} + +#addldtform label +{ + float: left; + padding: 3px 8px 0 0; + width:8em; + color: #333333 !important; + font-weight: bold !important; +} +#addldtform input +{ + font-size: 15px; + font-weight: normal; + padding:2px 3px; + vertical-align: middle; + margin : 2px 0; + background-color: #ffffff; + border: 1px solid #cccccc; +} + +#addldtform .checkbox +{ + padding: 6px 3px 3px 30px; +} + +#addldtform .submit-row input +{ + color:black; + border-color:#DDDDDD #AAAAAA #AAAAAA #DDDDDD; + background:#dddddd; + padding: 3px; + margin:0 10px 10px 10px; +} +/* +#ldtlist{ + width:60%; + overflow:auto; + padding:1em; +} +*/ +#ldtlist table { + border-collapse: collapse; + border-color: #ccc; + width:100%; +} +#ldtlist table caption{ + color:black; + font-size:15px; + font-weight:bold; + padding:5px; + text-align:left; + text-transform:uppercase; +} +#ldtlist td, th { + font-size: 11px; + line-height: 13px; + border-bottom: 1px solid #eee; + vertical-align: top; + padding: 5px; + font-family: "Lucida Grande", Verdana, Arial, sans-serif; +} + + +#ldtlist table thead { + color: #666; + padding: 2px 5px; + font-size: 13px; + background: #e1e1e1 url(../../admin/img/admin/nav-bg.gif) top left repeat-x; + border-left: 1px solid #ddd; + border-bottom: 1px solid #ddd; + white-space: nowrap; + vertical-align: middle; + font-weight: bold; + text-align: center; +} + +#ldtlist table tbody td { + border-left: 1px solid #ddd; + text-align: center; +} + +#ldtlist table tbody td:first-child { + border-left: 0; + border-right: 1px solid #ddd; + text-align: left; +} + +#ldtlist table tfoot { + color: #666; +} diff -r 40eddcc3d063 -r 3a30d255c235 web/ldt/media/css/ldtform.css --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/web/ldt/media/css/ldtform.css Sun Nov 14 20:25:22 2010 +0100 @@ -0,0 +1,140 @@ +@charset "UTF-8"; + +body { + min-width: 0; +} + +#add_content, #add_contribution { + padding: 10px; +} + + +#add_content input, #add_content textarea, #add_content select, +#add_contribution input, #add_contribution textarea, #add_contribution select +{ + background: #ededed; + width: 250px; +} + +#add_contribution input[type="checkbox"] { + width: auto; +} + + +#add_content textarea { + height : 125px; +} + +#add_content li { + list-style: none; +} + + +label { + display: block; + margin-top: 0.5em; +} + +#add_content .vDateField,#add_content .vTimeField { + width: 90px; + float: left; +} + +.projectscontentstitle { + border-bottom: 1px solid black; +} + +#submitcontent { + border-top: 1px solid black; + padding-top : 10px; +} + +#submitcontent-buttons { + text-align: right; +} + +#submitcontent-loader { + text-align: left; +} + +.submitcontent-loader-content { + display: none; +} + + +#submitcontent-loader-msg { + padding-left: 6px; +} + + +#submitcontent-buttons input[type="submit"], #submitcontent-buttons button { + background-color: #656565; + color: white; + width:auto; + font-weight: bold; + padding: 5px 10px; +} + +.datetimeshortcuts { + float: left; +} + +.ldtdatetime { + float: left; + width: 350px; +} + +.ldtdate,.ldttime { + float: left; + width: 150px; +} + +.ldtdatetitle,.ldttimetitle { + color: #666; +} + +#contentformhidden { + display: none; +} + +#contentformfields { + margin: 10px 0px; +} + +.cellcheckbox { + text-align: center; + width: 70 px; +} + +#contentslistheader { + padding: 1px 10px 1px 36px; +} + +#ldtcreatetablewrapperdiv { + height: 282px; +} + +#ldtcreatecontentstablediv { + max-height: 280px; +} + +#ldtcreatecontentslistcontainer { + padding: 5px 0px 20px 0px; + height: 300px; +} + +#media_fields_div { + width : 338px; + height : 50px; + margin-top: 10px 0px; + padding-left: 10px; + border: 1px solid #DDD; +} + +.error_message { + padding: 3em 2em; + font-size: larger; + font-weight: bold; +} + + diff -r 40eddcc3d063 -r 3a30d255c235 web/ldt/media/css/nyroModal.css --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/web/ldt/media/css/nyroModal.css Sun Nov 14 20:25:22 2010 +0100 @@ -0,0 +1,109 @@ +@charset "UTF-8"; + +div#nyroModalFull { + font-size: 12px; + color: #777; +} +div#nyroModalLoading { + border: 4px solid #777; + width: 150px; + height: 150px; + text-indent: -9999em; + background: #fff url(../img/ajax-loader-43x43.gif) no-repeat; + background-position: center; +} +div#nyroModalLoading.error { + border: 4px solid #f66; + line-height: 20px; + padding: 20px; + width: 300px; + height: 100px; + text-indent: 0; + background: #fff; +} +div#nyroModalWrapper { + background: #fff; + border-color: #777; + border-style: solid; + border-width: 24px 4px 4px 4px; +} +a#closeBut { + position: absolute; + display: block; + top: -19px; + right: 0px; + width: 16px; + height: 16px; + text-indent: -9999em; + background: url(../img/close.png) no-repeat; + outline: 0; +} +h1#nyroModalTitle { + margin: 0; + padding: 0; + position: absolute; + top: -22px; + left: 5px; + font-size: 12px; + color: #ddd; +} +div#nyroModalContent { + overflow: auto; +} +div.wrapper div#nyroModalContent { + padding: 5px; +} +div.wrapperImg div#nyroModalContent { + position: relative; + overflow: hidden; + text-align: center; +} +div.wrapperImg img { + vertical-align: baseline; +} +div.wrapperImg div#nyroModalContent div { + position: absolute; + bottom: 0; + left: 0; + background: black; + padding: 10px; + margin: 10px; + border: 1px white dotted; + overflow: hidden; + opacity: 0.2; + filter: alpha(opacity=20); +} +div.wrapperImg div#nyroModalContent div:hover { + opacity: 0.5; + filter: alpha(opacity=50); + cursor: help; +} +a.nyroModalPrev, a.nyroModalNext { + z-index: 105; + outline: none; + position: absolute; + top: 0; + height: 100%; + width: 40%; + cursor: pointer; + text-indent: -9999em; + background: left 20% no-repeat; + background-image: url(data:image/gif;base64,AAAA); /* Trick IE6 */ +} +div.wrapperSwf a.nyroModalPrev, div.wrapperSwf a.nyroModalNext, div.wrapper a.nyroModalPrev, div.wrapper a.nyroModalNext { + height: 60%; + width: 20%; +} +a.nyroModalPrev { + left: 0; +} +a.nyroModalPrev:hover { + background-image: url(../img/prev.gif); +} +a.nyroModalNext { + right: 0; + background-position: right 20%; +} +a.nyroModalNext:hover { + background-image: url(../img/next.gif); +} \ No newline at end of file diff -r 40eddcc3d063 -r 3a30d255c235 web/ldt/media/css/registration.css --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/web/ldt/media/css/registration.css Sun Nov 14 20:25:22 2010 +0100 @@ -0,0 +1,33 @@ +/* style for registration */ + +label.error { + float: none; + color: red; + padding-left: .5em; + vertical-align: middle; +} + +#login_links { + height: 127px; +} + +#login_links_list { + border-left: 1px solid black; + height: 90%; + padding-top: 6px; +} + +#login_links_list ul { + list-style: none; +} + + +#loginform_div ul { + list-style: none; +} + +#loginform_div label { + display: inline; + float: left; + width: 110px; +} diff -r 40eddcc3d063 -r 3a30d255c235 web/ldt/media/css/style.css --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/web/ldt/media/css/style.css Sun Nov 14 20:25:22 2010 +0100 @@ -0,0 +1,279 @@ +@charset "UTF-8"; + +body { + + font-family: Arial, Helvetica, sans serif; + font-size: 12px; + color: #4F5155; + margin: 5px; + padding: 0px; + min-width:750px; + text-align: justify; +} + +a img,a:link img, a:active img, a:visited img, a:hover img { + border:0px; +} + + +a:link +{ + text-decoration: none; + color: #2181b1; + text-decoration: none; + font-family: Arial, Helvetica, sans-serif; + /*font-weight: bold;*/ +} + +a:hover +{ + color: #2181b1; + text-decoration: none; + font-family: Arial, Helvetica, sans-serif; + /*border-bottom-width: 1px; + border-bottom-style: dashed; + border-bottom-color: #2c8084; + /*font-weight: bold;*/ +} +a:visited { + color: #2181b1; + font-family: Arial, Helvetica, sans-serif; + /*font-weight: bold;*/ +} + + +#header +{ + padding: .5em; + border-bottom: 1px solid gray; + border-left: 1px solid gray; + padding: 1em; +} + +#header a +{ + text-decoration: none; +} + + +#header_left +{ + max-width: 8em; + font-size: 40px; + font-weight : bold; + text-align: left; + text-transform: uppercase; +} + + +#header_left a:hover, #header_left a:visited, #header_left a:link, #header_left a:active, #header_left a:focus +{ + color: #4F5155; + text-decoration: none; +} + + +#header_right +{ + text-align: right; +} + +#header_right a:link +{ + text-decoration: none; + text-decoration: none; + color: white; +} + +#header_right a:hover +{ + text-decoration: none; + color: white; +} + +#header_right a:visited { + text-decoration: none; + color: white; +} + + +#footer +{ + clear: both; + margin: 0; + padding: .5em; + /*background-color: #ddd;*/ + border-top: 1px solid gray; +} + +.version +{ + text-align: right; + color: white; + font-size:9px; +} + +.version a:link +{ + text-decoration: none; + color: white; + text-decoration: bold; + font-weight: bold; + border-bottom-style: none; +} + +.version a:hover +{ + color: #2c8084; + text-decoration: none; + font-weight: bold; + border-bottom-width: 0px; + border-bottom-style: none; +} + +.version a:active +{ + color: white; + text-decoration: none; + font-weight: bold; + border-bottom-style: none; +} + +.version a:visited +{ + color: white; + font-weight: bold; + border-bottom-style: none; +} + +.small +{ + font-size:9px; +} + +.footer_img +{ + float: left; +} + +.footer_img img +{ + padding-left: 10px; + padding-right: 10px; +} + +.footer_img a +{ + color: white; +} + +.footer_img a:link +{ + color: white; +} + +.footer_img a:hover +{ + color: white; +} + +.footer_img a:visited +{ + color: white; +} + + +#home_links +{ + line-height: 150% +} + +#search_form_div { + text-align: center; + padding: 10px; + margin: 10px 10px; + margin-bottom: 30px; + background-color:#ececec; + border: 1px solid #7E7E7E +} + +#search_form ul { + list-style-type: none; + margin: 0; + padding: 0; +} + +#search_form ul li { + display: inline; +} + +#toolbar { + margin-top: 10px; + border-bottom: 3px solid #707070; +} + +#inner_content { + padding: 40px 0px 50px 0px; +} + +#loginstate { + text-align: right; +} + +.projectscontentstitle { + color: #949494; + font-family: Verdana; + font-weight: lighter; + font-size: 2.0em; + font-style: normal; + text-align: left; +} + + +#loginstate a, #loginstate a:hover, #loginstate a:visited, #loginstate a:link, #loginstate a:active { + color:#0063DC; + margin-right:4px; + text-decoration:none; +} + +#loginstate a:hover{ + text-decoration: underline; +} + +#loginstate ul { + margin:0; + padding:0; + float: left; +} +#loginstate li{ + display: inline; + padding:0; + margin:0; +} +#loginstate #user{ + color: #000000; + font-weight: bold; + margin-right:4px; +} +#loginstate ul .usertool a, +#loginstate ul .usertool a:link, +#loginstate ul .usertool a:visited { + color:#0063DC; + text-decoration:none; +} + +#loginstate ul .usertool a:hover { + color:#0063DC; + text-decoration:underline; +} + +.errorlist +{ + color: red; + font-size:12px +} + + + + + diff -r 40eddcc3d063 -r 3a30d255c235 web/ldt/media/css/style_base.css --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/web/ldt/media/css/style_base.css Sun Nov 14 20:25:22 2010 +0100 @@ -0,0 +1,202 @@ +body +{ font-family: Arial, Helvetica, sans serif; + padding: 0px; + margin: 0px; + background-color: #f9f9f9; + font-size: 12px; +} + +a +{ + color: #0045A3; + text-decoration:none; +} + +a:hover +{ + color: #990000; + text-decoration: underline; +} + +p +{ + font-size:12px; + font-weight:normal; + margin:0; + padding:0; +} + +th +{ + text-align: left; +} +.button +{ + margin: 3px 0; + margin-left: 25px; + background: #3366CC; + padding: 0 6px; + border-color: #6699CC #3366CC #3366CC #6699CC; + border-style: solid; + border-width: 1px 2px 2px 1px; + font-size: 13px; + font-style: normal; + font-weight: bold; + color: #ffffff; +} + +.errorlist +{ + color: red; + font-size:12px +} +#header +{ + background-color: #ffffcc; + height: 50px; +} + +#logo +{ +} + +#usertool +{ +} + +#loginstate +{ + color:#0045A3; +} + +#menu +{ + width: 200px; + vertical-align: top; +} + +#container +{ + width: 90%; + margin: 10px auto; + background-color: #fff; + color: #000; +} +} +#content +{ +} + +#footer +{ +} + +/* page login *//* +#loginarea +{ + margin: 0 auto; + margin-top: 100px; + overflow: hidden; + width: 362px; + border: 2px solid #CCCCCC; +} + +#loginarea .title +{ + font-size: 15px; + color: #FFFFFF; + background: #990000 scroll repeat left top; + font-weight:bold; + height:34px; + position: relative; + line-height: 34px; + overflow: hidden; + text-transform: uppercase; +} + +#loginarea .title div +{ + margin-left: 12px; +} + +#loginarea .login-form +{ + margin-top:20px; + margin-left:25px; +} + +#loginarea .login-form .inputbox +{ + font-size: 13px; + line-height:20px; + text-align: left; +} + +#loginarea .login-form label +{ + font-size: 14px; + font-weight: bold; +} +/* +#loginarea .login-form .button +{ + margin: 3px 0; + margin-left: 25px; + background: #3366CC; + padding: 0 6px; + border-color: #6699CC #3366CC #3366CC #6699CC; + border-style: solid; + border-width: 1px 2px 2px 1px; + font-size: 13px; + font-style: normal; + font-weight: bold; + color: #ffffff; +} + +#loginarea a +{ + font-size: 12px; + background:url("norm_left.gif") no-repeat left top; + padding:5px 15px; + margin: 5px; +} + +#nav { + float:left; + width:100%; + font-size:93%; + line-height:normal; + background:#828282 repeat-x scroll 0 0; + margin:0; + padding:0; + list-style:none; +} + +#nav a:link, +#nav a:visited { + color:#fff; + background:#828282 repeat-x scroll 0 0; + padding:20px 40px 4px 10px; + float:left; + width:auto; + border-right:1px solid #999999; +} + +#nav li a:hover { + color:#fff; + background:#999999 none repeat scroll 0 0; +} + +#space #nav-space a, #profile #nav-profile a +{ + background:#666666 none repeat scroll 0 0; +} + +#space #nav-space, #profile #nav-profile +{ + background:#666666 none repeat scroll 0 0; + color:#FFFFFF; +} +*/ + + diff -r 40eddcc3d063 -r 3a30d255c235 web/ldt/media/css/tabs.css --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/web/ldt/media/css/tabs.css Sun Nov 14 20:25:22 2010 +0100 @@ -0,0 +1,72 @@ +/* ----------------------------------------------------------------------- + Taken from: + + Tabs Plugin 0.2 for the Blueprint CSS Framework + http://blueprintcss.org + + * Copyright (c) 2008-Present. Refer to the main Blueprint license. + * See README for instructions on how to use this plugin. + * For credits and origins, see AUTHORS. + +----------------------------------------------------------------------- */ +@charset "UTF-8"; + +.tabs { + height:auto; + margin:0; + overflow:hidden; + padding-left:0; +} +* html .tabs { height:1%; /* fixing IE 6 */ } +.tabs li { + background: #707070 url("../img/tabsright_normal.png") no-repeat right center; + border-bottom:none; + float:left; + line-height:1.5; + list-style-type:none; + margin:0 ; + padding: 0 9px 0 0; + height: 29px; + +} +.tabs li a { + border-bottom:none; + color: #ffffff; + cursor:pointer; + display:block; + float:left; + margin: .5em 2em .5em 2em; + text-transform: capitalize; + font-weight: lighter; +} + +.tabs li.active { + background:#29aae3 url("../img/tabsright_active.png") no-repeat right center; +} + + +.tabs li a.selected { + background:#666; + border:1px solid #666; + border-bottom:none; + color:#fff; + cursor:default; +} +.tabs li a, .tabs li a:focus, .tabs li a:hover { + text-decoration:none; +} +.tabs li a:focus, .tabs li a:hover { + color:#555; + outline:none; +} +.tabs li a.selected:focus, .tabs li a.selected:hover { + color:#fafafa; +} +.tabs li.label { + border:none; + font-weight:bold; + line-height:1.5; + margin-right:.5em; + padding:.25em .33em .25em .33em; +} + diff -r 40eddcc3d063 -r 3a30d255c235 web/ldt/media/css/workspace.css --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/web/ldt/media/css/workspace.css Sun Nov 14 20:25:22 2010 +0100 @@ -0,0 +1,176 @@ +@charset "UTF-8"; + +.titlediv { + margin: 0px 0px 25px 0px; +} + + +.ldt_player_code { + width: 580px; + overflow: auto; + border-style: inset; + border: 1px solid silver; + margin: 10px 5px; + padding: 2px; +} + +.searchfielddiv { + top: 50%; + margin-top: 12px; +} + +.searchfield { + background: white; + border: 1px solid #b8b8b8; + -moz-border-radius: 15px; + -webkit-border-radius:15px; + -khtml-border-radius:15px; + border-radius: 15px; + padding: 2px 5px; +} + +.searchfield img { + vertical-align: middle; + margin-top: 5px; +} + +.searchfieldinput { + color: graytext; + font-style: italic; +} + + +input[type="text"].searchfieldinputbase { + border: none; +} + +.searchclear { + display: none; + float: right; +} + +.searchfieldinputbase { + background: #ffffff url("../img/search.gif") no-repeat left center; + width: 99px; + height: 14px; + margin: 0px 2px 0px 0px; + vertical-align: top; + padding-left: 20px; +} + + +.projectscontentsdiv { + overflow: hidden; + height: 570px; + +} +div.projectscontentsdiv table { + width: 470px; + height: 100%; + margin-bottom: 0; +} + +tr.projectscontentsoddline { + background: #ededed; +} + +tr.projectscontentsevenline { + background: white; +} + + +/* make the TH elements pretty */ +.projectscontentsheader { + background: #b5b5b5; + font-weight: bold; + text-transform:capitalize; + color: white; + padding: 1px 2px; + text-align: left; +} + + +#contentsheader { + padding: 1px 10px 1px 49px; +} + + +#projectsheader { + padding: 1px 10px 1px 93px; +} + +.contenttitle { + width: 411px; + padding: 4px 10px 4px 5px; +} + +.contenttitlelink,.contenttitlelink:link,.contenttitlelink:hover,.contenttitlelink:visited { + text-decoration: none; + color: #4F5155; +} + +.projecttitlelink,.projecttitlelink:link,.projecttitlelink:hover,.projecttitlelink:visited { + text-decoration: none; + color: #4F5155; +} + + +.projecttitle { + width: 367px; + padding: 4px 10px 4px 5px; +} + +.projectscontentsfooter { + background: #8c8c8c; + color: #ffffff; + margin-top: 18px; + font-size: 1.25em; + font-style: normal; + padding : 5px 5px; +} + +.projectscontentstablediv { + max-height: 500px; + overflow: auto; overflow-x: hidden; + border-bottom: 2px solid #b5b5b5 ; + float: left; +} +.projectscontentstablewrapperdiv { + height: 502px; +} + +.projectscontentsbody tr { + padding-right: 16px; +} + +.titlediv { + vertical-align: middle; +} + +.cellimg { + width: 18px; + text-align: center; + padding: 4px 2px 4px 2px; + cursor: pointer; cursor: hand; +} + +.cellimgdiv { + visibility: hidden; +} + +.searchajaxloader { + display: none; + float: right; + z-index: +1; +} + +a.content_link_create:link, a.content_link_create:visited, +a.ldt_link_create:link, a.ldt_link_create:visited { + color: white; + text-decoration: none; +} + +a.project_link_create:link, a.project_link_create:visited { + color: white; +} + diff -r 40eddcc3d063 -r 3a30d255c235 web/ldt/media/img/ajax-loader-16x16.gif Binary file web/ldt/media/img/ajax-loader-16x16.gif has changed diff -r 40eddcc3d063 -r 3a30d255c235 web/ldt/media/img/ajax-loader-220x19.gif Binary file web/ldt/media/img/ajax-loader-220x19.gif has changed diff -r 40eddcc3d063 -r 3a30d255c235 web/ldt/media/img/ajax-loader-43x43.gif Binary file web/ldt/media/img/ajax-loader-43x43.gif has changed diff -r 40eddcc3d063 -r 3a30d255c235 web/ldt/media/img/clear-left.png Binary file web/ldt/media/img/clear-left.png has changed diff -r 40eddcc3d063 -r 3a30d255c235 web/ldt/media/img/close.png Binary file web/ldt/media/img/close.png has changed diff -r 40eddcc3d063 -r 3a30d255c235 web/ldt/media/img/control_play.gif Binary file web/ldt/media/img/control_play.gif has changed diff -r 40eddcc3d063 -r 3a30d255c235 web/ldt/media/img/document_add.gif Binary file web/ldt/media/img/document_add.gif has changed diff -r 40eddcc3d063 -r 3a30d255c235 web/ldt/media/img/document_edit.gif Binary file web/ldt/media/img/document_edit.gif has changed diff -r 40eddcc3d063 -r 3a30d255c235 web/ldt/media/img/documents_duplicate.gif Binary file web/ldt/media/img/documents_duplicate.gif has changed diff -r 40eddcc3d063 -r 3a30d255c235 web/ldt/media/img/favicon.ico Binary file web/ldt/media/img/favicon.ico has changed diff -r 40eddcc3d063 -r 3a30d255c235 web/ldt/media/img/loadingAnimation.gif Binary file web/ldt/media/img/loadingAnimation.gif has changed diff -r 40eddcc3d063 -r 3a30d255c235 web/ldt/media/img/logo_IRI_footer.png Binary file web/ldt/media/img/logo_IRI_footer.png has changed diff -r 40eddcc3d063 -r 3a30d255c235 web/ldt/media/img/plugin.gif Binary file web/ldt/media/img/plugin.gif has changed diff -r 40eddcc3d063 -r 3a30d255c235 web/ldt/media/img/search.gif Binary file web/ldt/media/img/search.gif has changed diff -r 40eddcc3d063 -r 3a30d255c235 web/ldt/media/img/tabsright_active.png Binary file web/ldt/media/img/tabsright_active.png has changed diff -r 40eddcc3d063 -r 3a30d255c235 web/ldt/media/img/tabsright_normal.png Binary file web/ldt/media/img/tabsright_normal.png has changed diff -r 40eddcc3d063 -r 3a30d255c235 web/ldt/media/js/LdtPlayer.min.js --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/web/ldt/media/js/LdtPlayer.min.js Sun Nov 14 20:25:22 2010 +0100 @@ -0,0 +1,64 @@ +/* + * + * Copyright 2010 Institut de recherche et d'innovation + * contributor(s) : Samuel Huron + * + * contact@iri.centrepompidou.fr + * http://www.iri.centrepompidou.fr + * + * This software is a computer program whose purpose is to show and add annotations on a video . + * This software is governed by the CeCILL-C license under French law and + * abiding by the rules of distribution of free software. You can use, + * modify and/ or redistribute the software under the terms of the CeCILL-C + * license as circulated by CEA, CNRS and INRIA at the following URL + * "http://www.cecill.info". + * + * The fact that you are presently reading this means that you have had + * knowledge of the CeCILL-C license and that you accept its terms. +*/ +if(window.__IriSP===undefined)var __IriSP={};__IriSP.config={metadata:{format:"cinelab",src:"http://exp.iri.centrepompidou.fr/franceculture/franceculture/ldt/cljson/id/ef4dcc2e-8d3b-11df-8a24-00145ea4a2be",load:"jsonp"},gui:{width:650,height:0,mode:"radio",container:"LdtPlayer",debug:false,css:"../src/css/LdtPlayer.css"},player:{type:"jwplayer",src:"../res/swf/player.swf"},module:null}; +__IriSP.lib={jQuery:"http://ajax.googleapis.com/ajax/libs/jquery/1.4.2/jquery.min.js",jQueryUI:"http://ajax.googleapis.com/ajax/libs/jqueryui/1.8.4/jquery-ui.min.js",jQueryToolTip:"http://cdn.jquerytools.org/1.2.4/all/jquery.tools.min.js",swfObject:"http://ajax.googleapis.com/ajax/libs/swfobject/2.2/swfobject.js",cssjQueryUI:"http://ajax.googleapis.com/ajax/libs/jqueryui/1.8.4/themes/base/jquery-ui.css"};__IriSP.LdtShareTool="\n\n \n \n \n "; +__IriSP.MyLdt=null;__IriSP.MyTags=null;__IriSP.MyApiPlayer=null;__IriSP.player=null;__IriSP.Durration=null;__IriSP.playerLdtWidth=null;__IriSP.playerLdtHeight=null; +__IriSP.init=function(a){function b(){var f=document.createElement("script");f.setAttribute("type","text/javascript");f.setAttribute("src",__IriSP.lib.jQueryToolTip);f.onload=c;f.onreadystatechange=function(){if(this.readyState=="complete"||this.readyState=="loaded")c("jquery.tools.min.js loded")};var i=document.createElement("script");i.setAttribute("type","text/javascript");i.setAttribute("src",__IriSP.lib.swfObject);i.onload=c;i.onreadystatechange=function(){if(this.readyState=="complete"||this.readyState== +"loaded")c("swfobject.js loded")};var j=document.createElement("script");j.setAttribute("type","text/javascript");j.setAttribute("src",__IriSP.lib.jQueryUI);j.onload=c;j.onreadystatechange=function(){if(this.readyState=="complete"||this.readyState=="loaded")c("jquery-ui.min.js loded")};(document.getElementsByTagName("head")[0]||document.documentElement).appendChild(f);(document.getElementsByTagName("head")[0]||document.documentElement).appendChild(j);(document.getElementsByTagName("head")[0]||document.documentElement).appendChild(i)} +function c(){g+=1;g===3&&d()}function d(){__IriSP.jQuery=window.jQuery.noConflict(true);__IriSP.jQuery(document).ready(function(f){var i=__IriSP.jQuery("",{rel:"stylesheet",type:"text/css",href:__IriSP.lib.cssjQueryUI,"class":"dynamic_css"}),j=__IriSP.jQuery("",{rel:"stylesheet",type:"text/css",href:__IriSP.config.gui.css,"class":"dynamic_css"});i.appendTo("head");j.appendTo("head");f.browser.msie&&f(".dynamic_css").clone().appendTo("head");__IriSP.createMyHtml();__IriSP.jQuery.ajax({dataType:"jsonp", +url:h,success:function(e){__IriSP.trace("ajax","success");if(e==="")alert("ERREUR DE CHARGEMENT JSON");else{new __IriSP.Media(e.medias[0].id,e.medias[0].href,e.medias[0].meta["dc:duration"],e.medias[0]["dc:title"],e.medias[0]["dc:description"]);__IriSP.trace("__IriSP.MyApiPlayer",__IriSP.config.gui.width+" "+__IriSP.config.gui.height+" "+e.medias[0].href+" "+e.medias[0].meta["dc:duration"]+" "+e.medias[0].meta.item.value);__IriSP.MyApiPlayer=new __IriSP.APIplayer(__IriSP.config.gui.width,__IriSP.config.gui.height, +e.medias[0].href,e.medias[0].meta["dc:duration"],e.medias[0].meta.item.value);__IriSP.trace("__IriSP.init.main","__IriSP.Ligne");__IriSP.MyLdt=new __IriSP.Ligne(e["annotation-types"][0].id,e["annotation-types"][0]["dc:title"],e["annotation-types"][0]["dc:description"],e.medias[0].meta["dc:duration"]);__IriSP.trace("__IriSP.init.main","__IriSP.Tags");__IriSP.MyTags=new __IriSP.Tags(e.tags);__IriSP.jQuery.each(e.annotations,function(l,k){k.meta["id-ref"]==__IriSP.MyLdt.id&&__IriSP.MyLdt.addAnnotation(k.id, +k.begin,k.end,k.media,k.content.title,k.content.description,k.content.color,k.tags)});__IriSP.jQuery.each(e.lists,function(){__IriSP.trace("lists","")});__IriSP.jQuery.each(e.views,function(){__IriSP.trace("views","")})}},error:function(e){alert("ERROR : "+e)}})})}__IriSP.config=a;var h=__IriSP.config.metadata.src;__IriSP.jQuery=null;if(window.jQuery===undefined||window.jQuery.fn.jquery!=="1.4.2"){a=document.createElement("script");a.setAttribute("type","text/javascript");a.setAttribute("src",__IriSP.lib.jQuery); +a.onload=b;a.onreadystatechange=function(){if(this.readyState=="complete"||this.readyState=="loaded")b()};(document.getElementsByTagName("head")[0]||document.documentElement).appendChild(a)}else{__IriSP.jQuery=window.jQuery;b()}var g=0}; +__IriSP.createMyHtml=function(){var a=__IriSP.config.gui.width;__IriSP.jQuery("
    \n\t
    \n\t\tGet flash to see this player\t\n\t
    \n\t
    \n\t\t
    \n\t\t\t\n\t\t\t\n\t\t
    \n\t\t
    \n\t\t\t
    \n\t
    \n\t\t
    \n\t\t\t\n\t\t\t\n\t\t
    \n
     
    \n
    \n \t
    \n
    \n
    \n
    \n
    \n\t
    \n\t\t
    \n\t\t
    \n \t\t