From 2db4593dc929a5b74f1a54e70024427906fddb2d Mon Sep 17 00:00:00 2001 From: Dominic DiTaranto Date: Sat, 13 Jun 2026 15:04:32 -0400 Subject: [PATCH] init commit --- README.md | 54 ++++++ api/__init__.py | 0 api/__pycache__/__init__.cpython-314.pyc | Bin 0 -> 143 bytes api/__pycache__/admin.cpython-314.pyc | Bin 0 -> 187 bytes api/__pycache__/apps.cpython-314.pyc | Bin 0 -> 437 bytes api/__pycache__/models.cpython-314.pyc | Bin 0 -> 184 bytes api/admin.py | 3 + api/apps.py | 5 + api/migrations/__init__.py | 0 .../__pycache__/__init__.cpython-314.pyc | Bin 0 -> 154 bytes api/models.py | 3 + api/tests.py | 3 + api/views.py | 3 + db.sqlite3 | Bin 0 -> 172032 bytes localist/__init__.py | 0 localist/__pycache__/__init__.cpython-314.pyc | Bin 0 -> 148 bytes localist/__pycache__/settings.cpython-314.pyc | Bin 0 -> 2449 bytes localist/__pycache__/urls.cpython-314.pyc | Bin 0 -> 1011 bytes localist/__pycache__/wsgi.cpython-314.pyc | Bin 0 -> 633 bytes localist/asgi.py | 16 ++ localist/settings.py | 119 ++++++++++++ localist/urls.py | 23 +++ localist/wsgi.py | 16 ++ web/__init__.py | 0 web/__pycache__/__init__.cpython-314.pyc | Bin 0 -> 143 bytes web/__pycache__/admin.cpython-314.pyc | Bin 0 -> 962 bytes web/__pycache__/apps.cpython-314.pyc | Bin 0 -> 437 bytes web/admin.py | 12 ++ web/apps.py | 5 + web/migrations/0001_initial.py | 169 ++++++++++++++++++ web/migrations/__init__.py | 0 .../__pycache__/0001_initial.cpython-314.pyc | Bin 0 -> 4684 bytes .../__pycache__/__init__.cpython-314.pyc | Bin 0 -> 154 bytes web/models/__pycache__/base.cpython-314.pyc | Bin 0 -> 958 bytes .../__pycache__/category.cpython-314.pyc | Bin 0 -> 1152 bytes web/models/__pycache__/event.cpython-314.pyc | Bin 0 -> 2400 bytes .../event_category.cpython-314.pyc | Bin 0 -> 1369 bytes .../__pycache__/event_tag.cpython-314.pyc | Bin 0 -> 1328 bytes web/models/__pycache__/tag.cpython-314.pyc | Bin 0 -> 1050 bytes web/models/base.py | 10 ++ web/models/category.py | 23 +++ web/models/event.py | 58 ++++++ web/models/event_category.py | 25 +++ web/models/event_tag.py | 25 +++ web/models/tag.py | 20 +++ web/tests.py | 3 + web/views.py | 3 + 47 files changed, 598 insertions(+) create mode 100644 README.md create mode 100644 api/__init__.py create mode 100644 api/__pycache__/__init__.cpython-314.pyc create mode 100644 api/__pycache__/admin.cpython-314.pyc create mode 100644 api/__pycache__/apps.cpython-314.pyc create mode 100644 api/__pycache__/models.cpython-314.pyc create mode 100644 api/admin.py create mode 100644 api/apps.py create mode 100644 api/migrations/__init__.py create mode 100644 api/migrations/__pycache__/__init__.cpython-314.pyc create mode 100644 api/models.py create mode 100644 api/tests.py create mode 100644 api/views.py create mode 100644 db.sqlite3 create mode 100644 localist/__init__.py create mode 100644 localist/__pycache__/__init__.cpython-314.pyc create mode 100644 localist/__pycache__/settings.cpython-314.pyc create mode 100644 localist/__pycache__/urls.cpython-314.pyc create mode 100644 localist/__pycache__/wsgi.cpython-314.pyc create mode 100644 localist/asgi.py create mode 100644 localist/settings.py create mode 100644 localist/urls.py create mode 100644 localist/wsgi.py create mode 100644 web/__init__.py create mode 100644 web/__pycache__/__init__.cpython-314.pyc create mode 100644 web/__pycache__/admin.cpython-314.pyc create mode 100644 web/__pycache__/apps.cpython-314.pyc create mode 100644 web/admin.py create mode 100644 web/apps.py create mode 100644 web/migrations/0001_initial.py create mode 100644 web/migrations/__init__.py create mode 100644 web/migrations/__pycache__/0001_initial.cpython-314.pyc create mode 100644 web/migrations/__pycache__/__init__.cpython-314.pyc create mode 100644 web/models/__pycache__/base.cpython-314.pyc create mode 100644 web/models/__pycache__/category.cpython-314.pyc create mode 100644 web/models/__pycache__/event.cpython-314.pyc create mode 100644 web/models/__pycache__/event_category.cpython-314.pyc create mode 100644 web/models/__pycache__/event_tag.cpython-314.pyc create mode 100644 web/models/__pycache__/tag.cpython-314.pyc create mode 100644 web/models/base.py create mode 100644 web/models/category.py create mode 100644 web/models/event.py create mode 100644 web/models/event_category.py create mode 100644 web/models/event_tag.py create mode 100644 web/models/tag.py create mode 100644 web/tests.py create mode 100644 web/views.py diff --git a/README.md b/README.md new file mode 100644 index 0000000..a2bc589 --- /dev/null +++ b/README.md @@ -0,0 +1,54 @@ +# Summary + +# Detailed Design + +## Functionality + +### User Creates an Event + +- Fills out form +- form includes: + - Event Address + - Event Name + - Event Description + - Event Start Time + - Event End Time + - Rain Date + - Price + + - Images + - Category + - Tagging (optional) + - RSVP Needed (optio nal) + - Contact Info (optional) + - Share Email (optional) + - Event Size (how many people will go) (optional) + - Event Size Maximum (optional) +- After filling out form: + - Direct to event page + - Event page allows editing, cancelling + - share on all platforms + +### User Searches for an event +- Types in location, or read location +- Provides radius (default provided) +- Events populate +- events are clickable and show more Info +- ability to say they are going to an event (require login) +- email event to me, or others +- share on all platforms +- user can add event to list of events associated to their account +- users can filter events by category, tag, date +- users can comment on events, and post pictures of events that they went to (require login) + +## User Flow + +## Web Pages + +## DB Structure + +## API Endpoints + +## Authentication + +# Dependencies diff --git a/api/__init__.py b/api/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/api/__pycache__/__init__.cpython-314.pyc b/api/__pycache__/__init__.cpython-314.pyc new file mode 100644 index 0000000000000000000000000000000000000000..6a86f8df6ab57a14e54d440bd5a2841ecf4be5f3 GIT binary patch literal 143 zcmdPq>P{wCAAftgHh(Vb_lhJP_LlF~@{~08COGiH=KQ~oB zB|kSaFEd%cD77HJSU)E}IWZ@*xI{m(AX7g+9w<{1AFo$Xd5gm)H$SB`C)KWq6{s0x Rd@+deiJ6g+v4|PS0s!b`AE*ET literal 0 HcmV?d00001 diff --git a/api/__pycache__/admin.cpython-314.pyc b/api/__pycache__/admin.cpython-314.pyc new file mode 100644 index 0000000000000000000000000000000000000000..2ce9faa5b79a285812aa02860534c6c52c15dca6 GIT binary patch literal 187 zcmdPqnoPI&QnC{B()0C_^YcoIGLwp!feKbKdB0 literal 0 HcmV?d00001 diff --git a/api/__pycache__/apps.cpython-314.pyc b/api/__pycache__/apps.cpython-314.pyc new file mode 100644 index 0000000000000000000000000000000000000000..4d7e4ba08a17d86db601e3aac309a46a5916512d GIT binary patch literal 437 zcmXv~Jxc>Y5S_id#C&LCz#!O2u*o6j8cPvG3vB{!pA6^a5;xr4p1YgEE`?az`wRR> zvS?*xC!AQjn@a|E<~`=kV|I>PI}I@L@p>}9HTBDqO;pyP=o_$vF;H>?*F=#+=t2*u zvk%lAkyE$SDTjJT;8(sa^@*-u0bQe*o zP_YO@r3AZMs8}M3Ewe{qm(u; z0BIeb;k~*0bR}Aw&d_&tb21OJ86Vg&Vb4?!T74;O8>DMz>P{wCAAftgHh(Vb_lhJP_LlF~@{~08C%UnMrKQ~oB zB|kSaFEd%cD77HJSU)E}IWZ@*xI{m(AX7g#GrcIWBr`v+SU)}WCW#UREfW=2NFB4!{90Jl;k9{>OV literal 0 HcmV?d00001 diff --git a/api/models.py b/api/models.py new file mode 100644 index 0000000..71a8362 --- /dev/null +++ b/api/models.py @@ -0,0 +1,3 @@ +from django.db import models + +# Create your models here. diff --git a/api/tests.py b/api/tests.py new file mode 100644 index 0000000..7ce503c --- /dev/null +++ b/api/tests.py @@ -0,0 +1,3 @@ +from django.test import TestCase + +# Create your tests here. diff --git a/api/views.py b/api/views.py new file mode 100644 index 0000000..91ea44a --- /dev/null +++ b/api/views.py @@ -0,0 +1,3 @@ +from django.shortcuts import render + +# Create your views here. diff --git a/db.sqlite3 b/db.sqlite3 new file mode 100644 index 0000000000000000000000000000000000000000..7564bc844b31328feac81d5367ba89f745d20214 GIT binary patch literal 172032 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 UAOHd&00JNY0w4eaAOHgY2Nqg7L;wH) literal 0 HcmV?d00001 diff --git a/localist/__init__.py b/localist/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/localist/__pycache__/__init__.cpython-314.pyc b/localist/__pycache__/__init__.cpython-314.pyc new file mode 100644 index 0000000000000000000000000000000000000000..3921022de2f43d9132f1fdcf2e3008a5678728ed GIT binary patch literal 148 zcmdPq>P{wCAAftgHh(Vb_lhJP_LlF~@{~08C%TPZfKQ~oB zB|kSaFEd%cD77HJSU)E}IWZ@*xCFt7j|WPZ#K-FuRNmsS$<0qG%}KQ@Vg;H2vZENp O_{7Y}$XLV-WB~xO=pnxV literal 0 HcmV?d00001 diff --git a/localist/__pycache__/settings.cpython-314.pyc b/localist/__pycache__/settings.cpython-314.pyc new file mode 100644 index 0000000000000000000000000000000000000000..450972d6c04af62eb3a6a099f61dfc75947b1512 GIT binary patch literal 2449 zcmb7G+i%lW7`JnEu1(Vd<)UF!21-lqbyR>R#BdY0jYyO1IHemBSZ;EXxcG*BLa3jj zz3zp_{R4a0e^azgRDPShIt5Zm`btG#4Tnbb-vGizEy7=iq-HT_P9I!XlNs zrmR4a@xs1hv`p5)gs4W#VVkDSYGz&0REMyZZSLbb;o|X4Y+zd3#U>-k+ib@H7%!XIg?U{TfZ9dH20+k{xo zH$2}k>kc=xG4`Nt>O3}h0OW~jsda}Rd(02vNgK1xj;65#$Ia#>BE@KcA*|Z$Yenl| z=l|HUadXO0j`l)Tg|yxEQ36!M!S#-fS1kN;mEbmRwe}yl?rTyvh_$xTS#;zV2lbn` zl*f0Q_q*zH=gSAV*3#E+u-mPy`#7=k}EPOKdd8 zDdC36t&P}@7b+By1f1@h~>>3je47pbu13TP~gKdHMG97{?RaZ5|R>{HBp@eC>k3JV^TQyX@qnEJJBJGL( zx1Xz@H+9`Ksv{pK0FOTxpxn{1t=7*Xgt4*GalGJ8E$>F5Lx@`E%Q?oKKaK3SkUMvp z3aN9io+1v4X%KQ?VaL66is?Xkp{dR?bYLhg&=?nUT%Ms*e)EBwUA*T76-&)U-IWot zt~MGP?kYCs2A3Qv#7X{bht2j0&t3Z$N4P0{Y3SUPR_?43=y0e7H!R72h&pzY%fs?i z#oZ~<`=@*v+`uV61V}43pcI39IHha!TvoIYB@(z1)X>g(1j&zhNsn zu2}xGb0&JZpu05EJZbT>jmp{h6$~rlE}s|FIr4t6?%h+uCxM)!Fy`ehdQn-1nJdd) z)PnJ*se5(+zAzpm%l`fF={9yu?KSoy7F-B}c+9#WiT=3p;*yw0VoiP`{@{fR;`+{} zml8^)%C1W5epV@q9|21~|88&?So=YmrauJYbm*@IioX0ILM1bAnV%lL zPuzHyxba(J@qJ?HU1I5dV)b2Owa4_+R2tE}ct1kLQoZnTCfiGWjK{KpUi#xjCLI9I zJe9fLOZFKmmOY#+95Ly)fg>jS7Iw2oN%kWZT1@wYk@1_Z+c!7Eg3<}mZD9}Ivp*nmTI`taTK0SylqQr7~9 k)I$FjHM`JD9VcgdvE#%{k2!`ABK;(lzVu_(^b literal 0 HcmV?d00001 diff --git a/localist/__pycache__/urls.cpython-314.pyc b/localist/__pycache__/urls.cpython-314.pyc new file mode 100644 index 0000000000000000000000000000000000000000..55b5c5520fb96fe5aba74d48e8053f218ef5017e GIT binary patch literal 1011 zcmb7C!EVz)5M4V?TO8V6IUsdQ4~|9R1q2){phAc$kr1jPIJWM_-XxA}ueG}d$_2!U zBR%!N7w|9KxLM-F545T{A~EaOA|N5bN{MGiGjHC!nd=+tHiGy0V}Jg`MChA#nrGF< z#UU7P(FiGYh(^ZH7?{f3(zZEl4J>7Cp#y6hjamoheudTmEWZ1ffA_U_8+z&I8ESQ8 z?I5>J-$2NIK6-*fo=xIuA*hOZh9_L$goiYVrNX)3a~3Mkwx7)yJ}N|#Q>B>5$3^qmp6Cm~UfvGo^Cr6B6-IdeNL_Q{J=- zc}iGD?s_+f;&~iOqLT@@&S=W+JKAOaQ&iAMcG)UL|gV8VxlOl?39V*L(SKxppt*QIW6*VjZdt_{l!}owW?ZI5#&9>-#liY=1>p&sR|U()%kP a?wtB3{^{eFb6+ZzbFfK0u literal 0 HcmV?d00001 diff --git a/localist/__pycache__/wsgi.cpython-314.pyc b/localist/__pycache__/wsgi.cpython-314.pyc new file mode 100644 index 0000000000000000000000000000000000000000..c7ddf3a0d17bc43d8adfb99d3ff026704600f667 GIT binary patch literal 633 zcmYjPO>fgc5Z$!{sT?%|M0;iVxI_?dDped%RSA(2f*`G&B2M5e_Qcs}y=!^5DeVck zAbtbCfd9gw2qchCAjBP%Kft=FmCj-JjYewV!iwL z{-C!T4tMtV`-9#ve7f6x_GIVyay7ZH!5A(R-KrP$FtqYvSU5@-mlh`c$a?q7zInOa zq7HJ#b0rJU5@Q&%17V8BImu6GUhchUTeB(Hc~UNUM02n^rIqRul%4(Ts94!rtaUqI zwQPGWNO$b>*ToqBbLzM@zk;y$2W|XB&U^2z_Z_W$L2D=L{z>P-H`M*ryz#Yp>s=!+ GFXKP^U$-Uz literal 0 HcmV?d00001 diff --git a/localist/asgi.py b/localist/asgi.py new file mode 100644 index 0000000..17de1a2 --- /dev/null +++ b/localist/asgi.py @@ -0,0 +1,16 @@ +""" +ASGI config for localist project. + +It exposes the ASGI callable as a module-level variable named ``application``. + +For more information on this file, see +https://docs.djangoproject.com/en/6.0/howto/deployment/asgi/ +""" + +import os + +from django.core.asgi import get_asgi_application + +os.environ.setdefault("DJANGO_SETTINGS_MODULE", "localist.settings") + +application = get_asgi_application() diff --git a/localist/settings.py b/localist/settings.py new file mode 100644 index 0000000..bb2a920 --- /dev/null +++ b/localist/settings.py @@ -0,0 +1,119 @@ +""" +Django settings for localist project. + +Generated by 'django-admin startproject' using Django 6.0.6. + +For more information on this file, see +https://docs.djangoproject.com/en/6.0/topics/settings/ + +For the full list of settings and their values, see +https://docs.djangoproject.com/en/6.0/ref/settings/ +""" + +from pathlib import Path + +# Build paths inside the project like this: BASE_DIR / 'subdir'. +BASE_DIR = Path(__file__).resolve().parent.parent + + +# Quick-start development settings - unsuitable for production +# See https://docs.djangoproject.com/en/6.0/howto/deployment/checklist/ + +# SECURITY WARNING: keep the secret key used in production secret! +SECRET_KEY = "django-insecure-pek1teheggj8zzvtcntp4-u#s_^yc$&a@3f7wi+u%8)g*2xezw" + +# SECURITY WARNING: don't run with debug turned on in production! +DEBUG = True + +ALLOWED_HOSTS = [] + + +# Application definition + +INSTALLED_APPS = [ + "django.contrib.admin", + "django.contrib.auth", + "django.contrib.contenttypes", + "django.contrib.sessions", + "django.contrib.messages", + "django.contrib.staticfiles", + "web", + "api", +] + +MIDDLEWARE = [ + "django.middleware.security.SecurityMiddleware", + "django.contrib.sessions.middleware.SessionMiddleware", + "django.middleware.common.CommonMiddleware", + "django.middleware.csrf.CsrfViewMiddleware", + "django.contrib.auth.middleware.AuthenticationMiddleware", + "django.contrib.messages.middleware.MessageMiddleware", + "django.middleware.clickjacking.XFrameOptionsMiddleware", +] + +ROOT_URLCONF = "localist.urls" + +TEMPLATES = [ + { + "BACKEND": "django.template.backends.django.DjangoTemplates", + "DIRS": [], + "APP_DIRS": True, + "OPTIONS": { + "context_processors": [ + "django.template.context_processors.request", + "django.contrib.auth.context_processors.auth", + "django.contrib.messages.context_processors.messages", + ], + }, + }, +] + +WSGI_APPLICATION = "localist.wsgi.application" + + +# Database +# https://docs.djangoproject.com/en/6.0/ref/settings/#databases + +DATABASES = { + "default": { + "ENGINE": "django.db.backends.sqlite3", + "NAME": BASE_DIR / "db.sqlite3", + } +} + + +# Password validation +# https://docs.djangoproject.com/en/6.0/ref/settings/#auth-password-validators + +AUTH_PASSWORD_VALIDATORS = [ + { + "NAME": "django.contrib.auth.password_validation.UserAttributeSimilarityValidator", + }, + { + "NAME": "django.contrib.auth.password_validation.MinimumLengthValidator", + }, + { + "NAME": "django.contrib.auth.password_validation.CommonPasswordValidator", + }, + { + "NAME": "django.contrib.auth.password_validation.NumericPasswordValidator", + }, +] + + +# Internationalization +# https://docs.djangoproject.com/en/6.0/topics/i18n/ + +LANGUAGE_CODE = "en-us" + +TIME_ZONE = "UTC" + +USE_I18N = True + +USE_TZ = True + + +# Static files (CSS, JavaScript, Images) +# https://docs.djangoproject.com/en/6.0/howto/static-files/ + +STATIC_URL = "static/" diff --git a/localist/urls.py b/localist/urls.py new file mode 100644 index 0000000..6cf30a6 --- /dev/null +++ b/localist/urls.py @@ -0,0 +1,23 @@ +""" +URL configuration for localist project. + +The `urlpatterns` list routes URLs to views. For more information please see: + https://docs.djangoproject.com/en/6.0/topics/http/urls/ +Examples: +Function views + 1. Add an import: from my_app import views + 2. Add a URL to urlpatterns: path('', views.home, name='home') +Class-based views + 1. Add an import: from other_app.views import Home + 2. Add a URL to urlpatterns: path('', Home.as_view(), name='home') +Including another URLconf + 1. Import the include() function: from django.urls import include, path + 2. Add a URL to urlpatterns: path('blog/', include('blog.urls')) +""" + +from django.contrib import admin +from django.urls import path + +urlpatterns = [ + path("admin/", admin.site.urls), +] diff --git a/localist/wsgi.py b/localist/wsgi.py new file mode 100644 index 0000000..36606b4 --- /dev/null +++ b/localist/wsgi.py @@ -0,0 +1,16 @@ +""" +WSGI config for localist project. + +It exposes the WSGI callable as a module-level variable named ``application``. + +For more information on this file, see +https://docs.djangoproject.com/en/6.0/howto/deployment/wsgi/ +""" + +import os + +from django.core.wsgi import get_wsgi_application + +os.environ.setdefault("DJANGO_SETTINGS_MODULE", "localist.settings") + +application = get_wsgi_application() diff --git a/web/__init__.py b/web/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/web/__pycache__/__init__.cpython-314.pyc b/web/__pycache__/__init__.cpython-314.pyc new file mode 100644 index 0000000000000000000000000000000000000000..f290d65149c20eece55cca9508cadf387aa7b43e GIT binary patch literal 143 zcmdPq>P{wCAAftgHh(Vb_lhJP_LlF~@{~08COGiH=KQ~oB zB|kSaFEd%cD77HJSU)E}IWZ@*xJ17^HAz1{9w<{1AFo$Xd5gm)H$SB`C)KWq6{s0x Rd@+deiJ6g+v4|PS0s!jQAFlua literal 0 HcmV?d00001 diff --git a/web/__pycache__/admin.cpython-314.pyc b/web/__pycache__/admin.cpython-314.pyc new file mode 100644 index 0000000000000000000000000000000000000000..8016d6e84b89672d9fc4843b0278c0cdea975b69 GIT binary patch literal 962 zcmbVL&uY{_82_^QyXhvoxPtanX;BQe$wjS*2vUlZgHnpuDCzDHQ+79HGObj4(34k> z`viiI;TtF{DgzS1lQ*F+;Cyk%?Wz}d4w>)wZ}QDBbItc$kmKE(jeWlX@C|_)#+(GeGJJt@+wk+O<&b5NO_nthaJ;+I`k zO45;a6!9?V3ctUfj;liv$CXlkPA{9h)XW(+SdTSDDGqodM7#Y4p?b54cBXqK0pvbS(5Sr9?=v>4K; zU&v$4dl91tMHvl>UOJGrNUj#8c&y>Uv2gCljU5i?UA8Qf@r3yAH z2rIZ>!L16eeg*TD`_lac-4D=xO~%6stbd;4w#T<8aAlr*@P6&a1a8ig{|ax7FMfno Ic0o4q6Z$99AOHXW literal 0 HcmV?d00001 diff --git a/web/__pycache__/apps.cpython-314.pyc b/web/__pycache__/apps.cpython-314.pyc new file mode 100644 index 0000000000000000000000000000000000000000..17ddc495c6eff977f793c69f2d30e1f3d5c6df0a GIT binary patch literal 437 zcmXv~Jxc>Y5S_idXg)MCU=VC1*yIp%jim^pg*E}Vu}X%^^thXGJ>4Oc{w186}T zsIv#u?UNI?@F|CShv1jKE%k}6oagxk&&F&L6^0^{6XFo!-ULP0qLPq~yRk2$6!lVk!3PG6XvYS5& z`7&-72aL`Q#7@tNlBz6QlunXYbm7uBB8Kb)RFAkiR>t2#Xx~d+a-4_ZL-{D zW|vCjlMhADJrcb%Jry|=@X^N{eWWP?B<2zUIps#gLXSn>?2Gi#S3U0C_91?nlYBq0;eAP<;fl6T6k9V5i~1|3igl~(Lfvbs zJ9udanf+a`jW}D_3)mjS+uj0a`*!`?(f%c_4E_knvm4xw4}8WW9(j=u`PaSf^A!OF z0G)UvI=C*JBSUXRhWn61fE;;)&d54{uJID!#s=Y5yOZEw6fo(xV+wvWjKm_3V(VST z-^fn<|BoGX85o>+JA){3flMUdgeh=n@nas1>?P1>F9VRdF~DaA*+u-GfKq#5l0L;Kz?ZZr70F$`@CJUIULEi8E8%_1qa1L+-YZ&%g3gutzih>ALI(?xk zo%!FY(t-~npS@7zSAIc}i;(&JpbFWIZ(n(Rep?(cH#cDJ+Us-ZDw=y$Nl1E!map|& zc23&)3uSWQ7nI4LjZZZD4m0`QYnd$cXR_e4M^MooMJec2mT2f+uSeOT!41X6`zAS} zf~MZ4!re{DOCw6nHsvzG@JyvcRiafCawLC_k7&rkL{oI_F{Y72OiHGOWkac88t%en z#fCP>)nJ%k%8IH|uTj%=8m?7UrqD$M9UFikZ1YgRQns~2Eb%m;;zvqNw_z32JEUT( zOtdO%sc29w$+l9`F%6cxeoG#bbQC<&u&!D(U^-BX`feR!!=|1Z(P;p@AlQPI%(4}` zW!xcr-C7$G%=}7g! zG=R@qrG$wjkZG87o$_NAj72>=%0BhjaJl4!*UR4H$d|ZOIOjy5ArmZM9fJ+QHo*>C z|2V`@jz~r4CU=);*rGv4BN%ubU@&GR?1DhFzTqSfxRhmnh8~==2bRiarOFJcG_=tZ zp#&g9Mj1R%S&g}pG)9B6Q!cVh!?FzhF{A+Gh%A3mQ*@Sa7!AwvBaK+Lt{K=cVIrUz znhjM)BPy-}jo2uI!-RE&bZEmV(|fGdCam|Rkq@-}n^3^FSwYZCo51r9B)}a;J}^xk zD~3A?Z5$}1EAHU0Y*!3^inhAwO*h@{D13`0t1I6&3D)+Fk6=&u)z1`T-=uHi1pFQq9JeER!|x`z3ridcAmHR&Y@@D-d(J zNO0A(in>{bEoa$9$V>6n4~*jC;^LCr<)%##MHvHG&<1wirUTeqF_1mq9h33S<@kF5^7Ecos4wo~{#LSO^H<#{&x!gi~diHEM z$jBT5GSghr1v!Lg@=uqZsn5w7gbe^603uv`>g$nKZnc?PJkSKG0P`lD86xtUo$&a5`X_uH|t`ju9CzL}nXYMrF7H^dw5SeB_> zYUY-ndB0UpavwFstnON zyVmE|)I0F&G?8(VI@?Ulw)1oUkp3>U^2;ys%dPzN7y0Y0{Kkv?#`9=j2BWpk)z@##{bif literal 0 HcmV?d00001 diff --git a/web/migrations/__pycache__/__init__.cpython-314.pyc b/web/migrations/__pycache__/__init__.cpython-314.pyc new file mode 100644 index 0000000000000000000000000000000000000000..f4054890aaea47fca693a96004c42fe864734016 GIT binary patch literal 154 zcmdPq>P{wCAAftgHh(Vb_lhJP_LlF~@{~08C%UnMrKQ~oB zB|kSaFEd%cD77HJSU)E}IWZ@*xJ17^HAz1=GrcIWBr`v+SU)}WCW#UREfW=2NFB4!{90J;$*CIA2c literal 0 HcmV?d00001 diff --git a/web/models/__pycache__/base.cpython-314.pyc b/web/models/__pycache__/base.cpython-314.pyc new file mode 100644 index 0000000000000000000000000000000000000000..5a8c9d70ab698d09dae45c1ebc22174b9abe9ee1 GIT binary patch literal 958 zcmah{y>HV%6u*l<@`2rAr6CbQPy`(!L@c37T`Gnus`yYtWo1oIm-q@UjvdZtDz;2a z3^1`HhO+S|Fe0&4k%~@YVq!xIA1m+dq-`e7y64|}_wN1P$K6`8D+tz?cefAjV1&La zWxk9Vm~H|Xqdnx|`{*7P_!_FA>&PqAk*D?Wu0FqT_Fva>EHqEQfttn-r8coNhq2GX zWN_w*kU3MP?*WWa4+-ocQP|Uk*3);h^v=5@MUAtsura4G|Kq8hdKSU+;$l3dWij;) zXn|UyoE2z5f#!N)W~+EbaltD=Ib~Viq6ynkwRD@BH2NWpo=QDR!%$i@6)}n8LqdJO zsc}^vFM^Pz`3W?l=(ByAhGL-;Gj=q+4DRPTQHC~Rp?d{kcpC8Qa_N-6wZjDMen6e3 zDNBSzbjS#i6+)oXX{fM8$g`A&vy){)_5+@XFo;+b!*PlB6T#^~$QmJupduI$Dg+Pu zsbC2q+=gVPu#t4#C-IQEemo4KVBm5#iW4`C2Q&;4;U2QSn~&G+Lw8!E7gATraSQI2 zVJE5!FVWX({Z)yt0OpsJQ1LrWi!Ui&}FFzDXMdq~_F5oV8WRI2Y_A@zOzhTp`>&3T#%}~7Cs46FFs8D9K%>WT%kSrv7}=A_ rsTb3crOkX`cllMgtX@LW0P$197=J@oewik2yf)ujZ>&EEV8-(g*_6}{ literal 0 HcmV?d00001 diff --git a/web/models/__pycache__/category.cpython-314.pyc b/web/models/__pycache__/category.cpython-314.pyc new file mode 100644 index 0000000000000000000000000000000000000000..e019287c12267e7205428c2f4d32c0cb2b1ab0e3 GIT binary patch literal 1152 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 bE*`c{2uvsS3Uv>MM~&vUM)NO$MV|0~mh9Pa literal 0 HcmV?d00001 diff --git a/web/models/base.py b/web/models/base.py new file mode 100644 index 0000000..2b5a850 --- /dev/null +++ b/web/models/base.py @@ -0,0 +1,10 @@ +from django.db import models + + +class BaseModel(models.Model): + created_at = models.DateTimeField(blank=True, null=True, auto_now_add=True) + updated_at = models.DateTimeField(blank=True, null=True, auto_now=True) + active = models.BooleanField(default=True) + + class Meta: + abstract = True diff --git a/web/models/category.py b/web/models/category.py new file mode 100644 index 0000000..d092fa1 --- /dev/null +++ b/web/models/category.py @@ -0,0 +1,23 @@ +from django.db import models +from django.contrib import admin +from web.models.base import BaseModel + + +class Category(BaseModel): + name = models.CharField() + description = models.TextField() + + class Meta: + db_table = 'category' + + +class CategoryAdmin(admin.ModelAdmin): + search_fields = ( + 'name', + 'description' + ) + + list_display = ( + 'name', + 'description', + ) diff --git a/web/models/event.py b/web/models/event.py new file mode 100644 index 0000000..c702866 --- /dev/null +++ b/web/models/event.py @@ -0,0 +1,58 @@ +from django.db import models +from django.contrib import admin +from web.models.base import BaseModel +from enum import StrEnum + + + +class Event(BaseModel): + class Status(models.TextChoices): + SCHEDULED = 'scheduled', 'Scheduled' + COMPLETED = 'completed', 'Completed' + CANCELED = 'canceled', 'Canceled' + + name = models.CharField() + description = models.TextField() + url = models.URLField() + address = models.CharField() + status = models.CharField(max_length=20, choices=Status.choices, default=Status.SCHEDULED) + price = models.DecimalField(max_digits=10, default=None, blank=True, decimal_places=2) + require_rsvp = models.BooleanField() + + start_time = models.DateTimeField() + end_time = models.DateTimeField() + rain_date = models.DateTimeField() + + email = models.EmailField() + phone_number = models.CharField(default=None, blank=True) + + class Meta: + db_table = 'events' + + +class EventAdmin(admin.ModelAdmin): + search_fields = ( + 'name', + 'description', + 'start_time', + 'end_time', + 'rain_date', + 'url', + 'address', + 'status', + 'price', + 'require_rsvp', + ) + + list_display = ( + 'name', + 'description', + 'start_time', + 'end_time', + 'rain_date', + 'url', + 'address', + 'status', + 'price', + 'require_rsvp', + ) diff --git a/web/models/event_category.py b/web/models/event_category.py new file mode 100644 index 0000000..04c9522 --- /dev/null +++ b/web/models/event_category.py @@ -0,0 +1,25 @@ +from django.db import models +from django.contrib import admin +from web.models.base import BaseModel +from web.models.event import Event +from web.models.category import Category + + +class EventCategory(BaseModel): + event = models.ForeignKey(Event, on_delete=models.CASCADE) + category = models.ForeignKey(Category, on_delete=models.CASCADE) + + class Meta: + db_table = 'event_categories' + + +class EventCategoryAdmin(admin.ModelAdmin): + search_fields = ( + 'event', + 'category', + ) + + list_display = ( + 'event', + 'category', + ) diff --git a/web/models/event_tag.py b/web/models/event_tag.py new file mode 100644 index 0000000..df7e8c3 --- /dev/null +++ b/web/models/event_tag.py @@ -0,0 +1,25 @@ +from django.db import models +from django.contrib import admin +from web.models.base import BaseModel +from web.models.event import Event +from web.models.tag import Tag + + +class EventTag(BaseModel): + event = models.ForeignKey(Event, on_delete=models.CASCADE) + tag = models.ForeignKey(Tag, on_delete=models.CASCADE) + + class Meta: + db_table = 'event_tags' + + +class EventTagAdmin(admin.ModelAdmin): + search_fields = ( + 'event', + 'tag', + ) + + list_display = ( + 'event', + 'tag', + ) diff --git a/web/models/tag.py b/web/models/tag.py new file mode 100644 index 0000000..1d0b923 --- /dev/null +++ b/web/models/tag.py @@ -0,0 +1,20 @@ +from django.db import models +from django.contrib import admin +from web.models.base import BaseModel + + +class Tag(BaseModel): + name = models.CharField() + + class Meta: + db_table = 'tag' + + +class TagAdmin(admin.ModelAdmin): + search_fields = ( + 'name', + ) + + list_display = ( + 'name', + ) diff --git a/web/tests.py b/web/tests.py new file mode 100644 index 0000000..7ce503c --- /dev/null +++ b/web/tests.py @@ -0,0 +1,3 @@ +from django.test import TestCase + +# Create your tests here. diff --git a/web/views.py b/web/views.py new file mode 100644 index 0000000..91ea44a --- /dev/null +++ b/web/views.py @@ -0,0 +1,3 @@ +from django.shortcuts import render + +# Create your views here.