1from plain import models
2from plain.utils import timezone
3
4
5class CachedItemQuerySet(models.QuerySet):
6 def expired(self):
7 return self.filter(expires_at__lt=timezone.now())
8
9 def unexpired(self):
10 return self.filter(expires_at__gte=timezone.now())
11
12 def forever(self):
13 return self.filter(expires_at=None)
14
15
16@models.register_model
17class CachedItem(models.Model):
18 key = models.CharField(max_length=255)
19 value = models.JSONField(required=False, allow_null=True)
20 expires_at = models.DateTimeField(required=False, allow_null=True)
21 created_at = models.DateTimeField(auto_now_add=True)
22 updated_at = models.DateTimeField(auto_now=True)
23
24 class Meta:
25 queryset_class = CachedItemQuerySet
26 indexes = [
27 models.Index(fields=["expires_at"]),
28 ]
29 constraints = [
30 models.UniqueConstraint(
31 fields=["key"], name="plaincache_cacheditem_unique_key"
32 ),
33 ]
34
35 def __str__(self) -> str:
36 return self.key