feat: Verschiebung des 'Spieler erstellen'-Links in die Navbar und Behebung des Datumsformatfehlers
This commit is contained in:
parent
1d61821f9f
commit
8c388b6ef3
Binary file not shown.
@ -16,13 +16,13 @@ class InvitationCodeForm(forms.Form):
|
|||||||
|
|
||||||
class CustomUserCreationForm(forms.ModelForm):
|
class CustomUserCreationForm(forms.ModelForm):
|
||||||
password = forms.CharField(widget=forms.PasswordInput)
|
password = forms.CharField(widget=forms.PasswordInput)
|
||||||
birth_date = forms.DateField(input_formats=['%d.%m.%Y'], widget=forms.DateInput(format='%d.%m.%Y'))
|
birth_date = forms.DateField(input_formats=['%d.%m.%Y', '%Y-%m-%d'], widget=forms.DateInput(format='%d.%m.%Y', attrs={'type': 'date'}))
|
||||||
class Meta:
|
class Meta:
|
||||||
model = CustomUser
|
model = CustomUser
|
||||||
fields = ('username', 'first_name', 'last_name', 'email', 'birth_date', 'player_number', 'password')
|
fields = ('username', 'first_name', 'last_name', 'email', 'birth_date', 'player_number', 'password')
|
||||||
|
|
||||||
class CustomUserChangeForm(forms.ModelForm):
|
class CustomUserChangeForm(forms.ModelForm):
|
||||||
birth_date = forms.DateField(input_formats=['%d.%m.%Y'], widget=forms.DateInput(format='%d.%m.%Y'))
|
birth_date = forms.DateField(input_formats=['%d.%m.%Y', '%Y-%m-%d'], widget=forms.DateInput(format='%d.%m.%Y', attrs={'type': 'date'}))
|
||||||
class Meta:
|
class Meta:
|
||||||
model = CustomUser
|
model = CustomUser
|
||||||
fields = ('username', 'first_name', 'last_name', 'email', 'birth_date', 'player_number', 'team')
|
fields = ('username', 'first_name', 'last_name', 'email', 'birth_date', 'player_number', 'team')
|
||||||
@ -30,7 +30,7 @@ class CustomUserChangeForm(forms.ModelForm):
|
|||||||
class PlayerCreationForm(forms.ModelForm):
|
class PlayerCreationForm(forms.ModelForm):
|
||||||
parent1_email = forms.EmailField(required=False)
|
parent1_email = forms.EmailField(required=False)
|
||||||
parent2_email = forms.EmailField(required=False)
|
parent2_email = forms.EmailField(required=False)
|
||||||
birth_date = forms.DateField(input_formats=['%d.%m.%Y'], widget=forms.DateInput(format='%d.%m.%Y'))
|
birth_date = forms.DateField(input_formats=['%d.%m.%Y', '%Y-%m-%d'], widget=forms.DateInput(format='%d.%m.%Y', attrs={'type': 'date'}))
|
||||||
|
|
||||||
class Meta:
|
class Meta:
|
||||||
model = CustomUser
|
model = CustomUser
|
||||||
|
|||||||
Binary file not shown.
Binary file not shown.
Binary file not shown.
@ -1,7 +1,23 @@
|
|||||||
from django import forms
|
from django import forms
|
||||||
from .models import Event
|
from .models import Event, Training, Game
|
||||||
|
|
||||||
class EventForm(forms.ModelForm):
|
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:
|
class Meta:
|
||||||
model = Event
|
model = Event
|
||||||
fields = ['title', 'description', 'start_time', 'end_time', 'location_address', 'team']
|
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']
|
||||||
|
|||||||
10
calendars/templates/calendars/select_event_type.html
Normal file
10
calendars/templates/calendars/select_event_type.html
Normal file
@ -0,0 +1,10 @@
|
|||||||
|
{% extends "base.html" %}
|
||||||
|
|
||||||
|
{% block content %}
|
||||||
|
<h2>Select Event Type</h2>
|
||||||
|
<div class="list-group">
|
||||||
|
<a href="{% url 'event-add' %}" class="list-group-item list-group-item-action">Generic Event</a>
|
||||||
|
<a href="{% url 'training-add' %}" class="list-group-item list-group-item-action">Training</a>
|
||||||
|
<a href="{% url 'game-add' %}" class="list-group-item list-group-item-action">Game</a>
|
||||||
|
</div>
|
||||||
|
{% endblock %}
|
||||||
@ -2,7 +2,10 @@ from django.urls import path
|
|||||||
from . import views
|
from . import views
|
||||||
|
|
||||||
urlpatterns = [
|
urlpatterns = [
|
||||||
|
path('event/select/', views.select_event_type, name='select-event-type'),
|
||||||
path('event/add/', views.EventCreateView.as_view(), name='event-add'),
|
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/<int:pk>/', views.EventUpdateView.as_view(), name='event-update'),
|
path('event/<int:pk>/', views.EventUpdateView.as_view(), name='event-update'),
|
||||||
path('event/<int:pk>/delete/', views.EventDeleteView.as_view(), name='event-delete'),
|
path('event/<int:pk>/delete/', views.EventDeleteView.as_view(), name='event-delete'),
|
||||||
]
|
]
|
||||||
@ -2,8 +2,11 @@ from django.shortcuts import render
|
|||||||
from django.views.generic.edit import CreateView, UpdateView, DeleteView
|
from django.views.generic.edit import CreateView, UpdateView, DeleteView
|
||||||
from django.contrib.auth.mixins import LoginRequiredMixin, UserPassesTestMixin
|
from django.contrib.auth.mixins import LoginRequiredMixin, UserPassesTestMixin
|
||||||
from django.urls import reverse_lazy
|
from django.urls import reverse_lazy
|
||||||
from .models import Event
|
from .models import Event, Training, Game
|
||||||
from .forms import EventForm
|
from .forms import EventForm, TrainingForm, GameForm
|
||||||
|
|
||||||
|
def select_event_type(request):
|
||||||
|
return render(request, 'calendars/select_event_type.html')
|
||||||
|
|
||||||
class CoachCheckMixin(UserPassesTestMixin):
|
class CoachCheckMixin(UserPassesTestMixin):
|
||||||
def test_func(self):
|
def test_func(self):
|
||||||
@ -29,6 +32,38 @@ class EventCreateView(LoginRequiredMixin, CreateView):
|
|||||||
form.fields['team'].queryset = teams
|
form.fields['team'].queryset = teams
|
||||||
return form
|
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):
|
class EventUpdateView(LoginRequiredMixin, CoachCheckMixin, UpdateView):
|
||||||
model = Event
|
model = Event
|
||||||
form_class = EventForm
|
form_class = EventForm
|
||||||
|
|||||||
@ -3,9 +3,11 @@
|
|||||||
{% block content %}
|
{% block content %}
|
||||||
<div class="d-flex justify-content-between align-items-center mb-3">
|
<div class="d-flex justify-content-between align-items-center mb-3">
|
||||||
<h2>Dashboard</h2>
|
<h2>Dashboard</h2>
|
||||||
{% if user.coached_teams.all or user.assisted_teams.all %}
|
<div>
|
||||||
<a href="{% url 'event-add' %}" class="btn btn-primary">Create New Event</a>
|
{% if user.coached_teams.all or user.assisted_teams.all %}
|
||||||
{% endif %}
|
<a href="{% url 'select-event-type' %}" class="btn btn-primary">Create New Event</a>
|
||||||
|
{% endif %}
|
||||||
|
</div>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
<h3>Your Team's Events</h3>
|
<h3>Your Team's Events</h3>
|
||||||
|
|||||||
BIN
db.sqlite3
BIN
db.sqlite3
Binary file not shown.
73
docs/traceback/trace4.log
Normal file
73
docs/traceback/trace4.log
Normal file
@ -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 "<frozen importlib._bootstrap>", line 1387, in _gcd_import
|
||||||
|
File "<frozen importlib._bootstrap>", line 1360, in _find_and_load
|
||||||
|
File "<frozen importlib._bootstrap>", line 1331, in _find_and_load_unlocked
|
||||||
|
File "<frozen importlib._bootstrap>", line 935, in _load_unlocked
|
||||||
|
File "<frozen importlib._bootstrap_external>", line 1026, in exec_module
|
||||||
|
File "<frozen importlib._bootstrap>", line 488, in _call_with_frames_removed
|
||||||
|
File "/home/mnagel/Projekte/baseball_organisator/baseball_organisator/urls.py", line 25, in <module>
|
||||||
|
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 "<frozen importlib._bootstrap>", line 1387, in _gcd_import
|
||||||
|
File "<frozen importlib._bootstrap>", line 1360, in _find_and_load
|
||||||
|
File "<frozen importlib._bootstrap>", line 1331, in _find_and_load_unlocked
|
||||||
|
File "<frozen importlib._bootstrap>", line 935, in _load_unlocked
|
||||||
|
File "<frozen importlib._bootstrap_external>", line 1026, in exec_module
|
||||||
|
File "<frozen importlib._bootstrap>", line 488, in _call_with_frames_removed
|
||||||
|
File "/home/mnagel/Projekte/baseball_organisator/calendars/urls.py", line 2, in <module>
|
||||||
|
from . import views
|
||||||
|
File "/home/mnagel/Projekte/baseball_organisator/calendars/views.py", line 5, in <module>
|
||||||
|
class TrainingCreateView(LoginRequiredMixin, CreateView):
|
||||||
|
^^^^^^^^^^^^^^^^^^
|
||||||
|
NameError: name 'LoginRequiredMixin' is not defined
|
||||||
|
|
||||||
@ -18,6 +18,11 @@
|
|||||||
<li class="nav-item">
|
<li class="nav-item">
|
||||||
<a class="nav-link" href="{% url 'edit_profile' %}">Profile</a>
|
<a class="nav-link" href="{% url 'edit_profile' %}">Profile</a>
|
||||||
</li>
|
</li>
|
||||||
|
{% if user.coached_teams.all %}
|
||||||
|
<li class="nav-item">
|
||||||
|
<a class="nav-link" href="{% url 'player-add' %}">Create New Player</a>
|
||||||
|
</li>
|
||||||
|
{% endif %}
|
||||||
<li class="nav-item">
|
<li class="nav-item">
|
||||||
<form method="post" action="{% url 'logout' %}">
|
<form method="post" action="{% url 'logout' %}">
|
||||||
{% csrf_token %}
|
{% csrf_token %}
|
||||||
|
|||||||
Loading…
x
Reference in New Issue
Block a user