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

code smell - shotgun surgery

parent a8086afa
No related branches found
No related tags found
No related merge requests found
Pipeline #170001 passed
from rest_framework import permissions from rest_framework import permissions
from workouts.models import Visibility
class IsCommentVisibleToUser(permissions.BasePermission): class IsCommentVisibleToUser(permissions.BasePermission):
""" """
...@@ -14,8 +14,8 @@ class IsCommentVisibleToUser(permissions.BasePermission): ...@@ -14,8 +14,8 @@ class IsCommentVisibleToUser(permissions.BasePermission):
def has_object_permission(self, request, view, obj): def has_object_permission(self, request, view, obj):
# Write permissions are only allowed to the owner. # Write permissions are only allowed to the owner.
return ( return (
obj.workout.visibility == "PU" obj.workout.visibility == Visibility.PUBLIC
or obj.owner == request.user or obj.owner == request.user
or (obj.workout.visibility == "CO" and obj.owner.coach == request.user) or (obj.workout.visibility == Visibility.COACH and obj.owner.coach == request.user)
or obj.workout.owner == request.user or obj.workout.owner == request.user
) )
...@@ -24,6 +24,16 @@ class OverwriteStorage(FileSystemStorage): ...@@ -24,6 +24,16 @@ class OverwriteStorage(FileSystemStorage):
if self.exists(name): if self.exists(name):
os.remove(os.path.join(settings.MEDIA_ROOT, name)) os.remove(os.path.join(settings.MEDIA_ROOT, name))
class Visibility:
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"),
]
# Create your models here. # Create your models here.
class Workout(models.Model): class Workout(models.Model):
...@@ -47,18 +57,8 @@ class Workout(models.Model): ...@@ -47,18 +57,8 @@ class Workout(models.Model):
get_user_model(), on_delete=models.CASCADE, related_name="workouts" 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( visibility = models.CharField(
max_length=2, choices=VISIBILITY_CHOICES, default=COACH max_length=2, choices=Visibility.VISIBILITY_CHOICES, default=Visibility.COACH
) )
class Meta: class Meta:
......
...@@ -22,7 +22,7 @@ from workouts.permissions import ( ...@@ -22,7 +22,7 @@ from workouts.permissions import (
IsWorkoutPublic, IsWorkoutPublic,
) )
from workouts.mixins import CreateListModelMixin from workouts.mixins import CreateListModelMixin
from workouts.models import Workout, Exercise, ExerciseInstance, Goal, WorkoutFile from workouts.models import Workout, Exercise, ExerciseInstance, Goal, WorkoutFile, Visibility
from workouts.serializers import WorkoutSerializer, ExerciseSerializer, GoalSerializer from workouts.serializers import WorkoutSerializer, ExerciseSerializer, GoalSerializer
from workouts.serializers import RememberMeSerializer from workouts.serializers import RememberMeSerializer
from workouts.serializers import ExerciseInstanceSerializer, WorkoutFileSerializer from workouts.serializers import ExerciseInstanceSerializer, WorkoutFileSerializer
...@@ -139,8 +139,8 @@ class WorkoutList( ...@@ -139,8 +139,8 @@ class WorkoutList(
# - The owner of the workout is the requesting user # - The owner of the workout is the requesting user
# - The workout has coach visibility and the requesting user is the owner's coach # - The workout has coach visibility and the requesting user is the owner's coach
qs = Workout.objects.filter( qs = Workout.objects.filter(
Q(visibility="PU") Q(visibility=Visibility.PUBLIC)
| (Q(visibility="CO") & Q(owner__coach=self.request.user)) | (Q(visibility=Visibility.COACH) & Q(owner__coach=self.request.user))
).distinct() ).distinct()
return qs return qs
...@@ -293,7 +293,7 @@ class ExerciseInstanceList( ...@@ -293,7 +293,7 @@ class ExerciseInstanceList(
qs = ExerciseInstance.objects.filter( qs = ExerciseInstance.objects.filter(
Q(workout__owner=self.request.user) 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) & Q(workout__owner__coach=self.request.user)
) )
).distinct() ).distinct()
...@@ -357,7 +357,7 @@ class WorkoutFileList( ...@@ -357,7 +357,7 @@ class WorkoutFileList(
Q(owner=self.request.user) Q(owner=self.request.user)
| Q(workout__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) & Q(workout__owner__coach=self.request.user)
) )
).distinct() ).distinct()
......
...@@ -13,30 +13,32 @@ describe('Black box testing', () => { ...@@ -13,30 +13,32 @@ describe('Black box testing', () => {
input[0].dispatchEvent(new Event('input', { bubbles: true })) input[0].dispatchEvent(new Event('input', { bubbles: true }))
input.val('2017-04-30T13:00') input.val('2017-04-30T13:00')
}).click() }).click()
cy.get('#inputNotes').type('This is a note') cy.get('#inputNotes').type('This is a note') //dsadasdsdsa
cy.get("#btn-ok-workout").click(); cy.get("#btn-ok-workout").click();
} }
it('Logg public and check if added', function() {
this.login(this.athleteUser)
logWorkout("Public Workout", true);
cy.url().should('include', "/workouts.html");
cy.get('h5').contains('Public Workout')
})
it('Logg personal workout and check if added in my list', function() { it('Logg personal workout and check if added in my list', function() {
this.login(this.athleteUser) this.login(this.athleteUser)
cy.get('#list-my-workouts-list').click(); cy.get('#list-my-workouts-list').click();
cy.wait(2000)
cy.get('h5').contains('Public Workout'); cy.get('h5').contains('Public Workout');
}) })
it('Logg public personal and check if added', function() { it('Logg public personal and check if added', function() {
this.login(this.athleteUser) this.login(this.athleteUser)
cy.get('#list-public-workouts-list').click(); cy.get('#list-public-workouts-list').click();
cy.wait(2000)
cy.get('h5').contains('Public Workout'); cy.get('h5').contains('Public Workout');
}) })
it('Logg public and check if added', function() {
this.login(this.athleteUser)
logWorkout("Public Workout", true);
cy.url().should('include', "/workouts.html");
cy.get('h5').contains('Public Workout')
})
it('See details of public workout', function() { it('See details of public workout', function() {
this.login(this.athleteUser) this.login(this.athleteUser)
...@@ -56,6 +58,7 @@ describe('Black box testing', () => { ...@@ -56,6 +58,7 @@ describe('Black box testing', () => {
cy.wait(2000) cy.wait(2000)
cy.get('h5').contains('Private Workout').should('not.exist'); cy.get('h5').contains('Private Workout').should('not.exist');
cy.get('#list-public-workouts-list').click(); cy.get('#list-public-workouts-list').click();
cy.wait(2000)
cy.get('h5').contains('Private Workout').should('not.exist'); cy.get('h5').contains('Private Workout').should('not.exist');
}) })
......
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