From ec07bfc53b627a29b4475c18922296d68ed274d0 Mon Sep 17 00:00:00 2001 From: Matthias Nagel Date: Thu, 2 Oct 2025 16:25:20 +0200 Subject: [PATCH] feat: Implementierung von Spielergebnissen, Heimspiel-Status und Zeitzonen-Fix --- .../__pycache__/middleware.cpython-313.pyc | Bin 0 -> 1073 bytes .../__pycache__/settings.cpython-313.pyc | Bin 2744 -> 2796 bytes baseball_organisator/middleware.py | 14 +++ baseball_organisator/settings.py | 1 + calendars/__pycache__/forms.cpython-313.pyc | Bin 3829 -> 5345 bytes calendars/__pycache__/models.cpython-313.pyc | Bin 4284 -> 4285 bytes calendars/__pycache__/urls.cpython-313.pyc | Bin 1317 -> 1432 bytes calendars/__pycache__/views.cpython-313.pyc | Bin 8164 -> 10073 bytes calendars/forms.py | 22 ++++- .../0005_game_number_of_innings_and_more.py | 23 +++++ ...number_of_innings_and_more.cpython-313.pyc | Bin 0 -> 980 bytes calendars/models.py | 4 +- .../templates/calendars/record_results.html | 55 ++++++++++++ calendars/urls.py | 1 + calendars/views.py | 41 ++++++++- dashboard/__pycache__/views.cpython-313.pyc | Bin 4769 -> 4961 bytes dashboard/templates/dashboard/dashboard.html | 31 ++++++- dashboard/views.py | 4 +- db.sqlite3 | Bin 311296 -> 311296 bytes docs/traceback/trace10.log | 36 ++++++++ docs/traceback/trace11.log | 82 ++++++++++++++++++ docs/traceback/trace9.log | 77 ++++++++++++++++ templates/base.html | 1 + 23 files changed, 384 insertions(+), 8 deletions(-) create mode 100644 baseball_organisator/__pycache__/middleware.cpython-313.pyc create mode 100644 baseball_organisator/middleware.py create mode 100644 calendars/migrations/0005_game_number_of_innings_and_more.py create mode 100644 calendars/migrations/__pycache__/0005_game_number_of_innings_and_more.cpython-313.pyc create mode 100644 calendars/templates/calendars/record_results.html create mode 100644 docs/traceback/trace10.log create mode 100644 docs/traceback/trace11.log create mode 100644 docs/traceback/trace9.log diff --git a/baseball_organisator/__pycache__/middleware.cpython-313.pyc b/baseball_organisator/__pycache__/middleware.cpython-313.pyc new file mode 100644 index 0000000000000000000000000000000000000000..3a7fd3fe2ed689844688861747839d45d890138a GIT binary patch literal 1073 zcmZ`%%}*0S6o0ebmI{jnm8b}~G#*$q^q|}f2NOL=sD`zP2_}=J9m?W4&TpN35EL zQ>|}Gq-|@n4iA767r5aPo^g#~;3jhNtZVXIJ?rGuse2ukIlop5*kg~geXOq9xild| zoY7xTLQH|sQrV-_=7 z=~)lj&vScygP*N4JJ#r?HTtslDtr;XxwSQRb=$i34c!+vt&1P6@!i7dor3+LV81@Q zRdC+t9ez?%a3m``J-BA9M_=7bX&Bd<0b+~N)utD8A_Yp9d@iK!n?*6D+(L#St<(^u zLVD7#Qcp_mFE%9;lx{$J2{y-Z|B1pi3OxD@4h)iYe&ll5$utpj9Fq@fqpaGB7uDmb wrt|}mOgW_((ZM5HmA{@=JHy9x03U$BioRzEA)lb{3yl9Xd&%ShXq6oM1sD$OjQ{`u literal 0 HcmV?d00001 diff --git a/baseball_organisator/__pycache__/settings.cpython-313.pyc b/baseball_organisator/__pycache__/settings.cpython-313.pyc index fb1f5f97ec5fc0dc2a4848bdeaad9fc4693a6447..a362f9d00c3fd9a65ecf61ec24a15b5ef81fab45 100644 GIT binary patch delta 87 zcmdlX`bL!ZGcPX}0}$M(yq8hGk++$oReoOT<_FAwSlK!Gm>Re~h)sUXc@+RL?jOVe delta 49 zcmaDOx7fK6rNe{uGhc$Gl^{yFis#W&?Gb@6)Hgi5r-sA3SLa9_*opYF#%^SW}UR+ zVooTihhj~ul2dZ!&>xAOTUDwm4pqAWsfkulsKkLBDggn}W9NEKPD#9wahq2xY>#6c{8y^$;PvK;=bbVtW$VCAr3a;4oRAsBw>LtiU z#f~(VCll5Z22OOOzA3{jILa}S9yiC$tRwcPCk)36m^7@(T;Wy+PGWfjGbi=8rUeD# zW?FKM;3$3Qio|z<{4IcH1|v6pqy?C*0NVgs=|-_t-3(+5fZOf>3N{eFe-}_b4)mh< zmCS`cx>@>@zO97(HJ}MGNRS4)OFl8!2m&5YRsIzZbTYtp02ScB!tp%1=`V7mXWcuH zHrTT+yH1b+_<`6Bz_)d>EF-kX{RA?tdo@#LqGA$e3HQ>^lzRHL5*A3D{-}%;|1Whn zxPF7w_c6OL`&(5EuA;^2(6sbSK(z(o6SaD1OHK(Mp2(1vt1<(%A0kCpOj{jgj zpEJ^CV%*4`BL_kG+I!mz+P(CV=Q}Sy5#TeWnho>^@3**~PWgVt12o}pe#gTUjypek z!N?RWM;;r`6%10opnj%OB}cT3+?XS#NtWp^egsc4Ka5^w^#p2?*xD`Vtxx_%QAb`r>fPUs~(LLZp+(Vqeb zi#!bQ8TMaU;y=_f9RC^gIXZ<1)({aiOkBM61lD@4E}?8k#1z_tH8F}VC`8gEBBxLf zChiub%1&^##}ce1m!NT0f(5|=WCm-wk(x?Fk;s}r+*ucE+q$)T+lGxodWkn3oXp5; z+CpKvH>s^N%nqDcQ0!1!(P?S1W^3K6m6fR^$4n47hB{n+jA_Z&`K~*KPBU2?rEmvI z35Reuj-iw*34OV4L8-$^v&5N&LZ5o;XwqFLnqtaDui%huO7F)jB$KV0BuwcfMCD5p zn5w$Mtv)pYDz|bWb?ESEgiQHlZN(xPqLpc}Ko}@SS zN6Mu~jU0gi;JC-RT6ZM6!s^14#)Hpt0oSXaq93qM}ab%A^=e_17=mXjzDM%tt%E**zcK^IJ{V^nrVA zoeOQfciMVyH`qs$_7Tn2QucA(PMx*SrtSVwdxFfjS<{C;9lADjqjhe}T-{u;&kpaH z_wT&dzGtERz@7F3w_EL`W*W0*wgeJ$+#asudc;Y_Ya zNu9qzqZh^C8ROZ5@kZ9DG4aC9#BeYs#`mTb69MBU`^$U3_vU@go6pu(yZOy9Gy>oI z!pGb9l&Trqw?V2s$#{ZfNj7*zx-2s}L1H9HvY}Rzm2T2ZV|Bf)K^2q?l=7R>1f>F{ z)v4-pNezRpgC2uZr;ItnGB+`wMg7ohnH9ZFidw)Ajox)i3%+ud4; zgd{-vX_$4Q(uHss;RwGL?6wY~cnCrGS}5Ux+WBKB;hdPp9|fODBB;iv^iFe#_U5lfv{bZuMd~Yu9GXJ3XVI&hS0d@9iBrg0`}{@09Yox zS6kIY4QR+$o1*-O_L4^VYWOW3=SzBL99PSi%hU5te!=sl*@C;^u-cua_$$3NF^&$Z zZRg#b=h?Ow0zCoWQtbjJ_;-CiE^^@5EOSSPykc}pn1)UACr0w@B@`zRa4CGF9y;&1 zu5H5=Wq|eY=?vB~jG*htLvvUcSx`+|CjS!YD*AffU7Ys%isc!{^_b{IokS%C53sh@ zVneWfKPX5MuD(VP7`Mn*1|Y(s>s(~FK*ikN4S=r!O6dm@`$VjF#Nw6a(eM_L=ol3{ F_6yi8-RuAW diff --git a/calendars/__pycache__/models.cpython-313.pyc b/calendars/__pycache__/models.cpython-313.pyc index b6336c482446e5bc16f864aa4ea8ea82b819224a..6935a5210fcb2b3c05ae72710c7af5bb8457ca53 100644 GIT binary patch delta 525 zcmdm^xL1+yGcPX}0}!mpxtFnyeIwshcIICU43iBRgC<*WBu!3c6q{VY!N$rP!xAJj z`2v^d(=jNuAqv1Bab4rY~N zDB=lbE8JK zE%xM${LJLk;v$F1Htdpwk|sZA6q|g3gNv0fn5T$; z@_i0DM$O6pIGiT`=98Wr%~?G8A*U;2_GERg$jKAAOqol-I@KqC;IgO>W(j5uX0v1} z;tFP$VkqJc<|yJx=hWo7#pRxun;Mi_T$)qzQW0qLEw&;sr$_+EDdGSURc6llxw(nD z#i<2}MTsS;DGJ5O`9MVq1*t^}nR$7cdFeU|se0*pItuEBx&}H1x<)$2x`yhSK+8Y| za%QCFuoc9Yq*jznPUK$9$UE7QQ*yE#j}&Jh$O>&BG1-?#%i9OU0}&u+6dM7FHijGA zg4em_FLBE+VA;U7oo^%GiHM8bVGS-1M5V8bs$LRR-5`9yq2i)wWrN>W7DiUhB9Pu9 zpUwMuLK($kfox4?h$GmOGx9T&Q;Uo2C)=<~PIl&-ES(6H)&t^Vb|3+?N=mz%AEG~P z@<%>b*<_$_5gUj|0TCc~-eM~*Nh~QXE=rpm&m+MW1`-dOT*#lx7&iGnf1nE33t&+z zkQCT4@*sU2Ho5sJr8%i~MY)qh1S|~M7*iQLOusOI=r00njG7a~rpru}0SRb=_&PJh P=F7~K`3mIgfQ;=lkOl=1oAM)jSHS}}}D48fu?%t2Bx1qeD= zESSxbS)a3rFI`+yV)F||Pey|(>GZ_hRDGMwyb>!AD?T&DPQNI%xHPAvSig#|C^b31 zC`A`4;HSwy*@Sr=KU6p#Dm?iib1auQ&>lu0E`B-LgXN;aO%{#|oN6mruWQ&`)UdhW U9DI=_P{!vy8`XC*a_Dmu@urJvif!g%@?>Q8 o)8w1n%)D;0BTEdI7*HW25Eoyayqx7C&j&$Hex^q5A`zev07o_zbpQYW diff --git a/calendars/__pycache__/views.cpython-313.pyc b/calendars/__pycache__/views.cpython-313.pyc index 432848a8decaf91b6cb6884aec1c56681b0fc47f..bb6c7072c5886b16ef61e614ddcf03b59438dec7 100644 GIT binary patch delta 3618 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 +
+
+
+

Record Results for {{ game.title }}

+
+
+
+ {% csrf_token %} + + + + + {% for item in form_fields_by_inning %} + + {% endfor %} + + + + + + {% for item in form_fields_by_inning %} + + {% endfor %} + + + + {% for item in form_fields_by_inning %} + + {% endfor %} + + +
Team{{ item.inning }}
+ {% if game.is_home_game %} + {{ game.team.name }} (Home) + {% else %} + {{ game.opponent }} (Home) + {% endif %} + {{ item.home }}
+ {% if not game.is_home_game %} + {{ game.team.name }} (Guest) + {% else %} + {{ game.opponent }} (Guest) + {% endif %} + {{ item.guest }}
+ +
+
+
+
+ +{% endblock %} diff --git a/calendars/urls.py b/calendars/urls.py index f87647a..2e3762e 100644 --- a/calendars/urls.py +++ b/calendars/urls.py @@ -10,4 +10,5 @@ urlpatterns = [ path('event//delete/', views.EventDeleteView.as_view(), name='event-delete'), path('participation////', views.manage_participation, name='manage-participation'), path('game//open/', views.open_game, name='open-game'), + path('game//results/', views.record_results, name='record-results'), ] diff --git a/calendars/views.py b/calendars/views.py index e7225ff..ae8bd13 100644 --- a/calendars/views.py +++ b/calendars/views.py @@ -3,8 +3,8 @@ from django.views.generic.edit import CreateView, UpdateView, DeleteView from django.contrib.auth.mixins import LoginRequiredMixin, UserPassesTestMixin from django.contrib.auth.decorators import login_required from django.urls import reverse_lazy -from .models import Event, Training, Game, EventParticipation -from .forms import EventForm, TrainingForm, GameForm, OpenGameForm +from .models import Event, Training, Game, EventParticipation, GameResult +from .forms import EventForm, TrainingForm, GameForm, OpenGameForm, GameResultForm from accounts.models import CustomUser # Import CustomUser for manage_participation view from django.utils import timezone import datetime @@ -142,4 +142,39 @@ def open_game(request, game_id): else: form = OpenGameForm(club=club) - return render(request, 'calendars/open_game.html', {'form': form, 'game': game}) \ No newline at end of file + return render(request, 'calendars/open_game.html', {'form': form, 'game': game}) + +@login_required +def record_results(request, game_id): + game = get_object_or_404(Game, id=game_id) + game_result, created = GameResult.objects.get_or_create(game=game) + + if request.method == 'POST': + form = GameResultForm(request.POST, game=game, instance=game_result) + if form.is_valid(): + inning_results = {} + for i in range(1, game.number_of_innings + 1): + inning_results[f'inning_{i}'] = { + 'home': form.cleaned_data.get(f'inning_{i}_home'), + 'guest': form.cleaned_data.get(f'inning_{i}_guest'), + } + game_result.inning_results = inning_results + game_result.save() + return redirect('dashboard') + else: + initial_data = {} + if game_result.inning_results: + for inning, scores in game_result.inning_results.items(): + initial_data[f'{inning}_home'] = scores.get('home') + initial_data[f'{inning}_guest'] = scores.get('guest') + form = GameResultForm(game=game, instance=game_result, initial=initial_data) + + form_fields_by_inning = [] + for i in range(1, game.number_of_innings + 1): + form_fields_by_inning.append({ + 'inning': i, + 'home': form[f'inning_{i}_home'], + 'guest': form[f'inning_{i}_guest'], + }) + + return render(request, 'calendars/record_results.html', {'form': form, 'game': game, 'form_fields_by_inning': form_fields_by_inning}) \ No newline at end of file diff --git a/dashboard/__pycache__/views.cpython-313.pyc b/dashboard/__pycache__/views.cpython-313.pyc index 572cd02ea36a88e9193f3fbbcf81a701dde6edb0..dd92471b5a7fef64aeb88ba2dbef6301ee813f0c 100644 GIT binary patch delta 654 zcmZWj&ui0Q7|xs4q(71@?dG=hcgxacwd>ls!6t0fZdj#Nq$Rr)tzpY>(55rVU_1K< zh<*n_5EMKqh?0v6p7m(ALrW1+@S?X;#hdu0vcvR+_x+yd`JRXOeJp-SvICa&5V-E_ zf4ceYE_>*;nFIG=)%EiG3c!jbkpS?v`!%9E8fv`Yv4)sYN!{1+pNaQQ9DQ?sy+G-{C+<_Iky3+O3T1p)o01PG!Oc^2a` zEu0F;K{}AfI>LtK@F;N+Z`PRF1(YVk;-&wukOi5kjxLjXB=$wLs2o5%H31Qn zb`gdDS8xqbpr=((qQdaTjfR2p@|RCKd$?ljf@2g} zP!3eRZmLSt&@;B4MNW1OX3zqwjP>|`PtYZFpDhQc?J&KmtBR>^VbIb{b>B4NSVq8w z5zjeMg!6eeut4KBo>*qJZ1=L<*CwGT|_Gb47GbelwT8aaK8we9qH$Y@z9TT3-MFHmwd;b6?a-Mtu delta 495 zcmaE;wosM#GcPX}0}x1t-OGrd$a{&K6Ubo(;?ED*H@>oEWaQhd!NkbO*u7bc`3cix zKQ;xSV17MTQ$~;`1_lKNcShg7$@AEB8676au^4i{U|`6T&}Yb#43(J7!5+*gF*$}^ zl2K~17L&2OL=X!^7cv<77?_IbNAi8DRzw3!q6n(N2?fm}FI5 zk##`Wp%S4y!NQhIrA$C|vUzf$l9L12#2IBL_i^YlO8|NMINSy0qupUTLm7g_L*+M% zaeifFWSz{z9Xz>|dnU6=k?Lka9s$O1ZJ@eaEGdbV#YHMWW)T~R&zqiF5}#ibpInrh zSdv-<3KmU;TkJ)tg{7&*B}J+rg_-rpHXA- zKHfy8BK66}d_Ih7lNhqhwJJi)2xuRXb4sF^WnGPkf4W7K3d ZVO23#Mn(t5&&&)=0w0;c?4n4ZS^x=1X(s>x diff --git a/dashboard/templates/dashboard/dashboard.html b/dashboard/templates/dashboard/dashboard.html index b464f9d..393e8ba 100644 --- a/dashboard/templates/dashboard/dashboard.html +++ b/dashboard/templates/dashboard/dashboard.html @@ -53,7 +53,10 @@ {% if user == item.event.team.head_coach or user in item.event.team.assistant_coaches.all %} Edit Delete - + + {% if item.event.game %} + + {% endif %} {% if item.event.game and item.days_until_event >= 0 and item.days_until_event < 7 and item.accepted_count < item.required_players and item.event.team.club.teams.count > 1 %} Open Game {% endif %} @@ -137,4 +140,30 @@ {% endif %} {% endfor %} {% endif %} +{% endblock %} + +{% block javascript %} + {% endblock %} \ No newline at end of file diff --git a/dashboard/views.py b/dashboard/views.py index 95a08c4..32fcebd 100644 --- a/dashboard/views.py +++ b/dashboard/views.py @@ -46,13 +46,15 @@ def dashboard(request): player_participations.append({'player': player, 'status': status}) days_until_event = (event.start_time - timezone.now()).days + local_start_time = timezone.localtime(event.start_time) events_with_participation.append({ 'event': event, 'accepted_count': accepted_count, 'required_players': required_players, 'player_participations': player_participations, - 'days_until_event': days_until_event + 'days_until_event': days_until_event, + 'local_start_time_iso': local_start_time.isoformat() }) # Get children's events diff --git a/db.sqlite3 b/db.sqlite3 index ada38563211112cee3acf9184fbf0388ed4d7cf3..95ffddaf48896eae126ed5016e238e02eaed32b3 100644 GIT binary patch delta 1050 zcmZ{i%S#(k6vpq(oy;SenTVG7h;@v#bwK0fF;Sxxf_J_bLJC!=UD!5Yw*3oS*zUS0-4*Gw;G#%7*47S!ix18@_s4fW4mX)BP9}>t zDvA~X00B+Snhcr-H|yMR@!ilX4%z5$Daz6a>3mTZy{5YZHY2DC`A5Q2iaHvO#YIt+ z+(Vywl}#dVHQHM`M#ya*H`{ z**-~FSdmE4{AB~1&N)SzO^J?4$_T6$Br*6y8kJB0RFJ3zVl@b@sZWk$Xj?jHSUqTf znhf}$0XbN+mK$-KfcwntahtiK*yGxW8GBt+N0RxTrjH$AVgBi+)dirvysK+cwaQnE(Jz=KPij%pYZt>1&m-6BHsJV4s?Y3X=uf zCLhyAN2x6GQ6t7T#$gRDN2XoS*`b!MA`|XQZydR{jk_49r@Ru~Ihh4f& z`)Neth76MM;Tlnfw=$>~hcl=+lu#Zf`0k#5zB?2M@a=bQws-NhwVlD9Zuy=+&~c;I ze)>STmOj$jBjDo?$!@ zND?o**q)&%nUo1H`64%mlo+DW;b)fSG@HyWV7}Q<;RnZNGs$yo zEc|>1Op`ejF0n1qs8>bBqoXJ3%XcXrvGncvF6Ln%gfA5k1t9sF3l+^p5D;HBE^!P zn43DiU>39J^x!s@Kt|2&-{&!NJ(Ok-WZ+_*$iUaZo50h+y^PC>(~cvbeF5u4_TG?UuC5b5|3c<-4iFsA2MK(qTMy6cL9GC?F+s24d diff --git a/docs/traceback/trace10.log b/docs/traceback/trace10.log new file mode 100644 index 0000000..941bd7a --- /dev/null +++ b/docs/traceback/trace10.log @@ -0,0 +1,36 @@ +Hiding button for event starting at + +DOM fully loaded and parsed 127.0.0.1:8000:720:13 +GET +http://127.0.0.1:8000/favicon.ico +[HTTP/1.1 404 Not Found 0ms] + +Found buttons: 3 127.0.0.1:8000:722:13 +Current client time: +Date Thu Oct 02 2025 15:02:08 GMT+0200 (Mitteleuropäische Sommerzeit) +127.0.0.1:8000:724:13 +Button start time string: 2025-10-02T13:10:00+00:00 127.0.0.1:8000:728:17 +Button start time object: +Date Thu Oct 02 2025 15:10:00 GMT+0200 (Mitteleuropäische Sommerzeit) +127.0.0.1:8000:730:17 +Hiding button for event starting at +Date Thu Oct 02 2025 15:10:00 GMT+0200 (Mitteleuropäische Sommerzeit) +127.0.0.1:8000:736:21 +Button start time string: 2025-10-05T19:00:00+00:00 127.0.0.1:8000:728:17 +Button start time object: +Date Sun Oct 05 2025 21:00:00 GMT+0200 (Mitteleuropäische Sommerzeit) +127.0.0.1:8000:730:17 +Hiding button for event starting at +Date Sun Oct 05 2025 21:00:00 GMT+0200 (Mitteleuropäische Sommerzeit) +127.0.0.1:8000:736:21 +Button start time string: 2025-10-06T17:47:00+00:00 127.0.0.1:8000:728:17 +Button start time object: +Date Mon Oct 06 2025 19:47:00 GMT+0200 (Mitteleuropäische Sommerzeit) +127.0.0.1:8000:730:17 +Hiding button for event starting at +Date Mon Oct 06 2025 19:47:00 GMT+0200 (Mitteleuropäische Sommerzeit) +127.0.0.1:8000:736:21 +Source-Map-Fehler: request failed with status 404 +Ressourcen-Adresse: http://127.0.0.1:8000/static/js/bootstrap.bundle.min.js +Source-Map-Adresse: bootstrap.bundle.min.js.map + diff --git a/docs/traceback/trace11.log b/docs/traceback/trace11.log new file mode 100644 index 0000000..e7bb75c --- /dev/null +++ b/docs/traceback/trace11.log @@ -0,0 +1,82 @@ +[02/Oct/2025 13:07:49] "GET / HTTP/1.1" 200 27859 +[02/Oct/2025 13:07:52] "GET / HTTP/1.1" 200 27859 +[02/Oct/2025 13:07:53] "GET / HTTP/1.1" 200 27859 +[02/Oct/2025 13:07:53] "GET / HTTP/1.1" 200 27859 +[02/Oct/2025 13:07:53] "GET / HTTP/1.1" 200 27859 +[02/Oct/2025 13:08:01] "GET / HTTP/1.1" 200 27859 +[02/Oct/2025 13:08:01] "GET /static/js/bootstrap.bundle.min.js.map HTTP/1.1" 404 1904 +[02/Oct/2025 13:08:13] "GET /static/js/bootstrap.bundle.min.js.map HTTP/1.1" 404 1904 +[02/Oct/2025 13:08:15] "GET / HTTP/1.1" 200 27859 +[02/Oct/2025 13:08:15] "GET /static/js/bootstrap.bundle.min.js.map HTTP/1.1" 404 1904 +/home/mnagel/Projekte/baseball_organisator/baseball_organisator/settings.py changed, reloading. +Watching for file changes with StatReloader +Performing system checks... + +System check identified no issues (0 silenced). +Exception in thread django-main-thread: +Traceback (most recent call last): + File "/home/mnagel/Projekte/baseball_organisator/venv/lib64/python3.13/site-packages/django/core/servers/basehttp.py", line 48, in get_internal_wsgi_application + return import_string(app_path) + File "/home/mnagel/Projekte/baseball_organisator/venv/lib64/python3.13/site-packages/django/utils/module_loading.py", line 30, in import_string + return cached_import(module_path, class_name) + File "/home/mnagel/Projekte/baseball_organisator/venv/lib64/python3.13/site-packages/django/utils/module_loading.py", line 15, in cached_import + module = import_module(module_path) + File "/usr/lib64/python3.13/importlib/__init__.py", line 88, in import_module + return _bootstrap._gcd_import(name[level:], package, level) + ~~~~~~~~~~~~~~~~~~~~~~^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "", line 1387, in _gcd_import + File "", line 1360, in _find_and_load + File "", line 1331, in _find_and_load_unlocked + File "", line 935, in _load_unlocked + File "", line 1026, in exec_module + File "", line 488, in _call_with_frames_removed + File "/home/mnagel/Projekte/baseball_organisator/baseball_organisator/wsgi.py", line 16, in + application = get_wsgi_application() + File "/home/mnagel/Projekte/baseball_organisator/venv/lib64/python3.13/site-packages/django/core/wsgi.py", line 13, in get_wsgi_application + return WSGIHandler() + File "/home/mnagel/Projekte/baseball_organisator/venv/lib64/python3.13/site-packages/django/core/handlers/wsgi.py", line 118, in __init__ + self.load_middleware() + ~~~~~~~~~~~~~~~~~~~~^^ + File "/home/mnagel/Projekte/baseball_organisator/venv/lib64/python3.13/site-packages/django/core/handlers/base.py", line 40, in load_middleware + middleware = import_string(middleware_path) + File "/home/mnagel/Projekte/baseball_organisator/venv/lib64/python3.13/site-packages/django/utils/module_loading.py", line 30, in import_string + return cached_import(module_path, class_name) + File "/home/mnagel/Projekte/baseball_organisator/venv/lib64/python3.13/site-packages/django/utils/module_loading.py", line 15, in cached_import + module = import_module(module_path) + File "/usr/lib64/python3.13/importlib/__init__.py", line 88, in import_module + return _bootstrap._gcd_import(name[level:], package, level) + ~~~~~~~~~~~~~~~~~~~~~~^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "", line 1387, in _gcd_import + File "", line 1360, in _find_and_load + File "", line 1331, in _find_and_load_unlocked + File "", line 935, in _load_unlocked + File "", line 1026, in exec_module + File "", line 488, in _call_with_frames_removed + File "/home/mnagel/Projekte/baseball_organisator/baseball_organisator/middleware.py", line 1, in + import pytz +ModuleNotFoundError: No module named 'pytz' + +The above exception was the direct cause of the following exception: + +Traceback (most recent call last): + File "/usr/lib64/python3.13/threading.py", line 1043, in _bootstrap_inner + self.run() + ~~~~~~~~^^ + File "/usr/lib64/python3.13/threading.py", line 994, in run + self._target(*self._args, **self._kwargs) + ~~~~~~~~~~~~^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/home/mnagel/Projekte/baseball_organisator/venv/lib64/python3.13/site-packages/django/utils/autoreload.py", line 64, in wrapper + fn(*args, **kwargs) + ~~^^^^^^^^^^^^^^^^^ + File "/home/mnagel/Projekte/baseball_organisator/venv/lib64/python3.13/site-packages/django/core/management/commands/runserver.py", line 143, in inner_run + handler = self.get_handler(*args, **options) + File "/home/mnagel/Projekte/baseball_organisator/venv/lib64/python3.13/site-packages/django/contrib/staticfiles/management/commands/runserver.py", line 31, in get_handler + handler = super().get_handler(*args, **options) + File "/home/mnagel/Projekte/baseball_organisator/venv/lib64/python3.13/site-packages/django/core/management/commands/runserver.py", line 73, in get_handler + return get_internal_wsgi_application() + File "/home/mnagel/Projekte/baseball_organisator/venv/lib64/python3.13/site-packages/django/core/servers/basehttp.py", line 50, in get_internal_wsgi_application + raise ImproperlyConfigured( + ...<2 lines>... + ) from err +django.core.exceptions.ImproperlyConfigured: WSGI application 'baseball_organisator.wsgi.application' could not be loaded; Error importing module. + diff --git a/docs/traceback/trace9.log b/docs/traceback/trace9.log new file mode 100644 index 0000000..116922d --- /dev/null +++ b/docs/traceback/trace9.log @@ -0,0 +1,77 @@ +For more information on production servers see: https://docs.djangoproject.com/en/5.2/howto/deployment/ +/home/mnagel/Projekte/baseball_organisator/calendars/forms.py changed, reloading. +Watching for file changes with StatReloader +Performing system checks... + +Exception in thread django-main-thread: +Traceback (most recent call last): + File "/usr/lib64/python3.13/threading.py", line 1043, in _bootstrap_inner + self.run() + ~~~~~~~~^^ + File "/usr/lib64/python3.13/threading.py", line 994, in run + self._target(*self._args, **self._kwargs) + ~~~~~~~~~~~~^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/home/mnagel/Projekte/baseball_organisator/venv/lib64/python3.13/site-packages/django/utils/autoreload.py", line 64, in wrapper + fn(*args, **kwargs) + ~~^^^^^^^^^^^^^^^^^ + File "/home/mnagel/Projekte/baseball_organisator/venv/lib64/python3.13/site-packages/django/core/management/commands/runserver.py", line 134, in inner_run + self.check(**check_kwargs) + ~~~~~~~~~~^^^^^^^^^^^^^^^^ + File "/home/mnagel/Projekte/baseball_organisator/venv/lib64/python3.13/site-packages/django/core/management/base.py", line 492, in check + all_issues = checks.run_checks( + app_configs=app_configs, + ...<2 lines>... + databases=databases, + ) + File "/home/mnagel/Projekte/baseball_organisator/venv/lib64/python3.13/site-packages/django/core/checks/registry.py", line 89, in run_checks + new_errors = check(app_configs=app_configs, databases=databases) + File "/home/mnagel/Projekte/baseball_organisator/venv/lib64/python3.13/site-packages/django/core/checks/urls.py", line 16, in check_url_config + return check_resolver(resolver) + File "/home/mnagel/Projekte/baseball_organisator/venv/lib64/python3.13/site-packages/django/core/checks/urls.py", line 26, in check_resolver + return check_method() + File "/home/mnagel/Projekte/baseball_organisator/venv/lib64/python3.13/site-packages/django/urls/resolvers.py", line 531, in check + for pattern in self.url_patterns: + ^^^^^^^^^^^^^^^^^ + File "/home/mnagel/Projekte/baseball_organisator/venv/lib64/python3.13/site-packages/django/utils/functional.py", line 47, in __get__ + res = instance.__dict__[self.name] = self.func(instance) + ~~~~~~~~~^^^^^^^^^^ + File "/home/mnagel/Projekte/baseball_organisator/venv/lib64/python3.13/site-packages/django/urls/resolvers.py", line 718, in url_patterns + patterns = getattr(self.urlconf_module, "urlpatterns", self.urlconf_module) + ^^^^^^^^^^^^^^^^^^^ + File "/home/mnagel/Projekte/baseball_organisator/venv/lib64/python3.13/site-packages/django/utils/functional.py", line 47, in __get__ + res = instance.__dict__[self.name] = self.func(instance) + ~~~~~~~~~^^^^^^^^^^ + File "/home/mnagel/Projekte/baseball_organisator/venv/lib64/python3.13/site-packages/django/urls/resolvers.py", line 711, in urlconf_module + return import_module(self.urlconf_name) + File "/usr/lib64/python3.13/importlib/__init__.py", line 88, in import_module + return _bootstrap._gcd_import(name[level:], package, level) + ~~~~~~~~~~~~~~~~~~~~~~^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "", line 1387, in _gcd_import + File "", line 1360, in _find_and_load + File "", line 1331, in _find_and_load_unlocked + File "", line 935, in _load_unlocked + File "", line 1026, in exec_module + File "", line 488, in _call_with_frames_removed + File "/home/mnagel/Projekte/baseball_organisator/baseball_organisator/urls.py", line 25, in + path('calendars/', include('calendars.urls')), + ~~~~~~~^^^^^^^^^^^^^^^^^^ + File "/home/mnagel/Projekte/baseball_organisator/venv/lib64/python3.13/site-packages/django/urls/conf.py", line 39, in include + urlconf_module = import_module(urlconf_module) + File "/usr/lib64/python3.13/importlib/__init__.py", line 88, in import_module + return _bootstrap._gcd_import(name[level:], package, level) + ~~~~~~~~~~~~~~~~~~~~~~^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "", line 1387, in _gcd_import + File "", line 1360, in _find_and_load + File "", line 1331, in _find_and_load_unlocked + File "", line 935, in _load_unlocked + File "", line 1026, in exec_module + File "", line 488, in _call_with_frames_removed + File "/home/mnagel/Projekte/baseball_organisator/calendars/urls.py", line 2, in + from . import views + File "/home/mnagel/Projekte/baseball_organisator/calendars/views.py", line 7, in + from .forms import EventForm, TrainingForm, GameForm, OpenGameForm + File "/home/mnagel/Projekte/baseball_organisator/calendars/forms.py", line 1, in + class GameResultForm(forms.ModelForm): + ^^^^^ +NameError: name 'forms' is not defined. Did you mean: 'format'? + diff --git a/templates/base.html b/templates/base.html index 8278537..4abc5c9 100644 --- a/templates/base.html +++ b/templates/base.html @@ -61,5 +61,6 @@ + {% block javascript %}{% endblock %}