@@ -247,29 +247,24 @@ def get_last_activity(project_id: int) -> ProjectLastActivityDTO:
247
247
def get_user_contributions (project_id : int ) -> ProjectContributionsDTO :
248
248
""" Get all user contributions on a project"""
249
249
250
- actions = [
251
- TaskStatus .MAPPED .name ,
252
- TaskStatus .BADIMAGERY .name ,
253
- TaskStatus .SPLIT .name ,
254
- TaskStatus .VALIDATED .name ,
255
- TaskStatus .INVALIDATED .name ,
256
- ]
257
-
258
- # Filter for rows with the actions in a task's possible state_changes.
259
- sq = (
260
- TaskHistory .query .with_entities (
261
- TaskHistory .user_id ,
262
- TaskHistory .task_id ,
263
- TaskHistory .action_text ,
264
- )
265
- .distinct (
266
- TaskHistory .task_id ,
267
- TaskHistory .action_text ,
250
+ mapped_stmt = (
251
+ Task .query .with_entities (
252
+ Task .mapped_by ,
253
+ func .count (Task .mapped_by ).label ("count" ),
254
+ func .array_agg (Task .id ).label ("task_ids" ),
268
255
)
269
- .filter (
270
- TaskHistory .action_text .in_ (actions ),
271
- TaskHistory .project_id == project_id ,
256
+ .filter (Task .project_id == project_id )
257
+ .group_by (Task .mapped_by )
258
+ .subquery ()
259
+ )
260
+ validated_stmt = (
261
+ Task .query .with_entities (
262
+ Task .validated_by ,
263
+ func .count (Task .validated_by ).label ("count" ),
264
+ func .array_agg (Task .id ).label ("task_ids" ),
272
265
)
266
+ .filter (Task .project_id == project_id )
267
+ .group_by (Task .validated_by )
273
268
.subquery ()
274
269
)
275
270
@@ -281,46 +276,27 @@ def get_user_contributions(project_id: int) -> ProjectContributionsDTO:
281
276
User .mapping_level ,
282
277
User .picture_url ,
283
278
User .date_registered ,
284
- func .count (sq .c .action_text )
285
- .filter (sq .c .action_text == TaskStatus .MAPPED .name )
286
- .label ("mapped" ),
287
- func .count (sq .c .action_text )
288
- .filter (
289
- sq .c .action_text == TaskStatus .BADIMAGERY .name ,
290
- )
291
- .label ("bad_imagery" ),
292
- func .count (sq .c .action_text )
293
- .filter (sq .c .action_text == TaskStatus .SPLIT .name )
294
- .label ("split" ),
295
- func .count (sq .c .action_text )
296
- .filter (sq .c .action_text == TaskStatus .VALIDATED .name )
297
- .label ("validated" ),
298
- func .count (sq .c .action_text )
299
- .filter (sq .c .action_text == TaskStatus .INVALIDATED .name )
300
- .label ("invalidated" ),
301
- func .array_agg (sq .c .task_id )
302
- .filter (sq .c .action_text == TaskStatus .MAPPED .name )
303
- .label ("mapped_tasks" ),
304
- func .array_agg (sq .c .task_id )
305
- .filter (sq .c .action_text == TaskStatus .VALIDATED .name )
306
- .label ("validated_tasks" ),
279
+ coalesce (mapped_stmt .c .count , 0 ).label ("mapped" ),
280
+ coalesce (validated_stmt .c .count , 0 ).label ("validated" ),
307
281
(
308
- coalesce (
309
- func .count (sq .c .action_text ).filter (
310
- sq .c .action_text == TaskStatus .MAPPED .name
311
- ),
312
- 0 ,
313
- )
314
- + coalesce (
315
- func .count (sq .c .action_text ).filter (
316
- sq .c .action_text == TaskStatus .VALIDATED .name
317
- ),
318
- 0 ,
319
- )
282
+ coalesce (mapped_stmt .c .count , 0 )
283
+ + coalesce (validated_stmt .c .count , 0 )
320
284
).label ("total" ),
285
+ mapped_stmt .c .task_ids .label ("mapped_tasks" ),
286
+ validated_stmt .c .task_ids .label ("validated_tasks" ),
287
+ )
288
+ .outerjoin (
289
+ validated_stmt ,
290
+ mapped_stmt .c .mapped_by == validated_stmt .c .validated_by ,
291
+ full = True ,
292
+ )
293
+ .join (
294
+ User ,
295
+ or_ (
296
+ User .id == mapped_stmt .c .mapped_by ,
297
+ User .id == validated_stmt .c .validated_by ,
298
+ ),
321
299
)
322
- .join (User , sq .c .user_id == User .id )
323
- .group_by (User .id )
324
300
.order_by (desc ("total" ))
325
301
.all ()
326
302
)
@@ -335,9 +311,6 @@ def get_user_contributions(project_id: int) -> ProjectContributionsDTO:
335
311
picture_url = r .picture_url ,
336
312
mapped = r .mapped ,
337
313
validated = r .validated ,
338
- split = r .split ,
339
- marked_bad_imagery = r .bad_imagery ,
340
- invalidated = r .invalidated ,
341
314
total = r .total ,
342
315
mapped_tasks = r .mapped_tasks if r .mapped_tasks is not None else [],
343
316
validated_tasks = r .validated_tasks
0 commit comments