feat: Implementierung der 'Spiel öffnen'-Funktionalität und erweiterte Dashboard-Anzeige

This commit is contained in:
Matthias Nagel 2025-10-02 12:50:47 +02:00
parent 0d5357793e
commit 125bea954c
6 changed files with 146 additions and 3 deletions

View File

@ -31,8 +31,16 @@
<h5 class="mb-1">{{ item.event.title }}</h5>
<small>{{ item.event.start_time|localize }}</small>
</div>
<p class="mb-1"><strong>Team:</strong> {{ item.event.team.name }}</p>
{% if item.event.game %}
<p class="mb-1"><strong>Opponent:</strong> {{ item.event.game.opponent }}</p>
{% if item.event.game.opened_for_teams.all %}
<p class="mb-1"><strong>Supporter Teams:</strong>
{% for team in item.event.game.opened_for_teams.all %}
{{ team.name }}{% if not forloop.last %}, {% endif %}
{% endfor %}
</p>
{% endif %}
{% endif %}
<p class="mb-1">{{ item.event.description }}</p>
<small>Location: {{ item.event.location_address }}</small>
@ -50,6 +58,7 @@
<div style="column-count: 3;">
<ul class="list-unstyled">
{% for p in item.player_participations %}
{% if not p.player.team in item.event.game.opened_for_teams.all or p.status != 'maybe' %}
<li class="
{% if p.status == 'attending' %}
text-success
@ -58,7 +67,13 @@
{% else %} {# status is 'maybe' #}
text-warning
{% endif %}
">{{ p.player.first_name }} {{ p.player.last_name }}</li>
">
{{ p.player.first_name }} {{ p.player.last_name }}
{% if p.player.team in item.event.game.opened_for_teams.all and p.status != 'maybe' %}
*
{% endif %}
</li>
{% endif %}
{% endfor %}
</ul>
</div>
@ -92,6 +107,7 @@
<h5 class="mb-1">{{ item.event.title }}</h5>
<small>{{ item.event.start_time|localize }}</small>
</div>
<p class="mb-1"><strong>Team:</strong> {{ item.event.team.name }}</p>
{% if item.event.game %}
<p class="mb-1"><strong>Opponent:</strong> {{ item.event.game.opponent }}</p>
{% endif %}

View File

@ -22,7 +22,7 @@ def dashboard(request):
if all_teams:
user_events = Event.objects.filter(team__in=all_teams)
opened_games = Event.objects.filter(game__opened_for_teams__in=all_teams)
events = (user_events | opened_games).distinct().select_related('game', 'training').prefetch_related('team__players', 'eventparticipation_set__user').order_by('start_time')
events = (user_events | opened_games).distinct().select_related('game', 'training').prefetch_related('team__players', 'eventparticipation_set__user', 'game__opened_for_teams').order_by('start_time')
for event in events:
participations = event.eventparticipation_set.all()
@ -31,6 +31,14 @@ def dashboard(request):
player_participations = []
team_players = event.team.players.all()
# Add players from opened teams
if hasattr(event, 'game'):
for team in event.game.opened_for_teams.all():
team_players = team_players | team.players.all()
team_players = team_players.distinct()
participation_map = {p.user_id: p.status for p in participations}
for player in team_players:

Binary file not shown.

118
docs/traceback/trace8.log Normal file
View File

@ -0,0 +1,118 @@
Internal Server Error: /
Traceback (most recent call last):
File "/home/mnagel/Projekte/baseball_organisator/venv/lib64/python3.13/site-packages/django/template/smartif.py", line 180, in translate_token
op = OPERATORS[token]
~~~~~~~~~^^^^^^^
KeyError: '(p.player.team'
During handling of the above exception, another exception occurred:
Traceback (most recent call last):
File "/home/mnagel/Projekte/baseball_organisator/venv/lib64/python3.13/site-packages/django/core/handlers/exception.py", line 55, in inner
response = get_response(request)
File "/home/mnagel/Projekte/baseball_organisator/venv/lib64/python3.13/site-packages/django/core/handlers/base.py", line 197, in _get_response
response = wrapped_callback(request, *callback_args, **callback_kwargs)
File "/home/mnagel/Projekte/baseball_organisator/venv/lib64/python3.13/site-packages/django/contrib/auth/decorators.py", line 59, in _view_wrapper
return view_func(request, *args, **kwargs)
File "/home/mnagel/Projekte/baseball_organisator/dashboard/views.py", line 77, in dashboard
return render(request, 'dashboard/dashboard.html', context)
File "/home/mnagel/Projekte/baseball_organisator/venv/lib64/python3.13/site-packages/django/shortcuts.py", line 25, in render
content = loader.render_to_string(template_name, context, request, using=using)
File "/home/mnagel/Projekte/baseball_organisator/venv/lib64/python3.13/site-packages/django/template/loader.py", line 61, in render_to_string
template = get_template(template_name, using=using)
File "/home/mnagel/Projekte/baseball_organisator/venv/lib64/python3.13/site-packages/django/template/loader.py", line 15, in get_template
return engine.get_template(template_name)
~~~~~~~~~~~~~~~~~~~^^^^^^^^^^^^^^^
File "/home/mnagel/Projekte/baseball_organisator/venv/lib64/python3.13/site-packages/django/template/backends/django.py", line 79, in get_template
return Template(self.engine.get_template(template_name), self)
~~~~~~~~~~~~~~~~~~~~~~~~^^^^^^^^^^^^^^^
File "/home/mnagel/Projekte/baseball_organisator/venv/lib64/python3.13/site-packages/django/template/engine.py", line 177, in get_template
template, origin = self.find_template(template_name)
~~~~~~~~~~~~~~~~~~^^^^^^^^^^^^^^^
File "/home/mnagel/Projekte/baseball_organisator/venv/lib64/python3.13/site-packages/django/template/engine.py", line 159, in find_template
template = loader.get_template(name, skip=skip)
File "/home/mnagel/Projekte/baseball_organisator/venv/lib64/python3.13/site-packages/django/template/loaders/cached.py", line 57, in get_template
template = super().get_template(template_name, skip)
File "/home/mnagel/Projekte/baseball_organisator/venv/lib64/python3.13/site-packages/django/template/loaders/base.py", line 28, in get_template
return Template(
contents,
...<2 lines>...
self.engine,
)
File "/home/mnagel/Projekte/baseball_organisator/venv/lib64/python3.13/site-packages/django/template/base.py", line 154, in __init__
self.nodelist = self.compile_nodelist()
~~~~~~~~~~~~~~~~~~~~~^^
File "/home/mnagel/Projekte/baseball_organisator/venv/lib64/python3.13/site-packages/django/template/base.py", line 196, in compile_nodelist
nodelist = parser.parse()
File "/home/mnagel/Projekte/baseball_organisator/venv/lib64/python3.13/site-packages/django/template/base.py", line 518, in parse
raise self.error(token, e)
File "/home/mnagel/Projekte/baseball_organisator/venv/lib64/python3.13/site-packages/django/template/base.py", line 516, in parse
compiled_result = compile_func(self, token)
File "/home/mnagel/Projekte/baseball_organisator/venv/lib64/python3.13/site-packages/django/template/loader_tags.py", line 299, in do_extends
nodelist = parser.parse()
File "/home/mnagel/Projekte/baseball_organisator/venv/lib64/python3.13/site-packages/django/template/base.py", line 518, in parse
raise self.error(token, e)
File "/home/mnagel/Projekte/baseball_organisator/venv/lib64/python3.13/site-packages/django/template/base.py", line 516, in parse
compiled_result = compile_func(self, token)
File "/home/mnagel/Projekte/baseball_organisator/venv/lib64/python3.13/site-packages/django/template/loader_tags.py", line 234, in do_block
nodelist = parser.parse(("endblock",))
File "/home/mnagel/Projekte/baseball_organisator/venv/lib64/python3.13/site-packages/django/template/base.py", line 518, in parse
raise self.error(token, e)
File "/home/mnagel/Projekte/baseball_organisator/venv/lib64/python3.13/site-packages/django/template/base.py", line 516, in parse
compiled_result = compile_func(self, token)
File "/home/mnagel/Projekte/baseball_organisator/venv/lib64/python3.13/site-packages/django/template/defaulttags.py", line 962, in do_if
nodelist = parser.parse(("elif", "else", "endif"))
File "/home/mnagel/Projekte/baseball_organisator/venv/lib64/python3.13/site-packages/django/template/base.py", line 518, in parse
raise self.error(token, e)
File "/home/mnagel/Projekte/baseball_organisator/venv/lib64/python3.13/site-packages/django/template/base.py", line 516, in parse
compiled_result = compile_func(self, token)
File "/home/mnagel/Projekte/baseball_organisator/venv/lib64/python3.13/site-packages/django/template/defaulttags.py", line 862, in do_for
nodelist_loop = parser.parse(
(
...<2 lines>...
)
)
File "/home/mnagel/Projekte/baseball_organisator/venv/lib64/python3.13/site-packages/django/template/base.py", line 518, in parse
raise self.error(token, e)
File "/home/mnagel/Projekte/baseball_organisator/venv/lib64/python3.13/site-packages/django/template/base.py", line 516, in parse
compiled_result = compile_func(self, token)
File "/home/mnagel/Projekte/baseball_organisator/venv/lib64/python3.13/site-packages/django/template/defaulttags.py", line 962, in do_if
nodelist = parser.parse(("elif", "else", "endif"))
File "/home/mnagel/Projekte/baseball_organisator/venv/lib64/python3.13/site-packages/django/template/base.py", line 518, in parse
raise self.error(token, e)
File "/home/mnagel/Projekte/baseball_organisator/venv/lib64/python3.13/site-packages/django/template/base.py", line 516, in parse
compiled_result = compile_func(self, token)
File "/home/mnagel/Projekte/baseball_organisator/venv/lib64/python3.13/site-packages/django/template/defaulttags.py", line 862, in do_for
nodelist_loop = parser.parse(
(
...<2 lines>...
)
)
File "/home/mnagel/Projekte/baseball_organisator/venv/lib64/python3.13/site-packages/django/template/base.py", line 518, in parse
raise self.error(token, e)
File "/home/mnagel/Projekte/baseball_organisator/venv/lib64/python3.13/site-packages/django/template/base.py", line 516, in parse
compiled_result = compile_func(self, token)
File "/home/mnagel/Projekte/baseball_organisator/venv/lib64/python3.13/site-packages/django/template/defaulttags.py", line 961, in do_if
condition = TemplateIfParser(parser, bits).parse()
~~~~~~~~~~~~~~~~^^^^^^^^^^^^^^
File "/home/mnagel/Projekte/baseball_organisator/venv/lib64/python3.13/site-packages/django/template/defaulttags.py", line 894, in __init__
super().__init__(*args, **kwargs)
~~~~~~~~~~~~~~~~^^^^^^^^^^^^^^^^^
File "/home/mnagel/Projekte/baseball_organisator/venv/lib64/python3.13/site-packages/django/template/smartif.py", line 171, in __init__
mapped_tokens.append(self.translate_token(token))
~~~~~~~~~~~~~~~~~~~~^^^^^^^
File "/home/mnagel/Projekte/baseball_organisator/venv/lib64/python3.13/site-packages/django/template/smartif.py", line 182, in translate_token
return self.create_var(token)
~~~~~~~~~~~~~~~^^^^^^^
File "/home/mnagel/Projekte/baseball_organisator/venv/lib64/python3.13/site-packages/django/template/defaulttags.py", line 897, in create_var
return TemplateLiteral(self.template_parser.compile_filter(value), value)
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~^^^^^^^
File "/home/mnagel/Projekte/baseball_organisator/venv/lib64/python3.13/site-packages/django/template/base.py", line 609, in compile_filter
return FilterExpression(token, self)
File "/home/mnagel/Projekte/baseball_organisator/venv/lib64/python3.13/site-packages/django/template/base.py", line 710, in __init__
raise TemplateSyntaxError(
...<2 lines>...
)
django.template.exceptions.TemplateSyntaxError: Could not parse the remainder: '(p.player.team' from '(p.player.team'
[02/Oct/2025 10:39:16] "GET / HTTP/1.1" 500 431175

View File

@ -15,7 +15,8 @@
border-left: 5px solid #6c757d; /* gray */
}
.support-game {
border: 2px solid #ffc107; /* yellow */
background-color: #fff3cd; /* light yellow background */
border-color: #ffc107; /* yellow border */
}
</style>
</head>