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 objects = CachedItemQuerySet.as_manager()
25
26 class Meta:
27 indexes = [
28 models.Index(fields=["expires_at"]),
29 ]
30 constraints = [
31 models.UniqueConstraint(
32 fields=["key"], name="plaincache_cacheditem_unique_key"
33 ),
34 ]
35
36 def __str__(self) -> str:
37 return self.key