topic.py 13 KB
#!/usr/bin/env python
# -*- coding: utf-8 -*-
from __future__ import unicode_literals, absolute_import, print_function

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 alpha_types.venus import GRAP_PLATFORM

from .pick_topic import PickTopic
from .tag import TopicTag, Tag
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 TopicImage(models.Model):
    class Meta:
        verbose_name = u'日记图片'
        db_table = 'topic_image'

    id = models.IntegerField(verbose_name='日记图片ID', primary_key=True)
    topic_id = models.IntegerField(verbose_name=u'日记ID')
    url = models.CharField(verbose_name=u'图片URL', max_length=300)
    is_online = models.BooleanField(verbose_name='是否上线')
    is_deleted = models.BooleanField(verbose_name='是否删除')
    create_time = models.DateTimeField(verbose_name=u'创建时间', default=datetime.datetime.fromtimestamp(0))
    update_time = models.DateTimeField(verbose_name=u'更新时间', default=datetime.datetime.fromtimestamp(0))

class ExcellentTopic(models.Model):
    """优质帖子"""

    class Meta:
        verbose_name = "优质帖子"
        db_table = "excellent_topic"

    id = models.IntegerField(verbose_name=u'ID', primary_key=True)
    topic_id = models.IntegerField(verbose_name=u"帖子ID",db_index=True)
    is_online = models.BooleanField(verbose_name=u'是否上线')
    is_deleted = models.BooleanField(verbose_name=u'是否删除')
    excellent_type = models.IntegerField(verbose_name=u"优质类型",db_index=True)
    create_time = models.DateTimeField(verbose_name=u'创建时间', default=datetime.datetime.fromtimestamp(0))
    update_time = models.DateTimeField(verbose_name=u'更新时间', default=datetime.datetime.fromtimestamp(0))

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

    id = models.IntegerField(verbose_name=u'日记ID', primary_key=True)
    name = models.CharField(verbose_name=u'日记名称', 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=u'用户ID')
    has_video = models.BooleanField(verbose_name=u'是否是视频日记')
    drop_score = models.IntegerField(verbose_name=u'人工赋分', default=0)
    description = models.CharField(verbose_name=u'日记本描述', max_length=200)
    content = models.CharField(verbose_name=u'日记本内容', max_length=1000)
    share_num = models.IntegerField(verbose_name='')
    vote_num = models.IntegerField(verbose_name=u'点赞数')
    reply_num = models.IntegerField(verbose_name=u'回复数')
    cover = models.CharField(verbose_name='', max_length=200)
    is_online = models.BooleanField(verbose_name=u'是否上线')
    is_deleted = models.BooleanField(verbose_name=u'是否删除')
    content_level = models.CharField(verbose_name=u'内容等级', max_length=3)
    language_type = models.IntegerField(verbose_name=u'语种类型')
    create_time = models.DateTimeField(verbose_name=u'日记创建时间', default=datetime.datetime.fromtimestamp(0))
    update_time = models.DateTimeField(verbose_name=u'日记更新时间', default=datetime.datetime.fromtimestamp(0))

    is_crawl = models.BooleanField(verbose_name="是否是爬回的数据", default=False)
    has_image = models.BooleanField(verbose_name=u"是否有图片", default=False)
    virtual_content_level = models.CharField(verbose_name=u'模拟内容等级', max_length=100, default='')
    like_num_crawl = models.IntegerField(verbose_name=u'爬取点赞数', default=0)
    comment_num_crawl = models.IntegerField(verbose_name=u'爬取评论数', default=0)
    is_recommend = models.IntegerField(verbose_name=u'是否推荐 0 非推荐 1 推荐', default=0)
    sort_score = models.FloatField(verbose_name='排序分', default=0)
    is_shadow = models.BooleanField(verbose_name="是否是马甲账户", default=False)
    platform = models.IntegerField(verbose_name=u'平台来源', choices=GRAP_PLATFORM, default=GRAP_PLATFORM.ALPHA)
    platform_id = models.BigIntegerField(verbose_name='用平台ID', null=True)

    def get_virtual_vote_num(self):

        try:
            topic_extra = TopicExtra.objects.filter(topic_id=self.id).first()
            virtual_vote_num = topic_extra.virtual_vote_num if topic_extra else 0
            
            return virtual_vote_num
        except:
            logging.error("catch exception,err_msg:%s" % traceback.format_exc())
            return 0

    def get_pictorial_id(self):
        try:
            pictorial_id_list =[]
            pictorial_id = PictorialTopic.objects.filter(topic_id=self.id).values_list("pictorial_id",flat=True)
            for i in pictorial_id:
                pictorial_id_list.append(i)
            return pictorial_id_list
        except:
            logging.error("catch exception,err_msg:%s" % traceback.format_exc())
            return []

    @property
    def is_complaint(self):
        """是否被举报"""
        try:
            if TopicComplaint.objects.filter(topic_id=self.id, is_online=True).exists():
                return True

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

    @classmethod
    def get_topic_image_num(cls,topic_id):
        """
        :remark 获取指定帖子的图片数量
        :param topic_id:
        :return:
        """
        try:
            query_list = list(TopicImage.objects.using(settings.SLAVE_DB_NAME).filter(topic_id=topic_id, is_deleted=False, is_online=True).values_list("url",flat=True))
            return len(query_list)
        except:
            logging.error("catch exception,err_msg:%s" % traceback.format_exc())
            return 0

    def topic_has_image(self):
        try:
            has_image = False

            query_list = TopicImage.objects.using(settings.SLAVE_DB_NAME).filter(topic_id=self.id, is_deleted=False, is_online=True)
            if len(query_list) > 0:
                has_image = True

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

    def get_pick_id_info(self):
        try:
            pick_id_list = list()
            query_list = PickTopic.objects.using(settings.SLAVE_DB_NAME).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()
            edit_tag_id_list = list()

            tag_id_list = TopicTag.objects.using(settings.SLAVE_DB_NAME).filter(topic_id=self.id).values_list("tag_id", flat=True)
            tag_query_results = Tag.objects.using(settings.SLAVE_DB_NAME).filter(id__in=tag_id_list)
            for tag_item in tag_query_results:
                is_online=tag_item.is_online
                is_deleted=tag_item.is_deleted
                collection=tag_item.collection

                if is_online and not is_deleted:
                    topic_tag_id_list.append(tag_item.id)
                    if collection:
                        edit_tag_id_list.append(tag_item.id)

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

    def get_topic_useful_tag_id_list(self):
        try:
            topic_useful_tag_id_list = list()
            tag_id_list = TopicTag.objects.using(settings.SLAVE_DB_NAME).filter(topic_id=self.id,is_online =True,is_body_esthetics = 1)
            for tag_item in tag_id_list:
                    topic_useful_tag_id_list.append(tag_item.tag_id)
            return topic_useful_tag_id_list
        except:
            logging.error("catch exception,err_msg:%s" % traceback.format_exc())
            return []


    def get_tag_name_list(self, tag_id_list):
        try:
            tag_name_list = list()
            for i in range(0, len(tag_id_list), 100):
                query_terms_list = list(Tag.objects.using(settings.SLAVE_DB_NAME).filter(id__in=tag_id_list[i:i + 100],is_online=True,is_deleted=False).values_list("name",flat=True))
                tag_name_list.extend(query_terms_list)
            return tag_name_list
        except:
            logging.error("catch exception,err_msg:%s" % traceback.format_exc())
            return []

    def judge_if_excellent_topic(self, topic_id):
        try:
            excelllect_object = ExcellentTopic.objects.filter(topic_id=topic_id).first()
            if excelllect_object and excelllect_object.is_online and not excelllect_object.is_deleted:
                return True
            else:
                return False
        except:
            logging.error("catch exception,err_msg:%s" % traceback.format_exc())
            return False

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

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

            # 帖子等级
            if self.content_level == '5':
                offline_score += 100.0 *3
            elif self.content_level == '4':
                offline_score += 60.0 *3
            elif self.content_level == '6':
                offline_score += 200.0 *3

            if self.language_type == 1:
                offline_score += 60.0

            """
                1:马甲账号是否对总分降权?
            """
            if user_is_shadow:
                offline_score = offline_score * 0.5

            offline_score -= self.drop_score
            return offline_score
        except:
            logging.error("catch exception,err_msg:%s" % traceback.format_exc())
            return 0.0


class TopicComplaint(models.Model):
    """帖子举报"""

    class Meta:
        verbose_name = u'帖子举报'
        app_label = 'community'
        db_table = 'topic_complaint'

    id = models.IntegerField(verbose_name='日记图片ID', primary_key=True)
    user_id = models.BigIntegerField(verbose_name=u'用户ID', db_index=True)
    topic = models.ForeignKey(
        Topic, verbose_name=u"关联的帖子", null=True, blank=True, default=None, on_delete=models.CASCADE, related_name='complaints')

    is_online = models.BooleanField(verbose_name=u"是否有效", default=True)


class PictorialTopic(models.Model):
    """画报帖子关系"""

    class Meta:
        verbose_name = u'画报帖子关系'
        app_label = 'community'
        db_table = 'community_pictorial_topic'

    id = models.IntegerField(verbose_name=u'日记ID', primary_key=True)
    pictorial_id = models.BigIntegerField(verbose_name=u'画报ID')
    topic_id = models.BigIntegerField(verbose_name=u'帖子ID')
    is_online = models.BooleanField(verbose_name=u"是否有效", default=True)
    is_deleted = models.BooleanField(verbose_name=u'是否删除')


class TopicExtra(models.Model):
    """帖子相关额外信息"""

    class Meta:
        verbose_name = '帖子额外信息'
        app_label = 'community'
        db_table = 'topic_extra'

    id = models.IntegerField(verbose_name=u'ID', primary_key=True)
    topic_id = models.IntegerField(verbose_name=u"帖子ID",db_index=True)
    virtual_vote_num = models.IntegerField(verbose_name="帖子虚拟点赞")


class TopicHomeRecommend(models.Model):
    """运营位帖子"""

    class Meta:
        verbose_name = "运营位帖子"
        db_table = "topic_home_recommend"
    id = models.IntegerField(verbose_name=u"id",primary_key=True)
    topic_id = models.IntegerField(verbose_name=u"帖子ID")
    is_online = models.BooleanField(verbose_name=u'是否上线')
    is_deleted = models.BooleanField(verbose_name=u'是否删除')