diff --git a/src/core/templates/core/component_detail.html b/src/core/templates/core/component_detail.html index 9f8af6c..6b0cf06 100644 --- a/src/core/templates/core/component_detail.html +++ b/src/core/templates/core/component_detail.html @@ -29,7 +29,7 @@
{% for tag in component.tags.all %} - {{tag.name}} + {{tag.name}} {% endfor %}
diff --git a/src/core/templates/core/studenttag_confirm_delete.html b/src/core/templates/core/studenttag_confirm_delete.html index 8a0fbdc..ab2ae03 100644 --- a/src/core/templates/core/studenttag_confirm_delete.html +++ b/src/core/templates/core/studenttag_confirm_delete.html @@ -1,13 +1,33 @@ {% extends 'base.html' %} +{% block head_title %}Delete Tag | {% endblock head_title %} + +{% block breadcrumbs %} + +{% endblock breadcrumbs %} + {% block content %} -

Delete Studenttag

-
- {% csrf_token %} -

Are you sure you want to delete "{{ studenttag }}"?

- {{ form.as_p }} -

- or cancel -

-
+
+
+

Delete Tag

+
+
+ {% csrf_token %} +

Are you sure you want to delete "{{ tag }}"?

+ {{ form.as_p }} +

+ or cancel +

+
+
{% endblock %} diff --git a/src/core/templates/core/studenttag_form.html b/src/core/templates/core/studenttag_form.html index 058ee96..c273ace 100644 --- a/src/core/templates/core/studenttag_form.html +++ b/src/core/templates/core/studenttag_form.html @@ -16,7 +16,12 @@ {% block content %}
-

Edit Tag

+
+

Edit Tag

+

+ Delete +

+
{% csrf_token %} {{ form.as_p }} diff --git a/src/core/templates/core/subject_list.html b/src/core/templates/core/subject_list.html index 315b0b2..90089e5 100644 --- a/src/core/templates/core/subject_list.html +++ b/src/core/templates/core/subject_list.html @@ -18,7 +18,7 @@

Subjects

+ New Subject - Tags → + Tags → diff --git a/src/core/templates/core/tag_confirm_delete.html b/src/core/templates/core/tag_confirm_delete.html new file mode 100644 index 0000000..179de31 --- /dev/null +++ b/src/core/templates/core/tag_confirm_delete.html @@ -0,0 +1,33 @@ +{% extends 'base.html' %} + +{% block head_title %}Delete Tag | {% endblock head_title %} + +{% block breadcrumbs %} + +{% endblock breadcrumbs %} + +{% block content %} +
+
+

Delete Tag

+
+ + {% csrf_token %} +

Are you sure you want to delete "{{ tag }}"?

+ {{ form.as_p }} +

+ or cancel +

+ +
+{% endblock %} diff --git a/src/core/templates/core/tag_create_form.html b/src/core/templates/core/tag_create_form.html new file mode 100644 index 0000000..7a1eee8 --- /dev/null +++ b/src/core/templates/core/tag_create_form.html @@ -0,0 +1,28 @@ +{% extends 'base.html' %} + +{% block head_title %}New Tag | {% endblock head_title %} + +{% block breadcrumbs %} + +{% endblock breadcrumbs %} + +{% block content %} +
+

+ New Tag

+
+ {% csrf_token %} + {{ form.as_p }} +

+ or cancel +

+ +
+{% endblock %} diff --git a/src/core/templates/core/tag_detail.html b/src/core/templates/core/tag_detail.html new file mode 100644 index 0000000..a91e3ee --- /dev/null +++ b/src/core/templates/core/tag_detail.html @@ -0,0 +1,50 @@ +{% extends 'base.html' %} +{% load helpers %} + +{% block head_title %}Tag {{ tag }} | {% endblock head_title %} + +{% block breadcrumbs %} + +{% endblock breadcrumbs %} + +{% block content %} +
+
+
+

{{ tag }}

+
+ Edit +
+
+

Subjects with this tag

+
+ + + + + + + + {% for component in tag.component_set.all %} + + + + + {% empty %} + + + + {% endfor %} + +
SubjectName
No components tagged yet.
+ +
+{% endblock %} diff --git a/src/core/templates/core/tag_form.html b/src/core/templates/core/tag_form.html new file mode 100644 index 0000000..3d0de72 --- /dev/null +++ b/src/core/templates/core/tag_form.html @@ -0,0 +1,35 @@ +{% extends 'base.html' %} + +{% block head_title %}Edit Tag | {% endblock head_title %} + +{% block breadcrumbs %} + +{% endblock breadcrumbs %} + +{% block content %} +
+
+

Edit Tag

+

+ Delete +

+
+
+ {% csrf_token %} + {{ form.as_p }} +

+ or cancel +

+
+
+{% endblock %} diff --git a/src/core/templates/core/tag_list.html b/src/core/templates/core/tag_list.html new file mode 100644 index 0000000..86f1308 --- /dev/null +++ b/src/core/templates/core/tag_list.html @@ -0,0 +1,32 @@ +{% extends 'base.html' %} +{% load helpers %} + +{% block head_title %}Tags | {% endblock head_title %} + +{% block breadcrumbs %} + +{% endblock breadcrumbs %} + +{% block content %} +
+
+
+

Tags

+ + New Tag +
+
+
+ {% for tag in tag_list %} + {{ tag }} + {% empty %} +

No tags yet.

+ {% endfor %} +
+
+{% endblock %} diff --git a/src/core/urls.py b/src/core/urls.py index 6255239..c93a8d8 100644 --- a/src/core/urls.py +++ b/src/core/urls.py @@ -156,6 +156,37 @@ urlpatterns = [ ])), ])), ])), + + # Tags + path('tags/', include([ + path( + '', + views.TagListView.as_view(), + name='tag-list' + ), + path( + 'new/', + views.TagCreateView.as_view(), + name='tag-create' + ), + path('/', include([ + path( + '', + views.TagDetailView.as_view(), + name='tag-detail' + ), + path( + 'update/', + views.TagUpdateView.as_view(), + name='tag-update' + ), + path( + 'delete/', + views.TagDeleteView.as_view(), + name='tag-delete' + ), + ])), + ])), ])), # SchoolDays diff --git a/src/core/views.py b/src/core/views.py index 1580e23..c3f30f0 100644 --- a/src/core/views.py +++ b/src/core/views.py @@ -409,6 +409,104 @@ class SubjectDeleteView(LoginRequiredMixin, SuccessMessageMixin, DeleteView): return context +class TagListView(LoginRequiredMixin, ListView): + model = Tag + + def get_context_data(self, **kwargs): + context = super().get_context_data(**kwargs) + context['school_year'] = get_object_or_404( + SchoolYear, year=self.kwargs['year'] + ) + return context + + +class TagCreateView( + LoginRequiredMixin, SuccessMessageMixin, CreateView +): + model = Tag + success_message = 'Tag created.' + template_name_suffix = '_create_form' + fields = '__all__' + + def get_context_data(self, **kwargs): + context = super().get_context_data(**kwargs) + context['school_year'] = get_object_or_404( + SchoolYear, year=self.kwargs['year'] + ) + return context + + def get_success_url(self): + return reverse('core:tag-list', kwargs={ + 'year': self.kwargs['year'] + }) + + +class TagDetailView(LoginRequiredMixin, DetailView): + model = Tag + pk_url_kwarg = 'tag_pk' + + def get_queryset(self): + queryset = Tag.objects.filter( + pk=self.kwargs.get(self.pk_url_kwarg) + ).prefetch_related( + Prefetch( + 'component_set', + queryset=Component.objects.filter( + subject__school_year__year=self.kwargs['year'] + ) + ) + ) + return queryset + + def get_context_data(self, **kwargs): + context = super().get_context_data(**kwargs) + context['school_year'] = get_object_or_404( + SchoolYear, year=self.kwargs['year'] + ) + return context + + +class TagUpdateView( + LoginRequiredMixin, SuccessMessageMixin, UpdateView +): + model = Tag + pk_url_kwarg = 'tag_pk' + success_message = 'Tag saved.' + fields = '__all__' + + def get_context_data(self, **kwargs): + context = super().get_context_data(**kwargs) + context['school_year'] = get_object_or_404( + SchoolYear, year=self.kwargs['year'] + ) + return context + + def get_success_url(self): + return reverse('core:tag-list', kwargs={ + 'year': self.kwargs['year'] + }) + + +class TagDeleteView( + LoginRequiredMixin, SuccessMessageMixin, DeleteView +): + model = Tag + pk_url_kwarg = 'tag_pk' + success_message = 'Tag deleted.' + + def get_context_data(self, **kwargs): + context = super().get_context_data(**kwargs) + context['school_year'] = get_object_or_404( + SchoolYear, year=self.kwargs['year'] + ) + return context + + def get_success_url(self): + return reverse('core:tag-list', kwargs={ + 'year': self.kwargs['year'] + }) + + class ComponentListView(LoginRequiredMixin, ListView): model = Component diff --git a/src/indici/settings.py b/src/indici/settings.py index 0e1d629..fb74c2a 100644 --- a/src/indici/settings.py +++ b/src/indici/settings.py @@ -144,7 +144,7 @@ STATICFILES_FINDERS = ( DEFAULT_AUTO_FIELD = 'django.db.models.BigAutoField' AUTH_USER_MODEL = 'accounts.User' -LOGIN_REDIRECT_URL = reverse_lazy('core:today') +LOGIN_REDIRECT_URL = reverse_lazy('core:home') # Decimal settings DEFAULT_DECIMAL_PLACES = 2 diff --git a/src/static/styles/main.css b/src/static/styles/main.css index 2ff0386..5205673 100644 --- a/src/static/styles/main.css +++ b/src/static/styles/main.css @@ -219,6 +219,8 @@ input[type=submit], border-radius: 0.5rem; } +button.action-delete, +input[type=submit].action-delete, .action-delete { background-color: var(--color-danger); }