chore(): switched all fields in contract to snake_case and linting improvements
This commit is contained in:
@@ -1,3 +1,5 @@
|
||||
from typing import override
|
||||
|
||||
from django.contrib import admin
|
||||
from django.utils.translation import gettext_lazy as _
|
||||
|
||||
@@ -34,11 +36,13 @@ class ReviewSettingsAdmin(admin.ModelAdmin):
|
||||
),
|
||||
)
|
||||
|
||||
@override
|
||||
def has_add_permission(self, request) -> bool:
|
||||
if ReviewSettings.objects.exists():
|
||||
return False
|
||||
return super().has_add_permission(request)
|
||||
|
||||
@override
|
||||
def has_delete_permission(self, request, obj=None) -> bool:
|
||||
return False
|
||||
|
||||
|
||||
@@ -0,0 +1,18 @@
|
||||
# Generated by Django 5.2.11 on 2026-02-12 18:41
|
||||
|
||||
from django.db import migrations, models
|
||||
|
||||
|
||||
class Migration(migrations.Migration):
|
||||
|
||||
dependencies = [
|
||||
('reviews', '0001_initial'),
|
||||
]
|
||||
|
||||
operations = [
|
||||
migrations.AlterField(
|
||||
model_name='reviewsettings',
|
||||
name='allow_any_approver',
|
||||
field=models.BooleanField(default=False, help_text='When True, any user with the Approver role can approve experiments that have no explicit approver group. When False, experiments without an approver group cannot proceed to review.', verbose_name='allow any approver'),
|
||||
),
|
||||
]
|
||||
@@ -1,4 +1,4 @@
|
||||
from typing import Any
|
||||
from typing import Any, override
|
||||
|
||||
from django.conf import settings
|
||||
from django.core.validators import MinValueValidator
|
||||
@@ -40,12 +40,14 @@ class ReviewSettings(BaseModel):
|
||||
verbose_name = _("review settings")
|
||||
verbose_name_plural = _("review settings")
|
||||
|
||||
@override
|
||||
def __str__(self) -> str:
|
||||
return (
|
||||
f"ReviewSettings(min_approvals={self.default_min_approvals}, "
|
||||
f"allow_any_approver={self.allow_any_approver})"
|
||||
)
|
||||
|
||||
@override
|
||||
def save(self, *args, **kwargs) -> None:
|
||||
existing: ReviewSettings | None = ReviewSettings.objects.first()
|
||||
if existing and existing.pk != self.pk:
|
||||
@@ -77,7 +79,8 @@ class ApproverGroup(BaseModel):
|
||||
limit_choices_to={"role": "approver"},
|
||||
verbose_name=_("approvers"),
|
||||
help_text=_(
|
||||
"Approver-role users who may approve this experimenter's experiments."
|
||||
"Approver-role users who may approve this "
|
||||
"experimenter's experiments."
|
||||
),
|
||||
)
|
||||
min_approvals: models.PositiveIntegerField[Any, Any] = (
|
||||
@@ -104,6 +107,7 @@ class ApproverGroup(BaseModel):
|
||||
verbose_name = _("approver group")
|
||||
verbose_name_plural = _("approver groups")
|
||||
|
||||
@override
|
||||
def __str__(self) -> str:
|
||||
return (
|
||||
f"ApproverGroup(experimenter={self.experimenter.pk}, "
|
||||
|
||||
+9
-15
@@ -1,40 +1,34 @@
|
||||
from apps.users.models import User, UserRole
|
||||
from apps.users.tests._helpers import _make_user
|
||||
from apps.users.tests.helpers import make_user
|
||||
|
||||
|
||||
def _make_experimenter(suffix="") -> User:
|
||||
return _make_user(
|
||||
def make_experimenter(suffix="") -> User:
|
||||
return make_user(
|
||||
username=f"exp{suffix}",
|
||||
email=f"exp{suffix}@lotty.local",
|
||||
role=UserRole.EXPERIMENTER,
|
||||
)
|
||||
|
||||
|
||||
def _make_approver(suffix="") -> User:
|
||||
return _make_user(
|
||||
def make_approver(suffix="") -> User:
|
||||
return make_user(
|
||||
username=f"appr{suffix}",
|
||||
email=f"appr{suffix}@lotty.local",
|
||||
role=UserRole.APPROVER,
|
||||
)
|
||||
|
||||
|
||||
def _make_admin(suffix="") -> User:
|
||||
return _make_user(
|
||||
def make_admin(suffix="") -> User:
|
||||
return make_user(
|
||||
username=f"admin{suffix}",
|
||||
email=f"admin{suffix}@lotty.local",
|
||||
role=UserRole.ADMIN,
|
||||
)
|
||||
|
||||
|
||||
def _make_viewer(suffix="") -> User:
|
||||
return _make_user(
|
||||
def make_viewer(suffix="") -> User:
|
||||
return make_user(
|
||||
username=f"viewer{suffix}",
|
||||
email=f"viewer{suffix}@lotty.local",
|
||||
role=UserRole.VIEWER,
|
||||
)
|
||||
|
||||
|
||||
def _get(data, camel_key, snake_key):
|
||||
if camel_key in data:
|
||||
return data[camel_key]
|
||||
return data[snake_key]
|
||||
@@ -1,5 +1,5 @@
|
||||
import uuid
|
||||
from typing import Any
|
||||
from typing import Any, override
|
||||
|
||||
from django.core.exceptions import ValidationError
|
||||
from django.db.models import QuerySet
|
||||
@@ -22,18 +22,19 @@ from apps.reviews.services import (
|
||||
)
|
||||
from apps.users.models import User
|
||||
|
||||
from ._helpers import (
|
||||
_make_admin,
|
||||
_make_approver,
|
||||
_make_experimenter,
|
||||
_make_viewer,
|
||||
from .helpers import (
|
||||
make_admin,
|
||||
make_approver,
|
||||
make_experimenter,
|
||||
make_viewer,
|
||||
)
|
||||
|
||||
|
||||
class ApproverGroupModelTest(TestCase):
|
||||
@override
|
||||
def setUp(self) -> None:
|
||||
self.experimenter: User = _make_experimenter("_model")
|
||||
self.approver: User = _make_approver("_model")
|
||||
self.experimenter: User = make_experimenter("_model")
|
||||
self.approver: User = make_approver("_model")
|
||||
|
||||
def test_create_group(self) -> None:
|
||||
group: ApproverGroup = approver_group_create(
|
||||
@@ -63,7 +64,7 @@ class ApproverGroupModelTest(TestCase):
|
||||
self.assertTrue(group.can_approve(self.approver))
|
||||
|
||||
def test_can_approve_false_not_in_group(self) -> None:
|
||||
other_approver: User = _make_approver("_other")
|
||||
other_approver: User = make_approver("_other")
|
||||
group: ApproverGroup = approver_group_create(
|
||||
experimenter=self.experimenter,
|
||||
approver_ids=[str(self.approver.pk)],
|
||||
@@ -80,10 +81,11 @@ class ApproverGroupModelTest(TestCase):
|
||||
|
||||
|
||||
class ApproverGroupCreateServiceTest(TestCase):
|
||||
@override
|
||||
def setUp(self) -> None:
|
||||
self.experimenter: User = _make_experimenter("_create")
|
||||
self.approver1: User = _make_approver("_create1")
|
||||
self.approver2: User = _make_approver("_create2")
|
||||
self.experimenter: User = make_experimenter("_create")
|
||||
self.approver1: User = make_approver("_create1")
|
||||
self.approver2: User = make_approver("_create2")
|
||||
|
||||
def test_create_with_approvers(self) -> None:
|
||||
group: ApproverGroup = approver_group_create(
|
||||
@@ -109,17 +111,17 @@ class ApproverGroupCreateServiceTest(TestCase):
|
||||
self.assertEqual(group.min_approvals, 1)
|
||||
|
||||
def test_create_rejects_non_experimenter_user(self) -> None:
|
||||
admin: User = _make_admin("_cre_admin")
|
||||
admin: User = make_admin("_cre_admin")
|
||||
with self.assertRaises(ValidationError):
|
||||
approver_group_create(experimenter=admin)
|
||||
|
||||
def test_create_rejects_viewer_as_experimenter(self) -> None:
|
||||
viewer: User = _make_viewer("_cre_viewer")
|
||||
viewer: User = make_viewer("_cre_viewer")
|
||||
with self.assertRaises(ValidationError):
|
||||
approver_group_create(experimenter=viewer)
|
||||
|
||||
def test_create_rejects_approver_as_experimenter(self) -> None:
|
||||
approver: User = _make_approver("_cre_as_exp")
|
||||
approver: User = make_approver("_cre_as_exp")
|
||||
with self.assertRaises(ValidationError):
|
||||
approver_group_create(experimenter=approver)
|
||||
|
||||
@@ -130,7 +132,7 @@ class ApproverGroupCreateServiceTest(TestCase):
|
||||
approver_group_create(experimenter=self.experimenter)
|
||||
|
||||
def test_create_rejects_non_approver_in_approver_list(self) -> None:
|
||||
viewer: User = _make_viewer("_cre_bad_appr")
|
||||
viewer: User = make_viewer("_cre_bad_appr")
|
||||
with self.assertRaises(ValidationError):
|
||||
approver_group_create(
|
||||
experimenter=self.experimenter,
|
||||
@@ -166,11 +168,12 @@ class ApproverGroupCreateServiceTest(TestCase):
|
||||
|
||||
|
||||
class ApproverGroupUpdateServiceTest(TestCase):
|
||||
@override
|
||||
def setUp(self) -> None:
|
||||
self.experimenter: User = _make_experimenter("_upd")
|
||||
self.approver1: User = _make_approver("_upd1")
|
||||
self.approver2: User = _make_approver("_upd2")
|
||||
self.approver3: User = _make_approver("_upd3")
|
||||
self.experimenter: User = make_experimenter("_upd")
|
||||
self.approver1: User = make_approver("_upd1")
|
||||
self.approver2: User = make_approver("_upd2")
|
||||
self.approver3: User = make_approver("_upd3")
|
||||
self.group: ApproverGroup = approver_group_create(
|
||||
experimenter=self.experimenter,
|
||||
approver_ids=[str(self.approver1.pk), str(self.approver2.pk)],
|
||||
@@ -225,7 +228,7 @@ class ApproverGroupUpdateServiceTest(TestCase):
|
||||
approver_group_update(group=self.group, min_approvals=10)
|
||||
|
||||
def test_update_rejects_non_approver_role(self) -> None:
|
||||
viewer: User = _make_viewer("_upd_bad")
|
||||
viewer: User = make_viewer("_upd_bad")
|
||||
with self.assertRaises(ValidationError):
|
||||
approver_group_update(
|
||||
group=self.group,
|
||||
@@ -242,14 +245,14 @@ class ApproverGroupUpdateServiceTest(TestCase):
|
||||
|
||||
class ApproverGroupDeleteServiceTest(TestCase):
|
||||
def test_delete_removes_group(self) -> None:
|
||||
exp: User = _make_experimenter("_del")
|
||||
exp: User = make_experimenter("_del")
|
||||
group: ApproverGroup = approver_group_create(experimenter=exp)
|
||||
pk = group.pk
|
||||
approver_group_delete(group=group)
|
||||
self.assertFalse(ApproverGroup.objects.filter(pk=pk).exists())
|
||||
|
||||
def test_delete_allows_recreating_group(self) -> None:
|
||||
exp: User = _make_experimenter("_del2")
|
||||
exp: User = make_experimenter("_del2")
|
||||
group: ApproverGroup = approver_group_create(experimenter=exp)
|
||||
approver_group_delete(group=group)
|
||||
new_group: ApproverGroup = approver_group_create(experimenter=exp)
|
||||
@@ -257,10 +260,11 @@ class ApproverGroupDeleteServiceTest(TestCase):
|
||||
|
||||
|
||||
class ApproverGroupAddRemoveServiceTest(TestCase):
|
||||
@override
|
||||
def setUp(self) -> None:
|
||||
self.experimenter: User = _make_experimenter("_ar")
|
||||
self.approver1: User = _make_approver("_ar1")
|
||||
self.approver2: User = _make_approver("_ar2")
|
||||
self.experimenter: User = make_experimenter("_ar")
|
||||
self.approver1: User = make_approver("_ar1")
|
||||
self.approver2: User = make_approver("_ar2")
|
||||
self.group: ApproverGroup = approver_group_create(
|
||||
experimenter=self.experimenter,
|
||||
approver_ids=[str(self.approver1.pk)],
|
||||
@@ -275,7 +279,7 @@ class ApproverGroupAddRemoveServiceTest(TestCase):
|
||||
)
|
||||
|
||||
def test_add_approver_rejects_non_approver_role(self) -> None:
|
||||
viewer: User = _make_viewer("_ar_bad")
|
||||
viewer: User = make_viewer("_ar_bad")
|
||||
with self.assertRaises(ValidationError):
|
||||
approver_group_add_approver(group=self.group, approver=viewer)
|
||||
|
||||
@@ -309,11 +313,12 @@ class ApproverGroupAddRemoveServiceTest(TestCase):
|
||||
|
||||
|
||||
class ApproverGroupSelectorsTest(TestCase):
|
||||
@override
|
||||
def setUp(self) -> None:
|
||||
self.exp1: User = _make_experimenter("_sel1")
|
||||
self.exp2: User = _make_experimenter("_sel2")
|
||||
self.appr1: User = _make_approver("_sel1")
|
||||
self.appr2: User = _make_approver("_sel2")
|
||||
self.exp1: User = make_experimenter("_sel1")
|
||||
self.exp2: User = make_experimenter("_sel2")
|
||||
self.appr1: User = make_approver("_sel1")
|
||||
self.appr2: User = make_approver("_sel2")
|
||||
self.group1: ApproverGroup = approver_group_create(
|
||||
experimenter=self.exp1,
|
||||
approver_ids=[str(self.appr1.pk)],
|
||||
@@ -344,7 +349,7 @@ class ApproverGroupSelectorsTest(TestCase):
|
||||
self.assertEqual(found, self.group1)
|
||||
|
||||
def test_get_by_experimenter_no_group(self) -> None:
|
||||
exp3: User = _make_experimenter("_sel3")
|
||||
exp3: User = make_experimenter("_sel3")
|
||||
self.assertIsNone(approver_group_get_by_experimenter(exp3))
|
||||
|
||||
def test_get_by_experimenter_id(self) -> None:
|
||||
|
||||
@@ -1,3 +1,5 @@
|
||||
from typing import override
|
||||
|
||||
from django.test import TestCase
|
||||
|
||||
from apps.reviews.models import ApproverGroup
|
||||
@@ -9,15 +11,16 @@ from apps.reviews.selectors import (
|
||||
from apps.reviews.services import approver_group_create, review_settings_update
|
||||
from apps.users.models import User
|
||||
|
||||
from ._helpers import _make_admin, _make_approver, _make_experimenter
|
||||
from .helpers import make_admin, make_approver, make_experimenter
|
||||
|
||||
|
||||
class EffectiveReviewPolicyTest(TestCase):
|
||||
@override
|
||||
def setUp(self) -> None:
|
||||
self.exp_with_group: User = _make_experimenter("_eff1")
|
||||
self.exp_without_group: User = _make_experimenter("_eff2")
|
||||
self.appr1: User = _make_approver("_eff1")
|
||||
self.appr2: User = _make_approver("_eff2")
|
||||
self.exp_with_group: User = make_experimenter("_eff1")
|
||||
self.exp_without_group: User = make_experimenter("_eff2")
|
||||
self.appr1: User = make_approver("_eff1")
|
||||
self.appr2: User = make_approver("_eff2")
|
||||
self.group: ApproverGroup = approver_group_create(
|
||||
experimenter=self.exp_with_group,
|
||||
approver_ids=[str(self.appr1.pk)],
|
||||
@@ -63,10 +66,11 @@ class EffectiveReviewPolicyTest(TestCase):
|
||||
|
||||
|
||||
class CanUserApproveTest(TestCase):
|
||||
@override
|
||||
def setUp(self) -> None:
|
||||
self.exp: User = _make_experimenter("_can")
|
||||
self.appr_in: User = _make_approver("_can_in")
|
||||
self.appr_out: User = _make_approver("_can_out")
|
||||
self.exp: User = make_experimenter("_can")
|
||||
self.appr_in: User = make_approver("_can_in")
|
||||
self.appr_out: User = make_approver("_can_out")
|
||||
self.group: ApproverGroup = approver_group_create(
|
||||
experimenter=self.exp,
|
||||
approver_ids=[str(self.appr_in.pk)],
|
||||
@@ -81,7 +85,7 @@ class CanUserApproveTest(TestCase):
|
||||
)
|
||||
|
||||
def test_non_approver_role_cannot_approve(self) -> None:
|
||||
admin: User = _make_admin("_can_a")
|
||||
admin: User = make_admin("_can_a")
|
||||
self.assertFalse(can_user_approve_experimenter(admin, self.exp))
|
||||
|
||||
def test_inactive_approver_cannot_approve(self) -> None:
|
||||
@@ -90,11 +94,11 @@ class CanUserApproveTest(TestCase):
|
||||
self.assertFalse(can_user_approve_experimenter(self.appr_in, self.exp))
|
||||
|
||||
def test_fallback_any_approver_can_approve(self) -> None:
|
||||
exp2: User = _make_experimenter("_can2")
|
||||
exp2: User = make_experimenter("_can2")
|
||||
review_settings_update(allow_any_approver=True)
|
||||
self.assertTrue(can_user_approve_experimenter(self.appr_out, exp2))
|
||||
|
||||
def test_fallback_deny_blocks_approval(self) -> None:
|
||||
exp2: User = _make_experimenter("_can3")
|
||||
exp2: User = make_experimenter("_can3")
|
||||
review_settings_update(allow_any_approver=False)
|
||||
self.assertFalse(can_user_approve_experimenter(self.appr_out, exp2))
|
||||
|
||||
Reference in New Issue
Block a user