]> git.parisson.com Git - teleforma.git/commitdiff
add media_package import script (multi format) with item duration processing,
authoryomguy <yomguy@parisson.com>
Wed, 26 Dec 2012 14:21:49 +0000 (15:21 +0100)
committeryomguy <yomguy@parisson.com>
Wed, 26 Dec 2012 14:21:49 +0000 (15:21 +0100)
teleforma/context_processors.py [new file with mode: 0644]
teleforma/management/commands/teleforma-import-seminars.py [new file with mode: 0644]
teleforma/models/pro.py
teleforma/templates/teleforma/inc/media_package_list.html
teleforma/templates/teleforma/seminar_media_audio.html
teleforma/templates/teleforma/seminar_media_video.html
teleforma/templates/teleforma/seminars.html
teleforma/templatetags/teleforma_tags.py
teleforma/views/pro.py

diff --git a/teleforma/context_processors.py b/teleforma/context_processors.py
new file mode 100644 (file)
index 0000000..1153451
--- /dev/null
@@ -0,0 +1,134 @@
+# -*- coding: utf-8 -*-
+# Copyright (c) 2012 Parisson SARL
+
+# This software is a computer program whose purpose is to backup, analyse,
+# transcode and stream any audio content with its metadata over a web frontend.
+
+# This software is governed by the CeCILL  license under French law and
+# abiding by the rules of distribution of free software.  You can  use,
+# modify and/ or redistribute the software under the terms of the CeCILL
+# license as circulated by CEA, CNRS and INRIA at the following URL
+# "http://www.cecill.info".
+
+# As a counterpart to the access to the source code and  rights to copy,
+# modify and redistribute granted by the license, users are provided only
+# with a limited warranty  and the software's author,  the holder of the
+# economic rights,  and the successive licensors  have only  limited
+# liability.
+
+# In this respect, the user's attention is drawn to the risks associated
+# with loading,  using,  modifying and/or developing or reproducing the
+# software by the user in light of its specific status of free software,
+# that may mean  that it is complicated to manipulate,  and  that  also
+# therefore means  that it is reserved for developers  and  experienced
+# professionals having in-depth computer knowledge. Users are therefore
+# encouraged to load and test the software's suitability as regards their
+# requirements in conditions enabling the security of their systems and/or
+# data to be ensured and,  more generally, to use and operate it in the
+# same conditions as regards security.
+
+# The fact that you are presently reading this means that you have had
+# knowledge of the CeCILL license and that you accept its terms.
+#
+# Authors: Guillaume Pellerin <yomguy@parisson.com>
+
+
+from teleforma.views.core import *
+
+
+def seminar_progress(user, seminar):    
+    """return the user progress of a seminar in percent
+    """
+
+    progress = 0
+    total = 0
+    
+    objects = [seminar.docs_1, seminar.docs_2, seminar.media, seminar.docs_correct]
+    for obj in objects:
+        for item in obj.all():
+            total += item.weight
+            if user in item.readers.all():
+                progress += item.weight
+    
+    questions = Question.objects.filter(seminar=seminar, status=3)
+    for question in questions:
+        total += question.weight
+        answer = Answer.objects.filter(question=question, status=3, user=user)
+        if answer:
+            progress += question.weight
+
+    if total != 0:
+        return int(progress*100/total)
+    else:
+        return 0
+
+def seminar_validated(user, seminar):
+    validated = []
+    questions = seminar.question.all()
+    if questions:
+        for question in questions:
+            answers = Answer.objects.filter(question= question, user=user, validated=True)
+            if answers:
+                validated.append(True)
+            else:
+                validated.append(False)
+        return not False in validated
+    return False
+
+
+def all_seminars(request):
+    seminars = []
+    user = request.user
+    
+    if not user.is_authenticated():
+        return {}
+
+    professor = user.professor.all()
+    auditor = user.auditor.all()
+
+    if professor:
+        seminars = []
+        professor = user.professor.get()
+        courses = professor.courses.all()
+        for course in courses:
+            for seminar in course.seminar.all():
+                seminars.append(seminar)
+
+    elif auditor and not (user.is_staff or user.is_superuser):
+        auditor = user.auditor.get()
+        s_seminars = auditor.seminars.all()
+
+    elif user.is_staff or user.is_superuser:
+        seminars = Seminar.objects.all()
+    else:
+        seminars = None
+
+    return {'all_seminars': seminars}
+
+
+def total_progress(request):
+    """return the user progress of all seminars in percent"""
+
+    user = request.user
+    progress = 0
+
+    if not user.is_authenticated():
+        return {'total_progress': 0}
+
+    auditor = user.auditor.all()
+    professor = user.professor.all()
+
+    if auditor and not (user.is_staff or user.is_superuser):
+        seminars = auditor[0].seminars.all()        
+    elif user.is_superuser or user.is_staff:
+        seminars = Seminar.objects.all()
+    elif professor:
+        seminars = all_seminars(request)
+        
+    for seminar in seminars:
+        progress += seminar_progress(user, seminar)
+
+    if seminars:
+        return {'total_progress': int(progress/len(seminars))}
+    else:
+        return {'total_progress': 0}
diff --git a/teleforma/management/commands/teleforma-import-seminars.py b/teleforma/management/commands/teleforma-import-seminars.py
new file mode 100644 (file)
index 0000000..ea665a1
--- /dev/null
@@ -0,0 +1,164 @@
+from optparse import make_option
+from django.conf import settings
+from django.core.management.base import BaseCommand, CommandError
+from django.contrib.auth.models import User
+from django.template.defaultfilters import slugify
+from telemeta.models import *
+from telemeta.util.unaccent import unaccent
+from teleforma.models import *
+import logging
+import os, sys, time, datetime
+import timeside
+
+
+class Logger:
+    """A logging object"""
+
+    def __init__(self, file):
+        self.logger = logging.getLogger('teleforma')
+        self.hdlr = logging.FileHandler(file)
+        self.formatter = logging.Formatter('%(asctime)s %(levelname)s %(message)s')
+        self.hdlr.setFormatter(self.formatter)
+        self.logger.addHandler(self.hdlr)
+        self.logger.setLevel(logging.INFO)
+
+
+class Command(BaseCommand):
+    help = "Import seminars from the MEDIA_ROOT directory "
+    admin_email = 'webmaster@parisson.com'
+    args = 'organization log_file'
+    spacer = '_-_'
+    audio_formats = ['ogg', 'mp3']
+    video_formats = ['webm', 'mp4']
+    image_formats = ['png', 'jpg']
+    media_rank_dict = {'bis': 2, 'ter': 3, 'quarter': 4}
+
+    def cleanup(self):
+        medias = MediaPackage.objects.all()
+        for media in medias:
+            for m in media.video.all():
+                m.delete()
+            for m in media.audio.all():
+                m.delete()
+            media.delete()
+
+    def handle(self, *args, **options):
+        organization_name = args[0]
+        log_file = args[1]
+        logger = Logger(log_file)
+
+        organization = Organization.objects.get(name=organization_name)
+        self.media_dir = settings.MEDIA_ROOT + organization.name
+        file_list = []
+        i = 1
+
+        self.cleanup()
+
+        for root, dirs, files in os.walk(self.media_dir):
+            for filename in files:
+                name = os.path.splitext(filename)[0]
+                ext = os.path.splitext(filename)[1][1:]
+
+                if ext in self.video_formats or ext in self.audio_formats:
+                    root_list = root.split(os.sep)
+
+                    # seminar_rank <= 9
+                    seminar_rank = int(root_list[-1][0])
+                    if len(root_list[-1]) != 1:
+                        media_rank = media_rank_dict(root_list[-1][1:])
+                    else:
+                        media_rank = 1
+
+                    course_code = root_list[-2]
+                    department_name = root_list[-3]
+                    organization_name = root_list[-4]
+
+                    dir = os.sep.join(root_list[-4:])
+                    path = dir + os.sep + filename
+
+                    seminar_title = '_'.join([course_code, str(seminar_rank)])
+                    collection_id = '_'.join([department_name, seminar_title])
+                    course = Course.objects.get(code=course_code)
+                    department, c = Department.objects.get_or_create(name=department_name,
+                                                                     organization=organization)
+                    seminar, c = Seminar.objects.get_or_create(course=course, rank=seminar_rank)
+
+                    exist = False
+
+                    media_packages = seminar.media.all()
+                    for media_package in media_packages:
+                        for media in media_package.video.all():
+                            if media.item.file == path:
+                                exist = True
+                                break
+                        for media in media_package.audio.all():
+                            if media.item.file == path:
+                                exist = True
+                                break
+
+                    if not exist:
+                        collections = MediaCollection.objects.filter(code=collection_id)
+                        if not collections:
+                            collection = MediaCollection(code=collection_id,title=collection_id)
+                            collection.save()
+                        else:
+                            collection = collections[0]
+
+                        id = '_'.join([collection_id, ext, str(i)])
+
+                        items = MediaItem.objects.filter(collection=collection, code=id)
+                        if not items:
+                            item = MediaItem(collection=collection, code=id)
+                            item.save()
+                        else:
+                            item = items[0]
+
+                        item.title = name
+                        item.file = path
+
+                        print path
+                        decoder = timeside.decoder.FileDecoder(root+os.sep+filename)
+                        decoder.setup()
+                        time.sleep(0.1)
+                        value = str(datetime.timedelta(0,decoder.input_duration))
+                        t = value.split(':')
+                        t[2] = t[2].split('.')[0]
+                        t = ':'.join(t)
+                        item.approx_duration = t
+                        item.save()
+                        
+                        files = os.listdir(root)
+                        for file in files:
+                            filename, extension = os.path.splitext(file)
+                            if extension[1:] in self.image_formats:
+                                related = MediaItemRelated(item=item)
+                                related.file = dir + os.sep + file
+                                related.title = 'preview'
+                                related.set_mime_type()
+                                related.save()
+                                break
+
+                        media = Media(item=item, course=course, type=ext)
+                        media.set_mime_type()
+                        media.save()
+                        
+                        media_package_exist = False
+                        media_packages = seminar.media.all()
+                        for media_package in media_packages:
+                            if media_package.rank == media_rank:
+                                media_package_exist = True
+                                break
+                        
+                        if not media_package_exist:
+                            media_package = MediaPackage(rank=media_rank, title=seminar_title)
+                            media_package.save()
+                            seminar.media.add(media_package)
+
+                        if ext in self.video_formats:
+                            media_package.video.add(media)
+                        if ext in self.audio_formats:
+                            media_package.audio.add(media)
+
+
+                        logger.logger.info(path)
+                        i += 1
index f8b7bb4d456378bfb8712f89407da407e48a9ca4..d7ad1bbfedb8c9d9f4f0a7964ed2f899231eb4dc 100644 (file)
@@ -59,10 +59,8 @@ class MediaPackage(MediaBase):
     def __str__(self):
         if self.title:
             return self.title.encode('utf8')
-        elif self.audio_items:
-            return self.audio_items.all()[0].title.encode('utf8')
-        elif self.video_items:
-            return self.video_items.all()[0].title.encode('utf8')
+        else:
+            return 'Unknown'
 
     class Meta(MetaCore):
         db_table = app_label + '_' + 'media_package'
index b5cb625965a7d01d6fc8200775c465ed57d52e9d..81b3933ff978e40e23d0dcb815c0274ad412b4f6 100644 (file)
@@ -39,7 +39,7 @@
                     {% if media.description %}
                     <dt>{% trans "Description" %}</dt><dd>{{ media.description }}</dd>
                     {% endif %}
-                    <dt>{% trans "Duration" %}</dt><dd>{{ item.approx_duration }}</dd>
+                    <dt>{% trans "Duration" %}</dt><dd>{{ media.item.approx_duration }}</dd>
                     </dl>
                  </div>
             </td>
index b6eca8004dd46a2d98681992d7d752446bb7471a..b5114af5460ead075c92284ac615910ef22c01d0 100644 (file)
@@ -5,7 +5,7 @@
 
 {% block module-action %}
 {% for media in media_package.audio.all %}
-    {% if media.item.file and media.is_published %}
+    {% if media.item.file and media.is_published and media.item.file.path|in_download_formats %}
      <div class="module_action"> 
      <a href="{{ MEDIA_URL }}{{ media.item.file }}" class="component_icon button" id="action_red"><img src="{{STATIC_URL}}teleforma/images/download_media.png" alt="" style="vertical-align:middle" />&nbsp;{% trans "Download" %}</a>
      </div>
index af88f02a8aa5da112112d5997ea993afacaa0018..b2c82004f6bbd261981b9ff98234b3c06e17d002 100644 (file)
@@ -53,7 +53,7 @@ $(window).ready(function(){
 
 {% block module-action %}
 {% for media in media_package.video.all %}
-    {% if media.item.file and media.is_published %}
+    {% if media.item.file and media.is_published and media.item.file.path|in_download_formats %}
      <div class="module_action"> 
      <a href="{{ MEDIA_URL }}{{ media.item.file }}" class="component_icon button" id="action_red"><img src="{{STATIC_URL}}teleforma/images/download_media.png" alt="" style="vertical-align:middle" />&nbsp;{% trans "Download" %}</a>
      </div>
index 9560a2ccf7438226ca6d749f75c196d1c9716e6c..7121f87740d632d08298d7f139c31f3825cdce92 100644 (file)
@@ -36,6 +36,7 @@ $(function() {
 <div style="background: white;">
 <ul>
 {% block courses %}
+
 {% for seminar in all_seminars %}
    <li><a href="{% url teleforma-seminar-detail seminar.id %}">{{ seminar.title }}</a></li>
  {% endfor %}
index cc7b85b634439cd34cfd37549f0410510207d1d5..742cd37fdd1ac4d6613275d64473ed392c4d907a 100644 (file)
@@ -249,3 +249,9 @@ def summary(text, N):
 def progress(seminar, user):
     return seminar_progress(user, seminar)
     
+@register.filter
+def in_download_formats(file):
+    ext = os.path.splitext(file)[1][1:]
+    print ext
+    return ext in settings.TELEMETA_DOWNLOAD_FORMATS
+    
index 075d92640b89b6b947905cba235fc2e3fa782528..f9ef96ff0670b8bf60a01225971ab20542b9da53 100644 (file)
@@ -34,6 +34,8 @@
 
 
 from teleforma.views.core import *
+from teleforma.context_processors import *
+
 from django.utils.translation import ugettext_lazy as _
 from django.template import loader, Context, RequestContext
 from django.views.generic.base import TemplateResponseMixin
@@ -92,33 +94,6 @@ def render_to_pdf(request, template, context, filename=None, encoding='utf-8',
     return HttpResponse('Errors rendering pdf:<pre>%s</pre>' % escape(content))
 
 
-def get_seminars(user):
-    seminars = []
-
-    if not user.is_authenticated():
-        return None
-
-    professor = user.professor.all()
-    auditor = user.auditor.all()
-
-    if professor:
-        seminars = []
-        professor = user.professor.get()
-        courses = professor.courses.all()
-        for course in courses:
-            for seminar in course.seminar.all():
-                seminars.append(seminar)
-
-    elif auditor and not (user.is_staff or user.is_superuser):
-        auditor = user.auditor.get()
-        s_seminars = auditor.seminars.all()
-
-    elif user.is_staff or user.is_superuser:
-        seminars = Seminar.objects.all()
-    else:
-        seminars = None
-
-    return seminars
 
 
 def seminar_progress(user, seminar):    
@@ -147,29 +122,6 @@ def seminar_progress(user, seminar):
     else:
         return 0
 
-
-def total_progress(user):
-    """return the user progress of all seminars in percent"""
-
-    progress = 0
-    auditor = user.auditor.all()
-    professor = user.professor.all()
-
-    if auditor and not (user.is_staff or user.is_superuser):
-        seminars = auditor[0].seminars.all()        
-    elif user.is_superuser or user.is_staff:
-        seminars = Seminar.objects.all()
-    elif professor:
-        seminars = get_seminars(user)
-        
-    for seminar in seminars:
-        progress += seminar_progress(user, seminar)
-
-    if seminars:
-        return int(progress/len(seminars))
-    else:
-        return 0
-
 def seminar_validated(user, seminar):
     validated = []
     questions = seminar.question.all()
@@ -196,11 +148,8 @@ class SeminarView(DetailView):
     def get_context_data(self, **kwargs):
         context = super(SeminarView, self).get_context_data(**kwargs)
         seminar = self.get_object()
-        context['all_seminars'] = get_seminars(self.request.user)
         context['seminar_progress'] = seminar_progress(self.request.user, seminar)
-        context['total_progress'] = total_progress(self.request.user)
         context['validated'] = seminar_validated(self.request.user, seminar)
-        context['evaluation'] = seminar.form
         return context
 
 
@@ -209,15 +158,6 @@ class SeminarsView(ListView):
     model = Seminar
     template_name='teleforma/seminars.html'
 
-    def get_queryset(self):
-        self.seminars = get_seminars(self.request.user)
-        return self.seminars
-
-    def get_context_data(self, **kwargs):
-        context = super(SeminarsView, self).get_context_data(**kwargs)
-        context['all_seminars'] = self.seminars
-        context['total_progress'] = total_progress(self.request.user)
-        return context
 
     @method_decorator(login_required)
     def dispatch(self, *args, **kwargs):
@@ -264,12 +204,10 @@ class AnswerView(FormView):
 
     def get_context_data(self, **kwargs):
         context = super(AnswerView, self).get_context_data(**kwargs)
-        context['all_seminars'] = get_seminars(self.request.user)
         context['question'] = self.question
         context['status'] = self.status
         context['seminar'] = self.question.seminar
         context['seminar_progress'] = seminar_progress(self.request.user, self.question.seminar)
-        context['total_progress'] = total_progress(self.request.user)
         return context
 
     def get_success_url(self):
@@ -286,12 +224,9 @@ class MediaPackageView(DetailView):
         media_package = self.get_object()
         media_package.readers.add(self.request.user)
         seminar = media_package.seminar.get()
-        all_seminars = get_seminars(self.request.user)
-        context['all_seminars'] = all_seminars
         context['seminar'] = seminar
         context['media_package'] = media_package
         context['seminar_progress'] = seminar_progress(self.request.user, seminar)
-        context['total_progress'] = total_progress(self.request.user)
         return context
 
     @method_decorator(login_required)
@@ -447,8 +382,6 @@ def evaluation_form_detail(request, pk, template='teleforma/evaluation_form.html
             return redirect('teleforma-seminar-detail', seminar.id)
 
     context['seminar'] = seminar
-    context['all_seminars'] = get_seminars(request.user)
-    context['total_progress'] = total_progress(request.user)
     context['form'] = form
     context['seminar_progress'] = seminar_progress(request.user, seminar)