66 lines
2.5 KiB
Python
66 lines
2.5 KiB
Python
from flask import Blueprint, redirect, session, request, flash, url_for
|
|
from definitions.models import Asset, db
|
|
from functions.validate_values import validate_values
|
|
from config import item_attributes
|
|
import json
|
|
|
|
confirm_save_bp = Blueprint('confirm_save', __name__)
|
|
|
|
@confirm_save_bp.route('/confirm_save', methods=['POST'])
|
|
def confirm_save():
|
|
# Check if assets data is present in the request
|
|
if 'assets' not in request.form:
|
|
flash("No assets data found in the request.", "error")
|
|
return redirect(url_for('uploadcsv.import_from_csv'))
|
|
|
|
try:
|
|
# Parse the JSON data from the form
|
|
edited_assets = json.loads(request.form['assets'])
|
|
except json.JSONDecodeError:
|
|
flash("Invalid JSON data in the request.", "error")
|
|
return redirect(url_for('uploadcsv.import_from_csv'))
|
|
|
|
# Validate each asset
|
|
errors = []
|
|
for i, asset_data in enumerate(edited_assets, start=1):
|
|
error = validate_values(asset_data)
|
|
if error:
|
|
errors.append(f"Row {i}: {error}")
|
|
|
|
if errors:
|
|
# If there are validation errors, flash them and redirect back to the preview page
|
|
for error in errors:
|
|
flash(error, "error")
|
|
return redirect(url_for('uploadcsv.import_from_csv'))
|
|
|
|
# Save validated assets to the database
|
|
for asset_data in edited_assets:
|
|
primary_attrib = next((attrib for attrib in item_attributes if attrib.primary), None)
|
|
if not primary_attrib:
|
|
flash("Primary attribute not defined in configuration.", "error")
|
|
return redirect(url_for('uploadcsv.import_from_csv'))
|
|
|
|
primary_value = asset_data[primary_attrib.attrib_name]
|
|
asset = Asset.query.filter_by(**{primary_attrib.attrib_name: primary_value}).first()
|
|
|
|
if asset:
|
|
# Update existing asset
|
|
for attrib in item_attributes:
|
|
setattr(asset, attrib.attrib_name, asset_data[attrib.attrib_name])
|
|
else:
|
|
# Add new asset
|
|
asset = Asset(**asset_data)
|
|
db.session.add(asset)
|
|
|
|
try:
|
|
db.session.commit()
|
|
except Exception as e:
|
|
db.session.rollback()
|
|
flash(f"Error saving data to the database: {str(e)}", "error")
|
|
return redirect(url_for('uploadcsv.import_from_csv'))
|
|
|
|
# Clear session data after successful insertion
|
|
session.pop('new_entries', None)
|
|
session.pop('existing_entries', None)
|
|
session.pop('invalid_entries', None)
|
|
return redirect('/viewall') |