|
12 | 12 | from django.utils.safestring import mark_safe
|
13 | 13 | from django.utils.translation import gettext_lazy as _
|
14 | 14 | from django.utils.translation import gettext_noop
|
| 15 | +from django.db.models import Min, Max, Q |
15 | 16 |
|
16 | 17 | from oioioi.base.utils import (
|
17 | 18 | ObjectWithMixins,
|
|
21 | 22 | from oioioi.base.utils.query_helpers import Q_always_true
|
22 | 23 | from oioioi.contests.models import (
|
23 | 24 | Contest,
|
| 25 | + ProblemInstance, |
24 | 26 | ProblemStatementConfig,
|
25 | 27 | RankingVisibilityConfig,
|
| 28 | + LimitsVisibilityConfig, |
26 | 29 | Round,
|
27 | 30 | RoundTimeExtension,
|
28 | 31 | ScoreReport,
|
|
41 | 44 | last_break_between_rounds,
|
42 | 45 | rounds_times,
|
43 | 46 | visible_problem_instances,
|
| 47 | + process_instances_to_limits, |
44 | 48 | )
|
45 | 49 | from oioioi.problems.controllers import ProblemController
|
46 | 50 |
|
@@ -586,6 +590,19 @@ def can_see_statement(self, request_or_context, problem_instance):
|
586 | 590 | def default_can_see_statement(self, request_or_context, problem_instance):
|
587 | 591 | return True
|
588 | 592 |
|
| 593 | + def can_see_problems_limits(self, request): |
| 594 | + context = self.make_context(request) |
| 595 | + lvc = LimitsVisibilityConfig.objects.filter(contest=context.contest) |
| 596 | + if lvc.exists() and lvc[0].visible == 'YES': |
| 597 | + return True |
| 598 | + elif lvc.exists() and lvc[0].visible == 'NO': |
| 599 | + return False |
| 600 | + else: |
| 601 | + return self.default_can_see_problems_limits(request) |
| 602 | + |
| 603 | + def default_can_see_problems_limits(self, request): |
| 604 | + return False |
| 605 | + |
589 | 606 | def can_submit(self, request, problem_instance, check_round_times=True):
|
590 | 607 | """Determines if the current user is allowed to submit a solution for
|
591 | 608 | the given problem.
|
@@ -641,6 +658,105 @@ def is_submissions_limit_exceeded(self, request, problem_instance, kind=None):
|
641 | 658 | request, problem_instance, kind
|
642 | 659 | )
|
643 | 660 |
|
| 661 | + def get_problems_limits(self, request): |
| 662 | + """Returns a dictionary containing data about time and memory limits for a given ProblemInstance: |
| 663 | + ProblemInstanceID -> { |
| 664 | + 'default': (min_time, max_time, min_memory, max_memory), |
| 665 | + 'cpp': (min_time, max_time, min_memory, max_memory), |
| 666 | + 'py': (min_time, max_time, min_memory, max_memory) |
| 667 | + } |
| 668 | + Corresponding dictionary is None if no limits exist |
| 669 | + """ |
| 670 | + |
| 671 | + instances = ProblemInstance.objects.filter(contest=request.contest).annotate( |
| 672 | + # default limits |
| 673 | + min_time=Min('test__time_limit', filter=Q(test__is_active=True)), |
| 674 | + max_time=Max('test__time_limit', filter=Q(test__is_active=True)), |
| 675 | + min_memory=Min('test__memory_limit', filter=Q(test__is_active=True)), |
| 676 | + max_memory=Max('test__memory_limit', filter=Q(test__is_active=True)), |
| 677 | + |
| 678 | + # cpp overridden limits |
| 679 | + cpp_min_time=Min( |
| 680 | + 'test__languageoverridefortest__time_limit', |
| 681 | + filter=Q(test__languageoverridefortest__language='cpp') & Q(test__is_active=True) |
| 682 | + ), |
| 683 | + cpp_max_time=Max( |
| 684 | + 'test__languageoverridefortest__time_limit', |
| 685 | + filter=Q(test__languageoverridefortest__language='cpp') & Q(test__is_active=True) |
| 686 | + ), |
| 687 | + cpp_min_memory=Min( |
| 688 | + 'test__languageoverridefortest__memory_limit', |
| 689 | + filter=Q(test__languageoverridefortest__language='cpp') & Q(test__is_active=True) |
| 690 | + ), |
| 691 | + cpp_max_memory=Max( |
| 692 | + 'test__languageoverridefortest__memory_limit', |
| 693 | + filter=Q(test__languageoverridefortest__language='cpp') & Q(test__is_active=True) |
| 694 | + ), |
| 695 | + |
| 696 | + # python overridden limits |
| 697 | + py_min_time=Min( |
| 698 | + 'test__languageoverridefortest__time_limit', |
| 699 | + filter=Q(test__languageoverridefortest__language='py') & Q(test__is_active=True) |
| 700 | + ), |
| 701 | + py_max_time=Max( |
| 702 | + 'test__languageoverridefortest__time_limit', |
| 703 | + filter=Q(test__languageoverridefortest__language='py') & Q(test__is_active=True) |
| 704 | + ), |
| 705 | + py_min_memory=Min( |
| 706 | + 'test__languageoverridefortest__memory_limit', |
| 707 | + filter=Q(test__languageoverridefortest__language='py') & Q(test__is_active=True) |
| 708 | + ), |
| 709 | + py_max_memory=Max( |
| 710 | + 'test__languageoverridefortest__memory_limit', |
| 711 | + filter=Q(test__languageoverridefortest__language='py') & Q(test__is_active=True) |
| 712 | + ), |
| 713 | + |
| 714 | + # non-overridden test limits in cpp |
| 715 | + cpp_min_time_non_overridden=Min( |
| 716 | + 'test__time_limit', |
| 717 | + filter=~Q(test__languageoverridefortest__language='cpp') & Q(test__is_active=True) |
| 718 | + ), |
| 719 | + cpp_max_time_non_overridden=Max( |
| 720 | + 'test__time_limit', |
| 721 | + filter=~Q(test__languageoverridefortest__language='cpp') & Q(test__is_active=True) |
| 722 | + ), |
| 723 | + cpp_min_memory_non_overridden=Min( |
| 724 | + 'test__memory_limit', |
| 725 | + filter=~Q(test__languageoverridefortest__language='cpp') & Q(test__is_active=True) |
| 726 | + ), |
| 727 | + cpp_max_memory_non_overridden=Max( |
| 728 | + 'test__memory_limit', |
| 729 | + filter=~Q(test__languageoverridefortest__language='cpp') & Q(test__is_active=True) |
| 730 | + ), |
| 731 | + |
| 732 | + # non-overridden test limits in python |
| 733 | + py_min_time_non_overridden=Min( |
| 734 | + 'test__time_limit', |
| 735 | + filter=~Q(test__languageoverridefortest__language='py') & Q(test__is_active=True) |
| 736 | + ), |
| 737 | + py_max_time_non_overridden=Max( |
| 738 | + 'test__time_limit', |
| 739 | + filter=~Q(test__languageoverridefortest__language='py') & Q(test__is_active=True) |
| 740 | + ), |
| 741 | + py_min_memory_non_overridden=Min( |
| 742 | + 'test__memory_limit', |
| 743 | + filter=~Q(test__languageoverridefortest__language='py') & Q(test__is_active=True) |
| 744 | + ), |
| 745 | + py_max_memory_non_overridden=Max( |
| 746 | + 'test__memory_limit', |
| 747 | + filter=~Q(test__languageoverridefortest__language='py') & Q(test__is_active=True) |
| 748 | + ), |
| 749 | + ).values( |
| 750 | + 'id', |
| 751 | + 'min_time', 'max_time', 'min_memory', 'max_memory', |
| 752 | + 'cpp_min_time', 'cpp_max_time', 'cpp_min_memory', 'cpp_max_memory', |
| 753 | + 'cpp_min_time_non_overridden', 'cpp_max_time_non_overridden', 'cpp_min_memory_non_overridden', 'cpp_max_memory_non_overridden', |
| 754 | + 'py_min_time', 'py_max_time', 'py_min_memory', 'py_max_memory', |
| 755 | + 'py_min_time_non_overridden', 'py_max_time_non_overridden', 'py_min_memory_non_overridden', 'py_max_memory_non_overridden' |
| 756 | + ) |
| 757 | + |
| 758 | + return process_instances_to_limits(instances) |
| 759 | + |
644 | 760 | def adjust_submission_form(self, request, form, problem_instance):
|
645 | 761 | # by default delegate to ProblemController
|
646 | 762 | problem_instance.problem.controller.adjust_submission_form(
|
|
0 commit comments