import uuid from django.db import models class Account(models.Model): id = models.UUIDField(primary_key=True, default=uuid.uuid4, editable=False) uid = models.CharField(max_length=48, unique=True) email = models.EmailField() ldap_dn = models.CharField(max_length=1024) ldap_uuid = models.CharField(max_length=64, unique=True) oidc_sub = models.CharField(max_length=512, unique=True, null=True) stripe_customer = models.CharField(max_length=128, unique=True, null=True) checkout_id = models.CharField(max_length=128, blank=True) checkout_key = models.UUIDField(default=uuid.uuid4) last_billing_sync = models.DateTimeField(null=True) last_ldap_sync = models.DateTimeField(null=True) created_at = models.DateTimeField(auto_now_add=True) class Registration(models.Model): token_hash = models.CharField(max_length=64, primary_key=True) uid = models.CharField(max_length=48) email = models.EmailField() expires_at = models.DateTimeField(db_index=True) class RateWindow(models.Model): key = models.CharField(max_length=64, primary_key=True) count = models.PositiveIntegerField(default=0) expires_at = models.DateTimeField(db_index=True) class Subscription(models.Model): stripe_id = models.CharField(max_length=128, primary_key=True) account = models.ForeignKey(Account, on_delete=models.CASCADE, related_name="subscriptions") tier = models.CharField(max_length=48, blank=True) status = models.CharField(max_length=32) paid_until = models.DateTimeField(null=True) cancel_at_period_end = models.BooleanField(default=False) class ManagedGroup(models.Model): """Retain old mappings so removing a tier from config also revokes its group.""" account = models.ForeignKey(Account, on_delete=models.CASCADE, related_name="managed_groups") dn = models.CharField(max_length=1024) class Meta: constraints = [models.UniqueConstraint(fields=["account", "dn"], name="unique_account_group")] class WebhookEvent(models.Model): stripe_id = models.CharField(max_length=128, primary_key=True) account = models.ForeignKey(Account, on_delete=models.CASCADE, null=True) received_at = models.DateTimeField(auto_now_add=True) processed_at = models.DateTimeField(null=True)