def decorator(view): view = enforce_condition(condition, login_redirect=False)(view) actions[name] = view if menu_text is not None: portal_admin_menu_registry.register(name, menu_text, menu_url_generator, condition, order=menu_order) return view
class SuspendJudgeProblemInstanceAdminMixin(object): """Sets up admin panel for suspendjudge app. """ def __init__(self, *args, **kwargs): super(SuspendJudgeProblemInstanceAdminMixin, self).__init__(*args, **kwargs) self.list_display = self.list_display + ('suspended_on_init_display', 'suspended_on_final_display') def _resume(self, instance_id): get_object_or_404(SuspendedProblem, problem_instance=instance_id) \ .delete() def _rejudge(self, instance_id): suspended = Submission.objects.filter(queuedjob__state="SUSPENDED", problem_instance=instance_id) for submission in suspended: QueuedJob.objects.filter(submission=submission).delete() submission.problem_instance.controller.judge(submission) def _clear_queue(self, instance_id): QueuedJob.objects.filter(submission__problem_instance=instance_id, state="SUSPENDED").delete() def _suspend(self, problem_instance_id, suspend_init_tests=True): problem_instance = get_object_or_404(ProblemInstance, pk=problem_instance_id) SuspendedProblem.objects.get_or_create( problem_instance=problem_instance, suspend_init_tests=suspend_init_tests) @method_decorator(enforce_condition(contest_exists & is_contest_admin)) @method_decorator(require_POST) def resume_and_rejudge_view(self, request, problem_instance_id): self._resume(problem_instance_id) self._rejudge(problem_instance_id) return redirect('oioioiadmin:contests_probleminstance_changelist') @method_decorator(enforce_condition(contest_exists & is_contest_admin)) @method_decorator(require_POST) def resume_and_clear_view(self, request, problem_instance_id): self._resume(problem_instance_id) self._clear_queue(problem_instance_id) return redirect('oioioiadmin:contests_probleminstance_changelist') @method_decorator(enforce_condition(contest_exists & is_contest_admin)) @method_decorator(require_POST) def suspend_all_view(self, request, problem_instance_id): self._suspend(problem_instance_id) return redirect('oioioiadmin:contests_probleminstance_changelist') @method_decorator(enforce_condition(contest_exists & is_contest_admin)) @method_decorator(require_POST) def suspend_all_but_init_view(self, request, problem_instance_id): self._suspend(problem_instance_id, False) return redirect('oioioiadmin:contests_probleminstance_changelist') def _view_href(self, instance, view_name): return reverse('oioioiadmin:suspendjudge_' + view_name, kwargs={'problem_instance_id': instance.pk}) def inline_actions(self, instance): if is_suspended(instance): actions = [(self._view_href(instance, 'resume_and_rejudge'), _("Resume and rejudge"), 'POST'), (self._view_href(instance, 'resume_and_clear'), _("Resume and clear queue"), 'POST')] else: actions = [(self._view_href(instance, 'suspend_all'), _("Suspend all tests"), 'POST'), (self._view_href(instance, 'suspend_all_but_init'), _("Suspend final tests"), 'POST')] return super(SuspendJudgeProblemInstanceAdminMixin, self) \ .inline_actions(instance) + actions def suspended_on_init_display(self, instance): return not is_suspended_on_init(instance) suspended_on_init_display.short_description = _("Judge initial") suspended_on_init_display.boolean = True def suspended_on_final_display(self, instance): return not is_suspended(instance) suspended_on_final_display.short_description = _("Judge final") suspended_on_final_display.boolean = True def get_urls(self): urls = super(SuspendJudgeProblemInstanceAdminMixin, self).get_urls() extra_urls = [ url(r'(?P<problem_instance_id>\d+)/resume_and_rejudge/$', self.resume_and_rejudge_view, name='suspendjudge_resume_and_rejudge'), url(r'(?P<problem_instance_id>\d+)/resume_and_clear/$', self.resume_and_clear_view, name='suspendjudge_resume_and_clear'), url(r'(?P<problem_instance_id>\d+)/suspend_all/$', self.suspend_all_view, name='suspendjudge_suspend_all'), url(r'(?P<problem_instance_id>\d+)/suspend_all_but_init/$', self.suspend_all_but_init_view, name='suspendjudge_suspend_all_but_init') ] return extra_urls + urls
from oioioi.base.permissions import enforce_condition, not_anonymous from oioioi.base.utils.user_selection import get_user_hints_view from oioioi.problemsharing.forms import AddFriendshipForm from oioioi.problemsharing.models import Friendship from oioioi.teachers.views import is_teacher account_menu_registry.register( name='friends', text=_("Friends"), url_generator=lambda request: reverse('problemsharing_friends'), condition=is_teacher, order=170, ) @method_decorator(enforce_condition(not_anonymous & is_teacher), name='dispatch') class FriendshipsView(TemplateView): template_name = 'problemsharing/friendship.html' def get_context_data(self, **kwargs): ctx = super(FriendshipsView, self).get_context_data(**kwargs) ctx['form'] = AddFriendshipForm() ctx['friends'] = User.objects.filter( friendships_received__creator=self.request.user) return ctx def post(self, request): ctx = self.get_context_data() if 'befriend' in request.POST: # if we would always pass POST data to AddFriendshipForm,