Skip to content

Commit 9c44f42

Browse files
committed
avoid duplication
Signed-off-by: zhangtianli2006 <zhangtianli2006@163.com>
1 parent d5f3446 commit 9c44f42

File tree

2 files changed

+28
-11
lines changed

2 files changed

+28
-11
lines changed

problem/decorator.py

Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,21 @@
1+
from rest_framework.response import Response
2+
from rest_framework import status
3+
from django.shortcuts import get_object_or_404
4+
from problem.models import Problem
5+
6+
7+
def enabled_required():
8+
def decorator(func):
9+
def _wrapped_view(request, pid, *args, **kwargs):
10+
problem = get_object_or_404(Problem, pid=pid)
11+
12+
if not problem.enabled and not request.user.has_perm("problem.view_hidden"):
13+
return Response(
14+
{"detail": "Problem is hidden."}, status=status.HTTP_403_FORBIDDEN
15+
)
16+
17+
return func(request, pid=pid, *args, **kwargs)
18+
19+
return _wrapped_view
20+
21+
return decorator

problem/views.py

Lines changed: 7 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -16,21 +16,21 @@
1616
ProblemListSerializer,
1717
TagSerializer,
1818
)
19-
from segmentoj.decorator import syllable_required, parameter_required
19+
from segmentoj.decorator import (
20+
syllable_required,
21+
parameter_required,
22+
)
2023
from status.models import Status
24+
from .decorator import enabled_required
2125

2226

2327
class ProblemView(APIView):
2428
@method_decorator(parameter_required("pid"))
29+
@method_decorator(enabled_required())
2530
def get(self, request, pid):
2631
# Get the content of a problem
2732
problem = get_object_or_404(Problem, pid=pid)
2833

29-
if not problem.enabled and not request.user.has_perm("problem.view_hidden"):
30-
return Response(
31-
{"detail": "Problem is hidden."}, status=status.HTTP_403_FORBIDDEN
32-
)
33-
3434
ps = ProblemSerializer(problem)
3535
return Response({"res": ps.data}, status=status.HTTP_200_OK)
3636

@@ -67,14 +67,10 @@ def delete(self, request, pid):
6767

6868
class ProblemDescriptionView(APIView):
6969
@method_decorator(parameter_required("pid"))
70+
@method_decorator(enabled_required())
7071
def get(self, request, pid):
7172
problem = get_object_or_404(Problem, pid=pid)
7273

73-
if not problem.enabled and not request.user.has_perm("problem.view_hidden"):
74-
return Response(
75-
{"detail": "Problem is hidden."}, status=status.HTTP_403_FORBIDDEN
76-
)
77-
7874
pds = ProblemDescriptionSerializer(problem)
7975
return Response({"res": pds.data}, status=status.HTTP_200_OK)
8076

0 commit comments

Comments
 (0)