Skip to content

Commit

Permalink
Contest archiving update (#357)
Browse files Browse the repository at this point in the history
* Fix translation block in confirm_archive_contest.html

* Remove unused utility function

* Disallow adding problems, time extensions when archived
  • Loading branch information
geoff128 authored Apr 1, 2024
1 parent c3c399b commit 28b30e0
Show file tree
Hide file tree
Showing 8 changed files with 60 additions and 22 deletions.
31 changes: 31 additions & 0 deletions oioioi/contests/admin.py
Original file line number Diff line number Diff line change
Expand Up @@ -50,6 +50,7 @@
can_admin_contest,
get_inline_for_contest,
is_contest_admin,
is_contest_archived,
is_contest_basicadmin,
is_contest_observer,
)
Expand Down Expand Up @@ -380,11 +381,20 @@ def has_add_permission(self, request):
return False

def has_change_permission(self, request, obj=None):
if is_contest_archived(request):
return False
return is_contest_basicadmin(request)

def has_delete_permission(self, request, obj=None):
if is_contest_archived(request):
return False
return self.has_change_permission(request, obj)

def has_view_permission(self, request, obj=None):
if is_contest_archived(request):
return is_contest_basicadmin(request)
return super(ProblemInstanceAdmin, self).has_view_permission(request, obj)

def _problem_change_href(self, instance):
came_from = reverse('oioioiadmin:contests_probleminstance_changelist')
came_from_arg = urllib.parse.urlencode({'came_from': came_from})
Expand Down Expand Up @@ -493,6 +503,9 @@ def inline_actions(self, instance):
return result

def actions_field(self, instance):
request = self._request_local.request
if is_contest_archived(request):
return _("Unarchive the contest to change this problem.")
return make_html_links(self.inline_actions(instance))

actions_field.short_description = _("Actions")
Expand Down Expand Up @@ -565,6 +578,13 @@ def get_queryset(self, request):

return qs

def changelist_view(self, request, extra_context=None):
extra_context = extra_context or {}
extra_context['show_add_button'] = not is_contest_archived(request)
return super(ProblemInstanceAdmin, self).changelist_view(
request, extra_context=extra_context
)


contest_site.contest_register(ProblemInstance, ProblemInstanceAdmin)

Expand Down Expand Up @@ -973,14 +993,25 @@ class RoundTimeExtensionAdmin(admin.ModelAdmin):
search_fields = ['user__username', 'user__last_name']

def has_add_permission(self, request):
if is_contest_archived(request):
return False
return is_contest_admin(request)

def has_change_permission(self, request, obj=None):
if is_contest_archived(request):
return False
return is_contest_admin(request)

def has_delete_permission(self, request, obj=None):
if is_contest_archived(request):
return False
return self.has_change_permission(request, obj)

def has_view_permission(self, request, obj=None):
if is_contest_archived(request):
return is_contest_admin(request)
return super().has_view_permission(request, obj)

def user_login(self, instance):
if not instance.user:
return ''
Expand Down
2 changes: 1 addition & 1 deletion oioioi/contests/forms.py
Original file line number Diff line number Diff line change
Expand Up @@ -106,7 +106,7 @@ class ProblemInstanceForm(forms.ModelForm):
def __init__(self, *args, **kwargs):
instance = kwargs.get('instance')
super(ProblemInstanceForm, self).__init__(*args, **kwargs)
if instance:
if instance and not instance.contest.is_archived:
self.fields['round'].queryset = instance.contest.round_set
self.fields['round'].required = True

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -2,5 +2,7 @@
{% load i18n %}

{% block object-tools-items %}
{% if show_add_button %}
<a class="btn btn-sm btn-outline-success" href="{% url 'oioioiadmin:problems_problem_add' %}">{% trans "Add problem" %}</a>
{% endif %}
{% endblock %}
14 changes: 8 additions & 6 deletions oioioi/contests/templates/contests/confirm_archive_contest.html
Original file line number Diff line number Diff line change
Expand Up @@ -5,14 +5,16 @@
{% block confirmation_header %}{% trans "Confirm contest archive" %}{% endblock %}
{% block confirmation_form_explanation %}
<p>
{% trans "Contest archiving will make contest \"read only\" which means nobody will be able to: " %}
{% blocktrans %}
Archiving will make the contest 'read-only', which means nobody will be able to:
<ul>
<li> {% trans "add new participants" %} </li>
<li> {% trans "submit solutions" %} </li>
<li> {% trans "add new problems and rounds" %} </li>
<li> {% trans "ask questions" %} </li>
<li> {% trans "add posts and comments on forum." %} </li>
<li>add new participants,</li>
<li>submit solutions,</li>
<li>add new problems and rounds,</li>
<li>ask questions,</li>
<li>add posts and comments on forum.</li>
</ul>
{% endblocktrans %}
</p>

<p>
Expand Down
10 changes: 0 additions & 10 deletions oioioi/contests/utils.py
Original file line number Diff line number Diff line change
Expand Up @@ -303,16 +303,6 @@ def administered_contests(request):
]


@request_cached
def administered_unarchived_contests(request):
"""Returns a list of unarchived contests for which the logged
user has contest_admin permission for.
"""
return [
contest for contest in administered_contests(request) if not contest.is_archived
]


@make_request_condition
@request_cached
def is_contest_admin(request):
Expand Down
9 changes: 7 additions & 2 deletions oioioi/problems/utils.py
Original file line number Diff line number Diff line change
Expand Up @@ -224,8 +224,12 @@ def generate_add_to_contest_metadata(request):
"add to contest" functionality in problemset.
"""

administered = administered_contests(request)
# If user doesn't own any contest we won't show the option.
administered = [
contest
for contest in administered_contests(request)
if not contest.is_archived
]
# If user doesn't own any unarchived contest we won't show the option.
if administered:
show_add_button = True
else:
Expand All @@ -239,6 +243,7 @@ def generate_add_to_contest_metadata(request):
contest
for contest in rcontests
if request.user.has_perm('contests.contest_admin', contest)
and not contest.is_archived
]
return show_add_button, administered_recent_contests

Expand Down
10 changes: 9 additions & 1 deletion oioioi/problems/views.py
Original file line number Diff line number Diff line change
Expand Up @@ -142,6 +142,9 @@ def download_package_traceback_view(request, package_id):


def add_or_update_problem(request, contest, template):
if contest and contest.is_archived:
raise PermissionDenied

if 'problem' in request.GET:
existing_problem = get_object_or_404(Problem, id=request.GET['problem'])
if (
Expand Down Expand Up @@ -612,6 +615,11 @@ def problemset_add_to_contest_view(request, site_key):
raise Http404
administered = administered_contests(request)
administered = sorted(administered, key=lambda x: x.creation_date, reverse=True)
administered = [
contest
for contest in administered
if not contest.is_archived
]
problemset_tabs = generate_problemset_tabs(request)
problemset_tabs.append(
{
Expand Down Expand Up @@ -677,7 +685,7 @@ def get_report_row_begin_HTML_view(request, submission_id):
@transaction.non_atomic_requests
def problemset_add_or_update_problem_view(request):
if not can_add_to_problemset(request):
if request.contest:
if request.contest and not request.contest.is_archived:
url = (
reverse('add_or_update_problem')
+ '?'
Expand Down
4 changes: 2 additions & 2 deletions oioioi/timeline/views.py
Original file line number Diff line number Diff line change
Expand Up @@ -13,7 +13,7 @@
from oioioi.contests.date_registration import date_registry
from oioioi.contests.menu import contest_admin_menu_registry
from oioioi.contests.models import Round
from oioioi.contests.utils import contest_exists, is_contest_admin
from oioioi.contests.utils import contest_exists, is_contest_admin, is_contest_archived


def _get_date_id(registry_item):
Expand Down Expand Up @@ -52,7 +52,7 @@ def _translate_field(field, obj):
_("Timeline"),
lambda request: reverse('timeline_view', kwargs={'contest_id': request.contest.id}),
)
@enforce_condition(contest_exists & is_contest_admin)
@enforce_condition(contest_exists & is_contest_admin & ~is_contest_archived)
def timeline_view(request):
registry = date_registry.tolist(request.contest.id)
group_registry = _make_group_registry(registry)
Expand Down

0 comments on commit 28b30e0

Please sign in to comment.