diff --git a/.idea/watcherTasks.xml b/.idea/watcherTasks.xml
new file mode 100644
index 0000000..539a42a
--- /dev/null
+++ b/.idea/watcherTasks.xml
@@ -0,0 +1,8 @@
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/.idea/workout-suggest.iml b/.idea/workout-suggest.iml
index 8583099..0d9659b 100644
--- a/.idea/workout-suggest.iml
+++ b/.idea/workout-suggest.iml
@@ -28,6 +28,11 @@
+
diff --git a/src/exercises/admin.py b/src/exercises/admin.py
index 8c38f3f..9c2c6e7 100644
--- a/src/exercises/admin.py
+++ b/src/exercises/admin.py
@@ -1,3 +1,14 @@
from django.contrib import admin
+from django.contrib.admin import register
-# Register your models here.
+from exercises.models import BodyRegion, Exercise
+
+
+@register(BodyRegion)
+class BodyRegionAdmin(admin.ModelAdmin):
+ list_display = ["name"]
+
+
+@register(Exercise)
+class ExerciseAdmin(admin.ModelAdmin):
+ list_display = ["name", "get_body_regions", "rating"]
diff --git a/src/exercises/migrations/0001_initial.py b/src/exercises/migrations/0001_initial.py
new file mode 100644
index 0000000..aeefb94
--- /dev/null
+++ b/src/exercises/migrations/0001_initial.py
@@ -0,0 +1,31 @@
+# Generated by Django 3.1.3 on 2020-11-21 10:49
+
+import django.core.validators
+from django.db import migrations, models
+
+
+class Migration(migrations.Migration):
+
+ initial = True
+
+ dependencies = [
+ ]
+
+ operations = [
+ migrations.CreateModel(
+ name='BodyRegion',
+ fields=[
+ ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
+ ('name', models.CharField(max_length=250)),
+ ],
+ ),
+ migrations.CreateModel(
+ name='Exercise',
+ fields=[
+ ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
+ ('name', models.CharField(max_length=250)),
+ ('rating', models.PositiveSmallIntegerField(help_text='From 1 (strengthening) to 5 (cardio)', validators=[django.core.validators.MaxValueValidator(5), django.core.validators.MinValueValidator(0)])),
+ ('body_regions', models.ManyToManyField(related_name='exercises', to='exercises.BodyRegion')),
+ ],
+ ),
+ ]
diff --git a/src/exercises/migrations/0002_auto_20201121_1051.py b/src/exercises/migrations/0002_auto_20201121_1051.py
new file mode 100644
index 0000000..79f19d4
--- /dev/null
+++ b/src/exercises/migrations/0002_auto_20201121_1051.py
@@ -0,0 +1,19 @@
+# Generated by Django 3.1.3 on 2020-11-21 10:51
+
+import django.core.validators
+from django.db import migrations, models
+
+
+class Migration(migrations.Migration):
+
+ dependencies = [
+ ('exercises', '0001_initial'),
+ ]
+
+ operations = [
+ migrations.AlterField(
+ model_name='exercise',
+ name='rating',
+ field=models.PositiveSmallIntegerField(help_text='From 1 (strengthening) to 5 (cardio)', validators=[django.core.validators.MaxValueValidator(5), django.core.validators.MinValueValidator(1)]),
+ ),
+ ]
diff --git a/src/exercises/models.py b/src/exercises/models.py
index 71a8362..fcaad35 100644
--- a/src/exercises/models.py
+++ b/src/exercises/models.py
@@ -1,3 +1,46 @@
+from django.core.validators import MaxValueValidator, MinValueValidator
from django.db import models
-# Create your models here.
+
+class BodyRegion(models.Model):
+ name = models.CharField(max_length=250)
+
+ def __str__(self):
+ return self.name
+
+
+class ExerciseManager(models.Manager):
+ def get_mostly_cardio(self):
+ return self.all().filter(rating__gt=3)
+
+ def get_mostly_strengthening(self):
+ return self.all().filter(rating__lt=3)
+
+ def get_balanced(self):
+ return self.all().filter(rating=3)
+
+
+class Exercise(models.Model):
+ name = models.CharField(max_length=250)
+ rating = models.PositiveSmallIntegerField(
+ validators=[MaxValueValidator(5), MinValueValidator(1)],
+ help_text="From 1 (strengthening) to 5 (cardio)",
+ )
+ body_regions = models.ManyToManyField(BodyRegion, "exercises")
+
+ objects = ExerciseManager()
+
+ def __str__(self):
+ return self.name
+
+ def is_mostly_cardio(self):
+ return self.rating > 3
+
+ def is_mostly_strengthening(self):
+ return self.rating < 3
+
+ def is_balanced(self):
+ return self.rating == 3
+
+ def get_body_regions(self):
+ return ", ".join(map(str, self.body_regions.all()))
diff --git a/src/exercises/templates/exercises/base.html b/src/exercises/templates/exercises/base.html
new file mode 100644
index 0000000..98bdbd7
--- /dev/null
+++ b/src/exercises/templates/exercises/base.html
@@ -0,0 +1,11 @@
+
+
+
+
+ {% block title %}{% endblock %}
+
+
+{% block content %}
+{% endblock %}
+
+
diff --git a/src/exercises/templates/exercises/exercise_list.html b/src/exercises/templates/exercises/exercise_list.html
new file mode 100644
index 0000000..42b021a
--- /dev/null
+++ b/src/exercises/templates/exercises/exercise_list.html
@@ -0,0 +1,12 @@
+{% extends "exercises/base.html" %}
+{% block title %}
+ Random exercises
+{% endblock %}
+{% block content %}
+ Random exercises
+
+ {% for exercise in exercises %}
+ - {{ exercise.name }}: {{ exercise.get_body_regions }} ({{ exercise.rating }}/5)
+ {% endfor %}
+
+{% endblock %}
diff --git a/src/exercises/urls.py b/src/exercises/urls.py
new file mode 100644
index 0000000..3063239
--- /dev/null
+++ b/src/exercises/urls.py
@@ -0,0 +1,23 @@
+"""workout_suggest URL Configuration
+
+The `urlpatterns` list routes URLs to views. For more information please see:
+ https://docs.djangoproject.com/en/3.1/topics/http/urls/
+Examples:
+Function views
+ 1. Add an import: from my_app import views
+ 2. Add a URL to urlpatterns: path('', views.home, name='home')
+Class-based views
+ 1. Add an import: from other_app.views import Home
+ 2. Add a URL to urlpatterns: path('', Home.as_view(), name='home')
+Including another URLconf
+ 1. Import the include() function: from django.urls import include, path
+ 2. Add a URL to urlpatterns: path('blog/', include('blog.urls'))
+"""
+from django.urls import path
+
+from exercises.views import RandomExercisesView
+
+app_name = "exercises"
+urlpatterns = [
+ path("random", RandomExercisesView.as_view(), name="random"),
+]
diff --git a/src/exercises/views.py b/src/exercises/views.py
index 91ea44a..3bb2dee 100644
--- a/src/exercises/views.py
+++ b/src/exercises/views.py
@@ -1,3 +1,11 @@
-from django.shortcuts import render
+from django.views import generic
-# Create your views here.
+from exercises.models import Exercise
+
+
+class RandomExercisesView(generic.ListView):
+ model = Exercise
+ context_object_name = "exercises"
+
+ def get_queryset(self):
+ return Exercise.objects.order_by("?")[:5]
diff --git a/src/workout_suggest/urls.py b/src/workout_suggest/urls.py
index f752507..444d0d6 100644
--- a/src/workout_suggest/urls.py
+++ b/src/workout_suggest/urls.py
@@ -14,8 +14,9 @@ Including another URLconf
2. Add a URL to urlpatterns: path('blog/', include('blog.urls'))
"""
from django.contrib import admin
-from django.urls import path
+from django.urls import include, path, re_path
urlpatterns = [
+ path("exercises/", include("exercises.urls", namespace="exercises")),
path("admin/", admin.site.urls),
]