58 lines
1.7 KiB
Python
58 lines
1.7 KiB
Python
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
|