From 79873af37e361b8a4b0304213e5ac441db8871d4 Mon Sep 17 00:00:00 2001 From: arya2331 Date: Mon, 25 Jan 2021 17:57:11 +0530 Subject: [PATCH 1/2] feat:Added blocked body --- bodies/urls.py | 4 ++++ bodies/views.py | 22 ++++++++++++++++++++++ events/prioritizer.py | 8 ++++++++ users/models.py | 1 + 4 files changed, 35 insertions(+) diff --git a/bodies/urls.py b/bodies/urls.py index 1073161d..5d350a2a 100644 --- a/bodies/urls.py +++ b/bodies/urls.py @@ -23,4 +23,8 @@ path('bodies//events', BodyViewSet.as_view({ 'get': 'get_events' })), + + path('bodies//block', BodyViewSet.as_view({ + 'get': 'block' + })), ] diff --git a/bodies/views.py b/bodies/views.py index af4e3237..55aaf70a 100644 --- a/bodies/views.py +++ b/bodies/views.py @@ -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""" diff --git a/events/prioritizer.py b/events/prioritizer.py index a4b7a1b3..3228a89c 100644 --- a/events/prioritizer.py +++ b/events/prioritizer.py @@ -5,6 +5,7 @@ from events.serializers import EventSerializer BASE = 1000 # Base points +BLOCKED_PENALTY = 3000 # 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 @@ -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 @@ -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(): @@ -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: diff --git a/users/models.py b/users/models.py index 0724ab31..442ddfd5 100644 --- a/users/models.py +++ b/users/models.py @@ -47,6 +47,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) From 6f8ad47468104550e62c524a2f18f0f7b1817fc5 Mon Sep 17 00:00:00 2001 From: arya2331 Date: Sat, 13 Feb 2021 16:49:30 +0530 Subject: [PATCH 2/2] added migartions for blocked body --- events/prioritizer.py | 2 +- .../0036_userprofile_blocked_bodies.py | 19 +++++++++++++++++++ users/migrations/0038_merge_20210213_1617.py | 14 ++++++++++++++ 3 files changed, 34 insertions(+), 1 deletion(-) create mode 100644 users/migrations/0036_userprofile_blocked_bodies.py create mode 100644 users/migrations/0038_merge_20210213_1617.py diff --git a/events/prioritizer.py b/events/prioritizer.py index 3228a89c..3e427c74 100644 --- a/events/prioritizer.py +++ b/events/prioritizer.py @@ -5,7 +5,7 @@ from events.serializers import EventSerializer BASE = 1000 # Base points -BLOCKED_PENALTY = 3000 # Penalty for blocking a body +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 diff --git a/users/migrations/0036_userprofile_blocked_bodies.py b/users/migrations/0036_userprofile_blocked_bodies.py new file mode 100644 index 00000000..b2117672 --- /dev/null +++ b/users/migrations/0036_userprofile_blocked_bodies.py @@ -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'), + ), + ] diff --git a/users/migrations/0038_merge_20210213_1617.py b/users/migrations/0038_merge_20210213_1617.py new file mode 100644 index 00000000..fc1ccaa0 --- /dev/null +++ b/users/migrations/0038_merge_20210213_1617.py @@ -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 = [ + ]