From 813d3cc2666b950752957f52b59983649e4e065a Mon Sep 17 00:00:00 2001 From: Joshua Laymon Date: Sat, 16 Aug 2025 20:23:32 +0000 Subject: [PATCH] Add web/core/models_user.py --- web/core/models_user.py | 55 +++++++++++++++++++++++++++++++++++++++++ 1 file changed, 55 insertions(+) create mode 100644 web/core/models_user.py diff --git a/web/core/models_user.py b/web/core/models_user.py new file mode 100644 index 0000000..ce69d64 --- /dev/null +++ b/web/core/models_user.py @@ -0,0 +1,55 @@ +# core/models_user.py +from django.conf import settings +from django.db import models +from django.contrib.auth import get_user_model + +User = get_user_model() + + +class UserPrefs(models.Model): + user = models.OneToOneField(User, on_delete=models.CASCADE, related_name="prefs") + font_size = models.CharField( + max_length=12, + choices=[ + ("small", "Small"), + ("default", "Default"), + ("large", "Large"), + ("xlarge", "Extra Large"), + ], + default="default", + ) + + def __str__(self): + return f"UserPrefs({self.user_id}, font={self.font_size})" + + +class SearchHistory(models.Model): + """ + Stores the last 10 searches per user. We de-duplicate only consecutive identical ones. + """ + user = models.ForeignKey(User, on_delete=models.CASCADE, related_name="search_history") + q = models.CharField(max_length=1000, blank=True, default="") + # Selected fields at time of search, e.g. {"subject": true, "application": false, ...} + selected = models.JSONField(default=dict) + created_at = models.DateTimeField(auto_now_add=True) + + class Meta: + indexes = [models.Index(fields=["user", "-created_at"])] + + def __str__(self): + return f"SearchHistory(u={self.user_id}, q={self.q!r})" + + +class ViewedIllustration(models.Model): + """ + Logged after 10 seconds of visibility on an entry page. Keep 50 per user. + """ + user = models.ForeignKey(User, on_delete=models.CASCADE, related_name="recent_views") + entry = models.ForeignKey("core.Entry", on_delete=models.CASCADE) + viewed_at = models.DateTimeField(auto_now_add=True) + + class Meta: + indexes = [models.Index(fields=["user", "-viewed_at"])] + + def __str__(self): + return f"ViewedIllustration(u={self.user_id}, e={self.entry_id})" \ No newline at end of file