From 7907decd8529b7a076f92c7857467511c6fa4d80 Mon Sep 17 00:00:00 2001 From: Benjamin Dauvergne Date: Wed, 23 Jan 2013 10:45:03 +0100 Subject: [PATCH] do not push documents multiple times, log the failures in the model insted and add a retry action in the admin --- polynum_blackboard/admin.py | 20 ++ .../management/commands/send-to-mycourse.py | 21 +- polynum_blackboard/migrations/0001_initial.py | 207 ++++++++++++++++++ ..._auto__add_field_blackboardpush_failure.py | 203 +++++++++++++++++ ...to__add_field_blackboardpush_created_on.py | 204 +++++++++++++++++ polynum_blackboard/migrations/__init__.py | 0 polynum_blackboard/models.py | 14 ++ 7 files changed, 661 insertions(+), 8 deletions(-) create mode 100644 polynum_blackboard/admin.py create mode 100644 polynum_blackboard/migrations/0001_initial.py create mode 100644 polynum_blackboard/migrations/0002_auto__add_field_blackboardpush_failure.py create mode 100644 polynum_blackboard/migrations/0003_auto__add_field_blackboardpush_created_on.py create mode 100644 polynum_blackboard/migrations/__init__.py diff --git a/polynum_blackboard/admin.py b/polynum_blackboard/admin.py new file mode 100644 index 0000000..95d2363 --- /dev/null +++ b/polynum_blackboard/admin.py @@ -0,0 +1,20 @@ +from django.contrib import admin +from polynum.base.admin import site +from django.utils.translation import ugettext_lazy as _ + +import models + +class BlackBoardPushAdmin(admin.ModelAdmin): + actions = [ 'relaunch' ] + readonly_fields = [ 'request', 'course_name', 'visible_to_students', + 'sent', 'failure' ] + list_display = [ 'created_on', 'request_id', 'course_name', 'visible_to_students', 'sent', 'failure' ] + + def request_id(self, instance): + return instance.request.id + + def relaunch(self, request, queryset): + queryset.update(sent=False, failure='') + relaunch.short_description = _("Relaunch selected pushes") + +site.register(models.BlackBoardPush, BlackBoardPushAdmin) diff --git a/polynum_blackboard/management/commands/send-to-mycourse.py b/polynum_blackboard/management/commands/send-to-mycourse.py index 1992d8e..76e74a5 100644 --- a/polynum_blackboard/management/commands/send-to-mycourse.py +++ b/polynum_blackboard/management/commands/send-to-mycourse.py @@ -26,8 +26,8 @@ class Command(BaseCommand): @transaction.commit_on_success def handle(self, *args, **options): - logger = logging.getLogger() - bb_pushs = models.BlackBoardPush.objects.filter(request__history__new_status__start=True, sent=False) + logger = logging.getLogger(__name__) + bb_pushs = models.BlackBoardPush.objects.filter(sent=False) if options['delete']: qs = models.BlackBoardPush.objects.filter(id__in=options['delete'].split(',')) for push in qs: @@ -48,10 +48,15 @@ class Command(BaseCommand): logger.info('into course %s', push.course_name.encode('utf-8')) if push.visible_to_students: logger.info('visible to students') - ok, result = conn.send_file(push.request.uploadfile, [push.course_name], push.visible_to_students) - if ok: + try: + ok, result = conn.send_file(push.request.uploadfile, [push.course_name], push.visible_to_students) push.sent = True - push.save() - logger.info('sending succeeded') - else: - logger.error('sending failed: %s', result.encode('utf-8')) + if ok: + logger.info('sending succeeded') + push.failure = result + logger.error('sending failed: %s', result.encode('utf-8')) + except Exception, e: + logger.exception('sending failed') + push.failure = unicode(e) + push.sent = True + push.save() diff --git a/polynum_blackboard/migrations/0001_initial.py b/polynum_blackboard/migrations/0001_initial.py new file mode 100644 index 0000000..c02c796 --- /dev/null +++ b/polynum_blackboard/migrations/0001_initial.py @@ -0,0 +1,207 @@ +# -*- coding: utf-8 -*- +import datetime +from south.db import db +from south.v2 import SchemaMigration +from django.db import models + + +class Migration(SchemaMigration): + + def forwards(self, orm): + # Adding model 'BlackBoardPush' + db.create_table('polynum_blackboard_blackboardpush', ( + ('id', self.gf('django.db.models.fields.AutoField')(primary_key=True)), + ('request', self.gf('django.db.models.fields.related.ForeignKey')(to=orm['base.Request'])), + ('course_name', self.gf('django.db.models.fields.TextField')(max_length=64)), + ('visible_to_students', self.gf('django.db.models.fields.BooleanField')(default=False)), + ('sent', self.gf('django.db.models.fields.BooleanField')(default=False)), + )) + db.send_create_signal('polynum_blackboard', ['BlackBoardPush']) + + + def backwards(self, orm): + # Deleting model 'BlackBoardPush' + db.delete_table('polynum_blackboard_blackboardpush') + + + 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'}) + }, + 'base.deliveryplace': { + 'Meta': {'ordering': "('order', 'name')", 'object_name': 'DeliveryPlace'}, + 'comments': ('django.db.models.fields.TextField', [], {'blank': 'True'}), + 'description': ('django.db.models.fields.TextField', [], {'blank': 'True'}), + 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), + 'name': ('django.db.models.fields.CharField', [], {'max_length': '64'}), + 'order': ('django.db.models.fields.IntegerField', [], {'default': '0'}), + 'url': ('django.db.models.fields.URLField', [], {'max_length': '200', 'blank': 'True'}) + }, + 'base.documentlicence': { + 'Meta': {'ordering': "('order', 'name')", 'object_name': 'DocumentLicence'}, + 'comments': ('django.db.models.fields.TextField', [], {'blank': 'True'}), + 'default': ('django.db.models.fields.BooleanField', [], {'default': 'False'}), + 'description': ('django.db.models.fields.TextField', [], {'blank': 'True'}), + 'diffusion_tags': ('polynum.base.fields.MultiSelectField', [], {'blank': 'True'}), + 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), + 'name': ('django.db.models.fields.CharField', [], {'max_length': '64'}), + 'only_free_documents': ('django.db.models.fields.BooleanField', [], {'default': 'False'}), + 'order': ('django.db.models.fields.IntegerField', [], {'default': '0'}), + 'url': ('django.db.models.fields.URLField', [], {'max_length': '200', 'blank': 'True'}) + }, + 'base.documentusage': { + 'Meta': {'ordering': "('order', 'name')", 'object_name': 'DocumentUsage'}, + 'comments': ('django.db.models.fields.TextField', [], {'blank': 'True'}), + 'description': ('django.db.models.fields.TextField', [], {'blank': 'True'}), + 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), + 'name': ('django.db.models.fields.CharField', [], {'max_length': '64'}), + 'no_diffusion': ('django.db.models.fields.BooleanField', [], {'default': 'False'}), + 'order': ('django.db.models.fields.IntegerField', [], {'default': '0'}), + 'url': ('django.db.models.fields.URLField', [], {'max_length': '200', 'blank': 'True'}) + }, + 'base.entity': { + 'Meta': {'ordering': "('left_bound',)", 'object_name': 'Entity'}, + 'code': ('django.db.models.fields.CharField', [], {'max_length': '64', 'db_index': 'True'}), + 'depth': ('django.db.models.fields.PositiveIntegerField', [], {'default': '0', 'db_index': 'True'}), + 'description': ('django.db.models.fields.TextField', [], {'db_index': 'True', 'blank': 'True'}), + 'description_override': ('django.db.models.fields.TextField', [], {'db_index': 'True', 'blank': 'True'}), + 'entity_type': ('django.db.models.fields.related.ForeignKey', [], {'blank': 'True', 'related_name': "'+'", 'null': 'True', 'on_delete': 'models.PROTECT', 'to': "orm['base.EntityType']"}), + 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), + 'is_active': ('django.db.models.fields.BooleanField', [], {'default': 'True', 'db_index': 'True'}), + 'left_bound': ('django.db.models.fields.PositiveIntegerField', [], {'unique': 'True', 'db_index': 'True'}), + 'name': ('django.db.models.fields.CharField', [], {'db_index': 'True', 'max_length': '128', 'blank': 'True'}), + 'name_override': ('django.db.models.fields.CharField', [], {'db_index': 'True', 'max_length': '128', 'blank': 'True'}), + 'parent': ('django.db.models.fields.related.ForeignKey', [], {'blank': 'True', 'related_name': "'children_set'", 'null': 'True', 'on_delete': 'models.PROTECT', 'to': "orm['base.Entity']"}), + 'right_bound': ('django.db.models.fields.PositiveIntegerField', [], {'unique': 'True', 'db_index': 'True'}) + }, + 'base.entitytype': { + 'Meta': {'object_name': 'EntityType'}, + 'description': ('django.db.models.fields.TextField', [], {'blank': 'True'}), + 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), + 'name': ('django.db.models.fields.CharField', [], {'max_length': '128'}) + }, + 'base.profile': { + 'Meta': {'ordering': "('order', 'name')", 'object_name': 'Profile'}, + 'choices': ('django.db.models.fields.related.ManyToManyField', [], {'to': "orm['base.ProfileOptionChoice']", 'symmetrical': 'False', 'blank': 'True'}), + 'description': ('django.db.models.fields.TextField', [], {'blank': 'True'}), + 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), + 'name': ('django.db.models.fields.CharField', [], {'max_length': '128'}), + 'order': ('django.db.models.fields.IntegerField', [], {'default': '0'}), + 'ppd': ('django.db.models.fields.DecimalField', [], {'default': "'0.00'", 'max_digits': '7', 'decimal_places': '3'}), + 'ppp': ('django.db.models.fields.DecimalField', [], {'default': "'0.00'", 'max_digits': '7', 'decimal_places': '3'}), + 'visible': ('django.db.models.fields.BooleanField', [], {'default': 'True'}) + }, + 'base.profileoption': { + 'Meta': {'ordering': "('order', 'name')", 'object_name': 'ProfileOption'}, + 'description': ('django.db.models.fields.TextField', [], {'blank': 'True'}), + 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), + 'list_type': ('django.db.models.fields.CharField', [], {'max_length': '2'}), + 'name': ('django.db.models.fields.CharField', [], {'max_length': '128'}), + 'order': ('django.db.models.fields.IntegerField', [], {'default': '0'}), + 'visible': ('django.db.models.fields.BooleanField', [], {'default': 'True'}) + }, + 'base.profileoptionchoice': { + 'Meta': {'ordering': "('order', 'name')", 'object_name': 'ProfileOptionChoice'}, + 'description': ('django.db.models.fields.TextField', [], {'blank': 'True'}), + 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), + 'name': ('django.db.models.fields.CharField', [], {'max_length': '128'}), + 'option': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['base.ProfileOption']"}), + 'order': ('django.db.models.fields.IntegerField', [], {'default': '0'}), + 'ppd': ('django.db.models.fields.DecimalField', [], {'default': "'0.00'", 'max_digits': '7', 'decimal_places': '3'}), + 'ppp': ('django.db.models.fields.DecimalField', [], {'default': "'0.00'", 'max_digits': '7', 'decimal_places': '3'}), + 'visible': ('django.db.models.fields.BooleanField', [], {'default': 'True'}) + }, + 'base.request': { + 'Meta': {'ordering': "('-creation_date', '-month_order')", 'object_name': 'Request'}, + 'base_profile': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['base.Profile']", 'null': 'True', 'on_delete': 'models.PROTECT', 'blank': 'True'}), + 'choices': ('django.db.models.fields.related.ManyToManyField', [], {'to': "orm['base.ProfileOptionChoice']", 'symmetrical': 'False', 'blank': 'True'}), + 'comments': ('django.db.models.fields.TextField', [], {'blank': 'True'}), + 'contact_bureau': ('django.db.models.fields.CharField', [], {'max_length': '64', 'blank': 'True'}), + 'contact_email': ('django.db.models.fields.EmailField', [], {'max_length': '75', 'blank': 'True'}), + 'contact_telephone1': ('django.db.models.fields.CharField', [], {'max_length': '32', 'blank': 'True'}), + 'contact_telephone2': ('django.db.models.fields.CharField', [], {'max_length': '32', 'blank': 'True'}), + 'copies': ('django.db.models.fields.PositiveIntegerField', [], {'default': '1', 'blank': 'True'}), + 'copyright': ('django.db.models.fields.NullBooleanField', [], {'null': 'True', 'blank': 'True'}), + 'cost': ('django.db.models.fields.DecimalField', [], {'null': 'True', 'max_digits': '7', 'decimal_places': '2', 'blank': 'True'}), + 'creation_date': ('django.db.models.fields.DateTimeField', [], {'default': 'datetime.datetime.now', 'db_index': 'True'}), + 'delivery_date': ('django.db.models.fields.DateField', [], {'default': 'datetime.datetime(2013, 1, 25, 0, 0)', 'null': 'True', 'blank': 'True'}), + 'delivery_place': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['base.DeliveryPlace']", 'null': 'True', 'on_delete': 'models.PROTECT', 'blank': 'True'}), + 'details': ('django.db.models.fields.TextField', [], {'blank': 'True'}), + 'entity': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['base.Entity']", 'null': 'True', 'on_delete': 'models.PROTECT', 'blank': 'True'}), + 'financial_code': ('django.db.models.fields.CharField', [], {'db_index': 'True', 'max_length': '64', 'blank': 'True'}), + 'financial_comment': ('django.db.models.fields.TextField', [], {'blank': 'True'}), + 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), + 'is_from_remote_request': ('django.db.models.fields.BooleanField', [], {'default': 'False'}), + 'licence': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['base.DocumentLicence']", 'null': 'True', 'on_delete': 'models.PROTECT', 'blank': 'True'}), + 'modification_date': ('django.db.models.fields.DateTimeField', [], {'db_index': 'True'}), + 'month_order': ('django.db.models.fields.IntegerField', [], {'default': '-1'}), + 'name': ('django.db.models.fields.CharField', [], {'max_length': '128', 'blank': 'True'}), + 'nb_pages': ('django.db.models.fields.PositiveIntegerField', [], {'default': '0', 'blank': 'True'}), + 'sponsor': ('django.db.models.fields.CharField', [], {'max_length': '128', 'blank': 'True'}), + 'status': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['base.Status']", 'on_delete': 'models.PROTECT'}), + 'uploadfile': ('django.db.models.fields.files.FileField', [], {'max_length': '100', 'blank': 'True'}), + 'usage': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['base.DocumentUsage']", 'null': 'True', 'on_delete': 'models.PROTECT', 'blank': 'True'}), + 'user': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['auth.User']"}) + }, + 'base.role': { + 'Meta': {'object_name': 'Role'}, + 'id': ('django.db.models.fields.CharField', [], {'max_length': '40', 'primary_key': 'True'}), + 'name': ('django.db.models.fields.CharField', [], {'max_length': '128'}) + }, + 'base.status': { + 'Meta': {'ordering': "('order', 'name')", 'object_name': 'Status'}, + 'code': ('django.db.models.fields.CharField', [], {'unique': 'True', 'max_length': '40'}), + 'default': ('django.db.models.fields.BooleanField', [], {'default': 'False'}), + 'description': ('django.db.models.fields.TextField', [], {'blank': 'True'}), + 'end': ('django.db.models.fields.BooleanField', [], {'default': 'False'}), + 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), + 'name': ('django.db.models.fields.CharField', [], {'max_length': '128'}), + 'order': ('django.db.models.fields.IntegerField', [], {'default': '0', 'blank': 'True'}), + 'start': ('django.db.models.fields.BooleanField', [], {'default': 'False'}), + 'visible': ('django.db.models.fields.BooleanField', [], {'default': 'True'}), + 'visible_by': ('django.db.models.fields.related.ManyToManyField', [], {'to': "orm['base.Role']", 'symmetrical': 'False', 'blank': 'True'}) + }, + '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'}) + }, + 'polynum_blackboard.blackboardpush': { + 'Meta': {'object_name': 'BlackBoardPush'}, + 'course_name': ('django.db.models.fields.TextField', [], {'max_length': '64'}), + 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), + 'request': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['base.Request']"}), + 'sent': ('django.db.models.fields.BooleanField', [], {'default': 'False'}), + 'visible_to_students': ('django.db.models.fields.BooleanField', [], {'default': 'False'}) + } + } + + complete_apps = ['polynum_blackboard'] \ No newline at end of file diff --git a/polynum_blackboard/migrations/0002_auto__add_field_blackboardpush_failure.py b/polynum_blackboard/migrations/0002_auto__add_field_blackboardpush_failure.py new file mode 100644 index 0000000..5ff665f --- /dev/null +++ b/polynum_blackboard/migrations/0002_auto__add_field_blackboardpush_failure.py @@ -0,0 +1,203 @@ +# -*- coding: utf-8 -*- +import 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 'BlackBoardPush.failure' + db.add_column('polynum_blackboard_blackboardpush', 'failure', + self.gf('django.db.models.fields.TextField')(default=''), + keep_default=False) + + + def backwards(self, orm): + # Deleting field 'BlackBoardPush.failure' + db.delete_column('polynum_blackboard_blackboardpush', 'failure') + + + 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'}) + }, + 'base.deliveryplace': { + 'Meta': {'ordering': "('order', 'name')", 'object_name': 'DeliveryPlace'}, + 'comments': ('django.db.models.fields.TextField', [], {'blank': 'True'}), + 'description': ('django.db.models.fields.TextField', [], {'blank': 'True'}), + 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), + 'name': ('django.db.models.fields.CharField', [], {'max_length': '64'}), + 'order': ('django.db.models.fields.IntegerField', [], {'default': '0'}), + 'url': ('django.db.models.fields.URLField', [], {'max_length': '200', 'blank': 'True'}) + }, + 'base.documentlicence': { + 'Meta': {'ordering': "('order', 'name')", 'object_name': 'DocumentLicence'}, + 'comments': ('django.db.models.fields.TextField', [], {'blank': 'True'}), + 'default': ('django.db.models.fields.BooleanField', [], {'default': 'False'}), + 'description': ('django.db.models.fields.TextField', [], {'blank': 'True'}), + 'diffusion_tags': ('polynum.base.fields.MultiSelectField', [], {'blank': 'True'}), + 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), + 'name': ('django.db.models.fields.CharField', [], {'max_length': '64'}), + 'only_free_documents': ('django.db.models.fields.BooleanField', [], {'default': 'False'}), + 'order': ('django.db.models.fields.IntegerField', [], {'default': '0'}), + 'url': ('django.db.models.fields.URLField', [], {'max_length': '200', 'blank': 'True'}) + }, + 'base.documentusage': { + 'Meta': {'ordering': "('order', 'name')", 'object_name': 'DocumentUsage'}, + 'comments': ('django.db.models.fields.TextField', [], {'blank': 'True'}), + 'description': ('django.db.models.fields.TextField', [], {'blank': 'True'}), + 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), + 'name': ('django.db.models.fields.CharField', [], {'max_length': '64'}), + 'no_diffusion': ('django.db.models.fields.BooleanField', [], {'default': 'False'}), + 'order': ('django.db.models.fields.IntegerField', [], {'default': '0'}), + 'url': ('django.db.models.fields.URLField', [], {'max_length': '200', 'blank': 'True'}) + }, + 'base.entity': { + 'Meta': {'ordering': "('left_bound',)", 'object_name': 'Entity'}, + 'code': ('django.db.models.fields.CharField', [], {'max_length': '64', 'db_index': 'True'}), + 'depth': ('django.db.models.fields.PositiveIntegerField', [], {'default': '0', 'db_index': 'True'}), + 'description': ('django.db.models.fields.TextField', [], {'db_index': 'True', 'blank': 'True'}), + 'description_override': ('django.db.models.fields.TextField', [], {'db_index': 'True', 'blank': 'True'}), + 'entity_type': ('django.db.models.fields.related.ForeignKey', [], {'blank': 'True', 'related_name': "'+'", 'null': 'True', 'on_delete': 'models.PROTECT', 'to': "orm['base.EntityType']"}), + 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), + 'is_active': ('django.db.models.fields.BooleanField', [], {'default': 'True', 'db_index': 'True'}), + 'left_bound': ('django.db.models.fields.PositiveIntegerField', [], {'unique': 'True', 'db_index': 'True'}), + 'name': ('django.db.models.fields.CharField', [], {'db_index': 'True', 'max_length': '128', 'blank': 'True'}), + 'name_override': ('django.db.models.fields.CharField', [], {'db_index': 'True', 'max_length': '128', 'blank': 'True'}), + 'parent': ('django.db.models.fields.related.ForeignKey', [], {'blank': 'True', 'related_name': "'children_set'", 'null': 'True', 'on_delete': 'models.PROTECT', 'to': "orm['base.Entity']"}), + 'right_bound': ('django.db.models.fields.PositiveIntegerField', [], {'unique': 'True', 'db_index': 'True'}) + }, + 'base.entitytype': { + 'Meta': {'object_name': 'EntityType'}, + 'description': ('django.db.models.fields.TextField', [], {'blank': 'True'}), + 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), + 'name': ('django.db.models.fields.CharField', [], {'max_length': '128'}) + }, + 'base.profile': { + 'Meta': {'ordering': "('order', 'name')", 'object_name': 'Profile'}, + 'choices': ('django.db.models.fields.related.ManyToManyField', [], {'to': "orm['base.ProfileOptionChoice']", 'symmetrical': 'False', 'blank': 'True'}), + 'description': ('django.db.models.fields.TextField', [], {'blank': 'True'}), + 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), + 'name': ('django.db.models.fields.CharField', [], {'max_length': '128'}), + 'order': ('django.db.models.fields.IntegerField', [], {'default': '0'}), + 'ppd': ('django.db.models.fields.DecimalField', [], {'default': "'0.00'", 'max_digits': '7', 'decimal_places': '3'}), + 'ppp': ('django.db.models.fields.DecimalField', [], {'default': "'0.00'", 'max_digits': '7', 'decimal_places': '3'}), + 'visible': ('django.db.models.fields.BooleanField', [], {'default': 'True'}) + }, + 'base.profileoption': { + 'Meta': {'ordering': "('order', 'name')", 'object_name': 'ProfileOption'}, + 'description': ('django.db.models.fields.TextField', [], {'blank': 'True'}), + 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), + 'list_type': ('django.db.models.fields.CharField', [], {'max_length': '2'}), + 'name': ('django.db.models.fields.CharField', [], {'max_length': '128'}), + 'order': ('django.db.models.fields.IntegerField', [], {'default': '0'}), + 'visible': ('django.db.models.fields.BooleanField', [], {'default': 'True'}) + }, + 'base.profileoptionchoice': { + 'Meta': {'ordering': "('order', 'name')", 'object_name': 'ProfileOptionChoice'}, + 'description': ('django.db.models.fields.TextField', [], {'blank': 'True'}), + 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), + 'name': ('django.db.models.fields.CharField', [], {'max_length': '128'}), + 'option': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['base.ProfileOption']"}), + 'order': ('django.db.models.fields.IntegerField', [], {'default': '0'}), + 'ppd': ('django.db.models.fields.DecimalField', [], {'default': "'0.00'", 'max_digits': '7', 'decimal_places': '3'}), + 'ppp': ('django.db.models.fields.DecimalField', [], {'default': "'0.00'", 'max_digits': '7', 'decimal_places': '3'}), + 'visible': ('django.db.models.fields.BooleanField', [], {'default': 'True'}) + }, + 'base.request': { + 'Meta': {'ordering': "('-creation_date', '-month_order')", 'object_name': 'Request'}, + 'base_profile': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['base.Profile']", 'null': 'True', 'on_delete': 'models.PROTECT', 'blank': 'True'}), + 'choices': ('django.db.models.fields.related.ManyToManyField', [], {'to': "orm['base.ProfileOptionChoice']", 'symmetrical': 'False', 'blank': 'True'}), + 'comments': ('django.db.models.fields.TextField', [], {'blank': 'True'}), + 'contact_bureau': ('django.db.models.fields.CharField', [], {'max_length': '64', 'blank': 'True'}), + 'contact_email': ('django.db.models.fields.EmailField', [], {'max_length': '75', 'blank': 'True'}), + 'contact_telephone1': ('django.db.models.fields.CharField', [], {'max_length': '32', 'blank': 'True'}), + 'contact_telephone2': ('django.db.models.fields.CharField', [], {'max_length': '32', 'blank': 'True'}), + 'copies': ('django.db.models.fields.PositiveIntegerField', [], {'default': '1', 'blank': 'True'}), + 'copyright': ('django.db.models.fields.NullBooleanField', [], {'null': 'True', 'blank': 'True'}), + 'cost': ('django.db.models.fields.DecimalField', [], {'null': 'True', 'max_digits': '7', 'decimal_places': '2', 'blank': 'True'}), + 'creation_date': ('django.db.models.fields.DateTimeField', [], {'default': 'datetime.datetime.now', 'db_index': 'True'}), + 'delivery_date': ('django.db.models.fields.DateField', [], {'default': 'datetime.datetime(2013, 1, 25, 0, 0)', 'null': 'True', 'blank': 'True'}), + 'delivery_place': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['base.DeliveryPlace']", 'null': 'True', 'on_delete': 'models.PROTECT', 'blank': 'True'}), + 'details': ('django.db.models.fields.TextField', [], {'blank': 'True'}), + 'entity': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['base.Entity']", 'null': 'True', 'on_delete': 'models.PROTECT', 'blank': 'True'}), + 'financial_code': ('django.db.models.fields.CharField', [], {'db_index': 'True', 'max_length': '64', 'blank': 'True'}), + 'financial_comment': ('django.db.models.fields.TextField', [], {'blank': 'True'}), + 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), + 'is_from_remote_request': ('django.db.models.fields.BooleanField', [], {'default': 'False'}), + 'licence': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['base.DocumentLicence']", 'null': 'True', 'on_delete': 'models.PROTECT', 'blank': 'True'}), + 'modification_date': ('django.db.models.fields.DateTimeField', [], {'db_index': 'True'}), + 'month_order': ('django.db.models.fields.IntegerField', [], {'default': '-1'}), + 'name': ('django.db.models.fields.CharField', [], {'max_length': '128', 'blank': 'True'}), + 'nb_pages': ('django.db.models.fields.PositiveIntegerField', [], {'default': '0', 'blank': 'True'}), + 'sponsor': ('django.db.models.fields.CharField', [], {'max_length': '128', 'blank': 'True'}), + 'status': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['base.Status']", 'on_delete': 'models.PROTECT'}), + 'uploadfile': ('django.db.models.fields.files.FileField', [], {'max_length': '100', 'blank': 'True'}), + 'usage': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['base.DocumentUsage']", 'null': 'True', 'on_delete': 'models.PROTECT', 'blank': 'True'}), + 'user': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['auth.User']"}) + }, + 'base.role': { + 'Meta': {'object_name': 'Role'}, + 'id': ('django.db.models.fields.CharField', [], {'max_length': '40', 'primary_key': 'True'}), + 'name': ('django.db.models.fields.CharField', [], {'max_length': '128'}) + }, + 'base.status': { + 'Meta': {'ordering': "('order', 'name')", 'object_name': 'Status'}, + 'code': ('django.db.models.fields.CharField', [], {'unique': 'True', 'max_length': '40'}), + 'default': ('django.db.models.fields.BooleanField', [], {'default': 'False'}), + 'description': ('django.db.models.fields.TextField', [], {'blank': 'True'}), + 'end': ('django.db.models.fields.BooleanField', [], {'default': 'False'}), + 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), + 'name': ('django.db.models.fields.CharField', [], {'max_length': '128'}), + 'order': ('django.db.models.fields.IntegerField', [], {'default': '0', 'blank': 'True'}), + 'start': ('django.db.models.fields.BooleanField', [], {'default': 'False'}), + 'visible': ('django.db.models.fields.BooleanField', [], {'default': 'True'}), + 'visible_by': ('django.db.models.fields.related.ManyToManyField', [], {'to': "orm['base.Role']", 'symmetrical': 'False', 'blank': 'True'}) + }, + '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'}) + }, + 'polynum_blackboard.blackboardpush': { + 'Meta': {'object_name': 'BlackBoardPush'}, + 'course_name': ('django.db.models.fields.TextField', [], {'max_length': '64'}), + 'failure': ('django.db.models.fields.TextField', [], {'default': "''"}), + 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), + 'request': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['base.Request']"}), + 'sent': ('django.db.models.fields.BooleanField', [], {'default': 'False'}), + 'visible_to_students': ('django.db.models.fields.BooleanField', [], {'default': 'False'}) + } + } + + complete_apps = ['polynum_blackboard'] \ No newline at end of file diff --git a/polynum_blackboard/migrations/0003_auto__add_field_blackboardpush_created_on.py b/polynum_blackboard/migrations/0003_auto__add_field_blackboardpush_created_on.py new file mode 100644 index 0000000..3fdcc92 --- /dev/null +++ b/polynum_blackboard/migrations/0003_auto__add_field_blackboardpush_created_on.py @@ -0,0 +1,204 @@ +# -*- coding: utf-8 -*- +import 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 'BlackBoardPush.created_on' + db.add_column('polynum_blackboard_blackboardpush', 'created_on', + self.gf('django.db.models.fields.DateTimeField')(auto_now_add=True, default=datetime.datetime(2013, 1, 23, 0, 0), blank=True), + keep_default=False) + + + def backwards(self, orm): + # Deleting field 'BlackBoardPush.created_on' + db.delete_column('polynum_blackboard_blackboardpush', 'created_on') + + + 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'}) + }, + 'base.deliveryplace': { + 'Meta': {'ordering': "('order', 'name')", 'object_name': 'DeliveryPlace'}, + 'comments': ('django.db.models.fields.TextField', [], {'blank': 'True'}), + 'description': ('django.db.models.fields.TextField', [], {'blank': 'True'}), + 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), + 'name': ('django.db.models.fields.CharField', [], {'max_length': '64'}), + 'order': ('django.db.models.fields.IntegerField', [], {'default': '0'}), + 'url': ('django.db.models.fields.URLField', [], {'max_length': '200', 'blank': 'True'}) + }, + 'base.documentlicence': { + 'Meta': {'ordering': "('order', 'name')", 'object_name': 'DocumentLicence'}, + 'comments': ('django.db.models.fields.TextField', [], {'blank': 'True'}), + 'default': ('django.db.models.fields.BooleanField', [], {'default': 'False'}), + 'description': ('django.db.models.fields.TextField', [], {'blank': 'True'}), + 'diffusion_tags': ('polynum.base.fields.MultiSelectField', [], {'blank': 'True'}), + 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), + 'name': ('django.db.models.fields.CharField', [], {'max_length': '64'}), + 'only_free_documents': ('django.db.models.fields.BooleanField', [], {'default': 'False'}), + 'order': ('django.db.models.fields.IntegerField', [], {'default': '0'}), + 'url': ('django.db.models.fields.URLField', [], {'max_length': '200', 'blank': 'True'}) + }, + 'base.documentusage': { + 'Meta': {'ordering': "('order', 'name')", 'object_name': 'DocumentUsage'}, + 'comments': ('django.db.models.fields.TextField', [], {'blank': 'True'}), + 'description': ('django.db.models.fields.TextField', [], {'blank': 'True'}), + 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), + 'name': ('django.db.models.fields.CharField', [], {'max_length': '64'}), + 'no_diffusion': ('django.db.models.fields.BooleanField', [], {'default': 'False'}), + 'order': ('django.db.models.fields.IntegerField', [], {'default': '0'}), + 'url': ('django.db.models.fields.URLField', [], {'max_length': '200', 'blank': 'True'}) + }, + 'base.entity': { + 'Meta': {'ordering': "('left_bound',)", 'object_name': 'Entity'}, + 'code': ('django.db.models.fields.CharField', [], {'max_length': '64', 'db_index': 'True'}), + 'depth': ('django.db.models.fields.PositiveIntegerField', [], {'default': '0', 'db_index': 'True'}), + 'description': ('django.db.models.fields.TextField', [], {'db_index': 'True', 'blank': 'True'}), + 'description_override': ('django.db.models.fields.TextField', [], {'db_index': 'True', 'blank': 'True'}), + 'entity_type': ('django.db.models.fields.related.ForeignKey', [], {'blank': 'True', 'related_name': "'+'", 'null': 'True', 'on_delete': 'models.PROTECT', 'to': "orm['base.EntityType']"}), + 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), + 'is_active': ('django.db.models.fields.BooleanField', [], {'default': 'True', 'db_index': 'True'}), + 'left_bound': ('django.db.models.fields.PositiveIntegerField', [], {'unique': 'True', 'db_index': 'True'}), + 'name': ('django.db.models.fields.CharField', [], {'db_index': 'True', 'max_length': '128', 'blank': 'True'}), + 'name_override': ('django.db.models.fields.CharField', [], {'db_index': 'True', 'max_length': '128', 'blank': 'True'}), + 'parent': ('django.db.models.fields.related.ForeignKey', [], {'blank': 'True', 'related_name': "'children_set'", 'null': 'True', 'on_delete': 'models.PROTECT', 'to': "orm['base.Entity']"}), + 'right_bound': ('django.db.models.fields.PositiveIntegerField', [], {'unique': 'True', 'db_index': 'True'}) + }, + 'base.entitytype': { + 'Meta': {'object_name': 'EntityType'}, + 'description': ('django.db.models.fields.TextField', [], {'blank': 'True'}), + 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), + 'name': ('django.db.models.fields.CharField', [], {'max_length': '128'}) + }, + 'base.profile': { + 'Meta': {'ordering': "('order', 'name')", 'object_name': 'Profile'}, + 'choices': ('django.db.models.fields.related.ManyToManyField', [], {'to': "orm['base.ProfileOptionChoice']", 'symmetrical': 'False', 'blank': 'True'}), + 'description': ('django.db.models.fields.TextField', [], {'blank': 'True'}), + 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), + 'name': ('django.db.models.fields.CharField', [], {'max_length': '128'}), + 'order': ('django.db.models.fields.IntegerField', [], {'default': '0'}), + 'ppd': ('django.db.models.fields.DecimalField', [], {'default': "'0.00'", 'max_digits': '7', 'decimal_places': '3'}), + 'ppp': ('django.db.models.fields.DecimalField', [], {'default': "'0.00'", 'max_digits': '7', 'decimal_places': '3'}), + 'visible': ('django.db.models.fields.BooleanField', [], {'default': 'True'}) + }, + 'base.profileoption': { + 'Meta': {'ordering': "('order', 'name')", 'object_name': 'ProfileOption'}, + 'description': ('django.db.models.fields.TextField', [], {'blank': 'True'}), + 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), + 'list_type': ('django.db.models.fields.CharField', [], {'max_length': '2'}), + 'name': ('django.db.models.fields.CharField', [], {'max_length': '128'}), + 'order': ('django.db.models.fields.IntegerField', [], {'default': '0'}), + 'visible': ('django.db.models.fields.BooleanField', [], {'default': 'True'}) + }, + 'base.profileoptionchoice': { + 'Meta': {'ordering': "('order', 'name')", 'object_name': 'ProfileOptionChoice'}, + 'description': ('django.db.models.fields.TextField', [], {'blank': 'True'}), + 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), + 'name': ('django.db.models.fields.CharField', [], {'max_length': '128'}), + 'option': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['base.ProfileOption']"}), + 'order': ('django.db.models.fields.IntegerField', [], {'default': '0'}), + 'ppd': ('django.db.models.fields.DecimalField', [], {'default': "'0.00'", 'max_digits': '7', 'decimal_places': '3'}), + 'ppp': ('django.db.models.fields.DecimalField', [], {'default': "'0.00'", 'max_digits': '7', 'decimal_places': '3'}), + 'visible': ('django.db.models.fields.BooleanField', [], {'default': 'True'}) + }, + 'base.request': { + 'Meta': {'ordering': "('-creation_date', '-month_order')", 'object_name': 'Request'}, + 'base_profile': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['base.Profile']", 'null': 'True', 'on_delete': 'models.PROTECT', 'blank': 'True'}), + 'choices': ('django.db.models.fields.related.ManyToManyField', [], {'to': "orm['base.ProfileOptionChoice']", 'symmetrical': 'False', 'blank': 'True'}), + 'comments': ('django.db.models.fields.TextField', [], {'blank': 'True'}), + 'contact_bureau': ('django.db.models.fields.CharField', [], {'max_length': '64', 'blank': 'True'}), + 'contact_email': ('django.db.models.fields.EmailField', [], {'max_length': '75', 'blank': 'True'}), + 'contact_telephone1': ('django.db.models.fields.CharField', [], {'max_length': '32', 'blank': 'True'}), + 'contact_telephone2': ('django.db.models.fields.CharField', [], {'max_length': '32', 'blank': 'True'}), + 'copies': ('django.db.models.fields.PositiveIntegerField', [], {'default': '1', 'blank': 'True'}), + 'copyright': ('django.db.models.fields.NullBooleanField', [], {'null': 'True', 'blank': 'True'}), + 'cost': ('django.db.models.fields.DecimalField', [], {'null': 'True', 'max_digits': '7', 'decimal_places': '2', 'blank': 'True'}), + 'creation_date': ('django.db.models.fields.DateTimeField', [], {'default': 'datetime.datetime.now', 'db_index': 'True'}), + 'delivery_date': ('django.db.models.fields.DateField', [], {'default': 'datetime.datetime(2013, 1, 25, 0, 0)', 'null': 'True', 'blank': 'True'}), + 'delivery_place': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['base.DeliveryPlace']", 'null': 'True', 'on_delete': 'models.PROTECT', 'blank': 'True'}), + 'details': ('django.db.models.fields.TextField', [], {'blank': 'True'}), + 'entity': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['base.Entity']", 'null': 'True', 'on_delete': 'models.PROTECT', 'blank': 'True'}), + 'financial_code': ('django.db.models.fields.CharField', [], {'db_index': 'True', 'max_length': '64', 'blank': 'True'}), + 'financial_comment': ('django.db.models.fields.TextField', [], {'blank': 'True'}), + 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), + 'is_from_remote_request': ('django.db.models.fields.BooleanField', [], {'default': 'False'}), + 'licence': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['base.DocumentLicence']", 'null': 'True', 'on_delete': 'models.PROTECT', 'blank': 'True'}), + 'modification_date': ('django.db.models.fields.DateTimeField', [], {'db_index': 'True'}), + 'month_order': ('django.db.models.fields.IntegerField', [], {'default': '-1'}), + 'name': ('django.db.models.fields.CharField', [], {'max_length': '128', 'blank': 'True'}), + 'nb_pages': ('django.db.models.fields.PositiveIntegerField', [], {'default': '0', 'blank': 'True'}), + 'sponsor': ('django.db.models.fields.CharField', [], {'max_length': '128', 'blank': 'True'}), + 'status': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['base.Status']", 'on_delete': 'models.PROTECT'}), + 'uploadfile': ('django.db.models.fields.files.FileField', [], {'max_length': '100', 'blank': 'True'}), + 'usage': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['base.DocumentUsage']", 'null': 'True', 'on_delete': 'models.PROTECT', 'blank': 'True'}), + 'user': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['auth.User']"}) + }, + 'base.role': { + 'Meta': {'object_name': 'Role'}, + 'id': ('django.db.models.fields.CharField', [], {'max_length': '40', 'primary_key': 'True'}), + 'name': ('django.db.models.fields.CharField', [], {'max_length': '128'}) + }, + 'base.status': { + 'Meta': {'ordering': "('order', 'name')", 'object_name': 'Status'}, + 'code': ('django.db.models.fields.CharField', [], {'unique': 'True', 'max_length': '40'}), + 'default': ('django.db.models.fields.BooleanField', [], {'default': 'False'}), + 'description': ('django.db.models.fields.TextField', [], {'blank': 'True'}), + 'end': ('django.db.models.fields.BooleanField', [], {'default': 'False'}), + 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), + 'name': ('django.db.models.fields.CharField', [], {'max_length': '128'}), + 'order': ('django.db.models.fields.IntegerField', [], {'default': '0', 'blank': 'True'}), + 'start': ('django.db.models.fields.BooleanField', [], {'default': 'False'}), + 'visible': ('django.db.models.fields.BooleanField', [], {'default': 'True'}), + 'visible_by': ('django.db.models.fields.related.ManyToManyField', [], {'to': "orm['base.Role']", 'symmetrical': 'False', 'blank': 'True'}) + }, + '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'}) + }, + 'polynum_blackboard.blackboardpush': { + 'Meta': {'object_name': 'BlackBoardPush'}, + 'course_name': ('django.db.models.fields.TextField', [], {'max_length': '64'}), + 'created_on': ('django.db.models.fields.DateTimeField', [], {'auto_now_add': 'True', 'blank': 'True'}), + 'failure': ('django.db.models.fields.TextField', [], {'default': "''"}), + 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), + 'request': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['base.Request']"}), + 'sent': ('django.db.models.fields.BooleanField', [], {'default': 'False'}), + 'visible_to_students': ('django.db.models.fields.BooleanField', [], {'default': 'False'}) + } + } + + complete_apps = ['polynum_blackboard'] \ No newline at end of file diff --git a/polynum_blackboard/migrations/__init__.py b/polynum_blackboard/migrations/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/polynum_blackboard/models.py b/polynum_blackboard/models.py index 20cf070..bc7b690 100644 --- a/polynum_blackboard/models.py +++ b/polynum_blackboard/models.py @@ -10,5 +10,19 @@ class BlackBoardPush(models.Model): course_name = models.TextField(max_length=64) visible_to_students = models.BooleanField(blank=True) sent = models.BooleanField(blank=True, default=False) + failure = models.TextField(default='') + created_on = models.DateTimeField(auto_now_add=True) + + def __unicode__(self): + s = "push to blacboard request {request} into course {course_name}".format(request=self.request, + course_name=self.course_name) + if self.visible_to_students: + s += ', set it visible to students' + if self.sent: + s += ', already sent' + if self.failure: + s += ', failed: {0}'.format(self.failure) + return s + DocumentLicence.add_diffusion_tag(constant.MYCOURSE_TAG, _('Diffusion vers MyCourse'))