Skip to content

Commit 00f496b

Browse files
authored
Interactive task via IO change (#396)
* Interactive task changes after ONTAK * Add migration * Update test packages * Fix tests * Bump required sioworkers version * Remove tmp hack
1 parent c8f04ff commit 00f496b

File tree

10 files changed

+66
-7
lines changed

10 files changed

+66
-7
lines changed

oioioi/interactive/controllers.py

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
from django.utils.translation import gettext_lazy as _
22

33
from oioioi.filetracker.utils import django_to_filetracker_path
4-
from oioioi.interactive.models import Interactor
4+
from oioioi.interactive.models import Interactor, InteractiveTaskInfo
55
from oioioi.programs.controllers import ProgrammingProblemController
66

77

@@ -13,6 +13,8 @@ def fill_evaluation_environ(self, environ, submission, **kwargs):
1313

1414
interactor = Interactor.objects.get(problem=self.problem)
1515
environ['interactor_file'] = django_to_filetracker_path(interactor.exe_file)
16+
info = InteractiveTaskInfo.objects.get(problem=self.problem)
17+
environ['num_processes'] = info.num_processes
1618

1719
environ['task_type_suffix'] = '-interactive-exec'
1820

Lines changed: 23 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,23 @@
1+
# Generated by Django 4.2.13 on 2024-07-10 11:33
2+
3+
from django.db import migrations, models
4+
import django.db.models.deletion
5+
6+
7+
class Migration(migrations.Migration):
8+
9+
dependencies = [
10+
('problems', '0031_auto_20220328_1124'),
11+
('interactive', '0001_initial'),
12+
]
13+
14+
operations = [
15+
migrations.CreateModel(
16+
name='InteractiveTaskInfo',
17+
fields=[
18+
('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
19+
('num_processes', models.IntegerField(default=1, verbose_name="number of user's processes to run")),
20+
('problem', models.OneToOneField(on_delete=django.db.models.deletion.CASCADE, to='problems.problem')),
21+
],
22+
),
23+
]

oioioi/interactive/models.py

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -17,3 +17,10 @@ class Interactor(models.Model):
1717
class Meta(object):
1818
verbose_name = _("interactive executable file")
1919
verbose_name_plural = _("interactive executable files"),
20+
21+
22+
class InteractiveTaskInfo(models.Model):
23+
problem = models.OneToOneField(Problem, on_delete=models.CASCADE)
24+
num_processes = models.IntegerField(
25+
verbose_name=_("number of user's processes to run"), default=1
26+
)

oioioi/programs/handlers.py

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -295,6 +295,8 @@ def run_tests(env, kind=None, **kwargs):
295295
job['upload_out'] = True
296296
if env.get('interactor_file'):
297297
job['interactor_file'] = env['interactor_file']
298+
if env.get('num_processes'):
299+
job['num_processes'] = env['num_processes']
298300
job['untrusted_checker'] = env['untrusted_checker']
299301
jobs[test_name] = job
300302
extra_args = env.get('sioworkers_extra_args', {}).get(kind, {})

oioioi/sinolpack/controllers.py

Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
from django.utils.translation import gettext_lazy as _
22

3+
from oioioi.interactive.controllers import InteractiveProblemController
34
from oioioi.programs.controllers import ProgrammingProblemController
45
from oioioi.sinolpack.admin import SinolpackProblemAdminMixin
56
from oioioi.sinolpack.utils import add_extra_files
@@ -18,3 +19,18 @@ def mixins_for_admin(self):
1819
return super(SinolProblemController, self).mixins_for_admin() + (
1920
SinolpackProblemAdminMixin,
2021
)
22+
23+
24+
class SinolInteractiveProblemController(InteractiveProblemController):
25+
description = _("Sinol package interactive problem")
26+
27+
def fill_evaluation_environ(self, environ, submission, **kwargs):
28+
super(SinolInteractiveProblemController, self).fill_evaluation_environ(
29+
environ, submission, **kwargs
30+
)
31+
add_extra_files(environ, self.problem)
32+
33+
def mixins_for_admin(self):
34+
return super(SinolInteractiveProblemController, self).mixins_for_admin() + (
35+
SinolpackProblemAdminMixin,
36+
)
197 Bytes
Binary file not shown.
229 Bytes
Binary file not shown.

oioioi/sinolpack/package.py

Lines changed: 13 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -28,7 +28,7 @@
2828
filetracker_to_django_file,
2929
stream_file,
3030
)
31-
from oioioi.interactive.models import Interactor
31+
from oioioi.interactive.models import Interactor, InteractiveTaskInfo
3232
from oioioi.problems.models import (
3333
Problem,
3434
ProblemAttachment,
@@ -394,7 +394,7 @@ def _get_controller_name(self):
394394
return self.controller_name
395395
return {
396396
TaskType.STANDARD: 'oioioi.sinolpack.controllers.SinolProblemController',
397-
TaskType.INTERACTIVE: 'oioioi.interactive.controllers.InteractiveProblemController',
397+
TaskType.INTERACTIVE: 'oioioi.sinolpack.controllers.SinolInteractiveProblemController',
398398
}[self.task_type]
399399

400400
def _extract_and_process_package(self):
@@ -469,6 +469,16 @@ def _process_config_yml(self):
469469
instance.config = ''
470470
instance.save()
471471
self.config = instance.parsed_config
472+
if self.task_type == TaskType.INTERACTIVE:
473+
self._process_interactive_config()
474+
475+
@_describe_processing_error
476+
def _process_interactive_config(self):
477+
instance, _ = InteractiveTaskInfo.objects.get_or_create(problem=self.problem)
478+
if 'num_processes' in self.config:
479+
instance.num_processes = self.config['num_processes']
480+
instance.save()
481+
472482

473483
@_describe_processing_error
474484
def _detect_task_type(self):
@@ -784,7 +794,7 @@ def _create_instances_for_tests(self):
784794
outs_to_make = []
785795
scored_groups = set()
786796

787-
if self.use_make and not self.config.get('no_outgen', False):
797+
if self.task_type != TaskType.INTERACTIVE and self.use_make and not self.config.get('no_outgen', False):
788798
self._find_and_compile('', command='outgen')
789799

790800
for order, test in enumerate(sorted(all_items, key=naturalsort_key)):

oioioi/sinolpack/tests.py

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -695,8 +695,7 @@ def _check_sigpipe_interactor_package(self, problem):
695695
for test in tests:
696696
test_report = TestReport.objects.get(test=test, submission_report__submission=s1)
697697
self.assertEqual(test_report.status, 'WA')
698-
# HACK: Temporary Fix, just to silent this broken test, to be repaired later
699-
self.assertIn(test_report.comment, ['', 'solution exited prematurely'])
698+
self.assertIn(test_report.comment, 'solution exited prematurely')
700699

701700
s2 = ModelProgramSubmission.objects.get(model_solution=sol_re)
702701
for test in tests:

requirements.txt

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
# These dependencies need to be installed from external sources,
22
# therefore they must be listed here. Moreover, they cannot be listed in
33
# setup.py, as pip is not able to install them.
4-
http://github.com/sio2project/sioworkers/archive/refs/tags/v1.5.3.tar.gz
4+
http://github.com/sio2project/sioworkers/archive/refs/tags/v1.5.5.tar.gz
55

66
-e .

0 commit comments

Comments
 (0)