web/ldt/ldt_utils/models.py
author ymh <ymh.work@gmail.com>
Tue, 26 Oct 2010 16:41:23 +0200
changeset 9 505a1c4cac67
parent 1 eb9188f2ee4f
child 13 6ba27763b399
permissions -rw-r--r--
correct empty projects
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
1
eb9188f2ee4f first commit
wakimd
parents:
diff changeset
     1
from django.conf import settings
eb9188f2ee4f first commit
wakimd
parents:
diff changeset
     2
from django.db import models
eb9188f2ee4f first commit
wakimd
parents:
diff changeset
     3
from django.utils.translation import ugettext_lazy as _
eb9188f2ee4f first commit
wakimd
parents:
diff changeset
     4
from ldt.core.models import Document, Owner
eb9188f2ee4f first commit
wakimd
parents:
diff changeset
     5
from django.contrib.auth.models import User
eb9188f2ee4f first commit
wakimd
parents:
diff changeset
     6
import tagging.fields
eb9188f2ee4f first commit
wakimd
parents:
diff changeset
     7
from utils import create_ldt, copy_ldt, create_empty_iri, update_iri, generate_uuid
eb9188f2ee4f first commit
wakimd
parents:
diff changeset
     8
import lxml.etree
eb9188f2ee4f first commit
wakimd
parents:
diff changeset
     9
import os.path
eb9188f2ee4f first commit
wakimd
parents:
diff changeset
    10
import uuid
eb9188f2ee4f first commit
wakimd
parents:
diff changeset
    11
import lucene
eb9188f2ee4f first commit
wakimd
parents:
diff changeset
    12
from ldt.ldt_utils import STORE, ANALYZER
eb9188f2ee4f first commit
wakimd
parents:
diff changeset
    13
eb9188f2ee4f first commit
wakimd
parents:
diff changeset
    14
class Author(models.Model):
eb9188f2ee4f first commit
wakimd
parents:
diff changeset
    15
eb9188f2ee4f first commit
wakimd
parents:
diff changeset
    16
    handle = models.CharField(max_length=512, unique=True, blank=True, null=True)
eb9188f2ee4f first commit
wakimd
parents:
diff changeset
    17
    email = models.EmailField(unique=False, blank=True, null=True)
eb9188f2ee4f first commit
wakimd
parents:
diff changeset
    18
    firstname = models.CharField(max_length=512, blank=True, null=True)
eb9188f2ee4f first commit
wakimd
parents:
diff changeset
    19
    lastname = models.CharField(max_length=512, blank=True, null=True)
eb9188f2ee4f first commit
wakimd
parents:
diff changeset
    20
    
eb9188f2ee4f first commit
wakimd
parents:
diff changeset
    21
    def __unicode__(self):
eb9188f2ee4f first commit
wakimd
parents:
diff changeset
    22
        return unicode(self.id) + " - " + self.handle + ", " + self.email + ", " + self.firstname + " " + self.lastname
eb9188f2ee4f first commit
wakimd
parents:
diff changeset
    23
eb9188f2ee4f first commit
wakimd
parents:
diff changeset
    24
class Media(models.Model):
eb9188f2ee4f first commit
wakimd
parents:
diff changeset
    25
    external_id = models.CharField(max_length=1024, null=True, blank=True, verbose_name=_('media.external_id'))
eb9188f2ee4f first commit
wakimd
parents:
diff changeset
    26
    external_permalink = models.URLField(max_length=1024, verify_exists=False, null=True, blank=True, verbose_name=_('media.external_permalink'))
eb9188f2ee4f first commit
wakimd
parents:
diff changeset
    27
    external_publication_url = models.URLField(max_length=1024, verify_exists=True, null=True, blank=True, verbose_name=_('media.external_publication_url'))
eb9188f2ee4f first commit
wakimd
parents:
diff changeset
    28
    external_src_url = models.URLField(max_length=1024, verify_exists=False, null=True, blank=True, verbose_name=_('media.external_src_url'))
eb9188f2ee4f first commit
wakimd
parents:
diff changeset
    29
    creation_date = models.DateTimeField(auto_now_add=True, verbose_name=_('media.creation_date'))
eb9188f2ee4f first commit
wakimd
parents:
diff changeset
    30
    media_creation_date = models.DateTimeField(null=True, blank=True, verbose_name=_('media.media_creation_date'))
eb9188f2ee4f first commit
wakimd
parents:
diff changeset
    31
    update_date = models.DateTimeField(auto_now=True, verbose_name=_('media.update_date'))
eb9188f2ee4f first commit
wakimd
parents:
diff changeset
    32
    videopath = models.CharField(max_length=1024, null=True, blank=True, verbose_name=_('media.videopath'))
eb9188f2ee4f first commit
wakimd
parents:
diff changeset
    33
    duration = models.IntegerField(null=True, blank=True, verbose_name=_('media.duration'))
eb9188f2ee4f first commit
wakimd
parents:
diff changeset
    34
    creator = models.ForeignKey(User, blank=True, null=True, verbose_name=_('media.creator'))
eb9188f2ee4f first commit
wakimd
parents:
diff changeset
    35
    description = models.TextField(null=True, blank=True, verbose_name=_('description'))
eb9188f2ee4f first commit
wakimd
parents:
diff changeset
    36
    title = models.CharField(max_length=1024, null=True, blank=True, verbose_name=_('title'))
eb9188f2ee4f first commit
wakimd
parents:
diff changeset
    37
    src = models.CharField(max_length=1024, unique=True, verbose_name=_('media.src'))
eb9188f2ee4f first commit
wakimd
parents:
diff changeset
    38
    
eb9188f2ee4f first commit
wakimd
parents:
diff changeset
    39
    def stream_src():
eb9188f2ee4f first commit
wakimd
parents:
diff changeset
    40
        
eb9188f2ee4f first commit
wakimd
parents:
diff changeset
    41
        def fget(self):
eb9188f2ee4f first commit
wakimd
parents:
diff changeset
    42
            res_src = self.src.rstrip()
eb9188f2ee4f first commit
wakimd
parents:
diff changeset
    43
            if self.videopath and self.videopath.startswith("rtmp://"):
eb9188f2ee4f first commit
wakimd
parents:
diff changeset
    44
                extension = res_src.split(".")[-1]
eb9188f2ee4f first commit
wakimd
parents:
diff changeset
    45
                res_src = {
eb9188f2ee4f first commit
wakimd
parents:
diff changeset
    46
                    'flv': lambda s: s,
eb9188f2ee4f first commit
wakimd
parents:
diff changeset
    47
                    'mp3': lambda s: "%s:%s" %("mp3",res_src[:-4]),
eb9188f2ee4f first commit
wakimd
parents:
diff changeset
    48
                    'mp4': lambda s: "%s:%s" %("mp4",res_src[:-4]),
eb9188f2ee4f first commit
wakimd
parents:
diff changeset
    49
                    'f4v': lambda s: "%s:%s" %("mp4",res_src[:-4]),
eb9188f2ee4f first commit
wakimd
parents:
diff changeset
    50
                }.get(extension, lambda s:s)(res_src.lower())
eb9188f2ee4f first commit
wakimd
parents:
diff changeset
    51
            return res_src
eb9188f2ee4f first commit
wakimd
parents:
diff changeset
    52
        
eb9188f2ee4f first commit
wakimd
parents:
diff changeset
    53
        return locals()
eb9188f2ee4f first commit
wakimd
parents:
diff changeset
    54
    
eb9188f2ee4f first commit
wakimd
parents:
diff changeset
    55
    stream_src = property(**stream_src())    
eb9188f2ee4f first commit
wakimd
parents:
diff changeset
    56
    
eb9188f2ee4f first commit
wakimd
parents:
diff changeset
    57
    def save(self, *args, **kwargs):
eb9188f2ee4f first commit
wakimd
parents:
diff changeset
    58
        super(Media, self).save(*args, **kwargs)
eb9188f2ee4f first commit
wakimd
parents:
diff changeset
    59
        for content in self.content_set.all():
eb9188f2ee4f first commit
wakimd
parents:
diff changeset
    60
            content.sync_iri_file()
eb9188f2ee4f first commit
wakimd
parents:
diff changeset
    61
    
eb9188f2ee4f first commit
wakimd
parents:
diff changeset
    62
    def __unicode__(self):
eb9188f2ee4f first commit
wakimd
parents:
diff changeset
    63
        strings = []
eb9188f2ee4f first commit
wakimd
parents:
diff changeset
    64
        if self.title:
eb9188f2ee4f first commit
wakimd
parents:
diff changeset
    65
            strings.append(unicode(self.title))
eb9188f2ee4f first commit
wakimd
parents:
diff changeset
    66
        else:
eb9188f2ee4f first commit
wakimd
parents:
diff changeset
    67
            strings.append(unicode(self.src))
eb9188f2ee4f first commit
wakimd
parents:
diff changeset
    68
        if self.external_id:
eb9188f2ee4f first commit
wakimd
parents:
diff changeset
    69
            strings.append(unicode(self.external_id))
eb9188f2ee4f first commit
wakimd
parents:
diff changeset
    70
        return "|".join(strings)
eb9188f2ee4f first commit
wakimd
parents:
diff changeset
    71
eb9188f2ee4f first commit
wakimd
parents:
diff changeset
    72
eb9188f2ee4f first commit
wakimd
parents:
diff changeset
    73
class Content(models.Model):
eb9188f2ee4f first commit
wakimd
parents:
diff changeset
    74
    iri_id = models.CharField(max_length=1024, unique=True, default=generate_uuid, verbose_name=_('content.iri_id'))
eb9188f2ee4f first commit
wakimd
parents:
diff changeset
    75
    iriurl = models.CharField(max_length=1024, verbose_name=_('content.iriurl'))
eb9188f2ee4f first commit
wakimd
parents:
diff changeset
    76
    creation_date = models.DateTimeField(auto_now_add=True, verbose_name=_('content.creation_date'))
eb9188f2ee4f first commit
wakimd
parents:
diff changeset
    77
    update_date = models.DateTimeField(auto_now=True, verbose_name=_('content.update_date'))
eb9188f2ee4f first commit
wakimd
parents:
diff changeset
    78
    title = models.CharField(max_length=1024, null=True, blank=True, verbose_name=_('content.title'))
eb9188f2ee4f first commit
wakimd
parents:
diff changeset
    79
    description = models.TextField(null=True, blank=True, verbose_name=_('content.description'))
eb9188f2ee4f first commit
wakimd
parents:
diff changeset
    80
    authors = models.ManyToManyField(Author, blank=True, verbose_name=_('content.authors'))
eb9188f2ee4f first commit
wakimd
parents:
diff changeset
    81
    duration = models.IntegerField(null=True, blank=True, verbose_name=_('content.duration'))
eb9188f2ee4f first commit
wakimd
parents:
diff changeset
    82
    content_creation_date = models.DateTimeField(null=True, blank=True, verbose_name=_('content.content_creation_date'))
eb9188f2ee4f first commit
wakimd
parents:
diff changeset
    83
    tags = tagging.fields.TagField(max_length=2048, null=True, blank=True )
eb9188f2ee4f first commit
wakimd
parents:
diff changeset
    84
    media_obj = models.ForeignKey('Media', blank=True, null=True )
eb9188f2ee4f first commit
wakimd
parents:
diff changeset
    85
    
eb9188f2ee4f first commit
wakimd
parents:
diff changeset
    86
    class Meta:
eb9188f2ee4f first commit
wakimd
parents:
diff changeset
    87
        ordering = ["title"]
eb9188f2ee4f first commit
wakimd
parents:
diff changeset
    88
eb9188f2ee4f first commit
wakimd
parents:
diff changeset
    89
    def get_duration(self):
eb9188f2ee4f first commit
wakimd
parents:
diff changeset
    90
        if self.duration is None:
eb9188f2ee4f first commit
wakimd
parents:
diff changeset
    91
            doc = lxml.etree.parse(self.iri_file_path())
eb9188f2ee4f first commit
wakimd
parents:
diff changeset
    92
            res = doc.xpath("/iri/body/medias/media[@id='video']/video")
eb9188f2ee4f first commit
wakimd
parents:
diff changeset
    93
            if len(res) > 0:
eb9188f2ee4f first commit
wakimd
parents:
diff changeset
    94
                try:
eb9188f2ee4f first commit
wakimd
parents:
diff changeset
    95
                    self.duration = int(res[0].get(u'dur',0) or 0)
eb9188f2ee4f first commit
wakimd
parents:
diff changeset
    96
                except:
eb9188f2ee4f first commit
wakimd
parents:
diff changeset
    97
                    self.duration = 0
eb9188f2ee4f first commit
wakimd
parents:
diff changeset
    98
            else:
eb9188f2ee4f first commit
wakimd
parents:
diff changeset
    99
                self.duration = 0
eb9188f2ee4f first commit
wakimd
parents:
diff changeset
   100
            self.save()
eb9188f2ee4f first commit
wakimd
parents:
diff changeset
   101
        return self.duration
eb9188f2ee4f first commit
wakimd
parents:
diff changeset
   102
    
eb9188f2ee4f first commit
wakimd
parents:
diff changeset
   103
    def delete(self):
eb9188f2ee4f first commit
wakimd
parents:
diff changeset
   104
        super(Content, self).delete()
eb9188f2ee4f first commit
wakimd
parents:
diff changeset
   105
        writer = lucene.IndexWriter(STORE, ANALYZER, True, lucene.IndexWriter.MaxFieldLength.UNLIMITED)
eb9188f2ee4f first commit
wakimd
parents:
diff changeset
   106
        writer.deleteDocuments(lucene.Term("iri_id", self.iri_id))
eb9188f2ee4f first commit
wakimd
parents:
diff changeset
   107
        writer.commit()
eb9188f2ee4f first commit
wakimd
parents:
diff changeset
   108
        
eb9188f2ee4f first commit
wakimd
parents:
diff changeset
   109
    def sync_iri_file(self):
eb9188f2ee4f first commit
wakimd
parents:
diff changeset
   110
        # create iri file if needed
eb9188f2ee4f first commit
wakimd
parents:
diff changeset
   111
        created = False
eb9188f2ee4f first commit
wakimd
parents:
diff changeset
   112
        try:
eb9188f2ee4f first commit
wakimd
parents:
diff changeset
   113
            iri_file_path = self.iri_file_path()
eb9188f2ee4f first commit
wakimd
parents:
diff changeset
   114
            if not os.path.exists(iri_file_path):
eb9188f2ee4f first commit
wakimd
parents:
diff changeset
   115
                dir = os.path.dirname(iri_file_path)
eb9188f2ee4f first commit
wakimd
parents:
diff changeset
   116
                if not os.path.exists(dir):
eb9188f2ee4f first commit
wakimd
parents:
diff changeset
   117
                    os.makedirs(dir)
eb9188f2ee4f first commit
wakimd
parents:
diff changeset
   118
                created = True
eb9188f2ee4f first commit
wakimd
parents:
diff changeset
   119
                file = open(iri_file_path,"w")
eb9188f2ee4f first commit
wakimd
parents:
diff changeset
   120
                create_empty_iri(file, self, "IRI")
eb9188f2ee4f first commit
wakimd
parents:
diff changeset
   121
            else:
eb9188f2ee4f first commit
wakimd
parents:
diff changeset
   122
                created = False
eb9188f2ee4f first commit
wakimd
parents:
diff changeset
   123
                update_iri(iri_file_path, self, "IRI")
eb9188f2ee4f first commit
wakimd
parents:
diff changeset
   124
                
eb9188f2ee4f first commit
wakimd
parents:
diff changeset
   125
        except Exception, e:
eb9188f2ee4f first commit
wakimd
parents:
diff changeset
   126
            if created:
eb9188f2ee4f first commit
wakimd
parents:
diff changeset
   127
                if os.path.exists(iri_file_path):
eb9188f2ee4f first commit
wakimd
parents:
diff changeset
   128
                    os.remove(iri_file_path)
eb9188f2ee4f first commit
wakimd
parents:
diff changeset
   129
            raise e
eb9188f2ee4f first commit
wakimd
parents:
diff changeset
   130
        
eb9188f2ee4f first commit
wakimd
parents:
diff changeset
   131
        
eb9188f2ee4f first commit
wakimd
parents:
diff changeset
   132
    #TODO: better manage the change in .iri name and error scenario (save in temp file + rename
eb9188f2ee4f first commit
wakimd
parents:
diff changeset
   133
    def save(self, *args, **kwargs):
eb9188f2ee4f first commit
wakimd
parents:
diff changeset
   134
        
eb9188f2ee4f first commit
wakimd
parents:
diff changeset
   135
        self.sync_iri_file()        
eb9188f2ee4f first commit
wakimd
parents:
diff changeset
   136
        # update it 
eb9188f2ee4f first commit
wakimd
parents:
diff changeset
   137
        super(Content, self).save(*args, **kwargs)
eb9188f2ee4f first commit
wakimd
parents:
diff changeset
   138
    
eb9188f2ee4f first commit
wakimd
parents:
diff changeset
   139
    def __unicode__(self):
eb9188f2ee4f first commit
wakimd
parents:
diff changeset
   140
        return str(self.id) + ": " + self.iri_id
eb9188f2ee4f first commit
wakimd
parents:
diff changeset
   141
        
eb9188f2ee4f first commit
wakimd
parents:
diff changeset
   142
    def iri_url(self, web_url=settings.WEB_URL):
eb9188f2ee4f first commit
wakimd
parents:
diff changeset
   143
        if 'http' in self.iriurl or 'https' in self.iriurl:
eb9188f2ee4f first commit
wakimd
parents:
diff changeset
   144
            return self.iriurl
eb9188f2ee4f first commit
wakimd
parents:
diff changeset
   145
        else:
eb9188f2ee4f first commit
wakimd
parents:
diff changeset
   146
            return unicode(web_url) + unicode(settings.MEDIA_URL)+u"media/ldt/"+unicode(self.iriurl)
eb9188f2ee4f first commit
wakimd
parents:
diff changeset
   147
    
eb9188f2ee4f first commit
wakimd
parents:
diff changeset
   148
    def iri_file_path(self):
eb9188f2ee4f first commit
wakimd
parents:
diff changeset
   149
        return os.path.join(os.path.join(os.path.join(os.path.join(settings.MEDIA_ROOT, "media"), "ldt"), self.iri_id), os.path.basename(self.iriurl))
eb9188f2ee4f first commit
wakimd
parents:
diff changeset
   150
eb9188f2ee4f first commit
wakimd
parents:
diff changeset
   151
    def iri_url_template(self):
eb9188f2ee4f first commit
wakimd
parents:
diff changeset
   152
        return "${web_url}${media_url}media/ldt/" + unicode(self.iri_id) + "/" + os.path.basename(self.iriurl)
eb9188f2ee4f first commit
wakimd
parents:
diff changeset
   153
eb9188f2ee4f first commit
wakimd
parents:
diff changeset
   154
eb9188f2ee4f first commit
wakimd
parents:
diff changeset
   155
    def __get_empty_media(self):
eb9188f2ee4f first commit
wakimd
parents:
diff changeset
   156
        if settings.EMPTY_MEDIA_EXTERNALID:
9
505a1c4cac67 correct empty projects
ymh <ymh.work@gmail.com>
parents: 1
diff changeset
   157
            empty_media = Media.objects.get(external_id=settings.EMPTY_MEDIA_EXTERNALID)
1
eb9188f2ee4f first commit
wakimd
parents:
diff changeset
   158
            return empty_media
eb9188f2ee4f first commit
wakimd
parents:
diff changeset
   159
        else:
eb9188f2ee4f first commit
wakimd
parents:
diff changeset
   160
            return None
eb9188f2ee4f first commit
wakimd
parents:
diff changeset
   161
            
eb9188f2ee4f first commit
wakimd
parents:
diff changeset
   162
    
eb9188f2ee4f first commit
wakimd
parents:
diff changeset
   163
    def stream_src():
eb9188f2ee4f first commit
wakimd
parents:
diff changeset
   164
        
eb9188f2ee4f first commit
wakimd
parents:
diff changeset
   165
        def fget(self):
eb9188f2ee4f first commit
wakimd
parents:
diff changeset
   166
            if self.media_obj is not None:
eb9188f2ee4f first commit
wakimd
parents:
diff changeset
   167
                return self.media_obj.stream_src
eb9188f2ee4f first commit
wakimd
parents:
diff changeset
   168
            else:
eb9188f2ee4f first commit
wakimd
parents:
diff changeset
   169
                return None
eb9188f2ee4f first commit
wakimd
parents:
diff changeset
   170
        
eb9188f2ee4f first commit
wakimd
parents:
diff changeset
   171
        return locals()
eb9188f2ee4f first commit
wakimd
parents:
diff changeset
   172
    
eb9188f2ee4f first commit
wakimd
parents:
diff changeset
   173
    stream_src = property(**stream_src())
eb9188f2ee4f first commit
wakimd
parents:
diff changeset
   174
    
eb9188f2ee4f first commit
wakimd
parents:
diff changeset
   175
    def videopath(): #@NoSelf
eb9188f2ee4f first commit
wakimd
parents:
diff changeset
   176
        doc = """simulate videopath""" #@UnusedVariable
eb9188f2ee4f first commit
wakimd
parents:
diff changeset
   177
       
eb9188f2ee4f first commit
wakimd
parents:
diff changeset
   178
        def fget(self):
eb9188f2ee4f first commit
wakimd
parents:
diff changeset
   179
            if self.media_obj is None:
eb9188f2ee4f first commit
wakimd
parents:
diff changeset
   180
                empty_media = self.__get_empty_media()
eb9188f2ee4f first commit
wakimd
parents:
diff changeset
   181
                if empty_media:
eb9188f2ee4f first commit
wakimd
parents:
diff changeset
   182
                    return empty_media.videopath
eb9188f2ee4f first commit
wakimd
parents:
diff changeset
   183
                else: 
eb9188f2ee4f first commit
wakimd
parents:
diff changeset
   184
                    return None
eb9188f2ee4f first commit
wakimd
parents:
diff changeset
   185
            else:
eb9188f2ee4f first commit
wakimd
parents:
diff changeset
   186
                return self.media_obj.videopath
eb9188f2ee4f first commit
wakimd
parents:
diff changeset
   187
           
eb9188f2ee4f first commit
wakimd
parents:
diff changeset
   188
        def fset(self, value):
eb9188f2ee4f first commit
wakimd
parents:
diff changeset
   189
            if self.media_obj is not None:
eb9188f2ee4f first commit
wakimd
parents:
diff changeset
   190
                self.media_obj.videopath = value
eb9188f2ee4f first commit
wakimd
parents:
diff changeset
   191
                      
eb9188f2ee4f first commit
wakimd
parents:
diff changeset
   192
        return locals()
eb9188f2ee4f first commit
wakimd
parents:
diff changeset
   193
       
eb9188f2ee4f first commit
wakimd
parents:
diff changeset
   194
    videopath = property(**videopath())
eb9188f2ee4f first commit
wakimd
parents:
diff changeset
   195
eb9188f2ee4f first commit
wakimd
parents:
diff changeset
   196
    def src(): #@NoSelf
eb9188f2ee4f first commit
wakimd
parents:
diff changeset
   197
        doc = """simulate videopath""" #@UnusedVariable
eb9188f2ee4f first commit
wakimd
parents:
diff changeset
   198
       
eb9188f2ee4f first commit
wakimd
parents:
diff changeset
   199
        def fget(self):
eb9188f2ee4f first commit
wakimd
parents:
diff changeset
   200
            if self.media_obj is None:
eb9188f2ee4f first commit
wakimd
parents:
diff changeset
   201
                empty_media = self.__get_empty_media()
eb9188f2ee4f first commit
wakimd
parents:
diff changeset
   202
                if empty_media:
eb9188f2ee4f first commit
wakimd
parents:
diff changeset
   203
                    return empty_media.src
eb9188f2ee4f first commit
wakimd
parents:
diff changeset
   204
                else:
eb9188f2ee4f first commit
wakimd
parents:
diff changeset
   205
                    return None
eb9188f2ee4f first commit
wakimd
parents:
diff changeset
   206
            else:
eb9188f2ee4f first commit
wakimd
parents:
diff changeset
   207
                return self.media_obj.src
eb9188f2ee4f first commit
wakimd
parents:
diff changeset
   208
           
eb9188f2ee4f first commit
wakimd
parents:
diff changeset
   209
        def fset(self, value):
eb9188f2ee4f first commit
wakimd
parents:
diff changeset
   210
            if self.media_obj is None or self.media_obj.src != value:
eb9188f2ee4f first commit
wakimd
parents:
diff changeset
   211
                media, created = Media.objects.get_or_create(src=value, defaults={'src':value})                
eb9188f2ee4f first commit
wakimd
parents:
diff changeset
   212
                self.media_obj = media
eb9188f2ee4f first commit
wakimd
parents:
diff changeset
   213
                self.save()
eb9188f2ee4f first commit
wakimd
parents:
diff changeset
   214
                      
eb9188f2ee4f first commit
wakimd
parents:
diff changeset
   215
        return locals()
eb9188f2ee4f first commit
wakimd
parents:
diff changeset
   216
       
eb9188f2ee4f first commit
wakimd
parents:
diff changeset
   217
    src = property(**src())
eb9188f2ee4f first commit
wakimd
parents:
diff changeset
   218
eb9188f2ee4f first commit
wakimd
parents:
diff changeset
   219
    def external_id(): #@NoSelf
eb9188f2ee4f first commit
wakimd
parents:
diff changeset
   220
        doc = """simulate externalid""" #@UnusedVariable
eb9188f2ee4f first commit
wakimd
parents:
diff changeset
   221
       
eb9188f2ee4f first commit
wakimd
parents:
diff changeset
   222
        def fget(self):
eb9188f2ee4f first commit
wakimd
parents:
diff changeset
   223
            if self.media_obj is None:
eb9188f2ee4f first commit
wakimd
parents:
diff changeset
   224
                empty_media = self.__get_empty_media()
eb9188f2ee4f first commit
wakimd
parents:
diff changeset
   225
                if empty_media:
eb9188f2ee4f first commit
wakimd
parents:
diff changeset
   226
                    return empty_media.external_id
eb9188f2ee4f first commit
wakimd
parents:
diff changeset
   227
                else: 
eb9188f2ee4f first commit
wakimd
parents:
diff changeset
   228
                    return None
eb9188f2ee4f first commit
wakimd
parents:
diff changeset
   229
            else:
eb9188f2ee4f first commit
wakimd
parents:
diff changeset
   230
                return self.media_obj.external_id
eb9188f2ee4f first commit
wakimd
parents:
diff changeset
   231
           
eb9188f2ee4f first commit
wakimd
parents:
diff changeset
   232
        def fset(self, value):
eb9188f2ee4f first commit
wakimd
parents:
diff changeset
   233
            if self.media_obj is not None:
eb9188f2ee4f first commit
wakimd
parents:
diff changeset
   234
                self.media_obj.external_id = value
eb9188f2ee4f first commit
wakimd
parents:
diff changeset
   235
                      
eb9188f2ee4f first commit
wakimd
parents:
diff changeset
   236
        return locals()
eb9188f2ee4f first commit
wakimd
parents:
diff changeset
   237
       
eb9188f2ee4f first commit
wakimd
parents:
diff changeset
   238
    external_id = property(**external_id())
eb9188f2ee4f first commit
wakimd
parents:
diff changeset
   239
eb9188f2ee4f first commit
wakimd
parents:
diff changeset
   240
        
eb9188f2ee4f first commit
wakimd
parents:
diff changeset
   241
        
eb9188f2ee4f first commit
wakimd
parents:
diff changeset
   242
class Project(Document):  
eb9188f2ee4f first commit
wakimd
parents:
diff changeset
   243
    STATE_CHOICES=(
eb9188f2ee4f first commit
wakimd
parents:
diff changeset
   244
    (1, 'edition'),
eb9188f2ee4f first commit
wakimd
parents:
diff changeset
   245
    (2, 'published'),
eb9188f2ee4f first commit
wakimd
parents:
diff changeset
   246
    (3, 'moderated'),
eb9188f2ee4f first commit
wakimd
parents:
diff changeset
   247
    (4, 'rejected'),
eb9188f2ee4f first commit
wakimd
parents:
diff changeset
   248
    (5, 'deleted')
eb9188f2ee4f first commit
wakimd
parents:
diff changeset
   249
    )
eb9188f2ee4f first commit
wakimd
parents:
diff changeset
   250
    ldt_id = models.CharField(max_length=1024, unique=True)
eb9188f2ee4f first commit
wakimd
parents:
diff changeset
   251
    ldt = models.TextField(null=True)
eb9188f2ee4f first commit
wakimd
parents:
diff changeset
   252
    title = models.CharField(max_length=1024)
eb9188f2ee4f first commit
wakimd
parents:
diff changeset
   253
    contents = models.ManyToManyField(Content)
eb9188f2ee4f first commit
wakimd
parents:
diff changeset
   254
    creation_date = models.DateTimeField(auto_now_add=True)
eb9188f2ee4f first commit
wakimd
parents:
diff changeset
   255
    modification_date = models.DateTimeField(auto_now=True)
eb9188f2ee4f first commit
wakimd
parents:
diff changeset
   256
    created_by = models.CharField(_("created by"), max_length=70)
eb9188f2ee4f first commit
wakimd
parents:
diff changeset
   257
    changed_by = models.CharField(_("changed by"), max_length=70)
eb9188f2ee4f first commit
wakimd
parents:
diff changeset
   258
    state = models.IntegerField(choices=STATE_CHOICES, default=1)
eb9188f2ee4f first commit
wakimd
parents:
diff changeset
   259
    
eb9188f2ee4f first commit
wakimd
parents:
diff changeset
   260
    class Meta:
eb9188f2ee4f first commit
wakimd
parents:
diff changeset
   261
        ordering = ["title"]
eb9188f2ee4f first commit
wakimd
parents:
diff changeset
   262
eb9188f2ee4f first commit
wakimd
parents:
diff changeset
   263
    
eb9188f2ee4f first commit
wakimd
parents:
diff changeset
   264
    def __unicode__(self):
eb9188f2ee4f first commit
wakimd
parents:
diff changeset
   265
        return unicode(self.id) + u": " + unicode(self.ldt_id)
eb9188f2ee4f first commit
wakimd
parents:
diff changeset
   266
    
eb9188f2ee4f first commit
wakimd
parents:
diff changeset
   267
    def get_description(self, doc=None):
eb9188f2ee4f first commit
wakimd
parents:
diff changeset
   268
        
eb9188f2ee4f first commit
wakimd
parents:
diff changeset
   269
        if doc is None:
eb9188f2ee4f first commit
wakimd
parents:
diff changeset
   270
            doc = lxml.etree.fromstring(self.ldt)
eb9188f2ee4f first commit
wakimd
parents:
diff changeset
   271
        
eb9188f2ee4f first commit
wakimd
parents:
diff changeset
   272
        res = doc.xpath("/iri/project")
eb9188f2ee4f first commit
wakimd
parents:
diff changeset
   273
        if len(res) > 0:
eb9188f2ee4f first commit
wakimd
parents:
diff changeset
   274
            return res[0].get(u'abstract')
eb9188f2ee4f first commit
wakimd
parents:
diff changeset
   275
        else:
eb9188f2ee4f first commit
wakimd
parents:
diff changeset
   276
            return None
eb9188f2ee4f first commit
wakimd
parents:
diff changeset
   277
        
eb9188f2ee4f first commit
wakimd
parents:
diff changeset
   278
eb9188f2ee4f first commit
wakimd
parents:
diff changeset
   279
    @staticmethod
eb9188f2ee4f first commit
wakimd
parents:
diff changeset
   280
    def create_project(user, title, contents):
eb9188f2ee4f first commit
wakimd
parents:
diff changeset
   281
        owner = Owner.objects.get(user=user)
eb9188f2ee4f first commit
wakimd
parents:
diff changeset
   282
        project = Project(title=title, owner=owner)
eb9188f2ee4f first commit
wakimd
parents:
diff changeset
   283
        project.ldt_id = str(uuid.uuid1())
eb9188f2ee4f first commit
wakimd
parents:
diff changeset
   284
        project.created_by=user.username
eb9188f2ee4f first commit
wakimd
parents:
diff changeset
   285
        project.changed_by=user.username
eb9188f2ee4f first commit
wakimd
parents:
diff changeset
   286
        project.state = 1
eb9188f2ee4f first commit
wakimd
parents:
diff changeset
   287
        project.save()
eb9188f2ee4f first commit
wakimd
parents:
diff changeset
   288
        for content in contents:
eb9188f2ee4f first commit
wakimd
parents:
diff changeset
   289
            project.contents.add(content)
eb9188f2ee4f first commit
wakimd
parents:
diff changeset
   290
        project.save()
eb9188f2ee4f first commit
wakimd
parents:
diff changeset
   291
        return create_ldt(project, user)
eb9188f2ee4f first commit
wakimd
parents:
diff changeset
   292
eb9188f2ee4f first commit
wakimd
parents:
diff changeset
   293
    def copy_project(self, user, title):
eb9188f2ee4f first commit
wakimd
parents:
diff changeset
   294
        owner = Owner.objects.get(user=user)
eb9188f2ee4f first commit
wakimd
parents:
diff changeset
   295
        project = Project(title=title, owner=owner)
eb9188f2ee4f first commit
wakimd
parents:
diff changeset
   296
        project = copy_ldt(self, project, user)
eb9188f2ee4f first commit
wakimd
parents:
diff changeset
   297
        project.save()
eb9188f2ee4f first commit
wakimd
parents:
diff changeset
   298
        for content in self.contents.all():
eb9188f2ee4f first commit
wakimd
parents:
diff changeset
   299
            project.contents.add(content)
eb9188f2ee4f first commit
wakimd
parents:
diff changeset
   300
        project.save()
eb9188f2ee4f first commit
wakimd
parents:
diff changeset
   301
        return project
eb9188f2ee4f first commit
wakimd
parents:
diff changeset
   302
    
eb9188f2ee4f first commit
wakimd
parents:
diff changeset
   303
    def checkAccess(self, user):
eb9188f2ee4f first commit
wakimd
parents:
diff changeset
   304
        if (user and user.is_staff) or self.state == 2: 
eb9188f2ee4f first commit
wakimd
parents:
diff changeset
   305
            return True
eb9188f2ee4f first commit
wakimd
parents:
diff changeset
   306
        else:
eb9188f2ee4f first commit
wakimd
parents:
diff changeset
   307
            return False
eb9188f2ee4f first commit
wakimd
parents:
diff changeset
   308
        
eb9188f2ee4f first commit
wakimd
parents:
diff changeset
   309
eb9188f2ee4f first commit
wakimd
parents:
diff changeset
   310
class Segment(models.Model):
eb9188f2ee4f first commit
wakimd
parents:
diff changeset
   311
    
eb9188f2ee4f first commit
wakimd
parents:
diff changeset
   312
    project_obj = models.ForeignKey(Project, null=True)
eb9188f2ee4f first commit
wakimd
parents:
diff changeset
   313
    content = models.ForeignKey(Content)
eb9188f2ee4f first commit
wakimd
parents:
diff changeset
   314
    project_id = models.CharField(max_length=1024, unique=False, blank=True, null=True)
eb9188f2ee4f first commit
wakimd
parents:
diff changeset
   315
    iri_id = models.CharField(max_length=1024, unique=False)
eb9188f2ee4f first commit
wakimd
parents:
diff changeset
   316
    ensemble_id = models.CharField(max_length=1024, unique=False)
eb9188f2ee4f first commit
wakimd
parents:
diff changeset
   317
    cutting_id = models.CharField(max_length=1024, unique=False)    
eb9188f2ee4f first commit
wakimd
parents:
diff changeset
   318
    element_id = models.CharField(max_length=1024, unique=False)
eb9188f2ee4f first commit
wakimd
parents:
diff changeset
   319
    tags = tagging.fields.TagField(max_length=2048, null=True, blank=True, unique=False)
eb9188f2ee4f first commit
wakimd
parents:
diff changeset
   320
    title = models.CharField(max_length=2048, unique=False, null=True, blank=True)
eb9188f2ee4f first commit
wakimd
parents:
diff changeset
   321
    duration = models.IntegerField(null=True)
eb9188f2ee4f first commit
wakimd
parents:
diff changeset
   322
    start_ts = models.IntegerField(null=True)
eb9188f2ee4f first commit
wakimd
parents:
diff changeset
   323
    author = models.CharField(max_length=1024, unique=False, null=True, blank=True)
eb9188f2ee4f first commit
wakimd
parents:
diff changeset
   324
    date = models.CharField(max_length=128, unique=False, null=True, blank=True)
eb9188f2ee4f first commit
wakimd
parents:
diff changeset
   325
    abstract = models.TextField(null=True, blank=True)
eb9188f2ee4f first commit
wakimd
parents:
diff changeset
   326
    
eb9188f2ee4f first commit
wakimd
parents:
diff changeset
   327
    def __unicode__(self):
eb9188f2ee4f first commit
wakimd
parents:
diff changeset
   328
        return "/".join((unicode(self.project_id), unicode(self.iri_id), unicode(self.ensemble_id), unicode(self.cutting_id), unicode(self.element_id)))
eb9188f2ee4f first commit
wakimd
parents:
diff changeset
   329
    
eb9188f2ee4f first commit
wakimd
parents:
diff changeset
   330
    class Meta:
eb9188f2ee4f first commit
wakimd
parents:
diff changeset
   331
        unique_together = (('project_id', 'iri_id', 'ensemble_id', 'cutting_id', 'element_id'),)
eb9188f2ee4f first commit
wakimd
parents:
diff changeset
   332
eb9188f2ee4f first commit
wakimd
parents:
diff changeset
   333