topic.py 4.76 KB
#!/usr/bin/env python
# -*- coding: utf-8 -*-

from django.conf import settings
from django.core.management.base import BaseCommand, CommandError
import traceback
import logging
from libs.es import ESPerform
from django.db import models
import datetime

from .pick_topic import PickTopic
from .tag import TopicTag
from .user_extra import UserExtra
from .group import Group


class ActionSumAboutTopic(models.Model):
    class Meta:
        verbose_name=u"帖子埋点数据汇总"
        db_table="action_sum_about_topic"

    partiton_date = models.CharField(verbose_name=u"日期",max_length=20)
    device_id = models.CharField(verbose_name=u"用户设备号",max_length=50)
    topic_id = models.CharField(verbose_name=u"帖子ID",max_length=50)
    user_id = models.CharField(verbose_name=u"用户ID",max_length=50)
    data_type = models.IntegerField(verbose_name=u"动作类型")
    data_value = models.BigIntegerField(verbose_name=u"值")


class Topic(models.Model):
    class Meta:
        verbose_name = u'日记'
        db_table = 'topic'

    id = models.IntegerField(verbose_name='日记ID',primary_key=True)
    name = models.CharField(verbose_name='日记名称',max_length=100)
    #group_id = models.IntegerField(verbose_name='用户所在组ID',default=-1)
    group = models.ForeignKey(
        Group, verbose_name=u"关联的小组", related_name=u"group_topics",null=True, blank=True, default=None, on_delete=models.CASCADE)
    user_id = models.IntegerField(verbose_name='用户ID')
    description = models.CharField(verbose_name='日记本描述',max_length=200)
    content = models.CharField(verbose_name='日记本内容',max_length=1000)
    share_num = models.IntegerField(verbose_name='')
    vote_num = models.IntegerField(verbose_name='点赞数')
    reply_num = models.IntegerField(verbose_name='回复数')
    cover = models.CharField(verbose_name='',max_length=200)
    is_online = models.BooleanField(verbose_name='是否上线')
    is_deleted = models.BooleanField(verbose_name='是否删除')
    content_level = models.CharField(verbose_name='内容等级',max_length=3)
    create_time = models.DateTimeField(verbose_name=u'日记创建时间',default=datetime.datetime.fromtimestamp(0))
    update_time = models.DateTimeField(verbose_name=u'日记更新时间', default=datetime.datetime.fromtimestamp(0))


    def get_pick_id_info(self):
        try:
            pick_id_list = list()
            query_list = PickTopic.objects.filter(topic_id=self.id,is_deleted=False)
            for item in query_list:
                pick_id_list.append(item.pick_id)

            return tuple(pick_id_list)
        except:
            logging.error("catch exception,err_msg:%s" % traceback.format_exc())
            return ()

    def get_topic_tag_id_list(self):
        try:
            topic_tag_id_list = list()

            query_results = TopicTag.objects.filter(topic_id=self.id)
            for item in query_results:
                topic_tag_id_list.append(item.tag_id)

            return topic_tag_id_list
        except:
            logging.error("catch exception,err_msg:%s" % traceback.format_exc())
            return None

    def get_topic_offline_score(self):
        try:
            offline_score = 0.0
            user_is_shadow = False

            #是否官方推荐用户
            user_query_results = UserExtra.objects.filter(user_id=self.user_id)
            if user_query_results.count() > 0:
                if user_query_results[0].is_recommend:
                    offline_score += 2.0
                elif user_query_results[0].is_shadow:
                    user_is_shadow = True

            # 是否官方推荐小组
            if self.group and self.group.is_recommend:
                offline_score += 4.0

            #帖子等级
            if self.content_level == '5':
                offline_score += 5.0
            elif self.content_level == '4':
                offline_score += 3.0
            elif self.content_level == '3':
                offline_score += 2.0

            exposure_count = ActionSumAboutTopic.objects.filter(topic_id=self.id,data_type=1).count()
            click_count = ActionSumAboutTopic.objects.filter(topic_id=self.id, data_type=2).count()
            uv_num = ActionSumAboutTopic.objects.filter(topic_id=self.id,data_type=3).count()

            if exposure_count>0:
                offline_score += click_count/exposure_count
            if uv_num>0:
                offline_score += (self.vote_num/uv_num + self.reply_num/uv_num)

            """
                1:马甲账号是否对总分降权?
            """
            if user_is_shadow:
                offline_score = offline_score*0.5
            return offline_score
        except:
            logging.error("catch exception,err_msg:%s" % traceback.format_exc())
            return 0.0