diff --git a/backend/wrapped/admin.py b/backend/wrapped/admin.py index 6a021ce2..8647d64c 100644 --- a/backend/wrapped/admin.py +++ b/backend/wrapped/admin.py @@ -1,7 +1,7 @@ from django.contrib import admin from django.core.exceptions import ValidationError -from wrapped.models import GlobalStatKey, GlobalStat,IndividualStat, IndividualStatKey, Page, IndividualStatThrough, GlobalStatThrough, Semester +from wrapped.models import GlobalStatKey, GlobalStat,IndividualStat, IndividualStatKey, Page, IndividualStatPageField, GlobalStatPageField, Semester class WrappedIndividualAdmin(admin.ModelAdmin): @@ -14,17 +14,17 @@ class WrappedGlobalAdmin(admin.ModelAdmin): list_display = ["key", "value", "semester"] search_fields = ["key__icontains"] -class IndividualStatThroughAdmin(admin.TabularInline): - model = IndividualStatThrough +class IndividualStatPageFieldAdmin(admin.TabularInline): + model = IndividualStatPageField extra = 1 -class GlobalStatThroughAdmin(admin.TabularInline): - model = GlobalStatThrough +class GlobalStatPageFieldAdmin(admin.TabularInline): + model = GlobalStatPageField extra = 1 class PageAdmin(admin.ModelAdmin): - inlines = [IndividualStatThroughAdmin, GlobalStatThroughAdmin] + inlines = [IndividualStatPageFieldAdmin, GlobalStatPageFieldAdmin] diff --git a/backend/wrapped/migrations/0001_initial.py b/backend/wrapped/migrations/0001_initial.py index 2897e0f7..52c7bc68 100644 --- a/backend/wrapped/migrations/0001_initial.py +++ b/backend/wrapped/migrations/0001_initial.py @@ -1,5 +1,6 @@ -# Generated by Django 5.0.2 on 2024-10-11 19:50 +# Generated by Django 5.0.2 on 2024-11-10 16:21 +import datetime import django.db.models.deletion from django.conf import settings from django.db import migrations, models @@ -15,50 +16,83 @@ class Migration(migrations.Migration): operations = [ migrations.CreateModel( - name='Template', + name='GlobalStatKey', fields=[ - ('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), - ('background', models.CharField(max_length=50)), - ('template', models.CharField(max_length=50)), + ('key', models.CharField(max_length=50, primary_key=True, serialize=False)), ], ), migrations.CreateModel( - name='UserStatKey', + name='IndividualStatKey', + fields=[ + ('key', models.CharField(max_length=50, primary_key=True, serialize=False)), + ], + ), + migrations.CreateModel( + name='GlobalStatPageField', fields=[ ('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), - ('stat_key', models.CharField(max_length=50)), + ('text_field_name', models.CharField(max_length=50)), + ('global_stat_key', models.ForeignKey(default=None, on_delete=django.db.models.deletion.CASCADE, to='wrapped.globalstatkey')), ], ), migrations.CreateModel( - name='GlobalStat', + name='IndividualStatPageField', fields=[ ('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), - ('stat_key', models.CharField(max_length=50)), - ('stat_value', models.CharField(max_length=50)), - ('semester', models.CharField(max_length=5)), + ('text_field_name', models.CharField(max_length=50)), + ('individual_stat_key', models.ForeignKey(default=None, on_delete=django.db.models.deletion.CASCADE, to='wrapped.individualstatkey')), ], - options={ - 'unique_together': {('stat_key', 'semester')}, - }, ), migrations.CreateModel( name='Page', fields=[ - ('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), - ('temp', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='wrapped.template')), + ('name', models.CharField(max_length=50, primary_key=True, serialize=False)), + ('template_path', models.CharField(max_length=50)), + ('duration', models.DurationField(blank=True, default=datetime.timedelta(0))), + ('global_stats', models.ManyToManyField(blank=True, through='wrapped.GlobalStatPageField', to='wrapped.globalstatkey')), + ('individual_stats', models.ManyToManyField(blank=True, through='wrapped.IndividualStatPageField', to='wrapped.individualstatkey')), + ], + ), + migrations.AddField( + model_name='individualstatpagefield', + name='Page', + field=models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='wrapped.page'), + ), + migrations.AddField( + model_name='globalstatpagefield', + name='Page', + field=models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='wrapped.page'), + ), + migrations.CreateModel( + name='Semester', + fields=[ + ('semester', models.CharField(max_length=5, primary_key=True, serialize=False)), + ('pages', models.ManyToManyField(blank=True, to='wrapped.page')), ], ), migrations.CreateModel( name='IndividualStat', fields=[ ('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), - ('stat_value', models.CharField(max_length=50)), - ('semester', models.CharField(max_length=5)), + ('value', models.CharField(max_length=50)), ('user', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to=settings.AUTH_USER_MODEL)), - ('stat_key', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='wrapped.userstatkey')), + ('key', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='wrapped.individualstatkey')), + ('semester', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='wrapped.semester')), + ], + options={ + 'unique_together': {('key', 'semester', 'user')}, + }, + ), + migrations.CreateModel( + name='GlobalStat', + fields=[ + ('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), + ('value', models.CharField(max_length=50)), + ('key', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='wrapped.globalstatkey')), + ('semester', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='wrapped.semester')), ], options={ - 'unique_together': {('stat_key', 'semester', 'user')}, + 'unique_together': {('key', 'semester')}, }, ), ] diff --git a/backend/wrapped/migrations/0002_remove_page_temp_remove_template_background_and_more.py b/backend/wrapped/migrations/0002_remove_page_temp_remove_template_background_and_more.py deleted file mode 100644 index 8098978a..00000000 --- a/backend/wrapped/migrations/0002_remove_page_temp_remove_template_background_and_more.py +++ /dev/null @@ -1,60 +0,0 @@ -# Generated by Django 5.0.2 on 2024-10-11 20:38 - -import django.db.models.deletion -from django.db import migrations, models - - -class Migration(migrations.Migration): - - dependencies = [ - ('wrapped', '0001_initial'), - ] - - operations = [ - migrations.RemoveField( - model_name='page', - name='temp', - ), - migrations.RemoveField( - model_name='template', - name='background', - ), - migrations.RemoveField( - model_name='template', - name='template', - ), - migrations.AddField( - model_name='page', - name='GlobalStat', - field=models.ManyToManyField(to='wrapped.globalstat'), - ), - migrations.AddField( - model_name='page', - name='IndividualStat', - field=models.ManyToManyField(to='wrapped.individualstat'), - ), - migrations.AddField( - model_name='page', - name='template', - field=models.ForeignKey(default=False, on_delete=django.db.models.deletion.CASCADE, to='wrapped.template'), - preserve_default=False, - ), - migrations.AddField( - model_name='template', - name='name', - field=models.CharField(default='test', max_length=10), - preserve_default=False, - ), - migrations.AddField( - model_name='template', - name='num_fields', - field=models.IntegerField(default=1), - preserve_default=False, - ), - migrations.AddField( - model_name='template', - name='template_path', - field=models.CharField(default='hhell', max_length=50), - preserve_default=False, - ), - ] diff --git a/backend/wrapped/migrations/0003_remove_page_template_remove_page_globalstat_and_more.py b/backend/wrapped/migrations/0003_remove_page_template_remove_page_globalstat_and_more.py deleted file mode 100644 index b9b9f1b7..00000000 --- a/backend/wrapped/migrations/0003_remove_page_template_remove_page_globalstat_and_more.py +++ /dev/null @@ -1,49 +0,0 @@ -# Generated by Django 5.0.2 on 2024-10-18 21:11 - -import django.db.models.deletion -from django.db import migrations, models - - -class Migration(migrations.Migration): - - dependencies = [ - ('wrapped', '0002_remove_page_temp_remove_template_background_and_more'), - ] - - operations = [ - migrations.RemoveField( - model_name='page', - name='template', - ), - migrations.RemoveField( - model_name='page', - name='GlobalStat', - ), - migrations.RemoveField( - model_name='page', - name='IndividualStat', - ), - migrations.AddField( - model_name='page', - name='template_path', - field=models.CharField(default='nothing', max_length=50), - preserve_default=False, - ), - migrations.CreateModel( - name='StatLocation', - fields=[ - ('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), - ('text_field_name', models.CharField(max_length=50)), - ('GlobalStatKey', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='wrapped.globalstat')), - ('IndividualStatKey', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='wrapped.userstatkey')), - ], - ), - migrations.AddField( - model_name='page', - name='stat_locations', - field=models.ManyToManyField(blank=True, to='wrapped.statlocation'), - ), - migrations.DeleteModel( - name='Template', - ), - ] diff --git a/backend/wrapped/migrations/0004_statlocation_one_foreign_key_must_be_null.py b/backend/wrapped/migrations/0004_statlocation_one_foreign_key_must_be_null.py deleted file mode 100644 index a1b5f330..00000000 --- a/backend/wrapped/migrations/0004_statlocation_one_foreign_key_must_be_null.py +++ /dev/null @@ -1,17 +0,0 @@ -# Generated by Django 5.0.2 on 2024-10-18 21:15 - -from django.db import migrations, models - - -class Migration(migrations.Migration): - - dependencies = [ - ('wrapped', '0003_remove_page_template_remove_page_globalstat_and_more'), - ] - - operations = [ - migrations.AddConstraint( - model_name='statlocation', - constraint=models.CheckConstraint(check=models.Q(models.Q(('GlobalStatKey', False), ('IndividualStatKey', True)), models.Q(('GlobalStatKey', True), ('IndividualStatKey', False)), _connector='OR'), name='one_foreign_key_must_be_null'), - ), - ] diff --git a/backend/wrapped/migrations/0005_alter_statlocation_globalstatkey_and_more.py b/backend/wrapped/migrations/0005_alter_statlocation_globalstatkey_and_more.py deleted file mode 100644 index 56141fb5..00000000 --- a/backend/wrapped/migrations/0005_alter_statlocation_globalstatkey_and_more.py +++ /dev/null @@ -1,24 +0,0 @@ -# Generated by Django 5.0.2 on 2024-10-18 21:31 - -import django.db.models.deletion -from django.db import migrations, models - - -class Migration(migrations.Migration): - - dependencies = [ - ('wrapped', '0004_statlocation_one_foreign_key_must_be_null'), - ] - - operations = [ - migrations.AlterField( - model_name='statlocation', - name='GlobalStatKey', - field=models.ForeignKey(blank=True, default=None, null=True, on_delete=django.db.models.deletion.CASCADE, to='wrapped.globalstat'), - ), - migrations.AlterField( - model_name='statlocation', - name='IndividualStatKey', - field=models.ForeignKey(blank=True, default=None, null=True, on_delete=django.db.models.deletion.CASCADE, to='wrapped.userstatkey'), - ), - ] diff --git a/backend/wrapped/migrations/0006_remove_statlocation_one_foreign_key_must_be_null.py b/backend/wrapped/migrations/0006_remove_statlocation_one_foreign_key_must_be_null.py deleted file mode 100644 index 98bfc08d..00000000 --- a/backend/wrapped/migrations/0006_remove_statlocation_one_foreign_key_must_be_null.py +++ /dev/null @@ -1,17 +0,0 @@ -# Generated by Django 5.0.2 on 2024-10-18 21:32 - -from django.db import migrations - - -class Migration(migrations.Migration): - - dependencies = [ - ('wrapped', '0005_alter_statlocation_globalstatkey_and_more'), - ] - - operations = [ - migrations.RemoveConstraint( - model_name='statlocation', - name='one_foreign_key_must_be_null', - ), - ] diff --git a/backend/wrapped/migrations/0007_page_name.py b/backend/wrapped/migrations/0007_page_name.py deleted file mode 100644 index 05c4d5f7..00000000 --- a/backend/wrapped/migrations/0007_page_name.py +++ /dev/null @@ -1,19 +0,0 @@ -# Generated by Django 5.0.2 on 2024-10-18 21:42 - -from django.db import migrations, models - - -class Migration(migrations.Migration): - - dependencies = [ - ('wrapped', '0006_remove_statlocation_one_foreign_key_must_be_null'), - ] - - operations = [ - migrations.AddField( - model_name='page', - name='name', - field=models.CharField(default='old', max_length=50), - preserve_default=False, - ), - ] diff --git a/backend/wrapped/migrations/0008_page_semester.py b/backend/wrapped/migrations/0008_page_semester.py deleted file mode 100644 index e4801fd7..00000000 --- a/backend/wrapped/migrations/0008_page_semester.py +++ /dev/null @@ -1,19 +0,0 @@ -# Generated by Django 5.0.2 on 2024-10-20 17:35 - -from django.db import migrations, models - - -class Migration(migrations.Migration): - - dependencies = [ - ('wrapped', '0007_page_name'), - ] - - operations = [ - migrations.AddField( - model_name='page', - name='semester', - field=models.CharField(default='2020A', max_length=5), - preserve_default=False, - ), - ] diff --git a/backend/wrapped/migrations/0009_individualstatkey_remove_page_stat_locations_and_more.py b/backend/wrapped/migrations/0009_individualstatkey_remove_page_stat_locations_and_more.py deleted file mode 100644 index 04e06a7d..00000000 --- a/backend/wrapped/migrations/0009_individualstatkey_remove_page_stat_locations_and_more.py +++ /dev/null @@ -1,106 +0,0 @@ -# Generated by Django 5.0.2 on 2024-11-01 21:38 - -import django.db.models.deletion -from django.conf import settings -from django.db import migrations, models - - -class Migration(migrations.Migration): - - dependencies = [ - ('wrapped', '0008_page_semester'), - migrations.swappable_dependency(settings.AUTH_USER_MODEL), - ] - - operations = [ - migrations.CreateModel( - name='IndividualStatKey', - fields=[ - ('key', models.CharField(max_length=50, primary_key=True, serialize=False)), - ], - ), - migrations.RemoveField( - model_name='page', - name='stat_locations', - ), - migrations.RenameField( - model_name='globalstat', - old_name='stat_key', - new_name='key', - ), - migrations.RenameField( - model_name='globalstat', - old_name='stat_value', - new_name='value', - ), - migrations.RenameField( - model_name='individualstat', - old_name='stat_value', - new_name='value', - ), - migrations.RemoveField( - model_name='page', - name='id', - ), - migrations.AlterField( - model_name='page', - name='name', - field=models.CharField(max_length=50, primary_key=True, serialize=False), - ), - migrations.AlterUniqueTogether( - name='globalstat', - unique_together={('key', 'semester')}, - ), - migrations.CreateModel( - name='GlobalStatThrough', - fields=[ - ('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), - ('text_field_name', models.CharField(max_length=50)), - ('GlobalStat', models.ForeignKey(default=None, on_delete=django.db.models.deletion.CASCADE, to='wrapped.globalstat')), - ('Page', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='wrapped.page')), - ], - ), - migrations.AddField( - model_name='page', - name='global_stats', - field=models.ManyToManyField(blank=True, through='wrapped.GlobalStatThrough', to='wrapped.globalstat'), - ), - migrations.AlterUniqueTogether( - name='individualstat', - unique_together=set(), - ), - migrations.AddField( - model_name='individualstat', - name='key', - field=models.ForeignKey(default='A', on_delete=django.db.models.deletion.CASCADE, to='wrapped.individualstatkey'), - preserve_default=False, - ), - migrations.AlterUniqueTogether( - name='individualstat', - unique_together={('key', 'semester', 'user')}, - ), - migrations.CreateModel( - name='IndividualStatThrough', - fields=[ - ('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), - ('text_field_name', models.CharField(max_length=50)), - ('IndividualStatKey', models.ForeignKey(default=None, on_delete=django.db.models.deletion.CASCADE, to='wrapped.individualstatkey')), - ('Page', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='wrapped.page')), - ], - ), - migrations.AddField( - model_name='page', - name='individual_stats', - field=models.ManyToManyField(blank=True, through='wrapped.IndividualStatThrough', to='wrapped.individualstatkey'), - ), - migrations.DeleteModel( - name='StatLocation', - ), - migrations.RemoveField( - model_name='individualstat', - name='stat_key', - ), - migrations.DeleteModel( - name='UserStatKey', - ), - ] diff --git a/backend/wrapped/migrations/0010_semester_alter_globalstat_semester_and_more.py b/backend/wrapped/migrations/0010_semester_alter_globalstat_semester_and_more.py deleted file mode 100644 index 9140204d..00000000 --- a/backend/wrapped/migrations/0010_semester_alter_globalstat_semester_and_more.py +++ /dev/null @@ -1,35 +0,0 @@ -# Generated by Django 5.0.2 on 2024-11-01 21:45 - -import django.db.models.deletion -from django.db import migrations, models - - -class Migration(migrations.Migration): - - dependencies = [ - ('wrapped', '0009_individualstatkey_remove_page_stat_locations_and_more'), - ] - - operations = [ - migrations.CreateModel( - name='Semester', - fields=[ - ('semester', models.CharField(max_length=5, primary_key=True, serialize=False)), - ], - ), - migrations.AlterField( - model_name='globalstat', - name='semester', - field=models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='wrapped.semester'), - ), - migrations.AlterField( - model_name='individualstat', - name='semester', - field=models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='wrapped.semester'), - ), - migrations.AlterField( - model_name='page', - name='semester', - field=models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='wrapped.semester'), - ), - ] diff --git a/backend/wrapped/migrations/0011_remove_page_semester_semester_pages.py b/backend/wrapped/migrations/0011_remove_page_semester_semester_pages.py deleted file mode 100644 index 256fa0b9..00000000 --- a/backend/wrapped/migrations/0011_remove_page_semester_semester_pages.py +++ /dev/null @@ -1,22 +0,0 @@ -# Generated by Django 5.0.2 on 2024-11-01 21:54 - -from django.db import migrations, models - - -class Migration(migrations.Migration): - - dependencies = [ - ('wrapped', '0010_semester_alter_globalstat_semester_and_more'), - ] - - operations = [ - migrations.RemoveField( - model_name='page', - name='semester', - ), - migrations.AddField( - model_name='semester', - name='pages', - field=models.ManyToManyField(to='wrapped.page'), - ), - ] diff --git a/backend/wrapped/migrations/0012_globalstatkey_and_more.py b/backend/wrapped/migrations/0012_globalstatkey_and_more.py deleted file mode 100644 index 65a2e060..00000000 --- a/backend/wrapped/migrations/0012_globalstatkey_and_more.py +++ /dev/null @@ -1,35 +0,0 @@ -# Generated by Django 5.0.2 on 2024-11-08 18:33 - -import django.db.models.deletion -from django.db import migrations, models - - -class Migration(migrations.Migration): - - dependencies = [ - ('wrapped', '0011_remove_page_semester_semester_pages'), - ] - - operations = [ - migrations.CreateModel( - name='GlobalStatKey', - fields=[ - ('key', models.CharField(max_length=50, primary_key=True, serialize=False)), - ], - ), - migrations.RenameField( - model_name='globalstatthrough', - old_name='GlobalStat', - new_name='GlobalStatKey', - ), - migrations.AlterField( - model_name='semester', - name='pages', - field=models.ManyToManyField(blank=True, to='wrapped.page'), - ), - migrations.AlterField( - model_name='globalstat', - name='key', - field=models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='wrapped.globalstatkey'), - ), - ] diff --git a/backend/wrapped/migrations/0013_alter_globalstatthrough_globalstatkey_and_more.py b/backend/wrapped/migrations/0013_alter_globalstatthrough_globalstatkey_and_more.py deleted file mode 100644 index 9fe34930..00000000 --- a/backend/wrapped/migrations/0013_alter_globalstatthrough_globalstatkey_and_more.py +++ /dev/null @@ -1,24 +0,0 @@ -# Generated by Django 5.0.2 on 2024-11-08 18:56 - -import django.db.models.deletion -from django.db import migrations, models - - -class Migration(migrations.Migration): - - dependencies = [ - ('wrapped', '0012_globalstatkey_and_more'), - ] - - operations = [ - migrations.AlterField( - model_name='globalstatthrough', - name='GlobalStatKey', - field=models.ForeignKey(default=None, on_delete=django.db.models.deletion.CASCADE, to='wrapped.globalstatkey'), - ), - migrations.AlterField( - model_name='page', - name='global_stats', - field=models.ManyToManyField(blank=True, through='wrapped.GlobalStatThrough', to='wrapped.globalstatkey'), - ), - ] diff --git a/backend/wrapped/models.py b/backend/wrapped/models.py index b8d50f1f..5d015d4c 100644 --- a/backend/wrapped/models.py +++ b/backend/wrapped/models.py @@ -2,12 +2,11 @@ from django.contrib.auth import get_user_model from django.core.exceptions import ValidationError from django.db.models import Q +from datetime import timedelta User = get_user_model() - - # Add a new model for keys class IndividualStatKey(models.Model): key = models.CharField(max_length=50, primary_key=True,null=False, blank=False) @@ -22,22 +21,6 @@ def __str__(self) -> str: return self.key - -# Why do we want time? Ask Vincent -class Page(models.Model): - - # How to do this, using individual vs stat_key ? - name = models.CharField(max_length=50, primary_key=True,null=False, blank=False) - template_path = models.CharField(max_length=50, null=False, blank=False) - individual_stats = models.ManyToManyField('IndividualStatKey', through="IndividualStatThrough", blank=True) - global_stats = models.ManyToManyField('GlobalStatKey', through="GlobalStatThrough", blank=True) - - # semester = models.ForeignKey(Semester, on_delete=models.CASCADE) - def __str__(self): - return f"{self.name}" - - - class Semester(models.Model): semester = models.CharField(max_length=5, primary_key=True,null=False, blank=False) pages = models.ManyToManyField('Page', blank=True) @@ -75,23 +58,32 @@ def __str__(self) -> str: return f"User: {self.user} -- {self.key}-{str(self.semester)} : {self.value}" +class Page(models.Model): + name = models.CharField(max_length=50, primary_key=True,null=False, blank=False) + template_path = models.CharField(max_length=50, null=False, blank=False) + individual_stats = models.ManyToManyField(IndividualStatKey, through="IndividualStatPageField", blank=True) + global_stats = models.ManyToManyField(GlobalStatKey, through="GlobalStatPageField", blank=True) + duration = models.DurationField(blank=True, default=timedelta(minutes=0)) + + def __str__(self): + return f"{self.name}" -class IndividualStatThrough(models.Model): - IndividualStatKey = models.ForeignKey(IndividualStatKey,null=False, blank=False, default=None ,on_delete=models.CASCADE) +class IndividualStatPageField(models.Model): + individual_stat_key = models.ForeignKey(IndividualStatKey,null=False, blank=False, default=None ,on_delete=models.CASCADE) Page = models.ForeignKey(Page, null=False, blank=False, on_delete=models.CASCADE) text_field_name = models.CharField(max_length=50, null=False, blank=False) def __str__(self): - return f"{self.Page} -> {self.text_field_name} : {self.IndividualStatKey}" + return f"{self.Page} -> {self.text_field_name} : {self.individual_stat_key}" -class GlobalStatThrough(models.Model): - GlobalStatKey = models.ForeignKey(GlobalStatKey,null=False, blank=False, default=None ,on_delete=models.CASCADE) +class GlobalStatPageField(models.Model): + global_stat_key = models.ForeignKey(GlobalStatKey,null=False, blank=False, default=None ,on_delete=models.CASCADE) Page = models.ForeignKey(Page, null=False, blank=False, on_delete=models.CASCADE) text_field_name = models.CharField(max_length=50, null=False, blank=False) def __str__(self): - return f"{self.Page} -> {self.text_field_name} : {self.GlobalStatKey}" + return f"{self.Page} -> {self.text_field_name} : {self.global_stat_key}" diff --git a/backend/wrapped/serializers.py b/backend/wrapped/serializers.py index aadbb1f5..f7a34c4a 100644 --- a/backend/wrapped/serializers.py +++ b/backend/wrapped/serializers.py @@ -1,27 +1,31 @@ from rest_framework import serializers -from .models import Page, IndividualStat, GlobalStat, IndividualStatThrough, GlobalStatThrough, Semester, User +from .models import Page, IndividualStat, GlobalStat, IndividualStatPageField, GlobalStatPageField, Semester, User class IndividualStatSerializer(serializers.ModelSerializer): - key = serializers.StringRelatedField() - + key = serializers.SlugRelatedField( + slug_field='key', + read_only=True + ) class Meta: model = IndividualStat fields = ['key', 'value', 'semester'] class GlobalStatSerializer(serializers.ModelSerializer): - key = serializers.StringRelatedField() - + key = serializers.SlugRelatedField( + slug_field='key', + read_only=True + ) class Meta: model = GlobalStat fields = ['key', 'value', 'semester'] -class IndividualStatThroughSerializer(serializers.ModelSerializer): +class IndividualStatPageFieldSerializer(serializers.ModelSerializer): individual_stat_value = serializers.SerializerMethodField() class Meta: - model = IndividualStatThrough + model = IndividualStatPageField fields = ['text_field_name', 'individual_stat_value'] def get_individual_stat_value(self, obj): @@ -29,11 +33,11 @@ def get_individual_stat_value(self, obj): semester = self.context.get('semester') try: - individual_stat = IndividualStat.objects.get( + individual_stat = IndividualStat.objects.filter( user=user, - key=obj.IndividualStatKey, + key=obj.individual_stat_key, semester=semester - ) + ).first() return individual_stat.value except IndividualStat.DoesNotExist: return None @@ -43,49 +47,46 @@ class GlobalStatThroughSerializer(serializers.ModelSerializer): global_stat_value = serializers.SerializerMethodField() class Meta: - model = GlobalStatThrough + model = GlobalStatPageField fields = ['text_field_name', 'global_stat_value'] def get_global_stat_value(self, obj): semester = self.context.get('semester') - try: - global_stat = GlobalStat.objects.get( - key=obj.GlobalStatKey.key, + global_stat = GlobalStat.objects.filter( + key=obj.global_stat_key.key, semester=semester - ) + ).first() return global_stat.value except GlobalStat.DoesNotExist: return None + class PageSerializer(serializers.ModelSerializer): + combined_stats = serializers.SerializerMethodField() class Meta: model = Page - fields = ['name', 'template_path', 'combined_stats'] + fields = ['name', 'template_path', 'combined_stats', 'duration'] def get_combined_stats(self, obj): user = self.context.get('user') semester = self.context.get('semester') - - individual_throughs = IndividualStatThrough.objects.filter(Page=obj) combined_stats = {} - for entry in individual_throughs: - individual_stat = IndividualStat.objects.filter( - user=user, key=entry.IndividualStatKey, semester=semester - ).first() - if individual_stat: - combined_stats[entry.text_field_name] = individual_stat.value - global_throughs = GlobalStatThrough.objects.filter(Page=obj) - for entry in global_throughs: - global_stat = GlobalStat.objects.filter( - key=entry.GlobalStatKey.key, semester=semester - ).first() - if global_stat: - combined_stats[entry.text_field_name] = global_stat.value + for entry in obj.individualstatpagefield_set.all(): + individual_stat_serializer = IndividualStatPageFieldSerializer( + entry, context={'user': user, 'semester': semester} + ) + combined_stats[entry.text_field_name] = individual_stat_serializer.data.get('individual_stat_value') + + for entry in obj.globalstatpagefield_set.all(): + global_stat_serializer = GlobalStatThroughSerializer( + entry, context={'semester': semester} + ) + combined_stats[entry.text_field_name] = global_stat_serializer.data.get('global_stat_value') return combined_stats @@ -99,7 +100,5 @@ class Meta: def get_pages(self, obj): user = self.context.get('user') - - pages = obj.pages.all() - serializer = PageSerializer(pages, many=True, context={'user': user, 'semester': obj}) - return serializer.data + return PageSerializer(obj.pages.all(), many=True, context={'user': user, 'semester': obj}).data + diff --git a/backend/wrapped/views.py b/backend/wrapped/views.py index 7ad2d383..77e16486 100644 --- a/backend/wrapped/views.py +++ b/backend/wrapped/views.py @@ -3,7 +3,6 @@ from rest_framework.response import Response from rest_framework import status from .models import Page, Semester -from .serializers import PageSerializer from .serializers import SemesterSerializer class SemesterView(APIView): @@ -11,6 +10,5 @@ class SemesterView(APIView): def get(self, request, semester_id): semester = Semester.objects.get(semester=semester_id) - serializer = SemesterSerializer(semester, context={'user': request.user}) return Response(serializer.data)