예제 #1
0
파일: admin.py 프로젝트: sio2project/oioioi
                if not first_future_date[1]:
                    msg = _("Exclusiveness configs usually cover entire rounds,"
                            " but currently round \"%s\" is not exclusive from"
                            " %s! Please verify that your exclusiveness"
                            " configs are correct.") % (round.name,
                                                        first_future_date[0])
                else:
                    msg = _("Exclusiveness configs usually cover entire rounds,"
                            " but currently round \"%s\" is not exclusive from"
                            " %s to %s! Please verify that your exclusiveness"
                            " configs are correct.") % (round.name,
                                                        first_future_date[0],
                                                        first_future_date[1])
                messages.warning(request, msg)

    def save_formset(self, request, form, formset, change):
        instances = formset.save()

        ex_confs = []
        for obj in instances:
            if isinstance(obj, ExclusivenessConfig) and obj.enabled:
                ex_confs.append(obj)

        if ex_confs:
            self._warn_on_contestexcl_overlap(request, ex_confs)
            self._warn_on_not_exclusive_rounds(request, ex_confs)


ContestAdmin.mix_in(ContestAdminWithExclusivenessInlineMixin)
예제 #2
0
파일: admin.py 프로젝트: pragacz/oioioi
        return is_contest_admin(request)

    def has_delete_permission(self, request, obj=None):
        return is_contest_admin(request)


class StatementConfigAdminMixin(object):
    """Adds :class:`~oioioi.contests.models.ProblemStatementConfig` to an admin
       panel.
    """
    def __init__(self, *args, **kwargs):
        super(StatementConfigAdminMixin, self).__init__(*args, **kwargs)
        self.inlines = self.inlines + [StatementConfigInline]


ContestAdmin.mix_in(StatementConfigAdminMixin)


class RankingVisibilityConfigInline(admin.TabularInline):
    model = RankingVisibilityConfig
    extra = 1
    form = RankingVisibilityConfigForm
    category = _("Advanced")

    def has_add_permission(self, request):
        return is_contest_admin(request)

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

    def has_delete_permission(self, request, obj=None):
예제 #3
0
            kwargs['queryset'] = User.objects.filter(id__in=admin_ids) \
                    .order_by('username')

        return super(MessageNotifierConfigInline, self) \
                .formfield_for_foreignkey(db_field, request, **kwargs)


class MessageNotifierContestAdminMixin(object):
    """Adds :class:`~oioioi.questions.models.MessageNotifierConfig` to an admin
       panel.
    """

    def __init__(self, *args, **kwargs):
        super(MessageNotifierContestAdminMixin, self).__init__(*args, **kwargs)
        self.inlines = self.inlines + [MessageNotifierConfigInline]
ContestAdmin.mix_in(MessageNotifierContestAdminMixin)


class ReplyTemplateAdmin(admin.ModelAdmin):

    def get_list_display(self, request):
        if is_superuser(request):
            return ['visible_name', 'content', 'contest', 'usage_count']
        return ['visible_name', 'content', 'usage_count']

    def get_list_filter(self, request):
        if is_superuser(request):
            return ['contest']
        return []

    def get_readonly_fields(self, request, obj=None):
예제 #4
0

logger = logging.getLogger(__name__)


class StatementConfigInline(admin.TabularInline):
    model = ProblemStatementConfig
    extra = 1
    form = ProblemStatementConfigForm


class StatementConfigAdminMixin(object):
    def __init__(self, *args, **kwargs):
        super(StatementConfigAdminMixin, self).__init__(*args, **kwargs)
        self.inlines = self.inlines + [StatementConfigInline]
ContestAdmin.mix_in(StatementConfigAdminMixin)


class StatementInline(admin.TabularInline):
    model = ProblemStatement
    can_delete = False
    readonly_fields = ['language', 'content_link']
    fields = readonly_fields

    def has_add_permission(self, request):
        return False

    def has_change_permission(self, request, obj=None):
        return True

    def has_delete_permission(self, request, obj=None):
예제 #5
0
파일: admin.py 프로젝트: sio2project/oioioi
        return super(PrizeInline, self) \
                .formfield_for_foreignkey(db_field, request, **kwargs)


class PrizesAdminMixin(object):
    """Adds :class:`~oioioi.prizes.models.PrizeGiving` and
       :class:`~oioioi.prizes.models.Prize` to an admin panel and prize giving
       scheduling on save.
    """

    def __init__(self, *args, **kwargs):
        super(PrizesAdminMixin, self).__init__(*args, **kwargs)
        self.inlines = self.inlines + [PrizeGivingInline, PrizeInline]

    def save_related(self, request, *args, **kwargs):
        super(PrizesAdminMixin, self).save_related(request, *args, **kwargs)

        if not request.contest:
            return

        pgs_for_scheduling = request.contest.prizegiving_set \
                .select_for_update() \
                .filter(state='NOT_SCHEDULED', date__isnull=False)

        for pg in pgs_for_scheduling:
            pg.schedule()


ContestAdmin.mix_in(PrizesAdminMixin)
contest_site.contest_register(PrizeForUser)
예제 #6
0
                              'access_key': instance.access_key
                          })
            return make_html_link(url, url)
        else:
            return _("Not yet generated")

    access_link.allow_tags = True
    access_link.short_description = _("Access link")

    def regeneration_link(self, instance):
        return make_html_link(
            reverse('balloons_access_regenerate',
                    kwargs={'contest_id': instance.contest.id}),
            _("Regenerate key"), 'POST')

    regeneration_link.allow_tags = True
    regeneration_link.short_description = _("Regeneration link")


class BalloonsDeliveryAccessDataAdminMixin(object):
    """Adds :class:`~oioioi.balloons.BalloonsDeliveryAccessData` fields to an
       admin panel.
    """
    def __init__(self, *args, **kwargs):
        super(BalloonsDeliveryAccessDataAdminMixin, self) \
            .__init__(*args, **kwargs)
        self.inlines = self.inlines + [BalloonsDeliveryAccessDataInline]


ContestAdmin.mix_in(BalloonsDeliveryAccessDataAdminMixin)
예제 #7
0
파일: admin.py 프로젝트: pragacz/oioioi
                                     self.formfield_for_dbfield,
                                     request=request))

    def response_add(self, request, obj, post_url_continue=None):
        if request.user.is_superuser or \
                not request.user.has_perm('teachers.teacher'):
            return super(ContestAdminMixin,
                         self).response_add(request, obj, post_url_continue)
        self.message_user(request, _("Contest added successfully."))
        return redirect('show_members', contest_id=obj.id, member_type='pupil')

    def __init__(self, *args, **kwargs):
        super(ContestAdminMixin, self).__init__(*args, **kwargs)


ContestAdmin.mix_in(ContestAdminMixin)

if 'oioioi.simpleui' not in settings.INSTALLED_APPS:
    personal_menu_registry.register(
        'create_contest',
        _("New contest"),
        lambda request: reverse('oioioiadmin:contests_contest_add'),
        lambda request: request.user.has_perm('teachers.teacher'),
        order=10)
else:
    personal_menu_registry.register(
        'teacher_dashboard',
        _("Contests"),
        lambda request: reverse('teacher_dashboard'),
        lambda request: request.user.has_perm('teachers.teacher'),
        order=5)
예제 #8
0
    def has_delete_permission(self, request, obj=None):
        return request.user.is_superuser


class ContestAdminWithExclusivenessInlineMixin(object):
    def __init__(self, *args, **kwargs):
        super(ContestAdminWithExclusivenessInlineMixin, self) \
            .__init__(*args, **kwargs)
        self.inlines = self.inlines + [ExclusivenessConfigInline]

    def save_formset(self, request, form, formset, change):
        instances = formset.save()
        for obj in instances:
            if not (isinstance(obj, ExclusivenessConfig) and obj.enabled):
                continue
            qs = ExclusivenessConfig.objects.get_active_between(
                obj.start_date, obj.end_date).select_related('contest')
            qs = [
                ex_conf for ex_conf in qs if ex_conf.contest != request.contest
            ]
            if qs:
                contest_names = ', '.join(
                    [ex_conf.contest.name for ex_conf in qs])
                msg = _("The following contests' exclusion times"
                        " overlap with the current one: %s. Watch out, because"
                        " it may cause conflicts!") % contest_names
                messages.warning(request, msg)


ContestAdmin.mix_in(ContestAdminWithExclusivenessInlineMixin)
예제 #9
0

class DisqualificationsConfigInline(admin.TabularInline):
    model = DisqualificationsConfig
    category = _("Advanced")
    formfield_overrides = {
        models.TextField: {
            'widget': Textarea(attrs={'rows': 2})
        },
    }

    def has_add_permission(self, request):
        return is_contest_admin(request)

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

    def has_delete_permission(self, request, obj=None):
        return is_contest_admin(request)


class DisqualificationsAdminMixin(object):
    """Adds :class:`~oioioi.disqualification.models.DisqualificationsConfigInline`
    to an admin panel."""
    def __init__(self, *args, **kwargs):
        super(DisqualificationsAdminMixin, self).__init__(*args, **kwargs)
        self.inlines = self.inlines + [DisqualificationsConfigInline]


ContestAdmin.mix_in(DisqualificationsAdminMixin)
예제 #10
0
파일: admin.py 프로젝트: kinjelom/oioioi
        return super(PrizeInline, self) \
                .formfield_for_foreignkey(db_field, request, **kwargs)


class PrizesAdminMixin(object):
    """Adds :class:`~oioioi.prizes.models.PrizeGiving` and
       :class:`~oioioi.prizes.models.Prize` to an admin panel and prize giving
       scheduling on save.
    """

    def __init__(self, *args, **kwargs):
        super(PrizesAdminMixin, self).__init__(*args, **kwargs)
        self.inlines = self.inlines + [PrizeGivingInline, PrizeInline]

    def save_related(self, request, *args, **kwargs):
        super(PrizesAdminMixin, self).save_related(request, *args, **kwargs)

        if not request.contest:
            return

        pgs_for_scheduling = request.contest.prizegiving_set \
                .select_for_update() \
                .filter(state='NOT_SCHEDULED', date__isnull=False)

        for pg in pgs_for_scheduling:
            pg.schedule()


ContestAdmin.mix_in(PrizesAdminMixin)
contest_site.contest_register(PrizeForUser)
예제 #11
0
파일: permissions.py 프로젝트: tmkkk/oioioi
def can_create_contest(request):
    return ContestAdmin(
        Contest, AdminSite(name='oioioiadmin')).has_add_permission(request)
예제 #12
0
        if obj or not use_usercontest_admin_form(request):
            return super(UserContestAdminMixin,
                         self).get_form(request, obj, **kwargs)

        return modelform_factory(
            self.model,
            form=UserContestForm,
            formfield_callback=partial(self.formfield_for_dbfield,
                                       request=request),
        )

    def get_inline_instances(self, request, obj=None):
        if not use_usercontest_admin_form(request):
            return super(UserContestAdminMixin,
                         self).get_inline_instances(request, obj)

        _inlines = super(UserContestAdminMixin,
                         self).get_inline_instances(request, obj)
        custom_inline = UserRoundInline(self.model, self.admin_site)
        modified_inlines = []
        for inline in _inlines:
            if isinstance(inline, RoundInline):
                modified_inlines.append(custom_inline)
            else:
                modified_inlines.append(inline)

        return modified_inlines


ContestAdmin.mix_in(UserContestAdminMixin)
예제 #13
0
파일: admin.py 프로젝트: sio2project/oioioi
from oioioi.base import admin
from oioioi.complaints.models import ComplaintsConfig
from oioioi.contests.admin import ContestAdmin


class ComplaintsConfigInline(admin.TabularInline):
    model = ComplaintsConfig


class ComplaintsAdminMixin(object):
    """Adds :class:`~oioioi.complaints.models.ComplaintConfig` to an admin
       panel.
    """

    def __init__(self, *args, **kwargs):
        super(ComplaintsAdminMixin, self) \
            .__init__(*args, **kwargs)
        self.inlines = self.inlines + [ComplaintsConfigInline]
ContestAdmin.mix_in(ComplaintsAdminMixin)
예제 #14
0
파일: admin.py 프로젝트: matrach/oioioi
from oioioi.base import admin
from oioioi.contestlogo.models import ContestLogo
from oioioi.contests.admin import ContestAdmin


class ContestLogoInline(admin.TabularInline):
    model = ContestLogo


class ContestLogoAdminMixin(object):
    def __init__(self, *args, **kwargs):
        super(ContestLogoAdminMixin, self).__init__(*args, **kwargs)
        self.inlines = self.inlines + [ContestLogoInline]
ContestAdmin.mix_in(ContestLogoAdminMixin)
예제 #15
0
파일: admin.py 프로젝트: sio2project/oioioi
        if instance.access_key:
            url = reverse('balloons_access_set_cookie', kwargs={
                'contest_id': instance.contest.id,
                'access_key': instance.access_key
            })
            return make_html_link(url, url)
        else:
            return _("Not yet generated")
    access_link.short_description = _("Access link")

    def regeneration_link(self, instance):
        return make_html_link(
            reverse('balloons_access_regenerate',
                    kwargs={'contest_id': instance.contest.id}),
            _("Regenerate key"),
            'POST'
        )
    regeneration_link.short_description = _("Regeneration link")


class BalloonsDeliveryAccessDataAdminMixin(object):
    """Adds :class:`~oioioi.balloons.BalloonsDeliveryAccessData` fields to an
       admin panel.
    """

    def __init__(self, *args, **kwargs):
        super(BalloonsDeliveryAccessDataAdminMixin, self) \
            .__init__(*args, **kwargs)
        self.inlines = self.inlines + [BalloonsDeliveryAccessDataInline]
ContestAdmin.mix_in(BalloonsDeliveryAccessDataAdminMixin)
예제 #16
0
from oioioi.base import admin
from oioioi.statistics.models import StatisticsConfig
from oioioi.contests.admin import ContestAdmin


class StatisticsConfigInline(admin.TabularInline):
    model = StatisticsConfig


class StatisticsAdminMixin(object):
    def __init__(self, *args, **kwargs):
        super(StatisticsAdminMixin, self) \
            .__init__(*args, **kwargs)
        self.inlines = self.inlines + [StatisticsConfigInline]


ContestAdmin.mix_in(StatisticsAdminMixin)
예제 #17
0
파일: admin.py 프로젝트: matrach/oioioi
from oioioi.base import admin
from oioioi.complaints.models import ComplaintsConfig
from oioioi.contests.admin import ContestAdmin


class ComplaintsConfigInline(admin.TabularInline):
    model = ComplaintsConfig


class ComplaintsAdminMixin(object):
    def __init__(self, *args, **kwargs):
        super(ComplaintsAdminMixin, self) \
            .__init__(*args, **kwargs)
        self.inlines = self.inlines + [ComplaintsConfigInline]


ContestAdmin.mix_in(ComplaintsAdminMixin)
예제 #18
0
파일: admin.py 프로젝트: papedaniel/oioioi
    def has_add_permission(self, request):
        return request.user.is_superuser

    def has_change_permission(self, request, obj=None):
        return request.user.is_superuser

    def has_delete_permission(self, request, obj=None):
        return request.user.is_superuser


class MailSubmissionConfigAdminMixin(object):
    def __init__(self, *args, **kwargs):
        super(MailSubmissionConfigAdminMixin, self).__init__(*args, **kwargs)
        self.inlines = self.inlines + [MailSubmissionConfigInline]
ContestAdmin.mix_in(MailSubmissionConfigAdminMixin)


class MailSubmissionAdmin(admin.ModelAdmin):
    list_display = ['id', 'user_login', 'user_full_name', 'date',
                    'problem_instance', 'related_submission', 'accepted_by']
    list_display_links = None
    list_filter = [ProblemNameListFilter]
    date_hierarchy = 'date'
    actions = ['accept_action']
    search_fields = ['user__username', 'user__last_name']

    def get_list_select_related(self):
        return super(MailSubmissionAdmin, self).get_list_select_related() \
            + ['user', 'accepted_by', 'problem_instance__problem',
               'submission',
예제 #19
0
파일: admin.py 프로젝트: sio2project/oioioi
    def get_queryset(self, request):
        qs = super(TeamsAdmin, self).get_queryset(request)
        qs = qs.filter(contest=request.contest)
        return qs

    def save_form(self, request, *args, **kwargs):
        obj = super(TeamsAdmin, self).save_form(request, *args, **kwargs)
        obj.contest = request.contest
        return obj


contest_site.contest_register(Team, TeamsAdmin)
contest_admin_menu_registry.register('teams', _("Teams"),
    lambda request: reverse('oioioiadmin:teams_team_changelist'),
    condition=teams_enabled, order=30)


class TeamsConfigInline(admin.TabularInline):
    model = TeamsConfig


class TeamsAdminMixin(object):
    """Adds :class:`~oioioi.teams.models.TeamsConfig` to an admin panel.
    """

    def __init__(self, *args, **kwargs):
        super(TeamsAdminMixin, self).__init__(*args, **kwargs)
        self.inlines = self.inlines + [TeamsConfigInline]
ContestAdmin.mix_in(TeamsAdminMixin)
예제 #20
0
파일: admin.py 프로젝트: marmistrz/oioioi
        return request.user.is_superuser

    def has_change_permission(self, request, obj=None):
        return request.user.is_superuser

    def has_delete_permission(self, request, obj=None):
        return request.user.is_superuser


class MailSubmissionConfigAdminMixin(object):
    def __init__(self, *args, **kwargs):
        super(MailSubmissionConfigAdminMixin, self).__init__(*args, **kwargs)
        self.inlines = self.inlines + [MailSubmissionConfigInline]


ContestAdmin.mix_in(MailSubmissionConfigAdminMixin)


class MailSubmissionAdmin(admin.ModelAdmin):
    list_display = [
        'id', 'user_login', 'user_full_name', 'date', 'problem_instance',
        'related_submission', 'accepted_by'
    ]
    list_display_links = None
    list_filter = [ProblemNameListFilter]
    date_hierarchy = 'date'
    actions = ['accept_action']
    search_fields = ['user__username', 'user__last_name']

    def get_list_select_related(self):
        return super(MailSubmissionAdmin, self).get_list_select_related() \
예제 #21
0
파일: admin.py 프로젝트: sbarzowski/oioioi
from oioioi.base import admin
from oioioi.statistics.models import StatisticsConfig
from oioioi.contests.admin import ContestAdmin


class StatisticsConfigInline(admin.TabularInline):
    model = StatisticsConfig


class StatisticsAdminMixin(object):
    def __init__(self, *args, **kwargs):
        super(StatisticsAdminMixin, self) \
            .__init__(*args, **kwargs)
        self.inlines = self.inlines + [StatisticsConfigInline]
ContestAdmin.mix_in(StatisticsAdminMixin)
예제 #22
0
파일: admin.py 프로젝트: pragacz/oioioi
    'teams',
    _("Teams"),
    lambda request: reverse('oioioiadmin:teams_team_changelist'),
    condition=teams_enabled & is_contest_admin,
    order=30)


class TeamsConfigInline(admin.TabularInline):
    model = TeamsConfig
    category = _("Advanced")

    def has_add_permission(self, request):
        return is_contest_admin(request)

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

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


class TeamsAdminMixin(object):
    """Adds :class:`~oioioi.teams.models.TeamsConfig` to an admin panel.
    """
    def __init__(self, *args, **kwargs):
        super(TeamsAdminMixin, self).__init__(*args, **kwargs)
        self.inlines = self.inlines + [TeamsConfigInline]


ContestAdmin.mix_in(TeamsAdminMixin)
예제 #23
0
파일: admin.py 프로젝트: sio2project/oioioi
        return True

    def has_delete_permission(self, request, obj=None):
        return False


class ProgramsConfigAdminMixin(object):
    """Adds :class:`~oioioi.programs.models.ProgramsConfig` to an admin
       panel.
    """

    def __init__(self, *args, **kwargs):
        super(ProgramsConfigAdminMixin, self) \
            .__init__(*args, **kwargs)
        self.inlines = self.inlines + [ProgramsConfigInline]
ContestAdmin.mix_in(ProgramsConfigAdminMixin)


class LibraryProblemDataAdminMixin(object):
    """Adds :class:`~oioioi.programs.models.LibraryProblemData` to an admin
       panel.
    """

    def __init__(self, *args, **kwargs):
        super(LibraryProblemDataAdminMixin, self).__init__(*args, **kwargs)
        self.inlines = self.inlines + [LibraryProblemDataInline]


class ProgrammingProblemAdminMixin(object):
    """Adds :class:`~oioioi.programs.models.ReportActionsConfig`,
       :class:`~oioioi.programs.models.OutputChecker` and
예제 #24
0
파일: admin.py 프로젝트: wczyz/oioioi
        return is_contest_admin(request)

    def has_delete_permission(self, request, obj=None):
        return is_contest_admin(request)


class StatementConfigAdminMixin(object):
    """Adds :class:`~oioioi.contests.models.ProblemStatementConfig` to an admin
       panel.
    """
    def __init__(self, *args, **kwargs):
        super(StatementConfigAdminMixin, self).__init__(*args, **kwargs)
        self.inlines = self.inlines + [StatementConfigInline]


ContestAdmin.mix_in(StatementConfigAdminMixin)


class StatementInline(admin.TabularInline):
    model = ProblemStatement
    can_delete = False
    readonly_fields = ['language', 'content_link']
    fields = readonly_fields

    def has_add_permission(self, request):
        return False

    def has_change_permission(self, request, obj=None):
        return True

    def has_delete_permission(self, request, obj=None):
예제 #25
0

class ProgramsContestAdminMixin(object):
    """Adds :class:`~oioioi.programs.models.ProgramsConfig`
       and :class:`~oioioi.programs.models.ContestCompiler` to an admin
       panel.
    """
    def __init__(self, *args, **kwargs):
        super(ProgramsContestAdminMixin, self) \
            .__init__(*args, **kwargs)
        self.inlines = self.inlines + [
            ProgramsConfigInline, ContestCompilerInline
        ]


ContestAdmin.mix_in(ProgramsContestAdminMixin)


class LibraryProblemDataAdminMixin(object):
    """Adds :class:`~oioioi.programs.models.LibraryProblemData` to an admin
       panel.
    """
    def __init__(self, *args, **kwargs):
        super(LibraryProblemDataAdminMixin, self).__init__(*args, **kwargs)
        self.inlines = self.inlines + [LibraryProblemDataInline]


class ProgrammingProblemAdminMixin(object):
    """Adds :class:`~oioioi.programs.models.ReportActionsConfig`,
       :class:`~oioioi.programs.models.OutputChecker`,
       :class:`~oioioi.programs.models.LibraryProblemData` and
예제 #26
0
            )
            return make_html_link(href, instance.filename)
        return None

    logo_link.short_description = _("Filename")


class ContestLogoAdminMixin(object):
    """Adds :class:`~oioioi.contestlogo.models.ContestLogo` to an admin panel."""

    def __init__(self, *args, **kwargs):
        super(ContestLogoAdminMixin, self).__init__(*args, **kwargs)
        self.inlines = self.inlines + [ContestLogoInline]


ContestAdmin.mix_in(ContestLogoAdminMixin)


class ContestIconInline(admin.TabularInline):
    model = ContestIcon
    extra = 0
    readonly_fields = ['icon_link']
    exclude = ['updated_at']
    category = _("Advanced")

    def icon_link(self, instance):
        if instance.id is not None:
            href = reverse(
                'icon_image_view',
                kwargs={
                    'icon_id': str(instance.id),
예제 #27
0
파일: admin.py 프로젝트: sio2project/oioioi
            kwargs['queryset'] = User.objects.filter(id__in=admin_ids) \
                    .order_by('username')

        return super(MessageNotifierConfigInline, self) \
                .formfield_for_foreignkey(db_field, request, **kwargs)


class MessageNotifierContestAdminMixin(object):
    """Adds :class:`~oioioi.questions.models.MessageNotifierConfig` to an admin
       panel.
    """

    def __init__(self, *args, **kwargs):
        super(MessageNotifierContestAdminMixin, self).__init__(*args, **kwargs)
        self.inlines = self.inlines + [MessageNotifierConfigInline]
ContestAdmin.mix_in(MessageNotifierContestAdminMixin)


class ReplyTemplateAdmin(admin.ModelAdmin):

    def get_list_display(self, request):
        if is_superuser(request):
            return ['visible_name', 'content', 'contest', 'usage_count']
        return ['visible_name', 'content', 'usage_count']

    def get_list_filter(self, request):
        if is_superuser(request):
            return ['contest']
        return []

    def get_readonly_fields(self, request, obj=None):