From 8c388b6ef3f6008d355c003aae74933f0840bea8 Mon Sep 17 00:00:00 2001 From: Matthias Nagel Date: Wed, 1 Oct 2025 11:35:50 +0200 Subject: [PATCH] feat: Verschiebung des 'Spieler erstellen'-Links in die Navbar und Behebung des Datumsformatfehlers --- accounts/__pycache__/forms.cpython-313.pyc | Bin 3505 -> 3690 bytes accounts/forms.py | 6 +- calendars/__pycache__/forms.cpython-313.pyc | Bin 805 -> 2706 bytes calendars/__pycache__/urls.cpython-313.pyc | Bin 691 -> 1061 bytes calendars/__pycache__/views.cpython-313.pyc | Bin 2938 -> 4628 bytes calendars/forms.py | 18 ++++- .../calendars/select_event_type.html | 10 +++ calendars/urls.py | 5 +- calendars/views.py | 39 +++++++++- dashboard/templates/dashboard/dashboard.html | 10 ++- db.sqlite3 | Bin 266240 -> 266240 bytes docs/traceback/trace4.log | 73 ++++++++++++++++++ templates/base.html | 7 +- 13 files changed, 156 insertions(+), 12 deletions(-) create mode 100644 calendars/templates/calendars/select_event_type.html create mode 100644 docs/traceback/trace4.log diff --git a/accounts/__pycache__/forms.cpython-313.pyc b/accounts/__pycache__/forms.cpython-313.pyc index 28b52920950344cb32342abf25fe40dad7549565..36bb4d7dc53b6a134cb3348d46d572325c6225ba 100644 GIT binary patch delta 890 zcmbV~OKTHR6vyY@&P?vSYAk69Mq7=BI+irX+S-WGR;x7+OzK6bBGhPNEHpN`8NmmL zD?fl2bSGW7ao6I;&)_P!P#Ik4(z;Qr2(COQfz(Ao=z;sY=gfW0|Ib;AtnYR<9LH23 z?tcAv>&Ke2qL~a!h>aI=g}L&RHo>@>pjXw4eR7WU$9uTO^}~b*Qk1h46=qn8D%{wm zaC4k?jtYxg!miq`Bj@$x@E;bt9FNuFv9hmv_v#g2EtkB?OX}-4mqo4Q`C7^IMDvx@ zO+u3Ld0>#FWzaq#KL`5vrQk~6n1KW57As5TPMW!0zvGExuq4uQ*$&GD>m}FZNfsS@ zooyv%Tg6N7iwkdy3$1G7o1#1*(-fvNG=tN9lBM4jWsc-<>dRBvV6jcvb&x%x@}2|* z?E^&h)fUN51=)EuC)e$1z3qQaCY?QGUKX6|e*w~$#B%@u delta 688 zcmaDQvr(G&GcPX}0}#AFeJ7)BBkuxME_M(X2tLo5EYGbu`2njLlRo3*K5j{M=3o{} z#$Z-UrXns01|^1IHYtW+c2g#Z@*?hFjv}6PPED@K32cU3D;aOGrR5jpCYEg8!N$d? zpbJzb0>s5UK%$M|hJaKD>kYx2Znh#Npg@u3FQ<786-I+O+IPY z%q@}zGX09oCOdKn8(4xAI06YNApVTvuMD`qKx)96fZr1i8pCgR$yST!DEdb z7#JMzz~Bz%1jZVdCimnk+=kG=2;`CDaR!=+>|05&Z@qz{${-n65CM-le*tVh;&%rr z0ugdRT!y^q|-&vSgGa0`yfJlg$?voeuIWTMelcp(wf&>z(CI4pL%-eY%^LuYP zrBZ>w?~9+lJJ&V{`4NTPpT0Bcd;^m!#3r_Oiqtis4HBE$nNzf$5t({cWb3-n2gv{# zB6ju=vGsXvrfc_*y>Tp)&P7gX8laiGho-4CP0-BWLo?qfSj8J?7=LV}Mj#Z~Xo*StKBUN`+$ugU)Hum)q!0zTqL%Z|TJrGY7Q5~({$ zB4Su5d114auyi?=#s{9;;K}5AMmzv^L?3`O1z%}-g1h^YyW=G341&(x$rXAHQu($f z3_BxojjW~1^6d~tr+DIQ<>0e*L+Xi__*@oU9xn^8nRrns3vuFzgrVos)+RcY<{?ZJE+!EQIT4OcodmBDdw^yo<4wmgDd2R2Vz!i8%4SkcSat0xLo4 zpv`^AjK_U9mi>%@^~76dm?CefmGBr;9|P46{E2+Ib}kBdEeM?k_iJy7=sdrW@Y<3S z^CidkStJ@x=*3PFi5esw+;>D=Q`8-8uF5P1F9zTwOhAk@`;6S^?qAbo5Bt&(7A%No z5YXiGdQl9a@HoOSLKOjPPL?L%dS@X?lj!=McoMHvJdApeAgI%x!WkZ!T6h{~`CULx zb*=$`D?JZx_6%?I47ZO?v?t$bzwmB*k#8=>8;kKxLO#~sq%fSOXK;9r1~|;pkp4`F zqeVFMHtD7MjY{8UWoV-^)PDZe_QY)a$m#aN^5(+I#=;7G@R3%>?`%4U!x?%3hZ*YQ z=S)*)en>w-sryrU>BMi8>WkVoK}@|z$M=!({;Bk?-F~Kuy@)rY0Er?>2xWu{LNCCi z=m*@FjDK30J$IT+i&NP+gfXu6!x*cZ?h(Q`LcVcMiMc8Cb-&y4%{!30_SNuDiItF^^ zXpEJB9kg#v|AmrXm;SMd9!RSf(GUWrIR0NZKbKy& z#p+2DsxC2+GCzfn8!{Xqxst8Tf%%*NL^A p)wM?~m9M-;=4CdA53?2MhUlL8`z(~^i0#29{(S+%gCBPKTDN_+wf z8lS<^M=%q306G&eHWuEy3o%ad<(#``&dls%>cx&tqtPY6_4Yox7(qXl-YK9PfC9xz zP-L3rL2)HYyePEDLmIX~Sy@oB!j8lJ*IZXNY$r6K4u=_e-q9_0!shPqrry3fqi>64 z&Bb&Z#Q-XxnF7rf)55RjSS|K=kkXd2v}{PnHW9z7fbA2i`0Mn3Lc87*Pe_Sl#~bn? zOL|I_yYwuYxyy(id?ZqL(yW}^+d7K_y+KGK%8sp9$*d7lgmr=+$dIB`uqj6>v;bYi zjUjsQ&AF_y84!c$Eyb|g*tN^kcB7*OdSkabwR+RlbTJb-B13NqI{%+z!uuG$Zq^TU h9@F$o-A%-&V2q6+J%-H860FJ|SwjE- diff --git a/calendars/__pycache__/urls.cpython-313.pyc b/calendars/__pycache__/urls.cpython-313.pyc index e553981eb5972fcdc1b09e450e17c7a73709153c..1ea891a324af5795da872cc5c63607e22ee6076a 100644 GIT binary patch delta 583 zcmdnYx|BoXGcPX}0}yE6zLTNG#K7OsB-`KEXSkodsN$jEq?LFO)l@JBWVR?ZIj8LHQ%3@=Iu{qHKUXz delta 280 zcmZ3=v6)rlGcPX}0}#AEaVNu?k%8echyw#0P{!w53==ghn1Z+`F-j}52D4c*$1o}} z1hdC52l2qvB51I(iSv~hLCW2^K+5%*i#XD`HF;iwRB1BaVkt;0$#@C04#Z(C%S`4-qCzf} zH%q5>16V+SKt>N~4@PtB(fSYiXNXV%vfBhc^iti5N=Ad8`ra&;q-42{FF9o(JVg?PJpv=?Q5a2+!5Hd7 z(+tK>v)5QYJk9cvVrbFtt^(px8%1rb7%ci1)vkU*>W5H2d_+Gf^*ZWDj_6NG{V3|k zP#-Uhh0CUDc{zo_z$ok(G`-0Q!~ zYuwc*ea_geMx|=y_(#nu@bc~IZ>yFwUJx8UFoob^g$r9MlZq1qewTybM$No`Zy%%1 z@GaWXU2fS4SX3K#|RU>e0E_N$() zfCszibKTCfq%V6vQ8H_|NfX4Jz^#;Q1J`BQhJA07r`GLy4QL`y0{}t6OG;*XBNe#s>e;=5wp2;Hze>W;CE;T2*1%4Vde{;x5Kdq&Dw4qtCnyCUD*m z{)-V5TkOl|=pQcbp1Hmky|Js_I6xgMk?@+gr|uq$43szHesi6dK9telNA$BJ@uDrtc>NPQk63}_ytfSe=DKkkP%%p>D7h{?2lbb_0~1$S zQE)zwU;|Ez-F}WXeXLo&J7YOX*Q17O%Zy!DyxGe$coGafV@JJcl+&Npd2jq7n&j!P zBttNc14nHlNS#52Kq=E~_ zkLQk9Rq<%o;0#U+ub>bV*hC@$ae7hMMhF>eO{?Tg9Xpm(&qUi1c@$f$qmO_7$-__D zdZMK#w$)BlZ%1eFuQPs%Ob;GD*wYhj{X$E>fL49{PY?e1pryaw*0Yb#x968z^ULk| zTdnz9d-K`W6z&YB*gkj*;?P|#|Z5yhqOonUM134d ziGQ7$M0+OHnn|^1=36uKdov5$w>z_E+p||&vsc@*3$59Oz1cUnvz_?aR(yVYsdMG( z=b49@F9NODtACAMLe6eST|N+fc9d*#7+%L7TqHpVfFub@3XX;}Y2Wb^uF z4R2#fWuTPlL`Aby;zAfrr~&O4E=$*LSV|nPCu2u}>!_8t**k7%-XK>JL=Qo0`1&)} ziH&Y8bw;PR(w+F+*6qKIz4FEH_QtMkW&WdvwD?no!d*Q*_^q&c%qsu}2z?G;4k;3I zw2bdai&5yelSm8SM?1`ucnihzm~!UXVE4!(Vfi-AKzE9p{oldfa{x@43Vuw2@`{8n z{DgW0TDVD~2Ud8OhD#_00s0;(Nzifk0U9TO&b|3|=Uy{zFnX8F@nFzxa=h02Iq68ys|4N4&%HW6&A9o3 zyieXXT_w+M8wkEeDkULEp3_}V+#nU?DYI#>r|R?pE`W+42$NT|>xG4ZaBGEt zEGUGmE delta 1069 zcma)*&rcIU6vt=U{n;PeU62M4WTh0kfIkvbNr)0n#55@7(2LO~o3*TfwiIS|y?6jG z+{x(wV4?>TJbCcq#UtKuW5ZQ%B;W-v&YM=ECPp{eZ)U&m&Fp92d;4tUIBOiH(+R|{ zPai%nAIsZDZ|p7FF3fG%s3KR?Tj@E27&huf!>FS5ql#YDigCzCh-8GD;BK<2R^vsf z71A6WDa2<}_)!mz#9t468n6MWVs`P}q=yRyLfdBZvFmJ0%440qlJ3P05!2Tz8fc)?1|^@4z`+z$hvx-K~bCk%r0gBU+W;|mJ1g}%jPc>%YR4Cd*}?7M7Xb0@9L z<1r^z7648nl4-c+lSo_g1NQ;PCKenf5WCq^wHx=c=W1SZG}6c3soA86OhV2%wy)+C z0WiTdZBWj_+u68AHv}3$I=Ji@WC+r2kh37eAW1Hf+-NTPb&>+(A{gnwZ>-h5z;{=@ zhEH_xk~FNaVP%2w5kjuR5XTs|P;MWUKBCe-%9UGaq=ougXy8av@B-e=I!6c= UN2Y;K?Pd!v#@QFEAi>A|09E1GzyJUM diff --git a/calendars/forms.py b/calendars/forms.py index b614b0f..ceb3f5a 100644 --- a/calendars/forms.py +++ b/calendars/forms.py @@ -1,7 +1,23 @@ from django import forms -from .models import Event +from .models import Event, Training, Game class EventForm(forms.ModelForm): + start_time = forms.DateTimeField(input_formats=['%d.%m.%Y %H:%M', '%Y-%m-%dT%H:%M'], widget=forms.DateTimeInput(format='%d.%m.%Y %H:%M', attrs={'type': 'datetime-local'})) + end_time = forms.DateTimeField(input_formats=['%d.%m.%Y %H:%M', '%Y-%m-%dT%H:%M'], widget=forms.DateTimeInput(format='%d.%m.%Y %H:%M', attrs={'type': 'datetime-local'}), required=False) class Meta: model = Event fields = ['title', 'description', 'start_time', 'end_time', 'location_address', 'team'] + +class TrainingForm(forms.ModelForm): + start_time = forms.DateTimeField(input_formats=['%d.%m.%Y %H:%M', '%Y-%m-%dT%H:%M'], widget=forms.DateTimeInput(format='%d.%m.%Y %H:%M', attrs={'type': 'datetime-local'})) + end_time = forms.DateTimeField(input_formats=['%d.%m.%Y %H:%M', '%Y-%m-%dT%H:%M'], widget=forms.DateTimeInput(format='%d.%m.%Y %H:%M', attrs={'type': 'datetime-local'}), required=False) + class Meta: + model = Training + fields = ['title', 'description', 'start_time', 'end_time', 'location_address', 'team'] + +class GameForm(forms.ModelForm): + start_time = forms.DateTimeField(input_formats=['%d.%m.%Y %H:%M', '%Y-%m-%dT%H:%M'], widget=forms.DateTimeInput(format='%d.%m.%Y %H:%M', attrs={'type': 'datetime-local'})) + end_time = forms.DateTimeField(input_formats=['%d.%m.%Y %H:%M', '%Y-%m-%dT%H:%M'], widget=forms.DateTimeInput(format='%d.%m.%Y %H:%M', attrs={'type': 'datetime-local'}), required=False) + class Meta: + model = Game + fields = ['title', 'description', 'start_time', 'end_time', 'location_address', 'team', 'opponent', 'meeting_minutes_before_game', 'season', 'min_players'] diff --git a/calendars/templates/calendars/select_event_type.html b/calendars/templates/calendars/select_event_type.html new file mode 100644 index 0000000..73482f3 --- /dev/null +++ b/calendars/templates/calendars/select_event_type.html @@ -0,0 +1,10 @@ +{% extends "base.html" %} + +{% block content %} +

Select Event Type

+ +{% endblock %} diff --git a/calendars/urls.py b/calendars/urls.py index fae091b..61df0de 100644 --- a/calendars/urls.py +++ b/calendars/urls.py @@ -2,7 +2,10 @@ from django.urls import path from . import views urlpatterns = [ + path('event/select/', views.select_event_type, name='select-event-type'), path('event/add/', views.EventCreateView.as_view(), name='event-add'), + path('training/add/', views.TrainingCreateView.as_view(), name='training-add'), + path('game/add/', views.GameCreateView.as_view(), name='game-add'), path('event//', views.EventUpdateView.as_view(), name='event-update'), path('event//delete/', views.EventDeleteView.as_view(), name='event-delete'), -] \ No newline at end of file +] diff --git a/calendars/views.py b/calendars/views.py index 9f9aa4f..b8f61ee 100644 --- a/calendars/views.py +++ b/calendars/views.py @@ -2,8 +2,11 @@ from django.shortcuts import render from django.views.generic.edit import CreateView, UpdateView, DeleteView from django.contrib.auth.mixins import LoginRequiredMixin, UserPassesTestMixin from django.urls import reverse_lazy -from .models import Event -from .forms import EventForm +from .models import Event, Training, Game +from .forms import EventForm, TrainingForm, GameForm + +def select_event_type(request): + return render(request, 'calendars/select_event_type.html') class CoachCheckMixin(UserPassesTestMixin): def test_func(self): @@ -29,6 +32,38 @@ class EventCreateView(LoginRequiredMixin, CreateView): form.fields['team'].queryset = teams return form +class TrainingCreateView(LoginRequiredMixin, CreateView): + model = Training + form_class = TrainingForm + template_name = 'calendars/event_form.html' + success_url = reverse_lazy('dashboard') + + def get_form(self, form_class=None): + form = super().get_form(form_class) + user = self.request.user + if not user.is_superuser: + coached_teams = user.coached_teams.all() + assisted_teams = user.assisted_teams.all() + teams = coached_teams | assisted_teams + form.fields['team'].queryset = teams + return form + +class GameCreateView(LoginRequiredMixin, CreateView): + model = Game + form_class = GameForm + template_name = 'calendars/event_form.html' + success_url = reverse_lazy('dashboard') + + def get_form(self, form_class=None): + form = super().get_form(form_class) + user = self.request.user + if not user.is_superuser: + coached_teams = user.coached_teams.all() + assisted_teams = user.assisted_teams.all() + teams = coached_teams | assisted_teams + form.fields['team'].queryset = teams + return form + class EventUpdateView(LoginRequiredMixin, CoachCheckMixin, UpdateView): model = Event form_class = EventForm diff --git a/dashboard/templates/dashboard/dashboard.html b/dashboard/templates/dashboard/dashboard.html index fb23b40..fe376ee 100644 --- a/dashboard/templates/dashboard/dashboard.html +++ b/dashboard/templates/dashboard/dashboard.html @@ -3,9 +3,11 @@ {% block content %}

Dashboard

- {% if user.coached_teams.all or user.assisted_teams.all %} - Create New Event - {% endif %} +
+ {% if user.coached_teams.all or user.assisted_teams.all %} + Create New Event + {% endif %} +

Your Team's Events

@@ -30,4 +32,4 @@ {% else %}

No events found for your team.

{% endif %} -{% endblock %} +{% endblock %} \ No newline at end of file diff --git a/db.sqlite3 b/db.sqlite3 index f70bebe6dff536b9b6a24549ecb9ee0d16197f6c..7fee6b0962aa976d6af1ce3035d8bd8f50422ba0 100644 GIT binary patch delta 1484 zcmbVMUx*t;7@yfqHfPN4m-al0^fX%`t#G%=>`szR4v%X+uJxeG=~)UQ)lD+_1Dii) zHy#xsmwWNilRliFU^sm#_@G3ZgL~|wLLaI^U(WO4kaALLQ42*{CrK0Ip-{REGqc}( z^PBJY`@WggR&ccyTtA90d^9X6V@;P(axdU>o*e4Zc)vDqHX}{0LF_6l5s1 z4^=-_E^S37Cw$5S^b|VqUAh^0{}~B3kdH5n2gE6yv20e(S~ce__AV>Cp7vUFjRd8@ z9R$=Y7EE}L^!PUcHi(T-#)r31ePG2)s| zG@`2{ITJT{iuq0e=&i#( zMMGT258)*clx@XTG*0@6(pd0G=-jC%a59m~7>1S5GL}iTSc*|CWyY9BGStvnj+)t6 zd=Tkqpk^XYD3KPVK1?cO>RFnyG>c>mEk@I6&0-zza09_#T+lyx z+1-Yp;70q<>Q&gd4WegE@_9v!z0wDJ*KlX=nh-k4ld#+M--WyI8{e_dy}yGeJtD$V z*H`dv?1#js{i1vs!ExnH`7+n~6S>hO9zQw~rgXkZ@p84uY`0?D%u${0d?-s?)l)Ns z@HS#HjK1kb%VBBDw$;sD>FWL2H0 z!>n2(Q;5!4)#9vv{GB?hU7Q_Yg$>e0;{y#F^L+RRQ)r$M{b*{gAM@)qt5`0U^N!lP zO$)`c`jEkJrMEDQTUT{+NTo5jE(3al^B;rD<4|cd&kKGOGATXZT*hZuSzYM935>Jg z60%y+$rN}pSem~WLk2t4DKQl}F%kzxeU!G@@cHm**e+^Rdo&O{MYoLPL5CzlU%QK6zF$gd) h@XG*2-}6rlU|+&0uxNt-GP!L6Gm8L3)o(1S3;_P>YCZq} diff --git a/docs/traceback/trace4.log b/docs/traceback/trace4.log new file mode 100644 index 0000000..7ded45b --- /dev/null +++ b/docs/traceback/trace4.log @@ -0,0 +1,73 @@ +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 5, in + class TrainingCreateView(LoginRequiredMixin, CreateView): + ^^^^^^^^^^^^^^^^^^ +NameError: name 'LoginRequiredMixin' is not defined + diff --git a/templates/base.html b/templates/base.html index 747869e..6fefcb7 100644 --- a/templates/base.html +++ b/templates/base.html @@ -18,6 +18,11 @@ + {% if user.coached_teams.all %} + + {% endif %}