From e6dd2fe47e4fc99d97f02e51aaaf8cfe59cde89b Mon Sep 17 00:00:00 2001 From: Ri-Dearg Date: Wed, 14 Oct 2020 15:28:52 +0000 Subject: [PATCH 01/25] #P04 Started Hackathon app Created hackathon app and moved tests inside its own module. --- .theia/settings.json | 3 +++ hackathon/__init__.py | 0 hackathon/admin.py | 3 +++ hackathon/apps.py | 5 +++++ hackathon/migrations/__init__.py | 0 hackathon/models.py | 3 +++ hackathon/tests/__init__.py | 0 hackathon/tests/tests.py | 3 +++ hackathon/views.py | 3 +++ 9 files changed, 20 insertions(+) create mode 100644 .theia/settings.json create mode 100644 hackathon/__init__.py create mode 100644 hackathon/admin.py create mode 100644 hackathon/apps.py create mode 100644 hackathon/migrations/__init__.py create mode 100644 hackathon/models.py create mode 100644 hackathon/tests/__init__.py create mode 100644 hackathon/tests/tests.py create mode 100644 hackathon/views.py diff --git a/.theia/settings.json b/.theia/settings.json new file mode 100644 index 00000000..27c5cd2b --- /dev/null +++ b/.theia/settings.json @@ -0,0 +1,3 @@ +{ + "editor.autoSave": "on" +} \ No newline at end of file diff --git a/hackathon/__init__.py b/hackathon/__init__.py new file mode 100644 index 00000000..e69de29b diff --git a/hackathon/admin.py b/hackathon/admin.py new file mode 100644 index 00000000..8c38f3f3 --- /dev/null +++ b/hackathon/admin.py @@ -0,0 +1,3 @@ +from django.contrib import admin + +# Register your models here. diff --git a/hackathon/apps.py b/hackathon/apps.py new file mode 100644 index 00000000..fb14bd44 --- /dev/null +++ b/hackathon/apps.py @@ -0,0 +1,5 @@ +from django.apps import AppConfig + + +class HackathonConfig(AppConfig): + name = 'hackathon' diff --git a/hackathon/migrations/__init__.py b/hackathon/migrations/__init__.py new file mode 100644 index 00000000..e69de29b diff --git a/hackathon/models.py b/hackathon/models.py new file mode 100644 index 00000000..71a83623 --- /dev/null +++ b/hackathon/models.py @@ -0,0 +1,3 @@ +from django.db import models + +# Create your models here. diff --git a/hackathon/tests/__init__.py b/hackathon/tests/__init__.py new file mode 100644 index 00000000..e69de29b diff --git a/hackathon/tests/tests.py b/hackathon/tests/tests.py new file mode 100644 index 00000000..7ce503c2 --- /dev/null +++ b/hackathon/tests/tests.py @@ -0,0 +1,3 @@ +from django.test import TestCase + +# Create your tests here. diff --git a/hackathon/views.py b/hackathon/views.py new file mode 100644 index 00000000..91ea44a2 --- /dev/null +++ b/hackathon/views.py @@ -0,0 +1,3 @@ +from django.shortcuts import render + +# Create your views here. From cb699156df84a0acaf5903b63b4b83b6cf7d9e3f Mon Sep 17 00:00:00 2001 From: Ri-Dearg Date: Thu, 15 Oct 2020 19:03:44 +0000 Subject: [PATCH 02/25] Added URLs and Installed App. Connected the "hackathon" app by urls and settings" --- hackathon/urls.py | 5 +++++ main/settings.py | 2 ++ main/urls.py | 2 ++ 3 files changed, 9 insertions(+) create mode 100644 hackathon/urls.py diff --git a/hackathon/urls.py b/hackathon/urls.py new file mode 100644 index 00000000..96f8167f --- /dev/null +++ b/hackathon/urls.py @@ -0,0 +1,5 @@ +from django.urls import path + +urlpatterns = [ + +] diff --git a/main/settings.py b/main/settings.py index 7d9c1d5f..c67cefe7 100644 --- a/main/settings.py +++ b/main/settings.py @@ -29,6 +29,8 @@ "home", "profiles", "crispy_forms", + # M05 App "Hackathon" added + "hackathon", ] MIDDLEWARE = [ diff --git a/main/urls.py b/main/urls.py index 9786d549..22af622a 100644 --- a/main/urls.py +++ b/main/urls.py @@ -6,4 +6,6 @@ path("admin/", admin.site.urls), path("accounts", include("allauth.urls")), path("profile/", include("profiles.urls")), + path("hackathon/", include(("hackathon.urls", "hackathon"), + namespace='hackathon')), ] From 4f55cc66ffb8312cbebdc45583098847aa551996 Mon Sep 17 00:00:00 2001 From: Ri-Dearg Date: Thu, 15 Oct 2020 19:08:53 +0000 Subject: [PATCH 03/25] Created "Hackathon" Model Foregin Key fields will be revised as other models are created. --- hackathon/admin.py | 3 +++ hackathon/migrations/0001_initial.py | 33 ++++++++++++++++++++++++++++ hackathon/models.py | 33 ++++++++++++++++++++++++++++ 3 files changed, 69 insertions(+) create mode 100644 hackathon/migrations/0001_initial.py diff --git a/hackathon/admin.py b/hackathon/admin.py index 8c38f3f3..7b68f635 100644 --- a/hackathon/admin.py +++ b/hackathon/admin.py @@ -1,3 +1,6 @@ from django.contrib import admin +from .models import Hackathon + # Register your models here. +admin.site.register(Hackathon) diff --git a/hackathon/migrations/0001_initial.py b/hackathon/migrations/0001_initial.py new file mode 100644 index 00000000..117b5d58 --- /dev/null +++ b/hackathon/migrations/0001_initial.py @@ -0,0 +1,33 @@ +# Generated by Django 3.1.1 on 2020-10-15 19:02 + +from django.conf import settings +from django.db import migrations, models +import django.db.models.deletion +import django.utils.timezone + + +class Migration(migrations.Migration): + + initial = True + + dependencies = [ + migrations.swappable_dependency(settings.AUTH_USER_MODEL), + ] + + operations = [ + migrations.CreateModel( + name='Hackathon', + fields=[ + ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), + ('created', models.DateTimeField(default=django.utils.timezone.now)), + ('updated', models.DateTimeField(auto_now=True)), + ('display_name', models.CharField(default='', max_length=254)), + ('description', models.TextField()), + ('start_date', models.DateTimeField()), + ('end_date', models.DateTimeField()), + ('created_by', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name='hackathon_created', to=settings.AUTH_USER_MODEL)), + ('judges', models.ManyToManyField(blank=True, related_name='hackathon_judges', to=settings.AUTH_USER_MODEL)), + ('organiser', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.SET_NULL, related_name='hackathon_organiser', to=settings.AUTH_USER_MODEL)), + ], + ), + ] diff --git a/hackathon/models.py b/hackathon/models.py index 71a83623..f712af68 100644 --- a/hackathon/models.py +++ b/hackathon/models.py @@ -1,3 +1,36 @@ from django.db import models +from django.utils import timezone + +from django.contrib.auth.models import User + # Create your models here. +class Hackathon(models.Model): + """Model representing a Hackathon. It is connected by a foreign key to + Users, HackAwards and HackTeam.""" + created = models.DateTimeField(default=timezone.now) + updated = models.DateTimeField(auto_now=True) + created_by = models.ForeignKey(User, + on_delete=models.CASCADE, + related_name="hackathon_created") + display_name = models.CharField(default="", max_length=254) + description = models.TextField() + start_date = models.DateTimeField() + end_date = models.DateTimeField() + # To be added when the other models are added. + # awards = models.ForeignKey("HackAwardCategory", + # null=True, + # blank=True, + # on_delete=models.SET_NULL) + # teams = models.OneToOne("HackTeam", + # null=True, + # blank=True, + # on_delete=models.SET_NULL) + judges = models.ManyToManyField(User, + blank=True, + related_name='hackathon_judges') + organiser = models.ForeignKey(User, + null=True, + blank=True, + on_delete=models.SET_NULL, + related_name="hackathon_organiser") From 2949910853bdd4302d4aa0e12306d1df03072e66 Mon Sep 17 00:00:00 2001 From: Ri-Dearg Date: Thu, 15 Oct 2020 19:55:28 +0000 Subject: [PATCH 04/25] Created Hack Award Category Model Added to admin. Minor adjustment made to Hackathon related name field --- hackathon/admin.py | 3 ++- hackathon/models.py | 22 +++++++++++++++++++++- 2 files changed, 23 insertions(+), 2 deletions(-) diff --git a/hackathon/admin.py b/hackathon/admin.py index 7b68f635..a7d30fdb 100644 --- a/hackathon/admin.py +++ b/hackathon/admin.py @@ -1,6 +1,7 @@ from django.contrib import admin -from .models import Hackathon +from .models import Hackathon, HackAwardCategory # Register your models here. admin.site.register(Hackathon) +admin.site.register(HackAwardCategory) diff --git a/hackathon/models.py b/hackathon/models.py index f712af68..60f63e29 100644 --- a/hackathon/models.py +++ b/hackathon/models.py @@ -12,7 +12,7 @@ class Hackathon(models.Model): updated = models.DateTimeField(auto_now=True) created_by = models.ForeignKey(User, on_delete=models.CASCADE, - related_name="hackathon_created") + related_name="hackathon_created_by") display_name = models.CharField(default="", max_length=254) description = models.TextField() start_date = models.DateTimeField() @@ -34,3 +34,23 @@ class Hackathon(models.Model): blank=True, on_delete=models.SET_NULL, related_name="hackathon_organiser") + + +class HackAwardCategory(models.Model): + """Model representing a Hackathon. It is connected by a foreign key to + Users and HackProject.""" + created = models.DateTimeField(default=timezone.now) + updated = models.DateTimeField(auto_now=True) + created_by = models.ForeignKey(User, + on_delete=models.CASCADE, + related_name="hackawardcategory_created_by") + display_name = models.CharField(default="", max_length=254) + description = models.TextField() + # winning_project = models.OneToOne("HackProject", + # null=True, + # blank=True, + # on_delete=models.SET_NULL) + + class Meta: + verbose_name_plural = "Hack award categories" + From ce56f462432da689ca03fe2989be368364b5e76c Mon Sep 17 00:00:00 2001 From: Ri-Dearg Date: Thu, 15 Oct 2020 20:11:58 +0000 Subject: [PATCH 05/25] HackTeam model created --- hackathon/admin.py | 3 +- .../migrations/0002_auto_20201015_1936.py | 33 +++++++++++++++++++ hackathon/models.py | 22 +++++++++++-- 3 files changed, 55 insertions(+), 3 deletions(-) create mode 100644 hackathon/migrations/0002_auto_20201015_1936.py diff --git a/hackathon/admin.py b/hackathon/admin.py index a7d30fdb..573964e5 100644 --- a/hackathon/admin.py +++ b/hackathon/admin.py @@ -1,7 +1,8 @@ from django.contrib import admin -from .models import Hackathon, HackAwardCategory +from .models import Hackathon, HackAwardCategory, HackTeam # Register your models here. admin.site.register(Hackathon) admin.site.register(HackAwardCategory) +admin.site.register(HackTeam) diff --git a/hackathon/migrations/0002_auto_20201015_1936.py b/hackathon/migrations/0002_auto_20201015_1936.py new file mode 100644 index 00000000..c5e81fef --- /dev/null +++ b/hackathon/migrations/0002_auto_20201015_1936.py @@ -0,0 +1,33 @@ +# Generated by Django 3.1.1 on 2020-10-15 19:36 + +from django.conf import settings +from django.db import migrations, models +import django.db.models.deletion +import django.utils.timezone + + +class Migration(migrations.Migration): + + dependencies = [ + migrations.swappable_dependency(settings.AUTH_USER_MODEL), + ('hackathon', '0001_initial'), + ] + + operations = [ + migrations.AlterField( + model_name='hackathon', + name='created_by', + field=models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name='hackathon_created_by', to=settings.AUTH_USER_MODEL), + ), + migrations.CreateModel( + name='HackAwardCategory', + fields=[ + ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), + ('created', models.DateTimeField(default=django.utils.timezone.now)), + ('updated', models.DateTimeField(auto_now=True)), + ('display_name', models.CharField(default='', max_length=254)), + ('description', models.TextField()), + ('created_by', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name='hackawardcategory_created_by', to=settings.AUTH_USER_MODEL)), + ], + ), + ] diff --git a/hackathon/models.py b/hackathon/models.py index 60f63e29..04b41855 100644 --- a/hackathon/models.py +++ b/hackathon/models.py @@ -3,11 +3,13 @@ from django.contrib.auth.models import User +# Commented out fields be added when the other models are finished. + # Create your models here. class Hackathon(models.Model): """Model representing a Hackathon. It is connected by a foreign key to - Users, HackAwards and HackTeam.""" + Users, HackAwards and HackTeam. Optional Fields: judges, organiser""" created = models.DateTimeField(default=timezone.now) updated = models.DateTimeField(auto_now=True) created_by = models.ForeignKey(User, @@ -17,7 +19,6 @@ class Hackathon(models.Model): description = models.TextField() start_date = models.DateTimeField() end_date = models.DateTimeField() - # To be added when the other models are added. # awards = models.ForeignKey("HackAwardCategory", # null=True, # blank=True, @@ -54,3 +55,20 @@ class HackAwardCategory(models.Model): class Meta: verbose_name_plural = "Hack award categories" + +class HackTeam(models.Model): + """Model representing a Hackathon. It is connected by a foreign key to + Users and HackProject. Optional Fields: participants""" + created = models.DateTimeField(default=timezone.now) + updated = models.DateTimeField(auto_now=True) + created_by = models.ForeignKey(User, + on_delete=models.CASCADE, + related_name="hackteam_created_by") + display_name = models.CharField(default="", max_length=254) + participants = models.ManyToManyField(User, + blank=True, + related_name='hackteam') + # winning_project = models.OneToOne("HackProject", + # null=True, + # blank=True, + # on_delete=models.SET_NULL) From 5c004f0efa0204d35727ca80f919653eb7c04b12 Mon Sep 17 00:00:00 2001 From: Ri-Dearg Date: Thu, 15 Oct 2020 20:28:36 +0000 Subject: [PATCH 06/25] Created HackProject model Updated comments. Must update all FK fields. --- hackathon/admin.py | 3 +- .../migrations/0003_auto_20201015_2020.py | 47 +++++++++++++++++++ hackathon/models.py | 35 +++++++++++--- 3 files changed, 78 insertions(+), 7 deletions(-) create mode 100644 hackathon/migrations/0003_auto_20201015_2020.py diff --git a/hackathon/admin.py b/hackathon/admin.py index 573964e5..03ae7b0a 100644 --- a/hackathon/admin.py +++ b/hackathon/admin.py @@ -1,8 +1,9 @@ from django.contrib import admin -from .models import Hackathon, HackAwardCategory, HackTeam +from .models import Hackathon, HackAwardCategory, HackTeam, HackProject # Register your models here. admin.site.register(Hackathon) admin.site.register(HackAwardCategory) admin.site.register(HackTeam) +admin.site.register(HackProject) diff --git a/hackathon/migrations/0003_auto_20201015_2020.py b/hackathon/migrations/0003_auto_20201015_2020.py new file mode 100644 index 00000000..49c4537f --- /dev/null +++ b/hackathon/migrations/0003_auto_20201015_2020.py @@ -0,0 +1,47 @@ +# Generated by Django 3.1.1 on 2020-10-15 20:20 + +from django.conf import settings +from django.db import migrations, models +import django.db.models.deletion +import django.utils.timezone + + +class Migration(migrations.Migration): + + dependencies = [ + migrations.swappable_dependency(settings.AUTH_USER_MODEL), + ('hackathon', '0002_auto_20201015_1936'), + ] + + operations = [ + migrations.AlterModelOptions( + name='hackawardcategory', + options={'verbose_name_plural': 'Hack award categories'}, + ), + migrations.CreateModel( + name='HackTeam', + fields=[ + ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), + ('created', models.DateTimeField(default=django.utils.timezone.now)), + ('updated', models.DateTimeField(auto_now=True)), + ('display_name', models.CharField(default='', max_length=254)), + ('created_by', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name='hackteam_created_by', to=settings.AUTH_USER_MODEL)), + ('participants', models.ManyToManyField(related_name='hackteam', to=settings.AUTH_USER_MODEL)), + ], + ), + migrations.CreateModel( + name='HackProject', + fields=[ + ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), + ('created', models.DateTimeField(default=django.utils.timezone.now)), + ('updated', models.DateTimeField(auto_now=True)), + ('display_name', models.CharField(default='', max_length=255)), + ('description', models.TextField()), + ('github_link', models.CharField(default='', max_length=255)), + ('collab_link', models.CharField(default='', max_length=255)), + ('submission_time', models.DateTimeField(auto_now_add=True)), + ('created_by', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name='hackproject_created_by', to=settings.AUTH_USER_MODEL)), + ('mentor', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.SET_NULL, related_name='hackproject_mentor', to=settings.AUTH_USER_MODEL)), + ], + ), + ] diff --git a/hackathon/models.py b/hackathon/models.py index 04b41855..3dfd71af 100644 --- a/hackathon/models.py +++ b/hackathon/models.py @@ -9,7 +9,7 @@ # Create your models here. class Hackathon(models.Model): """Model representing a Hackathon. It is connected by a foreign key to - Users, HackAwards and HackTeam. Optional Fields: judges, organiser""" + User, HackAwards and HackTeam. Optional Fields: judges, organiser.""" created = models.DateTimeField(default=timezone.now) updated = models.DateTimeField(auto_now=True) created_by = models.ForeignKey(User, @@ -38,8 +38,8 @@ class Hackathon(models.Model): class HackAwardCategory(models.Model): - """Model representing a Hackathon. It is connected by a foreign key to - Users and HackProject.""" + """Model representing a HackAwardCategory. It is connected by a foreign key to + User and HackProject.""" created = models.DateTimeField(default=timezone.now) updated = models.DateTimeField(auto_now=True) created_by = models.ForeignKey(User, @@ -57,8 +57,8 @@ class Meta: class HackTeam(models.Model): - """Model representing a Hackathon. It is connected by a foreign key to - Users and HackProject. Optional Fields: participants""" + """Model representing a HackTeam. It is connected by a foreign key to + User and HackProject.""" created = models.DateTimeField(default=timezone.now) updated = models.DateTimeField(auto_now=True) created_by = models.ForeignKey(User, @@ -66,9 +66,32 @@ class HackTeam(models.Model): related_name="hackteam_created_by") display_name = models.CharField(default="", max_length=254) participants = models.ManyToManyField(User, - blank=True, related_name='hackteam') # winning_project = models.OneToOne("HackProject", # null=True, # blank=True, # on_delete=models.SET_NULL) + + +class HackProject(models.Model): + """Model representing a HackProject. It is connected by a foreign key to + User and HackProjectScore. Optional Fields: mentor.""" + created = models.DateTimeField(default=timezone.now) + updated = models.DateTimeField(auto_now=True) + created_by = models.ForeignKey(User, + on_delete=models.CASCADE, + related_name="hackproject_created_by") + display_name = models.CharField(default="", max_length=255) + description = models.TextField() + github_link = models.CharField(default="", max_length=255) + collab_link = models.CharField(default="", max_length=255) + submission_time = models.DateTimeField(auto_now_add=True) + # scores = models.ForignKey("HackProjectScore", + # null=True, + # blank=True, + # on_delete=models.SET_NULL) + mentor = models.ForeignKey(User, + null=True, + blank=True, + on_delete=models.SET_NULL, + related_name="hackproject_mentor") From 277d7c96021bb791d19a891bda22616d9c50edfb Mon Sep 17 00:00:00 2001 From: Ri-Dearg Date: Thu, 15 Oct 2020 20:40:30 +0000 Subject: [PATCH 07/25] Created HackProjectScoreModel --- hackathon/admin.py | 7 ++++++- hackathon/models.py | 15 +++++++++++++++ 2 files changed, 21 insertions(+), 1 deletion(-) diff --git a/hackathon/admin.py b/hackathon/admin.py index 03ae7b0a..b8194f34 100644 --- a/hackathon/admin.py +++ b/hackathon/admin.py @@ -1,5 +1,9 @@ from django.contrib import admin -from .models import Hackathon, HackAwardCategory, HackTeam, HackProject +from .models import (Hackathon, + HackAwardCategory, + HackTeam, + HackProject, + HackProjectScore) # Register your models here. @@ -7,3 +11,4 @@ admin.site.register(HackAwardCategory) admin.site.register(HackTeam) admin.site.register(HackProject) +admin.site.register(HackProjectScore) diff --git a/hackathon/models.py b/hackathon/models.py index 3dfd71af..60110713 100644 --- a/hackathon/models.py +++ b/hackathon/models.py @@ -95,3 +95,18 @@ class HackProject(models.Model): blank=True, on_delete=models.SET_NULL, related_name="hackproject_mentor") + + +class HackProjectScore(models.Model): + """Model representing a HackProject. It is connected by a foreign key to + User and HackProjectScore. Optional Fields: mentor.""" + created = models.DateTimeField(default=timezone.now) + updated = models.DateTimeField(auto_now=True) + created_by = models.ForeignKey(User, + on_delete=models.CASCADE, + related_name="hackprojectscore_created_by") + judge = models.ForeignKey(User, on_delete=models.CASCADE) + # score = models.ForignKey("HackProjectScoreCategory", + # null=True, + # blank=True, + # on_delete=models.SET_NULL) \ No newline at end of file From 6ed572d2abbddb8b68b9de297544986ea0152205 Mon Sep 17 00:00:00 2001 From: Ri-Dearg Date: Thu, 15 Oct 2020 20:45:23 +0000 Subject: [PATCH 08/25] Created HackProjectScoreCategory Model --- hackathon/admin.py | 4 +++- hackathon/models.py | 20 +++++++++++++++++--- 2 files changed, 20 insertions(+), 4 deletions(-) diff --git a/hackathon/admin.py b/hackathon/admin.py index b8194f34..81224009 100644 --- a/hackathon/admin.py +++ b/hackathon/admin.py @@ -3,7 +3,8 @@ HackAwardCategory, HackTeam, HackProject, - HackProjectScore) + HackProjectScore, + HackProjectScoreCategory) # Register your models here. @@ -12,3 +13,4 @@ admin.site.register(HackTeam) admin.site.register(HackProject) admin.site.register(HackProjectScore) +admin.site.register(HackProjectScoreCategory) diff --git a/hackathon/models.py b/hackathon/models.py index 60110713..7918dcf3 100644 --- a/hackathon/models.py +++ b/hackathon/models.py @@ -98,8 +98,8 @@ class HackProject(models.Model): class HackProjectScore(models.Model): - """Model representing a HackProject. It is connected by a foreign key to - User and HackProjectScore. Optional Fields: mentor.""" + """Model representing a HackProjectScore. It is connected by a foreign key to + User and HackProjectScoreCategory.""" created = models.DateTimeField(default=timezone.now) updated = models.DateTimeField(auto_now=True) created_by = models.ForeignKey(User, @@ -109,4 +109,18 @@ class HackProjectScore(models.Model): # score = models.ForignKey("HackProjectScoreCategory", # null=True, # blank=True, - # on_delete=models.SET_NULL) \ No newline at end of file + # on_delete=models.SET_NULL) + + +class HackProjectScoreCategory(models.Model): + """Model representing a HackProject. It is connected by a foreign key to + User and HackProjectScore. Optional Fields: mentor.""" + created = models.DateTimeField(default=timezone.now) + updated = models.DateTimeField(auto_now=True) + created_by = models.ForeignKey(User, + on_delete=models.CASCADE, + related_name="hackprojectscore_created_by") + category = models.IntegerField() + + class Meta: + verbose_name_plural = "Hack project score categories" From a2f75c1551f79e66b3f8d3bbeb7b141b07c8f777 Mon Sep 17 00:00:00 2001 From: Ri-Dearg Date: Thu, 15 Oct 2020 22:39:03 +0000 Subject: [PATCH 09/25] Added Foreign Key Fields Foreign Keys match the schema closely but need review. See comments. --- .../migrations/0004_auto_20201015_2224.py | 65 +++++++++++++++ hackathon/models.py | 82 ++++++++++++------- 2 files changed, 118 insertions(+), 29 deletions(-) create mode 100644 hackathon/migrations/0004_auto_20201015_2224.py diff --git a/hackathon/migrations/0004_auto_20201015_2224.py b/hackathon/migrations/0004_auto_20201015_2224.py new file mode 100644 index 00000000..1a3d1081 --- /dev/null +++ b/hackathon/migrations/0004_auto_20201015_2224.py @@ -0,0 +1,65 @@ +# Generated by Django 3.1.1 on 2020-10-15 22:24 + +from django.conf import settings +from django.db import migrations, models +import django.db.models.deletion +import django.utils.timezone + + +class Migration(migrations.Migration): + + dependencies = [ + migrations.swappable_dependency(settings.AUTH_USER_MODEL), + ('hackathon', '0003_auto_20201015_2020'), + ] + + operations = [ + migrations.AddField( + model_name='hackawardcategory', + name='hackathon', + field=models.ForeignKey(default=1, on_delete=django.db.models.deletion.CASCADE, related_name='awards', to='hackathon.hackathon'), + preserve_default=False, + ), + migrations.AddField( + model_name='hackawardcategory', + name='winning_project', + field=models.OneToOneField(blank=True, null=True, on_delete=django.db.models.deletion.SET_NULL, to='hackathon.hackproject'), + ), + migrations.AddField( + model_name='hackteam', + name='hackathon', + field=models.ForeignKey(default=1, on_delete=django.db.models.deletion.CASCADE, related_name='teams', to='hackathon.hackathon'), + preserve_default=False, + ), + migrations.AddField( + model_name='hackteam', + name='project', + field=models.OneToOneField(blank=True, null=True, on_delete=django.db.models.deletion.SET_NULL, to='hackathon.hackproject'), + ), + migrations.CreateModel( + name='HackProjectScoreCategory', + fields=[ + ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), + ('created', models.DateTimeField(default=django.utils.timezone.now)), + ('updated', models.DateTimeField(auto_now=True)), + ('category', models.CharField(default='', max_length=255)), + ('score', models.IntegerField(default=0)), + ('created_by', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name='hackprojectscorecategory_created_by', to=settings.AUTH_USER_MODEL)), + ], + options={ + 'verbose_name_plural': 'Hack project score categories', + }, + ), + migrations.CreateModel( + name='HackProjectScore', + fields=[ + ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), + ('created', models.DateTimeField(default=django.utils.timezone.now)), + ('updated', models.DateTimeField(auto_now=True)), + ('created_by', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name='hackprojectscore_created_by', to=settings.AUTH_USER_MODEL)), + ('judge', models.OneToOneField(on_delete=django.db.models.deletion.CASCADE, to=settings.AUTH_USER_MODEL)), + ('project', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name='scores', to='hackathon.hackproject')), + ('score', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='hackathon.hackprojectscorecategory')), + ], + ), + ] diff --git a/hackathon/models.py b/hackathon/models.py index 7918dcf3..89fde159 100644 --- a/hackathon/models.py +++ b/hackathon/models.py @@ -5,6 +5,15 @@ # Commented out fields be added when the other models are finished. +# Optional fields are ony set to deal with user deletion issues. +# If this isn't a problem, they can all be changed to required fields. + +# The "updated" field isn't editable in admin. Neither is "submission" field. + +# When it seemed relevant, I moved the ForeignKey field to another model and +# used the one listed in the schema as the related_name. I may have been +# erroneous to do so but it can be corrected easily. + # Create your models here. class Hackathon(models.Model): @@ -19,14 +28,6 @@ class Hackathon(models.Model): description = models.TextField() start_date = models.DateTimeField() end_date = models.DateTimeField() - # awards = models.ForeignKey("HackAwardCategory", - # null=True, - # blank=True, - # on_delete=models.SET_NULL) - # teams = models.OneToOne("HackTeam", - # null=True, - # blank=True, - # on_delete=models.SET_NULL) judges = models.ManyToManyField(User, blank=True, related_name='hackathon_judges') @@ -36,6 +37,9 @@ class Hackathon(models.Model): on_delete=models.SET_NULL, related_name="hackathon_organiser") + def __str__(self): + return self.display_name + class HackAwardCategory(models.Model): """Model representing a HackAwardCategory. It is connected by a foreign key to @@ -47,10 +51,16 @@ class HackAwardCategory(models.Model): related_name="hackawardcategory_created_by") display_name = models.CharField(default="", max_length=254) description = models.TextField() - # winning_project = models.OneToOne("HackProject", - # null=True, - # blank=True, - # on_delete=models.SET_NULL) + hackathon = models.ForeignKey("Hackathon", + on_delete=models.CASCADE, + related_name="awards") + winning_project = models.OneToOneField("HackProject", + null=True, + blank=True, + on_delete=models.SET_NULL) + + def __str__(self): + return self.display_name class Meta: verbose_name_plural = "Hack award categories" @@ -65,12 +75,19 @@ class HackTeam(models.Model): on_delete=models.CASCADE, related_name="hackteam_created_by") display_name = models.CharField(default="", max_length=254) + # It may be necessary to alter User model? participants = models.ManyToManyField(User, related_name='hackteam') - # winning_project = models.OneToOne("HackProject", - # null=True, - # blank=True, - # on_delete=models.SET_NULL) + hackathon = models.ForeignKey("Hackathon", + on_delete=models.CASCADE, + related_name="teams") + project = models.OneToOneField("HackProject", + null=True, + blank=True, + on_delete=models.SET_NULL) + + def __str__(self): + return self.display_name class HackProject(models.Model): @@ -86,16 +103,15 @@ class HackProject(models.Model): github_link = models.CharField(default="", max_length=255) collab_link = models.CharField(default="", max_length=255) submission_time = models.DateTimeField(auto_now_add=True) - # scores = models.ForignKey("HackProjectScore", - # null=True, - # blank=True, - # on_delete=models.SET_NULL) mentor = models.ForeignKey(User, null=True, blank=True, on_delete=models.SET_NULL, related_name="hackproject_mentor") + def __str__(self): + return self.display_name + class HackProjectScore(models.Model): """Model representing a HackProjectScore. It is connected by a foreign key to @@ -105,22 +121,30 @@ class HackProjectScore(models.Model): created_by = models.ForeignKey(User, on_delete=models.CASCADE, related_name="hackprojectscore_created_by") - judge = models.ForeignKey(User, on_delete=models.CASCADE) - # score = models.ForignKey("HackProjectScoreCategory", - # null=True, - # blank=True, - # on_delete=models.SET_NULL) + judge = models.OneToOneField(User, on_delete=models.CASCADE) + project = models.ForeignKey("HackProject", + on_delete=models.CASCADE, + related_name="scores") + score = models.ForeignKey("HackProjectScoreCategory", + on_delete=models.CASCADE) + + def __str__(self): + return f'{self.project}, {self.judge}' class HackProjectScoreCategory(models.Model): - """Model representing a HackProject. It is connected by a foreign key to - User and HackProjectScore. Optional Fields: mentor.""" + """Model representing a HackProjectScoreCategory. It is connected by a + foreign key to User.""" created = models.DateTimeField(default=timezone.now) updated = models.DateTimeField(auto_now=True) created_by = models.ForeignKey(User, on_delete=models.CASCADE, - related_name="hackprojectscore_created_by") - category = models.IntegerField() + related_name="hackprojectscorecategory_created_by") # NOQA E501 + category = models.CharField(default="", max_length=255) + score = models.IntegerField(default=0) + + def __str__(self): + return f'{self.category}, {self.score}' class Meta: verbose_name_plural = "Hack project score categories" From 2b741b257523cf9e56d45d09397c0e9617c57e17 Mon Sep 17 00:00:00 2001 From: Ri-Dearg Date: Fri, 16 Oct 2020 14:08:22 +0000 Subject: [PATCH 10/25] Commented on ForeignKey fields --- hackathon/models.py | 46 +++++++++++++++++++++++++++++++++++---------- 1 file changed, 36 insertions(+), 10 deletions(-) diff --git a/hackathon/models.py b/hackathon/models.py index 89fde159..0fcf6b19 100644 --- a/hackathon/models.py +++ b/hackathon/models.py @@ -3,24 +3,27 @@ from django.contrib.auth.models import User -# Commented out fields be added when the other models are finished. - -# Optional fields are ony set to deal with user deletion issues. +# Optional fields are ony set to deal with object deletion issues. # If this isn't a problem, they can all be changed to required fields. # The "updated" field isn't editable in admin. Neither is "submission" field. +# A custom method to auto-fill created_by fields can be made # When it seemed relevant, I moved the ForeignKey field to another model and # used the one listed in the schema as the related_name. I may have been # erroneous to do so but it can be corrected easily. +# My reasoning is explained in comments above the ForeignKey fields. # Create your models here. class Hackathon(models.Model): """Model representing a Hackathon. It is connected by a foreign key to - User, HackAwards and HackTeam. Optional Fields: judges, organiser.""" + User, HackAwards and HackTeam. Optional Fields: judges, organiser. + "awards" and "teams" are related tables. They have been moved to + HackAwardCategory and HackTeam respectively. Please see comments there.""" created = models.DateTimeField(default=timezone.now) updated = models.DateTimeField(auto_now=True) + # Each model can only be created by one user: One To Many created_by = models.ForeignKey(User, on_delete=models.CASCADE, related_name="hackathon_created_by") @@ -28,9 +31,12 @@ class Hackathon(models.Model): description = models.TextField() start_date = models.DateTimeField() end_date = models.DateTimeField() + # Hackathons can have numerous judges and + # users could be the judges of more than one Hackathon: Many to Many judges = models.ManyToManyField(User, blank=True, related_name='hackathon_judges') + # One organiser could organise more than one Hackathon: One To Many organiser = models.ForeignKey(User, null=True, blank=True, @@ -43,17 +49,22 @@ def __str__(self): class HackAwardCategory(models.Model): """Model representing a HackAwardCategory. It is connected by a foreign key to - User and HackProject.""" + User, Hackathon and HackProject. Optional fields: winning_project.""" created = models.DateTimeField(default=timezone.now) updated = models.DateTimeField(auto_now=True) + # Each model can only be created by one user: One To Many created_by = models.ForeignKey(User, on_delete=models.CASCADE, related_name="hackawardcategory_created_by") display_name = models.CharField(default="", max_length=254) description = models.TextField() + # a Category will only apply to one Hackathon and + # a Hackathon has numerous categories: One to Many. + # If the category was going to be reused, instead, use Many to Many. hackathon = models.ForeignKey("Hackathon", on_delete=models.CASCADE, related_name="awards") + # One category can have one winner: One to One winning_project = models.OneToOneField("HackProject", null=True, blank=True, @@ -68,19 +79,26 @@ class Meta: class HackTeam(models.Model): """Model representing a HackTeam. It is connected by a foreign key to - User and HackProject.""" + User, Hackathon and HackProject. Optional fields: project.""" created = models.DateTimeField(default=timezone.now) updated = models.DateTimeField(auto_now=True) + # Each model can only be created by one user: One To Many created_by = models.ForeignKey(User, on_delete=models.CASCADE, related_name="hackteam_created_by") display_name = models.CharField(default="", max_length=254) - # It may be necessary to alter User model? + # users could be the participants of more than one Hackathon, on different + # teams and a team is made of a number of participants - Many to Many + # Issue is that a user could join more than one team on the same Hackathon. + # Could use a custom save method to prevent it. participants = models.ManyToManyField(User, related_name='hackteam') + # A team participates in one Hackathon and + # a Hackathon has numerous teams: One to Many. hackathon = models.ForeignKey("Hackathon", on_delete=models.CASCADE, related_name="teams") + # One to team will have one project: One to One project = models.OneToOneField("HackProject", null=True, blank=True, @@ -92,9 +110,11 @@ def __str__(self): class HackProject(models.Model): """Model representing a HackProject. It is connected by a foreign key to - User and HackProjectScore. Optional Fields: mentor.""" + User and HackProjectScore. Optional Fields: mentor. + "scores" has been moved to HackProjectScore. See comments there.""" created = models.DateTimeField(default=timezone.now) updated = models.DateTimeField(auto_now=True) + # Each model can only be created by one user: One To Many created_by = models.ForeignKey(User, on_delete=models.CASCADE, related_name="hackproject_created_by") @@ -103,6 +123,7 @@ class HackProject(models.Model): github_link = models.CharField(default="", max_length=255) collab_link = models.CharField(default="", max_length=255) submission_time = models.DateTimeField(auto_now_add=True) + # A project has one mentor, a mentor has numerous projects: One to Many. mentor = models.ForeignKey(User, null=True, blank=True, @@ -115,16 +136,20 @@ def __str__(self): class HackProjectScore(models.Model): """Model representing a HackProjectScore. It is connected by a foreign key to - User and HackProjectScoreCategory.""" + User, HackProject and HackProjectScoreCategory.""" created = models.DateTimeField(default=timezone.now) updated = models.DateTimeField(auto_now=True) + # Each model can only be created by one user: One To Many created_by = models.ForeignKey(User, on_delete=models.CASCADE, related_name="hackprojectscore_created_by") + # One Judge can give one score - One to One judge = models.OneToOneField(User, on_delete=models.CASCADE) + # One score is for one project, a project has numerous scores: One to Many project = models.ForeignKey("HackProject", on_delete=models.CASCADE, related_name="scores") + # A score applies to one category, a category has many scores: One to Many score = models.ForeignKey("HackProjectScoreCategory", on_delete=models.CASCADE) @@ -134,9 +159,10 @@ def __str__(self): class HackProjectScoreCategory(models.Model): """Model representing a HackProjectScoreCategory. It is connected by a - foreign key to User.""" + foreign key to User and HackProjectScore.""" created = models.DateTimeField(default=timezone.now) updated = models.DateTimeField(auto_now=True) + # Each model can only be created by one user - One To Many created_by = models.ForeignKey(User, on_delete=models.CASCADE, related_name="hackprojectscorecategory_created_by") # NOQA E501 From b7376ee84254a6b82f023675c331a7e1ab9cf2d5 Mon Sep 17 00:00:00 2001 From: Ri-Dearg Date: Fri, 16 Oct 2020 14:10:29 +0000 Subject: [PATCH 11/25] Added URLFields Sitched the *-Link fields for URLFields. Added comments. --- hackathon/models.py | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/hackathon/models.py b/hackathon/models.py index 0fcf6b19..fd9a96ef 100644 --- a/hackathon/models.py +++ b/hackathon/models.py @@ -111,6 +111,7 @@ def __str__(self): class HackProject(models.Model): """Model representing a HackProject. It is connected by a foreign key to User and HackProjectScore. Optional Fields: mentor. + Used URLFields for the *_link fields, a CharField with URL validation. "scores" has been moved to HackProjectScore. See comments there.""" created = models.DateTimeField(default=timezone.now) updated = models.DateTimeField(auto_now=True) @@ -120,8 +121,8 @@ class HackProject(models.Model): related_name="hackproject_created_by") display_name = models.CharField(default="", max_length=255) description = models.TextField() - github_link = models.CharField(default="", max_length=255) - collab_link = models.CharField(default="", max_length=255) + github_link = models.URLField(default="", max_length=255) + collab_link = models.URLField(default="", max_length=255) submission_time = models.DateTimeField(auto_now_add=True) # A project has one mentor, a mentor has numerous projects: One to Many. mentor = models.ForeignKey(User, From 45a288b3cf033e3576b8763129e3f51ad2f3c315 Mon Sep 17 00:00:00 2001 From: Ri-Dearg Date: Fri, 16 Oct 2020 14:10:29 +0000 Subject: [PATCH 12/25] Added URLFields Sitched the *-Link fields for URLFields. Added comments. Added URLFields to project Model Changed *_link to URLField, added comments. This commit fixes issue #61 --- hackathon/models.py | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/hackathon/models.py b/hackathon/models.py index 0fcf6b19..fd9a96ef 100644 --- a/hackathon/models.py +++ b/hackathon/models.py @@ -111,6 +111,7 @@ def __str__(self): class HackProject(models.Model): """Model representing a HackProject. It is connected by a foreign key to User and HackProjectScore. Optional Fields: mentor. + Used URLFields for the *_link fields, a CharField with URL validation. "scores" has been moved to HackProjectScore. See comments there.""" created = models.DateTimeField(default=timezone.now) updated = models.DateTimeField(auto_now=True) @@ -120,8 +121,8 @@ class HackProject(models.Model): related_name="hackproject_created_by") display_name = models.CharField(default="", max_length=255) description = models.TextField() - github_link = models.CharField(default="", max_length=255) - collab_link = models.CharField(default="", max_length=255) + github_link = models.URLField(default="", max_length=255) + collab_link = models.URLField(default="", max_length=255) submission_time = models.DateTimeField(auto_now_add=True) # A project has one mentor, a mentor has numerous projects: One to Many. mentor = models.ForeignKey(User, From 591169fa26ae04d684c6311668566f1f7ed5367e Mon Sep 17 00:00:00 2001 From: Rory Patrick Sheridan <44118951+Ri-Dearg@users.noreply.github.com> Date: Fri, 16 Oct 2020 19:37:52 +0200 Subject: [PATCH 13/25] Delete settings.json Should not be commited here. --- .theia/settings.json | 3 --- 1 file changed, 3 deletions(-) delete mode 100644 .theia/settings.json diff --git a/.theia/settings.json b/.theia/settings.json deleted file mode 100644 index 27c5cd2b..00000000 --- a/.theia/settings.json +++ /dev/null @@ -1,3 +0,0 @@ -{ - "editor.autoSave": "on" -} \ No newline at end of file From 07afd39446cfc768cc8ce27c17de44dd6363d282 Mon Sep 17 00:00:00 2001 From: Ri-Dearg Date: Fri, 16 Oct 2020 19:11:27 +0000 Subject: [PATCH 14/25] Pull Request review changes made. --- hackathon/models.py | 23 +++++++++++------------ 1 file changed, 11 insertions(+), 12 deletions(-) diff --git a/hackathon/models.py b/hackathon/models.py index fd9a96ef..a8987341 100644 --- a/hackathon/models.py +++ b/hackathon/models.py @@ -15,13 +15,12 @@ # My reasoning is explained in comments above the ForeignKey fields. -# Create your models here. class Hackathon(models.Model): """Model representing a Hackathon. It is connected by a foreign key to User, HackAwards and HackTeam. Optional Fields: judges, organiser. "awards" and "teams" are related tables. They have been moved to HackAwardCategory and HackTeam respectively. Please see comments there.""" - created = models.DateTimeField(default=timezone.now) + created = models.DateTimeField(auto_add_now=True) updated = models.DateTimeField(auto_now=True) # Each model can only be created by one user: One To Many created_by = models.ForeignKey(User, @@ -50,12 +49,12 @@ def __str__(self): class HackAwardCategory(models.Model): """Model representing a HackAwardCategory. It is connected by a foreign key to User, Hackathon and HackProject. Optional fields: winning_project.""" - created = models.DateTimeField(default=timezone.now) + created = models.DateTimeField(auto_add_now=True) updated = models.DateTimeField(auto_now=True) # Each model can only be created by one user: One To Many created_by = models.ForeignKey(User, on_delete=models.CASCADE, - related_name="hackawardcategory_created_by") + related_name="hackawardcategories") display_name = models.CharField(default="", max_length=254) description = models.TextField() # a Category will only apply to one Hackathon and @@ -80,7 +79,7 @@ class Meta: class HackTeam(models.Model): """Model representing a HackTeam. It is connected by a foreign key to User, Hackathon and HackProject. Optional fields: project.""" - created = models.DateTimeField(default=timezone.now) + created = models.DateTimeField(auto_add_now=True) updated = models.DateTimeField(auto_now=True) # Each model can only be created by one user: One To Many created_by = models.ForeignKey(User, @@ -113,7 +112,7 @@ class HackProject(models.Model): User and HackProjectScore. Optional Fields: mentor. Used URLFields for the *_link fields, a CharField with URL validation. "scores" has been moved to HackProjectScore. See comments there.""" - created = models.DateTimeField(default=timezone.now) + created = models.DateTimeField(auto_add_now=True) updated = models.DateTimeField(auto_now=True) # Each model can only be created by one user: One To Many created_by = models.ForeignKey(User, @@ -138,7 +137,7 @@ def __str__(self): class HackProjectScore(models.Model): """Model representing a HackProjectScore. It is connected by a foreign key to User, HackProject and HackProjectScoreCategory.""" - created = models.DateTimeField(default=timezone.now) + created = models.DateTimeField(auto_add_now=True) updated = models.DateTimeField(auto_now=True) # Each model can only be created by one user: One To Many created_by = models.ForeignKey(User, @@ -147,12 +146,13 @@ class HackProjectScore(models.Model): # One Judge can give one score - One to One judge = models.OneToOneField(User, on_delete=models.CASCADE) # One score is for one project, a project has numerous scores: One to Many - project = models.ForeignKey("HackProject", + project = models.ForeignKey(HackProject, on_delete=models.CASCADE, related_name="scores") + score = models.IntegerField(default=0) # A score applies to one category, a category has many scores: One to Many - score = models.ForeignKey("HackProjectScoreCategory", - on_delete=models.CASCADE) + hackprojectscorecategory = models.ForeignKey("HackProjectScoreCategory", + on_delete=models.CASCADE) def __str__(self): return f'{self.project}, {self.judge}' @@ -161,14 +161,13 @@ def __str__(self): class HackProjectScoreCategory(models.Model): """Model representing a HackProjectScoreCategory. It is connected by a foreign key to User and HackProjectScore.""" - created = models.DateTimeField(default=timezone.now) + created = models.DateTimeField(auto_add_now=True) updated = models.DateTimeField(auto_now=True) # Each model can only be created by one user - One To Many created_by = models.ForeignKey(User, on_delete=models.CASCADE, related_name="hackprojectscorecategory_created_by") # NOQA E501 category = models.CharField(default="", max_length=255) - score = models.IntegerField(default=0) def __str__(self): return f'{self.category}, {self.score}' From c85533bb6cf7779116b349c857d4c46cb9d926c3 Mon Sep 17 00:00:00 2001 From: Ri-Dearg Date: Fri, 16 Oct 2020 19:14:41 +0000 Subject: [PATCH 15/25] Updated gitignore to ignore settings.json --- .gitignore | 1 + 1 file changed, 1 insertion(+) diff --git a/.gitignore b/.gitignore index a38642ff..d8a1bf26 100644 --- a/.gitignore +++ b/.gitignore @@ -6,3 +6,4 @@ __pycache__/ *.sqlite3 # static/ # media/ +settings.json \ No newline at end of file From 88c7540d40831b65f204897dc7dab57ec143ce73 Mon Sep 17 00:00:00 2001 From: Ri-Dearg Date: Fri, 16 Oct 2020 19:15:58 +0000 Subject: [PATCH 16/25] Added last extra line on file --- .gitignore | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.gitignore b/.gitignore index d8a1bf26..fa862011 100644 --- a/.gitignore +++ b/.gitignore @@ -6,4 +6,4 @@ __pycache__/ *.sqlite3 # static/ # media/ -settings.json \ No newline at end of file +settings.json From 8131a73a03e70e7ce93e0a39a972b1c962d7ec44 Mon Sep 17 00:00:00 2001 From: Ri-Dearg Date: Fri, 16 Oct 2020 19:28:37 +0000 Subject: [PATCH 17/25] Removed unecessary import and quotes. --- hackathon/models.py | 6 ++---- 1 file changed, 2 insertions(+), 4 deletions(-) diff --git a/hackathon/models.py b/hackathon/models.py index a8987341..b3ee4d99 100644 --- a/hackathon/models.py +++ b/hackathon/models.py @@ -1,6 +1,4 @@ from django.db import models -from django.utils import timezone - from django.contrib.auth.models import User # Optional fields are ony set to deal with object deletion issues. @@ -60,7 +58,7 @@ class HackAwardCategory(models.Model): # a Category will only apply to one Hackathon and # a Hackathon has numerous categories: One to Many. # If the category was going to be reused, instead, use Many to Many. - hackathon = models.ForeignKey("Hackathon", + hackathon = models.ForeignKey(Hackathon, on_delete=models.CASCADE, related_name="awards") # One category can have one winner: One to One @@ -94,7 +92,7 @@ class HackTeam(models.Model): related_name='hackteam') # A team participates in one Hackathon and # a Hackathon has numerous teams: One to Many. - hackathon = models.ForeignKey("Hackathon", + hackathon = models.ForeignKey(Hackathon, on_delete=models.CASCADE, related_name="teams") # One to team will have one project: One to One From 352c80e809b3036831858913a29dbf7040943ee2 Mon Sep 17 00:00:00 2001 From: Ri-Dearg Date: Fri, 16 Oct 2020 19:52:31 +0000 Subject: [PATCH 18/25] Corrected Typo and added migrations. --- .../migrations/0005_auto_20201016_1951.py | 76 +++++++++++++++++++ hackathon/models.py | 12 +-- 2 files changed, 82 insertions(+), 6 deletions(-) create mode 100644 hackathon/migrations/0005_auto_20201016_1951.py diff --git a/hackathon/migrations/0005_auto_20201016_1951.py b/hackathon/migrations/0005_auto_20201016_1951.py new file mode 100644 index 00000000..00a23f97 --- /dev/null +++ b/hackathon/migrations/0005_auto_20201016_1951.py @@ -0,0 +1,76 @@ +# Generated by Django 3.1.1 on 2020-10-16 19:51 + +from django.conf import settings +from django.db import migrations, models +import django.db.models.deletion + + +class Migration(migrations.Migration): + + dependencies = [ + migrations.swappable_dependency(settings.AUTH_USER_MODEL), + ('hackathon', '0004_auto_20201015_2224'), + ] + + operations = [ + migrations.RemoveField( + model_name='hackprojectscorecategory', + name='score', + ), + migrations.AddField( + model_name='hackprojectscore', + name='hackprojectscorecategory', + field=models.ForeignKey(default=1, on_delete=django.db.models.deletion.CASCADE, to='hackathon.hackprojectscorecategory'), + preserve_default=False, + ), + migrations.AlterField( + model_name='hackathon', + name='created', + field=models.DateTimeField(auto_now_add=True), + ), + migrations.AlterField( + model_name='hackawardcategory', + name='created', + field=models.DateTimeField(auto_now_add=True), + ), + migrations.AlterField( + model_name='hackawardcategory', + name='created_by', + field=models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name='hackawardcategories', to=settings.AUTH_USER_MODEL), + ), + migrations.AlterField( + model_name='hackproject', + name='collab_link', + field=models.URLField(default='', max_length=255), + ), + migrations.AlterField( + model_name='hackproject', + name='created', + field=models.DateTimeField(auto_now_add=True), + ), + migrations.AlterField( + model_name='hackproject', + name='github_link', + field=models.URLField(default='', max_length=255), + ), + migrations.AlterField( + model_name='hackprojectscore', + name='created', + field=models.DateTimeField(auto_now_add=True), + ), + migrations.AlterField( + model_name='hackprojectscore', + name='score', + field=models.IntegerField(default=0), + ), + migrations.AlterField( + model_name='hackprojectscorecategory', + name='created', + field=models.DateTimeField(auto_now_add=True), + ), + migrations.AlterField( + model_name='hackteam', + name='created', + field=models.DateTimeField(auto_now_add=True), + ), + ] diff --git a/hackathon/models.py b/hackathon/models.py index b3ee4d99..321745a2 100644 --- a/hackathon/models.py +++ b/hackathon/models.py @@ -18,7 +18,7 @@ class Hackathon(models.Model): User, HackAwards and HackTeam. Optional Fields: judges, organiser. "awards" and "teams" are related tables. They have been moved to HackAwardCategory and HackTeam respectively. Please see comments there.""" - created = models.DateTimeField(auto_add_now=True) + created = models.DateTimeField(auto_now_add=True) updated = models.DateTimeField(auto_now=True) # Each model can only be created by one user: One To Many created_by = models.ForeignKey(User, @@ -47,7 +47,7 @@ def __str__(self): class HackAwardCategory(models.Model): """Model representing a HackAwardCategory. It is connected by a foreign key to User, Hackathon and HackProject. Optional fields: winning_project.""" - created = models.DateTimeField(auto_add_now=True) + created = models.DateTimeField(auto_now_add=True) updated = models.DateTimeField(auto_now=True) # Each model can only be created by one user: One To Many created_by = models.ForeignKey(User, @@ -77,7 +77,7 @@ class Meta: class HackTeam(models.Model): """Model representing a HackTeam. It is connected by a foreign key to User, Hackathon and HackProject. Optional fields: project.""" - created = models.DateTimeField(auto_add_now=True) + created = models.DateTimeField(auto_now_add=True) updated = models.DateTimeField(auto_now=True) # Each model can only be created by one user: One To Many created_by = models.ForeignKey(User, @@ -110,7 +110,7 @@ class HackProject(models.Model): User and HackProjectScore. Optional Fields: mentor. Used URLFields for the *_link fields, a CharField with URL validation. "scores" has been moved to HackProjectScore. See comments there.""" - created = models.DateTimeField(auto_add_now=True) + created = models.DateTimeField(auto_now_add=True) updated = models.DateTimeField(auto_now=True) # Each model can only be created by one user: One To Many created_by = models.ForeignKey(User, @@ -135,7 +135,7 @@ def __str__(self): class HackProjectScore(models.Model): """Model representing a HackProjectScore. It is connected by a foreign key to User, HackProject and HackProjectScoreCategory.""" - created = models.DateTimeField(auto_add_now=True) + created = models.DateTimeField(auto_now_add=True) updated = models.DateTimeField(auto_now=True) # Each model can only be created by one user: One To Many created_by = models.ForeignKey(User, @@ -159,7 +159,7 @@ def __str__(self): class HackProjectScoreCategory(models.Model): """Model representing a HackProjectScoreCategory. It is connected by a foreign key to User and HackProjectScore.""" - created = models.DateTimeField(auto_add_now=True) + created = models.DateTimeField(auto_now_add=True) updated = models.DateTimeField(auto_now=True) # Each model can only be created by one user - One To Many created_by = models.ForeignKey(User, From 11951848b8334f29132b8f6e1dbb9a166ddd0a20 Mon Sep 17 00:00:00 2001 From: Ri-Dearg Date: Fri, 16 Oct 2020 20:02:52 +0000 Subject: [PATCH 19/25] Updated str method on HackProjectScoreCategory to remove "score" --- hackathon/models.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/hackathon/models.py b/hackathon/models.py index 321745a2..27a8fd32 100644 --- a/hackathon/models.py +++ b/hackathon/models.py @@ -55,7 +55,7 @@ class HackAwardCategory(models.Model): related_name="hackawardcategories") display_name = models.CharField(default="", max_length=254) description = models.TextField() - # a Category will only apply to one Hackathon and + # a Category will only apply to one Hackathon and # a Hackathon has numerous categories: One to Many. # If the category was going to be reused, instead, use Many to Many. hackathon = models.ForeignKey(Hackathon, @@ -168,7 +168,7 @@ class HackProjectScoreCategory(models.Model): category = models.CharField(default="", max_length=255) def __str__(self): - return f'{self.category}, {self.score}' + return {self.category}, {self.score} class Meta: verbose_name_plural = "Hack project score categories" From bdefd17d2ceb1dfbfc258effccd811929cd78800 Mon Sep 17 00:00:00 2001 From: Ri-Dearg Date: Fri, 16 Oct 2020 20:04:43 +0000 Subject: [PATCH 20/25] Updated str method on HackProjectScoreCategory to remove "score" --- hackathon/models.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/hackathon/models.py b/hackathon/models.py index 321745a2..f2c85862 100644 --- a/hackathon/models.py +++ b/hackathon/models.py @@ -55,7 +55,7 @@ class HackAwardCategory(models.Model): related_name="hackawardcategories") display_name = models.CharField(default="", max_length=254) description = models.TextField() - # a Category will only apply to one Hackathon and + # a Category will only apply to one Hackathon and # a Hackathon has numerous categories: One to Many. # If the category was going to be reused, instead, use Many to Many. hackathon = models.ForeignKey(Hackathon, @@ -168,7 +168,7 @@ class HackProjectScoreCategory(models.Model): category = models.CharField(default="", max_length=255) def __str__(self): - return f'{self.category}, {self.score}' + return self.category class Meta: verbose_name_plural = "Hack project score categories" From 875cc067bf8f3b05320286970b9e00176ccb687a Mon Sep 17 00:00:00 2001 From: Ri-Dearg Date: Fri, 16 Oct 2020 21:11:41 +0000 Subject: [PATCH 21/25] Test setUp method added and functional Also Changed model field name for readability. --- .../migrations/0006_auto_20201016_2050.py | 18 +++++ hackathon/models.py | 2 +- hackathon/tests/test_models.py | 65 +++++++++++++++++++ hackathon/tests/tests.py | 3 - 4 files changed, 84 insertions(+), 4 deletions(-) create mode 100644 hackathon/migrations/0006_auto_20201016_2050.py create mode 100644 hackathon/tests/test_models.py delete mode 100644 hackathon/tests/tests.py diff --git a/hackathon/migrations/0006_auto_20201016_2050.py b/hackathon/migrations/0006_auto_20201016_2050.py new file mode 100644 index 00000000..ccd0d5ac --- /dev/null +++ b/hackathon/migrations/0006_auto_20201016_2050.py @@ -0,0 +1,18 @@ +# Generated by Django 3.1.1 on 2020-10-16 20:50 + +from django.db import migrations + + +class Migration(migrations.Migration): + + dependencies = [ + ('hackathon', '0005_auto_20201016_1951'), + ] + + operations = [ + migrations.RenameField( + model_name='hackprojectscore', + old_name='hackprojectscorecategory', + new_name='hack_project_score_category', + ), + ] diff --git a/hackathon/models.py b/hackathon/models.py index f2c85862..0bed1f71 100644 --- a/hackathon/models.py +++ b/hackathon/models.py @@ -149,7 +149,7 @@ class HackProjectScore(models.Model): related_name="scores") score = models.IntegerField(default=0) # A score applies to one category, a category has many scores: One to Many - hackprojectscorecategory = models.ForeignKey("HackProjectScoreCategory", + hack_project_score_category = models.ForeignKey("HackProjectScoreCategory", on_delete=models.CASCADE) def __str__(self): diff --git a/hackathon/tests/test_models.py b/hackathon/tests/test_models.py new file mode 100644 index 00000000..1ef8b332 --- /dev/null +++ b/hackathon/tests/test_models.py @@ -0,0 +1,65 @@ +from django.test import TestCase +from django.utils import timezone +from django.contrib.auth.models import User + +from hackathon.models import (Hackathon, + HackTeam, + HackAwardCategory, + HackProject, + HackProjectScore, + HackProjectScoreCategory) + + +class HackathonTests(TestCase): + """Tests fo Hackathon models.""" + + def setUp(self): + """Sets up the models for testing""" + user = User.objects.create(username="testuser") + user.save() + hackathon = Hackathon.objects.create( + created_by=user, + display_name="hacktest", + description="lorem ipsum", + start_date=f'{timezone.now()}', + end_date=f'{timezone.now()}') + hackathon.save() + + team = HackTeam.objects.create( + created_by=user, + display_name="testteam", + hackathon=hackathon) + team.save() + team.participants.set([user]) + + award_category = HackAwardCategory.objects.create( + created_by=user, + display_name="testaward", + description="lorem ipsum", + hackathon=hackathon) + award_category.save() + + project = HackProject.objects.create( + created_by=user, + display_name="testproject", + description="lorem ipsum", + github_link="https://www.test.com/", + collab_link="https://www.test.com/") + project.save() + + score_category = HackProjectScoreCategory.objects.create( + created_by=user, + category="testcategory") + score_category.save() + + score = HackProjectScore.objects.create( + created_by=user, + judge=user, + project=project, + score=1, + hack_project_score_category=score_category) + score.save() + + def test_hackathon_str(self): + """Tests the string method on the hackathon.""" + self.assertEqual(str(Hackathon.objects.get(pk=1)), ('hacktest')) diff --git a/hackathon/tests/tests.py b/hackathon/tests/tests.py deleted file mode 100644 index 7ce503c2..00000000 --- a/hackathon/tests/tests.py +++ /dev/null @@ -1,3 +0,0 @@ -from django.test import TestCase - -# Create your tests here. From 9cdbfcf723699121d026bf4fd005d7049e782202 Mon Sep 17 00:00:00 2001 From: Ri-Dearg Date: Fri, 16 Oct 2020 21:25:17 +0000 Subject: [PATCH 22/25] Tests written for str method on models. --- hackathon/models.py | 2 +- hackathon/tests/test_models.py | 23 +++++++++++++++++++++++ 2 files changed, 24 insertions(+), 1 deletion(-) diff --git a/hackathon/models.py b/hackathon/models.py index 0bed1f71..11867ee4 100644 --- a/hackathon/models.py +++ b/hackathon/models.py @@ -150,7 +150,7 @@ class HackProjectScore(models.Model): score = models.IntegerField(default=0) # A score applies to one category, a category has many scores: One to Many hack_project_score_category = models.ForeignKey("HackProjectScoreCategory", - on_delete=models.CASCADE) + on_delete=models.CASCADE) def __str__(self): return f'{self.project}, {self.judge}' diff --git a/hackathon/tests/test_models.py b/hackathon/tests/test_models.py index 1ef8b332..0c2c3b23 100644 --- a/hackathon/tests/test_models.py +++ b/hackathon/tests/test_models.py @@ -63,3 +63,26 @@ def setUp(self): def test_hackathon_str(self): """Tests the string method on the hackathon.""" self.assertEqual(str(Hackathon.objects.get(pk=1)), ('hacktest')) + + def test_hackteam_str(self): + """Tests the string method on the hackathon.""" + self.assertEqual(str(HackTeam.objects.get(pk=1)), ('testteam')) + + def test_hackawardcategory_str(self): + """Tests the string method on the hackathon.""" + self.assertEqual(str(HackAwardCategory.objects.get(pk=1)), + ('testaward')) + + def test_hackproject_str(self): + """Tests the string method on the hackathon.""" + self.assertEqual(str(HackProject.objects.get(pk=1)), ('testproject')) + + def test_hackprojectscore_str(self): + """Tests the string method on the hackathon.""" + self.assertEqual(str(HackProjectScore.objects.get(pk=1)), + ("testproject, testuser")) + + def test_hackprojectscorecategory_str(self): + """Tests the string method on the hackathon.""" + self.assertEqual(str(HackProjectScoreCategory.objects.get(pk=1)), + ('testcategory')) From f09fae8712e0397f72db2581a1bb2979d385156d Mon Sep 17 00:00:00 2001 From: Ri-Dearg Date: Sat, 17 Oct 2020 11:37:41 +0000 Subject: [PATCH 23/25] Updated Related names in models --- hackathon/models.py | 20 ++++++++++---------- 1 file changed, 10 insertions(+), 10 deletions(-) diff --git a/hackathon/models.py b/hackathon/models.py index 11867ee4..cc1f1b11 100644 --- a/hackathon/models.py +++ b/hackathon/models.py @@ -14,7 +14,7 @@ class Hackathon(models.Model): - """Model representing a Hackathon. It is connected by a foreign key to + """Model representing a Hackathon. It is connected by a foreign key to User, HackAwards and HackTeam. Optional Fields: judges, organiser. "awards" and "teams" are related tables. They have been moved to HackAwardCategory and HackTeam respectively. Please see comments there.""" @@ -23,7 +23,7 @@ class Hackathon(models.Model): # Each model can only be created by one user: One To Many created_by = models.ForeignKey(User, on_delete=models.CASCADE, - related_name="hackathon_created_by") + related_name="hackathons") display_name = models.CharField(default="", max_length=254) description = models.TextField() start_date = models.DateTimeField() @@ -45,7 +45,7 @@ def __str__(self): class HackAwardCategory(models.Model): - """Model representing a HackAwardCategory. It is connected by a foreign key to + """Model representing a HackAwardCategory. It is connected by a foreign key to User, Hackathon and HackProject. Optional fields: winning_project.""" created = models.DateTimeField(auto_now_add=True) updated = models.DateTimeField(auto_now=True) @@ -75,14 +75,14 @@ class Meta: class HackTeam(models.Model): - """Model representing a HackTeam. It is connected by a foreign key to + """Model representing a HackTeam. It is connected by a foreign key to User, Hackathon and HackProject. Optional fields: project.""" created = models.DateTimeField(auto_now_add=True) updated = models.DateTimeField(auto_now=True) # Each model can only be created by one user: One To Many created_by = models.ForeignKey(User, on_delete=models.CASCADE, - related_name="hackteam_created_by") + related_name="hackteams") display_name = models.CharField(default="", max_length=254) # users could be the participants of more than one Hackathon, on different # teams and a team is made of a number of participants - Many to Many @@ -106,7 +106,7 @@ def __str__(self): class HackProject(models.Model): - """Model representing a HackProject. It is connected by a foreign key to + """Model representing a HackProject. It is connected by a foreign key to User and HackProjectScore. Optional Fields: mentor. Used URLFields for the *_link fields, a CharField with URL validation. "scores" has been moved to HackProjectScore. See comments there.""" @@ -115,7 +115,7 @@ class HackProject(models.Model): # Each model can only be created by one user: One To Many created_by = models.ForeignKey(User, on_delete=models.CASCADE, - related_name="hackproject_created_by") + related_name="hackprojects") display_name = models.CharField(default="", max_length=255) description = models.TextField() github_link = models.URLField(default="", max_length=255) @@ -133,14 +133,14 @@ def __str__(self): class HackProjectScore(models.Model): - """Model representing a HackProjectScore. It is connected by a foreign key to + """Model representing a HackProjectScore. It is connected by a foreign key to User, HackProject and HackProjectScoreCategory.""" created = models.DateTimeField(auto_now_add=True) updated = models.DateTimeField(auto_now=True) # Each model can only be created by one user: One To Many created_by = models.ForeignKey(User, on_delete=models.CASCADE, - related_name="hackprojectscore_created_by") + related_name="hackprojectscores") # One Judge can give one score - One to One judge = models.OneToOneField(User, on_delete=models.CASCADE) # One score is for one project, a project has numerous scores: One to Many @@ -164,7 +164,7 @@ class HackProjectScoreCategory(models.Model): # Each model can only be created by one user - One To Many created_by = models.ForeignKey(User, on_delete=models.CASCADE, - related_name="hackprojectscorecategory_created_by") # NOQA E501 + related_name="hackprojectscorecategories") category = models.CharField(default="", max_length=255) def __str__(self): From b1f3100b6a54248c6364ca19896383fa68804539 Mon Sep 17 00:00:00 2001 From: Ri-Dearg Date: Sat, 17 Oct 2020 11:37:54 +0000 Subject: [PATCH 24/25] Updated .gitignore. --- .gitignore | 1 + 1 file changed, 1 insertion(+) diff --git a/.gitignore b/.gitignore index fa862011..fc034a35 100644 --- a/.gitignore +++ b/.gitignore @@ -7,3 +7,4 @@ __pycache__/ # static/ # media/ settings.json +.gitpod.yml \ No newline at end of file From f3ce532ee4d2ac29f0e09d416be0f9e97608d949 Mon Sep 17 00:00:00 2001 From: Ri-Dearg Date: Sat, 17 Oct 2020 11:48:58 +0000 Subject: [PATCH 25/25] Added migration file. --- .../migrations/0007_auto_20201017_1148.py | 41 +++++++++++++++++++ 1 file changed, 41 insertions(+) create mode 100644 hackathon/migrations/0007_auto_20201017_1148.py diff --git a/hackathon/migrations/0007_auto_20201017_1148.py b/hackathon/migrations/0007_auto_20201017_1148.py new file mode 100644 index 00000000..0144e456 --- /dev/null +++ b/hackathon/migrations/0007_auto_20201017_1148.py @@ -0,0 +1,41 @@ +# Generated by Django 3.1.1 on 2020-10-17 11:48 + +from django.conf import settings +from django.db import migrations, models +import django.db.models.deletion + + +class Migration(migrations.Migration): + + dependencies = [ + migrations.swappable_dependency(settings.AUTH_USER_MODEL), + ('hackathon', '0006_auto_20201016_2050'), + ] + + operations = [ + migrations.AlterField( + model_name='hackathon', + name='created_by', + field=models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name='hackathons', to=settings.AUTH_USER_MODEL), + ), + migrations.AlterField( + model_name='hackproject', + name='created_by', + field=models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name='hackprojects', to=settings.AUTH_USER_MODEL), + ), + migrations.AlterField( + model_name='hackprojectscore', + name='created_by', + field=models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name='hackprojectscores', to=settings.AUTH_USER_MODEL), + ), + migrations.AlterField( + model_name='hackprojectscorecategory', + name='created_by', + field=models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name='hackprojectscorecategories', to=settings.AUTH_USER_MODEL), + ), + migrations.AlterField( + model_name='hackteam', + name='created_by', + field=models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name='hackteams', to=settings.AUTH_USER_MODEL), + ), + ]