@@ -3409,6 +3409,31 @@ def _cleanup_temp_file(path):
34093409 pass
34103410
34113411
3412+ def _is_duplicate (data_type , record , vehicle_id ):
3413+ """Check whether a record with the same key fields already exists."""
3414+ if data_type == 'fuel_logs' :
3415+ return db .session .query (FuelLog .id ).filter_by (
3416+ vehicle_id = vehicle_id , date = record .date , odometer = record .odometer ,
3417+ ).first () is not None
3418+ if data_type == 'expenses' :
3419+ return db .session .query (Expense .id ).filter_by (
3420+ vehicle_id = vehicle_id , date = record .date ,
3421+ cost = record .cost , description = record .description ,
3422+ ).first () is not None
3423+ if data_type == 'trips' :
3424+ return db .session .query (Trip .id ).filter_by (
3425+ vehicle_id = vehicle_id , date = record .date ,
3426+ start_odometer = record .start_odometer ,
3427+ end_odometer = record .end_odometer ,
3428+ ).first () is not None
3429+ if data_type == 'charging_sessions' :
3430+ return db .session .query (ChargingSession .id ).filter_by (
3431+ vehicle_id = vehicle_id , date = record .date ,
3432+ kwh_added = record .kwh_added ,
3433+ ).first () is not None
3434+ return False
3435+
3436+
34123437def create_record (data_type , mapped_row , vehicle_id , user_id , date_format , user_date_format = None ):
34133438 """Create a model instance from a mapped CSV row."""
34143439 date_val = parse_date_value (mapped_row .get ('date' , '' ), date_format , user_date_format )
@@ -3662,6 +3687,7 @@ def csv_import_execute():
36623687 rows = list (reader )
36633688
36643689 imported = 0
3690+ skipped = 0
36653691 errors = []
36663692 max_errors = 50
36673693
@@ -3672,6 +3698,9 @@ def csv_import_execute():
36723698 mapped_row [field_name ] = row .get (csv_col , '' )
36733699
36743700 record = create_record (data_type , mapped_row , vehicle_id , current_user .id , date_format , current_user .date_format )
3701+ if _is_duplicate (data_type , record , vehicle_id ):
3702+ skipped += 1
3703+ continue
36753704 db .session .add (record )
36763705 imported += 1
36773706 except (ValueError , KeyError ) as e :
@@ -3683,6 +3712,9 @@ def csv_import_execute():
36833712 label = DATA_TYPE_LABELS .get (data_type , data_type )
36843713 flash (_ ('CSV import complete: %(count)s %(label)s imported.' ) % {'count' : imported , 'label' : label .lower ()}, 'success' )
36853714
3715+ if skipped :
3716+ flash (_ ('%(count)s duplicate(s) skipped.' ) % {'count' : skipped }, 'info' )
3717+
36863718 if errors :
36873719 error_summary = f'{ len (errors )} row(s) skipped due to errors.'
36883720 if len (errors ) <= 10 :
0 commit comments