#!/usr/bin/env python # -*- coding: utf-8 -*- from __future__ import unicode_literals, absolute_import, print_function import time from django.conf import settings from django.core.management.base import BaseCommand, CommandError import traceback import logging import datetime from libs.es import ESPerform from django.db import models 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) have_face = models.BooleanField(verbose_name=u"是否有图片", default=False) 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_edit_tag_id_list(self): try: tag_id_list = TopicTag.objects.using(settings.SLAVE_DB_NAME).filter(topic_id=self.id, is_collection=1).values_list("tag_id", flat=True) return list(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 def get_related_billboard(self): try: related_billboard_list = list() pictorials = PictorialTopic.objects.filter(topic_id=self.id).values("pictorial_id", "create_time") for pictorial_id in pictorials: query_result = TopicBillBoard.objects.filter(pictorial_id=pictorial_id.get('pictorial_id', None), topic_id=self.id).values().first() if query_result == None: related_billboard_list.append( {"pictorial_id": pictorial_id.get('pictorial_id', None), "real_vote_cnt": 0, "virt_vote_cnt": 0, "total_vote_cnt": 0, "topic_add_createtime": int( time.mktime(pictorial_id.get("create_time", None).timetuple()))}) else: total_vote_cnt = int(query_result["virt_vote_cnt"]) + int(query_result["real_vote_cnt"]) related_billboard_list.append( {"pictorial_id": query_result["pictorial_id"], "real_vote_cnt": query_result["real_vote_cnt"], "virt_vote_cnt": query_result["virt_vote_cnt"], "total_vote_cnt": total_vote_cnt, "topic_add_createtime": int(time.mktime(pictorial_id.get("create_time", None).timetuple()))}) logging.info("product_brand_info" % related_billboard_list) return related_billboard_list except: logging.error("catch exception,err_msg:%s" % traceback.format_exc()) return [] def get_latest_reply_date(self): try: reply_query_results = Reply.objects.using(settings.SLAVE_DB_NAME).filter(topic_id=self.id, is_deleted=0, is_online=1).values("user_id", "create_time") datetime_list = list() if reply_query_results.count() > 0: for reply in reply_query_results: UserExtra_results = UserExtra.objects.using(settings.SLAVE_DB_NAME).filter( user_id=reply['user_id']).values('is_shadow') if UserExtra_results.count() > 0: if not UserExtra_results[0]['is_shadow']: datetime_list.append(reply['create_time']) if len(datetime_list) > 0: dt = max(datetime_list) return datetime.datetime(dt.year, dt.month, dt.day, dt.hour, dt.minute, dt.second, tzinfo=datetime.timezone(datetime.timedelta(hours=8))) else: dt = self.create_time return datetime.datetime(dt.year, dt.month, dt.day, dt.hour, dt.minute, dt.second, tzinfo=datetime.timezone(datetime.timedelta(hours=8))) else: dt = self.create_time return datetime.datetime(dt.year, dt.month, dt.day, dt.hour, dt.minute, dt.second, tzinfo=datetime.timezone(datetime.timedelta(hours=8))) except: return datetime.datetime(1980, 1, 1, 0, 0, 0, tzinfo=datetime.timezone(datetime.timedelta(hours=8))) 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'是否删除') create_time = models.DateTimeField(verbose_name=u'创建时间', default=datetime.datetime.fromtimestamp(0)) 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'是否删除') class TopicBillBoard(models.Model): """榜单投票""" class Meta: verbose_name = "榜单投票" db_table = "topic_vote_cnt" topic_id = models.IntegerField(verbose_name=u"帖子ID") pictorial_id = models.IntegerField(verbose_name=u"榜单ID") real_vote_cnt = models.IntegerField(verbose_name=u"真实赞") virt_vote_cnt = models.IntegerField(verbose_name=u"虚拟赞") class Reply(models.Model): """帖子回复""" class Meta: verbose_name = "帖子回复" db_table = "reply" topic_id = models.IntegerField(verbose_name=u"帖子ID") user_id = models.IntegerField(verbose_name=u'用户ID') create_time = models.DateTimeField(verbose_name=u'创建时间') is_deleted = models.BooleanField(verbose_name=u'是否删除') is_online = models.BooleanField(verbose_name=u'是否上线') pictorial_id = models.IntegerField(verbose_name=u"榜单ID") class CommunityTopicProduct(models.Model): """帖子商品信息""" class Meta: verbose_name = "帖子商品信息" db_table = "community_topic_product" topic_id = models.IntegerField(verbose_name=u"帖子ID") product_id = models.IntegerField(verbose_name=u'商品ID') create_time = models.DateTimeField(verbose_name=u'创建时间') is_deleted = models.BooleanField(verbose_name=u'是否删除') class CommunityCategoryTagRelation(models.Model): class Meta: verbose_name = u"标签分类对应关系" db_table = "community_category_tag_relation" id = models.IntegerField(primary_key=True, verbose_name=u"主键ID") is_deleted = models.BooleanField(verbose_name=u"是否删除") is_online = models.BooleanField(verbose_name=u"是否上线") tag_id = models.IntegerField(verbose_name=u"标签ID") category_tag_id = models.IntegerField(verbose_name=u"标签类型ID") create_time = models.DateTimeField(verbose_name=u'创建时间', default=datetime.datetime.fromtimestamp(0)) update_time = models.DateTimeField(verbose_name=u'更新时间', default=datetime.datetime.fromtimestamp(0))