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

Introduced permission systems for see_agreements and edit_agreements, and...

Introduced permission systems for see_agreements and edit_agreements, and started refactoring permissions tests
parent 32e7e1f1
...@@ -231,6 +231,29 @@ class PersonVisitorPermissions(object): ...@@ -231,6 +231,29 @@ class PersonVisitorPermissions(object):
return True return True
@cached_property
def _can_see_agreements(self):
"""
Visitor can see SC/DFSG/DMUP agreements
"""
if self.visitor is None: return False
if self.visitor.is_admin: return True
if self.person.pending: return False
if self.visitor.pk == self.person.pk: return True
return self._is_current_advocate or self._is_current_am
@cached_property
def _can_edit_agreements(self):
"""
Visitor can edit SC/DFSG/DMUP agreements
"""
if self.visitor is None: return False
if self._has_ldap_record: return False
if self.visitor.is_admin: return True
if self.person.pending: return False
if self.visitor.pk == self.person.pk: return True
return False
@cached_property @cached_property
def _can_view_person_audit_log(self): def _can_view_person_audit_log(self):
""" """
...@@ -260,6 +283,8 @@ class PersonVisitorPermissions(object): ...@@ -260,6 +283,8 @@ class PersonVisitorPermissions(object):
if self._can_update_keycheck: res.add("update_keycheck") if self._can_update_keycheck: res.add("update_keycheck")
if self._can_edit_ldap_fields: res.add("edit_ldap") if self._can_edit_ldap_fields: res.add("edit_ldap")
if self._can_view_person_audit_log: res.add("view_person_audit_log") if self._can_view_person_audit_log: res.add("view_person_audit_log")
if self._can_see_agreements: res.add("see_agreements")
if self._can_edit_agreements: res.add("edit_agreements")
return res return res
@cached_property @cached_property
...@@ -525,16 +550,26 @@ class Person(PermissionsMixin, models.Model): ...@@ -525,16 +550,26 @@ class Person(PermissionsMixin, models.Model):
def has_usable_password(self): def has_usable_password(self):
return False return False
@property
def fingerprint(self):
"""
Return the Fingerprint associated to this person, or None if there is
none
"""
# If there is more than one active fingerprint, return a random one.
# This should not happen, and a nightly maintenance task will warn if
# it happens.
for f in self.fprs.filter(is_active=True):
return f
return None
@property @property
def fpr(self): def fpr(self):
""" """
Return the current fingerprint for this Person Return the current fingerprint for this Person
""" """
# If there is more than one active fields, return a random one. This f = self.fingerprint
# should not happen, and a nightly maintenance task will warn if it if f is not None: return f.fpr
# happens.
for f in self.fprs.filter(is_active=True):
return f.fpr
return None return None
USERNAME_FIELD = 'username' USERNAME_FIELD = 'username'
...@@ -795,6 +830,12 @@ class Fingerprint(models.Model): ...@@ -795,6 +830,12 @@ class Fingerprint(models.Model):
def __unicode__(self): def __unicode__(self):
return self.fpr return self.fpr
@property
def agreement_status(self):
if self.endorsement_valid: return "verified"
if self.endorsement: return "unverified"
return "missing"
def get_key(self): def get_key(self):
from keyring.models import Key from keyring.models import Key
return Key.objects.get_or_download(self.fpr) return Key.objects.get_or_download(self.fpr)
......
This diff is collapsed.
...@@ -72,7 +72,10 @@ class NamedObjects(dict): ...@@ -72,7 +72,10 @@ class NamedObjects(dict):
# FIXME: when we get Django 1.8, we can just do # FIXME: when we get Django 1.8, we can just do
# for o in self.values(): o.refresh_from_db() # for o in self.values(): o.refresh_from_db()
for name, o in list(self.items()): for name, o in list(self.items()):
self[name] = self._model.objects.get(pk=o.pk) try:
self[name] = self._model.objects.get(pk=o.pk)
except self._model.DoesNotExist:
del self[name]
def delete_all(self): def delete_all(self):
""" """
...@@ -202,10 +205,7 @@ class TestBase(object): ...@@ -202,10 +205,7 @@ class TestBase(object):
self.fail("{} dit not match any in {}".format(regex, repr(errors))) self.fail("{} dit not match any in {}".format(regex, repr(errors)))
class PersonFixtureMixin(TestBase): class BaseFixtureMixin(TestBase):
"""
Pre-create some persons
"""
@classmethod @classmethod
def get_persons_defaults(cls): def get_persons_defaults(cls):
""" """
...@@ -222,12 +222,39 @@ class PersonFixtureMixin(TestBase): ...@@ -222,12 +222,39 @@ class PersonFixtureMixin(TestBase):
@classmethod @classmethod
def setUpClass(cls): def setUpClass(cls):
super(PersonFixtureMixin, cls).setUpClass() super(BaseFixtureMixin, cls).setUpClass()
cls.persons = TestPersons(**cls.get_persons_defaults()) cls.persons = TestPersons(**cls.get_persons_defaults())
cls.processes = TestProcesses(**cls.get_processes_defaults()) cls.processes = TestProcesses(**cls.get_processes_defaults())
cls.ams = NamedObjects(AM) cls.ams = NamedObjects(AM)
cls.keys = TestKeys() cls.keys = TestKeys()
# Preload two keys
cls.keys.create("66B4DFB68CB24EBBD8650BC4F4B4B0CC797EBFAB")
cls.keys.create("1793D6AB75663E6BF104953A634F4BD1E7AD5568")
@classmethod
def tearDownClass(cls):
cls.keys.delete_all()
cls.ams.delete_all()
cls.processes.delete_all()
cls.persons.delete_all()
super(BaseFixtureMixin, cls).tearDownClass()
def setUp(self):
super(BaseFixtureMixin, self).setUp()
self.persons.refresh();
self.processes.refresh();
self.ams.refresh();
self.keys.refresh();
class PersonFixtureMixin(BaseFixtureMixin):
"""
Pre-create some persons
"""
@classmethod
def setUpClass(cls):
super(PersonFixtureMixin, cls).setUpClass()
# pending account # pending account
cls.persons.create("pending", status=const.STATUS_DC, expires=now() + datetime.timedelta(days=1), pending="12345", alioth=True) cls.persons.create("pending", status=const.STATUS_DC, expires=now() + datetime.timedelta(days=1), pending="12345", alioth=True)
# debian contributor # debian contributor
...@@ -248,22 +275,3 @@ class PersonFixtureMixin(TestBase): ...@@ -248,22 +275,3 @@ class PersonFixtureMixin(TestBase):
# dam # dam
dam = cls.persons.create("dam", status=const.STATUS_DD_NU) dam = cls.persons.create("dam", status=const.STATUS_DD_NU)
cls.ams.create("dam", person=dam, is_fd=True, is_dam=True) cls.ams.create("dam", person=dam, is_fd=True, is_dam=True)
# Preload two keys
cls.keys.create("66B4DFB68CB24EBBD8650BC4F4B4B0CC797EBFAB")
cls.keys.create("1793D6AB75663E6BF104953A634F4BD1E7AD5568")
@classmethod
def tearDownClass(cls):
cls.keys.delete_all()
cls.ams.delete_all()
cls.processes.delete_all()
cls.persons.delete_all()
super(PersonFixtureMixin, cls).tearDownClass()
def setUp(self):
super(PersonFixtureMixin, self).setUp()
self.persons.refresh();
self.processes.refresh();
self.ams.refresh();
self.keys.refresh();
...@@ -52,7 +52,7 @@ it without a need of manual validation of its content:</p> ...@@ -52,7 +52,7 @@ it without a need of manual validation of its content:</p>
) | gpg --clearsign ) | gpg --clearsign
</pre> </pre>
<form action="{% url 'fprs_endorsement' key=person.lookup_key fpr=fpr.fpr %}" method="post">{% csrf_token %} <form action="{% url 'fprs_agreement' key=person.lookup_key fpr=fpr.fpr %}" method="post">{% csrf_token %}
{% for hidden in form.hidden_fields %}{{ hidden }}{% endfor %} {% for hidden in form.hidden_fields %}{{ hidden }}{% endfor %}
{% for field in form.visible_fields %} {% for field in form.visible_fields %}
{{ field.label_tag }}<br> {{ field.label_tag }}<br>
......
...@@ -36,7 +36,7 @@ ...@@ -36,7 +36,7 @@
<thead> <thead>
<tr> <tr>
<th>Key</th> <th>Key</th>
<th>SC/DMUP endorsement</th> <th>SC/DFSG/DMUP agreement</th>
<th>Active</th> <th>Active</th>
<th>Actions</th> <th>Actions</th>
</tr> </tr>
...@@ -46,13 +46,10 @@ ...@@ -46,13 +46,10 @@
<tr> <tr>
<td>{{fpr.fpr|fingerprint}}</td> <td>{{fpr.fpr|fingerprint}}</td>
<td> <td>
<a href="{% url 'fprs_endorsement' key=person.lookup_key fpr=fpr.fpr %}"> {% if "edit_agreements" in vperms.perms %}
{% if fpr.endorsement_valid %} <a href="{% url 'fprs_agreement' key=person.lookup_key fpr=fpr.fpr %}">{{fpr.agreement_status}}</a>
valid {% elif "see_agreements" in vperms.perms %}
{% elif fpr.endorsement %} <a href="{% url 'fprs_agreement' key=person.lookup_key fpr=fpr.fpr %}">{{fpr.agreement_status}}</a>
unverified
{% else %}
missing
{% endif %} {% endif %}
</a> </a>
</td> </td>
......
...@@ -199,7 +199,7 @@ class TestEndorsements(PersonFixtureMixin, TestCase): ...@@ -199,7 +199,7 @@ class TestEndorsements(PersonFixtureMixin, TestCase):
def _test_get_success(self, visitor, visited): def _test_get_success(self, visitor, visited):
client = self.make_test_client(visitor) client = self.make_test_client(visitor)
Fingerprint.objects.create(fpr=test_fingerprint1, person=self.persons[visited], is_active=True, audit_skip=True) Fingerprint.objects.create(fpr=test_fingerprint1, person=self.persons[visited], is_active=True, audit_skip=True)
response = client.get(reverse("fprs_endorsement", kwargs={"key": self.persons[visited].lookup_key, "fpr": test_fingerprint1})) response = client.get(reverse("fprs_agreement", kwargs={"key": self.persons[visited].lookup_key, "fpr": test_fingerprint1}))
self.assertEquals(response.status_code, 200) self.assertEquals(response.status_code, 200)
def _test_post_success(self, visitor, visited): def _test_post_success(self, visitor, visited):
...@@ -207,7 +207,7 @@ class TestEndorsements(PersonFixtureMixin, TestCase): ...@@ -207,7 +207,7 @@ class TestEndorsements(PersonFixtureMixin, TestCase):
Fingerprint.objects.create(fpr=test_fingerprint1, person=self.persons[visited], is_active=True, audit_skip=True) Fingerprint.objects.create(fpr=test_fingerprint1, person=self.persons[visited], is_active=True, audit_skip=True)
# Post a signature done with the wrong key # Post a signature done with the wrong key
response = client.post(reverse("fprs_endorsement", kwargs={"key": self.persons[visited].lookup_key, "fpr": test_fingerprint1}), data={"agreement": test_fpr2_signed_valid_text}) response = client.post(reverse("fprs_agreement", kwargs={"key": self.persons[visited].lookup_key, "fpr": test_fingerprint1}), data={"agreement": test_fpr2_signed_valid_text})
self.assertEquals(response.status_code, 200) self.assertEquals(response.status_code, 200)
self.assertFormErrorMatches(response, "form", "agreement", "public key not found") self.assertFormErrorMatches(response, "form", "agreement", "public key not found")
fpr = Fingerprint.objects.get(fpr=test_fingerprint1) fpr = Fingerprint.objects.get(fpr=test_fingerprint1)
...@@ -216,7 +216,7 @@ class TestEndorsements(PersonFixtureMixin, TestCase): ...@@ -216,7 +216,7 @@ class TestEndorsements(PersonFixtureMixin, TestCase):
# Post an invalid signature # Post an invalid signature
text = test_fpr1_signed_valid_text.replace("I agree", "I do not agree") text = test_fpr1_signed_valid_text.replace("I agree", "I do not agree")
response = client.post(reverse("fprs_endorsement", kwargs={"key": self.persons[visited].lookup_key, "fpr": test_fingerprint1}), data={"agreement": text}) response = client.post(reverse("fprs_agreement", kwargs={"key": self.persons[visited].lookup_key, "fpr": test_fingerprint1}), data={"agreement": text})
self.assertEquals(response.status_code, 200) self.assertEquals(response.status_code, 200)
self.assertFormErrorMatches(response, "form", "agreement", "BAD signature from") self.assertFormErrorMatches(response, "form", "agreement", "BAD signature from")
fpr = Fingerprint.objects.get(fpr=test_fingerprint1) fpr = Fingerprint.objects.get(fpr=test_fingerprint1)
...@@ -224,14 +224,14 @@ class TestEndorsements(PersonFixtureMixin, TestCase): ...@@ -224,14 +224,14 @@ class TestEndorsements(PersonFixtureMixin, TestCase):
self.assertEquals(fpr.endorsement_valid, False) self.assertEquals(fpr.endorsement_valid, False)
# Post a valid signature, with an invalid text # Post a valid signature, with an invalid text
response = client.post(reverse("fprs_endorsement", kwargs={"key": self.persons[visited].lookup_key, "fpr": test_fingerprint1}), data={"agreement": test_fpr1_signed_invalid_text}) response = client.post(reverse("fprs_agreement", kwargs={"key": self.persons[visited].lookup_key, "fpr": test_fingerprint1}), data={"agreement": test_fpr1_signed_invalid_text})
self.assertRedirectMatches(response, reverse("fprs_person_list", kwargs={"key": self.persons[visited].lookup_key})) self.assertRedirectMatches(response, reverse("fprs_person_list", kwargs={"key": self.persons[visited].lookup_key}))
fpr = Fingerprint.objects.get(fpr=test_fingerprint1) fpr = Fingerprint.objects.get(fpr=test_fingerprint1)
self.assertEquals(fpr.endorsement, test_fpr1_signed_invalid_text) self.assertEquals(fpr.endorsement, test_fpr1_signed_invalid_text)
self.assertEquals(fpr.endorsement_valid, False) self.assertEquals(fpr.endorsement_valid, False)
# Post a valid signature, with an valid text # Post a valid signature, with an valid text
response = client.post(reverse("fprs_endorsement", kwargs={"key": self.persons[visited].lookup_key, "fpr": test_fingerprint1}), data={"agreement": test_fpr1_signed_valid_text}) response = client.post(reverse("fprs_agreement", kwargs={"key": self.persons[visited].lookup_key, "fpr": test_fingerprint1}), data={"agreement": test_fpr1_signed_valid_text})
self.assertRedirectMatches(response, reverse("fprs_person_list", kwargs={"key": self.persons[visited].lookup_key})) self.assertRedirectMatches(response, reverse("fprs_person_list", kwargs={"key": self.persons[visited].lookup_key}))
fpr = Fingerprint.objects.get(fpr=test_fingerprint1) fpr = Fingerprint.objects.get(fpr=test_fingerprint1)
self.assertEquals(fpr.endorsement, test_fpr1_signed_valid_text) self.assertEquals(fpr.endorsement, test_fpr1_signed_valid_text)
...@@ -240,11 +240,11 @@ class TestEndorsements(PersonFixtureMixin, TestCase): ...@@ -240,11 +240,11 @@ class TestEndorsements(PersonFixtureMixin, TestCase):
def _test_get_forbidden(self, visitor, visited): def _test_get_forbidden(self, visitor, visited):
client = self.make_test_client(visitor) client = self.make_test_client(visitor)
Fingerprint.objects.create(fpr=test_fingerprint1, person=self.persons[visited], is_active=True, audit_skip=True) Fingerprint.objects.create(fpr=test_fingerprint1, person=self.persons[visited], is_active=True, audit_skip=True)
response = client.get(reverse("fprs_endorsement", kwargs={"key": self.persons[visited].lookup_key, "fpr": test_fingerprint1})) response = client.get(reverse("fprs_agreement", kwargs={"key": self.persons[visited].lookup_key, "fpr": test_fingerprint1}))
self.assertPermissionDenied(response) self.assertPermissionDenied(response)
def _test_post_forbidden(self, visitor, visited): def _test_post_forbidden(self, visitor, visited):
client = self.make_test_client(visitor) client = self.make_test_client(visitor)
Fingerprint.objects.create(fpr=test_fingerprint1, person=self.persons[visited], is_active=True, audit_skip=True) Fingerprint.objects.create(fpr=test_fingerprint1, person=self.persons[visited], is_active=True, audit_skip=True)
response = client.post(reverse("fprs_endorsement", kwargs={"key": self.persons[visited].lookup_key, "fpr": test_fingerprint1}), data={"agreement": test_fpr1_signed_valid_text}) response = client.post(reverse("fprs_agreement", kwargs={"key": self.persons[visited].lookup_key, "fpr": test_fingerprint1}), data={"agreement": test_fpr1_signed_valid_text})
self.assertPermissionDenied(response) self.assertPermissionDenied(response)
...@@ -14,5 +14,5 @@ urlpatterns = [ ...@@ -14,5 +14,5 @@ urlpatterns = [
# Activate fingerprints # Activate fingerprints
url(r'^person/(?P<key>[^/]+)/(?P<fpr>[0-9A-F]+)/activate$', views.SetActiveFingerprint.as_view(), name="fprs_person_activate"), url(r'^person/(?P<key>[^/]+)/(?P<fpr>[0-9A-F]+)/activate$', views.SetActiveFingerprint.as_view(), name="fprs_person_activate"),
# Signed endorsement # Signed endorsement
url(r'^person/(?P<key>[^/]+)/(?P<fpr>[0-9A-F]+)/endorsement$', views.Endorsement.as_view(), name="fprs_endorsement"), url(r'^person/(?P<key>[^/]+)/(?P<fpr>[0-9A-F]+)/endorsement$', views.Agreement.as_view(), name="fprs_agreement"),
] ]
...@@ -69,12 +69,12 @@ class SetActiveFingerprint(FingerprintMixin, View): ...@@ -69,12 +69,12 @@ class SetActiveFingerprint(FingerprintMixin, View):
return redirect("fprs_person_list", key=self.person.lookup_key) return redirect("fprs_person_list", key=self.person.lookup_key)
class EndorsementForm(forms.Form): class AgreementForm(forms.Form):
agreement = forms.CharField(label="Agreement", widget=forms.Textarea(attrs={"rows": 25, "cols": 80})) agreement = forms.CharField(label="Agreement", widget=forms.Textarea(attrs={"rows": 25, "cols": 80}))
def __init__(self, *args, **kw): def __init__(self, *args, **kw):
self.fpr = kw.pop("fpr") self.fpr = kw.pop("fpr")
super(EndorsementForm, self).__init__(*args, **kw) super(AgreementForm, self).__init__(*args, **kw)
def clean_agreement(self): def clean_agreement(self):
from keyring.models import Key from keyring.models import Key
...@@ -87,19 +87,14 @@ class EndorsementForm(forms.Form): ...@@ -87,19 +87,14 @@ class EndorsementForm(forms.Form):
return (text, plaintext) return (text, plaintext)
class Endorsement(FingerprintMixin, FormView):
template_name = "fprs/endorsement.html"
form_class = EndorsementForm
require_vperms = "edit_ldap"
def pre_dispatch(self): class Agreement(FingerprintMixin, FormView):
super(Endorsement, self).pre_dispatch() template_name = "fprs/endorsement.html"
# Only the person themselves can edit the agreements form_class = AgreementForm
if self.visitor is None: raise PermissionDenied require_vperms = "edit_agreements"
if self.visitor != self.person and not self.visitor.is_admin: raise PermissionDenied
def get_form_kwargs(self): def get_form_kwargs(self):
kw = super(Endorsement, self).get_form_kwargs() kw = super(Agreement, self).get_form_kwargs()
kw["fpr"] = self.fpr kw["fpr"] = self.fpr
return kw return kw
......
...@@ -126,13 +126,25 @@ See: <a href="http://lists.debian.org/debian-project/2010/09/msg00026.html">hand ...@@ -126,13 +126,25 @@ See: <a href="http://lists.debian.org/debian-project/2010/09/msg00026.html">hand
</td> </td>
</tr> </tr>
<tr><th>Account name</th><td>{{person.uid|default:"none chosen yet"}}</td></tr> <tr><th>Account name</th><td>{{person.uid|default:"none chosen yet"}}</td></tr>
{% with fpr=person.fingerprint %}
<tr> <tr>
<th>OpenPGP fingerprint</th> <th>OpenPGP fingerprint</th>
<td> <td>
{{person.fpr|fingerprint}}{% if "edit_ldap" in vperms.perms %} (<a href="{% url 'fprs_person_list' key=person.lookup_key %}">manage</a>){% endif %} {{fpr.fpr|fingerprint}}{% if "edit_ldap" in vperms.perms %} (<a href="{% url 'fprs_person_list' key=person.lookup_key %}">manage</a>){% endif %}
{% if keycheck %} {% if fpr %}
<small> <small>
<ul class="packed"> <ul class="packed">
<li>
SC/DFSG/DMUP agreeement:
{% if "edit_agreements" in vperms.perms %}
<a href="{% url 'fprs_agreement' key=person.lookup_key fpr=fpr.fpr %}">{{fpr.agreement_status}}</a>
{% elif "see_agreements" in vperms.perms %}
<a href="{% url 'fprs_agreement' key=person.lookup_key fpr=fpr.fpr %}">{{fpr.agreement_status}}</a>
{% else %}
{{fpr.agreement_status}}
{% endif %}
</li>
{% if keycheck %}
<li>Main key: <i>{{keycheck.main.remarks}}</i> (last updated: {{keycheck.updated|date:"Y-m-d H:i T"}}) <li>Main key: <i>{{keycheck.main.remarks}}</i> (last updated: {{keycheck.updated|date:"Y-m-d H:i T"}})
{% if "update_keycheck" in vperms.perms %} {% if "update_keycheck" in vperms.perms %}
<form class="inline" action="{% url 'public_process_update_keycheck' key=process.lookup_key %}" method="POST">{% csrf_token %} <form class="inline" action="{% url 'public_process_update_keycheck' key=process.lookup_key %}" method="POST">{% csrf_token %}
...@@ -143,11 +155,13 @@ See: <a href="http://lists.debian.org/debian-project/2010/09/msg00026.html">hand ...@@ -143,11 +155,13 @@ See: <a href="http://lists.debian.org/debian-project/2010/09/msg00026.html">hand
{% for uid in keycheck.uids %} {% for uid in keycheck.uids %}
<li>{{uid.name}}: <i>{{uid.remarks}}</i>, <i>{{uid.sigs_ok}}</i> DD sigs, <i>{{uid.sigs_no_key}}</i> non-DD sigs</li> <li>{{uid.name}}: <i>{{uid.remarks}}</i>, <i>{{uid.sigs_ok}}</i> DD sigs, <i>{{uid.sigs_no_key}}</i> non-DD sigs</li>
{% endfor %} {% endfor %}
{% endif %}
</ul> </ul>
</small> </small>
{% endif %} {% endif %}
</td> </td>
</tr> </tr>
{% endwith %}
{% if process.manager %} {% if process.manager %}
<tr><th>Manager</th><td><a href="{{process.manager.get_absolute_url}}">{{process.manager.person.uid}}</a></td></tr> <tr><th>Manager</th><td><a href="{{process.manager.get_absolute_url}}">{{process.manager.person.uid}}</a></td></tr>
{% elif process.progress == PROGRESS_APP_OK %} {% elif process.progress == PROGRESS_APP_OK %}
......
...@@ -101,63 +101,6 @@ class PersonTestMixin(NMBasicFixtureMixin, NMTestUtilsMixin): ...@@ -101,63 +101,6 @@ class PersonTestMixin(NMBasicFixtureMixin, NMTestUtilsMixin):
self.visit.visitors_advs_seen.add(u) self.visit.visitors_advs_seen.add(u)
class NoProcessTestCase(PersonTestMixin, TestCase):
"""
Test permissions when each kind of person visits each kind of person, with
no processes involved
"""
def test_pending(self):
with visit(self, "pending"):
self.assertPerms("fd dam", "update_keycheck edit_bio edit_ldap view_person_audit_log")
self.assertPerms("pending dd_nu dd_u", "view_person_audit_log")
def test_dc(self):
with visit(self, "dc"):
self.assertPerms("fd dam dc", "update_keycheck edit_bio edit_ldap view_person_audit_log")
self.assertPerms("dd_nu dd_u", "view_person_audit_log")
self.assertAdvs("fd dam dd_nu dd_u", "dc_ga dm dd_u dd_nu")
self.assertAdvs("dm dm_ga", "dc_ga")
def test_dc_ga(self):
with visit(self, "dc_ga"):
self.assertPerms("fd dam dc_ga", "update_keycheck edit_bio view_person_audit_log")
self.assertPerms("dd_nu dd_u", "view_person_audit_log")
self.assertAdvs("fd dam dd_nu dd_u", "dm_ga dd_u dd_nu")
def test_dm(self):
with visit(self, "dm"):
self.assertPerms("fd dam", "update_keycheck edit_bio edit_ldap view_person_audit_log")
self.assertPerms("dm", "update_keycheck edit_bio edit_ldap view_person_audit_log")
self.assertPerms("dd_nu dd_u", "view_person_audit_log")
self.assertAdvs("fd dam dd_nu dd_u", "dm_ga dd_u dd_nu")
self.assertAdvs("dm dm_ga", "dm_ga")
def test_dm_ga(self):
with visit(self, "dm_ga"):
self.assertPerms("fd dam dm_ga", "update_keycheck edit_bio view_person_audit_log")
self.assertPerms("dd_nu dd_u", "view_person_audit_log")
self.assertAdvs("fd dam dd_nu dd_u", "dd_u dd_nu")
def test_dd_nu(self):
with visit(self, "dd_nu"):
self.assertPerms("fd dam dd_nu", "update_keycheck edit_bio view_person_audit_log")
self.assertPerms("dd_u", "view_person_audit_log")
def test_dd_u(self):
with visit(self, "dd_u"):
self.assertPerms("fd dam dd_u", "update_keycheck edit_bio view_person_audit_log")
self.assertPerms("dd_nu", "view_person_audit_log")
def test_fd(self):
with visit(self, "fd"):
self.assertPerms("fd dam", "update_keycheck edit_bio view_person_audit_log")
self.assertPerms("dd_nu dd_u", "view_person_audit_log")
def test_dam(self):
with visit(self, "dam"):
self.assertPerms("fd dam", "update_keycheck edit_bio view_person_audit_log")
self.assertPerms("dd_nu dd_u", "view_person_audit_log")
class ProcTestMixin(PersonTestMixin): class ProcTestMixin(PersonTestMixin):
applying_as = None applying_as = None
applying_for = None applying_for = None
...@@ -290,152 +233,6 @@ class ProcTestMixin(PersonTestMixin): ...@@ -290,152 +233,6 @@ class ProcTestMixin(PersonTestMixin):
self.assertPermsDone() self.assertPermsDone()
class ProcDcgaAdvDMTestCase(ProcTestMixin, TestCase):
"""
Test all visit combinations for an applicant from dc to dc_ga, with a dm advocate
"""
applying_as = const.STATUS_DC
applying_for = const.STATUS_DC_GA
advocate_status = const.STATUS_DM
def assertAdvsInitial(self):
self.assertAdvs("fd dam am dd_nu dd_u", "dc_ga dm dd_u dd_nu")
self.assertAdvs("adv dm dm_ga", "dc_ga")
def assertAdvsAdv(self):
self.assertAdvs("fd dam am dd_nu dd_u", "dc_ga dm dd_u dd_nu")
self.assertAdvs("dm dm_ga", "dc_ga")
def assertAdvsAdvAM(self):
self.assertAdvs("fd dam dd_nu dd_u", "dc_ga dm dd_u dd_nu")
self.assertAdvs("dm dm_ga", "dc_ga")
self.assertAdvs("am", "dm dd_u dd_nu")
def assertAdvsFDDAM(self):
self.assertAdvs("fd dam am dd_nu dd_u", "dm dd_u dd_nu")
def assertAdvsDone(self):
self.assertAdvs("fd dam am dd_nu dd_u", "dm_ga dd_u dd_nu")
def assertPermsInitial(self):
self.assertPerms("fd dam app", "update_keycheck edit_bio edit_ldap view_person_audit_log")
self.assertPerms("dd_nu dd_u am", "view_person_audit_log")
def assertPermsFDDAM(self):
self.assertPerms("fd dam", "update_keycheck edit_bio edit_ldap view_person_audit_log")
self.assertPerms("app", "update_keycheck edit_bio view_person_audit_log")
self.assertPerms("dd_nu dd_u am", "view_person_audit_log")
def assertPermsDone(self):
self.assertPerms("fd dam app", "update_keycheck edit_bio view_person_audit_log")
self.assertPerms("dd_nu dd_u am", "view_person_audit_log")
class ProcDcgaAdvDDTestCase(ProcTestMixin, TestCase):
"""
Test all visit combinations for an applicant from dc to dc_ga, with a dd advocate
"""
applying_as = const.STATUS_DC
applying_for = const.STATUS_DC_GA
advocate_status = const.STATUS_DD_NU
def assertAdvsInitial(self):
self.assertAdvs("fd dam adv am dd_nu dd_u", "dc_ga dm dd_u dd_nu")
self.assertAdvs("dm dm_ga", "dc_ga")
def assertAdvsAdv(self):
self.assertAdvs("fd dam am dd_nu dd_u", "dc_ga dm dd_u dd_nu")
self.assertAdvs("adv", "dm dd_u dd_nu")
self.assertAdvs("dm dm_ga", "dc_ga")
def assertAdvsAdvAM(self):
self.assertAdvs("fd dam dd_nu dd_u", "dc_ga dm dd_u dd_nu")
self.assertAdvs("dm dm_ga", "dc_ga")
self.assertAdvs("adv am", "dm dd_u dd_nu")
def assertAdvsFDDAM(self):
self.assertAdvs("fd dam adv am dd_nu dd_u", "dm dd_u dd_nu")
def assertAdvsDone(self):
self.assertAdvs("fd dam adv am dd_nu dd_u", "dm_ga dd_u dd_nu")
class ProcDmgaAdvDMTestCase(ProcTestMixin, TestCase):
"""
Test all visit combinations for an applicant from dm to dm_ga, with a dm advocate
"""
applying_as = const.STATUS_DM
applying_for = const.STATUS_DM_GA
advocate_status = const.STATUS_DM
def assertAdvsInitial(self):
self.assertAdvs("fd dam am dd_nu dd_u", "dm_ga dd_u dd_nu")
self.assertAdvs("app adv dm dm_ga", "dm_ga")
def assertAdvsAdv(self):
self.assertAdvs("fd dam am dd_nu dd_u", "dm_ga dd_u dd_nu")
self.assertAdvs("app dm dm_ga", "dm_ga")
def assertAdvsAdvAM(self):
self.assertAdvs("fd dam dd_nu dd_u", "dm_ga dd_u dd_nu")
self.assertAdvs("app dm dm_ga", "dm_ga")
self.assertAdvs("am", "dd_u dd_nu")
def assertAdvsFDDAM(self):
self.assertAdvs("fd dam am dd_nu dd_u", "dd_u dd_nu")
def assertAdvsDone(self):
self.assertAdvs("fd dam am dd_nu dd_u", "dd_u dd_nu")
def assertPermsInitial(self):
self.assertPerms("fd dam app", "update_keycheck edit_bio edit_ldap view_person_audit_log")
self.assertPerms("dd_nu dd_u am", "view_person_audit_log")
def assertPermsFDDAM(self):
self.assertPerms("fd dam", "update_keycheck edit_bio edit_ldap view_person_audit_log")
self.assertPerms("app", "update_keycheck edit_bio view_person_audit_log")
self.assertPerms("dd_nu dd_u am", "view_person_audit_log")
def assertPermsDone(self):
self.assertPerms("fd dam app", "update_keycheck edit_bio view_person_audit_log")
self.assertPerms("dd_nu dd_u am", "view_person_audit_log")
class ProcDmgaAdvDDTestCase(ProcTestMixin, TestCase):
"""
Test all visit combinations for an applicant from dc to dc_ga, with a dd advocate
"""
applying_as = const.STATUS_DM
applying_for = const.STATUS_DM_GA
advocate_status = const.STATUS_DD_NU
def assertAdvsInitial(self):
self.assertAdvs("fd dam adv am dd_nu dd_u", "dm_ga dd_u dd_nu")
self.assertAdvs("app dm dm_ga", "dm_ga")
def assertAdvsAdv(self):
self.assertAdvs("fd dam am dd_nu dd_u", "dm_ga dd_u dd_nu")
self.assertAdvs("adv", "dd_u dd_nu")
self.assertAdvs("app dm dm_ga", "dm_ga")
def assertAdvsAdvAM(self):
self.assertAdvs("fd dam dd_nu dd_u", "dm_ga dd_u dd_nu")
self.assertAdvs("app dm dm_ga", "dm_ga")
self.assertAdvs("adv am", "dd_u dd_nu")
def assertAdvsFDDAM(self):
self.assertAdvs("fd dam adv am dd_nu dd_u", "dd_u dd_nu")
def assertAdvsDone(self):
self.assertAdvs("fd dam adv am dd_nu dd_u", "dd_u dd_nu")
class ProcDMTestCase(ProcTestMixin, TestCase):
"""
Test all visit combinations for an applicant from dc to dc_ga, with a dd advocate
"""
applying_as = const.STATUS_DC
applying_for = const.STATUS_DM
advocate_status = const.STATUS_DD_NU
def assertAdvsInitial(self):
self.assertAdvs("fd dam adv am dd_nu dd_u", "dc_ga dm dd_u dd_nu")
self.assertAdvs("dm dm_ga", "dc_ga")
def assertAdvsAdv(self):
self.assertAdvs("fd dam am dd_nu dd_u", "dc_ga dm dd_u dd_nu")
self.assertAdvs("dm dm_ga", "dc_ga")
self.assertAdvs("adv", "dc_ga dd_u dd_nu")
def assertAdvsAdvAM(self):
self.assertAdvs("fd dam dd_nu dd_u", "dc_ga dm dd_u dd_nu")
self.assertAdvs("dm dm_ga", "dc_ga")
self.assertAdvs("adv am", "dc_ga dd_u dd_nu")
def assertAdvsFDDAM(self):
self.assertAdvs("fd dam adv am dd_nu dd_u", "dc_ga dd_u dd_nu")
self.assertAdvs("dm dm_ga", "dc_ga")
def assertAdvsDone(self):
self.assertAdvs("fd dam adv am dd_nu dd_u", "dm_ga dd_u dd_nu")
self.assertAdvs("app dm dm_ga", "dm_ga")
def assertPermsDone(self):
self.assertPerms("fd dam app", "update_keycheck edit_bio edit_ldap view_person_audit_log")
self.assertPerms("adv dd_nu dd_u am", "view_person_audit_log")
class ProcDcDdnuTestCase(ProcTestMixin, TestCase): class ProcDcDdnuTestCase(ProcTestMixin, TestCase):
""" """
Test all visit combinations for an applicant from dc to dd_nu, with dd_nu advocate Test all visit combinations for an applicant from dc to dd_nu, with dd_nu advocate
......
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