]> git.parisson.com Git - teleforma.git/commitdiff
Merge branch 'dev' into appointment
authorYoan Le Clanche <yoan@ellington.pilotsystems.net>
Mon, 1 Oct 2018 09:04:49 +0000 (11:04 +0200)
committerYoan Le Clanche <yoan@ellington.pilotsystems.net>
Mon, 1 Oct 2018 09:04:49 +0000 (11:04 +0200)
1  2 
teleforma/admin.py
teleforma/migrations/0104_auto__del_appointmentday__del_field_appointmentperiod_book_delay__del_.py
teleforma/migrations/0105_auto__add_field_appointmentperiod_book_delay.py
teleforma/models/appointment.py
teleforma/templates/teleforma/appointments.html
teleforma/views/appointment.py

index a926f5fe0b9a63c3b1fc3b95841ca5db2aa8894e,9288d2bcd31f1adb5d06a0f3635ac62e9d24cc92..c72f520239f9e274c52d2ce7a5e38a9432704a57
@@@ -177,33 -190,41 +190,41 @@@ class AppointmentSlotInline(admin.Tabul
  class AppointmentJuryInline(admin.StackedInline):
      model = AppointmentJury
  
- class AppointmentDayInline(admin.TabularInline):
-     readonly_fields = ('get_nb_slots', 'get_nb_jury', 'changeform_link', )
-     model = AppointmentDay
 -class AppointmentDayInline(admin.TabularInline):
 -    readonly_fields = ('get_nb_slots', 'get_nb_jury', 'changeform_link', )
 -    model = AppointmentDay
++# class AppointmentDayInline(admin.TabularInline):
++#     readonly_fields = ('get_nb_slots', 'get_nb_jury', 'changeform_link', )
++#     model = AppointmentDay
  
  class AppointmentPeriodAdmin(admin.ModelAdmin):
-     list_filter = ('period',)
-     list_display = ('name', 'period', 'nb_appointments')
+     list_display = ('name', 'periods_names', 'start', 'end', 'enable_appointment')
 -    inlines = [ AppointmentDayInline ]
++    # inlines = [ AppointmentDayInline ]
  
-     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 AppointmentDayAdmin(admin.ModelAdmin):
++#     list_filter = ('appointment_period',)
++#     list_display = ('date', 'appointment_period', 'get_nb_slots', 'get_nb_jury')
++#
++#     inlines = [ AppointmentSlotInline, AppointmentJuryInline ]
  
-     inlines = [ AppointmentSlotInline, AppointmentJuryInline ]
  
  class AppointmentSlotAdmin(admin.ModelAdmin):
--    list_filter = ('day',)
--    list_display = ('day', 'start', 'nb')
 -
++    list_filter = ('date',)
++    list_display = ('date', 'start', 'nb', 'get_nb_jury')
++    inlines = [AppointmentJuryInline]
  
  class AppointmentJuryAdmin(admin.ModelAdmin):
--    list_filter = ('day',)
--    list_display = ('name', 'day')
++    list_filter = ('slot',)
++    list_display = ('name', 'slot')
  
  class AppointmentAdmin(admin.ModelAdmin):
      list_display = ('real_date', 'student', 'jury')
--    list_filter = ('slot__day__date', 'slot__day__appointment_period')
++    list_filter = ('slot__date', 'slot__appointment_period')
      actions = ['export_csv']
  
      def export_csv(self, request, queryset):
@@@ -254,7 -276,7 +276,7 @@@ admin.site.register(GroupedMessage
  admin.site.register(Home, HomeAdmin)
  admin.site.register(NewsItem, NewsItemAdmin)
  admin.site.register(AppointmentPeriod, AppointmentPeriodAdmin)
--admin.site.register(AppointmentDay, AppointmentDayAdmin)
++admin.site.register(AppointmentDay, AppointmentDayAdmin)
  admin.site.register(AppointmentSlot, AppointmentSlotAdmin)
  admin.site.register(AppointmentJury, AppointmentJuryAdmin)
  admin.site.register(Appointment, AppointmentAdmin)
index 0000000000000000000000000000000000000000,0000000000000000000000000000000000000000..5fbc84e9db1b41bf6779f25ddb981c0b9439c1c9
new file mode 100644 (file)
--- /dev/null
--- /dev/null
@@@ -1,0 -1,0 +1,810 @@@
++# -*- coding: utf-8 -*-
++from south.utils import datetime_utils as datetime
++from south.db import db
++from south.v2 import SchemaMigration
++from django.db import models
++from django.db import connection
++
++
++class Migration(SchemaMigration):
++
++    def forwards(self, orm):
++        if not db.dry_run:
++            cursor = connection.cursor()
++            cursor.execute("select id, appointment_period_id, date from teleforma_appointment_date")
++            results = cursor.fetchall()
++
++            dates = []
++            for result in results:
++
++                cursor.execute("select id from teleforma_appointment_slot where day_id=%s" % result[0])
++                slots_ids = [slot[0] for slot in cursor.fetchall()]
++
++                cursor.execute("select id, name, address from teleforma_appointment_jury where day_id=%s" % result[0])
++                jurys_sql = cursor.fetchall()
++                slots = []
++                for slot_id in slots_ids:
++                    jurys = []
++                    for jury in jurys_sql:
++                        cursor.execute("select id, slot_id from teleforma_appointment where jury_id=%s" % jury[0])
++                        apps = cursor.fetchall()
++                        appointments = [app[0] for app in apps if app[1]==slot_id]
++                        print appointments
++                        jurys.append({
++                            'id': jury[0],
++                            'name': jury[1],
++                            'address': jury[2],
++                            'appointments': appointments
++                        })
++
++                    slots.append({
++                        'id':slot_id,
++                        'jurys':jurys
++                    })
++                print slots
++
++
++                dates.append({
++                    'id':result[0],
++                    'period': result[1],
++                    'date': result[2],
++                    'slots':slots
++                })
++
++            # appointments = {}
++            # cursor.execute("select id, jury_id from teleforma_appointment")
++            # for appointment in cursor.fetchall():
++            #     appointments[appointment[0]] = appointment[1]
++
++            print dates
++
++
++            # from teleforma.models import AppointmentDay
++            # for day in AppointmentDay.objects.all():
++            #
++            #     corpus.descriptions = corpus.description
++            #     corpus.save()
++            #
++            # for fonds in MediaFonds.objects.all():
++            #     fonds.descriptions = fonds.description
++            #     fonds.save()
++
++
++        # Deleting model 'AppointmentDay'
++        db.delete_table('teleforma_appointment_date')
++
++        # Deleting field 'AppointmentPeriod.book_delay'
++        db.delete_column('teleforma_appointment_period', 'book_delay')
++
++        # Deleting field 'AppointmentPeriod.nb_appointments'
++        db.delete_column('teleforma_appointment_period', 'nb_appointments')
++
++        # Deleting field 'AppointmentJury.day'
++        db.delete_column('teleforma_appointment_jury', 'day_id')
++
++        # Adding field 'AppointmentJury.slot'
++        db.add_column('teleforma_appointment_jury', 'slot',
++                      self.gf('django.db.models.fields.related.ForeignKey')(related_name='jurys', null=True, to=orm['teleforma.AppointmentSlot']),
++                      keep_default=False)
++
++        # Deleting field 'AppointmentSlot.day'
++        db.delete_column('teleforma_appointment_slot', 'day_id')
++
++        # Adding field 'AppointmentSlot.date'
++        db.add_column('teleforma_appointment_slot', 'date',
++                      self.gf('django.db.models.fields.DateField')(null=True),
++                      keep_default=False)
++
++        # Adding field 'AppointmentSlot.appointment_period'
++        db.add_column('teleforma_appointment_slot', 'appointment_period',
++                      self.gf('django.db.models.fields.related.ForeignKey')(related_name='slots', null=True,
++                                                                            to=orm['teleforma.AppointmentPeriod']),
++                      keep_default=False)
++
++        # Changing field 'Appointment.jury'
++        db.alter_column('teleforma_appointment', 'jury_id', self.gf('django.db.models.fields.related.ForeignKey')(null=True, on_delete=models.SET_NULL, to=orm['teleforma.AppointmentJury']))
++
++        if not db.dry_run:
++            from teleforma.models import Appointment, AppointmentSlot, AppointmentJury
++            AppointmentJury.objects.all().delete()
++
++            for date in dates:
++
++                # recreate juries and update slot date
++                for slotD in date['slots']:
++                    # import pdb;pdb.set_trace()
++                    slot = AppointmentSlot.objects.get(id=slotD['id'])
++                    slot.date = date['date']
++                    slot.appointment_period_id = date['period']
++                    slot.save()
++                    for jury in slotD['jurys']:
++                        juryObj = AppointmentJury(slot=slot, name=jury['name'], address=jury['address'])
++                        juryObj.save()
++                        for app in jury['appointments']:
++                            appointment = Appointment.objects.get(id=app)
++                            appointment.jury = juryObj
++                            appointment.save()
++
++
++
++
++    def backwards(self, orm):
++        pass
++        # # User chose to not deal with backwards NULL issues for 'AppointmentJury.day'
++        # raise RuntimeError("Cannot reverse this migration. 'AppointmentJury.day' and its values cannot be restored.")
++        #
++        # # Adding model 'AppointmentDay'
++        # db.create_table('teleforma_appointment_date', (
++        #     ('date', self.gf('django.db.models.fields.DateField')()),
++        #     ('id', self.gf('django.db.models.fields.AutoField')(primary_key=True)),
++        #     ('appointment_period', self.gf('django.db.models.fields.related.ForeignKey')(related_name='days', to=orm['teleforma.AppointmentPeriod'])),
++        # ))
++        # db.send_create_signal('teleforma', ['AppointmentDay'])
++        #
++        # # Adding field 'AppointmentPeriod.book_delay'
++        # db.add_column('teleforma_appointment_period', 'book_delay',
++        #               self.gf('django.db.models.fields.IntegerField')(default=2),
++        #               keep_default=False)
++        #
++        # # Adding field 'AppointmentPeriod.nb_appointments'
++        # db.add_column('teleforma_appointment_period', 'nb_appointments',
++        #               self.gf('django.db.models.fields.IntegerField')(default=1),
++        #               keep_default=False)
++        #
++        #
++        #
++        #
++        # # The following code is provided here to aid in writing a correct migration        # Adding field 'AppointmentJury.day'
++        # db.add_column('teleforma_appointment_jury', 'day',
++        #               self.gf('django.db.models.fields.related.ForeignKey')(related_name='jurys', to=orm['teleforma.AppointmentDay']),
++        #               keep_default=False)
++        #
++        # # Deleting field 'AppointmentJury.slot'
++        # db.delete_column('teleforma_appointment_jury', 'slot_id')
++        #
++        #
++        # # User chose to not deal with backwards NULL issues for 'AppointmentSlot.day'
++        # raise RuntimeError("Cannot reverse this migration. 'AppointmentSlot.day' and its values cannot be restored.")
++        #
++        # # The following code is provided here to aid in writing a correct migration        # Adding field 'AppointmentSlot.day'
++        # db.add_column('teleforma_appointment_slot', 'day',
++        #               self.gf('django.db.models.fields.related.ForeignKey')(related_name='slots', to=orm['teleforma.AppointmentDay']),
++        #               keep_default=False)
++        #
++        # # Deleting field 'AppointmentSlot.date'
++        # db.delete_column('teleforma_appointment_slot', 'date')
++        #
++        # Deleting field 'AppointmentSlot.appointment_period'
++        # db.delete_column('teleforma_appointment_slot', 'appointment_period_id')
++        # The following code is provided here to aid in writing a correct migration
++        # Changing field 'Appointment.jury'
++        #db.alter_column('teleforma_appointment', 'jury_id',
++        #                self.gf('django.db.models.fields.related.ForeignKey')(to=orm['teleforma.AppointmentJury']))
++        # Deleting field 'AppointmentSlot.appointment_period'
++        #db.delete_column('teleforma_appointment_slot', 'appointment_period_id')
++
++
++    models = {
++        'auth.group': {
++            'Meta': {'object_name': 'Group'},
++            'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
++            'name': ('django.db.models.fields.CharField', [], {'unique': 'True', 'max_length': '80'}),
++            'permissions': ('django.db.models.fields.related.ManyToManyField', [], {'to': "orm['auth.Permission']", 'symmetrical': 'False', 'blank': 'True'})
++        },
++        'auth.permission': {
++            'Meta': {'ordering': "('content_type__app_label', 'content_type__model', 'codename')", 'unique_together': "(('content_type', 'codename'),)", 'object_name': 'Permission'},
++            'codename': ('django.db.models.fields.CharField', [], {'max_length': '100'}),
++            'content_type': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['contenttypes.ContentType']"}),
++            'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
++            'name': ('django.db.models.fields.CharField', [], {'max_length': '50'})
++        },
++        'auth.user': {
++            'Meta': {'object_name': 'User'},
++            'date_joined': ('django.db.models.fields.DateTimeField', [], {'default': 'datetime.datetime.now'}),
++            'email': ('django.db.models.fields.EmailField', [], {'max_length': '75', 'blank': 'True'}),
++            'first_name': ('django.db.models.fields.CharField', [], {'max_length': '30', 'blank': 'True'}),
++            'groups': ('django.db.models.fields.related.ManyToManyField', [], {'to': "orm['auth.Group']", 'symmetrical': 'False', 'blank': 'True'}),
++            'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
++            'is_active': ('django.db.models.fields.BooleanField', [], {'default': 'True'}),
++            'is_staff': ('django.db.models.fields.BooleanField', [], {'default': 'False'}),
++            'is_superuser': ('django.db.models.fields.BooleanField', [], {'default': 'False'}),
++            'last_login': ('django.db.models.fields.DateTimeField', [], {'default': 'datetime.datetime.now'}),
++            'last_name': ('django.db.models.fields.CharField', [], {'max_length': '30', 'blank': 'True'}),
++            'password': ('django.db.models.fields.CharField', [], {'max_length': '128'}),
++            'user_permissions': ('django.db.models.fields.related.ManyToManyField', [], {'to': "orm['auth.Permission']", 'symmetrical': 'False', 'blank': 'True'}),
++            'username': ('django.db.models.fields.CharField', [], {'unique': 'True', 'max_length': '30'})
++        },
++        'contenttypes.contenttype': {
++            'Meta': {'ordering': "('name',)", 'unique_together': "(('app_label', 'model'),)", 'object_name': 'ContentType', 'db_table': "'django_content_type'"},
++            'app_label': ('django.db.models.fields.CharField', [], {'max_length': '100'}),
++            'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
++            'model': ('django.db.models.fields.CharField', [], {'max_length': '100'}),
++            'name': ('django.db.models.fields.CharField', [], {'max_length': '100'})
++        },
++        'quiz.category': {
++            'Meta': {'object_name': 'Category'},
++            'category': ('django.db.models.fields.CharField', [], {'max_length': '250', 'unique': 'True', 'null': 'True', 'blank': 'True'}),
++            'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'})
++        },
++        'quiz.quiz': {
++            'Meta': {'object_name': 'Quiz'},
++            'answers_at_end': ('django.db.models.fields.BooleanField', [], {'default': 'False'}),
++            'category': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['quiz.Category']", 'null': 'True', 'blank': 'True'}),
++            'description': ('django.db.models.fields.TextField', [], {'blank': 'True'}),
++            'draft': ('django.db.models.fields.BooleanField', [], {'default': 'False'}),
++            'exam_paper': ('django.db.models.fields.BooleanField', [], {'default': 'False'}),
++            'fail_text': ('django.db.models.fields.TextField', [], {'blank': 'True'}),
++            'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
++            'max_questions': ('django.db.models.fields.PositiveIntegerField', [], {'null': 'True', 'blank': 'True'}),
++            'pass_mark': ('django.db.models.fields.SmallIntegerField', [], {'default': '0', 'blank': 'True'}),
++            'random_order': ('django.db.models.fields.BooleanField', [], {'default': 'False'}),
++            'single_attempt': ('django.db.models.fields.BooleanField', [], {'default': 'False'}),
++            'success_text': ('django.db.models.fields.TextField', [], {'blank': 'True'}),
++            'title': ('django.db.models.fields.CharField', [], {'max_length': '60'}),
++            'url': ('django.db.models.fields.SlugField', [], {'max_length': '60'})
++        },
++        'teleforma.aestudent': {
++            'Meta': {'ordering': "['user__last_name']", 'object_name': 'AEStudent', 'db_table': "'teleforma_ae_student'"},
++            'courses': ('django.db.models.fields.related.ManyToManyField', [], {'blank': 'True', 'related_name': "'ae_student'", 'null': 'True', 'symmetrical': 'False', 'to': "orm['teleforma.Course']"}),
++            'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
++            'period': ('django.db.models.fields.related.ManyToManyField', [], {'blank': 'True', 'related_name': "'ae_student'", 'null': 'True', 'symmetrical': 'False', 'to': "orm['teleforma.Period']"}),
++            'platform_only': ('telemeta.models.core.BooleanField', [], {'default': 'False'}),
++            'user': ('telemeta.models.core.ForeignKey', [], {'related_name': "'ae_student'", 'unique': 'True', 'to': "orm['auth.User']"})
++        },
++        'teleforma.appointment': {
++            'Meta': {'unique_together': "(('slot', 'jury', 'slot_nb'),)", 'object_name': 'Appointment'},
++            'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
++            'jury': ('django.db.models.fields.related.ForeignKey', [], {'related_name': "'appointments'", 'null': 'True', 'on_delete': 'models.SET_NULL', 'to': "orm['teleforma.AppointmentJury']"}),
++            'slot': ('django.db.models.fields.related.ForeignKey', [], {'related_name': "'appointments'", 'to': "orm['teleforma.AppointmentSlot']"}),
++            'slot_nb': ('django.db.models.fields.IntegerField', [], {}),
++            'student': ('django.db.models.fields.related.ForeignKey', [], {'related_name': "'appointments'", 'to': "orm['auth.User']"})
++        },
++        'teleforma.appointmentjury': {
++            'Meta': {'ordering': "('id',)", 'object_name': 'AppointmentJury', 'db_table': "'teleforma_appointment_jury'"},
++            'address': ('django.db.models.fields.TextField', [], {}),
++            'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
++            'name': ('django.db.models.fields.CharField', [], {'max_length': '255'}),
++            'slot': ('django.db.models.fields.related.ForeignKey', [], {'related_name': "'jurys'", 'null': 'True', 'to': "orm['teleforma.AppointmentSlot']"})
++        },
++        'teleforma.appointmentperiod': {
++            'Meta': {'ordering': "('id',)", 'object_name': 'AppointmentPeriod', 'db_table': "'teleforma_appointment_period'"},
++            'appointment_mail_text': ('django.db.models.fields.TextField', [], {'blank': 'True'}),
++            'appointment_slot_size': ('django.db.models.fields.IntegerField', [], {'default': '40'}),
++            'cancel_delay': ('django.db.models.fields.IntegerField', [], {'default': '2'}),
++            'enable_appointment': ('django.db.models.fields.BooleanField', [], {'default': 'True'}),
++            'end': ('django.db.models.fields.DateField', [], {}),
++            'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
++            'name': ('django.db.models.fields.CharField', [], {'max_length': '255'}),
++            'periods': ('django.db.models.fields.related.ManyToManyField', [], {'related_name': "'appointment_periods'", 'symmetrical': 'False', 'to': "orm['teleforma.Period']"}),
++            'start': ('django.db.models.fields.DateField', [], {})
++        },
++        'teleforma.appointmentslot': {
++            'Meta': {'ordering': "('id',)", 'object_name': 'AppointmentSlot', 'db_table': "'teleforma_appointment_slot'"},
++            'appointment_period': ('django.db.models.fields.related.ForeignKey', [], {'related_name': "'slots'", 'null': 'True', 'to': "orm['teleforma.AppointmentPeriod']"}),
++            'date': ('django.db.models.fields.DateField', [], {'null': 'True'}),
++            'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
++            'nb': ('django.db.models.fields.IntegerField', [], {}),
++            'start': ('django.db.models.fields.TimeField', [], {})
++        },
++        'teleforma.conference': {
++            'Meta': {'ordering': "['-date_begin']", 'object_name': 'Conference'},
++            'comment': ('teleforma.fields.ShortTextField', [], {'max_length': '255', 'blank': 'True'}),
++            'course': ('django.db.models.fields.related.ForeignKey', [], {'related_name': "'conference'", 'to': "orm['teleforma.Course']"}),
++            'course_type': ('django.db.models.fields.related.ForeignKey', [], {'related_name': "'conference'", 'to': "orm['teleforma.CourseType']"}),
++            'date_begin': ('django.db.models.fields.DateTimeField', [], {'null': 'True', 'blank': 'True'}),
++            'date_end': ('django.db.models.fields.DateTimeField', [], {'null': 'True', 'blank': 'True'}),
++            'department': ('django.db.models.fields.related.ForeignKey', [], {'blank': 'True', 'related_name': "'conference'", 'null': 'True', 'on_delete': 'models.SET_NULL', 'to': "orm['teleforma.Department']"}),
++            'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
++            'period': ('django.db.models.fields.related.ForeignKey', [], {'blank': 'True', 'related_name': "'conference'", 'null': 'True', 'on_delete': 'models.SET_NULL', 'to': "orm['teleforma.Period']"}),
++            'professor': ('django.db.models.fields.related.ForeignKey', [], {'blank': 'True', 'related_name': "'conference'", 'null': 'True', 'on_delete': 'models.SET_NULL', 'to': "orm['teleforma.Professor']"}),
++            'public_id': ('django.db.models.fields.CharField', [], {'max_length': '255', 'blank': 'True'}),
++            'readers': ('django.db.models.fields.related.ManyToManyField', [], {'blank': 'True', 'related_name': "'conference'", 'null': 'True', 'symmetrical': 'False', 'to': "orm['auth.User']"}),
++            'room': ('django.db.models.fields.related.ForeignKey', [], {'blank': 'True', 'related_name': "'conference'", 'null': 'True', 'to': "orm['teleforma.Room']"}),
++            'session': ('django.db.models.fields.CharField', [], {'default': "'1'", 'max_length': '16'}),
++            'status': ('django.db.models.fields.IntegerField', [], {'default': '2'}),
++            'web_class_group': ('django.db.models.fields.related.ForeignKey', [], {'blank': 'True', 'related_name': "'conferences'", 'null': 'True', 'on_delete': 'models.SET_NULL', 'to': "orm['teleforma.WebClassGroup']"})
++        },
++        'teleforma.course': {
++            'Meta': {'ordering': "['number']", 'object_name': 'Course'},
++            'code': ('django.db.models.fields.CharField', [], {'max_length': '255'}),
++            'date_modified': ('django.db.models.fields.DateTimeField', [], {'auto_now': 'True', 'null': 'True', 'blank': 'True'}),
++            'department': ('django.db.models.fields.related.ForeignKey', [], {'related_name': "'course'", 'to': "orm['teleforma.Department']"}),
++            'description': ('django.db.models.fields.CharField', [], {'max_length': '255', 'blank': 'True'}),
++            'has_exam_scripts': ('django.db.models.fields.BooleanField', [], {'default': 'True'}),
++            'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
++            'magistral': ('django.db.models.fields.BooleanField', [], {'default': 'False'}),
++            'number': ('django.db.models.fields.IntegerField', [], {'null': 'True', 'blank': 'True'}),
++            'obligation': ('django.db.models.fields.BooleanField', [], {'default': 'False'}),
++            'oral_1': ('django.db.models.fields.BooleanField', [], {'default': 'False'}),
++            'oral_2': ('django.db.models.fields.BooleanField', [], {'default': 'False'}),
++            'oral_speciality': ('django.db.models.fields.BooleanField', [], {'default': 'False'}),
++            'procedure': ('django.db.models.fields.BooleanField', [], {'default': 'False'}),
++            'quiz': ('django.db.models.fields.related.ManyToManyField', [], {'symmetrical': 'False', 'to': "orm['quiz.Quiz']", 'null': 'True', 'blank': 'True'}),
++            'synthesis_note': ('django.db.models.fields.BooleanField', [], {'default': 'False'}),
++            'title': ('django.db.models.fields.CharField', [], {'max_length': '255'}),
++            'title_tweeter': ('django.db.models.fields.CharField', [], {'max_length': '255'}),
++            'written_speciality': ('django.db.models.fields.BooleanField', [], {'default': 'False'})
++        },
++        'teleforma.coursegroup': {
++            'Meta': {'object_name': 'CourseGroup', 'db_table': "'teleforma_course_group'"},
++            'courses': ('django.db.models.fields.related.ManyToManyField', [], {'blank': 'True', 'related_name': "'course_groups'", 'null': 'True', 'symmetrical': 'False', 'to': "orm['teleforma.Course']"}),
++            'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
++            'name': ('django.db.models.fields.CharField', [], {'max_length': '255'})
++        },
++        'teleforma.coursetype': {
++            'Meta': {'object_name': 'CourseType', 'db_table': "'teleforma_course_type'"},
++            'description': ('django.db.models.fields.CharField', [], {'max_length': '255', 'blank': 'True'}),
++            'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
++            'name': ('django.db.models.fields.CharField', [], {'max_length': '255'})
++        },
++        'teleforma.department': {
++            'Meta': {'object_name': 'Department'},
++            'default_period': ('django.db.models.fields.related.ForeignKey', [], {'blank': 'True', 'related_name': "'departments'", 'null': 'True', 'on_delete': 'models.SET_NULL', 'to': "orm['teleforma.Period']"}),
++            'description': ('django.db.models.fields.CharField', [], {'max_length': '255', 'blank': 'True'}),
++            'domain': ('django.db.models.fields.CharField', [], {'max_length': '255', 'blank': 'True'}),
++            'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
++            'name': ('django.db.models.fields.CharField', [], {'max_length': '255'}),
++            'organization': ('django.db.models.fields.related.ForeignKey', [], {'related_name': "'department'", 'to': "orm['teleforma.Organization']"})
++        },
++        'teleforma.discount': {
++            'Meta': {'object_name': 'Discount', 'db_table': "'teleforma_discounts'"},
++            'description': ('django.db.models.fields.CharField', [], {'max_length': '255', 'blank': 'True'}),
++            'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
++            'student': ('django.db.models.fields.related.ForeignKey', [], {'related_name': "'discounts'", 'to': "orm['teleforma.Student']"}),
++            'value': ('django.db.models.fields.FloatField', [], {})
++        },
++        'teleforma.document': {
++            'Meta': {'ordering': "['-date_added']", 'object_name': 'Document'},
++            'annal_year': ('django.db.models.fields.IntegerField', [], {'null': 'True', 'blank': 'True'}),
++            'code': ('django.db.models.fields.CharField', [], {'max_length': '255', 'blank': 'True'}),
++            'conference': ('django.db.models.fields.related.ForeignKey', [], {'blank': 'True', 'related_name': "'document'", 'null': 'True', 'on_delete': 'models.SET_NULL', 'to': "orm['teleforma.Conference']"}),
++            'course': ('django.db.models.fields.related.ForeignKey', [], {'related_name': "'document'", 'to': "orm['teleforma.Course']"}),
++            'course_type': ('django.db.models.fields.related.ManyToManyField', [], {'symmetrical': 'False', 'related_name': "'document'", 'blank': 'True', 'to': "orm['teleforma.CourseType']"}),
++            'credits': ('django.db.models.fields.CharField', [], {'max_length': '255', 'blank': 'True'}),
++            'date_added': ('django.db.models.fields.DateTimeField', [], {'auto_now_add': 'True', 'null': 'True', 'blank': 'True'}),
++            'date_modified': ('django.db.models.fields.DateTimeField', [], {'auto_now': 'True', 'null': 'True', 'blank': 'True'}),
++            'description': ('django.db.models.fields.CharField', [], {'max_length': '255', 'blank': 'True'}),
++            'file': ('telemeta.models.core.FileField', [], {'default': "''", 'max_length': '1024', 'db_column': "'filename'", 'blank': 'True'}),
++            'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
++            'iej': ('django.db.models.fields.related.ForeignKey', [], {'blank': 'True', 'related_name': "'document'", 'null': 'True', 'on_delete': 'models.SET_NULL', 'to': "orm['teleforma.IEJ']"}),
++            'is_annal': ('django.db.models.fields.BooleanField', [], {'default': 'False'}),
++            'is_published': ('django.db.models.fields.BooleanField', [], {'default': 'False'}),
++            'mime_type': ('django.db.models.fields.CharField', [], {'max_length': '255', 'blank': 'True'}),
++            'periods': ('django.db.models.fields.related.ManyToManyField', [], {'blank': 'True', 'related_name': "'documents'", 'null': 'True', 'symmetrical': 'False', 'to': "orm['teleforma.Period']"}),
++            'readers': ('django.db.models.fields.related.ManyToManyField', [], {'blank': 'True', 'related_name': "'document'", 'null': 'True', 'symmetrical': 'False', 'to': "orm['auth.User']"}),
++            'session': ('django.db.models.fields.CharField', [], {'default': "'1'", 'max_length': '16'}),
++            'title': ('django.db.models.fields.CharField', [], {'max_length': '255', 'blank': 'True'}),
++            'type': ('django.db.models.fields.related.ForeignKey', [], {'blank': 'True', 'related_name': "'document'", 'null': 'True', 'to': "orm['teleforma.DocumentType']"}),
++            'weight': ('django.db.models.fields.IntegerField', [], {'default': '1', 'blank': 'True'})
++        },
++        'teleforma.documentsimple': {
++            'Meta': {'ordering': "['-date_added']", 'object_name': 'DocumentSimple', 'db_table': "'teleforma_document_simple'"},
++            'code': ('django.db.models.fields.CharField', [], {'max_length': '255', 'blank': 'True'}),
++            'credits': ('django.db.models.fields.CharField', [], {'max_length': '255', 'blank': 'True'}),
++            'date_added': ('django.db.models.fields.DateTimeField', [], {'auto_now_add': 'True', 'null': 'True', 'blank': 'True'}),
++            'date_modified': ('django.db.models.fields.DateTimeField', [], {'auto_now': 'True', 'null': 'True', 'blank': 'True'}),
++            'description': ('django.db.models.fields.CharField', [], {'max_length': '255', 'blank': 'True'}),
++            'file': ('telemeta.models.core.FileField', [], {'default': "''", 'max_length': '1024', 'db_column': "'filename'", 'blank': 'True'}),
++            'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
++            'is_published': ('django.db.models.fields.BooleanField', [], {'default': 'False'}),
++            'mime_type': ('django.db.models.fields.CharField', [], {'max_length': '255', 'blank': 'True'}),
++            'period': ('django.db.models.fields.related.ForeignKey', [], {'blank': 'True', 'related_name': "'document_simple'", 'null': 'True', 'on_delete': 'models.SET_NULL', 'to': "orm['teleforma.Period']"}),
++            'readers': ('django.db.models.fields.related.ManyToManyField', [], {'blank': 'True', 'related_name': "'document_simple'", 'null': 'True', 'symmetrical': 'False', 'to': "orm['auth.User']"}),
++            'title': ('django.db.models.fields.CharField', [], {'max_length': '255', 'blank': 'True'}),
++            'weight': ('django.db.models.fields.IntegerField', [], {'default': '1', 'blank': 'True'})
++        },
++        'teleforma.documenttype': {
++            'Meta': {'ordering': "['number']", 'object_name': 'DocumentType', 'db_table': "'teleforma_document_type'"},
++            'description': ('django.db.models.fields.CharField', [], {'max_length': '255', 'blank': 'True'}),
++            'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
++            'name': ('django.db.models.fields.CharField', [], {'max_length': '255'}),
++            'number': ('django.db.models.fields.IntegerField', [], {'null': 'True', 'blank': 'True'})
++        },
++        'teleforma.groupedmessage': {
++            'Meta': {'object_name': 'GroupedMessage', 'db_table': "'teleforma_grouped_messages'"},
++            'date_sent': ('django.db.models.fields.DateTimeField', [], {'null': 'True', 'blank': 'True'}),
++            'group': ('django.db.models.fields.related.ForeignKey', [], {'blank': 'True', 'related_name': "'grouped_messages'", 'null': 'True', 'on_delete': 'models.SET_NULL', 'to': "orm['teleforma.StudentGroup']"}),
++            'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
++            'message': ('django.db.models.fields.TextField', [], {}),
++            'sender': ('django.db.models.fields.related.ForeignKey', [], {'blank': 'True', 'related_name': "'grouped_messages'", 'null': 'True', 'on_delete': 'models.SET_NULL', 'to': "orm['auth.User']"}),
++            'sent': ('django.db.models.fields.BooleanField', [], {'default': 'False'}),
++            'subject': ('django.db.models.fields.CharField', [], {'max_length': '119'}),
++            'to_send': ('django.db.models.fields.BooleanField', [], {'default': 'False'})
++        },
++        'teleforma.home': {
++            'Meta': {'object_name': 'Home'},
++            'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
++            'text': ('tinymce.models.HTMLField', [], {'blank': 'True'}),
++            'video': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['teleforma.Media']", 'null': 'True', 'blank': 'True'})
++        },
++        'teleforma.iej': {
++            'Meta': {'ordering': "['name']", 'object_name': 'IEJ'},
++            'description': ('django.db.models.fields.CharField', [], {'max_length': '255', 'blank': 'True'}),
++            'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
++            'name': ('django.db.models.fields.CharField', [], {'max_length': '255'})
++        },
++        'teleforma.livestream': {
++            'Meta': {'object_name': 'LiveStream', 'db_table': "'teleforma_live_stream'"},
++            'conference': ('django.db.models.fields.related.ForeignKey', [], {'blank': 'True', 'related_name': "'livestream'", 'null': 'True', 'on_delete': 'models.SET_NULL', 'to': "orm['teleforma.Conference']"}),
++            'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
++            'server': ('django.db.models.fields.related.ForeignKey', [], {'related_name': "'livestream'", 'to': "orm['teleforma.StreamingServer']"}),
++            'stream_type': ('django.db.models.fields.CharField', [], {'max_length': '32'}),
++            'streaming': ('django.db.models.fields.BooleanField', [], {'default': 'False'})
++        },
++        'teleforma.media': {
++            'Meta': {'ordering': "['-date_modified', '-conference__session']", 'object_name': 'Media'},
++            'code': ('django.db.models.fields.CharField', [], {'max_length': '255', 'blank': 'True'}),
++            'conference': ('django.db.models.fields.related.ForeignKey', [], {'blank': 'True', 'related_name': "'media'", 'null': 'True', 'on_delete': 'models.SET_NULL', 'to': "orm['teleforma.Conference']"}),
++            'course': ('django.db.models.fields.related.ForeignKey', [], {'blank': 'True', 'related_name': "'media'", 'null': 'True', 'to': "orm['teleforma.Course']"}),
++            'course_type': ('django.db.models.fields.related.ForeignKey', [], {'blank': 'True', 'related_name': "'media'", 'null': 'True', 'to': "orm['teleforma.CourseType']"}),
++            'credits': ('django.db.models.fields.CharField', [], {'max_length': '255', 'blank': 'True'}),
++            'date_added': ('django.db.models.fields.DateTimeField', [], {'auto_now_add': 'True', 'null': 'True', 'blank': 'True'}),
++            'date_modified': ('django.db.models.fields.DateTimeField', [], {'auto_now': 'True', 'null': 'True', 'blank': 'True'}),
++            'description': ('django.db.models.fields.CharField', [], {'max_length': '255', 'blank': 'True'}),
++            'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
++            'is_published': ('django.db.models.fields.BooleanField', [], {'default': 'False'}),
++            'item': ('django.db.models.fields.related.ForeignKey', [], {'blank': 'True', 'related_name': "'media'", 'null': 'True', 'to': "orm['telemeta.MediaItem']"}),
++            'mime_type': ('django.db.models.fields.CharField', [], {'max_length': '255', 'blank': 'True'}),
++            'period': ('django.db.models.fields.related.ForeignKey', [], {'blank': 'True', 'related_name': "'media'", 'null': 'True', 'on_delete': 'models.SET_NULL', 'to': "orm['teleforma.Period']"}),
++            'readers': ('django.db.models.fields.related.ManyToManyField', [], {'blank': 'True', 'related_name': "'media'", 'null': 'True', 'symmetrical': 'False', 'to': "orm['auth.User']"}),
++            'title': ('django.db.models.fields.CharField', [], {'max_length': '255', 'blank': 'True'}),
++            'type': ('django.db.models.fields.CharField', [], {'max_length': '32'}),
++            'weight': ('django.db.models.fields.IntegerField', [], {'default': '1', 'blank': 'True'})
++        },
++        'teleforma.newsitem': {
++            'Meta': {'object_name': 'NewsItem'},
++            'course': ('django.db.models.fields.related.ForeignKey', [], {'related_name': "'newsitems'", 'to': "orm['teleforma.Course']"}),
++            'created': ('django.db.models.fields.DateTimeField', [], {'auto_now_add': 'True', 'blank': 'True'}),
++            'creator': ('django.db.models.fields.related.ForeignKey', [], {'related_name': "'newsitems'", 'to': "orm['auth.User']"}),
++            'deleted': ('django.db.models.fields.BooleanField', [], {'default': 'False'}),
++            'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
++            'period': ('django.db.models.fields.related.ForeignKey', [], {'related_name': "'newsitems'", 'null': 'True', 'to': "orm['teleforma.Period']"}),
++            'text': ('tinymce.models.HTMLField', [], {}),
++            'title': ('django.db.models.fields.CharField', [], {'max_length': '255'})
++        },
++        'teleforma.optionalfee': {
++            'Meta': {'object_name': 'OptionalFee', 'db_table': "'teleforma_optional_fees'"},
++            'description': ('django.db.models.fields.CharField', [], {'max_length': '255', 'blank': 'True'}),
++            'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
++            'student': ('django.db.models.fields.related.ForeignKey', [], {'related_name': "'optional_fees'", 'to': "orm['teleforma.Student']"}),
++            'value': ('django.db.models.fields.FloatField', [], {})
++        },
++        'teleforma.organization': {
++            'Meta': {'object_name': 'Organization'},
++            'description': ('django.db.models.fields.CharField', [], {'max_length': '255', 'blank': 'True'}),
++            'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
++            'name': ('django.db.models.fields.CharField', [], {'max_length': '255'})
++        },
++        'teleforma.payback': {
++            'Meta': {'object_name': 'Payback', 'db_table': "'teleforma_paybacks'"},
++            'description': ('django.db.models.fields.CharField', [], {'max_length': '255', 'blank': 'True'}),
++            'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
++            'student': ('django.db.models.fields.related.ForeignKey', [], {'related_name': "'paybacks'", 'to': "orm['teleforma.Student']"}),
++            'value': ('django.db.models.fields.FloatField', [], {})
++        },
++        'teleforma.payment': {
++            'Meta': {'ordering': "['month']", 'object_name': 'Payment', 'db_table': "'teleforma_payments'"},
++            'collected': ('django.db.models.fields.BooleanField', [], {'default': 'False'}),
++            'date_created': ('django.db.models.fields.DateTimeField', [], {'auto_now_add': 'True', 'blank': 'True'}),
++            'date_modified': ('django.db.models.fields.DateTimeField', [], {'auto_now': 'True', 'blank': 'True'}),
++            'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
++            'month': ('django.db.models.fields.IntegerField', [], {'default': '1'}),
++            'student': ('django.db.models.fields.related.ForeignKey', [], {'related_name': "'payments'", 'to': "orm['teleforma.Student']"}),
++            'type': ('django.db.models.fields.CharField', [], {'max_length': '64'}),
++            'value': ('django.db.models.fields.FloatField', [], {})
++        },
++        'teleforma.period': {
++            'Meta': {'ordering': "['name']", 'object_name': 'Period'},
++            'date_begin': ('django.db.models.fields.DateField', [], {'null': 'True', 'blank': 'True'}),
++            'date_end': ('django.db.models.fields.DateField', [], {'null': 'True', 'blank': 'True'}),
++            'date_exam_end': ('django.db.models.fields.DateTimeField', [], {'null': 'True', 'blank': 'True'}),
++            'date_password_init': ('django.db.models.fields.DateField', [], {'null': 'True', 'blank': 'True'}),
++            'department': ('telemeta.models.core.ForeignKey', [], {'default': 'None', 'related_name': "'period'", 'null': 'True', 'blank': 'True', 'to': "orm['teleforma.Department']"}),
++            'description': ('django.db.models.fields.CharField', [], {'max_length': '255', 'blank': 'True'}),
++            'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
++            'is_open': ('django.db.models.fields.BooleanField', [], {'default': 'True'}),
++            'message_local': ('django.db.models.fields.TextField', [], {'blank': 'True'}),
++            'message_platform': ('django.db.models.fields.TextField', [], {'blank': 'True'}),
++            'name': ('django.db.models.fields.CharField', [], {'max_length': '255'}),
++            'parent': ('django.db.models.fields.related.ForeignKey', [], {'blank': 'True', 'related_name': "'children'", 'null': 'True', 'to': "orm['teleforma.Period']"})
++        },
++        'teleforma.professor': {
++            'Meta': {'ordering': "['user__last_name']", 'object_name': 'Professor'},
++            'courses': ('django.db.models.fields.related.ManyToManyField', [], {'blank': 'True', 'related_name': "'professor'", 'null': 'True', 'symmetrical': 'False', 'to': "orm['teleforma.Course']"}),
++            'department': ('django.db.models.fields.related.ForeignKey', [], {'blank': 'True', 'related_name': "'professor'", 'null': 'True', 'on_delete': 'models.SET_NULL', 'to': "orm['teleforma.Department']"}),
++            'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
++            'user': ('django.db.models.fields.related.ForeignKey', [], {'related_name': "'professor'", 'unique': 'True', 'to': "orm['auth.User']"})
++        },
++        'teleforma.profile': {
++            'Meta': {'object_name': 'Profile', 'db_table': "'teleforma_profiles'"},
++            'address': ('django.db.models.fields.CharField', [], {'max_length': '255', 'blank': 'True'}),
++            'address_detail': ('django.db.models.fields.CharField', [], {'max_length': '255', 'null': 'True', 'blank': 'True'}),
++            'birthday': ('django.db.models.fields.DateField', [], {'null': 'True', 'blank': 'True'}),
++            'city': ('django.db.models.fields.CharField', [], {'max_length': '255', 'blank': 'True'}),
++            'country': ('django.db.models.fields.CharField', [], {'max_length': '255', 'blank': 'True'}),
++            'expiration_date': ('django.db.models.fields.DateField', [], {'null': 'True', 'blank': 'True'}),
++            'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
++            'init_password': ('django.db.models.fields.BooleanField', [], {'default': 'False'}),
++            'language': ('django.db.models.fields.CharField', [], {'max_length': '255', 'blank': 'True'}),
++            'postal_code': ('django.db.models.fields.CharField', [], {'max_length': '255', 'blank': 'True'}),
++            'telephone': ('django.db.models.fields.CharField', [], {'max_length': '255', 'blank': 'True'}),
++            'user': ('django.db.models.fields.related.ForeignKey', [], {'related_name': "'profile'", 'unique': 'True', 'to': "orm['auth.User']"}),
++            'wifi_login': ('django.db.models.fields.CharField', [], {'max_length': '255', 'blank': 'True'}),
++            'wifi_pass': ('django.db.models.fields.CharField', [], {'max_length': '255', 'blank': 'True'})
++        },
++        'teleforma.room': {
++            'Meta': {'object_name': 'Room'},
++            'description': ('django.db.models.fields.CharField', [], {'max_length': '255', 'blank': 'True'}),
++            'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
++            'name': ('django.db.models.fields.CharField', [], {'max_length': '255'}),
++            'organization': ('django.db.models.fields.related.ForeignKey', [], {'related_name': "'room'", 'to': "orm['teleforma.Organization']"})
++        },
++        'teleforma.streamingserver': {
++            'Meta': {'object_name': 'StreamingServer', 'db_table': "'teleforma_streaming_server'"},
++            'admin_password': ('django.db.models.fields.CharField', [], {'max_length': '32', 'blank': 'True'}),
++            'description': ('django.db.models.fields.CharField', [], {'max_length': '255', 'blank': 'True'}),
++            'host': ('django.db.models.fields.CharField', [], {'max_length': '255'}),
++            'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
++            'port': ('django.db.models.fields.CharField', [], {'max_length': '32'}),
++            'source_password': ('django.db.models.fields.CharField', [], {'max_length': '32'}),
++            'type': ('django.db.models.fields.CharField', [], {'max_length': '32'})
++        },
++        'teleforma.student': {
++            'Meta': {'ordering': "['user__last_name', '-date_subscribed']", 'object_name': 'Student'},
++            'application_fees': ('django.db.models.fields.BooleanField', [], {'default': 'False'}),
++            'confirmation_sent': ('django.db.models.fields.BooleanField', [], {'default': 'False'}),
++            'date_registered': ('django.db.models.fields.DateTimeField', [], {'auto_now_add': 'True', 'null': 'True', 'blank': 'True'}),
++            'date_subscribed': ('django.db.models.fields.DateTimeField', [], {'null': 'True', 'blank': 'True'}),
++            'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
++            'iej': ('django.db.models.fields.related.ForeignKey', [], {'blank': 'True', 'related_name': "'student'", 'null': 'True', 'on_delete': 'models.SET_NULL', 'to': "orm['teleforma.IEJ']"}),
++            'is_subscribed': ('django.db.models.fields.BooleanField', [], {'default': 'False'}),
++            'level': ('django.db.models.fields.CharField', [], {'max_length': '100', 'blank': 'True'}),
++            'options': ('django.db.models.fields.related.ForeignKey', [], {'blank': 'True', 'related_name': "'options_students'", 'null': 'True', 'to': "orm['teleforma.Course']"}),
++            'oral_1': ('django.db.models.fields.related.ForeignKey', [], {'blank': 'True', 'related_name': "'oral_1_students'", 'null': 'True', 'to': "orm['teleforma.Course']"}),
++            'oral_2': ('django.db.models.fields.related.ForeignKey', [], {'blank': 'True', 'related_name': "'oral_2_students'", 'null': 'True', 'to': "orm['teleforma.Course']"}),
++            'oral_speciality': ('django.db.models.fields.related.ForeignKey', [], {'blank': 'True', 'related_name': "'oral_speciality_students'", 'null': 'True', 'to': "orm['teleforma.Course']"}),
++            'period': ('django.db.models.fields.related.ForeignKey', [], {'blank': 'True', 'related_name': "'student'", 'null': 'True', 'on_delete': 'models.SET_NULL', 'to': "orm['teleforma.Period']"}),
++            'platform_only': ('django.db.models.fields.BooleanField', [], {'default': 'False'}),
++            'procedure': ('django.db.models.fields.related.ForeignKey', [], {'blank': 'True', 'related_name': "'procedure_students'", 'null': 'True', 'to': "orm['teleforma.Course']"}),
++            'promo_code': ('django.db.models.fields.CharField', [], {'max_length': '100', 'blank': 'True'}),
++            'subscription_fees': ('django.db.models.fields.FloatField', [], {'null': 'True', 'blank': 'True'}),
++            'training': ('django.db.models.fields.related.ForeignKey', [], {'blank': 'True', 'related_name': "'student_training'", 'null': 'True', 'to': "orm['teleforma.Training']"}),
++            'trainings': ('django.db.models.fields.related.ManyToManyField', [], {'blank': 'True', 'related_name': "'student_trainings'", 'null': 'True', 'symmetrical': 'False', 'to': "orm['teleforma.Training']"}),
++            'user': ('django.db.models.fields.related.ForeignKey', [], {'related_name': "'student'", 'unique': 'True', 'to': "orm['auth.User']"}),
++            'written_speciality': ('django.db.models.fields.related.ForeignKey', [], {'blank': 'True', 'related_name': "'written_speciality_2students'", 'null': 'True', 'to': "orm['teleforma.Course']"})
++        },
++        'teleforma.studentgroup': {
++            'Meta': {'object_name': 'StudentGroup', 'db_table': "'teleforma_student_groups'"},
++            'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
++            'name': ('django.db.models.fields.CharField', [], {'max_length': '255'}),
++            'students': ('django.db.models.fields.related.ManyToManyField', [], {'blank': 'True', 'related_name': "'groups'", 'null': 'True', 'symmetrical': 'False', 'to': "orm['teleforma.Student']"})
++        },
++        'teleforma.training': {
++            'Meta': {'object_name': 'Training'},
++            'available': ('django.db.models.fields.BooleanField', [], {'default': 'False'}),
++            'code': ('django.db.models.fields.CharField', [], {'max_length': '255'}),
++            'cost': ('django.db.models.fields.FloatField', [], {'null': 'True', 'blank': 'True'}),
++            'description': ('django.db.models.fields.CharField', [], {'max_length': '512', 'blank': 'True'}),
++            'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
++            'magistral': ('django.db.models.fields.related.ManyToManyField', [], {'blank': 'True', 'related_name': "'training_magistral'", 'null': 'True', 'symmetrical': 'False', 'to': "orm['teleforma.CourseType']"}),
++            'name': ('django.db.models.fields.CharField', [], {'max_length': '255', 'blank': 'True'}),
++            'obligation': ('django.db.models.fields.related.ManyToManyField', [], {'blank': 'True', 'related_name': "'training_obligation'", 'null': 'True', 'symmetrical': 'False', 'to': "orm['teleforma.CourseType']"}),
++            'options': ('django.db.models.fields.related.ManyToManyField', [], {'blank': 'True', 'related_name': "'training_options'", 'null': 'True', 'symmetrical': 'False', 'to': "orm['teleforma.CourseType']"}),
++            'oral_1': ('django.db.models.fields.related.ManyToManyField', [], {'blank': 'True', 'related_name': "'training_oral_1'", 'null': 'True', 'symmetrical': 'False', 'to': "orm['teleforma.CourseType']"}),
++            'oral_2': ('django.db.models.fields.related.ManyToManyField', [], {'blank': 'True', 'related_name': "'training_oral_2'", 'null': 'True', 'symmetrical': 'False', 'to': "orm['teleforma.CourseType']"}),
++            'oral_speciality': ('django.db.models.fields.related.ManyToManyField', [], {'blank': 'True', 'related_name': "'training_oral_speciality'", 'null': 'True', 'symmetrical': 'False', 'to': "orm['teleforma.CourseType']"}),
++            'parent': ('django.db.models.fields.related.ForeignKey', [], {'blank': 'True', 'related_name': "'children'", 'null': 'True', 'to': "orm['teleforma.Training']"}),
++            'period': ('django.db.models.fields.related.ForeignKey', [], {'blank': 'True', 'related_name': "'training'", 'null': 'True', 'to': "orm['teleforma.Period']"}),
++            'procedure': ('django.db.models.fields.related.ManyToManyField', [], {'blank': 'True', 'related_name': "'training_procedure'", 'null': 'True', 'symmetrical': 'False', 'to': "orm['teleforma.CourseType']"}),
++            'synthesis_note': ('django.db.models.fields.related.ManyToManyField', [], {'blank': 'True', 'related_name': "'training_synthesis_note'", 'null': 'True', 'symmetrical': 'False', 'to': "orm['teleforma.CourseType']"}),
++            'written_speciality': ('django.db.models.fields.related.ManyToManyField', [], {'blank': 'True', 'related_name': "'training_written_speciality'", 'null': 'True', 'symmetrical': 'False', 'to': "orm['teleforma.CourseType']"})
++        },
++        'teleforma.webclassgroup': {
++            'Meta': {'ordering': "['name']", 'object_name': 'WebClassGroup'},
++            'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
++            'iejs': ('django.db.models.fields.related.ManyToManyField', [], {'blank': 'True', 'related_name': "'web_class_group'", 'null': 'True', 'symmetrical': 'False', 'to': "orm['teleforma.IEJ']"}),
++            'name': ('django.db.models.fields.CharField', [], {'max_length': '255'})
++        },
++        'telemeta.acquisitionmode': {
++            'Meta': {'ordering': "['value']", 'object_name': 'AcquisitionMode', 'db_table': "'acquisition_modes'"},
++            'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
++            'value': ('telemeta.models.core.CharField', [], {'unique': 'True', 'max_length': '250'})
++        },
++        'telemeta.adconversion': {
++            'Meta': {'ordering': "['value']", 'object_name': 'AdConversion', 'db_table': "'ad_conversions'"},
++            'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
++            'value': ('telemeta.models.core.CharField', [], {'unique': 'True', 'max_length': '250'})
++        },
++        'telemeta.ethnicgroup': {
++            'Meta': {'ordering': "['value']", 'object_name': 'EthnicGroup', 'db_table': "'ethnic_groups'"},
++            'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
++            'value': ('telemeta.models.core.CharField', [], {'unique': 'True', 'max_length': '250'})
++        },
++        'telemeta.genericstyle': {
++            'Meta': {'ordering': "['value']", 'object_name': 'GenericStyle', 'db_table': "'generic_styles'"},
++            'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
++            'value': ('telemeta.models.core.CharField', [], {'unique': 'True', 'max_length': '250'})
++        },
++        'telemeta.language': {
++            'Meta': {'ordering': "['name']", 'object_name': 'Language', 'db_table': "'languages'"},
++            'comment': ('telemeta.models.core.TextField', [], {'default': "''", 'blank': 'True'}),
++            'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
++            'identifier': ('telemeta.models.core.CharField', [], {'default': "''", 'max_length': '3', 'blank': 'True'}),
++            'name': ('telemeta.models.core.CharField', [], {'default': "''", 'max_length': '250', 'blank': 'True'}),
++            'part1': ('telemeta.models.core.CharField', [], {'default': "''", 'max_length': '1', 'blank': 'True'}),
++            'part2B': ('telemeta.models.core.CharField', [], {'default': "''", 'max_length': '3', 'blank': 'True'}),
++            'part2T': ('telemeta.models.core.CharField', [], {'default': "''", 'max_length': '3', 'blank': 'True'}),
++            'scope': ('telemeta.models.core.CharField', [], {'default': "''", 'max_length': '1', 'blank': 'True'}),
++            'type': ('telemeta.models.core.CharField', [], {'default': "''", 'max_length': '1', 'blank': 'True'})
++        },
++        'telemeta.legalright': {
++            'Meta': {'ordering': "['value']", 'object_name': 'LegalRight', 'db_table': "'legal_rights'"},
++            'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
++            'value': ('telemeta.models.core.CharField', [], {'unique': 'True', 'max_length': '250'})
++        },
++        'telemeta.location': {
++            'Meta': {'ordering': "['name']", 'object_name': 'Location', 'db_table': "'locations'"},
++            'complete_type': ('telemeta.models.core.ForeignKey', [], {'related_name': "'locations'", 'to': "orm['telemeta.LocationType']"}),
++            'current_location': ('telemeta.models.core.WeakForeignKey', [], {'default': 'None', 'related_name': "'past_names'", 'null': 'True', 'blank': 'True', 'to': "orm['telemeta.Location']"}),
++            'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
++            'is_authoritative': ('telemeta.models.core.BooleanField', [], {'default': 'False'}),
++            'latitude': ('telemeta.models.core.FloatField', [], {'default': 'None', 'null': 'True', 'blank': 'True'}),
++            'longitude': ('telemeta.models.core.FloatField', [], {'default': 'None', 'null': 'True', 'blank': 'True'}),
++            'name': ('telemeta.models.core.CharField', [], {'unique': 'True', 'max_length': '150'}),
++            'type': ('telemeta.models.core.IntegerField', [], {'default': '0', 'db_index': 'True', 'blank': 'True'})
++        },
++        'telemeta.locationtype': {
++            'Meta': {'ordering': "['name']", 'object_name': 'LocationType', 'db_table': "'location_types'"},
++            'code': ('telemeta.models.core.CharField', [], {'unique': 'True', 'max_length': '64'}),
++            'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
++            'name': ('telemeta.models.core.CharField', [], {'max_length': '150'})
++        },
++        'telemeta.mediacollection': {
++            'Meta': {'ordering': "['code']", 'object_name': 'MediaCollection', 'db_table': "'media_collections'"},
++            'a_informer_07_03': ('telemeta.models.core.CharField', [], {'default': "''", 'max_length': '250', 'blank': 'True'}),
++            'acquisition_mode': ('telemeta.models.core.WeakForeignKey', [], {'default': 'None', 'related_name': "'collections'", 'null': 'True', 'blank': 'True', 'to': "orm['telemeta.AcquisitionMode']"}),
++            'ad_conversion': ('telemeta.models.core.WeakForeignKey', [], {'default': 'None', 'related_name': "'collections'", 'null': 'True', 'blank': 'True', 'to': "orm['telemeta.AdConversion']"}),
++            'alt_ids': ('telemeta.models.core.CharField', [], {'default': "''", 'max_length': '250', 'blank': 'True'}),
++            'alt_title': ('telemeta.models.core.CharField', [], {'default': "''", 'max_length': '250', 'blank': 'True'}),
++            'approx_duration': ('telemeta.models.core.DurationField', [], {'default': "'0'", 'blank': 'True'}),
++            'auto_period_access': ('telemeta.models.core.BooleanField', [], {'default': 'True'}),
++            'booklet_author': ('telemeta.models.core.CharField', [], {'default': "''", 'max_length': '250', 'blank': 'True'}),
++            'booklet_description': ('telemeta.models.core.TextField', [], {'default': "''", 'blank': 'True'}),
++            'cnrs_contributor': ('telemeta.models.core.CharField', [], {'default': "''", 'max_length': '250', 'blank': 'True'}),
++            'code': ('telemeta.models.core.CharField', [], {'unique': 'True', 'max_length': '250'}),
++            'collector': ('telemeta.models.core.CharField', [], {'default': "''", 'max_length': '250', 'blank': 'True'}),
++            'collector_is_creator': ('telemeta.models.core.BooleanField', [], {'default': 'False'}),
++            'comment': ('telemeta.models.core.TextField', [], {'default': "''", 'blank': 'True'}),
++            'conservation_site': ('telemeta.models.core.CharField', [], {'default': "''", 'max_length': '250', 'blank': 'True'}),
++            'creator': ('telemeta.models.core.CharField', [], {'default': "''", 'max_length': '250', 'blank': 'True'}),
++            'doctype_code': ('telemeta.models.core.IntegerField', [], {'default': '0', 'blank': 'True'}),
++            'external_references': ('telemeta.models.core.TextField', [], {'default': "''", 'blank': 'True'}),
++            'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
++            'is_published': ('telemeta.models.core.BooleanField', [], {'default': 'False'}),
++            'items_done': ('telemeta.models.core.CharField', [], {'default': "''", 'max_length': '250', 'blank': 'True'}),
++            'legal_rights': ('telemeta.models.core.WeakForeignKey', [], {'default': 'None', 'related_name': "'collections'", 'null': 'True', 'blank': 'True', 'to': "orm['telemeta.LegalRight']"}),
++            'metadata_author': ('telemeta.models.core.WeakForeignKey', [], {'default': 'None', 'related_name': "'collections'", 'null': 'True', 'blank': 'True', 'to': "orm['telemeta.MetadataAuthor']"}),
++            'metadata_writer': ('telemeta.models.core.WeakForeignKey', [], {'default': 'None', 'related_name': "'collections'", 'null': 'True', 'blank': 'True', 'to': "orm['telemeta.MetadataWriter']"}),
++            'old_code': ('telemeta.models.core.CharField', [], {'default': 'None', 'max_length': '250', 'null': 'True', 'blank': 'True'}),
++            'physical_format': ('telemeta.models.core.WeakForeignKey', [], {'default': 'None', 'related_name': "'collections'", 'null': 'True', 'blank': 'True', 'to': "orm['telemeta.PhysicalFormat']"}),
++            'physical_items_num': ('telemeta.models.core.IntegerField', [], {'default': '0', 'blank': 'True'}),
++            'public_access': ('telemeta.models.core.CharField', [], {'default': "'metadata'", 'max_length': '16', 'blank': 'True'}),
++            'publisher': ('telemeta.models.core.WeakForeignKey', [], {'default': 'None', 'related_name': "'collections'", 'null': 'True', 'blank': 'True', 'to': "orm['telemeta.Publisher']"}),
++            'publisher_collection': ('telemeta.models.core.WeakForeignKey', [], {'default': 'None', 'related_name': "'collections'", 'null': 'True', 'blank': 'True', 'to': "orm['telemeta.PublisherCollection']"}),
++            'publisher_serial': ('telemeta.models.core.CharField', [], {'default': "''", 'max_length': '250', 'blank': 'True'}),
++            'publishing_status': ('telemeta.models.core.WeakForeignKey', [], {'default': 'None', 'related_name': "'collections'", 'null': 'True', 'blank': 'True', 'to': "orm['telemeta.PublishingStatus']"}),
++            'recorded_from_year': ('telemeta.models.core.IntegerField', [], {'default': '0', 'blank': 'True'}),
++            'recorded_to_year': ('telemeta.models.core.IntegerField', [], {'default': '0', 'blank': 'True'}),
++            'recording_context': ('telemeta.models.core.WeakForeignKey', [], {'default': 'None', 'related_name': "'collections'", 'null': 'True', 'blank': 'True', 'to': "orm['telemeta.RecordingContext']"}),
++            'reference': ('telemeta.models.core.CharField', [], {'default': 'None', 'max_length': '250', 'unique': 'True', 'null': 'True', 'blank': 'True'}),
++            'state': ('telemeta.models.core.TextField', [], {'default': "''", 'blank': 'True'}),
++            'title': ('telemeta.models.core.CharField', [], {'max_length': '250'}),
++            'travail': ('telemeta.models.core.CharField', [], {'default': "''", 'max_length': '250', 'blank': 'True'}),
++            'year_published': ('telemeta.models.core.IntegerField', [], {'default': '0', 'blank': 'True'})
++        },
++        'telemeta.mediaitem': {
++            'Meta': {'object_name': 'MediaItem', 'db_table': "'media_items'"},
++            'alt_title': ('telemeta.models.core.CharField', [], {'default': "''", 'max_length': '250', 'blank': 'True'}),
++            'approx_duration': ('telemeta.models.core.DurationField', [], {'default': "'0'", 'blank': 'True'}),
++            'author': ('telemeta.models.core.CharField', [], {'default': "''", 'max_length': '250', 'blank': 'True'}),
++            'auto_period_access': ('telemeta.models.core.BooleanField', [], {'default': 'True'}),
++            'code': ('telemeta.models.core.CharField', [], {'default': "''", 'unique': 'True', 'max_length': '250', 'blank': 'True'}),
++            'collection': ('telemeta.models.core.ForeignKey', [], {'related_name': "'items'", 'to': "orm['telemeta.MediaCollection']"}),
++            'collector': ('telemeta.models.core.CharField', [], {'default': "''", 'max_length': '250', 'blank': 'True'}),
++            'collector_from_collection': ('telemeta.models.core.BooleanField', [], {'default': 'False'}),
++            'collector_selection': ('telemeta.models.core.CharField', [], {'default': "''", 'max_length': '250', 'blank': 'True'}),
++            'comment': ('telemeta.models.core.TextField', [], {'default': "''", 'blank': 'True'}),
++            'context_comment': ('telemeta.models.core.TextField', [], {'default': "''", 'blank': 'True'}),
++            'contributor': ('telemeta.models.core.CharField', [], {'default': "''", 'max_length': '250', 'blank': 'True'}),
++            'copied_from_item': ('telemeta.models.core.WeakForeignKey', [], {'default': 'None', 'related_name': "'copies'", 'null': 'True', 'blank': 'True', 'to': "orm['telemeta.MediaItem']"}),
++            'creator_reference': ('telemeta.models.core.CharField', [], {'default': "''", 'max_length': '250', 'blank': 'True'}),
++            'cultural_area': ('telemeta.models.core.CharField', [], {'default': "''", 'max_length': '250', 'blank': 'True'}),
++            'depositor': ('telemeta.models.core.CharField', [], {'default': "''", 'max_length': '250', 'blank': 'True'}),
++            'digitalist': ('telemeta.models.core.CharField', [], {'default': "''", 'max_length': '250', 'blank': 'True'}),
++            'digitization_date': ('telemeta.models.core.DateField', [], {'default': 'None', 'null': 'True', 'blank': 'True'}),
++            'ethnic_group': ('telemeta.models.core.WeakForeignKey', [], {'default': 'None', 'related_name': "'items'", 'null': 'True', 'blank': 'True', 'to': "orm['telemeta.EthnicGroup']"}),
++            'external_references': ('telemeta.models.core.TextField', [], {'default': "''", 'blank': 'True'}),
++            'file': ('telemeta.models.core.FileField', [], {'default': "''", 'max_length': '1024', 'db_column': "'filename'", 'blank': 'True'}),
++            'generic_style': ('telemeta.models.core.WeakForeignKey', [], {'default': 'None', 'related_name': "'items'", 'null': 'True', 'blank': 'True', 'to': "orm['telemeta.GenericStyle']"}),
++            'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
++            'language': ('telemeta.models.core.CharField', [], {'default': "''", 'max_length': '250', 'blank': 'True'}),
++            'language_iso': ('telemeta.models.core.ForeignKey', [], {'related_name': "'items'", 'on_delete': 'models.SET_NULL', 'default': 'None', 'to': "orm['telemeta.Language']", 'blank': 'True', 'null': 'True'}),
++            'location': ('telemeta.models.core.WeakForeignKey', [], {'default': 'None', 'to': "orm['telemeta.Location']", 'null': 'True', 'blank': 'True'}),
++            'location_comment': ('telemeta.models.core.CharField', [], {'default': "''", 'max_length': '250', 'blank': 'True'}),
++            'mimetype': ('telemeta.models.core.CharField', [], {'default': "''", 'max_length': '255', 'blank': 'True'}),
++            'moda_execut': ('telemeta.models.core.CharField', [], {'default': "''", 'max_length': '250', 'blank': 'True'}),
++            'old_code': ('telemeta.models.core.CharField', [], {'default': "''", 'max_length': '250', 'blank': 'True'}),
++            'organization': ('telemeta.models.core.WeakForeignKey', [], {'default': 'None', 'to': "orm['telemeta.Organization']", 'null': 'True', 'blank': 'True'}),
++            'public_access': ('telemeta.models.core.CharField', [], {'default': "'metadata'", 'max_length': '16', 'blank': 'True'}),
++            'publishing_date': ('telemeta.models.core.DateField', [], {'default': 'None', 'null': 'True', 'blank': 'True'}),
++            'recorded_from_date': ('telemeta.models.core.DateField', [], {'default': 'None', 'null': 'True', 'blank': 'True'}),
++            'recorded_to_date': ('telemeta.models.core.DateField', [], {'default': 'None', 'null': 'True', 'blank': 'True'}),
++            'recordist': ('telemeta.models.core.CharField', [], {'default': "''", 'max_length': '250', 'blank': 'True'}),
++            'rights': ('telemeta.models.core.WeakForeignKey', [], {'default': 'None', 'to': "orm['telemeta.Rights']", 'null': 'True', 'blank': 'True'}),
++            'scientist': ('telemeta.models.core.CharField', [], {'default': "''", 'max_length': '250', 'blank': 'True'}),
++            'summary': ('telemeta.models.core.TextField', [], {'default': "''", 'blank': 'True'}),
++            'title': ('telemeta.models.core.CharField', [], {'default': "''", 'max_length': '250', 'blank': 'True'}),
++            'topic': ('telemeta.models.core.WeakForeignKey', [], {'default': 'None', 'to': "orm['telemeta.Topic']", 'null': 'True', 'blank': 'True'}),
++            'track': ('telemeta.models.core.CharField', [], {'default': "''", 'max_length': '250', 'blank': 'True'}),
++            'url': ('django.db.models.fields.URLField', [], {'max_length': '512', 'blank': 'True'}),
++            'vernacular_style': ('telemeta.models.core.WeakForeignKey', [], {'default': 'None', 'related_name': "'items'", 'null': 'True', 'blank': 'True', 'to': "orm['telemeta.VernacularStyle']"})
++        },
++        'telemeta.metadataauthor': {
++            'Meta': {'ordering': "['value']", 'object_name': 'MetadataAuthor', 'db_table': "'metadata_authors'"},
++            'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
++            'value': ('telemeta.models.core.CharField', [], {'unique': 'True', 'max_length': '250'})
++        },
++        'telemeta.metadatawriter': {
++            'Meta': {'ordering': "['value']", 'object_name': 'MetadataWriter', 'db_table': "'metadata_writers'"},
++            'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
++            'value': ('telemeta.models.core.CharField', [], {'unique': 'True', 'max_length': '250'})
++        },
++        'telemeta.organization': {
++            'Meta': {'ordering': "['value']", 'object_name': 'Organization', 'db_table': "'organization'"},
++            'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
++            'value': ('telemeta.models.core.CharField', [], {'unique': 'True', 'max_length': '250'})
++        },
++        'telemeta.physicalformat': {
++            'Meta': {'ordering': "['value']", 'object_name': 'PhysicalFormat', 'db_table': "'physical_formats'"},
++            'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
++            'value': ('telemeta.models.core.CharField', [], {'unique': 'True', 'max_length': '250'})
++        },
++        'telemeta.publisher': {
++            'Meta': {'ordering': "['value']", 'object_name': 'Publisher', 'db_table': "'publishers'"},
++            'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
++            'value': ('telemeta.models.core.CharField', [], {'unique': 'True', 'max_length': '250'})
++        },
++        'telemeta.publishercollection': {
++            'Meta': {'ordering': "['value']", 'object_name': 'PublisherCollection', 'db_table': "'publisher_collections'"},
++            'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
++            'publisher': ('telemeta.models.core.ForeignKey', [], {'related_name': "'publisher_collections'", 'to': "orm['telemeta.Publisher']"}),
++            'value': ('telemeta.models.core.CharField', [], {'max_length': '250'})
++        },
++        'telemeta.publishingstatus': {
++            'Meta': {'ordering': "['value']", 'object_name': 'PublishingStatus', 'db_table': "'publishing_status'"},
++            'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
++            'value': ('telemeta.models.core.CharField', [], {'unique': 'True', 'max_length': '250'})
++        },
++        'telemeta.recordingcontext': {
++            'Meta': {'ordering': "['value']", 'object_name': 'RecordingContext', 'db_table': "'recording_contexts'"},
++            'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
++            'value': ('telemeta.models.core.CharField', [], {'unique': 'True', 'max_length': '250'})
++        },
++        'telemeta.rights': {
++            'Meta': {'ordering': "['value']", 'object_name': 'Rights', 'db_table': "'rights'"},
++            'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
++            'value': ('telemeta.models.core.CharField', [], {'unique': 'True', 'max_length': '250'})
++        },
++        'telemeta.topic': {
++            'Meta': {'ordering': "['value']", 'object_name': 'Topic', 'db_table': "'topic'"},
++            'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
++            'value': ('telemeta.models.core.CharField', [], {'unique': 'True', 'max_length': '250'})
++        },
++        'telemeta.vernacularstyle': {
++            'Meta': {'ordering': "['value']", 'object_name': 'VernacularStyle', 'db_table': "'vernacular_styles'"},
++            'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
++            'value': ('telemeta.models.core.CharField', [], {'unique': 'True', 'max_length': '250'})
++        }
++    }
++
++    complete_apps = ['teleforma']
index 0000000000000000000000000000000000000000,0000000000000000000000000000000000000000..737203449d7d224cc6e94ec07c9054febf21a771
new file mode 100644 (file)
--- /dev/null
--- /dev/null
@@@ -1,0 -1,0 +1,646 @@@
++# -*- coding: utf-8 -*-
++from south.utils import datetime_utils as datetime
++from south.db import db
++from south.v2 import SchemaMigration
++from django.db import models
++
++
++class Migration(SchemaMigration):
++
++    def forwards(self, orm):
++        # Adding field 'AppointmentPeriod.book_delay'
++        db.add_column('teleforma_appointment_period', 'book_delay',
++                      self.gf('django.db.models.fields.IntegerField')(default=2),
++                      keep_default=False)
++
++
++    def backwards(self, orm):
++        # Deleting field 'AppointmentPeriod.book_delay'
++        db.delete_column('teleforma_appointment_period', 'book_delay')
++
++
++    models = {
++        'auth.group': {
++            'Meta': {'object_name': 'Group'},
++            'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
++            'name': ('django.db.models.fields.CharField', [], {'unique': 'True', 'max_length': '80'}),
++            'permissions': ('django.db.models.fields.related.ManyToManyField', [], {'to': "orm['auth.Permission']", 'symmetrical': 'False', 'blank': 'True'})
++        },
++        'auth.permission': {
++            'Meta': {'ordering': "('content_type__app_label', 'content_type__model', 'codename')", 'unique_together': "(('content_type', 'codename'),)", 'object_name': 'Permission'},
++            'codename': ('django.db.models.fields.CharField', [], {'max_length': '100'}),
++            'content_type': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['contenttypes.ContentType']"}),
++            'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
++            'name': ('django.db.models.fields.CharField', [], {'max_length': '50'})
++        },
++        'auth.user': {
++            'Meta': {'object_name': 'User'},
++            'date_joined': ('django.db.models.fields.DateTimeField', [], {'default': 'datetime.datetime.now'}),
++            'email': ('django.db.models.fields.EmailField', [], {'max_length': '75', 'blank': 'True'}),
++            'first_name': ('django.db.models.fields.CharField', [], {'max_length': '30', 'blank': 'True'}),
++            'groups': ('django.db.models.fields.related.ManyToManyField', [], {'to': "orm['auth.Group']", 'symmetrical': 'False', 'blank': 'True'}),
++            'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
++            'is_active': ('django.db.models.fields.BooleanField', [], {'default': 'True'}),
++            'is_staff': ('django.db.models.fields.BooleanField', [], {'default': 'False'}),
++            'is_superuser': ('django.db.models.fields.BooleanField', [], {'default': 'False'}),
++            'last_login': ('django.db.models.fields.DateTimeField', [], {'default': 'datetime.datetime.now'}),
++            'last_name': ('django.db.models.fields.CharField', [], {'max_length': '30', 'blank': 'True'}),
++            'password': ('django.db.models.fields.CharField', [], {'max_length': '128'}),
++            'user_permissions': ('django.db.models.fields.related.ManyToManyField', [], {'to': "orm['auth.Permission']", 'symmetrical': 'False', 'blank': 'True'}),
++            'username': ('django.db.models.fields.CharField', [], {'unique': 'True', 'max_length': '30'})
++        },
++        'contenttypes.contenttype': {
++            'Meta': {'ordering': "('name',)", 'unique_together': "(('app_label', 'model'),)", 'object_name': 'ContentType', 'db_table': "'django_content_type'"},
++            'app_label': ('django.db.models.fields.CharField', [], {'max_length': '100'}),
++            'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
++            'model': ('django.db.models.fields.CharField', [], {'max_length': '100'}),
++            'name': ('django.db.models.fields.CharField', [], {'max_length': '100'})
++        },
++        'quiz.category': {
++            'Meta': {'object_name': 'Category'},
++            'category': ('django.db.models.fields.CharField', [], {'max_length': '250', 'unique': 'True', 'null': 'True', 'blank': 'True'}),
++            'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'})
++        },
++        'quiz.quiz': {
++            'Meta': {'object_name': 'Quiz'},
++            'answers_at_end': ('django.db.models.fields.BooleanField', [], {'default': 'False'}),
++            'category': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['quiz.Category']", 'null': 'True', 'blank': 'True'}),
++            'description': ('django.db.models.fields.TextField', [], {'blank': 'True'}),
++            'draft': ('django.db.models.fields.BooleanField', [], {'default': 'False'}),
++            'exam_paper': ('django.db.models.fields.BooleanField', [], {'default': 'False'}),
++            'fail_text': ('django.db.models.fields.TextField', [], {'blank': 'True'}),
++            'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
++            'max_questions': ('django.db.models.fields.PositiveIntegerField', [], {'null': 'True', 'blank': 'True'}),
++            'pass_mark': ('django.db.models.fields.SmallIntegerField', [], {'default': '0', 'blank': 'True'}),
++            'random_order': ('django.db.models.fields.BooleanField', [], {'default': 'False'}),
++            'single_attempt': ('django.db.models.fields.BooleanField', [], {'default': 'False'}),
++            'success_text': ('django.db.models.fields.TextField', [], {'blank': 'True'}),
++            'title': ('django.db.models.fields.CharField', [], {'max_length': '60'}),
++            'url': ('django.db.models.fields.SlugField', [], {'max_length': '60'})
++        },
++        'teleforma.aestudent': {
++            'Meta': {'ordering': "['user__last_name']", 'object_name': 'AEStudent', 'db_table': "'teleforma_ae_student'"},
++            'courses': ('django.db.models.fields.related.ManyToManyField', [], {'blank': 'True', 'related_name': "'ae_student'", 'null': 'True', 'symmetrical': 'False', 'to': "orm['teleforma.Course']"}),
++            'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
++            'period': ('django.db.models.fields.related.ManyToManyField', [], {'blank': 'True', 'related_name': "'ae_student'", 'null': 'True', 'symmetrical': 'False', 'to': "orm['teleforma.Period']"}),
++            'platform_only': ('telemeta.models.core.BooleanField', [], {'default': 'False'}),
++            'user': ('telemeta.models.core.ForeignKey', [], {'related_name': "'ae_student'", 'unique': 'True', 'to': "orm['auth.User']"})
++        },
++        'teleforma.appointment': {
++            'Meta': {'unique_together': "(('slot', 'jury', 'slot_nb'),)", 'object_name': 'Appointment'},
++            'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
++            'jury': ('django.db.models.fields.related.ForeignKey', [], {'related_name': "'appointments'", 'null': 'True', 'on_delete': 'models.SET_NULL', 'to': "orm['teleforma.AppointmentJury']"}),
++            'slot': ('django.db.models.fields.related.ForeignKey', [], {'related_name': "'appointments'", 'to': "orm['teleforma.AppointmentSlot']"}),
++            'slot_nb': ('django.db.models.fields.IntegerField', [], {}),
++            'student': ('django.db.models.fields.related.ForeignKey', [], {'related_name': "'appointments'", 'to': "orm['auth.User']"})
++        },
++        'teleforma.appointmentjury': {
++            'Meta': {'ordering': "('id',)", 'object_name': 'AppointmentJury', 'db_table': "'teleforma_appointment_jury'"},
++            'address': ('django.db.models.fields.TextField', [], {}),
++            'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
++            'name': ('django.db.models.fields.CharField', [], {'max_length': '255'}),
++            'slot': ('django.db.models.fields.related.ForeignKey', [], {'related_name': "'jurys'", 'null': 'True', 'to': "orm['teleforma.AppointmentSlot']"})
++        },
++        'teleforma.appointmentperiod': {
++            'Meta': {'ordering': "('id',)", 'object_name': 'AppointmentPeriod', 'db_table': "'teleforma_appointment_period'"},
++            'appointment_mail_text': ('django.db.models.fields.TextField', [], {'blank': 'True'}),
++            'appointment_slot_size': ('django.db.models.fields.IntegerField', [], {'default': '40'}),
++            'book_delay': ('django.db.models.fields.IntegerField', [], {'default': '2'}),
++            'cancel_delay': ('django.db.models.fields.IntegerField', [], {'default': '2'}),
++            'enable_appointment': ('django.db.models.fields.BooleanField', [], {'default': 'True'}),
++            'end': ('django.db.models.fields.DateField', [], {}),
++            'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
++            'name': ('django.db.models.fields.CharField', [], {'max_length': '255'}),
++            'periods': ('django.db.models.fields.related.ManyToManyField', [], {'related_name': "'appointment_periods'", 'symmetrical': 'False', 'to': "orm['teleforma.Period']"}),
++            'start': ('django.db.models.fields.DateField', [], {})
++        },
++        'teleforma.appointmentslot': {
++            'Meta': {'ordering': "('id',)", 'object_name': 'AppointmentSlot', 'db_table': "'teleforma_appointment_slot'"},
++            'appointment_period': ('django.db.models.fields.related.ForeignKey', [], {'related_name': "'slots'", 'null': 'True', 'to': "orm['teleforma.AppointmentPeriod']"}),
++            'date': ('django.db.models.fields.DateField', [], {'null': 'True'}),
++            'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
++            'nb': ('django.db.models.fields.IntegerField', [], {}),
++            'start': ('django.db.models.fields.TimeField', [], {})
++        },
++        'teleforma.conference': {
++            'Meta': {'ordering': "['-date_begin']", 'object_name': 'Conference'},
++            'comment': ('teleforma.fields.ShortTextField', [], {'max_length': '255', 'blank': 'True'}),
++            'course': ('django.db.models.fields.related.ForeignKey', [], {'related_name': "'conference'", 'to': "orm['teleforma.Course']"}),
++            'course_type': ('django.db.models.fields.related.ForeignKey', [], {'related_name': "'conference'", 'to': "orm['teleforma.CourseType']"}),
++            'date_begin': ('django.db.models.fields.DateTimeField', [], {'null': 'True', 'blank': 'True'}),
++            'date_end': ('django.db.models.fields.DateTimeField', [], {'null': 'True', 'blank': 'True'}),
++            'department': ('django.db.models.fields.related.ForeignKey', [], {'blank': 'True', 'related_name': "'conference'", 'null': 'True', 'on_delete': 'models.SET_NULL', 'to': "orm['teleforma.Department']"}),
++            'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
++            'period': ('django.db.models.fields.related.ForeignKey', [], {'blank': 'True', 'related_name': "'conference'", 'null': 'True', 'on_delete': 'models.SET_NULL', 'to': "orm['teleforma.Period']"}),
++            'professor': ('django.db.models.fields.related.ForeignKey', [], {'blank': 'True', 'related_name': "'conference'", 'null': 'True', 'on_delete': 'models.SET_NULL', 'to': "orm['teleforma.Professor']"}),
++            'public_id': ('django.db.models.fields.CharField', [], {'max_length': '255', 'blank': 'True'}),
++            'readers': ('django.db.models.fields.related.ManyToManyField', [], {'blank': 'True', 'related_name': "'conference'", 'null': 'True', 'symmetrical': 'False', 'to': "orm['auth.User']"}),
++            'room': ('django.db.models.fields.related.ForeignKey', [], {'blank': 'True', 'related_name': "'conference'", 'null': 'True', 'to': "orm['teleforma.Room']"}),
++            'session': ('django.db.models.fields.CharField', [], {'default': "'1'", 'max_length': '16'}),
++            'status': ('django.db.models.fields.IntegerField', [], {'default': '2'}),
++            'web_class_group': ('django.db.models.fields.related.ForeignKey', [], {'blank': 'True', 'related_name': "'conferences'", 'null': 'True', 'on_delete': 'models.SET_NULL', 'to': "orm['teleforma.WebClassGroup']"})
++        },
++        'teleforma.course': {
++            'Meta': {'ordering': "['number']", 'object_name': 'Course'},
++            'code': ('django.db.models.fields.CharField', [], {'max_length': '255'}),
++            'date_modified': ('django.db.models.fields.DateTimeField', [], {'auto_now': 'True', 'null': 'True', 'blank': 'True'}),
++            'department': ('django.db.models.fields.related.ForeignKey', [], {'related_name': "'course'", 'to': "orm['teleforma.Department']"}),
++            'description': ('django.db.models.fields.CharField', [], {'max_length': '255', 'blank': 'True'}),
++            'has_exam_scripts': ('django.db.models.fields.BooleanField', [], {'default': 'True'}),
++            'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
++            'magistral': ('django.db.models.fields.BooleanField', [], {'default': 'False'}),
++            'number': ('django.db.models.fields.IntegerField', [], {'null': 'True', 'blank': 'True'}),
++            'obligation': ('django.db.models.fields.BooleanField', [], {'default': 'False'}),
++            'oral_1': ('django.db.models.fields.BooleanField', [], {'default': 'False'}),
++            'oral_2': ('django.db.models.fields.BooleanField', [], {'default': 'False'}),
++            'oral_speciality': ('django.db.models.fields.BooleanField', [], {'default': 'False'}),
++            'procedure': ('django.db.models.fields.BooleanField', [], {'default': 'False'}),
++            'quiz': ('django.db.models.fields.related.ManyToManyField', [], {'symmetrical': 'False', 'to': "orm['quiz.Quiz']", 'null': 'True', 'blank': 'True'}),
++            'synthesis_note': ('django.db.models.fields.BooleanField', [], {'default': 'False'}),
++            'title': ('django.db.models.fields.CharField', [], {'max_length': '255'}),
++            'title_tweeter': ('django.db.models.fields.CharField', [], {'max_length': '255'}),
++            'written_speciality': ('django.db.models.fields.BooleanField', [], {'default': 'False'})
++        },
++        'teleforma.coursegroup': {
++            'Meta': {'object_name': 'CourseGroup', 'db_table': "'teleforma_course_group'"},
++            'courses': ('django.db.models.fields.related.ManyToManyField', [], {'blank': 'True', 'related_name': "'course_groups'", 'null': 'True', 'symmetrical': 'False', 'to': "orm['teleforma.Course']"}),
++            'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
++            'name': ('django.db.models.fields.CharField', [], {'max_length': '255'})
++        },
++        'teleforma.coursetype': {
++            'Meta': {'object_name': 'CourseType', 'db_table': "'teleforma_course_type'"},
++            'description': ('django.db.models.fields.CharField', [], {'max_length': '255', 'blank': 'True'}),
++            'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
++            'name': ('django.db.models.fields.CharField', [], {'max_length': '255'})
++        },
++        'teleforma.department': {
++            'Meta': {'object_name': 'Department'},
++            'default_period': ('django.db.models.fields.related.ForeignKey', [], {'blank': 'True', 'related_name': "'departments'", 'null': 'True', 'on_delete': 'models.SET_NULL', 'to': "orm['teleforma.Period']"}),
++            'description': ('django.db.models.fields.CharField', [], {'max_length': '255', 'blank': 'True'}),
++            'domain': ('django.db.models.fields.CharField', [], {'max_length': '255', 'blank': 'True'}),
++            'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
++            'name': ('django.db.models.fields.CharField', [], {'max_length': '255'}),
++            'organization': ('django.db.models.fields.related.ForeignKey', [], {'related_name': "'department'", 'to': "orm['teleforma.Organization']"})
++        },
++        'teleforma.discount': {
++            'Meta': {'object_name': 'Discount', 'db_table': "'teleforma_discounts'"},
++            'description': ('django.db.models.fields.CharField', [], {'max_length': '255', 'blank': 'True'}),
++            'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
++            'student': ('django.db.models.fields.related.ForeignKey', [], {'related_name': "'discounts'", 'to': "orm['teleforma.Student']"}),
++            'value': ('django.db.models.fields.FloatField', [], {})
++        },
++        'teleforma.document': {
++            'Meta': {'ordering': "['-date_added']", 'object_name': 'Document'},
++            'annal_year': ('django.db.models.fields.IntegerField', [], {'null': 'True', 'blank': 'True'}),
++            'code': ('django.db.models.fields.CharField', [], {'max_length': '255', 'blank': 'True'}),
++            'conference': ('django.db.models.fields.related.ForeignKey', [], {'blank': 'True', 'related_name': "'document'", 'null': 'True', 'on_delete': 'models.SET_NULL', 'to': "orm['teleforma.Conference']"}),
++            'course': ('django.db.models.fields.related.ForeignKey', [], {'related_name': "'document'", 'to': "orm['teleforma.Course']"}),
++            'course_type': ('django.db.models.fields.related.ManyToManyField', [], {'symmetrical': 'False', 'related_name': "'document'", 'blank': 'True', 'to': "orm['teleforma.CourseType']"}),
++            'credits': ('django.db.models.fields.CharField', [], {'max_length': '255', 'blank': 'True'}),
++            'date_added': ('django.db.models.fields.DateTimeField', [], {'auto_now_add': 'True', 'null': 'True', 'blank': 'True'}),
++            'date_modified': ('django.db.models.fields.DateTimeField', [], {'auto_now': 'True', 'null': 'True', 'blank': 'True'}),
++            'description': ('django.db.models.fields.CharField', [], {'max_length': '255', 'blank': 'True'}),
++            'file': ('telemeta.models.core.FileField', [], {'default': "''", 'max_length': '1024', 'db_column': "'filename'", 'blank': 'True'}),
++            'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
++            'iej': ('django.db.models.fields.related.ForeignKey', [], {'blank': 'True', 'related_name': "'document'", 'null': 'True', 'on_delete': 'models.SET_NULL', 'to': "orm['teleforma.IEJ']"}),
++            'is_annal': ('django.db.models.fields.BooleanField', [], {'default': 'False'}),
++            'is_published': ('django.db.models.fields.BooleanField', [], {'default': 'False'}),
++            'mime_type': ('django.db.models.fields.CharField', [], {'max_length': '255', 'blank': 'True'}),
++            'periods': ('django.db.models.fields.related.ManyToManyField', [], {'blank': 'True', 'related_name': "'documents'", 'null': 'True', 'symmetrical': 'False', 'to': "orm['teleforma.Period']"}),
++            'readers': ('django.db.models.fields.related.ManyToManyField', [], {'blank': 'True', 'related_name': "'document'", 'null': 'True', 'symmetrical': 'False', 'to': "orm['auth.User']"}),
++            'session': ('django.db.models.fields.CharField', [], {'default': "'1'", 'max_length': '16'}),
++            'title': ('django.db.models.fields.CharField', [], {'max_length': '255', 'blank': 'True'}),
++            'type': ('django.db.models.fields.related.ForeignKey', [], {'blank': 'True', 'related_name': "'document'", 'null': 'True', 'to': "orm['teleforma.DocumentType']"}),
++            'weight': ('django.db.models.fields.IntegerField', [], {'default': '1', 'blank': 'True'})
++        },
++        'teleforma.documentsimple': {
++            'Meta': {'ordering': "['-date_added']", 'object_name': 'DocumentSimple', 'db_table': "'teleforma_document_simple'"},
++            'code': ('django.db.models.fields.CharField', [], {'max_length': '255', 'blank': 'True'}),
++            'credits': ('django.db.models.fields.CharField', [], {'max_length': '255', 'blank': 'True'}),
++            'date_added': ('django.db.models.fields.DateTimeField', [], {'auto_now_add': 'True', 'null': 'True', 'blank': 'True'}),
++            'date_modified': ('django.db.models.fields.DateTimeField', [], {'auto_now': 'True', 'null': 'True', 'blank': 'True'}),
++            'description': ('django.db.models.fields.CharField', [], {'max_length': '255', 'blank': 'True'}),
++            'file': ('telemeta.models.core.FileField', [], {'default': "''", 'max_length': '1024', 'db_column': "'filename'", 'blank': 'True'}),
++            'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
++            'is_published': ('django.db.models.fields.BooleanField', [], {'default': 'False'}),
++            'mime_type': ('django.db.models.fields.CharField', [], {'max_length': '255', 'blank': 'True'}),
++            'period': ('django.db.models.fields.related.ForeignKey', [], {'blank': 'True', 'related_name': "'document_simple'", 'null': 'True', 'on_delete': 'models.SET_NULL', 'to': "orm['teleforma.Period']"}),
++            'readers': ('django.db.models.fields.related.ManyToManyField', [], {'blank': 'True', 'related_name': "'document_simple'", 'null': 'True', 'symmetrical': 'False', 'to': "orm['auth.User']"}),
++            'title': ('django.db.models.fields.CharField', [], {'max_length': '255', 'blank': 'True'}),
++            'weight': ('django.db.models.fields.IntegerField', [], {'default': '1', 'blank': 'True'})
++        },
++        'teleforma.documenttype': {
++            'Meta': {'ordering': "['number']", 'object_name': 'DocumentType', 'db_table': "'teleforma_document_type'"},
++            'description': ('django.db.models.fields.CharField', [], {'max_length': '255', 'blank': 'True'}),
++            'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
++            'name': ('django.db.models.fields.CharField', [], {'max_length': '255'}),
++            'number': ('django.db.models.fields.IntegerField', [], {'null': 'True', 'blank': 'True'})
++        },
++        'teleforma.groupedmessage': {
++            'Meta': {'object_name': 'GroupedMessage', 'db_table': "'teleforma_grouped_messages'"},
++            'date_sent': ('django.db.models.fields.DateTimeField', [], {'null': 'True', 'blank': 'True'}),
++            'group': ('django.db.models.fields.related.ForeignKey', [], {'blank': 'True', 'related_name': "'grouped_messages'", 'null': 'True', 'on_delete': 'models.SET_NULL', 'to': "orm['teleforma.StudentGroup']"}),
++            'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
++            'message': ('django.db.models.fields.TextField', [], {}),
++            'sender': ('django.db.models.fields.related.ForeignKey', [], {'blank': 'True', 'related_name': "'grouped_messages'", 'null': 'True', 'on_delete': 'models.SET_NULL', 'to': "orm['auth.User']"}),
++            'sent': ('django.db.models.fields.BooleanField', [], {'default': 'False'}),
++            'subject': ('django.db.models.fields.CharField', [], {'max_length': '119'}),
++            'to_send': ('django.db.models.fields.BooleanField', [], {'default': 'False'})
++        },
++        'teleforma.home': {
++            'Meta': {'object_name': 'Home'},
++            'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
++            'text': ('tinymce.models.HTMLField', [], {'blank': 'True'}),
++            'video': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['teleforma.Media']", 'null': 'True', 'blank': 'True'})
++        },
++        'teleforma.iej': {
++            'Meta': {'ordering': "['name']", 'object_name': 'IEJ'},
++            'description': ('django.db.models.fields.CharField', [], {'max_length': '255', 'blank': 'True'}),
++            'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
++            'name': ('django.db.models.fields.CharField', [], {'max_length': '255'})
++        },
++        'teleforma.livestream': {
++            'Meta': {'object_name': 'LiveStream', 'db_table': "'teleforma_live_stream'"},
++            'conference': ('django.db.models.fields.related.ForeignKey', [], {'blank': 'True', 'related_name': "'livestream'", 'null': 'True', 'on_delete': 'models.SET_NULL', 'to': "orm['teleforma.Conference']"}),
++            'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
++            'server': ('django.db.models.fields.related.ForeignKey', [], {'related_name': "'livestream'", 'to': "orm['teleforma.StreamingServer']"}),
++            'stream_type': ('django.db.models.fields.CharField', [], {'max_length': '32'}),
++            'streaming': ('django.db.models.fields.BooleanField', [], {'default': 'False'})
++        },
++        'teleforma.media': {
++            'Meta': {'ordering': "['-date_modified', '-conference__session']", 'object_name': 'Media'},
++            'code': ('django.db.models.fields.CharField', [], {'max_length': '255', 'blank': 'True'}),
++            'conference': ('django.db.models.fields.related.ForeignKey', [], {'blank': 'True', 'related_name': "'media'", 'null': 'True', 'on_delete': 'models.SET_NULL', 'to': "orm['teleforma.Conference']"}),
++            'course': ('django.db.models.fields.related.ForeignKey', [], {'blank': 'True', 'related_name': "'media'", 'null': 'True', 'to': "orm['teleforma.Course']"}),
++            'course_type': ('django.db.models.fields.related.ForeignKey', [], {'blank': 'True', 'related_name': "'media'", 'null': 'True', 'to': "orm['teleforma.CourseType']"}),
++            'credits': ('django.db.models.fields.CharField', [], {'max_length': '255', 'blank': 'True'}),
++            'date_added': ('django.db.models.fields.DateTimeField', [], {'auto_now_add': 'True', 'null': 'True', 'blank': 'True'}),
++            'date_modified': ('django.db.models.fields.DateTimeField', [], {'auto_now': 'True', 'null': 'True', 'blank': 'True'}),
++            'description': ('django.db.models.fields.CharField', [], {'max_length': '255', 'blank': 'True'}),
++            'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
++            'is_published': ('django.db.models.fields.BooleanField', [], {'default': 'False'}),
++            'item': ('django.db.models.fields.related.ForeignKey', [], {'blank': 'True', 'related_name': "'media'", 'null': 'True', 'to': "orm['telemeta.MediaItem']"}),
++            'mime_type': ('django.db.models.fields.CharField', [], {'max_length': '255', 'blank': 'True'}),
++            'period': ('django.db.models.fields.related.ForeignKey', [], {'blank': 'True', 'related_name': "'media'", 'null': 'True', 'on_delete': 'models.SET_NULL', 'to': "orm['teleforma.Period']"}),
++            'readers': ('django.db.models.fields.related.ManyToManyField', [], {'blank': 'True', 'related_name': "'media'", 'null': 'True', 'symmetrical': 'False', 'to': "orm['auth.User']"}),
++            'title': ('django.db.models.fields.CharField', [], {'max_length': '255', 'blank': 'True'}),
++            'type': ('django.db.models.fields.CharField', [], {'max_length': '32'}),
++            'weight': ('django.db.models.fields.IntegerField', [], {'default': '1', 'blank': 'True'})
++        },
++        'teleforma.newsitem': {
++            'Meta': {'object_name': 'NewsItem'},
++            'course': ('django.db.models.fields.related.ForeignKey', [], {'related_name': "'newsitems'", 'to': "orm['teleforma.Course']"}),
++            'created': ('django.db.models.fields.DateTimeField', [], {'auto_now_add': 'True', 'blank': 'True'}),
++            'creator': ('django.db.models.fields.related.ForeignKey', [], {'related_name': "'newsitems'", 'to': "orm['auth.User']"}),
++            'deleted': ('django.db.models.fields.BooleanField', [], {'default': 'False'}),
++            'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
++            'period': ('django.db.models.fields.related.ForeignKey', [], {'related_name': "'newsitems'", 'null': 'True', 'to': "orm['teleforma.Period']"}),
++            'text': ('tinymce.models.HTMLField', [], {}),
++            'title': ('django.db.models.fields.CharField', [], {'max_length': '255'})
++        },
++        'teleforma.optionalfee': {
++            'Meta': {'object_name': 'OptionalFee', 'db_table': "'teleforma_optional_fees'"},
++            'description': ('django.db.models.fields.CharField', [], {'max_length': '255', 'blank': 'True'}),
++            'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
++            'student': ('django.db.models.fields.related.ForeignKey', [], {'related_name': "'optional_fees'", 'to': "orm['teleforma.Student']"}),
++            'value': ('django.db.models.fields.FloatField', [], {})
++        },
++        'teleforma.organization': {
++            'Meta': {'object_name': 'Organization'},
++            'description': ('django.db.models.fields.CharField', [], {'max_length': '255', 'blank': 'True'}),
++            'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
++            'name': ('django.db.models.fields.CharField', [], {'max_length': '255'})
++        },
++        'teleforma.payback': {
++            'Meta': {'object_name': 'Payback', 'db_table': "'teleforma_paybacks'"},
++            'description': ('django.db.models.fields.CharField', [], {'max_length': '255', 'blank': 'True'}),
++            'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
++            'student': ('django.db.models.fields.related.ForeignKey', [], {'related_name': "'paybacks'", 'to': "orm['teleforma.Student']"}),
++            'value': ('django.db.models.fields.FloatField', [], {})
++        },
++        'teleforma.payment': {
++            'Meta': {'ordering': "['month']", 'object_name': 'Payment', 'db_table': "'teleforma_payments'"},
++            'collected': ('django.db.models.fields.BooleanField', [], {'default': 'False'}),
++            'date_created': ('django.db.models.fields.DateTimeField', [], {'auto_now_add': 'True', 'blank': 'True'}),
++            'date_modified': ('django.db.models.fields.DateTimeField', [], {'auto_now': 'True', 'blank': 'True'}),
++            'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
++            'month': ('django.db.models.fields.IntegerField', [], {'default': '1'}),
++            'student': ('django.db.models.fields.related.ForeignKey', [], {'related_name': "'payments'", 'to': "orm['teleforma.Student']"}),
++            'type': ('django.db.models.fields.CharField', [], {'max_length': '64'}),
++            'value': ('django.db.models.fields.FloatField', [], {})
++        },
++        'teleforma.period': {
++            'Meta': {'ordering': "['name']", 'object_name': 'Period'},
++            'date_begin': ('django.db.models.fields.DateField', [], {'null': 'True', 'blank': 'True'}),
++            'date_end': ('django.db.models.fields.DateField', [], {'null': 'True', 'blank': 'True'}),
++            'date_exam_end': ('django.db.models.fields.DateTimeField', [], {'null': 'True', 'blank': 'True'}),
++            'date_password_init': ('django.db.models.fields.DateField', [], {'null': 'True', 'blank': 'True'}),
++            'department': ('telemeta.models.core.ForeignKey', [], {'default': 'None', 'related_name': "'period'", 'null': 'True', 'blank': 'True', 'to': "orm['teleforma.Department']"}),
++            'description': ('django.db.models.fields.CharField', [], {'max_length': '255', 'blank': 'True'}),
++            'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
++            'is_open': ('django.db.models.fields.BooleanField', [], {'default': 'True'}),
++            'message_local': ('django.db.models.fields.TextField', [], {'blank': 'True'}),
++            'message_platform': ('django.db.models.fields.TextField', [], {'blank': 'True'}),
++            'name': ('django.db.models.fields.CharField', [], {'max_length': '255'}),
++            'parent': ('django.db.models.fields.related.ForeignKey', [], {'blank': 'True', 'related_name': "'children'", 'null': 'True', 'to': "orm['teleforma.Period']"})
++        },
++        'teleforma.professor': {
++            'Meta': {'ordering': "['user__last_name']", 'object_name': 'Professor'},
++            'courses': ('django.db.models.fields.related.ManyToManyField', [], {'blank': 'True', 'related_name': "'professor'", 'null': 'True', 'symmetrical': 'False', 'to': "orm['teleforma.Course']"}),
++            'department': ('django.db.models.fields.related.ForeignKey', [], {'blank': 'True', 'related_name': "'professor'", 'null': 'True', 'on_delete': 'models.SET_NULL', 'to': "orm['teleforma.Department']"}),
++            'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
++            'user': ('django.db.models.fields.related.ForeignKey', [], {'related_name': "'professor'", 'unique': 'True', 'to': "orm['auth.User']"})
++        },
++        'teleforma.profile': {
++            'Meta': {'object_name': 'Profile', 'db_table': "'teleforma_profiles'"},
++            'address': ('django.db.models.fields.CharField', [], {'max_length': '255', 'blank': 'True'}),
++            'address_detail': ('django.db.models.fields.CharField', [], {'max_length': '255', 'null': 'True', 'blank': 'True'}),
++            'birthday': ('django.db.models.fields.DateField', [], {'null': 'True', 'blank': 'True'}),
++            'city': ('django.db.models.fields.CharField', [], {'max_length': '255', 'blank': 'True'}),
++            'country': ('django.db.models.fields.CharField', [], {'max_length': '255', 'blank': 'True'}),
++            'expiration_date': ('django.db.models.fields.DateField', [], {'null': 'True', 'blank': 'True'}),
++            'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
++            'init_password': ('django.db.models.fields.BooleanField', [], {'default': 'False'}),
++            'language': ('django.db.models.fields.CharField', [], {'max_length': '255', 'blank': 'True'}),
++            'postal_code': ('django.db.models.fields.CharField', [], {'max_length': '255', 'blank': 'True'}),
++            'telephone': ('django.db.models.fields.CharField', [], {'max_length': '255', 'blank': 'True'}),
++            'user': ('django.db.models.fields.related.ForeignKey', [], {'related_name': "'profile'", 'unique': 'True', 'to': "orm['auth.User']"}),
++            'wifi_login': ('django.db.models.fields.CharField', [], {'max_length': '255', 'blank': 'True'}),
++            'wifi_pass': ('django.db.models.fields.CharField', [], {'max_length': '255', 'blank': 'True'})
++        },
++        'teleforma.room': {
++            'Meta': {'object_name': 'Room'},
++            'description': ('django.db.models.fields.CharField', [], {'max_length': '255', 'blank': 'True'}),
++            'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
++            'name': ('django.db.models.fields.CharField', [], {'max_length': '255'}),
++            'organization': ('django.db.models.fields.related.ForeignKey', [], {'related_name': "'room'", 'to': "orm['teleforma.Organization']"})
++        },
++        'teleforma.streamingserver': {
++            'Meta': {'object_name': 'StreamingServer', 'db_table': "'teleforma_streaming_server'"},
++            'admin_password': ('django.db.models.fields.CharField', [], {'max_length': '32', 'blank': 'True'}),
++            'description': ('django.db.models.fields.CharField', [], {'max_length': '255', 'blank': 'True'}),
++            'host': ('django.db.models.fields.CharField', [], {'max_length': '255'}),
++            'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
++            'port': ('django.db.models.fields.CharField', [], {'max_length': '32'}),
++            'source_password': ('django.db.models.fields.CharField', [], {'max_length': '32'}),
++            'type': ('django.db.models.fields.CharField', [], {'max_length': '32'})
++        },
++        'teleforma.student': {
++            'Meta': {'ordering': "['user__last_name', '-date_subscribed']", 'object_name': 'Student'},
++            'application_fees': ('django.db.models.fields.BooleanField', [], {'default': 'False'}),
++            'confirmation_sent': ('django.db.models.fields.BooleanField', [], {'default': 'False'}),
++            'date_registered': ('django.db.models.fields.DateTimeField', [], {'auto_now_add': 'True', 'null': 'True', 'blank': 'True'}),
++            'date_subscribed': ('django.db.models.fields.DateTimeField', [], {'null': 'True', 'blank': 'True'}),
++            'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
++            'iej': ('django.db.models.fields.related.ForeignKey', [], {'blank': 'True', 'related_name': "'student'", 'null': 'True', 'on_delete': 'models.SET_NULL', 'to': "orm['teleforma.IEJ']"}),
++            'is_subscribed': ('django.db.models.fields.BooleanField', [], {'default': 'False'}),
++            'level': ('django.db.models.fields.CharField', [], {'max_length': '100', 'blank': 'True'}),
++            'options': ('django.db.models.fields.related.ForeignKey', [], {'blank': 'True', 'related_name': "'options_students'", 'null': 'True', 'to': "orm['teleforma.Course']"}),
++            'oral_1': ('django.db.models.fields.related.ForeignKey', [], {'blank': 'True', 'related_name': "'oral_1_students'", 'null': 'True', 'to': "orm['teleforma.Course']"}),
++            'oral_2': ('django.db.models.fields.related.ForeignKey', [], {'blank': 'True', 'related_name': "'oral_2_students'", 'null': 'True', 'to': "orm['teleforma.Course']"}),
++            'oral_speciality': ('django.db.models.fields.related.ForeignKey', [], {'blank': 'True', 'related_name': "'oral_speciality_students'", 'null': 'True', 'to': "orm['teleforma.Course']"}),
++            'period': ('django.db.models.fields.related.ForeignKey', [], {'blank': 'True', 'related_name': "'student'", 'null': 'True', 'on_delete': 'models.SET_NULL', 'to': "orm['teleforma.Period']"}),
++            'platform_only': ('django.db.models.fields.BooleanField', [], {'default': 'False'}),
++            'procedure': ('django.db.models.fields.related.ForeignKey', [], {'blank': 'True', 'related_name': "'procedure_students'", 'null': 'True', 'to': "orm['teleforma.Course']"}),
++            'promo_code': ('django.db.models.fields.CharField', [], {'max_length': '100', 'blank': 'True'}),
++            'subscription_fees': ('django.db.models.fields.FloatField', [], {'null': 'True', 'blank': 'True'}),
++            'training': ('django.db.models.fields.related.ForeignKey', [], {'blank': 'True', 'related_name': "'student_training'", 'null': 'True', 'to': "orm['teleforma.Training']"}),
++            'trainings': ('django.db.models.fields.related.ManyToManyField', [], {'blank': 'True', 'related_name': "'student_trainings'", 'null': 'True', 'symmetrical': 'False', 'to': "orm['teleforma.Training']"}),
++            'user': ('django.db.models.fields.related.ForeignKey', [], {'related_name': "'student'", 'unique': 'True', 'to': "orm['auth.User']"}),
++            'written_speciality': ('django.db.models.fields.related.ForeignKey', [], {'blank': 'True', 'related_name': "'written_speciality_2students'", 'null': 'True', 'to': "orm['teleforma.Course']"})
++        },
++        'teleforma.studentgroup': {
++            'Meta': {'object_name': 'StudentGroup', 'db_table': "'teleforma_student_groups'"},
++            'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
++            'name': ('django.db.models.fields.CharField', [], {'max_length': '255'}),
++            'students': ('django.db.models.fields.related.ManyToManyField', [], {'blank': 'True', 'related_name': "'groups'", 'null': 'True', 'symmetrical': 'False', 'to': "orm['teleforma.Student']"})
++        },
++        'teleforma.training': {
++            'Meta': {'object_name': 'Training'},
++            'available': ('django.db.models.fields.BooleanField', [], {'default': 'False'}),
++            'code': ('django.db.models.fields.CharField', [], {'max_length': '255'}),
++            'cost': ('django.db.models.fields.FloatField', [], {'null': 'True', 'blank': 'True'}),
++            'description': ('django.db.models.fields.CharField', [], {'max_length': '512', 'blank': 'True'}),
++            'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
++            'magistral': ('django.db.models.fields.related.ManyToManyField', [], {'blank': 'True', 'related_name': "'training_magistral'", 'null': 'True', 'symmetrical': 'False', 'to': "orm['teleforma.CourseType']"}),
++            'name': ('django.db.models.fields.CharField', [], {'max_length': '255', 'blank': 'True'}),
++            'obligation': ('django.db.models.fields.related.ManyToManyField', [], {'blank': 'True', 'related_name': "'training_obligation'", 'null': 'True', 'symmetrical': 'False', 'to': "orm['teleforma.CourseType']"}),
++            'options': ('django.db.models.fields.related.ManyToManyField', [], {'blank': 'True', 'related_name': "'training_options'", 'null': 'True', 'symmetrical': 'False', 'to': "orm['teleforma.CourseType']"}),
++            'oral_1': ('django.db.models.fields.related.ManyToManyField', [], {'blank': 'True', 'related_name': "'training_oral_1'", 'null': 'True', 'symmetrical': 'False', 'to': "orm['teleforma.CourseType']"}),
++            'oral_2': ('django.db.models.fields.related.ManyToManyField', [], {'blank': 'True', 'related_name': "'training_oral_2'", 'null': 'True', 'symmetrical': 'False', 'to': "orm['teleforma.CourseType']"}),
++            'oral_speciality': ('django.db.models.fields.related.ManyToManyField', [], {'blank': 'True', 'related_name': "'training_oral_speciality'", 'null': 'True', 'symmetrical': 'False', 'to': "orm['teleforma.CourseType']"}),
++            'parent': ('django.db.models.fields.related.ForeignKey', [], {'blank': 'True', 'related_name': "'children'", 'null': 'True', 'to': "orm['teleforma.Training']"}),
++            'period': ('django.db.models.fields.related.ForeignKey', [], {'blank': 'True', 'related_name': "'training'", 'null': 'True', 'to': "orm['teleforma.Period']"}),
++            'procedure': ('django.db.models.fields.related.ManyToManyField', [], {'blank': 'True', 'related_name': "'training_procedure'", 'null': 'True', 'symmetrical': 'False', 'to': "orm['teleforma.CourseType']"}),
++            'synthesis_note': ('django.db.models.fields.related.ManyToManyField', [], {'blank': 'True', 'related_name': "'training_synthesis_note'", 'null': 'True', 'symmetrical': 'False', 'to': "orm['teleforma.CourseType']"}),
++            'written_speciality': ('django.db.models.fields.related.ManyToManyField', [], {'blank': 'True', 'related_name': "'training_written_speciality'", 'null': 'True', 'symmetrical': 'False', 'to': "orm['teleforma.CourseType']"})
++        },
++        'teleforma.webclassgroup': {
++            'Meta': {'ordering': "['name']", 'object_name': 'WebClassGroup'},
++            'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
++            'iejs': ('django.db.models.fields.related.ManyToManyField', [], {'blank': 'True', 'related_name': "'web_class_group'", 'null': 'True', 'symmetrical': 'False', 'to': "orm['teleforma.IEJ']"}),
++            'name': ('django.db.models.fields.CharField', [], {'max_length': '255'})
++        },
++        'telemeta.acquisitionmode': {
++            'Meta': {'ordering': "['value']", 'object_name': 'AcquisitionMode', 'db_table': "'acquisition_modes'"},
++            'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
++            'value': ('telemeta.models.core.CharField', [], {'unique': 'True', 'max_length': '250'})
++        },
++        'telemeta.adconversion': {
++            'Meta': {'ordering': "['value']", 'object_name': 'AdConversion', 'db_table': "'ad_conversions'"},
++            'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
++            'value': ('telemeta.models.core.CharField', [], {'unique': 'True', 'max_length': '250'})
++        },
++        'telemeta.ethnicgroup': {
++            'Meta': {'ordering': "['value']", 'object_name': 'EthnicGroup', 'db_table': "'ethnic_groups'"},
++            'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
++            'value': ('telemeta.models.core.CharField', [], {'unique': 'True', 'max_length': '250'})
++        },
++        'telemeta.genericstyle': {
++            'Meta': {'ordering': "['value']", 'object_name': 'GenericStyle', 'db_table': "'generic_styles'"},
++            'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
++            'value': ('telemeta.models.core.CharField', [], {'unique': 'True', 'max_length': '250'})
++        },
++        'telemeta.language': {
++            'Meta': {'ordering': "['name']", 'object_name': 'Language', 'db_table': "'languages'"},
++            'comment': ('telemeta.models.core.TextField', [], {'default': "''", 'blank': 'True'}),
++            'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
++            'identifier': ('telemeta.models.core.CharField', [], {'default': "''", 'max_length': '3', 'blank': 'True'}),
++            'name': ('telemeta.models.core.CharField', [], {'default': "''", 'max_length': '250', 'blank': 'True'}),
++            'part1': ('telemeta.models.core.CharField', [], {'default': "''", 'max_length': '1', 'blank': 'True'}),
++            'part2B': ('telemeta.models.core.CharField', [], {'default': "''", 'max_length': '3', 'blank': 'True'}),
++            'part2T': ('telemeta.models.core.CharField', [], {'default': "''", 'max_length': '3', 'blank': 'True'}),
++            'scope': ('telemeta.models.core.CharField', [], {'default': "''", 'max_length': '1', 'blank': 'True'}),
++            'type': ('telemeta.models.core.CharField', [], {'default': "''", 'max_length': '1', 'blank': 'True'})
++        },
++        'telemeta.legalright': {
++            'Meta': {'ordering': "['value']", 'object_name': 'LegalRight', 'db_table': "'legal_rights'"},
++            'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
++            'value': ('telemeta.models.core.CharField', [], {'unique': 'True', 'max_length': '250'})
++        },
++        'telemeta.location': {
++            'Meta': {'ordering': "['name']", 'object_name': 'Location', 'db_table': "'locations'"},
++            'complete_type': ('telemeta.models.core.ForeignKey', [], {'related_name': "'locations'", 'to': "orm['telemeta.LocationType']"}),
++            'current_location': ('telemeta.models.core.WeakForeignKey', [], {'default': 'None', 'related_name': "'past_names'", 'null': 'True', 'blank': 'True', 'to': "orm['telemeta.Location']"}),
++            'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
++            'is_authoritative': ('telemeta.models.core.BooleanField', [], {'default': 'False'}),
++            'latitude': ('telemeta.models.core.FloatField', [], {'default': 'None', 'null': 'True', 'blank': 'True'}),
++            'longitude': ('telemeta.models.core.FloatField', [], {'default': 'None', 'null': 'True', 'blank': 'True'}),
++            'name': ('telemeta.models.core.CharField', [], {'unique': 'True', 'max_length': '150'}),
++            'type': ('telemeta.models.core.IntegerField', [], {'default': '0', 'db_index': 'True', 'blank': 'True'})
++        },
++        'telemeta.locationtype': {
++            'Meta': {'ordering': "['name']", 'object_name': 'LocationType', 'db_table': "'location_types'"},
++            'code': ('telemeta.models.core.CharField', [], {'unique': 'True', 'max_length': '64'}),
++            'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
++            'name': ('telemeta.models.core.CharField', [], {'max_length': '150'})
++        },
++        'telemeta.mediacollection': {
++            'Meta': {'ordering': "['code']", 'object_name': 'MediaCollection', 'db_table': "'media_collections'"},
++            'a_informer_07_03': ('telemeta.models.core.CharField', [], {'default': "''", 'max_length': '250', 'blank': 'True'}),
++            'acquisition_mode': ('telemeta.models.core.WeakForeignKey', [], {'default': 'None', 'related_name': "'collections'", 'null': 'True', 'blank': 'True', 'to': "orm['telemeta.AcquisitionMode']"}),
++            'ad_conversion': ('telemeta.models.core.WeakForeignKey', [], {'default': 'None', 'related_name': "'collections'", 'null': 'True', 'blank': 'True', 'to': "orm['telemeta.AdConversion']"}),
++            'alt_ids': ('telemeta.models.core.CharField', [], {'default': "''", 'max_length': '250', 'blank': 'True'}),
++            'alt_title': ('telemeta.models.core.CharField', [], {'default': "''", 'max_length': '250', 'blank': 'True'}),
++            'approx_duration': ('telemeta.models.core.DurationField', [], {'default': "'0'", 'blank': 'True'}),
++            'auto_period_access': ('telemeta.models.core.BooleanField', [], {'default': 'True'}),
++            'booklet_author': ('telemeta.models.core.CharField', [], {'default': "''", 'max_length': '250', 'blank': 'True'}),
++            'booklet_description': ('telemeta.models.core.TextField', [], {'default': "''", 'blank': 'True'}),
++            'cnrs_contributor': ('telemeta.models.core.CharField', [], {'default': "''", 'max_length': '250', 'blank': 'True'}),
++            'code': ('telemeta.models.core.CharField', [], {'unique': 'True', 'max_length': '250'}),
++            'collector': ('telemeta.models.core.CharField', [], {'default': "''", 'max_length': '250', 'blank': 'True'}),
++            'collector_is_creator': ('telemeta.models.core.BooleanField', [], {'default': 'False'}),
++            'comment': ('telemeta.models.core.TextField', [], {'default': "''", 'blank': 'True'}),
++            'conservation_site': ('telemeta.models.core.CharField', [], {'default': "''", 'max_length': '250', 'blank': 'True'}),
++            'creator': ('telemeta.models.core.CharField', [], {'default': "''", 'max_length': '250', 'blank': 'True'}),
++            'doctype_code': ('telemeta.models.core.IntegerField', [], {'default': '0', 'blank': 'True'}),
++            'external_references': ('telemeta.models.core.TextField', [], {'default': "''", 'blank': 'True'}),
++            'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
++            'is_published': ('telemeta.models.core.BooleanField', [], {'default': 'False'}),
++            'items_done': ('telemeta.models.core.CharField', [], {'default': "''", 'max_length': '250', 'blank': 'True'}),
++            'legal_rights': ('telemeta.models.core.WeakForeignKey', [], {'default': 'None', 'related_name': "'collections'", 'null': 'True', 'blank': 'True', 'to': "orm['telemeta.LegalRight']"}),
++            'metadata_author': ('telemeta.models.core.WeakForeignKey', [], {'default': 'None', 'related_name': "'collections'", 'null': 'True', 'blank': 'True', 'to': "orm['telemeta.MetadataAuthor']"}),
++            'metadata_writer': ('telemeta.models.core.WeakForeignKey', [], {'default': 'None', 'related_name': "'collections'", 'null': 'True', 'blank': 'True', 'to': "orm['telemeta.MetadataWriter']"}),
++            'old_code': ('telemeta.models.core.CharField', [], {'default': 'None', 'max_length': '250', 'null': 'True', 'blank': 'True'}),
++            'physical_format': ('telemeta.models.core.WeakForeignKey', [], {'default': 'None', 'related_name': "'collections'", 'null': 'True', 'blank': 'True', 'to': "orm['telemeta.PhysicalFormat']"}),
++            'physical_items_num': ('telemeta.models.core.IntegerField', [], {'default': '0', 'blank': 'True'}),
++            'public_access': ('telemeta.models.core.CharField', [], {'default': "'metadata'", 'max_length': '16', 'blank': 'True'}),
++            'publisher': ('telemeta.models.core.WeakForeignKey', [], {'default': 'None', 'related_name': "'collections'", 'null': 'True', 'blank': 'True', 'to': "orm['telemeta.Publisher']"}),
++            'publisher_collection': ('telemeta.models.core.WeakForeignKey', [], {'default': 'None', 'related_name': "'collections'", 'null': 'True', 'blank': 'True', 'to': "orm['telemeta.PublisherCollection']"}),
++            'publisher_serial': ('telemeta.models.core.CharField', [], {'default': "''", 'max_length': '250', 'blank': 'True'}),
++            'publishing_status': ('telemeta.models.core.WeakForeignKey', [], {'default': 'None', 'related_name': "'collections'", 'null': 'True', 'blank': 'True', 'to': "orm['telemeta.PublishingStatus']"}),
++            'recorded_from_year': ('telemeta.models.core.IntegerField', [], {'default': '0', 'blank': 'True'}),
++            'recorded_to_year': ('telemeta.models.core.IntegerField', [], {'default': '0', 'blank': 'True'}),
++            'recording_context': ('telemeta.models.core.WeakForeignKey', [], {'default': 'None', 'related_name': "'collections'", 'null': 'True', 'blank': 'True', 'to': "orm['telemeta.RecordingContext']"}),
++            'reference': ('telemeta.models.core.CharField', [], {'default': 'None', 'max_length': '250', 'unique': 'True', 'null': 'True', 'blank': 'True'}),
++            'state': ('telemeta.models.core.TextField', [], {'default': "''", 'blank': 'True'}),
++            'title': ('telemeta.models.core.CharField', [], {'max_length': '250'}),
++            'travail': ('telemeta.models.core.CharField', [], {'default': "''", 'max_length': '250', 'blank': 'True'}),
++            'year_published': ('telemeta.models.core.IntegerField', [], {'default': '0', 'blank': 'True'})
++        },
++        'telemeta.mediaitem': {
++            'Meta': {'object_name': 'MediaItem', 'db_table': "'media_items'"},
++            'alt_title': ('telemeta.models.core.CharField', [], {'default': "''", 'max_length': '250', 'blank': 'True'}),
++            'approx_duration': ('telemeta.models.core.DurationField', [], {'default': "'0'", 'blank': 'True'}),
++            'author': ('telemeta.models.core.CharField', [], {'default': "''", 'max_length': '250', 'blank': 'True'}),
++            'auto_period_access': ('telemeta.models.core.BooleanField', [], {'default': 'True'}),
++            'code': ('telemeta.models.core.CharField', [], {'default': "''", 'unique': 'True', 'max_length': '250', 'blank': 'True'}),
++            'collection': ('telemeta.models.core.ForeignKey', [], {'related_name': "'items'", 'to': "orm['telemeta.MediaCollection']"}),
++            'collector': ('telemeta.models.core.CharField', [], {'default': "''", 'max_length': '250', 'blank': 'True'}),
++            'collector_from_collection': ('telemeta.models.core.BooleanField', [], {'default': 'False'}),
++            'collector_selection': ('telemeta.models.core.CharField', [], {'default': "''", 'max_length': '250', 'blank': 'True'}),
++            'comment': ('telemeta.models.core.TextField', [], {'default': "''", 'blank': 'True'}),
++            'context_comment': ('telemeta.models.core.TextField', [], {'default': "''", 'blank': 'True'}),
++            'contributor': ('telemeta.models.core.CharField', [], {'default': "''", 'max_length': '250', 'blank': 'True'}),
++            'copied_from_item': ('telemeta.models.core.WeakForeignKey', [], {'default': 'None', 'related_name': "'copies'", 'null': 'True', 'blank': 'True', 'to': "orm['telemeta.MediaItem']"}),
++            'creator_reference': ('telemeta.models.core.CharField', [], {'default': "''", 'max_length': '250', 'blank': 'True'}),
++            'cultural_area': ('telemeta.models.core.CharField', [], {'default': "''", 'max_length': '250', 'blank': 'True'}),
++            'depositor': ('telemeta.models.core.CharField', [], {'default': "''", 'max_length': '250', 'blank': 'True'}),
++            'digitalist': ('telemeta.models.core.CharField', [], {'default': "''", 'max_length': '250', 'blank': 'True'}),
++            'digitization_date': ('telemeta.models.core.DateField', [], {'default': 'None', 'null': 'True', 'blank': 'True'}),
++            'ethnic_group': ('telemeta.models.core.WeakForeignKey', [], {'default': 'None', 'related_name': "'items'", 'null': 'True', 'blank': 'True', 'to': "orm['telemeta.EthnicGroup']"}),
++            'external_references': ('telemeta.models.core.TextField', [], {'default': "''", 'blank': 'True'}),
++            'file': ('telemeta.models.core.FileField', [], {'default': "''", 'max_length': '1024', 'db_column': "'filename'", 'blank': 'True'}),
++            'generic_style': ('telemeta.models.core.WeakForeignKey', [], {'default': 'None', 'related_name': "'items'", 'null': 'True', 'blank': 'True', 'to': "orm['telemeta.GenericStyle']"}),
++            'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
++            'language': ('telemeta.models.core.CharField', [], {'default': "''", 'max_length': '250', 'blank': 'True'}),
++            'language_iso': ('telemeta.models.core.ForeignKey', [], {'related_name': "'items'", 'on_delete': 'models.SET_NULL', 'default': 'None', 'to': "orm['telemeta.Language']", 'blank': 'True', 'null': 'True'}),
++            'location': ('telemeta.models.core.WeakForeignKey', [], {'default': 'None', 'to': "orm['telemeta.Location']", 'null': 'True', 'blank': 'True'}),
++            'location_comment': ('telemeta.models.core.CharField', [], {'default': "''", 'max_length': '250', 'blank': 'True'}),
++            'mimetype': ('telemeta.models.core.CharField', [], {'default': "''", 'max_length': '255', 'blank': 'True'}),
++            'moda_execut': ('telemeta.models.core.CharField', [], {'default': "''", 'max_length': '250', 'blank': 'True'}),
++            'old_code': ('telemeta.models.core.CharField', [], {'default': "''", 'max_length': '250', 'blank': 'True'}),
++            'organization': ('telemeta.models.core.WeakForeignKey', [], {'default': 'None', 'to': "orm['telemeta.Organization']", 'null': 'True', 'blank': 'True'}),
++            'public_access': ('telemeta.models.core.CharField', [], {'default': "'metadata'", 'max_length': '16', 'blank': 'True'}),
++            'publishing_date': ('telemeta.models.core.DateField', [], {'default': 'None', 'null': 'True', 'blank': 'True'}),
++            'recorded_from_date': ('telemeta.models.core.DateField', [], {'default': 'None', 'null': 'True', 'blank': 'True'}),
++            'recorded_to_date': ('telemeta.models.core.DateField', [], {'default': 'None', 'null': 'True', 'blank': 'True'}),
++            'recordist': ('telemeta.models.core.CharField', [], {'default': "''", 'max_length': '250', 'blank': 'True'}),
++            'rights': ('telemeta.models.core.WeakForeignKey', [], {'default': 'None', 'to': "orm['telemeta.Rights']", 'null': 'True', 'blank': 'True'}),
++            'scientist': ('telemeta.models.core.CharField', [], {'default': "''", 'max_length': '250', 'blank': 'True'}),
++            'summary': ('telemeta.models.core.TextField', [], {'default': "''", 'blank': 'True'}),
++            'title': ('telemeta.models.core.CharField', [], {'default': "''", 'max_length': '250', 'blank': 'True'}),
++            'topic': ('telemeta.models.core.WeakForeignKey', [], {'default': 'None', 'to': "orm['telemeta.Topic']", 'null': 'True', 'blank': 'True'}),
++            'track': ('telemeta.models.core.CharField', [], {'default': "''", 'max_length': '250', 'blank': 'True'}),
++            'url': ('django.db.models.fields.URLField', [], {'max_length': '512', 'blank': 'True'}),
++            'vernacular_style': ('telemeta.models.core.WeakForeignKey', [], {'default': 'None', 'related_name': "'items'", 'null': 'True', 'blank': 'True', 'to': "orm['telemeta.VernacularStyle']"})
++        },
++        'telemeta.metadataauthor': {
++            'Meta': {'ordering': "['value']", 'object_name': 'MetadataAuthor', 'db_table': "'metadata_authors'"},
++            'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
++            'value': ('telemeta.models.core.CharField', [], {'unique': 'True', 'max_length': '250'})
++        },
++        'telemeta.metadatawriter': {
++            'Meta': {'ordering': "['value']", 'object_name': 'MetadataWriter', 'db_table': "'metadata_writers'"},
++            'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
++            'value': ('telemeta.models.core.CharField', [], {'unique': 'True', 'max_length': '250'})
++        },
++        'telemeta.organization': {
++            'Meta': {'ordering': "['value']", 'object_name': 'Organization', 'db_table': "'organization'"},
++            'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
++            'value': ('telemeta.models.core.CharField', [], {'unique': 'True', 'max_length': '250'})
++        },
++        'telemeta.physicalformat': {
++            'Meta': {'ordering': "['value']", 'object_name': 'PhysicalFormat', 'db_table': "'physical_formats'"},
++            'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
++            'value': ('telemeta.models.core.CharField', [], {'unique': 'True', 'max_length': '250'})
++        },
++        'telemeta.publisher': {
++            'Meta': {'ordering': "['value']", 'object_name': 'Publisher', 'db_table': "'publishers'"},
++            'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
++            'value': ('telemeta.models.core.CharField', [], {'unique': 'True', 'max_length': '250'})
++        },
++        'telemeta.publishercollection': {
++            'Meta': {'ordering': "['value']", 'object_name': 'PublisherCollection', 'db_table': "'publisher_collections'"},
++            'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
++            'publisher': ('telemeta.models.core.ForeignKey', [], {'related_name': "'publisher_collections'", 'to': "orm['telemeta.Publisher']"}),
++            'value': ('telemeta.models.core.CharField', [], {'max_length': '250'})
++        },
++        'telemeta.publishingstatus': {
++            'Meta': {'ordering': "['value']", 'object_name': 'PublishingStatus', 'db_table': "'publishing_status'"},
++            'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
++            'value': ('telemeta.models.core.CharField', [], {'unique': 'True', 'max_length': '250'})
++        },
++        'telemeta.recordingcontext': {
++            'Meta': {'ordering': "['value']", 'object_name': 'RecordingContext', 'db_table': "'recording_contexts'"},
++            'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
++            'value': ('telemeta.models.core.CharField', [], {'unique': 'True', 'max_length': '250'})
++        },
++        'telemeta.rights': {
++            'Meta': {'ordering': "['value']", 'object_name': 'Rights', 'db_table': "'rights'"},
++            'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
++            'value': ('telemeta.models.core.CharField', [], {'unique': 'True', 'max_length': '250'})
++        },
++        'telemeta.topic': {
++            'Meta': {'ordering': "['value']", 'object_name': 'Topic', 'db_table': "'topic'"},
++            'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
++            'value': ('telemeta.models.core.CharField', [], {'unique': 'True', 'max_length': '250'})
++        },
++        'telemeta.vernacularstyle': {
++            'Meta': {'ordering': "['value']", 'object_name': 'VernacularStyle', 'db_table': "'vernacular_styles'"},
++            'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
++            'value': ('telemeta.models.core.CharField', [], {'unique': 'True', 'max_length': '250'})
++        }
++    }
++
++    complete_apps = ['teleforma']
index ab9c8c7f6022c32bbf7c22d439e2ad9d5b8e4b11,8cbe59a61394b7af29f5a5b122935e9e966b98d1..5d26fdb826c6bef0707fdc646a0d02d2d97a34e8
@@@ -9,12 -9,12 +9,13 @@@ from django.utils.translation import ug
  from django.core import urlresolvers
  from django.utils.functional import cached_property
  
++
  class AppointmentPeriod(Model):
-     period = models.ForeignKey(Period, related_name='appointment_periods',
-                                verbose_name = u"Période")
+     periods = models.ManyToManyField(Period, related_name='appointment_periods',
 -                                    verbose_name = u"Période")
++                                     verbose_name=u"Période")
      name = models.CharField(_('name'), max_length=255)
-     nb_appointments = models.IntegerField("nombre de rendez-vous autorisé sur la période",
-                                           default=1)
+     nb_appointments = models.IntegerField("nombre de rendez-vous autorisé sur la période",
+                                           default=1)
  
      start = models.DateField("date de début d'inscription")
      end = models.DateField("date de fin d'inscription")
@@@ -23,7 -33,7 +34,7 @@@
          return self.name
  
      def get_appointment(self, user):
--        q = Appointment.objects.filter(student=user, slot__day__appointment_period=self)
++        q = Appointment.objects.filter(student=user, slot__appointment_period=self)
          if q:
              return q.get()
          return None
          """
          Check if the period is open today
          """
-         return self.start <= datetime.date.today() <= self.end
+         return self.start <= datetime.date.today() <= self.end and self.enable_appointment
  
 -    class Meta(MetaCore):
 -        ordering = ('id',)
 -        db_table = app_label + '_appointment_period'
 -        verbose_name = "période de prise de rendez-vous"
 -        verbose_name_plural = "périodes de prise de rendez-vous"
 -
 -class AppointmentDay(Model):
 -    appointment_period = models.ForeignKey(AppointmentPeriod,
 -                                           related_name = "days",
 -                                           verbose_name = u"Période de prise de rendez-vous")
 -    date = models.DateField('date')
 -
 -    def __unicode__(self):
 -        return self.date and self.date.strftime('%d/%m/%Y') or u''
 -
 -    class Meta(MetaCore):
 -        db_table = app_label + '_appointment_date'
 -        verbose_name = "date de prise de rendez-vous"
 -        verbose_name_plural = "dates de prise de rendez-vous"
 -
 -    def changeform_link(self):
 -        if self.id:
 -            # Replace "myapp" with the name of the app containing
 -            # your Certificate model:
 -            changeform_url = urlresolvers.reverse(
 -                'admin:teleforma_appointmentday_change', args=(self.id,)
 -            )
 -            return u'<a href="%s" target="_blank">Détails</a>' % changeform_url
 -        return u''
 -    changeform_link.allow_tags = True
 -    changeform_link.short_description = ''   # omit column header
 -
 -    def get_nb_slots(self):
 -        return sum([ s.nb for s in self.slots.all() ])
 -    get_nb_slots.short_description = 'Nombre de créneaux'
 -
 -    def get_nb_jury(self):
 -        return self.jurys.count()
 -    get_nb_jury.short_description = 'Nombre de jurys'
 -
 -    @property
 -    def period(self):
 -        return self.appointment_period.period
 -
 -    @property
 -    def book_delay(self):
 -        return self.appointment_period.book_delay
 +    def days(self):
 +        days = {}
-         delay = self.period.book_delay
++        delay = self.book_delay
 +        today = datetime.date.today()
-         for slot in AppointmentSlot.objects.filter(period = self.period):
 -    @cached_property
 -    def available_jurys(self):
 -        jurys = self.jurys.all()
 -        available = []
 -        for i, jury in enumerate(jurys):
 -            # first jury is always available
 -            if i==0:
 -                available.append(jury)
++        for slot in AppointmentSlot.objects.filter(appointment_period=self):
 +            if slot.date not in days:
-                 days['slots'] = [slot,]
-                 days['available'] = False
++                days[slot.date] = {}
++                days[slot.date]['date'] = slot.date
++                days[slot.date]['slots'] = [slot, ]
++                days[slot.date]['available'] = False
 +            else:
-                 days['slots'].append(slot)
++                days[slot.date]['slots'].append(slot)
 +
 +            # days are available if they are within the good period and if there are remaining slots
-             if slot.has_available_slots and self.work_day_between(today, self.date) >= delay:
-                 days['available'] = True
-         return days
++            if slot.has_available_slot and self.work_day_between(today, slot.date) >= delay:
++                days[slot.date]['available'] = True
 +
++        # print days
++        return sorted(days.values(), key=lambda d:d['date'])
 +
-     @cached_property
-     def available_jurys(self):
-         jurys = self.jurys.all()
-         available = []
-         for i, jury in enumerate(jurys):
-             # first jury is always available
-             if i==0:
-                 available.append(jury)
++    def nb_jurys_to_show(self, date):
++        min = 100
++        for day in self.days():
++            if day['date'] != date:
                  continue
--
--            previous_jury_has_slot = False
--            has_slot_reserved = False
--            for groupslot in self.slots.all():
++            for groupslot in day['slots']:
                  for slot in groupslot.slots:
--                    if slot['jurys'][i-1]['available']:
--                        previous_jury_has_slot = True
--                    if not slot['jurys'][i]['available']:
--                        has_slot_reserved = True
--            # show only jury who have reserved slots or if previous jury has no more slots
--            if not previous_jury_has_slot or has_slot_reserved:
--                available.append(jury)
--
--        return available
 -
 -    @property
 -    def number_of_available_jurys(self):
 -        return len(self.available_jurys)
++                    for i, jury in enumerate(slot['jurys']):
++                        if jury['available']:
++                            if i < min:
++                                min = i
++        return 1 + min
  
      @staticmethod
      def work_day_between(start, end):
          # If start and end days are in week-end, find the next/previous working day
          ewd = end.weekday()
          if ewd in (5, 6):
--            end -= datetime.timedelta(days = ewd - 4)
++            end -= datetime.timedelta(days=ewd - 4)
  
          swd = start.weekday()
          if swd in (5, 6):
--            start += datetime.timedelta(days = 7 - swd)
++            start += datetime.timedelta(days=7 - swd)
  
          # Don't output any negative number of days
          if end <= start:
  
          return res
  
 +    class Meta(MetaCore):
 +        ordering = ('id',)
 +        db_table = app_label + '_appointment_period'
 +        verbose_name = "période de prise de rendez-vous"
 +        verbose_name_plural = "périodes de prise de rendez-vous"
  
- class AppointmentDay(Model):
-     appointment_period = models.ForeignKey(AppointmentPeriod,
-                                            related_name = "days",
-                                            verbose_name = u"Période de prise de rendez-vous")
-     date = models.DateField('date')
-     def __unicode__(self):
-         return self.date and self.date.strftime('%d/%m/%Y') or u''
-     class Meta(MetaCore):
-         db_table = app_label + '_appointment_date'
-         verbose_name = "date de prise de rendez-vous"
-         verbose_name_plural = "dates de prise de rendez-vous"
-     def changeform_link(self):
-         if self.id:
-             # Replace "myapp" with the name of the app containing
-             # your Certificate model:
-             changeform_url = urlresolvers.reverse(
-                 'admin:teleforma_appointmentday_change', args=(self.id,)
-             )
-             return u'<a href="%s" target="_blank">Détails</a>' % changeform_url
-         return u''
-     changeform_link.allow_tags = True
-     changeform_link.short_description = ''   # omit column header
-     def get_nb_slots(self):
-         return sum([ s.nb for s in self.slots.all() ])
-     get_nb_slots.short_description = 'Nombre de créneaux'
-     def get_nb_jury(self):
-         return self.jurys.count()
-     get_nb_jury.short_description = 'Nombre de jurys'
-     @property
-     def period(self):
-         return self.appointment_period.period
-     @property
-     def number_of_available_jurys(self):
-         return len(self.available_jurys)
 -    def can_book_today(self):
 -        """
 -        Check if we can book something today due to the delay and available slots
 -        """
 -        delay = self.book_delay
 -        today = datetime.date.today()
 -        delay_ok = self.work_day_between(today, self.date) >= delay
  
 -        available = False
 -        for groupslot in self.slots.all():
 -            if groupslot.has_available_slot:
 -                available = True
 -                break
 -        return delay_ok and available
++# class AppointmentDay(Model):
++#     appointment_period = models.ForeignKey(AppointmentPeriod,
++#                                            related_name = "days",
++#                                            verbose_name = u"Période de prise de rendez-vous")
++#     date = models.DateField('date')
++#
++#     def __unicode__(self):
++#         return self.date and self.date.strftime('%d/%m/%Y') or u''
++#
++#     class Meta(MetaCore):
++#         db_table = app_label + '_appointment_date'
++#         verbose_name = "date de prise de rendez-vous"
++#         verbose_name_plural = "dates de prise de rendez-vous"
++#
 +
  
  class AppointmentSlot(Model):
 -    day = models.ForeignKey(AppointmentDay,
 -                            related_name = 'slots',
 -                            verbose_name = 'jour')
 +    # day = models.ForeignKey(AppointmentDay,
 +    #                         related_name = 'slots',
 +    #                         verbose_name = 'jour')
 +    appointment_period = models.ForeignKey(AppointmentPeriod,
-                                            related_name="days",
-                                            verbose_name=u"Période de prise de rendez-vous")
-     date = models.DateField('date')
++                                           related_name="slots",
++                                           verbose_name=u"Période de prise de rendez-vous", null=True, blank=False)
++    date = models.DateField('date', null=True, blank=False)
  
      start = models.TimeField("heure du premier créneau (heure d'arrivée)")
      nb = models.IntegerField('nombre de créneaux')
  
      def __unicode__(self):
--        return unicode(self.day) + ' ' + (self.start and self.start.strftime('%H:%M') or '')
++        return unicode(self.date) + ' ' + (self.start and self.start.strftime('%H:%M') or '')
  
      class Meta(MetaCore):
          ordering = ('id',)
          verbose_name = "créneau de rendez-vous"
          verbose_name_plural = "créneaux de rendez-vous"
  
--    @property
--    def period(self):
--        return self.day.period
  
 -    @property
 -    def appointment_period(self):
 -        return self.day.appointment_period
 +    # @property
 +    # def slots_from_same_day(self):
 +    #     slots = AppointmentSlot.objets.filter(appointment_period=self.appointment_period, date=self.date)
 +
++    def get_nb_jury(self):
++        return self.jurys.count()
++    get_nb_jury.short_description = "Nombre de jurys"
++
++
++    def get_visible_jurys(self):
++        return self.jurys.order_by('id')[:self.appointment_period.nb_jurys_to_show(self.date)]
 +
++    @cached_property
++    def get_nb_of_visible_jurys(self):
++        return self.appointment_period.nb_jurys_to_show(self.date)
  
      @cached_property
      def slots(self):
          res = []
-         size = self.period.appointment_slot_size
+         size = self.appointment_period.appointment_slot_size
  
          # slots reserved per jury
 -        jurys = self.day.jurys.all()
 +        jurys = self.jurys.all()
          jurys_slots = []
--        for jury in jurys:
--            jurys_slots.append([ap.slot_nb for ap in self.appointments.filter(jury=jury)])
  
++        for jury in jurys:
++            jurys_slots.append([ap.slot_nb for ap in self.appointments.filter(jury=jury, slot=self)])
  
          for i in range(self.nb):
 -            # for jury in self
--            arrival = datetime.datetime.combine(self.day.date, self.start) + datetime.timedelta(minutes = i * size)
--            start = arrival + datetime.timedelta(minutes = 60)
--            end = start + datetime.timedelta(minutes = size)
++            arrival = datetime.datetime.combine(self.date, self.start) + datetime.timedelta(minutes=i * size)
++            start = arrival + datetime.timedelta(minutes=60)
++            end = start + datetime.timedelta(minutes=size)
  
              slot_info = {
--                'slot_nb':i,
--                'start':start,
--                'end':end,
--                'arrival':arrival,
++                'slot_nb': i,
++                'start': start,
++                'end': end,
++                'arrival': arrival,
              }
 +
 +            # compute if a slot is available for each jury
              sjurys = []
              for j, jury in enumerate(jurys):
--                sjurys.append({'id':jury.id, 'available':i not in jurys_slots[j]})
++                sjurys.append({'id': jury.id, 'available': i not in jurys_slots[j]})
              slot_info['jurys'] = sjurys
              res.append(slot_info)
  
              # res.append(self.start + datetime.timedelta(minutes = i * size))
++        # print res
          return res
  
      @property
                      return True
          return False
  
++    @property
++    def can_book_today(self):
++        delay = self.appointment_period.book_delay
++        today = datetime.date.today()
++        return self.appointment_period.work_day_between(today, self.date) >= delay
++
++
  class AppointmentJury(Model):
-     slot = models.ForeignKey(AppointmentDay,
 -    day = models.ForeignKey(AppointmentDay,
--                            related_name = 'jurys',
-                             verbose_name = 'creneau')
 -                            verbose_name = 'jour')
++    slot = models.ForeignKey(AppointmentSlot,
++                             related_name='jurys',
++                             verbose_name='creneau', null=True, blank=False)
  
      name = models.CharField(_('name'), max_length=255)
      address = models.TextField("adresse")
  
  class Appointment(Model):
      slot = models.ForeignKey(AppointmentSlot, related_name="appointments",
--                             verbose_name = u"créneau")
--    student = models.ForeignKey(User, related_name = "appointments",
++                             verbose_name=u"créneau")
++    student = models.ForeignKey(User, related_name="appointments",
                                  verbose_name="étudiant")
      jury = models.ForeignKey(AppointmentJury, related_name="appointments",
--                             verbose_name = "jury")
++                             verbose_name="jury", on_delete=models.SET_NULL, blank=False, null=True)
      slot_nb = models.IntegerField('numéro du créneau')
  
      def __unicode__(self):
          unique_together = ('slot', 'jury', 'slot_nb')
  
      @property
--    def period(self):
-         return self.slot.period
 -        return self.slot.day.appointment_period
++    def appointment_period(self):
++        return self.slot.appointment_period
  
      @property
      def day(self):
--        return self.slot.day
++        return self.slot.date
  
      @property
      def start(self):
  
      @property
      def end(self):
--        dt = datetime.datetime.combine(datetime.date.today(), self.start) + datetime.timedelta(minutes=self.period.appointment_slot_size)
++        dt = datetime.datetime.combine(datetime.date.today(), self.start) + datetime.timedelta(
++            minutes=self.appointment_period.appointment_slot_size)
          return datetime.time(dt.hour, dt.minute, 0)
  
      @property
      def arrival(self):
          start = self.slot.start
--        delta = self.slot_nb * self.period.appointment_slot_size
++        delta = self.slot_nb * self.appointment_period.appointment_slot_size
          dt = datetime.datetime.combine(datetime.date.today(), start) + datetime.timedelta(minutes=delta)
          return datetime.time(dt.hour, dt.minute, 0)
  
      @property
      def real_date(self):
--        return datetime.datetime.combine(self.day.date, self.arrival)
++        return datetime.datetime.combine(self.day, self.arrival)
  
      @property
      def real_date_human(self):
          return self.real_date.strftime('%d/%m/%Y %H:%M')
  
      def can_cancel(self):
--        delay = self.period.cancel_delay
++        delay = self.appointment_period.cancel_delay
          today = datetime.date.today()
--        return AppointmentDay.work_day_between(today, self.day.date) >= delay
++        return AppointmentPeriod.work_day_between(today, self.slot.date) >= delay
index 6f266dd0e11e3195ba6bea2325aa488b3fd3292b,3c39ab7bd181ca6870b9c75c21c79e5101d3409f..f1c7528d37ccbac18216edf55a12789afa6653ff
                  <a class="previous_day">Précédent</a>
                  <select name="day-to-show">
                      {% for day in ap_period.days %}
--                        {% if day.can_book_today %}
--                            <option value="{{ day.id }}">{{ day }}</option>
++                        {% if day.available %}
++                            <option value="{{ day.date|date:'Y_m_d' }}">{{ day.date }}</option>
                          {% endif %}
                      {% endfor %}
                  </select>
              </div>
  
              {% for day in ap_period.days %}
--                {% if day.can_book_today %}
--                    <section data-day="{{ day.id }}" class="booking_day">
--                        <h2 class="day">{{ day }}</h2>
++                {% if day.available %}
++                    <section data-day="{{ day.date|date:'Y_m_d' }}" class="booking_day">
++                        <h2 class="day">{{ day.date }}</h2>
                          <table border="1">
--                            <thead>
--                            <tr>
--                                <th>
--                                    Heure d'arrivé
--                                </th>
--                                <th style="display:none">
--                                    Heure de début
--                                </th>
--                                <th style="display:none">
--                                    Heure de fin
--                                </th>
--                                {% for jury in day.available_jurys %}
++{#                            <thead>#}
++{#                            <tr>#}
++{#                                <th>#}
++{#                                    Heure d'arrivé#}
++{#                                </th>#}
++{#                                <th style="display:none">#}
++{#                                    Heure de début#}
++{#                                </th>#}
++{#                                <th style="display:none">#}
++{#                                    Heure de fin#}
++{#                                </th>#}
++{#                                {% for jury in day.available_jurys %}#}
++{#                                    <th>#}
++{#                                        Jury {{ forloop.counter }}#}
++{#                                        <div data-jury="{{ jury.id }}">#}
++{#                                            <input type="hidden" name="jury_name" value="{{ jury.name }}"/>#}
++{#                                            <input type="hidden" name="jury_address" value="{{ jury.address }}"/>#}
++{#                                        </div>#}
++{#                                    </th>#}
++{#                                {% endfor %}#}
++{#                            </tr>#}
++{#                            </thead>#}
++                            <tbody>
++                            {% for groupslot in day.slots %}
++
++                                <tr class="separator">
++                                    <th>Heure d'arrivé</th>
++                                    {% for jury in groupslot.get_visible_jurys %}
                                      <th>
                                          Jury {{ forloop.counter }}
                                          <div data-jury="{{ jury.id }}">
                                              <input type="hidden" name="jury_address" value="{{ jury.address }}"/>
                                          </div>
                                      </th>
--                                {% endfor %}
--                            </tr>
--                            </thead>
--                            <tbody>
--                            {% for groupslot in day.slots.all %}
++                                    {% endfor %}
++                                </tr>
++
                                  {% for slot in groupslot.slots %}
                                      <tr>
                                          <td class="arrival">
                                          </td>
  
                                          {% for jury in slot.jurys %}
--                                            {% if forloop.counter0 < day.number_of_available_jurys %}
++                                            {% if forloop.counter0 < groupslot.get_nb_of_visible_jurys %}
                                                  <td>
                                                      {% if jury.available %}
                                                          <form class="booking_form" method="POST">
                                          {% endfor %}
                                      </tr>
                                  {% endfor %}
--                                {% if not forloop.last %}
--                                    <tr class="separator">
--                                        <td colspan="{{ day.number_of_available_jurys|add:3 }}">--</td>
--                                    </tr>
--                                {% endif %}
                              {% endfor %}
  
                              </tbody>
index aba27107e879999609135401eb1cba537c267e31,3dc4319f63869967799c27f6a9cb32504d924a93..31ed4daa620f246156d181ee97fade0b55dfe2cf
@@@ -11,7 -11,7 +11,7 @@@ from django.db import IntegrityErro
  from django.core.mail import send_mail
  from django.conf import settings
  
--from teleforma.models.appointment import AppointmentPeriod, Appointment, AppointmentDay, AppointmentSlot
++from teleforma.models.appointment import AppointmentPeriod, Appointment, AppointmentSlot
  
  from teleforma.views.core import get_periods
  
@@@ -29,8 -29,8 +29,6 @@@ class Appointments(View)
          periods = [ p for p in get_periods(user) if int(p.id) == period_id ]
          if not periods:
              return HttpResponse('Unauthorized', status=401)
-         if not periods[0].enable_appointment:
-             return HttpResponse('Unauthorized', status=401)
 -        # if not periods[0].enable_appointment:
 -        #     return HttpResponse('Unauthorized', status=401)
          return
  
      def render(self, request, period_id):
  
          # Get info
          ap_periods = []
-         for ap_period in AppointmentPeriod.objects.filter(period=period_id).order_by('id'):
+         for ap_period in AppointmentPeriod.objects.filter(periods__id=period_id).order_by('id'):
              if ap_period.is_open:
                  ap_periods.append({
--                    'days':ap_period.days.all(),
++                    'days':ap_period.days(),
                      'name': ap_period.name,
--                    'appointment':ap_period.get_appointment(request.user)
++                    'appointment':ap_period.get_appointment(user)
                  })
          # for ap_period in ap_periods:
          #     appointments[ap_period.id] = ap_period.get_appointments(request.user)
          return render(request, self.template_name, {'ap_periods': ap_periods, 'period_id':period_id})
  
--    def check_validity(self, user, slot_id, slot_nb, jury_id, day_id):
++    def check_validity(self, user, slot_id, slot_nb, jury_id):
          """
          Check if we can register to this exact slot
          """
--        day = get_object_or_404(AppointmentDay, id = day_id)
--
--        # Check the period is open
--        if not day.appointment_period.is_open:
--            return u"La période d'inscription n'est pas ouverte"
--        # Check we are least delay (ie, 48h) before the date
--        if not day.can_book_today():
--            delay = day.book_delay
++        slot = get_object_or_404(AppointmentSlot, id = slot_id)
++
++        # Check the period is open and
++        if not slot.appointment_period.is_open:
++            return u"La période de prise de rendez-vous est fermé."
++        # Check  we are least delay (ie, 48h) before the date
++        if not slot.can_book_today:
++            delay = slot.appointment_period.book_delay
              return u"Vous devez réserver au moins %d jours ouvrés à l'avance" % delay
          # Check if this jury is open
--        jurys = day.available_jurys
++        jurys = slot.get_visible_jurys()
          if not jury_id in [ j.id for j in jurys ]:
              return u"Ce jury n'est pas ouvert"
          # Check if this slot is empty
@@@ -76,7 -76,7 +74,7 @@@
          if slot_nb >= slot.nb:
              return u"Ce créneau n'existe pas"
          # Check we don't have another appointment on this period
--        if day.appointment_period.get_appointment(user):
++        if slot.appointment_period.get_appointment(user):
              return u"Vous avez déjà un rendez-vous"
  
      def post(self, request, period_id):
          slot_nb = int(request.POST.get('slot_nb'))
          slot_id = int(request.POST.get('slot'))
          jury_id = int(request.POST.get('jury'))
--        day_id = int(request.POST.get('day'))
  
--        msg = self.check_validity(user, slot_id, slot_nb, jury_id, day_id)
++        msg = self.check_validity(user, slot_id, slot_nb, jury_id)
  
          if not msg:
              ap = Appointment()
              ap.slot_nb = slot_nb
              ap.slot_id = slot_id
              ap.jury_id = jury_id
--            ap.day_id = day_id
              ap.student = user
              try:
                  ap.save()
                   'jury_address': ap.jury.address,
                   'date': ap.real_date,
                   'student': ap.student,
--                 'main_text': ap.period.appointment_mail_text }
++                 'main_text': ap.appointment_period.appointment_mail_text }
          # DEBUG
-         #data['mto'] = "gael@pilotsystems.net"
-         #data['mto'] = "dorothee.lavalle@pre-barreau.com"
 -        # data['mto'] = "gael@pilotsystems.net"
++        data['mto'] = "yoanl@pilotsystems.net"
+         # data['mto'] = "dorothee.lavalle@pre-barreau.com"
  
          subject_template = 'teleforma/messages/email_appointment_sujet.txt'
          message_template = 'teleforma/messages/email_appointment.txt'
@@@ -151,7 -151,7 +147,7 @@@ def cancel_appointment(request)
          return HttpResponse('Unauthorized', status=401)
  
      if not app.can_cancel():
--        messages.add_message(request, messages.ERROR, ' Il est trop tard pour annuler ce rendez-vous.')
++        messages.add_message(request, messages.ERROR, 'Il est trop tard pour annuler ce rendez-vous.')
          return redirect('teleforma-appointments', period_id=period_id)
  
      app.delete()