--- /dev/null
+# -*- 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}
--- /dev/null
+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
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'
{% 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>
{% 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" /> {% trans "Download" %}</a>
</div>
{% 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" /> {% trans "Download" %}</a>
</div>
<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 %}
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
+
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
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):
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()
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
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):
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):
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)
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)