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