--- 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":
Binary file sbin/virtualenv/res/src/Django-1.2.1.tar.gz has changed
Binary file sbin/virtualenv/res/src/Django-1.2.3.tar.gz has changed
Binary file sbin/virtualenv/res/src/django-tagging-0.3.1.tar.gz has changed
--- /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");
--- 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()
--- 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',
--- 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 @@
<div>{{ content_form.external_id.errors }}{{ content_form.external_id.label_tag }}{{content_form.external_id}}</div>
<div>{{ content_form.duration.errors }}{{ content_form.duration.label_tag }}{{content_form.duration}}</div>
<div>{{ content_form.content_creation_date.errors }}{{ content_form.content_creation_date.label_tag }}{{content_form.content_creation_date}}</div>
+ <div>{{ content_form.tags.errors }}{{ content_form.tags.label_tag }}{{content_form.tags}}</div>
</div>
</div>
<div id="submitcontent" class="span-18 last">
--- 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()
--- 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):
--- 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
--- 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')
+ }
--- 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'),)
+
--- 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
--- 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', '')