Skip to content

Commit

Permalink
Bug 1042213 - Update Task API to include attempts by users for a part…
Browse files Browse the repository at this point in the history
…icular task
  • Loading branch information
bitgeeky committed Jul 22, 2014
1 parent 8abe2a0 commit 7f0de3d
Show file tree
Hide file tree
Showing 3 changed files with 24 additions and 9 deletions.
6 changes: 3 additions & 3 deletions oneanddone/tasks/models.py
Original file line number Diff line number Diff line change
Expand Up @@ -163,8 +163,8 @@ def is_available_filter(self, now=None, allow_expired=False, prefix=''):

q_filter = q_filter & (
pQ(repeatable=True) | (
~pQ(taskattempt__state=TaskAttempt.STARTED) &
~pQ(taskattempt__state=TaskAttempt.FINISHED)))
~pQ(taskattempt_set__state=TaskAttempt.STARTED) &
~pQ(taskattempt_set__state=TaskAttempt.FINISHED)))

return q_filter

Expand Down Expand Up @@ -201,7 +201,7 @@ def __unicode__(self):

class TaskAttempt(CachedModel, CreatedModifiedModel):
user = models.ForeignKey(User, null=True, on_delete=models.SET_NULL)
task = models.ForeignKey(Task)
task = models.ForeignKey(Task, related_name='taskattempt_set')

STARTED = 0
FINISHED = 1
Expand Down
14 changes: 12 additions & 2 deletions oneanddone/tasks/serializers.py
Original file line number Diff line number Diff line change
Expand Up @@ -3,7 +3,7 @@
# file, You can obtain one at http://mozilla.org/MPL/2.0/.
from rest_framework import serializers

from oneanddone.tasks.models import Task, TaskKeyword
from oneanddone.tasks.models import Task, TaskKeyword, TaskAttempt


class TaskKeywordSerializer(serializers.ModelSerializer):
Expand All @@ -13,16 +13,26 @@ class Meta:
fields = ('name',)


class TaskAttemptSerializer(serializers.ModelSerializer):

user = serializers.SlugRelatedField(many=False, slug_field='email')

class Meta:
model = TaskAttempt
fields = ('user', 'state')


class TaskSerializer(serializers.ModelSerializer):

project = serializers.SlugRelatedField(many=False, slug_field='name')
team = serializers.SlugRelatedField(many=False, slug_field='name')
type = serializers.SlugRelatedField(many=False, slug_field='name')
keyword_set = TaskKeywordSerializer(required=False, many=True)
taskattempt_set = TaskAttemptSerializer(required=False, many=True)

class Meta:
model = Task
fields = ('id', 'name', 'short_description', 'instructions',
'prerequisites', 'execution_time', 'start_date', 'end_date',
'is_draft', 'project', 'team', 'type', 'repeatable', 'difficulty',
'why_this_matters', 'keyword_set')
'why_this_matters', 'keyword_set', 'taskattempt_set')
13 changes: 9 additions & 4 deletions oneanddone/tasks/tests/test_api.py
Original file line number Diff line number Diff line change
Expand Up @@ -13,7 +13,7 @@
from nose.tools import eq_, assert_true, assert_greater

from oneanddone.users.tests import UserFactory
from oneanddone.tasks.tests import TaskFactory, TaskProjectFactory, TaskTeamFactory, TaskTypeFactory
from oneanddone.tasks.tests import TaskFactory, TaskProjectFactory, TaskTeamFactory, TaskTypeFactory, TaskAttemptFactory


class APITests(APITestCase):
Expand Down Expand Up @@ -100,13 +100,15 @@ def test_get_task_list(self):
header = {'HTTP_AUTHORIZATION': 'Token {}'.format(self.token)}

test_task = self.create_task(self.client_user)
task_attempt = TaskAttemptFactory.create(user=self.client_user, task=test_task)
task_data = {"id": test_task.id, "name": test_task.name, "short_description": test_task.short_description,
"instructions": test_task.instructions, "prerequisites":test_task.prerequisites,
"execution_time": test_task.execution_time, "is_draft": test_task.is_draft, "project": test_task.project.name,
"team": test_task.team.name, "type": test_task.type.name, "repeatable": test_task.repeatable,
"start_date": test_task.start_date, "end_date": test_task.end_date, "difficulty": test_task.difficulty,
"why_this_matters": test_task.why_this_matters,
"keyword_set": [{"name": keyword.name} for keyword in test_task.keyword_set.all()]}
"keyword_set": [{"name": keyword.name} for keyword in test_task.keyword_set.all()],
"taskattempt_set": [{"user":self.client_user.email, "state":task_attempt.state}]}

response = self.client.get(reverse('api-task'), {}, **header)
self.assert_response_status(response, status.HTTP_200_OK)
Expand All @@ -120,6 +122,7 @@ def test_get_task_details(self):
self.client.credentials(HTTP_AUTHORIZATION='Token ' + self.token.key)

test_task = self.create_task(self.client_user)
task_attempt = TaskAttemptFactory.create(user=self.client_user, task=test_task)
task_uri = self.uri + str(test_task.id) + '/'

task_data = {"id": test_task.id, "name": test_task.name, "short_description": test_task.short_description,
Expand All @@ -128,7 +131,8 @@ def test_get_task_details(self):
"team": test_task.team.name, "type": test_task.type.name, "repeatable": test_task.repeatable,
"start_date": test_task.start_date, "end_date": test_task.end_date, "difficulty": test_task.difficulty,
"why_this_matters": test_task.why_this_matters,
"keyword_set": [{"name": keyword.name} for keyword in test_task.keyword_set.all()]}
"keyword_set": [{"name": keyword.name} for keyword in test_task.keyword_set.all()],
"taskattempt_set": [{"user":self.client_user.email, "state":task_attempt.state}]}

response = self.client.get(task_uri)
self.assert_response_status(response, status.HTTP_200_OK)
Expand All @@ -150,7 +154,8 @@ def test_create_new_task(self):
"team": team.name, "type": type.name, "repeatable": False,
"start_date": None, "end_date": None, "difficulty": 1,
"why_this_matters": "Task matters",
"keyword_set": [{"name":"testing"},{"name":"mozwebqa"}]}
"keyword_set": [{"name":"testing"},{"name":"mozwebqa"}],
"taskattempt_set": [{"user":self.client_user.email, "state":0}]}

response = self.client.post(self.uri, task_data, format='json')
self.assert_response_status(response, status.HTTP_201_CREATED)
Expand Down

0 comments on commit 7f0de3d

Please sign in to comment.