Assigning users to submissions
authorAleksander Łukasz <aleksander.lukasz@nowoczesnapolska.org.pl>
Tue, 12 Nov 2013 09:53:29 +0000 (10:53 +0100)
committerAleksander Łukasz <aleksander.lukasz@nowoczesnapolska.org.pl>
Wed, 15 Jan 2014 10:18:58 +0000 (11:18 +0100)
wtem/admin.py
wtem/management/commands/wtem_assign_submissions.py [new file with mode: 0644]
wtem/migrations/0007_auto.py [new file with mode: 0644]
wtem/models.py

index ed72a83..be96131 100644 (file)
@@ -100,11 +100,18 @@ def get_form(request, submission):
                     initial = submission.get_mark(user_id = request.user.id, exercise_id = exercise['id']),
                     label = u'Twoja ocena zadania %s' % exercise['id']
                 )
+
+    if not request.user.is_superuser:
+        class Meta(SubmissionFormBase.Meta):
+            pass
+        Meta.exclude += ('examiners',)
+        fields['Meta'] = Meta
+
     return type('SubmissionForm', (SubmissionFormBase,), fields)
 
 
 class SubmissionAdmin(admin.ModelAdmin):
-    list_display = ('__unicode__', 'todo',)
+    list_display = ('__unicode__', 'todo', 'examiners_repr')
     readonly_fields = readonly_fields
 
     def get_form(self, request, obj, **kwargs):
@@ -126,6 +133,10 @@ class SubmissionAdmin(admin.ModelAdmin):
         user_marks = submission.marks.get(str(user.id), {})
         return ','.join([str(e['id']) for e in user_exercises if str(e['id']) not in user_marks.keys()])
 
+    def examiners_repr(self, submission):
+        return ', '.join([u.username for u in submission.examiners.all()])
+    examiners_repr.short_description = 'Przypisani'
+
     def save_model(self, request, submission, form, change):
         for name, value in form.cleaned_data.items():
             if name.startswith('markof_'):
@@ -141,12 +152,19 @@ class SubmissionAdmin(admin.ModelAdmin):
             submissions = Submission.objects.all()
             for assignment in Assignment.objects.all():
                 examiner = dict(name = assignment.user.username, todo = 0)
-                for submission in submissions:
+                for submission in Submission.objects.filter(examiners = assignment.user):
                     for exercise_id in assignment.exercises:
                         if submission.get_mark(user_id = assignment.user.id, exercise_id = exercise_id) is None:
                             examiner['todo'] += 1
                 context['examiners'].append(examiner)
         return super(SubmissionAdmin, self).changelist_view(request, extra_context = context)
 
+    def queryset(self, request):
+        qs = super(SubmissionAdmin, self).queryset(request)
+        if not request.user.is_superuser:
+            qs = qs.filter(examiners = request.user)
+        return qs
+
+
 admin.site.register(Submission, SubmissionAdmin)
 admin.site.register(Assignment)
\ No newline at end of file
diff --git a/wtem/management/commands/wtem_assign_submissions.py b/wtem/management/commands/wtem_assign_submissions.py
new file mode 100644 (file)
index 0000000..f87b7f4
--- /dev/null
@@ -0,0 +1,30 @@
+from django.core.management.base import BaseCommand, CommandError
+from django.db.models import Count
+from django.contrib.auth.models import User
+
+from contact.models import Contact
+from wtem.models import Submission
+
+
+class Command(BaseCommand):
+
+    def handle(self, *args, **options):
+        how_many = int(args[0])
+        examiner_names = args[1:]
+
+        users = User.objects.filter(username__in = examiner_names)
+        submissions_query = Submission.objects.annotate(examiners_count = Count('examiners'))
+
+        submissions = submissions_query \
+            .filter(examiners_count__lt=2)[0:how_many]
+
+        for submission in submissions:
+            submission.examiners.add(*users)
+            submission.save()
+            self.stdout.write('added to %s:%s' % (submission.id, submission.email))
+
+        count_by_examiners = dict()
+        for submission in submissions_query.all():
+            count_by_examiners[submission.examiners_count] = \
+                count_by_examiners.get(submission.examiners_count, 0) + 1
+        self.stdout.write('%s' % count_by_examiners)
diff --git a/wtem/migrations/0007_auto.py b/wtem/migrations/0007_auto.py
new file mode 100644 (file)
index 0000000..ab1949f
--- /dev/null
@@ -0,0 +1,99 @@
+# -*- 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 M2M table for field examiners on 'Submission'
+        db.create_table(u'wtem_submission_examiners', (
+            ('id', models.AutoField(verbose_name='ID', primary_key=True, auto_created=True)),
+            ('submission', models.ForeignKey(orm[u'wtem.submission'], null=False)),
+            ('user', models.ForeignKey(orm[u'auth.user'], null=False))
+        ))
+        db.create_unique(u'wtem_submission_examiners', ['submission_id', 'user_id'])
+
+
+    def backwards(self, orm):
+        # Removing M2M table for field examiners on 'Submission'
+        db.delete_table('wtem_submission_examiners')
+
+
+    models = {
+        u'auth.group': {
+            'Meta': {'object_name': 'Group'},
+            u'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': u"orm['auth.Permission']", 'symmetrical': 'False', 'blank': 'True'})
+        },
+        u'auth.permission': {
+            'Meta': {'ordering': "(u'content_type__app_label', u'content_type__model', u'codename')", 'unique_together': "((u'content_type', u'codename'),)", 'object_name': 'Permission'},
+            'codename': ('django.db.models.fields.CharField', [], {'max_length': '100'}),
+            'content_type': ('django.db.models.fields.related.ForeignKey', [], {'to': u"orm['contenttypes.ContentType']"}),
+            u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
+            'name': ('django.db.models.fields.CharField', [], {'max_length': '50'})
+        },
+        u'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': u"orm['auth.Group']", 'symmetrical': 'False', 'blank': 'True'}),
+            u'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': u"orm['auth.Permission']", 'symmetrical': 'False', 'blank': 'True'}),
+            'username': ('django.db.models.fields.CharField', [], {'unique': 'True', 'max_length': '30'})
+        },
+        u'contact.contact': {
+            'Meta': {'ordering': "('-created_at',)", 'object_name': 'Contact'},
+            'body': ('jsonfield.fields.JSONField', [], {'default': '{}'}),
+            'contact': ('django.db.models.fields.CharField', [], {'max_length': '128'}),
+            'created_at': ('django.db.models.fields.DateTimeField', [], {'auto_now_add': 'True', 'blank': 'True'}),
+            'form_tag': ('django.db.models.fields.CharField', [], {'max_length': '32', 'db_index': 'True'}),
+            u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
+            'ip': ('django.db.models.fields.IPAddressField', [], {'max_length': '15'})
+        },
+        u'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'}),
+            u'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'})
+        },
+        u'wtem.assignment': {
+            'Meta': {'object_name': 'Assignment'},
+            'exercises': ('jsonfield.fields.JSONField', [], {'default': '{}'}),
+            u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
+            'user': ('django.db.models.fields.related.ForeignKey', [], {'to': u"orm['auth.User']", 'unique': 'True'})
+        },
+        u'wtem.attachment': {
+            'Meta': {'object_name': 'Attachment'},
+            'exercise_id': ('django.db.models.fields.IntegerField', [], {}),
+            'file': ('django.db.models.fields.files.FileField', [], {'max_length': '100'}),
+            u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
+            'submission': ('django.db.models.fields.related.ForeignKey', [], {'to': u"orm['wtem.Submission']"})
+        },
+        u'wtem.submission': {
+            'Meta': {'object_name': 'Submission'},
+            'answers': ('django.db.models.fields.CharField', [], {'max_length': '65536', 'null': 'True', 'blank': 'True'}),
+            'contact': ('django.db.models.fields.related.ForeignKey', [], {'to': u"orm['contact.Contact']", 'null': 'True'}),
+            'email': ('django.db.models.fields.EmailField', [], {'unique': 'True', 'max_length': '100'}),
+            'examiners': ('django.db.models.fields.related.ManyToManyField', [], {'to': u"orm['auth.User']", 'symmetrical': 'False'}),
+            'first_name': ('django.db.models.fields.CharField', [], {'max_length': '100'}),
+            u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
+            'key': ('django.db.models.fields.CharField', [], {'unique': 'True', 'max_length': '30'}),
+            'key_sent': ('django.db.models.fields.BooleanField', [], {'default': 'False'}),
+            'last_name': ('django.db.models.fields.CharField', [], {'max_length': '100'}),
+            'marks': ('jsonfield.fields.JSONField', [], {'default': '{}'})
+        }
+    }
+
+    complete_apps = ['wtem']
\ No newline at end of file
index 1cd87f9..8e9d505 100644 (file)
@@ -26,6 +26,7 @@ class Submission(models.Model):
     answers = models.CharField(max_length = 65536, null = True, blank = True)
     key_sent = models.BooleanField(default = False)
     marks = JSONField()
+    examiners = models.ManyToManyField(User, null = True, blank = True)
 
     def __unicode__(self):
         return ', '.join((self.last_name, self.first_name, self.email))