2727)
2828
2929
30- def generate_csv (fore_name , dose_amount , action_flag , headers = "NHS_NUMBER" , same_id = False , file_key = False ):
30+ def generate_csv (fore_name , dose_amount ,
31+ action_flag , headers = "NHS_NUMBER" ,
32+ same_id = False , file_key = False ,
33+ vax_type = "RSV" , ods = "YGM41" ,
34+ timestamp = None ):
3135 """
3236 Generate a CSV file with 2 or 3 rows depending on the action_flag.
3337
@@ -85,12 +89,7 @@ def generate_csv(fore_name, dose_amount, action_flag, headers="NHS_NUMBER", same
8589 data .append (create_row (unique_id , "fore_name" , dose_amount , "UPDATE" , headers ))
8690
8791 df = pd .DataFrame (data )
88- timestamp = datetime .now (timezone .utc ).strftime ("%Y%m%dT%H%M%S%f" )[:- 3 ]
89- file_name = (
90- f"COVID19_Vaccinations_v4_YGM41_{ timestamp } .csv"
91- if file_key
92- else f"COVID19_Vaccinations_v5_YGM41_{ timestamp } .csv"
93- )
92+ file_name = get_file_name (vax_type , ods , file_key , timestamp )
9493 df .to_csv (file_name , index = False , sep = "|" , quoting = csv .QUOTE_MINIMAL )
9594 return file_name
9695
@@ -138,7 +137,7 @@ def delete_file_from_s3(bucket, key):
138137 raise Exception (f"Unexpected error during file deletion: { e } " )
139138
140139
141- def wait_for_ack_file (ack_prefix , input_file_name , timeout = 120 ):
140+ def wait_for_ack_file (ack_prefix , input_file_name , timeout = 1200 ):
142141 """Poll the ACK_BUCKET for an ack file that contains the input_file_name as a substring."""
143142
144143 filename_without_ext = input_file_name [:- 4 ] if input_file_name .endswith (".csv" ) else input_file_name
@@ -156,6 +155,35 @@ def wait_for_ack_file(ack_prefix, input_file_name, timeout=120):
156155 key = obj ["Key" ]
157156 if search_pattern in key :
158157 return key
158+
159+ time .sleep (5 )
160+ raise AckFileNotFoundError (
161+ f"Ack file matching '{ search_pattern } ' not found in bucket { ACK_BUCKET } within { timeout } seconds."
162+ )
163+
164+
165+ def wait_for_ack_files (ack_prefix , input_file_name , n_files_expected = 1 , timeout = 1200 ):
166+ """Poll the ACK_BUCKET for an ack file that contains the input_file_name as a substring."""
167+
168+ filename_without_ext = input_file_name [:- 4 ] if input_file_name .endswith (".csv" ) else input_file_name
169+ if ack_prefix :
170+ search_pattern = f"{ ACK_PREFIX } { filename_without_ext } "
171+ ack_prefix = ACK_PREFIX
172+ else :
173+ search_pattern = f"{ FORWARDEDFILE_PREFIX } { filename_without_ext } "
174+ ack_prefix = FORWARDEDFILE_PREFIX
175+ start_time = time .time ()
176+ matched_files = []
177+
178+ while time .time () - start_time < timeout :
179+ response = s3_client .list_objects_v2 (Bucket = ACK_BUCKET , Prefix = ack_prefix )
180+ if "Contents" in response :
181+ for obj in response ["Contents" ]:
182+ key = obj ["Key" ]
183+ if search_pattern in key :
184+ matched_files .append (key )
185+ if len (matched_files ) >= n_files_expected :
186+ return matched_files
159187 time .sleep (5 )
160188 raise AckFileNotFoundError (
161189 f"Ack file matching '{ search_pattern } ' not found in bucket { ACK_BUCKET } within { timeout } seconds."
@@ -391,7 +419,7 @@ def upload_config_file(value):
391419 upload_file_to_s3 (PERMISSIONS_CONFIG_FILE_KEY , CONFIG_BUCKET , INPUT_PREFIX )
392420
393421
394- def generate_csv_with_ordered_100000_rows (file_name = None ):
422+ def generate_csv_with_ordered_100000_rows (vax_type , ods ):
395423 """
396424 Generate a CSV where:
397425 - 100 sets of (NEW → UPDATE → DELETE) are created.
@@ -443,8 +471,7 @@ def generate_csv_with_ordered_100000_rows(file_name=None):
443471
444472 # Convert to DataFrame and save as CSV
445473 df = pd .DataFrame (full_data )
446- timestamp = datetime .now (timezone .utc ).strftime ("%Y%m%dT%H%M%S%f" )[:- 3 ]
447- file_name = f"RSV_Vaccinations_v5_YGM41_{ timestamp } .csv" if not file_name else file_name
474+ file_name = get_file_name (vax_type , ods , "5" )
448475 df .to_csv (file_name , index = False , sep = "|" , quoting = csv .QUOTE_MINIMAL )
449476 return file_name
450477
@@ -465,3 +492,19 @@ def verify_final_ack_file(file_key):
465492 f"All values OK: { all_ok } "
466493 )
467494 return True
495+
496+
497+ def get_file_name (vax_type , ods , file_key , timestamp = None ):
498+ version = "4" if file_key else "5"
499+
500+ timestamp = datetime .now (timezone .utc ).strftime ("%Y%m%dT%H%M%S%f" )[:- 3 ] if not timestamp else timestamp
501+ return f"{ vax_type } _Vaccinations_v{ version } _{ ods } _{ timestamp } .csv"
502+
503+
504+ def generate_fileset (name_prefix , version , action_flags ) -> list :
505+ """Generate multiple CSV files with different action flags."""
506+ files = []
507+ for action in action_flags :
508+ file = generate_csv (name_prefix , version , action_flag = action )
509+ files .append (file )
510+ return files
0 commit comments