39649-vm/core/models.py
2026-04-15 16:15:01 +00:00

81 lines
2.8 KiB
Python

from django.db import models
from django.urls import reverse
class PostizInstallBrief(models.Model):
PACKAGE_MANAGER_CHOICES = [
("pnpm", "pnpm"),
("npm", "npm"),
]
NODE_VERSION_CHOICES = [
("18 LTS", "18 LTS"),
("20 LTS", "20 LTS"),
("22 Current", "22 Current"),
]
EMAIL_PROVIDER_CHOICES = [
("none", "Skip for now"),
("resend", "Resend"),
("smtp", "SMTP / Nodemailer"),
]
UPLOAD_STRATEGY_CHOICES = [
("local", "Local uploads"),
("r2", "Cloudflare R2"),
("later", "Decide later"),
]
title = models.CharField(max_length=120)
public_url = models.URLField(help_text="Public URL where the reverse proxy will expose Postiz.")
node_version = models.CharField(max_length=20, choices=NODE_VERSION_CHOICES, default="20 LTS")
package_manager = models.CharField(max_length=10, choices=PACKAGE_MANAGER_CHOICES, default="pnpm")
postgres_ready = models.BooleanField(default=False)
redis_ready = models.BooleanField(default=False)
temporal_ready = models.BooleanField(default=False)
email_provider = models.CharField(max_length=20, choices=EMAIL_PROVIDER_CHOICES, default="none")
upload_strategy = models.CharField(max_length=20, choices=UPLOAD_STRATEGY_CHOICES, default="local")
notes = models.TextField(blank=True)
created_at = models.DateTimeField(auto_now_add=True)
updated_at = models.DateTimeField(auto_now=True)
class Meta:
ordering = ["-updated_at"]
def __str__(self):
return self.title
def get_absolute_url(self):
return reverse("brief_detail", args=[self.pk])
@property
def ready_services_count(self):
return sum([self.postgres_ready, self.redis_ready, self.temporal_ready])
@property
def readiness_percent(self):
return int((self.ready_services_count / 3) * 100)
@property
def status_label(self):
if self.ready_services_count == 3:
return "Ready for repo bootstrap"
if self.ready_services_count == 0:
return "Blocked by missing services"
return "Infrastructure in progress"
@property
def status_tone(self):
if self.ready_services_count == 3:
return "success"
if self.ready_services_count == 0:
return "danger"
return "warning"
@property
def next_milestone(self):
if self.ready_services_count == 3:
return "Clone the Postiz repository and run the first development boot commands."
if not self.postgres_ready:
return "Provision PostgreSQL and capture DATABASE_URL for the .env file."
if not self.redis_ready:
return "Bring Redis online so background queues can start locally."
return "Prepare Temporal and point TEMPORAL_ADDRESS at the stack."