3
3
# SPDX-License-Identifier: MIT
4
4
import http .client
5
5
6
- from django .http import HttpResponseBadRequest , JsonResponse , HttpResponse
6
+ from django .http import HttpResponseBadRequest , HttpResponse
7
7
from rules .contrib .views import permission_required , objectgetter
8
8
9
- from cvat .apps .iam .decorators import login_required
9
+ from rest_framework .permissions import IsAuthenticated
10
+ from rest_framework .response import Response
11
+ from rest_framework .request import Request
12
+ from rest_framework .decorators import api_view , permission_classes
13
+
14
+ from drf_spectacular .utils import extend_schema
15
+
10
16
from cvat .apps .engine .log import slogger
11
17
from cvat .apps .engine import models
12
18
from cvat .apps .dataset_repo .models import GitData
13
19
import contextlib
14
20
15
21
import cvat .apps .dataset_repo .dataset_repo as CVATGit
16
22
import django_rq
17
- import json
18
23
19
- @login_required
24
+ def _legacy_api_view (allowed_method_names = None ):
25
+ # Currently, the views in this file use the legacy permission-checking
26
+ # approach, so this decorator disables the default DRF permission classes.
27
+ # TODO: migrate to DRF permissions, make the views compatible with drf-spectacular,
28
+ # and remove this decorator.
29
+ def decorator (view ):
30
+ view = permission_classes ([IsAuthenticated ])(view )
31
+ view = api_view (allowed_method_names )(view )
32
+ view = extend_schema (exclude = True )(view )
33
+ return view
34
+
35
+ return decorator
36
+
37
+ @_legacy_api_view ()
20
38
def check_process (request , rq_id ):
21
39
try :
22
40
queue = django_rq .get_queue ('default' )
23
41
rq_job = queue .fetch_job (rq_id )
24
42
25
43
if rq_job is not None :
26
44
if rq_job .is_queued or rq_job .is_started :
27
- return JsonResponse ({"status" : rq_job .get_status ()})
45
+ return Response ({"status" : rq_job .get_status ()})
28
46
elif rq_job .is_finished :
29
- return JsonResponse ({"status" : rq_job .get_status ()})
47
+ return Response ({"status" : rq_job .get_status ()})
30
48
else :
31
- return JsonResponse ({"status" : rq_job .get_status (), "stderr" : rq_job .exc_info })
49
+ return Response ({"status" : rq_job .get_status (), "stderr" : rq_job .exc_info })
32
50
else :
33
- return JsonResponse ({"status" : "unknown" })
51
+ return Response ({"status" : "unknown" })
34
52
except Exception as ex :
35
53
slogger .glob .error ("error occurred during checking repository request with rq id {}" .format (rq_id ), exc_info = True )
36
54
return HttpResponseBadRequest (str (ex ))
37
55
38
56
39
- @login_required
57
+ @_legacy_api_view ([ 'POST' ])
40
58
@permission_required (perm = ['engine.task.create' ],
41
59
fn = objectgetter (models .Task , 'tid' ), raise_exception = True )
42
- def create (request , tid ):
60
+ def create (request : Request , tid ):
43
61
try :
44
62
slogger .task [tid ].info ("create repository request" )
45
- body = json . loads ( request .body . decode ( 'utf-8' ))
63
+ body = request .data
46
64
path = body ["path" ]
47
- export_format = body [ "format" ]
65
+ export_format = body . get ( "format" )
48
66
lfs = body ["lfs" ]
49
67
rq_id = "git.create.{}" .format (tid )
50
68
queue = django_rq .get_queue ("default" )
51
69
52
70
queue .enqueue_call (func = CVATGit .initial_create , args = (tid , path , export_format , lfs , request .user ), job_id = rq_id )
53
- return JsonResponse ({ "rq_id" : rq_id })
71
+ return Response ({ "rq_id" : rq_id })
54
72
except Exception as ex :
55
73
slogger .glob .error ("error occurred during initial cloning repository request with rq id {}" .format (rq_id ), exc_info = True )
56
74
return HttpResponseBadRequest (str (ex ))
57
75
58
76
59
- @login_required
60
- def push_repository (request , tid ):
77
+ @_legacy_api_view ()
78
+ def push_repository (request : Request , tid ):
61
79
try :
62
80
slogger .task [tid ].info ("push repository request" )
63
81
64
82
rq_id = "git.push.{}" .format (tid )
65
83
queue = django_rq .get_queue ('default' )
66
84
queue .enqueue_call (func = CVATGit .push , args = (tid , request .user , request .scheme , request .get_host ()), job_id = rq_id )
67
85
68
- return JsonResponse ({ "rq_id" : rq_id })
86
+ return Response ({ "rq_id" : rq_id })
69
87
except Exception as ex :
70
88
with contextlib .suppress (Exception ):
71
89
slogger .task [tid ].error ("error occurred during pushing repository request" ,
@@ -74,24 +92,24 @@ def push_repository(request, tid):
74
92
return HttpResponseBadRequest (str (ex ))
75
93
76
94
77
- @login_required
78
- def get_repository (request , tid ):
95
+ @_legacy_api_view ()
96
+ def get_repository (request : Request , tid ):
79
97
try :
80
98
slogger .task [tid ].info ("get repository request" )
81
- return JsonResponse (CVATGit .get (tid , request .user ))
99
+ return Response (CVATGit .get (tid , request .user ))
82
100
except Exception as ex :
83
101
with contextlib .suppress (Exception ):
84
102
slogger .task [tid ].error ("error occurred during getting repository info request" ,
85
103
exc_info = True )
86
104
87
105
return HttpResponseBadRequest (str (ex ))
88
106
89
- @login_required
107
+ @_legacy_api_view ([ 'PATCH' ])
90
108
@permission_required (perm = ['engine.task.access' ],
91
109
fn = objectgetter (models .Task , 'tid' ), raise_exception = True )
92
- def update_git_repo (request , tid ):
110
+ def update_git_repo (request : Request , tid ):
93
111
try :
94
- body = json . loads ( request .body . decode ( 'utf-8' ))
112
+ body = request .data
95
113
req_type = body ["type" ]
96
114
value = body ["value" ]
97
115
git_data_obj = GitData .objects .filter (task_id = tid )[0 ]
@@ -114,15 +132,15 @@ def update_git_repo(request, tid):
114
132
return HttpResponseBadRequest (str (ex ))
115
133
116
134
117
- @login_required
135
+ @_legacy_api_view ()
118
136
def get_meta_info (request ):
119
137
try :
120
138
db_git_records = GitData .objects .all ()
121
139
response = {}
122
140
for db_git in db_git_records :
123
141
response [db_git .task_id ] = db_git .status
124
142
125
- return JsonResponse (response , safe = False )
143
+ return Response (response )
126
144
except Exception as ex :
127
145
slogger .glob .exception ("error occurred during get meta request" , exc_info = True )
128
146
return HttpResponseBadRequest (str (ex ))
0 commit comments