Skip to content

Commit cfafc3f

Browse files
committed
refactor: cache
1 parent fd694b2 commit cfafc3f

File tree

3 files changed

+44
-13
lines changed

3 files changed

+44
-13
lines changed

apps/users/serializers/user.py

Lines changed: 17 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -12,11 +12,15 @@
1212
import re
1313
from collections import defaultdict
1414
from itertools import product
15+
16+
from django.core.cache import cache
1517
from django.core.mail.backends.smtp import EmailBackend
1618
from django.db import transaction
1719
from django.db.models import Q, QuerySet
1820
from rest_framework import serializers
1921
import uuid_utils.compat as uuid
22+
23+
from common.constants.cache_version import Cache_Version
2024
from common.constants.exception_code_constants import ExceptionCodeConstants
2125
from common.constants.permission_constants import RoleConstants, Auth
2226
from common.database_model_manage.database_model_manage import DatabaseModelManage
@@ -36,6 +40,8 @@
3640
r"(?![0-9_!@#$%^&*`~()-+=]+$)[a-zA-Z0-9_!@#$%^&*`~.()-+=]{6,20}$"
3741
)
3842

43+
version, get_key = Cache_Version.SYSTEM.value
44+
3945

4046
class UserProfileResponse(serializers.ModelSerializer):
4147
is_edit_password = serializers.BooleanField(required=True, label=_('Is Edit Password'))
@@ -481,14 +487,13 @@ class Meta:
481487
def is_valid(self, *, raise_exception=False):
482488
super().is_valid(raise_exception=True)
483489
email = self.data.get("email")
484-
# TODO 删除缓存
485-
# cache_code = user_cache.get(email + ':reset_password')
490+
cache_code = cache.get(get_key(email + ':reset_password'), version=version)
486491
if self.data.get('password') != self.data.get('re_password'):
487492
raise AppApiException(ExceptionCodeConstants.PASSWORD_NOT_EQ_RE_PASSWORD.value.code,
488493
ExceptionCodeConstants.PASSWORD_NOT_EQ_RE_PASSWORD.value.message)
489-
# if cache_code != self.data.get('code'):
490-
# raise AppApiException(ExceptionCodeConstants.CODE_ERROR.value.code,
491-
# ExceptionCodeConstants.CODE_ERROR.value.message)
494+
if cache_code != self.data.get('code'):
495+
raise AppApiException(ExceptionCodeConstants.CODE_ERROR.value.code,
496+
ExceptionCodeConstants.CODE_ERROR.value.message)
492497
return True
493498

494499
def reset_password(self):
@@ -502,7 +507,7 @@ def reset_password(self):
502507
password=password_encrypt(self.data.get('password')))
503508
code_cache_key = email + ":reset_password"
504509
# 删除验证码缓存
505-
# user_cache.delete(code_cache_key)
510+
cache.delete(code_cache_key, version=version)
506511
return True
507512

508513

@@ -531,7 +536,7 @@ def is_valid(self, *, raise_exception=False):
531536
raise ExceptionCodeConstants.EMAIL_IS_EXIST.value.to_app_api_exception()
532537
code_cache_key = self.data.get('email') + ":" + self.data.get("type")
533538
code_cache_key_lock = code_cache_key + "_lock"
534-
ttl = None # user_cache.ttl(code_cache_key_lock)
539+
ttl = cache.ttl(code_cache_key_lock)
535540
if ttl is not None:
536541
raise AppApiException(500, _("Do not send emails again within {seconds} seconds").format(
537542
seconds=int(ttl.total_seconds())))
@@ -558,10 +563,10 @@ def send(self):
558563
code_cache_key = email + ":" + state
559564
code_cache_key_lock = code_cache_key + "_lock"
560565
# 设置缓存
561-
# user_cache.set(code_cache_key_lock, code, timeout=datetime.timedelta(minutes=1))
566+
cache.set(get_key(code_cache_key_lock), code, timeout=datetime.timedelta(minutes=1), version=version)
562567
system_setting = QuerySet(SystemSetting).filter(type=SettingType.EMAIL.value).first()
563568
if system_setting is None:
564-
# user_cache.delete(code_cache_key_lock)
569+
cache.delete(get_key(code_cache_key_lock), version=version)
565570
raise AppApiException(1004,
566571
_("The email service has not been set up. Please contact the administrator to set up the email service in [Email Settings]."))
567572
try:
@@ -581,9 +586,9 @@ def send(self):
581586
from_email=system_setting.meta.get('from_email'),
582587
recipient_list=[email], fail_silently=False, connection=connection)
583588
except Exception as e:
584-
# user_cache.delete(code_cache_key_lock)
589+
cache.delete(get_key(code_cache_key_lock))
585590
raise AppApiException(500, f"{str(e)}" + _("Email sending failed"))
586-
# user_cache.set(code_cache_key, code, timeout=datetime.timedelta(minutes=30))
591+
cache.set(get_key(code_cache_key), code, timeout=datetime.timedelta(minutes=30), version=version)
587592
return True
588593

589594

@@ -609,8 +614,7 @@ class CheckCodeSerializer(serializers.Serializer):
609614

610615
def is_valid(self, *, raise_exception=False):
611616
super().is_valid()
612-
#TODO 这里的缓存 需要重新设计
613-
value = None#user_cache.get(self.data.get("email") + ":" + self.data.get("type"))
617+
value = cache.get(get_key(self.data.get("email") + ":" + self.data.get("type")), version=version)
614618
if value is None or value != self.data.get("code"):
615619
raise ExceptionCodeConstants.CODE_ERROR.value.to_app_api_exception()
616620
return True

apps/users/urls.py

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,7 @@
1313
path("user/check_code", views.CheckCode.as_view(), name='check_code'),
1414
path("user/re_password", views.RePasswordView.as_view(), name='re_password'),
1515
path("user/current/send_email", views.SendEmailToCurrentUserView.as_view(), name="send_email_current"),
16+
path("user/current/reset_password", views.ResetCurrentUserPasswordView.as_view(), name="reset_password_current"),
1617
path('workspace/<str:workspace_id>/user_list', views.WorkspaceUserListView.as_view(),
1718
name="test_workspace_id_permission"),
1819
path('workspace/<str:workspace_id>/user/profile', views.TestWorkspacePermissionUserView.as_view(),

apps/users/views/user.py

Lines changed: 26 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,7 @@
66
@date:2025/4/14 19:25
77
@desc:
88
"""
9+
from django.core.cache import cache
910
from django.db.models import QuerySet
1011
from django.utils.translation import gettext_lazy as _
1112
from drf_spectacular.utils import extend_schema
@@ -14,6 +15,7 @@
1415

1516
from common.auth.authenticate import TokenAuth
1617
from common.auth.authentication import has_permissions
18+
from common.constants.cache_version import Cache_Version
1719
from common.constants.permission_constants import PermissionConstants, Permission, Group, Operate
1820
from common.log.log import log
1921
from common.result import result
@@ -295,3 +297,27 @@ def post(self, request: Request):
295297
serializer_obj = SendEmailSerializer(data={'email': request.user.email, 'type': "reset_password"})
296298
if serializer_obj.is_valid(raise_exception=True):
297299
return result.success(serializer_obj.send())
300+
301+
302+
class ResetCurrentUserPasswordView(APIView):
303+
authentication_classes = [TokenAuth]
304+
305+
@extend_schema(methods=['POST'],
306+
summary=_("Modify current user password"),
307+
description=_("Modify current user password"),
308+
operation_id=_("Modify current user password"), # type: ignore
309+
tags=[_("User Management")], # type: ignore
310+
request=ResetPasswordAPI.get_request(),
311+
responses=DefaultModelResponse.get_response())
312+
@log(menu='User management', operate='Modify current user password',
313+
get_operation_object=lambda r, k: {'name': r.user.username},
314+
get_details=get_re_password_details)
315+
def post(self, request: Request):
316+
data = {'email': request.user.email}
317+
data.update(request.data)
318+
serializer_obj = RePasswordSerializer(data=data)
319+
if serializer_obj.reset_password():
320+
version, get_key = Cache_Version.TOKEN.value
321+
cache.delete(get_key(token=request.auth), version=version)
322+
return result.success(True)
323+
return result.error(_("Failed to change password"))

0 commit comments

Comments
 (0)