88 <study>: Short name of the study to process
99
1010Options:
11+ --before <date> Only download scans added to the server before
12+ the given date. Date format is expected to be
13+ YYYY-MM-DD. Can be combined with --after.
14+ --after <date> Only download scans added to the server after
15+ the given date. Date format is expected to be
16+ YYYY-MM-DD. Can be combined with --before.
1117 -h --help Show this screen.
1218 -q --quiet Suppress output.
1319 -v --verbose Show more output.
1420 -d --debug Show lots of output.
1521 --dry-run
1622
1723"""
24+ import fnmatch
1825import logging
1926import os
2027import shutil
21- import fnmatch
28+ import time
29+ from datetime import datetime
2230
2331import pysftp
2432
@@ -39,6 +47,10 @@ def main():
3947 quiet = arguments ["--quiet" ]
4048 study = arguments ["<study>" ]
4149
50+ start_date , end_date = get_date_range (
51+ arguments ["--after" ], arguments ["--before" ]
52+ )
53+
4254 # setup logging
4355 log_level = logging .WARN
4456
@@ -108,7 +120,40 @@ def main():
108120 # process each folder in turn
109121 logger .debug ("Copying from:{} to:{}"
110122 .format (valid_dir , zips_path ))
111- process_dir (sftp , valid_dir , zips_path )
123+ process_dir (sftp , valid_dir , zips_path ,
124+ start = start_date , end = end_date )
125+
126+
127+ def get_date_range (after_str = None , before_str = None ):
128+ if before_str :
129+ end_date = parse_date (before_str )
130+ else :
131+ end_date = None
132+
133+ if after_str :
134+ start_date = parse_date (after_str )
135+ else :
136+ start_date = None
137+
138+ if start_date and end_date and start_date > end_date :
139+ raise ValueError (
140+ "Start of date range is after the cut off date. When both "
141+ "--after and --before are in use, --after date must precede "
142+ "--before date"
143+ )
144+
145+ return start_date , end_date
146+
147+
148+ def parse_date (date_str ):
149+ try :
150+ dt = datetime .strptime (date_str , "%Y-%m-%d" )
151+ except ValueError as e :
152+ raise ValueError (
153+ "Invalid date format given, expected format YYYY-MM-DD"
154+ ) from e
155+ parsed = time .mktime (dt .timetuple ())
156+ return parsed
112157
113158
114159def get_server_config (cfg ):
@@ -204,7 +249,7 @@ def get_valid_remote_dirs(connection, mrfolders):
204249 return valid_dirs
205250
206251
207- def process_dir (connection , directory , zips_path ):
252+ def process_dir (connection , directory , zips_path , start = None , end = None ):
208253 """Process a directory on the ftp server,
209254 copy new files to zips_path
210255 """
@@ -218,14 +263,18 @@ def process_dir(connection, directory, zips_path):
218263 return
219264 for file_name in files :
220265 if connection .isfile (file_name ):
221- get_file (connection , file_name , zips_path )
266+ get_file (connection , file_name , zips_path ,
267+ start = start , end = end )
222268 else :
223- get_folder (connection , file_name , zips_path )
269+ get_folder (connection , file_name , zips_path ,
270+ start = start , end = end )
224271
225272
226- def get_folder (connection , folder_name , dst_path ):
273+ def get_folder (connection , folder_name , dst_path , start = None , end = None ):
227274 expected_file = os .path .join (dst_path , folder_name + ".zip" )
228- if not download_needed (connection , folder_name , expected_file ):
275+ if not download_needed (connection , folder_name , expected_file ,
276+ start = start , end = end
277+ ):
229278 logger .debug ("File: {} already exists, skipping" .format (folder_name ))
230279 return
231280
@@ -239,26 +288,34 @@ def get_folder(connection, folder_name, dst_path):
239288 new_zip ))
240289
241290
242- def get_file (connection , file_name , zips_path ):
291+ def get_file (connection , file_name , zips_path , start = None , end = None ):
243292 target = os .path .join (zips_path , file_name )
244- if download_needed (connection , file_name , target ):
293+ if download_needed (connection , file_name , target , start = start , end = end ):
245294 logger .info ("Copying new remote file: {}" .format (file_name ))
246295 connection .get (file_name , target , preserve_mtime = True )
247296 else :
248297 logger .debug ("File: {} already exists, skipping" .format (file_name ))
249298
250299
251- def download_needed (sftp , filename , target ):
300+ def download_needed (sftp , filename , target , start = None , end = None ):
252301 """Check if a local copy of the file exists,
253302 If no local copy exists return True
254303 If local copy exists and is older than remote return True
255304 otherwise return false"""
305+
306+ remote_mtime = sftp .stat (filename ).st_mtime
307+
308+ if start and remote_mtime < start :
309+ return False
310+
311+ if end and remote_mtime > end :
312+ return False
313+
256314 if not os .path .isfile (target ):
257315 return True
258316
259317 # check the file modification times
260318 local_mtime = os .path .getmtime (target )
261- remote_mtime = sftp .stat (filename ).st_mtime
262319 if local_mtime < remote_mtime :
263320 return True
264321
0 commit comments