From bd35c84087a0f83dbff3f3db410b5892f92782e1 Mon Sep 17 00:00:00 2001
From: Noah Jonah Gente <fu2662cw@mi.fu-berlin.de>
Date: Fri, 14 May 2021 14:41:57 +0200
Subject: [PATCH] Implement model and tests for question and criterion

Implement model and tests for sports and criterions
---
 unisportomat/quiz/admin.py                    |  4 +
 unisportomat/quiz/migrations/0001_initial.py  | 41 ++++++++++
 .../quiz/migrations/0002_wissensnack_text.py  | 18 +++++
 .../migrations/0003_auto_20210517_1437.py     | 24 ++++++
 .../quiz/migrations/0004_criterion.py         | 20 +++++
 .../migrations/0005_auto_20210517_1520.py     | 29 ++++++++
 ...riterion_ratings_sport_criteria_ratings.py | 18 +++++
 .../migrations/0007_auto_20210518_1521.py     | 46 ++++++++++++
 .../quiz/migrations/0008_alter_sport_url.py   | 18 +++++
 unisportomat/quiz/models.py                   | 74 +++++--------------
 unisportomat/quiz/tests.py                    | 47 +++++++++++-
 unisportomat/unisportomat/settings.py         |  1 +
 12 files changed, 285 insertions(+), 55 deletions(-)
 create mode 100644 unisportomat/quiz/migrations/0001_initial.py
 create mode 100644 unisportomat/quiz/migrations/0002_wissensnack_text.py
 create mode 100644 unisportomat/quiz/migrations/0003_auto_20210517_1437.py
 create mode 100644 unisportomat/quiz/migrations/0004_criterion.py
 create mode 100644 unisportomat/quiz/migrations/0005_auto_20210517_1520.py
 create mode 100644 unisportomat/quiz/migrations/0006_rename_criterion_ratings_sport_criteria_ratings.py
 create mode 100644 unisportomat/quiz/migrations/0007_auto_20210518_1521.py
 create mode 100644 unisportomat/quiz/migrations/0008_alter_sport_url.py

diff --git a/unisportomat/quiz/admin.py b/unisportomat/quiz/admin.py
index 8c38f3f..83f1f9a 100644
--- a/unisportomat/quiz/admin.py
+++ b/unisportomat/quiz/admin.py
@@ -1,3 +1,7 @@
 from django.contrib import admin
 
 # Register your models here.
+from .models import Sport
+
+admin.site.register(Sport)
+
diff --git a/unisportomat/quiz/migrations/0001_initial.py b/unisportomat/quiz/migrations/0001_initial.py
new file mode 100644
index 0000000..5c06a2f
--- /dev/null
+++ b/unisportomat/quiz/migrations/0001_initial.py
@@ -0,0 +1,41 @@
+# Generated by Django 3.2 on 2021-05-13 14:09
+
+from django.db import migrations, models
+
+
+class Migration(migrations.Migration):
+
+    initial = True
+
+    dependencies = [
+    ]
+
+    operations = [
+        migrations.CreateModel(
+            name='Question',
+            fields=[
+                ('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
+            ],
+        ),
+        migrations.CreateModel(
+            name='Sport',
+            fields=[
+                ('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
+                ('sportart', models.TextField(choices=[('After Work Fitness', 'After Work Fitness'), ('Ballett', 'Ballett'), ('Basketball', 'Basketball'), ('Beachvolleyball', 'Beachvolleyball'), ('Bouldern', 'Bouldern'), ('Drachenfliegen', 'Drachenfliegen'), ('Functional Fitness', 'Functional Fitness'), ('Gerätturnen', 'Gerätturnen'), ('HIIT', 'HIIT'), ('Karate', 'Karate'), ('Kickboxen', 'Kickboxen'), ('Laufen', 'Laufen'), ('Pilates', 'Pilates'), ('Qigong', 'Qigong'), ('Rückenfit', 'Rückenfit'), ('Segeln Sportbootführerschein', 'Segeln Sportbootführerschein'), ('Skilanglauf & Schneeschuhwandern', 'Skilanglauf & Schneeschuhwandern'), ('Sweat & Relax', 'Sweat & Relax'), ('Tennis', 'Tennis'), ('Ultimate Frisbee', 'Ultimate Frisbee'), ('Yoga', 'Yoga')])),
+                ('field', models.CharField(choices=[('indoor', 'indoor'), ('outdoor', 'outdoor')], default='outdoor', max_length=50)),
+                ('einzelsport', models.IntegerField(choices=[(1, 1), (2, 2), (3, 3), (4, 4), (5, 5), (6, 6), (7, 7), (8, 8), (9, 9), (10, 10)], default=1)),
+                ('mannschaftssport', models.IntegerField(choices=[(1, 1), (2, 2), (3, 3), (4, 4), (5, 5), (6, 6), (7, 7), (8, 8), (9, 9), (10, 10)], default=1)),
+                ('ausdauer', models.IntegerField(choices=[(1, 1), (2, 2), (3, 3), (4, 4), (5, 5), (6, 6), (7, 7), (8, 8), (9, 9), (10, 10)], default=1)),
+                ('kraft', models.IntegerField(choices=[(1, 1), (2, 2), (3, 3), (4, 4), (5, 5), (6, 6), (7, 7), (8, 8), (9, 9), (10, 10)], default=1)),
+                ('kampfsport', models.IntegerField(choices=[(1, 1), (2, 2), (3, 3), (4, 4), (5, 5), (6, 6), (7, 7), (8, 8), (9, 9), (10, 10)], default=1)),
+                ('technischakrobatisch', models.IntegerField(choices=[(1, 1), (2, 2), (3, 3), (4, 4), (5, 5), (6, 6), (7, 7), (8, 8), (9, 9), (10, 10)], default=1)),
+                ('url', models.TextField()),
+            ],
+        ),
+        migrations.CreateModel(
+            name='Wissensnack',
+            fields=[
+                ('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
+            ],
+        ),
+    ]
diff --git a/unisportomat/quiz/migrations/0002_wissensnack_text.py b/unisportomat/quiz/migrations/0002_wissensnack_text.py
new file mode 100644
index 0000000..20fd1d3
--- /dev/null
+++ b/unisportomat/quiz/migrations/0002_wissensnack_text.py
@@ -0,0 +1,18 @@
+# Generated by Django 3.2 on 2021-05-13 14:59
+
+from django.db import migrations, models
+
+
+class Migration(migrations.Migration):
+
+    dependencies = [
+        ('quiz', '0001_initial'),
+    ]
+
+    operations = [
+        migrations.AddField(
+            model_name='wissensnack',
+            name='text',
+            field=models.TextField(default=''),
+        ),
+    ]
diff --git a/unisportomat/quiz/migrations/0003_auto_20210517_1437.py b/unisportomat/quiz/migrations/0003_auto_20210517_1437.py
new file mode 100644
index 0000000..4e69534
--- /dev/null
+++ b/unisportomat/quiz/migrations/0003_auto_20210517_1437.py
@@ -0,0 +1,24 @@
+# Generated by Django 3.2 on 2021-05-17 14:37
+
+from django.db import migrations
+
+
+class Migration(migrations.Migration):
+
+    dependencies = [
+        ('quiz', '0002_wissensnack_text'),
+    ]
+
+    operations = [
+        migrations.DeleteModel(
+            name='Question',
+        ),
+        migrations.DeleteModel(
+            name='Wissensnack',
+        ),
+        migrations.RenameField(
+            model_name='sport',
+            old_name='sportart',
+            new_name='name',
+        ),
+    ]
diff --git a/unisportomat/quiz/migrations/0004_criterion.py b/unisportomat/quiz/migrations/0004_criterion.py
new file mode 100644
index 0000000..27e8269
--- /dev/null
+++ b/unisportomat/quiz/migrations/0004_criterion.py
@@ -0,0 +1,20 @@
+# Generated by Django 3.2 on 2021-05-17 14:44
+
+from django.db import migrations, models
+
+
+class Migration(migrations.Migration):
+
+    dependencies = [
+        ('quiz', '0003_auto_20210517_1437'),
+    ]
+
+    operations = [
+        migrations.CreateModel(
+            name='Criterion',
+            fields=[
+                ('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
+                ('name', models.TextField()),
+            ],
+        ),
+    ]
diff --git a/unisportomat/quiz/migrations/0005_auto_20210517_1520.py b/unisportomat/quiz/migrations/0005_auto_20210517_1520.py
new file mode 100644
index 0000000..8e09d6b
--- /dev/null
+++ b/unisportomat/quiz/migrations/0005_auto_20210517_1520.py
@@ -0,0 +1,29 @@
+# Generated by Django 3.2 on 2021-05-17 15:20
+
+import django.core.validators
+from django.db import migrations, models
+import django.db.models.deletion
+
+
+class Migration(migrations.Migration):
+
+    dependencies = [
+        ('quiz', '0004_criterion'),
+    ]
+
+    operations = [
+        migrations.CreateModel(
+            name='CriterionRating',
+            fields=[
+                ('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
+                ('rating', models.IntegerField(validators=[django.core.validators.MaxValueValidator(10), django.core.validators.MinValueValidator(0)])),
+                ('criterion', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='quiz.criterion')),
+                ('sport', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='quiz.sport')),
+            ],
+        ),
+        migrations.AddField(
+            model_name='sport',
+            name='criterion_ratings',
+            field=models.ManyToManyField(through='quiz.CriterionRating', to='quiz.Criterion'),
+        ),
+    ]
diff --git a/unisportomat/quiz/migrations/0006_rename_criterion_ratings_sport_criteria_ratings.py b/unisportomat/quiz/migrations/0006_rename_criterion_ratings_sport_criteria_ratings.py
new file mode 100644
index 0000000..8ec40ee
--- /dev/null
+++ b/unisportomat/quiz/migrations/0006_rename_criterion_ratings_sport_criteria_ratings.py
@@ -0,0 +1,18 @@
+# Generated by Django 3.2 on 2021-05-17 15:20
+
+from django.db import migrations
+
+
+class Migration(migrations.Migration):
+
+    dependencies = [
+        ('quiz', '0005_auto_20210517_1520'),
+    ]
+
+    operations = [
+        migrations.RenameField(
+            model_name='sport',
+            old_name='criterion_ratings',
+            new_name='criteria_ratings',
+        ),
+    ]
diff --git a/unisportomat/quiz/migrations/0007_auto_20210518_1521.py b/unisportomat/quiz/migrations/0007_auto_20210518_1521.py
new file mode 100644
index 0000000..943e8ac
--- /dev/null
+++ b/unisportomat/quiz/migrations/0007_auto_20210518_1521.py
@@ -0,0 +1,46 @@
+# Generated by Django 3.2 on 2021-05-18 15:21
+
+from django.db import migrations, models
+
+
+class Migration(migrations.Migration):
+
+    dependencies = [
+        ('quiz', '0006_rename_criterion_ratings_sport_criteria_ratings'),
+    ]
+
+    operations = [
+        migrations.RemoveField(
+            model_name='sport',
+            name='ausdauer',
+        ),
+        migrations.RemoveField(
+            model_name='sport',
+            name='einzelsport',
+        ),
+        migrations.RemoveField(
+            model_name='sport',
+            name='field',
+        ),
+        migrations.RemoveField(
+            model_name='sport',
+            name='kampfsport',
+        ),
+        migrations.RemoveField(
+            model_name='sport',
+            name='kraft',
+        ),
+        migrations.RemoveField(
+            model_name='sport',
+            name='mannschaftssport',
+        ),
+        migrations.RemoveField(
+            model_name='sport',
+            name='technischakrobatisch',
+        ),
+        migrations.AlterField(
+            model_name='sport',
+            name='name',
+            field=models.TextField(),
+        ),
+    ]
diff --git a/unisportomat/quiz/migrations/0008_alter_sport_url.py b/unisportomat/quiz/migrations/0008_alter_sport_url.py
new file mode 100644
index 0000000..880d73b
--- /dev/null
+++ b/unisportomat/quiz/migrations/0008_alter_sport_url.py
@@ -0,0 +1,18 @@
+# Generated by Django 3.2 on 2021-05-18 15:34
+
+from django.db import migrations, models
+
+
+class Migration(migrations.Migration):
+
+    dependencies = [
+        ('quiz', '0007_auto_20210518_1521'),
+    ]
+
+    operations = [
+        migrations.AlterField(
+            model_name='sport',
+            name='url',
+            field=models.URLField(),
+        ),
+    ]
diff --git a/unisportomat/quiz/models.py b/unisportomat/quiz/models.py
index 630c195..e81a365 100644
--- a/unisportomat/quiz/models.py
+++ b/unisportomat/quiz/models.py
@@ -1,65 +1,31 @@
+from django.core.validators import MaxValueValidator, MinValueValidator
 from django.db import models
 
-# Create your models here.
 
-class Sport(models.Model):
-    bewertungsskala = []
-    for i in range(1,11):
-        bewertungsskala.append((i,i))
-
-    sportart_list = [
-        ('After Work Fitness','After Work Fitness'),
-        ('Ballett','Ballett'),
-        ('Basketball','Basketball'),
-        ('Beachvolleyball','Beachvolleyball'),
-        ('Bouldern','Bouldern'),
-        ('Drachenfliegen','Drachenfliegen'),
-        ('Functional Fitness','Functional Fitness'),
-        ('Gerätturnen','Gerätturnen'),
-        ('HIIT','HIIT'),
-        ('Karate','Karate'),
-        ('Kickboxen','Kickboxen'),
-        ('Laufen','Laufen'),
-        ('Pilates','Pilates'),
-        ('Qigong','Qigong'),
-        ('Rückenfit','Rückenfit'),
-        ('Segeln Sportbootführerschein','Segeln Sportbootführerschein'),
-        ('Skilanglauf & Schneeschuhwandern','Skilanglauf & Schneeschuhwandern'),
-        ('Sweat & Relax','Sweat & Relax'),
-        ('Tennis','Tennis'),
-        ('Ultimate Frisbee','Ultimate Frisbee'),
-        ('Yoga','Yoga')
+class CriterionRating(models.Model):
+    rating = models.IntegerField(
+        validators=[MaxValueValidator(10), MinValueValidator(0)] # validation on user level (not db level)
+    )
+    criterion = models.ForeignKey("Criterion", on_delete=models.CASCADE)
+    sport = models.ForeignKey("Sport", on_delete=models.CASCADE)
 
-    ]
 
-    fields = [
-        ('indoor','indoor'),
-        ('outdoor','outdoor')
-    ]
+class Sport(models.Model):
+    name = models.TextField()
+    url = models.URLField()
+    criteria_ratings = models.ManyToManyField("Criterion", through="CriterionRating")
 
-    sportart                = models.TextField(choices=sportart_list)
-    field                   = models.CharField(default='outdoor',max_length=50,choices=fields)
-    einzelsport             = models.IntegerField(default=1,choices=bewertungsskala)
-    mannschaftssport        = models.IntegerField(default=1,choices=bewertungsskala)
-    ausdauer                = models.IntegerField(default=1,choices=bewertungsskala)
-    kraft                   = models.IntegerField(default=1,choices=bewertungsskala)
-    kampfsport              = models.IntegerField(default=1,choices=bewertungsskala)
-    technischakrobatisch    = models.IntegerField(default=1,choices=bewertungsskala)
-    url                     = models.TextField()#URLField liefert Error
-    
-    
     def __str__(self):
-        return self.sportart
-
-#fragen-class
-class Question(models.Model):
-    pass
-
-
+        return self.name
 
-#Wissensnack
-class Wissensnack(models.Model):
-    pass
+    def rate(self, criterion, rating):
+        rating = CriterionRating(sport=self, criterion=criterion, rating=10)
+        rating.save()
 
+    def get_rating(self, criterion):
+        criterion_rating = CriterionRating.objects.get(sport=self, criterion=criterion)
+        return criterion_rating.rating
 
 
+class Criterion(models.Model):
+    name = models.TextField()
diff --git a/unisportomat/quiz/tests.py b/unisportomat/quiz/tests.py
index 7ce503c..5700962 100644
--- a/unisportomat/quiz/tests.py
+++ b/unisportomat/quiz/tests.py
@@ -1,3 +1,48 @@
 from django.test import TestCase
 
-# Create your tests here.
+from .models import Sport, Criterion
+
+
+class SportModelTest(TestCase):
+    def setUp(self):
+        self.name = "HIIT"
+        self.url = "https://www.buchsys.de/fu-berlin/angebote/aktueller_zeitraum/_HIIT_-_High_Intensity_Interval_Training___HOME.html"
+
+        self.testSport = Sport(
+            name=self.name,
+            url=self.url,
+        )
+
+        self.testSport.save()
+
+    def test_sport_can_be_created(self):
+        self.assertEquals(self.testSport.name, self.name)
+        self.assertEquals(self.testSport.url, self.url)
+
+
+class CriterionRatingTest(TestCase):
+    def setUp(self):
+        self.name = "HIIT"
+        self.url = "https://www.buchsys.de/fu-berlin/angebote/aktueller_zeitraum/_HIIT_-_High_Intensity_Interval_Training___HOME.html"
+
+        self.testSport = Sport(
+            name=self.name,
+            url=self.url,
+        )
+
+        self.testSport.save()
+
+        self.criterion = Criterion(name="Einzelsport")
+        self.criterion.save()
+
+    def test_can_rate_criterion_for_sport(self):
+        self.testSport.rate(self.criterion, 10)
+        self.assertEquals(self.testSport.criteria_ratings.first(), self.criterion)
+        self.assertEquals(self.testSport.get_rating(self.criterion), 10)
+
+
+class CriterionModelTest(TestCase):
+    def test_criterion_can_be_created(self):
+        name = "Einzelsport"
+        test_criterion = Criterion(name=name)
+        self.assertEquals(test_criterion.name, name)
diff --git a/unisportomat/unisportomat/settings.py b/unisportomat/unisportomat/settings.py
index 5117789..23f0cbd 100644
--- a/unisportomat/unisportomat/settings.py
+++ b/unisportomat/unisportomat/settings.py
@@ -31,6 +31,7 @@ ALLOWED_HOSTS = []
 # Application definition
 
 INSTALLED_APPS = [
+    'quiz.apps.QuizConfig',
     'django.contrib.admin',
     'django.contrib.auth',
     'django.contrib.contenttypes',
-- 
GitLab