Skip to content

Commit 0003732

Browse files
d-ritaAadesh-Baral
authored andcommitted
Revert to previous stats implementation
1 parent e4738dd commit 0003732

File tree

3 files changed

+38
-82
lines changed

3 files changed

+38
-82
lines changed

backend/models/dtos/stats_dto.py

Lines changed: 0 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -12,9 +12,6 @@ class UserContribution(Model):
1212
picture_url = StringType(serialized_name="pictureUrl")
1313
mapped = IntType()
1414
validated = IntType()
15-
split = IntType()
16-
marked_bad_imagery = IntType()
17-
invalidated = IntType()
1815
total = IntType()
1916
mapped_tasks = ListType(IntType, serialized_name="mappedTasks")
2017
validated_tasks = ListType(IntType, serialized_name="validatedTasks")

backend/services/stats_service.py

Lines changed: 34 additions & 61 deletions
Original file line numberDiff line numberDiff line change
@@ -247,29 +247,24 @@ def get_last_activity(project_id: int) -> ProjectLastActivityDTO:
247247
def get_user_contributions(project_id: int) -> ProjectContributionsDTO:
248248
""" Get all user contributions on a project"""
249249

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"),
268255
)
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"),
272265
)
266+
.filter(Task.project_id == project_id)
267+
.group_by(Task.validated_by)
273268
.subquery()
274269
)
275270

@@ -281,46 +276,27 @@ def get_user_contributions(project_id: int) -> ProjectContributionsDTO:
281276
User.mapping_level,
282277
User.picture_url,
283278
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"),
307281
(
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)
320284
).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+
),
321299
)
322-
.join(User, sq.c.user_id == User.id)
323-
.group_by(User.id)
324300
.order_by(desc("total"))
325301
.all()
326302
)
@@ -335,9 +311,6 @@ def get_user_contributions(project_id: int) -> ProjectContributionsDTO:
335311
picture_url=r.picture_url,
336312
mapped=r.mapped,
337313
validated=r.validated,
338-
split=r.split,
339-
marked_bad_imagery=r.bad_imagery,
340-
invalidated=r.invalidated,
341314
total=r.total,
342315
mapped_tasks=r.mapped_tasks if r.mapped_tasks is not None else [],
343316
validated_tasks=r.validated_tasks

tests/backend/integration/api/projects/test_contributions.py

Lines changed: 4 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -18,18 +18,7 @@ def test_returns_404_if_project_does_not_exist(self):
1818
self.assertEqual(response.status_code, 404)
1919

2020
def test_returns_200_if_project_exists(self):
21-
# Arrange
22-
task = Task.get(2, self.test_project.id)
23-
# Lock the task for mapping
24-
task.lock_task_for_mapping(self.test_author.id)
25-
# Unlock the task
26-
task.unlock_task(self.test_author.id, new_state=TaskStatus.MAPPED)
27-
task_2 = Task.get(1, self.test_project.id)
28-
# Lock the task for mapping
29-
task_2.lock_task_for_validating(self.test_author.id)
30-
# Unlock the task
31-
task_2.unlock_task(self.test_author.id, new_state=TaskStatus.VALIDATED)
32-
# Actt
21+
# Act
3322
response = self.client.get(self.url)
3423
# Assert
3524
self.assertEqual(response.status_code, 200)
@@ -50,17 +39,14 @@ def test_returns_200_if_project_exists(self):
5039
"validatedTasks",
5140
"name",
5241
"dateRegistered",
53-
"invalidated",
54-
"split",
55-
"marked_bad_imagery",
5642
]
5743
),
5844
)
5945
self.assertEqual(test_user_contribution["username"], self.test_author.username)
60-
self.assertEqual(test_user_contribution["mapped"], 1)
46+
self.assertEqual(test_user_contribution["mapped"], 3)
6147
self.assertEqual(test_user_contribution["validated"], 1)
62-
self.assertEqual(test_user_contribution["mappedTasks"], [2])
63-
self.assertEqual(test_user_contribution["validatedTasks"], [1])
48+
self.assertEqual(test_user_contribution["mappedTasks"], [1, 3, 4])
49+
self.assertEqual(test_user_contribution["validatedTasks"], [4])
6450

6551

6652
class TestProjectsContributionsQueriesDayAPI(BaseTestCase):

0 commit comments

Comments
 (0)