Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
4 changes: 4 additions & 0 deletions bodies/urls.py
Original file line number Diff line number Diff line change
Expand Up @@ -23,4 +23,8 @@
path('bodies/<pk>/events', BodyViewSet.as_view({
'get': 'get_events'
})),

path('bodies/<pk>/block', BodyViewSet.as_view({
'get': 'block'
})),
]
22 changes: 22 additions & 0 deletions bodies/views.py
Original file line number Diff line number Diff line change
Expand Up @@ -92,6 +92,28 @@ def follow(self, request, pk):

return Response(status=204)

def block(self, request, pk):
"""block or unblock a body {?block}=0,1"""

body = self.get_body(pk)

# Get query param
value = request.GET.get("block")
if value is None:
return Response({"message": "{?block} is required"}, status=400)

# check possible actions
if value == "0":
request.user.profile.blocked_bodies.remove(body)
elif value == "1":
request.user.profile.blocked_bodies.add(body)
else:
return Response({"message": "Invalid Action"}, status=400)

return Response(status=204)



def get_events(self, request, pk):
"""Get all events from pk uuid or strid.
{?archived} is optional arguement to fetch all events"""
Expand Down
8 changes: 8 additions & 0 deletions events/prioritizer.py
Original file line number Diff line number Diff line change
Expand Up @@ -5,6 +5,7 @@
from events.serializers import EventSerializer

BASE = 1000 # Base points
BLOCKED_PENALTY = 30000 # Penalty for blocking a body
FINISHED_PENALTY = 600 # Direct penalty if event is done
WEIGHT_START_TIME = 800 # Weight of time from event start
WEIGHT_END_TIME = 800 # Weight of time from event end
Expand All @@ -25,6 +26,7 @@ class EventPrioritizer(): # pylint: disable=R0902
def __init__(self, event, profile):
self.event = event
self.followed_bodies = profile.followed_bodies.all() if profile else None
self.blocked_bodies = profile.blocked_bodies.all() if profile else None
self.profile = profile

# Get time differences in days
Expand All @@ -43,6 +45,7 @@ def compute(self):
# Apply all bonuses/penalties
self.apply_time_bonus()
self.penalise_untagged()
self.penalise_block_body()

# Give bonuses to events yet to end
if self.event.end_time > timezone.now():
Expand Down Expand Up @@ -91,6 +94,11 @@ def bonus_followed(self):
body_bonus += int(BODY_FOLLOWING_BONUS + (TIME_DEP_BODY_BONUS * self.start_time_factor))
self.weight += body_bonus

def penalise_block_body(self):
"""Penalise events for blocking."""
if self.blocked_bodies:
self.weight -= BLOCKED_PENALTY

def penalise_far_off(self):
"""Penalise events that have a long time to start linearly."""
if self.days_till_event > FAR_OFF_THRESHOLD:
Expand Down
19 changes: 19 additions & 0 deletions users/migrations/0036_userprofile_blocked_bodies.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,19 @@
# Generated by Django 3.0.8 on 2021-01-24 16:51

from django.db import migrations, models


class Migration(migrations.Migration):

dependencies = [
('bodies', '0023_body_canonical_name'),
('users', '0035_auto_20190722_0224'),
]

operations = [
migrations.AddField(
model_name='userprofile',
name='blocked_bodies',
field=models.ManyToManyField(blank=True, related_name='blockers', to='bodies.Body'),
),
]
14 changes: 14 additions & 0 deletions users/migrations/0038_merge_20210213_1617.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,14 @@
# Generated by Django 3.0.8 on 2021-02-13 10:47

from django.db import migrations


class Migration(migrations.Migration):

dependencies = [
('users', '0036_userprofile_blocked_bodies'),
('users', '0037_auto_20201101_1943'),
]

operations = [
]
1 change: 1 addition & 0 deletions users/models.py
Original file line number Diff line number Diff line change
Expand Up @@ -48,6 +48,7 @@ class UserProfile(models.Model):
# InstiApp feature fields
active = models.BooleanField(default=True)
followed_bodies = models.ManyToManyField('bodies.Body', related_name='followers', blank=True)
blocked_bodies = models.ManyToManyField('bodies.Body', related_name='blockers', blank=True)

# InstiApp roles
roles = models.ManyToManyField('roles.BodyRole', related_name='users', blank=True)
Expand Down