Skip to content
Snippets Groups Projects
Commit 1f20e3ea authored by hollum's avatar hollum
Browse files

code smell - shotgun surgery

parent 8d522bfc
No related branches found
No related tags found
No related merge requests found
Pipeline #169796 passed
......@@ -7,6 +7,7 @@ from workouts.permissions import IsOwner, IsReadOnly
from comments.serializers import CommentSerializer, LikeSerializer
from django.db.models import Q
from rest_framework.filters import OrderingFilter
from workouts.models import Visibility
# Create your views here.
class CommentList(
......@@ -43,12 +44,12 @@ class CommentList(
# The code below is kind of duplicate of the one in ./permissions.py
# We should replace it with a better solution.
# Or maybe not.
qs = Comment.objects.filter(
Q(workout__visibility="PU")
Q(workout__visibility=Visibility.PUBLIC)
| Q(owner=self.request.user)
| (
Q(workout__visibility="CO")
Q(workout__visibility=Visibility.COACH)
& Q(workout__owner__coach=self.request.user)
)
| Q(workout__owner=self.request.user)
......
......@@ -28,7 +28,7 @@ from workouts.permissions import IsOwner, IsReadOnly
class UserList(mixins.ListModelMixin, mixins.CreateModelMixin, generics.GenericAPIView):
"""Django view for user list
Attributes:
serializer_class: serializer class
serializer_class: serializer class
users: list of users
admins: list of admins
"""
......@@ -36,7 +36,7 @@ class UserList(mixins.ListModelMixin, mixins.CreateModelMixin, generics.GenericA
serializer_class = UserSerializer
users = []
admins = []
def get(self, request, *args, **kwargs):
'''
......
......@@ -7,6 +7,7 @@ from django.db import models
from django.core.files.storage import FileSystemStorage
from django.conf import settings
from django.contrib.auth import get_user_model
from django.utils.translation import gettext_lazy
class OverwriteStorage(FileSystemStorage):
......@@ -24,6 +25,12 @@ class OverwriteStorage(FileSystemStorage):
if self.exists(name):
os.remove(os.path.join(settings.MEDIA_ROOT, name))
class Visibility(models.TextChoices):
PUBLIC = "PU", gettext_lazy("Public")
COACH = "CO", gettext_lazy("Coach")
PRIVATE = "PR", gettext_lazy("Private")
# Create your models here.
class Workout(models.Model):
......@@ -47,18 +54,11 @@ class Workout(models.Model):
get_user_model(), on_delete=models.CASCADE, related_name="workouts"
)
# Visibility levels
PUBLIC = "PU" # Visible to all authenticated users
COACH = "CO" # Visible only to owner and their coach
PRIVATE = "PR" # Visible only to owner
VISIBILITY_CHOICES = [
(PUBLIC, "Public"),
(COACH, "Coach"),
(PRIVATE, "Private"),
] # Choices for visibility level
visibility = models.CharField(
max_length=2, choices=VISIBILITY_CHOICES, default=COACH
max_length=2,
choices=Visibility.choices,
default=Visibility.COACH
)
class Meta:
......
......@@ -2,6 +2,7 @@
"""
from rest_framework import permissions
from workouts.models import Workout
from workouts.models import Visibility
class IsOwner(permissions.BasePermission):
......@@ -51,14 +52,14 @@ class IsPublic(permissions.BasePermission):
"""Checks whether the object (workout) has visibility of Public."""
def has_object_permission(self, request, view, obj):
return obj.visibility == "PU"
return obj.visibility == Visibility.PUBLIC
class IsWorkoutPublic(permissions.BasePermission):
"""Checks whether the object's workout has visibility of Public."""
def has_object_permission(self, request, view, obj):
return obj.workout.visibility == "PU"
return obj.workout.visibility == Visibility.PUBLIC
class IsReadOnly(permissions.BasePermission):
......
......@@ -33,6 +33,7 @@ import json
from collections import namedtuple
import base64, pickle
from django.core.signing import Signer
from workouts.models import Visibility
@api_view(["GET"])
......@@ -131,7 +132,7 @@ class WorkoutList(
def perform_create(self, serializer):
serializer.save(owner=self.request.user)
def get_queryset(self):
def get_queryset(self):
qs = Workout.objects.none()
if self.request.user:
# A workout should be visible to the requesting user if any of the following hold:
......@@ -139,8 +140,9 @@ class WorkoutList(
# - The owner of the workout is the requesting user
# - The workout has coach visibility and the requesting user is the owner's coach
qs = Workout.objects.filter(
Q(visibility="PU")
| (Q(visibility="CO") & Q(owner__coach=self.request.user))
Q(visibility=Visibility.PUBLIC)
| Q(owner=self.request.user)
| (Q(visibility=Visibility.COACH) & Q(owner__coach=self.request.user))
).distinct()
return qs
......@@ -293,14 +295,14 @@ class ExerciseInstanceList(
qs = ExerciseInstance.objects.filter(
Q(workout__owner=self.request.user)
| (
(Q(workout__visibility="CO") | Q(workout__visibility="PU"))
(Q(workout__visibility=Visibility.COACH) | Q(workout__visibility=Visibility.PUBLIC))
& Q(workout__owner__coach=self.request.user)
)
).distinct()
return qs
class ExerciseInstanceDetail(
mixins.RetrieveModelMixin,
mixins.UpdateModelMixin,
......@@ -357,14 +359,14 @@ class WorkoutFileList(
Q(owner=self.request.user)
| Q(workout__owner=self.request.user)
| (
Q(workout__visibility="CO")
Q(workout__visibility=Visibility.COACH)
& Q(workout__owner__coach=self.request.user)
)
).distinct()
return qs
class WorkoutFileDetail(
mixins.RetrieveModelMixin,
mixins.UpdateModelMixin,
......
const HOST = "http://localhost:8000";
const HOST = "http://localhost:9090";
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment