]> git.parisson.com Git - teleforma.git/commitdiff
Merge branch 'feature/dj4.2' into tc/merge
authorGuillaume Pellerin <guillaume.pellerin@parisson.com>
Fri, 18 Apr 2025 18:02:38 +0000 (20:02 +0200)
committerGuillaume Pellerin <guillaume.pellerin@parisson.com>
Fri, 18 Apr 2025 18:02:38 +0000 (20:02 +0200)
20 files changed:
1  2 
teleforma/admin.py
teleforma/forms.py
teleforma/locale/fr/LC_MESSAGES/django.po
teleforma/management/commands/teleforma-import-conferences.py
teleforma/management/commands/teleforma-pull-courses.py
teleforma/models/core.py
teleforma/pages/fr/help.rst
teleforma/templates/teleforma/course_conference.html
teleforma/templates/teleforma/course_conference_audio.html
teleforma/templates/teleforma/course_conference_record.html
teleforma/templates/teleforma/course_detail.html
teleforma/templates/teleforma/course_document.html
teleforma/templates/teleforma/inc/media_list.html
teleforma/templates/telemeta/base.html
teleforma/templates/telemeta/home.html
teleforma/templates/telemeta/inc/module_revisions.html
teleforma/templates/telemeta/inc/module_user_revisions.html
teleforma/templatetags/teleforma_tags.py
teleforma/views/ae.py
teleforma/views/core.py

index 68c70bd2ee7a6136e9109216dfe1d02e8dbdb04f,da4194a56fa72ce73ea88d0ad654c3e4bda70d70..2e096d127e60ac4ac6c33f6c2c9d89a94fcdbd5c
@@@ -43,20 -304,238 +304,239 @@@ class CourseTypeAdmin(admin.ModelAdmin)
  class CourseAdmin(admin.ModelAdmin):
      model = Course
      ordering = ['number']
 +    filter_horizontal = ['types']
  
  class DocumentAdmin(admin.ModelAdmin):
+     list_per_page = 30
      exclude = ['readers']
      filter_horizontal = ['course_type']
-     search_fields = ['course__code', 'course__title']
+     list_filter = ('course', 'periods', 'date_added', 'type')
+     search_fields = ['course__code', 'course__title', 'type__name']
+ class ConferenceDateBeginFilter(admin.SimpleListFilter):
+     title = _(u'date de début')
+     # Parameter for the filter that will be used in the URL query.
+     parameter_name = 'date_begin'
+     def lookups(self, request, model_admin):
+         """
+         Returns a list of tuples. The first element in each
+         tuple is the coded value for the option that will
+         appear in the URL query. The second element is the
+         human-readable name for the option that will appear
+         in the right sidebar.
+         """
+         conferences = Conference.objects.all()
+         dates = [c.date_begin.date() for c in conferences if c.date_begin]
+         dates = set(dates)
+         res = [(d.strftime('%Y%m%d'), d.strftime('%d/%m/%Y')) for d in dates]
+         return sorted(res)[::-1]
+     def queryset(self, request, queryset):
+         """
+         Returns the filtered queryset based on the value
+         provided in the query string and retrievable via
+         `self.date()`.
+         """
+         value = self.value()
+         if value:
+             date = datetime.date(int(value[:4]), int(
+                 value[4:6]), int(value[6:]))
+             rng = (datetime.datetime.combine(date, datetime.time.min),
+                    datetime.datetime.combine(date, datetime.time.max))
+             return queryset.filter(conference__date_begin__range=rng)
+         else:
+             return queryset
+ class MediaTranscodedInline(admin.TabularInline):
+     model = MediaTranscoded
+ @admin.action(description='Duplicate selected medias')
+ def duplicate_medias(modeladmin, request, queryset):
+     for media in queryset:
+         transcoded_files = list(media.transcoded.values_list('file', flat=True))
+         media.id = None
+         media.save()
+         transcoded = [MediaTranscoded(file=file, item_id=media.id) for file in transcoded_files]
+         MediaTranscoded.objects.bulk_create(transcoded)
  
  class MediaAdmin(admin.ModelAdmin):
+     def get_form(self, request, obj=None, **kwargs):
+         form = super(MediaAdmin, self).get_form(request, obj, **kwargs)
+         periods = Period.objects.all()
+         period = get_default_period(periods)
+         form.base_fields['conference'].queryset = Conference.objects.filter(period=period)
+         return form
+     list_per_page = 30
      exclude = ['readers']
      search_fields = ['id', 'title', 'course__title', 'course__code']
+     list_filter = ['course', 'course_type', 'period', 'type', 'date_added', ConferenceDateBeginFilter, ]
+     inlines = [MediaTranscodedInline]
+     actions = [duplicate_medias,]
+     exlude = ['readers', ]
+ class MediaInline(admin.StackedInline):
+     model = Media
+     exclude = ['readers', ]
+ class ConferenceInline(admin.StackedInline):
+     model = ConferencePublication
+ @admin.action(description='Publish selected conferences')
+ def publish_conferences(modeladmin, request, queryset):
+     for conference in queryset:
+         for media in conference.media.all():
+             media.is_published = True
+             media.save()
+ @admin.action(description='Duplicate selected conferences')
+ def duplicate_conferences(modeladmin, request, queryset):
+     for conference in queryset:
+         original_pid = conference.public_id
+         medias = deepcopy(conference.media.all())
+         conference.pk = None
+         conference.public_id = None
+         conference.comment += '\nCopy of ' + original_pid
+         conference.save()
+         for media in medias:
+             media.pk = None
+             media.save()
+             media.conference = conference
+             media.save()
  
  class ConferenceAdmin(admin.ModelAdmin):
+     inlines = [MediaInline, ConferenceInline]
      exclude = ['readers']
-     search_fields = ['public_id', 'id', 'course__code', 'course__title']
+     list_per_page = 30
+     list_filter = ('course', 'period', 'date_begin', 'session', 'course_type')
+     search_fields = ['public_id', 'id',
+                      'course__code', 'course__title', 'session']
+     actions = [publish_conferences, duplicate_conferences]
+     list_display = ['__str__', 'date_begin', 'status', 'public_id', 'comment']
+ class HomeAdmin(admin.ModelAdmin):
+     list_filter = ('enabled',)
+     search_fields = ['periods__name', 'title', 'text']
+     list_display = ('title', 'enabled', 'modified_at')
+     readonly_fields = ('modified_at',)
+     def get_form(self, request, obj=None, **kwargs):
+         form = super(HomeAdmin, self).get_form(request, obj, **kwargs)
+         form.base_fields['video'].queryset = Media.objects.filter(type__in=('webm', 'mp4'), is_published=True, )
+         return form
+ class ParametersAdmin(admin.ModelAdmin):
+     pass
+ class NewsItemAdmin(admin.ModelAdmin):
+     list_filter = ('deleted', 'course', 'creator')
+     list_display = ('title', 'course', 'creator', 'deleted')
+     search_fields = ['title', 'text']
+ class AppointmentSlotInline(admin.TabularInline):
+     model = AppointmentSlot
+     list_per_page = 30
+ class AppointmentJuryInline(admin.StackedInline):
+     model = AppointmentJury
+ # class AppointmentDayInline(admin.TabularInline):
+ #     readonly_fields = ('get_nb_slots', 'get_nb_jury', 'changeform_link', )
+ #     model = AppointmentDay
+ class AppointmentPeriodAdmin(admin.ModelAdmin):
+     list_display = ('name', 'periods_names', 'start',
+                     'end', 'enable_appointment')
+     # inlines = [ AppointmentDayInline ]
+     def periods_names(self, instance):
+         return ','.join([period.name for period in instance.periods.all()])
+     periods_names.short_description = "Périodes"
+ # class AppointmentDayAdmin(admin.ModelAdmin):
+ #     list_filter = ('appointment_period',)
+ #     list_display = ('date', 'appointment_period', 'get_nb_slots', 'get_nb_jury')
+ #
+ #     inlines = [ AppointmentSlotInline, AppointmentJuryInline ]
+ class AppointmentSlotAdmin(admin.ModelAdmin):
+     list_filter = ('date', 'appointment_period')
+     list_display = ('date', 'appointment_period',
+                     'mode', 'start', 'nb', 'get_nb_jury')
+     inlines = [AppointmentJuryInline]
+ class AppointmentJuryAdmin(admin.ModelAdmin):
+     list_per_page = 30
+     list_filter = ('slot',)
+     list_display = ('name', 'slot')
+ class AppointmentAdmin(admin.ModelAdmin):
+     list_per_page = 30
+     list_display = ('real_date', 'student', 'jury')
+     list_filter = ('slot__date', 'slot__appointment_period', 'slot__mode')
+     search_fields = ('student__username',)
+     actions = ['export_csv']
+     def export_csv(self, request, queryset):
+         response = HttpResponse(content_type='text/csv')
+         response['Content-Disposition'] = 'attachment; filename=rendezvous.csv'
+         writer = csv.writer(response)
+         writer.writerow(['date', 'creneau', 'nom', 'prenom',
+                         'email', 'iej', 'jury', 'mode'])
+         def csv_encode(item):
+             return item
+         for app in queryset:
+             user = app.student
+             student = user.student.all()[0]
+             row = [app.day.strftime('%d/%m/%Y'), app.start, user.last_name,
+                    user.first_name, user.email, student.iej, app.jury.name, app.slot.mode]
+             row = [csv_encode(col) for col in row]
+             writer.writerow(row)
+         return response
+     export_csv.short_description = "Exporter en CSV"
+ class GroupedMessageAdmin(admin.ModelAdmin):
+     list_per_page = 30    
+ class ChatMessageAdmin(admin.ModelAdmin):
+     list_display = ('message', 'user', 'room_name')
+     ordering = ['-created']
+     raw_id_fields = ['user',]
+ class NotificationAdmin(admin.ModelAdmin):
+     list_display = ('message', 'user', 'created')
+     ordering = ['-created']
+     raw_id_fields = ['user',]
  
  
  admin.site.unregister(User)
index 89ec491065bf9444e6be028e23387f9c681e3cef,ece5ecb8683981eb3daa607ed1f54cf1fe209d6a..1baa387c98340e9a6c3f64eef626f52a3fcd1b13
+ # -*- coding: utf-8 -*-
+ from io import BytesIO
  
- from django.forms import ModelForm
- from teleforma.models import *
+ from django_recaptcha.fields import ReCaptchaField
  
+ from django import forms
+ from django.contrib.auth.models import User
+ from django.core.exceptions import ValidationError
+ from django.core.files.uploadedfile import SimpleUploadedFile
+ from django.forms import (BooleanField, CharField, ChoiceField, DateField,
+                           FileInput, ImageField, ModelChoiceField, ModelForm,
+                           ModelMultipleChoiceField)
+ from django.template.defaultfilters import slugify
+ from django.utils.translation import gettext_lazy as _
+ from django.utils.timezone import datetime
+ from PIL import Image
+ from postman.fields import BasicCommaSeparatedUserField
+ from postman.forms import WriteForm as PostmanWriteForm
+ from tinymce.widgets import TinyMCE
  
- class ConferenceForm(ModelForm):
+ from .models.core import Conference, Course, Period, payment_schedule_choices
+ from .models.crfpa import IEJ, PAY_STATUS_CHOICES, Corrector, NewsItem, Origin
+ from .models.crfpa import Profile as UserProfile
+ from .models.crfpa import Student, Training
+ LEVEL_CHOICES = [
+     ('', '---------'),
+     ('M1', 'M1'),
+     ('M2', 'M2'),
+ ]
+ TRUE_FALSE_CHOICES = (
+     ('', '---------'),
+     (True, 'Oui'),
+     (False, 'Non')
+ )
+ TRAINING_TYPE = (
+     ('', '---------'),
+     (False, 'Formation sur place'),
+     (True, 'Formation e-learning')
+ )
  
+ def get_unique_username(first_name, last_name):
+     username = slugify(first_name)[0] + '.' + slugify(last_name)
+     username = username[:30]
+     i = 1
+     while User.objects.filter(username=username[:30]):
+         username = slugify(first_name)[:i] + '.' + slugify(last_name)
+         if i > len(slugify(first_name)):
+             username += str(i)
+         i += 1
+     return username[:30]
+ class UserProfileForm(ModelForm):
      class Meta:
-         model = Conference
+         model = UserProfile
+         fields = '__all__'
+ class UserForm(ModelForm):
+     # profile
+     address = CharField(label=_('Address'), max_length=255)
+     address_detail = CharField(
+         label=_('Address detail'), max_length=255, required=False)
+     postal_code = CharField(label=_('Postal code'), max_length=255)
+     city = CharField(label=_('City'), max_length=255)
+     country = CharField(label=_('Country'), max_length=255)
+     telephone = CharField(label=_('Telephone'), max_length=255)
+     birthday = DateField(label=_('Birthday'), help_text="Au format jj/mm/aaaa")
+     # student
+     portrait = ImageField(widget=FileInput(attrs={'accept': "image/*;capture=camera"}), required=True,
+                           help_text="Veuillez utiliser une photo au format d'identité.")
+     level = ChoiceField(label=_('Studying level'), choices=LEVEL_CHOICES)
+     iej = ModelChoiceField(label="Niveau d'étude - IEJ",
+                            queryset=IEJ.objects.all())
+     period = ModelChoiceField(label='Période',
+                               queryset=Period.objects.filter(is_open=True,
+                                                              date_inscription_start__lte=datetime.today(),
+                                                              date_inscription_end__gte=datetime.today()))
+     platform_only = forms.ChoiceField(choices=TRAINING_TYPE,
+                                       label='Type de formation',
+                                       widget=forms.Select())
+     training = ModelChoiceField(label='Formation',
+                                 queryset=Training.objects.filter(available=True))
+     
+     fascicule = forms.ChoiceField(choices=TRUE_FALSE_CHOICES,
+                                   label='Envoi postal des fascicules de cours (option)',
+                                   required=False,
+                                   widget=forms.Select())
+     procedure = ModelChoiceField(label=_('Procedure'),
+                                  help_text="Matière de procédure",
+                                  queryset=Course.objects.filter(procedure=True))
+     written_speciality = ModelChoiceField(label='Specialité écrite',
+                                           queryset=Course.objects.filter(
+                                               written_speciality=True),
+                                           help_text="Matière juridique de spécialité")
+     oral_1 = ModelChoiceField(label='Souscription à l\'oral de langue (option)',
+                               help_text="Matière d’oral de langue (en option)",
+                               queryset=Course.objects.filter(oral_1=True))
+     promo_code = CharField(label=_('Code promo'),
+                            max_length=100, required=False)
+     payment_schedule = ChoiceField(label=_(u'Échéancier de paiement'),
+                                    choices=payment_schedule_choices,
+                                    required=True)
+     # no model
+     captcha = ReCaptchaField()
+     accept = BooleanField()
+     origin = None
+     class Meta:
+         model = User
+         fields = ['first_name', 'last_name', 'email']
+     def __init__(self, *args, **kwargs):
+         super(UserForm, self).__init__(*args, **kwargs)
+         self.fields['first_name'].required = True
+         self.fields['last_name'].required = True
+         self.fields['email'].required = True
+         self.user_fields = ['first_name', 'last_name', 'email', 'address', 'address_detail',
+                             'postal_code', 'city', 'country', 'telephone', 'birthday', 'portrait']
+         self.training_fields = ['level', 'iej', 'period', 'platform_only',
+                                 'training', 'fascicule', 'procedure', 'written_speciality', 'oral_1']
+     def clean_portrait(self):
+         image = self.cleaned_data['portrait']
+         if not image:
+             return image
+         #width, height = get_image_dimensions(image)
+         #ratio = float(height) / float(width)
+         # if ratio > 2.5 or ratio < 1:
+         #    raise ValidationError({'portrait': "L'image n'est pas au format portrait."})
+         NEW_HEIGHT = 230
+         NEW_WIDTH = 180
+         # if width < NEW_WIDTH or height < NEW_HEIGHT:
+         #    raise ValidationError({'portrait': "L'image est trop petite. Elle doit faire au moins %spx de large et %spx de hauteur." % (NEW_WIDTH, NEW_HEIGHT)})
+         # resize image
+         img = Image.open(image.file)
+         new_image = img.resize((NEW_WIDTH, NEW_HEIGHT), Image.LANCZOS)
+         if new_image.mode == "RGBA":
+             new_image = new_image.convert("RGB")
+         temp = BytesIO()
+         new_image.save(temp, 'jpeg')
+         temp.seek(0)
+         return SimpleUploadedFile('temp', temp.read())
+     def save(self, commit=True):
+         data = self.cleaned_data
+         user = super(UserForm, self).save(commit=False)
+         username = get_unique_username(data['first_name'], data['last_name'])
+         self.username = username
+         user.username = username
+         user.last_name = data['last_name'].upper()
+         user.first_name = data['first_name'].capitalize()
+         user.is_active = False
+         if commit:
+             user.save()
+         self.profile = UserProfile(user=user,
+                               address=data['address'],
+                               address_detail=data.get('address_detail'),
+                               postal_code=data['postal_code'],
+                               city=data['city'],
+                               country=data['country'],
+                               telephone=data['telephone'],
+                               birthday=data['birthday']
+                               )
+         if self.origin:
+             self.profile.origin = self.origin
+         if commit:
+             self.profile.save()
+         platform_only = data.get('platform_only') == 'True' and True or False
+         fascicule = data.get('fascicule') == 'True' and True or False
+         training = data.get('training')
+         subscription_fees = 0
+         if platform_only:
+             if fascicule:
+                 subscription_fees = training.cost_elearning_fascicle
+             else:
+                 subscription_fees = training.cost_elearning_nofascicle
+         else:
+             subscription_fees = training.cost
+         student = Student(user=user,
+                           portrait=data['portrait'],
+                           level=data.get('level'),
+                           iej=data.get('iej'),
+                           period=data.get('period'),
+                           platform_only=platform_only,
+                           procedure=data.get('procedure'),
+                           written_speciality=data.get('written_speciality'),
+                           oral_1=data.get('oral_1'),
+                           promo_code=data.get('promo_code'),
+                           training=training,
+                           payment_schedule=data.get('payment_schedule'),
+                           fascicule=fascicule,
+                           subscription_fees=subscription_fees
+                           )
+         student.save()
+         student.trainings.add(data.get('training', None))
+         return user
  
+ class UserUseYourLawOriginForm(UserForm):
  
+     def save(self, commit=True):
+         self.origin, c = Origin.objects.get_or_create(name="UseYourLaw")
+         user = super(UserUseYourLawOriginForm, self).save(commit=True)
+         return user
  
  
 -        
+ class CorrectorForm(ModelForm):
+     # profile
+     address = CharField(label=_('Address'), max_length=255)
+     address_detail = CharField(
+         label=_('Address detail'), max_length=255, required=False)
+     postal_code = CharField(label=_('Postal code'), max_length=255)
+     city = CharField(label=_('City'), max_length=255)
+     country = CharField(label=_('Country'), max_length=255)
+     telephone = CharField(label=_('Telephone'), max_length=255)
+     birthday = DateField(label=_('Birthday'), help_text="Au format jj/mm/aaaa")
+     birthday_place = CharField(label='Lieu de naissance', max_length=255)
+     nationality = CharField(label='Nationalité', max_length=255)
+     ss_number = CharField(label='N° de sécurité sociale',
+                           max_length=15)
+     siret = CharField(label='N° SIRET',
+                       max_length=14, required=False)
+     # corrector
+     period = ModelChoiceField(label='Période',
+                               queryset=Period.objects.filter(is_open=True,
+                                                              date_inscription_start__lte=datetime.today(),
+                                                              date_inscription_end__gte=datetime.today()))
+     pay_status = forms.ChoiceField(choices=PAY_STATUS_CHOICES,
+                                    label='Statut',
+                                    widget=forms.Select())
+     courses = ModelMultipleChoiceField(label='Matière',
+                                        queryset=Course.objects.filter(has_exam_scripts=True).exclude(title="Aucune").order_by('title'),
+                                        widget=forms.CheckboxSelectMultiple())
+     # no model
+     captcha = ReCaptchaField()
+     # accept = BooleanField()
+     class Meta:
+         model = User
+         fields = ['first_name', 'last_name', 'email']
+     def __init__(self, *args, **kwargs):
+         super(CorrectorForm, self).__init__(*args, **kwargs)
+         self.fields['first_name'].required = True
+         self.fields['last_name'].required = True
+         self.fields['email'].required = True
+         self.user_fields = ['first_name', 'last_name', 'email', 'address', 'address_detail', 'postal_code',
+                             'city', 'country', 'telephone', 'birthday', 'birthday_place', 'nationality', 'ss_number', 'siret']
+         self.training_fields = ['courses', 'period', 'pay_status']
+     def clean_siret(self):
+         if self.data['pay_status'] == 'honoraires' and not self.cleaned_data['siret'].strip():
+             raise ValidationError(
+                 "Le SIRET est obligatoire si vous choississez le statut honoraires")
+         return self.data['siret']
+     def save(self, commit=True):
+         data = self.cleaned_data
+         user = super(CorrectorForm, self).save(commit=False)
+         username = get_unique_username(data['first_name'], data['last_name'])
+         self.username = username
+         user.username = username
+         user.last_name = data['last_name'].upper()
+         user.first_name = data['first_name'].capitalize()
+         user.is_active = False
+         if commit:
+             user.save()
+         profile = UserProfile(user=user,
+                               address=data['address'],
+                               address_detail=data.get('address_detail'),
+                               postal_code=data['postal_code'],
+                               city=data['city'],
+                               country=data['country'],
+                               telephone=data['telephone'],
+                               birthday=data['birthday'],
+                               birthday_place=data['birthday_place'],
+                               ss_number=data['ss_number'],
+                               siret=data['siret'],
+                               nationality=data['nationality']
+                               )
+         if commit:
+             profile.save()
+         corrector = Corrector(user=user,
+                               period=data.get('period'),
+                               pay_status=data.get('pay_status'),
+                               )
+         corrector.save()
+         corrector.courses.set(data.get('courses'))
+         return user
+ class NewsItemForm(ModelForm):
+     class Meta:
+         model = NewsItem
+         exclude = ['created', 'creator', 'deleted']
+         widgets = {
+             'description': TinyMCE({'cols': 80, 'rows': 30}),
+         }
+ class WriteForm(PostmanWriteForm):
+     recipients = BasicCommaSeparatedUserField(
+         label=(_("Recipients"), _("Recipient")), help_text='')
+     course = ModelChoiceField(queryset=Course.objects.all(), required=False)
+     class Meta(PostmanWriteForm.Meta):
+         fields = ('course', 'recipients', 'subject', 'body')
+     def clean_recipients(self):
+         """compute recipient if 'auto' is set"""
+         recipients = self.cleaned_data['recipients']
+         return recipients
+ class RetractationForm(ModelForm):
+     class Meta:
+         model = Student
+         fields = ['stop_retractation']
+     def save(self, commit=True):
+         student = super(RetractationForm, self).save(commit=False)
+         student.stop_retractation_date = datetime.now()
+         if commit:
+             student.save()
+         return student
++
++
++class ConferenceForm(ModelForm):
++
++    class Meta:
++        model = Conference
++        fields = "__all__"
index faf314c8ccff47982e063e1d2323c42f48feb7bd,51a47752a6d10c97964ffb21cb22e9c9a8b2aaed..a9d20930525a0ea6cece6cb4300c2499034d9dcf
@@@ -16,1259 -16,3659 +16,3959 @@@ msgstr "
  "Content-Transfer-Encoding: 8bit\n"
  "Plural-Forms: nplurals=2; plural=(n > 1)\n"
  
++<<<<<<< HEAD
 +#: models/ae.py:46 models/core.py:206 models/crfpa.py:108 models/crfpa.py:149
 +#: models/pro.py:101 models/pro.py:140
 +msgid "user"
 +msgstr "utilisateur"
 +
 +#: models/ae.py:47 models/core.py:131 models/core.py:241 models/core.py:487
 +#: models/core.py:530 models/core.py:572 models/crfpa.py:64
++=======
+ #: teleforma/admin.py:42 teleforma/exam/models.py:147
+ #: teleforma/exam/models.py:264 teleforma/models/ae.py:49
+ #: teleforma/models/core.py:164 teleforma/models/core.py:218
+ #: teleforma/models/core.py:400 teleforma/models/core.py:413
+ #: teleforma/models/core.py:898 teleforma/models/core.py:979
+ #: teleforma/models/crfpa.py:82 teleforma/models/crfpa.py:176
+ #: teleforma/models/crfpa.py:511 teleforma/models/crfpa.py:667
+ #: teleforma/webclass/models.py:156 teleforma/webclass/models.py:428
++>>>>>>> feature/dj4.2
  msgid "period"
  msgstr "période"
  
- #: models/ae.py:49 models/crfpa.py:117
- msgid "platform only"
- msgstr "plateforme seulement"
+ #: teleforma/admin.py:105
+ msgid "Group"
+ msgstr "Groupe"
  
++<<<<<<< HEAD
 +#: models/ae.py:51 models/core.py:208
 +msgid "courses"
 +msgstr "matières"
++=======
+ #: teleforma/admin.py:114
+ msgid "balance"
+ msgstr "balance"
++>>>>>>> feature/dj4.2
  
- #: models/ae.py:62
- msgid "AE student"
- msgstr "Etudiant AE"
+ #: teleforma/admin.py:318
+ #, fuzzy
+ #| msgid "date added"
+ msgid "date de début"
+ msgstr "date d'ajout"
  
++<<<<<<< HEAD
 +#: models/ae.py:63
 +msgid "AE students"
 +msgstr "Etudiants AE"
 +
 +#: models/core.py:74
 +msgid "Private"
 +msgstr "Privé"
++=======
+ #: teleforma/exam/models.py:86 teleforma/exam/models.py:491
+ msgid "rejected"
+ msgstr "rejetée"
++>>>>>>> feature/dj4.2
  
- #: models/core.py:75
- msgid "Draft"
- msgstr "Brouillon"
+ #: teleforma/exam/models.py:86
+ msgid "draft"
+ msgstr "brouillon"
  
- #: models/core.py:76
- msgid "Public"
- msgstr "Publié"
+ #: teleforma/exam/models.py:86
+ msgid "submitted"
+ msgstr "soumise"
  
- #: models/core.py:91 models/core.py:103 models/core.py:123 models/core.py:135
- #: models/core.py:225 models/core.py:465 models/crfpa.py:47 models/crfpa.py:63
- msgid "name"
- msgstr "nom"
+ #: teleforma/exam/models.py:87 teleforma/models/core.py:88
+ msgid "pending"
+ msgstr "en attente"
  
- #: models/core.py:92 models/core.py:104 models/core.py:124 models/core.py:136
- #: models/core.py:150 models/core.py:226 models/core.py:380 models/core.py:446
- #: models/core.py:466 models/crfpa.py:48 models/pro.py:124
- msgid "description"
- msgstr "description"
+ #: teleforma/exam/models.py:87 teleforma/exam/models.py:475
+ msgid "marked"
+ msgstr "corrigée"
  
++<<<<<<< HEAD
 +#: models/core.py:99 models/core.py:106 models/core.py:231 models/pro.py:123
 +msgid "organization"
 +msgstr "organisation"
++=======
+ #: teleforma/exam/models.py:87
+ msgid "read"
+ msgstr "lu"
++>>>>>>> feature/dj4.2
  
- #: models/core.py:107
- msgid "Master domain"
- msgstr ""
+ #: teleforma/exam/models.py:88
+ msgid "backup"
+ msgstr "sauvegardé"
  
++<<<<<<< HEAD
 +#: models/core.py:118 models/core.py:126 models/core.py:152 models/core.py:246
 +msgid "department"
 +msgstr "département"
++=======
+ #: teleforma/exam/models.py:88
+ msgid "stat"
+ msgstr "stat"
++>>>>>>> feature/dj4.2
  
- #: models/core.py:143 models/core.py:244 models/core.py:484 models/core.py:570
- msgid "course type"
- msgstr "type de matière"
+ #: teleforma/exam/models.py:90
+ msgid "unreadable"
+ msgstr "illisible"
  
- #: models/core.py:149 models/core.py:445 models/pro.py:46 models/pro.py:83
- msgid "title"
- msgstr "titre"
+ #: teleforma/exam/models.py:91
+ msgid "bad orientation"
+ msgstr "mauvaise orientation"
  
- #: models/core.py:151 models/core.py:450 models/crfpa.py:62
- msgid "code"
- msgstr "cote"
+ #: teleforma/exam/models.py:92
+ msgid "bad framing"
+ msgstr "mauvais cadrage"
  
++<<<<<<< HEAD
 +#: models/core.py:156
 +msgid "tweeter title"
 +msgstr ""
++=======
+ #: teleforma/exam/models.py:93
+ msgid "incomplete"
+ msgstr "incomplet"
++>>>>>>> feature/dj4.2
  
- #: models/core.py:153 models/core.py:449 models/pro.py:68
- msgid "date modified"
- msgstr "date de modification"
+ #: teleforma/exam/models.py:94
+ msgid "wrong course"
+ msgstr "mauvaise matière"
  
- #: models/core.py:154 models/core.py:467
- msgid "number"
- msgstr ""
+ #: teleforma/exam/models.py:95
+ msgid "duplicate"
+ msgstr "doublon"
  
- #: models/core.py:192 models/core.py:243 models/core.py:482 models/core.py:568
- #: models/pro.py:45
++<<<<<<< HEAD
 +#: models/core.py:159 models/crfpa.py:67
 +msgid "synthesis note"
 +msgstr "note de synthèse"
 +
 +#: models/core.py:160 models/crfpa.py:70
 +msgid "obligations"
 +msgstr "obligations"
 +
 +#: models/core.py:161 models/crfpa.py:91
 +msgid "magistral"
 +msgstr "magistral"
++=======
+ #: teleforma/exam/models.py:96
+ msgid "other"
+ msgstr "autre"
+ #: teleforma/exam/models.py:97
+ msgid "wrong format"
+ msgstr "mauvais format"
+ #: teleforma/exam/models.py:98
+ msgid "unreadable file"
+ msgstr "fichier illisible"
++>>>>>>> feature/dj4.2
+ #: teleforma/exam/models.py:99
+ msgid "no file"
+ msgstr "pas de fichier"
+ #: teleforma/exam/models.py:100
+ msgid "error retrieving file"
+ msgstr "erreur de lecture de fichier"
+ #: teleforma/exam/models.py:101
+ msgid "file too large"
+ msgstr "fichier trop gros"
+ #: teleforma/exam/models.py:143 teleforma/exam/models.py:263
+ #: teleforma/models/core.py:327 teleforma/models/core.py:416
+ #: teleforma/models/core.py:804 teleforma/models/core.py:975
+ #: teleforma/models/crfpa.py:665 teleforma/models/pro.py:50
+ #: teleforma/webclass/models.py:158 teleforma/webclass/models.py:430
  msgid "course"
  msgstr "matière"
  
++<<<<<<< HEAD
 +#: models/core.py:225 models/core.py:252
 +msgid "professor"
 +msgstr "professeur"
 +
 +#: models/core.py:240 models/core.py:256
 +msgid "room"
 +msgstr "salle"
 +
 +#: models/core.py:245
 +msgid "public_id"
 +msgstr "public id"
 +
 +#: models/core.py:254
++=======
+ #: teleforma/exam/models.py:145 teleforma/exam/models.py:272
+ msgid "corrector"
+ msgstr "correcteur"
+ #: teleforma/exam/models.py:149 teleforma/exam/models.py:266
+ #: teleforma/models/core.py:421 teleforma/models/core.py:811
+ #: teleforma/webclass/models.py:169 teleforma/webclass/models.py:437
++>>>>>>> feature/dj4.2
  msgid "session"
- msgstr "session"
+ msgstr "séance"
  
- msgid "date added"
- msgstr "date d'ajout"
- #: models/core.py:451
- msgid "published"
- msgstr "publié"
++<<<<<<< HEAD
 +#: models/core.py:258
 +msgid "comment"
 +msgstr "commentaire"
 +
 +#: models/core.py:259
 +msgid "begin date"
 +msgstr "date de début"
 +
 +#: models/core.py:260
 +msgid "end date"
 +msgstr "date de fin"
 +
 +#: models/core.py:254 models/core.py:496 models/core.py:533 models/core.py:577
 +msgid "readers"
 +msgstr ""
 +
 +#: models/core.py:369 models/core.py:397 models/core.py:485 models/core.py:566
 +msgid "conference"
 +msgstr "conférence"
 +
 +#: models/core.py:384
 +msgid "host"
 +msgstr ""
 +
 +#: models/core.py:385
 +msgid "port"
 +msgstr ""
 +
 +#: models/core.py:379 models/core.py:489 models/core.py:576
 +msgid "type"
 +msgstr "type"
 +
 +#: models/core.py:388
 +msgid "source password"
 +msgstr ""
 +
 +#: models/core.py:389
 +msgid "admin password"
 +msgstr ""
 +
 +#: models/core.py:396 models/core.py:407
 +msgid "streaming server"
 +msgstr "serveur de diffusion"
 +
 +#: models/core.py:408
 +msgid "Streaming type"
 +msgstr "Type de flux"
 +
 +#: models/core.py:410
 +msgid "streaming"
 +msgstr "diffusion"
 +
 +#: models/core.py:439
 +msgid "live stream"
 +msgstr "stream en direct"
 +
 +#: models/core.py:447
 +msgid "credits"
 +msgstr "crédits"
 +
 +#: models/core.py:448 models/pro.py:67
++=======
+ #: teleforma/exam/models.py:150
+ msgid "value"
+ msgstr "valeur"
  
- #: models/core.py:452
- msgid "mime type"
- msgstr "Type mime"
- #: models/core.py:453 models/pro.py:86
- msgid "weight"
- msgstr ""
- #: models/core.py:474
- msgid "document type"
- msgstr "type de document"
- #: models/core.py:491 models/crfpa.py:111
- msgid "iej"
- msgstr "iej"
- #: models/core.py:493
- msgid "annal"
- msgstr "annale"
- #: models/core.py:494
- msgid "year"
- msgstr "année"
- #: models/core.py:495 models/core.py:532
- msgid "file"
- msgstr "fichier"
- #: models/crfpa.py:55 models/crfpa.py:56 templates/teleforma/annals.html:31
- #: templates/telemeta/profile_detail.html:64 templates/telemeta/users.html:28
- #: templates/telemeta/inc/user_list.html:21
- msgid "IEJ"
- msgstr "IEJ"
- #: models/crfpa.py:73 models/crfpa.py:119
- msgid "procedure"
- msgstr "procédure"
+ #: teleforma/exam/models.py:151 teleforma/exam/templates/exam/quotas.html:48
+ msgid "date start"
+ msgstr "date de début"
  
- #: models/crfpa.py:76 models/crfpa.py:122
- msgid "written speciality"
- msgstr "spécialité écrit"
+ #: teleforma/exam/models.py:152 teleforma/exam/templates/exam/quotas.html:49
+ msgid "date end"
+ msgstr "date de fin"
  
- #: models/crfpa.py:79 models/crfpa.py:125
- msgid "oral speciality"
- msgstr "spécialité orale"
+ #: teleforma/exam/models.py:154 teleforma/exam/models.py:268
+ #: teleforma/models/core.py:682 teleforma/models/core.py:809
+ #: teleforma/models/core.py:982
+ msgid "type"
+ msgstr "type"
  
- #: models/crfpa.py:82 models/crfpa.py:127
- msgid "oral 1"
+ #: teleforma/exam/models.py:157
+ msgid "Quota"
  msgstr ""
  
- #: models/crfpa.py:85 models/crfpa.py:129
- msgid "oral 2"
+ #: teleforma/exam/models.py:158 teleforma/exam/templates/exam/quotas.html:11
+ #: teleforma/templates/teleforma/base.html:131
+ msgid "Quotas"
  msgstr ""
  
- #: models/crfpa.py:88 models/crfpa.py:131
- msgid "options"
- msgstr "options"
+ #: teleforma/exam/models.py:213 teleforma/models/core.py:764
+ #: teleforma/models/pro.py:74
++>>>>>>> feature/dj4.2
+ msgid "date added"
+ msgstr "date d'ajout"
  
- #: models/crfpa.py:93
- msgid "cost"
- msgstr "coût"
+ #: teleforma/exam/models.py:215 teleforma/models/core.py:263
+ #: teleforma/models/core.py:766 teleforma/models/crfpa.py:549
+ #: teleforma/models/pro.py:75
+ msgid "date modified"
+ msgstr "date de modification"
  
- #: models/crfpa.py:103
- msgid "training"
- msgstr "formation"
+ #: teleforma/exam/models.py:216
+ msgid "UUID"
+ msgstr ""
  
- #: models/crfpa.py:115
- msgid "trainings"
- msgstr "formations"
+ #: teleforma/exam/models.py:218
+ msgid "MIME type"
+ msgstr "Type MIME"
  
- #: models/crfpa.py:142
- msgid "CRFPA Profile"
- msgstr "Profil CRFPA"
+ #: teleforma/exam/models.py:219
+ msgid "sha1"
+ msgstr ""
  
- #: models/crfpa.py:150 templates/telemeta/profile_detail.html:77
- msgid "Address"
- msgstr "Adresse"
+ #: teleforma/exam/models.py:236
+ msgid "script"
+ msgstr "copie"
  
- #: models/crfpa.py:151
- msgid "Postal code"
- msgstr "Code postal"
+ #: teleforma/exam/models.py:238
+ msgid "Page file"
+ msgstr "Fichier de page"
  
- #: models/crfpa.py:152
- msgid "City"
- msgstr "Ville"
+ #: teleforma/exam/models.py:240
+ msgid "Image file"
+ msgstr "Fichier image"
  
- #: models/crfpa.py:153
- msgid "Country"
- msgstr "Pays"
+ #: teleforma/exam/models.py:241 teleforma/models/pro.py:55
+ #: teleforma/models/pro.py:92
+ msgid "rank"
+ msgstr "rang"
+ #: teleforma/exam/models.py:244
+ msgid "Page"
+ msgstr "Page"
+ #: teleforma/exam/models.py:245
+ msgid "Pages"
+ msgstr "Pages"
+ #: teleforma/exam/models.py:250 teleforma/models/appointment.py:32
+ #: teleforma/models/appointment.py:291 teleforma/models/core.py:143
+ #: teleforma/models/core.py:157 teleforma/models/core.py:180
+ #: teleforma/models/core.py:224 teleforma/models/core.py:334
+ #: teleforma/models/core.py:385 teleforma/models/core.py:782
+ #: teleforma/models/core.py:1144 teleforma/models/crfpa.py:61
+ #: teleforma/models/crfpa.py:78 teleforma/models/messages.py:22
+ msgid "name"
+ msgstr "nom"
  
- #: models/crfpa.py:154 templates/telemeta/profile_detail.html:86
- msgid "Language"
- msgstr "Langue"
+ #: teleforma/exam/models.py:253
+ msgid "ScriptType"
+ msgstr "Type de copie"
  
- #: models/crfpa.py:155 templates/telemeta/profile_detail.html:78
- msgid "Telephone"
- msgstr "Téléphone"
+ #: teleforma/exam/models.py:254
+ msgid "ScriptTypes"
+ msgstr "Types de copies"
  
- #: models/crfpa.py:156
- msgid "Expiration_date"
- msgstr "Date d'expiration"
+ #: teleforma/exam/models.py:270
+ msgid "author"
+ msgstr "auteur"
  
- #: models/crfpa.py:157
- msgid "Password initialized"
- msgstr "Mot de passe initialisé"
+ #: teleforma/exam/models.py:274
+ msgid "PDF file"
+ msgstr "Fichier PDF"
  
- #: models/crfpa.py:161
- msgid "profile"
- msgstr "profil"
+ #: teleforma/exam/models.py:275
+ msgid "Box UUID"
+ msgstr ""
  
- #: models/pro.py:47
- msgid "price"
- msgstr "prix"
+ #: teleforma/exam/models.py:276
+ msgid "score"
+ msgstr "note"
+ #: teleforma/exam/models.py:278 teleforma/models/pro.py:136
+ msgid "comments"
+ msgstr "commentaires"
  
- #: models/pro.py:48 models/pro.py:88 models/pro.py:104
+ #: teleforma/exam/models.py:280 teleforma/models/core.py:404
+ #: teleforma/models/core.py:432 teleforma/models/core.py:939
+ #: teleforma/models/pro.py:54 teleforma/models/pro.py:97
+ #: teleforma/models/pro.py:115 teleforma/webclass/models.py:172
  msgid "status"
  msgstr "status"
  
- #: models/pro.py:49 models/pro.py:85
- msgid "rank"
- msgstr ""
+ #: teleforma/exam/models.py:282
+ msgid "reason"
+ msgstr "raison"
+ #: teleforma/exam/models.py:284
+ msgid "date submitted"
+ msgstr "date de soumission"
+ #: teleforma/exam/models.py:285
+ msgid "date marked"
+ msgstr "date de correction"
+ #: teleforma/exam/models.py:287
+ msgid "date rejected"
+ msgstr "date de rejet"
+ #: teleforma/exam/models.py:288
+ msgid "URL"
+ msgstr ""
+ #: teleforma/exam/models.py:294 teleforma/exam/models.py:297
+ #: teleforma/exam/templates/exam/inc/script_list.html:13
+ #: teleforma/exam/templates/exam/quotas.html:30
+ #: teleforma/exam/templates/exam/quotas.html:47
+ #: teleforma/exam/templates/exam/scripts.html:82
+ #: teleforma/templates/teleforma/course.html:53
+ #: teleforma/templates/teleforma/course_conference.html:62
+ #: teleforma/templates/teleforma/course_conference.html:109
+ #: teleforma/templates/teleforma/course_conference_audio.html:67
+ #: teleforma/templates/teleforma/course_media.html:81
+ #: teleforma/templates/teleforma/course_media.html:158
+ #: teleforma/templates/teleforma/course_media_transcoded.html:44
+ #: teleforma/templates/teleforma/course_media_transcoded.html:94
+ #: teleforma/templates/teleforma/course_media_video_embed.html:33
+ #: teleforma/templates/teleforma/inc/conference_list.html:27
+ #: teleforma/templates/teleforma/inc/media_list.html:37
+ #: teleforma/templates/teleforma/inc/media_list_pending.html:34
+ #: teleforma/webclass/templates/webclass/webclass_record.html:20
+ msgid "Session"
+ msgstr "Séance"
+ #: teleforma/exam/models.py:316 teleforma/exam/models.py:474
+ #: teleforma/exam/models.py:490
+ msgid "Script"
+ msgstr "Copie"
+ #: teleforma/exam/models.py:317 teleforma/exam/templates/exam/scripts.html:20
+ #: teleforma/templates/teleforma/base.html:112
+ #: teleforma/templates/teleforma/base.html:117
+ #: teleforma/templates/telemeta/base.html:119
+ #: teleforma/templates/telemeta/base.html:124
+ msgid "Scripts"
+ msgstr "Copies"
+ #: teleforma/exam/templates/exam/inc/script_list.html:12
+ #: teleforma/exam/templates/exam/quotas.html:23
+ #: teleforma/exam/templates/exam/quotas.html:46
+ #: teleforma/exam/templates/exam/scripts.html:75
+ #: teleforma/models/appointment.py:35 teleforma/models/crfpa.py:514
+ #: teleforma/templates/teleforma/course_conference.html:108
+ #: teleforma/templates/teleforma/course_media.html:157
+ #: teleforma/templates/teleforma/course_media_transcoded.html:93
+ #: teleforma/templates/teleforma/course_media_video_embed.html:32
+ msgid "Course"
+ msgstr "Matière"
  
- #: models/pro.py:50
- msgid "public concerned"
- msgstr ""
+ #: teleforma/exam/templates/exam/inc/script_list.html:14
+ #: teleforma/exam/templates/exam/scripts.html:89
+ #: teleforma/templates/teleforma/lists.html:70
+ #: teleforma/templates/telemeta/inc/module_revisions.html:18
+ msgid "Type"
+ msgstr "Type"
  
- #: models/pro.py:53
- msgid "document 1"
- msgstr "document 1"
+ #: teleforma/exam/templates/exam/inc/script_list.html:15
+ #: teleforma/templates/teleforma/inc/user_list.html:19
+ #: teleforma/templates/teleforma/profile_detail.html:64
+ msgid "Last Name"
+ msgstr "Nom"
  
- #: models/pro.py:56
- msgid "media"
- msgstr "médias"
+ #: teleforma/exam/templates/exam/inc/script_list.html:16
+ #: teleforma/templates/teleforma/inc/user_list.html:20
+ #: teleforma/templates/teleforma/profile_detail.html:63
+ msgid "First Name"
+ msgstr "Prénom"
+ #: teleforma/exam/templates/exam/inc/script_list.html:17
+ msgid "Submission date"
+ msgstr "Date de soumission"
+ #: teleforma/exam/templates/exam/inc/script_list.html:18
+ msgid "Mark date"
+ msgstr "Date de correction"
+ #: teleforma/exam/templates/exam/inc/script_list.html:19
+ #: teleforma/exam/templates/exam/quotas.html:16
+ #: teleforma/exam/templates/exam/quotas.html:44
+ #: teleforma/exam/templates/exam/scripts.html:67
+ msgid "Corrector"
+ msgstr "Correcteur"
+ #: teleforma/exam/templates/exam/inc/script_list.html:20
+ #: teleforma/exam/templates/exam/script_detail.html:61
+ #: teleforma/exam/templates/exam/script_detail2.html:41
+ #: teleforma/templates/quiz/progress.html:60
+ #: teleforma/templates/quiz/sitting_detail.html:15
+ #: teleforma/templates/quiz/sitting_list.html:16
+ msgid "Score"
+ msgstr "Note"
+ #: teleforma/exam/templates/exam/mass_score_form.html:138
+ #: teleforma/exam/templates/exam/score_form.html:81
+ #: teleforma/exam/templates/exam/script_form.html:90
+ #: teleforma/templates/registration/registration_form.html:130
+ msgid "Submit"
+ msgstr "Soumettre"
+ #: teleforma/exam/templates/exam/messages/script_fix.txt:9
+ #: teleforma/exam/templates/exam/messages/script_marked.txt:9
+ #: teleforma/exam/templates/exam/messages/script_rejected.txt:7
+ #: teleforma/templates/postman/email_user_init.txt:23
+ #: teleforma/templates/registration/password_reset_email.html:12
+ msgid "Best regards"
+ msgstr "Cordialement"
  
- #: models/pro.py:59
- msgid "document 2"
- msgstr "document 2"
+ #: teleforma/exam/templates/exam/messages/script_fix.txt:10
+ #: teleforma/exam/templates/exam/messages/script_marked.txt:10
+ #: teleforma/exam/templates/exam/messages/script_rejected.txt:8
+ #: teleforma/templates/postman/email_user.txt:28
+ #: teleforma/templates/postman/email_user_init.txt:24
+ #: teleforma/templates/postman/email_visitor.txt:16
+ #: teleforma/templates/registration/password_reset_email.html:13
+ msgid "The site administrator"
+ msgstr "L'administrateur du site"
  
- #: models/pro.py:62
- msgid "corrected document"
- msgstr "document corrigé"
+ #: teleforma/exam/templates/exam/messages/script_fix.txt:10
+ #: teleforma/exam/templates/exam/messages/script_marked.txt:10
+ #: teleforma/exam/templates/exam/messages/script_rejected.txt:8
+ #: teleforma/templates/postman/email_user_init.txt:24
+ #: teleforma/templates/registration/password_reset_email.html:13
+ msgid "of the"
+ msgstr "du"
  
- #: models/pro.py:64
- msgid "suscribers"
- msgstr "inscrits"
+ #: teleforma/exam/templates/exam/messages/script_fix.txt:13
+ #: teleforma/exam/templates/exam/messages/script_marked.txt:13
+ #: teleforma/exam/templates/exam/messages/script_rejected.txt:11
+ #: teleforma/templates/postman/email_user_init.txt:26
+ #: teleforma/templates/postman/email_visitor.txt:18
+ msgid ""
+ "Note: This message is issued by an automated system.\n"
+ "Do not reply, this would not be taken into account."
+ msgstr ""
+ "NB: Ce message est émis par un automate. Ne faites pas de réponse, elle ne "
+ "serait pas prise en compte."
  
- #: models/pro.py:69
- msgid "approximative duration"
- msgstr "durée approximative"
+ #: teleforma/exam/templates/exam/quotas.html:45
+ msgid "Period"
+ msgstr "Période"
  
- #: models/pro.py:70
- msgid "keywords"
- msgstr "mots clés"
+ #: teleforma/exam/templates/exam/quotas.html:50
+ #: teleforma/exam/templates/exam/scripts.html:24
+ #: teleforma/templates/teleforma/courses.html:42
+ msgid "Pending"
+ msgstr "En attente"
  
- #: models/pro.py:77
- msgid "Seminar"
- msgstr "Sémimaire"
+ #: teleforma/exam/templates/exam/quotas.html:51
+ #: teleforma/exam/templates/exam/scripts.html:25
+ msgid "Marked"
+ msgstr "Corrigées"
  
- #: models/pro.py:82 models/pro.py:139
- msgid "seminar"
- msgstr "séminaire"
+ #: teleforma/exam/templates/exam/quotas.html:52
+ msgid "Value"
+ msgstr "Valeur"
  
- #: models/pro.py:84 models/pro.py:102
- msgid "question"
- msgstr "question"
+ #: teleforma/exam/templates/exam/quotas.html:53
+ msgid "Level"
+ msgstr "Niveau"
  
- #: models/pro.py:87
- msgid "minimum numbers of characters"
- msgstr "nombre de caractère minimum"
+ #: teleforma/exam/templates/exam/score_form.html:31
+ #: teleforma/exam/templates/exam/scores.html:32
+ msgid "New score"
+ msgstr "Nouvelle note"
  
- #: models/pro.py:96
- msgid "Question"
- msgstr "Questions"
+ #: teleforma/exam/templates/exam/scores.html:19
+ #: teleforma/templates/teleforma/annals.html:14
+ #: teleforma/templates/teleforma/profile_detail.html:16
+ msgid "My courses"
+ msgstr "Mes matières"
  
- #: models/pro.py:101 models/pro.py:102 models/pro.py:103
- msgid "answer"
- msgstr "réponse"
+ #: teleforma/exam/templates/exam/scores.html:48
+ #: teleforma/templates/teleforma/base.html:143
+ #: teleforma/templates/teleforma/base.html:145
+ #: teleforma/templates/telemeta/base.html:140
+ #: teleforma/templates/telemeta/base.html:142
+ msgid "Scores"
+ msgstr "Notes"
  
- #: models/pro.py:105
- msgid "validated"
- msgstr "validé"
+ #: teleforma/exam/templates/exam/script_detail.html:55
+ #: teleforma/templates/teleforma/profile_detail.html:36
+ msgid "Send a message"
+ msgstr "Envoyer un message"
  
- #: models/pro.py:117
- msgid "Answer"
- msgstr "Réponse"
+ #: teleforma/exam/templates/exam/script_detail.html:58
+ #: teleforma/exam/templates/exam/script_detail2.html:38
+ msgid "Topic"
+ msgstr "Sujet"
  
- #: models/pro.py:125
- msgid "comments"
- msgstr "commentaires"
+ #: teleforma/exam/templates/exam/script_detail.html:62
+ #: teleforma/exam/templates/exam/script_detail.html:82
+ #: teleforma/exam/templates/exam/script_detail2.html:42
+ #: teleforma/exam/templates/exam/script_detail2.html:59
+ msgid "Comments"
+ msgstr "Commentaire"
  
- #: models/pro.py:126 models/pro.py:142
- msgid "testimonial_template"
+ #: teleforma/exam/templates/exam/script_detail.html:68
+ #: teleforma/exam/templates/exam/script_detail2.html:45
+ #: teleforma/exam/templates/exam/scripts.html:26
+ #: teleforma/templates/postman/view.html:33
+ msgid "Rejected"
+ msgstr "Rejeté"
+ #: teleforma/exam/templates/exam/script_detail.html:71
+ #: teleforma/exam/templates/exam/script_detail2.html:48
+ msgid "Scoring"
+ msgstr "Noter"
+ #: teleforma/exam/templates/exam/script_detail.html:72
+ #: teleforma/exam/templates/exam/script_detail.html:113
+ #: teleforma/exam/templates/exam/script_detail.html:131
+ #: teleforma/exam/templates/exam/script_detail2.html:49
+ #: teleforma/exam/templates/exam/script_detail2.html:90
+ #: teleforma/exam/templates/exam/script_detail2.html:108
+ msgid "Reject"
+ msgstr "Rejeter"
+ #: teleforma/exam/templates/exam/script_detail.html:74
+ #: teleforma/exam/templates/exam/script_detail2.html:51
+ msgid "Submitted"
+ msgstr "Soumise"
+ #: teleforma/exam/templates/exam/script_detail.html:86
+ #: teleforma/exam/templates/exam/script_detail2.html:63
+ msgid "Mark"
+ msgstr "Note"
+ #: teleforma/exam/templates/exam/script_detail.html:108
+ #: teleforma/exam/templates/exam/script_detail2.html:85
+ #: teleforma/templates/postman/base_write.html:111
+ msgid "Send"
+ msgstr "Envoyer"
+ #: teleforma/exam/templates/exam/script_detail.html:136
+ #: teleforma/exam/templates/exam/script_detail2.html:113
+ #: teleforma/templates/teleforma/base.html:159
+ #: teleforma/templates/teleforma/base.html:171
+ #: teleforma/templates/teleforma/help.html:10
+ #: teleforma/templates/telemeta/base.html:155
+ #: teleforma/templates/telemeta/base.html:165
+ msgid "Help"
+ msgstr "Aide"
+ #: teleforma/exam/templates/exam/script_detail2.html:43
+ msgid "Imprimer"
  msgstr ""
  
- #: models/pro.py:127
- msgid "template"
- msgstr "modèle"
+ #: teleforma/exam/templates/exam/script_form.html:31
+ #: teleforma/exam/templates/exam/scripts.html:35
+ msgid "New script"
+ msgstr "Nouvelle copie"
  
- #: models/pro.py:134
- msgid "Testimonial template"
- msgstr "Modèle d'attestation"
+ #: teleforma/exam/templates/exam/script_form.html:34
+ msgid "Blank script"
+ msgstr "Copie vierge"
  
- #: models/pro.py:140 models/pro.py:141 models/pro.py:143
- msgid "testimonial"
- msgstr "attestation"
+ #: teleforma/exam/templates/exam/scripts.html:5
+ msgid "Answers"
+ msgstr "Réponses"
  
- #: models/pro.py:148
- msgid "Testimonial"
- msgstr "Attestation"
+ #: teleforma/exam/templates/exam/scripts.html:97
+ msgid "E-learning uniquement"
+ msgstr ""
  
- #: templates/404.html:10
- msgid "Page not found"
- msgstr "Page non trouvée"
+ #: teleforma/exam/templates/exam/scripts.html:112
+ msgid "No scripts"
+ msgstr "Aucune copie"
  
- #: templates/500.html:10
- msgid "Server error"
- msgstr "Erreur du serveur"
+ #: teleforma/exam/views.py:354
+ msgid "Pending scripts"
+ msgstr "Copies en attente"
  
- #: templates/admin/base.html:21 templates/telemeta/base.html:99
- msgid "Home"
- msgstr "Accueil"
+ #: teleforma/exam/views.py:365
+ msgid "Treated scripts"
+ msgstr "Copie traitées"
  
- #: templates/postman/archives.html:3
- #, fuzzy
- msgid "Archived Messages"
- msgstr "Messages"
+ #: teleforma/exam/views.py:374
+ msgid "Rejected scripts"
+ msgstr "Copies rejetées"
  
- #: templates/postman/archives.html:7
+ #: teleforma/exam/views.py:393
  msgid ""
- "Messages in this folder will never be removed. You can use this folder for "
- "long term storage."
+ "Error: you have already submitted a script for this session, the same course "
+ "and the same type!"
  msgstr ""
+ "Erreur : vous avez déjà soumis une copie du même type pour la même matière "
+ "et la même séance."
  
- #: templates/postman/base.html:10
- msgid "Folders"
- msgstr "Dossiers"
+ #: teleforma/exam/views.py:398
+ msgid ""
+ "You have successfully submitted your script. It will be processed in the "
+ "next hours."
+ msgstr ""
+ "Vous avez correctement soumis votre copie. Elle sera traitée dans les "
+ "prochaines heures puis corrigée."
  
- #: templates/postman/base.html:15
- msgid "Inbox"
+ #: teleforma/exam/views.py:403
+ msgid ""
+ "There was a problem with your submission. Please try again, later if "
+ "possible."
  msgstr ""
+ "Il y a une une erreur lors de votre soumission de copie. Merci de vérifier "
+ "votre fichier ou de réessayer plus tard."
  
- #: templates/postman/base.html:16 templates/postman/sent.html:3
- #, fuzzy
- msgid "Sent Messages"
- msgstr "Messages"
+ #: teleforma/exam/views.py:486
+ msgid "You must add your score to access to the statistics."
+ msgstr "Vous devez ajouter votre note pour accéder aux statistiques."
  
- #: templates/postman/base.html:17 templates/telemeta/base.html:114
- msgid "Archives"
- msgstr ""
+ #: teleforma/exam/views.py:565
+ msgid "all courses"
+ msgstr "toutes les matières"
  
- #: templates/postman/base.html:18
- msgid "Trash"
- msgstr ""
+ #: teleforma/fields.py:114 teleforma/templates/teleforma/course_media.html:181
+ #: teleforma/templates/teleforma/inc/media_list.html:47
+ msgid "Duration"
+ msgstr "Durée"
  
- #: templates/postman/base.html:23
- msgid "New message"
- msgstr "Nouveau message"
+ #: teleforma/fields.py:119
+ msgid "Enter a valid duration in HH:MM[:ss] format."
+ msgstr "Entrez une durée valide au format HH:MM[:ss]"
  
- #: templates/postman/base_folder.html:12
- msgid "by conversation"
- msgstr ""
+ #: teleforma/forms.py:63 teleforma/forms.py:222 teleforma/models/crfpa.py:455
+ #: teleforma/templates/registration/registration_corrector_pdf.html:43
+ #: teleforma/templates/registration/registration_pdf.html:48
+ #: teleforma/templates/teleforma/profile_detail.html:79
+ msgid "Address"
+ msgstr "Adresse"
  
- #: templates/postman/base_folder.html:13
- #, fuzzy
- msgid "by message"
- msgstr "Messages"
+ #: teleforma/forms.py:65 teleforma/forms.py:224 teleforma/models/crfpa.py:457
+ msgid "Address detail"
+ msgstr "Adresse (detail)"
  
- #: templates/postman/base_folder.html:18
- msgid "Sorry, this page number is invalid."
- msgstr ""
+ #: teleforma/forms.py:66 teleforma/forms.py:225 teleforma/models/crfpa.py:459
+ msgid "Postal code"
+ msgstr "Code postal"
  
- #: templates/postman/base_folder.html:31
- #: templates/teleforma/course_conference_record.html:100
- #: templates/telemeta/lists.html:75
- msgid "Action"
- msgstr ""
+ #: teleforma/forms.py:67 teleforma/forms.py:226 teleforma/models/crfpa.py:460
+ msgid "City"
+ msgstr "Ville"
  
- #: templates/postman/base_folder.html:32
- msgid "Sender"
- msgstr ""
+ #: teleforma/forms.py:68 teleforma/forms.py:227 teleforma/models/crfpa.py:461
+ msgid "Country"
+ msgstr "Pays"
  
- #: templates/postman/base_folder.html:33 templates/postman/reply.html:4
- msgid "Recipient"
- msgstr ""
+ #: teleforma/forms.py:69 teleforma/forms.py:228 teleforma/models/crfpa.py:463
+ #: teleforma/templates/registration/registration_corrector_pdf.html:47
+ #: teleforma/templates/registration/registration_pdf.html:52
+ #: teleforma/templates/teleforma/profile_detail.html:82
+ msgid "Telephone"
+ msgstr "Téléphone"
  
- #: templates/postman/base_folder.html:34
- msgid "Subject"
- msgstr ""
+ #: teleforma/forms.py:70 teleforma/forms.py:229
+ #: teleforma/templates/registration/registration_corrector_pdf.html:59
+ #: teleforma/templates/registration/registration_pdf.html:64
+ msgid "Birthday"
+ msgstr "Date de naissance"
  
- #: templates/postman/base_folder.html:35
- #: templates/telemeta/inc/module_revisions.html:16
- msgid "Date"
- msgstr "Date"
+ #: teleforma/forms.py:74
+ #: teleforma/templates/registration/registration_pdf.html:69
+ msgid "Studying level"
+ msgstr "Niveau d'étude"
  
- #: templates/postman/base_folder.html:53
- msgid "g:i A,M j,n/j/y"
- msgstr ""
+ #: teleforma/forms.py:93 teleforma/templates/teleforma/inc/user_list.html:23
+ #: teleforma/templates/teleforma/profile_detail.html:71
+ msgid "Procedure"
+ msgstr "Procédure"
  
- #: templates/postman/base_folder.html:61 templates/postman/view.html:39
- #: templates/telemeta/lists.html:58
- msgid "Delete"
+ #: teleforma/forms.py:103
+ msgid "Code promo"
  msgstr ""
  
- #: templates/postman/base_folder.html:64 templates/postman/view.html:43
- msgid "Archive"
+ #: teleforma/forms.py:106
+ msgid "Échéancier de paiement"
  msgstr ""
  
- #: templates/postman/base_folder.html:67
- msgid "Undelete"
+ #: teleforma/forms.py:317
+ msgid "Recipients"
+ msgstr "Destinataires"
+ #: teleforma/forms.py:317 teleforma/templates/postman/base_folder.html:50
+ #: teleforma/templates/postman/reply.html:4
+ msgid "Recipient"
  msgstr ""
  
- #: templates/postman/base_folder.html:73
- #, fuzzy
- msgid "No messages."
- msgstr "Messages"
+ #: teleforma/models/ae.py:48 teleforma/models/chat.py:20
+ #: teleforma/models/core.py:349 teleforma/models/core.py:867
+ #: teleforma/models/crfpa.py:143 teleforma/models/crfpa.py:454
+ #: teleforma/models/crfpa.py:510 teleforma/models/notification.py:34
+ #: teleforma/models/pro.py:110 teleforma/models/pro.py:152
+ msgid "user"
+ msgstr "utilisateur"
  
- #: templates/postman/base_write.html:13
- msgid "to an administrator"
- msgstr "à un administrateur"
+ #: teleforma/models/ae.py:51
+ msgid "platform only"
+ msgstr "plateforme seulement"
  
- #: templates/postman/base_write.html:21
- msgid "to a professor"
- msgstr "à un professeur"
+ #: teleforma/models/ae.py:53 teleforma/models/core.py:335
+ #: teleforma/models/core.py:351
+ msgid "courses"
+ msgstr "matières"
  
- #: templates/postman/base_write.html:38
- #: templates/teleforma/inc/chat_room.html:13
- msgid "Send"
+ #: teleforma/models/ae.py:64
+ msgid "AE student"
+ msgstr "Etudiant AE"
+ #: teleforma/models/appointment.py:42
+ msgid "activer la prise de rendez-vous"
  msgstr ""
  
- #: templates/postman/email_user.txt:1 templates/postman/email_user_init.txt:1
- msgid "Hello"
- msgstr "Bonjour"
+ #: teleforma/models/chat.py:52
+ msgid "A new live conference has started : "
+ msgstr "Une nouvelle conférence en direct a commencé : "
  
- #: templates/postman/email_user.txt:3 templates/postman/email_visitor.txt:3
- #, python-format
- msgid "On %(date)s, you asked to send a message to the user '%(recipient)s'."
- msgstr ""
+ #: teleforma/models/core.py:88
+ msgid "broken"
+ msgstr "cassé"
  
- #: templates/postman/email_user.txt:5 templates/postman/email_visitor.txt:5
- msgid "Your message has been rejected by the moderator"
- msgstr ""
+ #: teleforma/models/core.py:88
+ msgid "processing"
+ msgstr "en cours"
  
- #: templates/postman/email_user.txt:5 templates/postman/email_visitor.txt:5
- msgid ", for the following reason:"
+ #: teleforma/models/core.py:89
+ msgid "done"
+ msgstr "fait"
+ #: teleforma/models/core.py:89
+ msgid "ready"
+ msgstr "prêt"
+ #: teleforma/models/core.py:106
+ msgid "Hidden"
+ msgstr "Caché"
+ #: teleforma/models/core.py:107
+ msgid "Private"
+ msgstr "Privé"
+ #: teleforma/models/core.py:108 teleforma/webclass/models.py:32
+ msgid "Draft"
+ msgstr "Brouillon"
+ #: teleforma/models/core.py:109 teleforma/webclass/models.py:33
+ msgid "Public"
+ msgstr "Publié"
+ #: teleforma/models/core.py:145 teleforma/models/core.py:159
+ #: teleforma/models/core.py:182 teleforma/models/core.py:226
+ #: teleforma/models/core.py:259 teleforma/models/core.py:387
+ #: teleforma/models/core.py:684 teleforma/models/core.py:761
+ #: teleforma/models/core.py:784 teleforma/models/crfpa.py:63
+ #: teleforma/models/crfpa.py:80 teleforma/models/crfpa.py:572
+ #: teleforma/models/crfpa.py:587 teleforma/models/crfpa.py:602
+ #: teleforma/models/pro.py:135
+ msgid "description"
+ msgstr "description"
+ #: teleforma/models/core.py:152 teleforma/models/core.py:161
+ #: teleforma/models/core.py:384 teleforma/models/pro.py:134
+ msgid "organization"
+ msgstr "organisation"
+ #: teleforma/models/core.py:162
+ msgid "Master domain"
  msgstr ""
  
- #: templates/postman/email_user.txt:9 templates/postman/email_visitor.txt:10
- #, python-format
- msgid "On %(date)s, you sent a message to the user '%(sender)s'."
+ #: teleforma/models/core.py:175 teleforma/models/core.py:186
+ #: teleforma/models/core.py:256 teleforma/models/core.py:354
+ #: teleforma/models/core.py:411 teleforma/webclass/models.py:154
+ msgid "department"
+ msgstr "département"
+ #: teleforma/models/core.py:184 teleforma/models/crfpa.py:84
+ msgid "parent"
  msgstr ""
  
- #: templates/postman/email_user.txt:10
- msgid "Your correspondent has given you an answer."
+ #: teleforma/models/core.py:188 teleforma/models/core.py:426
+ msgid "begin date"
+ msgstr "date de début"
+ #: teleforma/models/core.py:189 teleforma/models/core.py:427
+ msgid "end date"
+ msgstr "date de fin"
+ #: teleforma/models/core.py:191
+ msgid "date d'init de mot de passe"
  msgstr ""
  
- #: templates/postman/email_user.txt:11
- #, python-format
- msgid "You have received a copy of a response from the user '%(sender)s'."
+ #: teleforma/models/core.py:193
+ msgid "message pour internaute"
  msgstr ""
  
- #: templates/postman/email_user.txt:13
- #, python-format
- msgid "You have received a message from the user '%(sender)s'."
+ #: teleforma/models/core.py:195
+ msgid "message pour presentielle"
  msgstr ""
  
- #: templates/postman/email_user.txt:14
- msgid ""
- "You can read and respond to this message from your e-learning desk following "
- "this link:"
+ #: teleforma/models/core.py:196
+ msgid "is open"
  msgstr ""
- "Vous pouvez lire et répondre à ce message depuis votre bureau e-learning en "
- "suivant ce lien :"
  
- #: templates/postman/email_user.txt:19 templates/postman/email_visitor.txt:14
- msgid "Thank you again for your interest in our services."
+ #: teleforma/models/core.py:198
+ msgid "date de fin d'examens"
  msgstr ""
  
- #: templates/postman/email_user.txt:20
- #: templates/postman/email_user_init.txt:20
- #: templates/postman/email_visitor.txt:16
- msgid "The site administrator"
+ #: teleforma/models/core.py:200
+ msgid "nombre maximal de copies"
  msgstr ""
  
- #: templates/postman/email_user.txt:20
- msgid "of"
- msgstr "de"
+ #: teleforma/models/core.py:234 teleforma/models/core.py:418
+ #: teleforma/models/core.py:806 teleforma/models/core.py:977
+ msgid "course type"
+ msgstr "type de matière"
  
- #: templates/postman/email_user.txt:22
- #: templates/postman/email_user_init.txt:23
- #: templates/postman/email_visitor.txt:18
- msgid ""
- "Note: This message is issued by an automated system.\n"
- "Do not reply, this would not be taken into account."
- msgstr ""
+ #: teleforma/models/core.py:257 teleforma/models/core.py:759
+ #: teleforma/models/pro.py:51 teleforma/models/pro.py:90
+ msgid "title"
+ msgstr "titre"
  
- #: templates/postman/email_user_init.txt:19
- msgid "Best regards"
- msgstr "Cordialement"
+ #: teleforma/models/core.py:260 teleforma/models/core.py:767
+ #: teleforma/models/crfpa.py:77
+ msgid "code"
+ msgstr "cote"
  
- #: templates/postman/email_user_init.txt:20
- msgid "of the"
- msgstr "du"
+ #: teleforma/models/core.py:261
+ msgid "tweeter title"
+ msgstr "titre tweeter"
  
- #: templates/postman/email_user_subject.txt:1
- #: templates/postman/email_visitor_subject.txt:1
- #, python-format
- msgid "Message \"%(subject)s\" on the site %(sitename)s"
- msgstr ""
+ #: teleforma/models/core.py:264 teleforma/models/core.py:785
+ msgid "number"
+ msgstr "nombre"
  
- #: templates/postman/email_user_subject_init.txt:1
- #, python-format
- msgid "%(organization)s : initialization of your e-learning account"
- msgstr "%(organization)s : initialisation de votre compte e-learning"
+ #: teleforma/models/core.py:265 teleforma/models/crfpa.py:85
+ msgid "synthesis note"
+ msgstr "note de synthèse"
  
- #: templates/postman/email_visitor.txt:1
- msgid "Dear visitor,"
- msgstr ""
+ #: teleforma/models/core.py:266 teleforma/models/crfpa.py:88
+ msgid "obligations"
+ msgstr "obligations"
  
- #: templates/postman/email_visitor.txt:8
- msgid "As a reminder, please find below the content of your message."
+ #: teleforma/models/core.py:267 teleforma/models/crfpa.py:110
+ msgid "magistral"
+ msgstr "magistral"
+ #: teleforma/models/core.py:268 teleforma/models/crfpa.py:91
+ #: teleforma/models/crfpa.py:156
+ msgid "procedure"
+ msgstr "procédure"
+ #: teleforma/models/core.py:269
+ msgid "written_speciality"
+ msgstr "spécialité écrit"
+ #: teleforma/models/core.py:270
+ msgid "oral_speciality"
+ msgstr "spécialité orale"
+ #: teleforma/models/core.py:271
+ msgid "oral_1"
  msgstr ""
  
- #: templates/postman/email_visitor.txt:11
- msgid "Please find below the answer from your correspondent."
+ #: teleforma/models/core.py:272
+ msgid "oral_2"
  msgstr ""
  
- #: templates/postman/email_visitor.txt:15
- msgid "For more comfort, we encourage you to open an account on the site."
+ #: teleforma/models/core.py:273
+ msgid "copies d'examen"
  msgstr ""
  
- #: templates/postman/inbox.html:3
- #, fuzzy
- msgid "Received Messages"
- msgstr "Messages"
+ #: teleforma/models/core.py:343
+ msgid "course group"
+ msgstr "groupe de matière"
  
- #: templates/postman/inbox.html:6
- msgid "Received"
+ #: teleforma/models/core.py:377 teleforma/models/core.py:419
+ #: teleforma/webclass/models.py:216
+ msgid "professor"
+ msgstr "professeur"
+ #: teleforma/models/core.py:394 teleforma/models/core.py:423
+ msgid "room"
+ msgstr "salle"
+ #: teleforma/models/core.py:398 teleforma/models/core.py:648
+ #: teleforma/models/core.py:702 teleforma/models/core.py:973
+ msgid "conference"
+ msgstr "conférence"
+ #: teleforma/models/core.py:402 teleforma/models/core.py:428
+ msgid "publishing date"
+ msgstr "date de publication"
+ #: teleforma/models/core.py:405 teleforma/models/core.py:436
+ msgid "notified"
+ msgstr "notifié"
+ #: teleforma/models/core.py:410
+ msgid "public_id"
+ msgstr "public id"
+ #: teleforma/models/core.py:425 teleforma/webclass/models.py:173
+ msgid "comment"
+ msgstr "commentaire"
+ #: teleforma/models/core.py:429 teleforma/models/core.py:819
+ #: teleforma/models/core.py:902 teleforma/models/core.py:983
+ msgid "readers"
  msgstr ""
  
- #: templates/postman/reply.html:3 templates/postman/view.html:47
- #: templates/postman/view.html.py:50 templates/postman/view.html:53
- msgid "Reply"
+ #: teleforma/models/core.py:433 teleforma/models/core.py:708
+ msgid "streaming"
+ msgstr "diffusion"
+ #: teleforma/models/core.py:434 teleforma/models/core.py:1149
+ #: teleforma/models/core.py:1150
+ msgid "web class group"
  msgstr ""
  
- #: templates/postman/sent.html:6
- msgid "Sent"
+ #: teleforma/models/core.py:678
+ msgid "protocol"
  msgstr ""
  
- #: templates/postman/trash.html:3
- #, fuzzy
- msgid "Deleted Messages"
- msgstr "Messages"
+ #: teleforma/models/core.py:679
+ msgid "host"
+ msgstr "hôte"
  
- #: templates/postman/trash.html:10
- msgid ""
- "Messages in this folder can be removed from time to time. For long term "
- "storage, use instead the archive folder."
+ #: teleforma/models/core.py:680
+ msgid "port"
+ msgstr "port"
+ #: teleforma/models/core.py:681
+ msgid "path"
  msgstr ""
  
- #: templates/postman/view.html:9
- msgid "Conversation"
+ #: teleforma/models/core.py:685
+ msgid "source password"
  msgstr ""
  
- #: templates/postman/view.html:9 templates/telemeta/inc/user_list.html:72
- #, fuzzy
- msgid "Message"
- msgstr "Messages"
+ #: teleforma/models/core.py:687
+ msgid "admin password"
+ msgstr ""
+ #: teleforma/models/core.py:694 teleforma/models/core.py:705
+ msgid "streaming server"
+ msgstr "serveur de diffusion"
+ #: teleforma/models/core.py:706
+ msgid "Streaming type"
+ msgstr "Type de flux"
+ #: teleforma/models/core.py:753
+ msgid "live stream"
+ msgstr "stream en direct"
+ #: teleforma/models/core.py:762
+ msgid "credits"
+ msgstr "crédits"
+ #: teleforma/models/core.py:768
+ msgid "published"
+ msgstr "publié"
+ #: teleforma/models/core.py:769
+ msgid "mime type"
+ msgstr "Type mime"
+ #: teleforma/models/core.py:771 teleforma/models/pro.py:94
+ msgid "weight"
+ msgstr "poids"
+ #: teleforma/models/core.py:795
+ msgid "document type"
+ msgstr "type de document"
+ #: teleforma/models/core.py:807
+ msgid "periods"
+ msgstr "périodes"
+ #: teleforma/models/core.py:813 teleforma/models/crfpa.py:148
+ #: teleforma/webclass/models.py:160
+ msgid "iej"
+ msgstr "iej"
+ #: teleforma/models/core.py:815
+ msgid "annal"
+ msgstr "annale"
  
- #: templates/postman/view.html:25
+ #: teleforma/models/core.py:816
+ msgid "year"
+ msgstr "année"
+ #: teleforma/models/core.py:817 teleforma/models/core.py:869
+ #: teleforma/models/core.py:900 teleforma/models/core.py:941
+ #: teleforma/models/core.py:986
+ msgid "file"
+ msgstr "fichier"
+ #: teleforma/models/core.py:865
  #, fuzzy
- msgid "Rejected"
- msgstr "rejeté"
+ #| msgid "document 1"
+ msgid "document"
+ msgstr "document 1"
  
- #: templates/postman/view.html:25
- msgid ":"
- msgstr ""
+ #: teleforma/models/core.py:935
+ msgid "item"
+ msgstr "item"
  
- #: templates/postman/view.html:36
- msgid "Back"
- msgstr ""
+ #: teleforma/models/core.py:936
+ msgid "mime_type"
+ msgstr "type mime"
  
- #: templates/postman/write.html:3 templates/telemeta/inc/user_list.html:28
- msgid "Write"
+ #: teleforma/models/core.py:937
+ msgid "date"
  msgstr ""
  
- #: templates/teleforma/annals.html:6 templates/teleforma/annals.html.py:54
- #: templates/telemeta/base.html:109 templates/telemeta/base.html.py:119
- msgid "Annals"
- msgstr "Annales"
+ #: teleforma/models/core.py:988
+ msgid "poster file"
+ msgstr "fichier poster"
  
- #: templates/teleforma/annals.html:15
- #: templates/telemeta/profile_detail.html:16
- msgid "My courses"
- msgstr "Mes matières"
+ #: teleforma/models/core.py:1145 teleforma/models/crfpa.py:70
+ #: teleforma/models/crfpa.py:71
+ #: teleforma/templates/registration/registration_pdf.html:73
+ #: teleforma/templates/teleforma/annals.html:30
+ #: teleforma/templates/teleforma/inc/user_list.html:21
+ #: teleforma/templates/teleforma/profile_detail.html:68
+ #: teleforma/templates/teleforma/users.html:27
+ msgid "IEJ"
+ msgstr "IEJ"
  
- #: templates/teleforma/annals.html:49
- #: templates/teleforma/inc/document_list.html:36
- msgid "No document"
- msgstr "Aucun document"
+ #: teleforma/models/crfpa.py:95 teleforma/models/crfpa.py:159
+ #: teleforma/models/crfpa.py:162
+ msgid "written speciality"
+ msgstr "spécialité écrit"
  
- #: templates/teleforma/annals.html:70
- #: templates/teleforma/inc/conference_list.html:18
- #: templates/teleforma/inc/document_list.html:20
- msgid "View"
- msgstr "Voir"
+ #: teleforma/models/crfpa.py:98 teleforma/models/crfpa.py:165
+ msgid "oral speciality"
+ msgstr "spécialité orale"
  
- #: templates/teleforma/annals.html:74 templates/teleforma/course_media.html:64
- #: templates/teleforma/inc/document_list.html:22
- #: templates/teleforma/inc/media_list.html:56
- msgid "Download"
- msgstr "Télécharger"
+ #: teleforma/models/crfpa.py:101
+ msgid "oral 1"
+ msgstr ""
  
- #: templates/teleforma/course.html:14
- #: templates/teleforma/inc/document_list.html:7
- msgid "Documents"
- msgstr "Supports écrits"
+ #: teleforma/models/crfpa.py:104
+ msgid "oral 2"
+ msgstr ""
  
- #: templates/teleforma/course.html:17 templates/teleforma/course.html.py:33
- #: templates/teleforma/course_conference_audio.html:66
- #: templates/teleforma/course_document.html:73
- #: templates/teleforma/inc/conference_list.html:25
- #: templates/teleforma/inc/media_list.html:36 templates/telemeta/lists.html:69
- #: templates/telemeta/search_criteria.html:97
- #: templates/telemeta/inc/module_revisions.html:17
- msgid "Title"
- msgstr "Titre"
+ #: teleforma/models/crfpa.py:107 teleforma/models/crfpa.py:174
+ msgid "options"
+ msgstr "options"
  
- #: templates/teleforma/course.html:18 templates/teleforma/course.html.py:34
- msgid "Description"
- msgstr "Description"
+ #: teleforma/models/crfpa.py:112
+ msgid "cost"
+ msgstr "coût"
  
- #: templates/teleforma/course.html:19 templates/teleforma/course.html.py:35
- #: templates/teleforma/course.html:52
- #: templates/teleforma/course_media.html:147
- #: templates/telemeta/profile_detail.html:81
- msgid "Date added"
- msgstr "Date d'ajout"
+ #: teleforma/models/crfpa.py:114
+ msgid "e-learning cost with fascicle"
+ msgstr ""
  
- #: templates/teleforma/course.html:30
- msgid "Medias"
- msgstr "Médias"
+ #: teleforma/models/crfpa.py:116
+ msgid "e-learning cost without fascicle"
+ msgstr ""
  
- #: templates/teleforma/course.html:47
- msgid "Conferences"
- msgstr "Conférences"
+ #: teleforma/models/crfpa.py:117
+ msgid "available"
+ msgstr ""
  
- #: templates/teleforma/course.html:50
- #: templates/teleforma/course_conference.html:40
- #: templates/teleforma/course_conference.html:71
- #: templates/teleforma/course_conference_audio.html:68
- #: templates/teleforma/course_media.html:86
- #: templates/teleforma/course_media.html:136
- #: templates/teleforma/inc/conference_list.html:26
- #: templates/teleforma/inc/media_list.html:37
- msgid "Session"
- msgstr "Session"
- #: templates/teleforma/course.html:51
- #: templates/teleforma/course_conference.html:72
- #: templates/teleforma/course_conference_audio.html:67
- #: templates/teleforma/course_media.html:138
- #: templates/teleforma/inc/conference_list.html:27
- #: templates/teleforma/inc/media_list.html:39
- #: templates/telemeta/inc/user_list.html:48
- msgid "Professor"
- msgstr "Professeur"
+ #: teleforma/models/crfpa.py:118 teleforma/models/crfpa.py:178
+ msgid "e-learning platform only"
+ msgstr "formation e-learning uniquement"
  
- #: templates/teleforma/course_conference.html:27
- #: templates/teleforma/course_conference_audio.html:25
- msgid "S T O P"
- msgstr "S T O P"
+ #: teleforma/models/crfpa.py:136 teleforma/models/crfpa.py:153
+ msgid "training"
+ msgstr "formation"
  
- #: templates/teleforma/course_conference.html:37
- #: templates/teleforma/course_media.html:76
- msgid "Audio"
+ #: teleforma/models/crfpa.py:150
+ msgid "trainings"
+ msgstr "formations"
+ #: teleforma/models/crfpa.py:168
+ msgid "oral de langue (option)"
  msgstr ""
  
- #: templates/teleforma/course_conference.html:70
- #: templates/teleforma/course_media.html:135
- msgid "Course"
- msgstr "Matière"
+ #: teleforma/models/crfpa.py:171
+ msgid "oral 2 (option)"
+ msgstr ""
  
- #: templates/teleforma/course_conference.html:75
- #: templates/teleforma/course_media.html:141
- #: templates/teleforma/inc/media_list.html:43
- msgid "Comment"
- msgstr "Commentaire"
+ #: teleforma/models/crfpa.py:180
+ msgid "application fees"
+ msgstr "frais de dossier"
  
- #: templates/teleforma/course_conference.html:76
- #: templates/teleforma/course_media.html:142
- msgid "Begin date"
- msgstr "Date de début"
+ #: teleforma/models/crfpa.py:183
+ msgid "subscription fees"
+ msgstr "frais d'inscription"
  
- #: templates/teleforma/course_conference.html:77
- #: templates/teleforma/course_media.html:143
- msgid "End date"
- msgstr "Date de fin"
+ #: teleforma/models/crfpa.py:184
+ msgid "promo code"
+ msgstr ""
  
- #: templates/teleforma/course_conference.html:78
- #: templates/teleforma/course_conference_audio.html:72
- msgid "Live"
- msgstr "Direct"
+ #: teleforma/models/crfpa.py:186 teleforma/models/crfpa.py:520
+ msgid "registration date"
+ msgstr "date de pré-inscription"
  
- #: templates/teleforma/course_conference.html:78
- #: templatetags/teleforma_tags.py:132
- msgid "Yes"
- msgstr "Oui"
+ #: teleforma/models/crfpa.py:188
+ msgid "subscription date"
+ msgstr "date d'inscription"
  
- #: templates/teleforma/course_conference.html:79
- #: templates/teleforma/course_conference_audio.html:69
- #: templates/teleforma/course_media.html:144
- msgid "Room"
- msgstr "Salle"
+ #: teleforma/models/crfpa.py:189
+ msgid "subscribed"
+ msgstr "inscrit"
  
- #: templates/teleforma/course_conference.html:81
- #: templates/teleforma/course_media.html:150
- msgid "Conference ID"
- msgstr "ID Conférence"
+ #: teleforma/models/crfpa.py:190
+ msgid "confirmation sent"
+ msgstr "confirmation envoyée"
  
- #: templates/teleforma/course_conference_audio.html:36
- #: templates/teleforma/course_media.html:79
- msgid "Video"
+ #: teleforma/models/crfpa.py:192
+ msgid "studying level"
+ msgstr "niveau d'étude"
+ #: teleforma/models/crfpa.py:195
+ msgid "balance de paiement"
  msgstr ""
  
- #: templates/teleforma/course_conference_audio.html:70
- #: templates/teleforma/inc/conference_list.html:28
- #: templates/teleforma/inc/media_list.html:41
- msgid "Begin"
- msgstr "Début"
+ #: teleforma/models/crfpa.py:199
+ msgid "envoi des fascicules"
+ msgstr ""
+ #: teleforma/models/crfpa.py:202
+ #, fuzzy
+ #| msgid "department"
+ msgid "type de paiement"
+ msgstr "département"
+ #: teleforma/models/crfpa.py:205
+ msgid "échéancier de paiement"
+ msgstr ""
+ #: teleforma/models/crfpa.py:209
+ #, fuzzy
+ #| msgid "comment"
+ msgid "commentaire"
+ msgstr "commentaire"
+ #: teleforma/models/crfpa.py:214
+ msgid "échances générées"
+ msgstr ""
+ #: teleforma/models/crfpa.py:414
+ msgid "Student"
+ msgstr "Etudiant"
+ #: teleforma/models/crfpa.py:415
+ msgid "Students"
+ msgstr "Etudiants"
+ #: teleforma/models/crfpa.py:462
+ #: teleforma/templates/teleforma/profile_detail.html:96
+ msgid "Language"
+ msgstr "Langue"
+ #: teleforma/models/crfpa.py:465
+ msgid "Expiration_date"
+ msgstr "Date d'expiration"
+ #: teleforma/models/crfpa.py:466
+ msgid "Password initialized"
+ msgstr "Mot de passe initialisé"
+ #: teleforma/models/crfpa.py:467
+ #: teleforma/templates/teleforma/profile_detail.html:85
+ msgid "WiFi login"
+ msgstr ""
+ #: teleforma/models/crfpa.py:468
+ msgid "WiFi pass"
+ msgstr ""
+ #: teleforma/models/crfpa.py:470
+ msgid "birthday"
+ msgstr "date de naissance"
+ #: teleforma/models/crfpa.py:480
+ #, fuzzy
+ #| msgid "original code"
+ msgid "origin"
+ msgstr "cote originale"
+ #: teleforma/models/crfpa.py:487
+ msgid "profile"
+ msgstr "profil"
+ #: teleforma/models/crfpa.py:533
+ #, fuzzy
+ #| msgid "Corrector"
+ msgid "Correcteur"
+ msgstr "Correcteur"
+ #: teleforma/models/crfpa.py:534
+ #, fuzzy
+ #| msgid "Correctors"
+ msgid "Correcteurs"
+ msgstr "Correcteurs"
+ #: teleforma/models/crfpa.py:542 teleforma/models/crfpa.py:569
+ #: teleforma/models/crfpa.py:584 teleforma/models/crfpa.py:599
+ msgid "student"
+ msgstr "étudiant"
+ #: teleforma/models/crfpa.py:543 teleforma/models/crfpa.py:570
+ #: teleforma/models/crfpa.py:585 teleforma/models/crfpa.py:600
+ msgid "amount"
+ msgstr "montant"
+ #: teleforma/models/crfpa.py:544
+ msgid "month"
+ msgstr "mois"
+ #: teleforma/models/crfpa.py:546
+ msgid "payment type"
+ msgstr "type de paiement"
+ #: teleforma/models/crfpa.py:548 teleforma/models/crfpa.py:670
+ msgid "date created"
+ msgstr "date de création"
+ #: teleforma/models/crfpa.py:560
+ msgid "Payment"
+ msgstr "Paiement"
+ #: teleforma/models/crfpa.py:561
+ msgid "Payments"
+ msgstr "Paiements"
+ #: teleforma/models/crfpa.py:576
+ msgid "Discount"
+ msgstr "Réduction"
+ #: teleforma/models/crfpa.py:577
+ msgid "Discounts"
+ msgstr "Réductions"
+ #: teleforma/models/crfpa.py:591 teleforma/models/crfpa.py:592
+ msgid "Optional fees"
+ msgstr "Frais optionnels"
+ #: teleforma/models/crfpa.py:606
+ msgid "Payback"
+ msgstr "Remboursement"
+ #: teleforma/models/crfpa.py:607
+ msgid "Paybacks"
+ msgstr ""
+ #: teleforma/models/crfpa.py:615 teleforma/models/crfpa.py:663
+ #: teleforma/templates/quiz/quiz_list.html:12
+ #: teleforma/templates/teleforma/course.html:19
+ #: teleforma/templates/teleforma/course.html:36
+ #: teleforma/templates/teleforma/course_conference_audio.html:65
+ #: teleforma/templates/teleforma/course_document.html:66
+ #: teleforma/templates/teleforma/inc/conference_list.html:26
+ #: teleforma/templates/teleforma/inc/media_list.html:36
+ #: teleforma/templates/teleforma/inc/media_list_pending.html:33
+ #: teleforma/templates/teleforma/lists.html:69
+ #: teleforma/templates/teleforma/search_criteria.html:96
+ #: teleforma/templates/telemeta/inc/module_revisions.html:17
+ msgid "Title"
+ msgstr "Titre"
+ #: teleforma/models/messages.py:23
+ msgid "students"
+ msgstr "étudiants"
+ #: teleforma/models/messages.py:28
+ msgid "Student group"
+ msgstr "Groupes étudiant"
+ #: teleforma/models/messages.py:38
+ msgid "group"
+ msgstr "group"
+ #: teleforma/models/messages.py:41
+ msgid "sender"
+ msgstr "expéditeur"
+ #: teleforma/models/messages.py:43
+ msgid "subject"
+ msgstr "sujet"
+ #: teleforma/models/messages.py:44
+ msgid "message"
+ msgstr "message"
+ #: teleforma/models/messages.py:45
+ msgid "to send"
+ msgstr "à envoyer"
+ #: teleforma/models/messages.py:46
+ msgid "sent"
+ msgstr "envoyé"
+ #: teleforma/models/messages.py:47
+ msgid "date sent"
+ msgstr "date d'envoi"
+ #: teleforma/models/messages.py:51 teleforma/templates/teleforma/users.html:54
+ msgid "Grouped message"
+ msgstr "Message groupé"
+ #: teleforma/models/pro.py:52
+ msgid "price"
+ msgstr "prix"
+ #: teleforma/models/pro.py:57
+ msgid "public concerned"
+ msgstr ""
+ #: teleforma/models/pro.py:60
+ msgid "document 1"
+ msgstr "document 1"
+ #: teleforma/models/pro.py:63
+ msgid "media"
+ msgstr "médias"
+ #: teleforma/models/pro.py:66
+ msgid "document 2"
+ msgstr "document 2"
+ #: teleforma/models/pro.py:69
+ msgid "corrected document"
+ msgstr "document corrigé"
+ #: teleforma/models/pro.py:71
+ msgid "suscribers"
+ msgstr "inscrits"
+ #: teleforma/models/pro.py:76
+ msgid "approximative duration"
+ msgstr "durée approximative"
+ #: teleforma/models/pro.py:77
+ msgid "keywords"
+ msgstr "mots clés"
+ #: teleforma/models/pro.py:84
+ msgid "Seminar"
+ msgstr "Sémimaire"
+ #: teleforma/models/pro.py:89 teleforma/models/pro.py:150
+ msgid "seminar"
+ msgstr "séminaire"
+ #: teleforma/models/pro.py:91 teleforma/models/pro.py:112
+ msgid "question"
+ msgstr "question"
+ #: teleforma/models/pro.py:95
+ msgid "minimum numbers of characters"
+ msgstr "nombre de caractère minimum"
+ #: teleforma/models/pro.py:104 teleforma/templates/quiz/question.html:47
+ #: teleforma/templates/quiz/sitting_detail.html:21
+ msgid "Question"
+ msgstr "Questions"
+ #: teleforma/models/pro.py:110 teleforma/models/pro.py:112
+ #: teleforma/models/pro.py:113
+ msgid "answer"
+ msgstr "réponse"
+ #: teleforma/models/pro.py:116
+ msgid "validated"
+ msgstr "validé"
+ #: teleforma/models/pro.py:128
+ msgid "Answer"
+ msgstr "Réponse"
+ #: teleforma/models/pro.py:137 teleforma/models/pro.py:154
+ msgid "testimonial_template"
+ msgstr ""
+ #: teleforma/models/pro.py:138
+ msgid "template"
+ msgstr "modèle"
+ #: teleforma/models/pro.py:145
+ msgid "Testimonial template"
+ msgstr "Modèle d'attestation"
+ #: teleforma/models/pro.py:152 teleforma/models/pro.py:153
+ #: teleforma/models/pro.py:155
+ msgid "testimonial"
+ msgstr "attestation"
+ #: teleforma/models/pro.py:160
+ msgid "Testimonial"
+ msgstr "Attestation"
+ #: teleforma/templates/404.html:9
+ msgid "Page not found"
+ msgstr "Page non trouvée"
+ #: teleforma/templates/500.html:9
+ msgid "Server error"
+ msgstr "Erreur du serveur"
++<<<<<<< HEAD
++#: templates/admin/base.html:21 templates/telemeta/base.html:99
++msgid "Home"
++msgstr "Accueil"
++
++#: templates/postman/archives.html:3
++#, fuzzy
++=======
+ #: teleforma/templates/postman/archives.html:3
++>>>>>>> feature/dj4.2
+ msgid "Archived Messages"
+ msgstr "Messages archivés"
+ #: teleforma/templates/postman/archives.html:7
+ msgid ""
+ "Messages in this folder will never be removed. You can use this folder for "
+ "long term storage."
+ msgstr ""
+ #: teleforma/templates/postman/base.html:10
+ msgid "Folders"
+ msgstr "Dossiers"
+ #: teleforma/templates/postman/base.html:15
+ msgid "Inbox"
+ msgstr ""
+ #: teleforma/templates/postman/base.html:16
+ #: teleforma/templates/postman/sent.html:3
+ msgid "Sent Messages"
+ msgstr "Messages envoyés"
++<<<<<<< HEAD
++#: templates/postman/base.html:17 templates/telemeta/base.html:114
++=======
+ #: teleforma/templates/postman/base.html:17
++>>>>>>> feature/dj4.2
+ msgid "Archives"
+ msgstr ""
+ #: teleforma/templates/postman/base.html:18
+ msgid "Trash"
+ msgstr ""
+ #: teleforma/templates/postman/base.html:23
+ msgid "New message"
+ msgstr "Nouveau message"
+ #: teleforma/templates/postman/base_folder.html:18
+ msgid "by conversation"
+ msgstr ""
+ #: teleforma/templates/postman/base_folder.html:19
+ msgid "by message"
+ msgstr "par messages"
+ #: teleforma/templates/postman/base_folder.html:26
+ msgid "Sorry, this page number is invalid."
+ msgstr ""
++<<<<<<< HEAD
++#: templates/postman/base_folder.html:31
++#: templates/teleforma/course_conference_record.html:100
++#: templates/telemeta/lists.html:75
++=======
+ #: teleforma/templates/postman/base_folder.html:48
+ #: teleforma/templates/teleforma/course_conference_record.html:62
+ #: teleforma/templates/teleforma/lists.html:75
++>>>>>>> feature/dj4.2
+ msgid "Action"
+ msgstr ""
+ #: teleforma/templates/postman/base_folder.html:49
+ msgid "Sender"
+ msgstr ""
+ #: teleforma/templates/postman/base_folder.html:51
+ msgid "Subject"
+ msgstr ""
+ #: teleforma/templates/postman/base_folder.html:52
+ #: teleforma/templates/telemeta/inc/module_revisions.html:16
+ msgid "Date"
+ msgstr "Date"
+ #: teleforma/templates/postman/base_folder.html:70
+ msgid "g:i A,M j,n/j/y"
+ msgstr ""
+ #: teleforma/templates/postman/base_folder.html:78
+ #: teleforma/templates/postman/view.html:47
+ #: teleforma/templates/teleforma/lists.html:58
+ msgid "Delete"
+ msgstr ""
+ #: teleforma/templates/postman/base_folder.html:81
+ #: teleforma/templates/postman/view.html:51
+ msgid "Archive"
+ msgstr ""
+ #: teleforma/templates/postman/base_folder.html:84
+ msgid "Undelete"
+ msgstr ""
+ #: teleforma/templates/postman/base_folder.html:90
+ msgid "No messages."
+ msgstr "Aucun message"
+ #: teleforma/templates/postman/base_write.html:14
+ msgid ""
+ "Vous pouvez ici échanger des messages avec les professeurs et les "
+ "administrateurs."
+ msgstr ""
+ #: teleforma/templates/postman/base_write.html:16
+ msgid ""
+ "Pour les questions concernant l'organisation des cours, le planning, les "
+ "documents de cours ou les copies, adressez-vous à <b>Admin-CRFPA</b>."
+ msgstr ""
+ #: teleforma/templates/postman/base_write.html:18
+ msgid ""
+ "Pour les questions concernant uniquement l'accès à la plateforme et aux "
+ "médias vidéo ou audio, lire d'abord"
+ msgstr ""
+ #: teleforma/templates/postman/email_user.txt:1
+ #: teleforma/templates/postman/email_user_init.txt:1
+ #: teleforma/templates/registration/password_reset_email.html:1
+ msgid "Hello"
+ msgstr "Bonjour"
+ #: teleforma/templates/postman/email_user.txt:3
+ #: teleforma/templates/postman/email_visitor.txt:3
+ #, python-format
+ msgid "On %(date)s, you asked to send a message to the user '%(recipient)s'."
+ msgstr ""
+ #: teleforma/templates/postman/email_user.txt:5
+ #: teleforma/templates/postman/email_visitor.txt:5
+ msgid "Your message has been rejected by the moderator"
+ msgstr ""
+ #: teleforma/templates/postman/email_user.txt:5
+ #: teleforma/templates/postman/email_visitor.txt:5
+ msgid ", for the following reason:"
+ msgstr ""
+ #: teleforma/templates/postman/email_user.txt:9
+ #: teleforma/templates/postman/email_visitor.txt:10
+ #, python-format
+ msgid "On %(date)s, you sent a message to the user '%(sender)s'."
+ msgstr ""
+ #: teleforma/templates/postman/email_user.txt:10
+ msgid "Your correspondent has given you an answer."
+ msgstr ""
+ #: teleforma/templates/postman/email_user.txt:14
+ #, python-format
+ msgid "You have received a copy of a response from the user '%(sender)s' :"
+ msgstr ""
+ #: teleforma/templates/postman/email_user.txt:17
+ #, python-format
+ msgid "You have received a message from the user '%(sender)s': "
+ msgstr "Vous avez reçu un message de l'utilisateur '%(sender)s' : "
+ #: teleforma/templates/postman/email_user.txt:27
+ #: teleforma/templates/postman/email_visitor.txt:14
+ msgid "Thank you again for your interest in our services."
+ msgstr ""
+ #: teleforma/templates/postman/email_user.txt:28
+ #: teleforma/templates/quiz/question.html:47
+ msgid "of"
+ msgstr "de"
+ #: teleforma/templates/postman/email_user_subject.txt:1
+ #: teleforma/templates/postman/email_visitor_subject.txt:1
+ #, python-format
+ msgid "Message \"%(subject)s\" on the site %(sitename)s"
+ msgstr ""
+ #: teleforma/templates/postman/email_user_subject_init.txt:1
+ #, python-format
+ msgid "%(organization)s : initialization of your e-learning account"
+ msgstr "%(organization)s : initialisation de votre compte e-learning"
+ #: teleforma/templates/postman/email_visitor.txt:1
+ msgid "Dear visitor,"
+ msgstr ""
+ #: teleforma/templates/postman/email_visitor.txt:8
+ msgid "As a reminder, please find below the content of your message."
+ msgstr ""
+ #: teleforma/templates/postman/email_visitor.txt:11
+ msgid "Please find below the answer from your correspondent."
+ msgstr ""
+ #: teleforma/templates/postman/email_visitor.txt:15
+ msgid "For more comfort, we encourage you to open an account on the site."
+ msgstr ""
+ #: teleforma/templates/postman/inbox.html:3
+ msgid "Received Messages"
+ msgstr "Messages reçus"
+ #: teleforma/templates/postman/inbox.html:6
+ msgid "Received"
+ msgstr ""
+ #: teleforma/templates/postman/reply.html:3
+ #: teleforma/templates/postman/view.html:56
+ #: teleforma/templates/postman/view.html:59
+ msgid "Reply"
+ msgstr ""
+ #: teleforma/templates/postman/sent.html:6
+ msgid "Sent"
+ msgstr ""
+ #: teleforma/templates/postman/trash.html:3
+ msgid "Deleted Messages"
+ msgstr "Messages supprimés"
+ #: teleforma/templates/postman/trash.html:10
+ msgid ""
+ "Messages in this folder can be removed from time to time. For long term "
+ "storage, use instead the archive folder."
+ msgstr ""
+ #: teleforma/templates/postman/view.html:9
+ msgid "Conversation"
+ msgstr ""
+ #: teleforma/templates/postman/view.html:9
+ #: teleforma/templates/teleforma/inc/user_list.html:72
+ #, fuzzy
+ msgid "Message"
+ msgstr "Messages"
+ #: teleforma/templates/postman/view.html:33
+ msgid ":"
+ msgstr ""
+ #: teleforma/templates/postman/view.html:44
+ msgid "Back"
+ msgstr ""
+ #: teleforma/templates/postman/write.html:3
+ #: teleforma/templates/teleforma/inc/user_list.html:28
+ msgid "Write"
+ msgstr ""
++<<<<<<< HEAD
++#: templates/teleforma/annals.html:6 templates/teleforma/annals.html.py:54
++#: templates/telemeta/base.html:109 templates/telemeta/base.html.py:119
++msgid "Annals"
++msgstr "Annales"
++=======
+ #: teleforma/templates/quiz/category_list.html:3
+ #: teleforma/templates/quiz/quiz_list.html:3
+ #: teleforma/templates/quiz/sitting_list.html:3
+ msgid "All Quizzes"
+ msgstr ""
++>>>>>>> feature/dj4.2
+ #: teleforma/templates/quiz/category_list.html:6
+ msgid "Category list"
+ msgstr "Liste de catégories"
+ #: teleforma/templates/quiz/correct_answer.html:6
+ msgid "You answered the above question incorrectly"
+ msgstr ""
+ #: teleforma/templates/quiz/correct_answer.html:16
+ msgid "This is the correct answer"
+ msgstr ""
+ #: teleforma/templates/quiz/correct_answer.html:23
+ msgid "This was your answer."
+ msgstr ""
+ #: teleforma/templates/quiz/progress.html:6
+ msgid "Progress Page"
+ msgstr ""
+ #: teleforma/templates/quiz/progress.html:7
+ #, fuzzy
+ #| msgid "User Profile"
+ msgid "User Progress Page"
+ msgstr "Profil utilisateur"
+ #: teleforma/templates/quiz/progress.html:13
+ msgid "Question Category Scores"
+ msgstr ""
+ #: teleforma/templates/quiz/progress.html:19
+ #: teleforma/templates/quiz/quiz_detail.html:9
+ #: teleforma/templates/quiz/quiz_list.html:13
+ #: teleforma/templates/quiz/sitting_detail.html:10
+ msgid "Category"
+ msgstr "Catégorie"
+ #: teleforma/templates/quiz/progress.html:20
+ msgid "Correctly answererd"
+ msgstr ""
+ #: teleforma/templates/quiz/progress.html:21
+ msgid "Incorrect"
+ msgstr "Incorrect"
+ #: teleforma/templates/quiz/progress.html:50
+ msgid "Previous exam papers"
+ msgstr ""
+ #: teleforma/templates/quiz/progress.html:52
+ msgid "Below are the results of exams that you have sat."
+ msgstr ""
+ #: teleforma/templates/quiz/progress.html:59
+ #, fuzzy
+ #| msgid "Title"
+ msgid "Quiz Title"
+ msgstr "Titre"
+ #: teleforma/templates/quiz/progress.html:61
+ msgid "Possible Score"
+ msgstr ""
+ #: teleforma/templates/quiz/question.html:13
+ #: teleforma/templates/quiz/result.html:13
+ msgid "The previous question"
+ msgstr ""
+ #: teleforma/templates/quiz/question.html:32
+ #: teleforma/templates/quiz/result.html:21
+ #: teleforma/templates/quiz/result.html:80
+ #, fuzzy
+ #| msgid "Enumeration"
+ msgid "Explanation"
+ msgstr "Enumération"
+ #: teleforma/templates/quiz/question.html:52
+ #, fuzzy
+ #| msgid "Question"
+ msgid "Question category"
+ msgstr "Questions"
++<<<<<<< HEAD
++#: templates/teleforma/course_conference_record.html:61
++#: templates/teleforma/courses.html:107
++msgid "Status"
++msgstr "Status"
++
++#: templates/teleforma/course_conference_record.html:72
++#: templates/teleforma/courses.html:42
++msgid "New conference"
++msgstr "Nouvelle conférence"
++
++#: templates/teleforma/course_conference_record.html:101
++msgid "Record and stream"
++msgstr "Enregistrer et diffuser"
++
++#: templates/teleforma/course_media.html:28
++#: templates/teleforma/course_media.html:82
++#: templates/teleforma/inc/media_list.html:50
++msgid " published"
++msgstr " publié"
++
++#: templates/teleforma/course_media.html:35
++#: templates/teleforma/course_media.html:82
++#: templates/teleforma/inc/media_list.html:52
++msgid " rejected"
++msgstr " rejeté"
++
++#: templates/teleforma/course_media.html:146
++msgid "Mime type"
++msgstr "Type mime"
++
++#: templates/teleforma/course_media.html:148
++msgid "Date modified"
++msgstr "Date de modification"
++
++#: templates/teleforma/course_media.html:149
++msgid "Media ID"
++msgstr "ID Média"
++
++#: templates/teleforma/courses.html:49
++msgid "My notes"
++msgstr "Mes notes"
++
++#: templates/teleforma/courses.html:59
++msgid "New note"
++msgstr "Nouvelle note"
++
++#: templates/teleforma/help.html:11 templates/telemeta/base.html:124
++#: templates/telemeta/base.html.py:137
++msgid "Help"
++msgstr "Aide"
++
++#: templates/teleforma/inc/conference_list.html:8
++msgid "Live conferences"
++msgstr "Conférences en direct"
++
++#: templates/teleforma/inc/conference_list.html:19
++#: templates/teleforma/inc/media_list.html:23
++#: templates/teleforma/inc/media_list.html:29
++msgid "Click here"
++msgstr "Cliquez ici"
++
++#: templates/teleforma/inc/media_list.html:8
++msgid "Passed conferences"
++msgstr "Conférences en différé"
++
++#: templates/teleforma/inc/media_list.html:17
++msgid "Play"
++msgstr "Lire"
++
++#: templates/telemeta/base.html:87 templates/telemeta/base.html.py:95
++msgid "Desk"
++msgstr "Bureau"
++
++#: templates/telemeta/base.html:104
++msgid "Messaging"
++msgstr "Messagerie"
++
++#: templates/telemeta/base.html:107 templates/telemeta/users.html:6
++#: templates/telemeta/users.html.py:69
++msgid "Users"
++msgstr ""
++
++#: templates/telemeta/base.html:116 templates/telemeta/search_criteria.html:69
++msgid "Search"
++msgstr ""
++
++#: templates/telemeta/base.html:117
++msgid "Collections"
++msgstr ""
++
++#: templates/telemeta/base.html:118
++msgid "Items"
++msgstr ""
++
++#: templates/telemeta/base.html:122
++msgid "Admin"
++msgstr ""
++
++#: templates/telemeta/base.html:134
++msgid "Profile"
++msgstr "Profil"
++
++#: templates/telemeta/base.html:136
++msgid "Lists"
++msgstr ""
++
++#: templates/telemeta/base.html:139
++msgid "Sign out"
++msgstr ""
++
++#: templates/telemeta/base.html:181
++msgid "Powered by"
++msgstr ""
++
++#: templates/telemeta/base.html:191
++msgid "Legal notices"
++=======
+ #: teleforma/templates/quiz/question.html:74
+ msgid "Check"
+ msgstr ""
+ #: teleforma/templates/quiz/quiz_detail.html:11
+ msgid "You will only get one attempt at this quiz"
+ msgstr ""
+ #: teleforma/templates/quiz/quiz_detail.html:16
+ msgid "Start quiz"
+ msgstr "Démarrer le quiz"
+ #: teleforma/templates/quiz/quiz_list.html:6
+ msgid "List of quizzes"
+ msgstr ""
+ #: teleforma/templates/quiz/quiz_list.html:14
+ msgid "Exam"
+ msgstr ""
+ #: teleforma/templates/quiz/quiz_list.html:15
+ msgid "Single attempt"
+ msgstr ""
+ #: teleforma/templates/quiz/quiz_list.html:31
+ #: teleforma/templates/quiz/sitting_list.html:42
+ #, fuzzy
+ #| msgid "location details"
+ msgid "View details"
+ msgstr "précisions lieu"
+ #: teleforma/templates/quiz/quiz_list.html:41
+ msgid "There are no available quizzes"
+ msgstr ""
+ #: teleforma/templates/quiz/result.html:7
+ #, fuzzy
+ #| msgid "Search Results"
+ msgid "Exam Results for"
+ msgstr "Résultats de recherche"
+ #: teleforma/templates/quiz/result.html:32
+ #, fuzzy
+ #| msgid "Search Results"
+ msgid "Exam results"
+ msgstr "Résultats de recherche"
+ #: teleforma/templates/quiz/result.html:34
+ #, fuzzy
+ #| msgid "title"
+ msgid "Exam title"
+ msgstr "titre"
+ #: teleforma/templates/quiz/result.html:38
+ #, fuzzy
+ #| msgid "Your answer was"
+ msgid "You answered"
+ msgstr "Votre réponse est"
+ #: teleforma/templates/quiz/result.html:38
+ msgid "questions correctly out of"
+ msgstr ""
+ #: teleforma/templates/quiz/result.html:38
+ msgid "giving you"
+ msgstr ""
+ #: teleforma/templates/quiz/result.html:38
+ msgid "percent correct"
++>>>>>>> feature/dj4.2
+ msgstr ""
+ #: teleforma/templates/quiz/result.html:59
+ msgid "Your session score is"
+ msgstr ""
+ #: teleforma/templates/quiz/result.html:59
+ msgid "out of a possible"
+ msgstr ""
+ #: teleforma/templates/quiz/result.html:77
+ #, fuzzy
+ #| msgid "Your answer was"
+ msgid "Your answer"
+ msgstr "Votre réponse est"
+ #: teleforma/templates/quiz/single_complete.html:13
+ msgid "You have already sat this exam and only one sitting is permitted"
+ msgstr ""
+ #: teleforma/templates/quiz/single_complete.html:15
+ msgid "This exam is only accessible to signed in users"
+ msgstr ""
+ #: teleforma/templates/quiz/sitting_detail.html:5
+ msgid "Result of"
+ msgstr ""
+ #: teleforma/templates/quiz/sitting_detail.html:5
+ #, fuzzy
+ #| msgid "format"
+ msgid "for"
+ msgstr "format"
+ #: teleforma/templates/quiz/sitting_detail.html:9
+ #, fuzzy
+ #| msgid "title"
+ msgid "Quiz title"
+ msgstr "titre"
+ #: teleforma/templates/quiz/sitting_detail.html:13
+ #: teleforma/templates/quiz/sitting_list.html:13
+ #: teleforma/templates/telemeta/inc/module_revisions.html:19
+ msgid "User"
+ msgstr ""
+ #: teleforma/templates/quiz/sitting_detail.html:14
+ #: teleforma/templates/quiz/sitting_list.html:15
+ #, fuzzy
+ #| msgid "incomplete"
+ msgid "Completed"
+ msgstr "incomplet"
+ #: teleforma/templates/quiz/sitting_detail.html:22
+ #, fuzzy
+ #| msgid "answer"
+ msgid "User answer"
+ msgstr "réponse"
+ #: teleforma/templates/quiz/sitting_detail.html:41
+ #, fuzzy
+ #| msgid "corrector"
+ msgid "incorrect"
+ msgstr "correcteur"
+ #: teleforma/templates/quiz/sitting_detail.html:43
+ #, fuzzy
+ #| msgid "Corrector"
+ msgid "Correct"
+ msgstr "Correcteur"
+ #: teleforma/templates/quiz/sitting_detail.html:49
+ msgid "Toggle whether correct"
+ msgstr ""
+ #: teleforma/templates/quiz/sitting_list.html:6
+ msgid "List of complete exams"
+ msgstr ""
+ #: teleforma/templates/quiz/sitting_list.html:14
+ msgid "Quiz"
+ msgstr ""
+ #: teleforma/templates/quiz/sitting_list.html:28
+ msgid "Filter"
+ msgstr ""
+ #: teleforma/templates/quiz/sitting_list.html:52
+ msgid "There are no matching quizzes"
+ msgstr ""
+ #: teleforma/templates/quiz/view_quiz_category.html:3
+ #, fuzzy
+ #| msgid "item related media"
+ msgid "Quizzes related to"
+ msgstr "média associés à l'item"
+ #: teleforma/templates/quiz/view_quiz_category.html:6
+ msgid "Quizzes in the"
+ msgstr ""
+ #: teleforma/templates/quiz/view_quiz_category.html:6
+ msgid "category"
+ msgstr "catégorie"
+ #: teleforma/templates/quiz/view_quiz_category.html:20
+ msgid "There are no quizzes"
+ msgstr ""
+ #: teleforma/templates/registration/activate.html:3
+ #: teleforma/templates/registration/activation_complete.html:3
+ msgid "Activation complete"
+ msgstr "Activation effectuée"
+ #: teleforma/templates/registration/activate.html:3
+ msgid "Activation problem"
+ msgstr "Problème d'activation"
+ #: teleforma/templates/registration/activate.html:7
+ #, python-format
+ msgid ""
+ "\n"
+ "Thanks %(account)s, activation complete!\n"
+ "You may now <a href='%(auth_login_url)s'>login</a> using the username and "
+ "password you set at registration.\n"
+ msgstr ""
+ #: teleforma/templates/registration/activate.html:12
+ msgid ""
+ "Oops &ndash; it seems that your activation key is invalid.  Please check the "
+ "url again."
+ msgstr ""
+ #: teleforma/templates/registration/activation_complete.html:6
+ #, python-format
+ msgid ""
+ "\n"
+ "Thanks, activation complete!  You may now <a "
+ "href='%(auth_login_url)s'>login</a> using the username and password you set "
+ "at registration.\n"
+ msgstr ""
+ #: teleforma/templates/registration/activation_email.html:8
+ #, python-format
+ msgid ""
+ "<body>\n"
+ "<h3>Account registration for %(sitename)s</h3>\n"
+ "<p>\n"
+ "You (or someone pretending to be you) have asked to register an account at\n"
+ "<b>%(sitename)s</b>.<br/>\n"
+ "If this wasn't you, please ignore this email and your address will be "
+ "removed\n"
+ "from our records.\n"
+ "</p>\n"
+ "<p>\n"
+ "To activate this account, please click the following link within the next\n"
+ "<b>%(expiration_days)s</b> days:<br/>\n"
+ "<a href=\"https://%(sitedomain)s%(activation_key_url)s\">https://"
+ "%(sitedomain)s%(activation_key_url)s</a>\n"
+ "</p>\n"
+ "<p>\n"
+ "Sincerely,<br/>\n"
+ "%(sitename)s Management\n"
+ "</p>\n"
+ "</body>\n"
+ msgstr ""
+ #: teleforma/templates/registration/activation_email.txt:3
+ #, python-format
+ msgid ""
+ "\n"
+ "You (or someone pretending to be you) have asked to register an account at\n"
+ "%(sitename)s.  If this wasn't you, please ignore this email\n"
+ "and your address will be removed from our records.\n"
+ "\n"
+ "To activate this account, please click the following link within the next\n"
+ "%(expiration_days)s days:\n"
+ "\n"
+ "http://%(siteurl)s%(activation_key_url)s\n"
+ "\n"
+ "Sincerely,\n"
+ "%(sitename)s Management\n"
+ msgstr ""
+ #: teleforma/templates/registration/activation_email_subject.txt:1
+ #, python-format
+ msgid "Account registration for %(sitename)s"
+ msgstr ""
+ #: teleforma/templates/registration/logged_out.html:6
+ msgid "Thanks for spending some quality time with the Web site today."
+ msgstr ""
+ #: teleforma/templates/registration/logged_out.html:8
+ msgid "Log in again"
+ msgstr "Se reconnecter"
+ #: teleforma/templates/registration/logout.html:3
+ msgid "Logged out"
+ msgstr ""
+ #: teleforma/templates/registration/logout.html:5
+ msgid "Successfully logged out!"
+ msgstr ""
+ #: teleforma/templates/registration/password_change_done.html:3
+ msgid "Documentation"
+ msgstr "Documentation associée"
+ #: teleforma/templates/registration/password_change_done.html:3
+ #: teleforma/templates/teleforma/profile_detail.html:49
+ msgid "Change password"
+ msgstr ""
+ #: teleforma/templates/registration/password_change_done.html:3
+ msgid "Log out"
+ msgstr "Déconnexion"
+ #: teleforma/templates/registration/password_change_done.html:5
+ msgid "Password change successful"
+ msgstr "Mot de passe modifié avec succès"
+ #: teleforma/templates/registration/password_change_done.html:9
+ msgid "Your password was changed."
+ msgstr "Votre mot de passe a été modifié."
+ #: teleforma/templates/registration/password_change_form.html:3
+ msgid "Password change"
+ msgstr "Modification de mot de passe"
+ #: teleforma/templates/registration/password_change_form.html:11
+ msgid "Please correct the error below."
+ msgid_plural "Please correct the errors below."
+ msgstr[0] "Veuillez corriger l'erreur ci-dessous."
+ msgstr[1] "Veuillez corriger les erreurs ci-dessous."
+ #: teleforma/templates/registration/password_change_form.html:15
+ msgid ""
+ "Please enter your old password, for security's sake, and then enter your new "
+ "password twice so we can verify you typed it in correctly."
+ msgstr ""
+ "Veuillez saisir votre ancien mot de passe pour des raisons de sécurité."
+ #: teleforma/templates/registration/password_change_form.html:21
+ msgid "Old password"
+ msgstr "Ancien mot de passe"
+ #: teleforma/templates/registration/password_change_form.html:26
+ msgid "New password"
+ msgstr "Nouveau mot de passe"
+ #: teleforma/templates/registration/password_change_form.html:31
+ msgid "Password (again)"
+ msgstr "Mot de passe (encore)"
+ #: teleforma/templates/registration/password_change_form.html:39
+ #: teleforma/templates/registration/password_reset_confirm.html:20
+ msgid "Change my password"
+ msgstr "Changer mon mot de passe"
+ #: teleforma/templates/registration/password_reset_complete.html:4
+ #, fuzzy
+ msgid "Password reset complete"
+ msgstr "Réinitialisation du mot de passe effectuée"
+ #: teleforma/templates/registration/password_reset_complete.html:7
+ msgid "Your password has been set.  You may go ahead and log in now."
+ msgstr ""
+ "Votre mot de passe a été rédéfini. Vous pouvez désormais vous connecter."
+ #: teleforma/templates/registration/password_reset_complete.html:10
+ msgid "Log in"
+ msgstr "Se connecter"
+ #: teleforma/templates/registration/password_reset_confirm.html:4
+ #: teleforma/templates/registration/password_reset_form.html:4
+ msgid "Password reset"
+ msgstr "Réinitialisation du mot de passe"
+ #: teleforma/templates/registration/password_reset_confirm.html:8
+ msgid ""
+ "Please enter your new password twice so we can verify you typed it in "
+ "correctly."
+ msgstr "Veuillez saisir votre nouveau mot de passe une seconde fois."
+ #: teleforma/templates/registration/password_reset_confirm.html:14
+ msgid "New password:"
+ msgstr "Nouveau mot de passe"
+ #: teleforma/templates/registration/password_reset_confirm.html:16
+ msgid "Confirm password:"
+ msgstr "Confirmez votre mot de passe:"
+ #: teleforma/templates/registration/password_reset_confirm.html:24
+ msgid "Password reset unsuccessful"
+ msgstr "Echec de la réinitialisation de mot de passe"
+ #: teleforma/templates/registration/password_reset_confirm.html:25
+ msgid ""
+ "The password reset link was invalid, possibly because it has already been "
+ "used.  Please request a new password reset."
+ msgstr ""
+ "Le lien de réinitialisation de mot de passe est invalide. Probablement parce "
+ "qu'il a déja été utilisé. Veuillez faire une nouvelle demande de changement "
+ "de mot de passe."
+ #: teleforma/templates/registration/password_reset_done.html:4
+ msgid "Password reset successful"
+ msgstr "Demande de réinitialisation de mot de passe envoyée"
+ #: teleforma/templates/registration/password_reset_done.html:7
+ msgid ""
+ "We've e-mailed you instructions for setting your password to the e-mail "
+ "address you submitted. You should be receiving it shortly."
+ msgstr ""
+ "Nous vous avons envoyé des instructions sur l'adresse mail que vous nous "
+ "avez indiqué pour définir un nouveau mot de passe. Vous devriez le recevoir "
+ "dans les prochaines minutes."
+ #: teleforma/templates/registration/password_reset_email.html:3
+ msgid "You're receiving this e-mail because you requested a password reset"
+ msgstr ""
+ "Vous recevez cet e-mail car vous avez fait une demande de réinitialisation "
+ "du mot de passe"
+ #: teleforma/templates/registration/password_reset_email.html:7
+ msgid "Please go to the following page and choose a new password:"
+ msgstr "Veuillez suivre ce lien et choisir un nouveau mot de passe:"
+ #: teleforma/templates/registration/password_reset_form.html:12
+ msgid "Reset my password"
+ msgstr "Réinitialiser mon mot de passe"
+ #: teleforma/templates/registration/registration_complete.html:5
+ #: teleforma/templates/registration/registration_corrector_complete.html:5
+ #: teleforma/templates/registration/registration_corrector_pdf.html:13
+ #: teleforma/templates/registration/registration_pdf.html:13
+ #: teleforma/views/crfpa.py:831 teleforma/views/crfpa.py:1005
+ #: teleforma/views/crfpa.py:1019
+ msgid "Registration"
+ msgstr "Inscription"
+ #: teleforma/templates/registration/registration_complete.html:18
+ #: teleforma/templates/teleforma/annals.html:72
+ #: teleforma/templates/teleforma/course_media_transcoded.html:25
+ #: teleforma/templates/teleforma/inc/document_list.html:22
+ #: teleforma/templates/teleforma/inc/media_list.html:67
+ #: teleforma/templates/teleforma/inc/media_list_pending.html:53
+ msgid "Download"
+ msgstr "Télécharger"
+ #: teleforma/templates/registration/registration_corrector_pdf.html:35
+ #: teleforma/templates/registration/registration_pdf.html:40
+ msgid "First name"
+ msgstr "Prénom"
+ #: teleforma/templates/registration/registration_corrector_pdf.html:39
+ #: teleforma/templates/registration/registration_pdf.html:44
+ msgid "Last name"
+ msgstr "Nom"
+ #: teleforma/templates/registration/registration_corrector_pdf.html:51
+ #: teleforma/templates/registration/registration_pdf.html:56
+ msgid "E-mail"
+ msgstr ""
+ #: teleforma/templates/registration/registration_corrector_pdf.html:55
+ #: teleforma/templates/registration/registration_pdf.html:60
+ #: teleforma/templates/teleforma/profile_detail.html:65
+ msgid "Username"
+ msgstr "Nom d'utilisateur"
+ #: teleforma/templates/registration/registration_corrector_pdf.html:84
+ #: teleforma/templates/registration/registration_pdf.html:105
+ msgid "Registration date"
+ msgstr "Date de pré-inscription"
+ #: teleforma/templates/registration/registration_form.html:32
+ msgid "Pre-registration"
+ msgstr "Pré-inscription"
+ #: teleforma/templates/registration/registration_pdf.html:35
+ msgid "Training registration"
+ msgstr "Fiche d'inscription"
+ #: teleforma/templates/registration/registration_pdf.html:35
+ #: teleforma/templates/registration/registration_pdf.html:77
+ msgid "Training"
+ msgstr "Formation"
+ #: teleforma/templates/registration/registration_pdf.html:81
+ msgid "Training type"
+ msgstr "Type de formation"
+ #: teleforma/templates/registration/registration_pdf.html:85
+ msgid "Envoi postal des fascicules de cours"
+ msgstr ""
+ #: teleforma/templates/registration/registration_pdf.html:89
+ msgid "Matière de procédure"
+ msgstr ""
+ #: teleforma/templates/registration/registration_pdf.html:93
+ msgid "Matière juridique de spécialité"
+ msgstr ""
+ #: teleforma/templates/registration/registration_pdf.html:98
+ msgid "Matière d'oral de langue"
+ msgstr ""
+ #: teleforma/templates/registration/registration_pdf.html:109
+ msgid "PROMO code"
+ msgstr ""
+ #: teleforma/templates/teleforma/annals.html:5
+ #: teleforma/templates/teleforma/annals.html:52
+ #: teleforma/templates/teleforma/base.html:104
+ #: teleforma/templates/telemeta/base.html:116
+ msgid "Annals"
+ msgstr "Annales"
+ #: teleforma/templates/teleforma/annals.html:48
+ #: teleforma/templates/teleforma/inc/document_list.html:34
+ msgid "No document"
+ msgstr "Aucun document"
+ #: teleforma/templates/teleforma/annals.html:68
+ #: teleforma/templates/teleforma/inc/conference_list.html:19
+ #: teleforma/templates/teleforma/inc/document_list.html:20
+ #: teleforma/webclass/templates/webclass/webclass_record.html:5
+ msgid "View"
+ msgstr "Voir"
+ #: teleforma/templates/teleforma/base.html:81
+ #: teleforma/templates/teleforma/base.html:90
+ #: teleforma/templates/telemeta/base.html:95
+ #: teleforma/templates/telemeta/base.html:104
+ msgid "Desk"
+ msgstr "Bureau"
+ #: teleforma/templates/teleforma/base.html:95
+ #: teleforma/templates/telemeta/base.html:109
+ msgid "Home"
+ msgstr "Accueil"
+ #: teleforma/templates/teleforma/base.html:100
+ #: teleforma/templates/telemeta/base.html:114
+ msgid "Messaging"
+ msgstr "Messagerie"
+ #: teleforma/templates/teleforma/base.html:157
+ #: teleforma/templates/telemeta/base.html:153
+ msgid "Admin"
+ msgstr ""
+ #: teleforma/templates/teleforma/base.html:168
+ #: teleforma/templates/teleforma/base.html:177
+ #: teleforma/templates/telemeta/base.html:162
+ #: teleforma/templates/telemeta/base.html:171
+ msgid "Profile"
+ msgstr "Profil"
+ #: teleforma/templates/teleforma/base.html:173
+ #: teleforma/templates/teleforma/base.html:179
+ #: teleforma/templates/telemeta/base.html:167
+ #: teleforma/templates/telemeta/base.html:172
+ msgid "Sign out"
+ msgstr "Se déconnecter"
+ #: teleforma/templates/teleforma/base.html:237
+ #: teleforma/templates/telemeta/base.html:222
+ msgid "Powered by"
+ msgstr ""
+ #: teleforma/templates/teleforma/base.html:248
+ #: teleforma/templates/telemeta/base.html:232
+ msgid "Legal notices"
+ msgstr "Mentions légales"
+ #: teleforma/templates/teleforma/course.html:16
+ #: teleforma/templates/teleforma/inc/document_list.html:9
+ msgid "Documents"
+ msgstr "Supports écrits"
+ #: teleforma/templates/teleforma/course.html:20
+ #: teleforma/templates/teleforma/course.html:37
+ msgid "Description"
+ msgstr "Description"
+ #: teleforma/templates/teleforma/course.html:21
+ #: teleforma/templates/teleforma/course.html:38
+ #: teleforma/templates/teleforma/course.html:55
+ #: teleforma/templates/teleforma/course_media.html:188
+ #: teleforma/templates/teleforma/course_media_transcoded.html:105
+ #: teleforma/templates/teleforma/profile_detail.html:89
+ msgid "Date added"
+ msgstr "Date d'ajout"
+ #: teleforma/templates/teleforma/course.html:33
+ msgid "Medias"
+ msgstr "Médias"
+ #: teleforma/templates/teleforma/course.html:50
+ msgid "Conferences"
+ msgstr "Conférences"
+ #: teleforma/templates/teleforma/course.html:54
+ #: teleforma/templates/teleforma/course_conference.html:110
+ #: teleforma/templates/teleforma/course_conference_audio.html:66
+ #: teleforma/templates/teleforma/course_media.html:161
+ #: teleforma/templates/teleforma/course_media_transcoded.html:96
+ #: teleforma/templates/teleforma/course_media_video_embed.html:35
+ #: teleforma/templates/teleforma/inc/conference_list.html:29
+ #: teleforma/templates/teleforma/inc/media_list.html:39
+ #: teleforma/templates/teleforma/inc/media_list_pending.html:36
+ #: teleforma/templates/teleforma/inc/user_list.html:48
+ #: teleforma/webclass/templates/webclass/webclass_record.html:14
+ msgid "Professor"
+ msgstr "Professeur"
+ #: teleforma/templates/teleforma/course_conference.html:50
+ #: teleforma/templates/teleforma/course_conference_audio.html:24
+ msgid "S T O P"
+ msgstr "S T O P"
+ #: teleforma/templates/teleforma/course_conference.html:60
+ #: teleforma/templates/teleforma/course_media.html:71
+ #: teleforma/templates/teleforma/course_media_transcoded.html:37
+ msgid "Audio"
+ msgstr ""
+ #: teleforma/templates/teleforma/course_conference.html:113
+ #: teleforma/templates/teleforma/course_media.html:165
+ #: teleforma/templates/teleforma/course_media_transcoded.html:99
+ #: teleforma/templates/teleforma/course_media_video_embed.html:37
+ #: teleforma/templates/teleforma/inc/media_list.html:50
+ #: teleforma/templates/teleforma/inc/media_list_pending.html:40
+ msgid "Comment"
+ msgstr "Commentaire"
+ #: teleforma/templates/teleforma/course_conference.html:114
+ #: teleforma/templates/teleforma/course_media.html:175
+ #: teleforma/templates/teleforma/course_media.html:186
+ #: teleforma/templates/teleforma/course_media_transcoded.html:100
+ #: teleforma/templates/teleforma/course_media_video_embed.html:38
+ #: teleforma/templates/teleforma/inc/media_list.html:42
+ msgid "Begin date"
+ msgstr "Date de début"
+ #: teleforma/templates/teleforma/course_conference.html:115
+ #: teleforma/templates/teleforma/course_media.html:187
+ #: teleforma/templates/teleforma/course_media_transcoded.html:101
+ #: teleforma/templates/teleforma/course_media_video_embed.html:39
+ msgid "End date"
+ msgstr "Date de fin"
+ #: teleforma/templates/teleforma/course_conference.html:116
+ #: teleforma/templates/teleforma/course_conference_audio.html:71
+ msgid "Live"
+ msgstr "Direct"
+ #: teleforma/templates/teleforma/course_conference.html:116
+ #: teleforma/templatetags/teleforma_tags.py:149
+ msgid "Yes"
+ msgstr "Oui"
+ #: teleforma/templates/teleforma/course_conference.html:117
+ #: teleforma/templates/teleforma/course_conference_audio.html:68
+ #: teleforma/templates/teleforma/course_media.html:169
+ #: teleforma/templates/teleforma/course_media_transcoded.html:102
+ #: teleforma/templates/teleforma/course_media_video_embed.html:40
+ msgid "Room"
+ msgstr "Salle"
+ #: teleforma/templates/teleforma/course_conference.html:119
+ #: teleforma/templates/teleforma/course_media.html:192
+ #: teleforma/templates/teleforma/course_media_transcoded.html:108
+ msgid "Conference ID"
+ msgstr "ID Conférence"
+ #: teleforma/templates/teleforma/course_conference_audio.html:35
+ #: teleforma/templates/teleforma/course_media.html:74
+ #: teleforma/templates/teleforma/course_media_transcoded.html:40
+ msgid "Video"
+ msgstr ""
+ #: teleforma/templates/teleforma/course_conference_audio.html:69
+ #: teleforma/templates/teleforma/inc/conference_list.html:31
+ #: teleforma/templates/teleforma/inc/media_list_pending.html:38
+ #: teleforma/webclass/templates/webclass/webclass_record.html:17
+ msgid "Begin"
+ msgstr "Début"
+ #: teleforma/templates/teleforma/course_conference_audio.html:70
+ msgid "End"
+ msgstr "Fin"
+ #: teleforma/templates/teleforma/course_conference_record.html:23
+ #: teleforma/templates/teleforma/courses.html:198
+ msgid "Status"
+ msgstr "Status"
+ #: teleforma/templates/teleforma/course_conference_record.html:34
+ #: teleforma/templates/teleforma/courses.html:35
+ msgid "New conference"
+ msgstr "Nouvelle conférence"
+ #: teleforma/templates/teleforma/course_conference_record.html:63
+ msgid "Record and stream"
+ msgstr "Enregistrer et diffuser"
+ #: teleforma/templates/teleforma/course_media.html:21
+ #: teleforma/templates/teleforma/course_media.html:77
+ #: teleforma/templates/teleforma/inc/media_list.html:59
+ #: teleforma/templates/teleforma/inc/media_list_pending.html:47
+ msgid " published"
+ msgstr " publié"
+ #: teleforma/templates/teleforma/course_media.html:28
+ #: teleforma/templates/teleforma/course_media.html:77
+ #: teleforma/templates/teleforma/inc/media_list.html:61
+ #: teleforma/templates/teleforma/inc/media_list_pending.html:49
+ msgid " rejected"
+ msgstr " rejeté"
+ #: teleforma/templates/teleforma/course_media.html:177
+ #: teleforma/templates/teleforma/course_media.html:190
+ #: teleforma/templates/teleforma/inc/media_list.html:44
+ msgid "Publishing date"
+ msgstr "Date de publication"
+ #: teleforma/templates/teleforma/course_media.html:185
+ #: teleforma/templates/teleforma/course_media_transcoded.html:104
+ msgid "Mime type"
+ msgstr "Type mime"
+ #: teleforma/templates/teleforma/course_media.html:189
+ #: teleforma/templates/teleforma/course_media_transcoded.html:106
+ msgid "Date modified"
+ msgstr "Date de modification"
+ #: teleforma/templates/teleforma/course_media.html:191
+ #: teleforma/templates/teleforma/course_media_transcoded.html:107
+ msgid "Media ID"
+ msgstr "ID Média"
+ #: teleforma/templates/teleforma/course_media.html:193
+ #: teleforma/templates/teleforma/course_media_transcoded.html:109
+ msgid "Web class group"
+ msgstr ""
+ #: teleforma/templates/teleforma/courses.html:91
+ #: teleforma/templates/teleforma/inc/media_list.html:18
+ #: teleforma/templates/teleforma/inc/media_list_pending.html:17
+ msgid "Play"
+ msgstr "Lire"
+ #: teleforma/templates/teleforma/courses.html:95
+ #: teleforma/templates/teleforma/courses.html:99
+ #: teleforma/templates/teleforma/inc/conference_list.html:20
+ #: teleforma/templates/teleforma/inc/media_list.html:22
+ #: teleforma/templates/teleforma/inc/media_list.html:26
+ #: teleforma/templates/teleforma/inc/media_list_pending.html:21
+ #: teleforma/templates/teleforma/inc/media_list_pending.html:25
+ #: teleforma/templates/teleforma/inc/media_list_pending.html:27
+ #: teleforma/webclass/templates/webclass/webclass_record.html:6
+ msgid "Click here"
+ msgstr "Cliquez ici"
+ #: teleforma/templates/teleforma/home.html:25
+ #: teleforma/templates/telemeta/home.html:26
+ msgid "Connexion"
+ msgstr ""
+ #: teleforma/templates/teleforma/inc/conference_list.html:9
+ msgid "Live conferences"
+ msgstr "Conférences en direct"
+ #: teleforma/templates/teleforma/inc/media_list.html:10
+ msgid "Conférences en différé"
+ msgstr ""
+ #: teleforma/templates/teleforma/inc/media_list_pending.html:8
+ msgid "Passed conferences"
+ msgstr "Conférences en différé"
+ #: teleforma/templates/teleforma/inc/module_searches.html:11
+ msgid "Criteria"
+ msgstr ""
+ #: teleforma/templates/teleforma/inc/user_list.html:22
+ #: teleforma/templates/teleforma/profile_detail.html:69
+ #: teleforma/templates/teleforma/users.html:14
+ msgid "Trainings"
+ msgstr "Formations"
+ #: teleforma/templates/teleforma/inc/user_list.html:24
+ #: teleforma/templates/teleforma/profile_detail.html:72
+ msgid "Written spe"
+ msgstr "Ecrit Spé"
+ #: teleforma/templates/teleforma/inc/user_list.html:25
+ msgid "Oral spe"
+ msgstr "Oral Spé"
+ #: teleforma/templates/teleforma/inc/user_list.html:26
+ msgid "Oral 1"
+ msgstr ""
+ #: teleforma/templates/teleforma/inc/user_list.html:27
+ msgid "Oral 2"
+ msgstr ""
+ #: teleforma/templates/teleforma/inc/user_list.html:56
+ msgid "Administrator"
+ msgstr ""
+ #: teleforma/templates/teleforma/inc/user_list.html:64
+ msgid "Unknown"
+ msgstr ""
+ #: teleforma/templates/teleforma/lists.html:47
+ msgid "My playlists"
+ msgstr ""
+ #: teleforma/templates/teleforma/lists.html:49
+ msgid "Add"
+ msgstr ""
+ #: teleforma/templates/teleforma/lists.html:55
+ msgid "Edit"
+ msgstr ""
+ #: teleforma/templates/teleforma/lists.html:71
+ msgid "Code"
+ msgstr ""
+ #: teleforma/templates/teleforma/lists.html:72
+ msgid "Recordist"
+ msgstr "Opérateur d'enregistrement"
+ #: teleforma/templates/teleforma/lists.html:73
+ msgid "Recording period"
+ msgstr "période d'enregistrement"
+ #: teleforma/templates/teleforma/lists.html:74
+ #: teleforma/templates/teleforma/search_criteria.html:148
+ msgid "Sound"
+ msgstr "Sonore"
+ #: teleforma/templates/teleforma/lists.html:92
+ #: teleforma/templates/telemeta/inc/module_revisions.html:40
+ msgid "deleted"
+ msgstr ""
+ #: teleforma/templates/teleforma/login.html:19
+ msgid "Your username and password didn't match. Please try again."
+ msgstr "Votre login et mot de passe ne correspondent pas. Veuillez réessayer."
+ #: teleforma/templates/teleforma/login.html:29
+ msgid "Password forgotten"
+ msgstr "Mot de passe oublié ?"
+ #: teleforma/templates/teleforma/login.html:30
+ msgid "Sign in"
+ msgstr "Connexion"
+ #: teleforma/templates/teleforma/profile_detail.html:6
+ msgid "User Profile"
+ msgstr "Profil utilisateur"
+ #: teleforma/templates/teleforma/profile_detail.html:16
+ msgid "His courses"
+ msgstr "Ses matières"
+ #: teleforma/templates/teleforma/profile_detail.html:44
+ #: teleforma/views/profile.py:75
+ msgid "User profile"
+ msgstr "Profil utilisateur"
+ #: teleforma/templates/teleforma/profile_detail.html:51
+ msgid "Login as"
+ msgstr "Se connecter en tant que"
+ #: teleforma/templates/teleforma/profile_detail.html:70
+ msgid "Platform only"
+ msgstr "Plateforme seulement"
+ #: teleforma/templates/teleforma/profile_detail.html:74
+ msgid "Options"
+ msgstr "Options"
+ #: teleforma/templates/teleforma/profile_detail.html:78
+ msgid "Email"
+ msgstr ""
+ #: teleforma/templates/teleforma/profile_detail.html:86
+ msgid "WiFi password"
+ msgstr "Mot de passe WiFi"
+ #: teleforma/templates/teleforma/profile_detail.html:91
+ msgid "Expiration date"
+ msgstr "Date d'expiration"
+ #: teleforma/templates/teleforma/profile_detail.html:93
+ msgid "Last login"
+ msgstr "Dernière connexion"
+ #: teleforma/templates/teleforma/profile_detail.html:104
+ msgid "Apply"
+ msgstr "Appliquer"
+ #: teleforma/templates/teleforma/search_criteria.html:4
+ #: teleforma/templates/teleforma/search_criteria.html:75
+ msgid "Advanced Search"
+ msgstr ""
+ #: teleforma/templates/teleforma/search_criteria.html:68
+ msgid "Search"
+ msgstr "Recherche"
+ #: teleforma/templates/teleforma/search_criteria.html:112
+ msgid "Year of recording"
+ msgstr ""
+ #: teleforma/templates/teleforma/search_criteria.html:119
+ #: teleforma/templates/teleforma/search_criteria.html:138
+ msgid "to"
+ msgstr "à"
+ #: teleforma/templates/teleforma/search_criteria.html:131
+ #, fuzzy
+ msgid "Year of publication"
+ msgstr "obligation"
+ #: teleforma/templates/teleforma/users.html:5
+ #: teleforma/templates/teleforma/users.html:68
+ msgid "Users"
+ msgstr ""
+ #: teleforma/templates/teleforma/users.html:40
+ msgid "Courses"
+ msgstr "Matières"
+ #: teleforma/templates/teleforma/users.html:73
+ msgid "No users"
+ msgstr "Pas d'utilisateurs"
+ #: teleforma/templates/telemeta/base.html:164
+ msgid "Lists"
+ msgstr ""
+ #: teleforma/templatetags/teleforma_tags.py:65
+ msgid "General tweeter"
+ msgstr "Tweeter général"
+ #: teleforma/templatetags/teleforma_tags.py:66
+ msgid "Local tweeter"
+ msgstr "Tweeter local"
+ #: teleforma/templatetags/teleforma_tags.py:143
+ msgid "me"
+ msgstr "moi"
+ #: teleforma/templatetags/teleforma_tags.py:151
+ msgid "No"
+ msgstr "Non"
++<<<<<<< HEAD
++#: views/core.py:147
++msgid "Access not allowed."
++msgstr "Accès non autorisé."
++
++#: views/core.py:148
++=======
+ #: teleforma/views/core.py:188
+ msgid "Access not allowed."
+ msgstr "Accès non autorisé."
+ #: teleforma/views/core.py:190 teleforma/views/profile.py:77
++>>>>>>> feature/dj4.2
+ msgid ""
+ "Please login or contact the website administator to get a private access."
+ msgstr ""
+ "Merci de vous connecter ou bien contactez l'administateur du site pour "
+ "obtenir un accès privé."
++<<<<<<< HEAD
++#: views/core.py:201
++=======
+ #: teleforma/views/core.py:369
++>>>>>>> feature/dj4.2
+ msgid ""
+ "You do NOT have access to this resource and then have been redirected to "
+ "your desk."
+ msgstr ""
+ "Vous n'avez pas accès à cette ressource et avez été redirigé vers votre "
+ "bureau."
+ #: teleforma/views/password.py:104
+ #, fuzzy
+ #| msgid "New password"
+ msgid "Enter new password"
+ msgstr "Nouveau mot de passe"
+ #: teleforma/views/profile.py:74
+ msgid "Access not allowed"
+ msgstr "Accès non autorisé"
+ #: teleforma/webclass/models.py:137
+ msgid "BBB server"
+ msgstr ""
+ #: teleforma/webclass/models.py:138
+ msgid "BBB servers"
+ msgstr ""
+ #: teleforma/webclass/models.py:180 teleforma/webclass/models.py:181
+ msgid "webclass"
+ msgstr ""
+ #: teleforma/webclass/models.py:218
+ msgid "participants"
+ msgstr ""
+ #: teleforma/webclass/models.py:230
+ msgid "webclass slot"
+ msgstr ""
+ #~ msgid ""
+ #~ "You can read and respond to this message from your e-learning desk "
+ #~ "following this link:"
+ #~ msgstr ""
+ #~ "Vous pouvez lire et répondre à ce message depuis votre bureau e-learning "
+ #~ "en suivant ce lien :"
+ #, python-format
+ #~ msgid "for your user account at %(site_name)s"
+ #~ msgstr "de votre compte utilisateur du site %(site_name)s"
+ #~ msgid "Your username, in case you've forgotten:"
+ #~ msgstr "Votre login, au cas où vous l'auriez oublié:"
+ #~ msgid ""
+ #~ "Forgotten your password? Enter your e-mail address below, and we'll e-"
+ #~ "mail instructions for setting a new one."
+ #~ msgstr ""
+ #~ "Vous avez oubliez votre mot de passe ? Veuillez saisir votre adresse e-"
+ #~ "mail et nous vous enverrons un email avec les instructions pour définir "
+ #~ "un nouveau mot de passe."
+ #~ msgid "E-mail address:"
+ #~ msgstr "Adresse e-mail:"
+ #~ msgid "credit card"
+ #~ msgstr "carte de crédit"
+ #~ msgid "collected"
+ #~ msgstr "encaissé"
+ #~ msgid "to an administrator"
+ #~ msgstr "à un administrateur"
+ #~ msgid "to a professor"
+ #~ msgstr "à un professeur"
+ #, fuzzy
+ #~ msgid "Login"
+ #~ msgstr "Se connecter en tant que"
+ #, fuzzy
+ #~ msgid "login"
+ #~ msgstr "Se connecter en tant que"
+ #, fuzzy
+ #~ msgid "Password changed"
+ #~ msgstr "Mot de passe initialisé"
+ #~ msgid "Confirm password reset"
+ #~ msgstr "Confirmation de la réinitialisation du mot de passe"
+ #~ msgid "My notes"
+ #~ msgstr "Mes notes"
+ #~ msgid "New note"
+ #~ msgstr "Nouvelle note"
+ #, fuzzy
+ #~| msgid "Grouped message"
+ #~ msgid "Group messages"
+ #~ msgstr "Message groupé"
+ #~ msgid "Testimonials"
+ #~ msgstr "Attestations"
+ #, fuzzy
+ #~ msgid "No testimonial"
+ #~ msgstr "attestation"
+ #, fuzzy
+ #~ msgid "General"
+ #~ msgstr "Tweeter général"
+ #~ msgid "Save and download the registration form"
+ #~ msgstr "Enregistrer et télécharger le formulaire"
+ #~ msgid "CRFPA Profile"
+ #~ msgstr "Profil CRFPA"
+ #~ msgid "Validate"
+ #~ msgstr "Validée"
+ #~ msgid "Treated"
+ #~ msgstr "Traitées"
+ #, fuzzy
+ #~ msgid "Score : "
+ #~ msgstr "Note"
+ #~ msgid " marked"
+ #~ msgstr " corrigée"
+ #~ msgid " pending"
+ #~ msgstr " en attente"
++<<<<<<< HEAD
++#~ msgid "Training"
++#~ msgstr "Formation"
++=======
+ #~ msgid "AE students"
+ #~ msgstr "Etudiants AE"
++>>>>>>> feature/dj4.2
+ #~ msgid "CRFPA student"
+ #~ msgstr "Etudiant CRFPA"
+ #~ msgid "is live"
+ #~ msgstr "en direct"
+ #~ msgid "STOP"
+ #~ msgstr "STOP"
+ #~ msgid "to an IEJ"
+ #~ msgstr "à un IEJ"
+ #~ msgid "obligation"
+ #~ msgstr "obligation"
+ #~ msgid "procedures"
+ #~ msgstr "procédures"
+ #~ msgid "oral specialities"
+ #~ msgstr "spécialités orales"
+ #~ msgid "written specialities"
+ #~ msgstr "spécialités écrites"
+ #~ msgid "Differed"
+ #~ msgstr "Différé"
+ #~ msgid "speciality"
+ #~ msgstr "spécialité"
+ #, fuzzy
+ #~ msgid "Join date"
+ #~ msgstr "date de début"
+ #, fuzzy
+ #~ msgid "Department"
+ #~ msgstr "département"
+ #~ msgid "All trainings"
+ #~ msgstr "Toutes les formations"
+ #~ msgid "Date begin"
+ #~ msgstr "Date de début"
+ #~ msgid "Modify profile"
+ #~ msgstr "Modifier le profil"
+ #~ msgid "All"
+ #~ msgstr "Tous"
+ #, fuzzy
+ #~ msgid "Last modification"
+ #~ msgstr "date de modification"
+ #~ msgid "course types"
+ #~ msgstr "types de matières"
+ #~ msgid "archive format"
+ #~ msgstr "format du support"
+ #~ msgid "secondary edition"
+ #~ msgstr "réédition"
+ #~ msgid "mode of acquisition"
+ #~ msgstr "mode d'acquisition"
+ #~ msgid "record author"
+ #~ msgstr "rédacteur fiche"
+ #~ msgid "record writer"
+ #~ msgstr "saisie fiche"
+ #~ msgid "legal rights"
+ #~ msgstr "droit d'utilisation"
+ #~ msgid "recording context"
+ #~ msgstr "contexte d'enregistrement"
+ #~ msgid "A/D conversion"
+ #~ msgstr "Conversion A/N"
+ #~ msgid "vernacular style"
+ #~ msgstr "style vernaculaire"
+ #~ msgid "generic style"
+ #~ msgstr "style générique"
+ #~ msgid "keyword"
+ #~ msgstr "Mot-clé"
+ #~ msgid "publisher / status"
+ #~ msgstr "éditeur / statut"
+ #~ msgid "publisher"
+ #~ msgstr "éditeur"
+ #~ msgid "population / social group"
+ #~ msgstr "population / groupe social"
+ #~ msgid "tape wheel diameter (cm)"
+ #~ msgstr "diamètre de bobine (cm)"
+ #~ msgid "tape length (cm)"
+ #~ msgstr "longueur de bande (cm)"
+ #~ msgid "tape width (inch)"
+ #~ msgstr "largeur de bande (pouce)"
+ #~ msgid "tape speed (cm/s)"
+ #~ msgstr "vitesse de bande (cm/s)"
+ #~ msgid "tape vendor"
+ #~ msgstr "marque de bande"
+ #~ msgid "number of channels"
+ #~ msgstr "Nombre de pistes"
+ #~ msgid "rights"
+ #~ msgstr "droits"
+ #~ msgid "topic"
+ #~ msgstr "discipline"
+ #~ msgid "physical format"
+ #~ msgstr "nature du support original"
+ #~ msgid "original number"
+ #~ msgstr "numéro de support"
+ #~ msgid "original status"
+ #~ msgstr "statut de l'original"
+ #~ msgid "technical properties / conservation state"
+ #~ msgstr "état de conservation"
+ #~ msgid "comments / notes"
+ #~ msgstr "commentaires / notes"
+ #~ msgid "original location"
+ #~ msgstr "lieu d'archivage"
+ #~ msgid "audio quality"
+ #~ msgstr "qualité audio"
+ #~ msgid "recording system"
+ #~ msgstr "système d'enregistrement"
+ #~ msgid "tape thickness (um)"
+ #~ msgstr "épaisseur de bande (um)"
+ #~ msgid "tape reference"
+ #~ msgstr "référence de bande"
+ #~ msgid "sticker presence"
+ #~ msgstr "présence de collants"
+ #~ msgid "instrument aliases"
+ #~ msgstr "instrument aliases"
+ #~ msgid "instrument"
+ #~ msgstr "instrument"
+ #~ msgid "parent instrument"
+ #~ msgstr "instrument parent"
+ #~ msgid "alias"
+ #~ msgstr "alias"
+ #~ msgid "equivalent ISO 639-2 identifier (bibliographic)"
+ #~ msgstr "identifiant ISO 639-2 équivalent (bibliographique)"
+ #~ msgid "equivalent ISO 639-2 identifier (terminologic)"
+ #~ msgstr "identifiant ISO 639-2 équivalent (terminologique)"
+ #~ msgid "equivalent ISO 639-1 identifier"
+ #~ msgstr "identifiant ISO 639-1 équivalent"
+ #~ msgid "scope"
+ #~ msgstr "cadre"
+ #~ msgid "languages"
+ #~ msgstr "langues"
+ #~ msgid "country"
+ #~ msgstr "état/nation"
+ #~ msgid "continent"
+ #~ msgstr "continent"
+ #~ msgid "complete type"
+ #~ msgstr "type complet"
+ #~ msgid "current location"
+ #~ msgstr "lieu actuel"
+ #~ msgid "authoritative"
+ #~ msgstr "officiel"
+ #~ msgid "location"
+ #~ msgstr "lieu"
+ #~ msgid "locations"
+ #~ msgstr "lieux"
+ #~ msgid "location types"
+ #~ msgstr "types de lieux"
+ #~ msgid "location aliases"
+ #~ msgstr "lieux alias"
+ #~ msgid "ancestor location"
+ #~ msgstr "lieu ancêtre"
+ #~ msgid "location relations"
+ #~ msgstr "lieux relations"
+ #~ msgid "none"
+ #~ msgstr "accès réservé"
+ #~ msgid "metadata"
+ #~ msgstr "métadonnées"
+ #~ msgid "mixed"
+ #~ msgstr "mixte"
+ #~ msgid "full"
+ #~ msgstr "complet"
+ #~ msgid "Metadata only"
+ #~ msgstr "Métadonnées uniquement"
+ #~ msgid "Sound and metadata"
+ #~ msgstr "Son et métadonnées"
+ #~ msgid "Private data"
+ #~ msgstr "Données privées"
+ #~ msgid "public access"
+ #~ msgstr "accès public"
+ #~ msgid "reference"
+ #~ msgstr "référence"
+ #~ msgid "original title / translation"
+ #~ msgstr "titre original / traduction"
+ #~ msgid "depositor / contributor"
+ #~ msgstr "déposant / contributeur"
+ #~ msgid "recording year (from)"
+ #~ msgstr "année d'enregistrement (depuis)"
+ #~ msgid "recording year (until)"
+ #~ msgstr "année d'enregistrement (jusqu'à)"
+ #~ msgid "year published"
+ #~ msgstr "année de parution"
+ #~ msgid "recordist"
+ #~ msgstr "collecteur"
+ #~ msgid "publisher collection"
+ #~ msgstr "collection éditeur"
+ #~ msgid "publisher serial number"
+ #~ msgstr "numéro dans la série"
+ #~ msgid "author of published notice"
+ #~ msgstr "auteur de la notice éditée"
+ #~ msgid "bibliographic references"
+ #~ msgstr "références bibliographiques"
+ #~ msgid "access status"
+ #~ msgstr "statut d'accès"
+ #~ msgid "automatic access after a rolling period"
+ #~ msgstr "Accès automatique après la data glissante"
+ #~ msgid "CNRS depositor"
+ #~ msgstr "déposant CNRS"
+ #~ msgid "related documentation"
+ #~ msgstr "documentation associée"
+ #~ msgid "copies"
+ #~ msgstr "autres exemplaires"
+ #~ msgid "archiver notes"
+ #~ msgstr "notes de l'archiviste"
+ #~ msgid "items finished"
+ #~ msgstr "fiches items faites"
+ #~ msgid "recordist identical to depositor"
+ #~ msgstr "collecteur identique au déposant"
+ #~ msgid "conservation site"
+ #~ msgstr "lieu de conservation"
+ #~ msgid "old code"
+ #~ msgstr "ancienne cote"
+ #~ msgid "number of components (medium / piece)"
+ #~ msgstr "nb de composants (support / pièce)"
+ #~ msgid "digitization"
+ #~ msgstr "numérisation"
+ #~ msgid "a_informer_07_03"
+ #~ msgstr "a_informer_07_03"
+ #~ msgid "states / nations"
+ #~ msgstr "états / nations"
+ #~ msgid "populations / social groups"
+ #~ msgstr "populations / groupes sociaux"
+ #~ msgid "computed duration"
+ #~ msgstr "durée calculée"
+ #~ msgid "collection"
+ #~ msgstr "collection"
+ #~ msgid "collection related media"
+ #~ msgstr "média associés à la collection"
+ #~ msgid "recording date (from)"
+ #~ msgstr "date d'enregistrement (depuis)"
+ #~ msgid "recording date (until)"
+ #~ msgstr "date d'enregistrement (jusqu'à)"
+ #~ msgid "summary"
+ #~ msgstr "résumé"
+ #~ msgid "remarks"
+ #~ msgstr "remarques"
+ #~ msgid "cultural area"
+ #~ msgstr "aire culturelle"
+ #~ msgid "language"
+ #~ msgstr "langue"
+ #~ msgid "ISO language"
+ #~ msgstr "Langue ISO"
+ #~ msgid "comments / ethnographic context"
+ #~ msgstr "commentaires / contexte ethnographique"
+ #~ msgid "moda_execut"
+ #~ msgstr "moda_execut"
+ #~ msgid "author / compositor"
+ #~ msgstr "auteur / compositeur"
+ #~ msgid "contributor"
+ #~ msgstr "intervenant"
+ #~ msgid "depositor"
+ #~ msgstr "déposant"
+ #~ msgid "item number"
+ #~ msgstr "n° de l'item"
+ #~ msgid "digitalist"
+ #~ msgstr "opérateur de numérisation"
+ #~ msgid "collector"
+ #~ msgstr "collecteur"
+ #~ msgid "collector selection"
+ #~ msgstr "sélection collecteur"
+ #~ msgid "collector as in collection"
+ #~ msgstr "collecteur identique à la collection"
+ #~ msgid "digitization date"
+ #~ msgstr "date de numérisation"
+ #~ msgid "creator reference"
+ #~ msgstr "référence"
+ #~ msgid "published references"
+ #~ msgstr "références éditées"
+ #~ msgid "copy of"
+ #~ msgstr "copie de"
+ #~ msgid "instruments"
+ #~ msgstr "instruments"
+ #~ msgid "composition"
+ #~ msgstr "Voix / Instruments"
+ #~ msgid "vernacular name"
+ #~ msgstr "nom vernaculaire"
+ #~ msgid "interprets"
+ #~ msgstr "interprètes"
+ #~ msgid "unit"
+ #~ msgstr "unité"
+ #~ msgid "start"
+ #~ msgstr "début"
+ #~ msgid "end"
+ #~ msgstr "fin"
+ #~ msgid "item part"
+ #~ msgstr "partie"
+ #~ msgid "playlist"
+ #~ msgstr "liste de lecture"
+ #~ msgid "resource_type"
+ #~ msgstr "type de ressource"
+ #~ msgid "resource_id"
+ #~ msgstr "ressource"
+ #~ msgid "time (s)"
+ #~ msgstr "temps (s)"
+ #~ msgid "transcoded"
+ #~ msgstr "transcodé"
+ #~ msgid "collections"
+ #~ msgstr "collections"
+ #~ msgid "corpus"
+ #~ msgstr "corpus"
+ #~ msgid "fonds"
+ #~ msgstr "fonds"
+ #~ msgid "corpus related media"
+ #~ msgstr "média associés"
+ #~ msgid "fonds related media"
+ #~ msgstr "média associés"
+ #~ msgid "element type"
+ #~ msgstr "type d'élément"
+ #~ msgid "element identifier"
+ #~ msgstr "identifiant de l'élément"
+ #~ msgid "modification type"
+ #~ msgstr "type de modification"
+ #~ msgid "time"
+ #~ msgstr "heure"
+ #~ msgid "Attachment"
+ #~ msgstr "Rattachement"
+ #~ msgid "Function"
+ #~ msgstr "Fonction"
+ #~ msgid "key"
+ #~ msgstr "clé"
+ #~ msgid "criteria"
+ #~ msgstr "critères"
+ #~ msgid "Telemeta administration"
+ #~ msgstr "Administration Telemeta"
+ #~ msgid "Enumerations"
+ #~ msgstr "Énumérations"
+ #~ msgid "No enumerations"
+ #~ msgstr "Aucune énumération"
+ #~ msgid "Welcome"
+ #~ msgstr "Bienvenue"
+ #~ msgid "Collections"
+ #~ msgstr "Collections"
+ #~ msgid "Items"
+ #~ msgstr "Items"
+ #~ msgid "Geo Navigator"
+ #~ msgstr "Géo-Navigateur"
+ #~ msgid "Advanced search"
+ #~ msgstr "Recherche avancée"
+ #~ msgid "Instruments"
+ #~ msgstr "Instruments"
+ #~ msgid "By"
+ #~ msgstr "Par"
+ #~ msgid ""
+ #~ "Usage of the archives in the respect of cultural heritage of the original "
+ #~ "communities."
+ #~ msgstr ""
+ #~ "Usage des archives réservé dans le respect du patrimoine culturel des "
+ #~ "communautés d'origine."
+ #~ msgid "Save"
+ #~ msgstr "Enregistrer"
+ #~ msgid "Collection"
+ #~ msgstr "Collection"
+ #~ msgid "Copy"
+ #~ msgstr "Copier"
+ #~ msgid "Add item"
+ #~ msgstr "Ajouter item"
+ #~ msgid "Add to playlist"
+ #~ msgstr "Ajouter à la liste"
+ #~ msgid "Listen to this collection"
+ #~ msgstr "Écouter la collection"
+ #~ msgid "Geographic and cultural informations"
+ #~ msgstr "Indications géographiques et culturelles"
+ #~ msgid "Bibliographic references"
+ #~ msgstr "Références bibliographiques"
+ #~ msgid "Archiving data"
+ #~ msgstr "Données d'archivage"
+ #~ msgid "Related documentation"
+ #~ msgstr "Documentation associée"
+ #~ msgid "Technical data"
+ #~ msgstr "Données techniques"
+ #~ msgid "Media type"
+ #~ msgstr "Type de media"
+ #~ msgid "Number of items"
+ #~ msgstr "Nombre d'items"
  
- #: templates/teleforma/course_conference_audio.html:71
- msgid "End"
- msgstr "Fin"
+ #~ msgid "Normal View"
+ #~ msgstr "Vue normale"
  
- #: templates/teleforma/course_conference_record.html:61
- #: templates/teleforma/courses.html:107
- msgid "Status"
- msgstr "Status"
+ #~ msgid "No such collection"
+ #~ msgstr "Aucune collection de ce type"
  
- #: templates/teleforma/course_conference_record.html:72
- #: templates/teleforma/courses.html:42
- msgid "New conference"
- msgstr "Nouvelle conférence"
+ #~ msgid "Related media"
+ #~ msgstr "Média associés"
  
- #: templates/teleforma/course_conference_record.html:101
- msgid "Record and stream"
- msgstr "Enregistrer et diffuser"
+ #~ msgid "related media"
+ #~ msgstr "média associés"
  
- #: templates/teleforma/course_media.html:28
- #: templates/teleforma/course_media.html:82
- #: templates/teleforma/inc/media_list.html:50
- msgid " published"
- msgstr " publié"
+ #~ msgid "Media Collections"
+ #~ msgstr "Collections"
  
- #: templates/teleforma/course_media.html:35
- #: templates/teleforma/course_media.html:82
- #: templates/teleforma/inc/media_list.html:52
- msgid " rejected"
- msgstr " rejeté"
+ #~ msgid "Unpublished"
+ #~ msgstr "Inédites"
  
- #: templates/teleforma/course_media.html:146
- msgid "Mime type"
- msgstr "Type mime"
+ #~ msgid "Published"
+ #~ msgstr "Éditées"
  
- #: templates/teleforma/course_media.html:148
- msgid "Date modified"
- msgstr "Date de modification"
+ #~ msgid "Sounds"
+ #~ msgstr "Sonores"
  
- #: templates/teleforma/course_media.html:149
- msgid "Media ID"
- msgstr "ID Média"
+ #~ msgid "Media"
+ #~ msgstr "Média"
  
- #: templates/teleforma/courses.html:49
- msgid "My notes"
- msgstr "Mes notes"
+ #~ msgid "in"
+ #~ msgstr "dans"
  
- #: templates/teleforma/courses.html:59
- msgid "New note"
- msgstr "Nouvelle note"
+ #~ msgid "Populations / Social groups"
+ #~ msgstr "Populations / Groupes sociaux"
  
- #: templates/teleforma/help.html:11 templates/telemeta/base.html:124
- #: templates/telemeta/base.html.py:137
- msgid "Help"
- msgstr "Aide"
+ #~ msgid "Add entry"
+ #~ msgstr "Ajouter une entrée"
  
- #: templates/teleforma/inc/conference_list.html:8
- msgid "Live conferences"
- msgstr "Conférences en direct"
+ #~ msgid "This enumeration is empty"
+ #~ msgstr "Cette énumération est vide"
  
- #: templates/teleforma/inc/conference_list.html:19
- #: templates/teleforma/inc/media_list.html:23
- #: templates/teleforma/inc/media_list.html:29
- msgid "Click here"
- msgstr "Cliquez ici"
+ #~ msgid "Modify an entry"
+ #~ msgstr "Modification d'une entrée"
  
- #: templates/teleforma/inc/media_list.html:8
- msgid "Passed conferences"
- msgstr "Conférences en différé"
+ #~ msgid "Replace by"
+ #~ msgstr "Remplacer par"
  
- #: templates/teleforma/inc/media_list.html:17
- msgid "Play"
- msgstr "Lire"
+ #~ msgid "delete value after replacing"
+ #~ msgstr "effacer la valeur après remplacement"
  
- #: templates/telemeta/base.html:87 templates/telemeta/base.html.py:95
- msgid "Desk"
- msgstr "Bureau"
+ #~ msgid "Replace"
+ #~ msgstr "Remplacement"
  
- #: templates/telemeta/base.html:104
- msgid "Messaging"
- msgstr "Messagerie"
+ #~ msgid "Geographic Navigator"
+ #~ msgstr "Navigateur géographique"
  
- #: templates/telemeta/base.html:107 templates/telemeta/users.html:6
- #: templates/telemeta/users.html.py:69
- msgid "Users"
- msgstr ""
+ #~ msgid "Map"
+ #~ msgstr "Carte"
  
- #: templates/telemeta/base.html:116 templates/telemeta/search_criteria.html:69
- msgid "Search"
- msgstr ""
+ #~ msgid "List"
+ #~ msgstr "Liste"
  
- #: templates/telemeta/base.html:117
- msgid "Collections"
- msgstr ""
+ #~ msgid "World"
+ #~ msgstr "Monde"
  
- #: templates/telemeta/base.html:118
- msgid "Items"
- msgstr ""
+ #~ msgid "Number of collections"
+ #~ msgstr "Nombre de collections"
  
- #: templates/telemeta/base.html:122
- msgid "Admin"
- msgstr ""
+ #~ msgid "1 collection"
+ #~ msgid_plural "%(counter)s collections"
+ #~ msgstr[0] "1 collection"
+ #~ msgstr[1] "%(counter)s collections"
  
- #: templates/telemeta/base.html:134
- msgid "Profile"
- msgstr "Profil"
+ #~ msgid "1 item"
+ #~ msgid_plural "%(counter)s items "
+ #~ msgstr[0] "1 item"
+ #~ msgstr[1] "%(counter)s items "
  
- #: templates/telemeta/base.html:136
- msgid "Lists"
- msgstr ""
+ #~ msgid "Musical selection"
+ #~ msgstr "Sélection musicale"
  
- #: templates/telemeta/base.html:139
- msgid "Sign out"
- msgstr ""
+ #~ msgid "Open the geographic navigator"
+ #~ msgstr "Accéder au navigateur géographique"
  
- #: templates/telemeta/base.html:181
- msgid "Powered by"
- msgstr ""
+ #~ msgid "Partners"
+ #~ msgstr "Partenaires"
  
- #: templates/telemeta/base.html:191
- msgid "Legal notices"
- msgstr ""
+ #~ msgid "Name"
+ #~ msgstr "Nom"
  
- #: templates/telemeta/home.html:26
- msgid "Connexion"
- msgstr ""
+ #~ msgid "This instrument list is empty"
+ #~ msgstr "Cette énumération est vide"
  
- #: templates/telemeta/lists.html:47
- msgid "My playlists"
- msgstr ""
+ #~ msgid "Item"
+ #~ msgstr "Item"
  
- #: templates/telemeta/lists.html:49
- msgid "Add"
- msgstr ""
+ #~ msgid "Collection access status"
+ #~ msgstr "Statut d'accès de la collection"
  
- #: templates/telemeta/lists.html:55
- msgid "Edit"
- msgstr ""
+ #~ msgid "Context access status"
+ #~ msgstr "Statut d'accès selon le profil"
  
- #: templates/telemeta/lists.html:70
- #: templates/telemeta/inc/module_revisions.html:18
- msgid "Type"
- msgstr ""
+ #~ msgid "Item access status"
+ #~ msgstr "Statut d'accès de l'item"
  
- #: templates/telemeta/lists.html:71
- msgid "Code"
- msgstr ""
+ #~ msgid "Previous"
+ #~ msgstr "Précédent"
  
- #: templates/telemeta/lists.html:72
- msgid "Recordist"
- msgstr "Opérateur d'enregistrement"
+ #~ msgid "Next"
+ #~ msgstr "Suivant"
  
- #: templates/telemeta/lists.html:73
- msgid "Recording period"
- msgstr "période d'enregistrement"
+ #~ msgid "Analysis"
+ #~ msgstr "Analyse"
  
- #: templates/telemeta/lists.html:74
- #: templates/telemeta/search_criteria.html:149
- msgid "Sound"
- msgstr "Sonore"
+ #~ msgid "Markers"
+ #~ msgstr "Marqueurs"
  
- #: templates/telemeta/lists.html:92
- #: templates/telemeta/inc/module_revisions.html:40
- msgid "deleted"
- msgstr ""
+ #~ msgid "Property"
+ #~ msgstr "Propriété"
  
- #: templates/telemeta/login.html:19
- msgid "Your username and password didn't match. Please try again."
- msgstr ""
+ #~ msgid "Unit"
+ #~ msgstr "Unité"
  
- #: templates/telemeta/login.html:29
- msgid "Password forgotten"
- msgstr ""
+ #~ msgid "Download:"
+ #~ msgstr "Téléchargement:"
  
- #: templates/telemeta/login.html:30
- msgid "Sign in"
- msgstr ""
+ #~ msgid "You don't have access to the media of this item."
+ #~ msgstr "Vous n'avez pas accès aux médias de cet item."
  
- #: templates/telemeta/profile_detail.html:6
- msgid "User Profile"
- msgstr "Profil utilisateur"
+ #~ msgid "Please contact the administrators to get more rights."
+ #~ msgstr "Contactez les administrateurs du site pour obtenir plus de droits."
  
- #: templates/telemeta/profile_detail.html:16
- msgid "His courses"
- msgstr "Ses matières"
+ #~ msgid "Recording date"
+ #~ msgstr "Date d'enregistrement"
  
- #: templates/telemeta/profile_detail.html:36
- msgid "Send a message"
- msgstr "Envoyer un message"
+ #~ msgid "Location"
+ #~ msgstr "Lieu"
  
- #: templates/telemeta/profile_detail.html:44
- msgid "User profile"
- msgstr "Profil utilisateur"
+ #~ msgid "Language ISO"
+ #~ msgstr "Langue ISO"
  
- #: templates/telemeta/profile_detail.html:49
- msgid "Change password"
- msgstr ""
+ #~ msgid "Ethnographic context"
+ #~ msgstr "Contexte ethnographique"
  
- #: templates/telemeta/profile_detail.html:51
- msgid "Login as"
- msgstr "Se connecter en tant que"
+ #~ msgid "Musical informations"
+ #~ msgstr "Informations sur la musique"
  
- #: templates/telemeta/profile_detail.html:59
- #: templates/telemeta/inc/user_list.html:20
- msgid "First Name"
- msgstr ""
+ #~ msgid "Published references"
+ #~ msgstr "Références éditées"
  
- #: templates/telemeta/profile_detail.html:60
- #: templates/telemeta/inc/user_list.html:19
- msgid "Last Name"
- msgstr ""
+ #~ msgid "Remarks"
+ #~ msgstr "Remarques"
  
- #: templates/telemeta/profile_detail.html:61
- msgid "Username"
- msgstr "Nom d'utilisateur"
+ #~ msgid "No such item"
+ #~ msgstr "Item introuvable"
  
- #: templates/telemeta/profile_detail.html:65 templates/telemeta/users.html:15
- #: templates/telemeta/inc/user_list.html:22
- msgid "Trainings"
- msgstr "Formations"
+ #~ msgid "Keywords"
+ #~ msgstr "Mots-clés"
  
- #: templates/telemeta/profile_detail.html:66
- msgid "Platform only"
- msgstr "Plateforme seulement"
+ #~ msgid "Performance"
+ #~ msgstr "Composition"
  
- #: templates/telemeta/profile_detail.html:67
- #: templates/telemeta/inc/user_list.html:23
- msgid "Procedure"
- msgstr "Procédure"
+ #~ msgid "performance"
+ #~ msgstr "composition"
  
- #: templates/telemeta/profile_detail.html:68
- #: templates/telemeta/inc/user_list.html:24
- msgid "Oral spe"
- msgstr "Oral Spé"
+ #~ msgid "Keyword"
+ #~ msgstr "Mot-clé"
  
- #: templates/telemeta/profile_detail.html:69
- #: templates/telemeta/inc/user_list.html:25
- msgid "Written spe"
- msgstr "Ecrit Spé"
+ #~ msgid "Media Items"
+ #~ msgstr "Items"
  
- #: templates/telemeta/profile_detail.html:70
- #: templates/telemeta/inc/user_list.html:26
- msgid "Oral 1"
- msgstr ""
+ #~ msgid "Playlists"
+ #~ msgstr "Listes de lecture"
  
- #: templates/telemeta/profile_detail.html:71
- #: templates/telemeta/inc/user_list.html:27
- msgid "Oral 2"
- msgstr ""
+ #~ msgid "Is staff"
+ #~ msgstr "Statut équipe"
  
- #: templates/telemeta/profile_detail.html:72
- msgid "Options"
- msgstr "Options"
+ #~ msgid "Is superuser"
+ #~ msgstr "Statut super-utilisateur"
  
- #: templates/telemeta/profile_detail.html:76
- msgid "Email"
- msgstr ""
+ #~ msgid "New"
+ #~ msgstr "Nouveau"
  
- #: templates/telemeta/profile_detail.html:82
- #, fuzzy
- msgid "Expiration date"
- msgstr "Date d'expiration"
+ #~ msgid "No such resource"
+ #~ msgstr "Aucune ressource de ce type"
  
- #: templates/telemeta/profile_detail.html:83
- msgid "Last login"
- msgstr ""
+ #~ msgid "Search pattern"
+ #~ msgstr "Mots clés"
  
- #: templates/telemeta/profile_detail.html:94
- msgid "Apply"
- msgstr ""
+ #~ msgid ""
+ #~ "%(resource.children_type|capitalize)s %(first_on_page)s to "
+ #~ "%(last_on_page)s on %(hits)s"
+ #~ msgstr ""
+ #~ "%(resource.children_type|capitalize)s %(first_on_page)s à "
+ #~ "%(last_on_page)s sur %(hits)s"
  
- #: templates/telemeta/profile_detail.html:104
- msgid "Password reset"
- msgstr "Réinitialisation du mot de passe"
+ #~ msgid "Reference"
+ #~ msgstr "Référence"
  
- #: templates/telemeta/search_criteria.html:5
- #: templates/telemeta/search_criteria.html:76
- msgid "Advanced Search"
- msgstr ""
+ #~ msgid "No resource"
+ #~ msgstr "Aucune ressource"
  
- #: templates/telemeta/search_criteria.html:113
- msgid "Year of recording"
- msgstr ""
+ #~ msgid "Collections %(first_on_page)s to %(last_on_page)s on %(hits)s"
+ #~ msgstr "Collections %(first_on_page)s à %(last_on_page)s sur %(hits)s"
  
- #: templates/telemeta/search_criteria.html:120
- #: templates/telemeta/search_criteria.html:139
- msgid "to"
- msgstr "à"
+ #~ msgid "No collection"
+ #~ msgstr "Aucune collection"
  
- #: templates/telemeta/search_criteria.html:132
- #, fuzzy
- msgid "Year of publication"
- msgstr "obligation"
+ #~ msgid "Preview"
+ #~ msgstr "Prévisualisation"
  
- #: templates/telemeta/users.html:41
- msgid "Courses"
- msgstr "Matières"
+ #~ msgid "Credits"
+ #~ msgstr "Crédits"
  
- #: templates/telemeta/users.html:55
- msgid "Grouped message"
- msgstr "Message groupé"
+ #~ msgid "Dublin Core Metadata"
+ #~ msgstr "Métadonnées Dublin Core"
  
- #: templates/telemeta/users.html:74
- msgid "No users"
- msgstr "Pas d'utilisateurs"
+ #~ msgid "Items %(first_on_page)s to %(last_on_page)s on %(hits)s"
+ #~ msgstr "Items %(first_on_page)s à %(last_on_page)s sur %(hits)s"
  
- #: templates/telemeta/inc/module_revisions.html:19
- msgid "User"
- msgstr ""
+ #~ msgid "Country/Continent"
+ #~ msgstr "Etat/Continent"
  
- #: templates/telemeta/inc/module_searches.html:12
- msgid "Criteria"
- msgstr ""
+ #~ msgid "No item"
+ #~ msgstr "Aucun item"
  
- #: templates/telemeta/inc/user_list.html:56
- msgid "Administrator"
- msgstr ""
+ #~ msgid " from %(first_on_page)s to %(last_on_page)s on %(hits)s"
+ #~ msgstr " de %(first_on_page)s à %(last_on_page)s sur %(hits)s"
  
- #: templates/telemeta/inc/user_list.html:64
- msgid "Unknown"
- msgstr ""
+ #~ msgid "Groups"
+ #~ msgstr "Groupes"
  
- #: templatetags/teleforma_tags.py:61
- msgid "General tweeter"
- msgstr "Tweeter général"
+ #~ msgid "%(count)d item"
+ #~ msgid_plural "%(count)d items"
+ #~ msgstr[0] "%(count)d item"
+ #~ msgstr[1] "%(count)d items"
  
- #: templatetags/teleforma_tags.py:62
- msgid "Local tweeter"
- msgstr "Tweeter local"
+ #~ msgid "%(count)d collection"
+ #~ msgid_plural "%(count)d collections"
+ #~ msgstr[0] "%(count)d collection"
+ #~ msgstr[1] "%(count)d collections"
  
- #: templatetags/teleforma_tags.py:127
- msgid "me"
- msgstr "moi"
+ #~ msgid "My last changes"
+ #~ msgstr "Mes dernières modifications"
  
- #: templatetags/teleforma_tags.py:134
- msgid "No"
- msgstr "Non"
+ #~ msgid "All last changes"
+ #~ msgstr "Toutes les dernières modifications"
  
- #: views/core.py:147
- msgid "Access not allowed."
- msgstr "Accès non autorisé."
+ #~ msgid "My searches"
+ #~ msgstr "Mes recherches"
  
- #: views/core.py:148
- msgid ""
- "Please login or contact the website administator to get a private access."
- msgstr ""
- "Merci de vous connecter ou bien contactez l'administateur du site pour "
- "obtenir un accès privé."
+ #~ msgid "Children"
+ #~ msgstr "Enfants"
  
- #: views/core.py:201
- msgid ""
- "You do NOT have access to this resource and then have been redirected to "
- "your desk."
- msgstr ""
- "Vous n'avez pas accès à cette ressource et avez été redirigé vers votre "
- "bureau."
+ #~ msgid "pattern"
+ #~ msgstr "mots clés"
  
- #: views/core.py:495
- msgid "A new live conference has started : "
- msgstr "Une nouvelle conférence en direct a commencé : "
+ #~ msgid "Last changes"
+ #~ msgstr "Dernières modifications"
  
- #~ msgid "Training"
- #~ msgstr "Formation"
+ #~ msgid "General informations"
+ #~ msgstr "Informations générales"
  
- #~ msgid "CRFPA student"
- #~ msgstr "Etudiant CRFPA"
+ #~ msgid "attachment"
+ #~ msgstr "rattachement"
  
- #~ msgid "amount"
- #~ msgstr "montant"
+ #, fuzzy
+ #~ msgid "lieux types"
+ #~ msgstr "lieux types"
  
- #~ msgid "payment"
- #~ msgstr "paiement"
+ #~ msgid "domain"
+ #~ msgstr "discipline"
  
- #~ msgid "Reject"
- #~ msgstr "Rejeter"
+ #, fuzzy
+ #~ msgid "channel number"
+ #~ msgstr "n° de l'item"
  
- #~ msgid "is live"
- #~ msgstr "en direct"
+ #~ msgid "original format"
+ #~ msgstr "support original"
  
- #~ msgid "STOP"
- #~ msgstr "STOP"
+ #, fuzzy
+ #~ msgid "Password initialization"
+ #~ msgstr "Mot de passe (encore)"
  
- #~ msgid "to an IEJ"
- #~ msgstr "à un IEJ"
+ #~ msgid "support number"
+ #~ msgstr "n° du support"
  
- #~ msgid "Duration"
- #~ msgstr "Durée"
+ #~ msgid "General administration"
+ #~ msgstr "Administration générale"
  
- #~ msgid "Messages"
- #~ msgstr "Messages"
+ #~ msgid "link"
+ #~ msgstr "lien"
  
- #~ msgid "obligation"
- #~ msgstr "obligation"
+ #~ msgid "related"
+ #~ msgstr "associés"
  
- #~ msgid "procedures"
- #~ msgstr "procédures"
+ #~ msgid "File"
+ #~ msgstr "Fichier"
  
- #~ msgid "oral specialities"
- #~ msgstr "spécialités orales"
+ #~ msgid "Comments / ethnographic context"
+ #~ msgstr "Commentaires / contexte ethnographique"
  
- #~ msgid "written specialities"
- #~ msgstr "spécialités écrites"
+ #~ msgid "Account"
+ #~ msgstr "Compte"
  
- #~ msgid "Differed"
- #~ msgstr "Différé"
+ #~ msgid "username"
+ #~ msgstr "nom d'utilisateur"
  
- #~ msgid "category"
- #~ msgstr "catégorie"
+ #~ msgid "level"
+ #~ msgstr "niveau"
  
- #~ msgid "categories"
- #~ msgstr "catégories"
+ #~ msgid "first name"
+ #~ msgstr "prénom"
  
- #~ msgid "speciality"
- #~ msgstr "spécialité"
+ #~ msgid "last name"
+ #~ msgstr "nom de famille"
  
- #, fuzzy
- #~ msgid "Join date"
- #~ msgstr "date de début"
+ #~ msgid "phone"
+ #~ msgstr "téléphone"
  
  #, fuzzy
- #~ msgid "Department"
- #~ msgstr "département"
+ #~ msgid "email"
+ #~ msgstr "Courriel"
  
- #~ msgid "All trainings"
- #~ msgstr "Toutes les formations"
+ #~ msgid "Conservation site"
+ #~ msgstr "Lieu de conservation"
  
- #~ msgid "Date begin"
- #~ msgstr "Date de début"
+ #~ msgid "Locations"
+ #~ msgstr "Lieux"
  
- #~ msgid "Modify profile"
- #~ msgstr "Modifier le profil"
+ #~ msgid "resource type"
+ #~ msgstr "type de ressource"
  
- #~ msgid "All"
- #~ msgstr "Tous"
+ #~ msgid "Visit the Telemeta open source project at"
+ #~ msgstr "Visitez le projet libre Telemeta"
  
- #, fuzzy
- #~ msgid "Last modification"
- #~ msgstr "date de modification"
+ #~ msgid "Marker"
+ #~ msgstr "Marqueur"
  
- #~ msgid "course types"
- #~ msgstr "types de matières"
+ #~ msgid "item added to the selected playlist"
+ #~ msgstr "item ajouté à la liste de lecture sélectionnée"
index 488b897082bd24588543ff4ef494d25ddf55569b,359ba1cf813b0378e3b5c32e0931ae615b1be6a1..16ec3c4225786bc4d6d799667129c7ee836857f9
@@@ -12,11 -10,15 +10,14 @@@ import codec
  
  
  class Command(BaseCommand):
 -    help = "pull teleforma courses from a remote host"
 +    help = "pull teleforma courses from a remote host for an organization"
      admin_email = 'webmaster@parisson.com'
 -    args = "organization_name department_name"
 +    args = "organization_name"
  
+     def add_arguments(self, parser):
+         parser.add_argument('args', nargs='*')
      def handle(self, *args, **options):
 -      organization_name = args[0]
 -      department_name = args[1]
 +      organization_name = args[-1]
          view = CourseListView()
 -        view.pull(organization_name, department_name)
 +        view.pull(organization_name)
index d8a9b4707acefc1df02cb8ce53599e0463bacd58,0d2f1c6e3ce77dc0b374d1fecc90abba3c1fa8f0..803eb8be204b75fd22138e380ea17c1aed2e884d
  # Author: Guillaume Pellerin <yomguy@parisson.com>
  """
  
- import os
- import re
- import pwd
- import time
- import urllib
- import string
  import datetime
  import mimetypes
+ import os
+ import string
  import random
+ import requests
+ import asyncio
+ import tempfile
  
- from django.db.models import *
- from telemeta.models import *
- from teleforma.fields import *
  import django.db.models as models
- from django.utils.translation import ugettext_lazy as _
+ from django.conf import settings
  from django.contrib.auth.models import User
- from django.core.exceptions import ValidationError
- from django.contrib.contenttypes import generic
- from notes.models import Note
import jqchat.models
- from django.core.paginator import InvalidPage, EmptyPage
+ from django.core.files import File
+ from django.core.files.storage import FileSystemStorage
+ from django.core.paginator import InvalidPage
from django.db import models
+ from django.forms.fields import FileField
  from django.template.defaultfilters import slugify
+ from django.urls import reverse_lazy, reverse
+ from django.utils.translation import gettext_lazy as _
+ from django.db.models.signals import post_save
+ # from quiz.models import Quiz
+ from teleforma.utils import guess_mimetypes
+ from ..fields import ShortTextField
  from sorl.thumbnail import default as sorl_default
 -
 +from jsonrpc.proxy import ServiceProxy
+ from pypdf import PdfWriter
+ import httpx
+ from storages.backends.s3boto3 import S3Boto3Storage
  
  
  app_label = 'teleforma'
@@@ -122,17 -175,44 +175,44 @@@ class Department(models.Model)
          verbose_name = _('department')
  
  
- class Period(Model):
-     name            = CharField(_('name'), max_length=255)
-     description     = CharField(_('description'), max_length=255, blank=True)
-     department      = ForeignKey('Department', related_name='period',
-                                  verbose_name=_('department'),
-                                  blank=True, null=True)
-     def __unicode__(self):
+ class Period(models.Model):
+     name = models.CharField(_('name'), max_length=255)
+     description = models.CharField(
+         _('description'), max_length=255, blank=True)
+     parent = models.ForeignKey('Period', related_name='children', verbose_name=_(
+         'parent'), blank=True, null=True, on_delete=models.SET_NULL)
+     department = models.ForeignKey('Department', related_name='period',
+                                    verbose_name=_('department'),
+                                    blank=True, null=True, on_delete=models.SET_NULL)
+     date_begin = models.DateField(_('begin date'), null=True, blank=True)
+     date_end = models.DateField(_('end date'), null=True, blank=True)
+     date_password_init = models.DateField(
+         _("date d'init de mot de passe"), null=True, blank=True)
+     message_platform = models.TextField(
+         _('message pour internaute'), blank=True)
+     message_local = models.TextField(
+         _('message pour presentielle'), blank=True)
+     is_open = models.BooleanField(_('is open'), default=True)
+     date_exam_end = models.DateTimeField(
+         _("date de fin d'examens"), null=True, blank=True)
+     nb_script = models.IntegerField(
+         _("nombre maximal de copies"), null=True, blank=True)
+     nb_script_per_session = models.IntegerField(
+         "nombre maximal de copies par session", default=1)
+     date_close_accounts = models.DateField(
+         "date de fermeture des comptes étudiants", null=True, blank=True)
+     date_inscription_start = models.DateField(
+         "date d'ouverture des inscriptions", null=True, blank=True)
+     date_inscription_end = models.DateField(
+         "date de fermeture des inscriptions", null=True, blank=True)
 -    corrections_from = models.ForeignKey('Period', 
 -                                        verbose_name="Récupérer les séminaires de correction depuis", 
 -                                        help_text="Permet d'afficher les séminaires de corrections d'une autre période. Il faut aussi cocher la case relative dans les matières pour autoriser celles-ci à partager leur contenu.", 
++    corrections_from = models.ForeignKey('Period',
++                                        verbose_name="Récupérer les séminaires de correction depuis",
++                                        help_text="Permet d'afficher les séminaires de corrections d'une autre période. Il faut aussi cocher la case relative dans les matières pour autoriser celles-ci à partager leur contenu.",
+                                         blank=True, null=True, on_delete=models.SET_NULL)
+     def __str__(self):
          return self.name
      class Meta(MetaCore):
          db_table = app_label + '_' + 'period'
          verbose_name = _('period')
@@@ -165,27 -249,42 +249,46 @@@ class CourseType(models.Model)
      def slug(self):
          return slugify(self.name)
  
- class Course(Model):
-     department      = ForeignKey('Department', related_name='course',
-                                  verbose_name=_('department'))
-     title           = CharField(_('title'), max_length=255)
-     description     = CharField(_('description'), max_length=255, blank=True)
-     code            = CharField(_('code'), max_length=255)
-     title_tweeter   = CharField(_('tweeter title'), max_length=255)
-     date_modified   = DateTimeField(_('date modified'), auto_now=True, null=True)
-     number          = IntegerField(_('number'), blank=True, null=True)
-     synthesis_note  = BooleanField(_('synthesis note'))
-     obligation      = BooleanField(_('obligations'))
-     magistral       = BooleanField(_('magistral'))
-     types           = ManyToManyField('CourseType', related_name="course",
-                                         verbose_name=_('types'),
-                                         blank=True, null=True)
-     notes = generic.GenericRelation(Note)
++    @property
++    def slug(self):
++        return slugify(self.name)
 +
  
-     def __unicode__(self):
+ class Course(models.Model):
+     department = models.ForeignKey('Department', related_name='course',
+                                    verbose_name=_('department'), on_delete=models.CASCADE)
+     title = models.CharField(_('title'), max_length=255)
+     description = models.CharField(
+         _('description'), max_length=255, blank=True)
+     code = models.CharField(_('code'), max_length=255)
+     title_tweeter = models.CharField(_('tweeter title'), max_length=255)
+     date_modified = models.DateTimeField(
+         _('date modified'), auto_now=True, null=True)
+     number = models.IntegerField(_('number'), blank=True, null=True)
+     synthesis_note = models.BooleanField(_('synthesis note'))
+     obligation = models.BooleanField(_('obligations'))
+     magistral = models.BooleanField(_('magistral'))
+     procedure = models.BooleanField(_('procedure'))
+     written_speciality = models.BooleanField(_('written_speciality'))
+     oral_speciality = models.BooleanField(_('oral_speciality'))
+     oral_1 = models.BooleanField(_('oral_1'))
+     oral_2 = models.BooleanField(_('oral_2'))
+     has_exam_scripts = models.BooleanField(_("copies d'examen"), default=True)
+     # quiz = models.ManyToManyField(
+     #     Quiz, verbose_name=_('quiz'), blank=True, null=True)
+     # last professor which received a student message on automatic mode
+     last_professor_sent = models.ForeignKey(
+         'Professor', blank=True, null=True, on_delete=models.SET_NULL)
+     periods = models.ManyToManyField('Period', related_name="courses",
+                                      verbose_name=u'Périodes associées',
+                                      blank=True)
 -    corrections_shared = models.BooleanField("Corrections partagés", 
++    corrections_shared = models.BooleanField("Corrections partagés",
+                                             help_text="A utiliser avec le champ relatif dans la période.",
+                                             default=False)
+     def __str__(self):
          return self.title
  
      @property
@@@ -238,15 -361,17 +365,18 @@@ class Professor(models.Model)
              return self.user.username
  
      def to_json_dict(self):
 -        data = {'username': self.user.username,
 +        data = {'id': self.id,
 +                'username': self.user.username,
                  'first_name': self.user.first_name,
                  'last_name': self.user.last_name,
-                 'email' : self.user.email,
+                 'email': self.user.email,
                  'courses': [course.code for course in self.courses.all()],
-                  }
+                 }
          return data
  
+     def get_absolute_url(self):
+         return reverse_lazy('teleforma-profile-detail', kwargs={'username': self.user.username})
      class Meta(MetaCore):
          db_table = app_label + '_' + 'professor'
          verbose_name = _('professor')
@@@ -341,6 -538,7 +543,7 @@@ class Conference(models.Model)
                  'period': self.period.name if self.period else 'None',
                  'session': self.session if self.session else 'None',
                  'comment': self.comment if self.comment else 'None',
 -                'streaming': self.streaming if self.streaming else 'False',
++                'streaming': 'True' if self.streaming else 'False',
                  'streams': [],
                  'date_begin': self.date_begin.strftime('%Y %m %d %H %M %S') if self.date_begin else 'None',
                  'date_end': self.date_end.strftime('%Y %m %d %H %M %S') if self.date_end else 'None',
  
          if 'room' in data.keys():
              self.room, c = Room.objects.get_or_create(name=data['room'],
-                                                    organization=organization)
+                                                       organization=organization)
+         if 'web_class_group' in data.keys():
+             if data['web_class_group'] != 'None':
+                 self.web_class_group = WebClassGroup.objet.get(
+                     name=data['web_class_group'])
+     def video(self):
+         """
+         get media video
+         """
+         try:
+             videos = self.media.filter(type='mp4')
+             if videos:
+                 return videos[0]
+         except Media.DoesNotExist:
+             try:
+                 return self.media.filter(type='webm')[0]
+             except Media.DoesNotExist:
+                 pass
+         return None
+     def publication_info(self, period):
+         """
+         Get publication info according to period.
+         """
+         publication = self.publications.filter(period=period).first()
+         if not publication and self.period == period:
+             publication = self
+         elif not publication:
+             return None
 -        
++
+         return {
+             'status': publication.status,
+             'published': publication.status == 3,
+             'publication_date': publication.date_publish,
+             'notified': publication.notified
+         }
 -        
++
 +
 +
 +    def stop(self):
 +        self.date_end = datetime.datetime.now()
 +        self.streaming = False
 +        self.save()
 +        for stream in self.livestream.all():
 +            stream.delete()
 +        for station in self.station.all():
 +            station.stop()
 +        if 'telecaster' in settings.INSTALLED_APPS:
 +            try:
 +                url = 'https://' + self.department.domain + '/json/'
 +                s = ServiceProxy(url)
 +                s.teleforma.stop_conference(self.public_id)
 +            except:
 +                pass
 +
  
      class Meta(MetaCore):
          db_table = app_label + '_' + 'conference'
index 8e41517ca2e3070da3e5d3ac6e128994ebd1a6b4,c0e8aa8550e5472a105b58acd4eace9133a6e3d2..edbdc4ef949cd0ad703e9e9417750cc5179036e9
@@@ -1,17 -1,13 +1,20 @@@
  Recommandations
  ================
  
- Ce site est conforme aux standards ouverts du web comme le HTML5. Il est donc accessible depuis n'importe quel navigateur de bureau ou mobile.
+ Cette plateforme est conforme aux standards ouverts du web comme le HTML5. Il est donc accessible depuis n'importe quel navigateur de bureau.
  
Néanmoins, le format des flux vidéo n'est peut-être pas compatible avec tous les navigateurs de vos appareils informatiques. Dans ce cas, nous vous conseillons vivement d'installer et d'utiliser le navigateur ouvert et gratuit `Chrome <https://www.google.com/chrome?hl=fr>`_  avec lequel nous garantissons tous nos accès multimédias, en direct, comme en différé. Aussi `Firefox <http://www.mozilla.org/fr/firefox/new/>`_ pourra lire les vidéos mais pas peut-être pas l'audio selon votre installation. Nous y travaillons. Safari, dans l'immédiat ne vous permet pas de visionner les vidéos.
Pour une navigation fluide dans tous les cas, nous vous recommandons d'utiliser le navigateur `Firefox <https://www.mozilla.org/fr/firefox/new/>`_.
  
En attendant que nous puissions convenir à tous les formats demandés et si vous rencontrez des problèmes à la lecture des médias en streaming, nous vous recommandons alors de télécharger les archives à l'aide du boutton "Télécharger" de la conférence vidéo ou audio, puis de les relire avec le lecteur libre, gratuit et multi-plateforme : `VLC <http://www.videolan.org/vlc/>`_ (VideoLan).
Les vidéos en direct ne sont compatibles qu'avec Firefox_ (non compatible sur Iphone et Ipad mais compatible sur ordinateur Apple).
  
++<<<<<<< HEAD
 +Pour la lecture des fichiers MP3 sur des réseaux à faible débit, en mobilité sur votre iPhone ou Android par exemple, tout lecteur audio basique devrait faire l'affaire après téléchargement de l'archive. Pour les vidéos, un lecteur compatible WebM est nécessaire (MX Player sur Android).
 +
 +|
 +
++=======
+ Les vidéos en différé sont compatibles avec tous les navigateurs.
++>>>>>>> feature/dj4.2
  
  FAQ
  ====
@@@ -31,6 -30,4 +37,10 @@@ Vous pouvez à tout moment réinitialis
  Support
  ========
  
- Pour obtenir une aide technique, veuillez `contacter un technicien depuis la messagerie <http://e-learning.ae.pre-barreau.com/messages/write/admin-tech>`_.
++<<<<<<< HEAD
 +Pour les questions relatives à votre formation CRFPA, veuillez `contacter un administrateur depuis la messagerie <http://e-learning.ae.pre-barreau.com/messages/write/Admin-AE>`_ ou bien par mail à l'adresse suivante : `avocat.etranger@pre-barreau.com <mailto:avocat.etranger@pre-barreau.com>`_
 +
++Pour obtenir une aide technique, veuillez `contacter un technicien depuis la messagerie <http://e-learning.ae.pre-barreau.com/messages/write/admin-tech>`_.
++=======
+ Pour les questions relatives à votre formation, vos supports de cours, vos agendas, des problèmes techniques veuillez contacter l'administration (admin-CRFPA dans la messagerie) ou bien par mail à l'adresse suivante : `crfpa@pre-barreau.com <mailto:crfpa@pre-barreau.com>`_
++>>>>>>> feature/dj4.2
index eb8467113da180723bcc4538cf58e0d037ae4d65,505da22c79061be54847cd84c6afc5f199d5e5d3..3b4d72883b4fb66c84737132232b4def2d1297c5
  {% if access_error %}
    <p>{{ access_error }}</p>
    <p>{{ message }}</p>
  {% else %}
+     {% for livestream in livestreams %}
+         {% if "webm" == livestream.stream_type %}
+             <div class="video">
+                 <link href="https://vjs.zencdn.net/7.11.4/video-js.css" rel="stylesheet" />
+                 <link href="https://unpkg.com/@videojs/themes@1/dist/fantasy/index.css" rel="stylesheet">
+                 <video
+                     id="video"
+                     class="video-js vjs-theme-fantasy"
+                     controls
+                     preload="auto"
+                     width="100%"
+                     height="auto"
+                     data-setup="{}"
+                     autoplay>
++<<<<<<< HEAD
 +{% for livestream in livestreams %}
 +{% if "webm" == livestream.stream_type %}
 +<div class="video">
 +<video width="640" height="360" controls autoplay preload="auto">
 +<!-- Hello Chrome and Firefox (and Opera?) -->
 +<source src="{{ livestream.url|set_host:host }}?v={% random_hash %}" type="video/webm" />
 +</video>
 +</div>
++=======
+                   <source id="videosource" src="{{ livestream.url }}" type="video/webm" />
+                     <p class="vjs-no-js">
+                       To view this video please enable JavaScript, and consider upgrading to a
+                       web browser that
+                       <a href="https://videojs.com/html5-video-support/" target="_blank"
+                         >supports HTML5 video</a
+                       >
+                     </p>
+                 </video>
+                 <script src="https://vjs.zencdn.net/7.11.4/video.min.js"></script>
+             </div>
+         {% endif %}
+     {% endfor %}
++>>>>>>> feature/dj4.2
  {% endif %}
- {% endfor %}
  
- {% endif %}
  </div>
  
  {% block general_info %}
  <dl class="listing">
  
  {% if conference.professor %}
++<<<<<<< HEAD
 +<dt>{% trans "Course" %}</dt><dd><a href="{% url teleforma-desk-period-course period.id course.id %}">{{ conference.course.title }} - {{ conference.course_type }}</a></dd>
 +<dt>{% trans "Session" %}</dt><dd>{{ conference.session }}</dd>
 +<dt>{% trans "Professor" %}</dt>{{ conference.professor }}</dd>
++=======
+     <dt>{% trans "Course" %}</dt><dd><a href="{% url 'teleforma-desk-period-course' period.id course.id %}">{{ conference.course.title }} - {{ conference.course_type }}</a></dd>
+     <dt>{% trans "Session" %}</dt><dd>{{ conference.session }}</dd>
+     <dt>{% trans "Professor" %}</dt><dd>{{ conference.professor }}</dd>
++>>>>>>> feature/dj4.2
  {% endif %}
  {% if conference.comment %}<dt>{% trans "Comment" %}</dt><dd>{{ conference.comment }}</dd>{% endif %}
- <dt>{% trans "Begin date" %}</dt><dd>{{ conference.date_begin }}</dd>
- {% if conference.date_end %}<dt>{% trans "End date" %}</dt><dd>{{ conference.date_end|yes_no }}</dd>{% endif %}
- <dt>{% trans "Live" %}</dt><dd>{% trans "Yes" %}</dd>
- {% if conference.room %}<dt>{% trans "Room" %}</dt><dd>{{ conference.room }}</dd>{% endif %}
- {% if user.is_staff or user.is_superuser %}
- <dt>{% trans "Conference ID" %}</dt><dd>{{ conference.public_id }}</dd>
    <dt>{% trans "Begin date" %}</dt><dd>{{ conference.date_begin }}</dd>
    {% if conference.date_end %}<dt>{% trans "End date" %}</dt><dd>{{ conference.date_end|yes_no }}</dd>{% endif %}
    <dt>{% trans "Live" %}</dt><dd>{% trans "Yes" %}</dd>
    {% if conference.room %}<dt>{% trans "Room" %}</dt><dd>{{ conference.room }}</dd>{% endif %}
    {% if user.is_staff or user.is_superuser %}
    <dt>{% trans "Conference ID" %}</dt><dd>{{ conference.public_id }}</dd>
  {% endif %}
  
  </dl>
index 4605162082e15ea6eca1f42d2902cabdfce48d71,e2f5ba974444fe635a6d5675680cc7afe9c60b5c..1ef207a720605f0297b726ecb8f4137cf0ff49f8
@@@ -8,62 -7,12 +7,56 @@@
  <script type="text/javascript">
  
  jQuery(window).ready(function(){
 +
      var a = jQuery('#action_red');
      var f = jQuery('#_StationForm');
 -    a.unbind('click').click(function(){f.submit();return false;});
 -    });
 +    a.unbind('click').click(function(){a.unbind('click'); f.submit(); return false;});
 +
 +    var update_courses = function(data){
 +        var courses = data.result;
 +        var options = '<option value="">----------</option>';
 +        for (var i = 0; i < courses.length; i++) {
 +          options += '<option value="' + parseInt(courses[i].id) + '">' + courses[i].name + '</option>';
 +        }
 +        $("#id_course").html(options);
 +        $("#id_course option:first").attr('selected', 'selected');
 +        $("#id_course").attr('disabled', false);
 +        }
 +
 +    var update_periods = function(data){
 +        var periods = data.result;
 +        var options = '<option value="">----------</option>';
 +        for (var i = 0; i < periods.length; i++) {
 +          options += '<option value="' + parseInt(periods[i].id) + '">' + periods[i].name + '</option>';
 +        }
 +        $("#id_period").html(options);
 +        $("#id_period option:first").attr('selected', 'selected');
 +        $("#id_period").attr('disabled', false);
 +        }
 +
 +    var update_professors = function(data){
 +        var professors = data.result;
 +        var options = '<option value="">----------</option>';
 +        for (var i = 0; i < professors.length; i++) {
 +          options += '<option value="' + parseInt(professors[i].id) + '">' + professors[i].last_name + ' ' + professors[i].first_name + '</option>';
 +        }
 +        $("#id_professor").html(options);
 +        $("#id_professor option:first").attr('selected', 'selected');
 +        $("#id_professor").attr('disabled', false);
 +        }
 +
 +
 +    $('#id_department').change(function() {
 +        var dep_id = $('#id_department option:selected').val();
 +        json([dep_id],'teleforma.get_dep_courses', update_courses);
 +        json([dep_id],'teleforma.get_dep_periods', update_periods);
 +        json([dep_id],'teleforma.get_dep_professors', update_professors);
 +        });
 +
 +});
 +
  </script>
  
- <script type="text/javascript">
- $(document).ready(function(){
-     InitChatWindow("{% url jqchat_ajax room.id %}", null);
-     });
- </script>
  {% endblock extra_javascript %}
  
  
index 16c896927418a869dfed25ba6a4405a9829c2c60,44793c31663670623a87746d36ccc62cbd36973f..dd8850f99e700510f16a16fcc1aa4163e0ad1e61
  {% endblock courses %}
  
  {% block course %}
  <div class="desk_center">
-     {% for c in courses %}
-      {% with c.course as course %}
-       {% for type in c.types %}
-       <div class="course">
-         <div class="course_title">{{ course.title }}{% if type.name != "None" %} - {{ type }}{% endif %}{% if course.description %} - {{ course.description }}{% endif %}
-         </div>
-         {% block conference %}
-          {% include "teleforma/inc/conference_list.html" %}
-         {% endblock %}
-         {% block media %}
-          {% include "teleforma/inc/media_list.html" %}
-         {% endblock %}
-         {% block document %}
-          {% with forloop.counter as type_counter %}
-           {% include "teleforma/inc/document_list.html" %}
-          {% endwith %}
-         {% endblock %}
-         </div>
-       {% endfor %}
-      {% endwith %}
-     {% endfor %}
+   {% if webclass and not webclass_slot and webclass_not_over %}
+   <div class="block important">
+     <p>
+       <strong>Vous n'êtes pas inscrit à la webclass de cette matière. </strong><a
+         href="{% url 'teleforma-webclass-appointments' webclass.id %}"
+         class="conference-big-button component_icon button icon_next">Cliquez-ici pour choisir un créneau horaire</a>
+     </p>
+   </div>
+   {% endif %}
+   <br /><br />
+   {% for c in courses %}
+   {% with c.course as course %}
+   {% for type in c.types %}
+   <div class="course">
+     <div class="course_title">{{ course.title }} - {{ type }}{% if course.description %} -
+       {{ course.description }}{% endif %}
+     </div>
+     {% if type.name == 'Quiz' %}
+     <div class="course_content">
+       {% if course.quiz.all %}
+       <table class="listing" width="100%">
+         <tbody>
+           {% for quiz in course.quiz.all %}
+           <td class="border-top"><a href="{% url 'quiz_start_page' slug=quiz.url %}">{{quiz.title}}</a></td>
+           <td class="border-top">{{quiz.description}}</td>
+           {% endfor %}
+         </tbody>
+       </table>
+       {% else %}
+       <p>Aucun quiz</p>
+       {% endif %}
+     </div>
+     {% else %}
+     {% if show_media %}
+     {% block conference %}
+     {% include "teleforma/inc/conference_list.html" %}
+     {% endblock %}
+     {% block media %}
+     {% include "teleforma/inc/media_list.html" %}
+     {% endblock %}
+     {% endif %}
+     {% block document %}
+     {% include "teleforma/inc/document_list.html" %}
+     {% endblock %}
+     {% endif %}
+   </div>
+   {% endfor %}
+   <div class="course">
+     <div class="course_title">{{ course.title }} - Webclass{% if course.description %} -
+       {{ course.description }}{% endif %}
+     </div>
+     {% block webclass %}
+     {% include "webclass/inc/webclass_list.html" %}
+     {% endblock %}
 -    
++
+   </div>
+   <div class="course">
+     <div class="course_title">{{ course.title }} - Corrections de copies{% if course.description %} -
+       {{ course.description }}{% endif %}
+     </div>
+     {% block webclass_corrections %}
+     {% include "webclass/inc/webclass_corrections_list.html" %}
+     {% endblock %}
+   </div>
+   {% endwith %}
+   {% endfor %}
  </div>
  {% endblock course %}
  
index 0fe58642d71791da92abc4b4049987b6da6806b1,720994b79e982649f073902d50d0fc43ff31d311..0117ebb07a138c090df5fa6e332f009462beb24d
  </div>
      <table class="listing" width="100%">
      <tbody>
-         {% for media in course.media.all|from_course_type:type|from_period:period %}
-          {% if media.is_published or user.is_staff and not list_view %}
-           {% if media.type == 'webm' %}
+         {% for conference in all_conferences %}
+           {% if conference.video %}
              <tr>
              <td {% if forloop.first %}class="border-top"{% endif %} width="230px" style="vertical-align:middle">
++<<<<<<< HEAD
 +            <a href="{% url teleforma-media-detail period.id media.id %}" title="{% trans "Play" %}">
 +            {% if media.item.related.all %}
 +             {% for related in media.item.related.all %}
 +              {% if related.title == "preview" %}
 +               {% thumbnail related.file "168x96" as im %}
 +                <div style="background: no-repeat url('{{ im.url|set_host:host }}') 0 1px; background-size: 100%; background-color: #dfdfdf;">
 +                 <img src="{{ STATIC_URL }}teleforma/images/play_168.png" width="100%" alt="{% trans 'Click here' %}" />
++=======
+             <a href="{% url 'teleforma-media-detail' period.id conference.video.id %}" title="{% trans "Play" %}">
+             {% if conference.video.poster_file %}
+                {% thumbnail conference.video.poster_file "168x96" as im %}
+                 <div style="background: no-repeat url('{{ im.url }}') 0 1px; background-size: 100%; background-color: #dfdfdf;">
+                  <img src="/static/teleforma/images/play_168.png" width="100%" alt="{% trans 'Click here' %}" />
++>>>>>>> feature/dj4.2
                  </div>
                 {% endthumbnail %}
-               {% endif %}
-              {% endfor %}
              {% else %}
-               {% trans 'Click here' %}
+               <div>{% trans 'Click here' %}</div>
              {% endif %}
+             {% comment %}<div>{% trans 'Click here' %}</div>{% endcomment %}
              </a>
              </td>
+             {% conference_publication conference as publication %}
              <td {% if forloop.first %}class="border-top"{% endif %} width="60%" style="padding-left: 1em;">
                  <div>
                      <dl class="listing" style="font-size: 1.2em;">
                      </dl>
                   </div>
              </td>
+             
              <td {% if forloop.first %}class="border-top"{% endif %} width="10%" align="center">
-             {% if media.is_published and user.is_staff %}
-              <img src="{{ STATIC_URL }}telemeta/images/ok.png" style="vertical-align:middle" alt="" title="{% trans ' published' %}" />
-             {% elif not media.is_published and user.is_staff %}
-              <img src="{{ STATIC_URL }}telemeta/images/delete.png" style="vertical-align:middle" alt="" title="{% trans ' rejected' %}" />
+             {% if user.is_staff or user.professor.count %}
+                 {% if publication.published %}
+                     <img src="/static/teleforma/images/ok.png" style="vertical-align:middle" alt="" title="{% trans ' published' %}" />
+                 {% else %}
+                     <img src="/static/teleforma/images/delete.png" style="vertical-align:middle" alt="" title="{% trans ' rejected' %}" />
+                 {% endif %}
              {% endif %}
++<<<<<<< HEAD
 +            {% if media.item.file %}
 +             <a href="{{ MEDIA_URL|set_host:host }}{{ media.item.file }}">
 +              <img src="{{ STATIC_URL }}teleforma/images/download_media.png" style="vertical-align:middle" alt="" title="{% trans "Download" %}" />
 +             </a>
++=======
+             {% if conference.video.file %}
+                 {% if not "video" in conference.video.mime_type or request.user_agent.os.family == 'iOS' %}
+                     <a href="{% url 'teleforma-media-download' period.id conference.video.id %}">
+                         <img src="/static/teleforma/images/download_media.png" style="vertical-align:middle" alt="" title="{% trans "Download" %}" />
+                     </a>
+                 {% endif %}
++>>>>>>> feature/dj4.2
              {% endif %}
              </td>
              </tr>
diff --cc teleforma/templates/telemeta/base.html
index eef9708cdd871f9e5283358943d1ae5839560b25,378acf7f021d135c0a1aa6e32725489fcd61c8fb..0000000000000000000000000000000000000000
deleted file mode 100644,100644
+++ /dev/null
@@@ -1,205 -1,258 +1,0 @@@
--<!DOCTYPE html>
--{% load i18n %}
--{% load telemeta_utils %}
--{% load teleforma_tags %}
 -{% comment %} {% get_googletools as googletools %}
 -{%  if googletools %}
 -{% load googletools %}
 -{% endif %} {% endcomment %}
--{% get_current_language as LANGUAGE_CODE %}
--{% get_available_languages as LANGUAGES %}
- <html xmlns="http://www.w3.org/1999/xhtml" lang="{{ LANGUAGE_CODE }}" xml:lang="{{ LANGUAGE_CODE }}" {% if LANGUAGE_BIDI %}dir="rtl"{% endif %}>
- <head>
 -<html xmlns="http://www.w3.org/1999/xhtml" lang="{{ LANGUAGE_CODE }}" xml:lang="{{ LANGUAGE_CODE }}" {% if LANGUAGE_BIDI %}dir="rtl"{% endif %}><head>
--<meta http-equiv="Content-type" content="text/html;charset=UTF-8" />
- <meta name="Viewport" content="width=device-width" />
 -<!--<meta name="Viewport" content="width=device-width" />
--<meta name="Viewport" content="initial-scale=1.0" />
--<meta name="Viewport" content="maximum-scale=1.5" />
- <meta name="Viewport" content="user-scalable=1" />
 -<meta name="Viewport" content="user-scalable=1" />-->
 -<meta name="viewport" content="width=device-width, initial-scale=1, maximum-scale=1">
--<meta name="apple-mobile-web-app-capable" content="yes" />
--<meta names="apple-mobile-web-app-status-bar-style" content="black-translucent" />
 -<link rel="icon" href="/static/teleforma/images/favicon.ico"/>
--
--<title>{%block head_title %}{% description %} - TeleForma{% endblock %}</title>
--
--{% block stylesheets %}
- <link rel="stylesheet" type="text/css" href="{{ STATIC_URL }}telemeta/css/telemeta.css" />
- <link rel="stylesheet" type="text/css" href="{{ STATIC_URL }}teleforma/css/teleforma.css" />
 -
 -
 -<link rel="stylesheet" type="text/css" href="/static/telemeta/css/telemeta.css" />
 -<link rel="stylesheet" type="text/css" href="/static/teleforma/css/teleforma.css" />
--
--<!--[if IE]>
- <link rel="stylesheet" type="text/css" href="{{ STATIC_URL }}telemeta/css/telemeta_ie.css" />
 -<link rel="stylesheet" type="text/css" href="/static/telemeta/css/telemeta_ie.css" />
--<![endif]-->
--<!--[if lte IE 6]>
- <link rel="stylesheet"type="text/css" href="{{ STATIC_URL }}telemeta/css/telemeta_ie6.css" />
 -<link rel="stylesheet"type="text/css" href="/static/telemeta/css/telemeta_ie6.css" />
--<![endif]-->
--{% endblock %}
--
--{% block extra_stylesheets %}{% endblock %}
--
--{% block javascript %}
- <script src="{% url django.views.i18n.javascript_catalog %}" type="text/javascript"></script>
- <script src="{{ STATIC_URL }}teleforma/js/jquery-1.6.min.js" type="text/javascript"></script>
- <script src="{{ STATIC_URL }}teleforma/js/jquery-ui.js" type="text/javascript"></script>
- <script src="{{ STATIC_URL }}teleforma/js/jquery.expander.min.js" type="text/javascript"></script>
- <script src="{{ STATIC_URL }}teleforma/js/messi.min.js" type="text/javascript"></script>
- <script src="{{ STATIC_URL }}teleforma/js/rainbowvis.js" type="text/javascript"></script>
- <script src="{{ STATIC_URL }}jqchat/jqchat.js" type="text/javascript" ></script>
- <script src="{{ STATIC_URL }}telemeta/js/locale.js" type="text/javascript"></script>
- <script src="{{ STATIC_URL }}telemeta/js/application.js" type="text/javascript"></script>
- <script src="{{ STATIC_URL }}teleforma/js/application.js" type="text/javascript"></script>
 -<script src="{% url 'django.views.i18n.javascript_catalog' %}" type="text/javascript"></script>
 -<script src="/static/teleforma/js/jquery-1.6.min.js" type="text/javascript"></script>
 -<script src="/static/teleforma/js/jquery-ui.js" type="text/javascript"></script>
 -<script src="/static/teleforma/js/jquery.expander.min.js" type="text/javascript"></script>
 -<script src="/static/teleforma/js/messi.min.js" type="text/javascript"></script>
 -<script src="/static/teleforma/js/rainbowvis.js" type="text/javascript"></script>
 -<script src="/static/jqchat/jqchat.js" type="text/javascript" ></script>
 -<script src="/static/telemeta/js/locale.js" type="text/javascript"></script>
 -<script src="/static/telemeta/js/application.js" type="text/javascript"></script>
 -<script src="/static/teleforma/js/application.js" type="text/javascript"></script>
--
--{% if user.is_authenticated %}
--<script type='text/javascript'>var CURRENT_USER_NAME="{{ user.username }}";</script>
--{% else %}
--<script type='text/javascript'>var CURRENT_USER_NAME=undefined;</script>
--{% endif %}
--
--{% block js-status %}
--{% get_telecaster as telecaster %}
--{%  if telecaster %}
- <script src="{{ STATIC_URL }}telecaster/js/application.js" type="text/javascript"></script>
 -<script src="/static/telecaster/js/application.js" type="text/javascript"></script>
--{% endif %}
--{% endblock js-status %}
--
--{% endblock %}
--
--{% block extra_javascript %}{% endblock %}
--</head>
--
--<body>
--{% block layout %}
--<div id="layout">
--
--{% block header %}
--<div id="header">
 -
 -
--
 -<div id="menu">
--<div id="logo_wrapper">
--<div id="logo">
- <img src="{{STATIC_URL}}teleforma/images/logo_pb.png" style="vertical-align:middle"
 -<img src="/static/teleforma/images/logo_pb.png" style="vertical-align:middle"
--alt="logo" />
--</div>
--</div>
- <div id="menu">
--{% block menu %}
--{# spaces between li and a elements breaks layout #}
--
--<ul id="nav">
--
-- {% if user.is_authenticated %}
--
--  {% if periods|length > 1 %}
--    <li><a href="#desk#" class="red">&nbsp;{% trans "Desk" %}&nbsp;</a>
--      <ul>
--       {% for period in periods %}
-         <li><a href="{% url teleforma-desk-period-list period.id %}" class="red">{{ period.name }}</a></li>
 -        <li><a href="{% url 'teleforma-desk-period-list' period.id %}" class="red">{{ period.name }}</a></li>
--       {% endfor %}
--      </ul>
--    </li>
--  {% else %}
-    <li><a href="{% url teleforma-home %}" class="red">{% trans "Desk" %}</a></li>
 -  {% with periods.0 as period %}
 -   <li><a href="{% url 'teleforma-desk-period-list' period.id %}" class="red">{% trans "Desk" %}</a></li>
 -  {% endwith %}
--  {% endif %}
--
-- {% else %}
-   <li><a href="{% url teleforma-login %}" class="red">{% trans "Home" %}</a></li>
 -  <li><a href="#accounts#" class="red">{% trans "Home" %}</a></li>
-- {% endif %}
--
-- {% if user.is_authenticated %}
--
-  <li><a href="{% url postman_inbox %}" class="orange">{% trans "Messaging" %}{% if postman_unread_count %} ({{ postman_unread_count }}){% endif %}</a></li>
 - <li><a href="{% url 'postman:inbox' %}" class="orange">{% trans "Messaging" %}{% if postman_unread_count %} ({{ postman_unread_count }}){% endif %}</a></li>
--
-  {% if user.is_staff %}
-   <li><a href="{% url teleforma-users 0 0 0 %}" class="yellow">{% trans "Users" %}</a></li>
-  {% else %}
-   <li><a href="{% url teleforma-annals %}" class="yellow">{% trans "Annals" %}</a></li>
-  {% endif %}
 -  <li><a href="{% url 'teleforma-annals' %}" class="yellow">{% trans "Annals" %}</a></li>
 -
 -  {% if periods|length == 1 %}
 -      <li><a href="{% url 'teleforma-exam-scripts-pending' periods.0.id %}" class="green">&nbsp;{% trans "Scripts" %}
 -      {% if user.is_staff or user.quotas.all %}{% untreated_scripts_count user periods.0.id %}
 -     {% else %}{% treated_scripts_count user periods.0.id %}{% endif %}</a>
 -     </li>
 -  {% else %}
 -    <li><a href="#scripts#" class="green">&nbsp;{% trans "Scripts" %}
 -     {% if user.is_staff or user.quotas.all %}{% untreated_scripts_count user periods.0.id %}
 -     {% else %}{% treated_scripts_count user periods.0.id %}{% endif %}</a>
 -      <ul>
 -       {% for period in periods %}
 -        <li><a href="{% url 'teleforma-exam-scripts-pending' period.id %}" class="green">{{ period.name }}</a></li>
 -       {% endfor %}
 -      </ul>
 -    </li>
 -  {% endif %}
 -
 -  {% if user.professor.count %}
 -    <li><a href="{% url 'teleforma-webclass-professor' %}" class="yellow">Webclass</a></li>
 -  {% endif %}
 -
 -  {% if periods|length == 1 %}
 -      <li><a href="{% url 'teleforma-exam-scripts-scores-all' periods.0.id %}" class="green">&nbsp;{% trans "Scores" %}</a></li>
 -  {% else %}
 -    <li><a href="#scores#" class="green">&nbsp;{% trans "Scores" %}</a>
 -      <ul>
 -        {% for period in periods %}
 -        <li><a href="{% url 'teleforma-exam-scripts-scores-all' period.id %}" class="green">{{ period.name }}</a></li>
 -        {% endfor %}
 -      </ul>
 -    </li>
 -  {% endif %}
--
-- {% if user.is_authenticated %}
-   {% if user.is_staff %}
-    <li><a href="#archives#" class="green">{% trans "Archives" %}</a>
-  <ul>
-  <li><a href="{% url telemeta-search-criteria %}">{% trans "Search" %}</a></li>
-  <li><a href="{% url telemeta-collections %}">{% trans "Collections" %}</a></li>
-  <li><a href="{% url telemeta-items %}">{% trans "Items" %}</a></li>
-  <li><a href="{% url teleforma-annals %}">{% trans "Annals" %}</a></li>
-  </ul>
-  </li>
-  <li><a href="{% url telemeta-admin-general %}" class="blue">{% trans "Admin" %}</a></li>
 -  {% if user.is_superuser %}
 -  <li><a href="/admin/" target="_blank" class="blue">{% trans "Admin" %}</a></li>
--  {% else %}
-    <li><a href="{% url teleforma-help %}" class="green">{% trans "Help" %}</a></li>
 -   <li><a href="{% url 'teleforma-help' %}" class="blue">{% trans "Help" %}</a></li>
-- {% endif %}
--
-  <li style="a.active{background-image:{{ STATIC_URL }}telemeta/images/user_tr_bk.png; background-repeat: no-repeat;
-     background-position: 1ex .5ex;}"><a href="#accounts#" class="blue">{% if user.first_name and user.last_name %}
-  {{ user.first_name }} {{ user.last_name }}
-  {% else %}
-  {{ user.username }}
-  {% endif %}</a>
 - {% if user.is_staff or user.is_superuser %}
 - <li style="a.active{background-image:/static/telemeta/images/user_tr_bk.png; background-repeat: no-repeat; background-position: 1ex .5ex;}">
 -    <a href="#accounts#" class="blue">{% if user.first_name and user.last_name %}{{ user.first_name }} {{ user.last_name }}{% else %}{{ user.username }}{% endif %}</a>
--    <ul>
-     <li><a href="{% url telemeta-profile-detail user.username %}" class="yellow">{% trans "Profile" %}</a></li>
 -    <li><a href="{% url 'telemeta-profile-detail' user.username %}" class="yellow">{% trans "Profile" %}</a></li>
--    {% if user.is_staff %}
-     <li><a href="{% url telemeta-desk-lists %}">{% trans "Lists" %}</a></li>
-     <li><a href="{% url teleforma-help %}">{% trans "Help" %}</a></li>
 -    <li><a href="{% url 'telemeta-desk-lists' %}">{% trans "Lists" %}</a></li>
 -    <li><a href="{% url 'teleforma-help' %}">{% trans "Help" %}</a></li>
--    {% endif %}
-     <li><a href="{% url telemeta-logout %}">{% trans "Sign out" %}</a></li>
 -    <li><a href="{% url 'telemeta-logout' %}">{% trans "Sign out" %}</a></li>
--    </ul>
-- </li>
 - {% else %}
 - <li><a href="{% url telemeta-profile-detail user.username %}" class="darkblue">{% trans "Profile" %}</a></li>
 - <li><a href="{% url telemeta-logout %}" class="black">{% trans "Sign out" %}</a></li>
 - {% endif %}
--
-- {% endif %}
--{% endif %}
--
--</ul>
--{% endblock menu %}
--</div>
--</div>
--
--{% endblock header %}
--
--<div id="content">
--
--        <table id="content_header"><tr>
--                <td class="leftcol"><h1>{% block title %}{% endblock %}</h1></td>
--                <td class="rightcol">{% block title_buttons %}{% endblock %}</td>
--        </tr></table>
--
--    {% block postman_menu %}
--    {% endblock postman_menu %}
--
 -    
 -    {% if messages %}
 -    <ul class="messages">
 -        {% for message in messages %}
 -            <li{% if message.tags %} class="{{ message.tags }}"{% endif %}>{{ message }}</li>
 -        {% endfor %}
 -    </ul>
 -    {% endif %}
 -    
--    {% block content %}
--    {% endblock %}
--
--    <div class="nett"></div>
--
--    {% block delete %}
--    {% endblock %}
--
--</div>
--
--{% block footer %}
--<div id="footer">
-- <hr />
-- <table width="100%">
--  <tr>
--   <td>
-     <a id="telemeta_powered" href="{% telemeta_url %}" target="_blank"><img src="{{ STATIC_URL }}telemeta/images/logo_mini_2.png" alt="Telemeta Powered"/></a>
 -    <a id="telemeta_powered" href="{% telemeta_url %}" target="_blank"><img src="/static/telemeta/images/logo_mini_2.png" alt="Telemeta Powered"/></a>
--    <p class="left">
--    {% trans "Powered by" %} <a href="http://parisson.com" target="_blank"><br /><strong>TeleForma {% teleforma_version %}</strong></a><br />
--    </p>
--   </td>
--   <td>
--    <p class="center">
--    </p>
--   </td>
--   <td>
--    <p class="right">
--    Copyright &copy; {% current_year %} {% organization %} |
-     <a href="{% url telemeta-flatpage "legal_notices" %}">{% trans "Legal notices" %}</a>
 -    <a href="{% url 'telemeta-flatpage' "legal_notices" %}">{% trans "Legal notices" %}</a>
--    </p>
--   </td>
--  </tr>
-- </table>
--</div>
--{% endblock %}
--
--</div>
--{% endblock layout %}
 -{% comment %} 
 -{% block analytics %}
 -{% analytics_code %}
 -{% endblock analytics %} {% endcomment %}
--
- <script type='text/javascript'>window.scrollTo(0, 1);</script>
 -<script type='text/javascript'>
 -window.scrollTo(0, 1);
 -
 -$(document).ready(function(){
 -  $("*").dblclick(function(e){
 -    e.preventDefault();
 -  });
 -});
 -
 -</script>
--
--</body>
--</html>
diff --cc teleforma/templates/telemeta/home.html
index c4186c30268f4bf34c4ebff2293709d04af90e1f,47fd6fe1c822d68c4fea24599dfceb0d6cb60cf2..0000000000000000000000000000000000000000
deleted file mode 100644,100644
+++ /dev/null
@@@ -1,29 -1,29 +1,0 @@@
--{% extends "telemeta/base.html" %}
--{% load telemeta_utils %}
--{% load i18n %}
--
--{% block content %}
--<div class="home-content">
--<div id="module-set">
--
--{% block modules %}
--
--{% with "Last changes" as title %}
--{% include "telemeta/inc/module_revisions.html" %}
--{% endwith %}
--
--{{ block.super }}
--
--{% endblock %}
--
--</div>
--
--<div class="home-description">
- <img class="align-left" src="{{ STATIC_URL }}telemeta/images/vox.png" alt="vox" style="vertical-align:middle;" />
 -<img class="align-left" src="/static/telemeta/images/vox.png" alt="vox" style="vertical-align:middle;" />
--{{ page_content|render_flatpage }}
--</div>
--
- <a href="{% url telemeta-login %}" class="component_icon button" id="action_red">{% trans "Connexion" %}</a>
 -<a href="{% url 'telemeta-login' %}" class="component_icon button" id="action_red">{% trans "Connexion" %}</a>
--
--</div>
--{% endblock %}
diff --cc teleforma/templates/telemeta/inc/module_revisions.html
index a8d503adc300bce0205460a03b7f548139920e90,2353b2b22200abc1871444c4f8c71e48cc21e382..0000000000000000000000000000000000000000
deleted file mode 100644,100644
+++ /dev/null
@@@ -1,49 -1,49 +1,0 @@@
--{% load telemeta_utils %}
--{% load i18n %}
--
--   <div class="module">
--
--    {% block rss_title %}
-       <a href="{% url telemeta-rss %}">
-       <img src="{{ STATIC_URL }}telemeta/images/rss.png" alt="rss" style="vertical-align:middle" />
 -      <a href="{% url 'telemeta-rss' %}">
 -      <img src="/static/telemeta/images/rss.png" alt="rss" style="vertical-align:middle" />
--      <h3>{% trans title %}</h3></a>
-       <a href="{% url telemeta-rss %}" style="float:right" class="icon_rss">&nbsp;&nbsp;</a>
 -      <a href="{% url 'telemeta-rss' %}" style="float:right" class="icon_rss">&nbsp;&nbsp;</a>
--    {% endblock rss_title %}
--
--    <div class="vscroll">
--    <table class="listing" bgcolor="#FFFFFF" style="width: 100%">
--      <tr>
--        <th class="highlight">{% trans "Date" %}</th>
--        <th>{% trans "Title" %}</th>
--        <th>{% trans "Type" %}</th>
--        <th>{% trans "User" %}</th>
--      </tr>
--    {% for r in revisions %}
--     <tr {% if not forloop.counter0|divisibleby:"2" %}class="odd"{% endif %}>
--        <td>{{ r.revision.time }}</td>
--        <td>
--        {% if r.element %}
--            {% if r.revision.element_type == "corpus" or r.revision.element_type == "fonds"%}
-             <a href="{% url telemeta-resource-detail r.revision.element_type r.element.public_id %}">{{ r.element.title }}</a>
 -            <a href="{% url 'telemeta-resource-detail' r.revision.element_type r.element.public_id %}">{{ r.element.title }}</a>
--            {% endif %}
--            {% if r.revision.element_type == "collection" %}
-             <a href="{% url telemeta-collection-detail r.element.public_id %}">{{ r.element.title }}</a>
 -            <a href="{% url 'telemeta-collection-detail' r.element.public_id %}">{{ r.element.title }}</a>
--            {% endif %}
--            {% if r.revision.element_type == "item" %}
-             <a href="{% url telemeta-item-detail r.element.public_id %}">
 -            <a href="{% url 'telemeta-item-detail' r.element.public_id %}">
--            {% if r.element.title != '' %}{{ r.element.title }}{% else %}{{ r.element.collection.title }} - {{ r.element.track }}{% endif %}</a>
--            {% endif %}
--            {% if r.revision.element_type == "marker" %}
-             <a href="{% url telemeta-item-detail-marker r.element.public_id %}">{{ r.element.title }}</a>
 -            <a href="{% url 'telemeta-item-detail-marker' r.element.public_id %}">{{ r.element.title }}</a>
--            {% endif %}
--        {% else %}
--            {% trans "deleted" %}
--        {% endif %}
--        </td>
--        <td>{{ r.revision.element_type }}</td>
-         <td>{% if r.revision.user %}<a href="{% url telemeta-profile-detail r.revision.user.username %}">{{ r.revision.user.username }}</a>{% endif %}</td>
 -        <td>{% if r.revision.user %}<a href="{% url 'telemeta-profile-detail' r.revision.user.username %}">{{ r.revision.user.username }}</a>{% endif %}</td>
--      </tr>
--    {% endfor %}
--    </table>
--    </div>
--   </div>
diff --cc teleforma/templates/telemeta/inc/module_user_revisions.html
index e066fcc857f46b9a0c23eb83469b2dc99a08ebd7,669cd9ddefdcbbc034802f8b252a2db151f2e7e1..0000000000000000000000000000000000000000
deleted file mode 100644,100644
+++ /dev/null
@@@ -1,11 -1,11 +1,0 @@@
--{% extends "telemeta/inc/module_revisions.html" %}
--{% load telemeta_utils %}
--{% load i18n %}
--
--{% block rss_title %}
- <a href="{% url telemeta-user-rss user.username %}">
- <img src="{{ STATIC_URL }}telemeta/images/rss.png" alt="rss" style="vertical-align:middle" />
 -<a href="{% url 'telemeta-user-rss' user.username %}">
 -<img src="/static/telemeta/images/rss.png" alt="rss" style="vertical-align:middle" />
--<h3>{% trans title %}</h3></a>
- <a href="{% url telemeta-user-rss user.username %}" style="float:right" class="icon_rss">&nbsp;&nbsp;</a>
 -<a href="{% url 'telemeta-user-rss' user.username %}" style="float:right" class="icon_rss">&nbsp;&nbsp;</a>
--{% endblock rss_title %}
--
index b2f8a36a7d39fa02e82c9d5d34117228eb52cc56,ba5afa06fa5e3ca9d0c7307c578b9e649a33777c..2e3154d9e221db11387adb799841ba885ef194e1
@@@ -186,23 -278,235 +278,247 @@@ def get_audio_id(media)
              return m.id
      return
  
  @register.filter
  def get_video_id(media):
-     medias = media.conference.media.all()
-     for m in medias:
-         if 'video' in m.mime_type:
-             return m.id
+     if media.conference:
+         medias = media.conference.media.all()
+         for m in medias:
+             if 'video' in m.mime_type:
+                 return m.id
      return
  
  @register.filter
 +def set_host(url, host):
 +    u = urlparse(url)
 +    return u.scheme + '://' + host + ':' + str(u.port) + u.path
 +
 +@register.tag
 +def random_hash(parser, token):
 +    return RandomHash()
 +
 +class RandomHash(template.Node):
 +    def render(self, context):
 +        return get_random_hash()
++
+ def get_host(url, host):
+     try:
+         #TODO adapt to urllib py3
+         # https://stackoverflow.com/questions/12772190/urllib-module-object-is-not-callable
+         u = urlparse(url)
+         if host == '127.0.0.1' or host == 'localhost':
+             nu = u.scheme + '://' + host + ':' + str(u.port) + u.path
+             return nu
+     except:
+         return url
+ @register.filter
+ def published(doc):
+     if doc:
+         return doc.filter(is_published=True)
+ def scripts_count(user, period, statuses):
+     if not period:
+         return ''
+     Q1 = Q(author=user)
+     Q2 = Q(corrector=user)
+     scripts = Script.objects.filter(Q1 | Q2).filter(status__in=statuses,
+                                                     period=period)
+     if scripts:
+         return ' (' + str(len(scripts)) + ')'
+     else:
+         return ''
+ @register.simple_tag
+ def untreated_scripts_count(user, period):
+     return scripts_count(user, period, (3,))
+ @register.simple_tag
+ def treated_scripts_count(user, period):
+     return scripts_count(user, period, (4,))
+ @register.simple_tag
+ def get_training_profile(user):
+     text = ''
+     if user:
+         student = user.student.all()
+         if student:
+             student = student[0]
+             if student.platform_only:
+                 text += 'Internaute - '
+             for training in student.trainings.all():
+                 text += str(training) + ' '
+     return text
+ @register.inclusion_tag('teleforma/inc/newsitems_portlet.html', takes_context=True)
+ def newsitems_portlet(context, course_id, period_id):
+     request = context['request']
+     user = request.user
+     def get_data(newsitem):
+         return {
+             'id': newsitem.id,
+             'title': newsitem.title,
+             'text': newsitem.text,
+             'creator': newsitem.creator,
+             'created': newsitem.created,
+             'can_edit': newsitem.can_edit(request),
+             'can_delete': newsitem.can_delete(request),
+         }
+     course = get_object_or_404(Course, id=course_id)
+     course_newsitems = [get_data(news) for news in NewsItem.objects.filter(
+         deleted=False, course__id=course_id, period_id=period_id).order_by('-created')]
+     all_newsitems = [get_data(news) for news in NewsItem.objects.filter(
+         deleted=False, period_id=period_id).order_by('-created')]
+     can_add = False
+     if user.is_staff or user.professor.count():
+         can_add = True
+     return {
+         'can_add': can_add,
+         'course': course,
+         'period_id': period_id,
+         'course_newsitems': course_newsitems,
+         'all_newsitems': all_newsitems
+     }
+ @register.simple_tag
+ def description():
+     return settings.TELEFORMA_DESCRIPTION
+ @register.simple_tag
+ def organization():
+     return settings.TELEFORMA_ORGANIZATION
+ @register.simple_tag
+ def current_year():
+     return datetime.datetime.now().strftime("%Y")
+ @register.filter
+ def render_flatpage(content):
+     parsed = ""
+     path = getattr(content, 'path', '')
+     if isinstance(content, str):
+         content = content.split("\n")
+     for line in content:
+         match = re.match(
+             '^(\.\. *(?:_[^:]*:|(?:\|\w+\|)? *image::) *)([^ ]+) *$', line)
+         if match:
+             directive, urlname = match.groups()
+             line = directive
+             try:
+                 i = urlname.index('teleforma-')
+             except ValueError:
+                 i = -1
+             if i == 0:
+                 line += reverse(urlname)
+             elif urlname[:1] != '/':
+                 line += reverse('teleforma-flatpage',
+                                 args=[path + '/../' + urlname])
+             else:
+                 line += urlname
+         parsed += line + "\n"
+     parts = publish_parts(source=smart_str(
+         parsed), writer_name="html4css1", settings_overrides={})
+     return mark_safe('<div class="rst-content">\n' + force_str(parts["html_body"]) + '</div>')
+ render_flatpage.is_safe = True
+ @register.inclusion_tag('teleforma/inc/chat_room.html', takes_context=True)
+ def chat_room(context, period=None, course=None):
+     """ display chat room """
+     # conditionnaly show chat
+     if not getattr(settings, 'ENABLE_CHAT', True):
+         return {'show':False}
+     room_name = ChatMessage.get_room_name(period, course)
+     if course:
+         room_title = course.title_tweeter or course.title
+     else:
+         room_title = period.name
+     return {
+         'show': True,
+         'data': {
+             'room_name': room_name,
+             'room_title': room_title,
+             'user_id': context.request.user.id
+         }
+     }
+ @register.simple_tag(takes_context=True)
+ def course_docs_by_type(context):
+     course = context['course']
+     period = context['period']
+     periods = [period,]
+     if period.corrections_from and course.corrections_shared and context['type'].id == settings.CORRECTIONS_COURSE_TYPE_ID:
+         periods.append(period.corrections_from)
+     docs = course.document.filter(is_published=True,
+                                   periods__in=periods,
+                                   course_type=context['type']).distinct()
+     res = []
+     by_types = defaultdict(list)
+     for doc in docs:
+         by_types[doc.type].append(doc)
+     for doc_type in context['doc_types']:
+         docs = by_types[doc_type]
+         if docs:
+             res.append((doc_type, docs))
+     return res
+ @register.simple_tag(takes_context=True)
+ def course_ingoing_conferences(context):
+     course = context['course']
+     confs = course.conference.filter(streaming=True,
+                                      period=context['period'],
+                                      course_type=context['type'])
+     return list(confs)
+ @register.simple_tag(takes_context=True)
+ def course_past_conferences(context):
+     user = context['user']
+     if user.is_staff or user.professor.count():
+         status_min = 2
+     else:
+         status_min = 3
+     course = context['course']
+     period = context['period']
+     course_type = context['type']
+     return get_course_conferences(period, course, course_type, status_min=status_min)
+ @register.simple_tag(takes_context=True)
+ def conference_publication(context, conference):
+     period = context['period']
+     return conference.publication_info(period)
+ @register.simple_tag(takes_context=True)
+ def generate_msg_id(context, message):
+     mid = message.id
+     return generate_hash(mid)
+ # @register.simple_tag(takes_context=True)
+ # def course_media(context):
+ #     course = context['course']
+ #     media = course.media.filter(period=context['period'],
+ #                                 course_type=context['type'])
+ #     if not context['user'].is_staff or context.get('list_view', None):
+ #         media = media.filter(is_published = True)
+ #     return list(media)
index d43eacbf953b483e7be03b188253fa14df7db763,b742daabf9dce5aeba27e76ad0c097ee4ce94b4b..cfb69371fc3337e1a8d449a77922b9496734c49d
  # Authors: Guillaume Pellerin <yomguy@parisson.com>
  
  
- from teleforma.views.core import *
+ from ..models.core import Course, CourseType
+ from .core import format_courses
  
  
 +def format_ae_courses(courses, course=None, queryset=None, types=None, admin=False):
 +    if queryset:
 +        for c in queryset:
 +            if c and (c.code != 'X' or admin == True):
 +                courses.append({'course': c, 'types': c.types.all(),
 +                'date': c.date_modified, 'number': c.number})
 +    elif course:
 +        if course.code != 'X' or admin == True:
 +            courses.append({'course': course, 'types': course.types.all(),
 +            'date': course.date_modified, 'number': course.number})
 +
 +    return courses
 +
 +
  def get_ae_courses(user, date_order=False, num_order=False):
      courses = []
  
index 55f08831b3c10ec21032964236c1d502e9406260,99ee63ef673f0508e29e03aba5774c6703c9e72b..e648e1cf977e2a70d639dd8066676d54c82d7b30
  #
  # Authors: Guillaume Pellerin <yomguy@parisson.com>
  
- import mimetypes
  import datetime
- import random
- import urllib
- import urllib2
- import json
- from jsonrpc import jsonrpc_method
+ import os
+ import requests
+ from html import escape
+ from io import BytesIO
+ import logging
  
- from django.utils.decorators import method_decorator
- from django.contrib.auth import authenticate, login, get_backends
- from django.template import RequestContext, loader
- from django import template
- from django.http import HttpResponse, HttpResponseRedirect
- from django.http import Http404
- from django.shortcuts import render_to_response, redirect, get_object_or_404
- from django.views.generic import *
- from django.views.generic.base import *
  from django.conf import settings
- from django.contrib import auth
  from django.contrib import messages
  from django.contrib.auth.decorators import login_required, permission_required
- from django.core.context_processors import csrf
- from django.forms.models import modelformset_factory, inlineformset_factory
  from django.contrib.auth.models import User
- from django.utils.translation import ugettext
- from django.utils.translation import ugettext_lazy as _
- from django.contrib.auth.forms import UserChangeForm
- from django.core.exceptions import ObjectDoesNotExist
- from django.contrib.syndication.views import Feed
- from django.core.paginator import Paginator
- from django.contrib.auth.decorators import login_required
  from django.contrib.contenttypes.models import ContentType
- from django.core.urlresolvers import reverse, reverse_lazy
- from jsonrpc.proxy import ServiceProxy
- from teleforma.models import *
- from teleforma.forms import *
- from telemeta.views import *
- import jqchat.models
- from xlwt import Workbook
+ from django.http import Http404, HttpResponse, HttpResponseRedirect
+ from django.http.response import StreamingHttpResponse
+ from django.shortcuts import redirect
+ from django.shortcuts import get_object_or_404
+ from django.contrib.sites.shortcuts import get_current_site
+ from django.template import loader
+ from django.urls import reverse
+ from django.utils.decorators import method_decorator
+ from django.utils.translation import gettext, gettext_lazy as _
+ from django.views.decorators.csrf import csrf_exempt
+ from django.views.generic.base import TemplateResponseMixin, TemplateView, View
+ from django.views.generic.detail import DetailView
 +from django.views.generic.edit import FormView
+ from django.views.generic.list import ListView
+ from django.core.cache import cache
  
- try:
-     from telecaster.models import *
-     from telecaster.tools import *
- except:
-     pass
+ from jsonrpc import jsonrpc_method
+ from jsonrpc.proxy import ServiceProxy
  
+ from rest_framework.permissions import IsAuthenticated
+ from rest_framework.response import Response
+ from rest_framework.views import APIView
+ from teleforma.models.crfpa import Home, Student, Training
+ from teleforma.models.notification import Notification, notify
+ from teleforma.utils import guess_mimetypes
+ from ..decorators import access_required
+ from ..models.appointment import Appointment, AppointmentPeriod
+ from ..models.chat import ChatMessage
+ from ..models.core import (Conference, ConferencePublication, Course, CourseType, Department,
+                            Document, DocumentType, Media, MediaTranscoded,
+                            Organization, Period, Professor, WebClassGroup,
+                            StreamingServer, LiveStream,
+                            get_user_role)
+ from ..webclass.models import Webclass, WebclassRecord
+ from .pages import get_page_content
++from ..forms import ConferenceForm
+ import weasyprint
+ logger = logging.getLogger('teleforma')
  
 -
  def format_courses(courses, course=None, queryset=None, types=None):
      if queryset:
          for c in queryset:
@@@ -204,32 -374,9 +375,31 @@@ class PeriodAccessMixin(View)
  
      @jsonrpc_method('teleforma.get_period_list')
      def get_period_list(request, department_name):
-         department = Department.objects.get(name=department.name)
-         return [period.name for period in Period.objects.filter(department=department)]
 -        department = Department.objects.get(name=department_name)
+         return [period.name for period in Period.objects.filter(department=department, is_open=True)]
  
 +    def pull(request, organization_name):
 +        from teleforma.models import Organization, Department
 +        organization = Organization.objects.get(name=organization_name)
 +        departments = Department.objects.filter(organization=organization)
 +        periods_new = []
 +
 +        for department in departments:
 +            url = 'https://' + department.domain + '/json/'
 +            s = ServiceProxy(url)
 +            remote_list = s.teleforma.get_period_list(department.name)
 +            if remote_list['result']:
 +                for period_name in remote_list['result']:
 +                    period, c = Period.objects.get_or_create(
 +                                    name=period_name,
 +                                    department=department)
 +                    periods_new.append(period)
 +                    print(period)
 +
 +        # cleanup
 +        for period in Period.objects.all():
 +            if not period in periods_new:
 +                period.delete()
 +
  
  class CourseAccessMixin(PeriodAccessMixin):
  
@@@ -246,13 -404,91 +427,90 @@@ class CourseListView(CourseAccessMixin
  
      def get_context_data(self, **kwargs):
          context = super(CourseListView, self).get_context_data(**kwargs)
-         context['notes'] = Note.objects.filter(author=self.request.user)
-         context['room'] = get_room(name='site', period=context['period'].name)
-         context['doc_types'] = DocumentType.objects.all()
          context['list_view'] = True
-         context['courses'] = sorted(context['all_courses'], key=lambda k: k['date'], reverse=True)[:1]
 -
+         courses = [course['course'] for course in context['all_courses']]
+         # get last published media / document
+         last_published = []
+         last_media = Media.objects.filter(
+             period=self.period, is_published=True, course__in=courses).order_by("-date_added").first()
+         if last_media:
+             last_published.append(last_media)
+         last_document = Document.objects.filter(
+             periods=self.period, is_published=True, course__in=courses).order_by("-date_added").first()
+         if last_document:
+             last_published.append(last_document)
+         if last_published:
+             last_published = sorted(
+                 last_published, key=lambda k: k.date_added, reverse=True)[0]
+             # get course with the latest published media / document
+             for course in context['all_courses']:
+                 if course['course'].id == last_published.course.id:
+                     break
+             context['courses'] = [course]
+         else:
+             # get course with the latest "date"
+             context['courses'] = sorted(
+                 context['all_courses'], key=lambda k: k['date'], reverse=True)[:1]
          user = self.request.user
          is_student = user.student.all().count()
+         # appointments_open = False
+         appointments = []
+         if is_student:
+             available_courses = [course['course']
+                                  for course in context['all_courses']]
+             for appointment in AppointmentPeriod.objects.filter(periods=context['period'], course__in=available_courses):
+                 if appointment.is_open:
+                     found = False
+                     for existing in appointments:
+                         if existing.course == appointment.course:
+                             found = True
+                     if not found:
+                         appointments.append(appointment)
+         context['appointments'] = appointments
+         # check if user appointment is next
+         user_appointment = Appointment.objects.filter(
+             student=user, slot__mode='distance', slot__appointment_period__periods=context['period'])
+         if user_appointment:
+             user_appointment = user_appointment[0]
+             now = datetime.datetime.now()
+             # now = datetime.datetime(2020, 10, 29, 9, 00)
+             if user_appointment.real_date - datetime.timedelta(hours=1) < now < user_appointment.real_date + datetime.timedelta(hours=1):
+                 context['current_appointement'] = user_appointment
+         homes = Home.objects.filter(enabled=True).order_by('-modified_at')
+         for home in homes:
+             if home.is_for_period(context['period']):
+                 context['home_title'] = home.visible_title
+                 context['home_text'] = home.text
+                 context['home_video'] = home.video
+                 break
+         if is_student:
+             student = user.student.all()[0]
+             slots = []
+             to_subscribe = []
+             student_courses = [course['course']
+                                for course in get_courses(user)]
+             for webclass in Webclass.published.filter(period=self.period, iej=student.iej, course__in=student_courses):
+                 # if webclass.course not in student_courses:
+                 #     continue
+                 if student.platform_only and not webclass.allow_elearning:
+                     continue
+                 if not student.platform_only and not webclass.allow_presentiel:
+                     continue
+                 if not webclass.is_not_over():
+                     continue
+                 slot = webclass.get_slot(user)
+                 if slot and slot.status in ('almost', 'ingoing'):
+                     slots.append(slot)
+                 if not slot:
+                     to_subscribe.append(webclass)
+             context['webclass_slots'] = slots
+             context['webclass_to_subscribe'] = to_subscribe
+             context['restricted'] = student.restricted
          return context
  
      @method_decorator(login_required)
  
      @jsonrpc_method('teleforma.get_course_type_list')
      def get_course_type_list(request):
 +        from teleforma.models import CourseType
          return [course_type.to_dict() for course_type in CourseType.objects.all()]
  
 -    def pull(request, organization_name, department_name):
 +    def pull(request, organization_name):
 +        from teleforma.models import Organization, Department
          organization = Organization.objects.get(name=organization_name)
 -        department = Department.objects.get(
 -            name=department_name, organization=organization)
 -        url = 'http://' + department.domain + '/json/'
 -        s = ServiceProxy(url)
 +        departments = Department.objects.filter(organization=organization)
 +        courses_new = []
 +        course_types_new = []
  
 -        remote_list = s.teleforma.get_course_list(
 -            organization_name, department.name)
 -        for course_dict in remote_list['result']:
 -            course = Course.objects.filter(code=course_dict['code'])
 -            if not course:
 -                course = Course()
 -            else:
 -                course = course[0]
 -            course.from_dict(course_dict)
 -
 -        remote_list = s.teleforma.get_course_type_list()
 -        if remote_list['result']:
 -            for course_type_dict in remote_list['result']:
 -                course_type = CourseType.objects.filter(
 -                    name=course_type_dict['name'])
 -                if not course_type:
 -                    course_type = CourseType()
 -                else:
 -                    course_type = course_type[0]
 -                course_type.from_dict(course_type_dict)
 +        for department in departments:
 +            url = 'https://' + department.domain + '/json/'
 +            s = ServiceProxy(url)
 +
 +            remote_list = s.teleforma.get_course_list(organization_name, department.name)
 +            if remote_list['result']:
 +                for course_dict in remote_list['result']:
 +                    course, c = Course.objects.get_or_create(
 +                                    code=course_dict['code'],
 +                                    department=department,
 +                                )
 +                    course.from_dict(course_dict)
 +                    courses_new.append(course)
 +                    print(course)
 +
 +            remote_list = s.teleforma.get_course_type_list()
 +            print(remote_list)
 +            if remote_list['result']:
 +                for course_type_dict in remote_list['result']:
 +                    course_type, c = CourseType.objects.get_or_create(name=course_type_dict['name'])
 +                    course_type.from_dict(course_type_dict)
 +                    course_types_new.append(course_type)
 +                    print(url)
 +                    print(course_type)
 +
 +        # cleanup
 +        for course in Course.objects.all():
 +            if not course in courses_new:
 +                course.delete()
 +        for course_type in CourseType.objects.all():
 +            if not course_type in course_types_new:
 +                course_type.delete()
  
      @jsonrpc_method('teleforma.get_dep_courses')
      def get_dep_courses(request, id):
          department = Department.objects.get(id=id)
@@@ -333,18 -556,72 +591,72 @@@ class CourseView(CourseAccessMixin, Det
          courses = []
          for c in context['all_courses']:
              if c['course'] == course:
-                 courses = format_courses(courses, course=course, types=c['types'])
+                 courses = format_courses(
+                     courses, course=course, types=c['types'])
          context['courses'] = courses
          # context['notes'] = course.notes.all().filter(author=self.request.user)
-         content_type = ContentType.objects.get(app_label="teleforma", model="course")
-         context['room'] = get_room(name=course.code, period=context['period'].name,
-                                    content_type=content_type,
-                                    id=course.id)
-         context['doc_types'] = DocumentType.objects.all()
+         content_type = ContentType.objects.get(
+             app_label="teleforma", model="course")
+         # webclass
+         webclass = None
+         webclass_slot = None
+         student = self.request.user.student.all()
+         if student:
+             student = student[0]
+         if student:
+             try:
+                 webclass = Webclass.published.filter(
+                     period=self.period, course=course, iej=student.iej)[0]
+             except IndexError:
+                 pass
+             if webclass:
+                 if student.platform_only and not webclass.allow_elearning:
+                     webclass = None
+                 elif not student.platform_only and not webclass.allow_presentiel:
+                     webclass = None
+                 else:
+                     webclass_slot = webclass.get_slot(self.request.user)
+         context['webclass'] = webclass
+         context['webclass_slot'] = webclass_slot
+         context['webclass_not_over'] = webclass and webclass.is_not_over()
+         records = {}
+         period = context['period']
+         try:
+             records = WebclassRecord.get_records(period, course)
+         except Exception as e:
+             print(e)
+             context['webclass_error'] = True
+         context['webclass_records'] = records.get(WebclassRecord.WEBCLASS)
+         context['webclass_corrections_records'] = records.get(WebclassRecord.CORRECTION, [])
          return context
  
-     @method_decorator(login_required)
+     @method_decorator(access_required)
      def dispatch(self, *args, **kwargs):
 -        
++
+         # redirect to a retractation page if the student has paid in the 14 last days
+         student = None
+         # import pdb;pdb.set_trace()
+         try:
+             student = self.request.user.student.get()
+         except Student.DoesNotExist:
+             pass
+         if student and student.total_fees and not student.stop_retractation:
+             if student.total_fees:
+                 two_week_ago = None
+                 two_week_ago = datetime.datetime.now() - datetime.timedelta(days=14)
+                 old_payments = student.payments.filter(date_paid__lt=two_week_ago).count()
+                 if old_payments:
+                     student.stop_retractation = True
+                     student.stop_retractation_date = datetime.datetime.now()
+                     student.save()
+                 else:
+                     payment_in_retractation_period = student.payments.filter(date_paid__gte=two_week_ago).count()
+                     if payment_in_retractation_period:
+                         return HttpResponseRedirect(reverse('teleforma-desk-period-course-retractation', kwargs={'period_id': kwargs['period_id'], 'pk': kwargs['pk']}))
 -            
++
          return super(CourseView, self).dispatch(*args, **kwargs)
  
      @jsonrpc_method('teleforma.get_course_media_urls')
@@@ -524,10 -882,70 +917,56 @@@ class ConferenceView(CourseAccessMixin
  
      @jsonrpc_method('teleforma.stop_conference')
      def stop(request, public_id):
 -            conference = Conference.objects.get(public_id=public_id)
 -            conference.date_end = datetime.datetime.now()
 -            conference.save()
 -            for stream in conference.livestream.all():
 -                stream.delete()
 -            if 'telecaster' in settings.INSTALLED_APPS:
 -                for station in conference.station.all():
 -                    station.started = False
 -                    station.save()
 -                    station.stop()
 -                    try:
 -                        url = 'https://' + conference.department.domain + '/json/'
 -                        s = ServiceProxy(url)
 -                        s.teleforma.stop_conference(conference.public_id)
 -                    except:
 -                        pass
 +        conference = Conference.objects.get(public_id=public_id)
 +        conference.stop()
  
-     @method_decorator(login_required)
+     @jsonrpc_method('teleforma.create_conference')
+     def create(request, conf_dict):
+         if isinstance(conf_dict, dict):
+             conferences = Conference.objects.filter(public_id=conf_dict['id'])
+             if not conferences:
+                 conference = Conference()
+                 conference.from_json_dict(conf_dict)
+                 conference.save()
+                 if conference.streaming:
+                     for stream in conf_dict['streams']:
+                         host = getattr(
+                             settings, "TELECASTER_LIVE_STREAMING_SERVER", stream['host'])
+                         protocol = getattr(
+                             settings, "TELECASTER_LIVE_STREAMING_PROTOCOL", 'http')
+                         server_type = stream['server_type']
+                         stream_type = stream['stream_type']
+                         if server_type == 'icecast':
+                             port = getattr(
+                                 settings, "TELECASTER_LIVE_ICECAST_STREAMING_PORT", '8000')
+                             path = getattr(
+                                 settings, "TELECASTER_LIVE_ICECAST_STREAMING_PATH", '/')
+                         elif server_type == 'stream-m':
+                             port = getattr(
+                                 settings, "TELECASTER_LIVE_STREAM_M_STREAMING_PORT", '8080')
+                             path = getattr(
+                                 settings, "TELECASTER_LIVE_STREAM_M_STREAMING_PATH", '/')
+                         server, c = StreamingServer.objects.get_or_create(
+                             protocol=protocol,
+                             host=host,
+                             port=port,
+                             path=path,
+                             type=server_type)
+                         stream = LiveStream(conference=conference, server=server,
+                                             stream_type=stream_type, streaming=True)
+                         stream.save()
+                     if not conference.web_class_group and settings.TELECASTER_LIVE_TWEETER:
+                         try:
+                             site = get_current_site(request)
+                             live_message(site, conference)
+                         except:
+                             pass
+         else:
+             raise 'Error : input must be a conference dictionnary'
+     @method_decorator(access_required)
      def dispatch(self, *args, **kwargs):
          return super(ConferenceView, self).dispatch(*args, **kwargs)
  
@@@ -564,139 -983,90 +1004,194 @@@ class ConferenceListView(View)
                  s.teleforma.create_conference(conference.to_json_dict())
  
  
- def live_message(conference):
-         from jqchat.models import Message
-         user, c = User.objects.get_or_create(username='bot')
-         content_type = ContentType.objects.get(app_label="teleforma", model="course")
-         room = get_room(name=conference.course.code, period=conference.period.name,
-                            content_type=content_type,
-                            id=conference.course.id)
-         text = _("A new live conference has started : ")
-         text += 'https://' + Site.objects.all()[0].domain + reverse('teleforma-conference-detail',
-                        kwargs={'period_id': conference.period.id, 'pk': conference.id})
-         message = Message.objects.create_message(user, room, text)
+ @method_decorator(csrf_exempt, name='dispatch')
+ class ChatMessageView(APIView):
+     permission_classes = [IsAuthenticated]
+     # deprecated
+     def get(self, request):
+         """
+         Get last 100 messages, in json
+         You need to provide a room_name in request
+         """
+         messages = [message.to_dict() for message in ChatMessage.objects.filter(
+             room_name=request.GET['room_name']).order_by('-created')[:100]]
+         messages = messages[::-1]
+         return Response(messages)
  
 -    def post(self, request):
 -        """
 -        Send a chat message
 -        You can pass either : 
 -        - a conference id 
 -        - a room name and a message
 -        """
 -        room_name = request.POST.get('room_name')
 -        message = request.POST.get('message')
 -        if not room_name:
 -            conference = Conference.objects.get(
 -                id=request.POST.get('conference_id'))
 -            ChatMessage.live_conference_message(conference=conference)
 +
 +class ConferenceRecordView(FormView):
 +    "Conference record form : telecaster module required"
 +
 +    model = Conference
 +    form_class = ConferenceForm
 +    template_name='teleforma/course_conference_record.html'
 +    hidden_fields = ['started', 'date_begin', 'date_end', 'public_id', 'readers']
 +
 +    def get_context_data(self, **kwargs):
 +        context = super(ConferenceRecordView, self).get_context_data(**kwargs)
 +        context['mime_type'] = 'video/webm'
 +        status = Status()
 +        status.update()
 +        context['hidden_fields'] = self.hidden_fields
 +        context['room'] = get_room(name='monitor')
 +        return context
 +
 +    def get_success_url(self):
 +        return reverse('teleforma-conference-detail', kwargs={'period_id': self.conference.period.id,
 +                                                              'pk':self.conference.id})
 +
 +    def form_valid(self, form):
 +        form.save()
 +        uuid = get_random_hash()
 +        conference = form.instance
 +        conference.date_begin = datetime.datetime.now()
 +        conference.public_id = uuid
 +        conference.save()
 +        self.conference = conference
 +        status = Status()
 +        status.get_hosts()
 +
 +        if conference.streaming:
 +            stations = settings.TELECASTER_CONF
 +        else:
 +            stations = settings.TELECASTER_CONF_NO_STREAMING
 +
 +        for station in stations:
 +            type = station['type']
 +            conf = station['conf']
 +            port = station['port']
 +            server_type = station['server_type']
 +            server, c = StreamingServer.objects.get_or_create(host=status.ip, port=port, type=server_type)
 +            station = Station(conference=conference, public_id=uuid)
 +            station.setup(conf)
 +            try:
 +                station.start()
 +            except:
 +                continue
 +            station.save()
 +            stream = LiveStream(conference=conference, server=server,
 +                            stream_type=type, streaming=True)
 +            stream.save()
 +            if server_type == 'stream-m':
 +                try:
 +                    self.snapshot('http://localhost:8080/snapshot/monitor', station.output_dir)
 +                except:
 +                    pass
 +        if conference.streaming:
 +            try:
 +                live_message(self.conference)
 +            except:
 +                pass
 +
 +        try:
 +            self.push()
 +        except:
 +            pass
 +
 +        return super(ConferenceRecordView, self).form_valid(form)
 +
 +    def snapshot(self, url, dir):
 +        width = 160
 +        height = 90
 +        img = urllib.urlopen(url)
 +        path = dir + os.sep + 'preview.webp'
 +        f = open(path, 'w')
 +        f.write(img.read())
 +        f.close()
 +        command = 'dwebp "' + path + '" -o "' + dir + os.sep + 'preview.png" &'
 +        os.system(command)
 +
 +    @method_decorator(login_required)
 +    def dispatch(self, *args, **kwargs):
 +        return super(ConferenceRecordView, self).dispatch(*args, **kwargs)
 +
 +    @jsonrpc_method('teleforma.create_conference')
 +    def create(request, conf_dict):
 +        if isinstance(conf_dict, dict):
 +            conferences = Conference.objects.filter(public_id=conf_dict['id'])
 +            if not conferences:
 +                conference = Conference()
 +                conference.from_json_dict(conf_dict)
 +                conference.save()
 +
 +                for stream in conf_dict['streams']:
 +                    host = stream['host']
 +                    port = stream['port']
 +                    server_type = stream['server_type']
 +                    stream_type = stream['stream_type']
 +                    site = Site.objects.all()[0]
 +                    server, c = StreamingServer.objects.get_or_create(host=site,
 +                                                                      port=port,
 +                                                                      type=server_type)
 +                    stream = LiveStream(conference=conference, server=server,
 +                                        stream_type=stream_type, streaming=True)
 +                    stream.save()
 +                try:
 +                    live_message(conference)
 +                except:
 +                    pass
          else:
-             raise 'Error : input must be a conference dictionnary'
+             ChatMessage.add_message(room_name, message, system=True)
+         return Response({'status': 'ok'})
  
 +    def push(self):
 +        url = 'https://' + self.conference.department.domain + '/json/'
 +        s = ServiceProxy(url)
 +        s.teleforma.create_conference(self.conference.to_json_dict())
 +
  
+ class NotificationView(APIView):
+     permission_classes = [IsAuthenticated]
+     def post(self, request):
+         """
+         Update a notification (set as read)
+         """
+         id = request.data.get('id')
+         viewed = request.data.get('viewed')
+         notif = Notification.objects.get(pk=id)
+         notif.viewed = viewed
+         notif.save()
+         return Response({'status': 'ok'})
+ class LiveConferenceNotify(APIView):
+     def post(self, request):
+         """
+         notify users a new live conference is starting
+         """
+         conference_id = request.data.get('id')
+         if not conference_id:
+             raise Exception('No conference id in request')
+         conference = Conference.objects.get(pk=int(conference_id))
+         students = Student.objects.filter(period=conference.period, platform_only=True)
+         text = f"""Une conférence live "{conference.course.title}" commence"""
+         url = reverse('teleforma-conference-detail', kwargs={'period_id': conference.period.id, 'pk': conference.id})
+         # notify students
+         for student in students:
+             try:
+                 if student.user:
+                     courses = get_courses(student.user, period=conference.period)
+                     for course in courses:
+                         if conference.course == course['course'] and \
+                                 conference.course_type in course['types']:
+                             notify(student.user, text, url)
+                             logger.info("Student notified: " + student.user.username)
+             except Exception as e:
+                 logger.warning("Student NOT notified: " + str(student.id))
+                 logger.warning(e)
+                 continue
+         # notify staff
+         for user in User.objects.filter(is_staff=True):
+             notify(user, text, url)
+         return Response({'status': 'ok'})
  class ProfessorListView(View):
  
      @jsonrpc_method('teleforma.get_professor_list')
          return [p.to_json_dict() for p in professors]
  
      def pull(request, host=None):
 -        if host:
 -            url = 'http://' + host + '/json/'
 -        else:
 -            url = 'http://' + settings.TELECASTER_MASTER_SERVER + '/json/'
 -        s = ServiceProxy(url)
 -
 -        remote_list = s.teleforma.get_professor_list()
 -        for professor_dict in remote_list['result']:
 -            user, c = User.objects.get_or_create(
 -                username=professor_dict['username'])
 -            user.first_name = professor_dict['first_name']
 -            user.last_name = professor_dict['last_name']
 -            user.email = professor_dict['email']
 -            user.save()
 +        from teleforma.models import Organization, Department
 +        departments = Department.objects.all()
 +        professors = Professor.objects.all()
 +        professors_new = []
  
 -            professor, c = Professor.objects.get_or_create(user=user)
 -            for course_code in professor_dict['courses']:
 -                course = Course.objects.filter(code=course_code)
 -                if course:
 -                    if not course[0] in professor.courses.all():
 -                        professor.courses.add(course[0])
 -            professor.save()
 +        for department in departments:
 +            url = 'https://' + department.domain + '/json/'
 +            s = ServiceProxy(url)
 +            remote_list = s.teleforma.get_professor_list()
 +            for professor_dict in remote_list['result']:
 +                user, c = User.objects.get_or_create(username=professor_dict['username'][:30])
 +                if professor_dict['last_name']:
 +                    user.first_name = professor_dict['first_name']
 +                    user.last_name = professor_dict['last_name']
 +                    user.email = professor_dict['email']
 +                    user.save()
 +                professor, c = Professor.objects.get_or_create(user=user, department=department)
 +                for course_code in professor_dict['courses']:
 +                    course = Course.objects.filter(code=course_code)
 +                    if course:
 +                        if not course[0] in professor.courses.all():
 +                            professor.courses.add(course[0])
 +                professor.save()
 +                professors_new.append(professor)
 +                #print professor
 +
 +        # cleanup
 +        for professor in professors:
 +            if not professor in professors_new:
 +                professor.delete()
 +
 +    @jsonrpc_method('teleforma.get_dep_professors')
 +    def get_dep_professors(request, id):
 +        department = Department.objects.get(id=id)
 +        return [p.to_json_dict() for p in Professor.objects.filter(department=department)]
  
  
+ class WebClassGroupView(View):
+     @jsonrpc_method('teleforma.get_class_group_list')
+     def get_class_group_list(request):
+         class_groups = WebClassGroup.objects.all()
+         return [w.to_json_dict() for w in class_groups]
+     def pull(request, host=None):
+         if host:
+             url = 'http://' + host + '/json/'
+         else:
+             url = 'http://' + settings.TELECASTER_MASTER_SERVER + '/json/'
+         s = ServiceProxy(url)
+         remote_list = s.teleforma.get_class_group_list()
+         for class_group_dict in remote_list['result']:
+             class_group, c = WebClassGroup.objects.get_or_create(
+                 name=class_group_dict['name'])
  class HelpView(TemplateView):
  
-     template_name='teleforma/help.html'
+     template_name = 'teleforma/help.html'
  
      def get_context_data(self, **kwargs):
          context = super(HelpView, self).get_context_data(**kwargs)
          return super(HelpView, self).dispatch(*args, **kwargs)
  
  
 +class SourcesStatusView(ListView):
 +
 +    model = Source
 +    template_name='teleforma/source_monitors.html'
 +
 +    @jsonrpc_method('telecaster.get_source_status')
 +    def get_source_status(request, public_id):
 +        source = Source.objects.get(public_id=public_id)
 +        url = 'https://' + source.ip + '/json/'
 +        service = ServiceProxy(url)
 +        status = s.teleforma.get_server_status()
 +        return status
 +
 +    @jsonrpc_method('telecaster.get_source_station_status')
 +    def get_source_station_status(request, public_id):
 +        source = Source.objects.get(public_id=public_id)
 +        url = 'https://' + source.ip + '/json/'
 +        service = ServiceProxy(url)
 +        station = s.teleforma.get_station_status()
 +        return station
 +
 +    @jsonrpc_method('telecaster.source_station_start')
 +    def start(request, station_dict):
 +        pass
 +
 +    @jsonrpc_method('telecaster.source_station_stop')
 +    def stop(request):
 +        pass
 +
++
+ class PDFTemplateResponseMixin(TemplateResponseMixin):
+     """
+     Mixin for Django class based views.
+     Switch normal and pdf template based on request.
+     The switch is made when the request has a particular querydict, e.g.::
+         http://www.example.com?format=pdf
+     The key and value of the querydict can be overridable using *as_view()*.
+     That pdf url will be present in the context as *pdf_url*.
+     For example it is possible to define a view like this::
+         from django.views.generic import View
+         class MyView(PDFTemplateResponseMixin, View):
+             template_name = 'myapp/myview.html'
+             pdf_filename = 'report.pdf'
+     The pdf generation is automatically done by *weasyprint* using
+     the *myapp/myview_pdf.html* template.
+     Note that the pdf template takes the same context as the normal template.
+     """
+     pdf_template_name = None
+     pdf_template_name_suffix = '_pdf'
+     pdf_querydict_key = 'format'
+     pdf_querydict_value = 'pdf'
+     pdf_encoding = 'utf-8'
+     pdf_filename = None
+     pdf_url_varname = 'pdf_url'
+     pdf_kwargs = {}
+     def is_pdf(self):
+         value = self.request.REQUEST.get(self.pdf_querydict_key, '')
+         return value.lower() == self.pdf_querydict_value.lower()
+     def _get_pdf_template_name(self, name):
+         base, ext = os.path.splitext(name)
+         return '%s%s%s' % (base, self.pdf_template_name_suffix, ext)
+     def get_pdf_template_names(self):
+         """
+         If the template name is not given using the class attribute
+         *pdf_template_name*, then it is obtained using normal template
+         names, appending *pdf_template_name_suffix*, e.g.::
+             path/to/detail.html -> path/to/detail_pdf.html
+         """
+         if self.pdf_template_name is None:
+             names = super(PDFTemplateResponseMixin, self).get_template_names()
+             return map(self._get_pdf_template_name, names)
+         return [self.pdf_template_name]
+     def get_pdf_filename(self):
+         """
+         Return the pdf attachment filename.
+         If the filename is None, the pdf will not be an attachment.
+         """
+         return self.pdf_filename
+     def get_pdf_url(self):
+         """
+         This method is used to put the pdf url in the context.
+         """
+         querydict = self.request.GET.copy()
+         querydict[self.pdf_querydict_key] = self.pdf_querydict_value
+         return '%s?%s' % (self.request.path, querydict.urlencode())
+     def get_pdf_response(self, context, **response_kwargs):
+         return render_to_pdf(
+             request=self.request,
+             template=self.get_pdf_template_names(),
+             context=context,
+             encoding=self.pdf_encoding,
+             filename=self.get_pdf_filename(),
+             **self.pdf_kwargs
+         )
+     def render_to_response(self, context, **response_kwargs):
+         if self.is_pdf():
+             from django.conf import settings
+             context['STATIC_ROOT'] = settings.STATIC_ROOT
+             return self.get_pdf_response(context, **response_kwargs)
+         context[self.pdf_url_varname] = self.get_pdf_url()
+         return super(PDFTemplateResponseMixin, self).render_to_response(
+             context, **response_kwargs)