New Plugins: - USB plugin: Device checkout/checkin with employee lookup, checkout history - Notifications plugin: Announcements with types, scheduling, shopfloor display - Network plugin: Network device management with subnets and VLANs - Equipment and Computers plugins: Asset type separation Frontend: - EmployeeSearch component: Reusable employee lookup with autocomplete - USB views: List, detail, checkout/checkin modals - Notifications views: List, form with recognition mode - Network views: Device list, detail, form - Calendar view with FullCalendar integration - Shopfloor and TV dashboard views - Reports index page - Map editor for asset positioning - Light/dark mode fixes for map tooltips Backend: - Employee search API with external lookup service - Collector API for PowerShell data collection - Reports API endpoints - Slides API for TV dashboard - Fixed AppVersion model (removed BaseModel inheritance) - Added checkout_name column to usbcheckouts table Styling: - Unified detail page styles - Improved pagination (page numbers instead of prev/next) - Dark/light mode theme improvements Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
104 lines
3.0 KiB
Python
104 lines
3.0 KiB
Python
"""Communication/network interface models."""
|
|
|
|
from shopdb.extensions import db
|
|
from .base import BaseModel
|
|
|
|
|
|
class CommunicationType(BaseModel):
|
|
"""Types of communication interfaces."""
|
|
__tablename__ = 'communicationtypes'
|
|
|
|
comtypeid = db.Column(db.Integer, primary_key=True)
|
|
comtype = db.Column(db.String(50), unique=True, nullable=False)
|
|
description = db.Column(db.Text)
|
|
|
|
# Types: IP, Serial, USB, VNC, FTP, DNC, Parallel, Network Interface
|
|
|
|
def __repr__(self):
|
|
return f"<CommunicationType {self.comtype}>"
|
|
|
|
|
|
class Communication(BaseModel):
|
|
"""
|
|
Communication interface for an asset (or legacy machine).
|
|
Stores network config, serial settings, etc.
|
|
"""
|
|
__tablename__ = 'communications'
|
|
|
|
communicationid = db.Column(db.Integer, primary_key=True)
|
|
|
|
# New asset-based FK (preferred)
|
|
assetid = db.Column(
|
|
db.Integer,
|
|
db.ForeignKey('assets.assetid'),
|
|
nullable=True,
|
|
index=True,
|
|
comment='FK to assets table (new architecture)'
|
|
)
|
|
|
|
# Legacy machine FK (for backward compatibility during migration)
|
|
machineid = db.Column(
|
|
db.Integer,
|
|
db.ForeignKey('machines.machineid'),
|
|
nullable=True,
|
|
comment='DEPRECATED: FK to machines table - use assetid instead'
|
|
)
|
|
|
|
comtypeid = db.Column(
|
|
db.Integer,
|
|
db.ForeignKey('communicationtypes.comtypeid'),
|
|
nullable=False
|
|
)
|
|
|
|
# Network configuration (for IP type)
|
|
ipaddress = db.Column(db.String(50))
|
|
subnetmask = db.Column(db.String(50))
|
|
gateway = db.Column(db.String(50))
|
|
dns1 = db.Column(db.String(50))
|
|
dns2 = db.Column(db.String(50))
|
|
macaddress = db.Column(db.String(50))
|
|
isdhcp = db.Column(db.Boolean, default=False)
|
|
|
|
# Serial configuration (for Serial type)
|
|
comport = db.Column(db.String(20))
|
|
baudrate = db.Column(db.Integer)
|
|
databits = db.Column(db.Integer)
|
|
stopbits = db.Column(db.String(10))
|
|
parity = db.Column(db.String(20))
|
|
flowcontrol = db.Column(db.String(20))
|
|
|
|
# VNC/FTP configuration
|
|
port = db.Column(db.Integer)
|
|
username = db.Column(db.String(100))
|
|
# Note: passwords should not be stored here - use secure vault
|
|
|
|
# DNC configuration
|
|
pathname = db.Column(db.String(255))
|
|
pathname2 = db.Column(db.String(255), comment='Secondary path for dualpath')
|
|
|
|
# Flags
|
|
isprimary = db.Column(
|
|
db.Boolean,
|
|
default=False,
|
|
comment='Primary communication method'
|
|
)
|
|
ismachinenetwork = db.Column(
|
|
db.Boolean,
|
|
default=False,
|
|
comment='On machine network vs office network'
|
|
)
|
|
|
|
notes = db.Column(db.Text)
|
|
|
|
# Relationships
|
|
comtype = db.relationship('CommunicationType', backref='communications')
|
|
|
|
__table_args__ = (
|
|
db.Index('idx_comm_asset', 'assetid'),
|
|
db.Index('idx_comm_machine', 'machineid'),
|
|
db.Index('idx_comm_ip', 'ipaddress'),
|
|
)
|
|
|
|
def __repr__(self):
|
|
return f"<Communication {self.machineid}:{self.comtype.comtype if self.comtype else 'Unknown'}>"
|