GymProgram and Appointment entities
This commit is contained in:
parent
276168f328
commit
e03c6c0a14
0
server/appointment/__init__.py
Normal file
0
server/appointment/__init__.py
Normal file
3
server/appointment/admin.py
Normal file
3
server/appointment/admin.py
Normal file
@ -0,0 +1,3 @@
|
||||
from django.contrib import admin
|
||||
|
||||
# Register your models here.
|
6
server/appointment/apps.py
Normal file
6
server/appointment/apps.py
Normal file
@ -0,0 +1,6 @@
|
||||
from django.apps import AppConfig
|
||||
|
||||
|
||||
class AppointmentConfig(AppConfig):
|
||||
default_auto_field = 'django.db.models.BigAutoField'
|
||||
name = 'appointment'
|
25
server/appointment/migrations/0001_initial.py
Normal file
25
server/appointment/migrations/0001_initial.py
Normal file
@ -0,0 +1,25 @@
|
||||
# Generated by Django 4.2.16 on 2024-10-09 16:37
|
||||
|
||||
from django.db import migrations, models
|
||||
import django.utils.timezone
|
||||
|
||||
|
||||
class Migration(migrations.Migration):
|
||||
|
||||
initial = True
|
||||
|
||||
dependencies = [
|
||||
]
|
||||
|
||||
operations = [
|
||||
migrations.CreateModel(
|
||||
name='Appointment',
|
||||
fields=[
|
||||
('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
|
||||
('start_date', models.DateField(default=django.utils.timezone.now)),
|
||||
],
|
||||
options={
|
||||
'db_table': 'appointment_table',
|
||||
},
|
||||
),
|
||||
]
|
22
server/appointment/migrations/0002_initial.py
Normal file
22
server/appointment/migrations/0002_initial.py
Normal file
@ -0,0 +1,22 @@
|
||||
# Generated by Django 4.2.16 on 2024-10-09 16:37
|
||||
|
||||
from django.db import migrations, models
|
||||
import django.db.models.deletion
|
||||
|
||||
|
||||
class Migration(migrations.Migration):
|
||||
|
||||
initial = True
|
||||
|
||||
dependencies = [
|
||||
('gym_program', '0001_initial'),
|
||||
('appointment', '0001_initial'),
|
||||
]
|
||||
|
||||
operations = [
|
||||
migrations.AddField(
|
||||
model_name='appointment',
|
||||
name='gym_program',
|
||||
field=models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='gym_program.gymprogram'),
|
||||
),
|
||||
]
|
23
server/appointment/migrations/0003_initial.py
Normal file
23
server/appointment/migrations/0003_initial.py
Normal file
@ -0,0 +1,23 @@
|
||||
# Generated by Django 4.2.16 on 2024-10-09 16:37
|
||||
|
||||
from django.conf import settings
|
||||
from django.db import migrations, models
|
||||
import django.db.models.deletion
|
||||
|
||||
|
||||
class Migration(migrations.Migration):
|
||||
|
||||
initial = True
|
||||
|
||||
dependencies = [
|
||||
('appointment', '0002_initial'),
|
||||
migrations.swappable_dependency(settings.AUTH_USER_MODEL),
|
||||
]
|
||||
|
||||
operations = [
|
||||
migrations.AddField(
|
||||
model_name='appointment',
|
||||
name='user',
|
||||
field=models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to=settings.AUTH_USER_MODEL),
|
||||
),
|
||||
]
|
0
server/appointment/migrations/__init__.py
Normal file
0
server/appointment/migrations/__init__.py
Normal file
11
server/appointment/models.py
Normal file
11
server/appointment/models.py
Normal file
@ -0,0 +1,11 @@
|
||||
from django.db import models
|
||||
from django.utils import timezone
|
||||
|
||||
|
||||
class Appointment(models.Model):
|
||||
user = models.ForeignKey('user.User', on_delete=models.CASCADE)
|
||||
gym_program = models.ForeignKey('gym_program.GymProgram', on_delete=models.CASCADE)
|
||||
start_date = models.DateField(blank=False, null=False, default=timezone.now)
|
||||
|
||||
class Meta:
|
||||
db_table = 'appointment_table'
|
16
server/appointment/serializers.py
Normal file
16
server/appointment/serializers.py
Normal file
@ -0,0 +1,16 @@
|
||||
from rest_framework import serializers
|
||||
from server.user.serializers import CustomUserDetailsSerializer
|
||||
from server.gym_program.serializers import GymProgramSerializer
|
||||
from .models import Appointment
|
||||
|
||||
|
||||
class AppointmentSerializer(serializers.ModelSerializer):
|
||||
user = CustomUserDetailsSerializer(read_only=True)
|
||||
gym_program = GymProgramSerializer(read_only=True)
|
||||
|
||||
class Meta:
|
||||
model = Appointment
|
||||
fields = ('id',
|
||||
'user',
|
||||
'gym_program',
|
||||
'start_date')
|
3
server/appointment/tests.py
Normal file
3
server/appointment/tests.py
Normal file
@ -0,0 +1,3 @@
|
||||
from django.test import TestCase
|
||||
|
||||
# Create your tests here.
|
11
server/appointment/views.py
Normal file
11
server/appointment/views.py
Normal file
@ -0,0 +1,11 @@
|
||||
from rest_framework.decorators import api_view
|
||||
from .models import Appointment
|
||||
from .serializers import AppointmentSerializer
|
||||
from rest_framework.response import Response
|
||||
|
||||
|
||||
@api_view(['GET'])
|
||||
def appointment_list(request):
|
||||
appointments = Appointment.objects.all()
|
||||
serializer = AppointmentSerializer(appointments, many=True)
|
||||
return Response(serializer.data)
|
27
server/gym_program/migrations/0001_initial.py
Normal file
27
server/gym_program/migrations/0001_initial.py
Normal file
@ -0,0 +1,27 @@
|
||||
# Generated by Django 4.2.16 on 2024-10-09 16:37
|
||||
|
||||
import django.core.validators
|
||||
from django.db import migrations, models
|
||||
|
||||
|
||||
class Migration(migrations.Migration):
|
||||
|
||||
initial = True
|
||||
|
||||
dependencies = [
|
||||
]
|
||||
|
||||
operations = [
|
||||
migrations.CreateModel(
|
||||
name='GymProgram',
|
||||
fields=[
|
||||
('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
|
||||
('name', models.CharField(default='', max_length=64)),
|
||||
('description', models.TextField(blank=True, default='')),
|
||||
('duration', models.PositiveSmallIntegerField(validators=[django.core.validators.MinValueValidator(1), django.core.validators.MaxValueValidator(4)])),
|
||||
],
|
||||
options={
|
||||
'db_table': 'gym_program_table',
|
||||
},
|
||||
),
|
||||
]
|
23
server/gym_program/migrations/0002_initial.py
Normal file
23
server/gym_program/migrations/0002_initial.py
Normal file
@ -0,0 +1,23 @@
|
||||
# Generated by Django 4.2.16 on 2024-10-09 16:37
|
||||
|
||||
from django.conf import settings
|
||||
from django.db import migrations, models
|
||||
|
||||
|
||||
class Migration(migrations.Migration):
|
||||
|
||||
initial = True
|
||||
|
||||
dependencies = [
|
||||
('gym_program', '0001_initial'),
|
||||
migrations.swappable_dependency(settings.AUTH_USER_MODEL),
|
||||
('appointment', '0003_initial'),
|
||||
]
|
||||
|
||||
operations = [
|
||||
migrations.AddField(
|
||||
model_name='gymprogram',
|
||||
name='users',
|
||||
field=models.ManyToManyField(through='appointment.Appointment', to=settings.AUTH_USER_MODEL),
|
||||
),
|
||||
]
|
@ -1,3 +1,16 @@
|
||||
from django.db import models
|
||||
from django.core.validators import MinValueValidator, MaxValueValidator
|
||||
|
||||
# Create your models here.
|
||||
|
||||
class GymProgram(models.Model):
|
||||
|
||||
name = models.CharField(max_length=64, blank=False, default='')
|
||||
description = models.TextField(blank=True, default='')
|
||||
duration = models.PositiveSmallIntegerField(validators=[MinValueValidator(1), MaxValueValidator(4)])
|
||||
users = models.ManyToManyField('user.User', through='appointment.Appointment')
|
||||
|
||||
def __str__(self):
|
||||
return f"Name: {self.name}, Description: {self.description}, Duration: {self.duration}"
|
||||
|
||||
class Meta:
|
||||
db_table = 'gym_program_table'
|
||||
|
16
server/gym_program/serializers.py
Normal file
16
server/gym_program/serializers.py
Normal file
@ -0,0 +1,16 @@
|
||||
from rest_framework import serializers
|
||||
from .models import GymProgram
|
||||
from server.user.serializers import CustomUserDetailsSerializer
|
||||
|
||||
|
||||
class GymProgramSerializer(serializers.ModelSerializer):
|
||||
users = CustomUserDetailsSerializer(many=True, read_only=True)
|
||||
|
||||
class Meta:
|
||||
model = GymProgram
|
||||
fields = ('id',
|
||||
'name',
|
||||
'description',
|
||||
'duration',
|
||||
'users'
|
||||
)
|
@ -1,3 +1,64 @@
|
||||
from django.shortcuts import render
|
||||
from rest_framework.decorators import api_view, permission_classes
|
||||
from rest_framework.response import Response
|
||||
from rest_framework import status
|
||||
from django.shortcuts import get_object_or_404
|
||||
|
||||
# Create your views here.
|
||||
from .models import GymProgram
|
||||
from server.appointment.models import Appointment
|
||||
from .serializers import GymProgramSerializer
|
||||
from server.appointment.serializers import AppointmentSerializer
|
||||
from server.user.models import User
|
||||
|
||||
|
||||
@api_view(['GET', 'POST'])
|
||||
def gym_program_list(request):
|
||||
if request.method == 'GET':
|
||||
gym_programs = GymProgram.objects.all()
|
||||
serializer = GymProgramSerializer(gym_programs, many=True)
|
||||
return Response(serializer.data)
|
||||
|
||||
elif request.method == 'POST':
|
||||
serializer = GymProgramSerializer(data=request.data)
|
||||
if serializer.is_valid():
|
||||
serializer.save()
|
||||
return Response(serializer.data, status=status.HTTP_201_CREATED)
|
||||
return Response(serializer.errors, status=status.HTTP_400_BAD_REQUEST)
|
||||
|
||||
|
||||
@api_view(['GET', 'PUT', 'DELETE'])
|
||||
def gym_program_detail(request, pk):
|
||||
gym_program = get_object_or_404(GymProgram, pk=pk)
|
||||
|
||||
if request.method == 'GET':
|
||||
serializer = GymProgramSerializer(gym_program)
|
||||
return Response(serializer.data)
|
||||
|
||||
elif request.method == 'PUT':
|
||||
serializer = GymProgramSerializer(gym_program, data=request.data)
|
||||
if serializer.is_valid():
|
||||
serializer.save()
|
||||
return Response(serializer.data)
|
||||
return Response(serializer.errors, status=status.HTTP_400_BAD_REQUEST)
|
||||
|
||||
elif request.method == 'DELETE':
|
||||
gym_program.delete()
|
||||
return Response(status=status.HTTP_204_NO_CONTENT)
|
||||
|
||||
|
||||
@api_view(['POST', 'DELETE'])
|
||||
def manage_user_program(request, gym_program_pk, user_pk):
|
||||
gym_program = get_object_or_404(GymProgram, pk=gym_program_pk)
|
||||
user = get_object_or_404(User, pk=user_pk)
|
||||
|
||||
if request.method == 'POST':
|
||||
if Appointment.objects.filter(user=user, gym_program=gym_program).exists():
|
||||
return Response({"detail": "User is already part of the program."}, status=status.HTTP_400_BAD_REQUEST)
|
||||
|
||||
appointment = Appointment.objects.create(user=user, gym_program=gym_program)
|
||||
serializer = AppointmentSerializer(appointment)
|
||||
return Response(serializer.data, status=status.HTTP_201_CREATED)
|
||||
|
||||
elif request.method == 'DELETE':
|
||||
appointment = get_object_or_404(Appointment, gym_program=gym_program, user=user)
|
||||
appointment.delete()
|
||||
return Response(status=status.HTTP_204_NO_CONTENT)
|
||||
|
@ -1,9 +1,7 @@
|
||||
# Generated by Django 4.2.16 on 2024-10-05 14:16
|
||||
# Generated by Django 4.2.16 on 2024-10-09 16:37
|
||||
|
||||
from django.conf import settings
|
||||
import django.core.validators
|
||||
from django.db import migrations, models
|
||||
import django.db.models.deletion
|
||||
|
||||
|
||||
class Migration(migrations.Migration):
|
||||
@ -11,7 +9,6 @@ class Migration(migrations.Migration):
|
||||
initial = True
|
||||
|
||||
dependencies = [
|
||||
migrations.swappable_dependency(settings.AUTH_USER_MODEL),
|
||||
]
|
||||
|
||||
operations = [
|
||||
@ -23,7 +20,9 @@ class Migration(migrations.Migration):
|
||||
('weight', models.FloatField(default=0.0, validators=[django.core.validators.MinValueValidator(0.0)])),
|
||||
('height', models.FloatField(default=0.0, validators=[django.core.validators.MinValueValidator(0.0)])),
|
||||
('birth_date', models.DateField(default='2000-01-01')),
|
||||
('user', models.OneToOneField(on_delete=django.db.models.deletion.CASCADE, to=settings.AUTH_USER_MODEL)),
|
||||
],
|
||||
options={
|
||||
'db_table': 'metric_table',
|
||||
},
|
||||
),
|
||||
]
|
||||
|
23
server/metric/migrations/0002_initial.py
Normal file
23
server/metric/migrations/0002_initial.py
Normal file
@ -0,0 +1,23 @@
|
||||
# Generated by Django 4.2.16 on 2024-10-09 16:37
|
||||
|
||||
from django.conf import settings
|
||||
from django.db import migrations, models
|
||||
import django.db.models.deletion
|
||||
|
||||
|
||||
class Migration(migrations.Migration):
|
||||
|
||||
initial = True
|
||||
|
||||
dependencies = [
|
||||
migrations.swappable_dependency(settings.AUTH_USER_MODEL),
|
||||
('metric', '0001_initial'),
|
||||
]
|
||||
|
||||
operations = [
|
||||
migrations.AddField(
|
||||
model_name='metric',
|
||||
name='user',
|
||||
field=models.OneToOneField(on_delete=django.db.models.deletion.CASCADE, to=settings.AUTH_USER_MODEL),
|
||||
),
|
||||
]
|
@ -20,4 +20,7 @@ class Metric(models.Model):
|
||||
birth_date = models.DateField(blank=False, null=False, default='2000-01-01')
|
||||
|
||||
def __str__(self):
|
||||
return f"{self.gender}, Weight: {self.weight}, Height: {self.height}, Birth date: {self.birth_date}"
|
||||
return f"Gender: {self.gender}, Weight: {self.weight}, Height: {self.height}, Birth date: {self.birth_date}"
|
||||
|
||||
class Meta:
|
||||
db_table = 'metric_table'
|
||||
|
@ -11,3 +11,20 @@ class MetricSerializer(serializers.ModelSerializer):
|
||||
'height',
|
||||
'birth_date'
|
||||
)
|
||||
|
||||
|
||||
class MetricListSerializer(serializers.ModelSerializer):
|
||||
email = serializers.SerializerMethodField()
|
||||
|
||||
class Meta:
|
||||
model = Metric
|
||||
fields = ('id',
|
||||
'email',
|
||||
'gender',
|
||||
'weight',
|
||||
'height',
|
||||
'birth_date'
|
||||
)
|
||||
|
||||
def get_email(self, obj):
|
||||
return obj.user.email
|
||||
|
@ -3,18 +3,29 @@ from rest_framework.response import Response
|
||||
from rest_framework import status
|
||||
from django.shortcuts import get_object_or_404
|
||||
from .models import Metric
|
||||
from .serializers import MetricSerializer
|
||||
from .serializers import MetricSerializer, MetricListSerializer
|
||||
|
||||
|
||||
@api_view(['GET', 'POST'])
|
||||
def metric_list(request):
|
||||
user = request.user
|
||||
|
||||
if request.method == 'GET':
|
||||
metrics = Metric.objects.all()
|
||||
serializer = MetricSerializer(metrics, many=True)
|
||||
serializer = MetricListSerializer(metrics, many=True)
|
||||
return Response(serializer.data)
|
||||
|
||||
elif request.method == 'POST':
|
||||
if Metric.objects.filter(user=user).exists():
|
||||
return Response({'detail': 'Metric already exists for this user.'}, status=status.HTTP_400_BAD_REQUEST)
|
||||
serializer = MetricSerializer(data=request.data)
|
||||
if serializer.is_valid():
|
||||
serializer.save(user=user)
|
||||
return Response(serializer.data, status=status.HTTP_201_CREATED)
|
||||
return Response(serializer.errors, status=status.HTTP_400_BAD_REQUEST)
|
||||
|
||||
@api_view(['GET', 'PUT', 'POST', 'DELETE'])
|
||||
|
||||
@api_view(['GET', 'PUT', 'DELETE'])
|
||||
def metric_detail(request):
|
||||
user = request.user
|
||||
|
||||
@ -31,15 +42,6 @@ def metric_detail(request):
|
||||
return Response(serializer.data)
|
||||
return Response(serializer.errors, status=status.HTTP_400_BAD_REQUEST)
|
||||
|
||||
elif request.method == 'POST':
|
||||
if Metric.objects.filter(user=user).exists():
|
||||
return Response({'detail': 'Metric already exists for this user.'}, status=status.HTTP_400_BAD_REQUEST)
|
||||
serializer = MetricSerializer(data=request.data)
|
||||
if serializer.is_valid():
|
||||
serializer.save(user=user)
|
||||
return Response(serializer.data, status=status.HTTP_201_CREATED)
|
||||
return Response(serializer.errors, status=status.HTTP_400_BAD_REQUEST)
|
||||
|
||||
elif request.method == 'DELETE':
|
||||
metric = get_object_or_404(Metric, user=user)
|
||||
metric.delete()
|
||||
|
@ -51,6 +51,8 @@ INSTALLED_APPS = [
|
||||
'corsheaders',
|
||||
'user.apps.UserConfig',
|
||||
'metric.apps.MetricConfig',
|
||||
'gym_program.apps.GymProgramConfig',
|
||||
'appointment.apps.AppointmentConfig',
|
||||
]
|
||||
|
||||
MIDDLEWARE = [
|
||||
|
0
server/training/__init__.py
Normal file
0
server/training/__init__.py
Normal file
3
server/training/admin.py
Normal file
3
server/training/admin.py
Normal file
@ -0,0 +1,3 @@
|
||||
from django.contrib import admin
|
||||
|
||||
# Register your models here.
|
6
server/training/apps.py
Normal file
6
server/training/apps.py
Normal file
@ -0,0 +1,6 @@
|
||||
from django.apps import AppConfig
|
||||
|
||||
|
||||
class TrainingConfig(AppConfig):
|
||||
default_auto_field = 'django.db.models.BigAutoField'
|
||||
name = 'training'
|
0
server/training/migrations/__init__.py
Normal file
0
server/training/migrations/__init__.py
Normal file
3
server/training/models.py
Normal file
3
server/training/models.py
Normal file
@ -0,0 +1,3 @@
|
||||
from django.db import models
|
||||
|
||||
# Create your models here.
|
3
server/training/tests.py
Normal file
3
server/training/tests.py
Normal file
@ -0,0 +1,3 @@
|
||||
from django.test import TestCase
|
||||
|
||||
# Create your tests here.
|
3
server/training/views.py
Normal file
3
server/training/views.py
Normal file
@ -0,0 +1,3 @@
|
||||
from django.shortcuts import render
|
||||
|
||||
# Create your views here.
|
@ -1,4 +1,4 @@
|
||||
# Generated by Django 4.2.16 on 2024-10-05 11:19
|
||||
# Generated by Django 4.2.16 on 2024-10-09 16:37
|
||||
|
||||
from django.db import migrations, models
|
||||
import user.models
|
||||
@ -27,7 +27,7 @@ class Migration(migrations.Migration):
|
||||
('user_permissions', models.ManyToManyField(blank=True, help_text='Specific permissions for this user.', related_name='user_set', related_query_name='user', to='auth.permission', verbose_name='user permissions')),
|
||||
],
|
||||
options={
|
||||
'abstract': False,
|
||||
'db_table': 'user_table',
|
||||
},
|
||||
managers=[
|
||||
('objects', user.models.UserManager()),
|
||||
|
@ -33,3 +33,6 @@ class User(AbstractBaseUser, PermissionsMixin):
|
||||
|
||||
def __str__(self):
|
||||
return self.email
|
||||
|
||||
class Meta:
|
||||
db_table = 'user_table'
|
||||
|
Loading…
Reference in New Issue
Block a user