signals.py 7.25 KB
# coding=utf-8
from __future__ import unicode_literals, absolute_import, print_function

import datetime

from django.conf import settings
from django.dispatch import receiver
from django.db.models.signals import post_save

from talos.cache.base import vote_cache
from gm_types.gaia import TOPIC_TYPE
from gm_types.gaia import REPLYOBJECT
from gm_types.gaia import PROBLEM_REVIEW_STATUS_CHOICES

from talos.models import ReplyCollect
from talos.models.topic import TopicVote, Problem, TopicReply, ProblemTag, TopicReplyVote
from talos.models.diary import DiaryVote, Diary, DiaryTag
from talos.services.tag import TagService
from talos.cache.reply import reply_cache
from talos.cache.base import reply_cache as reply_msg_cache

from talos.services.order import OrderService
from talos.services.user import UserService
from talos.tools.vote_tool import VoteTool
from talos.tools.replies_tool import ReplyTool

HOT_DISCUSSION_TAG = u'热门讨论'    # TODO CR


@receiver(post_save, sender=TopicVote)
def topicvote_post_save(sender, instance, created, **kwargs):
    if not created:
        return

    user_id = instance.topic.user_id
    vt = VoteTool(vote_cache, user_id)
    vt.receive_topic_vote(instance.id)

    vt_v1 = VoteTool(vote_cache, user_id, new_version=True)
    vt_v1.receive_topic_vote(instance.id)


@receiver(post_save, sender=DiaryVote)
def diaryvote_post_save(sender, instance, created, **kwargs):
    if not created:
        return

    user_id = instance.diary.user_id
    dt = VoteTool(vote_cache, user_id)
    dt.receive_diary_vote(instance.id)

    dt_v1 = VoteTool(vote_cache, user_id, new_version=True)
    dt_v1.receive_diary_vote(instance.id)


@receiver(post_save, sender=TopicReplyVote)
def topicreplyvote_post_save(sender, instance, created, **kwargs):
    if not created:
        return

    user_id = instance.topic_reply.user_id
    dt = VoteTool(vote_cache, user_id)
    dt.receive_topic_reply_vote(instance.id)

    dt_v1 = VoteTool(vote_cache, user_id, new_version=True)
    dt_v1.receive_topic_reply_vote(instance.id)


@receiver(post_save, sender=Problem)
def post_save_problem(sender, instance, created, **kwargs):
    if not created:
        return
    user = UserService.get_user_by_user_id(user_id=instance.user_id)
    user.incr_topic_count()     # TODO CR 把相关incr_vote decr_vote decr_topic_count挪到signal


@receiver(post_save, sender=TopicReply)
def reply_post_save(sender, instance, created, **kwargs):
    if created:
        hot_discussion_tag = TagService.get_tag_by_name(name=HOT_DISCUSSION_TAG)

        # 处理回复数据,加到redis中
        user_id = None
        reply_type = None
        if instance.replied_topic:
            reply_type = REPLYOBJECT.TOPIC
            user_id = instance.replied_topic.user_id

        elif instance.problem:
            reply_type = REPLYOBJECT.PROBLEM
            user_id = instance.problem.user_id

        elif instance.diary:
            user_id = instance.diary.user_id

        reply_cache.cache_received_comment_ids(user_id, instance.id)

        ReplyCollect.objects.create(created_time=instance.reply_date, user_id=instance.user_id,
                                    topic_reply_id=instance.id, answer_id=None,
                                    reply_user_id=user_id)
        # if instance is diary and return
        if instance.diary:
            return

        if user_id != instance.user_id:
            rt = ReplyTool(reply_msg_cache, user_id)
            if reply_type == REPLYOBJECT.TOPIC:
                rt.receive_topic_reply(instance.id)
            elif reply_type == REPLYOBJECT.PROBLEM:
                rt.receive_problem_reply(instance.id)

        # tag hot topics
        topic_type = instance.problem.topic_type
        if topic_type == TOPIC_TYPE.SHARE:
            threshold = settings.HOT_DISCUSSION_TAG_DIARY_SHRESHOLD

        elif topic_type == TOPIC_TYPE.ASK:
            threshold = settings.HOT_DISCUSSION_TAG_CONSULT_SHRESHOLD

        elif topic_type == TOPIC_TYPE.TOPIC:
            threshold = settings.HOT_DISCUSSION_TAG_DISCUSS_SHRESHOLD

        else:
            return

        if instance.problem.reply_num >= threshold:
            problem_id = instance.problem_id
            tag_ids = ProblemTag.objects.filter(problem_id=problem_id).values_list('tag_id', flat=True)
            tags = TagService.get_tags_by_tag_ids(tag_ids)
            tagged = filter(lambda t: t.name == HOT_DISCUSSION_TAG, tags)
            if not tagged:
                pt = ProblemTag(problem_id=instance.problem_id,
                                tag_id=hot_discussion_tag.get('tag_queried').get('id_list')[0])
                pt.save()

        diary = instance.problem.diary
        if not diary:
            return

        if instance.problem and instance.problem.diary:
            diary.reply_num = diary.reply_num + 1
            if diary.reply_num >= settings.HOT_DISCUSSION_TAG_DIARY_SHRESHOLD:
                tag_ids = DiaryTag.objects.filter(diary_id=diary.id).values_list('tag_id', flat=True)
                tags = TagService.get_tags_by_tag_ids(tag_ids)
                tagged = filter(lambda t: t.name == HOT_DISCUSSION_TAG, tags)
                if not tagged:
                    dt = DiaryTag(
                        diary_id=diary.id,
                        tag_id=hot_discussion_tag.get('tag_queried').get('id_list')[0],
                    )
                    dt.save()
            diary.save()


def get_suozhang_selected_tag():
    result = TagService.get_tag_by_name(name=u'所长精选')
    return result.get('tag_queried').get('id_list')[0] if result else ''


def get_meigou_tag():
    result = TagService.get_tag_by_name(name=u'美购日记')
    return result.get('tag_queried').get('id_list')[0] if result else ''


@receiver(post_save, sender=Diary)
def diary_add_suozhang_selected_tag(sender, instance, created, **kwargs):
    if instance.is_headline and instance.headline_time is None:
        # 设置了首页推荐并且首页推荐时间为None
        instance.headline_time = datetime.datetime.now()
        instance.save()
    elif not instance.is_headline and instance.headline_time is not None:
        # 取消了首页推荐并且存在首页推荐时间
        instance.headline_time = None
        instance.save()

    suozhang_tag_id = get_suozhang_selected_tag()
    diary_id = instance.id
    tag_ids = list(DiaryTag.objects.filter(diary_id=diary_id).values_list('tag_id', flat=True))
    if suozhang_tag_id in tag_ids:
        has_tagged = True
    else:
        has_tagged = False
    if instance.is_essence and not has_tagged:
        dt = DiaryTag(
            diary_id=diary_id,
            tag_id=suozhang_tag_id,
        )
        dt.save()
        return

    if not instance.is_essence and has_tagged:
        dt = DiaryTag.objects.get(diary_id=diary_id, tag_id=suozhang_tag_id)
        dt.delete()


@receiver(post_save, sender=Problem)
def topic_cash_back_count(sender, created, instance, **kwargs):
    try:
        order = OrderService.get_order_from_order_id(id=instance.diary.order_id)
        cash_back = order.get('cashback')
    except:
        return

    num = instance.diary.topics.filter(is_online=True,
                                       review_status=PROBLEM_REVIEW_STATUS_CHOICES.OK).count()
    if cash_back.topic_cash_back_num != num:
        cash_back.topic_cash_back_num = num
        cash_back.save()