From: Yoan Le Clanche Date: Mon, 1 Oct 2018 09:04:49 +0000 (+0200) Subject: Merge branch 'dev' into appointment X-Git-Tag: 1.4.0~36 X-Git-Url: https://git.parisson.com/?a=commitdiff_plain;h=bf7875c232f32253f18a31728da1d8986dfd7cac;p=teleforma.git Merge branch 'dev' into appointment --- bf7875c232f32253f18a31728da1d8986dfd7cac diff --cc teleforma/admin.py index a926f5fe,9288d2bc..c72f5202 --- a/teleforma/admin.py +++ b/teleforma/admin.py @@@ -177,33 -190,41 +190,41 @@@ class AppointmentSlotInline(admin.Tabul class AppointmentJuryInline(admin.StackedInline): model = AppointmentJury - class AppointmentDayInline(admin.TabularInline): - readonly_fields = ('get_nb_slots', 'get_nb_jury', 'changeform_link', ) - model = AppointmentDay + -class AppointmentDayInline(admin.TabularInline): - readonly_fields = ('get_nb_slots', 'get_nb_jury', 'changeform_link', ) - model = AppointmentDay ++# class AppointmentDayInline(admin.TabularInline): ++# readonly_fields = ('get_nb_slots', 'get_nb_jury', 'changeform_link', ) ++# model = AppointmentDay + class AppointmentPeriodAdmin(admin.ModelAdmin): - list_filter = ('period',) - list_display = ('name', 'period', 'nb_appointments') + list_display = ('name', 'periods_names', 'start', 'end', 'enable_appointment') + - inlines = [ AppointmentDayInline ] ++ # inlines = [ AppointmentDayInline ] - inlines = [ AppointmentDayInline ] + def periods_names(self, instance): + return ','.join([period.name for period in instance.periods.all()]) + periods_names.short_description = "Périodes" --class AppointmentDayAdmin(admin.ModelAdmin): -- list_filter = ('appointment_period',) -- list_display = ('date', 'appointment_period', 'get_nb_slots', 'get_nb_jury') - - inlines = [ AppointmentSlotInline, AppointmentJuryInline ] ++# class AppointmentDayAdmin(admin.ModelAdmin): ++# list_filter = ('appointment_period',) ++# list_display = ('date', 'appointment_period', 'get_nb_slots', 'get_nb_jury') ++# ++# inlines = [ AppointmentSlotInline, AppointmentJuryInline ] - inlines = [ AppointmentSlotInline, AppointmentJuryInline ] class AppointmentSlotAdmin(admin.ModelAdmin): -- list_filter = ('day',) -- list_display = ('day', 'start', 'nb') - ++ list_filter = ('date',) ++ list_display = ('date', 'start', 'nb', 'get_nb_jury') ++ inlines = [AppointmentJuryInline] class AppointmentJuryAdmin(admin.ModelAdmin): -- list_filter = ('day',) -- list_display = ('name', 'day') ++ list_filter = ('slot',) ++ list_display = ('name', 'slot') + class AppointmentAdmin(admin.ModelAdmin): list_display = ('real_date', 'student', 'jury') -- list_filter = ('slot__day__date', 'slot__day__appointment_period') ++ list_filter = ('slot__date', 'slot__appointment_period') actions = ['export_csv'] def export_csv(self, request, queryset): @@@ -254,7 -276,7 +276,7 @@@ admin.site.register(GroupedMessage admin.site.register(Home, HomeAdmin) admin.site.register(NewsItem, NewsItemAdmin) admin.site.register(AppointmentPeriod, AppointmentPeriodAdmin) --admin.site.register(AppointmentDay, AppointmentDayAdmin) ++# admin.site.register(AppointmentDay, AppointmentDayAdmin) admin.site.register(AppointmentSlot, AppointmentSlotAdmin) admin.site.register(AppointmentJury, AppointmentJuryAdmin) admin.site.register(Appointment, AppointmentAdmin) diff --cc teleforma/migrations/0104_auto__del_appointmentday__del_field_appointmentperiod_book_delay__del_.py index 00000000,00000000..5fbc84e9 new file mode 100644 --- /dev/null +++ b/teleforma/migrations/0104_auto__del_appointmentday__del_field_appointmentperiod_book_delay__del_.py @@@ -1,0 -1,0 +1,810 @@@ ++# -*- coding: utf-8 -*- ++from south.utils import datetime_utils as datetime ++from south.db import db ++from south.v2 import SchemaMigration ++from django.db import models ++from django.db import connection ++ ++ ++class Migration(SchemaMigration): ++ ++ def forwards(self, orm): ++ if not db.dry_run: ++ cursor = connection.cursor() ++ cursor.execute("select id, appointment_period_id, date from teleforma_appointment_date") ++ results = cursor.fetchall() ++ ++ dates = [] ++ for result in results: ++ ++ cursor.execute("select id from teleforma_appointment_slot where day_id=%s" % result[0]) ++ slots_ids = [slot[0] for slot in cursor.fetchall()] ++ ++ cursor.execute("select id, name, address from teleforma_appointment_jury where day_id=%s" % result[0]) ++ jurys_sql = cursor.fetchall() ++ slots = [] ++ for slot_id in slots_ids: ++ jurys = [] ++ for jury in jurys_sql: ++ cursor.execute("select id, slot_id from teleforma_appointment where jury_id=%s" % jury[0]) ++ apps = cursor.fetchall() ++ appointments = [app[0] for app in apps if app[1]==slot_id] ++ print appointments ++ jurys.append({ ++ 'id': jury[0], ++ 'name': jury[1], ++ 'address': jury[2], ++ 'appointments': appointments ++ }) ++ ++ slots.append({ ++ 'id':slot_id, ++ 'jurys':jurys ++ }) ++ print slots ++ ++ ++ dates.append({ ++ 'id':result[0], ++ 'period': result[1], ++ 'date': result[2], ++ 'slots':slots ++ }) ++ ++ # appointments = {} ++ # cursor.execute("select id, jury_id from teleforma_appointment") ++ # for appointment in cursor.fetchall(): ++ # appointments[appointment[0]] = appointment[1] ++ ++ print dates ++ ++ ++ # from teleforma.models import AppointmentDay ++ # for day in AppointmentDay.objects.all(): ++ # ++ # corpus.descriptions = corpus.description ++ # corpus.save() ++ # ++ # for fonds in MediaFonds.objects.all(): ++ # fonds.descriptions = fonds.description ++ # fonds.save() ++ ++ ++ # Deleting model 'AppointmentDay' ++ db.delete_table('teleforma_appointment_date') ++ ++ # Deleting field 'AppointmentPeriod.book_delay' ++ db.delete_column('teleforma_appointment_period', 'book_delay') ++ ++ # Deleting field 'AppointmentPeriod.nb_appointments' ++ db.delete_column('teleforma_appointment_period', 'nb_appointments') ++ ++ # Deleting field 'AppointmentJury.day' ++ db.delete_column('teleforma_appointment_jury', 'day_id') ++ ++ # Adding field 'AppointmentJury.slot' ++ db.add_column('teleforma_appointment_jury', 'slot', ++ self.gf('django.db.models.fields.related.ForeignKey')(related_name='jurys', null=True, to=orm['teleforma.AppointmentSlot']), ++ keep_default=False) ++ ++ # Deleting field 'AppointmentSlot.day' ++ db.delete_column('teleforma_appointment_slot', 'day_id') ++ ++ # Adding field 'AppointmentSlot.date' ++ db.add_column('teleforma_appointment_slot', 'date', ++ self.gf('django.db.models.fields.DateField')(null=True), ++ keep_default=False) ++ ++ # Adding field 'AppointmentSlot.appointment_period' ++ db.add_column('teleforma_appointment_slot', 'appointment_period', ++ self.gf('django.db.models.fields.related.ForeignKey')(related_name='slots', null=True, ++ to=orm['teleforma.AppointmentPeriod']), ++ keep_default=False) ++ ++ # Changing field 'Appointment.jury' ++ db.alter_column('teleforma_appointment', 'jury_id', self.gf('django.db.models.fields.related.ForeignKey')(null=True, on_delete=models.SET_NULL, to=orm['teleforma.AppointmentJury'])) ++ ++ if not db.dry_run: ++ from teleforma.models import Appointment, AppointmentSlot, AppointmentJury ++ AppointmentJury.objects.all().delete() ++ ++ for date in dates: ++ ++ # recreate juries and update slot date ++ for slotD in date['slots']: ++ # import pdb;pdb.set_trace() ++ slot = AppointmentSlot.objects.get(id=slotD['id']) ++ slot.date = date['date'] ++ slot.appointment_period_id = date['period'] ++ slot.save() ++ for jury in slotD['jurys']: ++ juryObj = AppointmentJury(slot=slot, name=jury['name'], address=jury['address']) ++ juryObj.save() ++ for app in jury['appointments']: ++ appointment = Appointment.objects.get(id=app) ++ appointment.jury = juryObj ++ appointment.save() ++ ++ ++ ++ ++ def backwards(self, orm): ++ pass ++ # # User chose to not deal with backwards NULL issues for 'AppointmentJury.day' ++ # raise RuntimeError("Cannot reverse this migration. 'AppointmentJury.day' and its values cannot be restored.") ++ # ++ # # Adding model 'AppointmentDay' ++ # db.create_table('teleforma_appointment_date', ( ++ # ('date', self.gf('django.db.models.fields.DateField')()), ++ # ('id', self.gf('django.db.models.fields.AutoField')(primary_key=True)), ++ # ('appointment_period', self.gf('django.db.models.fields.related.ForeignKey')(related_name='days', to=orm['teleforma.AppointmentPeriod'])), ++ # )) ++ # db.send_create_signal('teleforma', ['AppointmentDay']) ++ # ++ # # Adding field 'AppointmentPeriod.book_delay' ++ # db.add_column('teleforma_appointment_period', 'book_delay', ++ # self.gf('django.db.models.fields.IntegerField')(default=2), ++ # keep_default=False) ++ # ++ # # Adding field 'AppointmentPeriod.nb_appointments' ++ # db.add_column('teleforma_appointment_period', 'nb_appointments', ++ # self.gf('django.db.models.fields.IntegerField')(default=1), ++ # keep_default=False) ++ # ++ # ++ # ++ # ++ # # The following code is provided here to aid in writing a correct migration # Adding field 'AppointmentJury.day' ++ # db.add_column('teleforma_appointment_jury', 'day', ++ # self.gf('django.db.models.fields.related.ForeignKey')(related_name='jurys', to=orm['teleforma.AppointmentDay']), ++ # keep_default=False) ++ # ++ # # Deleting field 'AppointmentJury.slot' ++ # db.delete_column('teleforma_appointment_jury', 'slot_id') ++ # ++ # ++ # # User chose to not deal with backwards NULL issues for 'AppointmentSlot.day' ++ # raise RuntimeError("Cannot reverse this migration. 'AppointmentSlot.day' and its values cannot be restored.") ++ # ++ # # The following code is provided here to aid in writing a correct migration # Adding field 'AppointmentSlot.day' ++ # db.add_column('teleforma_appointment_slot', 'day', ++ # self.gf('django.db.models.fields.related.ForeignKey')(related_name='slots', to=orm['teleforma.AppointmentDay']), ++ # keep_default=False) ++ # ++ # # Deleting field 'AppointmentSlot.date' ++ # db.delete_column('teleforma_appointment_slot', 'date') ++ # ++ # Deleting field 'AppointmentSlot.appointment_period' ++ # db.delete_column('teleforma_appointment_slot', 'appointment_period_id') ++ # The following code is provided here to aid in writing a correct migration ++ # Changing field 'Appointment.jury' ++ #db.alter_column('teleforma_appointment', 'jury_id', ++ # self.gf('django.db.models.fields.related.ForeignKey')(to=orm['teleforma.AppointmentJury'])) ++ # Deleting field 'AppointmentSlot.appointment_period' ++ #db.delete_column('teleforma_appointment_slot', 'appointment_period_id') ++ ++ ++ models = { ++ 'auth.group': { ++ 'Meta': {'object_name': 'Group'}, ++ 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), ++ 'name': ('django.db.models.fields.CharField', [], {'unique': 'True', 'max_length': '80'}), ++ 'permissions': ('django.db.models.fields.related.ManyToManyField', [], {'to': "orm['auth.Permission']", 'symmetrical': 'False', 'blank': 'True'}) ++ }, ++ 'auth.permission': { ++ 'Meta': {'ordering': "('content_type__app_label', 'content_type__model', 'codename')", 'unique_together': "(('content_type', 'codename'),)", 'object_name': 'Permission'}, ++ 'codename': ('django.db.models.fields.CharField', [], {'max_length': '100'}), ++ 'content_type': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['contenttypes.ContentType']"}), ++ 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), ++ 'name': ('django.db.models.fields.CharField', [], {'max_length': '50'}) ++ }, ++ 'auth.user': { ++ 'Meta': {'object_name': 'User'}, ++ 'date_joined': ('django.db.models.fields.DateTimeField', [], {'default': 'datetime.datetime.now'}), ++ 'email': ('django.db.models.fields.EmailField', [], {'max_length': '75', 'blank': 'True'}), ++ 'first_name': ('django.db.models.fields.CharField', [], {'max_length': '30', 'blank': 'True'}), ++ 'groups': ('django.db.models.fields.related.ManyToManyField', [], {'to': "orm['auth.Group']", 'symmetrical': 'False', 'blank': 'True'}), ++ 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), ++ 'is_active': ('django.db.models.fields.BooleanField', [], {'default': 'True'}), ++ 'is_staff': ('django.db.models.fields.BooleanField', [], {'default': 'False'}), ++ 'is_superuser': ('django.db.models.fields.BooleanField', [], {'default': 'False'}), ++ 'last_login': ('django.db.models.fields.DateTimeField', [], {'default': 'datetime.datetime.now'}), ++ 'last_name': ('django.db.models.fields.CharField', [], {'max_length': '30', 'blank': 'True'}), ++ 'password': ('django.db.models.fields.CharField', [], {'max_length': '128'}), ++ 'user_permissions': ('django.db.models.fields.related.ManyToManyField', [], {'to': "orm['auth.Permission']", 'symmetrical': 'False', 'blank': 'True'}), ++ 'username': ('django.db.models.fields.CharField', [], {'unique': 'True', 'max_length': '30'}) ++ }, ++ 'contenttypes.contenttype': { ++ 'Meta': {'ordering': "('name',)", 'unique_together': "(('app_label', 'model'),)", 'object_name': 'ContentType', 'db_table': "'django_content_type'"}, ++ 'app_label': ('django.db.models.fields.CharField', [], {'max_length': '100'}), ++ 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), ++ 'model': ('django.db.models.fields.CharField', [], {'max_length': '100'}), ++ 'name': ('django.db.models.fields.CharField', [], {'max_length': '100'}) ++ }, ++ 'quiz.category': { ++ 'Meta': {'object_name': 'Category'}, ++ 'category': ('django.db.models.fields.CharField', [], {'max_length': '250', 'unique': 'True', 'null': 'True', 'blank': 'True'}), ++ 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}) ++ }, ++ 'quiz.quiz': { ++ 'Meta': {'object_name': 'Quiz'}, ++ 'answers_at_end': ('django.db.models.fields.BooleanField', [], {'default': 'False'}), ++ 'category': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['quiz.Category']", 'null': 'True', 'blank': 'True'}), ++ 'description': ('django.db.models.fields.TextField', [], {'blank': 'True'}), ++ 'draft': ('django.db.models.fields.BooleanField', [], {'default': 'False'}), ++ 'exam_paper': ('django.db.models.fields.BooleanField', [], {'default': 'False'}), ++ 'fail_text': ('django.db.models.fields.TextField', [], {'blank': 'True'}), ++ 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), ++ 'max_questions': ('django.db.models.fields.PositiveIntegerField', [], {'null': 'True', 'blank': 'True'}), ++ 'pass_mark': ('django.db.models.fields.SmallIntegerField', [], {'default': '0', 'blank': 'True'}), ++ 'random_order': ('django.db.models.fields.BooleanField', [], {'default': 'False'}), ++ 'single_attempt': ('django.db.models.fields.BooleanField', [], {'default': 'False'}), ++ 'success_text': ('django.db.models.fields.TextField', [], {'blank': 'True'}), ++ 'title': ('django.db.models.fields.CharField', [], {'max_length': '60'}), ++ 'url': ('django.db.models.fields.SlugField', [], {'max_length': '60'}) ++ }, ++ 'teleforma.aestudent': { ++ 'Meta': {'ordering': "['user__last_name']", 'object_name': 'AEStudent', 'db_table': "'teleforma_ae_student'"}, ++ 'courses': ('django.db.models.fields.related.ManyToManyField', [], {'blank': 'True', 'related_name': "'ae_student'", 'null': 'True', 'symmetrical': 'False', 'to': "orm['teleforma.Course']"}), ++ 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), ++ 'period': ('django.db.models.fields.related.ManyToManyField', [], {'blank': 'True', 'related_name': "'ae_student'", 'null': 'True', 'symmetrical': 'False', 'to': "orm['teleforma.Period']"}), ++ 'platform_only': ('telemeta.models.core.BooleanField', [], {'default': 'False'}), ++ 'user': ('telemeta.models.core.ForeignKey', [], {'related_name': "'ae_student'", 'unique': 'True', 'to': "orm['auth.User']"}) ++ }, ++ 'teleforma.appointment': { ++ 'Meta': {'unique_together': "(('slot', 'jury', 'slot_nb'),)", 'object_name': 'Appointment'}, ++ 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), ++ 'jury': ('django.db.models.fields.related.ForeignKey', [], {'related_name': "'appointments'", 'null': 'True', 'on_delete': 'models.SET_NULL', 'to': "orm['teleforma.AppointmentJury']"}), ++ 'slot': ('django.db.models.fields.related.ForeignKey', [], {'related_name': "'appointments'", 'to': "orm['teleforma.AppointmentSlot']"}), ++ 'slot_nb': ('django.db.models.fields.IntegerField', [], {}), ++ 'student': ('django.db.models.fields.related.ForeignKey', [], {'related_name': "'appointments'", 'to': "orm['auth.User']"}) ++ }, ++ 'teleforma.appointmentjury': { ++ 'Meta': {'ordering': "('id',)", 'object_name': 'AppointmentJury', 'db_table': "'teleforma_appointment_jury'"}, ++ 'address': ('django.db.models.fields.TextField', [], {}), ++ 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), ++ 'name': ('django.db.models.fields.CharField', [], {'max_length': '255'}), ++ 'slot': ('django.db.models.fields.related.ForeignKey', [], {'related_name': "'jurys'", 'null': 'True', 'to': "orm['teleforma.AppointmentSlot']"}) ++ }, ++ 'teleforma.appointmentperiod': { ++ 'Meta': {'ordering': "('id',)", 'object_name': 'AppointmentPeriod', 'db_table': "'teleforma_appointment_period'"}, ++ 'appointment_mail_text': ('django.db.models.fields.TextField', [], {'blank': 'True'}), ++ 'appointment_slot_size': ('django.db.models.fields.IntegerField', [], {'default': '40'}), ++ 'cancel_delay': ('django.db.models.fields.IntegerField', [], {'default': '2'}), ++ 'enable_appointment': ('django.db.models.fields.BooleanField', [], {'default': 'True'}), ++ 'end': ('django.db.models.fields.DateField', [], {}), ++ 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), ++ 'name': ('django.db.models.fields.CharField', [], {'max_length': '255'}), ++ 'periods': ('django.db.models.fields.related.ManyToManyField', [], {'related_name': "'appointment_periods'", 'symmetrical': 'False', 'to': "orm['teleforma.Period']"}), ++ 'start': ('django.db.models.fields.DateField', [], {}) ++ }, ++ 'teleforma.appointmentslot': { ++ 'Meta': {'ordering': "('id',)", 'object_name': 'AppointmentSlot', 'db_table': "'teleforma_appointment_slot'"}, ++ 'appointment_period': ('django.db.models.fields.related.ForeignKey', [], {'related_name': "'slots'", 'null': 'True', 'to': "orm['teleforma.AppointmentPeriod']"}), ++ 'date': ('django.db.models.fields.DateField', [], {'null': 'True'}), ++ 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), ++ 'nb': ('django.db.models.fields.IntegerField', [], {}), ++ 'start': ('django.db.models.fields.TimeField', [], {}) ++ }, ++ 'teleforma.conference': { ++ 'Meta': {'ordering': "['-date_begin']", 'object_name': 'Conference'}, ++ 'comment': ('teleforma.fields.ShortTextField', [], {'max_length': '255', 'blank': 'True'}), ++ 'course': ('django.db.models.fields.related.ForeignKey', [], {'related_name': "'conference'", 'to': "orm['teleforma.Course']"}), ++ 'course_type': ('django.db.models.fields.related.ForeignKey', [], {'related_name': "'conference'", 'to': "orm['teleforma.CourseType']"}), ++ 'date_begin': ('django.db.models.fields.DateTimeField', [], {'null': 'True', 'blank': 'True'}), ++ 'date_end': ('django.db.models.fields.DateTimeField', [], {'null': 'True', 'blank': 'True'}), ++ 'department': ('django.db.models.fields.related.ForeignKey', [], {'blank': 'True', 'related_name': "'conference'", 'null': 'True', 'on_delete': 'models.SET_NULL', 'to': "orm['teleforma.Department']"}), ++ 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), ++ 'period': ('django.db.models.fields.related.ForeignKey', [], {'blank': 'True', 'related_name': "'conference'", 'null': 'True', 'on_delete': 'models.SET_NULL', 'to': "orm['teleforma.Period']"}), ++ 'professor': ('django.db.models.fields.related.ForeignKey', [], {'blank': 'True', 'related_name': "'conference'", 'null': 'True', 'on_delete': 'models.SET_NULL', 'to': "orm['teleforma.Professor']"}), ++ 'public_id': ('django.db.models.fields.CharField', [], {'max_length': '255', 'blank': 'True'}), ++ 'readers': ('django.db.models.fields.related.ManyToManyField', [], {'blank': 'True', 'related_name': "'conference'", 'null': 'True', 'symmetrical': 'False', 'to': "orm['auth.User']"}), ++ 'room': ('django.db.models.fields.related.ForeignKey', [], {'blank': 'True', 'related_name': "'conference'", 'null': 'True', 'to': "orm['teleforma.Room']"}), ++ 'session': ('django.db.models.fields.CharField', [], {'default': "'1'", 'max_length': '16'}), ++ 'status': ('django.db.models.fields.IntegerField', [], {'default': '2'}), ++ 'web_class_group': ('django.db.models.fields.related.ForeignKey', [], {'blank': 'True', 'related_name': "'conferences'", 'null': 'True', 'on_delete': 'models.SET_NULL', 'to': "orm['teleforma.WebClassGroup']"}) ++ }, ++ 'teleforma.course': { ++ 'Meta': {'ordering': "['number']", 'object_name': 'Course'}, ++ 'code': ('django.db.models.fields.CharField', [], {'max_length': '255'}), ++ 'date_modified': ('django.db.models.fields.DateTimeField', [], {'auto_now': 'True', 'null': 'True', 'blank': 'True'}), ++ 'department': ('django.db.models.fields.related.ForeignKey', [], {'related_name': "'course'", 'to': "orm['teleforma.Department']"}), ++ 'description': ('django.db.models.fields.CharField', [], {'max_length': '255', 'blank': 'True'}), ++ 'has_exam_scripts': ('django.db.models.fields.BooleanField', [], {'default': 'True'}), ++ 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), ++ 'magistral': ('django.db.models.fields.BooleanField', [], {'default': 'False'}), ++ 'number': ('django.db.models.fields.IntegerField', [], {'null': 'True', 'blank': 'True'}), ++ 'obligation': ('django.db.models.fields.BooleanField', [], {'default': 'False'}), ++ 'oral_1': ('django.db.models.fields.BooleanField', [], {'default': 'False'}), ++ 'oral_2': ('django.db.models.fields.BooleanField', [], {'default': 'False'}), ++ 'oral_speciality': ('django.db.models.fields.BooleanField', [], {'default': 'False'}), ++ 'procedure': ('django.db.models.fields.BooleanField', [], {'default': 'False'}), ++ 'quiz': ('django.db.models.fields.related.ManyToManyField', [], {'symmetrical': 'False', 'to': "orm['quiz.Quiz']", 'null': 'True', 'blank': 'True'}), ++ 'synthesis_note': ('django.db.models.fields.BooleanField', [], {'default': 'False'}), ++ 'title': ('django.db.models.fields.CharField', [], {'max_length': '255'}), ++ 'title_tweeter': ('django.db.models.fields.CharField', [], {'max_length': '255'}), ++ 'written_speciality': ('django.db.models.fields.BooleanField', [], {'default': 'False'}) ++ }, ++ 'teleforma.coursegroup': { ++ 'Meta': {'object_name': 'CourseGroup', 'db_table': "'teleforma_course_group'"}, ++ 'courses': ('django.db.models.fields.related.ManyToManyField', [], {'blank': 'True', 'related_name': "'course_groups'", 'null': 'True', 'symmetrical': 'False', 'to': "orm['teleforma.Course']"}), ++ 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), ++ 'name': ('django.db.models.fields.CharField', [], {'max_length': '255'}) ++ }, ++ 'teleforma.coursetype': { ++ 'Meta': {'object_name': 'CourseType', 'db_table': "'teleforma_course_type'"}, ++ 'description': ('django.db.models.fields.CharField', [], {'max_length': '255', 'blank': 'True'}), ++ 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), ++ 'name': ('django.db.models.fields.CharField', [], {'max_length': '255'}) ++ }, ++ 'teleforma.department': { ++ 'Meta': {'object_name': 'Department'}, ++ 'default_period': ('django.db.models.fields.related.ForeignKey', [], {'blank': 'True', 'related_name': "'departments'", 'null': 'True', 'on_delete': 'models.SET_NULL', 'to': "orm['teleforma.Period']"}), ++ 'description': ('django.db.models.fields.CharField', [], {'max_length': '255', 'blank': 'True'}), ++ 'domain': ('django.db.models.fields.CharField', [], {'max_length': '255', 'blank': 'True'}), ++ 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), ++ 'name': ('django.db.models.fields.CharField', [], {'max_length': '255'}), ++ 'organization': ('django.db.models.fields.related.ForeignKey', [], {'related_name': "'department'", 'to': "orm['teleforma.Organization']"}) ++ }, ++ 'teleforma.discount': { ++ 'Meta': {'object_name': 'Discount', 'db_table': "'teleforma_discounts'"}, ++ 'description': ('django.db.models.fields.CharField', [], {'max_length': '255', 'blank': 'True'}), ++ 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), ++ 'student': ('django.db.models.fields.related.ForeignKey', [], {'related_name': "'discounts'", 'to': "orm['teleforma.Student']"}), ++ 'value': ('django.db.models.fields.FloatField', [], {}) ++ }, ++ 'teleforma.document': { ++ 'Meta': {'ordering': "['-date_added']", 'object_name': 'Document'}, ++ 'annal_year': ('django.db.models.fields.IntegerField', [], {'null': 'True', 'blank': 'True'}), ++ 'code': ('django.db.models.fields.CharField', [], {'max_length': '255', 'blank': 'True'}), ++ 'conference': ('django.db.models.fields.related.ForeignKey', [], {'blank': 'True', 'related_name': "'document'", 'null': 'True', 'on_delete': 'models.SET_NULL', 'to': "orm['teleforma.Conference']"}), ++ 'course': ('django.db.models.fields.related.ForeignKey', [], {'related_name': "'document'", 'to': "orm['teleforma.Course']"}), ++ 'course_type': ('django.db.models.fields.related.ManyToManyField', [], {'symmetrical': 'False', 'related_name': "'document'", 'blank': 'True', 'to': "orm['teleforma.CourseType']"}), ++ 'credits': ('django.db.models.fields.CharField', [], {'max_length': '255', 'blank': 'True'}), ++ 'date_added': ('django.db.models.fields.DateTimeField', [], {'auto_now_add': 'True', 'null': 'True', 'blank': 'True'}), ++ 'date_modified': ('django.db.models.fields.DateTimeField', [], {'auto_now': 'True', 'null': 'True', 'blank': 'True'}), ++ 'description': ('django.db.models.fields.CharField', [], {'max_length': '255', 'blank': 'True'}), ++ 'file': ('telemeta.models.core.FileField', [], {'default': "''", 'max_length': '1024', 'db_column': "'filename'", 'blank': 'True'}), ++ 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), ++ 'iej': ('django.db.models.fields.related.ForeignKey', [], {'blank': 'True', 'related_name': "'document'", 'null': 'True', 'on_delete': 'models.SET_NULL', 'to': "orm['teleforma.IEJ']"}), ++ 'is_annal': ('django.db.models.fields.BooleanField', [], {'default': 'False'}), ++ 'is_published': ('django.db.models.fields.BooleanField', [], {'default': 'False'}), ++ 'mime_type': ('django.db.models.fields.CharField', [], {'max_length': '255', 'blank': 'True'}), ++ 'periods': ('django.db.models.fields.related.ManyToManyField', [], {'blank': 'True', 'related_name': "'documents'", 'null': 'True', 'symmetrical': 'False', 'to': "orm['teleforma.Period']"}), ++ 'readers': ('django.db.models.fields.related.ManyToManyField', [], {'blank': 'True', 'related_name': "'document'", 'null': 'True', 'symmetrical': 'False', 'to': "orm['auth.User']"}), ++ 'session': ('django.db.models.fields.CharField', [], {'default': "'1'", 'max_length': '16'}), ++ 'title': ('django.db.models.fields.CharField', [], {'max_length': '255', 'blank': 'True'}), ++ 'type': ('django.db.models.fields.related.ForeignKey', [], {'blank': 'True', 'related_name': "'document'", 'null': 'True', 'to': "orm['teleforma.DocumentType']"}), ++ 'weight': ('django.db.models.fields.IntegerField', [], {'default': '1', 'blank': 'True'}) ++ }, ++ 'teleforma.documentsimple': { ++ 'Meta': {'ordering': "['-date_added']", 'object_name': 'DocumentSimple', 'db_table': "'teleforma_document_simple'"}, ++ 'code': ('django.db.models.fields.CharField', [], {'max_length': '255', 'blank': 'True'}), ++ 'credits': ('django.db.models.fields.CharField', [], {'max_length': '255', 'blank': 'True'}), ++ 'date_added': ('django.db.models.fields.DateTimeField', [], {'auto_now_add': 'True', 'null': 'True', 'blank': 'True'}), ++ 'date_modified': ('django.db.models.fields.DateTimeField', [], {'auto_now': 'True', 'null': 'True', 'blank': 'True'}), ++ 'description': ('django.db.models.fields.CharField', [], {'max_length': '255', 'blank': 'True'}), ++ 'file': ('telemeta.models.core.FileField', [], {'default': "''", 'max_length': '1024', 'db_column': "'filename'", 'blank': 'True'}), ++ 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), ++ 'is_published': ('django.db.models.fields.BooleanField', [], {'default': 'False'}), ++ 'mime_type': ('django.db.models.fields.CharField', [], {'max_length': '255', 'blank': 'True'}), ++ 'period': ('django.db.models.fields.related.ForeignKey', [], {'blank': 'True', 'related_name': "'document_simple'", 'null': 'True', 'on_delete': 'models.SET_NULL', 'to': "orm['teleforma.Period']"}), ++ 'readers': ('django.db.models.fields.related.ManyToManyField', [], {'blank': 'True', 'related_name': "'document_simple'", 'null': 'True', 'symmetrical': 'False', 'to': "orm['auth.User']"}), ++ 'title': ('django.db.models.fields.CharField', [], {'max_length': '255', 'blank': 'True'}), ++ 'weight': ('django.db.models.fields.IntegerField', [], {'default': '1', 'blank': 'True'}) ++ }, ++ 'teleforma.documenttype': { ++ 'Meta': {'ordering': "['number']", 'object_name': 'DocumentType', 'db_table': "'teleforma_document_type'"}, ++ 'description': ('django.db.models.fields.CharField', [], {'max_length': '255', 'blank': 'True'}), ++ 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), ++ 'name': ('django.db.models.fields.CharField', [], {'max_length': '255'}), ++ 'number': ('django.db.models.fields.IntegerField', [], {'null': 'True', 'blank': 'True'}) ++ }, ++ 'teleforma.groupedmessage': { ++ 'Meta': {'object_name': 'GroupedMessage', 'db_table': "'teleforma_grouped_messages'"}, ++ 'date_sent': ('django.db.models.fields.DateTimeField', [], {'null': 'True', 'blank': 'True'}), ++ 'group': ('django.db.models.fields.related.ForeignKey', [], {'blank': 'True', 'related_name': "'grouped_messages'", 'null': 'True', 'on_delete': 'models.SET_NULL', 'to': "orm['teleforma.StudentGroup']"}), ++ 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), ++ 'message': ('django.db.models.fields.TextField', [], {}), ++ 'sender': ('django.db.models.fields.related.ForeignKey', [], {'blank': 'True', 'related_name': "'grouped_messages'", 'null': 'True', 'on_delete': 'models.SET_NULL', 'to': "orm['auth.User']"}), ++ 'sent': ('django.db.models.fields.BooleanField', [], {'default': 'False'}), ++ 'subject': ('django.db.models.fields.CharField', [], {'max_length': '119'}), ++ 'to_send': ('django.db.models.fields.BooleanField', [], {'default': 'False'}) ++ }, ++ 'teleforma.home': { ++ 'Meta': {'object_name': 'Home'}, ++ 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), ++ 'text': ('tinymce.models.HTMLField', [], {'blank': 'True'}), ++ 'video': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['teleforma.Media']", 'null': 'True', 'blank': 'True'}) ++ }, ++ 'teleforma.iej': { ++ 'Meta': {'ordering': "['name']", 'object_name': 'IEJ'}, ++ 'description': ('django.db.models.fields.CharField', [], {'max_length': '255', 'blank': 'True'}), ++ 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), ++ 'name': ('django.db.models.fields.CharField', [], {'max_length': '255'}) ++ }, ++ 'teleforma.livestream': { ++ 'Meta': {'object_name': 'LiveStream', 'db_table': "'teleforma_live_stream'"}, ++ 'conference': ('django.db.models.fields.related.ForeignKey', [], {'blank': 'True', 'related_name': "'livestream'", 'null': 'True', 'on_delete': 'models.SET_NULL', 'to': "orm['teleforma.Conference']"}), ++ 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), ++ 'server': ('django.db.models.fields.related.ForeignKey', [], {'related_name': "'livestream'", 'to': "orm['teleforma.StreamingServer']"}), ++ 'stream_type': ('django.db.models.fields.CharField', [], {'max_length': '32'}), ++ 'streaming': ('django.db.models.fields.BooleanField', [], {'default': 'False'}) ++ }, ++ 'teleforma.media': { ++ 'Meta': {'ordering': "['-date_modified', '-conference__session']", 'object_name': 'Media'}, ++ 'code': ('django.db.models.fields.CharField', [], {'max_length': '255', 'blank': 'True'}), ++ 'conference': ('django.db.models.fields.related.ForeignKey', [], {'blank': 'True', 'related_name': "'media'", 'null': 'True', 'on_delete': 'models.SET_NULL', 'to': "orm['teleforma.Conference']"}), ++ 'course': ('django.db.models.fields.related.ForeignKey', [], {'blank': 'True', 'related_name': "'media'", 'null': 'True', 'to': "orm['teleforma.Course']"}), ++ 'course_type': ('django.db.models.fields.related.ForeignKey', [], {'blank': 'True', 'related_name': "'media'", 'null': 'True', 'to': "orm['teleforma.CourseType']"}), ++ 'credits': ('django.db.models.fields.CharField', [], {'max_length': '255', 'blank': 'True'}), ++ 'date_added': ('django.db.models.fields.DateTimeField', [], {'auto_now_add': 'True', 'null': 'True', 'blank': 'True'}), ++ 'date_modified': ('django.db.models.fields.DateTimeField', [], {'auto_now': 'True', 'null': 'True', 'blank': 'True'}), ++ 'description': ('django.db.models.fields.CharField', [], {'max_length': '255', 'blank': 'True'}), ++ 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), ++ 'is_published': ('django.db.models.fields.BooleanField', [], {'default': 'False'}), ++ 'item': ('django.db.models.fields.related.ForeignKey', [], {'blank': 'True', 'related_name': "'media'", 'null': 'True', 'to': "orm['telemeta.MediaItem']"}), ++ 'mime_type': ('django.db.models.fields.CharField', [], {'max_length': '255', 'blank': 'True'}), ++ 'period': ('django.db.models.fields.related.ForeignKey', [], {'blank': 'True', 'related_name': "'media'", 'null': 'True', 'on_delete': 'models.SET_NULL', 'to': "orm['teleforma.Period']"}), ++ 'readers': ('django.db.models.fields.related.ManyToManyField', [], {'blank': 'True', 'related_name': "'media'", 'null': 'True', 'symmetrical': 'False', 'to': "orm['auth.User']"}), ++ 'title': ('django.db.models.fields.CharField', [], {'max_length': '255', 'blank': 'True'}), ++ 'type': ('django.db.models.fields.CharField', [], {'max_length': '32'}), ++ 'weight': ('django.db.models.fields.IntegerField', [], {'default': '1', 'blank': 'True'}) ++ }, ++ 'teleforma.newsitem': { ++ 'Meta': {'object_name': 'NewsItem'}, ++ 'course': ('django.db.models.fields.related.ForeignKey', [], {'related_name': "'newsitems'", 'to': "orm['teleforma.Course']"}), ++ 'created': ('django.db.models.fields.DateTimeField', [], {'auto_now_add': 'True', 'blank': 'True'}), ++ 'creator': ('django.db.models.fields.related.ForeignKey', [], {'related_name': "'newsitems'", 'to': "orm['auth.User']"}), ++ 'deleted': ('django.db.models.fields.BooleanField', [], {'default': 'False'}), ++ 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), ++ 'period': ('django.db.models.fields.related.ForeignKey', [], {'related_name': "'newsitems'", 'null': 'True', 'to': "orm['teleforma.Period']"}), ++ 'text': ('tinymce.models.HTMLField', [], {}), ++ 'title': ('django.db.models.fields.CharField', [], {'max_length': '255'}) ++ }, ++ 'teleforma.optionalfee': { ++ 'Meta': {'object_name': 'OptionalFee', 'db_table': "'teleforma_optional_fees'"}, ++ 'description': ('django.db.models.fields.CharField', [], {'max_length': '255', 'blank': 'True'}), ++ 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), ++ 'student': ('django.db.models.fields.related.ForeignKey', [], {'related_name': "'optional_fees'", 'to': "orm['teleforma.Student']"}), ++ 'value': ('django.db.models.fields.FloatField', [], {}) ++ }, ++ 'teleforma.organization': { ++ 'Meta': {'object_name': 'Organization'}, ++ 'description': ('django.db.models.fields.CharField', [], {'max_length': '255', 'blank': 'True'}), ++ 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), ++ 'name': ('django.db.models.fields.CharField', [], {'max_length': '255'}) ++ }, ++ 'teleforma.payback': { ++ 'Meta': {'object_name': 'Payback', 'db_table': "'teleforma_paybacks'"}, ++ 'description': ('django.db.models.fields.CharField', [], {'max_length': '255', 'blank': 'True'}), ++ 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), ++ 'student': ('django.db.models.fields.related.ForeignKey', [], {'related_name': "'paybacks'", 'to': "orm['teleforma.Student']"}), ++ 'value': ('django.db.models.fields.FloatField', [], {}) ++ }, ++ 'teleforma.payment': { ++ 'Meta': {'ordering': "['month']", 'object_name': 'Payment', 'db_table': "'teleforma_payments'"}, ++ 'collected': ('django.db.models.fields.BooleanField', [], {'default': 'False'}), ++ 'date_created': ('django.db.models.fields.DateTimeField', [], {'auto_now_add': 'True', 'blank': 'True'}), ++ 'date_modified': ('django.db.models.fields.DateTimeField', [], {'auto_now': 'True', 'blank': 'True'}), ++ 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), ++ 'month': ('django.db.models.fields.IntegerField', [], {'default': '1'}), ++ 'student': ('django.db.models.fields.related.ForeignKey', [], {'related_name': "'payments'", 'to': "orm['teleforma.Student']"}), ++ 'type': ('django.db.models.fields.CharField', [], {'max_length': '64'}), ++ 'value': ('django.db.models.fields.FloatField', [], {}) ++ }, ++ 'teleforma.period': { ++ 'Meta': {'ordering': "['name']", 'object_name': 'Period'}, ++ 'date_begin': ('django.db.models.fields.DateField', [], {'null': 'True', 'blank': 'True'}), ++ 'date_end': ('django.db.models.fields.DateField', [], {'null': 'True', 'blank': 'True'}), ++ 'date_exam_end': ('django.db.models.fields.DateTimeField', [], {'null': 'True', 'blank': 'True'}), ++ 'date_password_init': ('django.db.models.fields.DateField', [], {'null': 'True', 'blank': 'True'}), ++ 'department': ('telemeta.models.core.ForeignKey', [], {'default': 'None', 'related_name': "'period'", 'null': 'True', 'blank': 'True', 'to': "orm['teleforma.Department']"}), ++ 'description': ('django.db.models.fields.CharField', [], {'max_length': '255', 'blank': 'True'}), ++ 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), ++ 'is_open': ('django.db.models.fields.BooleanField', [], {'default': 'True'}), ++ 'message_local': ('django.db.models.fields.TextField', [], {'blank': 'True'}), ++ 'message_platform': ('django.db.models.fields.TextField', [], {'blank': 'True'}), ++ 'name': ('django.db.models.fields.CharField', [], {'max_length': '255'}), ++ 'parent': ('django.db.models.fields.related.ForeignKey', [], {'blank': 'True', 'related_name': "'children'", 'null': 'True', 'to': "orm['teleforma.Period']"}) ++ }, ++ 'teleforma.professor': { ++ 'Meta': {'ordering': "['user__last_name']", 'object_name': 'Professor'}, ++ 'courses': ('django.db.models.fields.related.ManyToManyField', [], {'blank': 'True', 'related_name': "'professor'", 'null': 'True', 'symmetrical': 'False', 'to': "orm['teleforma.Course']"}), ++ 'department': ('django.db.models.fields.related.ForeignKey', [], {'blank': 'True', 'related_name': "'professor'", 'null': 'True', 'on_delete': 'models.SET_NULL', 'to': "orm['teleforma.Department']"}), ++ 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), ++ 'user': ('django.db.models.fields.related.ForeignKey', [], {'related_name': "'professor'", 'unique': 'True', 'to': "orm['auth.User']"}) ++ }, ++ 'teleforma.profile': { ++ 'Meta': {'object_name': 'Profile', 'db_table': "'teleforma_profiles'"}, ++ 'address': ('django.db.models.fields.CharField', [], {'max_length': '255', 'blank': 'True'}), ++ 'address_detail': ('django.db.models.fields.CharField', [], {'max_length': '255', 'null': 'True', 'blank': 'True'}), ++ 'birthday': ('django.db.models.fields.DateField', [], {'null': 'True', 'blank': 'True'}), ++ 'city': ('django.db.models.fields.CharField', [], {'max_length': '255', 'blank': 'True'}), ++ 'country': ('django.db.models.fields.CharField', [], {'max_length': '255', 'blank': 'True'}), ++ 'expiration_date': ('django.db.models.fields.DateField', [], {'null': 'True', 'blank': 'True'}), ++ 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), ++ 'init_password': ('django.db.models.fields.BooleanField', [], {'default': 'False'}), ++ 'language': ('django.db.models.fields.CharField', [], {'max_length': '255', 'blank': 'True'}), ++ 'postal_code': ('django.db.models.fields.CharField', [], {'max_length': '255', 'blank': 'True'}), ++ 'telephone': ('django.db.models.fields.CharField', [], {'max_length': '255', 'blank': 'True'}), ++ 'user': ('django.db.models.fields.related.ForeignKey', [], {'related_name': "'profile'", 'unique': 'True', 'to': "orm['auth.User']"}), ++ 'wifi_login': ('django.db.models.fields.CharField', [], {'max_length': '255', 'blank': 'True'}), ++ 'wifi_pass': ('django.db.models.fields.CharField', [], {'max_length': '255', 'blank': 'True'}) ++ }, ++ 'teleforma.room': { ++ 'Meta': {'object_name': 'Room'}, ++ 'description': ('django.db.models.fields.CharField', [], {'max_length': '255', 'blank': 'True'}), ++ 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), ++ 'name': ('django.db.models.fields.CharField', [], {'max_length': '255'}), ++ 'organization': ('django.db.models.fields.related.ForeignKey', [], {'related_name': "'room'", 'to': "orm['teleforma.Organization']"}) ++ }, ++ 'teleforma.streamingserver': { ++ 'Meta': {'object_name': 'StreamingServer', 'db_table': "'teleforma_streaming_server'"}, ++ 'admin_password': ('django.db.models.fields.CharField', [], {'max_length': '32', 'blank': 'True'}), ++ 'description': ('django.db.models.fields.CharField', [], {'max_length': '255', 'blank': 'True'}), ++ 'host': ('django.db.models.fields.CharField', [], {'max_length': '255'}), ++ 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), ++ 'port': ('django.db.models.fields.CharField', [], {'max_length': '32'}), ++ 'source_password': ('django.db.models.fields.CharField', [], {'max_length': '32'}), ++ 'type': ('django.db.models.fields.CharField', [], {'max_length': '32'}) ++ }, ++ 'teleforma.student': { ++ 'Meta': {'ordering': "['user__last_name', '-date_subscribed']", 'object_name': 'Student'}, ++ 'application_fees': ('django.db.models.fields.BooleanField', [], {'default': 'False'}), ++ 'confirmation_sent': ('django.db.models.fields.BooleanField', [], {'default': 'False'}), ++ 'date_registered': ('django.db.models.fields.DateTimeField', [], {'auto_now_add': 'True', 'null': 'True', 'blank': 'True'}), ++ 'date_subscribed': ('django.db.models.fields.DateTimeField', [], {'null': 'True', 'blank': 'True'}), ++ 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), ++ 'iej': ('django.db.models.fields.related.ForeignKey', [], {'blank': 'True', 'related_name': "'student'", 'null': 'True', 'on_delete': 'models.SET_NULL', 'to': "orm['teleforma.IEJ']"}), ++ 'is_subscribed': ('django.db.models.fields.BooleanField', [], {'default': 'False'}), ++ 'level': ('django.db.models.fields.CharField', [], {'max_length': '100', 'blank': 'True'}), ++ 'options': ('django.db.models.fields.related.ForeignKey', [], {'blank': 'True', 'related_name': "'options_students'", 'null': 'True', 'to': "orm['teleforma.Course']"}), ++ 'oral_1': ('django.db.models.fields.related.ForeignKey', [], {'blank': 'True', 'related_name': "'oral_1_students'", 'null': 'True', 'to': "orm['teleforma.Course']"}), ++ 'oral_2': ('django.db.models.fields.related.ForeignKey', [], {'blank': 'True', 'related_name': "'oral_2_students'", 'null': 'True', 'to': "orm['teleforma.Course']"}), ++ 'oral_speciality': ('django.db.models.fields.related.ForeignKey', [], {'blank': 'True', 'related_name': "'oral_speciality_students'", 'null': 'True', 'to': "orm['teleforma.Course']"}), ++ 'period': ('django.db.models.fields.related.ForeignKey', [], {'blank': 'True', 'related_name': "'student'", 'null': 'True', 'on_delete': 'models.SET_NULL', 'to': "orm['teleforma.Period']"}), ++ 'platform_only': ('django.db.models.fields.BooleanField', [], {'default': 'False'}), ++ 'procedure': ('django.db.models.fields.related.ForeignKey', [], {'blank': 'True', 'related_name': "'procedure_students'", 'null': 'True', 'to': "orm['teleforma.Course']"}), ++ 'promo_code': ('django.db.models.fields.CharField', [], {'max_length': '100', 'blank': 'True'}), ++ 'subscription_fees': ('django.db.models.fields.FloatField', [], {'null': 'True', 'blank': 'True'}), ++ 'training': ('django.db.models.fields.related.ForeignKey', [], {'blank': 'True', 'related_name': "'student_training'", 'null': 'True', 'to': "orm['teleforma.Training']"}), ++ 'trainings': ('django.db.models.fields.related.ManyToManyField', [], {'blank': 'True', 'related_name': "'student_trainings'", 'null': 'True', 'symmetrical': 'False', 'to': "orm['teleforma.Training']"}), ++ 'user': ('django.db.models.fields.related.ForeignKey', [], {'related_name': "'student'", 'unique': 'True', 'to': "orm['auth.User']"}), ++ 'written_speciality': ('django.db.models.fields.related.ForeignKey', [], {'blank': 'True', 'related_name': "'written_speciality_2students'", 'null': 'True', 'to': "orm['teleforma.Course']"}) ++ }, ++ 'teleforma.studentgroup': { ++ 'Meta': {'object_name': 'StudentGroup', 'db_table': "'teleforma_student_groups'"}, ++ 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), ++ 'name': ('django.db.models.fields.CharField', [], {'max_length': '255'}), ++ 'students': ('django.db.models.fields.related.ManyToManyField', [], {'blank': 'True', 'related_name': "'groups'", 'null': 'True', 'symmetrical': 'False', 'to': "orm['teleforma.Student']"}) ++ }, ++ 'teleforma.training': { ++ 'Meta': {'object_name': 'Training'}, ++ 'available': ('django.db.models.fields.BooleanField', [], {'default': 'False'}), ++ 'code': ('django.db.models.fields.CharField', [], {'max_length': '255'}), ++ 'cost': ('django.db.models.fields.FloatField', [], {'null': 'True', 'blank': 'True'}), ++ 'description': ('django.db.models.fields.CharField', [], {'max_length': '512', 'blank': 'True'}), ++ 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), ++ 'magistral': ('django.db.models.fields.related.ManyToManyField', [], {'blank': 'True', 'related_name': "'training_magistral'", 'null': 'True', 'symmetrical': 'False', 'to': "orm['teleforma.CourseType']"}), ++ 'name': ('django.db.models.fields.CharField', [], {'max_length': '255', 'blank': 'True'}), ++ 'obligation': ('django.db.models.fields.related.ManyToManyField', [], {'blank': 'True', 'related_name': "'training_obligation'", 'null': 'True', 'symmetrical': 'False', 'to': "orm['teleforma.CourseType']"}), ++ 'options': ('django.db.models.fields.related.ManyToManyField', [], {'blank': 'True', 'related_name': "'training_options'", 'null': 'True', 'symmetrical': 'False', 'to': "orm['teleforma.CourseType']"}), ++ 'oral_1': ('django.db.models.fields.related.ManyToManyField', [], {'blank': 'True', 'related_name': "'training_oral_1'", 'null': 'True', 'symmetrical': 'False', 'to': "orm['teleforma.CourseType']"}), ++ 'oral_2': ('django.db.models.fields.related.ManyToManyField', [], {'blank': 'True', 'related_name': "'training_oral_2'", 'null': 'True', 'symmetrical': 'False', 'to': "orm['teleforma.CourseType']"}), ++ 'oral_speciality': ('django.db.models.fields.related.ManyToManyField', [], {'blank': 'True', 'related_name': "'training_oral_speciality'", 'null': 'True', 'symmetrical': 'False', 'to': "orm['teleforma.CourseType']"}), ++ 'parent': ('django.db.models.fields.related.ForeignKey', [], {'blank': 'True', 'related_name': "'children'", 'null': 'True', 'to': "orm['teleforma.Training']"}), ++ 'period': ('django.db.models.fields.related.ForeignKey', [], {'blank': 'True', 'related_name': "'training'", 'null': 'True', 'to': "orm['teleforma.Period']"}), ++ 'procedure': ('django.db.models.fields.related.ManyToManyField', [], {'blank': 'True', 'related_name': "'training_procedure'", 'null': 'True', 'symmetrical': 'False', 'to': "orm['teleforma.CourseType']"}), ++ 'synthesis_note': ('django.db.models.fields.related.ManyToManyField', [], {'blank': 'True', 'related_name': "'training_synthesis_note'", 'null': 'True', 'symmetrical': 'False', 'to': "orm['teleforma.CourseType']"}), ++ 'written_speciality': ('django.db.models.fields.related.ManyToManyField', [], {'blank': 'True', 'related_name': "'training_written_speciality'", 'null': 'True', 'symmetrical': 'False', 'to': "orm['teleforma.CourseType']"}) ++ }, ++ 'teleforma.webclassgroup': { ++ 'Meta': {'ordering': "['name']", 'object_name': 'WebClassGroup'}, ++ 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), ++ 'iejs': ('django.db.models.fields.related.ManyToManyField', [], {'blank': 'True', 'related_name': "'web_class_group'", 'null': 'True', 'symmetrical': 'False', 'to': "orm['teleforma.IEJ']"}), ++ 'name': ('django.db.models.fields.CharField', [], {'max_length': '255'}) ++ }, ++ 'telemeta.acquisitionmode': { ++ 'Meta': {'ordering': "['value']", 'object_name': 'AcquisitionMode', 'db_table': "'acquisition_modes'"}, ++ 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), ++ 'value': ('telemeta.models.core.CharField', [], {'unique': 'True', 'max_length': '250'}) ++ }, ++ 'telemeta.adconversion': { ++ 'Meta': {'ordering': "['value']", 'object_name': 'AdConversion', 'db_table': "'ad_conversions'"}, ++ 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), ++ 'value': ('telemeta.models.core.CharField', [], {'unique': 'True', 'max_length': '250'}) ++ }, ++ 'telemeta.ethnicgroup': { ++ 'Meta': {'ordering': "['value']", 'object_name': 'EthnicGroup', 'db_table': "'ethnic_groups'"}, ++ 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), ++ 'value': ('telemeta.models.core.CharField', [], {'unique': 'True', 'max_length': '250'}) ++ }, ++ 'telemeta.genericstyle': { ++ 'Meta': {'ordering': "['value']", 'object_name': 'GenericStyle', 'db_table': "'generic_styles'"}, ++ 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), ++ 'value': ('telemeta.models.core.CharField', [], {'unique': 'True', 'max_length': '250'}) ++ }, ++ 'telemeta.language': { ++ 'Meta': {'ordering': "['name']", 'object_name': 'Language', 'db_table': "'languages'"}, ++ 'comment': ('telemeta.models.core.TextField', [], {'default': "''", 'blank': 'True'}), ++ 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), ++ 'identifier': ('telemeta.models.core.CharField', [], {'default': "''", 'max_length': '3', 'blank': 'True'}), ++ 'name': ('telemeta.models.core.CharField', [], {'default': "''", 'max_length': '250', 'blank': 'True'}), ++ 'part1': ('telemeta.models.core.CharField', [], {'default': "''", 'max_length': '1', 'blank': 'True'}), ++ 'part2B': ('telemeta.models.core.CharField', [], {'default': "''", 'max_length': '3', 'blank': 'True'}), ++ 'part2T': ('telemeta.models.core.CharField', [], {'default': "''", 'max_length': '3', 'blank': 'True'}), ++ 'scope': ('telemeta.models.core.CharField', [], {'default': "''", 'max_length': '1', 'blank': 'True'}), ++ 'type': ('telemeta.models.core.CharField', [], {'default': "''", 'max_length': '1', 'blank': 'True'}) ++ }, ++ 'telemeta.legalright': { ++ 'Meta': {'ordering': "['value']", 'object_name': 'LegalRight', 'db_table': "'legal_rights'"}, ++ 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), ++ 'value': ('telemeta.models.core.CharField', [], {'unique': 'True', 'max_length': '250'}) ++ }, ++ 'telemeta.location': { ++ 'Meta': {'ordering': "['name']", 'object_name': 'Location', 'db_table': "'locations'"}, ++ 'complete_type': ('telemeta.models.core.ForeignKey', [], {'related_name': "'locations'", 'to': "orm['telemeta.LocationType']"}), ++ 'current_location': ('telemeta.models.core.WeakForeignKey', [], {'default': 'None', 'related_name': "'past_names'", 'null': 'True', 'blank': 'True', 'to': "orm['telemeta.Location']"}), ++ 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), ++ 'is_authoritative': ('telemeta.models.core.BooleanField', [], {'default': 'False'}), ++ 'latitude': ('telemeta.models.core.FloatField', [], {'default': 'None', 'null': 'True', 'blank': 'True'}), ++ 'longitude': ('telemeta.models.core.FloatField', [], {'default': 'None', 'null': 'True', 'blank': 'True'}), ++ 'name': ('telemeta.models.core.CharField', [], {'unique': 'True', 'max_length': '150'}), ++ 'type': ('telemeta.models.core.IntegerField', [], {'default': '0', 'db_index': 'True', 'blank': 'True'}) ++ }, ++ 'telemeta.locationtype': { ++ 'Meta': {'ordering': "['name']", 'object_name': 'LocationType', 'db_table': "'location_types'"}, ++ 'code': ('telemeta.models.core.CharField', [], {'unique': 'True', 'max_length': '64'}), ++ 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), ++ 'name': ('telemeta.models.core.CharField', [], {'max_length': '150'}) ++ }, ++ 'telemeta.mediacollection': { ++ 'Meta': {'ordering': "['code']", 'object_name': 'MediaCollection', 'db_table': "'media_collections'"}, ++ 'a_informer_07_03': ('telemeta.models.core.CharField', [], {'default': "''", 'max_length': '250', 'blank': 'True'}), ++ 'acquisition_mode': ('telemeta.models.core.WeakForeignKey', [], {'default': 'None', 'related_name': "'collections'", 'null': 'True', 'blank': 'True', 'to': "orm['telemeta.AcquisitionMode']"}), ++ 'ad_conversion': ('telemeta.models.core.WeakForeignKey', [], {'default': 'None', 'related_name': "'collections'", 'null': 'True', 'blank': 'True', 'to': "orm['telemeta.AdConversion']"}), ++ 'alt_ids': ('telemeta.models.core.CharField', [], {'default': "''", 'max_length': '250', 'blank': 'True'}), ++ 'alt_title': ('telemeta.models.core.CharField', [], {'default': "''", 'max_length': '250', 'blank': 'True'}), ++ 'approx_duration': ('telemeta.models.core.DurationField', [], {'default': "'0'", 'blank': 'True'}), ++ 'auto_period_access': ('telemeta.models.core.BooleanField', [], {'default': 'True'}), ++ 'booklet_author': ('telemeta.models.core.CharField', [], {'default': "''", 'max_length': '250', 'blank': 'True'}), ++ 'booklet_description': ('telemeta.models.core.TextField', [], {'default': "''", 'blank': 'True'}), ++ 'cnrs_contributor': ('telemeta.models.core.CharField', [], {'default': "''", 'max_length': '250', 'blank': 'True'}), ++ 'code': ('telemeta.models.core.CharField', [], {'unique': 'True', 'max_length': '250'}), ++ 'collector': ('telemeta.models.core.CharField', [], {'default': "''", 'max_length': '250', 'blank': 'True'}), ++ 'collector_is_creator': ('telemeta.models.core.BooleanField', [], {'default': 'False'}), ++ 'comment': ('telemeta.models.core.TextField', [], {'default': "''", 'blank': 'True'}), ++ 'conservation_site': ('telemeta.models.core.CharField', [], {'default': "''", 'max_length': '250', 'blank': 'True'}), ++ 'creator': ('telemeta.models.core.CharField', [], {'default': "''", 'max_length': '250', 'blank': 'True'}), ++ 'doctype_code': ('telemeta.models.core.IntegerField', [], {'default': '0', 'blank': 'True'}), ++ 'external_references': ('telemeta.models.core.TextField', [], {'default': "''", 'blank': 'True'}), ++ 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), ++ 'is_published': ('telemeta.models.core.BooleanField', [], {'default': 'False'}), ++ 'items_done': ('telemeta.models.core.CharField', [], {'default': "''", 'max_length': '250', 'blank': 'True'}), ++ 'legal_rights': ('telemeta.models.core.WeakForeignKey', [], {'default': 'None', 'related_name': "'collections'", 'null': 'True', 'blank': 'True', 'to': "orm['telemeta.LegalRight']"}), ++ 'metadata_author': ('telemeta.models.core.WeakForeignKey', [], {'default': 'None', 'related_name': "'collections'", 'null': 'True', 'blank': 'True', 'to': "orm['telemeta.MetadataAuthor']"}), ++ 'metadata_writer': ('telemeta.models.core.WeakForeignKey', [], {'default': 'None', 'related_name': "'collections'", 'null': 'True', 'blank': 'True', 'to': "orm['telemeta.MetadataWriter']"}), ++ 'old_code': ('telemeta.models.core.CharField', [], {'default': 'None', 'max_length': '250', 'null': 'True', 'blank': 'True'}), ++ 'physical_format': ('telemeta.models.core.WeakForeignKey', [], {'default': 'None', 'related_name': "'collections'", 'null': 'True', 'blank': 'True', 'to': "orm['telemeta.PhysicalFormat']"}), ++ 'physical_items_num': ('telemeta.models.core.IntegerField', [], {'default': '0', 'blank': 'True'}), ++ 'public_access': ('telemeta.models.core.CharField', [], {'default': "'metadata'", 'max_length': '16', 'blank': 'True'}), ++ 'publisher': ('telemeta.models.core.WeakForeignKey', [], {'default': 'None', 'related_name': "'collections'", 'null': 'True', 'blank': 'True', 'to': "orm['telemeta.Publisher']"}), ++ 'publisher_collection': ('telemeta.models.core.WeakForeignKey', [], {'default': 'None', 'related_name': "'collections'", 'null': 'True', 'blank': 'True', 'to': "orm['telemeta.PublisherCollection']"}), ++ 'publisher_serial': ('telemeta.models.core.CharField', [], {'default': "''", 'max_length': '250', 'blank': 'True'}), ++ 'publishing_status': ('telemeta.models.core.WeakForeignKey', [], {'default': 'None', 'related_name': "'collections'", 'null': 'True', 'blank': 'True', 'to': "orm['telemeta.PublishingStatus']"}), ++ 'recorded_from_year': ('telemeta.models.core.IntegerField', [], {'default': '0', 'blank': 'True'}), ++ 'recorded_to_year': ('telemeta.models.core.IntegerField', [], {'default': '0', 'blank': 'True'}), ++ 'recording_context': ('telemeta.models.core.WeakForeignKey', [], {'default': 'None', 'related_name': "'collections'", 'null': 'True', 'blank': 'True', 'to': "orm['telemeta.RecordingContext']"}), ++ 'reference': ('telemeta.models.core.CharField', [], {'default': 'None', 'max_length': '250', 'unique': 'True', 'null': 'True', 'blank': 'True'}), ++ 'state': ('telemeta.models.core.TextField', [], {'default': "''", 'blank': 'True'}), ++ 'title': ('telemeta.models.core.CharField', [], {'max_length': '250'}), ++ 'travail': ('telemeta.models.core.CharField', [], {'default': "''", 'max_length': '250', 'blank': 'True'}), ++ 'year_published': ('telemeta.models.core.IntegerField', [], {'default': '0', 'blank': 'True'}) ++ }, ++ 'telemeta.mediaitem': { ++ 'Meta': {'object_name': 'MediaItem', 'db_table': "'media_items'"}, ++ 'alt_title': ('telemeta.models.core.CharField', [], {'default': "''", 'max_length': '250', 'blank': 'True'}), ++ 'approx_duration': ('telemeta.models.core.DurationField', [], {'default': "'0'", 'blank': 'True'}), ++ 'author': ('telemeta.models.core.CharField', [], {'default': "''", 'max_length': '250', 'blank': 'True'}), ++ 'auto_period_access': ('telemeta.models.core.BooleanField', [], {'default': 'True'}), ++ 'code': ('telemeta.models.core.CharField', [], {'default': "''", 'unique': 'True', 'max_length': '250', 'blank': 'True'}), ++ 'collection': ('telemeta.models.core.ForeignKey', [], {'related_name': "'items'", 'to': "orm['telemeta.MediaCollection']"}), ++ 'collector': ('telemeta.models.core.CharField', [], {'default': "''", 'max_length': '250', 'blank': 'True'}), ++ 'collector_from_collection': ('telemeta.models.core.BooleanField', [], {'default': 'False'}), ++ 'collector_selection': ('telemeta.models.core.CharField', [], {'default': "''", 'max_length': '250', 'blank': 'True'}), ++ 'comment': ('telemeta.models.core.TextField', [], {'default': "''", 'blank': 'True'}), ++ 'context_comment': ('telemeta.models.core.TextField', [], {'default': "''", 'blank': 'True'}), ++ 'contributor': ('telemeta.models.core.CharField', [], {'default': "''", 'max_length': '250', 'blank': 'True'}), ++ 'copied_from_item': ('telemeta.models.core.WeakForeignKey', [], {'default': 'None', 'related_name': "'copies'", 'null': 'True', 'blank': 'True', 'to': "orm['telemeta.MediaItem']"}), ++ 'creator_reference': ('telemeta.models.core.CharField', [], {'default': "''", 'max_length': '250', 'blank': 'True'}), ++ 'cultural_area': ('telemeta.models.core.CharField', [], {'default': "''", 'max_length': '250', 'blank': 'True'}), ++ 'depositor': ('telemeta.models.core.CharField', [], {'default': "''", 'max_length': '250', 'blank': 'True'}), ++ 'digitalist': ('telemeta.models.core.CharField', [], {'default': "''", 'max_length': '250', 'blank': 'True'}), ++ 'digitization_date': ('telemeta.models.core.DateField', [], {'default': 'None', 'null': 'True', 'blank': 'True'}), ++ 'ethnic_group': ('telemeta.models.core.WeakForeignKey', [], {'default': 'None', 'related_name': "'items'", 'null': 'True', 'blank': 'True', 'to': "orm['telemeta.EthnicGroup']"}), ++ 'external_references': ('telemeta.models.core.TextField', [], {'default': "''", 'blank': 'True'}), ++ 'file': ('telemeta.models.core.FileField', [], {'default': "''", 'max_length': '1024', 'db_column': "'filename'", 'blank': 'True'}), ++ 'generic_style': ('telemeta.models.core.WeakForeignKey', [], {'default': 'None', 'related_name': "'items'", 'null': 'True', 'blank': 'True', 'to': "orm['telemeta.GenericStyle']"}), ++ 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), ++ 'language': ('telemeta.models.core.CharField', [], {'default': "''", 'max_length': '250', 'blank': 'True'}), ++ 'language_iso': ('telemeta.models.core.ForeignKey', [], {'related_name': "'items'", 'on_delete': 'models.SET_NULL', 'default': 'None', 'to': "orm['telemeta.Language']", 'blank': 'True', 'null': 'True'}), ++ 'location': ('telemeta.models.core.WeakForeignKey', [], {'default': 'None', 'to': "orm['telemeta.Location']", 'null': 'True', 'blank': 'True'}), ++ 'location_comment': ('telemeta.models.core.CharField', [], {'default': "''", 'max_length': '250', 'blank': 'True'}), ++ 'mimetype': ('telemeta.models.core.CharField', [], {'default': "''", 'max_length': '255', 'blank': 'True'}), ++ 'moda_execut': ('telemeta.models.core.CharField', [], {'default': "''", 'max_length': '250', 'blank': 'True'}), ++ 'old_code': ('telemeta.models.core.CharField', [], {'default': "''", 'max_length': '250', 'blank': 'True'}), ++ 'organization': ('telemeta.models.core.WeakForeignKey', [], {'default': 'None', 'to': "orm['telemeta.Organization']", 'null': 'True', 'blank': 'True'}), ++ 'public_access': ('telemeta.models.core.CharField', [], {'default': "'metadata'", 'max_length': '16', 'blank': 'True'}), ++ 'publishing_date': ('telemeta.models.core.DateField', [], {'default': 'None', 'null': 'True', 'blank': 'True'}), ++ 'recorded_from_date': ('telemeta.models.core.DateField', [], {'default': 'None', 'null': 'True', 'blank': 'True'}), ++ 'recorded_to_date': ('telemeta.models.core.DateField', [], {'default': 'None', 'null': 'True', 'blank': 'True'}), ++ 'recordist': ('telemeta.models.core.CharField', [], {'default': "''", 'max_length': '250', 'blank': 'True'}), ++ 'rights': ('telemeta.models.core.WeakForeignKey', [], {'default': 'None', 'to': "orm['telemeta.Rights']", 'null': 'True', 'blank': 'True'}), ++ 'scientist': ('telemeta.models.core.CharField', [], {'default': "''", 'max_length': '250', 'blank': 'True'}), ++ 'summary': ('telemeta.models.core.TextField', [], {'default': "''", 'blank': 'True'}), ++ 'title': ('telemeta.models.core.CharField', [], {'default': "''", 'max_length': '250', 'blank': 'True'}), ++ 'topic': ('telemeta.models.core.WeakForeignKey', [], {'default': 'None', 'to': "orm['telemeta.Topic']", 'null': 'True', 'blank': 'True'}), ++ 'track': ('telemeta.models.core.CharField', [], {'default': "''", 'max_length': '250', 'blank': 'True'}), ++ 'url': ('django.db.models.fields.URLField', [], {'max_length': '512', 'blank': 'True'}), ++ 'vernacular_style': ('telemeta.models.core.WeakForeignKey', [], {'default': 'None', 'related_name': "'items'", 'null': 'True', 'blank': 'True', 'to': "orm['telemeta.VernacularStyle']"}) ++ }, ++ 'telemeta.metadataauthor': { ++ 'Meta': {'ordering': "['value']", 'object_name': 'MetadataAuthor', 'db_table': "'metadata_authors'"}, ++ 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), ++ 'value': ('telemeta.models.core.CharField', [], {'unique': 'True', 'max_length': '250'}) ++ }, ++ 'telemeta.metadatawriter': { ++ 'Meta': {'ordering': "['value']", 'object_name': 'MetadataWriter', 'db_table': "'metadata_writers'"}, ++ 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), ++ 'value': ('telemeta.models.core.CharField', [], {'unique': 'True', 'max_length': '250'}) ++ }, ++ 'telemeta.organization': { ++ 'Meta': {'ordering': "['value']", 'object_name': 'Organization', 'db_table': "'organization'"}, ++ 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), ++ 'value': ('telemeta.models.core.CharField', [], {'unique': 'True', 'max_length': '250'}) ++ }, ++ 'telemeta.physicalformat': { ++ 'Meta': {'ordering': "['value']", 'object_name': 'PhysicalFormat', 'db_table': "'physical_formats'"}, ++ 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), ++ 'value': ('telemeta.models.core.CharField', [], {'unique': 'True', 'max_length': '250'}) ++ }, ++ 'telemeta.publisher': { ++ 'Meta': {'ordering': "['value']", 'object_name': 'Publisher', 'db_table': "'publishers'"}, ++ 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), ++ 'value': ('telemeta.models.core.CharField', [], {'unique': 'True', 'max_length': '250'}) ++ }, ++ 'telemeta.publishercollection': { ++ 'Meta': {'ordering': "['value']", 'object_name': 'PublisherCollection', 'db_table': "'publisher_collections'"}, ++ 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), ++ 'publisher': ('telemeta.models.core.ForeignKey', [], {'related_name': "'publisher_collections'", 'to': "orm['telemeta.Publisher']"}), ++ 'value': ('telemeta.models.core.CharField', [], {'max_length': '250'}) ++ }, ++ 'telemeta.publishingstatus': { ++ 'Meta': {'ordering': "['value']", 'object_name': 'PublishingStatus', 'db_table': "'publishing_status'"}, ++ 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), ++ 'value': ('telemeta.models.core.CharField', [], {'unique': 'True', 'max_length': '250'}) ++ }, ++ 'telemeta.recordingcontext': { ++ 'Meta': {'ordering': "['value']", 'object_name': 'RecordingContext', 'db_table': "'recording_contexts'"}, ++ 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), ++ 'value': ('telemeta.models.core.CharField', [], {'unique': 'True', 'max_length': '250'}) ++ }, ++ 'telemeta.rights': { ++ 'Meta': {'ordering': "['value']", 'object_name': 'Rights', 'db_table': "'rights'"}, ++ 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), ++ 'value': ('telemeta.models.core.CharField', [], {'unique': 'True', 'max_length': '250'}) ++ }, ++ 'telemeta.topic': { ++ 'Meta': {'ordering': "['value']", 'object_name': 'Topic', 'db_table': "'topic'"}, ++ 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), ++ 'value': ('telemeta.models.core.CharField', [], {'unique': 'True', 'max_length': '250'}) ++ }, ++ 'telemeta.vernacularstyle': { ++ 'Meta': {'ordering': "['value']", 'object_name': 'VernacularStyle', 'db_table': "'vernacular_styles'"}, ++ 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), ++ 'value': ('telemeta.models.core.CharField', [], {'unique': 'True', 'max_length': '250'}) ++ } ++ } ++ ++ complete_apps = ['teleforma'] diff --cc teleforma/migrations/0105_auto__add_field_appointmentperiod_book_delay.py index 00000000,00000000..73720344 new file mode 100644 --- /dev/null +++ b/teleforma/migrations/0105_auto__add_field_appointmentperiod_book_delay.py @@@ -1,0 -1,0 +1,646 @@@ ++# -*- coding: utf-8 -*- ++from south.utils import datetime_utils as datetime ++from south.db import db ++from south.v2 import SchemaMigration ++from django.db import models ++ ++ ++class Migration(SchemaMigration): ++ ++ def forwards(self, orm): ++ # Adding field 'AppointmentPeriod.book_delay' ++ db.add_column('teleforma_appointment_period', 'book_delay', ++ self.gf('django.db.models.fields.IntegerField')(default=2), ++ keep_default=False) ++ ++ ++ def backwards(self, orm): ++ # Deleting field 'AppointmentPeriod.book_delay' ++ db.delete_column('teleforma_appointment_period', 'book_delay') ++ ++ ++ models = { ++ 'auth.group': { ++ 'Meta': {'object_name': 'Group'}, ++ 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), ++ 'name': ('django.db.models.fields.CharField', [], {'unique': 'True', 'max_length': '80'}), ++ 'permissions': ('django.db.models.fields.related.ManyToManyField', [], {'to': "orm['auth.Permission']", 'symmetrical': 'False', 'blank': 'True'}) ++ }, ++ 'auth.permission': { ++ 'Meta': {'ordering': "('content_type__app_label', 'content_type__model', 'codename')", 'unique_together': "(('content_type', 'codename'),)", 'object_name': 'Permission'}, ++ 'codename': ('django.db.models.fields.CharField', [], {'max_length': '100'}), ++ 'content_type': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['contenttypes.ContentType']"}), ++ 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), ++ 'name': ('django.db.models.fields.CharField', [], {'max_length': '50'}) ++ }, ++ 'auth.user': { ++ 'Meta': {'object_name': 'User'}, ++ 'date_joined': ('django.db.models.fields.DateTimeField', [], {'default': 'datetime.datetime.now'}), ++ 'email': ('django.db.models.fields.EmailField', [], {'max_length': '75', 'blank': 'True'}), ++ 'first_name': ('django.db.models.fields.CharField', [], {'max_length': '30', 'blank': 'True'}), ++ 'groups': ('django.db.models.fields.related.ManyToManyField', [], {'to': "orm['auth.Group']", 'symmetrical': 'False', 'blank': 'True'}), ++ 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), ++ 'is_active': ('django.db.models.fields.BooleanField', [], {'default': 'True'}), ++ 'is_staff': ('django.db.models.fields.BooleanField', [], {'default': 'False'}), ++ 'is_superuser': ('django.db.models.fields.BooleanField', [], {'default': 'False'}), ++ 'last_login': ('django.db.models.fields.DateTimeField', [], {'default': 'datetime.datetime.now'}), ++ 'last_name': ('django.db.models.fields.CharField', [], {'max_length': '30', 'blank': 'True'}), ++ 'password': ('django.db.models.fields.CharField', [], {'max_length': '128'}), ++ 'user_permissions': ('django.db.models.fields.related.ManyToManyField', [], {'to': "orm['auth.Permission']", 'symmetrical': 'False', 'blank': 'True'}), ++ 'username': ('django.db.models.fields.CharField', [], {'unique': 'True', 'max_length': '30'}) ++ }, ++ 'contenttypes.contenttype': { ++ 'Meta': {'ordering': "('name',)", 'unique_together': "(('app_label', 'model'),)", 'object_name': 'ContentType', 'db_table': "'django_content_type'"}, ++ 'app_label': ('django.db.models.fields.CharField', [], {'max_length': '100'}), ++ 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), ++ 'model': ('django.db.models.fields.CharField', [], {'max_length': '100'}), ++ 'name': ('django.db.models.fields.CharField', [], {'max_length': '100'}) ++ }, ++ 'quiz.category': { ++ 'Meta': {'object_name': 'Category'}, ++ 'category': ('django.db.models.fields.CharField', [], {'max_length': '250', 'unique': 'True', 'null': 'True', 'blank': 'True'}), ++ 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}) ++ }, ++ 'quiz.quiz': { ++ 'Meta': {'object_name': 'Quiz'}, ++ 'answers_at_end': ('django.db.models.fields.BooleanField', [], {'default': 'False'}), ++ 'category': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['quiz.Category']", 'null': 'True', 'blank': 'True'}), ++ 'description': ('django.db.models.fields.TextField', [], {'blank': 'True'}), ++ 'draft': ('django.db.models.fields.BooleanField', [], {'default': 'False'}), ++ 'exam_paper': ('django.db.models.fields.BooleanField', [], {'default': 'False'}), ++ 'fail_text': ('django.db.models.fields.TextField', [], {'blank': 'True'}), ++ 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), ++ 'max_questions': ('django.db.models.fields.PositiveIntegerField', [], {'null': 'True', 'blank': 'True'}), ++ 'pass_mark': ('django.db.models.fields.SmallIntegerField', [], {'default': '0', 'blank': 'True'}), ++ 'random_order': ('django.db.models.fields.BooleanField', [], {'default': 'False'}), ++ 'single_attempt': ('django.db.models.fields.BooleanField', [], {'default': 'False'}), ++ 'success_text': ('django.db.models.fields.TextField', [], {'blank': 'True'}), ++ 'title': ('django.db.models.fields.CharField', [], {'max_length': '60'}), ++ 'url': ('django.db.models.fields.SlugField', [], {'max_length': '60'}) ++ }, ++ 'teleforma.aestudent': { ++ 'Meta': {'ordering': "['user__last_name']", 'object_name': 'AEStudent', 'db_table': "'teleforma_ae_student'"}, ++ 'courses': ('django.db.models.fields.related.ManyToManyField', [], {'blank': 'True', 'related_name': "'ae_student'", 'null': 'True', 'symmetrical': 'False', 'to': "orm['teleforma.Course']"}), ++ 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), ++ 'period': ('django.db.models.fields.related.ManyToManyField', [], {'blank': 'True', 'related_name': "'ae_student'", 'null': 'True', 'symmetrical': 'False', 'to': "orm['teleforma.Period']"}), ++ 'platform_only': ('telemeta.models.core.BooleanField', [], {'default': 'False'}), ++ 'user': ('telemeta.models.core.ForeignKey', [], {'related_name': "'ae_student'", 'unique': 'True', 'to': "orm['auth.User']"}) ++ }, ++ 'teleforma.appointment': { ++ 'Meta': {'unique_together': "(('slot', 'jury', 'slot_nb'),)", 'object_name': 'Appointment'}, ++ 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), ++ 'jury': ('django.db.models.fields.related.ForeignKey', [], {'related_name': "'appointments'", 'null': 'True', 'on_delete': 'models.SET_NULL', 'to': "orm['teleforma.AppointmentJury']"}), ++ 'slot': ('django.db.models.fields.related.ForeignKey', [], {'related_name': "'appointments'", 'to': "orm['teleforma.AppointmentSlot']"}), ++ 'slot_nb': ('django.db.models.fields.IntegerField', [], {}), ++ 'student': ('django.db.models.fields.related.ForeignKey', [], {'related_name': "'appointments'", 'to': "orm['auth.User']"}) ++ }, ++ 'teleforma.appointmentjury': { ++ 'Meta': {'ordering': "('id',)", 'object_name': 'AppointmentJury', 'db_table': "'teleforma_appointment_jury'"}, ++ 'address': ('django.db.models.fields.TextField', [], {}), ++ 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), ++ 'name': ('django.db.models.fields.CharField', [], {'max_length': '255'}), ++ 'slot': ('django.db.models.fields.related.ForeignKey', [], {'related_name': "'jurys'", 'null': 'True', 'to': "orm['teleforma.AppointmentSlot']"}) ++ }, ++ 'teleforma.appointmentperiod': { ++ 'Meta': {'ordering': "('id',)", 'object_name': 'AppointmentPeriod', 'db_table': "'teleforma_appointment_period'"}, ++ 'appointment_mail_text': ('django.db.models.fields.TextField', [], {'blank': 'True'}), ++ 'appointment_slot_size': ('django.db.models.fields.IntegerField', [], {'default': '40'}), ++ 'book_delay': ('django.db.models.fields.IntegerField', [], {'default': '2'}), ++ 'cancel_delay': ('django.db.models.fields.IntegerField', [], {'default': '2'}), ++ 'enable_appointment': ('django.db.models.fields.BooleanField', [], {'default': 'True'}), ++ 'end': ('django.db.models.fields.DateField', [], {}), ++ 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), ++ 'name': ('django.db.models.fields.CharField', [], {'max_length': '255'}), ++ 'periods': ('django.db.models.fields.related.ManyToManyField', [], {'related_name': "'appointment_periods'", 'symmetrical': 'False', 'to': "orm['teleforma.Period']"}), ++ 'start': ('django.db.models.fields.DateField', [], {}) ++ }, ++ 'teleforma.appointmentslot': { ++ 'Meta': {'ordering': "('id',)", 'object_name': 'AppointmentSlot', 'db_table': "'teleforma_appointment_slot'"}, ++ 'appointment_period': ('django.db.models.fields.related.ForeignKey', [], {'related_name': "'slots'", 'null': 'True', 'to': "orm['teleforma.AppointmentPeriod']"}), ++ 'date': ('django.db.models.fields.DateField', [], {'null': 'True'}), ++ 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), ++ 'nb': ('django.db.models.fields.IntegerField', [], {}), ++ 'start': ('django.db.models.fields.TimeField', [], {}) ++ }, ++ 'teleforma.conference': { ++ 'Meta': {'ordering': "['-date_begin']", 'object_name': 'Conference'}, ++ 'comment': ('teleforma.fields.ShortTextField', [], {'max_length': '255', 'blank': 'True'}), ++ 'course': ('django.db.models.fields.related.ForeignKey', [], {'related_name': "'conference'", 'to': "orm['teleforma.Course']"}), ++ 'course_type': ('django.db.models.fields.related.ForeignKey', [], {'related_name': "'conference'", 'to': "orm['teleforma.CourseType']"}), ++ 'date_begin': ('django.db.models.fields.DateTimeField', [], {'null': 'True', 'blank': 'True'}), ++ 'date_end': ('django.db.models.fields.DateTimeField', [], {'null': 'True', 'blank': 'True'}), ++ 'department': ('django.db.models.fields.related.ForeignKey', [], {'blank': 'True', 'related_name': "'conference'", 'null': 'True', 'on_delete': 'models.SET_NULL', 'to': "orm['teleforma.Department']"}), ++ 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), ++ 'period': ('django.db.models.fields.related.ForeignKey', [], {'blank': 'True', 'related_name': "'conference'", 'null': 'True', 'on_delete': 'models.SET_NULL', 'to': "orm['teleforma.Period']"}), ++ 'professor': ('django.db.models.fields.related.ForeignKey', [], {'blank': 'True', 'related_name': "'conference'", 'null': 'True', 'on_delete': 'models.SET_NULL', 'to': "orm['teleforma.Professor']"}), ++ 'public_id': ('django.db.models.fields.CharField', [], {'max_length': '255', 'blank': 'True'}), ++ 'readers': ('django.db.models.fields.related.ManyToManyField', [], {'blank': 'True', 'related_name': "'conference'", 'null': 'True', 'symmetrical': 'False', 'to': "orm['auth.User']"}), ++ 'room': ('django.db.models.fields.related.ForeignKey', [], {'blank': 'True', 'related_name': "'conference'", 'null': 'True', 'to': "orm['teleforma.Room']"}), ++ 'session': ('django.db.models.fields.CharField', [], {'default': "'1'", 'max_length': '16'}), ++ 'status': ('django.db.models.fields.IntegerField', [], {'default': '2'}), ++ 'web_class_group': ('django.db.models.fields.related.ForeignKey', [], {'blank': 'True', 'related_name': "'conferences'", 'null': 'True', 'on_delete': 'models.SET_NULL', 'to': "orm['teleforma.WebClassGroup']"}) ++ }, ++ 'teleforma.course': { ++ 'Meta': {'ordering': "['number']", 'object_name': 'Course'}, ++ 'code': ('django.db.models.fields.CharField', [], {'max_length': '255'}), ++ 'date_modified': ('django.db.models.fields.DateTimeField', [], {'auto_now': 'True', 'null': 'True', 'blank': 'True'}), ++ 'department': ('django.db.models.fields.related.ForeignKey', [], {'related_name': "'course'", 'to': "orm['teleforma.Department']"}), ++ 'description': ('django.db.models.fields.CharField', [], {'max_length': '255', 'blank': 'True'}), ++ 'has_exam_scripts': ('django.db.models.fields.BooleanField', [], {'default': 'True'}), ++ 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), ++ 'magistral': ('django.db.models.fields.BooleanField', [], {'default': 'False'}), ++ 'number': ('django.db.models.fields.IntegerField', [], {'null': 'True', 'blank': 'True'}), ++ 'obligation': ('django.db.models.fields.BooleanField', [], {'default': 'False'}), ++ 'oral_1': ('django.db.models.fields.BooleanField', [], {'default': 'False'}), ++ 'oral_2': ('django.db.models.fields.BooleanField', [], {'default': 'False'}), ++ 'oral_speciality': ('django.db.models.fields.BooleanField', [], {'default': 'False'}), ++ 'procedure': ('django.db.models.fields.BooleanField', [], {'default': 'False'}), ++ 'quiz': ('django.db.models.fields.related.ManyToManyField', [], {'symmetrical': 'False', 'to': "orm['quiz.Quiz']", 'null': 'True', 'blank': 'True'}), ++ 'synthesis_note': ('django.db.models.fields.BooleanField', [], {'default': 'False'}), ++ 'title': ('django.db.models.fields.CharField', [], {'max_length': '255'}), ++ 'title_tweeter': ('django.db.models.fields.CharField', [], {'max_length': '255'}), ++ 'written_speciality': ('django.db.models.fields.BooleanField', [], {'default': 'False'}) ++ }, ++ 'teleforma.coursegroup': { ++ 'Meta': {'object_name': 'CourseGroup', 'db_table': "'teleforma_course_group'"}, ++ 'courses': ('django.db.models.fields.related.ManyToManyField', [], {'blank': 'True', 'related_name': "'course_groups'", 'null': 'True', 'symmetrical': 'False', 'to': "orm['teleforma.Course']"}), ++ 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), ++ 'name': ('django.db.models.fields.CharField', [], {'max_length': '255'}) ++ }, ++ 'teleforma.coursetype': { ++ 'Meta': {'object_name': 'CourseType', 'db_table': "'teleforma_course_type'"}, ++ 'description': ('django.db.models.fields.CharField', [], {'max_length': '255', 'blank': 'True'}), ++ 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), ++ 'name': ('django.db.models.fields.CharField', [], {'max_length': '255'}) ++ }, ++ 'teleforma.department': { ++ 'Meta': {'object_name': 'Department'}, ++ 'default_period': ('django.db.models.fields.related.ForeignKey', [], {'blank': 'True', 'related_name': "'departments'", 'null': 'True', 'on_delete': 'models.SET_NULL', 'to': "orm['teleforma.Period']"}), ++ 'description': ('django.db.models.fields.CharField', [], {'max_length': '255', 'blank': 'True'}), ++ 'domain': ('django.db.models.fields.CharField', [], {'max_length': '255', 'blank': 'True'}), ++ 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), ++ 'name': ('django.db.models.fields.CharField', [], {'max_length': '255'}), ++ 'organization': ('django.db.models.fields.related.ForeignKey', [], {'related_name': "'department'", 'to': "orm['teleforma.Organization']"}) ++ }, ++ 'teleforma.discount': { ++ 'Meta': {'object_name': 'Discount', 'db_table': "'teleforma_discounts'"}, ++ 'description': ('django.db.models.fields.CharField', [], {'max_length': '255', 'blank': 'True'}), ++ 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), ++ 'student': ('django.db.models.fields.related.ForeignKey', [], {'related_name': "'discounts'", 'to': "orm['teleforma.Student']"}), ++ 'value': ('django.db.models.fields.FloatField', [], {}) ++ }, ++ 'teleforma.document': { ++ 'Meta': {'ordering': "['-date_added']", 'object_name': 'Document'}, ++ 'annal_year': ('django.db.models.fields.IntegerField', [], {'null': 'True', 'blank': 'True'}), ++ 'code': ('django.db.models.fields.CharField', [], {'max_length': '255', 'blank': 'True'}), ++ 'conference': ('django.db.models.fields.related.ForeignKey', [], {'blank': 'True', 'related_name': "'document'", 'null': 'True', 'on_delete': 'models.SET_NULL', 'to': "orm['teleforma.Conference']"}), ++ 'course': ('django.db.models.fields.related.ForeignKey', [], {'related_name': "'document'", 'to': "orm['teleforma.Course']"}), ++ 'course_type': ('django.db.models.fields.related.ManyToManyField', [], {'symmetrical': 'False', 'related_name': "'document'", 'blank': 'True', 'to': "orm['teleforma.CourseType']"}), ++ 'credits': ('django.db.models.fields.CharField', [], {'max_length': '255', 'blank': 'True'}), ++ 'date_added': ('django.db.models.fields.DateTimeField', [], {'auto_now_add': 'True', 'null': 'True', 'blank': 'True'}), ++ 'date_modified': ('django.db.models.fields.DateTimeField', [], {'auto_now': 'True', 'null': 'True', 'blank': 'True'}), ++ 'description': ('django.db.models.fields.CharField', [], {'max_length': '255', 'blank': 'True'}), ++ 'file': ('telemeta.models.core.FileField', [], {'default': "''", 'max_length': '1024', 'db_column': "'filename'", 'blank': 'True'}), ++ 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), ++ 'iej': ('django.db.models.fields.related.ForeignKey', [], {'blank': 'True', 'related_name': "'document'", 'null': 'True', 'on_delete': 'models.SET_NULL', 'to': "orm['teleforma.IEJ']"}), ++ 'is_annal': ('django.db.models.fields.BooleanField', [], {'default': 'False'}), ++ 'is_published': ('django.db.models.fields.BooleanField', [], {'default': 'False'}), ++ 'mime_type': ('django.db.models.fields.CharField', [], {'max_length': '255', 'blank': 'True'}), ++ 'periods': ('django.db.models.fields.related.ManyToManyField', [], {'blank': 'True', 'related_name': "'documents'", 'null': 'True', 'symmetrical': 'False', 'to': "orm['teleforma.Period']"}), ++ 'readers': ('django.db.models.fields.related.ManyToManyField', [], {'blank': 'True', 'related_name': "'document'", 'null': 'True', 'symmetrical': 'False', 'to': "orm['auth.User']"}), ++ 'session': ('django.db.models.fields.CharField', [], {'default': "'1'", 'max_length': '16'}), ++ 'title': ('django.db.models.fields.CharField', [], {'max_length': '255', 'blank': 'True'}), ++ 'type': ('django.db.models.fields.related.ForeignKey', [], {'blank': 'True', 'related_name': "'document'", 'null': 'True', 'to': "orm['teleforma.DocumentType']"}), ++ 'weight': ('django.db.models.fields.IntegerField', [], {'default': '1', 'blank': 'True'}) ++ }, ++ 'teleforma.documentsimple': { ++ 'Meta': {'ordering': "['-date_added']", 'object_name': 'DocumentSimple', 'db_table': "'teleforma_document_simple'"}, ++ 'code': ('django.db.models.fields.CharField', [], {'max_length': '255', 'blank': 'True'}), ++ 'credits': ('django.db.models.fields.CharField', [], {'max_length': '255', 'blank': 'True'}), ++ 'date_added': ('django.db.models.fields.DateTimeField', [], {'auto_now_add': 'True', 'null': 'True', 'blank': 'True'}), ++ 'date_modified': ('django.db.models.fields.DateTimeField', [], {'auto_now': 'True', 'null': 'True', 'blank': 'True'}), ++ 'description': ('django.db.models.fields.CharField', [], {'max_length': '255', 'blank': 'True'}), ++ 'file': ('telemeta.models.core.FileField', [], {'default': "''", 'max_length': '1024', 'db_column': "'filename'", 'blank': 'True'}), ++ 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), ++ 'is_published': ('django.db.models.fields.BooleanField', [], {'default': 'False'}), ++ 'mime_type': ('django.db.models.fields.CharField', [], {'max_length': '255', 'blank': 'True'}), ++ 'period': ('django.db.models.fields.related.ForeignKey', [], {'blank': 'True', 'related_name': "'document_simple'", 'null': 'True', 'on_delete': 'models.SET_NULL', 'to': "orm['teleforma.Period']"}), ++ 'readers': ('django.db.models.fields.related.ManyToManyField', [], {'blank': 'True', 'related_name': "'document_simple'", 'null': 'True', 'symmetrical': 'False', 'to': "orm['auth.User']"}), ++ 'title': ('django.db.models.fields.CharField', [], {'max_length': '255', 'blank': 'True'}), ++ 'weight': ('django.db.models.fields.IntegerField', [], {'default': '1', 'blank': 'True'}) ++ }, ++ 'teleforma.documenttype': { ++ 'Meta': {'ordering': "['number']", 'object_name': 'DocumentType', 'db_table': "'teleforma_document_type'"}, ++ 'description': ('django.db.models.fields.CharField', [], {'max_length': '255', 'blank': 'True'}), ++ 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), ++ 'name': ('django.db.models.fields.CharField', [], {'max_length': '255'}), ++ 'number': ('django.db.models.fields.IntegerField', [], {'null': 'True', 'blank': 'True'}) ++ }, ++ 'teleforma.groupedmessage': { ++ 'Meta': {'object_name': 'GroupedMessage', 'db_table': "'teleforma_grouped_messages'"}, ++ 'date_sent': ('django.db.models.fields.DateTimeField', [], {'null': 'True', 'blank': 'True'}), ++ 'group': ('django.db.models.fields.related.ForeignKey', [], {'blank': 'True', 'related_name': "'grouped_messages'", 'null': 'True', 'on_delete': 'models.SET_NULL', 'to': "orm['teleforma.StudentGroup']"}), ++ 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), ++ 'message': ('django.db.models.fields.TextField', [], {}), ++ 'sender': ('django.db.models.fields.related.ForeignKey', [], {'blank': 'True', 'related_name': "'grouped_messages'", 'null': 'True', 'on_delete': 'models.SET_NULL', 'to': "orm['auth.User']"}), ++ 'sent': ('django.db.models.fields.BooleanField', [], {'default': 'False'}), ++ 'subject': ('django.db.models.fields.CharField', [], {'max_length': '119'}), ++ 'to_send': ('django.db.models.fields.BooleanField', [], {'default': 'False'}) ++ }, ++ 'teleforma.home': { ++ 'Meta': {'object_name': 'Home'}, ++ 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), ++ 'text': ('tinymce.models.HTMLField', [], {'blank': 'True'}), ++ 'video': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['teleforma.Media']", 'null': 'True', 'blank': 'True'}) ++ }, ++ 'teleforma.iej': { ++ 'Meta': {'ordering': "['name']", 'object_name': 'IEJ'}, ++ 'description': ('django.db.models.fields.CharField', [], {'max_length': '255', 'blank': 'True'}), ++ 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), ++ 'name': ('django.db.models.fields.CharField', [], {'max_length': '255'}) ++ }, ++ 'teleforma.livestream': { ++ 'Meta': {'object_name': 'LiveStream', 'db_table': "'teleforma_live_stream'"}, ++ 'conference': ('django.db.models.fields.related.ForeignKey', [], {'blank': 'True', 'related_name': "'livestream'", 'null': 'True', 'on_delete': 'models.SET_NULL', 'to': "orm['teleforma.Conference']"}), ++ 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), ++ 'server': ('django.db.models.fields.related.ForeignKey', [], {'related_name': "'livestream'", 'to': "orm['teleforma.StreamingServer']"}), ++ 'stream_type': ('django.db.models.fields.CharField', [], {'max_length': '32'}), ++ 'streaming': ('django.db.models.fields.BooleanField', [], {'default': 'False'}) ++ }, ++ 'teleforma.media': { ++ 'Meta': {'ordering': "['-date_modified', '-conference__session']", 'object_name': 'Media'}, ++ 'code': ('django.db.models.fields.CharField', [], {'max_length': '255', 'blank': 'True'}), ++ 'conference': ('django.db.models.fields.related.ForeignKey', [], {'blank': 'True', 'related_name': "'media'", 'null': 'True', 'on_delete': 'models.SET_NULL', 'to': "orm['teleforma.Conference']"}), ++ 'course': ('django.db.models.fields.related.ForeignKey', [], {'blank': 'True', 'related_name': "'media'", 'null': 'True', 'to': "orm['teleforma.Course']"}), ++ 'course_type': ('django.db.models.fields.related.ForeignKey', [], {'blank': 'True', 'related_name': "'media'", 'null': 'True', 'to': "orm['teleforma.CourseType']"}), ++ 'credits': ('django.db.models.fields.CharField', [], {'max_length': '255', 'blank': 'True'}), ++ 'date_added': ('django.db.models.fields.DateTimeField', [], {'auto_now_add': 'True', 'null': 'True', 'blank': 'True'}), ++ 'date_modified': ('django.db.models.fields.DateTimeField', [], {'auto_now': 'True', 'null': 'True', 'blank': 'True'}), ++ 'description': ('django.db.models.fields.CharField', [], {'max_length': '255', 'blank': 'True'}), ++ 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), ++ 'is_published': ('django.db.models.fields.BooleanField', [], {'default': 'False'}), ++ 'item': ('django.db.models.fields.related.ForeignKey', [], {'blank': 'True', 'related_name': "'media'", 'null': 'True', 'to': "orm['telemeta.MediaItem']"}), ++ 'mime_type': ('django.db.models.fields.CharField', [], {'max_length': '255', 'blank': 'True'}), ++ 'period': ('django.db.models.fields.related.ForeignKey', [], {'blank': 'True', 'related_name': "'media'", 'null': 'True', 'on_delete': 'models.SET_NULL', 'to': "orm['teleforma.Period']"}), ++ 'readers': ('django.db.models.fields.related.ManyToManyField', [], {'blank': 'True', 'related_name': "'media'", 'null': 'True', 'symmetrical': 'False', 'to': "orm['auth.User']"}), ++ 'title': ('django.db.models.fields.CharField', [], {'max_length': '255', 'blank': 'True'}), ++ 'type': ('django.db.models.fields.CharField', [], {'max_length': '32'}), ++ 'weight': ('django.db.models.fields.IntegerField', [], {'default': '1', 'blank': 'True'}) ++ }, ++ 'teleforma.newsitem': { ++ 'Meta': {'object_name': 'NewsItem'}, ++ 'course': ('django.db.models.fields.related.ForeignKey', [], {'related_name': "'newsitems'", 'to': "orm['teleforma.Course']"}), ++ 'created': ('django.db.models.fields.DateTimeField', [], {'auto_now_add': 'True', 'blank': 'True'}), ++ 'creator': ('django.db.models.fields.related.ForeignKey', [], {'related_name': "'newsitems'", 'to': "orm['auth.User']"}), ++ 'deleted': ('django.db.models.fields.BooleanField', [], {'default': 'False'}), ++ 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), ++ 'period': ('django.db.models.fields.related.ForeignKey', [], {'related_name': "'newsitems'", 'null': 'True', 'to': "orm['teleforma.Period']"}), ++ 'text': ('tinymce.models.HTMLField', [], {}), ++ 'title': ('django.db.models.fields.CharField', [], {'max_length': '255'}) ++ }, ++ 'teleforma.optionalfee': { ++ 'Meta': {'object_name': 'OptionalFee', 'db_table': "'teleforma_optional_fees'"}, ++ 'description': ('django.db.models.fields.CharField', [], {'max_length': '255', 'blank': 'True'}), ++ 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), ++ 'student': ('django.db.models.fields.related.ForeignKey', [], {'related_name': "'optional_fees'", 'to': "orm['teleforma.Student']"}), ++ 'value': ('django.db.models.fields.FloatField', [], {}) ++ }, ++ 'teleforma.organization': { ++ 'Meta': {'object_name': 'Organization'}, ++ 'description': ('django.db.models.fields.CharField', [], {'max_length': '255', 'blank': 'True'}), ++ 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), ++ 'name': ('django.db.models.fields.CharField', [], {'max_length': '255'}) ++ }, ++ 'teleforma.payback': { ++ 'Meta': {'object_name': 'Payback', 'db_table': "'teleforma_paybacks'"}, ++ 'description': ('django.db.models.fields.CharField', [], {'max_length': '255', 'blank': 'True'}), ++ 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), ++ 'student': ('django.db.models.fields.related.ForeignKey', [], {'related_name': "'paybacks'", 'to': "orm['teleforma.Student']"}), ++ 'value': ('django.db.models.fields.FloatField', [], {}) ++ }, ++ 'teleforma.payment': { ++ 'Meta': {'ordering': "['month']", 'object_name': 'Payment', 'db_table': "'teleforma_payments'"}, ++ 'collected': ('django.db.models.fields.BooleanField', [], {'default': 'False'}), ++ 'date_created': ('django.db.models.fields.DateTimeField', [], {'auto_now_add': 'True', 'blank': 'True'}), ++ 'date_modified': ('django.db.models.fields.DateTimeField', [], {'auto_now': 'True', 'blank': 'True'}), ++ 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), ++ 'month': ('django.db.models.fields.IntegerField', [], {'default': '1'}), ++ 'student': ('django.db.models.fields.related.ForeignKey', [], {'related_name': "'payments'", 'to': "orm['teleforma.Student']"}), ++ 'type': ('django.db.models.fields.CharField', [], {'max_length': '64'}), ++ 'value': ('django.db.models.fields.FloatField', [], {}) ++ }, ++ 'teleforma.period': { ++ 'Meta': {'ordering': "['name']", 'object_name': 'Period'}, ++ 'date_begin': ('django.db.models.fields.DateField', [], {'null': 'True', 'blank': 'True'}), ++ 'date_end': ('django.db.models.fields.DateField', [], {'null': 'True', 'blank': 'True'}), ++ 'date_exam_end': ('django.db.models.fields.DateTimeField', [], {'null': 'True', 'blank': 'True'}), ++ 'date_password_init': ('django.db.models.fields.DateField', [], {'null': 'True', 'blank': 'True'}), ++ 'department': ('telemeta.models.core.ForeignKey', [], {'default': 'None', 'related_name': "'period'", 'null': 'True', 'blank': 'True', 'to': "orm['teleforma.Department']"}), ++ 'description': ('django.db.models.fields.CharField', [], {'max_length': '255', 'blank': 'True'}), ++ 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), ++ 'is_open': ('django.db.models.fields.BooleanField', [], {'default': 'True'}), ++ 'message_local': ('django.db.models.fields.TextField', [], {'blank': 'True'}), ++ 'message_platform': ('django.db.models.fields.TextField', [], {'blank': 'True'}), ++ 'name': ('django.db.models.fields.CharField', [], {'max_length': '255'}), ++ 'parent': ('django.db.models.fields.related.ForeignKey', [], {'blank': 'True', 'related_name': "'children'", 'null': 'True', 'to': "orm['teleforma.Period']"}) ++ }, ++ 'teleforma.professor': { ++ 'Meta': {'ordering': "['user__last_name']", 'object_name': 'Professor'}, ++ 'courses': ('django.db.models.fields.related.ManyToManyField', [], {'blank': 'True', 'related_name': "'professor'", 'null': 'True', 'symmetrical': 'False', 'to': "orm['teleforma.Course']"}), ++ 'department': ('django.db.models.fields.related.ForeignKey', [], {'blank': 'True', 'related_name': "'professor'", 'null': 'True', 'on_delete': 'models.SET_NULL', 'to': "orm['teleforma.Department']"}), ++ 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), ++ 'user': ('django.db.models.fields.related.ForeignKey', [], {'related_name': "'professor'", 'unique': 'True', 'to': "orm['auth.User']"}) ++ }, ++ 'teleforma.profile': { ++ 'Meta': {'object_name': 'Profile', 'db_table': "'teleforma_profiles'"}, ++ 'address': ('django.db.models.fields.CharField', [], {'max_length': '255', 'blank': 'True'}), ++ 'address_detail': ('django.db.models.fields.CharField', [], {'max_length': '255', 'null': 'True', 'blank': 'True'}), ++ 'birthday': ('django.db.models.fields.DateField', [], {'null': 'True', 'blank': 'True'}), ++ 'city': ('django.db.models.fields.CharField', [], {'max_length': '255', 'blank': 'True'}), ++ 'country': ('django.db.models.fields.CharField', [], {'max_length': '255', 'blank': 'True'}), ++ 'expiration_date': ('django.db.models.fields.DateField', [], {'null': 'True', 'blank': 'True'}), ++ 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), ++ 'init_password': ('django.db.models.fields.BooleanField', [], {'default': 'False'}), ++ 'language': ('django.db.models.fields.CharField', [], {'max_length': '255', 'blank': 'True'}), ++ 'postal_code': ('django.db.models.fields.CharField', [], {'max_length': '255', 'blank': 'True'}), ++ 'telephone': ('django.db.models.fields.CharField', [], {'max_length': '255', 'blank': 'True'}), ++ 'user': ('django.db.models.fields.related.ForeignKey', [], {'related_name': "'profile'", 'unique': 'True', 'to': "orm['auth.User']"}), ++ 'wifi_login': ('django.db.models.fields.CharField', [], {'max_length': '255', 'blank': 'True'}), ++ 'wifi_pass': ('django.db.models.fields.CharField', [], {'max_length': '255', 'blank': 'True'}) ++ }, ++ 'teleforma.room': { ++ 'Meta': {'object_name': 'Room'}, ++ 'description': ('django.db.models.fields.CharField', [], {'max_length': '255', 'blank': 'True'}), ++ 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), ++ 'name': ('django.db.models.fields.CharField', [], {'max_length': '255'}), ++ 'organization': ('django.db.models.fields.related.ForeignKey', [], {'related_name': "'room'", 'to': "orm['teleforma.Organization']"}) ++ }, ++ 'teleforma.streamingserver': { ++ 'Meta': {'object_name': 'StreamingServer', 'db_table': "'teleforma_streaming_server'"}, ++ 'admin_password': ('django.db.models.fields.CharField', [], {'max_length': '32', 'blank': 'True'}), ++ 'description': ('django.db.models.fields.CharField', [], {'max_length': '255', 'blank': 'True'}), ++ 'host': ('django.db.models.fields.CharField', [], {'max_length': '255'}), ++ 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), ++ 'port': ('django.db.models.fields.CharField', [], {'max_length': '32'}), ++ 'source_password': ('django.db.models.fields.CharField', [], {'max_length': '32'}), ++ 'type': ('django.db.models.fields.CharField', [], {'max_length': '32'}) ++ }, ++ 'teleforma.student': { ++ 'Meta': {'ordering': "['user__last_name', '-date_subscribed']", 'object_name': 'Student'}, ++ 'application_fees': ('django.db.models.fields.BooleanField', [], {'default': 'False'}), ++ 'confirmation_sent': ('django.db.models.fields.BooleanField', [], {'default': 'False'}), ++ 'date_registered': ('django.db.models.fields.DateTimeField', [], {'auto_now_add': 'True', 'null': 'True', 'blank': 'True'}), ++ 'date_subscribed': ('django.db.models.fields.DateTimeField', [], {'null': 'True', 'blank': 'True'}), ++ 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), ++ 'iej': ('django.db.models.fields.related.ForeignKey', [], {'blank': 'True', 'related_name': "'student'", 'null': 'True', 'on_delete': 'models.SET_NULL', 'to': "orm['teleforma.IEJ']"}), ++ 'is_subscribed': ('django.db.models.fields.BooleanField', [], {'default': 'False'}), ++ 'level': ('django.db.models.fields.CharField', [], {'max_length': '100', 'blank': 'True'}), ++ 'options': ('django.db.models.fields.related.ForeignKey', [], {'blank': 'True', 'related_name': "'options_students'", 'null': 'True', 'to': "orm['teleforma.Course']"}), ++ 'oral_1': ('django.db.models.fields.related.ForeignKey', [], {'blank': 'True', 'related_name': "'oral_1_students'", 'null': 'True', 'to': "orm['teleforma.Course']"}), ++ 'oral_2': ('django.db.models.fields.related.ForeignKey', [], {'blank': 'True', 'related_name': "'oral_2_students'", 'null': 'True', 'to': "orm['teleforma.Course']"}), ++ 'oral_speciality': ('django.db.models.fields.related.ForeignKey', [], {'blank': 'True', 'related_name': "'oral_speciality_students'", 'null': 'True', 'to': "orm['teleforma.Course']"}), ++ 'period': ('django.db.models.fields.related.ForeignKey', [], {'blank': 'True', 'related_name': "'student'", 'null': 'True', 'on_delete': 'models.SET_NULL', 'to': "orm['teleforma.Period']"}), ++ 'platform_only': ('django.db.models.fields.BooleanField', [], {'default': 'False'}), ++ 'procedure': ('django.db.models.fields.related.ForeignKey', [], {'blank': 'True', 'related_name': "'procedure_students'", 'null': 'True', 'to': "orm['teleforma.Course']"}), ++ 'promo_code': ('django.db.models.fields.CharField', [], {'max_length': '100', 'blank': 'True'}), ++ 'subscription_fees': ('django.db.models.fields.FloatField', [], {'null': 'True', 'blank': 'True'}), ++ 'training': ('django.db.models.fields.related.ForeignKey', [], {'blank': 'True', 'related_name': "'student_training'", 'null': 'True', 'to': "orm['teleforma.Training']"}), ++ 'trainings': ('django.db.models.fields.related.ManyToManyField', [], {'blank': 'True', 'related_name': "'student_trainings'", 'null': 'True', 'symmetrical': 'False', 'to': "orm['teleforma.Training']"}), ++ 'user': ('django.db.models.fields.related.ForeignKey', [], {'related_name': "'student'", 'unique': 'True', 'to': "orm['auth.User']"}), ++ 'written_speciality': ('django.db.models.fields.related.ForeignKey', [], {'blank': 'True', 'related_name': "'written_speciality_2students'", 'null': 'True', 'to': "orm['teleforma.Course']"}) ++ }, ++ 'teleforma.studentgroup': { ++ 'Meta': {'object_name': 'StudentGroup', 'db_table': "'teleforma_student_groups'"}, ++ 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), ++ 'name': ('django.db.models.fields.CharField', [], {'max_length': '255'}), ++ 'students': ('django.db.models.fields.related.ManyToManyField', [], {'blank': 'True', 'related_name': "'groups'", 'null': 'True', 'symmetrical': 'False', 'to': "orm['teleforma.Student']"}) ++ }, ++ 'teleforma.training': { ++ 'Meta': {'object_name': 'Training'}, ++ 'available': ('django.db.models.fields.BooleanField', [], {'default': 'False'}), ++ 'code': ('django.db.models.fields.CharField', [], {'max_length': '255'}), ++ 'cost': ('django.db.models.fields.FloatField', [], {'null': 'True', 'blank': 'True'}), ++ 'description': ('django.db.models.fields.CharField', [], {'max_length': '512', 'blank': 'True'}), ++ 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), ++ 'magistral': ('django.db.models.fields.related.ManyToManyField', [], {'blank': 'True', 'related_name': "'training_magistral'", 'null': 'True', 'symmetrical': 'False', 'to': "orm['teleforma.CourseType']"}), ++ 'name': ('django.db.models.fields.CharField', [], {'max_length': '255', 'blank': 'True'}), ++ 'obligation': ('django.db.models.fields.related.ManyToManyField', [], {'blank': 'True', 'related_name': "'training_obligation'", 'null': 'True', 'symmetrical': 'False', 'to': "orm['teleforma.CourseType']"}), ++ 'options': ('django.db.models.fields.related.ManyToManyField', [], {'blank': 'True', 'related_name': "'training_options'", 'null': 'True', 'symmetrical': 'False', 'to': "orm['teleforma.CourseType']"}), ++ 'oral_1': ('django.db.models.fields.related.ManyToManyField', [], {'blank': 'True', 'related_name': "'training_oral_1'", 'null': 'True', 'symmetrical': 'False', 'to': "orm['teleforma.CourseType']"}), ++ 'oral_2': ('django.db.models.fields.related.ManyToManyField', [], {'blank': 'True', 'related_name': "'training_oral_2'", 'null': 'True', 'symmetrical': 'False', 'to': "orm['teleforma.CourseType']"}), ++ 'oral_speciality': ('django.db.models.fields.related.ManyToManyField', [], {'blank': 'True', 'related_name': "'training_oral_speciality'", 'null': 'True', 'symmetrical': 'False', 'to': "orm['teleforma.CourseType']"}), ++ 'parent': ('django.db.models.fields.related.ForeignKey', [], {'blank': 'True', 'related_name': "'children'", 'null': 'True', 'to': "orm['teleforma.Training']"}), ++ 'period': ('django.db.models.fields.related.ForeignKey', [], {'blank': 'True', 'related_name': "'training'", 'null': 'True', 'to': "orm['teleforma.Period']"}), ++ 'procedure': ('django.db.models.fields.related.ManyToManyField', [], {'blank': 'True', 'related_name': "'training_procedure'", 'null': 'True', 'symmetrical': 'False', 'to': "orm['teleforma.CourseType']"}), ++ 'synthesis_note': ('django.db.models.fields.related.ManyToManyField', [], {'blank': 'True', 'related_name': "'training_synthesis_note'", 'null': 'True', 'symmetrical': 'False', 'to': "orm['teleforma.CourseType']"}), ++ 'written_speciality': ('django.db.models.fields.related.ManyToManyField', [], {'blank': 'True', 'related_name': "'training_written_speciality'", 'null': 'True', 'symmetrical': 'False', 'to': "orm['teleforma.CourseType']"}) ++ }, ++ 'teleforma.webclassgroup': { ++ 'Meta': {'ordering': "['name']", 'object_name': 'WebClassGroup'}, ++ 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), ++ 'iejs': ('django.db.models.fields.related.ManyToManyField', [], {'blank': 'True', 'related_name': "'web_class_group'", 'null': 'True', 'symmetrical': 'False', 'to': "orm['teleforma.IEJ']"}), ++ 'name': ('django.db.models.fields.CharField', [], {'max_length': '255'}) ++ }, ++ 'telemeta.acquisitionmode': { ++ 'Meta': {'ordering': "['value']", 'object_name': 'AcquisitionMode', 'db_table': "'acquisition_modes'"}, ++ 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), ++ 'value': ('telemeta.models.core.CharField', [], {'unique': 'True', 'max_length': '250'}) ++ }, ++ 'telemeta.adconversion': { ++ 'Meta': {'ordering': "['value']", 'object_name': 'AdConversion', 'db_table': "'ad_conversions'"}, ++ 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), ++ 'value': ('telemeta.models.core.CharField', [], {'unique': 'True', 'max_length': '250'}) ++ }, ++ 'telemeta.ethnicgroup': { ++ 'Meta': {'ordering': "['value']", 'object_name': 'EthnicGroup', 'db_table': "'ethnic_groups'"}, ++ 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), ++ 'value': ('telemeta.models.core.CharField', [], {'unique': 'True', 'max_length': '250'}) ++ }, ++ 'telemeta.genericstyle': { ++ 'Meta': {'ordering': "['value']", 'object_name': 'GenericStyle', 'db_table': "'generic_styles'"}, ++ 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), ++ 'value': ('telemeta.models.core.CharField', [], {'unique': 'True', 'max_length': '250'}) ++ }, ++ 'telemeta.language': { ++ 'Meta': {'ordering': "['name']", 'object_name': 'Language', 'db_table': "'languages'"}, ++ 'comment': ('telemeta.models.core.TextField', [], {'default': "''", 'blank': 'True'}), ++ 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), ++ 'identifier': ('telemeta.models.core.CharField', [], {'default': "''", 'max_length': '3', 'blank': 'True'}), ++ 'name': ('telemeta.models.core.CharField', [], {'default': "''", 'max_length': '250', 'blank': 'True'}), ++ 'part1': ('telemeta.models.core.CharField', [], {'default': "''", 'max_length': '1', 'blank': 'True'}), ++ 'part2B': ('telemeta.models.core.CharField', [], {'default': "''", 'max_length': '3', 'blank': 'True'}), ++ 'part2T': ('telemeta.models.core.CharField', [], {'default': "''", 'max_length': '3', 'blank': 'True'}), ++ 'scope': ('telemeta.models.core.CharField', [], {'default': "''", 'max_length': '1', 'blank': 'True'}), ++ 'type': ('telemeta.models.core.CharField', [], {'default': "''", 'max_length': '1', 'blank': 'True'}) ++ }, ++ 'telemeta.legalright': { ++ 'Meta': {'ordering': "['value']", 'object_name': 'LegalRight', 'db_table': "'legal_rights'"}, ++ 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), ++ 'value': ('telemeta.models.core.CharField', [], {'unique': 'True', 'max_length': '250'}) ++ }, ++ 'telemeta.location': { ++ 'Meta': {'ordering': "['name']", 'object_name': 'Location', 'db_table': "'locations'"}, ++ 'complete_type': ('telemeta.models.core.ForeignKey', [], {'related_name': "'locations'", 'to': "orm['telemeta.LocationType']"}), ++ 'current_location': ('telemeta.models.core.WeakForeignKey', [], {'default': 'None', 'related_name': "'past_names'", 'null': 'True', 'blank': 'True', 'to': "orm['telemeta.Location']"}), ++ 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), ++ 'is_authoritative': ('telemeta.models.core.BooleanField', [], {'default': 'False'}), ++ 'latitude': ('telemeta.models.core.FloatField', [], {'default': 'None', 'null': 'True', 'blank': 'True'}), ++ 'longitude': ('telemeta.models.core.FloatField', [], {'default': 'None', 'null': 'True', 'blank': 'True'}), ++ 'name': ('telemeta.models.core.CharField', [], {'unique': 'True', 'max_length': '150'}), ++ 'type': ('telemeta.models.core.IntegerField', [], {'default': '0', 'db_index': 'True', 'blank': 'True'}) ++ }, ++ 'telemeta.locationtype': { ++ 'Meta': {'ordering': "['name']", 'object_name': 'LocationType', 'db_table': "'location_types'"}, ++ 'code': ('telemeta.models.core.CharField', [], {'unique': 'True', 'max_length': '64'}), ++ 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), ++ 'name': ('telemeta.models.core.CharField', [], {'max_length': '150'}) ++ }, ++ 'telemeta.mediacollection': { ++ 'Meta': {'ordering': "['code']", 'object_name': 'MediaCollection', 'db_table': "'media_collections'"}, ++ 'a_informer_07_03': ('telemeta.models.core.CharField', [], {'default': "''", 'max_length': '250', 'blank': 'True'}), ++ 'acquisition_mode': ('telemeta.models.core.WeakForeignKey', [], {'default': 'None', 'related_name': "'collections'", 'null': 'True', 'blank': 'True', 'to': "orm['telemeta.AcquisitionMode']"}), ++ 'ad_conversion': ('telemeta.models.core.WeakForeignKey', [], {'default': 'None', 'related_name': "'collections'", 'null': 'True', 'blank': 'True', 'to': "orm['telemeta.AdConversion']"}), ++ 'alt_ids': ('telemeta.models.core.CharField', [], {'default': "''", 'max_length': '250', 'blank': 'True'}), ++ 'alt_title': ('telemeta.models.core.CharField', [], {'default': "''", 'max_length': '250', 'blank': 'True'}), ++ 'approx_duration': ('telemeta.models.core.DurationField', [], {'default': "'0'", 'blank': 'True'}), ++ 'auto_period_access': ('telemeta.models.core.BooleanField', [], {'default': 'True'}), ++ 'booklet_author': ('telemeta.models.core.CharField', [], {'default': "''", 'max_length': '250', 'blank': 'True'}), ++ 'booklet_description': ('telemeta.models.core.TextField', [], {'default': "''", 'blank': 'True'}), ++ 'cnrs_contributor': ('telemeta.models.core.CharField', [], {'default': "''", 'max_length': '250', 'blank': 'True'}), ++ 'code': ('telemeta.models.core.CharField', [], {'unique': 'True', 'max_length': '250'}), ++ 'collector': ('telemeta.models.core.CharField', [], {'default': "''", 'max_length': '250', 'blank': 'True'}), ++ 'collector_is_creator': ('telemeta.models.core.BooleanField', [], {'default': 'False'}), ++ 'comment': ('telemeta.models.core.TextField', [], {'default': "''", 'blank': 'True'}), ++ 'conservation_site': ('telemeta.models.core.CharField', [], {'default': "''", 'max_length': '250', 'blank': 'True'}), ++ 'creator': ('telemeta.models.core.CharField', [], {'default': "''", 'max_length': '250', 'blank': 'True'}), ++ 'doctype_code': ('telemeta.models.core.IntegerField', [], {'default': '0', 'blank': 'True'}), ++ 'external_references': ('telemeta.models.core.TextField', [], {'default': "''", 'blank': 'True'}), ++ 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), ++ 'is_published': ('telemeta.models.core.BooleanField', [], {'default': 'False'}), ++ 'items_done': ('telemeta.models.core.CharField', [], {'default': "''", 'max_length': '250', 'blank': 'True'}), ++ 'legal_rights': ('telemeta.models.core.WeakForeignKey', [], {'default': 'None', 'related_name': "'collections'", 'null': 'True', 'blank': 'True', 'to': "orm['telemeta.LegalRight']"}), ++ 'metadata_author': ('telemeta.models.core.WeakForeignKey', [], {'default': 'None', 'related_name': "'collections'", 'null': 'True', 'blank': 'True', 'to': "orm['telemeta.MetadataAuthor']"}), ++ 'metadata_writer': ('telemeta.models.core.WeakForeignKey', [], {'default': 'None', 'related_name': "'collections'", 'null': 'True', 'blank': 'True', 'to': "orm['telemeta.MetadataWriter']"}), ++ 'old_code': ('telemeta.models.core.CharField', [], {'default': 'None', 'max_length': '250', 'null': 'True', 'blank': 'True'}), ++ 'physical_format': ('telemeta.models.core.WeakForeignKey', [], {'default': 'None', 'related_name': "'collections'", 'null': 'True', 'blank': 'True', 'to': "orm['telemeta.PhysicalFormat']"}), ++ 'physical_items_num': ('telemeta.models.core.IntegerField', [], {'default': '0', 'blank': 'True'}), ++ 'public_access': ('telemeta.models.core.CharField', [], {'default': "'metadata'", 'max_length': '16', 'blank': 'True'}), ++ 'publisher': ('telemeta.models.core.WeakForeignKey', [], {'default': 'None', 'related_name': "'collections'", 'null': 'True', 'blank': 'True', 'to': "orm['telemeta.Publisher']"}), ++ 'publisher_collection': ('telemeta.models.core.WeakForeignKey', [], {'default': 'None', 'related_name': "'collections'", 'null': 'True', 'blank': 'True', 'to': "orm['telemeta.PublisherCollection']"}), ++ 'publisher_serial': ('telemeta.models.core.CharField', [], {'default': "''", 'max_length': '250', 'blank': 'True'}), ++ 'publishing_status': ('telemeta.models.core.WeakForeignKey', [], {'default': 'None', 'related_name': "'collections'", 'null': 'True', 'blank': 'True', 'to': "orm['telemeta.PublishingStatus']"}), ++ 'recorded_from_year': ('telemeta.models.core.IntegerField', [], {'default': '0', 'blank': 'True'}), ++ 'recorded_to_year': ('telemeta.models.core.IntegerField', [], {'default': '0', 'blank': 'True'}), ++ 'recording_context': ('telemeta.models.core.WeakForeignKey', [], {'default': 'None', 'related_name': "'collections'", 'null': 'True', 'blank': 'True', 'to': "orm['telemeta.RecordingContext']"}), ++ 'reference': ('telemeta.models.core.CharField', [], {'default': 'None', 'max_length': '250', 'unique': 'True', 'null': 'True', 'blank': 'True'}), ++ 'state': ('telemeta.models.core.TextField', [], {'default': "''", 'blank': 'True'}), ++ 'title': ('telemeta.models.core.CharField', [], {'max_length': '250'}), ++ 'travail': ('telemeta.models.core.CharField', [], {'default': "''", 'max_length': '250', 'blank': 'True'}), ++ 'year_published': ('telemeta.models.core.IntegerField', [], {'default': '0', 'blank': 'True'}) ++ }, ++ 'telemeta.mediaitem': { ++ 'Meta': {'object_name': 'MediaItem', 'db_table': "'media_items'"}, ++ 'alt_title': ('telemeta.models.core.CharField', [], {'default': "''", 'max_length': '250', 'blank': 'True'}), ++ 'approx_duration': ('telemeta.models.core.DurationField', [], {'default': "'0'", 'blank': 'True'}), ++ 'author': ('telemeta.models.core.CharField', [], {'default': "''", 'max_length': '250', 'blank': 'True'}), ++ 'auto_period_access': ('telemeta.models.core.BooleanField', [], {'default': 'True'}), ++ 'code': ('telemeta.models.core.CharField', [], {'default': "''", 'unique': 'True', 'max_length': '250', 'blank': 'True'}), ++ 'collection': ('telemeta.models.core.ForeignKey', [], {'related_name': "'items'", 'to': "orm['telemeta.MediaCollection']"}), ++ 'collector': ('telemeta.models.core.CharField', [], {'default': "''", 'max_length': '250', 'blank': 'True'}), ++ 'collector_from_collection': ('telemeta.models.core.BooleanField', [], {'default': 'False'}), ++ 'collector_selection': ('telemeta.models.core.CharField', [], {'default': "''", 'max_length': '250', 'blank': 'True'}), ++ 'comment': ('telemeta.models.core.TextField', [], {'default': "''", 'blank': 'True'}), ++ 'context_comment': ('telemeta.models.core.TextField', [], {'default': "''", 'blank': 'True'}), ++ 'contributor': ('telemeta.models.core.CharField', [], {'default': "''", 'max_length': '250', 'blank': 'True'}), ++ 'copied_from_item': ('telemeta.models.core.WeakForeignKey', [], {'default': 'None', 'related_name': "'copies'", 'null': 'True', 'blank': 'True', 'to': "orm['telemeta.MediaItem']"}), ++ 'creator_reference': ('telemeta.models.core.CharField', [], {'default': "''", 'max_length': '250', 'blank': 'True'}), ++ 'cultural_area': ('telemeta.models.core.CharField', [], {'default': "''", 'max_length': '250', 'blank': 'True'}), ++ 'depositor': ('telemeta.models.core.CharField', [], {'default': "''", 'max_length': '250', 'blank': 'True'}), ++ 'digitalist': ('telemeta.models.core.CharField', [], {'default': "''", 'max_length': '250', 'blank': 'True'}), ++ 'digitization_date': ('telemeta.models.core.DateField', [], {'default': 'None', 'null': 'True', 'blank': 'True'}), ++ 'ethnic_group': ('telemeta.models.core.WeakForeignKey', [], {'default': 'None', 'related_name': "'items'", 'null': 'True', 'blank': 'True', 'to': "orm['telemeta.EthnicGroup']"}), ++ 'external_references': ('telemeta.models.core.TextField', [], {'default': "''", 'blank': 'True'}), ++ 'file': ('telemeta.models.core.FileField', [], {'default': "''", 'max_length': '1024', 'db_column': "'filename'", 'blank': 'True'}), ++ 'generic_style': ('telemeta.models.core.WeakForeignKey', [], {'default': 'None', 'related_name': "'items'", 'null': 'True', 'blank': 'True', 'to': "orm['telemeta.GenericStyle']"}), ++ 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), ++ 'language': ('telemeta.models.core.CharField', [], {'default': "''", 'max_length': '250', 'blank': 'True'}), ++ 'language_iso': ('telemeta.models.core.ForeignKey', [], {'related_name': "'items'", 'on_delete': 'models.SET_NULL', 'default': 'None', 'to': "orm['telemeta.Language']", 'blank': 'True', 'null': 'True'}), ++ 'location': ('telemeta.models.core.WeakForeignKey', [], {'default': 'None', 'to': "orm['telemeta.Location']", 'null': 'True', 'blank': 'True'}), ++ 'location_comment': ('telemeta.models.core.CharField', [], {'default': "''", 'max_length': '250', 'blank': 'True'}), ++ 'mimetype': ('telemeta.models.core.CharField', [], {'default': "''", 'max_length': '255', 'blank': 'True'}), ++ 'moda_execut': ('telemeta.models.core.CharField', [], {'default': "''", 'max_length': '250', 'blank': 'True'}), ++ 'old_code': ('telemeta.models.core.CharField', [], {'default': "''", 'max_length': '250', 'blank': 'True'}), ++ 'organization': ('telemeta.models.core.WeakForeignKey', [], {'default': 'None', 'to': "orm['telemeta.Organization']", 'null': 'True', 'blank': 'True'}), ++ 'public_access': ('telemeta.models.core.CharField', [], {'default': "'metadata'", 'max_length': '16', 'blank': 'True'}), ++ 'publishing_date': ('telemeta.models.core.DateField', [], {'default': 'None', 'null': 'True', 'blank': 'True'}), ++ 'recorded_from_date': ('telemeta.models.core.DateField', [], {'default': 'None', 'null': 'True', 'blank': 'True'}), ++ 'recorded_to_date': ('telemeta.models.core.DateField', [], {'default': 'None', 'null': 'True', 'blank': 'True'}), ++ 'recordist': ('telemeta.models.core.CharField', [], {'default': "''", 'max_length': '250', 'blank': 'True'}), ++ 'rights': ('telemeta.models.core.WeakForeignKey', [], {'default': 'None', 'to': "orm['telemeta.Rights']", 'null': 'True', 'blank': 'True'}), ++ 'scientist': ('telemeta.models.core.CharField', [], {'default': "''", 'max_length': '250', 'blank': 'True'}), ++ 'summary': ('telemeta.models.core.TextField', [], {'default': "''", 'blank': 'True'}), ++ 'title': ('telemeta.models.core.CharField', [], {'default': "''", 'max_length': '250', 'blank': 'True'}), ++ 'topic': ('telemeta.models.core.WeakForeignKey', [], {'default': 'None', 'to': "orm['telemeta.Topic']", 'null': 'True', 'blank': 'True'}), ++ 'track': ('telemeta.models.core.CharField', [], {'default': "''", 'max_length': '250', 'blank': 'True'}), ++ 'url': ('django.db.models.fields.URLField', [], {'max_length': '512', 'blank': 'True'}), ++ 'vernacular_style': ('telemeta.models.core.WeakForeignKey', [], {'default': 'None', 'related_name': "'items'", 'null': 'True', 'blank': 'True', 'to': "orm['telemeta.VernacularStyle']"}) ++ }, ++ 'telemeta.metadataauthor': { ++ 'Meta': {'ordering': "['value']", 'object_name': 'MetadataAuthor', 'db_table': "'metadata_authors'"}, ++ 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), ++ 'value': ('telemeta.models.core.CharField', [], {'unique': 'True', 'max_length': '250'}) ++ }, ++ 'telemeta.metadatawriter': { ++ 'Meta': {'ordering': "['value']", 'object_name': 'MetadataWriter', 'db_table': "'metadata_writers'"}, ++ 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), ++ 'value': ('telemeta.models.core.CharField', [], {'unique': 'True', 'max_length': '250'}) ++ }, ++ 'telemeta.organization': { ++ 'Meta': {'ordering': "['value']", 'object_name': 'Organization', 'db_table': "'organization'"}, ++ 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), ++ 'value': ('telemeta.models.core.CharField', [], {'unique': 'True', 'max_length': '250'}) ++ }, ++ 'telemeta.physicalformat': { ++ 'Meta': {'ordering': "['value']", 'object_name': 'PhysicalFormat', 'db_table': "'physical_formats'"}, ++ 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), ++ 'value': ('telemeta.models.core.CharField', [], {'unique': 'True', 'max_length': '250'}) ++ }, ++ 'telemeta.publisher': { ++ 'Meta': {'ordering': "['value']", 'object_name': 'Publisher', 'db_table': "'publishers'"}, ++ 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), ++ 'value': ('telemeta.models.core.CharField', [], {'unique': 'True', 'max_length': '250'}) ++ }, ++ 'telemeta.publishercollection': { ++ 'Meta': {'ordering': "['value']", 'object_name': 'PublisherCollection', 'db_table': "'publisher_collections'"}, ++ 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), ++ 'publisher': ('telemeta.models.core.ForeignKey', [], {'related_name': "'publisher_collections'", 'to': "orm['telemeta.Publisher']"}), ++ 'value': ('telemeta.models.core.CharField', [], {'max_length': '250'}) ++ }, ++ 'telemeta.publishingstatus': { ++ 'Meta': {'ordering': "['value']", 'object_name': 'PublishingStatus', 'db_table': "'publishing_status'"}, ++ 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), ++ 'value': ('telemeta.models.core.CharField', [], {'unique': 'True', 'max_length': '250'}) ++ }, ++ 'telemeta.recordingcontext': { ++ 'Meta': {'ordering': "['value']", 'object_name': 'RecordingContext', 'db_table': "'recording_contexts'"}, ++ 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), ++ 'value': ('telemeta.models.core.CharField', [], {'unique': 'True', 'max_length': '250'}) ++ }, ++ 'telemeta.rights': { ++ 'Meta': {'ordering': "['value']", 'object_name': 'Rights', 'db_table': "'rights'"}, ++ 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), ++ 'value': ('telemeta.models.core.CharField', [], {'unique': 'True', 'max_length': '250'}) ++ }, ++ 'telemeta.topic': { ++ 'Meta': {'ordering': "['value']", 'object_name': 'Topic', 'db_table': "'topic'"}, ++ 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), ++ 'value': ('telemeta.models.core.CharField', [], {'unique': 'True', 'max_length': '250'}) ++ }, ++ 'telemeta.vernacularstyle': { ++ 'Meta': {'ordering': "['value']", 'object_name': 'VernacularStyle', 'db_table': "'vernacular_styles'"}, ++ 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), ++ 'value': ('telemeta.models.core.CharField', [], {'unique': 'True', 'max_length': '250'}) ++ } ++ } ++ ++ complete_apps = ['teleforma'] diff --cc teleforma/models/appointment.py index ab9c8c7f,8cbe59a6..5d26fdb8 --- a/teleforma/models/appointment.py +++ b/teleforma/models/appointment.py @@@ -9,12 -9,12 +9,13 @@@ from django.utils.translation import ug from django.core import urlresolvers from django.utils.functional import cached_property ++ class AppointmentPeriod(Model): - period = models.ForeignKey(Period, related_name='appointment_periods', - verbose_name = u"Période") + periods = models.ManyToManyField(Period, related_name='appointment_periods', - verbose_name = u"Période") ++ verbose_name=u"Période") name = models.CharField(_('name'), max_length=255) - nb_appointments = models.IntegerField("nombre de rendez-vous autorisé sur la période", - default=1) + # nb_appointments = models.IntegerField("nombre de rendez-vous autorisé sur la période", + # default=1) start = models.DateField("date de début d'inscription") end = models.DateField("date de fin d'inscription") @@@ -23,7 -33,7 +34,7 @@@ return self.name def get_appointment(self, user): -- q = Appointment.objects.filter(student=user, slot__day__appointment_period=self) ++ q = Appointment.objects.filter(student=user, slot__appointment_period=self) if q: return q.get() return None @@@ -37,50 -43,83 +44,41 @@@ """ 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'Détails' % 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): @@@ -92,11 -131,11 +90,11 @@@ # 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: @@@ -121,72 -160,32 +119,43 @@@ 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'Détails' % 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',) @@@ -194,48 -193,45 +163,56 @@@ 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 @@@ -247,10 -243,10 +224,17 @@@ 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") @@@ -266,11 -262,11 +250,11 @@@ 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): @@@ -284,12 -280,12 +268,12 @@@ 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): @@@ -298,25 -294,25 +282,26 @@@ @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 diff --cc teleforma/templates/teleforma/appointments.html index 6f266dd0,3c39ab7b..f1c7528d --- a/teleforma/templates/teleforma/appointments.html +++ b/teleforma/templates/teleforma/appointments.html @@@ -195,8 -198,8 +198,8 @@@ Précédent @@@ -204,22 -207,22 +207,38 @@@ {% for day in ap_period.days %} -- {% if day.can_book_today %} --
--

{{ day }}

++ {% if day.available %} ++
++

{{ day.date }}

-- -- -- -- -- -- {% for jury in day.available_jurys %} ++{# #} ++{# #} ++{# #} ++{# #} ++{# #} ++{# {% for jury in day.available_jurys %}#} ++{# #} ++{# {% endfor %}#} ++{# #} ++{# #} ++ ++ {% for groupslot in day.slots %} ++ ++ ++ ++ {% for jury in groupslot.get_visible_jurys %} -- {% endfor %} -- -- -- -- {% for groupslot in day.slots.all %} ++ {% endfor %} ++ ++ {% for slot in groupslot.slots %} {% for jury in slot.jurys %} -- {% if forloop.counter0 < day.number_of_available_jurys %} ++ {% if forloop.counter0 < groupslot.get_nb_of_visible_jurys %} {% endfor %} -- {% if not forloop.last %} -- -- -- -- {% endif %} {% endfor %} diff --cc teleforma/views/appointment.py index aba27107,3dc4319f..31ed4daa --- a/teleforma/views/appointment.py +++ b/teleforma/views/appointment.py @@@ -11,7 -11,7 +11,7 @@@ from django.db import IntegrityErro from django.core.mail import send_mail from django.conf import settings --from teleforma.models.appointment import AppointmentPeriod, Appointment, AppointmentDay, AppointmentSlot ++from teleforma.models.appointment import AppointmentPeriod, Appointment, AppointmentSlot from teleforma.views.core import get_periods @@@ -29,8 -29,8 +29,6 @@@ class Appointments(View) periods = [ p for p in get_periods(user) if int(p.id) == period_id ] if not periods: return HttpResponse('Unauthorized', status=401) - if not periods[0].enable_appointment: - return HttpResponse('Unauthorized', status=401) - # if not periods[0].enable_appointment: - # return HttpResponse('Unauthorized', status=401) return def render(self, request, period_id): @@@ -39,32 -39,32 +37,32 @@@ # Get info ap_periods = [] - for ap_period in AppointmentPeriod.objects.filter(period=period_id).order_by('id'): + for ap_period in AppointmentPeriod.objects.filter(periods__id=period_id).order_by('id'): if ap_period.is_open: ap_periods.append({ -- 'days':ap_period.days.all(), ++ 'days':ap_period.days(), 'name': ap_period.name, -- 'appointment':ap_period.get_appointment(request.user) ++ 'appointment':ap_period.get_appointment(user) }) # for ap_period in ap_periods: # appointments[ap_period.id] = ap_period.get_appointments(request.user) return render(request, self.template_name, {'ap_periods': ap_periods, 'period_id':period_id}) -- def check_validity(self, user, slot_id, slot_nb, jury_id, day_id): ++ def check_validity(self, user, slot_id, slot_nb, jury_id): """ Check if we can register to this exact slot """ -- day = get_object_or_404(AppointmentDay, id = day_id) -- -- # Check the period is open -- if not day.appointment_period.is_open: -- return u"La période d'inscription n'est pas ouverte" -- # Check we are least delay (ie, 48h) before the date -- if not day.can_book_today(): -- delay = day.book_delay ++ slot = get_object_or_404(AppointmentSlot, id = slot_id) ++ ++ # Check the period is open and ++ if not slot.appointment_period.is_open: ++ return u"La période de prise de rendez-vous est fermé." ++ # Check we are least delay (ie, 48h) before the date ++ if not slot.can_book_today: ++ delay = slot.appointment_period.book_delay return u"Vous devez réserver au moins %d jours ouvrés à l'avance" % delay # Check if this jury is open -- jurys = day.available_jurys ++ jurys = slot.get_visible_jurys() if not jury_id in [ j.id for j in jurys ]: return u"Ce jury n'est pas ouvert" # Check if this slot is empty @@@ -76,7 -76,7 +74,7 @@@ if slot_nb >= slot.nb: return u"Ce créneau n'existe pas" # Check we don't have another appointment on this period -- if day.appointment_period.get_appointment(user): ++ if slot.appointment_period.get_appointment(user): return u"Vous avez déjà un rendez-vous" def post(self, request, period_id): @@@ -89,16 -89,16 +87,14 @@@ 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() @@@ -126,10 -126,10 +122,10 @@@ 'jury_address': ap.jury.address, 'date': ap.real_date, 'student': ap.student, -- 'main_text': ap.period.appointment_mail_text } ++ 'main_text': ap.appointment_period.appointment_mail_text } # DEBUG - #data['mto'] = "gael@pilotsystems.net" - #data['mto'] = "dorothee.lavalle@pre-barreau.com" - # data['mto'] = "gael@pilotsystems.net" ++ data['mto'] = "yoanl@pilotsystems.net" + # data['mto'] = "dorothee.lavalle@pre-barreau.com" subject_template = 'teleforma/messages/email_appointment_sujet.txt' message_template = 'teleforma/messages/email_appointment.txt' @@@ -151,7 -151,7 +147,7 @@@ def cancel_appointment(request) return HttpResponse('Unauthorized', status=401) if not app.can_cancel(): -- messages.add_message(request, messages.ERROR, ' Il est trop tard pour annuler ce rendez-vous.') ++ messages.add_message(request, messages.ERROR, 'Il est trop tard pour annuler ce rendez-vous.') return redirect('teleforma-appointments', period_id=period_id) app.delete()
-- Heure d'arrivé -- -- Heure de début -- -- Heure de fin --
#} ++{# Heure d'arrivé#} ++{# #} ++{# Heure de début#} ++{# #} ++{# Heure de fin#} ++{# #} ++{# Jury {{ forloop.counter }}#} ++{#
#} ++{# #} ++{# #} ++{#
#} ++{#
Heure d'arrivé Jury {{ forloop.counter }}
@@@ -227,11 -230,11 +246,9 @@@
@@@ -245,7 -248,7 +262,7 @@@ {% if jury.available %}
@@@ -266,11 -269,11 +283,6 @@@ {% endfor %}
--