import django
from django.conf import settings
from django.template.response import TemplateResponse
from django.urls import reverse
from django.utils.translation import gettext_lazy as _
from oioioi.base.main_page import register_main_page_view
from oioioi.contests.controllers import submission_template_context
from oioioi.contests.models import Submission
from oioioi.contests.processors import recent_contests
from oioioi.contests.utils import visible_contests
from oioioi.problems.utils import filter_my_all_visible_submissions
# from oioioi.base.navbar_links import navbar_links_registry
# navbar_links_registry.register(
# name='courses',
# text=_("Kursy"),
# url_generator=lambda request: 'https://kursy.szkopul.edu.pl',
# order=400,
# )
# TODO Add Portals main page to the menu:
# navbar_links_registry.register(
# name='portals',
# text=_("Portals"),
# ...
# )
@register_main_page_view(order=100)
[docs]def main_page_view(request):
to_show = getattr(settings, 'NUM_RECENT_CONTESTS', 7)
rcontests = recent_contests(request)
contests = list(visible_contests(request).difference(rcontests))
contests.sort(key=lambda x: x.creation_date, reverse=True)
contests = (rcontests + contests)[:to_show]
submissions = []
show_scores = False
if request.user.is_authenticated:
queryset = Submission.objects.filter(user=request.user).order_by('-date')
to_show = getattr(settings, 'NUM_PANEL_SUBMISSIONS', 7)
# limit queryset size, because filtering all submissions is slow
queryset = queryset[:to_show]
limit_queryset_ids = [submission.id for submission in queryset]
queryset = Submission.objects.filter(id__in=limit_queryset_ids).select_related(
'user',
'problem_instance',
'problem_instance__contest',
'problem_instance__round',
'problem_instance__problem',
)
submissions_list = filter_my_all_visible_submissions(
request, queryset
).order_by('-date')
submissions = [
submission_template_context(request, s) for s in submissions_list
]
show_scores = any(s['can_see_score'] for s in submissions)
context = {
'contests': contests,
'submissions': submissions,
'show_scores': show_scores,
}
return TemplateResponse(request, 'main-page.html', context)