Add card_presence feature, device CRUD, CSV export, Update_Rest_WMT_client playbook, migrate_to_wmt dual-path idmasa
This commit is contained in:
163
app/web/wmt.py
163
app/web/wmt.py
@@ -1,7 +1,9 @@
|
||||
"""
|
||||
WMT management web routes – global settings, device registry, update requests.
|
||||
"""
|
||||
from flask import Blueprint, render_template, request, redirect, url_for, flash
|
||||
import csv
|
||||
import io
|
||||
from flask import Blueprint, render_template, request, redirect, url_for, flash, Response
|
||||
from datetime import datetime
|
||||
from app.models import WMTGlobalConfig, Device, WMTUpdateRequest
|
||||
from config.database_config import get_db
|
||||
@@ -202,3 +204,162 @@ def reject_request(req_id):
|
||||
logger.error(f'WMT reject request error: {e}')
|
||||
flash(f'Error rejecting request: {e}', 'error')
|
||||
return redirect(url_for('wmt_web.update_requests'))
|
||||
|
||||
|
||||
# ---------------------------------------------------------------------------
|
||||
# Device registry
|
||||
# ---------------------------------------------------------------------------
|
||||
|
||||
@wmt_web_bp.route('/devices')
|
||||
def devices():
|
||||
"""List all WMT-registered devices."""
|
||||
try:
|
||||
with get_db().get_session() as session:
|
||||
device_list = (
|
||||
session.query(Device)
|
||||
.filter(Device.mac_address.isnot(None))
|
||||
.order_by(Device.nume_masa)
|
||||
.all()
|
||||
)
|
||||
return render_template(
|
||||
'wmt/devices.html',
|
||||
devices=device_list,
|
||||
breadcrumbs=[
|
||||
{'url': url_for('wmt_web.index'), 'title': 'WMT Management'},
|
||||
{'url': url_for('wmt_web.devices'), 'title': 'Devices'},
|
||||
],
|
||||
)
|
||||
except Exception as e:
|
||||
logger.error(f'WMT devices list error: {e}')
|
||||
flash(f'Error: {e}', 'error')
|
||||
return redirect(url_for('wmt_web.index'))
|
||||
|
||||
|
||||
@wmt_web_bp.route('/devices/new', methods=['GET', 'POST'])
|
||||
def device_new():
|
||||
"""Register a new WMT device manually."""
|
||||
if request.method == 'POST':
|
||||
mac = (request.form.get('mac_address') or '').strip().lower()
|
||||
if not mac:
|
||||
flash('MAC address is required.', 'error')
|
||||
return render_template('wmt/device_form.html', device=None)
|
||||
try:
|
||||
with get_db().get_session() as session:
|
||||
existing = session.query(Device).filter_by(mac_address=mac).first()
|
||||
if existing:
|
||||
flash(f'Device with MAC {mac} already exists.', 'error')
|
||||
return render_template('wmt/device_form.html', device=None)
|
||||
device = Device(
|
||||
mac_address=mac,
|
||||
nume_masa=request.form.get('device_name', '').strip(),
|
||||
hostname=request.form.get('hostname', '').strip(),
|
||||
device_ip=request.form.get('device_ip', '').strip() or '127.0.0.1',
|
||||
location=request.form.get('location', '').strip() or None,
|
||||
card_presence=request.form.get('card_presence', 'enable'),
|
||||
description=request.form.get('notes', '').strip() or None,
|
||||
info_reviewed_at=datetime.utcnow(),
|
||||
)
|
||||
session.add(device)
|
||||
flash('Device registered.', 'success')
|
||||
return redirect(url_for('wmt_web.devices'))
|
||||
except Exception as e:
|
||||
logger.error(f'WMT device_new error: {e}')
|
||||
flash(f'Error: {e}', 'error')
|
||||
return render_template('wmt/device_form.html', device=None)
|
||||
|
||||
return render_template(
|
||||
'wmt/device_form.html',
|
||||
device=None,
|
||||
breadcrumbs=[
|
||||
{'url': url_for('wmt_web.index'), 'title': 'WMT Management'},
|
||||
{'url': url_for('wmt_web.devices'), 'title': 'Devices'},
|
||||
{'url': url_for('wmt_web.device_new'), 'title': 'New Device'},
|
||||
],
|
||||
)
|
||||
|
||||
|
||||
@wmt_web_bp.route('/devices/<int:device_id>/edit', methods=['GET', 'POST'])
|
||||
def device_edit(device_id):
|
||||
"""Edit an existing WMT device."""
|
||||
try:
|
||||
with get_db().get_session() as session:
|
||||
device = session.query(Device).filter_by(id=device_id).first()
|
||||
if not device:
|
||||
flash('Device not found.', 'error')
|
||||
return redirect(url_for('wmt_web.devices'))
|
||||
|
||||
if request.method == 'POST':
|
||||
device.nume_masa = request.form.get('device_name', '').strip()
|
||||
device.hostname = request.form.get('hostname', '').strip()
|
||||
device.device_ip = request.form.get('device_ip', '').strip() or device.device_ip
|
||||
device.location = request.form.get('location', '').strip() or None
|
||||
device.card_presence = request.form.get('card_presence', 'enable')
|
||||
device.description = request.form.get('notes', '').strip() or None
|
||||
device.config_updated_at = datetime.utcnow()
|
||||
device.info_reviewed_at = datetime.utcnow()
|
||||
flash('Device updated.', 'success')
|
||||
return redirect(url_for('wmt_web.devices'))
|
||||
|
||||
return render_template(
|
||||
'wmt/device_form.html',
|
||||
device=device,
|
||||
breadcrumbs=[
|
||||
{'url': url_for('wmt_web.index'), 'title': 'WMT Management'},
|
||||
{'url': url_for('wmt_web.devices'), 'title': 'Devices'},
|
||||
{'url': url_for('wmt_web.device_edit', device_id=device_id), 'title': 'Edit'},
|
||||
],
|
||||
)
|
||||
except Exception as e:
|
||||
logger.error(f'WMT device_edit error: {e}')
|
||||
flash(f'Error: {e}', 'error')
|
||||
return redirect(url_for('wmt_web.devices'))
|
||||
|
||||
|
||||
@wmt_web_bp.route('/devices/export.csv')
|
||||
def devices_export_csv():
|
||||
"""Export all WMT devices as a CSV file."""
|
||||
try:
|
||||
with get_db().get_session() as session:
|
||||
device_list = (
|
||||
session.query(Device)
|
||||
.filter(Device.mac_address.isnot(None))
|
||||
.order_by(Device.nume_masa)
|
||||
.all()
|
||||
)
|
||||
output = io.StringIO()
|
||||
writer = csv.writer(output)
|
||||
writer.writerow(['hostname', 'mac_address', 'work_place', 'rfid_card_status'])
|
||||
for d in device_list:
|
||||
writer.writerow([
|
||||
d.hostname or '',
|
||||
d.mac_address or '',
|
||||
d.nume_masa or '',
|
||||
d.card_presence or 'enable',
|
||||
])
|
||||
csv_data = output.getvalue()
|
||||
return Response(
|
||||
csv_data,
|
||||
mimetype='text/csv',
|
||||
headers={'Content-Disposition': 'attachment; filename=wmt_devices.csv'},
|
||||
)
|
||||
except Exception as e:
|
||||
logger.error(f'WMT devices_export_csv error: {e}')
|
||||
flash(f'Export error: {e}', 'error')
|
||||
return redirect(url_for('wmt_web.devices'))
|
||||
|
||||
|
||||
@wmt_web_bp.route('/devices/<int:device_id>/delete', methods=['POST'])
|
||||
def device_delete(device_id):
|
||||
"""Delete a WMT device."""
|
||||
try:
|
||||
with get_db().get_session() as session:
|
||||
device = session.query(Device).filter_by(id=device_id).first()
|
||||
if device:
|
||||
session.delete(device)
|
||||
flash('Device deleted.', 'success')
|
||||
else:
|
||||
flash('Device not found.', 'error')
|
||||
except Exception as e:
|
||||
logger.error(f'WMT device_delete error: {e}')
|
||||
flash(f'Error: {e}', 'error')
|
||||
return redirect(url_for('wmt_web.devices'))
|
||||
|
||||
Reference in New Issue
Block a user