From 3590dbbe2bcf0b148be995e917b8c800082bda38 Mon Sep 17 00:00:00 2001 From: Egor fureunoir Gorbunov Date: Mon, 19 May 2025 15:09:45 +0300 Subject: [PATCH] Features: 1) Add caching mechanism for 'recently_viewed' functionality. Fixes: 1) Remove 'recently_viewed' ManyToManyField from User model and related migration; 2) Correct handling of product addition in 'recently_viewed' logic. Extra: Refactor 'recently_viewed' to use cache instead of database field; cleanup unused imports and model attributes. --- vibes_auth/admin.py | 4 ++-- vibes_auth/migrations/0001_initial.py | 3 --- vibes_auth/models.py | 25 +++++++++++++------------ 3 files changed, 15 insertions(+), 17 deletions(-) diff --git a/vibes_auth/admin.py b/vibes_auth/admin.py index c8044758..992bf2bb 100644 --- a/vibes_auth/admin.py +++ b/vibes_auth/admin.py @@ -69,7 +69,7 @@ class UserAdmin(BaseUserAdmin, BasicModelAdmin): }, ), (_("important dates"), {"fields": ("last_login", "date_joined")}), - (_("additional info"), {"fields": ("recently_viewed", "language", "attributes")}), + (_("additional info"), {"fields": ("language", "attributes")}), ) add_fieldsets = ( ( @@ -90,7 +90,7 @@ class UserAdmin(BaseUserAdmin, BasicModelAdmin): "is_subscribed", ) ordering = ("email",) - readonly_fields = ("recently_viewed", "password") + readonly_fields = ("password") form = UserForm def get_queryset(self, request): diff --git a/vibes_auth/migrations/0001_initial.py b/vibes_auth/migrations/0001_initial.py index c4d59e0e..e867215a 100644 --- a/vibes_auth/migrations/0001_initial.py +++ b/vibes_auth/migrations/0001_initial.py @@ -86,9 +86,6 @@ class Migration(migrations.Migration): help_text='The groups this user belongs to. A user will get all permissions granted to each of their groups.', related_name='user_set', related_query_name='user', to='auth.group', verbose_name='groups')), - ('recently_viewed', - models.ManyToManyField(blank=True, help_text='recently viewed products', to='core.product', - verbose_name='recently viwed')), ('user_permissions', models.ManyToManyField(blank=True, help_text='Specific permissions for this user.', related_name='user_set', related_query_name='user', to='auth.permission', verbose_name='user permissions')), diff --git a/vibes_auth/models.py b/vibes_auth/models.py index 19347c83..cf57fffe 100644 --- a/vibes_auth/models.py +++ b/vibes_auth/models.py @@ -2,13 +2,13 @@ from uuid import uuid4 from django.contrib.auth.models import AbstractUser from django.contrib.auth.models import Group as BaseGroup +from django.core.cache import cache from django.db.models import ( BooleanField, CharField, EmailField, ImageField, JSONField, - ManyToManyField, UUIDField, ) from django.utils.translation import gettext_lazy as _ @@ -65,12 +65,6 @@ class User(AbstractUser, NiceModel): is_subscribed = BooleanField( verbose_name=_("is_subscribed"), help_text=_("user's newsletter subscription status"), default=False ) - recently_viewed = ManyToManyField( - "core.Product", - verbose_name=_("recently viwed"), - blank=True, - help_text=_("recently viewed products"), - ) activation_token = UUIDField(default=uuid4, verbose_name=_("activation token")) language = CharField(choices=LANGUAGES, default=LANGUAGE_CODE, null=False, blank=False, max_length=7) @@ -81,12 +75,19 @@ class User(AbstractUser, NiceModel): objects = UserManager() def add_to_recently_viewed(self, product_uuid): - if not self.recently_viewed.filter(uuid=product_uuid).exists(): - if not self.recently_viewed.count() >= 48: - self.recently_viewed.add(product_uuid) + recently_viewed = self.recently_viewed + if not product_uuid in recently_viewed: + if not len(recently_viewed) >= 48: + recently_viewed.append(product_uuid) + cache.set(f"user_{self.uuid}_rv", recently_viewed) else: - self.recently_viewed.remove(self.recently_viewed.first()) - self.recently_viewed.add(product_uuid) + recently_viewed.pop(0) + recently_viewed.append(product_uuid) + cache.set(f"user_{self.uuid}_rv", recently_viewed) + + @property + def recently_viewed(self): + return [] or cache.get(f"user_{self.uuid}_rv") def check_token(self, token): return str(token) == str(self.activation_token)