v0.148.0
 1from __future__ import annotations
 2
 3from plain import postgres
 4from plain.postgres import types
 5from plain.utils import timezone
 6
 7__all__ = ["APIKey"]
 8
 9
10@postgres.register_model
11class APIKey(postgres.Model):
12    uuid = types.UUIDField(generate=True)
13    created_at = types.DateTimeField(create_now=True)
14    updated_at = types.DateTimeField(create_now=True, update_now=True)
15    expires_at = types.DateTimeField(required=False, allow_null=True)
16    last_used_at = types.DateTimeField(required=False, allow_null=True)
17
18    name = types.TextField(max_length=255, required=False)
19
20    token = types.RandomStringField(length=40)
21
22    api_version = types.TextField(max_length=255, required=False)
23
24    query: postgres.QuerySet[APIKey] = postgres.QuerySet()
25
26    model_options = postgres.Options(
27        constraints=[
28            postgres.UniqueConstraint(
29                fields=["uuid"], name="plainapi_apikey_unique_uuid"
30            ),
31            postgres.UniqueConstraint(
32                fields=["token"], name="plainapi_apikey_unique_token"
33            ),
34        ],
35    )
36
37    def __str__(self) -> str:
38        return self.name or str(self.uuid)
39
40    def is_expired(self) -> bool:
41        if self.expires_at is None:
42            return False
43        return self.expires_at < timezone.now()