Sep-03-2024, 05:50 AM
You said:
now what i want is when i am clicking export selected rules button it should check are all fields of sfd credentials are present for ex ; sfd server o project id and if all the fields of sfd are saved then only export selected rules please do this much and give me fully updated app.py and home.html
from flask import Flask, render_template, request, redirect, url_for, jsonify import sqlite3 import os import requests from datetime import datetime import xml.etree.ElementTree as ET import logging app = Flask(__name__) app.config['DATABASE'] = 'sfd_credentials.db' app.config['UPLOAD_FOLDER'] = 'uploads/' # Set up logging logging.basicConfig(level=logging.INFO) logger = logging.getLogger(__name__) # Database connection def get_db(): conn = sqlite3.connect(app.config['DATABASE']) conn.row_factory = sqlite3.Row return conn # Initialize database def init_db(): with app.app_context(): db = get_db() cursor = db.cursor() cursor.execute(''' CREATE TABLE IF NOT EXISTS credentials ( id INTEGER PRIMARY KEY AUTOINCREMENT, sfm_server TEXT NOT NULL, sfm_port TEXT NOT NULL, impl_name TEXT NOT NULL, business_unit_id TEXT NOT NULL, username TEXT NOT NULL, password TEXT NOT NULL ) ''') db.commit() # Fetch the latest credentials from the database def get_latest_credentials(): conn = get_db() cursor = conn.cursor() cursor.execute('SELECT * FROM credentials ORDER BY id DESC LIMIT 1') credentials = cursor.fetchone() conn.close() return credentials # Process exported rules XML file class Rule_SFM: all_rules = [] def __init__(self, rule_json): self.name = rule_json.get('name') self.code = rule_json.get('code') # Add more fields as necessary def process_exported_rules(xml_file_path): try: tree = ET.parse(xml_file_path) root = tree.getroot() for rule in root.findall('.//Rule'): rule_json = { 'name': rule.find('Name').text, 'code': rule.find('Code').text, # Add more fields if necessary } sfm_rule = Rule_SFM(rule_json) Rule_SFM.all_rules.append(sfm_rule) for rule in Rule_SFM.all_rules: logger.info(f"Processed Rule: {rule.name}") return Rule_SFM.all_rules except Exception as e: logger.error(f"An error occurred while processing the XML file: {e}") return None @app.route('/') def home(): credentials = get_latest_credentials() rules = [] return render_template('home.html', credentials=credentials, rules=rules) @app.route('/submit_credentials', methods=['POST']) def submit_credentials(): sfm_server = request.form.get('sfm_server') sfm_port = request.form.get('sfm_port') impl_name = request.form.get('impl_name') business_unit_id = request.form.get('business_unit_id') username = request.form.get('username') password = request.form.get('password') if not all([sfm_server, sfm_port, impl_name, business_unit_id, username, password]): return redirect(url_for('home', error='Missing one or more required fields.')) conn = get_db() try: cursor = conn.cursor() cursor.execute(''' INSERT INTO credentials (sfm_server, sfm_port, impl_name, business_unit_id, username, password) VALUES (?, ?, ?, ?, ?, ?) ''', (sfm_server, sfm_port, impl_name, business_unit_id, username, password)) conn.commit() except Exception as e: logger.error(f"An error occurred: {e}") finally: conn.close() return redirect(url_for('home')) @app.route('/fetch_rules', methods=['POST']) def fetch_rules(): credentials = get_latest_credentials() if not credentials: return render_template('home.html', error='No credentials found. Please submit credentials first.') sfm_server = credentials['sfm_server'] sfm_port = credentials['sfm_port'] impl_name = credentials['impl_name'] business_unit_id = credentials['business_unit_id'] username = credentials['username'] password = credentials['password'] url = f"http://{sfm_server}:{sfm_port}/{impl_name}/rest/businessunits/{business_unit_id}/rules" try: response = requests.get(url, auth=(username, password)) response.raise_for_status() data = response.json() rules = data.get('items', []) return render_template('home.html', credentials=credentials, rules=rules) except requests.RequestException as e: logger.error(f"Failed to fetch rules: {e}") return render_template('home.html', credentials=credentials, error=str(e)) @app.route('/export_rules', methods=['POST']) def export_rules(): # Extract selected rules selected_rules = request.form.getlist('selected_rules') # Fetch the latest credentials credentials = get_latest_credentials() if not credentials: return jsonify({'error': 'No credentials found. Please submit credentials first.'}), 400 # Extract credentials for the SFM API call sfm_server = credentials['sfm_server'] sfm_port = credentials['sfm_port'] impl_name = credentials['impl_name'] business_unit_id = credentials['business_unit_id'] username = credentials['username'] password = credentials['password'] # Construct the JSON body for the POST request json_body = [{"id": int(rule_id)} for rule_id in selected_rules] try: # Make the POST request to the SFM API response = requests.post( f'http://{sfm_server}:{sfm_port}/{impl_name}/rest/businessunits/{business_unit_id}/exportRules', headers={ 'Content-Type': 'application/json', 'Accept': 'text/xml; charset=utf-8' }, json=json_body, auth=(username, password) ) response.raise_for_status() xml_response = response.text # Save the XML response to a file todays_date = datetime.now().strftime('%Y%m%d') rule_count = len(selected_rules) total_count = 0 # Adjust this as needed filename = f"{business_unit_id}_{todays_date}_{rule_count}_{total_count}.xml" file_path = os.path.join(app.config['UPLOAD_FOLDER'], filename) with open(file_path, 'w') as file: file.write(xml_response) # Process the saved XML file using the function we created processed_rules = process_exported_rules(file_path) # Return a success message or handle errors if processed_rules: return jsonify({'file': filename, 'message': 'Rules exported and processed successfully'}) else: return jsonify({'file': filename, 'message': 'Rules exported but processing failed'}), 500 except requests.RequestException as e: logger.error(f"API request failed: {e}") return jsonify({'error': str(e)}), 500 @app.route('/send_to_sfd', methods=['POST']) def send_to_sfd(): selected_rules = request.form.getlist('selected_rules') # Placeholder for sending rules to SFD print("Selected rules to send to SFD:", selected_rules) # Example logic here: # url = 'http://sfd_server:port/some_endpoint' # response = requests.post(url, json={'rules': selected_rules}) # if response.ok: # return redirect(url_for('home')) # else: # return render_template('home.html', error='Error sending rules to SFD.') return redirect(url_for('home')) if __name__ == '__main__': if not os.path.exists(app.config['UPLOAD_FOLDER']): os.makedirs(app.config['UPLOAD_FOLDER']) init_db() app.run(debug=True)this is my app.py
Output:<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>SFM to SFD Rule Migration Tool</title>
<link href="https://cdn.jsdelivr.net/npm/[email protected]/dist/css/bootstrap.min.css" rel="stylesheet">
<style>
body {
padding: 0;
margin: 0;
font-family: Arial, sans-serif;
}
.header, .footer {
background-color: #007bff;
color: white;
padding: 10px 20px;
position: relative;
width: 100%;
}
.footer {
position: fixed;
bottom: 0;
}
.container {
padding: 20px;
}
.form-section, .rules-section {
margin-bottom: 30px;
}
.rules-section table {
width: 100%;
}
.rules-section th, .rules-section td {
padding: 8px;
text-align: left;
border-bottom: 1px solid #ddd;
}
.btn-group {
display: flex;
justify-content: space-between;
}
.config-menu {
display: none;
position: absolute;
top: 100%;
right: 0;
background-color: #f8f9fa;
border: 1px solid #ddd;
z-index: 1000;
width: 200px;
}
.config-menu a {
display: block;
padding: 10px;
color: #007bff;
text-decoration: none;
}
.config-menu a:hover {
background-color: #e9ecef;
}
.header .btn {
background-color: #007bff;
color: white;
border: none;
}
.header .btn:hover {
background-color: #0056b3;
}
.header .gear-icon {
cursor: pointer;
width: 30px;
margin-left: 10px;
}
.form-section {
display: none; /* Hide form-section initially */
}
.form-section.active {
display: block;
}
</style>
</head>
<body>
<div class="header d-flex justify-content-between align-items-center">
<h1 class="mb-0">SFM to SFD Rule Migration Tool</h1>
<div>
<button id="configureBtn" class="btn btn-primary">Configure</button>
<img src="{{ url_for('static', filename='icons8-gear-50.png') }}" class="gear-icon" id="gearIcon" alt="Settings">
</div>
<div id="configMenu" class="config-menu">
<a href="#" id="sfmCredentialsLink">SFM Credentials</a>
<a href="#" id="sfdCredentialsLink">SFD Credentials</a>
</div>
</div>
<div class="container">
<div id="sfmCredentialsSection" class="form-section">
<form method="POST" id="sfmForm" action="{{ url_for('fetch_rules') }}">
<div class="mb-3">
<label for="sfm_server" class="form-label">SFM Server</label>
<input type="text" class="form-control" id="sfm_server" name="sfm_server" required>
</div>
<div class="mb-3">
<label for="sfm_port" class="form-label">SFM Port</label>
<input type="text" class="form-control" id="sfm_port" name="sfm_port" required>
</div>
<div class="mb-3">
<label for="impl_name" class="form-label">Implementation Name</label>
<input type="text" class="form-control" id="impl_name" name="impl_name" required>
</div>
<div class="mb-3">
<label for="business_unit_id" class="form-label">Business Unit ID</label>
<input type="text" class="form-control" id="business_unit_id" name="business_unit_id" required>
</div>
<div class="mb-3">
<label for="username" class="form-label">Username</label>
<input type="text" class="form-control" id="username" name="username" required>
</div>
<div class="mb-3">
<label for="password" class="form-label">Password</label>
<input type="password" class="form-control" id="password" name="password" required>
</div>
<div class="btn-group">
<button type="submit" class="btn btn-primary" id="saveCredentialsBtn">Save</button>
</div>
</form>
</div>
{% if rules %}
<div class="rules-section">
<h2>Fetched Rules</h2>
<form method="POST" action="{{ url_for('export_rules') }}">
<table class="table table-striped">
<thead>
<tr>
<th>Select</th>
<th>Rule ID</th>
<th>Rule Name</th>
<th>Description</th>
</tr>
</thead>
<tbody>
{% for rule in rules %}
<tr>
<td><input type="checkbox" name="selected_rules" value="{{ rule.id }}"></td>
<td>{{ rule.id }}</td>
<td>{{ rule.name }}</td>
<td>{{ rule.description }}</td>
</tr>
{% endfor %}
</tbody>
</table>
<button type="submit" class="btn btn-info">Export Selected Rules</button>
</form>
</div>
{% else %}
<p>update SFM and SFD credentials</p>
{% endif %}
{% if error %}
<div class="alert alert-danger" role="alert">
{{ error }}
</div>
{% endif %}
<!-- SFD Credentials section -->
<div id="sfdCredentialsSection" class="form-section">
<form method="POST" action="#">
<div class="mb-3">
<label for="sfd_server" class="form-label">SFD Server</label>
<input type="text" class="form-control" id="sfd_server" name="sfd_server">
</div>
<div class="mb-3">
<label for="server_ip" class="form-label">Server IP</label>
<input type="text" class="form-control" id="server_ip" name="server_ip">
</div>
<div class="mb-3">
<label for="project_id" class="form-label">Project ID</label>
<input type="text" class="form-control" id="project_id" name="project_id">
</div>
<div class="mb-3">
<label for="msg_class_id" class="form-label">Message Classification ID</label>
<input type="text" class="form-control" id="msg_class_id" name="msg_class_id">
</div>
</form>
</div>
</div>
<div class="footer text-center">
<p>© 2024 SFM to SFD Rule Migration Tool. All rights reserved.</p>
</div>
<script>
// Toggle the configuration menu
document.getElementById('configureBtn').addEventListener('click', function() {
document.getElementById('configMenu').classList.toggle('d-block');
});
// Show SFM Credentials section
document.getElementById('sfmCredentialsLink').addEventListener('click', function() {
document.getElementById('sfmCredentialsSection').classList.add('active');
document.getElementById('sfdCredentialsSection').classList.remove('active');
document.getElementById('configMenu').classList.remove('d-block');
});
// Show SFD Credentials section
document.getElementById('sfdCredentialsLink').addEventListener('click', function() {
document.getElementById('sfdCredentialsSection').classList.add('active');
document.getElementById('sfmCredentialsSection').classList.remove('active');
document.getElementById('configMenu').classList.remove('d-block');
});
</script>
</body>
</html>
this is my home.htmlnow what i want is when i am clicking export selected rules button it should check are all fields of sfd credentials are present for ex ; sfd server o project id and if all the fields of sfd are saved then only export selected rules please do this much and give me fully updated app.py and home.html