from app.core.extensions import db import json from datetime import datetime import ipaddress from flask_login import UserMixin # Import User from auth instead of defining it here from app.core.auth import User class Location(db.Model): __tablename__ = "locations" id = db.Column(db.Integer, primary_key=True) name = db.Column(db.String(255), nullable=False) description = db.Column(db.Text, nullable=True) user_id = db.Column(db.Integer, db.ForeignKey("users.id"), nullable=False) created_at = db.Column(db.DateTime, default=datetime.utcnow) updated_at = db.Column(db.DateTime, default=datetime.utcnow, onupdate=datetime.utcnow) # Relationships subnets = db.relationship("Subnet", backref="location_ref", lazy=True, cascade="all, delete-orphan") standalone_servers = db.relationship( "Server", primaryjoin="and_(Server.location_id==Location.id, Server.subnet_id==None)", backref="location_ref", lazy=True ) def __repr__(self): return f"" class Subnet(db.Model): __tablename__ = "subnets" id = db.Column(db.Integer, primary_key=True) cidr = db.Column(db.String(45), nullable=False) location_id = db.Column(db.Integer, db.ForeignKey("locations.id"), nullable=False) user_id = db.Column(db.Integer, db.ForeignKey("users.id"), nullable=False) auto_scan = db.Column(db.Boolean, default=False) active_hosts = db.Column(db.Text, default='[]') last_scanned = db.Column(db.DateTime, nullable=True) created_at = db.Column(db.DateTime, default=datetime.utcnow) updated_at = db.Column(db.DateTime, default=datetime.utcnow, onupdate=datetime.utcnow) # Relationships servers = db.relationship("Server", backref="subnet", lazy=True) def __repr__(self): return f"" @property def used_ips(self): """Number of IPs used in this subnet (servers)""" return len(self.servers) # Getter and setter for active_hosts as JSON @property def active_hosts_list(self): if not self.active_hosts: return [] return json.loads(self.active_hosts) @active_hosts_list.setter def active_hosts_list(self, hosts): self.active_hosts = json.dumps(hosts) class Server(db.Model): __tablename__ = "servers" id = db.Column(db.Integer, primary_key=True) hostname = db.Column(db.String(255), nullable=False) ip_address = db.Column(db.String(45), nullable=False) subnet_id = db.Column(db.Integer, db.ForeignKey("subnets.id"), nullable=True) location_id = db.Column(db.Integer, db.ForeignKey("locations.id"), nullable=True) user_id = db.Column(db.Integer, db.ForeignKey("users.id"), nullable=False) description = db.Column(db.Text, nullable=True) created_at = db.Column(db.DateTime, default=datetime.utcnow) updated_at = db.Column(db.DateTime, default=datetime.utcnow, onupdate=datetime.utcnow) # Relationships apps = db.relationship("App", back_populates="server", lazy=True, cascade="all, delete-orphan") def __repr__(self): return f"" class App(db.Model): __tablename__ = "apps" id = db.Column(db.Integer, primary_key=True) name = db.Column(db.String(64), nullable=False) server_id = db.Column(db.Integer, db.ForeignKey("servers.id"), nullable=False) user_id = db.Column(db.Integer, db.ForeignKey("users.id"), nullable=False) documentation = db.Column(db.Text, nullable=True) url = db.Column(db.String(255), nullable=True) created_at = db.Column(db.DateTime, default=datetime.utcnow) updated_at = db.Column(db.DateTime, default=datetime.utcnow, onupdate=datetime.utcnow) # Relationships server = db.relationship("Server", back_populates="apps") ports = db.relationship("Port", back_populates="app", lazy=True, cascade="all, delete-orphan") def __repr__(self): return f"" class Port(db.Model): __tablename__ = "ports" id = db.Column(db.Integer, primary_key=True) app_id = db.Column(db.Integer, db.ForeignKey("apps.id"), nullable=False) port_number = db.Column(db.Integer, nullable=False) protocol = db.Column(db.String(10), nullable=False, default="TCP") description = db.Column(db.String(255), nullable=True) created_at = db.Column(db.DateTime, default=datetime.utcnow) updated_at = db.Column(db.DateTime, default=datetime.utcnow, onupdate=datetime.utcnow) # Relationships app = db.relationship("App", back_populates="ports") __table_args__ = ( db.UniqueConstraint('app_id', 'port_number', 'protocol', name='unique_port_per_app_protocol'), ) def __repr__(self): return f""