various update and splitmedia from content
authorymh <ymh.work@gmail.com>
Wed, 15 Sep 2010 15:07:08 +0200
changeset 60 a8ad7ebf5902
parent 50 06d158b5d24b
child 61 cb1b83039bc1
various update and splitmedia from content
sbin/virtualenv/create_python_env.py
sbin/virtualenv/res/src/Django-1.2.1.tar.gz
sbin/virtualenv/res/src/Django-1.2.3.tar.gz
sbin/virtualenv/res/src/django-tagging-0.3.1.tar.gz
sql/update_db_0_13_to_0_16.sql
web/franceculture/__init__.py
web/franceculture/settings.py
web/franceculture/templates/ldt/ldt_utils/create_content.html
web/ldt/__init__.py
web/ldt/ldt_utils/contentindexer.py
web/ldt/ldt_utils/fileimport.py
web/ldt/ldt_utils/forms.py
web/ldt/ldt_utils/models.py
web/ldt/ldt_utils/views.py
web/ldt/settings.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":
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', '')