Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

문제 출처 개선 #36

Open
wants to merge 4 commits into
base: dev
Choose a base branch
from
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
1 change: 1 addition & 0 deletions dmoj/settings.py
Original file line number Diff line number Diff line change
Expand Up @@ -61,6 +61,7 @@
'children': [
'judge.ProblemGroup',
'judge.ProblemType',
'judge.ProblemSource',
],
},
{
Expand Down
10 changes: 5 additions & 5 deletions judge/admin/__init__.py
Original file line number Diff line number Diff line change
Expand Up @@ -8,19 +8,19 @@
from judge.admin.profile import ProfileAdmin
from judge.admin.runtime import JudgeAdmin, LanguageAdmin
from judge.admin.submission import SubmissionAdmin
from judge.admin.taxon import ProblemGroupAdmin, ProblemTypeAdmin
from judge.admin.taxon import ProblemGroupAdmin, ProblemTypeAdmin, ProblemSourceAdmin
from judge.admin.ticket import TicketAdmin
from judge.admin.notifications import NotificationAdmin
from judge.models import Language, Profile, Problem, ProblemGroup, ProblemType, Submission, Comment, \
MiscConfig, Judge, NavigationBar, Contest, ContestParticipation, Organization, BlogPost, \
License, OrganizationRequest, ContestTag, Ticket, Notification
from judge.models import Language, Profile, Problem, ProblemGroup, ProblemType, ProblemSource, \
Submission, Comment, MiscConfig, Judge, NavigationBar, Contest, ContestParticipation, \
Organization, BlogPost, License, OrganizationRequest, ContestTag, Ticket, Notification

admin.site.register(Language, LanguageAdmin)
admin.site.register(Comment, CommentAdmin)
admin.site.register(Profile, ProfileAdmin)
admin.site.register(Problem, ProblemAdmin)
admin.site.register(ProblemGroup, ProblemGroupAdmin)
admin.site.register(ProblemType, ProblemTypeAdmin)
admin.site.register(ProblemSource, ProblemSourceAdmin)
admin.site.register(Submission, SubmissionAdmin)
admin.site.register(MiscConfig)
admin.site.register(NavigationBar, NavigationBarAdmin)
Expand Down
32 changes: 30 additions & 2 deletions judge/admin/taxon.py
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,9 @@
from django.forms import ModelForm, ModelMultipleChoiceField
from django.utils.translation import ugettext_lazy as _

from judge.models import Problem
from mptt.admin import DraggableMPTTAdmin

from judge.models import Problem, ProblemSource
from judge.widgets import HeavySelect2MultipleWidget


Expand Down Expand Up @@ -49,4 +51,30 @@ def save_model(self, request, obj, form, change):

def get_form(self, request, obj=None, **kwargs):
self.form.base_fields['problems'].initial = [o.pk for o in obj.problem_set.all()] if obj else []
return super(ProblemTypeAdmin, self).get_form(request, obj, **kwargs)
return super(ProblemTypeAdmin, self).get_form(request, obj, **kwargs)


class ProblemSourceAdmin(DraggableMPTTAdmin):
list_display = DraggableMPTTAdmin.list_display + ('key', 'name')
fields = ('name', 'order', 'parent')
list_editable = () # Bug in SortableModelAdmin: 500 without list_editable being set
mptt_level_indent = 20
sortable = 'order'

def __init__(self, *args, **kwargs):
super(ProblemSourceAdmin, self).__init__(*args, **kwargs)
self.__save_model_calls = 0

def save_model(self, request, obj, form, change):
self.__save_model_calls += 1
return super(ProblemSourceAdmin, self).save_model(request, obj, form, change)

def changelist_view(self, request, extra_context=None):
self.__save_model_calls = 0
with ProblemSource.objects.disable_mptt_updates():
result = super(ProblemSourceAdmin, self).changelist_view(request, extra_context)
if self.__save_model_calls:
with LockModel(write=(ProblemSource,)):
ProblemSource.objects.rebuild()
return result

40 changes: 40 additions & 0 deletions judge/migrations/0070_auto_20180125_0321.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,40 @@
# -*- coding: utf-8 -*-
# Generated by Django 1.11.8 on 2018-01-24 18:21
from __future__ import unicode_literals

import django.core.validators
from django.db import migrations, models
import django.db.models.deletion
import mptt.fields


class Migration(migrations.Migration):

dependencies = [
('judge', '0069_auto_20180120_2033'),
]

operations = [
migrations.CreateModel(
name='ProblemSource',
fields=[
('order', models.PositiveIntegerField(db_index=True, verbose_name='order')),
('key', models.AutoField(primary_key=True, serialize=False, verbose_name='identifier')),
('name', models.CharField(max_length=20, verbose_name='name')),
('lft', models.PositiveIntegerField(db_index=True, editable=False)),
('rght', models.PositiveIntegerField(db_index=True, editable=False)),
('tree_id', models.PositiveIntegerField(db_index=True, editable=False)),
('level', models.PositiveIntegerField(db_index=True, editable=False)),
('parent', mptt.fields.TreeForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.CASCADE, related_name='children', to='judge.ProblemSource', verbose_name='parent item')),
],
options={
'verbose_name': 'problem source item',
'verbose_name_plural': 'problem sources',
},
),
migrations.AlterField(
model_name='organization',
name='key',
field=models.CharField(default=b'2018AZ', help_text='Organization name shows in URL', max_length=6, unique=True, validators=[django.core.validators.RegexValidator(b'^[A-Za-z0-9]+$', b'Identifier must contain letters and numbers only')], verbose_name='identifier'),
),
]
4 changes: 2 additions & 2 deletions judge/models/__init__.py
Original file line number Diff line number Diff line change
Expand Up @@ -5,8 +5,8 @@
from judge.models.contest import Contest, ContestTag, ContestParticipation, ContestProblem, ContestSubmission, Rating
from judge.models.interface import MiscConfig, validate_regex, NavigationBar, BlogPost
from judge.models.message import PrivateMessage, PrivateMessageThread
from judge.models.problem import ProblemGroup, ProblemType, Problem, ProblemClarification, ProblemTranslation, \
TranslatedProblemQuerySet, TranslatedProblemForeignKeyQuerySet, License, LanguageLimit, Solution
from judge.models.problem import ProblemGroup, ProblemType, ProblemSource, Problem, ProblemClarification, \
ProblemTranslation, TranslatedProblemQuerySet, TranslatedProblemForeignKeyQuerySet, License, LanguageLimit, Solution
from judge.models.problem_data import problem_data_storage, problem_directory_file, ProblemData, ProblemTestCase, \
CHECKERS
from judge.models.profile import Profile, Organization, OrganizationRequest
Expand Down
23 changes: 22 additions & 1 deletion judge/models/problem.py
Original file line number Diff line number Diff line change
Expand Up @@ -12,13 +12,17 @@
from django.utils.functional import cached_property
from django.utils.translation import ugettext_lazy as _

from mptt.fields import TreeForeignKey
from mptt.models import MPTTModel

from judge.fulltext import SearchQuerySet
from judge.models.profile import Profile
from judge.models.runtime import Language
from judge.user_translations import ugettext as user_ugettext
from judge.utils.raw_sql import unique_together_left_join, RawSQLColumn

__all__ = ['ProblemGroup', 'ProblemType', 'Problem', 'ProblemTranslation', 'ProblemClarification',
__all__ = ['ProblemGroup', 'ProblemType', 'ProblemSource',
'Problem', 'ProblemTranslation', 'ProblemClarification',
'TranslatedProblemQuerySet', 'TranslatedProblemForeignKeyQuerySet', 'License']


Expand Down Expand Up @@ -48,6 +52,23 @@ class Meta:
verbose_name_plural = _('problem groups')


class ProblemSource(MPTTModel):
class Meta:
verbose_name = _('problem source item')
verbose_name_plural = _('problem sources')

class MPTTMeta:
order_insertion_by = ['order']

order = models.PositiveIntegerField(db_index=True, verbose_name=_('order'))
key = models.AutoField(primary_key=True, verbose_name=_('key'))
name = models.CharField(max_length=20, verbose_name=_('name'))
parent = TreeForeignKey('self', verbose_name=_('parent item'), null=True, blank=True, related_name='children')

def __unicode__(self):
return self.name


class License(models.Model):
key = models.CharField(max_length=20, unique=True, verbose_name=_('key'),
validators=[RegexValidator(r'^[-\w.]+$', r'License key must be ^[-\w.]+$')])
Expand Down