Skip to content

Commit

Permalink
Merge pull request #130 from TireSwingSoftware/issue/72
Browse files Browse the repository at this point in the history
Please Review: Issue #72: Add organization attribute to Task
  • Loading branch information
mhrivnak committed Mar 18, 2012
2 parents e6d087d + 6c84c5c commit 264b1b9
Show file tree
Hide file tree
Showing 24 changed files with 1,097 additions and 1,040 deletions.
2 changes: 1 addition & 1 deletion file_tasks/forms.py
Original file line number Diff line number Diff line change
Expand Up @@ -25,7 +25,7 @@ class FileDownloadForm(FileTaskForm):

class Meta:
model = FileDownload
fields = ('file_data', 'name', 'description')
fields = ('file_data', 'name', 'description', 'organization')

class FileUploadAttemptForm(FileTaskForm):
"""Form for uploading a file to complete a FileUploadAttempt."""
Expand Down
10 changes: 6 additions & 4 deletions file_tasks/managers/file_download_manager.py
Original file line number Diff line number Diff line change
Expand Up @@ -26,7 +26,7 @@ def __init__(self):
self.my_django_model = facade.models.FileDownload

@service_method
def create(self, auth_token, name, description, optional_attributes=None):
def create(self, auth_token, name, description, organization=None, optional_attributes=None):
"""
Create a new FileDownload task.
Expand All @@ -41,9 +41,11 @@ def create(self, auth_token, name, description, optional_attributes=None):
:type optional_attributes: dict
:return: The new FileDownload instance.
"""
if optional_attributes is None:
optional_attributes = {}
file_download = self.my_django_model(name=name, description=description)
org = self._infer_task_organization(auth_token, organization)
file_download = self.my_django_model(
name=name,
description=description,
organization=org)
if isinstance(auth_token, facade.models.AuthToken):
file_download.owner = auth_token.user
file_download.save()
Expand Down
11 changes: 7 additions & 4 deletions file_tasks/managers/file_upload_manager.py
Original file line number Diff line number Diff line change
Expand Up @@ -16,7 +16,8 @@ def __init__(self):
self.my_django_model = facade.models.FileUpload

@service_method
def create(self, auth_token, name, description, optional_attributes=None):
def create(self, auth_token, name, description, organization=None,
optional_attributes=None):
"""
Create a new FileUpload task.
Expand All @@ -31,9 +32,11 @@ def create(self, auth_token, name, description, optional_attributes=None):
:type optional_attributes: dict
:return: The new FileUpload instance.
"""
if optional_attributes is None:
optional_attributes = {}
file_upload = self.my_django_model(name=name, description=description)
org = self._infer_task_organization(auth_token, organization)
file_upload = self.my_django_model(
name=name,
description=description,
organization=org)
if isinstance(auth_token, facade.models.AuthToken):
file_upload.owner = auth_token.user
file_upload.save()
Expand Down
5 changes: 4 additions & 1 deletion file_tasks/tests.py
Original file line number Diff line number Diff line change
Expand Up @@ -57,6 +57,7 @@ def _upload_file(self, auth_token=None, file_name=None, name=None,
'auth_token': auth_token.session_id,
'name': name,
'description': description,
'organization': self.organization1.id,
'file_data': f,
}
if use_form:
Expand All @@ -78,6 +79,7 @@ def test_upload_file_as_admin(self):
self.assertTrue(file_download)
self.assertTrue(file_download.file_data.name)
self.assertTrue(file_download.file_url)
self.assertEqual(file_download.organization, self.organization1)
self.assertEqual(facade.models.FileDownload.objects.all().count(), 1)

def test_upload_file_as_admin_via_form(self):
Expand Down Expand Up @@ -185,7 +187,8 @@ def test_assignment_details(self):
def test_download_when_file_is_not_ready(self):
# this FileDownload does not have an actual file, similar to a case where
# the asynchronous processing of an uploaded file hasn't taken place yet.
file_download = facade.models.FileDownload.objects.create(name='Test FD')
file_download = facade.models.FileDownload.objects.create(name='Test FD',
organization=self.organization1)
assignment = self.assignment_manager.create(self.admin_token, file_download.id, self.user1.id)
download_url = self.file_download_manager.get_download_url_for_assignment(self.user1_auth_token, assignment.pk)
response = self.client.get(download_url)
Expand Down
3 changes: 2 additions & 1 deletion file_tasks/views.py
Original file line number Diff line number Diff line change
Expand Up @@ -90,7 +90,8 @@ def upload_file_for_download(request, auth_token=None, pk=None):
else:
file_download = file_download_manager.create(at,
form.cleaned_data['name'],
form.cleaned_data['description'])
form.cleaned_data['description'],
form.cleaned_data['organization'].id)
file_download.file_size = form.files['file_data'].size
file_download.save()
transaction.commit()
Expand Down
16 changes: 15 additions & 1 deletion pr_services/credential_system/task_manager.py
Original file line number Diff line number Diff line change
Expand Up @@ -19,6 +19,7 @@ class TaskManager(ObjectManager):
'min': 'get_general',
'max': 'get_general',
'name': 'get_general',
'organization': 'get_foreign_key',
'prerequisite_tasks': 'get_many_to_many',
'prevent_duplicate_assignments': 'get_general',
'remaining_capacity': 'get_general',
Expand All @@ -37,6 +38,7 @@ class TaskManager(ObjectManager):
'min': 'set_general',
'max': 'set_general',
'name': 'set_general',
'organization': 'set_foreign_key',
'prerequisite_tasks': 'set_many',
'prevent_duplicate_assignments': 'set_general',
'remaining_capacity': 'set_general',
Expand All @@ -55,7 +57,8 @@ def __init__(self):
self.my_django_model = facade.models.Task

@service_method
def create(self, auth_token, name, description, prerequisite_tasks=None):
def create(self, auth_token, name, description, organization,
prerequisite_tasks=None):
"""
Create a new task
Expand Down Expand Up @@ -88,4 +91,15 @@ def _set_optional_attributes(self, task, optional_attributes):
setattr(task, attr, optional_attributes[attr])
return task

def _infer_task_organization(self, auth_token, organization_id=None):
if not organization_id:
user_orgs = auth_token.user.organizations.all()
if len(user_orgs) != 1:
raise ValueError("Task creator must specify an "
"organization_id for an organization to which "
"he belongs")
return user_orgs[0]

return self._find_by_id(organization_id, facade.models.Organization)

# vim:tabstop=4 shiftwidth=4 expandtab
15 changes: 12 additions & 3 deletions pr_services/event_system/session_user_role_requirement_manager.py
Original file line number Diff line number Diff line change
Expand Up @@ -54,9 +54,18 @@ def create(self, auth_token, session_id, session_user_role_id, min, max,
if credential_type_ids is None:
credential_type_ids = []

session = self._find_by_id(session_id, facade.models.Session)
session_user_role = self._find_by_id(session_user_role_id, facade.models.SessionUserRole)
new_surr = self.my_django_model(session=session, session_user_role=session_user_role, min=min, max=max)
session = self._find_by_id(session_id,
facade.models.Session)
session_user_role = self._find_by_id(session_user_role_id,
facade.models.SessionUserRole)
org = self._infer_task_organization(auth_token,
session.event.organization.id)
new_surr = self.my_django_model(
organization=org,
session=session,
session_user_role=session_user_role,
min=min,
max=max)
new_surr.save()
if credential_type_ids:
facade.subsystems.Setter(auth_token, self, new_surr,
Expand Down
25 changes: 18 additions & 7 deletions pr_services/exam_system/exam_manager.py
Original file line number Diff line number Diff line change
Expand Up @@ -4,19 +4,22 @@

__docformat__ = "restructuredtext en"

# Python
import codecs
from decimal import Decimal
from cStringIO import StringIO
import xml.dom.minidom
import xml.etree.cElementTree as elementtree

from cStringIO import StringIO
from decimal import Decimal

# PowerReg
from pr_services.credential_system.task_manager import TaskManager
from pr_services.rpc.service import service_method
import facade
from pr_services.utils import Utils

import facade
facade.import_models(locals())


class ExamManager(TaskManager):
"""
Manage exams in the Power Reg system.
Expand Down Expand Up @@ -45,7 +48,8 @@ def __init__(self):
self.my_django_model = facade.models.Exam

@service_method
def create(self, auth_token, name, title=None, optional_parameters=None):
def create(self, auth_token, name, title=None, organization=None,
optional_parameters=None):
"""
Create a new exam.
Expand All @@ -67,7 +71,11 @@ def create(self, auth_token, name, title=None, optional_parameters=None):
if optional_parameters is None:
optional_parameters = {}

e = self.my_django_model(name=name, title=title)
organization = self._infer_task_organization(auth_token, organization)
e = self.my_django_model(
name=name,
title=title,
organization=organization)
e.save()
if optional_parameters:
facade.subsystems.Setter(auth_token, self, e, optional_parameters)
Expand Down Expand Up @@ -118,7 +126,9 @@ def add_string_from_child(element, tag_name, django_model_instance,
exam = elementtree.fromstring(raw_text)
assert exam.tag == namespace_prefix + 'exam'
assert exam.attrib.has_key('id')
new_exam = self.my_django_model.objects.create(name=exam.attrib['id'])
organization = Organization.objects.get(name=exam.attrib['organization'])
new_exam = self.my_django_model.objects.create(name=exam.attrib['id'],
organization=organization)
exam.attrib['pk'] = str(new_exam.pk)
add_attribute(exam, 'title', new_exam, 'title')
add_attribute(exam, 'passing_score', new_exam, 'passing_score', int_or_none)
Expand Down Expand Up @@ -240,6 +250,7 @@ def add_subelement(xml_element, xml_subelement_tag, django_object,
if include_pk:
add_attribute(exam, 'pk', exam_obj, 'id')
add_attribute(exam, 'id', exam_obj, 'name')
add_attribute(exam, 'organization', exam_obj, 'organization', lambda o: o.name)
add_attribute(exam, 'title', exam_obj, 'title')
add_attribute(exam, 'passing_score', exam_obj, 'passing_score')
add_attribute(exam, 'version_id', exam_obj, 'version_id')
Expand Down
5 changes: 5 additions & 0 deletions pr_services/exam_system/exam_schema.xml
Original file line number Diff line number Diff line change
Expand Up @@ -7,6 +7,11 @@
<param name="maxLength">255</param>
</data>
</attribute>
<attribute name="organization">
<data type="string">
<param name="maxLength">127</param>
</data>
</attribute>
<zeroOrMore>
<element name="question_pool">
<zeroOrMore>
Expand Down
5 changes: 3 additions & 2 deletions pr_services/exam_system/tests.py
Original file line number Diff line number Diff line change
Expand Up @@ -32,7 +32,8 @@ def _create_any(self, model_class, **kwargs):

def _create_exam(self, **kwargs):
"""Helper method to create an exam."""
return self._create_any(facade.models.Exam, **kwargs)
return self._create_any(facade.models.Exam,
organization_id=self.organization1.id, **kwargs)

def _create_question_pool(self, exam, **kwargs):
"""Helper method to create a question pool."""
Expand Down Expand Up @@ -1103,7 +1104,7 @@ def test_exam_session_survey(self):
class TestEvaluations(GeneralTestCase):
def test_all(self):
evaluation = facade.models.Exam.objects.create(name='eval',
title='Eval')
title='Eval', organization=self.organization1)
qp = facade.models.QuestionPool.objects.create(exam=evaluation,
title='Evaluation')
q1 = facade.models.Question.objects.create(question_pool=qp,
Expand Down
2 changes: 2 additions & 0 deletions pr_services/migrations/0001_initial.py
Original file line number Diff line number Diff line change
Expand Up @@ -209,6 +209,7 @@ def forwards(self, orm):
('create_timestamp', self.gf('django.db.models.fields.DateTimeField')(auto_now_add=True, blank=True)),
('save_timestamp', self.gf('django.db.models.fields.DateTimeField')(auto_now=True, blank=True)),
('owner', self.gf('pr_services.fields.PRForeignKey')(related_name='owned_tasks', null=True, to=orm['pr_services.User'])),
('organization', self.gf('django.db.models.fields.related.ForeignKey')(related_name='tasks', to=orm['pr_services.Organization'])),
('description', self.gf('django.db.models.fields.TextField')()),
('name', self.gf('django.db.models.fields.CharField')(max_length=255)),
('title', self.gf('django.db.models.fields.CharField')(max_length=191, null=True)),
Expand Down Expand Up @@ -3089,6 +3090,7 @@ def backwards(self, orm):
'max': ('django.db.models.fields.PositiveIntegerField', [], {'null': 'True'}),
'min': ('django.db.models.fields.PositiveIntegerField', [], {'default': '0'}),
'name': ('django.db.models.fields.CharField', [], {'max_length': '255'}),
'organization': ('django.db.models.fields.related.ForeignKey', [], {'related_name': "'tasks'", 'to': "orm['pr_services.Organization']"}),
'owner': ('pr_services.fields.PRForeignKey', [], {'related_name': "'owned_tasks'", 'null': 'True', 'to': "orm['pr_services.User']"}),
'prerequisite_achievements': ('django.db.models.fields.related.ManyToManyField', [], {'related_name': "'yielded_tasks'", 'symmetrical': 'False', 'to': "orm['pr_services.Achievement']"}),
'prerequisite_tasks': ('django.db.models.fields.related.ManyToManyField', [], {'related_name': "'yielded_tasks'", 'symmetrical': 'False', 'to': "orm['pr_services.Task']"}),
Expand Down
1 change: 1 addition & 0 deletions pr_services/pr_models.py
Original file line number Diff line number Diff line change
Expand Up @@ -817,6 +817,7 @@ class Task(OwnedPRModel, Versionable):
"""
users = models.ManyToManyField('User', through='Assignment', related_name='tasks')
organization = models.ForeignKey('Organization', related_name='tasks')
description = models.TextField()
name = models.CharField(max_length=255)
title = models.CharField(max_length=191, null=True)
Expand Down
Loading

0 comments on commit 264b1b9

Please sign in to comment.