From 24a7b34465792fc55ec15f7f385e421197244e4a Mon Sep 17 00:00:00 2001 From: Filipko^^ Date: Fri, 31 Jan 2025 18:51:58 +0100 Subject: [PATCH 1/2] add show on site links for problem/set --- seminare/organizer/tables.py | 10 ++++++++++ seminare/organizer/views/problemset.py | 8 +++++++- 2 files changed, 17 insertions(+), 1 deletion(-) diff --git a/seminare/organizer/tables.py b/seminare/organizer/tables.py index 08aece04..8d2087be 100644 --- a/seminare/organizer/tables.py +++ b/seminare/organizer/tables.py @@ -37,6 +37,11 @@ def get_links( "Upraviť", reverse("org:problemset_update", args=[object.contest_id, object.id]), ), + ( + "mdi:eye", + "Pozrieť na stránke", + reverse("problem_set_detail", args=[object.id]), + ), ] @@ -75,6 +80,11 @@ def get_links( ], ), ), + ( + "mdi:eye", + "Pozrieť na stránke", + reverse("problem_detail", args=[object.problem_set.id, object.number]), + ), ] diff --git a/seminare/organizer/views/problemset.py b/seminare/organizer/views/problemset.py index e9cbc36c..729d7655 100644 --- a/seminare/organizer/views/problemset.py +++ b/seminare/organizer/views/problemset.py @@ -94,5 +94,11 @@ def get_form_table_links(self): reverse( "org:problem_create", args=[self.contest.id, self.get_object().id] ), - ) + ), + ( + "default", + "mdi:eye", + "Pozrieť na stránke", + reverse("problem_set_detail", args=[self.get_object().id]), + ), ] From 0d170cc4e8694509ad1c316536d77c368b27737d Mon Sep 17 00:00:00 2001 From: Filipko^^ Date: Fri, 31 Jan 2025 20:42:48 +0100 Subject: [PATCH 2/2] add problem detail view --- seminare/organizer/tables.py | 11 +++- .../templates/org/problem_detail.html | 41 +++++++++++++ seminare/organizer/urls.py | 7 ++- seminare/organizer/views/problem.py | 61 ++++++++++++++++++- 4 files changed, 114 insertions(+), 6 deletions(-) create mode 100644 seminare/organizer/templates/org/problem_detail.html diff --git a/seminare/organizer/tables.py b/seminare/organizer/tables.py index 8d2087be..de10227f 100644 --- a/seminare/organizer/tables.py +++ b/seminare/organizer/tables.py @@ -82,8 +82,15 @@ def get_links( ), ( "mdi:eye", - "Pozrieť na stránke", - reverse("problem_detail", args=[object.problem_set.id, object.number]), + "Detail", + reverse( + "org:problem_detail", + args=[ + object.problem_set.contest_id, + object.problem_set.id, + object.id, + ], + ), ), ] diff --git a/seminare/organizer/templates/org/problem_detail.html b/seminare/organizer/templates/org/problem_detail.html new file mode 100644 index 00000000..c1d55088 --- /dev/null +++ b/seminare/organizer/templates/org/problem_detail.html @@ -0,0 +1,41 @@ +{% extends "org/base.html" %} +{% load markdownify %} +{% load ui %} +{% block title %}{{ problem.name }} {{ block.super }}{% endblock %} + +{% block body %} + {% if breadcrumbs %} +
+ {% breadcrumbs breadcrumbs %} +
+ {% endif %} +
+
+

+ Problem: {{ problem.name }} +

+

Problem number: {{ problem.number }}

+
+
+ {% for link in links %} + {% if link|length == 3 %} + {{ link.1 }} + {% else %} + + + {{ link.2 }} + + {% endif %} + {% endfor %} +
+
+
+
+ +
+ {{ texts.PS.text|markdownify }} +
+
+
+{% endblock body %} + diff --git a/seminare/organizer/urls.py b/seminare/organizer/urls.py index fa7ea2e6..f28de287 100644 --- a/seminare/organizer/urls.py +++ b/seminare/organizer/urls.py @@ -1,6 +1,6 @@ from django.urls import include, path -from seminare.organizer.views import dashboard, grading, page, problem, problemset, post +from seminare.organizer.views import dashboard, grading, page, post, problem, problemset app_name = "org" @@ -37,6 +37,11 @@ problem.ProblemUpdateView.as_view(), name="problem_update", ), + path( + "sets//problems//detail", + problem.ProblemDetailView.as_view(), + name="problem_detail", + ), path( "sets//problems/create/", problem.ProblemCreateView.as_view(), diff --git a/seminare/organizer/views/problem.py b/seminare/organizer/views/problem.py index bd43f2bc..3046b50f 100644 --- a/seminare/organizer/views/problem.py +++ b/seminare/organizer/views/problem.py @@ -1,11 +1,12 @@ +from django.contrib.sites.shortcuts import get_current_site from django.db.models import QuerySet from django.shortcuts import get_object_or_404 from django.urls import reverse -from django.views.generic import CreateView, UpdateView +from django.views.generic import CreateView, DetailView, UpdateView from seminare.organizer.forms import ProblemForm from seminare.organizer.tables import ProblemTable -from seminare.organizer.views import WithContest, WithProblemSet +from seminare.organizer.views import WithBreadcrumbs, WithContest, WithProblemSet from seminare.organizer.views.generic import GenericFormView, GenericTableView from seminare.problems.models import Problem @@ -93,6 +94,60 @@ def get_breadcrumbs(self): "org:problem_list", args=[self.contest.id, self.problem_set.id] ), ), - (self.object, ""), + ( + self.object, + reverse( + "org:problem_detail", + args=[self.contest.id, self.problem_set.id, self.object.id], + ), + ), ("Upraviť", ""), ] + + +class ProblemDetailView(WithContest, WithProblemSet, WithBreadcrumbs, DetailView): + template_name = "org/problem_detail.html" + context_object_name = "problem" + links: list[tuple] = [] + + def get_object(self, queryset=None): + site = get_current_site(self.request) + return get_object_or_404( + Problem, + id=self.kwargs["problem_id"], + problem_set_id=self.kwargs["problem_set_id"], + problem_set__contest__site=site, + ) + + def get_links(self): + return [ + ( + "green", + "mdi:pencil", + "Upraviť", + reverse( + "org:problem_update", + args=[self.contest.id, self.problem_set.id, self.object.id], + ), + ) + ] + + def get_context_data(self, **kwargs): + ctx = super().get_context_data(**kwargs) + self.object: Problem + ctx["texts"] = self.object.get_texts() + ctx["links"] = self.get_links() + return ctx + + def get_breadcrumbs(self): + return [ + ("Sady úloh", reverse("org:problemset_list", args=[self.contest.id])), + (self.problem_set, ""), + ( + "Úlohy", + reverse( + "org:problem_list", args=[self.contest.id, self.problem_set.id] + ), + ), + (self.object, ""), + ]