# HG changeset patch # User ymh # Date 1284556028 -7200 # Node ID a8ad7ebf5902a908561ba80ed17e2f76e319bbc2 # Parent 06d158b5d24b11a2c91f16148dd0d0fa5685f13b various update and splitmedia from content diff -r 06d158b5d24b -r a8ad7ebf5902 sbin/virtualenv/create_python_env.py --- a/sbin/virtualenv/create_python_env.py Mon Sep 13 12:56:36 2010 +0200 +++ b/sbin/virtualenv/create_python_env.py Wed Sep 15 15:07:08 2010 +0200 @@ -46,9 +46,10 @@ EXTRA_TEXT += " 'PYLUCENE' : { 'setup': 'http://apache.crihan.fr/dist/lucene/pylucene/pylucene-3.0.1-1-src.tar.gz', 'url': 'http://apache.crihan.fr/dist/lucene/pylucene/pylucene-3.0.1-1-src.tar.gz', 'local': '"+ os.path.abspath(os.path.join(src_base,"pylucene-3.0.1-1-src.tar.gz"))+"'},\n" EXTRA_TEXT += " 'PIL' : { 'setup': 'pil', 'url': 'http://effbot.org/downloads/Imaging-1.1.7.tar.gz', 'local': '"+ os.path.abspath(os.path.join(src_base,"Imaging-1.1.7.tar.gz"))+"'},\n" EXTRA_TEXT += " 'PYXML' : { 'setup': 'http://sourceforge.net/projects/pyxml/files/pyxml/0.8.4/PyXML-0.8.4.tar.gz/download', 'url': 'http://sourceforge.net/projects/pyxml/files/pyxml/0.8.4/PyXML-0.8.4.tar.gz/download', 'local': '"+ os.path.abspath(os.path.join(src_base,"PyXML-0.8.4.tar.gz"))+"', 'patch': '"+os.path.join(patch_path,"pyxml.patch")+"'},\n" -EXTRA_TEXT += " 'DJANGO' : { 'setup': 'django', 'url': 'http://www.djangoproject.com/download/1.2.1/tarball/', 'local': '"+ os.path.abspath(os.path.join(src_base,"Django-1.2.1.tar.gz"))+"'},\n" +EXTRA_TEXT += " 'DJANGO' : { 'setup': 'django', 'url': 'http://www.djangoproject.com/download/1.2.3/tarball/', 'local': '"+ os.path.abspath(os.path.join(src_base,"Django-1.2.3.tar.gz"))+"'},\n" EXTRA_TEXT += " 'DJANGO-EXTENSIONS' : { 'setup': 'django-extensions', 'url':'http://django-command-extensions.googlecode.com/files/django-extensions-0.4.1.tar.gz', 'local':'"+ os.path.abspath(os.path.join(src_base,"django-extensions-0.4.1.tar.gz"))+"' },\n" EXTRA_TEXT += " 'DJANGO-REGISTRATION' : { 'setup': 'django-registration', 'url':'http://bitbucket.org/ubernostrum/django-registration/get/tip.tar.gz', 'local':'"+ os.path.abspath(os.path.join(src_base,"django-registration.tar.gz"))+"' },\n" +EXTRA_TEXT += " 'DJANGO-TAGGING' : { 'setup': 'django-tagging', 'url':'http://django-tagging.googlecode.com/files/django-tagging-0.3.1.tar.gz', 'local':'"+ os.path.abspath(os.path.join(src_base,"django-tagging-0.3.1.tar.gz"))+"' },\n" EXTRA_TEXT += " 'LXML' : { 'setup': 'lxml', 'url': '"+ os.path.abspath(os.path.join(src_base,"lxml_2.2.7.tar.gz"))+"', 'local': '"+ os.path.abspath(os.path.join(src_base,"lxml-2.2.7.tar.gz"))+"'},\n" EXTRA_TEXT += "}\n" @@ -242,6 +243,7 @@ ('DJANGO','pip', None, None), ('DJANGO-EXTENSIONS', 'pip', None, None), ('DJANGO-REGISTRATION', 'easy_install', '-Z', None), + ('DJANGO-TAGGING', 'pip', None, None), ] if system_str == "Darwin": diff -r 06d158b5d24b -r a8ad7ebf5902 sbin/virtualenv/res/src/Django-1.2.1.tar.gz Binary file sbin/virtualenv/res/src/Django-1.2.1.tar.gz has changed diff -r 06d158b5d24b -r a8ad7ebf5902 sbin/virtualenv/res/src/Django-1.2.3.tar.gz Binary file sbin/virtualenv/res/src/Django-1.2.3.tar.gz has changed diff -r 06d158b5d24b -r a8ad7ebf5902 sbin/virtualenv/res/src/django-tagging-0.3.1.tar.gz Binary file sbin/virtualenv/res/src/django-tagging-0.3.1.tar.gz has changed diff -r 06d158b5d24b -r a8ad7ebf5902 sql/update_db_0_13_to_0_16.sql --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/sql/update_db_0_13_to_0_16.sql Wed Sep 15 15:07:08 2010 +0200 @@ -0,0 +1,8 @@ +ALTER TABLE ldt_utils_content + ADD COLUMN tags character varying(2048); + +ALTER TABLE ldt_utils_content DROP COLUMN videopath; +ALTER TABLE ldt_utils_content DROP COLUMN external_id; + +ALTER TABLE ldt_utils_content ADD COLUMN "media_id" integer REFERENCES "ldt_utils_media" ("id") DEFERRABLE INITIALLY DEFERRED; +CREATE INDEX "ldt_utils_content_media_id" ON "ldt_utils_content" ("media_id"); diff -r 06d158b5d24b -r a8ad7ebf5902 web/franceculture/__init__.py --- a/web/franceculture/__init__.py Mon Sep 13 12:56:36 2010 +0200 +++ b/web/franceculture/__init__.py Wed Sep 15 15:07:08 2010 +0200 @@ -1,6 +1,6 @@ -VERSION = (0,14) +VERSION = (0, 14, 0, "final", 0) -VERSION_STR = unicode(".".join(map(lambda i:"%02d" % (i,), VERSION))) +VERSION_STR = unicode(".".join(map(lambda i:"%02d" % (i,), VERSION[:2]))) def get_version(): @@ -14,3 +14,4 @@ version = '%s %s %s' % (version, VERSION[3], VERSION[4]) return version +__version__ = get_version() diff -r 06d158b5d24b -r a8ad7ebf5902 web/franceculture/settings.py --- a/web/franceculture/settings.py Mon Sep 13 12:56:36 2010 +0200 +++ b/web/franceculture/settings.py Wed Sep 15 15:07:08 2010 +0200 @@ -113,6 +113,7 @@ 'django.contrib.admin', 'franceculture', 'registration', + 'tagging', 'ldt', 'ldt.core', 'ldt.ldt_utils', diff -r 06d158b5d24b -r a8ad7ebf5902 web/franceculture/templates/ldt/ldt_utils/create_content.html --- a/web/franceculture/templates/ldt/ldt_utils/create_content.html Mon Sep 13 12:56:36 2010 +0200 +++ b/web/franceculture/templates/ldt/ldt_utils/create_content.html Wed Sep 15 15:07:08 2010 +0200 @@ -49,6 +49,7 @@
{{ content_form.external_id.errors }}{{ content_form.external_id.label_tag }}{{content_form.external_id}}
{{ content_form.duration.errors }}{{ content_form.duration.label_tag }}{{content_form.duration}}
{{ content_form.content_creation_date.errors }}{{ content_form.content_creation_date.label_tag }}{{content_form.content_creation_date}}
+
{{ content_form.tags.errors }}{{ content_form.tags.label_tag }}{{content_form.tags}}
diff -r 06d158b5d24b -r a8ad7ebf5902 web/ldt/__init__.py --- a/web/ldt/__init__.py Mon Sep 13 12:56:36 2010 +0200 +++ b/web/ldt/__init__.py Wed Sep 15 15:07:08 2010 +0200 @@ -1,3 +1,16 @@ -VERSION = (0,1) +VERSION = (0, 2, 0, "final", 0) + -VERSION_STR = unicode(".".join(map(lambda i:"%02d" % (i,), VERSION))) +def get_version(): + version = '%s.%s' % (VERSION[0], VERSION[1]) + if VERSION[2]: + version = '%s.%s' % (version, VERSION[2]) + if VERSION[3:] == ('alpha', 0): + version = '%s pre-alpha' % version + else: + if VERSION[3] != 'final': + version = '%s %s %s' % (version, VERSION[3], VERSION[4]) + return version + + +__version__ = get_version() diff -r 06d158b5d24b -r a8ad7ebf5902 web/ldt/ldt_utils/contentindexer.py --- a/web/ldt/ldt_utils/contentindexer.py Mon Sep 13 12:56:36 2010 +0200 +++ b/web/ldt/ldt_utils/contentindexer.py Wed Sep 15 15:07:08 2010 +0200 @@ -79,19 +79,19 @@ tags = elementNode.getAttributeNS(None,u"tags") if tags is not None: - tags.replace(",", ";") + 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 + 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 + tags = tags + " , " + tagnode.data title = "" for txtRes in xml.xpath.Evaluate("title/text()", elementNode): @@ -187,19 +187,19 @@ tags = elementNode.getAttributeNS(None,u"tags") if tags is not None: - tags.replace(",", ";") + 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 + 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 + tags = tags + " , " + tagnode.data title = "" for txtRes in xml.xpath.Evaluate("title/text()", elementNode): diff -r 06d158b5d24b -r a8ad7ebf5902 web/ldt/ldt_utils/fileimport.py --- a/web/ldt/ldt_utils/fileimport.py Mon Sep 13 12:56:36 2010 +0200 +++ b/web/ldt/ldt_utils/fileimport.py Wed Sep 15 15:07:08 2010 +0200 @@ -2,7 +2,7 @@ from django.conf import settings from django.core.exceptions import ObjectDoesNotExist from ldt.utils import zipfileext -from models import Content +from models import Content, Media import fnmatch import lxml.etree import os.path @@ -142,20 +142,27 @@ # 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 = {'src':unicode(self.videourl), 'iriurl': unicode(self.src), 'title':unicode(self.title), 'description':unicode(self.desc), 'videopath': unicode(self.videopath)}) - if not self.created: - content.iriurl = unicode(self.src) - content.title = unicode(self.title) - content.description = unicode(self.desc) - content.save() + defaults_media = {'src':unicode(self.videourl), 'title':unicode(self.title), 'description':unicode(self.desc), 'videopath': unicode(self.videopath.rstrip("/") + "/")} + media, media_created = Media.objects.get_or_create(src=unicode(self.videourl), defaults = defaults_media) + if not media_created: + for key, value in defaults_media.items(): + setattr(media, key, value) + + media.save() - content.iriurl = unicode(self.src) - content.videopath = unicode(self.videopath.rstrip("/") + "/") - - content.iri = unicode(self.id + u"/" + os.path.basename(self.src)) - content.title = unicode(self.title) - content.description = unicode(self.desc) - content.duration = int(self.duration) + defaults_content = { + 'iriurl': unicode(self.src), + 'title':unicode(self.title), + 'description':unicode(self.desc), + 'media':media, + 'iri':unicode(self.id + u"/" + os.path.basename(self.src)), + 'duration':int(self.duration) + } + content, self.created = Content.objects.get_or_create(iri_id=self.id, defaults = defaults_content) + if not self.created: + for key, value in defaults_content.items(): + setattr(content, key, value) + content.save() self.content = content diff -r 06d158b5d24b -r a8ad7ebf5902 web/ldt/ldt_utils/forms.py --- a/web/ldt/ldt_utils/forms.py Mon Sep 13 12:56:36 2010 +0200 +++ b/web/ldt/ldt_utils/forms.py Wed Sep 15 15:07:08 2010 +0200 @@ -67,3 +67,16 @@ css = { 'all' : ('admin/css/forms.css','admin/css/base.css', 'admin/css/base.css', 'admin/css/widgets.css') } + +class MediaForm(forms.ModelForm): + + media_creation_date = forms.SplitDateTimeField(widget=ldt_widgets.LdtSplitDateTime, required=False) + + class Meta: + model = Content + exclude = ("creation_date", "update_date", "creator") + + class Media: + css = { + 'all' : ('admin/css/forms.css','admin/css/base.css', 'admin/css/base.css', 'admin/css/widgets.css') + } diff -r 06d158b5d24b -r a8ad7ebf5902 web/ldt/ldt_utils/models.py --- a/web/ldt/ldt_utils/models.py Mon Sep 13 12:56:36 2010 +0200 +++ b/web/ldt/ldt_utils/models.py Wed Sep 15 15:07:08 2010 +0200 @@ -2,6 +2,8 @@ from django.db import models from django.utils.translation import ugettext_lazy as _ from ldt.core.models import Document, Owner +from django.contrib.auth.models import User +import tagging.fields from utils import create_ldt, copy_ldt, create_empty_iri, update_iri, generate_uuid import lxml.etree import os.path @@ -17,20 +19,36 @@ def __unicode__(self): return unicode(self.id) + " - " + self.handle + ", " + self.email + ", " + self.firstname + " " + self.lastname +class Media(models.Model): + external_id = models.CharField(max_length=1024, null=True, blank=True, verbose_name=_('media.external_id')) + external_permalink = models.URLField(max_length=1024, verbose_name=_('content.external_permalink')) + external_publication_url = models.URLField(max_length=1024, verbose_name=_('content.external_publication_url')) + external_src_url = models.URLField(max_length=1024, verbose_name=_('content.external_publication_url')) + creation_date = models.DateTimeField(auto_now_add=True, verbose_name=_('media.creation_date')) + media_creation_date = models.DateTimeField(null=True, blank=True, verbose_name=_('media.media_creation_date')) + update_date = models.DateTimeField(auto_now=True, verbose_name=_('media.update_date')) + videopath = models.CharField(max_length=1024, null=True, blank=True, verbose_name=_('media.videopath')) + duration = models.IntegerField(null=True, blank=True, verbose_name=_('media.duration')) + creator = models.ForeignKey(User, blank=True, verbose_name=_('media.creator')) + description = models.TextField(null=True, blank=True, verbose_name=_('description')) + title = models.CharField(max_length=1024, null=True, blank=True, verbose_name=_('title')) + src = models.CharField(max_length=1024, unique=True, verbose_name=_('media.src')) class Content(models.Model): iri_id = models.CharField(max_length=1024, unique=True, default=generate_uuid, verbose_name=_('content.iri_id')) iriurl = models.CharField(max_length=1024, verbose_name=_('content.iriurl')) - src = models.CharField(max_length=1024, null=True, blank=True, verbose_name=_('content.src')) - videopath = models.CharField(max_length=1024, null=True, blank=True, verbose_name=_('content.videopath')) +# src = models.CharField(max_length=1024, null=True, blank=True, verbose_name=_('content.src')) +# videopath = models.CharField(max_length=1024, null=True, blank=True, verbose_name=_('content.videopath')) creation_date = models.DateTimeField(auto_now_add=True, verbose_name=_('content.creation_date')) update_date = models.DateTimeField(auto_now=True, verbose_name=_('content.update_date')) title = models.CharField(max_length=1024, null=True, blank=True, verbose_name=_('content.title')) description = models.TextField(null=True, blank=True, verbose_name=_('content.description')) - external_id = models.CharField(max_length=1024, null=True, blank=True, verbose_name=_('content.external_id')) +# external_id = models.CharField(max_length=1024, null=True, blank=True, verbose_name=_('content.external_id')) authors = models.ManyToManyField(Author, blank=True, verbose_name=_('content.authors')) duration = models.IntegerField(null=True, blank=True, verbose_name=_('content.duration')) content_creation_date = models.DateTimeField(null=True, blank=True, verbose_name=_('content.content_creation_date')) + tags = tagging.fields.TagField(max_length=2048, null=True, blank=True ) + media = models.ForeignKey('Media', blank=True, null=True ) def get_duration(self): if self.duration is None: @@ -87,6 +105,61 @@ def iri_url_template(self): return "${web_url}${media_url}media/ldt/" + unicode(self.iri_id) + "/" + os.path.basename(self.iriurl) + + def videopath(): #@NoSelf + doc = """simulate videopath""" #@UnusedVariable + + def fget(self): + if self.media is None: + return None + else: + return self.media.videopath + + def fset(self, value): + if self.media is not None: + self.media.videopath = value + + return locals() + + videopath = property(**videopath()) + + def src(): #@NoSelf + doc = """simulate videopath""" #@UnusedVariable + + def fget(self): + if self.media is None: + return None + else: + return self.media.src + + def fset(self, value): + if self.media is None or self.media.src != value: + media, created = Media.objects.get_or_create(src=value, defaults={'src':value}) + self.media = media + self.save() + + return locals() + + src = property(**src()) + + def videopath(): #@NoSelf + doc = """simulate videopath""" #@UnusedVariable + + def fget(self): + if self.media is None: + return None + else: + return self.media.videopath + + def fset(self, value): + if self.media is not None: + self.media.videopath = value + + return locals() + + videopath = property(**videopath()) + + class Project(Document): @@ -155,7 +228,7 @@ 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) + tags = tagging.fields.TagField(max_length=2048, null=True, blank=True, unique=False) title = models.CharField(max_length=2048, unique=False, null=True, blank=True) duration = models.IntegerField(null=True) start_ts = models.IntegerField(null=True) @@ -169,3 +242,4 @@ class Meta: unique_together = (('project_id', 'iri_id', 'ensemble_id', 'cutting_id', 'element_id'),) + diff -r 06d158b5d24b -r a8ad7ebf5902 web/ldt/ldt_utils/views.py --- a/web/ldt/ldt_utils/views.py Mon Sep 13 12:56:36 2010 +0200 +++ b/web/ldt/ldt_utils/views.py Wed Sep 15 15:07:08 2010 +0200 @@ -369,30 +369,42 @@ form_status= 'none' if request.method =="POST": - form = ContentForm(request.POST) - if form.is_valid(): - content, created = Content.objects.get_or_create(iri_id = form.cleaned_data['iri_id'], defaults = form.cleaned_data) + content_form = ContentForm(request.POST, prefix="content") + media_form = MediaForm(request.POST, prefix="media") + media_valid = media_form.is_valid() + content_valid = content_form.is_valid() + if media_valid and content_valid : + media, created = Media.objects.get_or_create(src=media_form.cleaned_data['src'], defaults=media_form.cleaned_data) if not created: - form = ContentForm(request.POST, instance=content) - form.save() - else: - content.save() + for attribute in ('external_id', 'external_permalink', 'external_publication_url', 'external_src_url', 'media_creation_date', 'videopath', 'duration', 'description', 'title'): + setattr(media, attribute, media_form.cleaned_data.get(attribute)) + media.save() + + content_defaults = {'media': media } + content_defaults.update(content_form.cleaned_data) + content, created = Content.objects.get_or_create(iri_id = content_form.cleaned_data['iri_id'], defaults = content_defaults) + if not created: + for attribute in ('iriurl', 'title', 'description', 'duration', 'content_creation_date', 'tags', 'media'): + setattr(content, attribute, content_defaults[attribute]) + content.save() form_status = 'saved' - form = ContentForm(instance=content) + media_form = MediaForm(instance=media, prefix="media") + content_form = ContentForm(instance=content, prefix="content") else: form_status = 'error' else: form_status = 'empty' - form = ContentForm() + content_form = ContentForm(prefix="content") + media_form = MediaForm(prefix="media") - return form, form_status + return content_form, media_form, form_status def write_content(request): - content_form, form_status = write_content_base(request) + content_form, media_form, form_status = write_content_base(request) - return render_to_response('ldt/ldt_utils/create_content.html', {'content_form': content_form, 'form_status': form_status,'create_content_action': reverse(write_content)}, context_instance=RequestContext(request)) + return render_to_response('ldt/ldt_utils/create_content.html', {'content_form': content_form, 'media_form': media_form,'form_status': form_status,'create_content_action': reverse(write_content)}, context_instance=RequestContext(request)) \ No newline at end of file diff -r 06d158b5d24b -r a8ad7ebf5902 web/ldt/settings.py --- a/web/ldt/settings.py Mon Sep 13 12:56:36 2010 +0200 +++ b/web/ldt/settings.py Wed Sep 15 15:07:08 2010 +0200 @@ -12,6 +12,22 @@ #DEFAULT_FROM_EMAIL = "admin@domain.com" #SERVER_EMAIL = "admin@domain.com" +INSTALLED_APPS = ( + 'django.contrib.auth', + 'django.contrib.contenttypes', + 'django.contrib.sessions', + 'django.contrib.sites', + 'django.contrib.messages', + 'django.contrib.admin', + 'registration', + 'tagging', + 'ldt', + 'ldt.core', + 'ldt.ldt_utils', + 'ldt.user', + 'ldt.management', +) + WEB_URL = getattr(settings, 'WEB_URL', '') BASE_URL = getattr(settings, 'BASE_URL', '') MEDIA_URL = getattr(settings, 'MEDIA_URL', '')