Commit 59970d3f by Matt Drayer Committed by Jonathan Piacenti

mattdrayer/api-workgroup-content-id: Added content_id field

parent 5878b1fc
# -*- 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 'WorkgroupPeerReview.content_id'
db.add_column('projects_workgrouppeerreview', 'content_id',
self.gf('django.db.models.fields.CharField')(max_length=255, null=True, blank=True),
keep_default=False)
def backwards(self, orm):
# Deleting field 'WorkgroupPeerReview.content_id'
db.delete_column('projects_workgrouppeerreview', 'content_id')
models = {
'api_manager.organization': {
'Meta': {'object_name': 'Organization'},
'contact_email': ('django.db.models.fields.EmailField', [], {'max_length': '255', 'null': 'True', 'blank': 'True'}),
'contact_name': ('django.db.models.fields.CharField', [], {'max_length': '255', 'null': 'True', 'blank': 'True'}),
'contact_phone': ('django.db.models.fields.CharField', [], {'max_length': '50', 'null': 'True', 'blank': 'True'}),
'created': ('model_utils.fields.AutoCreatedField', [], {'default': 'datetime.datetime.now'}),
'display_name': ('django.db.models.fields.CharField', [], {'max_length': '255', 'null': 'True', 'blank': 'True'}),
'groups': ('django.db.models.fields.related.ManyToManyField', [], {'related_name': "'organizations'", 'symmetrical': 'False', 'to': "orm['auth.Group']"}),
'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
'modified': ('model_utils.fields.AutoLastModifiedField', [], {'default': 'datetime.datetime.now'}),
'name': ('django.db.models.fields.CharField', [], {'max_length': '255'}),
'users': ('django.db.models.fields.related.ManyToManyField', [], {'related_name': "'organizations'", 'symmetrical': 'False', 'to': "orm['auth.User']"}),
'workgroups': ('django.db.models.fields.related.ManyToManyField', [], {'related_name': "'organizations'", 'symmetrical': 'False', 'to': "orm['projects.Workgroup']"})
},
'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'})
},
'projects.project': {
'Meta': {'unique_together': "(('course_id', 'content_id', 'organization'),)", 'object_name': 'Project'},
'content_id': ('django.db.models.fields.CharField', [], {'max_length': '255'}),
'course_id': ('django.db.models.fields.CharField', [], {'max_length': '255'}),
'created': ('model_utils.fields.AutoCreatedField', [], {'default': 'datetime.datetime.now'}),
'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
'modified': ('model_utils.fields.AutoLastModifiedField', [], {'default': 'datetime.datetime.now'}),
'organization': ('django.db.models.fields.related.ForeignKey', [], {'blank': 'True', 'related_name': "'projects'", 'null': 'True', 'on_delete': 'models.SET_NULL', 'to': "orm['api_manager.Organization']"})
},
'projects.workgroup': {
'Meta': {'object_name': 'Workgroup'},
'created': ('model_utils.fields.AutoCreatedField', [], {'default': 'datetime.datetime.now'}),
'groups': ('django.db.models.fields.related.ManyToManyField', [], {'blank': 'True', 'related_name': "'workgroups'", 'null': 'True', 'symmetrical': 'False', 'to': "orm['auth.Group']"}),
'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
'modified': ('model_utils.fields.AutoLastModifiedField', [], {'default': 'datetime.datetime.now'}),
'name': ('django.db.models.fields.CharField', [], {'max_length': '255', 'null': 'True', 'blank': 'True'}),
'project': ('django.db.models.fields.related.ForeignKey', [], {'related_name': "'workgroups'", 'to': "orm['projects.Project']"}),
'users': ('django.db.models.fields.related.ManyToManyField', [], {'blank': 'True', 'related_name': "'workgroups'", 'null': 'True', 'symmetrical': 'False', 'to': "orm['auth.User']"})
},
'projects.workgrouppeerreview': {
'Meta': {'object_name': 'WorkgroupPeerReview'},
'answer': ('django.db.models.fields.CharField', [], {'max_length': '255'}),
'content_id': ('django.db.models.fields.CharField', [], {'max_length': '255', 'null': 'True', 'blank': 'True'}),
'created': ('model_utils.fields.AutoCreatedField', [], {'default': 'datetime.datetime.now'}),
'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
'modified': ('model_utils.fields.AutoLastModifiedField', [], {'default': 'datetime.datetime.now'}),
'question': ('django.db.models.fields.CharField', [], {'max_length': '255'}),
'reviewer': ('django.db.models.fields.CharField', [], {'max_length': '255'}),
'user': ('django.db.models.fields.related.ForeignKey', [], {'related_name': "'workgroup_peer_reviewees'", 'to': "orm['auth.User']"}),
'workgroup': ('django.db.models.fields.related.ForeignKey', [], {'related_name': "'peer_reviews'", 'to': "orm['projects.Workgroup']"})
},
'projects.workgroupreview': {
'Meta': {'object_name': 'WorkgroupReview'},
'answer': ('django.db.models.fields.CharField', [], {'max_length': '255'}),
'content_id': ('django.db.models.fields.CharField', [], {'max_length': '255', 'null': 'True', 'blank': 'True'}),
'created': ('model_utils.fields.AutoCreatedField', [], {'default': 'datetime.datetime.now'}),
'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
'modified': ('model_utils.fields.AutoLastModifiedField', [], {'default': 'datetime.datetime.now'}),
'question': ('django.db.models.fields.CharField', [], {'max_length': '255'}),
'reviewer': ('django.db.models.fields.CharField', [], {'max_length': '255'}),
'workgroup': ('django.db.models.fields.related.ForeignKey', [], {'related_name': "'workgroup_reviews'", 'to': "orm['projects.Workgroup']"})
},
'projects.workgroupsubmission': {
'Meta': {'object_name': 'WorkgroupSubmission'},
'created': ('model_utils.fields.AutoCreatedField', [], {'default': 'datetime.datetime.now'}),
'document_filename': ('django.db.models.fields.CharField', [], {'max_length': '255', 'null': 'True', 'blank': 'True'}),
'document_id': ('django.db.models.fields.CharField', [], {'max_length': '255'}),
'document_mime_type': ('django.db.models.fields.CharField', [], {'max_length': '255'}),
'document_url': ('django.db.models.fields.CharField', [], {'max_length': '255'}),
'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
'modified': ('model_utils.fields.AutoLastModifiedField', [], {'default': 'datetime.datetime.now'}),
'user': ('django.db.models.fields.related.ForeignKey', [], {'related_name': "'submissions'", 'to': "orm['auth.User']"}),
'workgroup': ('django.db.models.fields.related.ForeignKey', [], {'related_name': "'submissions'", 'to': "orm['projects.Workgroup']"})
},
'projects.workgroupsubmissionreview': {
'Meta': {'object_name': 'WorkgroupSubmissionReview'},
'answer': ('django.db.models.fields.CharField', [], {'max_length': '255'}),
'content_id': ('django.db.models.fields.CharField', [], {'max_length': '255', 'null': 'True', 'blank': 'True'}),
'created': ('model_utils.fields.AutoCreatedField', [], {'default': 'datetime.datetime.now'}),
'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
'modified': ('model_utils.fields.AutoLastModifiedField', [], {'default': 'datetime.datetime.now'}),
'question': ('django.db.models.fields.CharField', [], {'max_length': '255'}),
'reviewer': ('django.db.models.fields.CharField', [], {'max_length': '255'}),
'submission': ('django.db.models.fields.related.ForeignKey', [], {'related_name': "'reviews'", 'to': "orm['projects.WorkgroupSubmission']"})
}
}
complete_apps = ['projects']
\ No newline at end of file
......@@ -106,3 +106,4 @@ class WorkgroupPeerReview(TimeStampedModel):
reviewer = models.CharField(max_length=255) # AnonymousUserId
question = models.CharField(max_length=255)
answer = models.CharField(max_length=255)
content_id = models.CharField(max_length=255, null=True, blank=True)
......@@ -137,7 +137,7 @@ class WorkgroupPeerReviewSerializer(serializers.HyperlinkedModelSerializer):
model = WorkgroupPeerReview
fields = (
'id', 'url', 'created', 'modified', 'question', 'answer',
'workgroup', 'user', 'reviewer'
'workgroup', 'user', 'reviewer', 'content_id'
)
......
......@@ -6,6 +6,7 @@ Run these tests @ Devstack:
"""
import json
import uuid
from urllib import urlencode
from django.contrib.auth.models import User
from django.core.cache import cache
......@@ -54,7 +55,7 @@ class PeerReviewsApiTests(ModuleStoreTestCase):
self.test_course_id = unicode(self.course.id)
self.test_bogus_course_id = 'foo/bar/baz'
self.test_course_content_id = "i4x://blah"
self.test_course_content_id = unicode(self.chapter.scope_ids.usage_id)
self.test_bogus_course_content_id = "14x://foo/bar/baz"
self.test_question = "Does the question data come from the XBlock definition?"
......@@ -124,6 +125,7 @@ class PeerReviewsApiTests(ModuleStoreTestCase):
'reviewer': self.anonymous_user_id,
'question': self.test_question,
'answer': self.test_answer,
'content_id': self.test_course_content_id
}
response = self.do_post(self.test_peer_reviews_uri, data)
self.assertEqual(response.status_code, 201)
......@@ -140,6 +142,7 @@ class PeerReviewsApiTests(ModuleStoreTestCase):
self.assertEqual(response.data['question'], self.test_question)
self.assertEqual(response.data['answer'], self.test_answer)
self.assertEqual(response.data['workgroup'], self.test_workgroup.id)
self.assertEqual(response.data['content_id'], self.test_course_content_id)
self.assertIsNotNone(response.data['created'])
self.assertIsNotNone(response.data['modified'])
......@@ -153,6 +156,32 @@ class PeerReviewsApiTests(ModuleStoreTestCase):
response = self.do_post(self.test_peer_reviews_uri, data)
self.assertEqual(response.status_code, 400)
def test_peer_reviews_list_get(self):
data = {
'workgroup': self.test_workgroup.id,
'user': self.test_peer_user.id,
'reviewer': self.anonymous_user_id,
'question': self.test_question,
'answer': self.test_answer,
'content_id': self.test_course_content_id
}
response = self.do_post(self.test_peer_reviews_uri, data)
self.assertEqual(response.status_code, 201)
data = {
'workgroup': self.test_workgroup.id,
'user': self.test_peer_user.id,
'reviewer': self.anonymous_user_id,
'question': self.test_question,
'answer': self.test_answer,
'content_id': self.test_course_content_id
}
response = self.do_post(self.test_peer_reviews_uri, data)
self.assertEqual(response.status_code, 201)
response = self.do_get(self.test_peer_reviews_uri)
self.assertEqual(response.status_code, 200)
self.assertEqual(len(response.data), 2)
def test_peer_reviews_detail_get(self):
data = {
'workgroup': self.test_workgroup.id,
......@@ -160,6 +189,7 @@ class PeerReviewsApiTests(ModuleStoreTestCase):
'reviewer': self.anonymous_user_id,
'question': self.test_question,
'answer': self.test_answer,
'content_id': self.test_course_content_id,
}
response = self.do_post(self.test_peer_reviews_uri, data)
self.assertEqual(response.status_code, 201)
......@@ -173,10 +203,12 @@ class PeerReviewsApiTests(ModuleStoreTestCase):
)
self.assertEqual(response.data['url'], confirm_uri)
self.assertGreater(response.data['id'], 0)
self.assertEqual(response.data['workgroup'], self.test_workgroup.id)
self.assertEqual(response.data['user'], self.test_peer_user.id)
self.assertEqual(response.data['reviewer'], self.anonymous_user_id)
self.assertEqual(response.data['question'], self.test_question)
self.assertEqual(response.data['answer'], self.test_answer)
self.assertEqual(response.data['content_id'], self.test_course_content_id)
self.assertIsNotNone(response.data['created'])
self.assertIsNotNone(response.data['modified'])
......
......@@ -6,6 +6,7 @@ Run these tests @ Devstack:
"""
import json
import uuid
from urllib import urlencode
from django.contrib.auth.models import User
from django.core.cache import cache
......@@ -54,9 +55,8 @@ class SubmissionReviewsApiTests(ModuleStoreTestCase):
self.test_course_id = unicode(self.course.id)
self.test_bogus_course_id = 'foo/bar/baz'
self.test_course_content_id = "i4x://blah"
self.test_course_content_id = unicode(self.chapter.scope_ids.usage_id)
self.test_bogus_course_content_id = "14x://foo/bar/baz"
self.test_question = "Does the question data come from the XBlock definition?"
self.test_answer = "It sure does! And so does the answer data!"
......@@ -145,6 +145,30 @@ class SubmissionReviewsApiTests(ModuleStoreTestCase):
self.assertIsNotNone(response.data['created'])
self.assertIsNotNone(response.data['modified'])
def test_submission_reviews_list_get(self):
data = {
'submission': self.test_submission.id,
'reviewer': self.anonymous_user_id,
'question': self.test_question,
'answer': self.test_answer,
'content_id': self.test_course_content_id,
}
response = self.do_post(self.test_submission_reviews_uri, data)
self.assertEqual(response.status_code, 201)
data = {
'submission': self.test_submission.id,
'reviewer': self.anonymous_user_id,
'question': self.test_question,
'answer': self.test_answer,
'content_id': self.test_course_content_id,
}
response = self.do_post(self.test_submission_reviews_uri, data)
self.assertEqual(response.status_code, 201)
response = self.do_get(self.test_submission_reviews_uri)
self.assertEqual(response.status_code, 200)
self.assertEqual(len(response.data), 2)
def test_submission_reviews_detail_get(self):
data = {
'submission': self.test_submission.id,
......
......@@ -6,6 +6,7 @@ Run these tests @ Devstack:
"""
import json
import uuid
from urllib import urlencode
from django.contrib.auth.models import User
from django.core.cache import cache
......@@ -55,7 +56,7 @@ class WorkgroupReviewsApiTests(ModuleStoreTestCase):
self.test_course_id = unicode(self.course.id)
self.test_bogus_course_id = 'foo/bar/baz'
self.test_course_content_id = "i4x://blah"
self.test_course_content_id = unicode(self.chapter.scope_ids.usage_id)
self.test_bogus_course_content_id = "14x://foo/bar/baz"
self.test_question = "Does the question data come from the XBlock definition?"
......@@ -145,6 +146,30 @@ class WorkgroupReviewsApiTests(ModuleStoreTestCase):
self.assertIsNotNone(response.data['created'])
self.assertIsNotNone(response.data['modified'])
def test_workgroup_reviews_list_get(self):
data = {
'workgroup': self.test_workgroup.id,
'reviewer': self.anonymous_user_id,
'question': self.test_question,
'answer': self.test_answer,
'content_id': self.test_course_content_id,
}
response = self.do_post(self.test_workgroup_reviews_uri, data)
self.assertEqual(response.status_code, 201)
data = {
'workgroup': self.test_workgroup.id,
'reviewer': self.anonymous_user_id,
'question': self.test_question,
'answer': self.test_answer,
'content_id': self.test_course_content_id,
}
response = self.do_post(self.test_workgroup_reviews_uri, data)
self.assertEqual(response.status_code, 201)
response = self.do_get(self.test_workgroup_reviews_uri)
self.assertEqual(response.status_code, 200)
self.assertEqual(len(response.data), 2)
def test_workgroup_reviews_detail_get(self):
data = {
'workgroup': self.test_workgroup.id,
......
......@@ -7,6 +7,7 @@ Run these tests @ Devstack:
from datetime import datetime
import json
import uuid
from urllib import urlencode
from django.contrib.auth.models import Group, User
from django.core.cache import cache
......@@ -385,18 +386,41 @@ class WorkgroupsApiTests(ModuleStoreTestCase):
'user': self.test_user.id,
'reviewer': self.test_user.username,
'question': 'Test question?',
'answer': 'Test answer!'
'answer': 'Test answer!',
'content_id': self.test_course_content_id
}
response = self.do_post(self.test_peer_reviews_uri, pr_data)
self.assertEqual(response.status_code, 201)
pr_id = response.data['id']
pr1_id = response.data['id']
pr_data = {
'workgroup': workgroup_id,
'user': self.test_user.id,
'reviewer': self.test_user.username,
'question': 'Test question2',
'answer': 'Test answer2',
'content_id': self.test_course_id
}
response = self.do_post(self.test_peer_reviews_uri, pr_data)
self.assertEqual(response.status_code, 201)
pr2_id = response.data['id']
test_uri = '{}{}/'.format(self.test_workgroups_uri, workgroup_id)
peer_reviews_uri = '{}peer_reviews/'.format(test_uri)
response = self.do_get(peer_reviews_uri)
self.assertEqual(response.status_code, 200)
self.assertEqual(response.data[0]['id'], pr_id)
self.assertEqual(len(response.data), 2)
self.assertEqual(response.data[0]['id'], pr1_id)
self.assertEqual(response.data[0]['reviewer'], self.test_user.username)
content_id = {"content_id": self.test_course_content_id}
test_uri = '{}{}/peer_reviews/?{}'.format(self.test_workgroups_uri, workgroup_id, urlencode(content_id))
response = self.do_get(test_uri)
self.assertEqual(response.status_code, 200)
self.assertEqual(len(response.data), 1)
self.assertEqual(response.data[0]['id'], pr1_id)
self.assertEqual(response.data[0]['reviewer'], self.test_user.username)
def test_workgroups_workgroup_reviews_get(self):
data = {
'name': self.test_workgroup_name,
......@@ -409,16 +433,36 @@ class WorkgroupsApiTests(ModuleStoreTestCase):
'workgroup': workgroup_id,
'reviewer': self.test_user.username,
'question': 'Test question?',
'answer': 'Test answer!'
'answer': 'Test answer!',
'content_id': self.test_course_content_id
}
response = self.do_post(self.test_workgroup_reviews_uri, wr_data)
self.assertEqual(response.status_code, 201)
wr_id = response.data['id']
wr1_id = response.data['id']
wr_data = {
'workgroup': workgroup_id,
'reviewer': self.test_user.username,
'question': 'Test question?',
'answer': 'Test answer!',
'content_id': self.test_course_id
}
response = self.do_post(self.test_workgroup_reviews_uri, wr_data)
self.assertEqual(response.status_code, 201)
test_uri = '{}{}/'.format(self.test_workgroups_uri, workgroup_id)
workgroup_reviews_uri = '{}workgroup_reviews/'.format(test_uri)
response = self.do_get(workgroup_reviews_uri)
self.assertEqual(response.status_code, 200)
self.assertEqual(response.data[0]['id'], wr_id)
self.assertEqual(len(response.data), 2)
self.assertEqual(response.data[0]['id'], wr1_id)
self.assertEqual(response.data[0]['reviewer'], self.test_user.username)
content_id = {"content_id": self.test_course_content_id}
test_uri = '{}{}/workgroup_reviews/?{}'.format(self.test_workgroups_uri, workgroup_id, urlencode(content_id))
response = self.do_get(test_uri)
self.assertEqual(response.status_code, 200)
self.assertEqual(len(response.data), 1)
self.assertEqual(response.data[0]['id'], wr1_id)
self.assertEqual(response.data[0]['reviewer'], self.test_user.username)
def test_workgroups_submissions_get(self):
......
......@@ -179,6 +179,9 @@ class WorkgroupsViewSet(viewsets.ModelViewSet):
View Peer Reviews for a specific Workgroup
"""
peer_reviews = WorkgroupPeerReview.objects.filter(workgroup=pk)
content_id = self.request.QUERY_PARAMS.get('content_id', None)
if content_id is not None:
peer_reviews = peer_reviews.filter(content_id=content_id)
response_data = []
if peer_reviews:
for peer_review in peer_reviews:
......@@ -192,6 +195,10 @@ class WorkgroupsViewSet(viewsets.ModelViewSet):
View Workgroup Reviews for a specific Workgroup
"""
workgroup_reviews = WorkgroupReview.objects.filter(workgroup=pk)
content_id = self.request.QUERY_PARAMS.get('content_id', None)
if content_id is not None:
workgroup_reviews = workgroup_reviews.filter(content_id=content_id)
response_data = []
if workgroup_reviews:
for workgroup_review in workgroup_reviews:
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment