51
51
52
52
auth_header_pat = re .compile (r'^(token|bearer|basic)\s+([^\s]+)$' , flags = re .IGNORECASE )
53
53
54
+
54
55
def check_authorization (self : "GraderBaseHandler" , scopes : list [Scope ], lecture_id : Union [int , None ]) -> bool :
55
56
if (("/permissions" in self .request .path )
56
57
or ("/config" in self .request .path )):
@@ -112,6 +113,7 @@ async def request_handler_wrapper(self: "GraderBaseHandler", *args,
112
113
113
114
return wrapper
114
115
116
+
115
117
class BaseHandler (web .RequestHandler ):
116
118
"""Base class of all handler classes
117
119
@@ -136,13 +138,13 @@ def __init__(
136
138
self .log = self .application .log
137
139
138
140
async def prepare (self ) -> Optional [Awaitable [None ]]:
139
- #strip trailing slash
141
+ # strip trailing slash
140
142
self .request .path = self .request .path .rstrip ("/" )
141
-
142
- #start session
143
+
144
+ # start session
143
145
self .session : Session = self .application .session_maker ()
144
-
145
- #authenticate
146
+
147
+ # authenticate
146
148
try :
147
149
await self .get_current_user ()
148
150
@@ -154,25 +156,27 @@ async def prepare(self) -> Optional[Awaitable[None]]:
154
156
url_path_join (self .application .base_url , "/api/oauth2/token" ),
155
157
url_path_join (self .application .base_url , "/oauth_callback" ),
156
158
url_path_join (self .application .base_url , "/lti13/oauth_callback" )
157
- ]:
159
+ ]:
158
160
# require git to authenticate with token -> otherwise return 401 code
159
161
if self .request .path .startswith (url_path_join (self .application .base_url , "/git" )):
160
162
raise HTTPError (401 , reason = "Git: authenticate request" )
161
-
163
+
162
164
# send to login page if ui page request
163
- if self .request .path in [url_path_join (self .application .base_url , "/api/oauth2/authorize" )] or self .request .path .startswith (url_path_join (self .application .base_url , "/ui" )):
165
+ if self .request .path in [
166
+ url_path_join (self .application .base_url , "/api/oauth2/authorize" )] or self .request .path .startswith (
167
+ url_path_join (self .application .base_url , "/ui" )):
164
168
url = url_concat (self .settings ["login_url" ], dict (next = self .request .uri ))
165
169
self .redirect (url )
166
170
return
167
-
171
+
168
172
if self .request .headers .get ("Authorization" ) is None :
169
173
raise HTTPError (401 , reason = "No API token in auth header" )
170
-
174
+
171
175
# do not redirect to login page if we hit api endpoints
172
176
raise HTTPError (401 , reason = "API Token is invalid or expired." )
173
-
174
-
175
-
177
+
178
+
179
+
176
180
except Exception as e :
177
181
# ensure get_current_user is never called again for this handler,
178
182
# since it failed
@@ -775,7 +779,7 @@ def append_query_parameters(self, url, exclude=None):
775
779
776
780
777
781
class GraderBaseHandler (BaseHandler ):
778
-
782
+
779
783
def validate_parameters (self , * args ):
780
784
if len (self .request .arguments ) == 0 :
781
785
return
@@ -816,56 +820,65 @@ def get_submission(self, lecture_id: int, assignment_id: int,
816
820
raise HTTPError (HTTPStatus .NOT_FOUND ,
817
821
reason = msg )
818
822
return submission
819
-
820
- def get_latest_submissions (self , assignment_id , must_have_feedback = False ):
823
+
824
+ def get_latest_submissions (self , assignment_id , must_have_feedback = False , username = None ):
821
825
subquery = (
822
826
self .session .query (Submission .username ,
823
- func .max (Submission .date ).label (
824
- "max_date" ))
827
+ func .max (Submission .date ).label ("max_date" ))
825
828
.filter (Submission .assignid == assignment_id )
826
829
.filter (Submission .deleted == DeleteState .active )
827
830
.group_by (Submission .username )
828
831
.subquery ())
832
+
829
833
if must_have_feedback :
830
834
subquery = subquery .filter (Submission .feedback_status != "not_generated" )
831
835
832
- # build the main query
836
+ if username :
837
+ subquery = subquery .filter (Submission .username == username )
838
+
839
+ # Build the main query
833
840
submissions = (
834
841
self .session .query (Submission )
835
842
.join (subquery ,
836
- (Submission .username == subquery .c .username ) & (
837
- Submission .date == subquery .c .max_date ) & (
838
- Submission .assignid == assignment_id ) & (
839
- Submission .deleted == DeleteState .active
840
- ))
843
+ (Submission .username == subquery .c .username ) & (
844
+ Submission .date == subquery .c .max_date ) & (
845
+ Submission .assignid == assignment_id ) & (
846
+ Submission .deleted == DeleteState .active
847
+ ))
841
848
.order_by (Submission .id )
842
- .all ())
849
+ .all ()
850
+ )
851
+
843
852
return submissions
844
-
845
- def get_best_submissions (self , assignment_id , must_have_feedback = False ):
846
- # build the subquery
847
- subquery = ( self .session .query (Submission .username , func . max (
848
- Submission .score ).label ("max_score" ))
849
- .filter (Submission .assignid == assignment_id )
850
- .filter (Submission .deleted == DeleteState .active )
851
- .group_by (Submission .username )
852
- .subquery ())
853
-
853
+
854
+ def get_best_submissions (self , assignment_id , must_have_feedback = False , username = None ):
855
+ subquery = (
856
+ self .session .query (Submission .username ,
857
+ func . max ( Submission .score ).label ("max_score" ))
858
+ .filter (Submission .assignid == assignment_id )
859
+ .filter (Submission .deleted == DeleteState .active )
860
+ .group_by (Submission .username )
861
+ .subquery ())
862
+
854
863
if must_have_feedback :
855
864
subquery = subquery .filter (Submission .feedback_status != "not_generated" )
856
865
857
- # build the main query
866
+ if username :
867
+ subquery = subquery .filter (Submission .username == username )
868
+
869
+ # Build the main query
858
870
submissions = (
859
871
self .session .query (Submission )
860
872
.join (subquery ,
861
- (Submission .username == subquery .c .username ) & (
862
- Submission .score == subquery .c .max_score ) & (
863
- Submission .assignid == assignment_id ) & (
864
- Submission .deleted == DeleteState .active
865
- ))
873
+ (Submission .username == subquery .c .username ) & (
874
+ Submission .score == subquery .c .max_score ) & (
875
+ Submission .assignid == assignment_id ) & (
876
+ Submission .deleted == DeleteState .active
877
+ ))
866
878
.group_by (Submission .username )
867
879
.order_by (Submission .id )
868
- .all ())
880
+ .all ()
881
+ )
869
882
return submissions
870
883
871
884
@property
0 commit comments