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 # Connect to a user, for example, from your own model:
25 # api_key = models.OneToOneField(
26 # APIKey,
27 # on_delete=models.CASCADE,
28 # related_name="user",
29 # allow_null=True,
30 # required=False,
31 # )
32
33 class Meta:
34 constraints = [
35 models.UniqueConstraint(
36 fields=["uuid"], name="plainapi_apikey_unique_uuid"
37 ),
38 models.UniqueConstraint(
39 fields=["token"], name="plainapi_apikey_unique_token"
40 ),
41 ]
42
43 def __str__(self):
44 return self.name or str(self.uuid)