From: yomguy Date: Wed, 26 Dec 2012 14:21:49 +0000 (+0100) Subject: add media_package import script (multi format) with item duration processing, X-Git-Tag: 0.9-probarreau~211 X-Git-Url: https://git.parisson.com/?a=commitdiff_plain;h=d9257593972808281bcd92a52a26243b85abc058;p=teleforma.git add media_package import script (multi format) with item duration processing, --- diff --git a/teleforma/context_processors.py b/teleforma/context_processors.py new file mode 100644 index 00000000..1153451b --- /dev/null +++ b/teleforma/context_processors.py @@ -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 + + +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 index 00000000..ea665a1e --- /dev/null +++ b/teleforma/management/commands/teleforma-import-seminars.py @@ -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 diff --git a/teleforma/models/pro.py b/teleforma/models/pro.py index f8b7bb4d..d7ad1bbf 100644 --- a/teleforma/models/pro.py +++ b/teleforma/models/pro.py @@ -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' diff --git a/teleforma/templates/teleforma/inc/media_package_list.html b/teleforma/templates/teleforma/inc/media_package_list.html index b5cb6259..81b3933f 100644 --- a/teleforma/templates/teleforma/inc/media_package_list.html +++ b/teleforma/templates/teleforma/inc/media_package_list.html @@ -39,7 +39,7 @@ {% if media.description %}
{% trans "Description" %}
{{ media.description }}
{% endif %} -
{% trans "Duration" %}
{{ item.approx_duration }}
+
{% trans "Duration" %}
{{ media.item.approx_duration }}
diff --git a/teleforma/templates/teleforma/seminar_media_audio.html b/teleforma/templates/teleforma/seminar_media_audio.html index b6eca800..b5114af5 100644 --- a/teleforma/templates/teleforma/seminar_media_audio.html +++ b/teleforma/templates/teleforma/seminar_media_audio.html @@ -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 %} diff --git a/teleforma/templates/teleforma/seminar_media_video.html b/teleforma/templates/teleforma/seminar_media_video.html index af88f02a..b2c82004 100644 --- a/teleforma/templates/teleforma/seminar_media_video.html +++ b/teleforma/templates/teleforma/seminar_media_video.html @@ -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 %} diff --git a/teleforma/templates/teleforma/seminars.html b/teleforma/templates/teleforma/seminars.html index 9560a2cc..7121f877 100644 --- a/teleforma/templates/teleforma/seminars.html +++ b/teleforma/templates/teleforma/seminars.html @@ -36,6 +36,7 @@ $(function() {
    {% block courses %} + {% for seminar in all_seminars %}
  • {{ seminar.title }}
  • {% endfor %} diff --git a/teleforma/templatetags/teleforma_tags.py b/teleforma/templatetags/teleforma_tags.py index cc7b85b6..742cd37f 100644 --- a/teleforma/templatetags/teleforma_tags.py +++ b/teleforma/templatetags/teleforma_tags.py @@ -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 + diff --git a/teleforma/views/pro.py b/teleforma/views/pro.py index 075d9264..f9ef96ff 100644 --- a/teleforma/views/pro.py +++ b/teleforma/views/pro.py @@ -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:
    %s
    ' % 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)