Skip to content

Commit

Permalink
User API creation updates
Browse files Browse the repository at this point in the history
  • Loading branch information
jmkitavi committed Mar 20, 2017
1 parent 22ed153 commit 0aaab13
Show file tree
Hide file tree
Showing 3 changed files with 135 additions and 69 deletions.
45 changes: 24 additions & 21 deletions wger/core/api/serializers.py
Original file line number Diff line number Diff line change
Expand Up @@ -15,10 +15,10 @@
# You should have received a copy of the GNU Affero General Public License
# along with Workout Manager. If not, see <http://www.gnu.org/licenses/>.

from rest_framework import serializers
# add user model
from django.contrib.auth.models import User

from rest_framework import serializers

from wger.core.models import (
UserProfile,
Language,
Expand All @@ -27,66 +27,69 @@
RepetitionUnit,
WeightUnit)

# User Registration Serializer

class UserRegistrationSerializer(serializers.ModelSerializer):
'''User creation'''
"""
User registration serializer
"""
class Meta:
model = User
fields = {'username', 'email', 'password'}
extra_kwags = {
fields = ('username', 'email', 'password')
extra_kwargs = {
'password': {'write_only': True}
}


class UserprofileSerializer(serializers.ModelSerializer):
'''
"""
Workout session serializer
'''
"""
class Meta:
model = UserProfile


class UsernameSerializer(serializers.Serializer):
'''
"""
Serializer to extract the username
'''
"""
username = serializers.CharField()


class LanguageSerializer(serializers.ModelSerializer):
'''
"""
Language serializer
'''
"""
class Meta:
model = Language


class DaysOfWeekSerializer(serializers.ModelSerializer):
'''
"""
DaysOfWeek serializer
'''
"""
class Meta:
model = DaysOfWeek


class LicenseSerializer(serializers.ModelSerializer):
'''
"""
License serializer
'''
"""
class Meta:
model = License


class RepetitionUnitSerializer(serializers.ModelSerializer):
'''
"""
Repetition unit serializer
'''
"""
class Meta:
model = RepetitionUnit


class WeightUnitSerializer(serializers.ModelSerializer):
'''
"""
Weight unit serializer
'''
"""
class Meta:
model = WeightUnit
model = WeightUnit
106 changes: 79 additions & 27 deletions wger/core/api/views.py
Original file line number Diff line number Diff line change
Expand Up @@ -14,13 +14,14 @@
#
# You should have received a copy of the GNU Affero General Public License
# along with Workout Manager. If not, see <http://www.gnu.org/licenses/>.
import re

from django.db import IntegrityError
from django.contrib.auth.models import User
from rest_framework import viewsets
from rest_framework.response import Response
from rest_framework.decorators import detail_route
from rest_framework.authentication import SessionAuthentication, BasicAuthentication, TokenAuthentication
from rest_framework.permissions import IsAuthenticated


from wger.core.models import (
UserProfile,
Expand All @@ -30,61 +31,112 @@
RepetitionUnit,
WeightUnit)
from wger.core.api.serializers import (
UserRegistrationSerializer,
UsernameSerializer,
UserRegistrationSerializer,
LanguageSerializer,
DaysOfWeekSerializer,
LicenseSerializer,
RepetitionUnitSerializer,
WeightUnitSerializer
)
from wger.core.api.serializers import UserprofileSerializer
from wger.core.models import Language
from rest_framework import status
from rest_framework.authentication import SessionAuthentication, BasicAuthentication, \
TokenAuthentication
from wger.utils.permissions import UpdateOnlyPermission, WgerPermission
from django.utils import translation
from rest_framework.permissions import IsAuthenticated
from rest_framework.response import Response
from django.contrib.auth.hashers import make_password
from rest_framework import serializers
from wger.config.models import GymConfig


class UserViewSet(viewsets.ModelViewSet):
'''API endpoint for login and registration of user'''
class RegisterUserViewSet(viewsets.ModelViewSet):
"""
API endpoint that allows login and registration of users
"""
serializer_class = UserRegistrationSerializer
http_method_names = ['post', 'get']
http_method_names = ['post']
authentication_classes = (SessionAuthentication, BasicAuthentication, TokenAuthentication,)
permission_classes = (IsAuthenticated)
queryset = User.objects.all().order_by('-date_joined')
permission_classes = (IsAuthenticated,)

def create(self, request):
# Creates a user and assign them a default gym

# validates email address
if request.data.get('email'):
email_format = re.compile(r'(^[a-zA-Z0-9_.+-]+@[a-zA-Z0-9-]+\.[a-zA-Z0-9-.]+$)')
if not re.match(email_format, request.data.get('email')):
raise serializers.ValidationError("Invalid email format")

user = User(username=request.data['username'], email=request.data.get('email', None))
# Hashes user's password
user.password = make_password(request.data['password'])
# Handles case for when the user already exists
try:
user.save()
except IntegrityError:
content = {"message": "User already exists"}
return Response(content, status=status.HTTP_400_BAD_REQUEST)

# Sets the language for the user
language = Language.objects.get(short_name=translation.get_language())
user.userprofile.notification_language = language

# Sets default gym, if needed
gym_config = GymConfig.objects.get(pk=1)
if gym_config.default_gym:
user.userprofile.gym = gym_config.default_gym

# Creates gym user configuration object
config = GymUserConfig()
config.gym = gym_config.default_gym
config.user = user
config.save()

user.userprofile.save()

serializer = UserRegistrationSerializer(user)
return Response(serializer.data, status=status.HTTP_201_CREATED)


class UserProfileViewSet(viewsets.ModelViewSet):
'''
"""
API endpoint for workout objects
'''
"""
is_private = True
serializer_class = UserprofileSerializer
permission_classes = (WgerPermission, UpdateOnlyPermission)
ordering_fields = '__all__'

def get_queryset(self):
'''
"""
Only allow access to appropriate objects
'''
"""
return UserProfile.objects.filter(user=self.request.user)

def get_owner_objects(self):
'''
"""
Return objects to check for ownership permission
'''
"""
return [(User, 'user')]

@detail_route()
def username(self, request, pk):
'''
"""
Return the username
'''
"""

user = self.get_object().user
return Response(UsernameSerializer(user).data)


class LanguageViewSet(viewsets.ReadOnlyModelViewSet):
'''
"""
API endpoint for workout objects
'''
"""
queryset = Language.objects.all()
serializer_class = LanguageSerializer
ordering_fields = '__all__'
Expand All @@ -93,19 +145,19 @@ class LanguageViewSet(viewsets.ReadOnlyModelViewSet):


class DaysOfWeekViewSet(viewsets.ReadOnlyModelViewSet):
'''
"""
API endpoint for workout objects
'''
"""
queryset = DaysOfWeek.objects.all()
serializer_class = DaysOfWeekSerializer
ordering_fields = '__all__'
filter_fields = ('day_of_week', )


class LicenseViewSet(viewsets.ReadOnlyModelViewSet):
'''
"""
API endpoint for workout objects
'''
"""
queryset = License.objects.all()
serializer_class = LicenseSerializer
ordering_fields = '__all__'
Expand All @@ -115,20 +167,20 @@ class LicenseViewSet(viewsets.ReadOnlyModelViewSet):


class RepetitionUnitViewSet(viewsets.ReadOnlyModelViewSet):
'''
"""
API endpoint for repetition units objects
'''
"""
queryset = RepetitionUnit.objects.all()
serializer_class = RepetitionUnitSerializer
ordering_fields = '__all__'
filter_fields = ('name', )


class WeightUnitViewSet(viewsets.ReadOnlyModelViewSet):
'''
"""
API endpoint for weight units objects
'''
"""
queryset = WeightUnit.objects.all()
serializer_class = WeightUnitSerializer
ordering_fields = '__all__'
filter_fields = ('name', )
filter_fields = ('name', )
53 changes: 32 additions & 21 deletions wger/urls.py
Original file line number Diff line number Diff line change
Expand Up @@ -79,60 +79,71 @@
v1_api.register(core_api.UserProfileResource())
v1_api.register(core_api.LicenseResource())


# /api/v2 - django rest framework

router = routers.DefaultRouter()

# Manager app
router.register(r'workout', manager_api_views.WorkoutViewSet, base_name='workout')
router.register(r'workoutsession', manager_api_views.WorkoutSessionViewSet,
base_name='workoutsession')
router.register(
r'workoutsession',
manager_api_views.WorkoutSessionViewSet,
base_name='workoutsession')
router.register(r'schedulestep', manager_api_views.ScheduleStepViewSet, base_name='schedulestep')
router.register(r'schedule', manager_api_views.ScheduleViewSet, base_name='schedule')
router.register(r'day', manager_api_views.DayViewSet, base_name='day')
router.register(r'set', manager_api_views.SetViewSet, base_name='Set')
router.register(r'setting', manager_api_views.SettingViewSet, base_name='Setting')
router.register(r'workoutlog', manager_api_views.WorkoutLogViewSet, base_name='workoutlog')
# register user route
router.register(r'user', core_api_views.UserViewSet, base_name='user')


# Core app
router.register(r'userprofile', core_api_views.UserProfileViewSet, base_name='userprofile')
router.register(r'user/register', core_api_views.RegisterUserViewSet, base_name='registeruser')
router.register(r'language', core_api_views.LanguageViewSet, base_name='language')
router.register(r'daysofweek', core_api_views.DaysOfWeekViewSet, base_name='daysofweek')
router.register(r'license', core_api_views.LicenseViewSet, base_name='license')
router.register(r'setting-repetitionunit', core_api_views.RepetitionUnitViewSet,
router.register(r'setting-repetitionunit',
core_api_views.RepetitionUnitViewSet,
base_name='setting-repetition-unit')
router.register(r'setting-weightunit', core_api_views.WeightUnitViewSet,
base_name='setting-weight-unit')
router.register(
r'setting-weightunit',
core_api_views.WeightUnitViewSet,
base_name='setting-weight-unit')

# Exercises app
router.register(r'exercise', exercises_api_views.ExerciseViewSet, base_name='exercise')
router.register(r'equipment', exercises_api_views.EquipmentViewSet, base_name='api')
router.register(r'exercisecategory', exercises_api_views.ExerciseCategoryViewSet,
base_name='exercisecategory')
router.register(r'exerciseimage', exercises_api_views.ExerciseImageViewSet,
base_name='exerciseimage')
router.register(r'exercisecomment', exercises_api_views.ExerciseCommentViewSet,
base_name='exercisecomment')
router.register(
r'exercisecategory',
exercises_api_views.ExerciseCategoryViewSet,
base_name='exercisecategory')
router.register(
r'exerciseimage',
exercises_api_views.ExerciseImageViewSet,
base_name='exerciseimage')
router.register(
r'exercisecomment',
exercises_api_views.ExerciseCommentViewSet,
base_name='exercisecomment')
router.register(r'muscle', exercises_api_views.MuscleViewSet, base_name='muscle')

# Nutrition app
router.register(r'ingredient', nutrition_api_views.IngredientViewSet, base_name='api-ingredient')
router.register(r'weightunit', nutrition_api_views.WeightUnitViewSet, base_name='weightunit')
router.register(r'ingredientweightunit',
nutrition_api_views.IngredientWeightUnitViewSet, base_name='ingredientweightunit')
router.register(r'nutritionplan', nutrition_api_views.NutritionPlanViewSet,
base_name='nutritionplan')
router.register(r'ingredientweightunit', nutrition_api_views.IngredientWeightUnitViewSet,
base_name='ingredientweightunit')
router.register(
r'nutritionplan',
nutrition_api_views.NutritionPlanViewSet,
base_name='nutritionplan')
router.register(r'meal', nutrition_api_views.MealViewSet, base_name='meal')
router.register(r'mealitem', nutrition_api_views.MealItemViewSet, base_name='mealitem')

# Weight app
router.register(r'weightentry', weight_api_views.WeightEntryViewSet, base_name='weightentry')


from django.contrib import admin

admin.autodiscover()

#
Expand Down Expand Up @@ -186,4 +197,4 @@
# URL for user uploaded files, served like this during development only
#
if settings.DEBUG:
urlpatterns += static(settings.MEDIA_URL, document_root=settings.MEDIA_ROOT)
urlpatterns += static(settings.MEDIA_URL, document_root=settings.MEDIA_ROOT)

0 comments on commit 0aaab13

Please sign in to comment.