Reworked study group radius calculation to be based on the number of students with a set limit rather than by largest distance

This commit is contained in:
Keannu Bernasol 2023-10-27 23:46:26 +08:00
parent 0007f84b47
commit f6e0483706

View file

@ -89,20 +89,21 @@ class StudyGroupListView(generics.ListAPIView):
studygroups = StudyGroup.objects.filter(subject__in=user_subjects) studygroups = StudyGroup.objects.filter(subject__in=user_subjects)
for group in studygroups: for group in studygroups:
# Get all StudentStatus locations of the group # Get the number of students in a group
group_locations = group.students.values_list('location', flat=True) student_count = group.students.values_list(
# Convert string locations to GEOSGeometry objects 'user', flat=True).count()
point_locations = [fromstr(loc, srid=4326) # Each student will contribute 10 to the radius
for loc in group_locations] radius = student_count * 10
# Calculate distances between every pair of locations # If the radius exceeds 50, set it back to 50
distances = [(loc1.distance( if (radius > 50):
loc2)*100000)for loc1 in point_locations for loc2 in point_locations] radius = 50
# Get the maximum distance # (For debug purposes) If radius is less than 5, set it back to 5
group_radius = max(distances) if distances else 0 elif (radius < 5):
group_radius = max(group_radius, 15) radius = 5
# Annotate the group with the radius # Annotate the group with the radius
group.radius = group_radius group.radius = radius
return studygroups return studygroups