Memberships

This commit is contained in:
2026-10-23 12:02:50 -04:00
parent 87dd5453e4
commit 6cf0f0525f
42 changed files with 2145 additions and 7 deletions
+57
View File
@@ -0,0 +1,57 @@
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)