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})"