Files
Netbox-Store/netbox_plugin/netbox_plugin_store/models.py
T
MrBlake f36d6be511
CI / php-store (push) Waiting to run
CI / python-components (push) Waiting to run
feat: add NetBox plugin store
2026-08-24 20:51:25 +02:00

80 lines
3.0 KiB
Python

from __future__ import annotations
from django.conf import settings
from django.db import models
class ManagedPlugin(models.Model):
class State(models.TextChoices):
UNKNOWN = "unknown", "Unknown"
RUNNING = "running", "Operation running"
INSTALLED = "installed", "Installed"
ENABLED = "enabled", "Enabled"
DISABLED = "disabled", "Disabled"
RESTART_REQUIRED = "restart-required", "Restart required"
HANDED_OFF = "handed-off", "Handed to agent"
FAILED = "failed", "Failed"
slug = models.SlugField(max_length=64, unique=True)
name = models.CharField(max_length=200)
package_name = models.CharField(max_length=128)
import_name = models.CharField(max_length=128)
repository_url = models.URLField(max_length=500, blank=True)
installed_version = models.CharField(max_length=64, blank=True)
available_version = models.CharField(max_length=64, blank=True)
enabled = models.BooleanField(default=False)
restart_required = models.BooleanField(default=False)
state = models.CharField(max_length=32, choices=State.choices, default=State.UNKNOWN)
last_error = models.TextField(blank=True)
last_checked = models.DateTimeField(null=True, blank=True)
created = models.DateTimeField(auto_now_add=True)
updated = models.DateTimeField(auto_now=True)
_netbox_private = True
class Meta:
ordering = ("name", "slug")
permissions = (("manage_plugin", "Can execute Plugin Store lifecycle actions"),)
def __str__(self) -> str:
return self.name
class LifecycleAudit(models.Model):
class Status(models.TextChoices):
QUEUED = "queued", "Queued"
RUNNING = "running", "Running"
SUCCEEDED = "succeeded", "Succeeded"
FAILED = "failed", "Failed"
HANDED_OFF = "handed-off", "Handed to host agent"
actor = models.ForeignKey(
settings.AUTH_USER_MODEL,
on_delete=models.SET_NULL,
related_name="+",
null=True,
blank=True,
)
slug = models.SlugField(max_length=64)
action = models.CharField(max_length=16)
requested_version = models.CharField(max_length=64, blank=True)
dry_run = models.BooleanField(default=True)
status = models.CharField(max_length=16, choices=Status.choices, default=Status.QUEUED)
request_data = models.JSONField(default=dict, blank=True)
result_data = models.JSONField(default=dict, blank=True)
error = models.TextField(blank=True)
external_operation_id = models.UUIDField(null=True, blank=True, unique=True)
created = models.DateTimeField(auto_now_add=True)
started = models.DateTimeField(null=True, blank=True)
completed = models.DateTimeField(null=True, blank=True)
_netbox_private = True
class Meta:
ordering = ("-created",)
indexes = (models.Index(fields=("slug", "-created"), name="nbps_audit_slug_created"),)
permissions = (("execute_plugin_lifecycle", "Can request Plugin Store lifecycle execution"),)
def __str__(self) -> str:
return f"{self.action} {self.slug} ({self.status})"