Skip to content

Commit d361bb7

Browse files
committed
pretranslators group + test group auth
1 parent 22ae5ec commit d361bb7

File tree

4 files changed

+62
-3
lines changed

4 files changed

+62
-3
lines changed

pontoon/api/authentication.py

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,12 +1,18 @@
11
from rest_framework.authentication import BaseAuthentication
22
from rest_framework.exceptions import AuthenticationFailed
3+
from rest_framework.permissions import BasePermission
34

45
from django.contrib.auth.hashers import check_password
56
from django.utils import timezone
67

78
from pontoon.api.models import PersonalAccessToken
89

910

11+
class IsPretranslator(BasePermission):
12+
def has_permission(self, request, view):
13+
return request.user.groups.filter(name="pretranslators").exists()
14+
15+
1016
class PersonalAccessTokenAuthentication(BaseAuthentication):
1117
def authenticate(self, request):
1218
auth_header = request.headers.get("Authorization")

pontoon/api/tests/test_views.py

Lines changed: 33 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@
33
from rest_framework.test import APIClient
44

55
from django.contrib.auth.hashers import make_password
6+
from django.contrib.auth.models import Group
67
from django.db.models import Prefetch
78
from django.utils.timezone import now, timedelta
89

@@ -1463,7 +1464,38 @@ def test_translation_search(django_assert_num_queries):
14631464

14641465

14651466
@pytest.mark.django_db
1466-
def test_pretranslation_tm(django_assert_num_queries, member):
1467+
def test_pretranslation_group_authentication(member):
1468+
dummy_group = Group.objects.create(name="dummies")
1469+
1470+
member.user.groups.add(dummy_group)
1471+
token = PersonalAccessToken.objects.create(
1472+
user=member.user,
1473+
name="Test Token 1",
1474+
token_hash="hashed_token",
1475+
expires_at=now() + timedelta(days=1),
1476+
)
1477+
token_id = token.id
1478+
token_unhashed = "unhashed-token"
1479+
token.token_hash = make_password(token_unhashed)
1480+
token.save()
1481+
1482+
# test no pretranslators group
1483+
response = APIClient().post(
1484+
"/api/v2/pretranslate/",
1485+
HTTP_ACCEPT="application/json",
1486+
headers={"Authorization": f"Bearer {token_id}_{token_unhashed}"},
1487+
)
1488+
1489+
assert response.status_code == 403
1490+
assert response.data == {
1491+
"detail": "You do not have permission to perform this action."
1492+
}
1493+
1494+
1495+
@pytest.mark.django_db
1496+
def test_pretranslation_tm(member):
1497+
pretranslators = Group.objects.get(name="pretranslators")
1498+
member.user.groups.add(pretranslators)
14671499
token = PersonalAccessToken.objects.create(
14681500
user=member.user,
14691501
name="Test Token 1",

pontoon/api/views.py

Lines changed: 5 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -16,7 +16,10 @@
1616
from django.views.decorators.http import require_GET
1717

1818
from pontoon.actionlog.models import ActionLog
19-
from pontoon.api.authentication import PersonalAccessTokenAuthentication
19+
from pontoon.api.authentication import (
20+
IsPretranslator,
21+
PersonalAccessTokenAuthentication,
22+
)
2023
from pontoon.api.filters import TermFilter, TranslationMemoryFilter
2124
from pontoon.base import forms
2225
from pontoon.base.models import (
@@ -467,7 +470,7 @@ def get_queryset(self):
467470

468471

469472
class PretranslationView(APIView):
470-
permission_classes = [IsAuthenticated]
473+
permission_classes = [IsAuthenticated, IsPretranslator]
471474
authentication_classes = [PersonalAccessTokenAuthentication]
472475

473476
def post(self, request):
Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,18 @@
1+
# Generated by Django 4.2.26 on 2025-12-02 07:18
2+
3+
from django.db import migrations
4+
5+
6+
def create_pretranslators_group(apps, schema_editor):
7+
Group = apps.get_model("auth", "Group")
8+
Group.objects.get_or_create(name="pretranslators")
9+
10+
11+
class Migration(migrations.Migration):
12+
dependencies = [
13+
("base", "0100_android_as_mf2"),
14+
]
15+
16+
operations = [
17+
migrations.RunPython(create_pretranslators_group),
18+
]

0 commit comments

Comments
 (0)