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):
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)
--- /dev/null
--- /dev/null
++# -*- 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']
--- /dev/null
--- /dev/null
++# -*- 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']
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")
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
<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>
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
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
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'
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()