From 57268d65b8a7f646ca1388755a087dd63432aa81 Mon Sep 17 00:00:00 2001 From: Canuc80k Date: Thu, 25 Aug 2022 22:34:21 +0700 Subject: [PATCH 1/5] Center the Join Button in Contest List --- resources/widgets.scss | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/resources/widgets.scss b/resources/widgets.scss index 6205be1..f99122e 100644 --- a/resources/widgets.scss +++ b/resources/widgets.scss @@ -100,6 +100,12 @@ background: darkblue; } } + + // class = "unselectable button full small" only appear in online-judge/templates/contest/list.html + // this attribute center buttons in contest list (including "Join", "Virutal Join", "Spectable") + &.unselectable.button.full.small { + margin: 0 auto + } } .button.full, input[type=submit].full, button.full { @@ -590,4 +596,4 @@ ul.select2-selection__rendered { .control-button:hover { background: gray; -} +} \ No newline at end of file From 9d42082b52e0ac4469747288149e5ef22363b609 Mon Sep 17 00:00:00 2001 From: DELL Date: Sat, 8 Oct 2022 09:35:21 +0700 Subject: [PATCH 2/5] add delete_blog button --- judge/views/organization.py | 66 +++++++++++++++++---------- templates/organization/blog/edit.html | 39 ++++++++++++++++ templates/organization/form.html | 49 ++++++++++---------- 3 files changed, 105 insertions(+), 49 deletions(-) create mode 100644 templates/organization/blog/edit.html diff --git a/judge/views/organization.py b/judge/views/organization.py index 53727ca..daebc9f 100644 --- a/judge/views/organization.py +++ b/judge/views/organization.py @@ -1,8 +1,10 @@ +from ast import Delete, arg from itertools import chain from django import forms from django.conf import settings from django.contrib import messages from django.contrib.auth.mixins import LoginRequiredMixin +from django.contrib.auth.models import User from django.core.cache import cache from django.core.cache.utils import make_template_fragment_key from django.core.exceptions import PermissionDenied @@ -17,7 +19,7 @@ from django.http import ( HttpResponseBadRequest, ) from django.shortcuts import get_object_or_404 -from django.urls import reverse +from django.urls import reverse , reverse_lazy from django.utils import timezone from django.utils.html import format_html from django.utils.functional import cached_property @@ -30,6 +32,7 @@ from django.views.generic import ( UpdateView, View, CreateView, + DeleteView, ) from django.views.generic.detail import ( SingleObjectMixin, @@ -131,7 +134,7 @@ class OrganizationMixin(OrganizationBase): def dispatch(self, request, *args, **kwargs): try: - self.organization_id = int(kwargs["pk"]) + self.organization_id = int(kwargs["pk"] ) self.organization = get_object_or_404(Organization, id=self.organization_id) except Http404: key = kwargs.get(self.slug_url_kwarg, None) @@ -930,8 +933,7 @@ class EditOrganizationContest( problem_form.save() for problem_form in problem_formset.deleted_objects: problem_form.delete() - super().post(request, *args, **kwargs) - return HttpResponseRedirect(reverse("organization_contests", args=(self.organization_id,self.organization.slug))) + return super().post(request, *args, **kwargs) self.object = self.contest return self.render_to_response( @@ -1037,7 +1039,7 @@ class EditOrganizationBlog( MemberOrganizationMixin, UpdateView, ): - template_name = "organization/blog/add.html" + template_name = "organization/blog/edit.html" model = BlogPost def get_form_class(self): @@ -1063,6 +1065,10 @@ class EditOrganizationBlog( _("Not allowed to edit this blog"), ) + def delete_blog(self , request , *args , **kwargs): + self.blog_id = kwargs["blog_pk"] + BlogPost.objects.get(pk = self.blog_id).delete() + def get(self, request, *args, **kwargs): res = self.setup_blog(request, *args, **kwargs) if res: @@ -1073,7 +1079,13 @@ class EditOrganizationBlog( res = self.setup_blog(request, *args, **kwargs) if res: return res - return super().post(request, *args, **kwargs) + if request.POST['action'] == 'Delete': + self.create_notification("Delete blog") + self.delete_blog(request , *args , **kwargs) + cur_url = reverse("organization_pending_blogs", args=(self.organization_id,self.organization.slug) ) + return HttpResponseRedirect(cur_url) + else: + return super().post(request, *args, **kwargs) def get_object(self): return self.blog @@ -1081,32 +1093,36 @@ class EditOrganizationBlog( def get_title(self): return _("Edit blog %s") % self.object.title + def create_notification(self,action): + blog = BlogPost.objects.get(pk=self.blog_id) + link = reverse( + "edit_organization_blog", + args=[self.organization.id, self.organization.slug, self.blog_id], + ) + html = ( + f'{blog.title} - {self.organization.name}' + ) + post_authors = blog.authors.all() + posible_user = self.organization.admins.all() | post_authors + for user in posible_user: + if user.id == self.request.profile.id: + continue + notification = Notification( + owner=user, + author=self.request.profile, + category= action, + html_link=html, + ) + notification.save() + def form_valid(self, form): with transaction.atomic(), revisions.create_revision(): res = super(EditOrganizationBlog, self).form_valid(form) revisions.set_comment(_("Edited from site")) revisions.set_user(self.request.user) - - link = reverse( - "edit_organization_blog", - args=[self.organization.id, self.organization.slug, self.object.id], - ) - html = ( - f'{self.object.title} - {self.organization.name}' - ) - for user in self.organization.admins.all(): - if user.id == self.request.profile.id: - continue - notification = Notification( - owner=user, - author=self.request.profile, - category="Edit blog", - html_link=html, - ) - notification.save() + self.create_notification("Edit blog") return res - class PendingBlogs( LoginRequiredMixin, TitleMixin, diff --git a/templates/organization/blog/edit.html b/templates/organization/blog/edit.html new file mode 100644 index 0000000..e2cca8e --- /dev/null +++ b/templates/organization/blog/edit.html @@ -0,0 +1,39 @@ +{% extends "organization/home-base.html" %} + +{% block three_col_js %} + {{ form.media.js }} + {% include "organization/home-js.html" %} +{% endblock %} + +{% block three_col_media %} + {{ form.media.css }} +{% endblock %} + +{% block middle_content %} +
+ {% csrf_token %} + {% if form.errors %} +
+ x + {{ form.non_field_errors() }} + {{ form.errors }} +
+ {% endif %} + {% for field in form %} + {% if not field.is_hidden %} +
+ {{ field.errors }} + +
+ {{ field }} +
+ {% if field.help_text %} + {{ field.help_text|safe }} + {% endif %} +
+ {% endif %} + {% endfor %} + + +
+{% endblock %} \ No newline at end of file diff --git a/templates/organization/form.html b/templates/organization/form.html index f23df3c..0c85003 100644 --- a/templates/organization/form.html +++ b/templates/organization/form.html @@ -1,25 +1,26 @@ -
- {% csrf_token %} - {% if form.errors %} -
- x - {{ form.non_field_errors() }} - {{ form.errors }} -
- {% endif %} - {% for field in form %} - {% if not field.is_hidden %} -
- {{ field.errors }} - -
- {{ field }} -
- {% if field.help_text %} - {{ field.help_text|safe }} - {% endif %} -
- {% endif %} - {% endfor %} - + + {% csrf_token %} + {% if form.errors %} +
+ x + {{ form.non_field_errors() }} + {{ form.errors }} +
+ {% endif %} + {% for field in form %} + {% if not field.is_hidden %} +
+ {{ field.errors }} + +
+ {{ field }} +
+ {% if field.help_text %} + {{ field.help_text|safe }} + {% endif %} +
+ {% endif %} + {% endfor %} + +
\ No newline at end of file From d03150a39646a062ce4a843f6cba801e6b61a2db Mon Sep 17 00:00:00 2001 From: DELL Date: Sat, 8 Oct 2022 12:15:04 +0700 Subject: [PATCH 3/5] review and fix delete_blog_button --- judge/views/organization.py | 8 ++------ templates/organization/form.html | 1 - 2 files changed, 2 insertions(+), 7 deletions(-) diff --git a/judge/views/organization.py b/judge/views/organization.py index daebc9f..a2d637a 100644 --- a/judge/views/organization.py +++ b/judge/views/organization.py @@ -1,10 +1,7 @@ -from ast import Delete, arg -from itertools import chain from django import forms from django.conf import settings from django.contrib import messages from django.contrib.auth.mixins import LoginRequiredMixin -from django.contrib.auth.models import User from django.core.cache import cache from django.core.cache.utils import make_template_fragment_key from django.core.exceptions import PermissionDenied @@ -19,7 +16,7 @@ from django.http import ( HttpResponseBadRequest, ) from django.shortcuts import get_object_or_404 -from django.urls import reverse , reverse_lazy +from django.urls import reverse from django.utils import timezone from django.utils.html import format_html from django.utils.functional import cached_property @@ -32,7 +29,6 @@ from django.views.generic import ( UpdateView, View, CreateView, - DeleteView, ) from django.views.generic.detail import ( SingleObjectMixin, @@ -134,7 +130,7 @@ class OrganizationMixin(OrganizationBase): def dispatch(self, request, *args, **kwargs): try: - self.organization_id = int(kwargs["pk"] ) + self.organization_id = int(kwargs["pk"]) self.organization = get_object_or_404(Organization, id=self.organization_id) except Http404: key = kwargs.get(self.slug_url_kwarg, None) diff --git a/templates/organization/form.html b/templates/organization/form.html index 0c85003..227b59d 100644 --- a/templates/organization/form.html +++ b/templates/organization/form.html @@ -22,5 +22,4 @@ {% endif %} {% endfor %} - \ No newline at end of file From fbc57f8b33f97a6e5c182e195ed5df3daa5c4d07 Mon Sep 17 00:00:00 2001 From: Zhao-Linux Date: Sat, 8 Oct 2022 17:55:34 +0700 Subject: [PATCH 4/5] Add download ranking csv file --- templates/contest/ranking-table.html | 2 +- templates/contest/ranking.html | 70 +++++++++++++++++++++++++++- 2 files changed, 70 insertions(+), 2 deletions(-) diff --git a/templates/contest/ranking-table.html b/templates/contest/ranking-table.html index ffd0ffa..5779fe8 100644 --- a/templates/contest/ranking-table.html +++ b/templates/contest/ranking-table.html @@ -4,7 +4,7 @@ {% block after_rank_head %} {% if has_rating %} - {{ _('Rating') }} + {{ _('Rating') }} {% endif %} {% endblock %} diff --git a/templates/contest/ranking.html b/templates/contest/ranking.html index 0ee131b..087a905 100644 --- a/templates/contest/ranking.html +++ b/templates/contest/ranking.html @@ -61,6 +61,73 @@ }); {% endif %} + {% if tab == 'ranking' %} + + {% endif %} {% include "contest/media-js.html" %} {% endblock %} @@ -86,6 +153,7 @@ + {{ _('Download as CSV') }} {% include "contest/ranking-table.html" %} -{% endblock %} +{% endblock %} \ No newline at end of file From c9d495d53c4b83e5f5e48dd8846e2662339867b3 Mon Sep 17 00:00:00 2001 From: DELL Date: Sat, 8 Oct 2022 22:12:08 +0700 Subject: [PATCH 5/5] override post EditOrganizationContest --- judge/views/organization.py | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/judge/views/organization.py b/judge/views/organization.py index a2d637a..b3c23b8 100644 --- a/judge/views/organization.py +++ b/judge/views/organization.py @@ -929,7 +929,8 @@ class EditOrganizationContest( problem_form.save() for problem_form in problem_formset.deleted_objects: problem_form.delete() - return super().post(request, *args, **kwargs) + super().post(request, *args, **kwargs) + return HttpResponseRedirect(reverse("organization_contests", args=(self.organization_id,self.organization.slug))) self.object = self.contest return self.render_to_response(