Skip to content

Commit a606270

Browse files
committed
feat(import): skip duplicate records during CSV import
1 parent e16bc35 commit a606270

1 file changed

Lines changed: 32 additions & 0 deletions

File tree

app/routes/api.py

Lines changed: 32 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -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+
34123437
def 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

Comments
 (0)