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()