From d29cf5a08db2495c1501439125413f62bea0df6f Mon Sep 17 00:00:00 2001 From: unknown Date: Tue, 1 Apr 2025 11:56:24 -0400 Subject: [PATCH 1/7] created sponsorship starting portal and it's available list --- sponsorship/views.py | 32 ++++++++++++++++++++++++++++++++ 1 file changed, 32 insertions(+) create mode 100644 sponsorship/views.py diff --git a/sponsorship/views.py b/sponsorship/views.py new file mode 100644 index 00000000..f01a8c86 --- /dev/null +++ b/sponsorship/views.py @@ -0,0 +1,32 @@ +from django.shortcuts import render, get_object_or_404, redirect +from django.http import JsonResponse +from django.views.decorators.csrf import csrf_exempt +from django.contrib.auth.decorators import login_required +from .models import SponsorshipTier +from .forms import SponsorshipTierForm + +"""from the above this is a sample code i am contributing of starting the sponsorship +portal below, we would have to import the form and models which i havent +written code for yet which is to be implemented in the views here""" + +# Creating views here. + +#code functionality for sponsorship tier creation +@login_required +def create_sponsorship_tier(request): + """ Allow sponsorship team to define sponsorship tiers. """ + if request.method == "POST": + form = SponsorshipTierForm(request.POST) + if form.is_valid(): + form.save() + return JsonResponse({"message": "Sponsorship tier created successfully!"}, status=201) + else: + form = SponsorshipTierForm() + return render(request, "sponsorship/create_tier.html", {"form": form}) + +#code sample for tier listing +@login_required +def list_sponsorship_tiers(request): + """ List all sponsorship tiers available. """ + tiers = SponsorshipTier.objects.all() + return render(request, "sponsorship/list_tiers.html", {"tiers": tiers}) \ No newline at end of file From 937ac7da0ea7e76378221344672ef3c9954c9ad5 Mon Sep 17 00:00:00 2001 From: unknown Date: Tue, 1 Apr 2025 12:50:51 -0400 Subject: [PATCH 2/7] added more functionality to sponsorship portal --- portal/settings.py | 1 + sponsorship/models.py | 26 ++++++++++++++++++++++++++ sponsorship/urls.py | 0 sponsorship/views.py | 36 +++++++++++++++++++++++++++++++++--- 4 files changed, 60 insertions(+), 3 deletions(-) create mode 100644 sponsorship/models.py create mode 100644 sponsorship/urls.py diff --git a/portal/settings.py b/portal/settings.py index 6e85203b..f5b6ef51 100644 --- a/portal/settings.py +++ b/portal/settings.py @@ -48,6 +48,7 @@ "portal", "volunteer", "portal_account", + "sponsorship", ] MIDDLEWARE = [ diff --git a/sponsorship/models.py b/sponsorship/models.py new file mode 100644 index 00000000..82bdfe61 --- /dev/null +++ b/sponsorship/models.py @@ -0,0 +1,26 @@ +#model schema creation for more functionality addition to sponsorship portal +from django.db import models + +class SponsorshipApplication(models.Model): + STATUS_CHOICES = [ + ("Pending", "Pending"), + ("Approved", "Approved"), + ("Rejected", "Rejected"), + ] + company_name = models.CharField(max_length=255) + email = models.EmailField() + tier = models.CharField(max_length=100) + status = models.CharField(max_length=10, choices=STATUS_CHOICES, default="Pending") + contract_sent = models.BooleanField(default=False) + payment_received = models.BooleanField(default=False) + + def __str__(self): + return f"{self.company_name} - {self.status}" + +class SponsorshipAsset(models.Model): + sponsorship_application = models.ForeignKey(SponsorshipApplication, on_delete=models.CASCADE) + asset_file = models.FileField(upload_to="sponsorship_assets/") + uploaded_at = models.DateTimeField(auto_now_add=True) + + def __str__(self): + return f"Asset for {self.sponsorship_application.company_name}" diff --git a/sponsorship/urls.py b/sponsorship/urls.py new file mode 100644 index 00000000..e69de29b diff --git a/sponsorship/views.py b/sponsorship/views.py index f01a8c86..89e7f247 100644 --- a/sponsorship/views.py +++ b/sponsorship/views.py @@ -2,8 +2,9 @@ from django.http import JsonResponse from django.views.decorators.csrf import csrf_exempt from django.contrib.auth.decorators import login_required -from .models import SponsorshipTier -from .forms import SponsorshipTierForm +from .models import SponsorshipTier, SponsorshipApplication, SponsorshipAsset +from .forms import SponsorshipTierForm, SponsorshipStatusForm, SponsorshipAssetForm + """from the above this is a sample code i am contributing of starting the sponsorship portal below, we would have to import the form and models which i havent @@ -29,4 +30,33 @@ def create_sponsorship_tier(request): def list_sponsorship_tiers(request): """ List all sponsorship tiers available. """ tiers = SponsorshipTier.objects.all() - return render(request, "sponsorship/list_tiers.html", {"tiers": tiers}) \ No newline at end of file + return render(request, "sponsorship/list_tiers.html", {"tiers": tiers}) + +#addition of more functionalities via sponsorship review code +@login_required +def review_sponsorship_applications(request): + """ Allow sponsorship team to review applications. """ + applications = SponsorshipApplication.objects.all() + return render(request, "sponsorship/review_applications.html", {"applications": applications}) + +#code for sponsorship progress functionality +@login_required +def sponsorship_progress_overview(request): + """ Display an overview of sponsorship progress. """ + applications = SponsorshipApplication.objects.all() + total_applications = applications.count() + approved = applications.filter(status="Approved").count() + pending = applications.filter(status="Pending").count() + rejected = applications.filter(status="Rejected").count() + contracts_sent = applications.filter(contract_sent=True).count() + paid_sponsorships = applications.filter(payment_received=True).count() + + context = { + "total_applications": total_applications, + "approved": approved, + "pending": pending, + "rejected": rejected, + "contracts_sent": contracts_sent, + "paid_sponsorships": paid_sponsorships, + } + return render(request, "sponsorship/progress_overview.html", context) From eefe5ff50cd191d918a29ffb2c828b0085438436 Mon Sep 17 00:00:00 2001 From: unknown Date: Tue, 1 Apr 2025 12:58:00 -0400 Subject: [PATCH 3/7] Added more functionality to sponsorship portal --- portal/__pycache__/__init__.cpython-311.pyc | Bin 0 -> 178 bytes portal/__pycache__/settings.cpython-311.pyc | Bin 0 -> 6861 bytes sponsorship/__init__.py | 0 sponsorship/admin.py | 3 +++ sponsorship/apps.py | 6 ++++++ sponsorship/migrations/__init__.py | 0 sponsorship/tests.py | 3 +++ 7 files changed, 12 insertions(+) create mode 100644 portal/__pycache__/__init__.cpython-311.pyc create mode 100644 portal/__pycache__/settings.cpython-311.pyc create mode 100644 sponsorship/__init__.py create mode 100644 sponsorship/admin.py create mode 100644 sponsorship/apps.py create mode 100644 sponsorship/migrations/__init__.py create mode 100644 sponsorship/tests.py diff --git a/portal/__pycache__/__init__.cpython-311.pyc b/portal/__pycache__/__init__.cpython-311.pyc new file mode 100644 index 0000000000000000000000000000000000000000..23bbc669856ad4be43d29474c6ed365638420cfd GIT binary patch literal 178 zcmZ3^%ge<81OZHM(n0iN5CH>>P{wCAAY(d13PUi1CZpdu*uC&Da}c>D`Ewj3bMDDA4q&)W@KdizyKqPn1NydbA&9` literal 0 HcmV?d00001 diff --git a/portal/__pycache__/settings.cpython-311.pyc b/portal/__pycache__/settings.cpython-311.pyc new file mode 100644 index 0000000000000000000000000000000000000000..970f03643dcc9aec38b4749b669c4161c415184c GIT binary patch literal 6861 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 Date: Tue, 1 Apr 2025 13:26:17 -0400 Subject: [PATCH 4/7] create various team dashboard --- dashboard/__init__.py | 0 dashboard/admin.py | 3 ++ dashboard/apps.py | 6 +++ dashboard/migrations/__init__.py | 0 dashboard/models.py | 18 +++++++ dashboard/tests.py | 3 ++ dashboard/urls.py | 8 +++ dashboard/views.py | 54 ++++++++++++++++++++ portal/__pycache__/settings.cpython-311.pyc | Bin 6861 -> 6874 bytes portal/settings.py | 1 + 10 files changed, 93 insertions(+) create mode 100644 dashboard/__init__.py create mode 100644 dashboard/admin.py create mode 100644 dashboard/apps.py create mode 100644 dashboard/migrations/__init__.py create mode 100644 dashboard/models.py create mode 100644 dashboard/tests.py create mode 100644 dashboard/urls.py create mode 100644 dashboard/views.py diff --git a/dashboard/__init__.py b/dashboard/__init__.py new file mode 100644 index 00000000..e69de29b diff --git a/dashboard/admin.py b/dashboard/admin.py new file mode 100644 index 00000000..8c38f3f3 --- /dev/null +++ b/dashboard/admin.py @@ -0,0 +1,3 @@ +from django.contrib import admin + +# Register your models here. diff --git a/dashboard/apps.py b/dashboard/apps.py new file mode 100644 index 00000000..7b1cc053 --- /dev/null +++ b/dashboard/apps.py @@ -0,0 +1,6 @@ +from django.apps import AppConfig + + +class DashboardConfig(AppConfig): + default_auto_field = 'django.db.models.BigAutoField' + name = 'dashboard' diff --git a/dashboard/migrations/__init__.py b/dashboard/migrations/__init__.py new file mode 100644 index 00000000..e69de29b diff --git a/dashboard/models.py b/dashboard/models.py new file mode 100644 index 00000000..8309b4b3 --- /dev/null +++ b/dashboard/models.py @@ -0,0 +1,18 @@ +from django.db import models + +#code models for various dashboard implementations + +class SponsorshipApplication(models.Model): + STATUS_CHOICES = [("Pending", "Pending"), ("Approved", "Approved"), ("Rejected", "Rejected")] + company_name = models.CharField(max_length=255) + status = models.CharField(max_length=10, choices=STATUS_CHOICES, default="Pending") + +class VolunteerTask(models.Model): + STATUS_CHOICES = [("Pending", "Pending"), ("Completed", "Completed")] + title = models.CharField(max_length=255) + status = models.CharField(max_length=10, choices=STATUS_CHOICES, default="Pending") + +class StaffTask(models.Model): + STATUS_CHOICES = [("Pending", "Pending"), ("Completed", "Completed")] + title = models.CharField(max_length=255) + status = models.CharField(max_length=10, choices=STATUS_CHOICES, default="Pending") diff --git a/dashboard/tests.py b/dashboard/tests.py new file mode 100644 index 00000000..7ce503c2 --- /dev/null +++ b/dashboard/tests.py @@ -0,0 +1,3 @@ +from django.test import TestCase + +# Create your tests here. diff --git a/dashboard/urls.py b/dashboard/urls.py new file mode 100644 index 00000000..8946373d --- /dev/null +++ b/dashboard/urls.py @@ -0,0 +1,8 @@ +from django.urls import path +from .views import staffteam_dashboard, sponsorship_dashboard, volunteer_dashboard, staff_dashboard + +urlpatterns = [ + path("dashboard/", staffteam_dashboard, name="team_dashboard"), + path("dashboard/sponsorship/", sponsorship_dashboard, name="sponsorship_dashboard"), + path("dashboard/volunteer/", volunteer_dashboard, name="volunteer_dashboard"), +] \ No newline at end of file diff --git a/dashboard/views.py b/dashboard/views.py new file mode 100644 index 00000000..a972a8db --- /dev/null +++ b/dashboard/views.py @@ -0,0 +1,54 @@ +from django.shortcuts import render, redirect +from django.contrib.auth.decorators import login_required +from django.contrib.auth.models import Group +from .models import SponsorshipApplication, VolunteerTask + +#views functionality +#sample code for functionalities of various dashboards for various teams +@login_required +def staffteam_dashboard(request): + """ Redirect users to their respective team dashboards based on group membership. """ + if request.user.groups.filter(name="Sponsorship Team").exists(): + return redirect("sponsorship_dashboard") + elif request.user.groups.filter(name="Volunteer Team").exists(): + return redirect("volunteer_dashboard") + elif request.user.groups.filter(name="Staff Team").exists(): + return redirect("staff_dashboard") + else: + return render(request, "dashboard/no_access.html") + +@login_required +def sponsorship_dashboard(request): + """ Dashboard for Sponsorship Team. """ + if not request.user.groups.filter(name="Sponsorship Team").exists(): + return render(request, "dashboard/no_access.html") + + total_applications = SponsorshipApplication.objects.count() + approved = SponsorshipApplication.objects.filter(status="Approved").count() + pending = SponsorshipApplication.objects.filter(status="Pending").count() + rejected = SponsorshipApplication.objects.filter(status="Rejected").count() + + context = { + "total_applications": total_applications, + "approved": approved, + "pending": pending, + "rejected": rejected, + } + return render(request, "dashboard/sponsorship_dashboard.html", context) + +@login_required +def volunteer_dashboard(request): + """ Dashboard for Volunteer Management Team. """ + if not request.user.groups.filter(name="Volunteer Team").exists(): + return render(request, "dashboard/no_access.html") + + total_tasks = VolunteerTask.objects.count() + completed_tasks = VolunteerTask.objects.filter(status="Completed").count() + pending_tasks = VolunteerTask.objects.filter(status="Pending").count() + + context = { + "total_tasks": total_tasks, + "completed_tasks": completed_tasks, + "pending_tasks": pending_tasks, + } + return render(request, "dashboard/volunteer_dashboard.html", context) diff --git a/portal/__pycache__/settings.cpython-311.pyc b/portal/__pycache__/settings.cpython-311.pyc index 970f03643dcc9aec38b4749b669c4161c415184c..4b45cfc4649503f566d164e87c7babc7a6c7fa71 100644 GIT binary patch delta 104 zcmX?Wddrk|IWI340}yzNy-8oak@q(nBj03B_CLJ0xQh$&^NRC}iZe0`HnVbEXJQoG ze3#3Dkxd1ty2@knLSB*0`aE|z8Jj2bik%bW7h?Lr03#asJ}7N|BX*aWr4gtY0IDA! A9{>OV delta 90 zcmca*de)S8IWI340}uo-y-A3T%GGWx>d%43w|(n5@Vy myxE%P9w%edWGS(8f_y?u9~fXn1K$UQ%|FHNGP5)Q6$1c_Nf`0~ diff --git a/portal/settings.py b/portal/settings.py index f5b6ef51..265cd4ed 100644 --- a/portal/settings.py +++ b/portal/settings.py @@ -49,6 +49,7 @@ "volunteer", "portal_account", "sponsorship", + "dashboard", ] MIDDLEWARE = [ From 53283959530594954626ddda73cfa5c4a513556c Mon Sep 17 00:00:00 2001 From: unknown Date: Thu, 3 Apr 2025 09:33:09 -0400 Subject: [PATCH 5/7] removed pycache folder --- .gitignore | 1 + portal/__pycache__/__init__.cpython-311.pyc | Bin 178 -> 0 bytes portal/__pycache__/settings.cpython-311.pyc | Bin 6874 -> 0 bytes 3 files changed, 1 insertion(+) delete mode 100644 portal/__pycache__/__init__.cpython-311.pyc delete mode 100644 portal/__pycache__/settings.cpython-311.pyc diff --git a/.gitignore b/.gitignore index 055125d7..463671f2 100644 --- a/.gitignore +++ b/.gitignore @@ -10,3 +10,4 @@ env .coverage .state staticroot +__pycache__/ \ No newline at end of file diff --git a/portal/__pycache__/__init__.cpython-311.pyc b/portal/__pycache__/__init__.cpython-311.pyc deleted file mode 100644 index 23bbc669856ad4be43d29474c6ed365638420cfd..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 178 zcmZ3^%ge<81OZHM(n0iN5CH>>P{wCAAY(d13PUi1CZpdu*uC&Da}c>D`Ewj3bMDDA4q&)W@KdizyKqPn1NydbA&9` diff --git a/portal/__pycache__/settings.cpython-311.pyc b/portal/__pycache__/settings.cpython-311.pyc deleted file mode 100644 index 4b45cfc4649503f566d164e87c7babc7a6c7fa71..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 6874 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 From e0bd24a7bddb53506367d9fc6b84be928d16fb90 Mon Sep 17 00:00:00 2001 From: unknown Date: Fri, 4 Apr 2025 06:42:08 -0400 Subject: [PATCH 6/7] Fixed: accessing allowed hosts locally, migrations made for dashboard app,removed __pycache__ folder --- .gitignore | 2 +- dashboard/admin.py | 5 ++++ dashboard/migrations/0001_initial.py | 38 ++++++++++++++++++++++++++++ dashboard/urls.py | 5 +++- portal/migrations/0001_initial.py | 35 +++++-------------------- portal/models.py | 6 +++++ portal/settings.py | 21 ++++++++++----- portal/urls.py | 2 ++ 8 files changed, 78 insertions(+), 36 deletions(-) create mode 100644 dashboard/migrations/0001_initial.py diff --git a/.gitignore b/.gitignore index 463671f2..511125b5 100644 --- a/.gitignore +++ b/.gitignore @@ -10,4 +10,4 @@ env .coverage .state staticroot -__pycache__/ \ No newline at end of file +__pycache__/ diff --git a/dashboard/admin.py b/dashboard/admin.py index 8c38f3f3..cb1085a0 100644 --- a/dashboard/admin.py +++ b/dashboard/admin.py @@ -1,3 +1,8 @@ from django.contrib import admin +from .models import SponsorshipApplication, VolunteerTask, StaffTask # Register your models here. +admin.site.register(SponsorshipApplication) +admin.site.register(VolunteerTask) +admin.site.register(StaffTask) + diff --git a/dashboard/migrations/0001_initial.py b/dashboard/migrations/0001_initial.py new file mode 100644 index 00000000..6789127d --- /dev/null +++ b/dashboard/migrations/0001_initial.py @@ -0,0 +1,38 @@ +# Generated by Django 5.1.7 on 2025-04-03 15:14 + +from django.db import migrations, models + + +class Migration(migrations.Migration): + + initial = True + + dependencies = [ + ] + + operations = [ + migrations.CreateModel( + name='SponsorshipApplication', + fields=[ + ('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), + ('company_name', models.CharField(max_length=255)), + ('status', models.CharField(choices=[('Pending', 'Pending'), ('Approved', 'Approved'), ('Rejected', 'Rejected')], default='Pending', max_length=10)), + ], + ), + migrations.CreateModel( + name='StaffTask', + fields=[ + ('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), + ('title', models.CharField(max_length=255)), + ('status', models.CharField(choices=[('Pending', 'Pending'), ('Completed', 'Completed')], default='Pending', max_length=10)), + ], + ), + migrations.CreateModel( + name='VolunteerTask', + fields=[ + ('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), + ('title', models.CharField(max_length=255)), + ('status', models.CharField(choices=[('Pending', 'Pending'), ('Completed', 'Completed')], default='Pending', max_length=10)), + ], + ), + ] diff --git a/dashboard/urls.py b/dashboard/urls.py index 8946373d..4e4ac91b 100644 --- a/dashboard/urls.py +++ b/dashboard/urls.py @@ -1,5 +1,8 @@ from django.urls import path -from .views import staffteam_dashboard, sponsorship_dashboard, volunteer_dashboard, staff_dashboard +from .views import staffteam_dashboard, sponsorship_dashboard, volunteer_dashboard + + +app_name = "dashboard" urlpatterns = [ path("dashboard/", staffteam_dashboard, name="team_dashboard"), diff --git a/portal/migrations/0001_initial.py b/portal/migrations/0001_initial.py index c5173324..3d889f0b 100644 --- a/portal/migrations/0001_initial.py +++ b/portal/migrations/0001_initial.py @@ -1,4 +1,4 @@ -# Generated by Django 5.1.7 on 2025-03-18 22:57 +# Generated by Django 5.1.7 on 2025-04-03 15:14 import django.utils.timezone from django.db import migrations, models @@ -8,37 +8,16 @@ class Migration(migrations.Migration): initial = True - dependencies = [] + dependencies = [ + ] operations = [ migrations.CreateModel( - name="BaseModel", + name='BaseModel', fields=[ - ( - "id", - models.BigAutoField( - auto_created=True, - primary_key=True, - serialize=False, - verbose_name="ID", - ), - ), - ( - "creation_date", - models.DateTimeField( - default=django.utils.timezone.now, - editable=False, - verbose_name="creation_date", - ), - ), - ( - "modified_date", - models.DateTimeField( - default=django.utils.timezone.now, - editable=False, - verbose_name="modified_date", - ), - ), + ('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), + ('creation_date', models.DateTimeField(default=django.utils.timezone.now, editable=False, verbose_name='creation_date')), + ('modified_date', models.DateTimeField(default=django.utils.timezone.now, editable=False, verbose_name='modified_date')), ], ), ] diff --git a/portal/models.py b/portal/models.py index 9ea19d37..d07c2ff7 100644 --- a/portal/models.py +++ b/portal/models.py @@ -6,6 +6,12 @@ class ChoiceArrayField(ArrayField): + def __init__(self, *args, **kwargs): + # Set default to empty list if it's not provided + if 'default' not in kwargs: + kwargs['default'] = [] + super().__init__(*args, **kwargs) + def formfield(self, **kwargs): defaults = { "form_class": forms.TypedMultipleChoiceField, diff --git a/portal/settings.py b/portal/settings.py index 265cd4ed..7b317baf 100644 --- a/portal/settings.py +++ b/portal/settings.py @@ -11,12 +11,20 @@ """ import os +import environ + +env = environ.Env() +environ.Env.read_env() + +ALLOWED_HOSTS = env.list("DJANGO_ALLOWED_HOSTS", default=["localhost"]) from pathlib import Path import dj_database_url # Build paths inside the project like this: BASE_DIR / 'subdir'. -BASE_DIR = Path(__file__).resolve().parent.parent +BASE_DIR = os.path.dirname(os.path.dirname(os.path.abspath(__file__))) + + # Quick-start development settings - unsuitable for production @@ -28,9 +36,8 @@ # SECURITY WARNING: don't run with debug turned on in production! DEBUG = bool(os.environ.get("DEBUG", default=0)) -ALLOWED_HOSTS = os.environ.get("DJANGO_ALLOWED_HOSTS") -if ALLOWED_HOSTS: - ALLOWED_HOSTS = ALLOWED_HOSTS.split(",") +# Ensure ALLOWED_HOSTS is a list +ALLOWED_HOSTS = os.environ.get("DJANGO_ALLOWED_HOSTS", "").split(",") # Application definition @@ -142,8 +149,10 @@ # Static files (CSS, JavaScript, Images) # https://docs.djangoproject.com/en/5.1/howto/static-files/ -STATIC_URL = "static/" -STATIC_ROOT = BASE_DIR / "staticroot" +STATIC_URL = "/static/" +STATIC_ROOT = os.path.join(BASE_DIR, "staticroot") +if not os.path.exists(STATIC_ROOT): + os.makedirs(STATIC_ROOT) STATICFILES_STORAGE = "whitenoise.storage.CompressedManifestStaticFilesStorage" # Default primary key field type diff --git a/portal/urls.py b/portal/urls.py index d4d5b017..ec831f0a 100644 --- a/portal/urls.py +++ b/portal/urls.py @@ -26,4 +26,6 @@ path("admin/", admin.site.urls), path("accounts/", include("allauth.urls")), path("portal_account/", include("portal_account.urls", namespace="portal_account")), + path("dashboard/", include("dashboard.urls", namespace="dashboard")), + path("sponsorship/", include("sponsorship.urls", namespace="sponsorship")), ] From 23b72a0aadf23791f110bdb222d9380509f80e81 Mon Sep 17 00:00:00 2001 From: unknown Date: Fri, 4 Apr 2025 07:04:25 -0400 Subject: [PATCH 7/7] migrations made --- portal_account/migrations/0001_initial.py | 32 ++++++----------------- 1 file changed, 8 insertions(+), 24 deletions(-) diff --git a/portal_account/migrations/0001_initial.py b/portal_account/migrations/0001_initial.py index c887c4d5..e490e209 100644 --- a/portal_account/migrations/0001_initial.py +++ b/portal_account/migrations/0001_initial.py @@ -1,4 +1,4 @@ -# Generated by Django 5.1.7 on 2025-03-23 21:45 +# Generated by Django 5.1.7 on 2025-04-03 15:14 import django.db.models.deletion from django.conf import settings @@ -10,35 +10,19 @@ class Migration(migrations.Migration): initial = True dependencies = [ - ("portal", "0001_initial"), + ('portal', '0001_initial'), migrations.swappable_dependency(settings.AUTH_USER_MODEL), ] operations = [ migrations.CreateModel( - name="PortalProfile", + name='PortalProfile', fields=[ - ( - "basemodel_ptr", - models.OneToOneField( - auto_created=True, - on_delete=django.db.models.deletion.CASCADE, - parent_link=True, - primary_key=True, - serialize=False, - to="portal.basemodel", - ), - ), - ("pronouns", models.CharField(blank=True, max_length=100, null=True)), - ("coc_agreement", models.BooleanField(default=False)), - ( - "user", - models.OneToOneField( - on_delete=django.db.models.deletion.CASCADE, - to=settings.AUTH_USER_MODEL, - ), - ), + ('basemodel_ptr', models.OneToOneField(auto_created=True, on_delete=django.db.models.deletion.CASCADE, parent_link=True, primary_key=True, serialize=False, to='portal.basemodel')), + ('pronouns', models.CharField(blank=True, max_length=100, null=True)), + ('coc_agreement', models.BooleanField(default=False)), + ('user', models.OneToOneField(on_delete=django.db.models.deletion.CASCADE, to=settings.AUTH_USER_MODEL)), ], - bases=("portal.basemodel",), + bases=('portal.basemodel',), ), ]