4747from 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
5152from cms .db .filecacher import FileCacher
5253from 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