models.py 1.9 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455
  1. __package__ = 'archivebox.api'
  2. import secrets
  3. from archivebox.uuid_compat import uuid7
  4. from datetime import timedelta
  5. from django.conf import settings
  6. from django.db import models
  7. from django.utils import timezone
  8. from django_stubs_ext.db.models import TypedModelMeta
  9. from signal_webhooks.models import WebhookBase
  10. from archivebox.base_models.models import get_or_create_system_user_pk
  11. def generate_secret_token() -> str:
  12. return secrets.token_hex(16)
  13. class APIToken(models.Model):
  14. id = models.UUIDField(primary_key=True, default=uuid7, editable=False, unique=True)
  15. created_by = models.ForeignKey(settings.AUTH_USER_MODEL, on_delete=models.CASCADE, default=get_or_create_system_user_pk, null=False)
  16. created_at = models.DateTimeField(default=timezone.now, db_index=True)
  17. modified_at = models.DateTimeField(auto_now=True)
  18. token = models.CharField(max_length=32, default=generate_secret_token, unique=True)
  19. expires = models.DateTimeField(null=True, blank=True)
  20. class Meta(TypedModelMeta):
  21. app_label = 'api'
  22. verbose_name = "API Key"
  23. verbose_name_plural = "API Keys"
  24. def __str__(self) -> str:
  25. return self.token
  26. @property
  27. def token_redacted(self):
  28. return f'************{self.token[-4:]}'
  29. def is_valid(self, for_date=None):
  30. return not self.expires or self.expires >= (for_date or timezone.now())
  31. class OutboundWebhook(WebhookBase):
  32. id = models.UUIDField(primary_key=True, default=uuid7, editable=False, unique=True)
  33. created_by = models.ForeignKey(settings.AUTH_USER_MODEL, on_delete=models.CASCADE, default=get_or_create_system_user_pk, null=False)
  34. created_at = models.DateTimeField(default=timezone.now, db_index=True)
  35. modified_at = models.DateTimeField(auto_now=True)
  36. class Meta(WebhookBase.Meta):
  37. app_label = 'api'
  38. verbose_name = 'API Outbound Webhook'
  39. def __str__(self) -> str:
  40. return f'[{self.id}] {self.ref} -> {self.endpoint}'