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