Skip to content

Commit d273682

Browse files
committed
feat: Allow DumpExporter to only export tasks
1 parent 9236084 commit d273682

2 files changed

Lines changed: 29 additions & 10 deletions

File tree

cms/db/util.py

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -274,8 +274,8 @@ def get_datasets_to_judge(task):
274274

275275
def enumerate_files(
276276
session, contest=None,
277-
skip_submissions=False, skip_user_tests=False, skip_print_jobs=False,
278-
skip_generated=False):
277+
skip_submissions=False, skip_user_tests=False, skip_users=False,
278+
skip_print_jobs=False, skip_generated=False):
279279
"""Enumerate all the files (by digest) referenced by the
280280
contest.
281281
@@ -302,7 +302,7 @@ def enumerate_files(
302302
queries.append(dataset_q.join(Dataset.testcases)
303303
.with_entities(Testcase.output))
304304

305-
if not skip_submissions:
305+
if not skip_submissions and not skip_users:
306306
submission_q = task_q.join(Task.submissions)
307307
queries.append(submission_q.join(Submission.files)
308308
.with_entities(File.digest))
@@ -312,7 +312,7 @@ def enumerate_files(
312312
.join(SubmissionResult.executables)
313313
.with_entities(Executable.digest))
314314

315-
if not skip_user_tests:
315+
if not skip_user_tests and not skip_users:
316316
user_test_q = task_q.join(Task.user_tests)
317317
queries.append(user_test_q.with_entities(UserTest.input))
318318
queries.append(user_test_q.join(UserTest.files)
@@ -327,7 +327,7 @@ def enumerate_files(
327327
queries.append(user_test_result_q
328328
.with_entities(UserTestResult.output))
329329

330-
if not skip_print_jobs:
330+
if not skip_print_jobs and not skip_users:
331331
queries.append(contest_q.join(Contest.participations)
332332
.join(Participation.printjobs)
333333
.with_entities(PrintJob.digest))

cmscontrib/DumpExporter.py

Lines changed: 24 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -47,6 +47,7 @@
4747
from cms.db import version as model_version, Codename, Filename, \
4848
FilenameSchema, FilenameSchemaArray, Digest, SessionGen, Contest, User, \
4949
Task, Submission, UserTest, SubmissionResult, UserTestResult, PrintJob, \
50+
Admin, Message, Question, Announcement, Participation, \
5051
enumerate_files
5152
from cms.db.filecacher import FileCacher
5253
from cmscommon.datetime import make_timestamp
@@ -136,15 +137,18 @@ class DumpExporter:
136137

137138
def __init__(self, contest_ids, export_target,
138139
dump_files, dump_model, skip_generated,
139-
skip_submissions, skip_user_tests, skip_print_jobs):
140+
skip_submissions, skip_user_tests, skip_users, skip_print_jobs):
140141
if contest_ids is None:
141142
with SessionGen() as session:
142143
contests = session.query(Contest).all()
143144
self.contests_ids = [contest.id for contest in contests]
144-
users = session.query(User).all()
145-
self.users_ids = [user.id for user in users]
146-
tasks = session.query(Task)\
147-
.filter(Task.contest_id.is_(None)).all()
145+
if not skip_users:
146+
users = session.query(User).all()
147+
self.users_ids = [user.id for user in users]
148+
tasks = session.query(Task)\
149+
.filter(Task.contest_id.is_(None)).all()
150+
else:
151+
self.user_ids = []
148152
self.tasks_ids = [task.id for task in tasks]
149153
else:
150154
# FIXME: this is ATM broken, because if you export a contest, you
@@ -158,6 +162,7 @@ def __init__(self, contest_ids, export_target,
158162
self.skip_generated = skip_generated
159163
self.skip_submissions = skip_submissions
160164
self.skip_user_tests = skip_user_tests
165+
self.skip_users = skip_users
161166
self.skip_print_jobs = skip_print_jobs
162167
self.export_target = export_target
163168

@@ -208,6 +213,7 @@ def do_export(self):
208213
session, contest,
209214
skip_submissions=self.skip_submissions,
210215
skip_user_tests=self.skip_user_tests,
216+
skip_users=self.skip_users,
211217
skip_print_jobs=self.skip_print_jobs,
212218
skip_generated=self.skip_generated)
213219
for file_ in files:
@@ -306,6 +312,7 @@ class of the given object), an item for each column property
306312
val = getattr(obj, prp.key)
307313
data[prp.key] = encode_value(col.type, val)
308314

315+
user_related_classes = [User, Admin, UserTest, Submission, PrintJob, Message, Question, Announcement, Participation]
309316
for prp in cls._rel_props:
310317
other_cls = prp.mapper.class_
311318

@@ -317,6 +324,15 @@ class of the given object), an item for each column property
317324
if self.skip_user_tests and other_cls is UserTest:
318325
continue
319326

327+
if self.skip_users:
328+
skip = False
329+
for rel_class in user_related_classes:
330+
if other_cls is rel_class:
331+
skip = True
332+
break
333+
if skip:
334+
continue
335+
320336
# Skip print jobs if requested
321337
if self.skip_print_jobs and other_cls is PrintJob:
322338
continue
@@ -397,6 +413,8 @@ def main():
397413
help="don't export submissions")
398414
parser.add_argument("-U", "--no-user-tests", action="store_true",
399415
help="don't export user tests")
416+
parser.add_argument("-X", "--no-users", action="store_true",
417+
help="don't export users")
400418
parser.add_argument("-P", "--no-print-jobs", action="store_true",
401419
help="don't export print jobs")
402420
parser.add_argument("export_target", action="store",
@@ -412,6 +430,7 @@ def main():
412430
skip_generated=args.no_generated,
413431
skip_submissions=args.no_submissions,
414432
skip_user_tests=args.no_user_tests,
433+
skip_users=args.no_users,
415434
skip_print_jobs=args.no_print_jobs)
416435
success = exporter.do_export()
417436
return 0 if success is True else 1

0 commit comments

Comments
 (0)