# HG changeset patch # User ymh # Date 1276004675 -7200 # Node ID ae85932878830eab8a6154912678b6966c5e504a # Parent 7c994c98d1df3766bc8b1406b84e89a044075c3b correct error changing ldt.ldt to ldt.ldt_utils diff -r 7c994c98d1df -r ae8593287883 web/ldt/.htaccess.tmpl --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/web/ldt/.htaccess.tmpl Tue Jun 08 15:44:35 2010 +0200 @@ -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 7c994c98d1df -r ae8593287883 web/ldt/__init__.py --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/web/ldt/__init__.py Tue Jun 08 15:44:35 2010 +0200 @@ -0,0 +1,3 @@ +VERSION = (0,1) + +VERSION_STR = unicode(".".join(map(lambda i:"%02d" % (i,), VERSION))) diff -r 7c994c98d1df -r ae8593287883 web/ldt/admin.py --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/web/ldt/admin.py Tue Jun 08 15:44:35 2010 +0200 @@ -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 7c994c98d1df -r ae8593287883 web/ldt/core/__init__.py diff -r 7c994c98d1df -r ae8593287883 web/ldt/core/handlers/__init__.py diff -r 7c994c98d1df -r ae8593287883 web/ldt/core/handlers/modpython.py --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/web/ldt/core/handlers/modpython.py Tue Jun 08 15:44:35 2010 +0200 @@ -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 7c994c98d1df -r ae8593287883 web/ldt/core/models.py --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/web/ldt/core/models.py Tue Jun 08 15:44:35 2010 +0200 @@ -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 7c994c98d1df -r ae8593287883 web/ldt/core/tests.py --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/web/ldt/core/tests.py Tue Jun 08 15:44:35 2010 +0200 @@ -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 7c994c98d1df -r ae8593287883 web/ldt/core/views.py --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/web/ldt/core/views.py Tue Jun 08 15:44:35 2010 +0200 @@ -0,0 +1,1 @@ +# Create your views here. diff -r 7c994c98d1df -r ae8593287883 web/ldt/ldt_utils/__init__.py --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/web/ldt/ldt_utils/__init__.py Tue Jun 08 15:44:35 2010 +0200 @@ -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 7c994c98d1df -r ae8593287883 web/ldt/ldt_utils/admin.py --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/web/ldt/ldt_utils/admin.py Tue Jun 08 15:44:35 2010 +0200 @@ -0,0 +1,80 @@ +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/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/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) diff -r 7c994c98d1df -r ae8593287883 web/ldt/ldt_utils/contentindexer.py --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/web/ldt/ldt_utils/contentindexer.py Tue Jun 08 15:44:35 2010 +0200 @@ -0,0 +1,238 @@ +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 xml +import xml.dom +import xml.dom.minidom +import xml.dom.ext +import xml.xpath +import fnmatch +import Ft +import uuid +import shutil +import lucene +from ldt.ldt_utils import STORE +from ldt.ldt_utils import ANALYZER + +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 = xml.dom.minidom.parse(filepath) + doc = Ft.Xml.Domlette.ConvertDocument(doc) + + self.__writer.deleteDocuments(lucene.Term("iri_id", content.iri_id)) + + con = xml.xpath.Context.Context(doc, 1, 1, None) + res = xml.xpath.Evaluate("/iri/body/ensembles/ensemble", context=con) + + for ensemble in res: + ensembleId = ensemble.getAttributeNS("id",None) + + for decoupageNode in ensemble.childNodes: + if decoupageNode.nodeType != xml.dom.Node.ELEMENT_NODE or decoupageNode.tagName != "decoupage" or decoupageNode.getAttributeNS("id",None) in self.decoupage_blacklist: + continue + + decoupId = decoupageNode.getAttributeNS("id",None) + res = xml.xpath.Evaluate("elements/element", decoupageNode) + for elementNode in res: + doc = lucene.Document() + elementId = elementNode.getAttributeNS("id",None) + tags = elementNode.getAttributeNS("tags",None) + + if tags is not None: + tags.replace(",", ";") + + if tags is None or len(tags) == 0: + tags = "" + restagnode = xml.xpath.Evaluate("tag/text()", elementNode) + for tagnode in restagnode: + tags = tags + " ; " + tagnode.data + + if tags is None or len(tags) == 0: + tags = "" + restagnode = xml.xpath.Evaluate("tags/tag/text()", elementNode) + for tagnode in restagnode: + tags = tags + " ; " + tagnode.data + + title = "" + for txtRes in xml.xpath.Evaluate("title/text()", elementNode): + title = title + txtRes.data + + abstract = "" + for txtRes in xml.xpath.Evaluate("abstract/text()", elementNode): + abstract = abstract + txtRes.data + + 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 = xml.dom.minidom.parseString(project.ldt) + doc = Ft.Xml.Domlette.ConvertDocument(doc) + + self.__writer.deleteDocuments(lucene.Term("iri_id", project.iri_id)) + + con = xml.xpath.Context.Context(doc, 1, 1, None) + res = xml.xpath.Evaluate("/iri/annotations/content", context=con) + + for content in res: + contentId = content.getAttributeNS("id",None) + + ensembleId = "ens_perso" + + for decoupageNode in content.childNodes: + # pocketfilms.utils.log.debug("Indexing content decoupage : "+ repr(decoupageNode.nodeType) + " in " + repr(self.decoupage_blacklist)) + if decoupageNode.nodeType != xml.dom.Node.ELEMENT_NODE or decoupageNode.tagName != "decoupage" or decoupageNode.getAttributeNS("id",None) in self.decoupage_blacklist: + continue + + decoupId = decoupageNode.getAttributeNS("id",None) + res = xml.xpath.Evaluate("elements/element", decoupageNode) + for elementNode in res: + doc = lucene.Document() + elementId = elementNode.getAttributeNS("id",None) + tags = elementNode.getAttributeNS("tags",None) + + if tags is not None: + tags.replace(",", ";") + + if tags is None or len(tags) == 0: + tags = "" + restagnode = xml.xpath.Evaluate("tag/text()", elementNode) + for tagnode in restagnode: + tags = tags + " ; " + tagnode.data + + if tags is None or len(tags) == 0: + tags = "" + restagnode = xml.xpath.Evaluate("tags/tag/text()", elementNode) + for tagnode in restagnode: + tags = tags + " ; " + tagnode.data + + title = "" + for txtRes in xml.xpath.Evaluate("title/text()", elementNode): + title = title + txtRes.data + + abstract = "" + for txtRes in xml.xpath.Evaluate("abstract/text()", elementNode): + abstract = abstract + txtRes.data + + 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 7c994c98d1df -r ae8593287883 web/ldt/ldt_utils/fileimport.py --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/web/ldt/ldt_utils/fileimport.py Tue Jun 08 15:44:35 2010 +0200 @@ -0,0 +1,379 @@ +import tempfile +import os.path +import shutil +from django.core.exceptions import ObjectDoesNotExist +from ldt.utils import zipfileext +from django.conf import settings +from models import Content +import xml.dom.minidom +import xml.dom.ext #@UnresolvedImport +import xml.xpath #@UnresolvedImport +import fnmatch +import uuid +import urllib + +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) + doc = xml.dom.minidom.parse(url) + doc = Ft.Xml.Domlette.ConvertDocument(doc) + con = xml.xpath.Context.Context(doc, 1, 1, None) + #open .iri and get the title + res = xml.xpath.Evaluate("/iri/head/meta[@name='title']/@content", context=con) + self.title = res[0].value + + #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) + + con = xml.xpath.Context.Context(doc, 1, 1, None) + + res = xml.xpath.Evaluate("/iri/head/meta[@name='title']/@content", context=con) + self.title = res[0].value + + res = xml.xpath.Evaluate("/iri/body/ensembles",context=con) + ensemblesnode = res[0] + + ensembleids = [] + + for node in ensemblesnode.childNodes: + if node.nodeType == xml.dom.Node.ELEMENT_NODE and node.tagName == "ensemble": + id = node.getAttributeNS("id",None) + if id not in ensembleids: + ensembleids.append(id) + + if self.annotations is not None: + newEnsemble = None + for cnode in self.annotations.childNodes: + if cnode.nodeType == xml.dom.Node.ELEMENT_NODE and cnode.tagName == "decoupage": + if newEnsemble is None: + newensemble = doc.createElement('ensemble') + ensembleid = self.id+"_"+str(uuid.uuid1()) + newensemble.setAttributeNS(None,'id',ensembleid) + + newensemble.setAttributeNS(None,'title', self.annotations.getAttribute('title')) + newensemble.setAttributeNS(None,'author', self.annotations.getAttribute('author')) + newensemble.setAttributeNS(None,'date', self.annotations.getAttribute('date')) + newensemble.setAttributeNS(None,'abstract', self.annotations.getAttribute('abstract')) + ensemblesnode.appendChild(newensemble) + ensembleids.append(ensembleid) + newDecoupageNode = cnode.cloneNode(True) + newensemble.appendChild(newDecoupageNode) + elif cnode.nodeType == xml.dom.Node.ELEMENT_NODE and cnode.tagName == "ensemble": + ensembleid = cnode.getAttribute(u"id") + cloneNode = cnode.cloneNode(True) + if ensembleid in ensembleids: + ensembleid = self.id+"_"+str(uuid.uuid1()) + cloneNode.setAttribute(u"id", ensembleid) + ensembleids.append(ensembleid) + ensemblesnode.appendChild(cloneNode) + + res = xml.xpath.Evaluate("/iri/body/medias/media[@id='video']/video", context=con) + if self.flatten: + src_video = res[0].getAttribute('src') + self.videourl = os.path.basename(src_video) + res[0].setAttributeNS(None,'src', self.videourl) + self.duration = res[0].getAttributeNS(None, 'dur') + + f = open(path, "w") + try: + 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): + #if 'http' in self.src: + # url = self.src + #else: + # url = self.id + u"/" + os.path.basename(self.src) + content, self.created = Content.objects.get_or_create(iri_id=self.id, defaults = {'iriurl': self.src, 'title':self.title, 'description':self.desc, 'videopath': self.videopath}) + if not self.created: + content.iriurl = self.src + content.title = self.title + content.description = self.desc + content.save() + + content.iriurl = self.src + content.videopath = self.videopath.rstrip("/") + "/" + + content.iri = self.id + u"/" + os.path.basename(self.src) + content.title = self.title + content.description = self.desc + content.duration = int(self.duration) + 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 = {} + if ldtpath: + doc = xml.dom.minidom.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) + for pnode in result: + author = pnode.getAttributeNS("user",None) + if author: + self.author = unicode(author) + break + + result = xml.xpath.Evaluate("/iri/medias/media", context=con) + + for i, medianode in enumerate(result): + # get iri file's id from file ldt + id = medianode.attributes['id'].value + 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 + if medianode.attributes['video'].value !="": + contents[id].videopath = medianode.attributes['video'].value + elif self.videopath !="" or self.videopath: + contents[id].videopath = self.videopath + else: + contents[id].videopath =settings.STREAM_URL + + + #get annotation of file ldt + result = xml.xpath.Evaluate("/iri/annotations/content", context=con) + + for contentnode in result: + id = contentnode.attributes['id'].value + # pocketfilms.utils.log.debug("ID : " + str(id)) + if contents.has_key(id): + if self.author: + contentnode.setAttributeNS(None,"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): + # pocketfilms.utils.log.debug("folder stack length : "+ str(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)): + # pocketfilms.utils.log.debug("Push folder : " + entryPath) + foldersToProcess.append(entryPath) + elif fnmatch.fnmatch(entry, "*.ldt"): + # pocketfilms.utils.log.debug("Process file : " + entryPath) + 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 7c994c98d1df -r ae8593287883 web/ldt/ldt_utils/forms.py --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/web/ldt/ldt_utils/forms.py Tue Jun 08 15:44:35 2010 +0200 @@ -0,0 +1,29 @@ +from django import forms +from models import Project, Content +import uuid + +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() + +class CopyProjectForm (forms.Form): + title = forms.CharField() diff -r 7c994c98d1df -r ae8593287883 web/ldt/ldt_utils/models.py --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/web/ldt/ldt_utils/models.py Tue Jun 08 15:44:35 2010 +0200 @@ -0,0 +1,124 @@ +from django.db import models +from django.conf import settings +from ldt.core.models import Document, Owner +from django.utils.translation import ugettext_lazy as _ +from utils import create_ldt, copy_ldt +import uuid + +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 + + +class Content(models.Model): + iri_id = models.CharField(max_length=1024, unique=True) + iriurl = models.URLField() + videopath = models.URLField(null=True, blank=True) + creation_date = models.DateTimeField(auto_now_add=True) + update_date = models.DateTimeField(auto_now=True) + title = models.CharField(max_length=1024, null=True, blank=True) + description = models.TextField(null=True, blank=True) + external_id = models.CharField(max_length=1024, null=True, blank=True) + authors = models.ManyToManyField(Author) + duration = models.IntegerField(null=True, blank=True) + + def get_duration(self): + if self.duration is None: + doc = xml.dom.minidom.parse(self.iri_file_path()) + doc = Ft.Xml.Domlette.ConvertDocument(doc) + con = xml.xpath.Context.Context(doc, 1, 1, None) + res = xml.xpath.Evaluate("/iri/body/medias/media[@id='video']/video", context=con) + self.duration = int(res[0].getAttributeNS(None, 'dur')) + self.save() + return self.duration + + def delete(self): + super(Content, self).delete() + writer = lucene.IndexWriter(STORE, ANALYZER, True, lucene.IndexWriter.MaxFieldLength.UNLIMITED) + writer.deleteDocuments(lucene.Term("iri_id", self.iri_id)) + writer.commit() + + def __unicode__(self): + return str(self.id) + ": " + self.iri_id + + def iri_url(self, web_url=settings.WEB_URL): + if 'http' in self.iriurl or 'https' in self.iriurl: + return self.iriurl + else: + return unicode(web_url) + unicode(settings.MEDIA_URL)+u"media/ldt/"+unicode(self.iriurl) + + +class Project(Document): + STATE_CHOICES=( + (1, 'edition'), + (2, 'published'), + (3, 'moderated'), + (4, 'rejected'), + (5, 'deleted') + ) + ldt_id = models.CharField(max_length=1024, unique=True) + ldt = models.TextField(null=True) + title = models.CharField(max_length=1024) + contents = models.ManyToManyField(Content) + creation_date = models.DateTimeField(auto_now_add=True) + modification_date = models.DateTimeField(auto_now=True) + created_by = models.CharField(_("created by"), max_length=70) + changed_by = models.CharField(_("changed by"), max_length=70) + state = models.IntegerField(choices=STATE_CHOICES, default=1) + + def __unicode__(self): + return unicode(self.id) + u": " + unicode(self.ldt_id) + + @staticmethod + def create_project(user, title, contents): + owner = Owner.objects.get(user=user) + project = Project(title=title, owner=owner) + project.ldt_id = str(uuid.uuid1()) + project.created_by=user.username + project.changed_by=user.username + project.state = 1 + project.save() + for content in contents: + project.contents.add(content) + project.save() + return create_ldt(project, user) + + def copy_project(self, user, title): + owner = Owner.objects.get(user=user) + project = Project(title=title, owner=owner) + project = copy_ldt(self, project, user) + project.save() + for content in self.contents.all(): + project.contents.add(content) + project.save() + return project + +class Segment(models.Model): + + project_obj = models.ForeignKey(Project, null=True) + content = models.ForeignKey(Content) + project_id = models.CharField(max_length=1024, unique=False, blank=True, null=True) + iri_id = models.CharField(max_length=1024, unique=False) + ensemble_id = models.CharField(max_length=1024, unique=False) + cutting_id = models.CharField(max_length=1024, unique=False) + element_id = models.CharField(max_length=1024, unique=False) + tags = models.CharField(max_length=2048, unique=False, null=True, blank=True) + title = models.CharField(max_length=2048, unique=False, null=True, blank=True) + duration = models.IntegerField(null=True) + start_ts = models.IntegerField(null=True) + author = models.CharField(max_length=1024, unique=False, null=True, blank=True) + date = models.CharField(max_length=128, unique=False, null=True, blank=True) + abstract = models.TextField(null=True, blank=True) + + def __unicode__(self): + return "/".join((unicode(self.project_id), unicode(self.iri_id), unicode(self.ensemble_id), unicode(self.cutting_id), unicode(self.element_id))) + + class Meta: + unique_together = (('project_id', 'iri_id', 'ensemble_id', 'cutting_id', 'element_id'),) + diff -r 7c994c98d1df -r ae8593287883 web/ldt/ldt_utils/projectindexer.py --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/web/ldt/ldt_utils/projectindexer.py Tue Jun 08 15:44:35 2010 +0200 @@ -0,0 +1,110 @@ +import tempfile +import os +import os.path +import shutil +import ldt.utils.xml +from ldt import settings +import xml +import xml.dom +import xml.dom.minidom +import xml.dom.ext +import xml.xpath +import lucene +from ldt.ldt_utils import STORE +from ldt.ldt_utils import ANALYZER + +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 = xml.dom.minidom.parseString(ldt.encode( "utf-8" )) + + self.__writer.deleteDocuments(lucene.Term("ldt_id", project.ldt_id)) + + con = xml.xpath.Context.Context(doc, 1, 1, None) + res = xml.xpath.Evaluate("/iri/annotations/content", context=con) + + for content in res: + contentId = content.getAttribute("id") + + res =xml.xpath.Evaluate("ensemble", content) + for ensemble in res: + ensembleId = ensemble.getAttribute("id") + + for decoupageNode in ensemble.childNodes: + # ldt.utils.log.debug("Indexing project decoupage : "+ repr(decoupageNode.nodeType) + " in " + repr(self.decoupage_blacklist)) + if decoupageNode.nodeType != xml.dom.Node.ELEMENT_NODE or decoupageNode.tagName != "decoupage" or decoupageNode.getAttribute("id") in self.decoupage_blacklist: + continue + + decoupId = decoupageNode.getAttribute("id") + res = xml.xpath.Evaluate("elements/element", decoupageNode) + for elementNode in res: + doc = lucene.Document() + elementId = elementNode.getAttribute("id") + tags = elementNode.getAttribute("tags") + + if tags is not None: + tags.replace(",", ";") + + if tags is None or len(tags) == 0: + tags = "" + restagnode = xml.xpath.Evaluate("tag/text()", elementNode) + for tagnode in restagnode: + tags = tags + " ; " + tagnode.data + + if tags is None or len(tags) == 0: + tags = "" + restagnode = xml.xpath.Evaluate("tags/tag/text()", elementNode) + for tagnode in restagnode: + tags = tags + " ; " + tagnode.data + + title = "" + for txtRes in xml.xpath.Evaluate("title/text()", elementNode): + title = title + txtRes.data + + abstract = "" + for txtRes in xml.xpath.Evaluate("abstract/text()", elementNode): + abstract = abstract + txtRes.data + + doc.add(lucene.Field("ldt_id", project.ldt_id, lucene.Field.Store.YES, lucene.Field.Index.UN_TOKENIZED)) + doc.add(lucene.Field("iri_id", contentId, lucene.Field.Store.YES, lucene.Field.Index.UN_TOKENIZED)) + 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.TOKENIZED)) + doc.add(lucene.Field("title", title, lucene.Field.Store.NO, lucene.Field.Index.TOKENIZED)) + doc.add(lucene.Field("abstract", abstract, lucene.Field.Store.NO, lucene.Field.Index.TOKENIZED)) + doc.add(lucene.Field("all", " ".join([tags, title, abstract]), lucene.Field.Store.NO, lucene.Field.Index.TOKENIZED)) + + self.__writer.addDocument(doc) + + self.__writer.flush() \ No newline at end of file diff -r 7c994c98d1df -r ae8593287883 web/ldt/ldt_utils/templates/admin/ldt/app_action.html --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/web/ldt/ldt_utils/templates/admin/ldt/app_action.html Tue Jun 08 15:44:35 2010 +0200 @@ -0,0 +1,7 @@ +{% extends "admin/base_site.html" %} {% load i18n %} {% block +breadcrumbs %} + +{% endblock %} + diff -r 7c994c98d1df -r ae8593287883 web/ldt/ldt_utils/templates/admin/ldt/app_index.html --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/web/ldt/ldt_utils/templates/admin/ldt/app_index.html Tue Jun 08 15:44:35 2010 +0200 @@ -0,0 +1,25 @@ +{% extends "admin/app_index.html" %} {% load i18n %} {% block content %} +{{ block.super }} + +
+ + + + + + + + + + +
Import
Import + an ldt 
Reindex +  
+
+ +{% endblock %} diff -r 7c994c98d1df -r ae8593287883 web/ldt/ldt_utils/templates/admin/ldt/content/reindex_form.html --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/web/ldt/ldt_utils/templates/admin/ldt/content/reindex_form.html Tue Jun 08 15:44:35 2010 +0200 @@ -0,0 +1,22 @@ +{% extends "admin/ldt/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 7c994c98d1df -r ae8593287883 web/ldt/ldt_utils/templates/admin/ldt/content/search_form.html --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/web/ldt/ldt_utils/templates/admin/ldt/content/search_form.html Tue Jun 08 15:44:35 2010 +0200 @@ -0,0 +1,13 @@ +{% extends "base.html" %} {% block content %} + +
+ + + {{ form.as_table }} +
+
+ + +{% endblock %} diff -r 7c994c98d1df -r ae8593287883 web/ldt/ldt_utils/templates/admin/ldt/content/upload_form.html --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/web/ldt/ldt_utils/templates/admin/ldt/content/upload_form.html Tue Jun 08 15:44:35 2010 +0200 @@ -0,0 +1,26 @@ +{% extends "admin/ldt/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 7c994c98d1df -r ae8593287883 web/ldt/ldt_utils/templates/iriuser/ldt/copy_ldt.html --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/web/ldt/ldt_utils/templates/iriuser/ldt/copy_ldt.html Tue Jun 08 15:44:35 2010 +0200 @@ -0,0 +1,18 @@ +{% load i18n %} {# form of copy of project ldt #} + + + + + + + +
+
{% trans "Copy your project" %}
+
{% csrf_token %}
+
+ + diff -r 7c994c98d1df -r ae8593287883 web/ldt/ldt_utils/templates/iriuser/ldt/create_ldt.html --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/web/ldt/ldt_utils/templates/iriuser/ldt/create_ldt.html Tue Jun 08 15:44:35 2010 +0200 @@ -0,0 +1,29 @@ +{% load i18n %} {# form of creation of project ldt #} + + + + + + + +
+
{% trans "Create your project" %}
+
{% +csrf_token %} + +
{% trans "List of contents" %}
+
    + {% for content in contents %} +
  • {{content.iri_id}}
  • + {% endfor %} +
+ +
+
+ + diff -r 7c994c98d1df -r ae8593287883 web/ldt/ldt_utils/templates/iriuser/ldt/init_ldt.html --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/web/ldt/ldt_utils/templates/iriuser/ldt/init_ldt.html Tue Jun 08 15:44:35 2010 +0200 @@ -0,0 +1,51 @@ + + + + + + + +Ligne de Temps - IRI + + + + + + +
 
+ + + diff -r 7c994c98d1df -r ae8593287883 web/ldt/ldt_utils/templates/iriuser/ldt/ldt_list.html --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/web/ldt/ldt_utils/templates/iriuser/ldt/ldt_list.html Tue Jun 08 15:44:35 2010 +0200 @@ -0,0 +1,80 @@ +{% extends "ldt/user/user_base.html" %} {# list of projects ldt #} {% +load i18n %} {% block js_import %}{{ block.super }} + + +{% endblock %} {% block css_import %} {{ block.super }} + +{% endblock %} {% block breadcrumb %} +
  • +
  • {% trans +"Space" %}
  • +
  • {% trans "Ldt Project" %}
  • +{% endblock %} {% block content_title %}{% trans "Ldt Project" %}{% +endblock %} {% block iricontent %} +
    {% +trans 'Create new project'%} + + + + + + + + + + {% for ldt in ldtProjects %} + + + {% ifequal ldt.state 2%} + + {% else %} + + {% endifequal %} + + {% endfor %} + +
    {% trans "Project" %}
    {% trans "title" %}{% trans " published" %}
    {{ ldt.title }}TrueFalse
    +
    +{% endblock %} + diff -r 7c994c98d1df -r ae8593287883 web/ldt/ldt_utils/templates/iriuser/ldt/loading.html --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/web/ldt/ldt_utils/templates/iriuser/ldt/loading.html Tue Jun 08 15:44:35 2010 +0200 @@ -0,0 +1,26 @@ + + + + + + + +
    +
    loading
    +
    + + diff -r 7c994c98d1df -r ae8593287883 web/ldt/ldt_utils/templates/iriuser/ldt/save_done.html --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/web/ldt/ldt_utils/templates/iriuser/ldt/save_done.html Tue Jun 08 15:44:35 2010 +0200 @@ -0,0 +1,5 @@ +

    done

    +

    {{ldt}} +

    +

    {{id}}

    +

    title:{{title}}

    \ No newline at end of file diff -r 7c994c98d1df -r ae8593287883 web/ldt/ldt_utils/tests.py --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/web/ldt/ldt_utils/tests.py Tue Jun 08 15:44:35 2010 +0200 @@ -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 7c994c98d1df -r ae8593287883 web/ldt/ldt_utils/urls.py --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/web/ldt/ldt_utils/urls.py Tue Jun 08 15:44:35 2010 +0200 @@ -0,0 +1,35 @@ +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'^searchInit/(?P.*)/(?P.*)$', 'views.searchInit'), + url(r'^searchForm/$', 'views.searchForm'), + url(r'^search/$', 'views.searchIndex'), + url(r'^search/(?P.*)/(?P.*)$', 'views.searchIndexGet'), + url(r'^searchLdt/(?P.*)/(?P.*)$', 'views.searchLdt'), + url(r'^searchSeg/(?P.*)/(?P.*)$', 'views.searchSegments'), + url(r'^index/(?P.*)$', 'views.index'), + url(r'^init/(?P.*)/(?P.*)$', 'views.init'), + url(r'^ldt/(?P.*)$', 'views.ldt'), + url(r'^search/loading/$', 'views.loading'), + url(r'^create/(?P.*)$', 'views.create_project'), + url(r'^copy/(?P.*)$', 'views.copy_project'), +) + +if test_ldt(): + urlpatterns += patterns('ldt.ldt_utils', + url(r'^space/ldt/$', 'views.list_ldt'), + url(r'^space/ldt/indexproject/(?P.*)$', 'views.indexProject'), + url(r'^space/ldt/init/(?P.*)/(?P.+)$', 'views.init'), + url(r'^space/ldt/project/(?P.*)$', 'views.ldtProject'), + url(r'^space/ldt/create/$', 'views.create_ldt_view'), + url(r'^space/ldt/created_done/$', 'views.created_ldt'), + url(r'^space/ldt/save/$', 'views.save_ldtProject'), + url(r'^space/ldt/publish/(?P.*)$', 'views.publish'), + url(r'^space/ldt/unpublish/(?P.*)$', 'views.unpublish'), + +) diff -r 7c994c98d1df -r ae8593287883 web/ldt/ldt_utils/utils.py --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/web/ldt/ldt_utils/utils.py Tue Jun 08 15:44:35 2010 +0200 @@ -0,0 +1,267 @@ +import lucene +from ldt.ldt_utils import STORE +from ldt.ldt_utils import ANALYZER +from Ft.Xml import MarkupWriter +import uuid +import django.core.urlresolvers +from django.conf import settings +import urllib +import xml.dom +import xml.dom.minidom +import xml.dom.ext +import xml.xpath +import os +import os.path + +class LdtSearch(object): + + def query(self, field, query): + indexSearcher = lucene.IndexSearcher(STORE) + queryParser = lucene.QueryParser(lucene.Version.LUCENE_30, field, lucene.FrenchAnalyzer(lucene.Version.LUCENE_30)) + queryParser.setDefaultOperator(lucene.QueryParser.Operator.AND) + queryObj = queryParser.parse(query) + hits = indexSearcher.search(queryObj, settings.LDT_MAX_SEARCH_NUMBER) + + res = [] + for hit in hits.scoreDocs: + doc = indexSearcher.doc(hit.doc) + res.append({"iri_id":doc.get("iri_id"),"ensemble_id":doc.get("ensemble_id"),"decoupage_id":doc.get("decoupage_id"), "element_id":doc.get("element_id")}) + indexSearcher.close() + return res + + def queryAll(self, query): + return self.query("all", query) + +class LdtUtils(object): + + def generateLdt(self, contentList, file, title = u"", author=u"IRI Web", web_url=u"", media_url="", startSegment = None, contributions=None): + + writer = MarkupWriter(file, indent = u"yes") + writer.startDocument() + writer.startElement(u"iri") + writer.simpleElement(u"project", attributes={u"id":unicode(str(uuid.uuid1())), u"title":unicode(title) , u"user":author, u"abstract":u""}) + writer.startElement(u"medias") + for content in contentList: + videopath = unicode(settings.STREAM_URL) + if content.videopath : + videopath = unicode(content.videopath) + writer.simpleElement(u"media", attributes={u"id":content.iri_id,u"src":content.iri_url(web_url),u"video":videopath,u"pict":u"",u"extra":u""}) + writer.endElement(u"medias") + + if contributions is None: + contributions = [] + annotations_nodes = {} + for contrib in contributions: + doc = xml.dom.minidom.parseString(contrib.ldtproject.ldt.encode("utf-8")) + con = xml.xpath.Context.Context(doc, 1, 1, None) + res = xml.xpath.Evaluate("/iri/annotations/content", context=con) + for content in res: + contentid = content.getAttribute("id") + if annotations_nodes.has_key(contentid): + contentnode = annotations_nodes[contentid] + else: + contentnode = {"id":contentid, "ensembles":[]} + annotations_nodes[contentid]=contentnode + for ens in content.childNodes: + if ens.nodeType == xml.dom.Node.ELEMENT_NODE and ens.tagName.endswith("ensemble"): + contentnode["ensembles"].append(ens.toprettyxml()) + + if len(annotations_nodes) > 0: + writer.startElement(u"annotations") + for content in contentList: + if content.content_base.iri_id in annotations_nodes: + contentnode = annotations_nodes[content.content_base.iri_id] + if contentnode is not None: + if len(contentnode["ensembles"])>0: + writer.startElement(u"content", attributes={"id":contentnode["id"]}) + writer.text(u"") + for ens in contentnode["ensembles"]: + writer.xmlFragment(ens.encode("utf-8")) + writer.endElement(u"content") + else: + writer.simpleElement(u"content", attributes={"id":contentnode["id"]}) + writer.endElement(u"annotations") + else: + writer.simpleElement(u"annotations") + + + writer.startElement(u"displays") + if len(contentList) > 0: + writer.startElement(u"display", attributes={u"id":u"0",u"title":u"generated",u"idsel":contentList[0].iri_id,u"tc":u"0"}) + for content in contentList: + writer.startElement(u"content", attributes={u"id":content.iri_id}) + filepath = urllib.urlopen(content.iri_url()) + doc = xml.dom.minidom.parse(filepath) + con = xml.xpath.Context.Context(doc, 1, 1, None) + res = xml.xpath.Evaluate("/iri/body/ensembles/ensemble/decoupage", context=con) + for decoupagenode in res: + decoupage_id = decoupagenode.getAttribute(u"id") + ensemble_id = decoupagenode.parentNode.getAttribute(u"id") + writer.simpleElement(u"decoupage", attributes={u"id":decoupage_id,u"idens":ensemble_id}) + writer.endElement(u"content") + if startSegment is not None: + writer.startElement(u"activeSegment") + writer.simpleElement(u"id",attributes={u"idctt" : startSegment["idcontent"],u"idens" : startSegment["idgroup"], u"idcut" : startSegment["idcutting"], u"idseg" : startSegment["idsegment"]}) + writer.endElement(u"activeSegment") + + writer.endElement(u"display") + writer.endElement(u"displays") + writer.simpleElement(u"edits") + writer.endElement(u"iri") + + def generateInit(self, url, method, search=None): + + import xml.dom + import xml.dom.ext + + impl = xml.dom.getDOMImplementation() + doc = impl.createDocument(xml.dom.EMPTY_NAMESPACE, 'iri', None) + + elementFiles = doc.createElement('files') + doc.documentElement.appendChild(elementFiles) + + elementInit = doc.createElement('init') + elementFiles.appendChild(elementInit) + + elementfile = doc.createElement('file') + + elementfile.setAttribute('src',settings.WEB_URL + django.core.urlresolvers.reverse(method, args=url)) + elementfile.setAttribute('display', '1') + if(search): + elementfile.setAttribute("segsel",settings.WEB_URL + django.core.urlresolvers.reverse(search, args=url)) + + + # /*chemin video : tant que le serveur de media n'est pas up, */ + elementfile.setAttribute('video', settings.STREAM_URL) + elementfile.setAttribute('pict', "") + elementfile.setAttribute('extra', "") + + elementInit.appendChild(elementfile); + + elementRecent = doc.createElement('recent'); + elementFiles.appendChild(elementRecent); + + + elementLibrary = doc.createElement('library'); + elementFiles.appendChild(elementLibrary); + + username = '' + id = '' + elementUser = doc.createElement('user') + elementUser.setAttribute('name', username) + elementUser.setAttribute('id', id) + doc.documentElement.appendChild(elementUser) + + return doc + +def create_ldt(project, user): + + contentList=project.contents.all() + + """create xml""" + + # create a dom + impl = xml.dom.getDOMImplementation() + dom = impl.createDocument(xml.dom.EMPTY_NAMESPACE, 'iri', None) + #node project + elementProject = dom.createElement('project') + dom.documentElement.appendChild(elementProject) + + + elementProject.setAttribute('abstract', "") + elementProject.setAttribute('title', project.title) + elementProject.setAttribute('user', user.username) + elementProject.setAttribute('id', project.ldt_id) + #node medias + elementMedias = dom.createElement('medias') + dom.documentElement.appendChild(elementMedias) + + idsel = None + for content in contentList: + if not idsel: + idsel = content.iri_id + elementMedia = dom.createElement('media') + elementMedia.setAttribute('id', content.iri_id) + elementMedia.setAttribute('src', content.iri_url()) + if content.videopath and content.videopath !="": + elementMedia.setAttribute('video', content.videopath) + else: + elementMedia.setAttribute('video', settings.STREAM_URL) + elementMedia.setAttribute('pict', "") + elementMedia.setAttribute('extra', "") + elementMedias.appendChild(elementMedia) + if not idsel: + idsel = "" + + #node annotations + elementAnnotations = dom.createElement('annotations') + dom.documentElement.appendChild(elementAnnotations) + #node displays + elementDisplays = dom.createElement('displays') + elementDisplay = dom.createElement('display') + elementDisplay.setAttribute('id', '0') + elementDisplay.setAttribute('title', 'Init view') + elementDisplay.setAttribute('idsel', idsel) + elementDisplay.setAttribute('tc', '0') + elementDisplay.setAttribute('zoom', '0') + elementDisplay.setAttribute('scroll', '0') + elementDisplay.setAttribute('infoBAB', '') + #node content + for content in contentList: + elementContent = dom.createElement('content') + elementContent.setAttribute('id', content.iri_id) + if not 'http' in content.iriurl: + #eg: "iiiielizabethrosse/ENMI08-III_elizabethrosse.iri" + url = content.iri_url() + else: + url =content.iriurl + file = urllib.urlopen(url) + doc = xml.dom.minidom.parse(file) + con = xml.xpath.Context.Context(doc, 1, 1, None) + res = xml.xpath.Evaluate("/iri/body/ensembles/ensemble/decoupage", context=con) + #node decoupage + for decoupagenode in res: + decoupage_id = decoupagenode.getAttribute(u"id") + ensemble_id = decoupagenode.parentNode.getAttribute(u"id") + elementDecoupage = dom.createElement('decoupage') + elementDecoupage.setAttribute('idens', ensemble_id) + elementDecoupage.setAttribute('id', decoupage_id) + elementContent.appendChild(elementDecoupage) + elementDisplay.appendChild(elementContent) + + elementDisplays.appendChild(elementDisplay) + dom.documentElement.appendChild(elementDisplays) + + elementEdits = dom.createElement('edits') + dom.documentElement.appendChild(elementEdits) + # write dom in Project.ldt + project.ldt = dom.documentElement.toprettyxml() + #save Project + project.save() + return project + + +def copy_ldt(project, new_project, user): + new_project.ldt_id = str(uuid.uuid1()) + new_project.created_by=user.username + new_project.changed_by=user.username + new_project.state = 1 + + contentList=project.contents.all() + + """create xml""" + + # create a dom + dom = xml.dom.minidom.parseString(project.ldt.encode("utf-8")) + con = xml.xpath.Context.Context(dom, 1, 1, None) + res = xml.xpath.Evaluate("iri/project", context=con) + for elementProject in res: + elementProject.setAttribute('abstract', "") + elementProject.setAttribute('title', new_project.title) + elementProject.setAttribute('user', user.username) + elementProject.setAttribute('id', new_project.ldt_id) + + new_project.ldt = dom.documentElement.toprettyxml() + #save Project + new_project.save() + return new_project diff -r 7c994c98d1df -r ae8593287883 web/ldt/ldt_utils/views.py --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/web/ldt/ldt_utils/views.py Tue Jun 08 15:44:35 2010 +0200 @@ -0,0 +1,287 @@ +import django.core.urlresolvers +from django.http import HttpResponse, HttpResponseRedirect +from django.shortcuts import render_to_response, get_object_or_404 +from django.template import RequestContext +from django.core.urlresolvers import reverse +from django.contrib.auth.decorators import login_required +from django.conf import settings +from fileimport import * +from forms import LdtImportForm, LdtAddForm, SearchForm, AddProjectForm, CopyProjectForm +from ldt.core.models import Owner +from models import * +from utils import * +from contentindexer import * +from string import Template +from Ft.Xml import MarkupWriter +import cgi +import uuid +import base64 +import lucene +import xml.dom +import xml.dom.ext +import xml.dom.minidom + + + +def searchForm(request): + form = SearchForm() + return render_to_response('ldt/ldt/search_form.html',{'form': form} , context_instance=RequestContext(request)) + +def searchIndex(request): + + sform = SearchForm(request.POST) + if sform.is_valid(): + search = sform.cleaned_data["search"] + + + queryStr = base64.urlsafe_b64encode(search.encode('utf8')) + field = request.POST["field"] + language_code = request.LANGUAGE_CODE[:2] + + url = settings.WEB_URL + django.core.urlresolvers.reverse("ldt.ldt_utils.views.searchInit", args=[field, queryStr]) + return render_to_response('ldt/ldt/init_ldt.html', {'MEDIA_URL': settings.MEDIA_URL, 'colorurl': settings.MEDIA_URL+'swf/ldt/pkg/color.xml', 'i18nurl': settings.MEDIA_URL+'swf/ldt/pkg/i18n', 'language': language_code, 'baseurl': settings.MEDIA_URL+'swf/ldt/', 'url': url}, context_instance=RequestContext(request)) + else: + resp = HttpResponse() + resp.write("Error : No result"); + +def searchIndexGet(request, field, query): + + language_code = request.LANGUAGE_CODE[:2] + url = settings.WEB_URL + django.core.urlresolvers.reverse("ldt.ldt_utils.views.searchInit", args=[field, query]) + return render_to_response('irisuser/ldt/init_ldt.html', {'MEDIA_URL': settings.MEDIA_URL, 'colorurl': settings.MEDIA_URL+'swf/ldt/pkg/color.xml', 'i18nurl': settings.MEDIA_URL+'swf/ldt/pkg/i18n', 'language': language_code, 'baseurl': settings.MEDIA_URL+'swf/ldt/', 'url': url}, context_instance=RequestContext(request)) + +def searchInit(request, field, query): + + ldtgen = LdtUtils() + + doc = ldtgen.generateInit([field,query], 'ldt.ldt_utils.views.searchLdt', 'ldt.ldt_utils.views.searchSegments') + + resp = HttpResponse(mimetype="text/xml;charset=utf-8") + xml.dom.ext.PrettyPrint(doc, resp) + return resp + +def searchLdt(request, field, query, edition=None): + + contentList = [] + resp = HttpResponse(mimetype="text/xml") + queryStr = "" + + if query and len(query)>0: + queryStr = base64.urlsafe_b64decode(query.encode("ascii")).decode("utf8") + searcher = LdtSearch() + ids = {} + + for result in searcher.query(field, queryStr): + ids[result["iri_id"]] = "" + + id_list = ids.keys() + + if edition is not None: + ids_editions = map(lambda t:t[0], filter(lambda id: id[0] is not None, Speak.objects.filter(session__day__edition=edition).order_by("session__start_ts", "order").values_list("content__iri_id"))) + id_list = filter(lambda id: id in id_list, ids_editions) + + contentList = Content.objects.filter(iri_id__in=id_list) + + + ldtgen = LdtUtils() + ldtgen.generateLdt(contentList, file=resp, title = u"Recherche : " + queryStr) + + return resp + + +def searchSegments(request, field, query, edition=None): + + if query and len(query)>0: + searcher = LdtSearch() + + queryStr = base64.urlsafe_b64decode(query.encode("ascii")).decode("utf8") + res = searcher.query(field, queryStr) + else: + res = [] + + iri_ids = None + + if edition is not None: + iri_ids = map(lambda t:t[0], filter(lambda id: id[0] is not None, Speak.objects.filter(session__day__edition=edition).order_by("session__start_ts", "order").values_list("content__iri_id"))) + + doc = xml.dom.getDOMImplementation().createDocument(None, "iri", None) + + for resultMap in res: + if iri_ids is None or resultMap['iri_id'] in iri_ids: + elem = doc.createElement('seg') + elem.setAttribute('idctt', resultMap['iri_id']) + elem.setAttribute('idens', resultMap['ensemble_id']) + elem.setAttribute('iddec', resultMap['decoupage_id']) + elem.setAttribute('idseg', resultMap['element_id']) + elem.setAttribute('idvue', "") + elem.setAttribute('crit', "") + doc.documentElement.appendChild(elem) + + return HttpResponse(doc.toprettyxml(encoding='utf-8'), mimetype="text/xml;charset=utf-8") + +@login_required +def list_ldt(request): + contents = Content.objects.all() + try: + owner = Owner.objects.get(user=request.user) + except: + return HttpResponseRedirect(settings.LOGIN_URL) + ldtProjects = Project.objects.filter(owner=owner) + context={ + 'contents': contents, + 'ldtProjects': ldtProjects.reverse(), + } + return render_to_response('ldt/ldt/ldt_list.html', context, context_instance=RequestContext(request)) + +def create_ldt_view(request): + if request.method == "POST" : + form = LdtAddForm(request.POST) + if form.is_valid(): + user = request.user + Project.create_project(title=form.cleaned_data['title'], user=user, contents=form.cleaned_data['contents']) + return HttpResponseRedirect(reverse("ldt.ldt_utils.views.list_ldt")) + else: + form = LdtAddForm() + contents = Content.objects.all() + return render_to_response('ldt/ldt/create_ldt.html', {'contents': contents, 'form': form,'create_project_action':reverse(create_ldt_view)}, context_instance=RequestContext(request)) + +def created_ldt(request): + return render_to_response('ldt/ldt/done.html', context_instance=RequestContext(request)) + +def indexProject(request, id): + + urlStr = settings.WEB_URL + reverse("ldt.ldt_utils.views.init", args=['ldtProject', id]) + posturl= settings.WEB_URL + reverse("ldt.ldt_utils.views.save_ldtProject") + language_code = request.LANGUAGE_CODE[:2] + + ldt = get_object_or_404(Project, ldt_id=id) + if ldt.state ==2: #published + readonly = 'true' + else: + readonly = 'false' + + return render_to_response('ldt/ldt/init_ldt.html', {'MEDIA_URL': settings.MEDIA_URL, 'colorurl': settings.MEDIA_URL+'swf/ldt/pkg/color.xml', 'i18nurl': settings.MEDIA_URL+'swf/ldt/pkg/i18n', 'language': language_code, 'baseurl': settings.MEDIA_URL+'swf/ldt/', 'url': urlStr, 'posturl': posturl, 'id': id, 'readonly': readonly}, context_instance=RequestContext(request)) + +def init(request, method, url): + ldtgen = LdtUtils() + + doc = ldtgen.generateInit([url], 'ldt.ldt_utils.views.'+method, None) + + resp = HttpResponse(mimetype="text/xml") + resp['Cache-Control']='no-cache, must-revalidate' + resp['Pragma']='no-cache' + xml.dom.ext.PrettyPrint(doc, resp) + return resp + +def ldtProject(request, id): + resp = HttpResponse(mimetype="text/xml") + resp['Cache-Control']='no-cache, must-revalidate' + resp['Pragma']='no-cache' + + project = Project.objects.get(ldt_id=id) + resp.write(project.ldt) + return resp + +def save_ldtProject(request): + if request.method=="POST": + ldt = request.POST['ldt'] + id = request.POST['id'] + ldtproject=Project.objects.get(ldt_id=id) + #save xml ldt + ldtproject.ldt=ldt + #get new title + dom = xml.dom.minidom.parseString(ldt.encode( "utf-8" )) + con = xml.xpath.Context.Context(dom, 1, 1, None) + result = xml.xpath.Evaluate("/iri/project",context=con) + for pnode in result: + title=pnode.getAttribute("title") + break + #set new title + ldtproject.title=title + #get new content list + new_contents=[] + result = xml.xpath.Evaluate("/iri/medias/media", context=con) + for medianode in result: + id = medianode.attributes['id'].value + new_contents.append(id) + # set new content list + for c in ldtproject.contents.all(): + if not c.iri_id in new_contents: + ldtproject.contents.remove(c) + ldtproject.save() + else: + ldt = '' + return render_to_response('ldt/ldt/save_done.html', {'ldt': ldt, 'id':id, 'title':title, 'contents': new_contents}, context_instance=RequestContext(request)) + +@login_required +def publish(request, id): + ldt = get_object_or_404(Project, ldt_id=id) + ldt.state = 2 #published + ldt.save() + return HttpResponseRedirect(reverse("ldt.ldt_utils.views.list_ldt")) + +@login_required +def unpublish(request, id): + ldt = get_object_or_404(Project, ldt_id=id) + ldt.state = 1 #edition + ldt.save() + return HttpResponseRedirect(reverse("ldt.ldt_utils.views.list_ldt")) + + +def index(request, url): + + urlStr = settings.WEB_URL + django.core.urlresolvers.reverse("ldt.ldt_utils.views.init", args=['ldt',url]) + language_code = request.LANGUAGE_CODE[:2] + + return render_to_response('ldt/ldt/init_ldt.html', {'MEDIA_URL': settings.MEDIA_URL, 'colorurl': settings.MEDIA_URL+'swf/ldt/pkg/color.xml', 'i18nurl': settings.MEDIA_URL+'swf/ldt/pkg/i18n', 'language': language_code, 'baseurl': settings.MEDIA_URL+'swf/ldt/', 'url': urlStr, 'weburl':settings.WEB_URL+settings.BASE_URL}, context_instance=RequestContext(request)) + + +def ldt(request, url, startSegment = None): + + import Ft + from Ft.Xml import MarkupWriter + + resp = HttpResponse(mimetype="text/xml; charset=utf-8") + resp['Cache-Control'] = 'no-cache' + + contentList = Content.objects.filter(iri_id=url) + + ldtgen = LdtUtils() + ldtgen.generateLdt(contentList, file=resp, title = contentList[0].title, startSegment=startSegment) + + return resp + + +def loading(request): + return render_to_response('ldt/ldt/loading.html', context_instance=RequestContext(request)) + + +@login_required +def create_project(request, iri_id): + + content = get_object_or_404(Content, iri_id=iri_id) + contents = [ content, ] + if request.method == "POST" : + form = AddProjectForm(request.POST) + if form.is_valid(): + user=request.user + project = Project.create_project(title=form.cleaned_data['title'], user=user, contents=contents) + return HttpResponseRedirect(reverse('ldt.ldt_utils.views.indexProject', args=[project.ldt_id])) + else: + form = AddProjectForm() + return render_to_response('ldt/ldt/create_ldt.html', {'form':form, 'contents':contents, 'iri_id':iri_id, 'create_project_action':reverse("ldt.ldt_utils.views.create_project",args=[iri_id])}, context_instance=RequestContext(request)) + +@login_required +def copy_project(request, ldt_id): + + project = get_object_or_404(Project, ldt_id=ldt_id) + if request.method == "POST" : + form = CopyProjectForm(request.POST) + if form.is_valid(): + user=request.user + project = project.copy_project(title=request.POST['title'], user=user) + return HttpResponseRedirect(reverse('ldt.ldt_utils.views.indexProject', args=[project.ldt_id])) + else: + form = CopyProjectForm + return render_to_response('ldt/ldt/copy_ldt.html', {'form':form, 'project':project}, context_instance=RequestContext(request)) + diff -r 7c994c98d1df -r ae8593287883 web/ldt/locale/en/LC_MESSAGES/django.mo Binary file web/ldt/locale/en/LC_MESSAGES/django.mo has changed diff -r 7c994c98d1df -r ae8593287883 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 Tue Jun 08 15:44:35 2010 +0200 @@ -0,0 +1,648 @@ +# 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-03-09 08:48-0600\n" +"PO-Revision-Date: 2010-02-17 03:53+0100\n" +"Last-Translator: Yves-Marie Haussonne \n" +"Language-Team: LANGUAGE \n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" + +#: ldt/models.py:43 +msgid "created by" +msgstr "created by" + +#: ldt/models.py:44 +msgid "changed by" +msgstr "changed by" + +#: ldt/templates/admin/ldt/app_action.html:6 +#: 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/templates/iriuser/ldt/copy_ldt.html:12 +msgid "Copy your project" +msgstr "Copy your project" + +#: ldt/templates/iriuser/ldt/copy_ldt.html:15 +#: ldt/templates/iriuser/ldt/create_ldt.html:15 +msgid "Title" +msgstr "Title" + +#: ldt/templates/iriuser/ldt/copy_ldt.html:18 +msgid "Copy" +msgstr "Copy" + +#: ldt/templates/iriuser/ldt/create_ldt.html:12 +msgid "Create your project" +msgstr "Create your project" + +#: ldt/templates/iriuser/ldt/create_ldt.html:18 +msgid "List of contents" +msgstr "List of contents" + +#: ldt/templates/iriuser/ldt/create_ldt.html:25 +msgid "Create" +msgstr "Create" + +#: ldt/templates/iriuser/ldt/ldt_list.html:50 +#: templates/admin/page_base.html:19 +#: user/templates/iriuser/user/login_form.html:33 +#: user/templates/iriuser/user/space.html:6 +#: user/templates/iriuser/user/space.html:9 +msgid "Space" +msgstr "Space" + +#: ldt/templates/iriuser/ldt/ldt_list.html:51 +#: ldt/templates/iriuser/ldt/ldt_list.html:53 +msgid "Ldt Project" +msgstr "Ldt Project" + +#: ldt/templates/iriuser/ldt/ldt_list.html:57 +msgid "Create new project" +msgstr "Create new project" + +#: ldt/templates/iriuser/ldt/ldt_list.html:59 +msgid "Project" +msgstr "Project" + +#: ldt/templates/iriuser/ldt/ldt_list.html:62 +msgid "title" +msgstr "Title" + +#: ldt/templates/iriuser/ldt/ldt_list.html:63 +msgid " published" +msgstr " published" + +#: 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/iriuser/user/login_form.html:37 +#: user/templates/iriuser/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 +#: user/templates/iriuser/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:" + +#: 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/iriuser/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/iriuser/user/change_email.html:6 +#: user/templates/iriuser/user/change_email_done.html:6 +#: user/templates/iriuser/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" + +#: user/templates/iriuser/user/change_email.html:7 +#: user/templates/iriuser/user/change_email.html:10 +msgid "Modification de l'adresse émail" +msgstr "E-mail change" + +#: user/templates/iriuser/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/iriuser/user/change_email.html:32 +msgid "email" +msgstr "email" + +#: user/templates/iriuser/user/change_email.html:41 +msgid "Confirmation de l'adresse émail" +msgstr "E-mail confirmation" + +#: user/templates/iriuser/user/change_email.html:48 +msgid "change my e-mail" +msgstr "Change my e-mail" + +#: user/templates/iriuser/user/change_email_done.html:7 +#: user/templates/iriuser/user/change_email_done.html:10 +msgid "email change" +msgstr "email change" + +#: user/templates/iriuser/user/change_email_done.html:12 +msgid "email changed" +msgstr "changed by" + +#: user/templates/iriuser/user/change_email_done.html:13 +msgid "back to profile" +msgstr "back to profile" + +#: user/templates/iriuser/user/home.html:9 +msgid "Se connecter" +msgstr "Login" + +#: user/templates/iriuser/user/home.html:10 +msgid "Créer un compte" +msgstr "Create an account" + +#: user/templates/iriuser/user/home.html:11 +msgid "récupérer mot de passe" +msgstr "Forget password?" + +#: user/templates/iriuser/user/login_form.html:50 +msgid "create account" +msgstr "create account" + +#: user/templates/iriuser/user/login_form.html:54 +msgid "Pseudo" +msgstr "Username" + +#: user/templates/iriuser/user/login_form.html:57 +#: user/templates/iriuser/user/login_form.html:64 +msgid "this field is compulsory" +msgstr "this field is compulsory" + +#: user/templates/iriuser/user/login_form.html:68 +msgid "reset password" +msgstr "reset password" + +#: user/templates/iriuser/user/login_form.html:71 +msgid "Connection" +msgstr "Login" + +#: user/templates/iriuser/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/iriuser/user/profile.html:7 +msgid "Mail change" +msgstr "Mail change" + +#: user/templates/iriuser/user/space.html:13 +msgid "Page" +msgstr "Pages" + +#: user/templates/iriuser/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 "Changement de l'adresse émail" +#~ msgstr "E-mail change" + +#~ msgid "Mot de passe" +#~ msgstr "Password" + +#~ msgid "Déconnexion" +#~ msgstr "Logout" diff -r 7c994c98d1df -r ae8593287883 web/ldt/locale/fr/LC_MESSAGES/django.mo Binary file web/ldt/locale/fr/LC_MESSAGES/django.mo has changed diff -r 7c994c98d1df -r ae8593287883 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 Tue Jun 08 15:44:35 2010 +0200 @@ -0,0 +1,619 @@ +# 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-03-09 08:48-0600\n" +"PO-Revision-Date: 2010-03-09 15:52+0100\n" +"Last-Translator: Yves-Marie Haussonne \n" +"Language-Team: LANGUAGE \n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" + +#: ldt/models.py:43 +msgid "created by" +msgstr "créé par" + +#: ldt/models.py:44 +msgid "changed by" +msgstr "modifié par" + +#: ldt/templates/admin/ldt/app_action.html:6 +#: 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/templates/iriuser/ldt/copy_ldt.html:12 +msgid "Copy your project" +msgstr "Copier votre projet" + +#: ldt/templates/iriuser/ldt/copy_ldt.html:15 +#: ldt/templates/iriuser/ldt/create_ldt.html:15 +msgid "Title" +msgstr "Titre" + +#: ldt/templates/iriuser/ldt/copy_ldt.html:18 +msgid "Copy" +msgstr "Copier" + +#: ldt/templates/iriuser/ldt/create_ldt.html:12 +msgid "Create your project" +msgstr "Créer votre projet Lignes de Temps" + +#: ldt/templates/iriuser/ldt/create_ldt.html:18 +msgid "List of contents" +msgstr "Liste de contenus" + +#: ldt/templates/iriuser/ldt/create_ldt.html:25 +msgid "Create" +msgstr "Créer" + +#: ldt/templates/iriuser/ldt/ldt_list.html:50 +#: templates/admin/page_base.html:19 +#: user/templates/iriuser/user/login_form.html:33 +#: user/templates/iriuser/user/space.html:6 +#: user/templates/iriuser/user/space.html:9 +msgid "Space" +msgstr "Esp. perso" + +#: ldt/templates/iriuser/ldt/ldt_list.html:51 +#: ldt/templates/iriuser/ldt/ldt_list.html:53 +msgid "Ldt Project" +msgstr "Projet lignes de temps" + +#: ldt/templates/iriuser/ldt/ldt_list.html:57 +msgid "Create new project" +msgstr "Créer un nouveau projet Ligne de Temps" + +#: ldt/templates/iriuser/ldt/ldt_list.html:59 +msgid "Project" +msgstr "Projet" + +#: ldt/templates/iriuser/ldt/ldt_list.html:62 +msgid "title" +msgstr "Titre" + +#: ldt/templates/iriuser/ldt/ldt_list.html:63 +msgid " published" +msgstr "Publié" + +#: 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/iriuser/user/login_form.html:37 +#: user/templates/iriuser/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 +#: user/templates/iriuser/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 :" + +#: 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/iriuser/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/iriuser/user/change_email.html:6 +#: user/templates/iriuser/user/change_email_done.html:6 +#: user/templates/iriuser/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" + +#: user/templates/iriuser/user/change_email.html:7 +#: user/templates/iriuser/user/change_email.html:10 +msgid "Modification de l'adresse émail" +msgstr "Modification de l'adresse email" + +#: user/templates/iriuser/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/iriuser/user/change_email.html:32 +msgid "email" +msgstr "adresse émail" + +#: user/templates/iriuser/user/change_email.html:41 +msgid "Confirmation de l'adresse émail" +msgstr "Confirmation de l'adresse email" + +#: user/templates/iriuser/user/change_email.html:48 +msgid "change my e-mail" +msgstr "Changer l'adresse émail" + +#: user/templates/iriuser/user/change_email_done.html:7 +#: user/templates/iriuser/user/change_email_done.html:10 +msgid "email change" +msgstr "Modification de l'adresse émail" + +#: user/templates/iriuser/user/change_email_done.html:12 +msgid "email changed" +msgstr "email modifié" + +#: user/templates/iriuser/user/change_email_done.html:13 +msgid "back to profile" +msgstr "Retourner à mon profil" + +#: user/templates/iriuser/user/home.html:9 +msgid "Se connecter" +msgstr "Se connecter" + +#: user/templates/iriuser/user/home.html:10 +msgid "Créer un compte" +msgstr "Créere un compte" + +#: user/templates/iriuser/user/home.html:11 +msgid "récupérer mot de passe" +msgstr "Récupérer le mot de passe" + +#: user/templates/iriuser/user/login_form.html:50 +msgid "create account" +msgstr "Créer un compte" + +#: user/templates/iriuser/user/login_form.html:54 +msgid "Pseudo" +msgstr "Pseudo" + +#: user/templates/iriuser/user/login_form.html:57 +#: user/templates/iriuser/user/login_form.html:64 +msgid "this field is compulsory" +msgstr "Ce champs est obligatoire" + +#: user/templates/iriuser/user/login_form.html:68 +msgid "reset password" +msgstr "Réinitialiser le mot de passe" + +#: user/templates/iriuser/user/login_form.html:71 +msgid "Connection" +msgstr "Connexion" + +#: user/templates/iriuser/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/iriuser/user/profile.html:7 +msgid "Mail change" +msgstr "Modification de l'adresse émail" + +#: user/templates/iriuser/user/space.html:13 +msgid "Page" +msgstr "Pages" + +#: user/templates/iriuser/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 "Password (Verification)" +#~ msgstr "Mot de passe (Vérification)" diff -r 7c994c98d1df -r ae8593287883 web/ldt/management/__init__.py --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/web/ldt/management/__init__.py Tue Jun 08 15:44:35 2010 +0200 @@ -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 7c994c98d1df -r ae8593287883 web/ldt/media/css/ldt.css --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/web/ldt/media/css/ldt.css Tue Jun 08 15:44:35 2010 +0200 @@ -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(../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 7c994c98d1df -r ae8593287883 web/ldt/media/css/style.css --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/web/ldt/media/css/style.css Tue Jun 08 15:44:35 2010 +0200 @@ -0,0 +1,47 @@ +#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 7c994c98d1df -r ae8593287883 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 Tue Jun 08 15:44:35 2010 +0200 @@ -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 7c994c98d1df -r ae8593287883 web/ldt/media/img/loadingAnimation.gif Binary file web/ldt/media/img/loadingAnimation.gif has changed diff -r 7c994c98d1df -r ae8593287883 web/ldt/media/js/jquery.DOMWindow.js --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/web/ldt/media/js/jquery.DOMWindow.js Tue Jun 08 15:44:35 2010 +0200 @@ -0,0 +1,372 @@ +(function($){ + + //closeDOMWindow + $.fn.closeDOMWindow = function(settings){ + + if(!settings){settings={};} + + var run = function(passingThis){ + + if(settings.anchoredClassName){ + var $anchorClassName = $('.'+settings.anchoredClassName); + $anchorClassName.fadeOut('fast',function(){ + if($.fn.draggable){ + $anchorClassName.draggable('destory').trigger("unload").remove(); + }else{ + $anchorClassName.trigger("unload").remove(); + } + }); + if(settings.functionCallOnClose){settings.functionCallAfterClose();} + }else{ + var $DOMWindowOverlay = $('#DOMWindowOverlay'); + var $DOMWindow = $('#DOMWindow'); + $DOMWindowOverlay.fadeOut('fast',function(){ + $DOMWindowOverlay.trigger('unload').unbind().remove(); + }); + $DOMWindow.fadeOut('fast',function(){ + if($.fn.draggable){ + $DOMWindow.draggable("destroy").trigger("unload").remove(); + }else{ + $DOMWindow.trigger("unload").remove(); + } + }); + + $(window).unbind('scroll.DOMWindow'); + $(window).unbind('resize.DOMWindow'); + + if($.fn.openDOMWindow.isIE6){$('#DOMWindowIE6FixIframe').remove();} + if(settings.functionCallOnClose){settings.functionCallAfterClose();} + } + }; + + if(settings.eventType){//if used with $(). + return this.each(function(index){ + $(this).bind(settings.eventType, function(){ + run(this); + return false; + }); + }); + }else{//else called as $.function + run(); + } + + }; + + //allow for public call, pass settings + $.closeDOMWindow = function(s){$.fn.closeDOMWindow(s);}; + + //openDOMWindow + $.fn.openDOMWindow = function(instanceSettings){ + + var shortcut = $.fn.openDOMWindow; + + //default settings combined with callerSettings//////////////////////////////////////////////////////////////////////// + + shortcut.defaultsSettings = { + anchoredClassName:'', + anchoredSelector:'', + borderColor:'#ccc', + borderSize:'4', + draggable:0, + eventType:null, //click, blur, change, dblclick, error, focus, load, mousedown, mouseout, mouseup etc... + fixedWindowY:100, + functionCallOnOpen:null, + functionCallOnClose:null, + height:500, + loader:0, + loaderHeight:0, + loaderImagePath:'', + loaderWidth:0, + modal:0, + overlay:1, + overlayColor:'#000', + overlayOpacity:'85', + positionLeft:0, + positionTop:0, + positionType:'centered', // centered, anchored, absolute, fixed + width:500, + windowBGColor:'#fff', + windowBGImage:null, // http path + windowHTTPType:'get', + windowPadding:10, + windowSource:'inline', //inline, ajax, iframe + windowSourceID:'', + windowSourceURL:'', + windowSourceAttrURL:'href', + windowOverflow : 'auto', + ajaxParameters : {} + }; + + var settings = $.extend({}, $.fn.openDOMWindow.defaultsSettings , instanceSettings || {}); + + //Public functions + + shortcut.viewPortHeight = function(){ return self.innerHeight || document.documentElement.clientHeight || document.body.clientHeight;}; + shortcut.viewPortWidth = function(){ return self.innerWidth || document.documentElement.clientWidth || document.body.clientWidth;}; + shortcut.scrollOffsetHeight = function(){ return self.pageYOffset || document.documentElement.scrollTop || document.body.scrollTop;}; + shortcut.scrollOffsetWidth = function(){ return self.pageXOffset || document.documentElement.scrollLeft || document.body.scrollLeft;}; + shortcut.isIE6 = typeof document.body.style.maxHeight === "undefined"; + + //Private Functions///////////////////////////////////////////////////////////////////////////////////////////////////////// + + var sizeOverlay = function(){ + var $DOMWindowOverlay = $('#DOMWindowOverlay'); + if(shortcut.isIE6){//if IE 6 + var overlayViewportHeight = document.documentElement.offsetHeight + document.documentElement.scrollTop - 4; + var overlayViewportWidth = document.documentElement.offsetWidth - 21; + $DOMWindowOverlay.css({'height':overlayViewportHeight +'px','width':overlayViewportWidth+'px'}); + }else{//else Firefox, safari, opera, IE 7+ + $DOMWindowOverlay.css({'height':'100%','width':'100%','position':'fixed'}); + } + }; + + var sizeIE6Iframe = function(){ + var overlayViewportHeight = document.documentElement.offsetHeight + document.documentElement.scrollTop - 4; + var overlayViewportWidth = document.documentElement.offsetWidth - 21; + $('#DOMWindowIE6FixIframe').css({'height':overlayViewportHeight +'px','width':overlayViewportWidth+'px'}); + }; + + var centerDOMWindow = function() { + var $DOMWindow = $('#DOMWindow'); + if(settings.height + 50 > shortcut.viewPortHeight()){//added 50 to be safe + $DOMWindow.css('left',Math.round(shortcut.viewPortWidth()/2) + shortcut.scrollOffsetWidth() - Math.round(($DOMWindow.outerWidth())/2)); + }else{ + $DOMWindow.css('left',Math.round(shortcut.viewPortWidth()/2) + shortcut.scrollOffsetWidth() - Math.round(($DOMWindow.outerWidth())/2)); + $DOMWindow.css('top',Math.round(shortcut.viewPortHeight()/2) + shortcut.scrollOffsetHeight() - Math.round(($DOMWindow.outerHeight())/2)); + } + }; + + var centerLoader = function() { + var $DOMWindowLoader = $('#DOMWindowLoader'); + if(shortcut.isIE6){//if IE 6 + $DOMWindowLoader.css({'left':Math.round(shortcut.viewPortWidth()/2) + shortcut.scrollOffsetWidth() - Math.round(($DOMWindowLoader.innerWidth())/2),'position':'absolute'}); + $DOMWindowLoader.css({'top':Math.round(shortcut.viewPortHeight()/2) + shortcut.scrollOffsetHeight() - Math.round(($DOMWindowLoader.innerHeight())/2),'position':'absolute'}); + }else{ + $DOMWindowLoader.css({'left':'50%','top':'50%','position':'fixed'}); + } + + }; + + var fixedDOMWindow = function(){ + var $DOMWindow = $('#DOMWindow'); + $DOMWindow.css('left', settings.positionLeft + shortcut.scrollOffsetWidth()); + $DOMWindow.css('top', + settings.positionTop + shortcut.scrollOffsetHeight()); + }; + + var showDOMWindow = function(instance){ + if(arguments[0]){ + $('.'+instance+' #DOMWindowLoader').remove(); + $('.'+instance+' #DOMWindowContent').fadeIn('fast',function(){if(settings.functionCallOnOpen){settings.functionCallOnOpen();}}); + $('.'+instance+ '.closeDOMWindow').click(function(){ + $.closeDOMWindow(); + return false; + }); + }else{ + $('#DOMWindowLoader').remove(); + $('#DOMWindow').fadeIn('fast',function(){if(settings.functionCallOnOpen){settings.functionCallOnOpen();}}); + $('#DOMWindow .closeDOMWindow').click(function(){ + $.closeDOMWindow(); + return false; + }); + } + + }; + + var urlQueryToObject = function(s, q){ + var query = typeof(q) != 'undefined' ? q : {}; + s.replace(/b([^&=]*)=([^&=]*)b/g, function (m, a, d) { + if (typeof query[a] != 'undefined') { + query[a] += ',' + d; + } else { + query[a] = d; + } + }); + return query; + }; + + //Run Routine /////////////////////////////////////////////////////////////////////////////////////////////////////////////// + var run = function(passingThis){ + + //get values from element clicked, or assume its passed as an option + settings.windowSourceID = $(passingThis).attr('href') || settings.windowSourceID; + settings.windowSourceURL = $(passingThis).attr(settings.windowSourceAttrURL) || settings.windowSourceURL; + settings.windowBGImage = settings.windowBGImage ? 'background-image:url('+settings.windowBGImage+')' : ''; + var urlOnly, urlQueryObject; + + if(settings.positionType == 'anchored'){//anchored DOM window + + var anchoredPositions = $(settings.anchoredSelector).position(); + var anchoredPositionX = anchoredPositions.left + settings.positionLeft; + var anchoredPositionY = anchoredPositions.top + settings.positionTop; + + $('body').append('
    '); + //loader + if(settings.loader && settings.loaderImagePath !== ''){ + $('.'+settings.anchoredClassName).append('
    '); + + } + + if($.fn.draggable){ + if(settings.draggable){$('.' + settings.anchoredClassName).draggable({cursor:'move'});} + } + + switch(settings.windowSource){ + case 'inline'://////////////////////////////// inline ////////////////////////////////////////// + $('.' + settings.anchoredClassName+" #DOMWindowContent").append($(settings.windowSourceID).children()); + $('.' + settings.anchoredClassName).unload(function(){// move elements back when you're finished + $('.' + settings.windowSourceID).append( $('.' + settings.anchoredClassName+" #DOMWindowContent").children()); + }); + showDOMWindow(settings.anchoredClassName); + break; + case 'iframe'://////////////////////////////// iframe ////////////////////////////////////////// + $('.' + settings.anchoredClassName+" #DOMWindowContent").append(''); + $('.'+settings.anchoredClassName+'Iframe').load(showDOMWindow(settings.anchoredClassName)); + break; + case 'ajax'://////////////////////////////// ajax ////////////////////////////////////////// + if(settings.windowHTTPType == 'post'){ + + if(settings.windowSourceURL.indexOf("?") !== -1){//has a query string + urlOnly = settings.windowSourceURL.substr(0, settings.windowSourceURL.indexOf("?")); + urlQueryObject = urlQueryToObject(settings.windowSourceURL, settings.ajaxParameters); + }else{ + urlOnly = settings.windowSourceURL; + urlQueryObject = settings.ajaxParameters; + } + $('.' + settings.anchoredClassName+" #DOMWindowContent").load(urlOnly,urlQueryObject,function(){ + showDOMWindow(settings.anchoredClassName); + }); + }else{ + if(settings.windowSourceURL.indexOf("?") == -1){ //no query string, so add one + settings.windowSourceURL += '?'; + } + $('.' + settings.anchoredClassName+" #DOMWindowContent").load( + settings.windowSourceURL + '&random=' + (new Date().getTime()),function(){ + showDOMWindow(settings.anchoredClassName); + }); + } + break; + } + + }else{//centered, fixed, absolute DOM window + + //overlay & modal + if(settings.overlay){ + $('body').append(''); + if(shortcut.isIE6){//if IE 6 + $('body').append(''); + sizeIE6Iframe(); + } + sizeOverlay(); + var $DOMWindowOverlay = $('#DOMWindowOverlay'); + $DOMWindowOverlay.fadeIn('fast'); + if(!settings.modal){$DOMWindowOverlay.click(function(){$.closeDOMWindow();});} + } + + //loader + if(settings.loader && settings.loaderImagePath !== ''){ + $('body').append('
    '); + centerLoader(); + } + + //add DOMwindow + $('body').append(''); + + var $DOMWindow = $('#DOMWindow'); + //centered, absolute, or fixed + switch(settings.positionType){ + case 'centered': + centerDOMWindow(); + if(settings.height + 50 > shortcut.viewPortHeight()){//added 50 to be safe + $DOMWindow.css('top', (settings.fixedWindowY + shortcut.scrollOffsetHeight()) + 'px'); + } + break; + case 'absolute': + $DOMWindow.css({'top':(settings.positionTop+shortcut.scrollOffsetHeight())+'px','left':(settings.positionLeft+shortcut.scrollOffsetWidth())+'px'}); + if($.fn.draggable){ + if(settings.draggable){$DOMWindow.draggable({cursor:'move'});} + } + break; + case 'fixed': + fixedDOMWindow(); + break; + case 'anchoredSingleWindow': + var anchoredPositions = $(settings.anchoredSelector).position(); + var anchoredPositionX = anchoredPositions.left + settings.positionLeft; + var anchoredPositionY = anchoredPositions.top + settings.positionTop; + $DOMWindow.css({'top':anchoredPositionY + 'px','left':anchoredPositionX+'px'}); + + break; + } + + $(window).bind('scroll.DOMWindow',function(){ + if(settings.overlay){sizeOverlay();} + if(shortcut.isIE6){sizeIE6Iframe();} + if(settings.positionType == 'centered'){centerDOMWindow();} + if(settings.positionType == 'fixed'){fixedDOMWindow();} + }); + + $(window).bind('resize.DOMWindow',function(){ + if(shortcut.isIE6){sizeIE6Iframe();} + if(settings.overlay){sizeOverlay();} + if(settings.positionType == 'centered'){centerDOMWindow();} + }); + + switch(settings.windowSource){ + case 'inline'://////////////////////////////// inline ////////////////////////////////////////// + $DOMWindow.append($(settings.windowSourceID).children()); + $DOMWindow.unload(function(){// move elements back when you're finished + $(settings.windowSourceID).append($DOMWindow.children()); + }); + showDOMWindow(); + break; + case 'iframe'://////////////////////////////// iframe ////////////////////////////////////////// + var name = 'DOMWindowIframe'+Math.round(Math.random()*1000); + $DOMWindow.append(''); + $('#DOMWindowIframe').load(showDOMWindow()); + break; + case 'ajax'://////////////////////////////// ajax ////////////////////////////////////////// + if(settings.windowHTTPType == 'post'){ + + if(settings.windowSourceURL.indexOf("?") !== -1){//has a query string + urlOnly = settings.windowSourceURL.substr(0, settings.windowSourceURL.indexOf("?")); + urlQueryObject = urlQueryToObject(settings.windowSourceURL, settings.ajaxParameters); + }else{ + urlOnly = settings.windowSourceURL; + urlQueryObject = settings.ajaxParameters; + } + $DOMWindow.load(urlOnly,urlQueryObject,function(){ + showDOMWindow(); + }); + }else{ + if(settings.windowSourceURL.indexOf("?") == -1){ //no query string, so add one + settings.windowSourceURL += '?'; + } + $DOMWindow.load( + settings.windowSourceURL + '&random=' + (new Date().getTime()),function(){ + showDOMWindow(); + }); + } + break; + } + + }//end if anchored, or absolute, fixed, centered + + };//end run() + + if(settings.eventType){//if used with $(). + return this.each(function(index){ + $(this).bind(settings.eventType,function(){ + run(this); + return false; + }); + }); + }else{//else called as $.function + run(); + } + + };//end function openDOMWindow + + //allow for public call, pass settings + $.openDOMWindow = function(s){$.fn.openDOMWindow(s);}; + +})(jQuery); diff -r 7c994c98d1df -r ae8593287883 web/ldt/media/js/jquery.js --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/web/ldt/media/js/jquery.js Tue Jun 08 15:44:35 2010 +0200 @@ -0,0 +1,19 @@ +/* + * jQuery JavaScript Library v1.3.2 + * http://jquery.com/ + * + * Copyright (c) 2009 John Resig + * Dual licensed under the MIT and GPL licenses. + * http://docs.jquery.com/License + * + * Date: 2009-02-19 17:34:21 -0500 (Thu, 19 Feb 2009) + * Revision: 6246 + */ +(function(){var l=this,g,y=l.jQuery,p=l.$,o=l.jQuery=l.$=function(E,F){return new o.fn.init(E,F)},D=/^[^<]*(<(.|\s)+>)[^>]*$|^#([\w-]+)$/,f=/^.[^:#\[\.,]*$/;o.fn=o.prototype={init:function(E,H){E=E||document;if(E.nodeType){this[0]=E;this.length=1;this.context=E;return this}if(typeof E==="string"){var G=D.exec(E);if(G&&(G[1]||!H)){if(G[1]){E=o.clean([G[1]],H)}else{var I=document.getElementById(G[3]);if(I&&I.id!=G[3]){return o().find(E)}var F=o(I||[]);F.context=document;F.selector=E;return F}}else{return o(H).find(E)}}else{if(o.isFunction(E)){return o(document).ready(E)}}if(E.selector&&E.context){this.selector=E.selector;this.context=E.context}return this.setArray(o.isArray(E)?E:o.makeArray(E))},selector:"",jquery:"1.3.2",size:function(){return this.length},get:function(E){return E===g?Array.prototype.slice.call(this):this[E]},pushStack:function(F,H,E){var G=o(F);G.prevObject=this;G.context=this.context;if(H==="find"){G.selector=this.selector+(this.selector?" ":"")+E}else{if(H){G.selector=this.selector+"."+H+"("+E+")"}}return G},setArray:function(E){this.length=0;Array.prototype.push.apply(this,E);return this},each:function(F,E){return o.each(this,F,E)},index:function(E){return o.inArray(E&&E.jquery?E[0]:E,this)},attr:function(F,H,G){var E=F;if(typeof F==="string"){if(H===g){return this[0]&&o[G||"attr"](this[0],F)}else{E={};E[F]=H}}return this.each(function(I){for(F in E){o.attr(G?this.style:this,F,o.prop(this,E[F],G,I,F))}})},css:function(E,F){if((E=="width"||E=="height")&&parseFloat(F)<0){F=g}return this.attr(E,F,"curCSS")},text:function(F){if(typeof F!=="object"&&F!=null){return this.empty().append((this[0]&&this[0].ownerDocument||document).createTextNode(F))}var E="";o.each(F||this,function(){o.each(this.childNodes,function(){if(this.nodeType!=8){E+=this.nodeType!=1?this.nodeValue:o.fn.text([this])}})});return E},wrapAll:function(E){if(this[0]){var F=o(E,this[0].ownerDocument).clone();if(this[0].parentNode){F.insertBefore(this[0])}F.map(function(){var G=this;while(G.firstChild){G=G.firstChild}return G}).append(this)}return this},wrapInner:function(E){return this.each(function(){o(this).contents().wrapAll(E)})},wrap:function(E){return this.each(function(){o(this).wrapAll(E)})},append:function(){return this.domManip(arguments,true,function(E){if(this.nodeType==1){this.appendChild(E)}})},prepend:function(){return this.domManip(arguments,true,function(E){if(this.nodeType==1){this.insertBefore(E,this.firstChild)}})},before:function(){return this.domManip(arguments,false,function(E){this.parentNode.insertBefore(E,this)})},after:function(){return this.domManip(arguments,false,function(E){this.parentNode.insertBefore(E,this.nextSibling)})},end:function(){return this.prevObject||o([])},push:[].push,sort:[].sort,splice:[].splice,find:function(E){if(this.length===1){var F=this.pushStack([],"find",E);F.length=0;o.find(E,this[0],F);return F}else{return this.pushStack(o.unique(o.map(this,function(G){return o.find(E,G)})),"find",E)}},clone:function(G){var E=this.map(function(){if(!o.support.noCloneEvent&&!o.isXMLDoc(this)){var I=this.outerHTML;if(!I){var J=this.ownerDocument.createElement("div");J.appendChild(this.cloneNode(true));I=J.innerHTML}return o.clean([I.replace(/ jQuery\d+="(?:\d+|null)"/g,"").replace(/^\s*/,"")])[0]}else{return this.cloneNode(true)}});if(G===true){var H=this.find("*").andSelf(),F=0;E.find("*").andSelf().each(function(){if(this.nodeName!==H[F].nodeName){return}var I=o.data(H[F],"events");for(var K in I){for(var J in I[K]){o.event.add(this,K,I[K][J],I[K][J].data)}}F++})}return E},filter:function(E){return this.pushStack(o.isFunction(E)&&o.grep(this,function(G,F){return E.call(G,F)})||o.multiFilter(E,o.grep(this,function(F){return F.nodeType===1})),"filter",E)},closest:function(E){var G=o.expr.match.POS.test(E)?o(E):null,F=0;return this.map(function(){var H=this;while(H&&H.ownerDocument){if(G?G.index(H)>-1:o(H).is(E)){o.data(H,"closest",F);return H}H=H.parentNode;F++}})},not:function(E){if(typeof E==="string"){if(f.test(E)){return this.pushStack(o.multiFilter(E,this,true),"not",E)}else{E=o.multiFilter(E,this)}}var F=E.length&&E[E.length-1]!==g&&!E.nodeType;return this.filter(function(){return F?o.inArray(this,E)<0:this!=E})},add:function(E){return this.pushStack(o.unique(o.merge(this.get(),typeof E==="string"?o(E):o.makeArray(E))))},is:function(E){return !!E&&o.multiFilter(E,this).length>0},hasClass:function(E){return !!E&&this.is("."+E)},val:function(K){if(K===g){var E=this[0];if(E){if(o.nodeName(E,"option")){return(E.attributes.value||{}).specified?E.value:E.text}if(o.nodeName(E,"select")){var I=E.selectedIndex,L=[],M=E.options,H=E.type=="select-one";if(I<0){return null}for(var F=H?I:0,J=H?I+1:M.length;F=0||o.inArray(this.name,K)>=0)}else{if(o.nodeName(this,"select")){var N=o.makeArray(K);o("option",this).each(function(){this.selected=(o.inArray(this.value,N)>=0||o.inArray(this.text,N)>=0)});if(!N.length){this.selectedIndex=-1}}else{this.value=K}}})},html:function(E){return E===g?(this[0]?this[0].innerHTML.replace(/ jQuery\d+="(?:\d+|null)"/g,""):null):this.empty().append(E)},replaceWith:function(E){return this.after(E).remove()},eq:function(E){return this.slice(E,+E+1)},slice:function(){return this.pushStack(Array.prototype.slice.apply(this,arguments),"slice",Array.prototype.slice.call(arguments).join(","))},map:function(E){return this.pushStack(o.map(this,function(G,F){return E.call(G,F,G)}))},andSelf:function(){return this.add(this.prevObject)},domManip:function(J,M,L){if(this[0]){var I=(this[0].ownerDocument||this[0]).createDocumentFragment(),F=o.clean(J,(this[0].ownerDocument||this[0]),I),H=I.firstChild;if(H){for(var G=0,E=this.length;G1||G>0?I.cloneNode(true):I)}}if(F){o.each(F,z)}}return this;function K(N,O){return M&&o.nodeName(N,"table")&&o.nodeName(O,"tr")?(N.getElementsByTagName("tbody")[0]||N.appendChild(N.ownerDocument.createElement("tbody"))):N}}};o.fn.init.prototype=o.fn;function z(E,F){if(F.src){o.ajax({url:F.src,async:false,dataType:"script"})}else{o.globalEval(F.text||F.textContent||F.innerHTML||"")}if(F.parentNode){F.parentNode.removeChild(F)}}function e(){return +new Date}o.extend=o.fn.extend=function(){var J=arguments[0]||{},H=1,I=arguments.length,E=false,G;if(typeof J==="boolean"){E=J;J=arguments[1]||{};H=2}if(typeof J!=="object"&&!o.isFunction(J)){J={}}if(I==H){J=this;--H}for(;H-1}},swap:function(H,G,I){var E={};for(var F in G){E[F]=H.style[F];H.style[F]=G[F]}I.call(H);for(var F in G){H.style[F]=E[F]}},css:function(H,F,J,E){if(F=="width"||F=="height"){var L,G={position:"absolute",visibility:"hidden",display:"block"},K=F=="width"?["Left","Right"]:["Top","Bottom"];function I(){L=F=="width"?H.offsetWidth:H.offsetHeight;if(E==="border"){return}o.each(K,function(){if(!E){L-=parseFloat(o.curCSS(H,"padding"+this,true))||0}if(E==="margin"){L+=parseFloat(o.curCSS(H,"margin"+this,true))||0}else{L-=parseFloat(o.curCSS(H,"border"+this+"Width",true))||0}})}if(H.offsetWidth!==0){I()}else{o.swap(H,G,I)}return Math.max(0,Math.round(L))}return o.curCSS(H,F,J)},curCSS:function(I,F,G){var L,E=I.style;if(F=="opacity"&&!o.support.opacity){L=o.attr(E,"opacity");return L==""?"1":L}if(F.match(/float/i)){F=w}if(!G&&E&&E[F]){L=E[F]}else{if(q.getComputedStyle){if(F.match(/float/i)){F="float"}F=F.replace(/([A-Z])/g,"-$1").toLowerCase();var M=q.getComputedStyle(I,null);if(M){L=M.getPropertyValue(F)}if(F=="opacity"&&L==""){L="1"}}else{if(I.currentStyle){var J=F.replace(/\-(\w)/g,function(N,O){return O.toUpperCase()});L=I.currentStyle[F]||I.currentStyle[J];if(!/^\d+(px)?$/i.test(L)&&/^\d/.test(L)){var H=E.left,K=I.runtimeStyle.left;I.runtimeStyle.left=I.currentStyle.left;E.left=L||0;L=E.pixelLeft+"px";E.left=H;I.runtimeStyle.left=K}}}}return L},clean:function(F,K,I){K=K||document;if(typeof K.createElement==="undefined"){K=K.ownerDocument||K[0]&&K[0].ownerDocument||document}if(!I&&F.length===1&&typeof F[0]==="string"){var H=/^<(\w+)\s*\/?>$/.exec(F[0]);if(H){return[K.createElement(H[1])]}}var G=[],E=[],L=K.createElement("div");o.each(F,function(P,S){if(typeof S==="number"){S+=""}if(!S){return}if(typeof S==="string"){S=S.replace(/(<(\w+)[^>]*?)\/>/g,function(U,V,T){return T.match(/^(abbr|br|col|img|input|link|meta|param|hr|area|embed)$/i)?U:V+">"});var O=S.replace(/^\s+/,"").substring(0,10).toLowerCase();var Q=!O.indexOf("",""]||!O.indexOf("",""]||O.match(/^<(thead|tbody|tfoot|colg|cap)/)&&[1,"","
    "]||!O.indexOf("",""]||(!O.indexOf("",""]||!O.indexOf("",""]||!o.support.htmlSerialize&&[1,"div
    ","
    "]||[0,"",""];L.innerHTML=Q[1]+S+Q[2];while(Q[0]--){L=L.lastChild}if(!o.support.tbody){var R=/"&&!R?L.childNodes:[];for(var M=N.length-1;M>=0;--M){if(o.nodeName(N[M],"tbody")&&!N[M].childNodes.length){N[M].parentNode.removeChild(N[M])}}}if(!o.support.leadingWhitespace&&/^\s/.test(S)){L.insertBefore(K.createTextNode(S.match(/^\s*/)[0]),L.firstChild)}S=o.makeArray(L.childNodes)}if(S.nodeType){G.push(S)}else{G=o.merge(G,S)}});if(I){for(var J=0;G[J];J++){if(o.nodeName(G[J],"script")&&(!G[J].type||G[J].type.toLowerCase()==="text/javascript")){E.push(G[J].parentNode?G[J].parentNode.removeChild(G[J]):G[J])}else{if(G[J].nodeType===1){G.splice.apply(G,[J+1,0].concat(o.makeArray(G[J].getElementsByTagName("script"))))}I.appendChild(G[J])}}return E}return G},attr:function(J,G,K){if(!J||J.nodeType==3||J.nodeType==8){return g}var H=!o.isXMLDoc(J),L=K!==g;G=H&&o.props[G]||G;if(J.tagName){var F=/href|src|style/.test(G);if(G=="selected"&&J.parentNode){J.parentNode.selectedIndex}if(G in J&&H&&!F){if(L){if(G=="type"&&o.nodeName(J,"input")&&J.parentNode){throw"type property can't be changed"}J[G]=K}if(o.nodeName(J,"form")&&J.getAttributeNode(G)){return J.getAttributeNode(G).nodeValue}if(G=="tabIndex"){var I=J.getAttributeNode("tabIndex");return I&&I.specified?I.value:J.nodeName.match(/(button|input|object|select|textarea)/i)?0:J.nodeName.match(/^(a|area)$/i)&&J.href?0:g}return J[G]}if(!o.support.style&&H&&G=="style"){return o.attr(J.style,"cssText",K)}if(L){J.setAttribute(G,""+K)}var E=!o.support.hrefNormalized&&H&&F?J.getAttribute(G,2):J.getAttribute(G);return E===null?g:E}if(!o.support.opacity&&G=="opacity"){if(L){J.zoom=1;J.filter=(J.filter||"").replace(/alpha\([^)]*\)/,"")+(parseInt(K)+""=="NaN"?"":"alpha(opacity="+K*100+")")}return J.filter&&J.filter.indexOf("opacity=")>=0?(parseFloat(J.filter.match(/opacity=([^)]*)/)[1])/100)+"":""}G=G.replace(/-([a-z])/ig,function(M,N){return N.toUpperCase()});if(L){J[G]=K}return J[G]},trim:function(E){return(E||"").replace(/^\s+|\s+$/g,"")},makeArray:function(G){var E=[];if(G!=null){var F=G.length;if(F==null||typeof G==="string"||o.isFunction(G)||G.setInterval){E[0]=G}else{while(F){E[--F]=G[F]}}}return E},inArray:function(G,H){for(var E=0,F=H.length;E0?this.clone(true):this).get();o.fn[F].apply(o(L[K]),I);J=J.concat(I)}return this.pushStack(J,E,G)}});o.each({removeAttr:function(E){o.attr(this,E,"");if(this.nodeType==1){this.removeAttribute(E)}},addClass:function(E){o.className.add(this,E)},removeClass:function(E){o.className.remove(this,E)},toggleClass:function(F,E){if(typeof E!=="boolean"){E=!o.className.has(this,F)}o.className[E?"add":"remove"](this,F)},remove:function(E){if(!E||o.filter(E,[this]).length){o("*",this).add([this]).each(function(){o.event.remove(this);o.removeData(this)});if(this.parentNode){this.parentNode.removeChild(this)}}},empty:function(){o(this).children().remove();while(this.firstChild){this.removeChild(this.firstChild)}}},function(E,F){o.fn[E]=function(){return this.each(F,arguments)}});function j(E,F){return E[0]&&parseInt(o.curCSS(E[0],F,true),10)||0}var h="jQuery"+e(),v=0,A={};o.extend({cache:{},data:function(F,E,G){F=F==l?A:F;var H=F[h];if(!H){H=F[h]=++v}if(E&&!o.cache[H]){o.cache[H]={}}if(G!==g){o.cache[H][E]=G}return E?o.cache[H][E]:H},removeData:function(F,E){F=F==l?A:F;var H=F[h];if(E){if(o.cache[H]){delete o.cache[H][E];E="";for(E in o.cache[H]){break}if(!E){o.removeData(F)}}}else{try{delete F[h]}catch(G){if(F.removeAttribute){F.removeAttribute(h)}}delete o.cache[H]}},queue:function(F,E,H){if(F){E=(E||"fx")+"queue";var G=o.data(F,E);if(!G||o.isArray(H)){G=o.data(F,E,o.makeArray(H))}else{if(H){G.push(H)}}}return G},dequeue:function(H,G){var E=o.queue(H,G),F=E.shift();if(!G||G==="fx"){F=E[0]}if(F!==g){F.call(H)}}});o.fn.extend({data:function(E,G){var H=E.split(".");H[1]=H[1]?"."+H[1]:"";if(G===g){var F=this.triggerHandler("getData"+H[1]+"!",[H[0]]);if(F===g&&this.length){F=o.data(this[0],E)}return F===g&&H[1]?this.data(H[0]):F}else{return this.trigger("setData"+H[1]+"!",[H[0],G]).each(function(){o.data(this,E,G)})}},removeData:function(E){return this.each(function(){o.removeData(this,E)})},queue:function(E,F){if(typeof E!=="string"){F=E;E="fx"}if(F===g){return o.queue(this[0],E)}return this.each(function(){var G=o.queue(this,E,F);if(E=="fx"&&G.length==1){G[0].call(this)}})},dequeue:function(E){return this.each(function(){o.dequeue(this,E)})}}); +/* + * Sizzle CSS Selector Engine - v0.9.3 + * Copyright 2009, The Dojo Foundation + * Released under the MIT, BSD, and GPL Licenses. + * More information: http://sizzlejs.com/ + */ +(function(){var R=/((?:\((?:\([^()]+\)|[^()]+)+\)|\[(?:\[[^[\]]*\]|['"][^'"]*['"]|[^[\]'"]+)+\]|\\.|[^ >+~,(\[\\]+)+|[>+~])(\s*,\s*)?/g,L=0,H=Object.prototype.toString;var F=function(Y,U,ab,ac){ab=ab||[];U=U||document;if(U.nodeType!==1&&U.nodeType!==9){return[]}if(!Y||typeof Y!=="string"){return ab}var Z=[],W,af,ai,T,ad,V,X=true;R.lastIndex=0;while((W=R.exec(Y))!==null){Z.push(W[1]);if(W[2]){V=RegExp.rightContext;break}}if(Z.length>1&&M.exec(Y)){if(Z.length===2&&I.relative[Z[0]]){af=J(Z[0]+Z[1],U)}else{af=I.relative[Z[0]]?[U]:F(Z.shift(),U);while(Z.length){Y=Z.shift();if(I.relative[Y]){Y+=Z.shift()}af=J(Y,af)}}}else{var ae=ac?{expr:Z.pop(),set:E(ac)}:F.find(Z.pop(),Z.length===1&&U.parentNode?U.parentNode:U,Q(U));af=F.filter(ae.expr,ae.set);if(Z.length>0){ai=E(af)}else{X=false}while(Z.length){var ah=Z.pop(),ag=ah;if(!I.relative[ah]){ah=""}else{ag=Z.pop()}if(ag==null){ag=U}I.relative[ah](ai,ag,Q(U))}}if(!ai){ai=af}if(!ai){throw"Syntax error, unrecognized expression: "+(ah||Y)}if(H.call(ai)==="[object Array]"){if(!X){ab.push.apply(ab,ai)}else{if(U.nodeType===1){for(var aa=0;ai[aa]!=null;aa++){if(ai[aa]&&(ai[aa]===true||ai[aa].nodeType===1&&K(U,ai[aa]))){ab.push(af[aa])}}}else{for(var aa=0;ai[aa]!=null;aa++){if(ai[aa]&&ai[aa].nodeType===1){ab.push(af[aa])}}}}}else{E(ai,ab)}if(V){F(V,U,ab,ac);if(G){hasDuplicate=false;ab.sort(G);if(hasDuplicate){for(var aa=1;aa":function(Z,U,aa){var X=typeof U==="string";if(X&&!/\W/.test(U)){U=aa?U:U.toUpperCase();for(var V=0,T=Z.length;V=0)){if(!V){T.push(Y)}}else{if(V){U[X]=false}}}}return false},ID:function(T){return T[1].replace(/\\/g,"")},TAG:function(U,T){for(var V=0;T[V]===false;V++){}return T[V]&&Q(T[V])?U[1]:U[1].toUpperCase()},CHILD:function(T){if(T[1]=="nth"){var U=/(-?)(\d*)n((?:\+|-)?\d*)/.exec(T[2]=="even"&&"2n"||T[2]=="odd"&&"2n+1"||!/\D/.test(T[2])&&"0n+"+T[2]||T[2]);T[2]=(U[1]+(U[2]||1))-0;T[3]=U[3]-0}T[0]=L++;return T},ATTR:function(X,U,V,T,Y,Z){var W=X[1].replace(/\\/g,"");if(!Z&&I.attrMap[W]){X[1]=I.attrMap[W]}if(X[2]==="~="){X[4]=" "+X[4]+" "}return X},PSEUDO:function(X,U,V,T,Y){if(X[1]==="not"){if(X[3].match(R).length>1||/^\w/.test(X[3])){X[3]=F(X[3],null,null,U)}else{var W=F.filter(X[3],U,V,true^Y);if(!V){T.push.apply(T,W)}return false}}else{if(I.match.POS.test(X[0])||I.match.CHILD.test(X[0])){return true}}return X},POS:function(T){T.unshift(true);return T}},filters:{enabled:function(T){return T.disabled===false&&T.type!=="hidden"},disabled:function(T){return T.disabled===true},checked:function(T){return T.checked===true},selected:function(T){T.parentNode.selectedIndex;return T.selected===true},parent:function(T){return !!T.firstChild},empty:function(T){return !T.firstChild},has:function(V,U,T){return !!F(T[3],V).length},header:function(T){return/h\d/i.test(T.nodeName)},text:function(T){return"text"===T.type},radio:function(T){return"radio"===T.type},checkbox:function(T){return"checkbox"===T.type},file:function(T){return"file"===T.type},password:function(T){return"password"===T.type},submit:function(T){return"submit"===T.type},image:function(T){return"image"===T.type},reset:function(T){return"reset"===T.type},button:function(T){return"button"===T.type||T.nodeName.toUpperCase()==="BUTTON"},input:function(T){return/input|select|textarea|button/i.test(T.nodeName)}},setFilters:{first:function(U,T){return T===0},last:function(V,U,T,W){return U===W.length-1},even:function(U,T){return T%2===0},odd:function(U,T){return T%2===1},lt:function(V,U,T){return UT[3]-0},nth:function(V,U,T){return T[3]-0==U},eq:function(V,U,T){return T[3]-0==U}},filter:{PSEUDO:function(Z,V,W,aa){var U=V[1],X=I.filters[U];if(X){return X(Z,W,V,aa)}else{if(U==="contains"){return(Z.textContent||Z.innerText||"").indexOf(V[3])>=0}else{if(U==="not"){var Y=V[3];for(var W=0,T=Y.length;W=0)}}},ID:function(U,T){return U.nodeType===1&&U.getAttribute("id")===T},TAG:function(U,T){return(T==="*"&&U.nodeType===1)||U.nodeName===T},CLASS:function(U,T){return(" "+(U.className||U.getAttribute("class"))+" ").indexOf(T)>-1},ATTR:function(Y,W){var V=W[1],T=I.attrHandle[V]?I.attrHandle[V](Y):Y[V]!=null?Y[V]:Y.getAttribute(V),Z=T+"",X=W[2],U=W[4];return T==null?X==="!=":X==="="?Z===U:X==="*="?Z.indexOf(U)>=0:X==="~="?(" "+Z+" ").indexOf(U)>=0:!U?Z&&T!==false:X==="!="?Z!=U:X==="^="?Z.indexOf(U)===0:X==="$="?Z.substr(Z.length-U.length)===U:X==="|="?Z===U||Z.substr(0,U.length+1)===U+"-":false},POS:function(X,U,V,Y){var T=U[2],W=I.setFilters[T];if(W){return W(X,V,U,Y)}}}};var M=I.match.POS;for(var O in I.match){I.match[O]=RegExp(I.match[O].source+/(?![^\[]*\])(?![^\(]*\))/.source)}var E=function(U,T){U=Array.prototype.slice.call(U);if(T){T.push.apply(T,U);return T}return U};try{Array.prototype.slice.call(document.documentElement.childNodes)}catch(N){E=function(X,W){var U=W||[];if(H.call(X)==="[object Array]"){Array.prototype.push.apply(U,X)}else{if(typeof X.length==="number"){for(var V=0,T=X.length;V";var T=document.documentElement;T.insertBefore(U,T.firstChild);if(!!document.getElementById(V)){I.find.ID=function(X,Y,Z){if(typeof Y.getElementById!=="undefined"&&!Z){var W=Y.getElementById(X[1]);return W?W.id===X[1]||typeof W.getAttributeNode!=="undefined"&&W.getAttributeNode("id").nodeValue===X[1]?[W]:g:[]}};I.filter.ID=function(Y,W){var X=typeof Y.getAttributeNode!=="undefined"&&Y.getAttributeNode("id");return Y.nodeType===1&&X&&X.nodeValue===W}}T.removeChild(U)})();(function(){var T=document.createElement("div");T.appendChild(document.createComment(""));if(T.getElementsByTagName("*").length>0){I.find.TAG=function(U,Y){var X=Y.getElementsByTagName(U[1]);if(U[1]==="*"){var W=[];for(var V=0;X[V];V++){if(X[V].nodeType===1){W.push(X[V])}}X=W}return X}}T.innerHTML="";if(T.firstChild&&typeof T.firstChild.getAttribute!=="undefined"&&T.firstChild.getAttribute("href")!=="#"){I.attrHandle.href=function(U){return U.getAttribute("href",2)}}})();if(document.querySelectorAll){(function(){var T=F,U=document.createElement("div");U.innerHTML="

    ";if(U.querySelectorAll&&U.querySelectorAll(".TEST").length===0){return}F=function(Y,X,V,W){X=X||document;if(!W&&X.nodeType===9&&!Q(X)){try{return E(X.querySelectorAll(Y),V)}catch(Z){}}return T(Y,X,V,W)};F.find=T.find;F.filter=T.filter;F.selectors=T.selectors;F.matches=T.matches})()}if(document.getElementsByClassName&&document.documentElement.getElementsByClassName){(function(){var T=document.createElement("div");T.innerHTML="
    ";if(T.getElementsByClassName("e").length===0){return}T.lastChild.className="e";if(T.getElementsByClassName("e").length===1){return}I.order.splice(1,0,"CLASS");I.find.CLASS=function(U,V,W){if(typeof V.getElementsByClassName!=="undefined"&&!W){return V.getElementsByClassName(U[1])}}})()}function P(U,Z,Y,ad,aa,ac){var ab=U=="previousSibling"&&!ac;for(var W=0,V=ad.length;W0){X=T;break}}}T=T[U]}ad[W]=X}}}var K=document.compareDocumentPosition?function(U,T){return U.compareDocumentPosition(T)&16}:function(U,T){return U!==T&&(U.contains?U.contains(T):true)};var Q=function(T){return T.nodeType===9&&T.documentElement.nodeName!=="HTML"||!!T.ownerDocument&&Q(T.ownerDocument)};var J=function(T,aa){var W=[],X="",Y,V=aa.nodeType?[aa]:aa;while((Y=I.match.PSEUDO.exec(T))){X+=Y[0];T=T.replace(I.match.PSEUDO,"")}T=I.relative[T]?T+"*":T;for(var Z=0,U=V.length;Z0||T.offsetHeight>0};F.selectors.filters.animated=function(T){return o.grep(o.timers,function(U){return T===U.elem}).length};o.multiFilter=function(V,T,U){if(U){V=":not("+V+")"}return F.matches(V,T)};o.dir=function(V,U){var T=[],W=V[U];while(W&&W!=document){if(W.nodeType==1){T.push(W)}W=W[U]}return T};o.nth=function(X,T,V,W){T=T||1;var U=0;for(;X;X=X[V]){if(X.nodeType==1&&++U==T){break}}return X};o.sibling=function(V,U){var T=[];for(;V;V=V.nextSibling){if(V.nodeType==1&&V!=U){T.push(V)}}return T};return;l.Sizzle=F})();o.event={add:function(I,F,H,K){if(I.nodeType==3||I.nodeType==8){return}if(I.setInterval&&I!=l){I=l}if(!H.guid){H.guid=this.guid++}if(K!==g){var G=H;H=this.proxy(G);H.data=K}var E=o.data(I,"events")||o.data(I,"events",{}),J=o.data(I,"handle")||o.data(I,"handle",function(){return typeof o!=="undefined"&&!o.event.triggered?o.event.handle.apply(arguments.callee.elem,arguments):g});J.elem=I;o.each(F.split(/\s+/),function(M,N){var O=N.split(".");N=O.shift();H.type=O.slice().sort().join(".");var L=E[N];if(o.event.specialAll[N]){o.event.specialAll[N].setup.call(I,K,O)}if(!L){L=E[N]={};if(!o.event.special[N]||o.event.special[N].setup.call(I,K,O)===false){if(I.addEventListener){I.addEventListener(N,J,false)}else{if(I.attachEvent){I.attachEvent("on"+N,J)}}}}L[H.guid]=H;o.event.global[N]=true});I=null},guid:1,global:{},remove:function(K,H,J){if(K.nodeType==3||K.nodeType==8){return}var G=o.data(K,"events"),F,E;if(G){if(H===g||(typeof H==="string"&&H.charAt(0)==".")){for(var I in G){this.remove(K,I+(H||""))}}else{if(H.type){J=H.handler;H=H.type}o.each(H.split(/\s+/),function(M,O){var Q=O.split(".");O=Q.shift();var N=RegExp("(^|\\.)"+Q.slice().sort().join(".*\\.")+"(\\.|$)");if(G[O]){if(J){delete G[O][J.guid]}else{for(var P in G[O]){if(N.test(G[O][P].type)){delete G[O][P]}}}if(o.event.specialAll[O]){o.event.specialAll[O].teardown.call(K,Q)}for(F in G[O]){break}if(!F){if(!o.event.special[O]||o.event.special[O].teardown.call(K,Q)===false){if(K.removeEventListener){K.removeEventListener(O,o.data(K,"handle"),false)}else{if(K.detachEvent){K.detachEvent("on"+O,o.data(K,"handle"))}}}F=null;delete G[O]}}})}for(F in G){break}if(!F){var L=o.data(K,"handle");if(L){L.elem=null}o.removeData(K,"events");o.removeData(K,"handle")}}},trigger:function(I,K,H,E){var G=I.type||I;if(!E){I=typeof I==="object"?I[h]?I:o.extend(o.Event(G),I):o.Event(G);if(G.indexOf("!")>=0){I.type=G=G.slice(0,-1);I.exclusive=true}if(!H){I.stopPropagation();if(this.global[G]){o.each(o.cache,function(){if(this.events&&this.events[G]){o.event.trigger(I,K,this.handle.elem)}})}}if(!H||H.nodeType==3||H.nodeType==8){return g}I.result=g;I.target=H;K=o.makeArray(K);K.unshift(I)}I.currentTarget=H;var J=o.data(H,"handle");if(J){J.apply(H,K)}if((!H[G]||(o.nodeName(H,"a")&&G=="click"))&&H["on"+G]&&H["on"+G].apply(H,K)===false){I.result=false}if(!E&&H[G]&&!I.isDefaultPrevented()&&!(o.nodeName(H,"a")&&G=="click")){this.triggered=true;try{H[G]()}catch(L){}}this.triggered=false;if(!I.isPropagationStopped()){var F=H.parentNode||H.ownerDocument;if(F){o.event.trigger(I,K,F,true)}}},handle:function(K){var J,E;K=arguments[0]=o.event.fix(K||l.event);K.currentTarget=this;var L=K.type.split(".");K.type=L.shift();J=!L.length&&!K.exclusive;var I=RegExp("(^|\\.)"+L.slice().sort().join(".*\\.")+"(\\.|$)");E=(o.data(this,"events")||{})[K.type];for(var G in E){var H=E[G];if(J||I.test(H.type)){K.handler=H;K.data=H.data;var F=H.apply(this,arguments);if(F!==g){K.result=F;if(F===false){K.preventDefault();K.stopPropagation()}}if(K.isImmediatePropagationStopped()){break}}}},props:"altKey attrChange attrName bubbles button cancelable charCode clientX clientY ctrlKey currentTarget data detail eventPhase fromElement handler keyCode metaKey newValue originalTarget pageX pageY prevValue relatedNode relatedTarget screenX screenY shiftKey srcElement target toElement view wheelDelta which".split(" "),fix:function(H){if(H[h]){return H}var F=H;H=o.Event(F);for(var G=this.props.length,J;G;){J=this.props[--G];H[J]=F[J]}if(!H.target){H.target=H.srcElement||document}if(H.target.nodeType==3){H.target=H.target.parentNode}if(!H.relatedTarget&&H.fromElement){H.relatedTarget=H.fromElement==H.target?H.toElement:H.fromElement}if(H.pageX==null&&H.clientX!=null){var I=document.documentElement,E=document.body;H.pageX=H.clientX+(I&&I.scrollLeft||E&&E.scrollLeft||0)-(I.clientLeft||0);H.pageY=H.clientY+(I&&I.scrollTop||E&&E.scrollTop||0)-(I.clientTop||0)}if(!H.which&&((H.charCode||H.charCode===0)?H.charCode:H.keyCode)){H.which=H.charCode||H.keyCode}if(!H.metaKey&&H.ctrlKey){H.metaKey=H.ctrlKey}if(!H.which&&H.button){H.which=(H.button&1?1:(H.button&2?3:(H.button&4?2:0)))}return H},proxy:function(F,E){E=E||function(){return F.apply(this,arguments)};E.guid=F.guid=F.guid||E.guid||this.guid++;return E},special:{ready:{setup:B,teardown:function(){}}},specialAll:{live:{setup:function(E,F){o.event.add(this,F[0],c)},teardown:function(G){if(G.length){var E=0,F=RegExp("(^|\\.)"+G[0]+"(\\.|$)");o.each((o.data(this,"events").live||{}),function(){if(F.test(this.type)){E++}});if(E<1){o.event.remove(this,G[0],c)}}}}}};o.Event=function(E){if(!this.preventDefault){return new o.Event(E)}if(E&&E.type){this.originalEvent=E;this.type=E.type}else{this.type=E}this.timeStamp=e();this[h]=true};function k(){return false}function u(){return true}o.Event.prototype={preventDefault:function(){this.isDefaultPrevented=u;var E=this.originalEvent;if(!E){return}if(E.preventDefault){E.preventDefault()}E.returnValue=false},stopPropagation:function(){this.isPropagationStopped=u;var E=this.originalEvent;if(!E){return}if(E.stopPropagation){E.stopPropagation()}E.cancelBubble=true},stopImmediatePropagation:function(){this.isImmediatePropagationStopped=u;this.stopPropagation()},isDefaultPrevented:k,isPropagationStopped:k,isImmediatePropagationStopped:k};var a=function(F){var E=F.relatedTarget;while(E&&E!=this){try{E=E.parentNode}catch(G){E=this}}if(E!=this){F.type=F.data;o.event.handle.apply(this,arguments)}};o.each({mouseover:"mouseenter",mouseout:"mouseleave"},function(F,E){o.event.special[E]={setup:function(){o.event.add(this,F,a,E)},teardown:function(){o.event.remove(this,F,a)}}});o.fn.extend({bind:function(F,G,E){return F=="unload"?this.one(F,G,E):this.each(function(){o.event.add(this,F,E||G,E&&G)})},one:function(G,H,F){var E=o.event.proxy(F||H,function(I){o(this).unbind(I,E);return(F||H).apply(this,arguments)});return this.each(function(){o.event.add(this,G,E,F&&H)})},unbind:function(F,E){return this.each(function(){o.event.remove(this,F,E)})},trigger:function(E,F){return this.each(function(){o.event.trigger(E,F,this)})},triggerHandler:function(E,G){if(this[0]){var F=o.Event(E);F.preventDefault();F.stopPropagation();o.event.trigger(F,G,this[0]);return F.result}},toggle:function(G){var E=arguments,F=1;while(F=0){var E=G.slice(I,G.length);G=G.slice(0,I)}var H="GET";if(J){if(o.isFunction(J)){K=J;J=null}else{if(typeof J==="object"){J=o.param(J);H="POST"}}}var F=this;o.ajax({url:G,type:H,dataType:"html",data:J,complete:function(M,L){if(L=="success"||L=="notmodified"){F.html(E?o("
    ").append(M.responseText.replace(//g,"")).find(E):M.responseText)}if(K){F.each(K,[M.responseText,L,M])}}});return this},serialize:function(){return o.param(this.serializeArray())},serializeArray:function(){return this.map(function(){return this.elements?o.makeArray(this.elements):this}).filter(function(){return this.name&&!this.disabled&&(this.checked||/select|textarea/i.test(this.nodeName)||/text|hidden|password|search/i.test(this.type))}).map(function(E,F){var G=o(this).val();return G==null?null:o.isArray(G)?o.map(G,function(I,H){return{name:F.name,value:I}}):{name:F.name,value:G}}).get()}});o.each("ajaxStart,ajaxStop,ajaxComplete,ajaxError,ajaxSuccess,ajaxSend".split(","),function(E,F){o.fn[F]=function(G){return this.bind(F,G)}});var r=e();o.extend({get:function(E,G,H,F){if(o.isFunction(G)){H=G;G=null}return o.ajax({type:"GET",url:E,data:G,success:H,dataType:F})},getScript:function(E,F){return o.get(E,null,F,"script")},getJSON:function(E,F,G){return o.get(E,F,G,"json")},post:function(E,G,H,F){if(o.isFunction(G)){H=G;G={}}return o.ajax({type:"POST",url:E,data:G,success:H,dataType:F})},ajaxSetup:function(E){o.extend(o.ajaxSettings,E)},ajaxSettings:{url:location.href,global:true,type:"GET",contentType:"application/x-www-form-urlencoded",processData:true,async:true,xhr:function(){return l.ActiveXObject?new ActiveXObject("Microsoft.XMLHTTP"):new XMLHttpRequest()},accepts:{xml:"application/xml, text/xml",html:"text/html",script:"text/javascript, application/javascript",json:"application/json, text/javascript",text:"text/plain",_default:"*/*"}},lastModified:{},ajax:function(M){M=o.extend(true,M,o.extend(true,{},o.ajaxSettings,M));var W,F=/=\?(&|$)/g,R,V,G=M.type.toUpperCase();if(M.data&&M.processData&&typeof M.data!=="string"){M.data=o.param(M.data)}if(M.dataType=="jsonp"){if(G=="GET"){if(!M.url.match(F)){M.url+=(M.url.match(/\?/)?"&":"?")+(M.jsonp||"callback")+"=?"}}else{if(!M.data||!M.data.match(F)){M.data=(M.data?M.data+"&":"")+(M.jsonp||"callback")+"=?"}}M.dataType="json"}if(M.dataType=="json"&&(M.data&&M.data.match(F)||M.url.match(F))){W="jsonp"+r++;if(M.data){M.data=(M.data+"").replace(F,"="+W+"$1")}M.url=M.url.replace(F,"="+W+"$1");M.dataType="script";l[W]=function(X){V=X;I();L();l[W]=g;try{delete l[W]}catch(Y){}if(H){H.removeChild(T)}}}if(M.dataType=="script"&&M.cache==null){M.cache=false}if(M.cache===false&&G=="GET"){var E=e();var U=M.url.replace(/(\?|&)_=.*?(&|$)/,"$1_="+E+"$2");M.url=U+((U==M.url)?(M.url.match(/\?/)?"&":"?")+"_="+E:"")}if(M.data&&G=="GET"){M.url+=(M.url.match(/\?/)?"&":"?")+M.data;M.data=null}if(M.global&&!o.active++){o.event.trigger("ajaxStart")}var Q=/^(\w+:)?\/\/([^\/?#]+)/.exec(M.url);if(M.dataType=="script"&&G=="GET"&&Q&&(Q[1]&&Q[1]!=location.protocol||Q[2]!=location.host)){var H=document.getElementsByTagName("head")[0];var T=document.createElement("script");T.src=M.url;if(M.scriptCharset){T.charset=M.scriptCharset}if(!W){var O=false;T.onload=T.onreadystatechange=function(){if(!O&&(!this.readyState||this.readyState=="loaded"||this.readyState=="complete")){O=true;I();L();T.onload=T.onreadystatechange=null;H.removeChild(T)}}}H.appendChild(T);return g}var K=false;var J=M.xhr();if(M.username){J.open(G,M.url,M.async,M.username,M.password)}else{J.open(G,M.url,M.async)}try{if(M.data){J.setRequestHeader("Content-Type",M.contentType)}if(M.ifModified){J.setRequestHeader("If-Modified-Since",o.lastModified[M.url]||"Thu, 01 Jan 1970 00:00:00 GMT")}J.setRequestHeader("X-Requested-With","XMLHttpRequest");J.setRequestHeader("Accept",M.dataType&&M.accepts[M.dataType]?M.accepts[M.dataType]+", */*":M.accepts._default)}catch(S){}if(M.beforeSend&&M.beforeSend(J,M)===false){if(M.global&&!--o.active){o.event.trigger("ajaxStop")}J.abort();return false}if(M.global){o.event.trigger("ajaxSend",[J,M])}var N=function(X){if(J.readyState==0){if(P){clearInterval(P);P=null;if(M.global&&!--o.active){o.event.trigger("ajaxStop")}}}else{if(!K&&J&&(J.readyState==4||X=="timeout")){K=true;if(P){clearInterval(P);P=null}R=X=="timeout"?"timeout":!o.httpSuccess(J)?"error":M.ifModified&&o.httpNotModified(J,M.url)?"notmodified":"success";if(R=="success"){try{V=o.httpData(J,M.dataType,M)}catch(Z){R="parsererror"}}if(R=="success"){var Y;try{Y=J.getResponseHeader("Last-Modified")}catch(Z){}if(M.ifModified&&Y){o.lastModified[M.url]=Y}if(!W){I()}}else{o.handleError(M,J,R)}L();if(X){J.abort()}if(M.async){J=null}}}};if(M.async){var P=setInterval(N,13);if(M.timeout>0){setTimeout(function(){if(J&&!K){N("timeout")}},M.timeout)}}try{J.send(M.data)}catch(S){o.handleError(M,J,null,S)}if(!M.async){N()}function I(){if(M.success){M.success(V,R)}if(M.global){o.event.trigger("ajaxSuccess",[J,M])}}function L(){if(M.complete){M.complete(J,R)}if(M.global){o.event.trigger("ajaxComplete",[J,M])}if(M.global&&!--o.active){o.event.trigger("ajaxStop")}}return J},handleError:function(F,H,E,G){if(F.error){F.error(H,E,G)}if(F.global){o.event.trigger("ajaxError",[H,F,G])}},active:0,httpSuccess:function(F){try{return !F.status&&location.protocol=="file:"||(F.status>=200&&F.status<300)||F.status==304||F.status==1223}catch(E){}return false},httpNotModified:function(G,E){try{var H=G.getResponseHeader("Last-Modified");return G.status==304||H==o.lastModified[E]}catch(F){}return false},httpData:function(J,H,G){var F=J.getResponseHeader("content-type"),E=H=="xml"||!H&&F&&F.indexOf("xml")>=0,I=E?J.responseXML:J.responseText;if(E&&I.documentElement.tagName=="parsererror"){throw"parsererror"}if(G&&G.dataFilter){I=G.dataFilter(I,H)}if(typeof I==="string"){if(H=="script"){o.globalEval(I)}if(H=="json"){I=l["eval"]("("+I+")")}}return I},param:function(E){var G=[];function H(I,J){G[G.length]=encodeURIComponent(I)+"="+encodeURIComponent(J)}if(o.isArray(E)||E.jquery){o.each(E,function(){H(this.name,this.value)})}else{for(var F in E){if(o.isArray(E[F])){o.each(E[F],function(){H(F,this)})}else{H(F,o.isFunction(E[F])?E[F]():E[F])}}}return G.join("&").replace(/%20/g,"+")}});var m={},n,d=[["height","marginTop","marginBottom","paddingTop","paddingBottom"],["width","marginLeft","marginRight","paddingLeft","paddingRight"],["opacity"]];function t(F,E){var G={};o.each(d.concat.apply([],d.slice(0,E)),function(){G[this]=F});return G}o.fn.extend({show:function(J,L){if(J){return this.animate(t("show",3),J,L)}else{for(var H=0,F=this.length;H").appendTo("body");K=I.css("display");if(K==="none"){K="block"}I.remove();m[G]=K}o.data(this[H],"olddisplay",K)}}for(var H=0,F=this.length;H=0;H--){if(G[H].elem==this){if(E){G[H](true)}G.splice(H,1)}}});if(!E){this.dequeue()}return this}});o.each({slideDown:t("show",1),slideUp:t("hide",1),slideToggle:t("toggle",1),fadeIn:{opacity:"show"},fadeOut:{opacity:"hide"}},function(E,F){o.fn[E]=function(G,H){return this.animate(F,G,H)}});o.extend({speed:function(G,H,F){var E=typeof G==="object"?G:{complete:F||!F&&H||o.isFunction(G)&&G,duration:G,easing:F&&H||H&&!o.isFunction(H)&&H};E.duration=o.fx.off?0:typeof E.duration==="number"?E.duration:o.fx.speeds[E.duration]||o.fx.speeds._default;E.old=E.complete;E.complete=function(){if(E.queue!==false){o(this).dequeue()}if(o.isFunction(E.old)){E.old.call(this)}};return E},easing:{linear:function(G,H,E,F){return E+F*G},swing:function(G,H,E,F){return((-Math.cos(G*Math.PI)/2)+0.5)*F+E}},timers:[],fx:function(F,E,G){this.options=E;this.elem=F;this.prop=G;if(!E.orig){E.orig={}}}});o.fx.prototype={update:function(){if(this.options.step){this.options.step.call(this.elem,this.now,this)}(o.fx.step[this.prop]||o.fx.step._default)(this);if((this.prop=="height"||this.prop=="width")&&this.elem.style){this.elem.style.display="block"}},cur:function(F){if(this.elem[this.prop]!=null&&(!this.elem.style||this.elem.style[this.prop]==null)){return this.elem[this.prop]}var E=parseFloat(o.css(this.elem,this.prop,F));return E&&E>-10000?E:parseFloat(o.curCSS(this.elem,this.prop))||0},custom:function(I,H,G){this.startTime=e();this.start=I;this.end=H;this.unit=G||this.unit||"px";this.now=this.start;this.pos=this.state=0;var E=this;function F(J){return E.step(J)}F.elem=this.elem;if(F()&&o.timers.push(F)&&!n){n=setInterval(function(){var K=o.timers;for(var J=0;J=this.options.duration+this.startTime){this.now=this.end;this.pos=this.state=1;this.update();this.options.curAnim[this.prop]=true;var E=true;for(var F in this.options.curAnim){if(this.options.curAnim[F]!==true){E=false}}if(E){if(this.options.display!=null){this.elem.style.overflow=this.options.overflow;this.elem.style.display=this.options.display;if(o.css(this.elem,"display")=="none"){this.elem.style.display="block"}}if(this.options.hide){o(this.elem).hide()}if(this.options.hide||this.options.show){for(var I in this.options.curAnim){o.attr(this.elem.style,I,this.options.orig[I])}}this.options.complete.call(this.elem)}return false}else{var J=G-this.startTime;this.state=J/this.options.duration;this.pos=o.easing[this.options.easing||(o.easing.swing?"swing":"linear")](this.state,J,0,1,this.options.duration);this.now=this.start+((this.end-this.start)*this.pos);this.update()}return true}};o.extend(o.fx,{speeds:{slow:600,fast:200,_default:400},step:{opacity:function(E){o.attr(E.elem.style,"opacity",E.now)},_default:function(E){if(E.elem.style&&E.elem.style[E.prop]!=null){E.elem.style[E.prop]=E.now+E.unit}else{E.elem[E.prop]=E.now}}}});if(document.documentElement.getBoundingClientRect){o.fn.offset=function(){if(!this[0]){return{top:0,left:0}}if(this[0]===this[0].ownerDocument.body){return o.offset.bodyOffset(this[0])}var G=this[0].getBoundingClientRect(),J=this[0].ownerDocument,F=J.body,E=J.documentElement,L=E.clientTop||F.clientTop||0,K=E.clientLeft||F.clientLeft||0,I=G.top+(self.pageYOffset||o.boxModel&&E.scrollTop||F.scrollTop)-L,H=G.left+(self.pageXOffset||o.boxModel&&E.scrollLeft||F.scrollLeft)-K;return{top:I,left:H}}}else{o.fn.offset=function(){if(!this[0]){return{top:0,left:0}}if(this[0]===this[0].ownerDocument.body){return o.offset.bodyOffset(this[0])}o.offset.initialized||o.offset.initialize();var J=this[0],G=J.offsetParent,F=J,O=J.ownerDocument,M,H=O.documentElement,K=O.body,L=O.defaultView,E=L.getComputedStyle(J,null),N=J.offsetTop,I=J.offsetLeft;while((J=J.parentNode)&&J!==K&&J!==H){M=L.getComputedStyle(J,null);N-=J.scrollTop,I-=J.scrollLeft;if(J===G){N+=J.offsetTop,I+=J.offsetLeft;if(o.offset.doesNotAddBorder&&!(o.offset.doesAddBorderForTableAndCells&&/^t(able|d|h)$/i.test(J.tagName))){N+=parseInt(M.borderTopWidth,10)||0,I+=parseInt(M.borderLeftWidth,10)||0}F=G,G=J.offsetParent}if(o.offset.subtractsBorderForOverflowNotVisible&&M.overflow!=="visible"){N+=parseInt(M.borderTopWidth,10)||0,I+=parseInt(M.borderLeftWidth,10)||0}E=M}if(E.position==="relative"||E.position==="static"){N+=K.offsetTop,I+=K.offsetLeft}if(E.position==="fixed"){N+=Math.max(H.scrollTop,K.scrollTop),I+=Math.max(H.scrollLeft,K.scrollLeft)}return{top:N,left:I}}}o.offset={initialize:function(){if(this.initialized){return}var L=document.body,F=document.createElement("div"),H,G,N,I,M,E,J=L.style.marginTop,K='
    ';M={position:"absolute",top:0,left:0,margin:0,border:0,width:"1px",height:"1px",visibility:"hidden"};for(E in M){F.style[E]=M[E]}F.innerHTML=K;L.insertBefore(F,L.firstChild);H=F.firstChild,G=H.firstChild,I=H.nextSibling.firstChild.firstChild;this.doesNotAddBorder=(G.offsetTop!==5);this.doesAddBorderForTableAndCells=(I.offsetTop===5);H.style.overflow="hidden",H.style.position="relative";this.subtractsBorderForOverflowNotVisible=(G.offsetTop===-5);L.style.marginTop="1px";this.doesNotIncludeMarginInBodyOffset=(L.offsetTop===0);L.style.marginTop=J;L.removeChild(F);this.initialized=true},bodyOffset:function(E){o.offset.initialized||o.offset.initialize();var G=E.offsetTop,F=E.offsetLeft;if(o.offset.doesNotIncludeMarginInBodyOffset){G+=parseInt(o.curCSS(E,"marginTop",true),10)||0,F+=parseInt(o.curCSS(E,"marginLeft",true),10)||0}return{top:G,left:F}}};o.fn.extend({position:function(){var I=0,H=0,F;if(this[0]){var G=this.offsetParent(),J=this.offset(),E=/^body|html$/i.test(G[0].tagName)?{top:0,left:0}:G.offset();J.top-=j(this,"marginTop");J.left-=j(this,"marginLeft");E.top+=j(G,"borderTopWidth");E.left+=j(G,"borderLeftWidth");F={top:J.top-E.top,left:J.left-E.left}}return F},offsetParent:function(){var E=this[0].offsetParent||document.body;while(E&&(!/^body|html$/i.test(E.tagName)&&o.css(E,"position")=="static")){E=E.offsetParent}return o(E)}});o.each(["Left","Top"],function(F,E){var G="scroll"+E;o.fn[G]=function(H){if(!this[0]){return null}return H!==g?this.each(function(){this==l||this==document?l.scrollTo(!F?H:o(l).scrollLeft(),F?H:o(l).scrollTop()):this[G]=H}):this[0]==l||this[0]==document?self[F?"pageYOffset":"pageXOffset"]||o.boxModel&&document.documentElement[G]||document.body[G]:this[0][G]}});o.each(["Height","Width"],function(I,G){var E=I?"Left":"Top",H=I?"Right":"Bottom",F=G.toLowerCase();o.fn["inner"+G]=function(){return this[0]?o.css(this[0],F,false,"padding"):null};o.fn["outer"+G]=function(K){return this[0]?o.css(this[0],F,false,K?"margin":"border"):null};var J=G.toLowerCase();o.fn[J]=function(K){return this[0]==l?document.compatMode=="CSS1Compat"&&document.documentElement["client"+G]||document.body["client"+G]:this[0]==document?Math.max(document.documentElement["client"+G],document.body["scroll"+G],document.documentElement["scroll"+G],document.body["offset"+G],document.documentElement["offset"+G]):K===g?(this.length?o.css(this[0],J):null):this.css(J,typeof K==="string"?K:K+"px")}})})(); \ No newline at end of file diff -r 7c994c98d1df -r ae8593287883 web/ldt/media/js/jquery.validate.js --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/web/ldt/media/js/jquery.validate.js Tue Jun 08 15:44:35 2010 +0200 @@ -0,0 +1,1131 @@ +/* + * jQuery validation plug-in 1.5.5 + * + * http://bassistance.de/jquery-plugins/jquery-plugin-validation/ + * http://docs.jquery.com/Plugins/Validation + * + * Copyright (c) 2006 - 2008 Jörn Zaefferer + * + * $Id: jquery.validate.js 6403 2009-06-17 14:27:16Z joern.zaefferer $ + * + * Dual licensed under the MIT and GPL licenses: + * http://www.opensource.org/licenses/mit-license.php + * http://www.gnu.org/licenses/gpl.html + */ + +(function($) { + +$.extend($.fn, { + // http://docs.jquery.com/Plugins/Validation/validate + validate: function( options ) { + + // if nothing is selected, return nothing; can't chain anyway + if (!this.length) { + options && options.debug && window.console && console.warn( "nothing selected, can't validate, returning nothing" ); + return; + } + + // check if a validator for this form was already created + var validator = $.data(this[0], 'validator'); + if ( validator ) { + return validator; + } + + validator = new $.validator( options, this[0] ); + $.data(this[0], 'validator', validator); + + if ( validator.settings.onsubmit ) { + + // allow suppresing validation by adding a cancel class to the submit button + this.find("input, button").filter(".cancel").click(function() { + validator.cancelSubmit = true; + }); + + // when a submitHandler is used, capture the submitting button + if (validator.settings.submitHandler) { + this.find("input, button").filter(":submit").click(function() { + validator.submitButton = this; + }); + } + + // validate the form on submit + this.submit( function( event ) { + if ( validator.settings.debug ) + // prevent form submit to be able to see console output + event.preventDefault(); + + function handle() { + if ( validator.settings.submitHandler ) { + if (validator.submitButton) { + // insert a hidden input as a replacement for the missing submit button + var hidden = $("").attr("name", validator.submitButton.name).val(validator.submitButton.value).appendTo(validator.currentForm); + } + validator.settings.submitHandler.call( validator, validator.currentForm ); + if (validator.submitButton) { + // and clean up afterwards; thanks to no-block-scope, hidden can be referenced + hidden.remove(); + } + return false; + } + return true; + } + + // prevent submit for invalid forms or custom submit handlers + if ( validator.cancelSubmit ) { + validator.cancelSubmit = false; + return handle(); + } + if ( validator.form() ) { + if ( validator.pendingRequest ) { + validator.formSubmitted = true; + return false; + } + return handle(); + } else { + validator.focusInvalid(); + return false; + } + }); + } + + return validator; + }, + // http://docs.jquery.com/Plugins/Validation/valid + valid: function() { + if ( $(this[0]).is('form')) { + return this.validate().form(); + } else { + var valid = true; + var validator = $(this[0].form).validate(); + this.each(function() { + valid &= validator.element(this); + }); + return valid; + } + }, + // attributes: space seperated list of attributes to retrieve and remove + removeAttrs: function(attributes) { + var result = {}, + $element = this; + $.each(attributes.split(/\s/), function(index, value) { + result[value] = $element.attr(value); + $element.removeAttr(value); + }); + return result; + }, + // http://docs.jquery.com/Plugins/Validation/rules + rules: function(command, argument) { + var element = this[0]; + + if (command) { + var settings = $.data(element.form, 'validator').settings; + var staticRules = settings.rules; + var existingRules = $.validator.staticRules(element); + switch(command) { + case "add": + $.extend(existingRules, $.validator.normalizeRule(argument)); + staticRules[element.name] = existingRules; + if (argument.messages) + settings.messages[element.name] = $.extend( settings.messages[element.name], argument.messages ); + break; + case "remove": + if (!argument) { + delete staticRules[element.name]; + return existingRules; + } + var filtered = {}; + $.each(argument.split(/\s/), function(index, method) { + filtered[method] = existingRules[method]; + delete existingRules[method]; + }); + return filtered; + } + } + + var data = $.validator.normalizeRules( + $.extend( + {}, + $.validator.metadataRules(element), + $.validator.classRules(element), + $.validator.attributeRules(element), + $.validator.staticRules(element) + ), element); + + // make sure required is at front + if (data.required) { + var param = data.required; + delete data.required; + data = $.extend({required: param}, data); + } + + return data; + } +}); + +// Custom selectors +$.extend($.expr[":"], { + // http://docs.jquery.com/Plugins/Validation/blank + blank: function(a) {return !$.trim(a.value);}, + // http://docs.jquery.com/Plugins/Validation/filled + filled: function(a) {return !!$.trim(a.value);}, + // http://docs.jquery.com/Plugins/Validation/unchecked + unchecked: function(a) {return !a.checked;} +}); + +// constructor for validator +$.validator = function( options, form ) { + this.settings = $.extend( {}, $.validator.defaults, options ); + this.currentForm = form; + this.init(); +}; + +$.validator.format = function(source, params) { + if ( arguments.length == 1 ) + return function() { + var args = $.makeArray(arguments); + args.unshift(source); + return $.validator.format.apply( this, args ); + }; + if ( arguments.length > 2 && params.constructor != Array ) { + params = $.makeArray(arguments).slice(1); + } + if ( params.constructor != Array ) { + params = [ params ]; + } + $.each(params, function(i, n) { + source = source.replace(new RegExp("\\{" + i + "\\}", "g"), n); + }); + return source; +}; + +$.extend($.validator, { + + defaults: { + messages: {}, + groups: {}, + rules: {}, + errorClass: "error", + validClass: "valid", + errorElement: "label", + focusInvalid: true, + errorContainer: $( [] ), + errorLabelContainer: $( [] ), + onsubmit: true, + ignore: [], + ignoreTitle: false, + onfocusin: function(element) { + this.lastActive = element; + + // hide error label and remove error class on focus if enabled + if ( this.settings.focusCleanup && !this.blockFocusCleanup ) { + this.settings.unhighlight && this.settings.unhighlight.call( this, element, this.settings.errorClass, this.settings.validClass ); + this.errorsFor(element).hide(); + } + }, + onfocusout: function(element) { + if ( !this.checkable(element) && (element.name in this.submitted || !this.optional(element)) ) { + this.element(element); + } + }, + onkeyup: function(element) { + if ( element.name in this.submitted || element == this.lastElement ) { + this.element(element); + } + }, + onclick: function(element) { + if ( element.name in this.submitted ) + this.element(element); + }, + highlight: function( element, errorClass, validClass ) { + $(element).addClass(errorClass).removeClass(validClass); + }, + unhighlight: function( element, errorClass, validClass ) { + $(element).removeClass(errorClass).addClass(validClass); + } + }, + + // http://docs.jquery.com/Plugins/Validation/Validator/setDefaults + setDefaults: function(settings) { + $.extend( $.validator.defaults, settings ); + }, + + messages: { + required: "This field is required.", + remote: "Please fix this field.", + email: "Please enter a valid email address.", + url: "Please enter a valid URL.", + date: "Please enter a valid date.", + dateISO: "Please enter a valid date (ISO).", + dateDE: "Bitte geben Sie ein gültiges Datum ein.", + number: "Please enter a valid number.", + numberDE: "Bitte geben Sie eine Nummer ein.", + digits: "Please enter only digits", + creditcard: "Please enter a valid credit card number.", + equalTo: "Please enter the same value again.", + accept: "Please enter a value with a valid extension.", + maxlength: $.validator.format("Please enter no more than {0} characters."), + minlength: $.validator.format("Please enter at least {0} characters."), + rangelength: $.validator.format("Please enter a value between {0} and {1} characters long."), + range: $.validator.format("Please enter a value between {0} and {1}."), + max: $.validator.format("Please enter a value less than or equal to {0}."), + min: $.validator.format("Please enter a value greater than or equal to {0}.") + }, + + autoCreateRanges: false, + + prototype: { + + init: function() { + this.labelContainer = $(this.settings.errorLabelContainer); + this.errorContext = this.labelContainer.length && this.labelContainer || $(this.currentForm); + this.containers = $(this.settings.errorContainer).add( this.settings.errorLabelContainer ); + this.submitted = {}; + this.valueCache = {}; + this.pendingRequest = 0; + this.pending = {}; + this.invalid = {}; + this.reset(); + + var groups = (this.groups = {}); + $.each(this.settings.groups, function(key, value) { + $.each(value.split(/\s/), function(index, name) { + groups[name] = key; + }); + }); + var rules = this.settings.rules; + $.each(rules, function(key, value) { + rules[key] = $.validator.normalizeRule(value); + }); + + function delegate(event) { + var validator = $.data(this[0].form, "validator"); + validator.settings["on" + event.type] && validator.settings["on" + event.type].call(validator, this[0] ); + } + $(this.currentForm) + .delegate("focusin focusout keyup", ":text, :password, :file, select, textarea", delegate) + .delegate("click", ":radio, :checkbox", delegate); + + if (this.settings.invalidHandler) + $(this.currentForm).bind("invalid-form.validate", this.settings.invalidHandler); + }, + + // http://docs.jquery.com/Plugins/Validation/Validator/form + form: function() { + this.checkForm(); + $.extend(this.submitted, this.errorMap); + this.invalid = $.extend({}, this.errorMap); + if (!this.valid()) + $(this.currentForm).triggerHandler("invalid-form", [this]); + this.showErrors(); + return this.valid(); + }, + + checkForm: function() { + this.prepareForm(); + for ( var i = 0, elements = (this.currentElements = this.elements()); elements[i]; i++ ) { + this.check( elements[i] ); + } + return this.valid(); + }, + + // http://docs.jquery.com/Plugins/Validation/Validator/element + element: function( element ) { + element = this.clean( element ); + this.lastElement = element; + this.prepareElement( element ); + this.currentElements = $(element); + var result = this.check( element ); + if ( result ) { + delete this.invalid[element.name]; + } else { + this.invalid[element.name] = true; + } + if ( !this.numberOfInvalids() ) { + // Hide error containers on last error + this.toHide = this.toHide.add( this.containers ); + } + this.showErrors(); + return result; + }, + + // http://docs.jquery.com/Plugins/Validation/Validator/showErrors + showErrors: function(errors) { + if(errors) { + // add items to error list and map + $.extend( this.errorMap, errors ); + this.errorList = []; + for ( var name in errors ) { + this.errorList.push({ + message: errors[name], + element: this.findByName(name)[0] + }); + } + // remove items from success list + this.successList = $.grep( this.successList, function(element) { + return !(element.name in errors); + }); + } + this.settings.showErrors + ? this.settings.showErrors.call( this, this.errorMap, this.errorList ) + : this.defaultShowErrors(); + }, + + // http://docs.jquery.com/Plugins/Validation/Validator/resetForm + resetForm: function() { + if ( $.fn.resetForm ) + $( this.currentForm ).resetForm(); + this.submitted = {}; + this.prepareForm(); + this.hideErrors(); + this.elements().removeClass( this.settings.errorClass ); + }, + + numberOfInvalids: function() { + return this.objectLength(this.invalid); + }, + + objectLength: function( obj ) { + var count = 0; + for ( var i in obj ) + count++; + return count; + }, + + hideErrors: function() { + this.addWrapper( this.toHide ).hide(); + }, + + valid: function() { + return this.size() == 0; + }, + + size: function() { + return this.errorList.length; + }, + + focusInvalid: function() { + if( this.settings.focusInvalid ) { + try { + $(this.findLastActive() || this.errorList.length && this.errorList[0].element || []).filter(":visible").focus(); + } catch(e) { + // ignore IE throwing errors when focusing hidden elements + } + } + }, + + findLastActive: function() { + var lastActive = this.lastActive; + return lastActive && $.grep(this.errorList, function(n) { + return n.element.name == lastActive.name; + }).length == 1 && lastActive; + }, + + elements: function() { + var validator = this, + rulesCache = {}; + + // select all valid inputs inside the form (no submit or reset buttons) + // workaround $Query([]).add until http://dev.jquery.com/ticket/2114 is solved + return $([]).add(this.currentForm.elements) + .filter(":input") + .not(":submit, :reset, :image, [disabled]") + .not( this.settings.ignore ) + .filter(function() { + !this.name && validator.settings.debug && window.console && console.error( "%o has no name assigned", this); + + // select only the first element for each name, and only those with rules specified + if ( this.name in rulesCache || !validator.objectLength($(this).rules()) ) + return false; + + rulesCache[this.name] = true; + return true; + }); + }, + + clean: function( selector ) { + return $( selector )[0]; + }, + + errors: function() { + return $( this.settings.errorElement + "." + this.settings.errorClass, this.errorContext ); + }, + + reset: function() { + this.successList = []; + this.errorList = []; + this.errorMap = {}; + this.toShow = $([]); + this.toHide = $([]); + this.formSubmitted = false; + this.currentElements = $([]); + }, + + prepareForm: function() { + this.reset(); + this.toHide = this.errors().add( this.containers ); + }, + + prepareElement: function( element ) { + this.reset(); + this.toHide = this.errorsFor(element); + }, + + check: function( element ) { + element = this.clean( element ); + + // if radio/checkbox, validate first element in group instead + if (this.checkable(element)) { + element = this.findByName( element.name )[0]; + } + + var rules = $(element).rules(); + var dependencyMismatch = false; + for( method in rules ) { + var rule = { method: method, parameters: rules[method] }; + try { + var result = $.validator.methods[method].call( this, element.value.replace(/\r/g, ""), element, rule.parameters ); + + // if a method indicates that the field is optional and therefore valid, + // don't mark it as valid when there are no other rules + if ( result == "dependency-mismatch" ) { + dependencyMismatch = true; + continue; + } + dependencyMismatch = false; + + if ( result == "pending" ) { + this.toHide = this.toHide.not( this.errorsFor(element) ); + return; + } + + if( !result ) { + this.formatAndAdd( element, rule ); + return false; + } + } catch(e) { + this.settings.debug && window.console && console.log("exception occured when checking element " + element.id + + ", check the '" + rule.method + "' method"); + throw e; + } + } + if (dependencyMismatch) + return; + if ( this.objectLength(rules) ) + this.successList.push(element); + return true; + }, + + // return the custom message for the given element and validation method + // specified in the element's "messages" metadata + customMetaMessage: function(element, method) { + if (!$.metadata) + return; + + var meta = this.settings.meta + ? $(element).metadata()[this.settings.meta] + : $(element).metadata(); + + return meta && meta.messages && meta.messages[method]; + }, + + // return the custom message for the given element name and validation method + customMessage: function( name, method ) { + var m = this.settings.messages[name]; + return m && (m.constructor == String + ? m + : m[method]); + }, + + // return the first defined argument, allowing empty strings + findDefined: function() { + for(var i = 0; i < arguments.length; i++) { + if (arguments[i] !== undefined) + return arguments[i]; + } + return undefined; + }, + + defaultMessage: function( element, method) { + return this.findDefined( + this.customMessage( element.name, method ), + this.customMetaMessage( element, method ), + // title is never undefined, so handle empty string as undefined + !this.settings.ignoreTitle && element.title || undefined, + $.validator.messages[method], + "Warning: No message defined for " + element.name + "" + ); + }, + + formatAndAdd: function( element, rule ) { + var message = this.defaultMessage( element, rule.method ); + if ( typeof message == "function" ) + message = message.call(this, rule.parameters, element); + this.errorList.push({ + message: message, + element: element + }); + this.errorMap[element.name] = message; + this.submitted[element.name] = message; + }, + + addWrapper: function(toToggle) { + if ( this.settings.wrapper ) + toToggle = toToggle.add( toToggle.parent( this.settings.wrapper ) ); + return toToggle; + }, + + defaultShowErrors: function() { + for ( var i = 0; this.errorList[i]; i++ ) { + var error = this.errorList[i]; + this.settings.highlight && this.settings.highlight.call( this, error.element, this.settings.errorClass, this.settings.validClass ); + this.showLabel( error.element, error.message ); + } + if( this.errorList.length ) { + this.toShow = this.toShow.add( this.containers ); + } + if (this.settings.success) { + for ( var i = 0; this.successList[i]; i++ ) { + this.showLabel( this.successList[i] ); + } + } + if (this.settings.unhighlight) { + for ( var i = 0, elements = this.validElements(); elements[i]; i++ ) { + this.settings.unhighlight.call( this, elements[i], this.settings.errorClass, this.settings.validClass ); + } + } + this.toHide = this.toHide.not( this.toShow ); + this.hideErrors(); + this.addWrapper( this.toShow ).show(); + }, + + validElements: function() { + return this.currentElements.not(this.invalidElements()); + }, + + invalidElements: function() { + return $(this.errorList).map(function() { + return this.element; + }); + }, + + showLabel: function(element, message) { + var label = this.errorsFor( element ); + if ( label.length ) { + // refresh error/success class + label.removeClass().addClass( this.settings.errorClass ); + + // check if we have a generated label, replace the message then + label.attr("generated") && label.html(message); + } else { + // create label + label = $("<" + this.settings.errorElement + "/>") + .attr({"for": this.idOrName(element), generated: true}) + .addClass(this.settings.errorClass) + .html(message || ""); + if ( this.settings.wrapper ) { + // make sure the element is visible, even in IE + // actually showing the wrapped element is handled elsewhere + label = label.hide().show().wrap("<" + this.settings.wrapper + "/>").parent(); + } + if ( !this.labelContainer.append(label).length ) + this.settings.errorPlacement + ? this.settings.errorPlacement(label, $(element) ) + : label.insertAfter(element); + } + if ( !message && this.settings.success ) { + label.text(""); + typeof this.settings.success == "string" + ? label.addClass( this.settings.success ) + : this.settings.success( label ); + } + this.toShow = this.toShow.add(label); + }, + + errorsFor: function(element) { + return this.errors().filter("[for='" + this.idOrName(element) + "']"); + }, + + idOrName: function(element) { + return this.groups[element.name] || (this.checkable(element) ? element.name : element.id || element.name); + }, + + checkable: function( element ) { + return /radio|checkbox/i.test(element.type); + }, + + findByName: function( name ) { + // select by name and filter by form for performance over form.find("[name=...]") + var form = this.currentForm; + return $(document.getElementsByName(name)).map(function(index, element) { + return element.form == form && element.name == name && element || null; + }); + }, + + getLength: function(value, element) { + switch( element.nodeName.toLowerCase() ) { + case 'select': + return $("option:selected", element).length; + case 'input': + if( this.checkable( element) ) + return this.findByName(element.name).filter(':checked').length; + } + return value.length; + }, + + depend: function(param, element) { + return this.dependTypes[typeof param] + ? this.dependTypes[typeof param](param, element) + : true; + }, + + dependTypes: { + "boolean": function(param, element) { + return param; + }, + "string": function(param, element) { + return !!$(param, element.form).length; + }, + "function": function(param, element) { + return param(element); + } + }, + + optional: function(element) { + return !$.validator.methods.required.call(this, $.trim(element.value), element) && "dependency-mismatch"; + }, + + startRequest: function(element) { + if (!this.pending[element.name]) { + this.pendingRequest++; + this.pending[element.name] = true; + } + }, + + stopRequest: function(element, valid) { + this.pendingRequest--; + // sometimes synchronization fails, make sure pendingRequest is never < 0 + if (this.pendingRequest < 0) + this.pendingRequest = 0; + delete this.pending[element.name]; + if ( valid && this.pendingRequest == 0 && this.formSubmitted && this.form() ) { + $(this.currentForm).submit(); + } else if (!valid && this.pendingRequest == 0 && this.formSubmitted) { + $(this.currentForm).triggerHandler("invalid-form", [this]); + } + }, + + previousValue: function(element) { + return $.data(element, "previousValue") || $.data(element, "previousValue", previous = { + old: null, + valid: true, + message: this.defaultMessage( element, "remote" ) + }); + } + + }, + + classRuleSettings: { + required: {required: true}, + email: {email: true}, + url: {url: true}, + date: {date: true}, + dateISO: {dateISO: true}, + dateDE: {dateDE: true}, + number: {number: true}, + numberDE: {numberDE: true}, + digits: {digits: true}, + creditcard: {creditcard: true} + }, + + addClassRules: function(className, rules) { + className.constructor == String ? + this.classRuleSettings[className] = rules : + $.extend(this.classRuleSettings, className); + }, + + classRules: function(element) { + var rules = {}; + var classes = $(element).attr('class'); + classes && $.each(classes.split(' '), function() { + if (this in $.validator.classRuleSettings) { + $.extend(rules, $.validator.classRuleSettings[this]); + } + }); + return rules; + }, + + attributeRules: function(element) { + var rules = {}; + var $element = $(element); + + for (method in $.validator.methods) { + var value = $element.attr(method); + if (value) { + rules[method] = value; + } + } + + // maxlength may be returned as -1, 2147483647 (IE) and 524288 (safari) for text inputs + if (rules.maxlength && /-1|2147483647|524288/.test(rules.maxlength)) { + delete rules.maxlength; + } + + return rules; + }, + + metadataRules: function(element) { + if (!$.metadata) return {}; + + var meta = $.data(element.form, 'validator').settings.meta; + return meta ? + $(element).metadata()[meta] : + $(element).metadata(); + }, + + staticRules: function(element) { + var rules = {}; + var validator = $.data(element.form, 'validator'); + if (validator.settings.rules) { + rules = $.validator.normalizeRule(validator.settings.rules[element.name]) || {}; + } + return rules; + }, + + normalizeRules: function(rules, element) { + // handle dependency check + $.each(rules, function(prop, val) { + // ignore rule when param is explicitly false, eg. required:false + if (val === false) { + delete rules[prop]; + return; + } + if (val.param || val.depends) { + var keepRule = true; + switch (typeof val.depends) { + case "string": + keepRule = !!$(val.depends, element.form).length; + break; + case "function": + keepRule = val.depends.call(element, element); + break; + } + if (keepRule) { + rules[prop] = val.param !== undefined ? val.param : true; + } else { + delete rules[prop]; + } + } + }); + + // evaluate parameters + $.each(rules, function(rule, parameter) { + rules[rule] = $.isFunction(parameter) ? parameter(element) : parameter; + }); + + // clean number parameters + $.each(['minlength', 'maxlength', 'min', 'max'], function() { + if (rules[this]) { + rules[this] = Number(rules[this]); + } + }); + $.each(['rangelength', 'range'], function() { + if (rules[this]) { + rules[this] = [Number(rules[this][0]), Number(rules[this][1])]; + } + }); + + if ($.validator.autoCreateRanges) { + // auto-create ranges + if (rules.min && rules.max) { + rules.range = [rules.min, rules.max]; + delete rules.min; + delete rules.max; + } + if (rules.minlength && rules.maxlength) { + rules.rangelength = [rules.minlength, rules.maxlength]; + delete rules.minlength; + delete rules.maxlength; + } + } + + // To support custom messages in metadata ignore rule methods titled "messages" + if (rules.messages) { + delete rules.messages + } + + return rules; + }, + + // Converts a simple string to a {string: true} rule, e.g., "required" to {required:true} + normalizeRule: function(data) { + if( typeof data == "string" ) { + var transformed = {}; + $.each(data.split(/\s/), function() { + transformed[this] = true; + }); + data = transformed; + } + return data; + }, + + // http://docs.jquery.com/Plugins/Validation/Validator/addMethod + addMethod: function(name, method, message) { + $.validator.methods[name] = method; + $.validator.messages[name] = message || $.validator.messages[name]; + if (method.length < 3) { + $.validator.addClassRules(name, $.validator.normalizeRule(name)); + } + }, + + methods: { + + // http://docs.jquery.com/Plugins/Validation/Methods/required + required: function(value, element, param) { + // check if dependency is met + if ( !this.depend(param, element) ) + return "dependency-mismatch"; + switch( element.nodeName.toLowerCase() ) { + case 'select': + var options = $("option:selected", element); + return options.length > 0 && ( element.type == "select-multiple" || ($.browser.msie && !(options[0].attributes['value'].specified) ? options[0].text : options[0].value).length > 0); + case 'input': + if ( this.checkable(element) ) + return this.getLength(value, element) > 0; + default: + return $.trim(value).length > 0; + } + }, + + // http://docs.jquery.com/Plugins/Validation/Methods/remote + remote: function(value, element, param) { + if ( this.optional(element) ) + return "dependency-mismatch"; + + var previous = this.previousValue(element); + + if (!this.settings.messages[element.name] ) + this.settings.messages[element.name] = {}; + this.settings.messages[element.name].remote = typeof previous.message == "function" ? previous.message(value) : previous.message; + + param = typeof param == "string" && {url:param} || param; + + if ( previous.old !== value ) { + previous.old = value; + var validator = this; + this.startRequest(element); + var data = {}; + data[element.name] = value; + $.ajax($.extend(true, { + url: param, + mode: "abort", + port: "validate" + element.name, + dataType: "json", + data: data, + success: function(response) { + var valid = response === true; + if ( valid ) { + var submitted = validator.formSubmitted; + validator.prepareElement(element); + validator.formSubmitted = submitted; + validator.successList.push(element); + validator.showErrors(); + } else { + var errors = {}; + errors[element.name] = previous.message = response || validator.defaultMessage( element, "remote" ); + validator.showErrors(errors); + } + previous.valid = valid; + validator.stopRequest(element, valid); + } + }, param)); + return "pending"; + } else if( this.pending[element.name] ) { + return "pending"; + } + return previous.valid; + }, + + // http://docs.jquery.com/Plugins/Validation/Methods/minlength + minlength: function(value, element, param) { + return this.optional(element) || this.getLength($.trim(value), element) >= param; + }, + + // http://docs.jquery.com/Plugins/Validation/Methods/maxlength + maxlength: function(value, element, param) { + return this.optional(element) || this.getLength($.trim(value), element) <= param; + }, + + // http://docs.jquery.com/Plugins/Validation/Methods/rangelength + rangelength: function(value, element, param) { + var length = this.getLength($.trim(value), element); + return this.optional(element) || ( length >= param[0] && length <= param[1] ); + }, + + // http://docs.jquery.com/Plugins/Validation/Methods/min + min: function( value, element, param ) { + return this.optional(element) || value >= param; + }, + + // http://docs.jquery.com/Plugins/Validation/Methods/max + max: function( value, element, param ) { + return this.optional(element) || value <= param; + }, + + // http://docs.jquery.com/Plugins/Validation/Methods/range + range: function( value, element, param ) { + return this.optional(element) || ( value >= param[0] && value <= param[1] ); + }, + + // http://docs.jquery.com/Plugins/Validation/Methods/email + email: function(value, element) { + // contributed by Scott Gonzalez: http://projects.scottsplayground.com/email_address_validation/ + return this.optional(element) || /^((([a-z]|\d|[!#\$%&'\*\+\-\/=\?\^_`{\|}~]|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])+(\.([a-z]|\d|[!#\$%&'\*\+\-\/=\?\^_`{\|}~]|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])+)*)|((\x22)((((\x20|\x09)*(\x0d\x0a))?(\x20|\x09)+)?(([\x01-\x08\x0b\x0c\x0e-\x1f\x7f]|\x21|[\x23-\x5b]|[\x5d-\x7e]|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])|(\\([\x01-\x09\x0b\x0c\x0d-\x7f]|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF]))))*(((\x20|\x09)*(\x0d\x0a))?(\x20|\x09)+)?(\x22)))@((([a-z]|\d|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])|(([a-z]|\d|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])([a-z]|\d|-|\.|_|~|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])*([a-z]|\d|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])))\.)+(([a-z]|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])|(([a-z]|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])([a-z]|\d|-|\.|_|~|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])*([a-z]|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])))\.?$/i.test(value); + }, + + // http://docs.jquery.com/Plugins/Validation/Methods/url + url: function(value, element) { + // contributed by Scott Gonzalez: http://projects.scottsplayground.com/iri/ + return this.optional(element) || /^(https?|ftp):\/\/(((([a-z]|\d|-|\.|_|~|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])|(%[\da-f]{2})|[!\$&'\(\)\*\+,;=]|:)*@)?(((\d|[1-9]\d|1\d\d|2[0-4]\d|25[0-5])\.(\d|[1-9]\d|1\d\d|2[0-4]\d|25[0-5])\.(\d|[1-9]\d|1\d\d|2[0-4]\d|25[0-5])\.(\d|[1-9]\d|1\d\d|2[0-4]\d|25[0-5]))|((([a-z]|\d|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])|(([a-z]|\d|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])([a-z]|\d|-|\.|_|~|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])*([a-z]|\d|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])))\.)+(([a-z]|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])|(([a-z]|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])([a-z]|\d|-|\.|_|~|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])*([a-z]|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])))\.?)(:\d*)?)(\/((([a-z]|\d|-|\.|_|~|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])|(%[\da-f]{2})|[!\$&'\(\)\*\+,;=]|:|@)+(\/(([a-z]|\d|-|\.|_|~|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])|(%[\da-f]{2})|[!\$&'\(\)\*\+,;=]|:|@)*)*)?)?(\?((([a-z]|\d|-|\.|_|~|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])|(%[\da-f]{2})|[!\$&'\(\)\*\+,;=]|:|@)|[\uE000-\uF8FF]|\/|\?)*)?(\#((([a-z]|\d|-|\.|_|~|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])|(%[\da-f]{2})|[!\$&'\(\)\*\+,;=]|:|@)|\/|\?)*)?$/i.test(value); + }, + + // http://docs.jquery.com/Plugins/Validation/Methods/date + date: function(value, element) { + return this.optional(element) || !/Invalid|NaN/.test(new Date(value)); + }, + + // http://docs.jquery.com/Plugins/Validation/Methods/dateISO + dateISO: function(value, element) { + return this.optional(element) || /^\d{4}[\/-]\d{1,2}[\/-]\d{1,2}$/.test(value); + }, + + // http://docs.jquery.com/Plugins/Validation/Methods/dateDE + dateDE: function(value, element) { + return this.optional(element) || /^\d\d?\.\d\d?\.\d\d\d?\d?$/.test(value); + }, + + // http://docs.jquery.com/Plugins/Validation/Methods/number + number: function(value, element) { + return this.optional(element) || /^-?(?:\d+|\d{1,3}(?:,\d{3})+)(?:\.\d+)?$/.test(value); + }, + + // http://docs.jquery.com/Plugins/Validation/Methods/numberDE + numberDE: function(value, element) { + return this.optional(element) || /^-?(?:\d+|\d{1,3}(?:\.\d{3})+)(?:,\d+)?$/.test(value); + }, + + // http://docs.jquery.com/Plugins/Validation/Methods/digits + digits: function(value, element) { + return this.optional(element) || /^\d+$/.test(value); + }, + + // http://docs.jquery.com/Plugins/Validation/Methods/creditcard + // based on http://en.wikipedia.org/wiki/Luhn + creditcard: function(value, element) { + if ( this.optional(element) ) + return "dependency-mismatch"; + // accept only digits and dashes + if (/[^0-9-]+/.test(value)) + return false; + var nCheck = 0, + nDigit = 0, + bEven = false; + + value = value.replace(/\D/g, ""); + + for (n = value.length - 1; n >= 0; n--) { + var cDigit = value.charAt(n); + var nDigit = parseInt(cDigit, 10); + if (bEven) { + if ((nDigit *= 2) > 9) + nDigit -= 9; + } + nCheck += nDigit; + bEven = !bEven; + } + + return (nCheck % 10) == 0; + }, + + // http://docs.jquery.com/Plugins/Validation/Methods/accept + accept: function(value, element, param) { + param = typeof param == "string" ? param.replace(/,/g, '|') : "png|jpe?g|gif"; + return this.optional(element) || value.match(new RegExp(".(" + param + ")$", "i")); + }, + + // http://docs.jquery.com/Plugins/Validation/Methods/equalTo + equalTo: function(value, element, param) { + return value == $(param).val(); + } + + } + +}); + +// deprecated, use $.validator.format instead +$.format = $.validator.format; + +})(jQuery); + +// ajax mode: abort +// usage: $.ajax({ mode: "abort"[, port: "uniqueport"]}); +// if mode:"abort" is used, the previous request on that port (port can be undefined) is aborted via XMLHttpRequest.abort() +;(function($) { + var ajax = $.ajax; + var pendingRequests = {}; + $.ajax = function(settings) { + // create settings for compatibility with ajaxSetup + settings = $.extend(settings, $.extend({}, $.ajaxSettings, settings)); + var port = settings.port; + if (settings.mode == "abort") { + if ( pendingRequests[port] ) { + pendingRequests[port].abort(); + } + return (pendingRequests[port] = ajax.apply(this, arguments)); + } + return ajax.apply(this, arguments); + }; +})(jQuery); + +// provides cross-browser focusin and focusout events +// IE has native support, in other browsers, use event caputuring (neither bubbles) + +// provides delegate(type: String, delegate: Selector, handler: Callback) plugin for easier event delegation +// handler is only called when $(event.target).is(delegate), in the scope of the jquery-object for event.target + +// provides triggerEvent(type: String, target: Element) to trigger delegated events +;(function($) { + $.each({ + focus: 'focusin', + blur: 'focusout' + }, function( original, fix ){ + $.event.special[fix] = { + setup:function() { + if ( $.browser.msie ) return false; + this.addEventListener( original, $.event.special[fix].handler, true ); + }, + teardown:function() { + if ( $.browser.msie ) return false; + this.removeEventListener( original, + $.event.special[fix].handler, true ); + }, + handler: function(e) { + arguments[0] = $.event.fix(e); + arguments[0].type = fix; + return $.event.handle.apply(this, arguments); + } + }; + }); + $.extend($.fn, { + delegate: function(type, delegate, handler) { + return this.bind(type, function(event) { + var target = $(event.target); + if (target.is(delegate)) { + return handler.apply(target, arguments); + } + }); + }, + triggerEvent: function(type, target) { + return this.triggerHandler(type, [$.event.fix({ type: type, target: target })]); + } + }) +})(jQuery); diff -r 7c994c98d1df -r ae8593287883 web/ldt/media/js/login_ajax/jquery.login.js --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/web/ldt/media/js/login_ajax/jquery.login.js Tue Jun 08 15:44:35 2010 +0200 @@ -0,0 +1,77 @@ +$(document).ready(function() { + $('#password').keypress(function(e) { + if(e.which == 13) { + jQuery('#submit').focus().click(); + } + }); + + + $("#submit").click(function() { + var username=$("#username").val(); + var password=$("#password").val(); + var data = {'username': username, 'password': password, 'reload': reload}; + if(username=="" && password=="") + { + $("#login_form_username_error").show(); + $("#login_form_password_error").show(); + $("#username").addClass("ajaxform_invalid"); + $("#password").addClass("ajaxform_invalid"); + } + else if(username=="" && password!="") + { + $("#login_form_username_error").show(); + $("#username").addClass("ajaxform_invalid"); + } + else if(password=="" && username!="") + { + $("#login_form_password_error").show(); + $("#password").addClass("ajaxform_invalid"); + } + else{ + + $.ajax({ + type: "POST", + url : url_login_ajax, + dataType:'json', + data: data, + error: function (){ + $("#msg").html("fail to connect"); + }, + success: function(data, reload){ //if success, refrash un bout de page pour afficher le nom de utilisateur et déconnecter. + if (data.message!="successful") + { + $("#msg").html(data.message).show(); + } + else{ + // $("#floatdialog_mask_loginform").hide(); + //window.location.reload(); + if (data.reload=='true'){ + window.location.reload(); + } + else{ + //$("#loginstate").html(''+data.username+' | déconnection'); + //$("#loginstate").html(''); + var $DOMWindowOverlay = $('#DOMWindowOverlay'); + var $DOMWindow = $('#DOMWindow'); + $DOMWindowOverlay.fadeOut('fast',function(){ + $DOMWindowOverlay.trigger('unload').unbind().remove(); + }); + $DOMWindow.fadeOut('fast',function(){ + if($.fn.draggable){ + $DOMWindow.draggable("destroy").trigger("unload").remove(); + }else{ + $DOMWindow.trigger("unload").remove(); + } + }); + $("#loginstate").html(data.html); + } + } + + + } + }); + } + }); +}) + + diff -r 7c994c98d1df -r ae8593287883 web/ldt/media/js/login_ajax/login_ajax.css --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/web/ldt/media/js/login_ajax/login_ajax.css Tue Jun 08 15:44:35 2010 +0200 @@ -0,0 +1,75 @@ +#loginform +{ + font-size: 16px; + background: #ffffff scroll repeat 0 0; + /*border: 2px solid #666666;*/ + text-align: left; + /*width: 400px;*/ +} + +#loginform .title +{ + color: #FFFFFF; + background: #990000 scroll repeat left top; + font-weight:bold; + height:34px; + position: relative; + line-height: 34px; + overflow: hidden; + text-transform: uppercase; +} + +#loginform .title div +{ + font-size: 16px; + margin-left:12px; +} + +#loginform .title .closeDOMWindow +{ + float: right; + text-decoration: none; + color:#ffffff; + padding-right:2px; +} + +#loginform .ajaxform_invalid{ + background: #ffdddd none repeat scroll 0 0; +} + +#loginform .ajaxform_error{ + display: none; + color:red; + font-size: 11px; + line-height: 13px; +} + +#loginform #msg{ + display:none; + background:#FBE3E4 none repeat scroll 0 0; + color: red; + padding:0.5em; + border-color:#FBC2C4; + font-size: 13px; + font-weight:bold; +} + +#loginform dl { + font-size:13px; + line-height:22px; +} + +#loginform dl dt{ + clear:left; + color:#666666; + float:left; + font-weight:bold; + width:100px +} + +#loginform dl dd { + margin-left: 110px; + padding-bottom: 8px; +} + + diff -r 7c994c98d1df -r ae8593287883 web/ldt/media/js/swfobject.js --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/web/ldt/media/js/swfobject.js Tue Jun 08 15:44:35 2010 +0200 @@ -0,0 +1,5 @@ +/* SWFObject v2.1 + Copyright (c) 2007-2008 Geoff Stearns, Michael Williams, and Bobby van der Sluis + This software is released under the MIT License +*/ +var swfobject=function(){var b="undefined",Q="object",n="Shockwave Flash",p="ShockwaveFlash.ShockwaveFlash",P="application/x-shockwave-flash",m="SWFObjectExprInst",j=window,K=document,T=navigator,o=[],N=[],i=[],d=[],J,Z=null,M=null,l=null,e=false,A=false;var h=function(){var v=typeof K.getElementById!=b&&typeof K.getElementsByTagName!=b&&typeof K.createElement!=b,AC=[0,0,0],x=null;if(typeof T.plugins!=b&&typeof T.plugins[n]==Q){x=T.plugins[n].description;if(x&&!(typeof T.mimeTypes!=b&&T.mimeTypes[P]&&!T.mimeTypes[P].enabledPlugin)){x=x.replace(/^.*\s+(\S+\s+\S+$)/,"$1");AC[0]=parseInt(x.replace(/^(.*)\..*$/,"$1"),10);AC[1]=parseInt(x.replace(/^.*\.(.*)\s.*$/,"$1"),10);AC[2]=/r/.test(x)?parseInt(x.replace(/^.*r(.*)$/,"$1"),10):0}}else{if(typeof j.ActiveXObject!=b){var y=null,AB=false;try{y=new ActiveXObject(p+".7")}catch(t){try{y=new ActiveXObject(p+".6");AC=[6,0,21];y.AllowScriptAccess="always"}catch(t){if(AC[0]==6){AB=true}}if(!AB){try{y=new ActiveXObject(p)}catch(t){}}}if(!AB&&y){try{x=y.GetVariable("$version");if(x){x=x.split(" ")[1].split(",");AC=[parseInt(x[0],10),parseInt(x[1],10),parseInt(x[2],10)]}}catch(t){}}}}var AD=T.userAgent.toLowerCase(),r=T.platform.toLowerCase(),AA=/webkit/.test(AD)?parseFloat(AD.replace(/^.*webkit\/(\d+(\.\d+)?).*$/,"$1")):false,q=false,z=r?/win/.test(r):/win/.test(AD),w=r?/mac/.test(r):/mac/.test(AD);/*@cc_on q=true;@if(@_win32)z=true;@elif(@_mac)w=true;@end@*/return{w3cdom:v,pv:AC,webkit:AA,ie:q,win:z,mac:w}}();var L=function(){if(!h.w3cdom){return }f(H);if(h.ie&&h.win){try{K.write(" +{% endif %} + + +{% if add %} + +{% endif %} + + +{% endblock %} + +{% block content_title %} + {% if moderation_delete_request %} +

    {% trans "Approve page deletion" %}

    + + {% else %} + +

    {{ title }} + {% if CMS_MODERATOR %} + {% if moderation_required %}{% blocktrans %}(requires approvement at {{ moderation_level }} level){% endblocktrans %} + {% else %}{% trans '(you can perform actions on this page directly)' %} + {% endif %} + {% endif %} +

    + {% endif %} + +{% endblock %} + +{% block content %}
    + +{% block object-tools %} +{% if change %}{% if not is_popup %} + +{% endif %}{% endif %} +{% endblock %} + + +
    {% block form_top %}{% endblock %} +{{ adminForm.fields.parent }} + + + +{% if show_language_tabs %} +
    + {% for lang_code, lang_name in traduction_language %} + + {% endfor %} +
    +{% endif %} + + +
    +{% if show_language_tabs %} +

    +{% endif %} +{% if is_popup %}{% endif %} +{% if save_on_top %}{% submit_row %}{% endif %} +{% if errors %} +

    + {% blocktrans count errors|length as counter %}Please correct the error below.{% plural %}Please correct the errors below.{% endblocktrans %} +

    +
      {% for error in adminform.form.non_field_errors %}
    • {{ error }}
    • {% endfor %}
    +{% endif %} + +{% for fieldset in adminform %} + {% include "admin/cms/page/includes/fieldset.html" %} +{% endfor %} + + +{% for inline_admin_formset in inline_admin_formsets %} + {% include inline_admin_formset.opts.template %} +{% endfor %} + + +{% if not add %} + {% if CMS_PERMISSION and has_change_permissions_permission %} +
    + +
    + {% endif %} + + {% if CMS_MODERATOR and has_moderate_permission %} +
    + +
    + {% endif %} + + {% if moderation_delete_request %}{% endif %} + + {% if CMS_MODERATOR and moderation_required %} +
    +

    {% blocktrans %}This page must be moderated at level {{ moderation_level }}, post a message for moderator.{% endblocktrans %}

    +
    +
    +
    + + + {% endif %} + +{% endif %} + +{% block after_related_objects %}{% endblock %} + +{% if add %} +
    + + +
    +{% else %} + {% if not moderation_delete_request %}{% submit_row %}{% endif %} +{% endif %} + +{% if add %} + +{% endif %} + +{# JavaScript for prepopulated fields #} +{% prepopulated_fields_js %} + +
    +
    +{% endblock %} diff -r 7c994c98d1df -r ae8593287883 web/ldt/templates/admin/cms_change_list.html --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/web/ldt/templates/admin/cms_change_list.html Tue Jun 08 15:44:35 2010 +0200 @@ -0,0 +1,125 @@ +{% extends "admin/page_change_list.html" %} +{% load adminmedia admin_list i18n cms_admin js %} +{% block bodyclass %}change-list{% endblock %} + +{% if not is_popup %}{% block breadcrumbs %} + +{% endblock %}{% endif %} + +{% block coltype %}flex{% endblock %} +{% block extrahead %}{{ block.super }} + + + + + + + + + + + + + + + + + + +{% if cl.is_filtered %} + +{% endif %} +{% endblock %} + +{% block content %} + + + +
    + +{% block object-tools %} + + + + {% include "admin/cms/page/loading.html" %} + +{% endblock %} +
    +{% block search %} + + +{% if cl.has_access_to_multiple_sites %} +
    {% trans "Pages on:" %} + +
    +{% else %} + +{% endif %} + +{% search_form cl %} +{% endblock %} +{% block date_hierarchy %}{% date_hierarchy cl %}{% endblock %} + +{% block filters %} +{% if cl.has_filters %} + + +Filter: {% if cl.is_filtered %}{% trans "on" %}{% else %}{% trans "off" %}{% endif %} + +{% endif %} +{% endblock %} + +{% include "admin/cms/page/change_list_tree.html" %} + +
    +
    + +
    + +{% endblock %} diff -r 7c994c98d1df -r ae8593287883 web/ldt/templates/admin/index.html --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/web/ldt/templates/admin/index.html Tue Jun 08 15:44:35 2010 +0200 @@ -0,0 +1,99 @@ +{% extends "admin/base_site.html" %} +{% load i18n %} + +{% block extrastyle %}{{ block.super }}{% endblock %} + +{% block coltype %}colMS{% endblock %} + +{% block bodyclass %}dashboard{% endblock %} + +{% block breadcrumbs %}{% endblock %} + +{% block content %} +
    + +{% if app_list %} + {% for app in app_list %} +
    + + + {% for model in app.models %} + + {% if model.perms.change %} + + {% else %} + + {% endif %} + + {% if model.perms.add %} + + {% else %} + + {% endif %} + + {% if model.perms.change %} + + {% else %} + + {% endif %} + + {% endfor %} +
    {% blocktrans with app.name as name %}{{ name }}{% endblocktrans %}
    {{ model.name }}{{ model.name }}{% trans 'Add' %} {% trans 'Change' %} 
    +
    + {% endfor %} +
    + + + + + + + + + + +
    Import
    + Import an ldt +   +
    + Reindex +   +
    +
    +{% else %} +

    {% trans "You don't have permission to edit anything." %}

    +{% endif %} +
    +{% endblock %} + +{% block sidebar %} + +{% endblock %} diff -r 7c994c98d1df -r ae8593287883 web/ldt/templates/admin/page_app_index.html --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/web/ldt/templates/admin/page_app_index.html Tue Jun 08 15:44:35 2010 +0200 @@ -0,0 +1,15 @@ +{% extends "admin/page_index.html" %} +{% load i18n %} + +{% if not is_popup %} + +{% block breadcrumbs %} +{% endblock %} + +{% endif %} + +{% block sidebar %}{% endblock %} \ No newline at end of file diff -r 7c994c98d1df -r ae8593287883 web/ldt/templates/admin/page_base.html --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/web/ldt/templates/admin/page_base.html Tue Jun 08 15:44:35 2010 +0200 @@ -0,0 +1,45 @@ +{% extends "base.html" %} +{% load i18n %} + +{% block css_import %} +{{ block.super }} + + {% if LANGUAGE_BIDI %}{% endif %} +{% endblock %} + + + + + {% block header %}{{block.super}} + {% block nav-global %}{% endblock %} + {% endblock %} + + {% block breadcrumb %} +
  • +
  • {% trans "Space" %}
  • +
  • {% trans "Pages" %}
  • + {% endblock %} + + + {% if messages %} +
      {% for message in messages %}
    • {{ message }}
    • {% endfor %}
    + {% endif %} + + {% block content_title %}{% if title %}{{ title }}{% endif %}{% endblock %} + + + {% block content_admin %} +
    + {% block pretitle %}{% endblock %} + {% block content %} + {% block object-tools %}{% endblock %} + {{ content }} + {% endblock %} + {% block sidebar %}{% endblock %} +
    +
    + {% endblock %} + + + + diff -r 7c994c98d1df -r ae8593287883 web/ldt/templates/admin/page_base_site.html --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/web/ldt/templates/admin/page_base_site.html Tue Jun 08 15:44:35 2010 +0200 @@ -0,0 +1,10 @@ +{% extends "admin/page_base.html" %} +{% load i18n %} + +{% block title %}Django Administration{% endblock %} + +{% block branding %} +

    {% trans 'Django administration' %}

    +{% endblock %} + +{% block nav-global %}{% endblock %} diff -r 7c994c98d1df -r ae8593287883 web/ldt/templates/admin/page_change_form.html --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/web/ldt/templates/admin/page_change_form.html Tue Jun 08 15:44:35 2010 +0200 @@ -0,0 +1,66 @@ +{% extends "admin/page_base_site.html" %} +{% load i18n admin_modify adminmedia %} + +{% block extrahead %}{{ block.super }} + +{{ media }} +{% endblock %} + +{% block extrastyle %}{{ block.super }}{% endblock %} + +{% block coltype %}{% if ordered_objects %}colMS{% else %}colM{% endif %}{% endblock %} + +{% block bodyclass %}{{ opts.app_label }}-{{ opts.object_name.lower }} change-form{% endblock %} + +{% block breadcrumbs %}{% if not is_popup %} + +{% endif %}{% endblock %} + +{% block content %}
    +{% block object-tools %} +{% if change %}{% if not is_popup %} + +{% endif %}{% endif %} +{% endblock %} +
    {% block form_top %}{% endblock %} +
    +{% if is_popup %}{% endif %} +{% if save_on_top %}{% submit_row %}{% endif %} +{% if errors %} +

    + {% blocktrans count errors|length as counter %}Please correct the error below.{% plural %}Please correct the errors below.{% endblocktrans %} +

    +
      {% for error in adminform.form.non_field_errors %}
    • {{ error }}
    • {% endfor %}
    +{% endif %} + +{% for fieldset in adminform %} + {% include "admin/includes/fieldset.html" %} +{% endfor %} + +{% block after_field_sets %}{% endblock %} + +{% for inline_admin_formset in inline_admin_formsets %} + {% include inline_admin_formset.opts.template %} +{% endfor %} + +{% block after_related_objects %}{% endblock %} + +{% submit_row %} + +{% if adminform and add %} + +{% endif %} + +{# JavaScript for prepopulated fields #} +{% prepopulated_fields_js %} + +
    +
    +{% endblock %} diff -r 7c994c98d1df -r ae8593287883 web/ldt/templates/admin/page_change_list.html --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/web/ldt/templates/admin/page_change_list.html Tue Jun 08 15:44:35 2010 +0200 @@ -0,0 +1,85 @@ +{% extends "admin/page_base_site.html" %} +{% load adminmedia admin_list i18n %} + +{% block extrastyle %} + {{ block.super }} + + {% if cl.formset %} + + + {% endif %} + {{ media }} + {% if not actions_on_top and not actions_on_bottom %} + + {% endif %} +{% endblock %} + +{% block bodyclass %}change-list{% endblock %} + +{% if not is_popup %} + {% block breadcrumbs %} + + {% endblock %} +{% endif %} + +{% block coltype %}flex{% endblock %} + +{% block content %} +
    + {% block object-tools %} + {% if has_add_permission %} + + {% endif %} + {% endblock %} + {% if cl.formset.errors %} +

    + {% blocktrans count cl.formset.errors|length as counter %}Please correct the error below.{% plural %}Please correct the errors below.{% endblocktrans %} +

    +
      {% for error in cl.formset.non_field_errors %}
    • {{ error }}
    • {% endfor %}
    + {% endif %} +
    + {% block search %}{% search_form cl %}{% endblock %} + {% block date_hierarchy %}{% date_hierarchy cl %}{% endblock %} + + {% block filters %} + {% if cl.has_filters %} +
    +

    {% trans 'Filter' %}

    + {% for spec in cl.filter_specs %}{% admin_list_filter cl spec %}{% endfor %} +
    + {% endif %} + {% endblock %} + +
    + {% if cl.formset %} + {{ cl.formset.management_form }} + {% endif %} + + {% block result_list %} + {% if action_form and actions_on_top and cl.full_result_count %}{% admin_actions %}{% endif %} + {% result_list cl %} + {% if action_form and actions_on_bottom and cl.full_result_count %}{% admin_actions %}{% endif %} + {% endblock %} + {% block pagination %}{% pagination cl %}{% endblock %} +
    +
    +
    +{% endblock %} diff -r 7c994c98d1df -r ae8593287883 web/ldt/templates/admin/page_index.html --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/web/ldt/templates/admin/page_index.html Tue Jun 08 15:44:35 2010 +0200 @@ -0,0 +1,80 @@ +{% extends "admin/page_base_site.html" %} +{% load i18n %} + +{% block extrastyle %}{{ block.super }}{% endblock %} + +{% block coltype %}colMS{% endblock %} + +{% block bodyclass %}dashboard{% endblock %} + +{% block breadcrumbs %}{% endblock %} +{% block content_title %}{% trans "Pages" %}{% endblock %} +{% block content %} +
    + +{% if app_list %} + {% for app in app_list %} +
    + + + {% for model in app.models %} + + {% if model.perms.change %} + + {% else %} + + {% endif %} + + {% if model.perms.add %} + + {% else %} + + {% endif %} + + {% if model.perms.change %} + + {% else %} + + {% endif %} + + {% endfor %} +
    {% blocktrans with app.name as name %}{{ name }}{% endblocktrans %}
    {{ model.name }}{{ model.name }}{% trans 'Add' %} {% trans 'Change' %} 
    +
    + {% endfor %} +{% else %} +

    {% trans "You don't have permission to edit anything." %}

    +{% endif %} +
    +{% endblock %} + +{% block sidebar %} + +{% endblock %} diff -r 7c994c98d1df -r ae8593287883 web/ldt/templates/admin/page_login.html --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/web/ldt/templates/admin/page_login.html Tue Jun 08 15:44:35 2010 +0200 @@ -0,0 +1,41 @@ +{% extends "admin/page_base_site.html" %} +{% load i18n %} + +{% block extrastyle %}{% load adminmedia %}{{ block.super }}{% endblock %} + +{% block bodyclass %}{% endblock %} + +{% block content_title %}{% trans "Connexion" %}{% endblock %} + +{% block breadcrumbs %}{% endblock %} + +{% block content %} +{% if error_message %} +

    {{ error_message }}

    +{% endif %} +
    +
    + + + + + + + + + + + + + + +
    {% trans "Create an account" %} + {% trans "Forget password?" %} +
    +
    + + +
    +{% endblock %} diff -r 7c994c98d1df -r ae8593287883 web/ldt/templates/admin/show_menu.html --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/web/ldt/templates/admin/show_menu.html Tue Jun 08 15:44:35 2010 +0200 @@ -0,0 +1,4 @@ +{% load cms_tags %} +{% load i18n %} + +{% show_menu 0 100 100 100 %} \ No newline at end of file diff -r 7c994c98d1df -r ae8593287883 web/ldt/templates/cms/admin/cms/page/change_form.html --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/web/ldt/templates/cms/admin/cms/page/change_form.html Tue Jun 08 15:44:35 2010 +0200 @@ -0,0 +1,62 @@ +{% extends "admin/base_site.html" %} +{% load i18n admin_modify adminmedia cms_admin %} +{% block extrahead %}{{ block.super }} + +{% for js in javascript_imports %}{% include_admin_script js %}{% endfor %} +{% endblock %} +{% block stylesheet %}{% admin_media_prefix %}css/forms.css" /> +{% trans 'Documentation' %} / {% trans 'Change password' %} / {% trans 'Log out' %}{% endblock %} +{% block breadcrumbs %}{% endblock %} +{% block content %}
    +{% block object-tools %} +{% if change %}{% endif %} +{% endblock %} +
    {% block form_top %}{% endblock %} +
    +{% if is_popup %}{% endif %} + +{% if opts.admin.save_on_top %}{% submit_row %}{% endif %} +{% if form.error_dict %} +

    + {% blocktrans count form.error_dict.items|length as counter %}Please correct the error below.{% plural %}Please correct the errors below.{% endblocktrans %} +

    +{% endif %} +{% for bound_field_set in bound_field_sets %} +
    + {% if bound_field_set.name %}

    {{ bound_field_set.name }}

    {% endif %} + {% if bound_field_set.description %}
    {{ bound_field_set.description }}
    {% endif %} + {% for bound_field_line in bound_field_set %} + {% admin_field_line bound_field_line %} + {% for bound_field in bound_field_line %} + {% filter_interface_script_maybe bound_field %} + {% endfor %} + {% endfor %} +
    +{% endfor %} +{% block after_field_sets %}{% endblock %} +{% if change %} + {% if ordered_objects %} +

    {% trans "Ordering" %}

    +
    + {% if form.order_.errors %}{{ form.order_.html_error_list }}{% endif %} +

    {{ form.order_ }}

    +
    + {% endif %} +{% endif %} +{% for related_object in inline_related_objects %}{% cms_edit_inline related_object %}{% endfor %} +{% block after_related_objects %}{% endblock %} +{% submit_row %} +{% if add %} + +{% endif %} +{% if auto_populated_fields %} + +{% endif %} +
    +
    +{% endblock %} diff -r 7c994c98d1df -r ae8593287883 web/ldt/templatetags/__init__.py diff -r 7c994c98d1df -r ae8593287883 web/ldt/templatetags/iriusermedia.py --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/web/ldt/templatetags/iriusermedia.py Tue Jun 08 15:44:35 2010 +0200 @@ -0,0 +1,14 @@ +from django.template import Library + +register = Library() + +def ldt_media_prefix(): + """ + Returns the string contained in the setting LDT_MEDIA_PREFIX. + """ + try: + from django.conf import settings + except ImportError: + return '' + return settings.LDT_MEDIA_PREFIX +ldt_media_prefix = register.simple_tag(ldt_media_prefix) diff -r 7c994c98d1df -r ae8593287883 web/ldt/user/__init__.py diff -r 7c994c98d1df -r ae8593287883 web/ldt/user/admin.py --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/web/ldt/user/admin.py Tue Jun 08 15:44:35 2010 +0200 @@ -0,0 +1,42 @@ +from django.contrib import admin +from django.contrib.auth.admin import UserAdmin, GroupAdmin +from django.utils.translation import ugettext as _ +from ldt import settings +from copy import deepcopy +from forms import ldtForm, IriGroupForm +from models import ldt, IriGroup + + +class ldtAdmin(UserAdmin): + list_display = ('username', 'email', 'first_name', 'last_name') + + fieldsets = [ + (None, {'fields': ('username', ('password1', 'password2'))}), + (_('User details'), {'fields': (('first_name', 'last_name'), 'email')}), + (_('Groups'), {'fields': ('groups',)}), + (_('Permissions'), {'fields': ('is_staff', 'user_permissions')}), + ] + form = ldtForm + model = ldt + filter_horizontal = ('user_permissions',) + + def get_fieldsets(self, request, obj=None): + fieldsets = deepcopy(self.fieldsets) + if not '/add' in request.path: + fieldsets[0] = (None, {'fields': ('username',)}) + fieldsets.append((_('Password'), {'fields': ('password1', 'password2'), 'classes': ('collapse',)})) + return fieldsets + + def add_view(self, request): + return super(UserAdmin, self).add_view(request) + +admin.site.unregister(ldt) +admin.site.register(ldt, ldtAdmin) + +class IriGroupAdmin(admin.ModelAdmin): + form = IriGroupForm + model = IriGroup + filter_horizontal = ('permissions',) + +admin.site.unregister(IriGroup) +admin.site.register(IriGroup, IriGroupAdmin) diff -r 7c994c98d1df -r ae8593287883 web/ldt/user/forms.py --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/web/ldt/user/forms.py Tue Jun 08 15:44:35 2010 +0200 @@ -0,0 +1,98 @@ +from django import forms +from django.contrib.auth.models import User, Permission, Group +from django.forms.util import ErrorList +from django.contrib.auth.forms import UserCreationForm +from django.utils.translation import gettext as _ +from models import ldt, IriGroup +from ldt.management import get_content_type_list + + +class ldtForm(UserCreationForm): + + class Meta: + model = ldt + + def __init__(self, data=None, files=None, auto_id='id_%s', prefix=None, + initial=None, error_class=ErrorList, label_suffix=':', + empty_permitted=False, instance=None): + + if instance: + initial = initial or {} + + super(ldtForm, self).__init__(data, files, auto_id, prefix, + initial, error_class, label_suffix, empty_permitted, instance) + + # filtre les permissions necessaires + content_type_list = get_content_type_list() + self.fields['user_permissions'].queryset = Permission.objects.filter(content_type__in = content_type_list) + + if instance: + self.fields['password1'].required = False + self.fields['password1'].label = _('New password') + self.fields['password2'].required = False + self.fields['password2'].label = _('New password confirmation') + + self._password_change = True + + def clean_username(self): + if self.instance: + return self.cleaned_data['username'] + return super(ldtForm, self).clean_username() + + def clean_password2(self): + if self.instance and self.cleaned_data['password1'] == '' and self.cleaned_data['password2'] == '': + self._password_change = False + return u'' + return super(ldtForm, self).clean_password2() + + + def save(self, commit=True): + Super = self._password_change and ldtForm or UserCreationForm + user = super(Super, self).save(commit=False) + # if user.pk != None: + # self.save_m2m() + + if commit: + user.save() + + return user + +class IriGroupForm(forms.ModelForm): + class meta: + model = IriGroup + + def __init__(self, data=None, files=None, auto_id='id_%s', prefix=None, + initial=None, error_class=ErrorList, label_suffix=':', + empty_permitted=False, instance=None): + if instance: + initial = initial or {} + + super(IriGroupForm, self).__init__(data, files, auto_id, prefix, + initial, error_class, label_suffix, empty_permitted, instance) + + # filtre les permissions necessaires + content_type_list = get_content_type_list() + self.fields['permissions'].queryset = Permission.objects.filter(content_type__in = content_type_list) + +class EmailChangeForm(forms.Form): + email1 = forms.EmailField(label=_("E-mail"), max_length=75) + email2 = forms.EmailField(label=_("E-mail"), max_length=75) + + def __init__(self, user=None, *args, **kwargs): + self.user = user + super(EmailChangeForm, self).__init__(*args, **kwargs) + + def clean_email2(self): + email1 = self.cleaned_data.get('email1') + email2 = self.cleaned_data.get('email2') + if email1 and email2: + if email1 != email2: + raise forms.ValidationError(_("The two emails didn't match.")) + return email2 + + + def save(self): + self.user.email=self.cleaned_data['email1'] + self.user.save() + return self.user + diff -r 7c994c98d1df -r ae8593287883 web/ldt/user/models.py --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/web/ldt/user/models.py Tue Jun 08 15:44:35 2010 +0200 @@ -0,0 +1,42 @@ +from django.db import models +from django.contrib.auth.models import User, Group, UserManager +from django.utils.translation import gettext as _ +from django.contrib import admin +import datetime + + +class IriGroup(Group): + description = models.TextField(null=True, blank=True) + + def __unicode__(self): + return self.name + + +class ldt(User): + irigroups = models.ManyToManyField(IriGroup, blank=True) + + class Meta: + verbose_name = 'iri user' + verbose_name_plural = 'iri users' + + def __unicode__(self): + return self.username + + +class ldtManager(UserManager): + def create_user(self, username, email, password=None): + "Creates and saves a User with the given username, e-mail and password." + now = datetime.datetime.now() + user = ldt(None, username, '', '', email.strip().lower(), 'placeholder', False, True, False, now, now) + if password: + user.set_password(password) + else: + user.set_unusable_password() + user.save() + return user + +User.objects = ldtManager() +User.objects.contribute_to_class(User, "objects") + +admin.site.register(ldt) +admin.site.register(IriGroup) diff -r 7c994c98d1df -r ae8593287883 web/ldt/user/templates/iriuser/user/change_email.html --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/web/ldt/user/templates/iriuser/user/change_email.html Tue Jun 08 15:44:35 2010 +0200 @@ -0,0 +1,51 @@ +{% extends "ldt/user/user_base.html" %} +{# form of email address's change #} +{% load i18n %} +{% block breadcrumb %} +
  • +
  • {% trans "Profiles" %}
  • +
  • {% trans "Modification de l'adresse émail" %}
  • +{% endblock %} + +{% block content_title %}{% trans "Modification de l'adresse émail" %}{% endblock %} +{% block js_declaration %}{{ block.super }} + +{% endblock %} +{% block css_import %} +{{ block.super }} + +{% endblock %} + +{% block iricontent %} +

    {% trans "Please enter your new e-mail twice so we can verify you typed it in correctly." %}

    +
    +{% csrf_token %} + + + + + + + + + + + + +
    + + + + {{form.email1.errors}}
    + + + + {{form.email1.errors}}
    +
    +{% endblock%} diff -r 7c994c98d1df -r ae8593287883 web/ldt/user/templates/iriuser/user/change_email_done.html --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/web/ldt/user/templates/iriuser/user/change_email_done.html Tue Jun 08 15:44:35 2010 +0200 @@ -0,0 +1,14 @@ +{% extends "ldt/user/user_base.html" %} +{# if email is changed successfully, retrun this page #} +{% load i18n %} +{% block breadcrumb %} +
  • +
  • {% trans "Profiles" %}
  • +
  • {% trans "email change" %}
  • +{% endblock %} + +{% block content_title %}{% trans "email change" %}{% endblock %} +{% block iricontent %} +

    {% trans "email changed" %}

    +{% trans "back to profile" %} +{% endblock %} diff -r 7c994c98d1df -r ae8593287883 web/ldt/user/templates/iriuser/user/home.html --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/web/ldt/user/templates/iriuser/user/home.html Tue Jun 08 15:44:35 2010 +0200 @@ -0,0 +1,14 @@ +{% extends "base.html" %} +{% load i18n %} + +{% block title %}Home{% endblock %} + +{% block content_base %} + +

    Welcome

    +
  • {% trans "Se connecter" %}
  • +
  • {% trans "Créer un compte" %}
  • +
  • {% trans "récupérer mot de passe" %}
  • + +{% endblock %} + diff -r 7c994c98d1df -r ae8593287883 web/ldt/user/templates/iriuser/user/login_form.html --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/web/ldt/user/templates/iriuser/user/login_form.html Tue Jun 08 15:44:35 2010 +0200 @@ -0,0 +1,75 @@ +{% load i18n %} +{# print user's state and form of login #} +{% block js_import %} +{{block.super}} + + +{% endblock %} +{% block css_import %} +{{block.super}} +{% endblock %} +
    +
    diff -r 7c994c98d1df -r ae8593287883 web/ldt/user/templates/iriuser/user/profile.html --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/web/ldt/user/templates/iriuser/user/profile.html Tue Jun 08 15:44:35 2010 +0200 @@ -0,0 +1,9 @@ +{% extends "ldt/user/user_base.html" %} +{# user's profiles(change password, change email) #} +{% load i18n %} +{% block iricontent %} + +{% endblock %} diff -r 7c994c98d1df -r ae8593287883 web/ldt/user/templates/iriuser/user/space.html --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/web/ldt/user/templates/iriuser/user/space.html Tue Jun 08 15:44:35 2010 +0200 @@ -0,0 +1,19 @@ +{% extends "ldt/user/user_base.html" %} +{# user's space (edit page or project lignes de temps) #} +{% load i18n %} +{% block breadcrumb %} +
  • +
  • {% trans "Space" %}
  • +{% endblock %} + +{% block content_title %}{% trans "Space" %}{% endblock %} +{% block iricontent%} + +{% endblock %} diff -r 7c994c98d1df -r ae8593287883 web/ldt/user/templates/iriuser/user/user_base.html --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/web/ldt/user/templates/iriuser/user/user_base.html Tue Jun 08 15:44:35 2010 +0200 @@ -0,0 +1,15 @@ +{% extends "base.html" %} +{# this page inherit base html, all pages of ldt inherit this page. #} +{# all contents are writed in the "iricontent" block #} +{% load i18n %} +{% block js_import %}{{ block.super }} +{% endblock %} +{% block css_import %}{{ block.super }} +{% endblock%} + + +{% block content %} +
    + {% block iricontent %}{% endblock %} +
    +{% endblock%} diff -r 7c994c98d1df -r ae8593287883 web/ldt/user/templates/registration/activate.html --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/web/ldt/user/templates/registration/activate.html Tue Jun 08 15:44:35 2010 +0200 @@ -0,0 +1,14 @@ +{% extends "registration/base.html" %} +{% load i18n %} + +{% block breadcrumb %} +
  • +
  • {% trans "Activate account" %}
  • +{% endblock %} + +{% block content_title %}{% trans 'Activate account' %}{% endblock %} + +{% block iricontent %} +

    {% trans "You have activated your account" %}

    +{% trans "Go back to login page" %} +{% endblock %} \ No newline at end of file diff -r 7c994c98d1df -r ae8593287883 web/ldt/user/templates/registration/activation_complete.html --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/web/ldt/user/templates/registration/activation_complete.html Tue Jun 08 15:44:35 2010 +0200 @@ -0,0 +1,8 @@ +{% extends "registration/base.html" %} +{% load i18n %} + +{% block content_title %}{% trans 'Sign up successfully' %}{% endblock %} +{% block iricontent %} +

    {% trans "activation completed" %}

    + +{% endblock%} diff -r 7c994c98d1df -r ae8593287883 web/ldt/user/templates/registration/activation_email.txt --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/web/ldt/user/templates/registration/activation_email.txt Tue Jun 08 15:44:35 2010 +0200 @@ -0,0 +1,4 @@ +Pour confirmer que ce compte vous appartient vraiment et afin +d’activer les fonctions, +veuillez suivre ce lien dans votre navigateur dans {{expiration_days}} jours: +http://{{site }}{% url registration.views.activate activation_key %} \ No newline at end of file diff -r 7c994c98d1df -r ae8593287883 web/ldt/user/templates/registration/activation_email_subject.txt --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/web/ldt/user/templates/registration/activation_email_subject.txt Tue Jun 08 15:44:35 2010 +0200 @@ -0,0 +1,1 @@ +Confirmation d’adresse de email pour ldt \ No newline at end of file diff -r 7c994c98d1df -r ae8593287883 web/ldt/user/templates/registration/base.html --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/web/ldt/user/templates/registration/base.html Tue Jun 08 15:44:35 2010 +0200 @@ -0,0 +1,10 @@ +{% extends "ldt/user/user_base.html" %} +{% block js_import %}{{ block.super }} +{% endblock %} +{% block css_import %} +{{ block.super }} + +{% endblock %} +{% block pageclass %}profile{% endblock %} diff -r 7c994c98d1df -r ae8593287883 web/ldt/user/templates/registration/logged_out.html --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/web/ldt/user/templates/registration/logged_out.html Tue Jun 08 15:44:35 2010 +0200 @@ -0,0 +1,12 @@ +{% extends "registration/base.html" %} +{% load i18n %} + +{% trans 'Home' %} + +{% block iricontent %} + +

    {% trans "Thanks for spending some quality time with the Web site today." %}

    + +

    {% trans 'Log in again' %}

    + +{% endblock %} diff -r 7c994c98d1df -r ae8593287883 web/ldt/user/templates/registration/login.html --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/web/ldt/user/templates/registration/login.html Tue Jun 08 15:44:35 2010 +0200 @@ -0,0 +1,35 @@ +{% extends "registration/base.html" %} +{% load i18n %} +{% block js_declaration %}{{ block.super }} + +{% endblock %} + +{% block login %} +{% endblock %} + +{% block content_title %}{% trans 'Log in' %}{% endblock %} +{% block iricontent %} + {% if form.errors %} +

    {% trans "Sorry, that's not a valid username or password." %}

    + {% endif %} + +
    + {% csrf_token %} + +
      + {{form.as_ul}} +
    • +
    +
    + +{% endblock %} + + + diff -r 7c994c98d1df -r ae8593287883 web/ldt/user/templates/registration/logout.html diff -r 7c994c98d1df -r ae8593287883 web/ldt/user/templates/registration/password_change_done.html --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/web/ldt/user/templates/registration/password_change_done.html Tue Jun 08 15:44:35 2010 +0200 @@ -0,0 +1,17 @@ +{% extends "registration/base.html" %} +{% load i18n %} +{% block title %}{% trans 'password change successful' %}{% endblock %} + +{% block breadcrumb %} +
  • +
  • {% trans "Profiles" %}
  • +
  • {% trans "password change" %}
  • +{% endblock %} + +{% block content_title %}{% trans "password change successful" %}{% endblock %} +{% block iricontent %} + +

    {% trans 'Your password has been changed.' %}

    +{% trans 'Go back to profiles' %} + +{% endblock %} diff -r 7c994c98d1df -r ae8593287883 web/ldt/user/templates/registration/password_change_form.html --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/web/ldt/user/templates/registration/password_change_form.html Tue Jun 08 15:44:35 2010 +0200 @@ -0,0 +1,47 @@ +{% extends "registration/base.html" %} +{% load i18n %} +{% block js_import %}{{ block.super }} + + +{% endblock %} +{% block breadcrumb %} +
  • +
  • {% trans "Profiles" %}
  • +
  • {% trans 'Password change' %}
  • +{% endblock %} + +{% block content_title %}{% trans 'Password change' %}{% endblock %} +{% block iricontent %} + +

    {% trans "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." %}

    + +
    + + + + + + + + + + + + + + + + + + + +
    {{ form.old_password.errors }}
    {{ form.new_password1.errors }}
    {{ form.new_password2.errors }}
    + + +
    + +{% endblock %} diff -r 7c994c98d1df -r ae8593287883 web/ldt/user/templates/registration/password_reset_complete.html --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/web/ldt/user/templates/registration/password_reset_complete.html Tue Jun 08 15:44:35 2010 +0200 @@ -0,0 +1,16 @@ +{% extends "registration/base.html" %} +{% load i18n %} + +{% block breadcrumb %} +
  • +
  • {% trans 'Password reset' %}
  • +{% endblock %} + +{% block content_title %}{% trans 'Password reset complete' %}{% endblock %} +{% block iricontent %} + +

    {% trans "Your password has been set. You may go ahead and log in now." %}

    + +

    {% trans 'Log in' %}

    + +{% endblock %} \ No newline at end of file diff -r 7c994c98d1df -r ae8593287883 web/ldt/user/templates/registration/password_reset_confirm.html --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/web/ldt/user/templates/registration/password_reset_confirm.html Tue Jun 08 15:44:35 2010 +0200 @@ -0,0 +1,33 @@ +{% extends "registration/base.html" %} +{% load i18n %} + +{% block breadcrumb %} +
  • +
  • {% trans 'Password reset' %}
  • +{% endblock %} + +{% block content_title %}{% trans 'Password reset' %}{% endblock %} + +{% block iricontent %} + +{% if validlink %} + +

    {% trans "Please enter your new password twice so we can verify you typed it in correctly." %}

    + +
    +{{ form.new_password1.errors }} +

    {{ form.new_password1 }}

    +{{ form.new_password2.errors }} +

    {{ form.new_password2 }}

    +

    +
    + +{% else %} + +

    {% trans 'Password reset unsuccessful' %}

    + +

    {% trans "The password reset link was invalid, possibly because it has already been used. Please request a new password reset." %}

    + +{% endif %} + +{% endblock %} diff -r 7c994c98d1df -r ae8593287883 web/ldt/user/templates/registration/password_reset_done.html --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/web/ldt/user/templates/registration/password_reset_done.html Tue Jun 08 15:44:35 2010 +0200 @@ -0,0 +1,14 @@ +{% extends "registration/base.html" %} +{% load i18n %} + +{% block breadcrumb %} +
  • +
  • {% trans 'Password reset' %}
  • +{% endblock %} +{% block content_title %}{% trans 'Password reset successful' %}{% endblock %} + +{% block iricontent %} + +

    {% trans "We've e-mailed you instructions for setting your password to the e-mail address you submitted. You should be receiving it shortly." %}

    + +{% endblock %} diff -r 7c994c98d1df -r ae8593287883 web/ldt/user/templates/registration/password_reset_email.html --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/web/ldt/user/templates/registration/password_reset_email.html Tue Jun 08 15:44:35 2010 +0200 @@ -0,0 +1,15 @@ +{% load i18n %}{% autoescape off %} +{% trans "You're receiving this e-mail because you requested a password reset" %} +{% blocktrans %}for your user account at {{ site_name }}{% endblocktrans %}. + +{% trans "Please go to the following page and choose a new password:" %} +{% block reset_link %} +{{ protocol }}://{{ domain }}{% url django.contrib.auth.views.password_reset_confirm uidb36=uid, token=token %} +{% endblock %} +{% trans "Your username, in case you've forgotten:" %} {{ user.username }} + +{% trans "Thanks for using our site!" %} + +{% blocktrans %}The {{ site_name }} team{% endblocktrans %} + +{% endautoescape %} diff -r 7c994c98d1df -r ae8593287883 web/ldt/user/templates/registration/password_reset_form.html --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/web/ldt/user/templates/registration/password_reset_form.html Tue Jun 08 15:44:35 2010 +0200 @@ -0,0 +1,36 @@ +{% extends "registration/base.html" %} +{% load i18n %} +{% block js_import %}{{ block.super }} + +{% endblock %} + +{% block breadcrumb %} +
  • +
  • {% trans 'Password reset' %}
  • +{% endblock %} +{% block content_title %}{% trans 'Password reset' %}{% endblock %} + + +{% block title %}{% trans "Password reset" %}{% endblock %} + +{% block iricontent%} + +

    {% trans "Forgotten your password? Enter your e-mail address below, and we'll e-mail instructions for setting a new one." %}

    + +
    + + + + + + + + +
    {{ form.email.errors }}
    +
    + +{% endblock %} diff -r 7c994c98d1df -r ae8593287883 web/ldt/user/templates/registration/registration_active.html --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/web/ldt/user/templates/registration/registration_active.html Tue Jun 08 15:44:35 2010 +0200 @@ -0,0 +1,11 @@ +{% extends "registration/base.html" %} +{% load i18n %} +{% block breadcrumb %} +
  • +
  • {% trans 'Activate the account' %}
  • +{% endblock %} +{% block content_title %}{% trans 'Activate the account' %}{% endblock %} +{% block iricontent%} +

    {% trans 'Vous avez bien activé votre compte, vous pouvez accedez à votre espace personnel.' %}

    +{% trans 'retourner à la page de connexion' %} +{% endblock %} \ No newline at end of file diff -r 7c994c98d1df -r ae8593287883 web/ldt/user/templates/registration/registration_complete.html --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/web/ldt/user/templates/registration/registration_complete.html Tue Jun 08 15:44:35 2010 +0200 @@ -0,0 +1,12 @@ +{% extends "registration/base.html" %} +{% load i18n %} + +{% block breadcrumb %} +
  • +
  • {% trans 'Sign up' %}
  • +{% endblock %} +{% block content_title %}{% trans 'Sign up successfully' %}{% endblock %} +{% block iricontent %} +

    {% trans "We've e-mailed you instructions for activate your account to the e-mail address you submitted. You should be receiving it shortly." %}

    + +{% endblock%} \ No newline at end of file diff -r 7c994c98d1df -r ae8593287883 web/ldt/user/templates/registration/registration_form.html --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/web/ldt/user/templates/registration/registration_form.html Tue Jun 08 15:44:35 2010 +0200 @@ -0,0 +1,20 @@ +{% extends "registration/base.html" %} +{% load i18n %} +{% block js_import %}{{ block.super }} + +{% endblock %} + +{% block content_title %}{% trans 'Sign up' %}{% endblock %} +{% block iricontent%} +
    {% csrf_token %} +
      +{{form.as_ul}} +
    • +
    +
    + +{% endblock%} diff -r 7c994c98d1df -r ae8593287883 web/ldt/user/templatetags/__init__.py diff -r 7c994c98d1df -r ae8593287883 web/ldt/user/templatetags/logintag.py --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/web/ldt/user/templatetags/logintag.py Tue Jun 08 15:44:35 2010 +0200 @@ -0,0 +1,9 @@ +from django import template +from django.template.loader import get_template + +register = template.Library() + +def loginAjax(user, reload=None): + return {'user': user, 'reload': reload} + +register.inclusion_tag('ldt/user/login_form.html')(loginAjax) diff -r 7c994c98d1df -r ae8593287883 web/ldt/user/tests.py --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/web/ldt/user/tests.py Tue Jun 08 15:44:35 2010 +0200 @@ -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 7c994c98d1df -r ae8593287883 web/ldt/user/urls.py --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/web/ldt/user/urls.py Tue Jun 08 15:44:35 2010 +0200 @@ -0,0 +1,19 @@ +from django.conf.urls.defaults import * + +urlpatterns = patterns('', + url(r'^loginAjax/$', 'ldt.user.views.loginAjax'), + url(r'^profile/', 'ldt.user.views.profile'), + url(r'^logout/', 'ldt.user.views.logout_view'), + url(r'^space/$', 'ldt.user.views.space'), + url(r'^emailchange/$', 'ldt.user.views.change_email'), + url(r'^emailchange/done/$', 'ldt.user.views.change_email_done'), +# url(r'^space/ldt/$', 'ldt.ldt_utils.views.list_ldt'), +# url(r'^space/ldt/indexproject/(?P.*)$', 'ldt.ldt_utils.views.indexProject'), +# url(r'^space/ldt/init/(?P.*)/(?P.*)$', 'ldt.ldt_utils.views.init'), +# url(r'^space/ldt/project/(?P.*)$', 'ldt.ldt_utils.views.ldtProject'), +# url(r'^space/ldt/create/$', 'ldt.ldt_utils.views.create_ldt_view'), +# url(r'^space/ldt/created_done/$', 'ldt.ldt_utils.views.created_ldt'), +# url(r'^space/ldt/save/$', 'ldt.ldt_utils.views.save_ldtProject'), +# url(r'^space/ldt/publish/(?P.*)$', 'ldt.ldt_utils.views.publish'), +# url(r'^space/ldt/unpublish/(?P.*)$', 'ldt.ldt_utils.views.unpublish'), +) diff -r 7c994c98d1df -r ae8593287883 web/ldt/user/views.py --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/web/ldt/user/views.py Tue Jun 08 15:44:35 2010 +0200 @@ -0,0 +1,75 @@ +from django.conf import settings +from django.http import HttpResponse, HttpResponseRedirect +from django.shortcuts import render_to_response +from django.contrib.auth import authenticate, login, logout +from django.contrib.auth.decorators import login_required +# from django.contrib.sites.models import Site, RequestSite +from django.template import RequestContext, Context, loader +from django.utils.translation import ugettext as _ +from django.core.urlresolvers import reverse +from forms import EmailChangeForm +from django.utils import simplejson +from ldt.management import test_cms, test_ldt + + +def home(request): + return render_to_response('ldt/user/home.html',context_instance=RequestContext(request)) + +@login_required +def profile(request): + return render_to_response('ldt/user/profile.html', context_instance=RequestContext(request)) + +@login_required +def space(request, page_id=None, slug=None): + cms = test_cms() + ldt = test_ldt() + context={ + 'cms': cms, + 'ldt': ldt + } + return render_to_response('ldt/user/space.html', context, context_instance=RequestContext(request)) + + + +def logout_view(request): + logout(request) + # return HttpResponseRedirect(request.META.get('HTTP_REFERER', '/')) + return HttpResponseRedirect(settings.LOGOUT_URL) + + +def loginAjax(request, loginstate_template_name='ldt/user/login_form.html'): + if request.method == "POST": + username=request.POST["username"] + password=request.POST["password"] + user = authenticate(username=username, password=password) + error_message = _(u"Sorry, that's not a valid username or password.") + if user is not None: + if user.is_active: + login(request, user) + context = RequestContext(request, { 'username': user.username,}) + template = loader.get_template(loginstate_template_name) + html = template.render(context) + return HttpResponse(simplejson.dumps({'message': u'successful', 'username': user.username, 'html': html, 'reload': request.POST["reload"],})) + else: + return HttpResponse(simplejson.dumps({'message': error_message,})) + else: + return HttpResponse(simplejson.dumps({'message': error_message,})) + return render_to_response('ldt/user/login_ajax.html', context_instance=RequestContext(request)) + +@login_required +def change_email(request, post_change_redirect=None): + if post_change_redirect is None: + post_change_redirect = reverse('ldt.user.views.change_email_done') + if request.method == "POST": + form = EmailChangeForm(request.user, request.POST) + if form.is_valid(): + form.save() + return HttpResponseRedirect(post_change_redirect) + else: + form = EmailChangeForm(request.user) + return render_to_response('ldt/user/change_email.html', {'form': form,}, context_instance=RequestContext(request)) + +@login_required +def change_email_done(request, template_name='ldt/user/change_email_done.html'): + return render_to_response(template_name, context_instance=RequestContext(request)) + diff -r 7c994c98d1df -r ae8593287883 web/ldt/utils/__init__.py --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/web/ldt/utils/__init__.py Tue Jun 08 15:44:35 2010 +0200 @@ -0,0 +1,2 @@ + + \ No newline at end of file diff -r 7c994c98d1df -r ae8593287883 web/ldt/utils/context_processors.py --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/web/ldt/utils/context_processors.py Tue Jun 08 15:44:35 2010 +0200 @@ -0,0 +1,4 @@ +from django.conf import settings + +def ldt(request): + return {'LDT_MEDIA_PREFIX': settings.LDT_MEDIA_PREFIX } diff -r 7c994c98d1df -r ae8593287883 web/ldt/utils/xml.py --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/web/ldt/utils/xml.py Tue Jun 08 15:44:35 2010 +0200 @@ -0,0 +1,7 @@ +def getText(anode): + nodelist = anode.childNodes + rc = "" + for node in nodelist: + if node.nodeType == node.TEXT_NODE: + rc = rc + node.data + return rc \ No newline at end of file diff -r 7c994c98d1df -r ae8593287883 web/ldt/utils/zipfileext.py --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/web/ldt/utils/zipfileext.py Tue Jun 08 15:44:35 2010 +0200 @@ -0,0 +1,14 @@ +import zipfile, os, os.path + +class ZipFileExt(zipfile.ZipFile): + def unzip_into_dir(self, dir): + if not os.path.exists(dir): + os.mkdir(dir, 0777) + for name in self.namelist(): + if name.endswith('/'): + os.mkdir(os.path.join(dir,name)) + else: + outfile = open(os.path.join(dir,name), 'wb') + outfile.write(self.read(name)) + outfile.close() + diff -r 7c994c98d1df -r ae8593287883 web/ldt_utils/.htaccess.tmpl --- a/web/ldt_utils/.htaccess.tmpl Tue Jun 08 15:31:42 2010 +0200 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,11 +0,0 @@ -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 7c994c98d1df -r ae8593287883 web/ldt_utils/__init__.py --- a/web/ldt_utils/__init__.py Tue Jun 08 15:31:42 2010 +0200 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,3 +0,0 @@ -VERSION = (0,1) - -VERSION_STR = unicode(".".join(map(lambda i:"%02d" % (i,), VERSION))) diff -r 7c994c98d1df -r ae8593287883 web/ldt_utils/admin.py --- a/web/ldt_utils/admin.py Tue Jun 08 15:31:42 2010 +0200 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,30 +0,0 @@ -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 7c994c98d1df -r ae8593287883 web/ldt_utils/core/__init__.py diff -r 7c994c98d1df -r ae8593287883 web/ldt_utils/core/handlers/__init__.py diff -r 7c994c98d1df -r ae8593287883 web/ldt_utils/core/handlers/modpython.py --- a/web/ldt_utils/core/handlers/modpython.py Tue Jun 08 15:31:42 2010 +0200 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,8 +0,0 @@ - -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 7c994c98d1df -r ae8593287883 web/ldt_utils/core/models.py --- a/web/ldt_utils/core/models.py Tue Jun 08 15:31:42 2010 +0200 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,22 +0,0 @@ -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 7c994c98d1df -r ae8593287883 web/ldt_utils/core/tests.py --- a/web/ldt_utils/core/tests.py Tue Jun 08 15:31:42 2010 +0200 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,23 +0,0 @@ -""" -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 7c994c98d1df -r ae8593287883 web/ldt_utils/core/views.py --- a/web/ldt_utils/core/views.py Tue Jun 08 15:31:42 2010 +0200 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,1 +0,0 @@ -# Create your views here. diff -r 7c994c98d1df -r ae8593287883 web/ldt_utils/ldt/__init__.py --- a/web/ldt_utils/ldt/__init__.py Tue Jun 08 15:31:42 2010 +0200 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,15 +0,0 @@ -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 7c994c98d1df -r ae8593287883 web/ldt_utils/ldt/admin.py --- a/web/ldt_utils/ldt/admin.py Tue Jun 08 15:31:42 2010 +0200 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,80 +0,0 @@ -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/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/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) diff -r 7c994c98d1df -r ae8593287883 web/ldt_utils/ldt/contentindexer.py --- a/web/ldt_utils/ldt/contentindexer.py Tue Jun 08 15:31:42 2010 +0200 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,238 +0,0 @@ -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 xml -import xml.dom -import xml.dom.minidom -import xml.dom.ext -import xml.xpath -import fnmatch -import Ft -import uuid -import shutil -import lucene -from ldt.ldt_utils import STORE -from ldt.ldt_utils import ANALYZER - -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 = xml.dom.minidom.parse(filepath) - doc = Ft.Xml.Domlette.ConvertDocument(doc) - - self.__writer.deleteDocuments(lucene.Term("iri_id", content.iri_id)) - - con = xml.xpath.Context.Context(doc, 1, 1, None) - res = xml.xpath.Evaluate("/iri/body/ensembles/ensemble", context=con) - - for ensemble in res: - ensembleId = ensemble.getAttributeNS("id",None) - - for decoupageNode in ensemble.childNodes: - if decoupageNode.nodeType != xml.dom.Node.ELEMENT_NODE or decoupageNode.tagName != "decoupage" or decoupageNode.getAttributeNS("id",None) in self.decoupage_blacklist: - continue - - decoupId = decoupageNode.getAttributeNS("id",None) - res = xml.xpath.Evaluate("elements/element", decoupageNode) - for elementNode in res: - doc = lucene.Document() - elementId = elementNode.getAttributeNS("id",None) - tags = elementNode.getAttributeNS("tags",None) - - if tags is not None: - tags.replace(",", ";") - - if tags is None or len(tags) == 0: - tags = "" - restagnode = xml.xpath.Evaluate("tag/text()", elementNode) - for tagnode in restagnode: - tags = tags + " ; " + tagnode.data - - if tags is None or len(tags) == 0: - tags = "" - restagnode = xml.xpath.Evaluate("tags/tag/text()", elementNode) - for tagnode in restagnode: - tags = tags + " ; " + tagnode.data - - title = "" - for txtRes in xml.xpath.Evaluate("title/text()", elementNode): - title = title + txtRes.data - - abstract = "" - for txtRes in xml.xpath.Evaluate("abstract/text()", elementNode): - abstract = abstract + txtRes.data - - 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 = xml.dom.minidom.parseString(project.ldt) - doc = Ft.Xml.Domlette.ConvertDocument(doc) - - self.__writer.deleteDocuments(lucene.Term("iri_id", project.iri_id)) - - con = xml.xpath.Context.Context(doc, 1, 1, None) - res = xml.xpath.Evaluate("/iri/annotations/content", context=con) - - for content in res: - contentId = content.getAttributeNS("id",None) - - ensembleId = "ens_perso" - - for decoupageNode in content.childNodes: - # pocketfilms.utils.log.debug("Indexing content decoupage : "+ repr(decoupageNode.nodeType) + " in " + repr(self.decoupage_blacklist)) - if decoupageNode.nodeType != xml.dom.Node.ELEMENT_NODE or decoupageNode.tagName != "decoupage" or decoupageNode.getAttributeNS("id",None) in self.decoupage_blacklist: - continue - - decoupId = decoupageNode.getAttributeNS("id",None) - res = xml.xpath.Evaluate("elements/element", decoupageNode) - for elementNode in res: - doc = lucene.Document() - elementId = elementNode.getAttributeNS("id",None) - tags = elementNode.getAttributeNS("tags",None) - - if tags is not None: - tags.replace(",", ";") - - if tags is None or len(tags) == 0: - tags = "" - restagnode = xml.xpath.Evaluate("tag/text()", elementNode) - for tagnode in restagnode: - tags = tags + " ; " + tagnode.data - - if tags is None or len(tags) == 0: - tags = "" - restagnode = xml.xpath.Evaluate("tags/tag/text()", elementNode) - for tagnode in restagnode: - tags = tags + " ; " + tagnode.data - - title = "" - for txtRes in xml.xpath.Evaluate("title/text()", elementNode): - title = title + txtRes.data - - abstract = "" - for txtRes in xml.xpath.Evaluate("abstract/text()", elementNode): - abstract = abstract + txtRes.data - - 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 7c994c98d1df -r ae8593287883 web/ldt_utils/ldt/fileimport.py --- a/web/ldt_utils/ldt/fileimport.py Tue Jun 08 15:31:42 2010 +0200 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,379 +0,0 @@ -import tempfile -import os.path -import shutil -from django.core.exceptions import ObjectDoesNotExist -from ldt.utils import zipfileext -from django.conf import settings -from models import Content -import xml.dom.minidom -import xml.dom.ext #@UnresolvedImport -import xml.xpath #@UnresolvedImport -import fnmatch -import uuid -import urllib - -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) - doc = xml.dom.minidom.parse(url) - doc = Ft.Xml.Domlette.ConvertDocument(doc) - con = xml.xpath.Context.Context(doc, 1, 1, None) - #open .iri and get the title - res = xml.xpath.Evaluate("/iri/head/meta[@name='title']/@content", context=con) - self.title = res[0].value - - #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) - - con = xml.xpath.Context.Context(doc, 1, 1, None) - - res = xml.xpath.Evaluate("/iri/head/meta[@name='title']/@content", context=con) - self.title = res[0].value - - res = xml.xpath.Evaluate("/iri/body/ensembles",context=con) - ensemblesnode = res[0] - - ensembleids = [] - - for node in ensemblesnode.childNodes: - if node.nodeType == xml.dom.Node.ELEMENT_NODE and node.tagName == "ensemble": - id = node.getAttributeNS("id",None) - if id not in ensembleids: - ensembleids.append(id) - - if self.annotations is not None: - newEnsemble = None - for cnode in self.annotations.childNodes: - if cnode.nodeType == xml.dom.Node.ELEMENT_NODE and cnode.tagName == "decoupage": - if newEnsemble is None: - newensemble = doc.createElement('ensemble') - ensembleid = self.id+"_"+str(uuid.uuid1()) - newensemble.setAttributeNS(None,'id',ensembleid) - - newensemble.setAttributeNS(None,'title', self.annotations.getAttribute('title')) - newensemble.setAttributeNS(None,'author', self.annotations.getAttribute('author')) - newensemble.setAttributeNS(None,'date', self.annotations.getAttribute('date')) - newensemble.setAttributeNS(None,'abstract', self.annotations.getAttribute('abstract')) - ensemblesnode.appendChild(newensemble) - ensembleids.append(ensembleid) - newDecoupageNode = cnode.cloneNode(True) - newensemble.appendChild(newDecoupageNode) - elif cnode.nodeType == xml.dom.Node.ELEMENT_NODE and cnode.tagName == "ensemble": - ensembleid = cnode.getAttribute(u"id") - cloneNode = cnode.cloneNode(True) - if ensembleid in ensembleids: - ensembleid = self.id+"_"+str(uuid.uuid1()) - cloneNode.setAttribute(u"id", ensembleid) - ensembleids.append(ensembleid) - ensemblesnode.appendChild(cloneNode) - - res = xml.xpath.Evaluate("/iri/body/medias/media[@id='video']/video", context=con) - if self.flatten: - src_video = res[0].getAttribute('src') - self.videourl = os.path.basename(src_video) - res[0].setAttributeNS(None,'src', self.videourl) - self.duration = res[0].getAttributeNS(None, 'dur') - - f = open(path, "w") - try: - 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): - #if 'http' in self.src: - # url = self.src - #else: - # url = self.id + u"/" + os.path.basename(self.src) - content, self.created = Content.objects.get_or_create(iri_id=self.id, defaults = {'iriurl': self.src, 'title':self.title, 'description':self.desc, 'videopath': self.videopath}) - if not self.created: - content.iriurl = self.src - content.title = self.title - content.description = self.desc - content.save() - - content.iriurl = self.src - content.videopath = self.videopath.rstrip("/") + "/" - - content.iri = self.id + u"/" + os.path.basename(self.src) - content.title = self.title - content.description = self.desc - content.duration = int(self.duration) - 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 = {} - if ldtpath: - doc = xml.dom.minidom.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) - for pnode in result: - author = pnode.getAttributeNS("user",None) - if author: - self.author = unicode(author) - break - - result = xml.xpath.Evaluate("/iri/medias/media", context=con) - - for i, medianode in enumerate(result): - # get iri file's id from file ldt - id = medianode.attributes['id'].value - 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 - if medianode.attributes['video'].value !="": - contents[id].videopath = medianode.attributes['video'].value - elif self.videopath !="" or self.videopath: - contents[id].videopath = self.videopath - else: - contents[id].videopath =settings.STREAM_URL - - - #get annotation of file ldt - result = xml.xpath.Evaluate("/iri/annotations/content", context=con) - - for contentnode in result: - id = contentnode.attributes['id'].value - # pocketfilms.utils.log.debug("ID : " + str(id)) - if contents.has_key(id): - if self.author: - contentnode.setAttributeNS(None,"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): - # pocketfilms.utils.log.debug("folder stack length : "+ str(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)): - # pocketfilms.utils.log.debug("Push folder : " + entryPath) - foldersToProcess.append(entryPath) - elif fnmatch.fnmatch(entry, "*.ldt"): - # pocketfilms.utils.log.debug("Process file : " + entryPath) - 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 7c994c98d1df -r ae8593287883 web/ldt_utils/ldt/forms.py --- a/web/ldt_utils/ldt/forms.py Tue Jun 08 15:31:42 2010 +0200 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,29 +0,0 @@ -from django import forms -from models import Project, Content -import uuid - -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() - -class CopyProjectForm (forms.Form): - title = forms.CharField() diff -r 7c994c98d1df -r ae8593287883 web/ldt_utils/ldt/models.py --- a/web/ldt_utils/ldt/models.py Tue Jun 08 15:31:42 2010 +0200 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,124 +0,0 @@ -from django.db import models -from django.conf import settings -from ldt.core.models import Document, Owner -from django.utils.translation import ugettext_lazy as _ -from utils import create_ldt, copy_ldt -import uuid - -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 - - -class Content(models.Model): - iri_id = models.CharField(max_length=1024, unique=True) - iriurl = models.URLField() - videopath = models.URLField(null=True, blank=True) - creation_date = models.DateTimeField(auto_now_add=True) - update_date = models.DateTimeField(auto_now=True) - title = models.CharField(max_length=1024, null=True, blank=True) - description = models.TextField(null=True, blank=True) - external_id = models.CharField(max_length=1024, null=True, blank=True) - authors = models.ManyToManyField(Author) - duration = models.IntegerField(null=True, blank=True) - - def get_duration(self): - if self.duration is None: - doc = xml.dom.minidom.parse(self.iri_file_path()) - doc = Ft.Xml.Domlette.ConvertDocument(doc) - con = xml.xpath.Context.Context(doc, 1, 1, None) - res = xml.xpath.Evaluate("/iri/body/medias/media[@id='video']/video", context=con) - self.duration = int(res[0].getAttributeNS(None, 'dur')) - self.save() - return self.duration - - def delete(self): - super(Content, self).delete() - writer = lucene.IndexWriter(STORE, ANALYZER, True, lucene.IndexWriter.MaxFieldLength.UNLIMITED) - writer.deleteDocuments(lucene.Term("iri_id", self.iri_id)) - writer.commit() - - def __unicode__(self): - return str(self.id) + ": " + self.iri_id - - def iri_url(self, web_url=settings.WEB_URL): - if 'http' in self.iriurl or 'https' in self.iriurl: - return self.iriurl - else: - return unicode(web_url) + unicode(settings.MEDIA_URL)+u"media/ldt/"+unicode(self.iriurl) - - -class Project(Document): - STATE_CHOICES=( - (1, 'edition'), - (2, 'published'), - (3, 'moderated'), - (4, 'rejected'), - (5, 'deleted') - ) - ldt_id = models.CharField(max_length=1024, unique=True) - ldt = models.TextField(null=True) - title = models.CharField(max_length=1024) - contents = models.ManyToManyField(Content) - creation_date = models.DateTimeField(auto_now_add=True) - modification_date = models.DateTimeField(auto_now=True) - created_by = models.CharField(_("created by"), max_length=70) - changed_by = models.CharField(_("changed by"), max_length=70) - state = models.IntegerField(choices=STATE_CHOICES, default=1) - - def __unicode__(self): - return unicode(self.id) + u": " + unicode(self.ldt_id) - - @staticmethod - def create_project(user, title, contents): - owner = Owner.objects.get(user=user) - project = Project(title=title, owner=owner) - project.ldt_id = str(uuid.uuid1()) - project.created_by=user.username - project.changed_by=user.username - project.state = 1 - project.save() - for content in contents: - project.contents.add(content) - project.save() - return create_ldt(project, user) - - def copy_project(self, user, title): - owner = Owner.objects.get(user=user) - project = Project(title=title, owner=owner) - project = copy_ldt(self, project, user) - project.save() - for content in self.contents.all(): - project.contents.add(content) - project.save() - return project - -class Segment(models.Model): - - project_obj = models.ForeignKey(Project, null=True) - content = models.ForeignKey(Content) - project_id = models.CharField(max_length=1024, unique=False, blank=True, null=True) - iri_id = models.CharField(max_length=1024, unique=False) - ensemble_id = models.CharField(max_length=1024, unique=False) - cutting_id = models.CharField(max_length=1024, unique=False) - element_id = models.CharField(max_length=1024, unique=False) - tags = models.CharField(max_length=2048, unique=False, null=True, blank=True) - title = models.CharField(max_length=2048, unique=False, null=True, blank=True) - duration = models.IntegerField(null=True) - start_ts = models.IntegerField(null=True) - author = models.CharField(max_length=1024, unique=False, null=True, blank=True) - date = models.CharField(max_length=128, unique=False, null=True, blank=True) - abstract = models.TextField(null=True, blank=True) - - def __unicode__(self): - return "/".join((unicode(self.project_id), unicode(self.iri_id), unicode(self.ensemble_id), unicode(self.cutting_id), unicode(self.element_id))) - - class Meta: - unique_together = (('project_id', 'iri_id', 'ensemble_id', 'cutting_id', 'element_id'),) - diff -r 7c994c98d1df -r ae8593287883 web/ldt_utils/ldt/projectindexer.py --- a/web/ldt_utils/ldt/projectindexer.py Tue Jun 08 15:31:42 2010 +0200 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,110 +0,0 @@ -import tempfile -import os -import os.path -import shutil -import ldt.utils.xml -from ldt import settings -import xml -import xml.dom -import xml.dom.minidom -import xml.dom.ext -import xml.xpath -import lucene -from ldt.ldt_utils import STORE -from ldt.ldt_utils import ANALYZER - -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 = xml.dom.minidom.parseString(ldt.encode( "utf-8" )) - - self.__writer.deleteDocuments(lucene.Term("ldt_id", project.ldt_id)) - - con = xml.xpath.Context.Context(doc, 1, 1, None) - res = xml.xpath.Evaluate("/iri/annotations/content", context=con) - - for content in res: - contentId = content.getAttribute("id") - - res =xml.xpath.Evaluate("ensemble", content) - for ensemble in res: - ensembleId = ensemble.getAttribute("id") - - for decoupageNode in ensemble.childNodes: - # ldt.utils.log.debug("Indexing project decoupage : "+ repr(decoupageNode.nodeType) + " in " + repr(self.decoupage_blacklist)) - if decoupageNode.nodeType != xml.dom.Node.ELEMENT_NODE or decoupageNode.tagName != "decoupage" or decoupageNode.getAttribute("id") in self.decoupage_blacklist: - continue - - decoupId = decoupageNode.getAttribute("id") - res = xml.xpath.Evaluate("elements/element", decoupageNode) - for elementNode in res: - doc = lucene.Document() - elementId = elementNode.getAttribute("id") - tags = elementNode.getAttribute("tags") - - if tags is not None: - tags.replace(",", ";") - - if tags is None or len(tags) == 0: - tags = "" - restagnode = xml.xpath.Evaluate("tag/text()", elementNode) - for tagnode in restagnode: - tags = tags + " ; " + tagnode.data - - if tags is None or len(tags) == 0: - tags = "" - restagnode = xml.xpath.Evaluate("tags/tag/text()", elementNode) - for tagnode in restagnode: - tags = tags + " ; " + tagnode.data - - title = "" - for txtRes in xml.xpath.Evaluate("title/text()", elementNode): - title = title + txtRes.data - - abstract = "" - for txtRes in xml.xpath.Evaluate("abstract/text()", elementNode): - abstract = abstract + txtRes.data - - doc.add(lucene.Field("ldt_id", project.ldt_id, lucene.Field.Store.YES, lucene.Field.Index.UN_TOKENIZED)) - doc.add(lucene.Field("iri_id", contentId, lucene.Field.Store.YES, lucene.Field.Index.UN_TOKENIZED)) - 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.TOKENIZED)) - doc.add(lucene.Field("title", title, lucene.Field.Store.NO, lucene.Field.Index.TOKENIZED)) - doc.add(lucene.Field("abstract", abstract, lucene.Field.Store.NO, lucene.Field.Index.TOKENIZED)) - doc.add(lucene.Field("all", " ".join([tags, title, abstract]), lucene.Field.Store.NO, lucene.Field.Index.TOKENIZED)) - - self.__writer.addDocument(doc) - - self.__writer.flush() \ No newline at end of file diff -r 7c994c98d1df -r ae8593287883 web/ldt_utils/ldt/templates/admin/ldt/app_action.html --- a/web/ldt_utils/ldt/templates/admin/ldt/app_action.html Tue Jun 08 15:31:42 2010 +0200 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,7 +0,0 @@ -{% extends "admin/base_site.html" %} {% load i18n %} {% block -breadcrumbs %} - -{% endblock %} - diff -r 7c994c98d1df -r ae8593287883 web/ldt_utils/ldt/templates/admin/ldt/app_index.html --- a/web/ldt_utils/ldt/templates/admin/ldt/app_index.html Tue Jun 08 15:31:42 2010 +0200 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,25 +0,0 @@ -{% extends "admin/app_index.html" %} {% load i18n %} {% block content %} -{{ block.super }} - -
    - - - - - - - - - - -
    Import
    Import - an ldt 
    Reindex -  
    -
    - -{% endblock %} diff -r 7c994c98d1df -r ae8593287883 web/ldt_utils/ldt/templates/admin/ldt/content/reindex_form.html --- a/web/ldt_utils/ldt/templates/admin/ldt/content/reindex_form.html Tue Jun 08 15:31:42 2010 +0200 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,22 +0,0 @@ -{% extends "admin/ldt/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 7c994c98d1df -r ae8593287883 web/ldt_utils/ldt/templates/admin/ldt/content/search_form.html --- a/web/ldt_utils/ldt/templates/admin/ldt/content/search_form.html Tue Jun 08 15:31:42 2010 +0200 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,13 +0,0 @@ -{% extends "base.html" %} {% block content %} - -
    - - - {{ form.as_table }} -
    -
    - - -{% endblock %} diff -r 7c994c98d1df -r ae8593287883 web/ldt_utils/ldt/templates/admin/ldt/content/upload_form.html --- a/web/ldt_utils/ldt/templates/admin/ldt/content/upload_form.html Tue Jun 08 15:31:42 2010 +0200 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,26 +0,0 @@ -{% extends "admin/ldt/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 7c994c98d1df -r ae8593287883 web/ldt_utils/ldt/templates/iriuser/ldt/copy_ldt.html --- a/web/ldt_utils/ldt/templates/iriuser/ldt/copy_ldt.html Tue Jun 08 15:31:42 2010 +0200 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,18 +0,0 @@ -{% load i18n %} {# form of copy of project ldt #} - - - - - - - -
    -
    {% trans "Copy your project" %}
    -
    {% csrf_token %}
    -
    - - diff -r 7c994c98d1df -r ae8593287883 web/ldt_utils/ldt/templates/iriuser/ldt/create_ldt.html --- a/web/ldt_utils/ldt/templates/iriuser/ldt/create_ldt.html Tue Jun 08 15:31:42 2010 +0200 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,29 +0,0 @@ -{% load i18n %} {# form of creation of project ldt #} - - - - - - - -
    -
    {% trans "Create your project" %}
    -
    {% -csrf_token %} - -
    {% trans "List of contents" %}
    -
      - {% for content in contents %} -
    • {{content.iri_id}}
    • - {% endfor %} -
    - -
    -
    - - diff -r 7c994c98d1df -r ae8593287883 web/ldt_utils/ldt/templates/iriuser/ldt/init_ldt.html --- a/web/ldt_utils/ldt/templates/iriuser/ldt/init_ldt.html Tue Jun 08 15:31:42 2010 +0200 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,51 +0,0 @@ - - - - - - - -Ligne de Temps - IRI - - - - - - -
     
    - - - diff -r 7c994c98d1df -r ae8593287883 web/ldt_utils/ldt/templates/iriuser/ldt/ldt_list.html --- a/web/ldt_utils/ldt/templates/iriuser/ldt/ldt_list.html Tue Jun 08 15:31:42 2010 +0200 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,80 +0,0 @@ -{% extends "ldt/user/user_base.html" %} {# list of projects ldt #} {% -load i18n %} {% block js_import %}{{ block.super }} - - -{% endblock %} {% block css_import %} {{ block.super }} - -{% endblock %} {% block breadcrumb %} -
  • -
  • {% trans -"Space" %}
  • -
  • {% trans "Ldt Project" %}
  • -{% endblock %} {% block content_title %}{% trans "Ldt Project" %}{% -endblock %} {% block iricontent %} -
    {% -trans 'Create new project'%} - - - - - - - - - - {% for ldt in ldtProjects %} - - - {% ifequal ldt.state 2%} - - {% else %} - - {% endifequal %} - - {% endfor %} - -
    {% trans "Project" %}
    {% trans "title" %}{% trans " published" %}
    {{ ldt.title }}TrueFalse
    -
    -{% endblock %} - diff -r 7c994c98d1df -r ae8593287883 web/ldt_utils/ldt/templates/iriuser/ldt/loading.html --- a/web/ldt_utils/ldt/templates/iriuser/ldt/loading.html Tue Jun 08 15:31:42 2010 +0200 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,26 +0,0 @@ - - - - - - - -
    -
    loading
    -
    - - diff -r 7c994c98d1df -r ae8593287883 web/ldt_utils/ldt/templates/iriuser/ldt/save_done.html --- a/web/ldt_utils/ldt/templates/iriuser/ldt/save_done.html Tue Jun 08 15:31:42 2010 +0200 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,5 +0,0 @@ -

    done

    -

    {{ldt}} -

    -

    {{id}}

    -

    title:{{title}}

    \ No newline at end of file diff -r 7c994c98d1df -r ae8593287883 web/ldt_utils/ldt/tests.py --- a/web/ldt_utils/ldt/tests.py Tue Jun 08 15:31:42 2010 +0200 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,23 +0,0 @@ -""" -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 7c994c98d1df -r ae8593287883 web/ldt_utils/ldt/urls.py --- a/web/ldt_utils/ldt/urls.py Tue Jun 08 15:31:42 2010 +0200 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,35 +0,0 @@ -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'^searchInit/(?P.*)/(?P.*)$', 'views.searchInit'), - url(r'^searchForm/$', 'views.searchForm'), - url(r'^search/$', 'views.searchIndex'), - url(r'^search/(?P.*)/(?P.*)$', 'views.searchIndexGet'), - url(r'^searchLdt/(?P.*)/(?P.*)$', 'views.searchLdt'), - url(r'^searchSeg/(?P.*)/(?P.*)$', 'views.searchSegments'), - url(r'^index/(?P.*)$', 'views.index'), - url(r'^init/(?P.*)/(?P.*)$', 'views.init'), - url(r'^ldt/(?P.*)$', 'views.ldt'), - url(r'^search/loading/$', 'views.loading'), - url(r'^create/(?P.*)$', 'views.create_project'), - url(r'^copy/(?P.*)$', 'views.copy_project'), -) - -if test_ldt(): - urlpatterns += patterns('ldt.ldt_utils', - url(r'^space/ldt/$', 'views.list_ldt'), - url(r'^space/ldt/indexproject/(?P.*)$', 'views.indexProject'), - url(r'^space/ldt/init/(?P.*)/(?P.+)$', 'views.init'), - url(r'^space/ldt/project/(?P.*)$', 'views.ldtProject'), - url(r'^space/ldt/create/$', 'views.create_ldt_view'), - url(r'^space/ldt/created_done/$', 'views.created_ldt'), - url(r'^space/ldt/save/$', 'views.save_ldtProject'), - url(r'^space/ldt/publish/(?P.*)$', 'views.publish'), - url(r'^space/ldt/unpublish/(?P.*)$', 'views.unpublish'), - -) diff -r 7c994c98d1df -r ae8593287883 web/ldt_utils/ldt/utils.py --- a/web/ldt_utils/ldt/utils.py Tue Jun 08 15:31:42 2010 +0200 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,267 +0,0 @@ -import lucene -from ldt.ldt_utils import STORE -from ldt.ldt_utils import ANALYZER -from Ft.Xml import MarkupWriter -import uuid -import django.core.urlresolvers -from django.conf import settings -import urllib -import xml.dom -import xml.dom.minidom -import xml.dom.ext -import xml.xpath -import os -import os.path - -class LdtSearch(object): - - def query(self, field, query): - indexSearcher = lucene.IndexSearcher(STORE) - queryParser = lucene.QueryParser(lucene.Version.LUCENE_30, field, lucene.FrenchAnalyzer(lucene.Version.LUCENE_30)) - queryParser.setDefaultOperator(lucene.QueryParser.Operator.AND) - queryObj = queryParser.parse(query) - hits = indexSearcher.search(queryObj, settings.LDT_MAX_SEARCH_NUMBER) - - res = [] - for hit in hits.scoreDocs: - doc = indexSearcher.doc(hit.doc) - res.append({"iri_id":doc.get("iri_id"),"ensemble_id":doc.get("ensemble_id"),"decoupage_id":doc.get("decoupage_id"), "element_id":doc.get("element_id")}) - indexSearcher.close() - return res - - def queryAll(self, query): - return self.query("all", query) - -class LdtUtils(object): - - def generateLdt(self, contentList, file, title = u"", author=u"IRI Web", web_url=u"", media_url="", startSegment = None, contributions=None): - - writer = MarkupWriter(file, indent = u"yes") - writer.startDocument() - writer.startElement(u"iri") - writer.simpleElement(u"project", attributes={u"id":unicode(str(uuid.uuid1())), u"title":unicode(title) , u"user":author, u"abstract":u""}) - writer.startElement(u"medias") - for content in contentList: - videopath = unicode(settings.STREAM_URL) - if content.videopath : - videopath = unicode(content.videopath) - writer.simpleElement(u"media", attributes={u"id":content.iri_id,u"src":content.iri_url(web_url),u"video":videopath,u"pict":u"",u"extra":u""}) - writer.endElement(u"medias") - - if contributions is None: - contributions = [] - annotations_nodes = {} - for contrib in contributions: - doc = xml.dom.minidom.parseString(contrib.ldtproject.ldt.encode("utf-8")) - con = xml.xpath.Context.Context(doc, 1, 1, None) - res = xml.xpath.Evaluate("/iri/annotations/content", context=con) - for content in res: - contentid = content.getAttribute("id") - if annotations_nodes.has_key(contentid): - contentnode = annotations_nodes[contentid] - else: - contentnode = {"id":contentid, "ensembles":[]} - annotations_nodes[contentid]=contentnode - for ens in content.childNodes: - if ens.nodeType == xml.dom.Node.ELEMENT_NODE and ens.tagName.endswith("ensemble"): - contentnode["ensembles"].append(ens.toprettyxml()) - - if len(annotations_nodes) > 0: - writer.startElement(u"annotations") - for content in contentList: - if content.content_base.iri_id in annotations_nodes: - contentnode = annotations_nodes[content.content_base.iri_id] - if contentnode is not None: - if len(contentnode["ensembles"])>0: - writer.startElement(u"content", attributes={"id":contentnode["id"]}) - writer.text(u"") - for ens in contentnode["ensembles"]: - writer.xmlFragment(ens.encode("utf-8")) - writer.endElement(u"content") - else: - writer.simpleElement(u"content", attributes={"id":contentnode["id"]}) - writer.endElement(u"annotations") - else: - writer.simpleElement(u"annotations") - - - writer.startElement(u"displays") - if len(contentList) > 0: - writer.startElement(u"display", attributes={u"id":u"0",u"title":u"generated",u"idsel":contentList[0].iri_id,u"tc":u"0"}) - for content in contentList: - writer.startElement(u"content", attributes={u"id":content.iri_id}) - filepath = urllib.urlopen(content.iri_url()) - doc = xml.dom.minidom.parse(filepath) - con = xml.xpath.Context.Context(doc, 1, 1, None) - res = xml.xpath.Evaluate("/iri/body/ensembles/ensemble/decoupage", context=con) - for decoupagenode in res: - decoupage_id = decoupagenode.getAttribute(u"id") - ensemble_id = decoupagenode.parentNode.getAttribute(u"id") - writer.simpleElement(u"decoupage", attributes={u"id":decoupage_id,u"idens":ensemble_id}) - writer.endElement(u"content") - if startSegment is not None: - writer.startElement(u"activeSegment") - writer.simpleElement(u"id",attributes={u"idctt" : startSegment["idcontent"],u"idens" : startSegment["idgroup"], u"idcut" : startSegment["idcutting"], u"idseg" : startSegment["idsegment"]}) - writer.endElement(u"activeSegment") - - writer.endElement(u"display") - writer.endElement(u"displays") - writer.simpleElement(u"edits") - writer.endElement(u"iri") - - def generateInit(self, url, method, search=None): - - import xml.dom - import xml.dom.ext - - impl = xml.dom.getDOMImplementation() - doc = impl.createDocument(xml.dom.EMPTY_NAMESPACE, 'iri', None) - - elementFiles = doc.createElement('files') - doc.documentElement.appendChild(elementFiles) - - elementInit = doc.createElement('init') - elementFiles.appendChild(elementInit) - - elementfile = doc.createElement('file') - - elementfile.setAttribute('src',settings.WEB_URL + django.core.urlresolvers.reverse(method, args=url)) - elementfile.setAttribute('display', '1') - if(search): - elementfile.setAttribute("segsel",settings.WEB_URL + django.core.urlresolvers.reverse(search, args=url)) - - - # /*chemin video : tant que le serveur de media n'est pas up, */ - elementfile.setAttribute('video', settings.STREAM_URL) - elementfile.setAttribute('pict', "") - elementfile.setAttribute('extra', "") - - elementInit.appendChild(elementfile); - - elementRecent = doc.createElement('recent'); - elementFiles.appendChild(elementRecent); - - - elementLibrary = doc.createElement('library'); - elementFiles.appendChild(elementLibrary); - - username = '' - id = '' - elementUser = doc.createElement('user') - elementUser.setAttribute('name', username) - elementUser.setAttribute('id', id) - doc.documentElement.appendChild(elementUser) - - return doc - -def create_ldt(project, user): - - contentList=project.contents.all() - - """create xml""" - - # create a dom - impl = xml.dom.getDOMImplementation() - dom = impl.createDocument(xml.dom.EMPTY_NAMESPACE, 'iri', None) - #node project - elementProject = dom.createElement('project') - dom.documentElement.appendChild(elementProject) - - - elementProject.setAttribute('abstract', "") - elementProject.setAttribute('title', project.title) - elementProject.setAttribute('user', user.username) - elementProject.setAttribute('id', project.ldt_id) - #node medias - elementMedias = dom.createElement('medias') - dom.documentElement.appendChild(elementMedias) - - idsel = None - for content in contentList: - if not idsel: - idsel = content.iri_id - elementMedia = dom.createElement('media') - elementMedia.setAttribute('id', content.iri_id) - elementMedia.setAttribute('src', content.iri_url()) - if content.videopath and content.videopath !="": - elementMedia.setAttribute('video', content.videopath) - else: - elementMedia.setAttribute('video', settings.STREAM_URL) - elementMedia.setAttribute('pict', "") - elementMedia.setAttribute('extra', "") - elementMedias.appendChild(elementMedia) - if not idsel: - idsel = "" - - #node annotations - elementAnnotations = dom.createElement('annotations') - dom.documentElement.appendChild(elementAnnotations) - #node displays - elementDisplays = dom.createElement('displays') - elementDisplay = dom.createElement('display') - elementDisplay.setAttribute('id', '0') - elementDisplay.setAttribute('title', 'Init view') - elementDisplay.setAttribute('idsel', idsel) - elementDisplay.setAttribute('tc', '0') - elementDisplay.setAttribute('zoom', '0') - elementDisplay.setAttribute('scroll', '0') - elementDisplay.setAttribute('infoBAB', '') - #node content - for content in contentList: - elementContent = dom.createElement('content') - elementContent.setAttribute('id', content.iri_id) - if not 'http' in content.iriurl: - #eg: "iiiielizabethrosse/ENMI08-III_elizabethrosse.iri" - url = content.iri_url() - else: - url =content.iriurl - file = urllib.urlopen(url) - doc = xml.dom.minidom.parse(file) - con = xml.xpath.Context.Context(doc, 1, 1, None) - res = xml.xpath.Evaluate("/iri/body/ensembles/ensemble/decoupage", context=con) - #node decoupage - for decoupagenode in res: - decoupage_id = decoupagenode.getAttribute(u"id") - ensemble_id = decoupagenode.parentNode.getAttribute(u"id") - elementDecoupage = dom.createElement('decoupage') - elementDecoupage.setAttribute('idens', ensemble_id) - elementDecoupage.setAttribute('id', decoupage_id) - elementContent.appendChild(elementDecoupage) - elementDisplay.appendChild(elementContent) - - elementDisplays.appendChild(elementDisplay) - dom.documentElement.appendChild(elementDisplays) - - elementEdits = dom.createElement('edits') - dom.documentElement.appendChild(elementEdits) - # write dom in Project.ldt - project.ldt = dom.documentElement.toprettyxml() - #save Project - project.save() - return project - - -def copy_ldt(project, new_project, user): - new_project.ldt_id = str(uuid.uuid1()) - new_project.created_by=user.username - new_project.changed_by=user.username - new_project.state = 1 - - contentList=project.contents.all() - - """create xml""" - - # create a dom - dom = xml.dom.minidom.parseString(project.ldt.encode("utf-8")) - con = xml.xpath.Context.Context(dom, 1, 1, None) - res = xml.xpath.Evaluate("iri/project", context=con) - for elementProject in res: - elementProject.setAttribute('abstract', "") - elementProject.setAttribute('title', new_project.title) - elementProject.setAttribute('user', user.username) - elementProject.setAttribute('id', new_project.ldt_id) - - new_project.ldt = dom.documentElement.toprettyxml() - #save Project - new_project.save() - return new_project diff -r 7c994c98d1df -r ae8593287883 web/ldt_utils/ldt/views.py --- a/web/ldt_utils/ldt/views.py Tue Jun 08 15:31:42 2010 +0200 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,287 +0,0 @@ -import django.core.urlresolvers -from django.http import HttpResponse, HttpResponseRedirect -from django.shortcuts import render_to_response, get_object_or_404 -from django.template import RequestContext -from django.core.urlresolvers import reverse -from django.contrib.auth.decorators import login_required -from django.conf import settings -from fileimport import * -from forms import LdtImportForm, LdtAddForm, SearchForm, AddProjectForm, CopyProjectForm -from ldt.core.models import Owner -from models import * -from utils import * -from contentindexer import * -from string import Template -from Ft.Xml import MarkupWriter -import cgi -import uuid -import base64 -import lucene -import xml.dom -import xml.dom.ext -import xml.dom.minidom - - - -def searchForm(request): - form = SearchForm() - return render_to_response('ldt/ldt/search_form.html',{'form': form} , context_instance=RequestContext(request)) - -def searchIndex(request): - - sform = SearchForm(request.POST) - if sform.is_valid(): - search = sform.cleaned_data["search"] - - - queryStr = base64.urlsafe_b64encode(search.encode('utf8')) - field = request.POST["field"] - language_code = request.LANGUAGE_CODE[:2] - - url = settings.WEB_URL + django.core.urlresolvers.reverse("ldt.ldt_utils.views.searchInit", args=[field, queryStr]) - return render_to_response('ldt/ldt/init_ldt.html', {'MEDIA_URL': settings.MEDIA_URL, 'colorurl': settings.MEDIA_URL+'swf/ldt/pkg/color.xml', 'i18nurl': settings.MEDIA_URL+'swf/ldt/pkg/i18n', 'language': language_code, 'baseurl': settings.MEDIA_URL+'swf/ldt/', 'url': url}, context_instance=RequestContext(request)) - else: - resp = HttpResponse() - resp.write("Error : No result"); - -def searchIndexGet(request, field, query): - - language_code = request.LANGUAGE_CODE[:2] - url = settings.WEB_URL + django.core.urlresolvers.reverse("ldt.ldt_utils.views.searchInit", args=[field, query]) - return render_to_response('irisuser/ldt/init_ldt.html', {'MEDIA_URL': settings.MEDIA_URL, 'colorurl': settings.MEDIA_URL+'swf/ldt/pkg/color.xml', 'i18nurl': settings.MEDIA_URL+'swf/ldt/pkg/i18n', 'language': language_code, 'baseurl': settings.MEDIA_URL+'swf/ldt/', 'url': url}, context_instance=RequestContext(request)) - -def searchInit(request, field, query): - - ldtgen = LdtUtils() - - doc = ldtgen.generateInit([field,query], 'ldt.ldt_utils.views.searchLdt', 'ldt.ldt_utils.views.searchSegments') - - resp = HttpResponse(mimetype="text/xml;charset=utf-8") - xml.dom.ext.PrettyPrint(doc, resp) - return resp - -def searchLdt(request, field, query, edition=None): - - contentList = [] - resp = HttpResponse(mimetype="text/xml") - queryStr = "" - - if query and len(query)>0: - queryStr = base64.urlsafe_b64decode(query.encode("ascii")).decode("utf8") - searcher = LdtSearch() - ids = {} - - for result in searcher.query(field, queryStr): - ids[result["iri_id"]] = "" - - id_list = ids.keys() - - if edition is not None: - ids_editions = map(lambda t:t[0], filter(lambda id: id[0] is not None, Speak.objects.filter(session__day__edition=edition).order_by("session__start_ts", "order").values_list("content__iri_id"))) - id_list = filter(lambda id: id in id_list, ids_editions) - - contentList = Content.objects.filter(iri_id__in=id_list) - - - ldtgen = LdtUtils() - ldtgen.generateLdt(contentList, file=resp, title = u"Recherche : " + queryStr) - - return resp - - -def searchSegments(request, field, query, edition=None): - - if query and len(query)>0: - searcher = LdtSearch() - - queryStr = base64.urlsafe_b64decode(query.encode("ascii")).decode("utf8") - res = searcher.query(field, queryStr) - else: - res = [] - - iri_ids = None - - if edition is not None: - iri_ids = map(lambda t:t[0], filter(lambda id: id[0] is not None, Speak.objects.filter(session__day__edition=edition).order_by("session__start_ts", "order").values_list("content__iri_id"))) - - doc = xml.dom.getDOMImplementation().createDocument(None, "iri", None) - - for resultMap in res: - if iri_ids is None or resultMap['iri_id'] in iri_ids: - elem = doc.createElement('seg') - elem.setAttribute('idctt', resultMap['iri_id']) - elem.setAttribute('idens', resultMap['ensemble_id']) - elem.setAttribute('iddec', resultMap['decoupage_id']) - elem.setAttribute('idseg', resultMap['element_id']) - elem.setAttribute('idvue', "") - elem.setAttribute('crit', "") - doc.documentElement.appendChild(elem) - - return HttpResponse(doc.toprettyxml(encoding='utf-8'), mimetype="text/xml;charset=utf-8") - -@login_required -def list_ldt(request): - contents = Content.objects.all() - try: - owner = Owner.objects.get(user=request.user) - except: - return HttpResponseRedirect(settings.LOGIN_URL) - ldtProjects = Project.objects.filter(owner=owner) - context={ - 'contents': contents, - 'ldtProjects': ldtProjects.reverse(), - } - return render_to_response('ldt/ldt/ldt_list.html', context, context_instance=RequestContext(request)) - -def create_ldt_view(request): - if request.method == "POST" : - form = LdtAddForm(request.POST) - if form.is_valid(): - user = request.user - Project.create_project(title=form.cleaned_data['title'], user=user, contents=form.cleaned_data['contents']) - return HttpResponseRedirect(reverse("ldt.ldt_utils.views.list_ldt")) - else: - form = LdtAddForm() - contents = Content.objects.all() - return render_to_response('ldt/ldt/create_ldt.html', {'contents': contents, 'form': form,'create_project_action':reverse(create_ldt_view)}, context_instance=RequestContext(request)) - -def created_ldt(request): - return render_to_response('ldt/ldt/done.html', context_instance=RequestContext(request)) - -def indexProject(request, id): - - urlStr = settings.WEB_URL + reverse("ldt.ldt_utils.views.init", args=['ldtProject', id]) - posturl= settings.WEB_URL + reverse("ldt.ldt_utils.views.save_ldtProject") - language_code = request.LANGUAGE_CODE[:2] - - ldt = get_object_or_404(Project, ldt_id=id) - if ldt.state ==2: #published - readonly = 'true' - else: - readonly = 'false' - - return render_to_response('ldt/ldt/init_ldt.html', {'MEDIA_URL': settings.MEDIA_URL, 'colorurl': settings.MEDIA_URL+'swf/ldt/pkg/color.xml', 'i18nurl': settings.MEDIA_URL+'swf/ldt/pkg/i18n', 'language': language_code, 'baseurl': settings.MEDIA_URL+'swf/ldt/', 'url': urlStr, 'posturl': posturl, 'id': id, 'readonly': readonly}, context_instance=RequestContext(request)) - -def init(request, method, url): - ldtgen = LdtUtils() - - doc = ldtgen.generateInit([url], 'ldt.ldt_utils.views.'+method, None) - - resp = HttpResponse(mimetype="text/xml") - resp['Cache-Control']='no-cache, must-revalidate' - resp['Pragma']='no-cache' - xml.dom.ext.PrettyPrint(doc, resp) - return resp - -def ldtProject(request, id): - resp = HttpResponse(mimetype="text/xml") - resp['Cache-Control']='no-cache, must-revalidate' - resp['Pragma']='no-cache' - - project = Project.objects.get(ldt_id=id) - resp.write(project.ldt) - return resp - -def save_ldtProject(request): - if request.method=="POST": - ldt = request.POST['ldt'] - id = request.POST['id'] - ldtproject=Project.objects.get(ldt_id=id) - #save xml ldt - ldtproject.ldt=ldt - #get new title - dom = xml.dom.minidom.parseString(ldt.encode( "utf-8" )) - con = xml.xpath.Context.Context(dom, 1, 1, None) - result = xml.xpath.Evaluate("/iri/project",context=con) - for pnode in result: - title=pnode.getAttribute("title") - break - #set new title - ldtproject.title=title - #get new content list - new_contents=[] - result = xml.xpath.Evaluate("/iri/medias/media", context=con) - for medianode in result: - id = medianode.attributes['id'].value - new_contents.append(id) - # set new content list - for c in ldtproject.contents.all(): - if not c.iri_id in new_contents: - ldtproject.contents.remove(c) - ldtproject.save() - else: - ldt = '' - return render_to_response('ldt/ldt/save_done.html', {'ldt': ldt, 'id':id, 'title':title, 'contents': new_contents}, context_instance=RequestContext(request)) - -@login_required -def publish(request, id): - ldt = get_object_or_404(Project, ldt_id=id) - ldt.state = 2 #published - ldt.save() - return HttpResponseRedirect(reverse("ldt.ldt_utils.views.list_ldt")) - -@login_required -def unpublish(request, id): - ldt = get_object_or_404(Project, ldt_id=id) - ldt.state = 1 #edition - ldt.save() - return HttpResponseRedirect(reverse("ldt.ldt_utils.views.list_ldt")) - - -def index(request, url): - - urlStr = settings.WEB_URL + django.core.urlresolvers.reverse("ldt.ldt_utils.views.init", args=['ldt',url]) - language_code = request.LANGUAGE_CODE[:2] - - return render_to_response('ldt/ldt/init_ldt.html', {'MEDIA_URL': settings.MEDIA_URL, 'colorurl': settings.MEDIA_URL+'swf/ldt/pkg/color.xml', 'i18nurl': settings.MEDIA_URL+'swf/ldt/pkg/i18n', 'language': language_code, 'baseurl': settings.MEDIA_URL+'swf/ldt/', 'url': urlStr, 'weburl':settings.WEB_URL+settings.BASE_URL}, context_instance=RequestContext(request)) - - -def ldt(request, url, startSegment = None): - - import Ft - from Ft.Xml import MarkupWriter - - resp = HttpResponse(mimetype="text/xml; charset=utf-8") - resp['Cache-Control'] = 'no-cache' - - contentList = Content.objects.filter(iri_id=url) - - ldtgen = LdtUtils() - ldtgen.generateLdt(contentList, file=resp, title = contentList[0].title, startSegment=startSegment) - - return resp - - -def loading(request): - return render_to_response('ldt/ldt/loading.html', context_instance=RequestContext(request)) - - -@login_required -def create_project(request, iri_id): - - content = get_object_or_404(Content, iri_id=iri_id) - contents = [ content, ] - if request.method == "POST" : - form = AddProjectForm(request.POST) - if form.is_valid(): - user=request.user - project = Project.create_project(title=form.cleaned_data['title'], user=user, contents=contents) - return HttpResponseRedirect(reverse('ldt.ldt_utils.views.indexProject', args=[project.ldt_id])) - else: - form = AddProjectForm() - return render_to_response('ldt/ldt/create_ldt.html', {'form':form, 'contents':contents, 'iri_id':iri_id, 'create_project_action':reverse("ldt.ldt_utils.views.create_project",args=[iri_id])}, context_instance=RequestContext(request)) - -@login_required -def copy_project(request, ldt_id): - - project = get_object_or_404(Project, ldt_id=ldt_id) - if request.method == "POST" : - form = CopyProjectForm(request.POST) - if form.is_valid(): - user=request.user - project = project.copy_project(title=request.POST['title'], user=user) - return HttpResponseRedirect(reverse('ldt.ldt_utils.views.indexProject', args=[project.ldt_id])) - else: - form = CopyProjectForm - return render_to_response('ldt/ldt/copy_ldt.html', {'form':form, 'project':project}, context_instance=RequestContext(request)) - diff -r 7c994c98d1df -r ae8593287883 web/ldt_utils/locale/en/LC_MESSAGES/django.mo Binary file web/ldt_utils/locale/en/LC_MESSAGES/django.mo has changed diff -r 7c994c98d1df -r ae8593287883 web/ldt_utils/locale/en/LC_MESSAGES/django.po --- a/web/ldt_utils/locale/en/LC_MESSAGES/django.po Tue Jun 08 15:31:42 2010 +0200 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,648 +0,0 @@ -# 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-03-09 08:48-0600\n" -"PO-Revision-Date: 2010-02-17 03:53+0100\n" -"Last-Translator: Yves-Marie Haussonne \n" -"Language-Team: LANGUAGE \n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=UTF-8\n" -"Content-Transfer-Encoding: 8bit\n" - -#: ldt/models.py:43 -msgid "created by" -msgstr "created by" - -#: ldt/models.py:44 -msgid "changed by" -msgstr "changed by" - -#: ldt/templates/admin/ldt/app_action.html:6 -#: 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/templates/iriuser/ldt/copy_ldt.html:12 -msgid "Copy your project" -msgstr "Copy your project" - -#: ldt/templates/iriuser/ldt/copy_ldt.html:15 -#: ldt/templates/iriuser/ldt/create_ldt.html:15 -msgid "Title" -msgstr "Title" - -#: ldt/templates/iriuser/ldt/copy_ldt.html:18 -msgid "Copy" -msgstr "Copy" - -#: ldt/templates/iriuser/ldt/create_ldt.html:12 -msgid "Create your project" -msgstr "Create your project" - -#: ldt/templates/iriuser/ldt/create_ldt.html:18 -msgid "List of contents" -msgstr "List of contents" - -#: ldt/templates/iriuser/ldt/create_ldt.html:25 -msgid "Create" -msgstr "Create" - -#: ldt/templates/iriuser/ldt/ldt_list.html:50 -#: templates/admin/page_base.html:19 -#: user/templates/iriuser/user/login_form.html:33 -#: user/templates/iriuser/user/space.html:6 -#: user/templates/iriuser/user/space.html:9 -msgid "Space" -msgstr "Space" - -#: ldt/templates/iriuser/ldt/ldt_list.html:51 -#: ldt/templates/iriuser/ldt/ldt_list.html:53 -msgid "Ldt Project" -msgstr "Ldt Project" - -#: ldt/templates/iriuser/ldt/ldt_list.html:57 -msgid "Create new project" -msgstr "Create new project" - -#: ldt/templates/iriuser/ldt/ldt_list.html:59 -msgid "Project" -msgstr "Project" - -#: ldt/templates/iriuser/ldt/ldt_list.html:62 -msgid "title" -msgstr "Title" - -#: ldt/templates/iriuser/ldt/ldt_list.html:63 -msgid " published" -msgstr " published" - -#: 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/iriuser/user/login_form.html:37 -#: user/templates/iriuser/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 -#: user/templates/iriuser/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:" - -#: 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/iriuser/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/iriuser/user/change_email.html:6 -#: user/templates/iriuser/user/change_email_done.html:6 -#: user/templates/iriuser/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" - -#: user/templates/iriuser/user/change_email.html:7 -#: user/templates/iriuser/user/change_email.html:10 -msgid "Modification de l'adresse émail" -msgstr "E-mail change" - -#: user/templates/iriuser/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/iriuser/user/change_email.html:32 -msgid "email" -msgstr "email" - -#: user/templates/iriuser/user/change_email.html:41 -msgid "Confirmation de l'adresse émail" -msgstr "E-mail confirmation" - -#: user/templates/iriuser/user/change_email.html:48 -msgid "change my e-mail" -msgstr "Change my e-mail" - -#: user/templates/iriuser/user/change_email_done.html:7 -#: user/templates/iriuser/user/change_email_done.html:10 -msgid "email change" -msgstr "email change" - -#: user/templates/iriuser/user/change_email_done.html:12 -msgid "email changed" -msgstr "changed by" - -#: user/templates/iriuser/user/change_email_done.html:13 -msgid "back to profile" -msgstr "back to profile" - -#: user/templates/iriuser/user/home.html:9 -msgid "Se connecter" -msgstr "Login" - -#: user/templates/iriuser/user/home.html:10 -msgid "Créer un compte" -msgstr "Create an account" - -#: user/templates/iriuser/user/home.html:11 -msgid "récupérer mot de passe" -msgstr "Forget password?" - -#: user/templates/iriuser/user/login_form.html:50 -msgid "create account" -msgstr "create account" - -#: user/templates/iriuser/user/login_form.html:54 -msgid "Pseudo" -msgstr "Username" - -#: user/templates/iriuser/user/login_form.html:57 -#: user/templates/iriuser/user/login_form.html:64 -msgid "this field is compulsory" -msgstr "this field is compulsory" - -#: user/templates/iriuser/user/login_form.html:68 -msgid "reset password" -msgstr "reset password" - -#: user/templates/iriuser/user/login_form.html:71 -msgid "Connection" -msgstr "Login" - -#: user/templates/iriuser/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/iriuser/user/profile.html:7 -msgid "Mail change" -msgstr "Mail change" - -#: user/templates/iriuser/user/space.html:13 -msgid "Page" -msgstr "Pages" - -#: user/templates/iriuser/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 "Changement de l'adresse émail" -#~ msgstr "E-mail change" - -#~ msgid "Mot de passe" -#~ msgstr "Password" - -#~ msgid "Déconnexion" -#~ msgstr "Logout" diff -r 7c994c98d1df -r ae8593287883 web/ldt_utils/locale/fr/LC_MESSAGES/django.mo Binary file web/ldt_utils/locale/fr/LC_MESSAGES/django.mo has changed diff -r 7c994c98d1df -r ae8593287883 web/ldt_utils/locale/fr/LC_MESSAGES/django.po --- a/web/ldt_utils/locale/fr/LC_MESSAGES/django.po Tue Jun 08 15:31:42 2010 +0200 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,619 +0,0 @@ -# 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-03-09 08:48-0600\n" -"PO-Revision-Date: 2010-03-09 15:52+0100\n" -"Last-Translator: Yves-Marie Haussonne \n" -"Language-Team: LANGUAGE \n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=UTF-8\n" -"Content-Transfer-Encoding: 8bit\n" - -#: ldt/models.py:43 -msgid "created by" -msgstr "créé par" - -#: ldt/models.py:44 -msgid "changed by" -msgstr "modifié par" - -#: ldt/templates/admin/ldt/app_action.html:6 -#: 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/templates/iriuser/ldt/copy_ldt.html:12 -msgid "Copy your project" -msgstr "Copier votre projet" - -#: ldt/templates/iriuser/ldt/copy_ldt.html:15 -#: ldt/templates/iriuser/ldt/create_ldt.html:15 -msgid "Title" -msgstr "Titre" - -#: ldt/templates/iriuser/ldt/copy_ldt.html:18 -msgid "Copy" -msgstr "Copier" - -#: ldt/templates/iriuser/ldt/create_ldt.html:12 -msgid "Create your project" -msgstr "Créer votre projet Lignes de Temps" - -#: ldt/templates/iriuser/ldt/create_ldt.html:18 -msgid "List of contents" -msgstr "Liste de contenus" - -#: ldt/templates/iriuser/ldt/create_ldt.html:25 -msgid "Create" -msgstr "Créer" - -#: ldt/templates/iriuser/ldt/ldt_list.html:50 -#: templates/admin/page_base.html:19 -#: user/templates/iriuser/user/login_form.html:33 -#: user/templates/iriuser/user/space.html:6 -#: user/templates/iriuser/user/space.html:9 -msgid "Space" -msgstr "Esp. perso" - -#: ldt/templates/iriuser/ldt/ldt_list.html:51 -#: ldt/templates/iriuser/ldt/ldt_list.html:53 -msgid "Ldt Project" -msgstr "Projet lignes de temps" - -#: ldt/templates/iriuser/ldt/ldt_list.html:57 -msgid "Create new project" -msgstr "Créer un nouveau projet Ligne de Temps" - -#: ldt/templates/iriuser/ldt/ldt_list.html:59 -msgid "Project" -msgstr "Projet" - -#: ldt/templates/iriuser/ldt/ldt_list.html:62 -msgid "title" -msgstr "Titre" - -#: ldt/templates/iriuser/ldt/ldt_list.html:63 -msgid " published" -msgstr "Publié" - -#: 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/iriuser/user/login_form.html:37 -#: user/templates/iriuser/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 -#: user/templates/iriuser/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 :" - -#: 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/iriuser/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/iriuser/user/change_email.html:6 -#: user/templates/iriuser/user/change_email_done.html:6 -#: user/templates/iriuser/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" - -#: user/templates/iriuser/user/change_email.html:7 -#: user/templates/iriuser/user/change_email.html:10 -msgid "Modification de l'adresse émail" -msgstr "Modification de l'adresse email" - -#: user/templates/iriuser/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/iriuser/user/change_email.html:32 -msgid "email" -msgstr "adresse émail" - -#: user/templates/iriuser/user/change_email.html:41 -msgid "Confirmation de l'adresse émail" -msgstr "Confirmation de l'adresse email" - -#: user/templates/iriuser/user/change_email.html:48 -msgid "change my e-mail" -msgstr "Changer l'adresse émail" - -#: user/templates/iriuser/user/change_email_done.html:7 -#: user/templates/iriuser/user/change_email_done.html:10 -msgid "email change" -msgstr "Modification de l'adresse émail" - -#: user/templates/iriuser/user/change_email_done.html:12 -msgid "email changed" -msgstr "email modifié" - -#: user/templates/iriuser/user/change_email_done.html:13 -msgid "back to profile" -msgstr "Retourner à mon profil" - -#: user/templates/iriuser/user/home.html:9 -msgid "Se connecter" -msgstr "Se connecter" - -#: user/templates/iriuser/user/home.html:10 -msgid "Créer un compte" -msgstr "Créere un compte" - -#: user/templates/iriuser/user/home.html:11 -msgid "récupérer mot de passe" -msgstr "Récupérer le mot de passe" - -#: user/templates/iriuser/user/login_form.html:50 -msgid "create account" -msgstr "Créer un compte" - -#: user/templates/iriuser/user/login_form.html:54 -msgid "Pseudo" -msgstr "Pseudo" - -#: user/templates/iriuser/user/login_form.html:57 -#: user/templates/iriuser/user/login_form.html:64 -msgid "this field is compulsory" -msgstr "Ce champs est obligatoire" - -#: user/templates/iriuser/user/login_form.html:68 -msgid "reset password" -msgstr "Réinitialiser le mot de passe" - -#: user/templates/iriuser/user/login_form.html:71 -msgid "Connection" -msgstr "Connexion" - -#: user/templates/iriuser/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/iriuser/user/profile.html:7 -msgid "Mail change" -msgstr "Modification de l'adresse émail" - -#: user/templates/iriuser/user/space.html:13 -msgid "Page" -msgstr "Pages" - -#: user/templates/iriuser/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 "Password (Verification)" -#~ msgstr "Mot de passe (Vérification)" diff -r 7c994c98d1df -r ae8593287883 web/ldt_utils/management/__init__.py --- a/web/ldt_utils/management/__init__.py Tue Jun 08 15:31:42 2010 +0200 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,66 +0,0 @@ -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 7c994c98d1df -r ae8593287883 web/ldt_utils/media/css/ldt.css --- a/web/ldt_utils/media/css/ldt.css Tue Jun 08 15:31:42 2010 +0200 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,122 +0,0 @@ -#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(../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 7c994c98d1df -r ae8593287883 web/ldt_utils/media/css/style.css --- a/web/ldt_utils/media/css/style.css Tue Jun 08 15:31:42 2010 +0200 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,47 +0,0 @@ -#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 7c994c98d1df -r ae8593287883 web/ldt_utils/media/css/style_base.css --- a/web/ldt_utils/media/css/style_base.css Tue Jun 08 15:31:42 2010 +0200 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,202 +0,0 @@ -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 7c994c98d1df -r ae8593287883 web/ldt_utils/media/img/loadingAnimation.gif Binary file web/ldt_utils/media/img/loadingAnimation.gif has changed diff -r 7c994c98d1df -r ae8593287883 web/ldt_utils/media/js/jquery.DOMWindow.js --- a/web/ldt_utils/media/js/jquery.DOMWindow.js Tue Jun 08 15:31:42 2010 +0200 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,372 +0,0 @@ -(function($){ - - //closeDOMWindow - $.fn.closeDOMWindow = function(settings){ - - if(!settings){settings={};} - - var run = function(passingThis){ - - if(settings.anchoredClassName){ - var $anchorClassName = $('.'+settings.anchoredClassName); - $anchorClassName.fadeOut('fast',function(){ - if($.fn.draggable){ - $anchorClassName.draggable('destory').trigger("unload").remove(); - }else{ - $anchorClassName.trigger("unload").remove(); - } - }); - if(settings.functionCallOnClose){settings.functionCallAfterClose();} - }else{ - var $DOMWindowOverlay = $('#DOMWindowOverlay'); - var $DOMWindow = $('#DOMWindow'); - $DOMWindowOverlay.fadeOut('fast',function(){ - $DOMWindowOverlay.trigger('unload').unbind().remove(); - }); - $DOMWindow.fadeOut('fast',function(){ - if($.fn.draggable){ - $DOMWindow.draggable("destroy").trigger("unload").remove(); - }else{ - $DOMWindow.trigger("unload").remove(); - } - }); - - $(window).unbind('scroll.DOMWindow'); - $(window).unbind('resize.DOMWindow'); - - if($.fn.openDOMWindow.isIE6){$('#DOMWindowIE6FixIframe').remove();} - if(settings.functionCallOnClose){settings.functionCallAfterClose();} - } - }; - - if(settings.eventType){//if used with $(). - return this.each(function(index){ - $(this).bind(settings.eventType, function(){ - run(this); - return false; - }); - }); - }else{//else called as $.function - run(); - } - - }; - - //allow for public call, pass settings - $.closeDOMWindow = function(s){$.fn.closeDOMWindow(s);}; - - //openDOMWindow - $.fn.openDOMWindow = function(instanceSettings){ - - var shortcut = $.fn.openDOMWindow; - - //default settings combined with callerSettings//////////////////////////////////////////////////////////////////////// - - shortcut.defaultsSettings = { - anchoredClassName:'', - anchoredSelector:'', - borderColor:'#ccc', - borderSize:'4', - draggable:0, - eventType:null, //click, blur, change, dblclick, error, focus, load, mousedown, mouseout, mouseup etc... - fixedWindowY:100, - functionCallOnOpen:null, - functionCallOnClose:null, - height:500, - loader:0, - loaderHeight:0, - loaderImagePath:'', - loaderWidth:0, - modal:0, - overlay:1, - overlayColor:'#000', - overlayOpacity:'85', - positionLeft:0, - positionTop:0, - positionType:'centered', // centered, anchored, absolute, fixed - width:500, - windowBGColor:'#fff', - windowBGImage:null, // http path - windowHTTPType:'get', - windowPadding:10, - windowSource:'inline', //inline, ajax, iframe - windowSourceID:'', - windowSourceURL:'', - windowSourceAttrURL:'href', - windowOverflow : 'auto', - ajaxParameters : {} - }; - - var settings = $.extend({}, $.fn.openDOMWindow.defaultsSettings , instanceSettings || {}); - - //Public functions - - shortcut.viewPortHeight = function(){ return self.innerHeight || document.documentElement.clientHeight || document.body.clientHeight;}; - shortcut.viewPortWidth = function(){ return self.innerWidth || document.documentElement.clientWidth || document.body.clientWidth;}; - shortcut.scrollOffsetHeight = function(){ return self.pageYOffset || document.documentElement.scrollTop || document.body.scrollTop;}; - shortcut.scrollOffsetWidth = function(){ return self.pageXOffset || document.documentElement.scrollLeft || document.body.scrollLeft;}; - shortcut.isIE6 = typeof document.body.style.maxHeight === "undefined"; - - //Private Functions///////////////////////////////////////////////////////////////////////////////////////////////////////// - - var sizeOverlay = function(){ - var $DOMWindowOverlay = $('#DOMWindowOverlay'); - if(shortcut.isIE6){//if IE 6 - var overlayViewportHeight = document.documentElement.offsetHeight + document.documentElement.scrollTop - 4; - var overlayViewportWidth = document.documentElement.offsetWidth - 21; - $DOMWindowOverlay.css({'height':overlayViewportHeight +'px','width':overlayViewportWidth+'px'}); - }else{//else Firefox, safari, opera, IE 7+ - $DOMWindowOverlay.css({'height':'100%','width':'100%','position':'fixed'}); - } - }; - - var sizeIE6Iframe = function(){ - var overlayViewportHeight = document.documentElement.offsetHeight + document.documentElement.scrollTop - 4; - var overlayViewportWidth = document.documentElement.offsetWidth - 21; - $('#DOMWindowIE6FixIframe').css({'height':overlayViewportHeight +'px','width':overlayViewportWidth+'px'}); - }; - - var centerDOMWindow = function() { - var $DOMWindow = $('#DOMWindow'); - if(settings.height + 50 > shortcut.viewPortHeight()){//added 50 to be safe - $DOMWindow.css('left',Math.round(shortcut.viewPortWidth()/2) + shortcut.scrollOffsetWidth() - Math.round(($DOMWindow.outerWidth())/2)); - }else{ - $DOMWindow.css('left',Math.round(shortcut.viewPortWidth()/2) + shortcut.scrollOffsetWidth() - Math.round(($DOMWindow.outerWidth())/2)); - $DOMWindow.css('top',Math.round(shortcut.viewPortHeight()/2) + shortcut.scrollOffsetHeight() - Math.round(($DOMWindow.outerHeight())/2)); - } - }; - - var centerLoader = function() { - var $DOMWindowLoader = $('#DOMWindowLoader'); - if(shortcut.isIE6){//if IE 6 - $DOMWindowLoader.css({'left':Math.round(shortcut.viewPortWidth()/2) + shortcut.scrollOffsetWidth() - Math.round(($DOMWindowLoader.innerWidth())/2),'position':'absolute'}); - $DOMWindowLoader.css({'top':Math.round(shortcut.viewPortHeight()/2) + shortcut.scrollOffsetHeight() - Math.round(($DOMWindowLoader.innerHeight())/2),'position':'absolute'}); - }else{ - $DOMWindowLoader.css({'left':'50%','top':'50%','position':'fixed'}); - } - - }; - - var fixedDOMWindow = function(){ - var $DOMWindow = $('#DOMWindow'); - $DOMWindow.css('left', settings.positionLeft + shortcut.scrollOffsetWidth()); - $DOMWindow.css('top', + settings.positionTop + shortcut.scrollOffsetHeight()); - }; - - var showDOMWindow = function(instance){ - if(arguments[0]){ - $('.'+instance+' #DOMWindowLoader').remove(); - $('.'+instance+' #DOMWindowContent').fadeIn('fast',function(){if(settings.functionCallOnOpen){settings.functionCallOnOpen();}}); - $('.'+instance+ '.closeDOMWindow').click(function(){ - $.closeDOMWindow(); - return false; - }); - }else{ - $('#DOMWindowLoader').remove(); - $('#DOMWindow').fadeIn('fast',function(){if(settings.functionCallOnOpen){settings.functionCallOnOpen();}}); - $('#DOMWindow .closeDOMWindow').click(function(){ - $.closeDOMWindow(); - return false; - }); - } - - }; - - var urlQueryToObject = function(s, q){ - var query = typeof(q) != 'undefined' ? q : {}; - s.replace(/b([^&=]*)=([^&=]*)b/g, function (m, a, d) { - if (typeof query[a] != 'undefined') { - query[a] += ',' + d; - } else { - query[a] = d; - } - }); - return query; - }; - - //Run Routine /////////////////////////////////////////////////////////////////////////////////////////////////////////////// - var run = function(passingThis){ - - //get values from element clicked, or assume its passed as an option - settings.windowSourceID = $(passingThis).attr('href') || settings.windowSourceID; - settings.windowSourceURL = $(passingThis).attr(settings.windowSourceAttrURL) || settings.windowSourceURL; - settings.windowBGImage = settings.windowBGImage ? 'background-image:url('+settings.windowBGImage+')' : ''; - var urlOnly, urlQueryObject; - - if(settings.positionType == 'anchored'){//anchored DOM window - - var anchoredPositions = $(settings.anchoredSelector).position(); - var anchoredPositionX = anchoredPositions.left + settings.positionLeft; - var anchoredPositionY = anchoredPositions.top + settings.positionTop; - - $('body').append('
    '); - //loader - if(settings.loader && settings.loaderImagePath !== ''){ - $('.'+settings.anchoredClassName).append('
    '); - - } - - if($.fn.draggable){ - if(settings.draggable){$('.' + settings.anchoredClassName).draggable({cursor:'move'});} - } - - switch(settings.windowSource){ - case 'inline'://////////////////////////////// inline ////////////////////////////////////////// - $('.' + settings.anchoredClassName+" #DOMWindowContent").append($(settings.windowSourceID).children()); - $('.' + settings.anchoredClassName).unload(function(){// move elements back when you're finished - $('.' + settings.windowSourceID).append( $('.' + settings.anchoredClassName+" #DOMWindowContent").children()); - }); - showDOMWindow(settings.anchoredClassName); - break; - case 'iframe'://////////////////////////////// iframe ////////////////////////////////////////// - $('.' + settings.anchoredClassName+" #DOMWindowContent").append(''); - $('.'+settings.anchoredClassName+'Iframe').load(showDOMWindow(settings.anchoredClassName)); - break; - case 'ajax'://////////////////////////////// ajax ////////////////////////////////////////// - if(settings.windowHTTPType == 'post'){ - - if(settings.windowSourceURL.indexOf("?") !== -1){//has a query string - urlOnly = settings.windowSourceURL.substr(0, settings.windowSourceURL.indexOf("?")); - urlQueryObject = urlQueryToObject(settings.windowSourceURL, settings.ajaxParameters); - }else{ - urlOnly = settings.windowSourceURL; - urlQueryObject = settings.ajaxParameters; - } - $('.' + settings.anchoredClassName+" #DOMWindowContent").load(urlOnly,urlQueryObject,function(){ - showDOMWindow(settings.anchoredClassName); - }); - }else{ - if(settings.windowSourceURL.indexOf("?") == -1){ //no query string, so add one - settings.windowSourceURL += '?'; - } - $('.' + settings.anchoredClassName+" #DOMWindowContent").load( - settings.windowSourceURL + '&random=' + (new Date().getTime()),function(){ - showDOMWindow(settings.anchoredClassName); - }); - } - break; - } - - }else{//centered, fixed, absolute DOM window - - //overlay & modal - if(settings.overlay){ - $('body').append(''); - if(shortcut.isIE6){//if IE 6 - $('body').append(''); - sizeIE6Iframe(); - } - sizeOverlay(); - var $DOMWindowOverlay = $('#DOMWindowOverlay'); - $DOMWindowOverlay.fadeIn('fast'); - if(!settings.modal){$DOMWindowOverlay.click(function(){$.closeDOMWindow();});} - } - - //loader - if(settings.loader && settings.loaderImagePath !== ''){ - $('body').append('
    '); - centerLoader(); - } - - //add DOMwindow - $('body').append(''); - - var $DOMWindow = $('#DOMWindow'); - //centered, absolute, or fixed - switch(settings.positionType){ - case 'centered': - centerDOMWindow(); - if(settings.height + 50 > shortcut.viewPortHeight()){//added 50 to be safe - $DOMWindow.css('top', (settings.fixedWindowY + shortcut.scrollOffsetHeight()) + 'px'); - } - break; - case 'absolute': - $DOMWindow.css({'top':(settings.positionTop+shortcut.scrollOffsetHeight())+'px','left':(settings.positionLeft+shortcut.scrollOffsetWidth())+'px'}); - if($.fn.draggable){ - if(settings.draggable){$DOMWindow.draggable({cursor:'move'});} - } - break; - case 'fixed': - fixedDOMWindow(); - break; - case 'anchoredSingleWindow': - var anchoredPositions = $(settings.anchoredSelector).position(); - var anchoredPositionX = anchoredPositions.left + settings.positionLeft; - var anchoredPositionY = anchoredPositions.top + settings.positionTop; - $DOMWindow.css({'top':anchoredPositionY + 'px','left':anchoredPositionX+'px'}); - - break; - } - - $(window).bind('scroll.DOMWindow',function(){ - if(settings.overlay){sizeOverlay();} - if(shortcut.isIE6){sizeIE6Iframe();} - if(settings.positionType == 'centered'){centerDOMWindow();} - if(settings.positionType == 'fixed'){fixedDOMWindow();} - }); - - $(window).bind('resize.DOMWindow',function(){ - if(shortcut.isIE6){sizeIE6Iframe();} - if(settings.overlay){sizeOverlay();} - if(settings.positionType == 'centered'){centerDOMWindow();} - }); - - switch(settings.windowSource){ - case 'inline'://////////////////////////////// inline ////////////////////////////////////////// - $DOMWindow.append($(settings.windowSourceID).children()); - $DOMWindow.unload(function(){// move elements back when you're finished - $(settings.windowSourceID).append($DOMWindow.children()); - }); - showDOMWindow(); - break; - case 'iframe'://////////////////////////////// iframe ////////////////////////////////////////// - var name = 'DOMWindowIframe'+Math.round(Math.random()*1000); - $DOMWindow.append(''); - $('#DOMWindowIframe').load(showDOMWindow()); - break; - case 'ajax'://////////////////////////////// ajax ////////////////////////////////////////// - if(settings.windowHTTPType == 'post'){ - - if(settings.windowSourceURL.indexOf("?") !== -1){//has a query string - urlOnly = settings.windowSourceURL.substr(0, settings.windowSourceURL.indexOf("?")); - urlQueryObject = urlQueryToObject(settings.windowSourceURL, settings.ajaxParameters); - }else{ - urlOnly = settings.windowSourceURL; - urlQueryObject = settings.ajaxParameters; - } - $DOMWindow.load(urlOnly,urlQueryObject,function(){ - showDOMWindow(); - }); - }else{ - if(settings.windowSourceURL.indexOf("?") == -1){ //no query string, so add one - settings.windowSourceURL += '?'; - } - $DOMWindow.load( - settings.windowSourceURL + '&random=' + (new Date().getTime()),function(){ - showDOMWindow(); - }); - } - break; - } - - }//end if anchored, or absolute, fixed, centered - - };//end run() - - if(settings.eventType){//if used with $(). - return this.each(function(index){ - $(this).bind(settings.eventType,function(){ - run(this); - return false; - }); - }); - }else{//else called as $.function - run(); - } - - };//end function openDOMWindow - - //allow for public call, pass settings - $.openDOMWindow = function(s){$.fn.openDOMWindow(s);}; - -})(jQuery); diff -r 7c994c98d1df -r ae8593287883 web/ldt_utils/media/js/jquery.js --- a/web/ldt_utils/media/js/jquery.js Tue Jun 08 15:31:42 2010 +0200 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,19 +0,0 @@ -/* - * jQuery JavaScript Library v1.3.2 - * http://jquery.com/ - * - * Copyright (c) 2009 John Resig - * Dual licensed under the MIT and GPL licenses. - * http://docs.jquery.com/License - * - * Date: 2009-02-19 17:34:21 -0500 (Thu, 19 Feb 2009) - * Revision: 6246 - */ -(function(){var l=this,g,y=l.jQuery,p=l.$,o=l.jQuery=l.$=function(E,F){return new o.fn.init(E,F)},D=/^[^<]*(<(.|\s)+>)[^>]*$|^#([\w-]+)$/,f=/^.[^:#\[\.,]*$/;o.fn=o.prototype={init:function(E,H){E=E||document;if(E.nodeType){this[0]=E;this.length=1;this.context=E;return this}if(typeof E==="string"){var G=D.exec(E);if(G&&(G[1]||!H)){if(G[1]){E=o.clean([G[1]],H)}else{var I=document.getElementById(G[3]);if(I&&I.id!=G[3]){return o().find(E)}var F=o(I||[]);F.context=document;F.selector=E;return F}}else{return o(H).find(E)}}else{if(o.isFunction(E)){return o(document).ready(E)}}if(E.selector&&E.context){this.selector=E.selector;this.context=E.context}return this.setArray(o.isArray(E)?E:o.makeArray(E))},selector:"",jquery:"1.3.2",size:function(){return this.length},get:function(E){return E===g?Array.prototype.slice.call(this):this[E]},pushStack:function(F,H,E){var G=o(F);G.prevObject=this;G.context=this.context;if(H==="find"){G.selector=this.selector+(this.selector?" ":"")+E}else{if(H){G.selector=this.selector+"."+H+"("+E+")"}}return G},setArray:function(E){this.length=0;Array.prototype.push.apply(this,E);return this},each:function(F,E){return o.each(this,F,E)},index:function(E){return o.inArray(E&&E.jquery?E[0]:E,this)},attr:function(F,H,G){var E=F;if(typeof F==="string"){if(H===g){return this[0]&&o[G||"attr"](this[0],F)}else{E={};E[F]=H}}return this.each(function(I){for(F in E){o.attr(G?this.style:this,F,o.prop(this,E[F],G,I,F))}})},css:function(E,F){if((E=="width"||E=="height")&&parseFloat(F)<0){F=g}return this.attr(E,F,"curCSS")},text:function(F){if(typeof F!=="object"&&F!=null){return this.empty().append((this[0]&&this[0].ownerDocument||document).createTextNode(F))}var E="";o.each(F||this,function(){o.each(this.childNodes,function(){if(this.nodeType!=8){E+=this.nodeType!=1?this.nodeValue:o.fn.text([this])}})});return E},wrapAll:function(E){if(this[0]){var F=o(E,this[0].ownerDocument).clone();if(this[0].parentNode){F.insertBefore(this[0])}F.map(function(){var G=this;while(G.firstChild){G=G.firstChild}return G}).append(this)}return this},wrapInner:function(E){return this.each(function(){o(this).contents().wrapAll(E)})},wrap:function(E){return this.each(function(){o(this).wrapAll(E)})},append:function(){return this.domManip(arguments,true,function(E){if(this.nodeType==1){this.appendChild(E)}})},prepend:function(){return this.domManip(arguments,true,function(E){if(this.nodeType==1){this.insertBefore(E,this.firstChild)}})},before:function(){return this.domManip(arguments,false,function(E){this.parentNode.insertBefore(E,this)})},after:function(){return this.domManip(arguments,false,function(E){this.parentNode.insertBefore(E,this.nextSibling)})},end:function(){return this.prevObject||o([])},push:[].push,sort:[].sort,splice:[].splice,find:function(E){if(this.length===1){var F=this.pushStack([],"find",E);F.length=0;o.find(E,this[0],F);return F}else{return this.pushStack(o.unique(o.map(this,function(G){return o.find(E,G)})),"find",E)}},clone:function(G){var E=this.map(function(){if(!o.support.noCloneEvent&&!o.isXMLDoc(this)){var I=this.outerHTML;if(!I){var J=this.ownerDocument.createElement("div");J.appendChild(this.cloneNode(true));I=J.innerHTML}return o.clean([I.replace(/ jQuery\d+="(?:\d+|null)"/g,"").replace(/^\s*/,"")])[0]}else{return this.cloneNode(true)}});if(G===true){var H=this.find("*").andSelf(),F=0;E.find("*").andSelf().each(function(){if(this.nodeName!==H[F].nodeName){return}var I=o.data(H[F],"events");for(var K in I){for(var J in I[K]){o.event.add(this,K,I[K][J],I[K][J].data)}}F++})}return E},filter:function(E){return this.pushStack(o.isFunction(E)&&o.grep(this,function(G,F){return E.call(G,F)})||o.multiFilter(E,o.grep(this,function(F){return F.nodeType===1})),"filter",E)},closest:function(E){var G=o.expr.match.POS.test(E)?o(E):null,F=0;return this.map(function(){var H=this;while(H&&H.ownerDocument){if(G?G.index(H)>-1:o(H).is(E)){o.data(H,"closest",F);return H}H=H.parentNode;F++}})},not:function(E){if(typeof E==="string"){if(f.test(E)){return this.pushStack(o.multiFilter(E,this,true),"not",E)}else{E=o.multiFilter(E,this)}}var F=E.length&&E[E.length-1]!==g&&!E.nodeType;return this.filter(function(){return F?o.inArray(this,E)<0:this!=E})},add:function(E){return this.pushStack(o.unique(o.merge(this.get(),typeof E==="string"?o(E):o.makeArray(E))))},is:function(E){return !!E&&o.multiFilter(E,this).length>0},hasClass:function(E){return !!E&&this.is("."+E)},val:function(K){if(K===g){var E=this[0];if(E){if(o.nodeName(E,"option")){return(E.attributes.value||{}).specified?E.value:E.text}if(o.nodeName(E,"select")){var I=E.selectedIndex,L=[],M=E.options,H=E.type=="select-one";if(I<0){return null}for(var F=H?I:0,J=H?I+1:M.length;F=0||o.inArray(this.name,K)>=0)}else{if(o.nodeName(this,"select")){var N=o.makeArray(K);o("option",this).each(function(){this.selected=(o.inArray(this.value,N)>=0||o.inArray(this.text,N)>=0)});if(!N.length){this.selectedIndex=-1}}else{this.value=K}}})},html:function(E){return E===g?(this[0]?this[0].innerHTML.replace(/ jQuery\d+="(?:\d+|null)"/g,""):null):this.empty().append(E)},replaceWith:function(E){return this.after(E).remove()},eq:function(E){return this.slice(E,+E+1)},slice:function(){return this.pushStack(Array.prototype.slice.apply(this,arguments),"slice",Array.prototype.slice.call(arguments).join(","))},map:function(E){return this.pushStack(o.map(this,function(G,F){return E.call(G,F,G)}))},andSelf:function(){return this.add(this.prevObject)},domManip:function(J,M,L){if(this[0]){var I=(this[0].ownerDocument||this[0]).createDocumentFragment(),F=o.clean(J,(this[0].ownerDocument||this[0]),I),H=I.firstChild;if(H){for(var G=0,E=this.length;G1||G>0?I.cloneNode(true):I)}}if(F){o.each(F,z)}}return this;function K(N,O){return M&&o.nodeName(N,"table")&&o.nodeName(O,"tr")?(N.getElementsByTagName("tbody")[0]||N.appendChild(N.ownerDocument.createElement("tbody"))):N}}};o.fn.init.prototype=o.fn;function z(E,F){if(F.src){o.ajax({url:F.src,async:false,dataType:"script"})}else{o.globalEval(F.text||F.textContent||F.innerHTML||"")}if(F.parentNode){F.parentNode.removeChild(F)}}function e(){return +new Date}o.extend=o.fn.extend=function(){var J=arguments[0]||{},H=1,I=arguments.length,E=false,G;if(typeof J==="boolean"){E=J;J=arguments[1]||{};H=2}if(typeof J!=="object"&&!o.isFunction(J)){J={}}if(I==H){J=this;--H}for(;H-1}},swap:function(H,G,I){var E={};for(var F in G){E[F]=H.style[F];H.style[F]=G[F]}I.call(H);for(var F in G){H.style[F]=E[F]}},css:function(H,F,J,E){if(F=="width"||F=="height"){var L,G={position:"absolute",visibility:"hidden",display:"block"},K=F=="width"?["Left","Right"]:["Top","Bottom"];function I(){L=F=="width"?H.offsetWidth:H.offsetHeight;if(E==="border"){return}o.each(K,function(){if(!E){L-=parseFloat(o.curCSS(H,"padding"+this,true))||0}if(E==="margin"){L+=parseFloat(o.curCSS(H,"margin"+this,true))||0}else{L-=parseFloat(o.curCSS(H,"border"+this+"Width",true))||0}})}if(H.offsetWidth!==0){I()}else{o.swap(H,G,I)}return Math.max(0,Math.round(L))}return o.curCSS(H,F,J)},curCSS:function(I,F,G){var L,E=I.style;if(F=="opacity"&&!o.support.opacity){L=o.attr(E,"opacity");return L==""?"1":L}if(F.match(/float/i)){F=w}if(!G&&E&&E[F]){L=E[F]}else{if(q.getComputedStyle){if(F.match(/float/i)){F="float"}F=F.replace(/([A-Z])/g,"-$1").toLowerCase();var M=q.getComputedStyle(I,null);if(M){L=M.getPropertyValue(F)}if(F=="opacity"&&L==""){L="1"}}else{if(I.currentStyle){var J=F.replace(/\-(\w)/g,function(N,O){return O.toUpperCase()});L=I.currentStyle[F]||I.currentStyle[J];if(!/^\d+(px)?$/i.test(L)&&/^\d/.test(L)){var H=E.left,K=I.runtimeStyle.left;I.runtimeStyle.left=I.currentStyle.left;E.left=L||0;L=E.pixelLeft+"px";E.left=H;I.runtimeStyle.left=K}}}}return L},clean:function(F,K,I){K=K||document;if(typeof K.createElement==="undefined"){K=K.ownerDocument||K[0]&&K[0].ownerDocument||document}if(!I&&F.length===1&&typeof F[0]==="string"){var H=/^<(\w+)\s*\/?>$/.exec(F[0]);if(H){return[K.createElement(H[1])]}}var G=[],E=[],L=K.createElement("div");o.each(F,function(P,S){if(typeof S==="number"){S+=""}if(!S){return}if(typeof S==="string"){S=S.replace(/(<(\w+)[^>]*?)\/>/g,function(U,V,T){return T.match(/^(abbr|br|col|img|input|link|meta|param|hr|area|embed)$/i)?U:V+">"});var O=S.replace(/^\s+/,"").substring(0,10).toLowerCase();var Q=!O.indexOf("",""]||!O.indexOf("",""]||O.match(/^<(thead|tbody|tfoot|colg|cap)/)&&[1,"","
    "]||!O.indexOf("",""]||(!O.indexOf("",""]||!O.indexOf("",""]||!o.support.htmlSerialize&&[1,"div
    ","
    "]||[0,"",""];L.innerHTML=Q[1]+S+Q[2];while(Q[0]--){L=L.lastChild}if(!o.support.tbody){var R=/"&&!R?L.childNodes:[];for(var M=N.length-1;M>=0;--M){if(o.nodeName(N[M],"tbody")&&!N[M].childNodes.length){N[M].parentNode.removeChild(N[M])}}}if(!o.support.leadingWhitespace&&/^\s/.test(S)){L.insertBefore(K.createTextNode(S.match(/^\s*/)[0]),L.firstChild)}S=o.makeArray(L.childNodes)}if(S.nodeType){G.push(S)}else{G=o.merge(G,S)}});if(I){for(var J=0;G[J];J++){if(o.nodeName(G[J],"script")&&(!G[J].type||G[J].type.toLowerCase()==="text/javascript")){E.push(G[J].parentNode?G[J].parentNode.removeChild(G[J]):G[J])}else{if(G[J].nodeType===1){G.splice.apply(G,[J+1,0].concat(o.makeArray(G[J].getElementsByTagName("script"))))}I.appendChild(G[J])}}return E}return G},attr:function(J,G,K){if(!J||J.nodeType==3||J.nodeType==8){return g}var H=!o.isXMLDoc(J),L=K!==g;G=H&&o.props[G]||G;if(J.tagName){var F=/href|src|style/.test(G);if(G=="selected"&&J.parentNode){J.parentNode.selectedIndex}if(G in J&&H&&!F){if(L){if(G=="type"&&o.nodeName(J,"input")&&J.parentNode){throw"type property can't be changed"}J[G]=K}if(o.nodeName(J,"form")&&J.getAttributeNode(G)){return J.getAttributeNode(G).nodeValue}if(G=="tabIndex"){var I=J.getAttributeNode("tabIndex");return I&&I.specified?I.value:J.nodeName.match(/(button|input|object|select|textarea)/i)?0:J.nodeName.match(/^(a|area)$/i)&&J.href?0:g}return J[G]}if(!o.support.style&&H&&G=="style"){return o.attr(J.style,"cssText",K)}if(L){J.setAttribute(G,""+K)}var E=!o.support.hrefNormalized&&H&&F?J.getAttribute(G,2):J.getAttribute(G);return E===null?g:E}if(!o.support.opacity&&G=="opacity"){if(L){J.zoom=1;J.filter=(J.filter||"").replace(/alpha\([^)]*\)/,"")+(parseInt(K)+""=="NaN"?"":"alpha(opacity="+K*100+")")}return J.filter&&J.filter.indexOf("opacity=")>=0?(parseFloat(J.filter.match(/opacity=([^)]*)/)[1])/100)+"":""}G=G.replace(/-([a-z])/ig,function(M,N){return N.toUpperCase()});if(L){J[G]=K}return J[G]},trim:function(E){return(E||"").replace(/^\s+|\s+$/g,"")},makeArray:function(G){var E=[];if(G!=null){var F=G.length;if(F==null||typeof G==="string"||o.isFunction(G)||G.setInterval){E[0]=G}else{while(F){E[--F]=G[F]}}}return E},inArray:function(G,H){for(var E=0,F=H.length;E0?this.clone(true):this).get();o.fn[F].apply(o(L[K]),I);J=J.concat(I)}return this.pushStack(J,E,G)}});o.each({removeAttr:function(E){o.attr(this,E,"");if(this.nodeType==1){this.removeAttribute(E)}},addClass:function(E){o.className.add(this,E)},removeClass:function(E){o.className.remove(this,E)},toggleClass:function(F,E){if(typeof E!=="boolean"){E=!o.className.has(this,F)}o.className[E?"add":"remove"](this,F)},remove:function(E){if(!E||o.filter(E,[this]).length){o("*",this).add([this]).each(function(){o.event.remove(this);o.removeData(this)});if(this.parentNode){this.parentNode.removeChild(this)}}},empty:function(){o(this).children().remove();while(this.firstChild){this.removeChild(this.firstChild)}}},function(E,F){o.fn[E]=function(){return this.each(F,arguments)}});function j(E,F){return E[0]&&parseInt(o.curCSS(E[0],F,true),10)||0}var h="jQuery"+e(),v=0,A={};o.extend({cache:{},data:function(F,E,G){F=F==l?A:F;var H=F[h];if(!H){H=F[h]=++v}if(E&&!o.cache[H]){o.cache[H]={}}if(G!==g){o.cache[H][E]=G}return E?o.cache[H][E]:H},removeData:function(F,E){F=F==l?A:F;var H=F[h];if(E){if(o.cache[H]){delete o.cache[H][E];E="";for(E in o.cache[H]){break}if(!E){o.removeData(F)}}}else{try{delete F[h]}catch(G){if(F.removeAttribute){F.removeAttribute(h)}}delete o.cache[H]}},queue:function(F,E,H){if(F){E=(E||"fx")+"queue";var G=o.data(F,E);if(!G||o.isArray(H)){G=o.data(F,E,o.makeArray(H))}else{if(H){G.push(H)}}}return G},dequeue:function(H,G){var E=o.queue(H,G),F=E.shift();if(!G||G==="fx"){F=E[0]}if(F!==g){F.call(H)}}});o.fn.extend({data:function(E,G){var H=E.split(".");H[1]=H[1]?"."+H[1]:"";if(G===g){var F=this.triggerHandler("getData"+H[1]+"!",[H[0]]);if(F===g&&this.length){F=o.data(this[0],E)}return F===g&&H[1]?this.data(H[0]):F}else{return this.trigger("setData"+H[1]+"!",[H[0],G]).each(function(){o.data(this,E,G)})}},removeData:function(E){return this.each(function(){o.removeData(this,E)})},queue:function(E,F){if(typeof E!=="string"){F=E;E="fx"}if(F===g){return o.queue(this[0],E)}return this.each(function(){var G=o.queue(this,E,F);if(E=="fx"&&G.length==1){G[0].call(this)}})},dequeue:function(E){return this.each(function(){o.dequeue(this,E)})}}); -/* - * Sizzle CSS Selector Engine - v0.9.3 - * Copyright 2009, The Dojo Foundation - * Released under the MIT, BSD, and GPL Licenses. - * More information: http://sizzlejs.com/ - */ -(function(){var R=/((?:\((?:\([^()]+\)|[^()]+)+\)|\[(?:\[[^[\]]*\]|['"][^'"]*['"]|[^[\]'"]+)+\]|\\.|[^ >+~,(\[\\]+)+|[>+~])(\s*,\s*)?/g,L=0,H=Object.prototype.toString;var F=function(Y,U,ab,ac){ab=ab||[];U=U||document;if(U.nodeType!==1&&U.nodeType!==9){return[]}if(!Y||typeof Y!=="string"){return ab}var Z=[],W,af,ai,T,ad,V,X=true;R.lastIndex=0;while((W=R.exec(Y))!==null){Z.push(W[1]);if(W[2]){V=RegExp.rightContext;break}}if(Z.length>1&&M.exec(Y)){if(Z.length===2&&I.relative[Z[0]]){af=J(Z[0]+Z[1],U)}else{af=I.relative[Z[0]]?[U]:F(Z.shift(),U);while(Z.length){Y=Z.shift();if(I.relative[Y]){Y+=Z.shift()}af=J(Y,af)}}}else{var ae=ac?{expr:Z.pop(),set:E(ac)}:F.find(Z.pop(),Z.length===1&&U.parentNode?U.parentNode:U,Q(U));af=F.filter(ae.expr,ae.set);if(Z.length>0){ai=E(af)}else{X=false}while(Z.length){var ah=Z.pop(),ag=ah;if(!I.relative[ah]){ah=""}else{ag=Z.pop()}if(ag==null){ag=U}I.relative[ah](ai,ag,Q(U))}}if(!ai){ai=af}if(!ai){throw"Syntax error, unrecognized expression: "+(ah||Y)}if(H.call(ai)==="[object Array]"){if(!X){ab.push.apply(ab,ai)}else{if(U.nodeType===1){for(var aa=0;ai[aa]!=null;aa++){if(ai[aa]&&(ai[aa]===true||ai[aa].nodeType===1&&K(U,ai[aa]))){ab.push(af[aa])}}}else{for(var aa=0;ai[aa]!=null;aa++){if(ai[aa]&&ai[aa].nodeType===1){ab.push(af[aa])}}}}}else{E(ai,ab)}if(V){F(V,U,ab,ac);if(G){hasDuplicate=false;ab.sort(G);if(hasDuplicate){for(var aa=1;aa":function(Z,U,aa){var X=typeof U==="string";if(X&&!/\W/.test(U)){U=aa?U:U.toUpperCase();for(var V=0,T=Z.length;V=0)){if(!V){T.push(Y)}}else{if(V){U[X]=false}}}}return false},ID:function(T){return T[1].replace(/\\/g,"")},TAG:function(U,T){for(var V=0;T[V]===false;V++){}return T[V]&&Q(T[V])?U[1]:U[1].toUpperCase()},CHILD:function(T){if(T[1]=="nth"){var U=/(-?)(\d*)n((?:\+|-)?\d*)/.exec(T[2]=="even"&&"2n"||T[2]=="odd"&&"2n+1"||!/\D/.test(T[2])&&"0n+"+T[2]||T[2]);T[2]=(U[1]+(U[2]||1))-0;T[3]=U[3]-0}T[0]=L++;return T},ATTR:function(X,U,V,T,Y,Z){var W=X[1].replace(/\\/g,"");if(!Z&&I.attrMap[W]){X[1]=I.attrMap[W]}if(X[2]==="~="){X[4]=" "+X[4]+" "}return X},PSEUDO:function(X,U,V,T,Y){if(X[1]==="not"){if(X[3].match(R).length>1||/^\w/.test(X[3])){X[3]=F(X[3],null,null,U)}else{var W=F.filter(X[3],U,V,true^Y);if(!V){T.push.apply(T,W)}return false}}else{if(I.match.POS.test(X[0])||I.match.CHILD.test(X[0])){return true}}return X},POS:function(T){T.unshift(true);return T}},filters:{enabled:function(T){return T.disabled===false&&T.type!=="hidden"},disabled:function(T){return T.disabled===true},checked:function(T){return T.checked===true},selected:function(T){T.parentNode.selectedIndex;return T.selected===true},parent:function(T){return !!T.firstChild},empty:function(T){return !T.firstChild},has:function(V,U,T){return !!F(T[3],V).length},header:function(T){return/h\d/i.test(T.nodeName)},text:function(T){return"text"===T.type},radio:function(T){return"radio"===T.type},checkbox:function(T){return"checkbox"===T.type},file:function(T){return"file"===T.type},password:function(T){return"password"===T.type},submit:function(T){return"submit"===T.type},image:function(T){return"image"===T.type},reset:function(T){return"reset"===T.type},button:function(T){return"button"===T.type||T.nodeName.toUpperCase()==="BUTTON"},input:function(T){return/input|select|textarea|button/i.test(T.nodeName)}},setFilters:{first:function(U,T){return T===0},last:function(V,U,T,W){return U===W.length-1},even:function(U,T){return T%2===0},odd:function(U,T){return T%2===1},lt:function(V,U,T){return UT[3]-0},nth:function(V,U,T){return T[3]-0==U},eq:function(V,U,T){return T[3]-0==U}},filter:{PSEUDO:function(Z,V,W,aa){var U=V[1],X=I.filters[U];if(X){return X(Z,W,V,aa)}else{if(U==="contains"){return(Z.textContent||Z.innerText||"").indexOf(V[3])>=0}else{if(U==="not"){var Y=V[3];for(var W=0,T=Y.length;W=0)}}},ID:function(U,T){return U.nodeType===1&&U.getAttribute("id")===T},TAG:function(U,T){return(T==="*"&&U.nodeType===1)||U.nodeName===T},CLASS:function(U,T){return(" "+(U.className||U.getAttribute("class"))+" ").indexOf(T)>-1},ATTR:function(Y,W){var V=W[1],T=I.attrHandle[V]?I.attrHandle[V](Y):Y[V]!=null?Y[V]:Y.getAttribute(V),Z=T+"",X=W[2],U=W[4];return T==null?X==="!=":X==="="?Z===U:X==="*="?Z.indexOf(U)>=0:X==="~="?(" "+Z+" ").indexOf(U)>=0:!U?Z&&T!==false:X==="!="?Z!=U:X==="^="?Z.indexOf(U)===0:X==="$="?Z.substr(Z.length-U.length)===U:X==="|="?Z===U||Z.substr(0,U.length+1)===U+"-":false},POS:function(X,U,V,Y){var T=U[2],W=I.setFilters[T];if(W){return W(X,V,U,Y)}}}};var M=I.match.POS;for(var O in I.match){I.match[O]=RegExp(I.match[O].source+/(?![^\[]*\])(?![^\(]*\))/.source)}var E=function(U,T){U=Array.prototype.slice.call(U);if(T){T.push.apply(T,U);return T}return U};try{Array.prototype.slice.call(document.documentElement.childNodes)}catch(N){E=function(X,W){var U=W||[];if(H.call(X)==="[object Array]"){Array.prototype.push.apply(U,X)}else{if(typeof X.length==="number"){for(var V=0,T=X.length;V";var T=document.documentElement;T.insertBefore(U,T.firstChild);if(!!document.getElementById(V)){I.find.ID=function(X,Y,Z){if(typeof Y.getElementById!=="undefined"&&!Z){var W=Y.getElementById(X[1]);return W?W.id===X[1]||typeof W.getAttributeNode!=="undefined"&&W.getAttributeNode("id").nodeValue===X[1]?[W]:g:[]}};I.filter.ID=function(Y,W){var X=typeof Y.getAttributeNode!=="undefined"&&Y.getAttributeNode("id");return Y.nodeType===1&&X&&X.nodeValue===W}}T.removeChild(U)})();(function(){var T=document.createElement("div");T.appendChild(document.createComment(""));if(T.getElementsByTagName("*").length>0){I.find.TAG=function(U,Y){var X=Y.getElementsByTagName(U[1]);if(U[1]==="*"){var W=[];for(var V=0;X[V];V++){if(X[V].nodeType===1){W.push(X[V])}}X=W}return X}}T.innerHTML="";if(T.firstChild&&typeof T.firstChild.getAttribute!=="undefined"&&T.firstChild.getAttribute("href")!=="#"){I.attrHandle.href=function(U){return U.getAttribute("href",2)}}})();if(document.querySelectorAll){(function(){var T=F,U=document.createElement("div");U.innerHTML="

    ";if(U.querySelectorAll&&U.querySelectorAll(".TEST").length===0){return}F=function(Y,X,V,W){X=X||document;if(!W&&X.nodeType===9&&!Q(X)){try{return E(X.querySelectorAll(Y),V)}catch(Z){}}return T(Y,X,V,W)};F.find=T.find;F.filter=T.filter;F.selectors=T.selectors;F.matches=T.matches})()}if(document.getElementsByClassName&&document.documentElement.getElementsByClassName){(function(){var T=document.createElement("div");T.innerHTML="
    ";if(T.getElementsByClassName("e").length===0){return}T.lastChild.className="e";if(T.getElementsByClassName("e").length===1){return}I.order.splice(1,0,"CLASS");I.find.CLASS=function(U,V,W){if(typeof V.getElementsByClassName!=="undefined"&&!W){return V.getElementsByClassName(U[1])}}})()}function P(U,Z,Y,ad,aa,ac){var ab=U=="previousSibling"&&!ac;for(var W=0,V=ad.length;W0){X=T;break}}}T=T[U]}ad[W]=X}}}var K=document.compareDocumentPosition?function(U,T){return U.compareDocumentPosition(T)&16}:function(U,T){return U!==T&&(U.contains?U.contains(T):true)};var Q=function(T){return T.nodeType===9&&T.documentElement.nodeName!=="HTML"||!!T.ownerDocument&&Q(T.ownerDocument)};var J=function(T,aa){var W=[],X="",Y,V=aa.nodeType?[aa]:aa;while((Y=I.match.PSEUDO.exec(T))){X+=Y[0];T=T.replace(I.match.PSEUDO,"")}T=I.relative[T]?T+"*":T;for(var Z=0,U=V.length;Z0||T.offsetHeight>0};F.selectors.filters.animated=function(T){return o.grep(o.timers,function(U){return T===U.elem}).length};o.multiFilter=function(V,T,U){if(U){V=":not("+V+")"}return F.matches(V,T)};o.dir=function(V,U){var T=[],W=V[U];while(W&&W!=document){if(W.nodeType==1){T.push(W)}W=W[U]}return T};o.nth=function(X,T,V,W){T=T||1;var U=0;for(;X;X=X[V]){if(X.nodeType==1&&++U==T){break}}return X};o.sibling=function(V,U){var T=[];for(;V;V=V.nextSibling){if(V.nodeType==1&&V!=U){T.push(V)}}return T};return;l.Sizzle=F})();o.event={add:function(I,F,H,K){if(I.nodeType==3||I.nodeType==8){return}if(I.setInterval&&I!=l){I=l}if(!H.guid){H.guid=this.guid++}if(K!==g){var G=H;H=this.proxy(G);H.data=K}var E=o.data(I,"events")||o.data(I,"events",{}),J=o.data(I,"handle")||o.data(I,"handle",function(){return typeof o!=="undefined"&&!o.event.triggered?o.event.handle.apply(arguments.callee.elem,arguments):g});J.elem=I;o.each(F.split(/\s+/),function(M,N){var O=N.split(".");N=O.shift();H.type=O.slice().sort().join(".");var L=E[N];if(o.event.specialAll[N]){o.event.specialAll[N].setup.call(I,K,O)}if(!L){L=E[N]={};if(!o.event.special[N]||o.event.special[N].setup.call(I,K,O)===false){if(I.addEventListener){I.addEventListener(N,J,false)}else{if(I.attachEvent){I.attachEvent("on"+N,J)}}}}L[H.guid]=H;o.event.global[N]=true});I=null},guid:1,global:{},remove:function(K,H,J){if(K.nodeType==3||K.nodeType==8){return}var G=o.data(K,"events"),F,E;if(G){if(H===g||(typeof H==="string"&&H.charAt(0)==".")){for(var I in G){this.remove(K,I+(H||""))}}else{if(H.type){J=H.handler;H=H.type}o.each(H.split(/\s+/),function(M,O){var Q=O.split(".");O=Q.shift();var N=RegExp("(^|\\.)"+Q.slice().sort().join(".*\\.")+"(\\.|$)");if(G[O]){if(J){delete G[O][J.guid]}else{for(var P in G[O]){if(N.test(G[O][P].type)){delete G[O][P]}}}if(o.event.specialAll[O]){o.event.specialAll[O].teardown.call(K,Q)}for(F in G[O]){break}if(!F){if(!o.event.special[O]||o.event.special[O].teardown.call(K,Q)===false){if(K.removeEventListener){K.removeEventListener(O,o.data(K,"handle"),false)}else{if(K.detachEvent){K.detachEvent("on"+O,o.data(K,"handle"))}}}F=null;delete G[O]}}})}for(F in G){break}if(!F){var L=o.data(K,"handle");if(L){L.elem=null}o.removeData(K,"events");o.removeData(K,"handle")}}},trigger:function(I,K,H,E){var G=I.type||I;if(!E){I=typeof I==="object"?I[h]?I:o.extend(o.Event(G),I):o.Event(G);if(G.indexOf("!")>=0){I.type=G=G.slice(0,-1);I.exclusive=true}if(!H){I.stopPropagation();if(this.global[G]){o.each(o.cache,function(){if(this.events&&this.events[G]){o.event.trigger(I,K,this.handle.elem)}})}}if(!H||H.nodeType==3||H.nodeType==8){return g}I.result=g;I.target=H;K=o.makeArray(K);K.unshift(I)}I.currentTarget=H;var J=o.data(H,"handle");if(J){J.apply(H,K)}if((!H[G]||(o.nodeName(H,"a")&&G=="click"))&&H["on"+G]&&H["on"+G].apply(H,K)===false){I.result=false}if(!E&&H[G]&&!I.isDefaultPrevented()&&!(o.nodeName(H,"a")&&G=="click")){this.triggered=true;try{H[G]()}catch(L){}}this.triggered=false;if(!I.isPropagationStopped()){var F=H.parentNode||H.ownerDocument;if(F){o.event.trigger(I,K,F,true)}}},handle:function(K){var J,E;K=arguments[0]=o.event.fix(K||l.event);K.currentTarget=this;var L=K.type.split(".");K.type=L.shift();J=!L.length&&!K.exclusive;var I=RegExp("(^|\\.)"+L.slice().sort().join(".*\\.")+"(\\.|$)");E=(o.data(this,"events")||{})[K.type];for(var G in E){var H=E[G];if(J||I.test(H.type)){K.handler=H;K.data=H.data;var F=H.apply(this,arguments);if(F!==g){K.result=F;if(F===false){K.preventDefault();K.stopPropagation()}}if(K.isImmediatePropagationStopped()){break}}}},props:"altKey attrChange attrName bubbles button cancelable charCode clientX clientY ctrlKey currentTarget data detail eventPhase fromElement handler keyCode metaKey newValue originalTarget pageX pageY prevValue relatedNode relatedTarget screenX screenY shiftKey srcElement target toElement view wheelDelta which".split(" "),fix:function(H){if(H[h]){return H}var F=H;H=o.Event(F);for(var G=this.props.length,J;G;){J=this.props[--G];H[J]=F[J]}if(!H.target){H.target=H.srcElement||document}if(H.target.nodeType==3){H.target=H.target.parentNode}if(!H.relatedTarget&&H.fromElement){H.relatedTarget=H.fromElement==H.target?H.toElement:H.fromElement}if(H.pageX==null&&H.clientX!=null){var I=document.documentElement,E=document.body;H.pageX=H.clientX+(I&&I.scrollLeft||E&&E.scrollLeft||0)-(I.clientLeft||0);H.pageY=H.clientY+(I&&I.scrollTop||E&&E.scrollTop||0)-(I.clientTop||0)}if(!H.which&&((H.charCode||H.charCode===0)?H.charCode:H.keyCode)){H.which=H.charCode||H.keyCode}if(!H.metaKey&&H.ctrlKey){H.metaKey=H.ctrlKey}if(!H.which&&H.button){H.which=(H.button&1?1:(H.button&2?3:(H.button&4?2:0)))}return H},proxy:function(F,E){E=E||function(){return F.apply(this,arguments)};E.guid=F.guid=F.guid||E.guid||this.guid++;return E},special:{ready:{setup:B,teardown:function(){}}},specialAll:{live:{setup:function(E,F){o.event.add(this,F[0],c)},teardown:function(G){if(G.length){var E=0,F=RegExp("(^|\\.)"+G[0]+"(\\.|$)");o.each((o.data(this,"events").live||{}),function(){if(F.test(this.type)){E++}});if(E<1){o.event.remove(this,G[0],c)}}}}}};o.Event=function(E){if(!this.preventDefault){return new o.Event(E)}if(E&&E.type){this.originalEvent=E;this.type=E.type}else{this.type=E}this.timeStamp=e();this[h]=true};function k(){return false}function u(){return true}o.Event.prototype={preventDefault:function(){this.isDefaultPrevented=u;var E=this.originalEvent;if(!E){return}if(E.preventDefault){E.preventDefault()}E.returnValue=false},stopPropagation:function(){this.isPropagationStopped=u;var E=this.originalEvent;if(!E){return}if(E.stopPropagation){E.stopPropagation()}E.cancelBubble=true},stopImmediatePropagation:function(){this.isImmediatePropagationStopped=u;this.stopPropagation()},isDefaultPrevented:k,isPropagationStopped:k,isImmediatePropagationStopped:k};var a=function(F){var E=F.relatedTarget;while(E&&E!=this){try{E=E.parentNode}catch(G){E=this}}if(E!=this){F.type=F.data;o.event.handle.apply(this,arguments)}};o.each({mouseover:"mouseenter",mouseout:"mouseleave"},function(F,E){o.event.special[E]={setup:function(){o.event.add(this,F,a,E)},teardown:function(){o.event.remove(this,F,a)}}});o.fn.extend({bind:function(F,G,E){return F=="unload"?this.one(F,G,E):this.each(function(){o.event.add(this,F,E||G,E&&G)})},one:function(G,H,F){var E=o.event.proxy(F||H,function(I){o(this).unbind(I,E);return(F||H).apply(this,arguments)});return this.each(function(){o.event.add(this,G,E,F&&H)})},unbind:function(F,E){return this.each(function(){o.event.remove(this,F,E)})},trigger:function(E,F){return this.each(function(){o.event.trigger(E,F,this)})},triggerHandler:function(E,G){if(this[0]){var F=o.Event(E);F.preventDefault();F.stopPropagation();o.event.trigger(F,G,this[0]);return F.result}},toggle:function(G){var E=arguments,F=1;while(F=0){var E=G.slice(I,G.length);G=G.slice(0,I)}var H="GET";if(J){if(o.isFunction(J)){K=J;J=null}else{if(typeof J==="object"){J=o.param(J);H="POST"}}}var F=this;o.ajax({url:G,type:H,dataType:"html",data:J,complete:function(M,L){if(L=="success"||L=="notmodified"){F.html(E?o("
    ").append(M.responseText.replace(//g,"")).find(E):M.responseText)}if(K){F.each(K,[M.responseText,L,M])}}});return this},serialize:function(){return o.param(this.serializeArray())},serializeArray:function(){return this.map(function(){return this.elements?o.makeArray(this.elements):this}).filter(function(){return this.name&&!this.disabled&&(this.checked||/select|textarea/i.test(this.nodeName)||/text|hidden|password|search/i.test(this.type))}).map(function(E,F){var G=o(this).val();return G==null?null:o.isArray(G)?o.map(G,function(I,H){return{name:F.name,value:I}}):{name:F.name,value:G}}).get()}});o.each("ajaxStart,ajaxStop,ajaxComplete,ajaxError,ajaxSuccess,ajaxSend".split(","),function(E,F){o.fn[F]=function(G){return this.bind(F,G)}});var r=e();o.extend({get:function(E,G,H,F){if(o.isFunction(G)){H=G;G=null}return o.ajax({type:"GET",url:E,data:G,success:H,dataType:F})},getScript:function(E,F){return o.get(E,null,F,"script")},getJSON:function(E,F,G){return o.get(E,F,G,"json")},post:function(E,G,H,F){if(o.isFunction(G)){H=G;G={}}return o.ajax({type:"POST",url:E,data:G,success:H,dataType:F})},ajaxSetup:function(E){o.extend(o.ajaxSettings,E)},ajaxSettings:{url:location.href,global:true,type:"GET",contentType:"application/x-www-form-urlencoded",processData:true,async:true,xhr:function(){return l.ActiveXObject?new ActiveXObject("Microsoft.XMLHTTP"):new XMLHttpRequest()},accepts:{xml:"application/xml, text/xml",html:"text/html",script:"text/javascript, application/javascript",json:"application/json, text/javascript",text:"text/plain",_default:"*/*"}},lastModified:{},ajax:function(M){M=o.extend(true,M,o.extend(true,{},o.ajaxSettings,M));var W,F=/=\?(&|$)/g,R,V,G=M.type.toUpperCase();if(M.data&&M.processData&&typeof M.data!=="string"){M.data=o.param(M.data)}if(M.dataType=="jsonp"){if(G=="GET"){if(!M.url.match(F)){M.url+=(M.url.match(/\?/)?"&":"?")+(M.jsonp||"callback")+"=?"}}else{if(!M.data||!M.data.match(F)){M.data=(M.data?M.data+"&":"")+(M.jsonp||"callback")+"=?"}}M.dataType="json"}if(M.dataType=="json"&&(M.data&&M.data.match(F)||M.url.match(F))){W="jsonp"+r++;if(M.data){M.data=(M.data+"").replace(F,"="+W+"$1")}M.url=M.url.replace(F,"="+W+"$1");M.dataType="script";l[W]=function(X){V=X;I();L();l[W]=g;try{delete l[W]}catch(Y){}if(H){H.removeChild(T)}}}if(M.dataType=="script"&&M.cache==null){M.cache=false}if(M.cache===false&&G=="GET"){var E=e();var U=M.url.replace(/(\?|&)_=.*?(&|$)/,"$1_="+E+"$2");M.url=U+((U==M.url)?(M.url.match(/\?/)?"&":"?")+"_="+E:"")}if(M.data&&G=="GET"){M.url+=(M.url.match(/\?/)?"&":"?")+M.data;M.data=null}if(M.global&&!o.active++){o.event.trigger("ajaxStart")}var Q=/^(\w+:)?\/\/([^\/?#]+)/.exec(M.url);if(M.dataType=="script"&&G=="GET"&&Q&&(Q[1]&&Q[1]!=location.protocol||Q[2]!=location.host)){var H=document.getElementsByTagName("head")[0];var T=document.createElement("script");T.src=M.url;if(M.scriptCharset){T.charset=M.scriptCharset}if(!W){var O=false;T.onload=T.onreadystatechange=function(){if(!O&&(!this.readyState||this.readyState=="loaded"||this.readyState=="complete")){O=true;I();L();T.onload=T.onreadystatechange=null;H.removeChild(T)}}}H.appendChild(T);return g}var K=false;var J=M.xhr();if(M.username){J.open(G,M.url,M.async,M.username,M.password)}else{J.open(G,M.url,M.async)}try{if(M.data){J.setRequestHeader("Content-Type",M.contentType)}if(M.ifModified){J.setRequestHeader("If-Modified-Since",o.lastModified[M.url]||"Thu, 01 Jan 1970 00:00:00 GMT")}J.setRequestHeader("X-Requested-With","XMLHttpRequest");J.setRequestHeader("Accept",M.dataType&&M.accepts[M.dataType]?M.accepts[M.dataType]+", */*":M.accepts._default)}catch(S){}if(M.beforeSend&&M.beforeSend(J,M)===false){if(M.global&&!--o.active){o.event.trigger("ajaxStop")}J.abort();return false}if(M.global){o.event.trigger("ajaxSend",[J,M])}var N=function(X){if(J.readyState==0){if(P){clearInterval(P);P=null;if(M.global&&!--o.active){o.event.trigger("ajaxStop")}}}else{if(!K&&J&&(J.readyState==4||X=="timeout")){K=true;if(P){clearInterval(P);P=null}R=X=="timeout"?"timeout":!o.httpSuccess(J)?"error":M.ifModified&&o.httpNotModified(J,M.url)?"notmodified":"success";if(R=="success"){try{V=o.httpData(J,M.dataType,M)}catch(Z){R="parsererror"}}if(R=="success"){var Y;try{Y=J.getResponseHeader("Last-Modified")}catch(Z){}if(M.ifModified&&Y){o.lastModified[M.url]=Y}if(!W){I()}}else{o.handleError(M,J,R)}L();if(X){J.abort()}if(M.async){J=null}}}};if(M.async){var P=setInterval(N,13);if(M.timeout>0){setTimeout(function(){if(J&&!K){N("timeout")}},M.timeout)}}try{J.send(M.data)}catch(S){o.handleError(M,J,null,S)}if(!M.async){N()}function I(){if(M.success){M.success(V,R)}if(M.global){o.event.trigger("ajaxSuccess",[J,M])}}function L(){if(M.complete){M.complete(J,R)}if(M.global){o.event.trigger("ajaxComplete",[J,M])}if(M.global&&!--o.active){o.event.trigger("ajaxStop")}}return J},handleError:function(F,H,E,G){if(F.error){F.error(H,E,G)}if(F.global){o.event.trigger("ajaxError",[H,F,G])}},active:0,httpSuccess:function(F){try{return !F.status&&location.protocol=="file:"||(F.status>=200&&F.status<300)||F.status==304||F.status==1223}catch(E){}return false},httpNotModified:function(G,E){try{var H=G.getResponseHeader("Last-Modified");return G.status==304||H==o.lastModified[E]}catch(F){}return false},httpData:function(J,H,G){var F=J.getResponseHeader("content-type"),E=H=="xml"||!H&&F&&F.indexOf("xml")>=0,I=E?J.responseXML:J.responseText;if(E&&I.documentElement.tagName=="parsererror"){throw"parsererror"}if(G&&G.dataFilter){I=G.dataFilter(I,H)}if(typeof I==="string"){if(H=="script"){o.globalEval(I)}if(H=="json"){I=l["eval"]("("+I+")")}}return I},param:function(E){var G=[];function H(I,J){G[G.length]=encodeURIComponent(I)+"="+encodeURIComponent(J)}if(o.isArray(E)||E.jquery){o.each(E,function(){H(this.name,this.value)})}else{for(var F in E){if(o.isArray(E[F])){o.each(E[F],function(){H(F,this)})}else{H(F,o.isFunction(E[F])?E[F]():E[F])}}}return G.join("&").replace(/%20/g,"+")}});var m={},n,d=[["height","marginTop","marginBottom","paddingTop","paddingBottom"],["width","marginLeft","marginRight","paddingLeft","paddingRight"],["opacity"]];function t(F,E){var G={};o.each(d.concat.apply([],d.slice(0,E)),function(){G[this]=F});return G}o.fn.extend({show:function(J,L){if(J){return this.animate(t("show",3),J,L)}else{for(var H=0,F=this.length;H").appendTo("body");K=I.css("display");if(K==="none"){K="block"}I.remove();m[G]=K}o.data(this[H],"olddisplay",K)}}for(var H=0,F=this.length;H=0;H--){if(G[H].elem==this){if(E){G[H](true)}G.splice(H,1)}}});if(!E){this.dequeue()}return this}});o.each({slideDown:t("show",1),slideUp:t("hide",1),slideToggle:t("toggle",1),fadeIn:{opacity:"show"},fadeOut:{opacity:"hide"}},function(E,F){o.fn[E]=function(G,H){return this.animate(F,G,H)}});o.extend({speed:function(G,H,F){var E=typeof G==="object"?G:{complete:F||!F&&H||o.isFunction(G)&&G,duration:G,easing:F&&H||H&&!o.isFunction(H)&&H};E.duration=o.fx.off?0:typeof E.duration==="number"?E.duration:o.fx.speeds[E.duration]||o.fx.speeds._default;E.old=E.complete;E.complete=function(){if(E.queue!==false){o(this).dequeue()}if(o.isFunction(E.old)){E.old.call(this)}};return E},easing:{linear:function(G,H,E,F){return E+F*G},swing:function(G,H,E,F){return((-Math.cos(G*Math.PI)/2)+0.5)*F+E}},timers:[],fx:function(F,E,G){this.options=E;this.elem=F;this.prop=G;if(!E.orig){E.orig={}}}});o.fx.prototype={update:function(){if(this.options.step){this.options.step.call(this.elem,this.now,this)}(o.fx.step[this.prop]||o.fx.step._default)(this);if((this.prop=="height"||this.prop=="width")&&this.elem.style){this.elem.style.display="block"}},cur:function(F){if(this.elem[this.prop]!=null&&(!this.elem.style||this.elem.style[this.prop]==null)){return this.elem[this.prop]}var E=parseFloat(o.css(this.elem,this.prop,F));return E&&E>-10000?E:parseFloat(o.curCSS(this.elem,this.prop))||0},custom:function(I,H,G){this.startTime=e();this.start=I;this.end=H;this.unit=G||this.unit||"px";this.now=this.start;this.pos=this.state=0;var E=this;function F(J){return E.step(J)}F.elem=this.elem;if(F()&&o.timers.push(F)&&!n){n=setInterval(function(){var K=o.timers;for(var J=0;J=this.options.duration+this.startTime){this.now=this.end;this.pos=this.state=1;this.update();this.options.curAnim[this.prop]=true;var E=true;for(var F in this.options.curAnim){if(this.options.curAnim[F]!==true){E=false}}if(E){if(this.options.display!=null){this.elem.style.overflow=this.options.overflow;this.elem.style.display=this.options.display;if(o.css(this.elem,"display")=="none"){this.elem.style.display="block"}}if(this.options.hide){o(this.elem).hide()}if(this.options.hide||this.options.show){for(var I in this.options.curAnim){o.attr(this.elem.style,I,this.options.orig[I])}}this.options.complete.call(this.elem)}return false}else{var J=G-this.startTime;this.state=J/this.options.duration;this.pos=o.easing[this.options.easing||(o.easing.swing?"swing":"linear")](this.state,J,0,1,this.options.duration);this.now=this.start+((this.end-this.start)*this.pos);this.update()}return true}};o.extend(o.fx,{speeds:{slow:600,fast:200,_default:400},step:{opacity:function(E){o.attr(E.elem.style,"opacity",E.now)},_default:function(E){if(E.elem.style&&E.elem.style[E.prop]!=null){E.elem.style[E.prop]=E.now+E.unit}else{E.elem[E.prop]=E.now}}}});if(document.documentElement.getBoundingClientRect){o.fn.offset=function(){if(!this[0]){return{top:0,left:0}}if(this[0]===this[0].ownerDocument.body){return o.offset.bodyOffset(this[0])}var G=this[0].getBoundingClientRect(),J=this[0].ownerDocument,F=J.body,E=J.documentElement,L=E.clientTop||F.clientTop||0,K=E.clientLeft||F.clientLeft||0,I=G.top+(self.pageYOffset||o.boxModel&&E.scrollTop||F.scrollTop)-L,H=G.left+(self.pageXOffset||o.boxModel&&E.scrollLeft||F.scrollLeft)-K;return{top:I,left:H}}}else{o.fn.offset=function(){if(!this[0]){return{top:0,left:0}}if(this[0]===this[0].ownerDocument.body){return o.offset.bodyOffset(this[0])}o.offset.initialized||o.offset.initialize();var J=this[0],G=J.offsetParent,F=J,O=J.ownerDocument,M,H=O.documentElement,K=O.body,L=O.defaultView,E=L.getComputedStyle(J,null),N=J.offsetTop,I=J.offsetLeft;while((J=J.parentNode)&&J!==K&&J!==H){M=L.getComputedStyle(J,null);N-=J.scrollTop,I-=J.scrollLeft;if(J===G){N+=J.offsetTop,I+=J.offsetLeft;if(o.offset.doesNotAddBorder&&!(o.offset.doesAddBorderForTableAndCells&&/^t(able|d|h)$/i.test(J.tagName))){N+=parseInt(M.borderTopWidth,10)||0,I+=parseInt(M.borderLeftWidth,10)||0}F=G,G=J.offsetParent}if(o.offset.subtractsBorderForOverflowNotVisible&&M.overflow!=="visible"){N+=parseInt(M.borderTopWidth,10)||0,I+=parseInt(M.borderLeftWidth,10)||0}E=M}if(E.position==="relative"||E.position==="static"){N+=K.offsetTop,I+=K.offsetLeft}if(E.position==="fixed"){N+=Math.max(H.scrollTop,K.scrollTop),I+=Math.max(H.scrollLeft,K.scrollLeft)}return{top:N,left:I}}}o.offset={initialize:function(){if(this.initialized){return}var L=document.body,F=document.createElement("div"),H,G,N,I,M,E,J=L.style.marginTop,K='
    ';M={position:"absolute",top:0,left:0,margin:0,border:0,width:"1px",height:"1px",visibility:"hidden"};for(E in M){F.style[E]=M[E]}F.innerHTML=K;L.insertBefore(F,L.firstChild);H=F.firstChild,G=H.firstChild,I=H.nextSibling.firstChild.firstChild;this.doesNotAddBorder=(G.offsetTop!==5);this.doesAddBorderForTableAndCells=(I.offsetTop===5);H.style.overflow="hidden",H.style.position="relative";this.subtractsBorderForOverflowNotVisible=(G.offsetTop===-5);L.style.marginTop="1px";this.doesNotIncludeMarginInBodyOffset=(L.offsetTop===0);L.style.marginTop=J;L.removeChild(F);this.initialized=true},bodyOffset:function(E){o.offset.initialized||o.offset.initialize();var G=E.offsetTop,F=E.offsetLeft;if(o.offset.doesNotIncludeMarginInBodyOffset){G+=parseInt(o.curCSS(E,"marginTop",true),10)||0,F+=parseInt(o.curCSS(E,"marginLeft",true),10)||0}return{top:G,left:F}}};o.fn.extend({position:function(){var I=0,H=0,F;if(this[0]){var G=this.offsetParent(),J=this.offset(),E=/^body|html$/i.test(G[0].tagName)?{top:0,left:0}:G.offset();J.top-=j(this,"marginTop");J.left-=j(this,"marginLeft");E.top+=j(G,"borderTopWidth");E.left+=j(G,"borderLeftWidth");F={top:J.top-E.top,left:J.left-E.left}}return F},offsetParent:function(){var E=this[0].offsetParent||document.body;while(E&&(!/^body|html$/i.test(E.tagName)&&o.css(E,"position")=="static")){E=E.offsetParent}return o(E)}});o.each(["Left","Top"],function(F,E){var G="scroll"+E;o.fn[G]=function(H){if(!this[0]){return null}return H!==g?this.each(function(){this==l||this==document?l.scrollTo(!F?H:o(l).scrollLeft(),F?H:o(l).scrollTop()):this[G]=H}):this[0]==l||this[0]==document?self[F?"pageYOffset":"pageXOffset"]||o.boxModel&&document.documentElement[G]||document.body[G]:this[0][G]}});o.each(["Height","Width"],function(I,G){var E=I?"Left":"Top",H=I?"Right":"Bottom",F=G.toLowerCase();o.fn["inner"+G]=function(){return this[0]?o.css(this[0],F,false,"padding"):null};o.fn["outer"+G]=function(K){return this[0]?o.css(this[0],F,false,K?"margin":"border"):null};var J=G.toLowerCase();o.fn[J]=function(K){return this[0]==l?document.compatMode=="CSS1Compat"&&document.documentElement["client"+G]||document.body["client"+G]:this[0]==document?Math.max(document.documentElement["client"+G],document.body["scroll"+G],document.documentElement["scroll"+G],document.body["offset"+G],document.documentElement["offset"+G]):K===g?(this.length?o.css(this[0],J):null):this.css(J,typeof K==="string"?K:K+"px")}})})(); \ No newline at end of file diff -r 7c994c98d1df -r ae8593287883 web/ldt_utils/media/js/jquery.validate.js --- a/web/ldt_utils/media/js/jquery.validate.js Tue Jun 08 15:31:42 2010 +0200 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,1131 +0,0 @@ -/* - * jQuery validation plug-in 1.5.5 - * - * http://bassistance.de/jquery-plugins/jquery-plugin-validation/ - * http://docs.jquery.com/Plugins/Validation - * - * Copyright (c) 2006 - 2008 Jörn Zaefferer - * - * $Id: jquery.validate.js 6403 2009-06-17 14:27:16Z joern.zaefferer $ - * - * Dual licensed under the MIT and GPL licenses: - * http://www.opensource.org/licenses/mit-license.php - * http://www.gnu.org/licenses/gpl.html - */ - -(function($) { - -$.extend($.fn, { - // http://docs.jquery.com/Plugins/Validation/validate - validate: function( options ) { - - // if nothing is selected, return nothing; can't chain anyway - if (!this.length) { - options && options.debug && window.console && console.warn( "nothing selected, can't validate, returning nothing" ); - return; - } - - // check if a validator for this form was already created - var validator = $.data(this[0], 'validator'); - if ( validator ) { - return validator; - } - - validator = new $.validator( options, this[0] ); - $.data(this[0], 'validator', validator); - - if ( validator.settings.onsubmit ) { - - // allow suppresing validation by adding a cancel class to the submit button - this.find("input, button").filter(".cancel").click(function() { - validator.cancelSubmit = true; - }); - - // when a submitHandler is used, capture the submitting button - if (validator.settings.submitHandler) { - this.find("input, button").filter(":submit").click(function() { - validator.submitButton = this; - }); - } - - // validate the form on submit - this.submit( function( event ) { - if ( validator.settings.debug ) - // prevent form submit to be able to see console output - event.preventDefault(); - - function handle() { - if ( validator.settings.submitHandler ) { - if (validator.submitButton) { - // insert a hidden input as a replacement for the missing submit button - var hidden = $("").attr("name", validator.submitButton.name).val(validator.submitButton.value).appendTo(validator.currentForm); - } - validator.settings.submitHandler.call( validator, validator.currentForm ); - if (validator.submitButton) { - // and clean up afterwards; thanks to no-block-scope, hidden can be referenced - hidden.remove(); - } - return false; - } - return true; - } - - // prevent submit for invalid forms or custom submit handlers - if ( validator.cancelSubmit ) { - validator.cancelSubmit = false; - return handle(); - } - if ( validator.form() ) { - if ( validator.pendingRequest ) { - validator.formSubmitted = true; - return false; - } - return handle(); - } else { - validator.focusInvalid(); - return false; - } - }); - } - - return validator; - }, - // http://docs.jquery.com/Plugins/Validation/valid - valid: function() { - if ( $(this[0]).is('form')) { - return this.validate().form(); - } else { - var valid = true; - var validator = $(this[0].form).validate(); - this.each(function() { - valid &= validator.element(this); - }); - return valid; - } - }, - // attributes: space seperated list of attributes to retrieve and remove - removeAttrs: function(attributes) { - var result = {}, - $element = this; - $.each(attributes.split(/\s/), function(index, value) { - result[value] = $element.attr(value); - $element.removeAttr(value); - }); - return result; - }, - // http://docs.jquery.com/Plugins/Validation/rules - rules: function(command, argument) { - var element = this[0]; - - if (command) { - var settings = $.data(element.form, 'validator').settings; - var staticRules = settings.rules; - var existingRules = $.validator.staticRules(element); - switch(command) { - case "add": - $.extend(existingRules, $.validator.normalizeRule(argument)); - staticRules[element.name] = existingRules; - if (argument.messages) - settings.messages[element.name] = $.extend( settings.messages[element.name], argument.messages ); - break; - case "remove": - if (!argument) { - delete staticRules[element.name]; - return existingRules; - } - var filtered = {}; - $.each(argument.split(/\s/), function(index, method) { - filtered[method] = existingRules[method]; - delete existingRules[method]; - }); - return filtered; - } - } - - var data = $.validator.normalizeRules( - $.extend( - {}, - $.validator.metadataRules(element), - $.validator.classRules(element), - $.validator.attributeRules(element), - $.validator.staticRules(element) - ), element); - - // make sure required is at front - if (data.required) { - var param = data.required; - delete data.required; - data = $.extend({required: param}, data); - } - - return data; - } -}); - -// Custom selectors -$.extend($.expr[":"], { - // http://docs.jquery.com/Plugins/Validation/blank - blank: function(a) {return !$.trim(a.value);}, - // http://docs.jquery.com/Plugins/Validation/filled - filled: function(a) {return !!$.trim(a.value);}, - // http://docs.jquery.com/Plugins/Validation/unchecked - unchecked: function(a) {return !a.checked;} -}); - -// constructor for validator -$.validator = function( options, form ) { - this.settings = $.extend( {}, $.validator.defaults, options ); - this.currentForm = form; - this.init(); -}; - -$.validator.format = function(source, params) { - if ( arguments.length == 1 ) - return function() { - var args = $.makeArray(arguments); - args.unshift(source); - return $.validator.format.apply( this, args ); - }; - if ( arguments.length > 2 && params.constructor != Array ) { - params = $.makeArray(arguments).slice(1); - } - if ( params.constructor != Array ) { - params = [ params ]; - } - $.each(params, function(i, n) { - source = source.replace(new RegExp("\\{" + i + "\\}", "g"), n); - }); - return source; -}; - -$.extend($.validator, { - - defaults: { - messages: {}, - groups: {}, - rules: {}, - errorClass: "error", - validClass: "valid", - errorElement: "label", - focusInvalid: true, - errorContainer: $( [] ), - errorLabelContainer: $( [] ), - onsubmit: true, - ignore: [], - ignoreTitle: false, - onfocusin: function(element) { - this.lastActive = element; - - // hide error label and remove error class on focus if enabled - if ( this.settings.focusCleanup && !this.blockFocusCleanup ) { - this.settings.unhighlight && this.settings.unhighlight.call( this, element, this.settings.errorClass, this.settings.validClass ); - this.errorsFor(element).hide(); - } - }, - onfocusout: function(element) { - if ( !this.checkable(element) && (element.name in this.submitted || !this.optional(element)) ) { - this.element(element); - } - }, - onkeyup: function(element) { - if ( element.name in this.submitted || element == this.lastElement ) { - this.element(element); - } - }, - onclick: function(element) { - if ( element.name in this.submitted ) - this.element(element); - }, - highlight: function( element, errorClass, validClass ) { - $(element).addClass(errorClass).removeClass(validClass); - }, - unhighlight: function( element, errorClass, validClass ) { - $(element).removeClass(errorClass).addClass(validClass); - } - }, - - // http://docs.jquery.com/Plugins/Validation/Validator/setDefaults - setDefaults: function(settings) { - $.extend( $.validator.defaults, settings ); - }, - - messages: { - required: "This field is required.", - remote: "Please fix this field.", - email: "Please enter a valid email address.", - url: "Please enter a valid URL.", - date: "Please enter a valid date.", - dateISO: "Please enter a valid date (ISO).", - dateDE: "Bitte geben Sie ein gültiges Datum ein.", - number: "Please enter a valid number.", - numberDE: "Bitte geben Sie eine Nummer ein.", - digits: "Please enter only digits", - creditcard: "Please enter a valid credit card number.", - equalTo: "Please enter the same value again.", - accept: "Please enter a value with a valid extension.", - maxlength: $.validator.format("Please enter no more than {0} characters."), - minlength: $.validator.format("Please enter at least {0} characters."), - rangelength: $.validator.format("Please enter a value between {0} and {1} characters long."), - range: $.validator.format("Please enter a value between {0} and {1}."), - max: $.validator.format("Please enter a value less than or equal to {0}."), - min: $.validator.format("Please enter a value greater than or equal to {0}.") - }, - - autoCreateRanges: false, - - prototype: { - - init: function() { - this.labelContainer = $(this.settings.errorLabelContainer); - this.errorContext = this.labelContainer.length && this.labelContainer || $(this.currentForm); - this.containers = $(this.settings.errorContainer).add( this.settings.errorLabelContainer ); - this.submitted = {}; - this.valueCache = {}; - this.pendingRequest = 0; - this.pending = {}; - this.invalid = {}; - this.reset(); - - var groups = (this.groups = {}); - $.each(this.settings.groups, function(key, value) { - $.each(value.split(/\s/), function(index, name) { - groups[name] = key; - }); - }); - var rules = this.settings.rules; - $.each(rules, function(key, value) { - rules[key] = $.validator.normalizeRule(value); - }); - - function delegate(event) { - var validator = $.data(this[0].form, "validator"); - validator.settings["on" + event.type] && validator.settings["on" + event.type].call(validator, this[0] ); - } - $(this.currentForm) - .delegate("focusin focusout keyup", ":text, :password, :file, select, textarea", delegate) - .delegate("click", ":radio, :checkbox", delegate); - - if (this.settings.invalidHandler) - $(this.currentForm).bind("invalid-form.validate", this.settings.invalidHandler); - }, - - // http://docs.jquery.com/Plugins/Validation/Validator/form - form: function() { - this.checkForm(); - $.extend(this.submitted, this.errorMap); - this.invalid = $.extend({}, this.errorMap); - if (!this.valid()) - $(this.currentForm).triggerHandler("invalid-form", [this]); - this.showErrors(); - return this.valid(); - }, - - checkForm: function() { - this.prepareForm(); - for ( var i = 0, elements = (this.currentElements = this.elements()); elements[i]; i++ ) { - this.check( elements[i] ); - } - return this.valid(); - }, - - // http://docs.jquery.com/Plugins/Validation/Validator/element - element: function( element ) { - element = this.clean( element ); - this.lastElement = element; - this.prepareElement( element ); - this.currentElements = $(element); - var result = this.check( element ); - if ( result ) { - delete this.invalid[element.name]; - } else { - this.invalid[element.name] = true; - } - if ( !this.numberOfInvalids() ) { - // Hide error containers on last error - this.toHide = this.toHide.add( this.containers ); - } - this.showErrors(); - return result; - }, - - // http://docs.jquery.com/Plugins/Validation/Validator/showErrors - showErrors: function(errors) { - if(errors) { - // add items to error list and map - $.extend( this.errorMap, errors ); - this.errorList = []; - for ( var name in errors ) { - this.errorList.push({ - message: errors[name], - element: this.findByName(name)[0] - }); - } - // remove items from success list - this.successList = $.grep( this.successList, function(element) { - return !(element.name in errors); - }); - } - this.settings.showErrors - ? this.settings.showErrors.call( this, this.errorMap, this.errorList ) - : this.defaultShowErrors(); - }, - - // http://docs.jquery.com/Plugins/Validation/Validator/resetForm - resetForm: function() { - if ( $.fn.resetForm ) - $( this.currentForm ).resetForm(); - this.submitted = {}; - this.prepareForm(); - this.hideErrors(); - this.elements().removeClass( this.settings.errorClass ); - }, - - numberOfInvalids: function() { - return this.objectLength(this.invalid); - }, - - objectLength: function( obj ) { - var count = 0; - for ( var i in obj ) - count++; - return count; - }, - - hideErrors: function() { - this.addWrapper( this.toHide ).hide(); - }, - - valid: function() { - return this.size() == 0; - }, - - size: function() { - return this.errorList.length; - }, - - focusInvalid: function() { - if( this.settings.focusInvalid ) { - try { - $(this.findLastActive() || this.errorList.length && this.errorList[0].element || []).filter(":visible").focus(); - } catch(e) { - // ignore IE throwing errors when focusing hidden elements - } - } - }, - - findLastActive: function() { - var lastActive = this.lastActive; - return lastActive && $.grep(this.errorList, function(n) { - return n.element.name == lastActive.name; - }).length == 1 && lastActive; - }, - - elements: function() { - var validator = this, - rulesCache = {}; - - // select all valid inputs inside the form (no submit or reset buttons) - // workaround $Query([]).add until http://dev.jquery.com/ticket/2114 is solved - return $([]).add(this.currentForm.elements) - .filter(":input") - .not(":submit, :reset, :image, [disabled]") - .not( this.settings.ignore ) - .filter(function() { - !this.name && validator.settings.debug && window.console && console.error( "%o has no name assigned", this); - - // select only the first element for each name, and only those with rules specified - if ( this.name in rulesCache || !validator.objectLength($(this).rules()) ) - return false; - - rulesCache[this.name] = true; - return true; - }); - }, - - clean: function( selector ) { - return $( selector )[0]; - }, - - errors: function() { - return $( this.settings.errorElement + "." + this.settings.errorClass, this.errorContext ); - }, - - reset: function() { - this.successList = []; - this.errorList = []; - this.errorMap = {}; - this.toShow = $([]); - this.toHide = $([]); - this.formSubmitted = false; - this.currentElements = $([]); - }, - - prepareForm: function() { - this.reset(); - this.toHide = this.errors().add( this.containers ); - }, - - prepareElement: function( element ) { - this.reset(); - this.toHide = this.errorsFor(element); - }, - - check: function( element ) { - element = this.clean( element ); - - // if radio/checkbox, validate first element in group instead - if (this.checkable(element)) { - element = this.findByName( element.name )[0]; - } - - var rules = $(element).rules(); - var dependencyMismatch = false; - for( method in rules ) { - var rule = { method: method, parameters: rules[method] }; - try { - var result = $.validator.methods[method].call( this, element.value.replace(/\r/g, ""), element, rule.parameters ); - - // if a method indicates that the field is optional and therefore valid, - // don't mark it as valid when there are no other rules - if ( result == "dependency-mismatch" ) { - dependencyMismatch = true; - continue; - } - dependencyMismatch = false; - - if ( result == "pending" ) { - this.toHide = this.toHide.not( this.errorsFor(element) ); - return; - } - - if( !result ) { - this.formatAndAdd( element, rule ); - return false; - } - } catch(e) { - this.settings.debug && window.console && console.log("exception occured when checking element " + element.id - + ", check the '" + rule.method + "' method"); - throw e; - } - } - if (dependencyMismatch) - return; - if ( this.objectLength(rules) ) - this.successList.push(element); - return true; - }, - - // return the custom message for the given element and validation method - // specified in the element's "messages" metadata - customMetaMessage: function(element, method) { - if (!$.metadata) - return; - - var meta = this.settings.meta - ? $(element).metadata()[this.settings.meta] - : $(element).metadata(); - - return meta && meta.messages && meta.messages[method]; - }, - - // return the custom message for the given element name and validation method - customMessage: function( name, method ) { - var m = this.settings.messages[name]; - return m && (m.constructor == String - ? m - : m[method]); - }, - - // return the first defined argument, allowing empty strings - findDefined: function() { - for(var i = 0; i < arguments.length; i++) { - if (arguments[i] !== undefined) - return arguments[i]; - } - return undefined; - }, - - defaultMessage: function( element, method) { - return this.findDefined( - this.customMessage( element.name, method ), - this.customMetaMessage( element, method ), - // title is never undefined, so handle empty string as undefined - !this.settings.ignoreTitle && element.title || undefined, - $.validator.messages[method], - "Warning: No message defined for " + element.name + "" - ); - }, - - formatAndAdd: function( element, rule ) { - var message = this.defaultMessage( element, rule.method ); - if ( typeof message == "function" ) - message = message.call(this, rule.parameters, element); - this.errorList.push({ - message: message, - element: element - }); - this.errorMap[element.name] = message; - this.submitted[element.name] = message; - }, - - addWrapper: function(toToggle) { - if ( this.settings.wrapper ) - toToggle = toToggle.add( toToggle.parent( this.settings.wrapper ) ); - return toToggle; - }, - - defaultShowErrors: function() { - for ( var i = 0; this.errorList[i]; i++ ) { - var error = this.errorList[i]; - this.settings.highlight && this.settings.highlight.call( this, error.element, this.settings.errorClass, this.settings.validClass ); - this.showLabel( error.element, error.message ); - } - if( this.errorList.length ) { - this.toShow = this.toShow.add( this.containers ); - } - if (this.settings.success) { - for ( var i = 0; this.successList[i]; i++ ) { - this.showLabel( this.successList[i] ); - } - } - if (this.settings.unhighlight) { - for ( var i = 0, elements = this.validElements(); elements[i]; i++ ) { - this.settings.unhighlight.call( this, elements[i], this.settings.errorClass, this.settings.validClass ); - } - } - this.toHide = this.toHide.not( this.toShow ); - this.hideErrors(); - this.addWrapper( this.toShow ).show(); - }, - - validElements: function() { - return this.currentElements.not(this.invalidElements()); - }, - - invalidElements: function() { - return $(this.errorList).map(function() { - return this.element; - }); - }, - - showLabel: function(element, message) { - var label = this.errorsFor( element ); - if ( label.length ) { - // refresh error/success class - label.removeClass().addClass( this.settings.errorClass ); - - // check if we have a generated label, replace the message then - label.attr("generated") && label.html(message); - } else { - // create label - label = $("<" + this.settings.errorElement + "/>") - .attr({"for": this.idOrName(element), generated: true}) - .addClass(this.settings.errorClass) - .html(message || ""); - if ( this.settings.wrapper ) { - // make sure the element is visible, even in IE - // actually showing the wrapped element is handled elsewhere - label = label.hide().show().wrap("<" + this.settings.wrapper + "/>").parent(); - } - if ( !this.labelContainer.append(label).length ) - this.settings.errorPlacement - ? this.settings.errorPlacement(label, $(element) ) - : label.insertAfter(element); - } - if ( !message && this.settings.success ) { - label.text(""); - typeof this.settings.success == "string" - ? label.addClass( this.settings.success ) - : this.settings.success( label ); - } - this.toShow = this.toShow.add(label); - }, - - errorsFor: function(element) { - return this.errors().filter("[for='" + this.idOrName(element) + "']"); - }, - - idOrName: function(element) { - return this.groups[element.name] || (this.checkable(element) ? element.name : element.id || element.name); - }, - - checkable: function( element ) { - return /radio|checkbox/i.test(element.type); - }, - - findByName: function( name ) { - // select by name and filter by form for performance over form.find("[name=...]") - var form = this.currentForm; - return $(document.getElementsByName(name)).map(function(index, element) { - return element.form == form && element.name == name && element || null; - }); - }, - - getLength: function(value, element) { - switch( element.nodeName.toLowerCase() ) { - case 'select': - return $("option:selected", element).length; - case 'input': - if( this.checkable( element) ) - return this.findByName(element.name).filter(':checked').length; - } - return value.length; - }, - - depend: function(param, element) { - return this.dependTypes[typeof param] - ? this.dependTypes[typeof param](param, element) - : true; - }, - - dependTypes: { - "boolean": function(param, element) { - return param; - }, - "string": function(param, element) { - return !!$(param, element.form).length; - }, - "function": function(param, element) { - return param(element); - } - }, - - optional: function(element) { - return !$.validator.methods.required.call(this, $.trim(element.value), element) && "dependency-mismatch"; - }, - - startRequest: function(element) { - if (!this.pending[element.name]) { - this.pendingRequest++; - this.pending[element.name] = true; - } - }, - - stopRequest: function(element, valid) { - this.pendingRequest--; - // sometimes synchronization fails, make sure pendingRequest is never < 0 - if (this.pendingRequest < 0) - this.pendingRequest = 0; - delete this.pending[element.name]; - if ( valid && this.pendingRequest == 0 && this.formSubmitted && this.form() ) { - $(this.currentForm).submit(); - } else if (!valid && this.pendingRequest == 0 && this.formSubmitted) { - $(this.currentForm).triggerHandler("invalid-form", [this]); - } - }, - - previousValue: function(element) { - return $.data(element, "previousValue") || $.data(element, "previousValue", previous = { - old: null, - valid: true, - message: this.defaultMessage( element, "remote" ) - }); - } - - }, - - classRuleSettings: { - required: {required: true}, - email: {email: true}, - url: {url: true}, - date: {date: true}, - dateISO: {dateISO: true}, - dateDE: {dateDE: true}, - number: {number: true}, - numberDE: {numberDE: true}, - digits: {digits: true}, - creditcard: {creditcard: true} - }, - - addClassRules: function(className, rules) { - className.constructor == String ? - this.classRuleSettings[className] = rules : - $.extend(this.classRuleSettings, className); - }, - - classRules: function(element) { - var rules = {}; - var classes = $(element).attr('class'); - classes && $.each(classes.split(' '), function() { - if (this in $.validator.classRuleSettings) { - $.extend(rules, $.validator.classRuleSettings[this]); - } - }); - return rules; - }, - - attributeRules: function(element) { - var rules = {}; - var $element = $(element); - - for (method in $.validator.methods) { - var value = $element.attr(method); - if (value) { - rules[method] = value; - } - } - - // maxlength may be returned as -1, 2147483647 (IE) and 524288 (safari) for text inputs - if (rules.maxlength && /-1|2147483647|524288/.test(rules.maxlength)) { - delete rules.maxlength; - } - - return rules; - }, - - metadataRules: function(element) { - if (!$.metadata) return {}; - - var meta = $.data(element.form, 'validator').settings.meta; - return meta ? - $(element).metadata()[meta] : - $(element).metadata(); - }, - - staticRules: function(element) { - var rules = {}; - var validator = $.data(element.form, 'validator'); - if (validator.settings.rules) { - rules = $.validator.normalizeRule(validator.settings.rules[element.name]) || {}; - } - return rules; - }, - - normalizeRules: function(rules, element) { - // handle dependency check - $.each(rules, function(prop, val) { - // ignore rule when param is explicitly false, eg. required:false - if (val === false) { - delete rules[prop]; - return; - } - if (val.param || val.depends) { - var keepRule = true; - switch (typeof val.depends) { - case "string": - keepRule = !!$(val.depends, element.form).length; - break; - case "function": - keepRule = val.depends.call(element, element); - break; - } - if (keepRule) { - rules[prop] = val.param !== undefined ? val.param : true; - } else { - delete rules[prop]; - } - } - }); - - // evaluate parameters - $.each(rules, function(rule, parameter) { - rules[rule] = $.isFunction(parameter) ? parameter(element) : parameter; - }); - - // clean number parameters - $.each(['minlength', 'maxlength', 'min', 'max'], function() { - if (rules[this]) { - rules[this] = Number(rules[this]); - } - }); - $.each(['rangelength', 'range'], function() { - if (rules[this]) { - rules[this] = [Number(rules[this][0]), Number(rules[this][1])]; - } - }); - - if ($.validator.autoCreateRanges) { - // auto-create ranges - if (rules.min && rules.max) { - rules.range = [rules.min, rules.max]; - delete rules.min; - delete rules.max; - } - if (rules.minlength && rules.maxlength) { - rules.rangelength = [rules.minlength, rules.maxlength]; - delete rules.minlength; - delete rules.maxlength; - } - } - - // To support custom messages in metadata ignore rule methods titled "messages" - if (rules.messages) { - delete rules.messages - } - - return rules; - }, - - // Converts a simple string to a {string: true} rule, e.g., "required" to {required:true} - normalizeRule: function(data) { - if( typeof data == "string" ) { - var transformed = {}; - $.each(data.split(/\s/), function() { - transformed[this] = true; - }); - data = transformed; - } - return data; - }, - - // http://docs.jquery.com/Plugins/Validation/Validator/addMethod - addMethod: function(name, method, message) { - $.validator.methods[name] = method; - $.validator.messages[name] = message || $.validator.messages[name]; - if (method.length < 3) { - $.validator.addClassRules(name, $.validator.normalizeRule(name)); - } - }, - - methods: { - - // http://docs.jquery.com/Plugins/Validation/Methods/required - required: function(value, element, param) { - // check if dependency is met - if ( !this.depend(param, element) ) - return "dependency-mismatch"; - switch( element.nodeName.toLowerCase() ) { - case 'select': - var options = $("option:selected", element); - return options.length > 0 && ( element.type == "select-multiple" || ($.browser.msie && !(options[0].attributes['value'].specified) ? options[0].text : options[0].value).length > 0); - case 'input': - if ( this.checkable(element) ) - return this.getLength(value, element) > 0; - default: - return $.trim(value).length > 0; - } - }, - - // http://docs.jquery.com/Plugins/Validation/Methods/remote - remote: function(value, element, param) { - if ( this.optional(element) ) - return "dependency-mismatch"; - - var previous = this.previousValue(element); - - if (!this.settings.messages[element.name] ) - this.settings.messages[element.name] = {}; - this.settings.messages[element.name].remote = typeof previous.message == "function" ? previous.message(value) : previous.message; - - param = typeof param == "string" && {url:param} || param; - - if ( previous.old !== value ) { - previous.old = value; - var validator = this; - this.startRequest(element); - var data = {}; - data[element.name] = value; - $.ajax($.extend(true, { - url: param, - mode: "abort", - port: "validate" + element.name, - dataType: "json", - data: data, - success: function(response) { - var valid = response === true; - if ( valid ) { - var submitted = validator.formSubmitted; - validator.prepareElement(element); - validator.formSubmitted = submitted; - validator.successList.push(element); - validator.showErrors(); - } else { - var errors = {}; - errors[element.name] = previous.message = response || validator.defaultMessage( element, "remote" ); - validator.showErrors(errors); - } - previous.valid = valid; - validator.stopRequest(element, valid); - } - }, param)); - return "pending"; - } else if( this.pending[element.name] ) { - return "pending"; - } - return previous.valid; - }, - - // http://docs.jquery.com/Plugins/Validation/Methods/minlength - minlength: function(value, element, param) { - return this.optional(element) || this.getLength($.trim(value), element) >= param; - }, - - // http://docs.jquery.com/Plugins/Validation/Methods/maxlength - maxlength: function(value, element, param) { - return this.optional(element) || this.getLength($.trim(value), element) <= param; - }, - - // http://docs.jquery.com/Plugins/Validation/Methods/rangelength - rangelength: function(value, element, param) { - var length = this.getLength($.trim(value), element); - return this.optional(element) || ( length >= param[0] && length <= param[1] ); - }, - - // http://docs.jquery.com/Plugins/Validation/Methods/min - min: function( value, element, param ) { - return this.optional(element) || value >= param; - }, - - // http://docs.jquery.com/Plugins/Validation/Methods/max - max: function( value, element, param ) { - return this.optional(element) || value <= param; - }, - - // http://docs.jquery.com/Plugins/Validation/Methods/range - range: function( value, element, param ) { - return this.optional(element) || ( value >= param[0] && value <= param[1] ); - }, - - // http://docs.jquery.com/Plugins/Validation/Methods/email - email: function(value, element) { - // contributed by Scott Gonzalez: http://projects.scottsplayground.com/email_address_validation/ - return this.optional(element) || /^((([a-z]|\d|[!#\$%&'\*\+\-\/=\?\^_`{\|}~]|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])+(\.([a-z]|\d|[!#\$%&'\*\+\-\/=\?\^_`{\|}~]|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])+)*)|((\x22)((((\x20|\x09)*(\x0d\x0a))?(\x20|\x09)+)?(([\x01-\x08\x0b\x0c\x0e-\x1f\x7f]|\x21|[\x23-\x5b]|[\x5d-\x7e]|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])|(\\([\x01-\x09\x0b\x0c\x0d-\x7f]|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF]))))*(((\x20|\x09)*(\x0d\x0a))?(\x20|\x09)+)?(\x22)))@((([a-z]|\d|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])|(([a-z]|\d|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])([a-z]|\d|-|\.|_|~|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])*([a-z]|\d|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])))\.)+(([a-z]|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])|(([a-z]|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])([a-z]|\d|-|\.|_|~|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])*([a-z]|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])))\.?$/i.test(value); - }, - - // http://docs.jquery.com/Plugins/Validation/Methods/url - url: function(value, element) { - // contributed by Scott Gonzalez: http://projects.scottsplayground.com/iri/ - return this.optional(element) || /^(https?|ftp):\/\/(((([a-z]|\d|-|\.|_|~|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])|(%[\da-f]{2})|[!\$&'\(\)\*\+,;=]|:)*@)?(((\d|[1-9]\d|1\d\d|2[0-4]\d|25[0-5])\.(\d|[1-9]\d|1\d\d|2[0-4]\d|25[0-5])\.(\d|[1-9]\d|1\d\d|2[0-4]\d|25[0-5])\.(\d|[1-9]\d|1\d\d|2[0-4]\d|25[0-5]))|((([a-z]|\d|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])|(([a-z]|\d|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])([a-z]|\d|-|\.|_|~|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])*([a-z]|\d|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])))\.)+(([a-z]|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])|(([a-z]|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])([a-z]|\d|-|\.|_|~|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])*([a-z]|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])))\.?)(:\d*)?)(\/((([a-z]|\d|-|\.|_|~|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])|(%[\da-f]{2})|[!\$&'\(\)\*\+,;=]|:|@)+(\/(([a-z]|\d|-|\.|_|~|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])|(%[\da-f]{2})|[!\$&'\(\)\*\+,;=]|:|@)*)*)?)?(\?((([a-z]|\d|-|\.|_|~|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])|(%[\da-f]{2})|[!\$&'\(\)\*\+,;=]|:|@)|[\uE000-\uF8FF]|\/|\?)*)?(\#((([a-z]|\d|-|\.|_|~|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])|(%[\da-f]{2})|[!\$&'\(\)\*\+,;=]|:|@)|\/|\?)*)?$/i.test(value); - }, - - // http://docs.jquery.com/Plugins/Validation/Methods/date - date: function(value, element) { - return this.optional(element) || !/Invalid|NaN/.test(new Date(value)); - }, - - // http://docs.jquery.com/Plugins/Validation/Methods/dateISO - dateISO: function(value, element) { - return this.optional(element) || /^\d{4}[\/-]\d{1,2}[\/-]\d{1,2}$/.test(value); - }, - - // http://docs.jquery.com/Plugins/Validation/Methods/dateDE - dateDE: function(value, element) { - return this.optional(element) || /^\d\d?\.\d\d?\.\d\d\d?\d?$/.test(value); - }, - - // http://docs.jquery.com/Plugins/Validation/Methods/number - number: function(value, element) { - return this.optional(element) || /^-?(?:\d+|\d{1,3}(?:,\d{3})+)(?:\.\d+)?$/.test(value); - }, - - // http://docs.jquery.com/Plugins/Validation/Methods/numberDE - numberDE: function(value, element) { - return this.optional(element) || /^-?(?:\d+|\d{1,3}(?:\.\d{3})+)(?:,\d+)?$/.test(value); - }, - - // http://docs.jquery.com/Plugins/Validation/Methods/digits - digits: function(value, element) { - return this.optional(element) || /^\d+$/.test(value); - }, - - // http://docs.jquery.com/Plugins/Validation/Methods/creditcard - // based on http://en.wikipedia.org/wiki/Luhn - creditcard: function(value, element) { - if ( this.optional(element) ) - return "dependency-mismatch"; - // accept only digits and dashes - if (/[^0-9-]+/.test(value)) - return false; - var nCheck = 0, - nDigit = 0, - bEven = false; - - value = value.replace(/\D/g, ""); - - for (n = value.length - 1; n >= 0; n--) { - var cDigit = value.charAt(n); - var nDigit = parseInt(cDigit, 10); - if (bEven) { - if ((nDigit *= 2) > 9) - nDigit -= 9; - } - nCheck += nDigit; - bEven = !bEven; - } - - return (nCheck % 10) == 0; - }, - - // http://docs.jquery.com/Plugins/Validation/Methods/accept - accept: function(value, element, param) { - param = typeof param == "string" ? param.replace(/,/g, '|') : "png|jpe?g|gif"; - return this.optional(element) || value.match(new RegExp(".(" + param + ")$", "i")); - }, - - // http://docs.jquery.com/Plugins/Validation/Methods/equalTo - equalTo: function(value, element, param) { - return value == $(param).val(); - } - - } - -}); - -// deprecated, use $.validator.format instead -$.format = $.validator.format; - -})(jQuery); - -// ajax mode: abort -// usage: $.ajax({ mode: "abort"[, port: "uniqueport"]}); -// if mode:"abort" is used, the previous request on that port (port can be undefined) is aborted via XMLHttpRequest.abort() -;(function($) { - var ajax = $.ajax; - var pendingRequests = {}; - $.ajax = function(settings) { - // create settings for compatibility with ajaxSetup - settings = $.extend(settings, $.extend({}, $.ajaxSettings, settings)); - var port = settings.port; - if (settings.mode == "abort") { - if ( pendingRequests[port] ) { - pendingRequests[port].abort(); - } - return (pendingRequests[port] = ajax.apply(this, arguments)); - } - return ajax.apply(this, arguments); - }; -})(jQuery); - -// provides cross-browser focusin and focusout events -// IE has native support, in other browsers, use event caputuring (neither bubbles) - -// provides delegate(type: String, delegate: Selector, handler: Callback) plugin for easier event delegation -// handler is only called when $(event.target).is(delegate), in the scope of the jquery-object for event.target - -// provides triggerEvent(type: String, target: Element) to trigger delegated events -;(function($) { - $.each({ - focus: 'focusin', - blur: 'focusout' - }, function( original, fix ){ - $.event.special[fix] = { - setup:function() { - if ( $.browser.msie ) return false; - this.addEventListener( original, $.event.special[fix].handler, true ); - }, - teardown:function() { - if ( $.browser.msie ) return false; - this.removeEventListener( original, - $.event.special[fix].handler, true ); - }, - handler: function(e) { - arguments[0] = $.event.fix(e); - arguments[0].type = fix; - return $.event.handle.apply(this, arguments); - } - }; - }); - $.extend($.fn, { - delegate: function(type, delegate, handler) { - return this.bind(type, function(event) { - var target = $(event.target); - if (target.is(delegate)) { - return handler.apply(target, arguments); - } - }); - }, - triggerEvent: function(type, target) { - return this.triggerHandler(type, [$.event.fix({ type: type, target: target })]); - } - }) -})(jQuery); diff -r 7c994c98d1df -r ae8593287883 web/ldt_utils/media/js/login_ajax/jquery.login.js --- a/web/ldt_utils/media/js/login_ajax/jquery.login.js Tue Jun 08 15:31:42 2010 +0200 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,77 +0,0 @@ -$(document).ready(function() { - $('#password').keypress(function(e) { - if(e.which == 13) { - jQuery('#submit').focus().click(); - } - }); - - - $("#submit").click(function() { - var username=$("#username").val(); - var password=$("#password").val(); - var data = {'username': username, 'password': password, 'reload': reload}; - if(username=="" && password=="") - { - $("#login_form_username_error").show(); - $("#login_form_password_error").show(); - $("#username").addClass("ajaxform_invalid"); - $("#password").addClass("ajaxform_invalid"); - } - else if(username=="" && password!="") - { - $("#login_form_username_error").show(); - $("#username").addClass("ajaxform_invalid"); - } - else if(password=="" && username!="") - { - $("#login_form_password_error").show(); - $("#password").addClass("ajaxform_invalid"); - } - else{ - - $.ajax({ - type: "POST", - url : url_login_ajax, - dataType:'json', - data: data, - error: function (){ - $("#msg").html("fail to connect"); - }, - success: function(data, reload){ //if success, refrash un bout de page pour afficher le nom de utilisateur et déconnecter. - if (data.message!="successful") - { - $("#msg").html(data.message).show(); - } - else{ - // $("#floatdialog_mask_loginform").hide(); - //window.location.reload(); - if (data.reload=='true'){ - window.location.reload(); - } - else{ - //$("#loginstate").html(''+data.username+' | déconnection'); - //$("#loginstate").html(''); - var $DOMWindowOverlay = $('#DOMWindowOverlay'); - var $DOMWindow = $('#DOMWindow'); - $DOMWindowOverlay.fadeOut('fast',function(){ - $DOMWindowOverlay.trigger('unload').unbind().remove(); - }); - $DOMWindow.fadeOut('fast',function(){ - if($.fn.draggable){ - $DOMWindow.draggable("destroy").trigger("unload").remove(); - }else{ - $DOMWindow.trigger("unload").remove(); - } - }); - $("#loginstate").html(data.html); - } - } - - - } - }); - } - }); -}) - - diff -r 7c994c98d1df -r ae8593287883 web/ldt_utils/media/js/login_ajax/login_ajax.css --- a/web/ldt_utils/media/js/login_ajax/login_ajax.css Tue Jun 08 15:31:42 2010 +0200 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,75 +0,0 @@ -#loginform -{ - font-size: 16px; - background: #ffffff scroll repeat 0 0; - /*border: 2px solid #666666;*/ - text-align: left; - /*width: 400px;*/ -} - -#loginform .title -{ - color: #FFFFFF; - background: #990000 scroll repeat left top; - font-weight:bold; - height:34px; - position: relative; - line-height: 34px; - overflow: hidden; - text-transform: uppercase; -} - -#loginform .title div -{ - font-size: 16px; - margin-left:12px; -} - -#loginform .title .closeDOMWindow -{ - float: right; - text-decoration: none; - color:#ffffff; - padding-right:2px; -} - -#loginform .ajaxform_invalid{ - background: #ffdddd none repeat scroll 0 0; -} - -#loginform .ajaxform_error{ - display: none; - color:red; - font-size: 11px; - line-height: 13px; -} - -#loginform #msg{ - display:none; - background:#FBE3E4 none repeat scroll 0 0; - color: red; - padding:0.5em; - border-color:#FBC2C4; - font-size: 13px; - font-weight:bold; -} - -#loginform dl { - font-size:13px; - line-height:22px; -} - -#loginform dl dt{ - clear:left; - color:#666666; - float:left; - font-weight:bold; - width:100px -} - -#loginform dl dd { - margin-left: 110px; - padding-bottom: 8px; -} - - diff -r 7c994c98d1df -r ae8593287883 web/ldt_utils/media/js/swfobject.js --- a/web/ldt_utils/media/js/swfobject.js Tue Jun 08 15:31:42 2010 +0200 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,5 +0,0 @@ -/* SWFObject v2.1 - Copyright (c) 2007-2008 Geoff Stearns, Michael Williams, and Bobby van der Sluis - This software is released under the MIT License -*/ -var swfobject=function(){var b="undefined",Q="object",n="Shockwave Flash",p="ShockwaveFlash.ShockwaveFlash",P="application/x-shockwave-flash",m="SWFObjectExprInst",j=window,K=document,T=navigator,o=[],N=[],i=[],d=[],J,Z=null,M=null,l=null,e=false,A=false;var h=function(){var v=typeof K.getElementById!=b&&typeof K.getElementsByTagName!=b&&typeof K.createElement!=b,AC=[0,0,0],x=null;if(typeof T.plugins!=b&&typeof T.plugins[n]==Q){x=T.plugins[n].description;if(x&&!(typeof T.mimeTypes!=b&&T.mimeTypes[P]&&!T.mimeTypes[P].enabledPlugin)){x=x.replace(/^.*\s+(\S+\s+\S+$)/,"$1");AC[0]=parseInt(x.replace(/^(.*)\..*$/,"$1"),10);AC[1]=parseInt(x.replace(/^.*\.(.*)\s.*$/,"$1"),10);AC[2]=/r/.test(x)?parseInt(x.replace(/^.*r(.*)$/,"$1"),10):0}}else{if(typeof j.ActiveXObject!=b){var y=null,AB=false;try{y=new ActiveXObject(p+".7")}catch(t){try{y=new ActiveXObject(p+".6");AC=[6,0,21];y.AllowScriptAccess="always"}catch(t){if(AC[0]==6){AB=true}}if(!AB){try{y=new ActiveXObject(p)}catch(t){}}}if(!AB&&y){try{x=y.GetVariable("$version");if(x){x=x.split(" ")[1].split(",");AC=[parseInt(x[0],10),parseInt(x[1],10),parseInt(x[2],10)]}}catch(t){}}}}var AD=T.userAgent.toLowerCase(),r=T.platform.toLowerCase(),AA=/webkit/.test(AD)?parseFloat(AD.replace(/^.*webkit\/(\d+(\.\d+)?).*$/,"$1")):false,q=false,z=r?/win/.test(r):/win/.test(AD),w=r?/mac/.test(r):/mac/.test(AD);/*@cc_on q=true;@if(@_win32)z=true;@elif(@_mac)w=true;@end@*/return{w3cdom:v,pv:AC,webkit:AA,ie:q,win:z,mac:w}}();var L=function(){if(!h.w3cdom){return }f(H);if(h.ie&&h.win){try{K.write(" -{% endif %} - - -{% if add %} - -{% endif %} - - -{% endblock %} - -{% block content_title %} - {% if moderation_delete_request %} -

    {% trans "Approve page deletion" %}

    - - {% else %} - -

    {{ title }} - {% if CMS_MODERATOR %} - {% if moderation_required %}{% blocktrans %}(requires approvement at {{ moderation_level }} level){% endblocktrans %} - {% else %}{% trans '(you can perform actions on this page directly)' %} - {% endif %} - {% endif %} -

    - {% endif %} - -{% endblock %} - -{% block content %}
    - -{% block object-tools %} -{% if change %}{% if not is_popup %} - -{% endif %}{% endif %} -{% endblock %} - - -
    {% block form_top %}{% endblock %} -{{ adminForm.fields.parent }} - - - -{% if show_language_tabs %} -
    - {% for lang_code, lang_name in traduction_language %} - - {% endfor %} -
    -{% endif %} - - -
    -{% if show_language_tabs %} -

    -{% endif %} -{% if is_popup %}{% endif %} -{% if save_on_top %}{% submit_row %}{% endif %} -{% if errors %} -

    - {% blocktrans count errors|length as counter %}Please correct the error below.{% plural %}Please correct the errors below.{% endblocktrans %} -

    -
      {% for error in adminform.form.non_field_errors %}
    • {{ error }}
    • {% endfor %}
    -{% endif %} - -{% for fieldset in adminform %} - {% include "admin/cms/page/includes/fieldset.html" %} -{% endfor %} - - -{% for inline_admin_formset in inline_admin_formsets %} - {% include inline_admin_formset.opts.template %} -{% endfor %} - - -{% if not add %} - {% if CMS_PERMISSION and has_change_permissions_permission %} -
    - -
    - {% endif %} - - {% if CMS_MODERATOR and has_moderate_permission %} -
    - -
    - {% endif %} - - {% if moderation_delete_request %}{% endif %} - - {% if CMS_MODERATOR and moderation_required %} -
    -

    {% blocktrans %}This page must be moderated at level {{ moderation_level }}, post a message for moderator.{% endblocktrans %}

    -
    -
    -
    - - - {% endif %} - -{% endif %} - -{% block after_related_objects %}{% endblock %} - -{% if add %} -
    - - -
    -{% else %} - {% if not moderation_delete_request %}{% submit_row %}{% endif %} -{% endif %} - -{% if add %} - -{% endif %} - -{# JavaScript for prepopulated fields #} -{% prepopulated_fields_js %} - -
    -
    -{% endblock %} diff -r 7c994c98d1df -r ae8593287883 web/ldt_utils/templates/admin/cms_change_list.html --- a/web/ldt_utils/templates/admin/cms_change_list.html Tue Jun 08 15:31:42 2010 +0200 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,125 +0,0 @@ -{% extends "admin/page_change_list.html" %} -{% load adminmedia admin_list i18n cms_admin js %} -{% block bodyclass %}change-list{% endblock %} - -{% if not is_popup %}{% block breadcrumbs %} - -{% endblock %}{% endif %} - -{% block coltype %}flex{% endblock %} -{% block extrahead %}{{ block.super }} - - - - - - - - - - - - - - - - - - -{% if cl.is_filtered %} - -{% endif %} -{% endblock %} - -{% block content %} - - - -
    - -{% block object-tools %} - - - - {% include "admin/cms/page/loading.html" %} - -{% endblock %} -
    -{% block search %} - - -{% if cl.has_access_to_multiple_sites %} -
    {% trans "Pages on:" %} - -
    -{% else %} - -{% endif %} - -{% search_form cl %} -{% endblock %} -{% block date_hierarchy %}{% date_hierarchy cl %}{% endblock %} - -{% block filters %} -{% if cl.has_filters %} - - -Filter: {% if cl.is_filtered %}{% trans "on" %}{% else %}{% trans "off" %}{% endif %} - -{% endif %} -{% endblock %} - -{% include "admin/cms/page/change_list_tree.html" %} - -
    -
    - -
    - -{% endblock %} diff -r 7c994c98d1df -r ae8593287883 web/ldt_utils/templates/admin/index.html --- a/web/ldt_utils/templates/admin/index.html Tue Jun 08 15:31:42 2010 +0200 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,99 +0,0 @@ -{% extends "admin/base_site.html" %} -{% load i18n %} - -{% block extrastyle %}{{ block.super }}{% endblock %} - -{% block coltype %}colMS{% endblock %} - -{% block bodyclass %}dashboard{% endblock %} - -{% block breadcrumbs %}{% endblock %} - -{% block content %} -
    - -{% if app_list %} - {% for app in app_list %} -
    - - - {% for model in app.models %} - - {% if model.perms.change %} - - {% else %} - - {% endif %} - - {% if model.perms.add %} - - {% else %} - - {% endif %} - - {% if model.perms.change %} - - {% else %} - - {% endif %} - - {% endfor %} -
    {% blocktrans with app.name as name %}{{ name }}{% endblocktrans %}
    {{ model.name }}{{ model.name }}{% trans 'Add' %} {% trans 'Change' %} 
    -
    - {% endfor %} -
    - - - - - - - - - - -
    Import
    - Import an ldt -   -
    - Reindex -   -
    -
    -{% else %} -

    {% trans "You don't have permission to edit anything." %}

    -{% endif %} -
    -{% endblock %} - -{% block sidebar %} - -{% endblock %} diff -r 7c994c98d1df -r ae8593287883 web/ldt_utils/templates/admin/page_app_index.html --- a/web/ldt_utils/templates/admin/page_app_index.html Tue Jun 08 15:31:42 2010 +0200 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,15 +0,0 @@ -{% extends "admin/page_index.html" %} -{% load i18n %} - -{% if not is_popup %} - -{% block breadcrumbs %} -{% endblock %} - -{% endif %} - -{% block sidebar %}{% endblock %} \ No newline at end of file diff -r 7c994c98d1df -r ae8593287883 web/ldt_utils/templates/admin/page_base.html --- a/web/ldt_utils/templates/admin/page_base.html Tue Jun 08 15:31:42 2010 +0200 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,45 +0,0 @@ -{% extends "base.html" %} -{% load i18n %} - -{% block css_import %} -{{ block.super }} - - {% if LANGUAGE_BIDI %}{% endif %} -{% endblock %} - - - - - {% block header %}{{block.super}} - {% block nav-global %}{% endblock %} - {% endblock %} - - {% block breadcrumb %} -
  • -
  • {% trans "Space" %}
  • -
  • {% trans "Pages" %}
  • - {% endblock %} - - - {% if messages %} -
      {% for message in messages %}
    • {{ message }}
    • {% endfor %}
    - {% endif %} - - {% block content_title %}{% if title %}{{ title }}{% endif %}{% endblock %} - - - {% block content_admin %} -
    - {% block pretitle %}{% endblock %} - {% block content %} - {% block object-tools %}{% endblock %} - {{ content }} - {% endblock %} - {% block sidebar %}{% endblock %} -
    -
    - {% endblock %} - - - - diff -r 7c994c98d1df -r ae8593287883 web/ldt_utils/templates/admin/page_base_site.html --- a/web/ldt_utils/templates/admin/page_base_site.html Tue Jun 08 15:31:42 2010 +0200 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,10 +0,0 @@ -{% extends "admin/page_base.html" %} -{% load i18n %} - -{% block title %}Django Administration{% endblock %} - -{% block branding %} -

    {% trans 'Django administration' %}

    -{% endblock %} - -{% block nav-global %}{% endblock %} diff -r 7c994c98d1df -r ae8593287883 web/ldt_utils/templates/admin/page_change_form.html --- a/web/ldt_utils/templates/admin/page_change_form.html Tue Jun 08 15:31:42 2010 +0200 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,66 +0,0 @@ -{% extends "admin/page_base_site.html" %} -{% load i18n admin_modify adminmedia %} - -{% block extrahead %}{{ block.super }} - -{{ media }} -{% endblock %} - -{% block extrastyle %}{{ block.super }}{% endblock %} - -{% block coltype %}{% if ordered_objects %}colMS{% else %}colM{% endif %}{% endblock %} - -{% block bodyclass %}{{ opts.app_label }}-{{ opts.object_name.lower }} change-form{% endblock %} - -{% block breadcrumbs %}{% if not is_popup %} - -{% endif %}{% endblock %} - -{% block content %}
    -{% block object-tools %} -{% if change %}{% if not is_popup %} - -{% endif %}{% endif %} -{% endblock %} -
    {% block form_top %}{% endblock %} -
    -{% if is_popup %}{% endif %} -{% if save_on_top %}{% submit_row %}{% endif %} -{% if errors %} -

    - {% blocktrans count errors|length as counter %}Please correct the error below.{% plural %}Please correct the errors below.{% endblocktrans %} -

    -
      {% for error in adminform.form.non_field_errors %}
    • {{ error }}
    • {% endfor %}
    -{% endif %} - -{% for fieldset in adminform %} - {% include "admin/includes/fieldset.html" %} -{% endfor %} - -{% block after_field_sets %}{% endblock %} - -{% for inline_admin_formset in inline_admin_formsets %} - {% include inline_admin_formset.opts.template %} -{% endfor %} - -{% block after_related_objects %}{% endblock %} - -{% submit_row %} - -{% if adminform and add %} - -{% endif %} - -{# JavaScript for prepopulated fields #} -{% prepopulated_fields_js %} - -
    -
    -{% endblock %} diff -r 7c994c98d1df -r ae8593287883 web/ldt_utils/templates/admin/page_change_list.html --- a/web/ldt_utils/templates/admin/page_change_list.html Tue Jun 08 15:31:42 2010 +0200 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,85 +0,0 @@ -{% extends "admin/page_base_site.html" %} -{% load adminmedia admin_list i18n %} - -{% block extrastyle %} - {{ block.super }} - - {% if cl.formset %} - - - {% endif %} - {{ media }} - {% if not actions_on_top and not actions_on_bottom %} - - {% endif %} -{% endblock %} - -{% block bodyclass %}change-list{% endblock %} - -{% if not is_popup %} - {% block breadcrumbs %} - - {% endblock %} -{% endif %} - -{% block coltype %}flex{% endblock %} - -{% block content %} -
    - {% block object-tools %} - {% if has_add_permission %} - - {% endif %} - {% endblock %} - {% if cl.formset.errors %} -

    - {% blocktrans count cl.formset.errors|length as counter %}Please correct the error below.{% plural %}Please correct the errors below.{% endblocktrans %} -

    -
      {% for error in cl.formset.non_field_errors %}
    • {{ error }}
    • {% endfor %}
    - {% endif %} -
    - {% block search %}{% search_form cl %}{% endblock %} - {% block date_hierarchy %}{% date_hierarchy cl %}{% endblock %} - - {% block filters %} - {% if cl.has_filters %} -
    -

    {% trans 'Filter' %}

    - {% for spec in cl.filter_specs %}{% admin_list_filter cl spec %}{% endfor %} -
    - {% endif %} - {% endblock %} - -
    - {% if cl.formset %} - {{ cl.formset.management_form }} - {% endif %} - - {% block result_list %} - {% if action_form and actions_on_top and cl.full_result_count %}{% admin_actions %}{% endif %} - {% result_list cl %} - {% if action_form and actions_on_bottom and cl.full_result_count %}{% admin_actions %}{% endif %} - {% endblock %} - {% block pagination %}{% pagination cl %}{% endblock %} -
    -
    -
    -{% endblock %} diff -r 7c994c98d1df -r ae8593287883 web/ldt_utils/templates/admin/page_index.html --- a/web/ldt_utils/templates/admin/page_index.html Tue Jun 08 15:31:42 2010 +0200 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,80 +0,0 @@ -{% extends "admin/page_base_site.html" %} -{% load i18n %} - -{% block extrastyle %}{{ block.super }}{% endblock %} - -{% block coltype %}colMS{% endblock %} - -{% block bodyclass %}dashboard{% endblock %} - -{% block breadcrumbs %}{% endblock %} -{% block content_title %}{% trans "Pages" %}{% endblock %} -{% block content %} -
    - -{% if app_list %} - {% for app in app_list %} -
    - - - {% for model in app.models %} - - {% if model.perms.change %} - - {% else %} - - {% endif %} - - {% if model.perms.add %} - - {% else %} - - {% endif %} - - {% if model.perms.change %} - - {% else %} - - {% endif %} - - {% endfor %} -
    {% blocktrans with app.name as name %}{{ name }}{% endblocktrans %}
    {{ model.name }}{{ model.name }}{% trans 'Add' %} {% trans 'Change' %} 
    -
    - {% endfor %} -{% else %} -

    {% trans "You don't have permission to edit anything." %}

    -{% endif %} -
    -{% endblock %} - -{% block sidebar %} - -{% endblock %} diff -r 7c994c98d1df -r ae8593287883 web/ldt_utils/templates/admin/page_login.html --- a/web/ldt_utils/templates/admin/page_login.html Tue Jun 08 15:31:42 2010 +0200 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,41 +0,0 @@ -{% extends "admin/page_base_site.html" %} -{% load i18n %} - -{% block extrastyle %}{% load adminmedia %}{{ block.super }}{% endblock %} - -{% block bodyclass %}{% endblock %} - -{% block content_title %}{% trans "Connexion" %}{% endblock %} - -{% block breadcrumbs %}{% endblock %} - -{% block content %} -{% if error_message %} -

    {{ error_message }}

    -{% endif %} -
    -
    - - - - - - - - - - - - - - -
    {% trans "Create an account" %} - {% trans "Forget password?" %} -
    -
    - - -
    -{% endblock %} diff -r 7c994c98d1df -r ae8593287883 web/ldt_utils/templates/admin/show_menu.html --- a/web/ldt_utils/templates/admin/show_menu.html Tue Jun 08 15:31:42 2010 +0200 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,4 +0,0 @@ -{% load cms_tags %} -{% load i18n %} - -{% show_menu 0 100 100 100 %} \ No newline at end of file diff -r 7c994c98d1df -r ae8593287883 web/ldt_utils/templates/cms/admin/cms/page/change_form.html --- a/web/ldt_utils/templates/cms/admin/cms/page/change_form.html Tue Jun 08 15:31:42 2010 +0200 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,62 +0,0 @@ -{% extends "admin/base_site.html" %} -{% load i18n admin_modify adminmedia cms_admin %} -{% block extrahead %}{{ block.super }} - -{% for js in javascript_imports %}{% include_admin_script js %}{% endfor %} -{% endblock %} -{% block stylesheet %}{% admin_media_prefix %}css/forms.css" /> -{% trans 'Documentation' %} / {% trans 'Change password' %} / {% trans 'Log out' %}{% endblock %} -{% block breadcrumbs %}{% endblock %} -{% block content %}
    -{% block object-tools %} -{% if change %}{% endif %} -{% endblock %} -
    {% block form_top %}{% endblock %} -
    -{% if is_popup %}{% endif %} - -{% if opts.admin.save_on_top %}{% submit_row %}{% endif %} -{% if form.error_dict %} -

    - {% blocktrans count form.error_dict.items|length as counter %}Please correct the error below.{% plural %}Please correct the errors below.{% endblocktrans %} -

    -{% endif %} -{% for bound_field_set in bound_field_sets %} -
    - {% if bound_field_set.name %}

    {{ bound_field_set.name }}

    {% endif %} - {% if bound_field_set.description %}
    {{ bound_field_set.description }}
    {% endif %} - {% for bound_field_line in bound_field_set %} - {% admin_field_line bound_field_line %} - {% for bound_field in bound_field_line %} - {% filter_interface_script_maybe bound_field %} - {% endfor %} - {% endfor %} -
    -{% endfor %} -{% block after_field_sets %}{% endblock %} -{% if change %} - {% if ordered_objects %} -

    {% trans "Ordering" %}

    -
    - {% if form.order_.errors %}{{ form.order_.html_error_list }}{% endif %} -

    {{ form.order_ }}

    -
    - {% endif %} -{% endif %} -{% for related_object in inline_related_objects %}{% cms_edit_inline related_object %}{% endfor %} -{% block after_related_objects %}{% endblock %} -{% submit_row %} -{% if add %} - -{% endif %} -{% if auto_populated_fields %} - -{% endif %} -
    -
    -{% endblock %} diff -r 7c994c98d1df -r ae8593287883 web/ldt_utils/templatetags/__init__.py diff -r 7c994c98d1df -r ae8593287883 web/ldt_utils/templatetags/iriusermedia.py --- a/web/ldt_utils/templatetags/iriusermedia.py Tue Jun 08 15:31:42 2010 +0200 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,14 +0,0 @@ -from django.template import Library - -register = Library() - -def ldt_media_prefix(): - """ - Returns the string contained in the setting LDT_MEDIA_PREFIX. - """ - try: - from django.conf import settings - except ImportError: - return '' - return settings.LDT_MEDIA_PREFIX -ldt_media_prefix = register.simple_tag(ldt_media_prefix) diff -r 7c994c98d1df -r ae8593287883 web/ldt_utils/user/__init__.py diff -r 7c994c98d1df -r ae8593287883 web/ldt_utils/user/admin.py --- a/web/ldt_utils/user/admin.py Tue Jun 08 15:31:42 2010 +0200 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,42 +0,0 @@ -from django.contrib import admin -from django.contrib.auth.admin import UserAdmin, GroupAdmin -from django.utils.translation import ugettext as _ -from ldt import settings -from copy import deepcopy -from forms import ldtForm, IriGroupForm -from models import ldt, IriGroup - - -class ldtAdmin(UserAdmin): - list_display = ('username', 'email', 'first_name', 'last_name') - - fieldsets = [ - (None, {'fields': ('username', ('password1', 'password2'))}), - (_('User details'), {'fields': (('first_name', 'last_name'), 'email')}), - (_('Groups'), {'fields': ('groups',)}), - (_('Permissions'), {'fields': ('is_staff', 'user_permissions')}), - ] - form = ldtForm - model = ldt - filter_horizontal = ('user_permissions',) - - def get_fieldsets(self, request, obj=None): - fieldsets = deepcopy(self.fieldsets) - if not '/add' in request.path: - fieldsets[0] = (None, {'fields': ('username',)}) - fieldsets.append((_('Password'), {'fields': ('password1', 'password2'), 'classes': ('collapse',)})) - return fieldsets - - def add_view(self, request): - return super(UserAdmin, self).add_view(request) - -admin.site.unregister(ldt) -admin.site.register(ldt, ldtAdmin) - -class IriGroupAdmin(admin.ModelAdmin): - form = IriGroupForm - model = IriGroup - filter_horizontal = ('permissions',) - -admin.site.unregister(IriGroup) -admin.site.register(IriGroup, IriGroupAdmin) diff -r 7c994c98d1df -r ae8593287883 web/ldt_utils/user/forms.py --- a/web/ldt_utils/user/forms.py Tue Jun 08 15:31:42 2010 +0200 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,98 +0,0 @@ -from django import forms -from django.contrib.auth.models import User, Permission, Group -from django.forms.util import ErrorList -from django.contrib.auth.forms import UserCreationForm -from django.utils.translation import gettext as _ -from models import ldt, IriGroup -from ldt.management import get_content_type_list - - -class ldtForm(UserCreationForm): - - class Meta: - model = ldt - - def __init__(self, data=None, files=None, auto_id='id_%s', prefix=None, - initial=None, error_class=ErrorList, label_suffix=':', - empty_permitted=False, instance=None): - - if instance: - initial = initial or {} - - super(ldtForm, self).__init__(data, files, auto_id, prefix, - initial, error_class, label_suffix, empty_permitted, instance) - - # filtre les permissions necessaires - content_type_list = get_content_type_list() - self.fields['user_permissions'].queryset = Permission.objects.filter(content_type__in = content_type_list) - - if instance: - self.fields['password1'].required = False - self.fields['password1'].label = _('New password') - self.fields['password2'].required = False - self.fields['password2'].label = _('New password confirmation') - - self._password_change = True - - def clean_username(self): - if self.instance: - return self.cleaned_data['username'] - return super(ldtForm, self).clean_username() - - def clean_password2(self): - if self.instance and self.cleaned_data['password1'] == '' and self.cleaned_data['password2'] == '': - self._password_change = False - return u'' - return super(ldtForm, self).clean_password2() - - - def save(self, commit=True): - Super = self._password_change and ldtForm or UserCreationForm - user = super(Super, self).save(commit=False) - # if user.pk != None: - # self.save_m2m() - - if commit: - user.save() - - return user - -class IriGroupForm(forms.ModelForm): - class meta: - model = IriGroup - - def __init__(self, data=None, files=None, auto_id='id_%s', prefix=None, - initial=None, error_class=ErrorList, label_suffix=':', - empty_permitted=False, instance=None): - if instance: - initial = initial or {} - - super(IriGroupForm, self).__init__(data, files, auto_id, prefix, - initial, error_class, label_suffix, empty_permitted, instance) - - # filtre les permissions necessaires - content_type_list = get_content_type_list() - self.fields['permissions'].queryset = Permission.objects.filter(content_type__in = content_type_list) - -class EmailChangeForm(forms.Form): - email1 = forms.EmailField(label=_("E-mail"), max_length=75) - email2 = forms.EmailField(label=_("E-mail"), max_length=75) - - def __init__(self, user=None, *args, **kwargs): - self.user = user - super(EmailChangeForm, self).__init__(*args, **kwargs) - - def clean_email2(self): - email1 = self.cleaned_data.get('email1') - email2 = self.cleaned_data.get('email2') - if email1 and email2: - if email1 != email2: - raise forms.ValidationError(_("The two emails didn't match.")) - return email2 - - - def save(self): - self.user.email=self.cleaned_data['email1'] - self.user.save() - return self.user - diff -r 7c994c98d1df -r ae8593287883 web/ldt_utils/user/models.py --- a/web/ldt_utils/user/models.py Tue Jun 08 15:31:42 2010 +0200 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,42 +0,0 @@ -from django.db import models -from django.contrib.auth.models import User, Group, UserManager -from django.utils.translation import gettext as _ -from django.contrib import admin -import datetime - - -class IriGroup(Group): - description = models.TextField(null=True, blank=True) - - def __unicode__(self): - return self.name - - -class ldt(User): - irigroups = models.ManyToManyField(IriGroup, blank=True) - - class Meta: - verbose_name = 'iri user' - verbose_name_plural = 'iri users' - - def __unicode__(self): - return self.username - - -class ldtManager(UserManager): - def create_user(self, username, email, password=None): - "Creates and saves a User with the given username, e-mail and password." - now = datetime.datetime.now() - user = ldt(None, username, '', '', email.strip().lower(), 'placeholder', False, True, False, now, now) - if password: - user.set_password(password) - else: - user.set_unusable_password() - user.save() - return user - -User.objects = ldtManager() -User.objects.contribute_to_class(User, "objects") - -admin.site.register(ldt) -admin.site.register(IriGroup) diff -r 7c994c98d1df -r ae8593287883 web/ldt_utils/user/templates/iriuser/user/change_email.html --- a/web/ldt_utils/user/templates/iriuser/user/change_email.html Tue Jun 08 15:31:42 2010 +0200 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,51 +0,0 @@ -{% extends "ldt/user/user_base.html" %} -{# form of email address's change #} -{% load i18n %} -{% block breadcrumb %} -
  • -
  • {% trans "Profiles" %}
  • -
  • {% trans "Modification de l'adresse émail" %}
  • -{% endblock %} - -{% block content_title %}{% trans "Modification de l'adresse émail" %}{% endblock %} -{% block js_declaration %}{{ block.super }} - -{% endblock %} -{% block css_import %} -{{ block.super }} - -{% endblock %} - -{% block iricontent %} -

    {% trans "Please enter your new e-mail twice so we can verify you typed it in correctly." %}

    -
    -{% csrf_token %} - - - - - - - - - - - - -
    - - - - {{form.email1.errors}}
    - - - - {{form.email1.errors}}
    -
    -{% endblock%} diff -r 7c994c98d1df -r ae8593287883 web/ldt_utils/user/templates/iriuser/user/change_email_done.html --- a/web/ldt_utils/user/templates/iriuser/user/change_email_done.html Tue Jun 08 15:31:42 2010 +0200 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,14 +0,0 @@ -{% extends "ldt/user/user_base.html" %} -{# if email is changed successfully, retrun this page #} -{% load i18n %} -{% block breadcrumb %} -
  • -
  • {% trans "Profiles" %}
  • -
  • {% trans "email change" %}
  • -{% endblock %} - -{% block content_title %}{% trans "email change" %}{% endblock %} -{% block iricontent %} -

    {% trans "email changed" %}

    -{% trans "back to profile" %} -{% endblock %} diff -r 7c994c98d1df -r ae8593287883 web/ldt_utils/user/templates/iriuser/user/home.html --- a/web/ldt_utils/user/templates/iriuser/user/home.html Tue Jun 08 15:31:42 2010 +0200 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,14 +0,0 @@ -{% extends "base.html" %} -{% load i18n %} - -{% block title %}Home{% endblock %} - -{% block content_base %} - -

    Welcome

    -
  • {% trans "Se connecter" %}
  • -
  • {% trans "Créer un compte" %}
  • -
  • {% trans "récupérer mot de passe" %}
  • - -{% endblock %} - diff -r 7c994c98d1df -r ae8593287883 web/ldt_utils/user/templates/iriuser/user/login_form.html --- a/web/ldt_utils/user/templates/iriuser/user/login_form.html Tue Jun 08 15:31:42 2010 +0200 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,75 +0,0 @@ -{% load i18n %} -{# print user's state and form of login #} -{% block js_import %} -{{block.super}} - - -{% endblock %} -{% block css_import %} -{{block.super}} -{% endblock %} -
    -
    diff -r 7c994c98d1df -r ae8593287883 web/ldt_utils/user/templates/iriuser/user/profile.html --- a/web/ldt_utils/user/templates/iriuser/user/profile.html Tue Jun 08 15:31:42 2010 +0200 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,9 +0,0 @@ -{% extends "ldt/user/user_base.html" %} -{# user's profiles(change password, change email) #} -{% load i18n %} -{% block iricontent %} - -{% endblock %} diff -r 7c994c98d1df -r ae8593287883 web/ldt_utils/user/templates/iriuser/user/space.html --- a/web/ldt_utils/user/templates/iriuser/user/space.html Tue Jun 08 15:31:42 2010 +0200 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,19 +0,0 @@ -{% extends "ldt/user/user_base.html" %} -{# user's space (edit page or project lignes de temps) #} -{% load i18n %} -{% block breadcrumb %} -
  • -
  • {% trans "Space" %}
  • -{% endblock %} - -{% block content_title %}{% trans "Space" %}{% endblock %} -{% block iricontent%} - -{% endblock %} diff -r 7c994c98d1df -r ae8593287883 web/ldt_utils/user/templates/iriuser/user/user_base.html --- a/web/ldt_utils/user/templates/iriuser/user/user_base.html Tue Jun 08 15:31:42 2010 +0200 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,15 +0,0 @@ -{% extends "base.html" %} -{# this page inherit base html, all pages of ldt inherit this page. #} -{# all contents are writed in the "iricontent" block #} -{% load i18n %} -{% block js_import %}{{ block.super }} -{% endblock %} -{% block css_import %}{{ block.super }} -{% endblock%} - - -{% block content %} -
    - {% block iricontent %}{% endblock %} -
    -{% endblock%} diff -r 7c994c98d1df -r ae8593287883 web/ldt_utils/user/templates/registration/activate.html --- a/web/ldt_utils/user/templates/registration/activate.html Tue Jun 08 15:31:42 2010 +0200 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,14 +0,0 @@ -{% extends "registration/base.html" %} -{% load i18n %} - -{% block breadcrumb %} -
  • -
  • {% trans "Activate account" %}
  • -{% endblock %} - -{% block content_title %}{% trans 'Activate account' %}{% endblock %} - -{% block iricontent %} -

    {% trans "You have activated your account" %}

    -{% trans "Go back to login page" %} -{% endblock %} \ No newline at end of file diff -r 7c994c98d1df -r ae8593287883 web/ldt_utils/user/templates/registration/activation_complete.html --- a/web/ldt_utils/user/templates/registration/activation_complete.html Tue Jun 08 15:31:42 2010 +0200 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,8 +0,0 @@ -{% extends "registration/base.html" %} -{% load i18n %} - -{% block content_title %}{% trans 'Sign up successfully' %}{% endblock %} -{% block iricontent %} -

    {% trans "activation completed" %}

    - -{% endblock%} diff -r 7c994c98d1df -r ae8593287883 web/ldt_utils/user/templates/registration/activation_email.txt --- a/web/ldt_utils/user/templates/registration/activation_email.txt Tue Jun 08 15:31:42 2010 +0200 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,4 +0,0 @@ -Pour confirmer que ce compte vous appartient vraiment et afin -d’activer les fonctions, -veuillez suivre ce lien dans votre navigateur dans {{expiration_days}} jours: -http://{{site }}{% url registration.views.activate activation_key %} \ No newline at end of file diff -r 7c994c98d1df -r ae8593287883 web/ldt_utils/user/templates/registration/activation_email_subject.txt --- a/web/ldt_utils/user/templates/registration/activation_email_subject.txt Tue Jun 08 15:31:42 2010 +0200 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,1 +0,0 @@ -Confirmation d’adresse de email pour ldt \ No newline at end of file diff -r 7c994c98d1df -r ae8593287883 web/ldt_utils/user/templates/registration/base.html --- a/web/ldt_utils/user/templates/registration/base.html Tue Jun 08 15:31:42 2010 +0200 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,10 +0,0 @@ -{% extends "ldt/user/user_base.html" %} -{% block js_import %}{{ block.super }} -{% endblock %} -{% block css_import %} -{{ block.super }} - -{% endblock %} -{% block pageclass %}profile{% endblock %} diff -r 7c994c98d1df -r ae8593287883 web/ldt_utils/user/templates/registration/logged_out.html --- a/web/ldt_utils/user/templates/registration/logged_out.html Tue Jun 08 15:31:42 2010 +0200 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,12 +0,0 @@ -{% extends "registration/base.html" %} -{% load i18n %} - -{% trans 'Home' %} - -{% block iricontent %} - -

    {% trans "Thanks for spending some quality time with the Web site today." %}

    - -

    {% trans 'Log in again' %}

    - -{% endblock %} diff -r 7c994c98d1df -r ae8593287883 web/ldt_utils/user/templates/registration/login.html --- a/web/ldt_utils/user/templates/registration/login.html Tue Jun 08 15:31:42 2010 +0200 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,35 +0,0 @@ -{% extends "registration/base.html" %} -{% load i18n %} -{% block js_declaration %}{{ block.super }} - -{% endblock %} - -{% block login %} -{% endblock %} - -{% block content_title %}{% trans 'Log in' %}{% endblock %} -{% block iricontent %} - {% if form.errors %} -

    {% trans "Sorry, that's not a valid username or password." %}

    - {% endif %} - -
    - {% csrf_token %} - -
      - {{form.as_ul}} -
    • -
    -
    - -{% endblock %} - - - diff -r 7c994c98d1df -r ae8593287883 web/ldt_utils/user/templates/registration/logout.html diff -r 7c994c98d1df -r ae8593287883 web/ldt_utils/user/templates/registration/password_change_done.html --- a/web/ldt_utils/user/templates/registration/password_change_done.html Tue Jun 08 15:31:42 2010 +0200 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,17 +0,0 @@ -{% extends "registration/base.html" %} -{% load i18n %} -{% block title %}{% trans 'password change successful' %}{% endblock %} - -{% block breadcrumb %} -
  • -
  • {% trans "Profiles" %}
  • -
  • {% trans "password change" %}
  • -{% endblock %} - -{% block content_title %}{% trans "password change successful" %}{% endblock %} -{% block iricontent %} - -

    {% trans 'Your password has been changed.' %}

    -{% trans 'Go back to profiles' %} - -{% endblock %} diff -r 7c994c98d1df -r ae8593287883 web/ldt_utils/user/templates/registration/password_change_form.html --- a/web/ldt_utils/user/templates/registration/password_change_form.html Tue Jun 08 15:31:42 2010 +0200 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,47 +0,0 @@ -{% extends "registration/base.html" %} -{% load i18n %} -{% block js_import %}{{ block.super }} - - -{% endblock %} -{% block breadcrumb %} -
  • -
  • {% trans "Profiles" %}
  • -
  • {% trans 'Password change' %}
  • -{% endblock %} - -{% block content_title %}{% trans 'Password change' %}{% endblock %} -{% block iricontent %} - -

    {% trans "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." %}

    - -
    - - - - - - - - - - - - - - - - - - - -
    {{ form.old_password.errors }}
    {{ form.new_password1.errors }}
    {{ form.new_password2.errors }}
    - - -
    - -{% endblock %} diff -r 7c994c98d1df -r ae8593287883 web/ldt_utils/user/templates/registration/password_reset_complete.html --- a/web/ldt_utils/user/templates/registration/password_reset_complete.html Tue Jun 08 15:31:42 2010 +0200 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,16 +0,0 @@ -{% extends "registration/base.html" %} -{% load i18n %} - -{% block breadcrumb %} -
  • -
  • {% trans 'Password reset' %}
  • -{% endblock %} - -{% block content_title %}{% trans 'Password reset complete' %}{% endblock %} -{% block iricontent %} - -

    {% trans "Your password has been set. You may go ahead and log in now." %}

    - -

    {% trans 'Log in' %}

    - -{% endblock %} \ No newline at end of file diff -r 7c994c98d1df -r ae8593287883 web/ldt_utils/user/templates/registration/password_reset_confirm.html --- a/web/ldt_utils/user/templates/registration/password_reset_confirm.html Tue Jun 08 15:31:42 2010 +0200 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,33 +0,0 @@ -{% extends "registration/base.html" %} -{% load i18n %} - -{% block breadcrumb %} -
  • -
  • {% trans 'Password reset' %}
  • -{% endblock %} - -{% block content_title %}{% trans 'Password reset' %}{% endblock %} - -{% block iricontent %} - -{% if validlink %} - -

    {% trans "Please enter your new password twice so we can verify you typed it in correctly." %}

    - -
    -{{ form.new_password1.errors }} -

    {{ form.new_password1 }}

    -{{ form.new_password2.errors }} -

    {{ form.new_password2 }}

    -

    -
    - -{% else %} - -

    {% trans 'Password reset unsuccessful' %}

    - -

    {% trans "The password reset link was invalid, possibly because it has already been used. Please request a new password reset." %}

    - -{% endif %} - -{% endblock %} diff -r 7c994c98d1df -r ae8593287883 web/ldt_utils/user/templates/registration/password_reset_done.html --- a/web/ldt_utils/user/templates/registration/password_reset_done.html Tue Jun 08 15:31:42 2010 +0200 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,14 +0,0 @@ -{% extends "registration/base.html" %} -{% load i18n %} - -{% block breadcrumb %} -
  • -
  • {% trans 'Password reset' %}
  • -{% endblock %} -{% block content_title %}{% trans 'Password reset successful' %}{% endblock %} - -{% block iricontent %} - -

    {% trans "We've e-mailed you instructions for setting your password to the e-mail address you submitted. You should be receiving it shortly." %}

    - -{% endblock %} diff -r 7c994c98d1df -r ae8593287883 web/ldt_utils/user/templates/registration/password_reset_email.html --- a/web/ldt_utils/user/templates/registration/password_reset_email.html Tue Jun 08 15:31:42 2010 +0200 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,15 +0,0 @@ -{% load i18n %}{% autoescape off %} -{% trans "You're receiving this e-mail because you requested a password reset" %} -{% blocktrans %}for your user account at {{ site_name }}{% endblocktrans %}. - -{% trans "Please go to the following page and choose a new password:" %} -{% block reset_link %} -{{ protocol }}://{{ domain }}{% url django.contrib.auth.views.password_reset_confirm uidb36=uid, token=token %} -{% endblock %} -{% trans "Your username, in case you've forgotten:" %} {{ user.username }} - -{% trans "Thanks for using our site!" %} - -{% blocktrans %}The {{ site_name }} team{% endblocktrans %} - -{% endautoescape %} diff -r 7c994c98d1df -r ae8593287883 web/ldt_utils/user/templates/registration/password_reset_form.html --- a/web/ldt_utils/user/templates/registration/password_reset_form.html Tue Jun 08 15:31:42 2010 +0200 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,36 +0,0 @@ -{% extends "registration/base.html" %} -{% load i18n %} -{% block js_import %}{{ block.super }} - -{% endblock %} - -{% block breadcrumb %} -
  • -
  • {% trans 'Password reset' %}
  • -{% endblock %} -{% block content_title %}{% trans 'Password reset' %}{% endblock %} - - -{% block title %}{% trans "Password reset" %}{% endblock %} - -{% block iricontent%} - -

    {% trans "Forgotten your password? Enter your e-mail address below, and we'll e-mail instructions for setting a new one." %}

    - -
    - - - - - - - - -
    {{ form.email.errors }}
    -
    - -{% endblock %} diff -r 7c994c98d1df -r ae8593287883 web/ldt_utils/user/templates/registration/registration_active.html --- a/web/ldt_utils/user/templates/registration/registration_active.html Tue Jun 08 15:31:42 2010 +0200 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,11 +0,0 @@ -{% extends "registration/base.html" %} -{% load i18n %} -{% block breadcrumb %} -
  • -
  • {% trans 'Activate the account' %}
  • -{% endblock %} -{% block content_title %}{% trans 'Activate the account' %}{% endblock %} -{% block iricontent%} -

    {% trans 'Vous avez bien activé votre compte, vous pouvez accedez à votre espace personnel.' %}

    -{% trans 'retourner à la page de connexion' %} -{% endblock %} \ No newline at end of file diff -r 7c994c98d1df -r ae8593287883 web/ldt_utils/user/templates/registration/registration_complete.html --- a/web/ldt_utils/user/templates/registration/registration_complete.html Tue Jun 08 15:31:42 2010 +0200 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,12 +0,0 @@ -{% extends "registration/base.html" %} -{% load i18n %} - -{% block breadcrumb %} -
  • -
  • {% trans 'Sign up' %}
  • -{% endblock %} -{% block content_title %}{% trans 'Sign up successfully' %}{% endblock %} -{% block iricontent %} -

    {% trans "We've e-mailed you instructions for activate your account to the e-mail address you submitted. You should be receiving it shortly." %}

    - -{% endblock%} \ No newline at end of file diff -r 7c994c98d1df -r ae8593287883 web/ldt_utils/user/templates/registration/registration_form.html --- a/web/ldt_utils/user/templates/registration/registration_form.html Tue Jun 08 15:31:42 2010 +0200 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,20 +0,0 @@ -{% extends "registration/base.html" %} -{% load i18n %} -{% block js_import %}{{ block.super }} - -{% endblock %} - -{% block content_title %}{% trans 'Sign up' %}{% endblock %} -{% block iricontent%} -
    {% csrf_token %} -
      -{{form.as_ul}} -
    • -
    -
    - -{% endblock%} diff -r 7c994c98d1df -r ae8593287883 web/ldt_utils/user/templatetags/__init__.py diff -r 7c994c98d1df -r ae8593287883 web/ldt_utils/user/templatetags/logintag.py --- a/web/ldt_utils/user/templatetags/logintag.py Tue Jun 08 15:31:42 2010 +0200 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,9 +0,0 @@ -from django import template -from django.template.loader import get_template - -register = template.Library() - -def loginAjax(user, reload=None): - return {'user': user, 'reload': reload} - -register.inclusion_tag('ldt/user/login_form.html')(loginAjax) diff -r 7c994c98d1df -r ae8593287883 web/ldt_utils/user/tests.py --- a/web/ldt_utils/user/tests.py Tue Jun 08 15:31:42 2010 +0200 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,23 +0,0 @@ -""" -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 7c994c98d1df -r ae8593287883 web/ldt_utils/user/urls.py --- a/web/ldt_utils/user/urls.py Tue Jun 08 15:31:42 2010 +0200 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,19 +0,0 @@ -from django.conf.urls.defaults import * - -urlpatterns = patterns('', - url(r'^loginAjax/$', 'ldt.user.views.loginAjax'), - url(r'^profile/', 'ldt.user.views.profile'), - url(r'^logout/', 'ldt.user.views.logout_view'), - url(r'^space/$', 'ldt.user.views.space'), - url(r'^emailchange/$', 'ldt.user.views.change_email'), - url(r'^emailchange/done/$', 'ldt.user.views.change_email_done'), -# url(r'^space/ldt/$', 'ldt.ldt_utils.views.list_ldt'), -# url(r'^space/ldt/indexproject/(?P.*)$', 'ldt.ldt_utils.views.indexProject'), -# url(r'^space/ldt/init/(?P.*)/(?P.*)$', 'ldt.ldt_utils.views.init'), -# url(r'^space/ldt/project/(?P.*)$', 'ldt.ldt_utils.views.ldtProject'), -# url(r'^space/ldt/create/$', 'ldt.ldt_utils.views.create_ldt_view'), -# url(r'^space/ldt/created_done/$', 'ldt.ldt_utils.views.created_ldt'), -# url(r'^space/ldt/save/$', 'ldt.ldt_utils.views.save_ldtProject'), -# url(r'^space/ldt/publish/(?P.*)$', 'ldt.ldt_utils.views.publish'), -# url(r'^space/ldt/unpublish/(?P.*)$', 'ldt.ldt_utils.views.unpublish'), -) diff -r 7c994c98d1df -r ae8593287883 web/ldt_utils/user/views.py --- a/web/ldt_utils/user/views.py Tue Jun 08 15:31:42 2010 +0200 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,75 +0,0 @@ -from django.conf import settings -from django.http import HttpResponse, HttpResponseRedirect -from django.shortcuts import render_to_response -from django.contrib.auth import authenticate, login, logout -from django.contrib.auth.decorators import login_required -# from django.contrib.sites.models import Site, RequestSite -from django.template import RequestContext, Context, loader -from django.utils.translation import ugettext as _ -from django.core.urlresolvers import reverse -from forms import EmailChangeForm -from django.utils import simplejson -from ldt.management import test_cms, test_ldt - - -def home(request): - return render_to_response('ldt/user/home.html',context_instance=RequestContext(request)) - -@login_required -def profile(request): - return render_to_response('ldt/user/profile.html', context_instance=RequestContext(request)) - -@login_required -def space(request, page_id=None, slug=None): - cms = test_cms() - ldt = test_ldt() - context={ - 'cms': cms, - 'ldt': ldt - } - return render_to_response('ldt/user/space.html', context, context_instance=RequestContext(request)) - - - -def logout_view(request): - logout(request) - # return HttpResponseRedirect(request.META.get('HTTP_REFERER', '/')) - return HttpResponseRedirect(settings.LOGOUT_URL) - - -def loginAjax(request, loginstate_template_name='ldt/user/login_form.html'): - if request.method == "POST": - username=request.POST["username"] - password=request.POST["password"] - user = authenticate(username=username, password=password) - error_message = _(u"Sorry, that's not a valid username or password.") - if user is not None: - if user.is_active: - login(request, user) - context = RequestContext(request, { 'username': user.username,}) - template = loader.get_template(loginstate_template_name) - html = template.render(context) - return HttpResponse(simplejson.dumps({'message': u'successful', 'username': user.username, 'html': html, 'reload': request.POST["reload"],})) - else: - return HttpResponse(simplejson.dumps({'message': error_message,})) - else: - return HttpResponse(simplejson.dumps({'message': error_message,})) - return render_to_response('ldt/user/login_ajax.html', context_instance=RequestContext(request)) - -@login_required -def change_email(request, post_change_redirect=None): - if post_change_redirect is None: - post_change_redirect = reverse('ldt.user.views.change_email_done') - if request.method == "POST": - form = EmailChangeForm(request.user, request.POST) - if form.is_valid(): - form.save() - return HttpResponseRedirect(post_change_redirect) - else: - form = EmailChangeForm(request.user) - return render_to_response('ldt/user/change_email.html', {'form': form,}, context_instance=RequestContext(request)) - -@login_required -def change_email_done(request, template_name='ldt/user/change_email_done.html'): - return render_to_response(template_name, context_instance=RequestContext(request)) - diff -r 7c994c98d1df -r ae8593287883 web/ldt_utils/utils/__init__.py --- a/web/ldt_utils/utils/__init__.py Tue Jun 08 15:31:42 2010 +0200 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,2 +0,0 @@ - - \ No newline at end of file diff -r 7c994c98d1df -r ae8593287883 web/ldt_utils/utils/context_processors.py --- a/web/ldt_utils/utils/context_processors.py Tue Jun 08 15:31:42 2010 +0200 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,4 +0,0 @@ -from django.conf import settings - -def ldt(request): - return {'LDT_MEDIA_PREFIX': settings.LDT_MEDIA_PREFIX } diff -r 7c994c98d1df -r ae8593287883 web/ldt_utils/utils/xml.py --- a/web/ldt_utils/utils/xml.py Tue Jun 08 15:31:42 2010 +0200 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,7 +0,0 @@ -def getText(anode): - nodelist = anode.childNodes - rc = "" - for node in nodelist: - if node.nodeType == node.TEXT_NODE: - rc = rc + node.data - return rc \ No newline at end of file diff -r 7c994c98d1df -r ae8593287883 web/ldt_utils/utils/zipfileext.py --- a/web/ldt_utils/utils/zipfileext.py Tue Jun 08 15:31:42 2010 +0200 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,14 +0,0 @@ -import zipfile, os, os.path - -class ZipFileExt(zipfile.ZipFile): - def unzip_into_dir(self, dir): - if not os.path.exists(dir): - os.mkdir(dir, 0777) - for name in self.namelist(): - if name.endswith('/'): - os.mkdir(os.path.join(dir,name)) - else: - outfile = open(os.path.join(dir,name), 'wb') - outfile.write(self.read(name)) - outfile.close() -