diff --git a/accounts/__pycache__/forms.cpython-313.pyc b/accounts/__pycache__/forms.cpython-313.pyc index 28b5292..36bb4d7 100644 Binary files a/accounts/__pycache__/forms.cpython-313.pyc and b/accounts/__pycache__/forms.cpython-313.pyc differ diff --git a/accounts/forms.py b/accounts/forms.py index 6fe6bb7..8e02c24 100644 --- a/accounts/forms.py +++ b/accounts/forms.py @@ -16,13 +16,13 @@ class InvitationCodeForm(forms.Form): class CustomUserCreationForm(forms.ModelForm): 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: model = CustomUser fields = ('username', 'first_name', 'last_name', 'email', 'birth_date', 'player_number', 'password') 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: model = CustomUser fields = ('username', 'first_name', 'last_name', 'email', 'birth_date', 'player_number', 'team') @@ -30,7 +30,7 @@ class CustomUserChangeForm(forms.ModelForm): class PlayerCreationForm(forms.ModelForm): parent1_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: model = CustomUser diff --git a/calendars/__pycache__/forms.cpython-313.pyc b/calendars/__pycache__/forms.cpython-313.pyc index 50227b4..2ae9b99 100644 Binary files a/calendars/__pycache__/forms.cpython-313.pyc and b/calendars/__pycache__/forms.cpython-313.pyc differ diff --git a/calendars/__pycache__/urls.cpython-313.pyc b/calendars/__pycache__/urls.cpython-313.pyc index e553981..1ea891a 100644 Binary files a/calendars/__pycache__/urls.cpython-313.pyc and b/calendars/__pycache__/urls.cpython-313.pyc differ diff --git a/calendars/__pycache__/views.cpython-313.pyc b/calendars/__pycache__/views.cpython-313.pyc index 9ced318..4831890 100644 Binary files a/calendars/__pycache__/views.cpython-313.pyc and b/calendars/__pycache__/views.cpython-313.pyc differ 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

+
+ Generic Event + Training + Game +
+{% 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 f70bebe..7fee6b0 100644 Binary files a/db.sqlite3 and b/db.sqlite3 differ 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 %}