Commit b01c8aa3 authored by Enrico Zini's avatar Enrico Zini
Browse files

Tested process_assign_am

parent fb6d5d4b
...@@ -37,6 +37,7 @@ class ProcessVisitorPermissions(bmodels.PersonVisitorPermissions): ...@@ -37,6 +37,7 @@ class ProcessVisitorPermissions(bmodels.PersonVisitorPermissions):
self.process_frozen = self.process.frozen_by is not None self.process_frozen = self.process.frozen_by is not None
self.process_approved = self.process.approved_by is not None self.process_approved = self.process.approved_by is not None
self.process_has_am_ok = self.process.requirements.filter(type="am_ok").exists()
self.current_am_assignment = self.process.current_am_assignment self.current_am_assignment = self.process.current_am_assignment
if self.current_am_assignment is not None: if self.current_am_assignment is not None:
self.is_current_am = self.current_am_assignment.am.person == self.visitor self.is_current_am = self.current_am_assignment.am.person == self.visitor
...@@ -54,6 +55,11 @@ class ProcessVisitorPermissions(bmodels.PersonVisitorPermissions): ...@@ -54,6 +55,11 @@ class ProcessVisitorPermissions(bmodels.PersonVisitorPermissions):
if not self.process.closed: if not self.process.closed:
if not self.process_frozen: if not self.process_frozen:
self.add("proc_freeze") self.add("proc_freeze")
if self.process_has_am_ok:
if self.current_am_assignment:
self.add("am_unassign")
else:
self.add("am_assign")
elif self.process_approved: elif self.process_approved:
self.add("proc_unapprove") self.add("proc_unapprove")
else: else:
...@@ -72,6 +78,8 @@ class ProcessVisitorPermissions(bmodels.PersonVisitorPermissions): ...@@ -72,6 +78,8 @@ class ProcessVisitorPermissions(bmodels.PersonVisitorPermissions):
if self.is_current_am: if self.is_current_am:
self.add("fd_comments") self.add("fd_comments")
self.add("view_private_log") self.add("view_private_log")
if not self.process_frozen:
self.add("am_unassign")
class RequirementVisitorPermissions(ProcessVisitorPermissions): class RequirementVisitorPermissions(ProcessVisitorPermissions):
......
# coding: utf8
from __future__ import print_function
from __future__ import absolute_import
from __future__ import division
from __future__ import unicode_literals
from django.test import TestCase
from django.core.urlresolvers import reverse
from django.utils.timezone import now
from backend import const
from backend import models as bmodels
from backend.unittest import PersonFixtureMixin
import process.models as pmodels
from mock import patch
from .common import ProcessFixtureMixin
class TestProcessAMAssign(ProcessFixtureMixin, TestCase):
@classmethod
def setUpClass(cls):
super(TestProcessAMAssign, cls).setUpClass()
cls.persons.create("app", status=const.STATUS_DC)
cls.processes.create("app", person=cls.persons.app, applying_for=const.STATUS_DD_U, fd_comment="test")
cls.persons.create("am", status=const.STATUS_DD_NU)
cls.ams.create("am", person=cls.persons.am)
cls.visitor = cls.persons.dc
def test_success(self):
with patch.object(pmodels.Requirement, "permissions_of", return_value={"am_assign"}):
client = self.make_test_client(self.visitor)
response = client.get(reverse("process_assign_am", args=[self.processes.app.pk]))
self.assertEqual(response.status_code, 200)
self.processes.app.refresh_from_db()
self.assertIsNone(self.processes.app.current_am_assignment)
response = client.post(reverse("process_assign_am", args=[self.processes.app.pk]), data={"am": self.persons.am.lookup_key})
self.assertRedirectMatches(response, reverse("process_req_am_ok", args=[self.processes.app.pk]))
self.processes.app.refresh_from_db()
assignment = self.processes.app.current_am_assignment
self.assertIsNotNone(assignment)
self.assertEqual(assignment.process, self.processes.app)
self.assertEqual(assignment.am, self.ams.am)
self.assertEqual(assignment.paused, False)
self.assertEqual(assignment.assigned_by, self.visitor)
self.assertIsNotNone(assignment.assigned_time)
self.assertIsNone(assignment.unassigned_by)
self.assertIsNone(assignment.unassigned_time)
def test_forbidden(self):
with patch.object(pmodels.Requirement, "permissions_of", return_value=set()):
client = self.make_test_client(self.visitor)
response = client.get(reverse("process_assign_am", args=[self.processes.app.pk]))
self.assertPermissionDenied(response)
self.processes.app.refresh_from_db()
self.assertIsNone(self.processes.app.current_am_assignment)
response = client.post(reverse("process_assign_am", args=[self.processes.app.pk]), data={"am": self.persons.am.lookup_key})
self.assertPermissionDenied(response)
self.processes.app.refresh_from_db()
self.assertIsNone(self.processes.app.current_am_assignment)
...@@ -27,7 +27,7 @@ class ProcExpected(object): ...@@ -27,7 +27,7 @@ class ProcExpected(object):
self.proc.set("app dd_nu dd_u activeam fd dam", "update_keycheck view_person_audit_log") self.proc.set("app dd_nu dd_u activeam fd dam", "update_keycheck view_person_audit_log")
self.proc.patch("activeam fd dam app", "+edit_bio +edit_ldap +view_mbox +view_private_log") self.proc.patch("activeam fd dam app", "+edit_bio +edit_ldap +view_mbox +view_private_log")
self.proc.patch("fd dam app", "+request_new_status") self.proc.patch("fd dam app", "+request_new_status")
self.proc.patch("fd dam", "+proc_freeze +fd_comments") self.proc.patch("fd dam", "+proc_freeze +fd_comments +am_assign")
self.proc.patch("dc dc_ga dm dm_ga dd_nu dd_u dd_e dd_r activeam fd dam app", "+add_log") self.proc.patch("dc dc_ga dm dm_ga dd_nu dd_u dd_e dd_r activeam fd dam app", "+add_log")
self.intent.patch("fd dam app", "+edit_statements") self.intent.patch("fd dam app", "+edit_statements")
self.intent.patch("activeam fd dam dd_nu dd_u", "+req_approve") self.intent.patch("activeam fd dam dd_nu dd_u", "+req_approve")
...@@ -46,12 +46,13 @@ class ProcExpected(object): ...@@ -46,12 +46,13 @@ class ProcExpected(object):
self.am_ok.patch("fd dam", "+edit_statements +req_approve") self.am_ok.patch("fd dam", "+edit_statements +req_approve")
def patch_generic_process_am_assigned(self): def patch_generic_process_am_assigned(self):
self.proc.patch("am", "+fd_comments") self.proc.patch("fd dam", "-am_assign +am_unassign")
self.proc.patch("am", "+fd_comments +am_unassign")
self.am_ok.patch("am", "+edit_statements") self.am_ok.patch("am", "+edit_statements")
self.am_ok.patch("activeam", "+req_approve") self.am_ok.patch("activeam", "+req_approve")
def patch_generic_process_frozen(self): def patch_generic_process_frozen(self):
self.proc.patch("fd dam", "-proc_freeze +proc_unfreeze +proc_approve") self.proc.patch("fd dam", "-proc_freeze +proc_unfreeze +proc_approve -am_assign -am_unassign")
self.proc.patch("activeam app", "-edit_bio -edit_ldap") self.proc.patch("activeam app", "-edit_bio -edit_ldap")
self.intent.patch("app", "-edit_statements") self.intent.patch("app", "-edit_statements")
self.intent.patch("activeam dd_nu dd_u", "-req_approve") self.intent.patch("activeam dd_nu dd_u", "-req_approve")
...@@ -63,7 +64,7 @@ class ProcExpected(object): ...@@ -63,7 +64,7 @@ class ProcExpected(object):
if self.keycheck is not None: if self.keycheck is not None:
pass pass
if self.am_ok is not None: if self.am_ok is not None:
self.proc.patch("am", "-edit_bio -edit_ldap") self.proc.patch("am", "-edit_bio -edit_ldap -am_unassign")
self.intent.patch("am", "-req_approve") self.intent.patch("am", "-req_approve")
self.sc_dmup.patch("am", "-req_approve") self.sc_dmup.patch("am", "-req_approve")
self.advocate.patch("am", "-edit_statements -req_approve") self.advocate.patch("am", "-edit_statements -req_approve")
...@@ -157,7 +158,7 @@ class TestVisitApplicant(ProcessFixtureMixin, TestCase): ...@@ -157,7 +158,7 @@ class TestVisitApplicant(ProcessFixtureMixin, TestCase):
self.processes.create("app", person=self.persons.app, applying_for=const.STATUS_DC_GA) self.processes.create("app", person=self.persons.app, applying_for=const.STATUS_DC_GA)
expected.patch_generic_process_started() expected.patch_generic_process_started()
expected.starts.patch("-dc_ga") expected.starts.patch("-dc_ga")
expected.proc.patch("fd dam", "+edit_ldap") expected.proc.patch("fd dam", "+edit_ldap -am_assign")
expected.proc.patch("app", "+edit_ldap") expected.proc.patch("app", "+edit_ldap")
expected.advocate.patch("dm dm_ga", "+edit_statements") expected.advocate.patch("dm dm_ga", "+edit_statements")
self.assertPerms(expected) self.assertPerms(expected)
...@@ -195,7 +196,7 @@ class TestVisitApplicant(ProcessFixtureMixin, TestCase): ...@@ -195,7 +196,7 @@ class TestVisitApplicant(ProcessFixtureMixin, TestCase):
self.processes.create("app", person=self.persons.app, applying_for=const.STATUS_DM_GA) self.processes.create("app", person=self.persons.app, applying_for=const.STATUS_DM_GA)
expected.patch_generic_process_started() expected.patch_generic_process_started()
expected.starts.patch("-dm_ga") expected.starts.patch("-dm_ga")
expected.proc.patch("fd dam", "+edit_ldap") expected.proc.patch("fd dam", "+edit_ldap -am_assign")
expected.proc.patch("app", "+edit_ldap") expected.proc.patch("app", "+edit_ldap")
self.assertPerms(expected) self.assertPerms(expected)
...@@ -230,7 +231,7 @@ class TestVisitApplicant(ProcessFixtureMixin, TestCase): ...@@ -230,7 +231,7 @@ class TestVisitApplicant(ProcessFixtureMixin, TestCase):
self.processes.create("app", person=self.persons.app, applying_for=const.STATUS_DM) self.processes.create("app", person=self.persons.app, applying_for=const.STATUS_DM)
expected.patch_generic_process_started() expected.patch_generic_process_started()
expected.starts.patch("-dm") expected.starts.patch("-dm")
expected.proc.patch("fd dam", "+edit_ldap") expected.proc.patch("fd dam", "+edit_ldap -am_assign")
expected.proc.patch("app", "+edit_ldap") expected.proc.patch("app", "+edit_ldap")
self.assertPerms(expected) self.assertPerms(expected)
......
...@@ -144,7 +144,3 @@ class TestProcessStatementRaw(ProcessFixtureMixin, TestCase): ...@@ -144,7 +144,3 @@ class TestProcessStatementRaw(ProcessFixtureMixin, TestCase):
response = client.get(reverse("process_statement_raw", args=[self.processes.app.pk, req_type, statement.pk])) response = client.get(reverse("process_statement_raw", args=[self.processes.app.pk, req_type, statement.pk]))
self.assertEqual(response.status_code, 200) self.assertEqual(response.status_code, 200)
self.assertEqual(response.content, test_fpr1_signed_valid_text) self.assertEqual(response.content, test_fpr1_signed_valid_text)
# TODO: url(r'^(?P<pk>\d+)/(?P<type>[^/]+)/statement/create$', views.StatementCreate.as_view(), name="process_statement_create"),
# TODO: url(r'^(?P<pk>\d+)/(?P<type>[^/]+)/statement/(?P<st>\d+)/delete$', views.StatementDelete.as_view(), name="process_statement_delete"),
# TODO: url(r'^(?P<pk>\d+)/(?P<type>[^/]+)/statement/(?P<st>\d+)/raw$', views.StatementRaw.as_view(), name="process_statement_raw"),
...@@ -20,7 +20,7 @@ urlpatterns = [ ...@@ -20,7 +20,7 @@ urlpatterns = [
url(r'^(?P<pk>\d+)/(?P<type>[^/]+)/statement/create$', views.StatementCreate.as_view(), name="process_statement_create"), url(r'^(?P<pk>\d+)/(?P<type>[^/]+)/statement/create$', views.StatementCreate.as_view(), name="process_statement_create"),
url(r'^(?P<pk>\d+)/(?P<type>[^/]+)/statement/(?P<st>\d+)/delete$', views.StatementDelete.as_view(), name="process_statement_delete"), url(r'^(?P<pk>\d+)/(?P<type>[^/]+)/statement/(?P<st>\d+)/delete$', views.StatementDelete.as_view(), name="process_statement_delete"),
url(r'^(?P<pk>\d+)/(?P<type>[^/]+)/statement/(?P<st>\d+)/raw$', views.StatementRaw.as_view(), name="process_statement_raw"), url(r'^(?P<pk>\d+)/(?P<type>[^/]+)/statement/(?P<st>\d+)/raw$', views.StatementRaw.as_view(), name="process_statement_raw"),
url(r'^(?P<pk>\d+)/assign_am$', views.AssignAM.as_view(), name="process_assign_am"), # TODO: test url(r'^(?P<pk>\d+)/assign_am$', views.AssignAM.as_view(), name="process_assign_am"),
url(r'^(?P<pk>\d+)/unassign_am$', views.UnassignAM.as_view(), name="process_unassign_am"), # TODO: test url(r'^(?P<pk>\d+)/unassign_am$', views.UnassignAM.as_view(), name="process_unassign_am"), # TODO: test
url(r'^(?P<pk>\d+)/mailbox/download$', views.MailArchive.as_view(), name="process_mailbox_download"), # TODO: test url(r'^(?P<pk>\d+)/mailbox/download$', views.MailArchive.as_view(), name="process_mailbox_download"), # TODO: test
url(r'^(?P<pk>\d+)/mailbox$', views.DisplayMailArchive.as_view(), name="process_mailbox_show"), # TODO: test url(r'^(?P<pk>\d+)/mailbox$', views.DisplayMailArchive.as_view(), name="process_mailbox_show"), # TODO: test
......
...@@ -209,6 +209,7 @@ class ReqAM(RequirementMixin, TemplateView): ...@@ -209,6 +209,7 @@ class ReqAM(RequirementMixin, TemplateView):
class AssignAM(RequirementMixin, TemplateView): class AssignAM(RequirementMixin, TemplateView):
require_visit_perms = "am_assign"
type = "am_ok" type = "am_ok"
template_name = "process/assign_am.html" template_name = "process/assign_am.html"
...@@ -246,6 +247,7 @@ class AssignAM(RequirementMixin, TemplateView): ...@@ -246,6 +247,7 @@ class AssignAM(RequirementMixin, TemplateView):
class UnassignAM(RequirementMixin, View): class UnassignAM(RequirementMixin, View):
require_visit_perms = "am_unassign"
type = "am_ok" type = "am_ok"
def post(self, request, *args, **kw): def post(self, request, *args, **kw):
current = self.process.current_am_assignment current = self.process.current_am_assignment
......
Supports Markdown
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