121 lines
4.7 KiB
Python
121 lines
4.7 KiB
Python
|
from django.conf.urls import url
|
||
|
from django.db.models import TextField
|
||
|
from django.forms import ModelForm, ModelMultipleChoiceField, TextInput
|
||
|
from django.http import HttpResponseRedirect
|
||
|
from django.shortcuts import get_object_or_404
|
||
|
from django.urls import reverse
|
||
|
from django.utils.html import format_html
|
||
|
from django.utils.safestring import mark_safe
|
||
|
from django.utils.translation import gettext_lazy as _
|
||
|
from reversion.admin import VersionAdmin
|
||
|
|
||
|
from django_ace import AceWidget
|
||
|
from judge.models import Judge, Problem
|
||
|
from judge.widgets import AdminHeavySelect2MultipleWidget, AdminPagedownWidget
|
||
|
|
||
|
|
||
|
class LanguageForm(ModelForm):
|
||
|
problems = ModelMultipleChoiceField(
|
||
|
label=_('Disallowed problems'),
|
||
|
queryset=Problem.objects.all(),
|
||
|
required=False,
|
||
|
help_text=_('These problems are NOT allowed to be submitted in this language'),
|
||
|
widget=AdminHeavySelect2MultipleWidget(data_view='problem_select2'))
|
||
|
|
||
|
class Meta:
|
||
|
if AdminPagedownWidget is not None:
|
||
|
widgets = {'description': AdminPagedownWidget}
|
||
|
|
||
|
|
||
|
class LanguageAdmin(VersionAdmin):
|
||
|
fields = ('key', 'name', 'short_name', 'common_name', 'ace', 'pygments', 'info', 'description',
|
||
|
'template', 'problems')
|
||
|
list_display = ('key', 'name', 'common_name', 'info')
|
||
|
form = LanguageForm
|
||
|
|
||
|
def save_model(self, request, obj, form, change):
|
||
|
super(LanguageAdmin, self).save_model(request, obj, form, change)
|
||
|
obj.problem_set.set(Problem.objects.exclude(id__in=form.cleaned_data['problems'].values('id')))
|
||
|
|
||
|
def get_form(self, request, obj=None, **kwargs):
|
||
|
self.form.base_fields['problems'].initial = \
|
||
|
Problem.objects.exclude(id__in=obj.problem_set.values('id')).values_list('pk', flat=True) if obj else []
|
||
|
form = super(LanguageAdmin, self).get_form(request, obj, **kwargs)
|
||
|
if obj is not None:
|
||
|
form.base_fields['template'].widget = AceWidget(obj.ace, request.profile.ace_theme)
|
||
|
return form
|
||
|
|
||
|
|
||
|
class GenerateKeyTextInput(TextInput):
|
||
|
def render(self, name, value, attrs=None, renderer=None):
|
||
|
text = super(TextInput, self).render(name, value, attrs)
|
||
|
return mark_safe(text + format_html(
|
||
|
'''\
|
||
|
<a href="#" onclick="return false;" class="button" id="id_{0}_regen">Regenerate</a>
|
||
|
<script type="text/javascript">
|
||
|
django.jQuery(document).ready(function ($) {{
|
||
|
$('#id_{0}_regen').click(function () {{
|
||
|
var length = 100,
|
||
|
charset = "abcdefghijklnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789`~!@#$%^&*()_+-=|[]{{}};:,<>./?",
|
||
|
key = "";
|
||
|
for (var i = 0, n = charset.length; i < length; ++i) {{
|
||
|
key += charset.charAt(Math.floor(Math.random() * n));
|
||
|
}}
|
||
|
$('#id_{0}').val(key);
|
||
|
}});
|
||
|
}});
|
||
|
</script>
|
||
|
''', name))
|
||
|
|
||
|
|
||
|
class JudgeAdminForm(ModelForm):
|
||
|
class Meta:
|
||
|
widgets = {'auth_key': GenerateKeyTextInput}
|
||
|
if AdminPagedownWidget is not None:
|
||
|
widgets['description'] = AdminPagedownWidget
|
||
|
|
||
|
|
||
|
class JudgeAdmin(VersionAdmin):
|
||
|
form = JudgeAdminForm
|
||
|
readonly_fields = ('created', 'online', 'start_time', 'ping', 'load', 'last_ip', 'runtimes', 'problems')
|
||
|
fieldsets = (
|
||
|
(None, {'fields': ('name', 'auth_key', 'is_blocked')}),
|
||
|
(_('Description'), {'fields': ('description',)}),
|
||
|
(_('Information'), {'fields': ('created', 'online', 'last_ip', 'start_time', 'ping', 'load')}),
|
||
|
(_('Capabilities'), {'fields': ('runtimes', 'problems')}),
|
||
|
)
|
||
|
list_display = ('name', 'online', 'start_time', 'ping', 'load', 'last_ip')
|
||
|
ordering = ['-online', 'name']
|
||
|
|
||
|
def get_urls(self):
|
||
|
return ([url(r'^(\d+)/disconnect/$', self.disconnect_view, name='judge_judge_disconnect'),
|
||
|
url(r'^(\d+)/terminate/$', self.terminate_view, name='judge_judge_terminate')] +
|
||
|
super(JudgeAdmin, self).get_urls())
|
||
|
|
||
|
def disconnect_judge(self, id, force=False):
|
||
|
judge = get_object_or_404(Judge, id=id)
|
||
|
judge.disconnect(force=force)
|
||
|
return HttpResponseRedirect(reverse('admin:judge_judge_changelist'))
|
||
|
|
||
|
def disconnect_view(self, request, id):
|
||
|
return self.disconnect_judge(id)
|
||
|
|
||
|
def terminate_view(self, request, id):
|
||
|
return self.disconnect_judge(id, force=True)
|
||
|
|
||
|
def get_readonly_fields(self, request, obj=None):
|
||
|
if obj is not None and obj.online:
|
||
|
return self.readonly_fields + ('name',)
|
||
|
return self.readonly_fields
|
||
|
|
||
|
def has_delete_permission(self, request, obj=None):
|
||
|
result = super(JudgeAdmin, self).has_delete_permission(request, obj)
|
||
|
if result and obj is not None:
|
||
|
return not obj.online
|
||
|
return result
|
||
|
|
||
|
if AdminPagedownWidget is not None:
|
||
|
formfield_overrides = {
|
||
|
TextField: {'widget': AdminPagedownWidget},
|
||
|
}
|