From bf27894513eb2986ad42436a2dcdac0a7d48f398 Mon Sep 17 00:00:00 2001 From: Matthias Nagel Date: Tue, 30 Sep 2025 19:55:22 +0200 Subject: [PATCH] =?UTF-8?q?feat:=20Initiales=20Projekt-Setup=20gem=C3=A4?= =?UTF-8?q?=C3=9F=20Phase=201?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- accounts/__init__.py | 0 accounts/__pycache__/__init__.cpython-313.pyc | Bin 0 -> 160 bytes accounts/__pycache__/admin.cpython-313.pyc | Bin 0 -> 204 bytes accounts/__pycache__/apps.cpython-313.pyc | Bin 0 -> 528 bytes accounts/__pycache__/models.cpython-313.pyc | Bin 0 -> 201 bytes accounts/__pycache__/urls.cpython-313.pyc | Bin 0 -> 259 bytes accounts/__pycache__/views.cpython-313.pyc | Bin 0 -> 207 bytes accounts/admin.py | 3 + accounts/apps.py | 6 + accounts/migrations/__init__.py | 0 .../__pycache__/__init__.cpython-313.pyc | Bin 0 -> 171 bytes accounts/models.py | 3 + accounts/tests.py | 3 + accounts/urls.py | 6 + accounts/views.py | 3 + baseball_organisator/__init__.py | 0 .../__pycache__/__init__.cpython-313.pyc | Bin 0 -> 172 bytes .../__pycache__/settings.cpython-313.pyc | Bin 0 -> 2585 bytes .../__pycache__/urls.cpython-313.pyc | Bin 0 -> 1346 bytes baseball_organisator/asgi.py | 16 +++ baseball_organisator/settings.py | 126 ++++++++++++++++++ baseball_organisator/urls.py | 26 ++++ baseball_organisator/wsgi.py | 16 +++ calendars/__init__.py | 0 .../__pycache__/__init__.cpython-313.pyc | Bin 0 -> 161 bytes calendars/__pycache__/admin.cpython-313.pyc | Bin 0 -> 205 bytes calendars/__pycache__/apps.cpython-313.pyc | Bin 0 -> 531 bytes calendars/__pycache__/models.cpython-313.pyc | Bin 0 -> 202 bytes calendars/__pycache__/urls.cpython-313.pyc | Bin 0 -> 260 bytes calendars/__pycache__/views.cpython-313.pyc | Bin 0 -> 208 bytes calendars/admin.py | 3 + calendars/apps.py | 6 + calendars/migrations/__init__.py | 0 .../__pycache__/__init__.cpython-313.pyc | Bin 0 -> 172 bytes calendars/models.py | 3 + calendars/tests.py | 3 + calendars/urls.py | 6 + calendars/views.py | 3 + clubs/__init__.py | 0 clubs/__pycache__/__init__.cpython-313.pyc | Bin 0 -> 157 bytes clubs/__pycache__/admin.cpython-313.pyc | Bin 0 -> 201 bytes clubs/__pycache__/apps.cpython-313.pyc | Bin 0 -> 519 bytes clubs/__pycache__/models.cpython-313.pyc | Bin 0 -> 198 bytes clubs/__pycache__/urls.cpython-313.pyc | Bin 0 -> 256 bytes clubs/__pycache__/views.cpython-313.pyc | Bin 0 -> 204 bytes clubs/admin.py | 3 + clubs/apps.py | 6 + clubs/migrations/__init__.py | 0 .../__pycache__/__init__.cpython-313.pyc | Bin 0 -> 168 bytes clubs/models.py | 3 + clubs/tests.py | 3 + clubs/urls.py | 6 + clubs/views.py | 3 + dashboard/__init__.py | 0 .../__pycache__/__init__.cpython-313.pyc | Bin 0 -> 161 bytes dashboard/__pycache__/admin.cpython-313.pyc | Bin 0 -> 205 bytes dashboard/__pycache__/apps.cpython-313.pyc | Bin 0 -> 531 bytes dashboard/__pycache__/models.cpython-313.pyc | Bin 0 -> 202 bytes dashboard/__pycache__/urls.cpython-313.pyc | Bin 0 -> 260 bytes dashboard/__pycache__/views.cpython-313.pyc | Bin 0 -> 208 bytes dashboard/admin.py | 3 + dashboard/apps.py | 6 + dashboard/migrations/__init__.py | 0 .../__pycache__/__init__.cpython-313.pyc | Bin 0 -> 172 bytes dashboard/models.py | 3 + dashboard/tests.py | 3 + dashboard/urls.py | 6 + dashboard/views.py | 3 + db.sqlite3 | Bin 0 -> 131072 bytes docs/.projektbeschreibung.md.swp | Bin 0 -> 20480 bytes docs/phase1.md | 53 ++++++++ docs/projektbeschreibung.md | 94 +++++++++++++ manage.py | 22 +++ 73 files changed, 449 insertions(+) create mode 100644 accounts/__init__.py create mode 100644 accounts/__pycache__/__init__.cpython-313.pyc create mode 100644 accounts/__pycache__/admin.cpython-313.pyc create mode 100644 accounts/__pycache__/apps.cpython-313.pyc create mode 100644 accounts/__pycache__/models.cpython-313.pyc create mode 100644 accounts/__pycache__/urls.cpython-313.pyc create mode 100644 accounts/__pycache__/views.cpython-313.pyc create mode 100644 accounts/admin.py create mode 100644 accounts/apps.py create mode 100644 accounts/migrations/__init__.py create mode 100644 accounts/migrations/__pycache__/__init__.cpython-313.pyc create mode 100644 accounts/models.py create mode 100644 accounts/tests.py create mode 100644 accounts/urls.py create mode 100644 accounts/views.py create mode 100644 baseball_organisator/__init__.py create mode 100644 baseball_organisator/__pycache__/__init__.cpython-313.pyc create mode 100644 baseball_organisator/__pycache__/settings.cpython-313.pyc create mode 100644 baseball_organisator/__pycache__/urls.cpython-313.pyc create mode 100644 baseball_organisator/asgi.py create mode 100644 baseball_organisator/settings.py create mode 100644 baseball_organisator/urls.py create mode 100644 baseball_organisator/wsgi.py create mode 100644 calendars/__init__.py create mode 100644 calendars/__pycache__/__init__.cpython-313.pyc create mode 100644 calendars/__pycache__/admin.cpython-313.pyc create mode 100644 calendars/__pycache__/apps.cpython-313.pyc create mode 100644 calendars/__pycache__/models.cpython-313.pyc create mode 100644 calendars/__pycache__/urls.cpython-313.pyc create mode 100644 calendars/__pycache__/views.cpython-313.pyc create mode 100644 calendars/admin.py create mode 100644 calendars/apps.py create mode 100644 calendars/migrations/__init__.py create mode 100644 calendars/migrations/__pycache__/__init__.cpython-313.pyc create mode 100644 calendars/models.py create mode 100644 calendars/tests.py create mode 100644 calendars/urls.py create mode 100644 calendars/views.py create mode 100644 clubs/__init__.py create mode 100644 clubs/__pycache__/__init__.cpython-313.pyc create mode 100644 clubs/__pycache__/admin.cpython-313.pyc create mode 100644 clubs/__pycache__/apps.cpython-313.pyc create mode 100644 clubs/__pycache__/models.cpython-313.pyc create mode 100644 clubs/__pycache__/urls.cpython-313.pyc create mode 100644 clubs/__pycache__/views.cpython-313.pyc create mode 100644 clubs/admin.py create mode 100644 clubs/apps.py create mode 100644 clubs/migrations/__init__.py create mode 100644 clubs/migrations/__pycache__/__init__.cpython-313.pyc create mode 100644 clubs/models.py create mode 100644 clubs/tests.py create mode 100644 clubs/urls.py create mode 100644 clubs/views.py create mode 100644 dashboard/__init__.py create mode 100644 dashboard/__pycache__/__init__.cpython-313.pyc create mode 100644 dashboard/__pycache__/admin.cpython-313.pyc create mode 100644 dashboard/__pycache__/apps.cpython-313.pyc create mode 100644 dashboard/__pycache__/models.cpython-313.pyc create mode 100644 dashboard/__pycache__/urls.cpython-313.pyc create mode 100644 dashboard/__pycache__/views.cpython-313.pyc create mode 100644 dashboard/admin.py create mode 100644 dashboard/apps.py create mode 100644 dashboard/migrations/__init__.py create mode 100644 dashboard/migrations/__pycache__/__init__.cpython-313.pyc create mode 100644 dashboard/models.py create mode 100644 dashboard/tests.py create mode 100644 dashboard/urls.py create mode 100644 dashboard/views.py create mode 100644 db.sqlite3 create mode 100644 docs/.projektbeschreibung.md.swp create mode 100644 docs/phase1.md create mode 100644 docs/projektbeschreibung.md create mode 100755 manage.py diff --git a/accounts/__init__.py b/accounts/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/accounts/__pycache__/__init__.cpython-313.pyc b/accounts/__pycache__/__init__.cpython-313.pyc new file mode 100644 index 0000000000000000000000000000000000000000..56cf91e14c78141baf850539ea065e812726d69e GIT binary patch literal 160 zcmey&%ge<81SXPqGC=fW5CH>>P{wB#AY&>+I)f&o-%5reCLr%KNa~ioenx(7s(x-> zVtQ(hen3%vR%&)hs(w;pacWXxPELG&QF>xtW^rOkevy7+a&mrYUP-Zje0*kJW=VX! jUP0w84x8Nkl+v73yCPPgc_90WL5z>gjEsy$%s>_ZQ{N}Q literal 0 HcmV?d00001 diff --git a/accounts/__pycache__/admin.cpython-313.pyc b/accounts/__pycache__/admin.cpython-313.pyc new file mode 100644 index 0000000000000000000000000000000000000000..3699747078f39ddae1bbefa5356dc728c5317442 GIT binary patch literal 204 zcmey&%ge<81SXPqGVFo$V-N=hn4pZ$0zk%8hG2$ZMsEf$#v(=qhIA%P=9eI8O~zZS zi7C06d48HqxA;=B67$mY^^)`RN{TX*ikN{4Rx*4Bsk>#PpOK%Ns-K&en4X%WA5fH^ zm6~0Ws-KitoSKxFlM|m`l%ANES)5psU!PO4oI Y2hcD^AT95bd6s-K?5T;wMoIBsm1;vU7%EbqtOkb-ZlW&e(6Gj;Q zMfNGu&*UTdN?5Q)Sa?V`!nzKFEQ(u?K8dNF>6hiMDn@xWtmPVMlT6kfxh97MDI*v# ziXjUyVj;Fzgzc;qx9z+BaHy)n=(^8i1cezda?Opx zWIAcW%To8sQ}p+K1;427I=CRWtD85`%I)0p`5u0l>IZRX=bAfsGx{H>?S7QHaNaT7 i*{+xVfr~En$Ja{^o9woEKV%RFVas;PR=jQD=F58n5tJ$d5gma$S%!EwJYKPn#Ksk T#URE9W=2NFdkiu~Y(NeG|3Whw literal 0 HcmV?d00001 diff --git a/accounts/__pycache__/urls.cpython-313.pyc b/accounts/__pycache__/urls.cpython-313.pyc new file mode 100644 index 0000000000000000000000000000000000000000..32d90d7c057f2c5269e20d864920e13738343d3b GIT binary patch literal 259 zcmXv}!Ab)$5S=8uAg-mLC&9yB_tJcTr616W2zwSu+pyc3P0A!&@#shR5&lxJCr`Z< z_6IsaeTR87Z)P4d!)SB~gooSj_L=x6760IW$xu@A2{qJg0dt0|gqqi4!RG=+2@)`C zvMN8O@ruQ4r$T#VzeT>^=r{jZ<*`_Am2KRlN8?dYHv;B~3Q}k#Xte$d29hA&%hq*T zc2+go$R~7L{Tj4fDzBHym=}kQvKz00L#b9P*W2J_a-Qto)z-YUXfQi#9vc5 U3C7p~?hbHs%J`Un6qtTL16%q-1ONa4 literal 0 HcmV?d00001 diff --git a/accounts/__pycache__/views.cpython-313.pyc b/accounts/__pycache__/views.cpython-313.pyc new file mode 100644 index 0000000000000000000000000000000000000000..62a796bb0d0d92777a10acd36f8a3e9ae80780bc GIT binary patch literal 207 zcmey&%ge<81SXPqGVFo$V-N=hn4pZ$0zk%8hG2$ZMsEf$#v(=qhIA%P=9eI8O~zYn zMX7lysYQO8Ot%D5vJ&&s^Yw}|@{3B6OG}E2n1O0mGJFOpy=9}Hk)NBYpPQGMo|>Z{ zP?VpQnq88rpOjdfnv|H66Q5s{o|uoxoU literal 0 HcmV?d00001 diff --git a/accounts/admin.py b/accounts/admin.py new file mode 100644 index 0000000..8c38f3f --- /dev/null +++ b/accounts/admin.py @@ -0,0 +1,3 @@ +from django.contrib import admin + +# Register your models here. diff --git a/accounts/apps.py b/accounts/apps.py new file mode 100644 index 0000000..3e3c765 --- /dev/null +++ b/accounts/apps.py @@ -0,0 +1,6 @@ +from django.apps import AppConfig + + +class AccountsConfig(AppConfig): + default_auto_field = 'django.db.models.BigAutoField' + name = 'accounts' diff --git a/accounts/migrations/__init__.py b/accounts/migrations/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/accounts/migrations/__pycache__/__init__.cpython-313.pyc b/accounts/migrations/__pycache__/__init__.cpython-313.pyc new file mode 100644 index 0000000000000000000000000000000000000000..d44be72ad9bc4a89eff982a96e7efbd73b803973 GIT binary patch literal 171 zcmey&%ge<81SXPqGC=fW5CH>>P{wB#AY&>+I)f&o-%5reCLr%KNa~iCenx(7s(x-> zVtQ(hen3%vR%&)hs(w;pacWXxPELG&QF>xtW^rOkevy7+a&mrYUP-ZjZf1H>Vo7Fx uUa@|Bd}dx|NqoFsLFFwDo80`A(wtPgB37W$AghZ(jE~HWjEqIhKo$Uer7Si8 literal 0 HcmV?d00001 diff --git a/accounts/models.py b/accounts/models.py new file mode 100644 index 0000000..71a8362 --- /dev/null +++ b/accounts/models.py @@ -0,0 +1,3 @@ +from django.db import models + +# Create your models here. diff --git a/accounts/tests.py b/accounts/tests.py new file mode 100644 index 0000000..7ce503c --- /dev/null +++ b/accounts/tests.py @@ -0,0 +1,3 @@ +from django.test import TestCase + +# Create your tests here. diff --git a/accounts/urls.py b/accounts/urls.py new file mode 100644 index 0000000..bbbd7cc --- /dev/null +++ b/accounts/urls.py @@ -0,0 +1,6 @@ +from django.urls import path +from . import views + +urlpatterns = [ + # Add your URLs here +] diff --git a/accounts/views.py b/accounts/views.py new file mode 100644 index 0000000..91ea44a --- /dev/null +++ b/accounts/views.py @@ -0,0 +1,3 @@ +from django.shortcuts import render + +# Create your views here. diff --git a/baseball_organisator/__init__.py b/baseball_organisator/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/baseball_organisator/__pycache__/__init__.cpython-313.pyc b/baseball_organisator/__pycache__/__init__.cpython-313.pyc new file mode 100644 index 0000000000000000000000000000000000000000..89d77623c4f8c8c87ad53f0e06eeb6142ff36219 GIT binary patch literal 172 zcmey&%ge<81Zt9ZGC=fW5CH>>P{wB#AY&>+I)f&o-%5reCLr%KNa~iienx(7s(x-> zVtQ(hen3%vR%&)hs(w;pacWXxPELG&QF>xtW^rOkei3%T`1s7c%#!$cy@JYH95%W6 bDWy57c15f}vq5$jgBTx~85tRin1L(+s&*`! literal 0 HcmV?d00001 diff --git a/baseball_organisator/__pycache__/settings.cpython-313.pyc b/baseball_organisator/__pycache__/settings.cpython-313.pyc new file mode 100644 index 0000000000000000000000000000000000000000..248bdfe443a3d9c1a420d3085f9e1a6e278514d6 GIT binary patch literal 2585 zcmb7GTXWk)6qbCy$8pmpX@PMl&^RShdPz&66ck%YO&r_xIt_F(Xk>X4tI@^Xl^UWa zzw^QiGyDbq2EU*g9-7hckQtts;lXK#caD5XJWggP9(%QWF5fx(?KvyIO(tUue70x* zX#JL8m_NP6@DmzL-u?}fpBcmu2C>Mu&VJ(~zAUrt`;gi8FSC8CT6E}k_FNuJYrPm} za&LB#jD(P%gi(M*c!orI1_ht6BnHnAJmV-#5(qRXfIMC73A@CiI2Yhql0*rTLP?a` z4xx#~IK!Yc=UZaQ1e!z{u$n}ddgD}Yyu8Hn0g^^n$RwI38HjfYep6_MTt>6x%I?+N zHTeN-D^_?e8@pzfV#`vEU7Fo7Nwy(V+>kX*GRdxNs8qH<*e2$4tXNzuwuTK%WD7U5 zjf3osW)EOdZtAL$rIt*rf#r>?O#w1Hh_KAv=I(*_Dq!g*!CBRSSh{SfrjdoO)lwn4 zs^L!|860a_R-1m#^G#EsTtCJz1I5&NZ14ccTV`8TC_l`e@55UyoZYcCEvu>2%9=Z8 zyOWJ31i~uGzLYf^)Bh8T;GK~`e|ZO-W8FYiwpz~0fCbf{Sg{FS%(WM>y3|%$j=uMD z?*8rX_sK_d68-XlEG^vKvmJUczbwt$L|NFMw{2bDxl_-@oT)wxreu&5hUG`m6F zs3L3FXvzepO_{bDrc9c-u(LP-(bZ;C!}~J9T#pXbI^dAU3rsdnbVI_kX9 zXL-cy-UXY`RAukEtn5M0aNn*HS;v*O*Bo@jZ}y_rO3;FN~l z!xegsS|6yXo9UIz50(Udr9g%zp*g>^Fb;FxiX-?1^p54+9N3T&@$ydvb+#d5(76pA(EMucir>dnHHYQ0z~Bj@7_IoYSXDkrzwz-sTv+;9`` z$hKykmU^>sMiG6XsTRKD#6UQh=X`EREUy*Iq8lg+8zPy2hIby1?V?vFZJE-2lQbo` zRMciK9Jfg^5iGBZZ3`n+S2fuy|EGNmlQ@sw6=_2?RNdA~*x0pNXZ~NktAD>Os)HQQ z0KR@#fU>P)qAKSRg4kHJsq5dY=bbQI{m>q~^Zo!9nAFWC)+o24?n3*Rt18x-<=nIz zmL#~@TD3vN(VnKRbL3QM&ie*#>5eT4GkQ>`5778VCOQ?x%qE@NYrOjF?Un#G; z(Ym-%EeUlIx#=ymR`l#k#k}B^l^ZPxb-@dZ+!^ z<+V*=O_cJLf(U@c4N-blfs%=ALc+ycpOxK^H>*E`%km!E zPNMN(sOwKAeVu6c17_-rS46ua#!1kh2Ag2d<|-4Nc$I$E_4~jt z(pywV7f(hPwf^FA@;%=xW~TcIGda^q9w#O{(c}0;Cvpr)hq?(SH4TZzm@CVNOoq$@ G7ykkga9hRz literal 0 HcmV?d00001 diff --git a/baseball_organisator/__pycache__/urls.cpython-313.pyc b/baseball_organisator/__pycache__/urls.cpython-313.pyc new file mode 100644 index 0000000000000000000000000000000000000000..e1c7bf819f907eadf1c51e4e88a3808f2d46268d GIT binary patch literal 1346 zcmb7EL2DC16y8mC(`3`62SF#R)L1vE3A8Qaj@B@?GMlq0!Nqg4d=aNn zEi;PLK6A?yyK^;tl=}mlQCNN|R#2EV6)P%i_A&-dn(vhCGWsY4SZ_C90+&Q>ztf|L z`y>KwLO}~L+(JRnB(#GfpCK-iF(o_L<&I^&>0+?mqd|-~$24NwAn+Lnl=L`eKu|Kk z33%t@J?4N_u{9(V13wbf;iyR*V9^3FjO!KW9q`2S0E&Pg#)R@Z0BuS_5bifo9FLPD znW}ziTrVe(158XPwu)i9)k5cmYHx#E&X6uGrSo05Nu7dgo2B{!InpT}-7A zM=4I_ybxUfqej*{h&3fi)xM-?EpmgN=SLl3g6bznldn7VXH6LcgcR|5WG$}Rpgp#- zKC)}{IvicV;*AN7D3b#*m)nK|9~1vLHkckSM3 zPBRM!^Pg&m^+Ek`Ww0_d?tV4$2R8>P{wB#AY&>+I)f&o-%5reCLr%KNa~h@enx(7s(x-> zVtQ(hen3%vR%&)hs(w;pacWXxPELG&QF>xtW^rOkevy81VoqvaN@7v5etdjpUS>&r kyk0@&Ee@O9{FKt1RJ$Tppn)I@i$RQ!%#4hTMa)1J0D*ZZ5dZ)H literal 0 HcmV?d00001 diff --git a/calendars/__pycache__/admin.cpython-313.pyc b/calendars/__pycache__/admin.cpython-313.pyc new file mode 100644 index 0000000000000000000000000000000000000000..d34c1f409ae4aae40bc4b0da2d0289797072ca22 GIT binary patch literal 205 zcmey&%ge<81QwEaGVFo$V-N=hn4pZ$0zk%8hG2$ZMsEf$#v(=qhIA%P=9eI8O~zZS zi7C06d48HqxA;=B67$mY^^)`RN{TX*ikN{4Rx*4Bsk>#XpOK%Ns-K&en4X%WA5fH^ zm6~0Ws-KitoSKxFlM|m`l%ANES)5psU!nq_pz;=nO>TZlX-=wL Z5eLvTMj$Q*F+MOeGBVy{P$*&pasUIoG_C*u literal 0 HcmV?d00001 diff --git a/calendars/__pycache__/apps.cpython-313.pyc b/calendars/__pycache__/apps.cpython-313.pyc new file mode 100644 index 0000000000000000000000000000000000000000..0a5d9c6fd420eae3e782a670a7898fd3d4918474 GIT binary patch literal 531 zcmX|8Jx?4l5Vd#rF2~0Sk`M?8q$CB>Hn$ZL1&VZlC_q9;Zjna5Ti;^hTQ6g8LE1>E z(~$p=f0OcLB^4E2q=O!ty^D*P_w?qCX2#QQcaiwFzxn6tr_c9+%wKB;rn?^85k?q2 zBc~MU2lAeLA}rb>EWV_BaZ`s;k)*AMKvL=!`c-wL%aJUGjod^!BhzgU?#LxU$_Pe` zV$32;Sd1-}V7q9gZMSm7l_+zLrfKw$c+c0J{F;}A?&X8tSm#2S-k~h|wbdt5sN5|K z=cZreJbmRl03{y_0JjL>4Ydk*8Q`YoYNo6Jj3gSXWGPDR+4puQGgtjGr3hyhm$G#0#+hFgu< z|4}nuRi;h#7BizvSa%JE9vu9woEKV%RFVas=%t_5lNh~VXhZw6@P# U#Kj=S2WCb_#(NAhMQlJ0065|^YybcN literal 0 HcmV?d00001 diff --git a/calendars/__pycache__/urls.cpython-313.pyc b/calendars/__pycache__/urls.cpython-313.pyc new file mode 100644 index 0000000000000000000000000000000000000000..a9724599fa62b8932371bc22d589ba7aff583af1 GIT binary patch literal 260 zcmXv}!A`?440V!LLUa=noRB#5+RO3-6CbcifYdWW9*x>wtqN{fySQ1}W%dJ=?v-vw82Ey*0NqVY75exa4qB TLWl$09N_Ad$qV^jPZ{ zP?VpQnq88rpOjdfnv|H66Q5s{o|u>P{wB#AY&>+I)f&o-%5reCLr%KNa~iienx(7s(x-> zVtQ(hen3%vR%&)hs(w;pacWXxPELG&QF>xtW^rOkevy81VoqvaN@7v5er{%ZQDRAE veqOPDe0*kJW=VX!UP0w84x8Nkl+v73yCPPg*&w@%L5z>gjEsy$%s>_Zt>P{wB#AY&>+I)f&o-%5reCLr%KNa~i2enx(7s(x-> zVtQ(hen3%vR%&)hs(w;pacWXxPELG&QF>xtW^rOkevy81PH9rHetdjpUS>&ryk0@& gEe@O9{FKt1RJ$TppkW}(ib0Hz%#4hTMa)1J0K_pScmMzZ literal 0 HcmV?d00001 diff --git a/clubs/__pycache__/admin.cpython-313.pyc b/clubs/__pycache__/admin.cpython-313.pyc new file mode 100644 index 0000000000000000000000000000000000000000..65bf394c62b9c899cb82b352b5ba79a5f30c7a80 GIT binary patch literal 201 zcmey&%ge<81m===GVFo$V-N=hn4pZ$0zk%8hG2$ZMsEf$#v(=qhIA%P=9eI8O~zZS zi7C06d48HqxA;=B67$mY^^)`RN{TX*ikN{4Rx*4Bsk>#VpOK%Ns-K&en4X%WA5fH^ zm6~0Ws-KitoSKxFlM|m`l%ANES)5psU!ne>pz;=nO>TZlX-=wL5eLvD VMj$Q*F+MOeGBVy{P$*&pasU%hGZg>; literal 0 HcmV?d00001 diff --git a/clubs/__pycache__/apps.cpython-313.pyc b/clubs/__pycache__/apps.cpython-313.pyc new file mode 100644 index 0000000000000000000000000000000000000000..f9ca4644543915cb32e89fd6b6ffcd1fbd941164 GIT binary patch literal 519 zcmXv~Jx?1!5Z%2GU(Q0wjdAEz)Suw?2-nZ;#o%g0x7K z5e+{g|0boiN~%QV);I;;1p|ODSY-;Zd_-aI&aV;_~B`7R-RcdY&ri(RG zUe|h9-=Kf{S7IlzsdW5oq%rMC;y2n3)d6yLx>3g literal 0 HcmV?d00001 diff --git a/clubs/__pycache__/models.cpython-313.pyc b/clubs/__pycache__/models.cpython-313.pyc new file mode 100644 index 0000000000000000000000000000000000000000..ed0905076fe4d89b7156fd2d3b95c6e783c5ddd0 GIT binary patch literal 198 zcmey&%ge<81m===GAx1gV-N=hn4pZ$0zk%8hG2$ZMsEf$#v(=qhIA%P=9eI8O~zYn zx%nxnImLdOOt&~wvJ&&s^Yv1aikN|tD;Yk6)ZDVt&&bbB)z8gKOi#_x4=BpdO3f}w z)lW(+PEAV8$%)S|N>9woEKV%RFVauWDNQQYhZw0>P(W^X1h<|1YV z27QJimUI?P)|VjVnvAzt3KB~)UNS;BtYw+0<;8xQthcyRvJ&&s^Yu!La*B(XfwH$4 zidaDuH&6tqr6jc|uXrWHXP^+nEerjO{M=Oi+`Po})ExbQqWrAX?2=Udq{QOXq{N(@ z`23>u#JtSn#FG3X{p6g|q+)%Lv3doSw>WHa^HWN5QtgU(fChnFQ7i-`J}@&fGTvp7 SxyvB@frW{msgb(~Z{ zP?VpQnq88rpOjdfnv|H66Q5s{o|u2KczG$ b)vkyGXc8k37lRldm>C%v?=dJBu>m;%_9!&9 literal 0 HcmV?d00001 diff --git a/clubs/admin.py b/clubs/admin.py new file mode 100644 index 0000000..8c38f3f --- /dev/null +++ b/clubs/admin.py @@ -0,0 +1,3 @@ +from django.contrib import admin + +# Register your models here. diff --git a/clubs/apps.py b/clubs/apps.py new file mode 100644 index 0000000..7e36704 --- /dev/null +++ b/clubs/apps.py @@ -0,0 +1,6 @@ +from django.apps import AppConfig + + +class ClubsConfig(AppConfig): + default_auto_field = 'django.db.models.BigAutoField' + name = 'clubs' diff --git a/clubs/migrations/__init__.py b/clubs/migrations/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/clubs/migrations/__pycache__/__init__.cpython-313.pyc b/clubs/migrations/__pycache__/__init__.cpython-313.pyc new file mode 100644 index 0000000000000000000000000000000000000000..68f1266572da46dc1a068b0edaadd103cee870a8 GIT binary patch literal 168 zcmey&%ge<81m===GC=fW5CH>>P{wB#AY&>+I)f&o-%5reCLr%KNa~imenx(7s(x-> zVtQ(hen3%vR%&)hs(w;pacWXxPELG&QF>xtW^rOkevy81PH9rHer{%ZQDRAEeqOPD re0*kJW=VX!UP0w84x8Nkl+v73yCPPgxgdLsL5z>gjEsy$%s>_Z-pMNO literal 0 HcmV?d00001 diff --git a/clubs/models.py b/clubs/models.py new file mode 100644 index 0000000..71a8362 --- /dev/null +++ b/clubs/models.py @@ -0,0 +1,3 @@ +from django.db import models + +# Create your models here. diff --git a/clubs/tests.py b/clubs/tests.py new file mode 100644 index 0000000..7ce503c --- /dev/null +++ b/clubs/tests.py @@ -0,0 +1,3 @@ +from django.test import TestCase + +# Create your tests here. diff --git a/clubs/urls.py b/clubs/urls.py new file mode 100644 index 0000000..bbbd7cc --- /dev/null +++ b/clubs/urls.py @@ -0,0 +1,6 @@ +from django.urls import path +from . import views + +urlpatterns = [ + # Add your URLs here +] diff --git a/clubs/views.py b/clubs/views.py new file mode 100644 index 0000000..91ea44a --- /dev/null +++ b/clubs/views.py @@ -0,0 +1,3 @@ +from django.shortcuts import render + +# Create your views here. diff --git a/dashboard/__init__.py b/dashboard/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/dashboard/__pycache__/__init__.cpython-313.pyc b/dashboard/__pycache__/__init__.cpython-313.pyc new file mode 100644 index 0000000000000000000000000000000000000000..2035249380c407f7225d64cf74a41afd9a90227f GIT binary patch literal 161 zcmey&%ge<81XhxFGC=fW5CH>>P{wB#AY&>+I)f&o-%5reCLr%KNa~h@enx(7s(x-> zVtQ(hen3%vR%&)hs(w;pacWXxPELG&QF>xtW^rOkevy7kVsS=NeqvFIetdjpUS>&r kyk0@&Ee@O9{FKt1RJ$Tppn)I@i$RQ!%#4hTMa)1J0D#XpOK%Ns-K&en4X%WA5fH^ zm6~0Ws-KitoSKxFlM|m`l%ANES)5psU!nq_pz;=nO>TZlX-=wL Z5eLvTMj$Q*F+MOeGBVy{P$*&pasUL4G^+pr literal 0 HcmV?d00001 diff --git a/dashboard/__pycache__/apps.cpython-313.pyc b/dashboard/__pycache__/apps.cpython-313.pyc new file mode 100644 index 0000000000000000000000000000000000000000..fb26998a6b051aa2d8b4ba3a766a4eef205e697a GIT binary patch literal 531 zcmX|8!EO^V5VdzVY0?svQV0}*)N-h_m+Yw$LKRZmhyzF!lCPCU-mbH8an{S&dni{V z&b^d>;BPoa7CrUU8&cqo-A(Xe<~_Z6qnYtyFjy!4z1jIS{qFN^Agk9|g2lcE*Mt#9 zKalqn=`MLjUJ({OCoDdr2XR}6QJJKjyFgOv`bTwrqN|B4&s({TbV(L3Jh&!j1SumJ zF^VyZFkvxvSc2WMlXl(an44*?ITmfByTp6GyeuwwRq9cZk7l|M%8ZU>dDK|_P6}1H zez7wBAgAe?>j6}JCIH+zfHyQM;0FMo8?KhhCcs3Zu}W5=(q4X4hzW0$1@8NLEi_I- zv3mkwEVuF;xV0$r#tH*~JwMqZtmY20sh){!R`F7(>?7(6@yUuT=SJjQDbQH*N*Zo8 zX8%XccwL)OeTm`Z_aUrm20nZv^PSf}li_@0_;rjASNdrhyN%@~f*HdnwDvGdTe#(s j>m9aRzr}4&!~M-;AAZM_(i^h(ryJ3ySMo3M>E87Z;LME~ literal 0 HcmV?d00001 diff --git a/dashboard/__pycache__/models.cpython-313.pyc b/dashboard/__pycache__/models.cpython-313.pyc new file mode 100644 index 0000000000000000000000000000000000000000..51556faf26f45a78d55dc87bd34245d1bc07eee5 GIT binary patch literal 202 zcmey&%ge<81XhxFGAx1gV-N=hn4pZ$0zk%8hG2$ZMsEf$#v(=qhIA%P=9eI8O~zYn zx%nxnImLdOOt&~wvJ&&s^Yv1aikN|tD;Yk6)ZDVu&&bbB)z8gKOi#_x4=BpdO3f}w z)lW(+PEAV8$%)S|N>9woEKV%RFVas*EY3*EPb^B&hZw6@P# U#Kj=S2WCb_#(NAhMQlJ006C~LX#fBK literal 0 HcmV?d00001 diff --git a/dashboard/__pycache__/urls.cpython-313.pyc b/dashboard/__pycache__/urls.cpython-313.pyc new file mode 100644 index 0000000000000000000000000000000000000000..7d70fae40980992e2c27ab4ac68935d9836bbb37 GIT binary patch literal 260 zcmXv}L2AQ54Ak!0Q0j(4dn)AMt1sCPggzjF(Bg9`GG6SYYj4mxEjjiPeMG;sG^d_& z3-|-ol4cGXX(SEOIGJ1n* T2_X(JJ;41bk+Z{ zP?VpQnq88rpOjdfnv|H66Q5s{o|u2 fKczG$)vkyGXc{9B7lRldm>C%v?=dJBu>m;%?M^mJ literal 0 HcmV?d00001 diff --git a/dashboard/admin.py b/dashboard/admin.py new file mode 100644 index 0000000..8c38f3f --- /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 0000000..7b1cc05 --- /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 0000000..e69de29 diff --git a/dashboard/migrations/__pycache__/__init__.cpython-313.pyc b/dashboard/migrations/__pycache__/__init__.cpython-313.pyc new file mode 100644 index 0000000000000000000000000000000000000000..d6ef8b28c83ebb69b5f2ecda2ea3e09cc9a7e9c9 GIT binary patch literal 172 zcmey&%ge<81XhxFGC=fW5CH>>P{wB#AY&>+I)f&o-%5reCLr%KNa~iienx(7s(x-> zVtQ(hen3%vR%&)hs(w;pacWXxPELG&QF>xtW^rOkevy7kVsS=NeqvFIer{%ZQDRAE veqOPDe0*kJW=VX!UP0w84x8Nkl+v73yCPPg*&w@%L5z>gjEsy$%s>_Zt|%;p literal 0 HcmV?d00001 diff --git a/dashboard/models.py b/dashboard/models.py new file mode 100644 index 0000000..71a8362 --- /dev/null +++ b/dashboard/models.py @@ -0,0 +1,3 @@ +from django.db import models + +# Create your models here. diff --git a/dashboard/tests.py b/dashboard/tests.py new file mode 100644 index 0000000..7ce503c --- /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 0000000..bbbd7cc --- /dev/null +++ b/dashboard/urls.py @@ -0,0 +1,6 @@ +from django.urls import path +from . import views + +urlpatterns = [ + # Add your URLs here +] diff --git a/dashboard/views.py b/dashboard/views.py new file mode 100644 index 0000000..91ea44a --- /dev/null +++ b/dashboard/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..cb112970e0f770caf868ba5172424834b21ae1d9 GIT binary patch literal 131072 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 KR~0(lIQeg`bv4QW literal 0 HcmV?d00001 diff --git a/docs/phase1.md b/docs/phase1.md new file mode 100644 index 0000000..916ee09 --- /dev/null +++ b/docs/phase1.md @@ -0,0 +1,53 @@ +## Phase 1: Projektvorbereitung und Basiskonfiguration + +Dies ist der grundlegende Setup-Teil. Der Agent soll eine saubere Arbeitsumgebung schaffen und das Django-Projekt initialisieren. + + Schritt 1: Projektverzeichnis erstellen + + Erstelle ein neues Verzeichnis namens baseball_organisator für das Projekt. + + Schritt 2: Virtuelle Umgebung einrichten + + Navigiere in das Verzeichnis baseball_organisator. + + Erstelle eine virtuelle Python-Umgebung im Projektverzeichnis. + + Aktiviere die virtuelle Umgebung. + + Schritt 3: Django installieren und Projekt initialisieren + + Installiere Django und mysqlclient in der virtuellen Umgebung. + + Initialisiere ein neues Django-Projekt namens baseball_organisator im aktuellen Verzeichnis. + + Schritt 4: Grundlegende Django-Apps erstellen + + Erstelle die folgenden Django-Apps: + + accounts (für Benutzerverwaltung und Login) + + clubs (für Club-, Mannschafts- und Team-Strukturen) + + calendars (für Terminverwaltung) + + dashboard (für die Startseite nach dem Login) + + Schritt 5: URLs konfigurieren + + Öffne die Datei baseball_organisator/urls.py. + + Füge die URLs der neu erstellten Apps hinzu, sodass sie erreichbar sind. + + Schritt 6: Datenbankkonfiguration anpassen + + Öffne die Datei baseball_organisator/settings.py. + + Stelle sicher, dass sqlite3 als Datenbank-Backend für die Entwicklungsumgebung konfiguriert ist, wie in den Projektanforderungen beschrieben. + + Trage die Namen der neu erstellten Apps in INSTALLED_APPS ein. + + Schritt 7: Admin-Benutzer anlegen + + Führe die Migrationen aus (migrate). + + Erstelle einen Superuser für den Zugriff auf den Django-Adminbereich. diff --git a/docs/projektbeschreibung.md b/docs/projektbeschreibung.md new file mode 100644 index 0000000..c204339 --- /dev/null +++ b/docs/projektbeschreibung.md @@ -0,0 +1,94 @@ +Anforderung Technisch: +Benötigt wird ein Projektplan der in kleinen abzuschließenden Steps für ein Agent wie den gemini-client abzuarbeiten ist, ohne das viel Kontext von anderen Steps notwendig ist. +Am ende soll ein Programm rauskommen, das eine Webapplikation ist, den heutigen gängigen Layouts entspricht und Performant funktioniert. Es soll für casualnutzer leicht zu bedienen sein. +Als sprache soll python und als Framework django genutzt werden. Tools wie automatisierte deployments sind nicht gewünscht, der Code muss im ganzen ohne Probleme vom Entwicklungsrechner auf den Webspeicher zu laden sein. Als Datenbank Backend soll mysql auf dem produktionsrechner laufen. Auf der Enwiklcungsumgebung kann und soll mit den handelsüblichen tools die django mitliefert gearbeitet werden, also sqlite und den internen webbrowser. +Python muss im Projektordenr als virtuelles env erstellt werden und die benötigten tools ebenfalls. + +Was soll die App machen: +Die App soll ein organsisationskalender darstellen, mit denen ein Sportverein mit seinen vielen Untergliederungen den Coaches, Spielern und Eltern es ermöglicht, Termine zu erstellen, ab oder zuzusagen und auch eine Planung für entsprechende Termine zu gestalten. Das ganze erfolgt über einen eigenen login bereich der dann an ein entsprechendes Dashboard weiterleitet, wo alle wichtigen Person relateten Dinge zu sehen sind, je nach Aufgabe sind hier verschieden "widgets" zu sehen. + + +Die Organisation: +Im Programm gibt die die Hauptorgansisation der Club. Ein Club hat ein Name, eine Webseite und einen oder mehrere Admins, diese haben keinen zugang zum Dashboard sondern ausschließlich zum backend. +Ein Club besteht aus einer oder mehrere Manschaften. Jede Manschaft hat einen Unique Namen innerhalb des Clubs. Jeder Manschaft ist ein Headcoach zugewiesen, und kann einen oder mehrere Assistant Coaches haben. Jede Manschaft mehrere Teams als untergliederung haben, wenn eine Manschaft kein Team hat, wird die Manschaft als Team behandelt, es muss nachträglich vom Headcoach der Manschaft möglich sein neue Teams zu definieren oder Teams zu löschen. Sollte das vorletzte Team gelöscht werden, wird wieder die Manschaft als Team bewerte. Aber eine Manschaft die kein Team besitzt muss ebenfalls zu verändert werden können das sie als untergliederung Teams hat. +Jedes Team hat ein unique Namen, hat einen Headcoach und einen Assistant Coach, die sich aus den Coaches der Manschaften zusammensetzen. + + +Die User: +Ein user hat einen benutzernamen und ein Passwort. Den zugang erhält der User durch eine erstmaligen einladungscode, nach dem eingeben des Code, legt er einen Benutzernamen und ein passwort fest. +Ein User kann eine oder mehrere Rollen innehaben: Elternteil, Spieler, Headcoach, AssistantCoach, Kind +Die Rollen werden nicht nicht durch flags im Profil definiert sondern durch gegebenheiten und paramtern, da das sich die Rollen quasi selbst verteilen. + +Ein User ist ein Spieler, wenn er als solches von einem Headcoach angelegt wurde, sollte ein spieler jünger als 18 Jahre sein, bekommt er zu seinen einladungscode mindestens noch 2 zusätzliche einladungscode für seine Elternteile. Er wird durch sein alter als Kind gewertet. Ein Spieler gehört immer mindestens einer Manschaft bei. Er gehört maximal ein Team einer Manschaft an. +Wenn er über 18 Jahre ist, kann er selbst Terminen zu oder absagen. Die Parameter eines Spielers sind mindestens die folgenden: Nachname, Vorname, Geburtstagsdatum (für die errechnung des alters), Spielernummer, optional 2 Elternteile. Die Spielernummer ist per default 999 wenn keine nummer eingegeben wurde. + +Ein User ist ein Kind, wenn sein Alter unter 18 Jahre ist. +Ein Kind hat mindestens ein Elternteil maximal 2. +Ein Kind kann sich einloggen und seine Termine sehen, diese aber weder ab noch zusagen. +Ein Kind ist immer auch ein Spieler + +Ein User ist ein Elternteil, wenn es mind. 21 Jahre alt ist. +Es ist mindestens einem Kind zugeordnet. +Es kann Termine für seine Kinder sehen, ab und zusagen. + +Ein User ist ein Coach wenn er mindestens einer Manschaft oder einem Team als HeadCoach oder Assistantcoach zugewiesen wurde. Er hat dann ausschließlich Coachrechte für seine Gliederung, also Team oder Manschaft. Ein Coach kann Termine anlegen und absagen. + +Ein Headcoach ist ein Coach mit besonderen Rechten er kann Assistent-Coaches für seine Gliederung definieren. Als Headcoach einer Manschaft, kann er vom Dashboard aus, selber ein neues Team in seiner Gliederung anlegen, absagen oder editieren. +Er kann Spieler in seiner Manschaft aufnehmen, und diese auch anlegen. Eer hat die möglichkeit einen Spieler in eine gleichwertige Gliederung zu verschieben. Dieses erfolgt durch einen speziellen Workflow (weiter unten). Er kann zusagen und absagen von allen Spielern zu seinen Terminen direkt sehen. Ein Headcoach einer Manschaft ist immer auch indirekt Headcoach der Teams, auch wenn nicht explizieht angegeben, er hat automatisch alle rechte für die Manschaft und der untergliederten Teams. Ein Headcoach kann einen Asistentcoach für eine gewisse Zeit (enddatum) als Headcoach deinifieren, dieser erhält für den Zeitraum alle Rechte des Headcoaches der entsprechenden Gliederung und verliert diese mit beendigung des Enddatums. + +Ein AssistentCoach ist ein Coach. Er ist mindestens einer Manschaft zugeordnet, und kann entsprechend dann auch Coach eines Teams dieser Manschaft sein, auch wenn er nur Assistent Coach einer Manschaft ist, kann er Headcoach eines der Teams dieser Manschaft sein. Damit erhält er alle rechte eines Headcoaches seines Teams aber nicht die Headcoachrechte der Manschaft. + + +User beziehungen: +Ein Kind kann nur Spieler und Kind sein. +Ein Spieler kann nicht gleichzeitig Coach der eigenen Gliederung sein. +Ein Coach muss Volljährlich sein. +Ein Elternteil kann Coach sein und auch Spieler, aber kein Kind. + + +Der Einladungcode: +Der Einladungscode wird bei anlage eines Spielers erstellt. Er ist maximal 2 Wochen gültig. Bei einloggen mit dem einladungscode und der erstellung der USerdaten wie username und password, erlischt dieser ebenfalls automatisch. Ein Einladungscode der vergeben wurde, kann nicht wieder für andere User vergeben werden. Ein Einladungscode kann von dem Headcoach wieder reactiviert werden, der den Spieler angelegt hat. + +Spieleranlage: +Ein Headcoach einer Manschaft kann einen Spieler anlegen. Dafür gibt er in einem Formular, den Vornamen und Nachnamen des Spielers ein, sollte das Geburtsdatum bekannt sein, kann er dieses eingeben, alternativ, gibt es ein Auswahlfeld, ob der Spieler Volljährig ist, wenn dem so ist, wird das geburztdatum auf den jeweiligen Tag minus 18 Jahre gesetzt, wenn nein, wird das Geburtsdatum auf den Anlegetag gesetzt. Das Flag Vollhrig wird nur im Formular bei anlage angezeigt, es wird nicht gepseichert, stattdessen wird ensprechend der auswahl ein default Geburrtsdatum festgelegt. Sollte im nachhein das Geburtsdatum auf ein Datum gesetzt werden, was erfodert das Elternteile benötigt werden, wird direkt auf die Einladungscode geneireung verwiesen die einladungscodes generiert. Bei anlage wird ein Einladungscode für den Spieler erstellt, unabhängig des alters. Abhängig von alter des Spielers, wenn er unter 18 Jahre ist, entweder errechnet durchs Geburtsdatum oder des Flags ob er volljährig ist, wird auf Wunsches des Coaches können entweder ein oder zwei zusätzliche einladungscodes generiert werden für dei elternteile, alternativ kann auch direkt ein oder zwei bestehende 21 jährige User als Elternteil definiert werden in diesem fall werden die Elternteile direkt dem Spieler als elterteil zugeordnet. Bei einladungscodes geschieht die zuordnung erst bei anlage des users des elternteils, es muss also der einladungscode dem Kind zugeordnet werden. Dafür werden dummyuser für jedes elternteil erstellt, dem entsprechend der Code zugewiesen wird. Bei neuanlage der Eltern, wird das alter nicht überprüft die altersgrenze ist hier von nöten die um die auswahl der user die bereits als exisiteren und als elternteil hinzugefügt werden sollen, zu minimieren. +Wird ein ein Geburtsdatum eines Spielers auf ein Datum welches von 18 Jahre auf unter 18 Jahre wechselt, wird ensprechedn wie bei der Useranlage ein Formular zur elternteilanlage gezeigt, diese ist ähnlich oder identisch dem bei der Spieleranlage, man kann also neue Einladungscodes generieren oder aber bestehende 21 Jahrige User als Elternteil festlegen. + +Terminne nee +Es gibt 3 Arten von Terminen, Training, Spiel und Event. + +Diese können von dem Headcoach der entsprechenden GLiederung angelegt werden, aber nur für die entsprechende Gliederung. Ein Headcoach einer Manschaft, kann Termine für die Manschaft insgesammt oder für einzelne Teams der Manschaft festlegen. + +Der Basistermin ist ein Event, dieser Enthält eine kurze beschreibugn, die Uhrzeit, Datum und Treffpunkt, letzteres ist eine Adresse, die mittels Googlemaps als Shortlink verknüpft ist, es wird also eine schnittstelle zu googlemaps benötigt. Eine Endzeit ist optional genauso der Abholort. + +Ein Training ist ein Event, mit folgenden besonderheiten, er hat keine Mindestanzahl an Teilnehmern, und wird immer als Training zusätzlich ervorgehoben. + +Ein Spiel ist ein besonderes Event, es wird als Spiel herfolgehoben, und benötigt immer mind. 9 zusagen. Ein Spiel kann nur einem Team zugeordnet werden, oder einer Manschaft, sofern diese keine Teams hat, bzw. nur ein Team beinhaltet. Die Uhrzeit des Events ist hier die Uhrzeit wann das Spiel begint, zusätzlich gibt es ein Feld festzulegen, wieviele Minuten man sich vor dem Spiel trifft, default sind 90 Minuten. Ein Spiel hat immer auch einen "Gegner" Dieser kann aus einem Dropdown ausgewählt werden, oder falls die Gegnermanschaft noch nciht angelegt wurde durch ein Freifeld eingetragen werden, damit wird die Gegner-Manschaft als Gegner abgespeichert und man kann sie bei neuen Spielen finden. +Nach dem Termin, kann ein Coach also Head oder Assistantcoach der Gliederung, die ergebnisse eintragen, und zwar pro inning. Ein Spiel besteht aus maximal 12 Innings. Wobei alle Innings nach dem dritten inning optional sind. Gespielte Spiele können nichtmehr übers Dashboard gelöscht werden. Einem Spiel wird immer eine Saison zugewiesen, diese Saison hat immer einen Namen der aus entwerder aus einem Einzelnen Jahr bei Saison ende vor Dezember oder mit zwei Jahren bei beendigung nach Januar des folgeJahres benamst. Sobald eine Saison von irgendeiner Gleiderung erstellt wurde kann diese von allen anderen Gliederungen genutzt werden. So würde eine Saison die im Feburar 2025 beginnt und im Dezember 2025 endet nur Saison 2025 heissen. Eine Saison die im Oktober 2025 beginnt und im März 2026 würde heissen "Saison 2025-2026". +Sollte ein Spiel eine Woche vor Spielbegin nicht alle erfoderlichen 9 Spieler zugesagt haben, kann der Headcoach der Manschaft, das Spiel für ein weiteres Team öffnen, sofern die Manschaft mehr als nur ein Team hat, oder absagen. +Beim öffnen des Spiels für ein anderes Team gilt: +* Dieses Spiel wird im Dashboard als "unterstützer Spiel" herforgehoben. +* Es kann nur zugesagt werden, wenn der Spieler bzw. das Elternteil nicht für ein Paralleltermin bereits zugesagt hat. +* Das SPiel wird erst dann beim anderen Team angezeigt, wenn für ein potenziell Parallelstattfindenden Spiel alle benötigten Spieler zugesagt haben. +* Ein Wechsel von einem zum anderen Spiel ist möglich sofern, dadurch nicht das eigene Spiel als unspielbar definiert wird. + +Für einen Termin kann ein Spieler, oder Elternteil zu oder absagen. dabei wird festgehalten wann zu oder abgesagt wurde. Ein wechsel ist möglich aber dieses wird ebenfalls protokliert. Ein Elternteil kann für jedes Kind für den dieser Termin gilt, zu oder absagen. Ein Elternteil kann immer sehen für welchen Termin die eigenen Kinder zu oder abgesagt haben. + +Spieler bzw. Elternteile können auch Kinder für einen Zeitraum pauschal abmelden, bspw. wegen Krankheit oder so. dafür ist es mögllich ein Zetifenster (begin und ende) im Dashboard anzugeben. Alle Termine in dieser Zeit werden dann für dieses Kind autotmaisch auf abgelehnt gestellt. Das vorzeitige beenden dieser abwesenheit ist jederzeit möglich. Sollten bereits Termine zugesagt worden sein, werden diese auf abgelehnt gestellt. + + +Datum und Uhrzeit Angaben: +Werden grundsätzlich in der Datenbank als UTC Zeit abgespeichert, im Frontend wird das entsprechende Datums und Uhrzeitformat der lokalen begebenheit angepasst. Per default ist dieses (Berlin mit entsprechenden suffix CET oder CEST) in Formularen wird der Suffix nicht benutzt und es wird entsprechend das Datum umgerechnet, also ein Datum nach Zeitumstellung erält immer den enprechenden+/- offset . + +Ein Headcoach kann für seine Manschaft folgnede dinge zusätzlich festlegen: Default Anzahl der gespielten innings. Mindestanzahl der Spieler die für ein Spiel zugesagt haben. Diese Settings gelten enpsrechedn immer für Teams dieser Manschaft. + +Das Backend: +Es gibt 2 Login bereiche, eines welches normal zu den Dashboard führt hier können entsrechend termine erstellt, abgesagt usw. werden. +Der login bereich der als Backend difiniert ist, ist der normale django admin bereich, hier haben nur der Clubverantwortliche und der superadmin zugriff. + +Einstellungen der Coaches bspw. Mindestspielerzahl schlägt immer default einstellungen. +Ein unterstützer Spiel wird zwar bei allen Spielern des unterstützerteams angezeigt, man kann da aber nur zusagen wenn man keinen paralleltermin zugesagt hat. +Dabei gilt ein Paralleltermin ist ein Termin der zeitgleich mit einer tolleranz von +/-2h stattfindet. Ein Spiel dauert immer mindestens die Anzahl der Innings mal 20 minuten plus 1h anfahrt. Sollte ein spiel am gleichen tag für die unterstützermanschaft stattfinden kann der Coach explizieht ausschließen das man bei beiden spielen teilnehmen kann, aufgrund bspw. anfahrten usw. +Der Standartwert für die mindestanzahl der Spieler sind immer 9 Spieler, es sei denn der Coach hat was anderes festgelegt, coach-settings schlagen immer default settings. +Ein Spiel als SPielbar ist die mindestnazhal der Spieler + 2 Spieler definiert. + + diff --git a/manage.py b/manage.py new file mode 100755 index 0000000..b52e032 --- /dev/null +++ b/manage.py @@ -0,0 +1,22 @@ +#!/usr/bin/env python +"""Django's command-line utility for administrative tasks.""" +import os +import sys + + +def main(): + """Run administrative tasks.""" + os.environ.setdefault('DJANGO_SETTINGS_MODULE', 'baseball_organisator.settings') + try: + from django.core.management import execute_from_command_line + except ImportError as exc: + raise ImportError( + "Couldn't import Django. Are you sure it's installed and " + "available on your PYTHONPATH environment variable? Did you " + "forget to activate a virtual environment?" + ) from exc + execute_from_command_line(sys.argv) + + +if __name__ == '__main__': + main()