from .models import * from .serializers import * from projects.models import Project from portfolios.models import Portfolio from projects.serializers import ProjectNocodetoolSerializer from portfolios.serializers import PortfolioNocodetoolSerializer from django.utils import timezone from django.db.models import F from django_redis import get_redis_connection NOCODETOOL_MODEL_MAP = { 'project': Project, 'portfolio': Portfolio, } NOCODETOOL_SERIALIZER_MAP = { 'project': ProjectNocodetoolSerializer, 'portfolio': PortfolioNocodetoolSerializer, } class NocodetoolObjectMapService: @staticmethod def mapping_model_instance(related_type: str, related_id: str): object_model = NOCODETOOL_MODEL_MAP.get(related_type) if not object_model: return None return object_model.objects.filter(id=related_id).first() def mapping_model_serializer(related_type: str): return NOCODETOOL_SERIALIZER_MAP.get(related_type, None) class NocodetoolHitService: def hit_once(obj, request, ttl=60*60*24): user_key = request.user.id if request.user.is_authenticated else request.session.session_key if not user_key: request.session.save() user_key = request.session.session_key() today = timezone.localdate().isoformat() key = f"viewed:obj:{obj.id}:{today}" redis_conn = get_redis_connection("default") added = redis_conn.sadd(key, user_key) if added: if redis_conn.ttl(key) == -1: redis_conn.expire(key, ttl) obj.__class__.objects.filter(id=obj.id).update(view_count=F("view_count") + 1) return True return False