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