1import binascii
2import os
3import uuid
4
5from plain import models
6
7
8def generate_token():
9 return binascii.hexlify(os.urandom(20)).decode()
10
11
12@models.register_model
13class APIKey(models.Model):
14 uuid = models.UUIDField(default=uuid.uuid4)
15 created_at = models.DateTimeField(auto_now_add=True)
16 updated_at = models.DateTimeField(auto_now=True)
17 expires_at = models.DateTimeField(required=False, allow_null=True)
18 last_used_at = models.DateTimeField(required=False, allow_null=True)
19
20 name = models.CharField(max_length=255, required=False)
21
22 token = models.CharField(max_length=40, default=generate_token)
23
24 api_version = models.CharField(max_length=255, required=False)
25
26 class Meta:
27 constraints = [
28 models.UniqueConstraint(
29 fields=["uuid"], name="plainapi_apikey_unique_uuid"
30 ),
31 models.UniqueConstraint(
32 fields=["token"], name="plainapi_apikey_unique_token"
33 ),
34 ]
35
36 def __str__(self):
37 return self.name or str(self.uuid)