Source code for oioioi.similarsubmits.admin

from django.shortcuts import redirect
from django.urls import reverse
from django.utils.encoding import force_str
from django.utils.translation import gettext_lazy as _

from oioioi.base import admin
from oioioi.base.utils import make_html_link
from oioioi.contests.admin import contest_site
from oioioi.contests.menu import contest_admin_menu_registry
from oioioi.contests.models import Submission
from oioioi.contests.utils import is_contest_admin
from oioioi.similarsubmits.models import (
    SubmissionsSimilarityEntry,
    SubmissionsSimilarityGroup,
)


[docs]class SubmissionsSimilarityEntryAdmin(admin.ModelAdmin):
[docs] list_display = [ 'id', 'group_link', 'submission_link', 'submission_user_full_name', 'submission_problem_instance', 'guilty', ]
[docs] list_filter = ['guilty']
[docs] search_fields = ['submission__user__username', 'submission__user__last_name']
[docs] raw_id_fields = ['submission', 'group']
[docs] def has_add_permission(self, request): return is_contest_admin(request)
[docs] def has_change_permission(self, request, obj=None): return is_contest_admin(request)
[docs] def has_delete_permission(self, request, obj=None): return self.has_change_permission(request, obj)
[docs] def get_readonly_fields(self, request, obj=None): if obj is None: return [] return ['submission', 'group']
[docs] def add_view(self, request, form_url='', extra_context=None): return redirect('bulk_add_similarities', contest_id=request.contest.id)
[docs] def formfield_for_foreignkey(self, db_field, request, **kwargs): if db_field.name == 'submission': qs = Submission.objects.all() if request.contest: qs = qs.filter(problem_instance__contest=request.contest) kwargs['queryset'] = qs elif db_field.name == 'group': qs = SubmissionsSimilarityGroup.objects.all() if request.contest: qs = qs.filter(contest=request.contest) kwargs['queryset'] = qs return super(SubmissionsSimilarityEntryAdmin, self).formfield_for_foreignkey( db_field, request, **kwargs )
[docs] group_link.short_description = _("Group")
submission_link.short_description = _("Submission")
[docs] def submission_user_full_name(self, instance): return instance.submission.user.get_full_name()
submission_user_full_name.short_description = _("User name")
[docs] submission_user_full_name.admin_order_field = 'submission__user__last_name'
[docs] def submission_problem_instance(self, instance): if instance.submission.kind != 'NORMAL': return '%s (%s)' % ( force_str(instance.submission.problem_instance), force_str(instance.submission.get_kind_display()), ) else: return instance.submission.problem_instance
submission_problem_instance.short_description = _("Problem") submission_problem_instance.admin_order_field = 'submission__problem_instance'
[docs] def get_queryset(self, request): queryset = super(SubmissionsSimilarityEntryAdmin, self).get_queryset(request) queryset = queryset.filter( submission__problem_instance__contest=request.contest ) queryset = queryset.order_by('-id') return queryset
contest_site.contest_register( SubmissionsSimilarityEntry, SubmissionsSimilarityEntryAdmin ) contest_admin_menu_registry.register( 'submissions_similarity', _("Similar submits"), lambda request: reverse( 'oioioiadmin:similarsubmits_submissionssimilarityentry_changelist' ), is_contest_admin, order=100, )
[docs]class SubmisionsSimilarityEntryInline(admin.TabularInline):
[docs] model = SubmissionsSimilarityEntry
[docs] extra = 0
[docs] raw_id_fields = ['submission']
[docs] def formfield_for_foreignkey(self, db_field, request, **kwargs): if db_field.name == 'submission': qs = Submission.objects if request.contest: qs = qs.filter(problem_instance__contest=request.contest) kwargs['initial'] = request.contest kwargs['queryset'] = qs return super(SubmisionsSimilarityEntryInline, self).formfield_for_foreignkey( db_field, request, **kwargs )
[docs]class SubmissionsSimilarityGroupAdmin(admin.ModelAdmin):
[docs] list_display = ['id']
[docs] inlines = [SubmisionsSimilarityEntryInline]
[docs] exclude = ['contest']
[docs] def has_add_permission(self, request): return is_contest_admin(request)
[docs] def has_change_permission(self, request, obj=None): return is_contest_admin(request)
[docs] def has_delete_permission(self, request, obj=None): return self.has_change_permission(request, obj)
[docs] def save_model(self, request, obj, form, change): obj.contest = request.contest obj.save()
[docs] def _interrupt_redirection(self, request): if 'came_from' not in request.GET and all( x not in request.POST for x in ('_continue', '_popup', '_saveasnew', '_addanother') ): return True return False
[docs] def response_add(self, request, obj, post_url_continue=None): if self._interrupt_redirection(request): return redirect( 'oioioiadmin:similarsubmits_' 'submissionssimilarityentry_changelist' ) return super(SubmissionsSimilarityGroupAdmin, self).response_add( request, obj, post_url_continue )
[docs] def response_change(self, request, obj): if self._interrupt_redirection(request): return redirect( 'oioioiadmin:similarsubmits_' 'submissionssimilarityentry_changelist' ) return super(SubmissionsSimilarityGroupAdmin, self).response_change( request, obj )
[docs] def response_delete(self, request): if self._interrupt_redirection(request): return redirect( 'oioioiadmin:similarsubmits_' 'submissionssimilarityentry_changelist' ) return super(SubmissionsSimilarityGroupAdmin, self).response_delete(request)
[docs] def get_queryset(self, request): queryset = super(SubmissionsSimilarityGroupAdmin, self).get_queryset(request) queryset = queryset.filter(contest=request.contest) queryset = queryset.order_by('-id') return queryset
contest_site.contest_register( SubmissionsSimilarityGroup, SubmissionsSimilarityGroupAdmin )