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