from django.db.models import Q from gm_dataquery.dataquery import DataBuilder, DataSQLQuery from gm_dataquery.db import DB from gm_types.mimas import QUALITY_QUESTION_CLASSIFY_TYPE from gm_upload.utils.image_utils import Picture from qa.models import QualityQuestionPool, QualityClassfyQuestion, QualityQuestionClassifyRelation, QualityUserQuestion, \ QualityAuthorAnswer, QualityReply, QualityReplyImage from talos.services import TagV3Service class QualityQuestionPoolDB(DataBuilder): pass @DB class QualityQuestionPoolDQ(DataSQLQuery): model = QualityQuestionPool data_model = QualityQuestionPoolDB class QualityClassfyQuestionDB(DataBuilder): def getval_classify_type(self, obj): return QUALITY_QUESTION_CLASSIFY_TYPE.getDesc(obj.classify_type) def getval_question_id(self, obj): classify_ids = list(QualityQuestionClassifyRelation.objects.filter( quality_classify_id=obj.id ).values_list('question_id', flat=True)) titles = list(QualityQuestionPool.objects.filter(id__in=classify_ids).values_list('title', flat=True)) return titles def getval_tag_id(self, obj): tag_id = obj.tag_id tag = TagV3Service.get_tags_by_tag_v3_ids([tag_id]) tag_v3_info = TagV3Service.format_tag_v3(tag.get(tag_id)) return tag_v3_info['name'] @DB class QualityClassfyQuestionDQ(DataSQLQuery): model = QualityClassfyQuestion data_model = QualityClassfyQuestionDB def filter_tag_group_id(self, srch_key, srch_val, regex=False): return Q(tag_group_id=int(srch_val)) def filter_tag_id(self, srch_key, srch_val, regex=False): return Q(tag_id=int(srch_val)) def filter_question_id(self, srch_key, srch_val, regex=False): _ids = list(QualityQuestionPool.objects.filter( title__contains=srch_val ).values_list('id', flat=True)) valid_ids = list(QualityQuestionClassifyRelation.objects.filter( question_id__in=_ids ).values_list('quality_classify_id', flat=True)) return Q(id__in=valid_ids) class QualityUserQuestionDB(DataBuilder): def getval_question_title(self, obj): quality_question = QualityQuestionPool.objects.filter(id=obj.question_id).first() title = quality_question and quality_question.title or '' return title def getval_author_reply_count(self, obj): # 作者回复数 return QualityAuthorAnswer.objects.filter(quality_question_id=obj.quality_question_id).count() def getval_reply_count(self, obj): # 评论数 return QualityReply.objects.filter(quality_question_id=obj.quality_question_id).count() @DB class QualityUserQuestionDQ(DataSQLQuery): model = QualityUserQuestion data_model = QualityUserQuestionDB def filter_question_title(self, srch_key, srch_val, regex=False): q_ids = list(QualityQuestionPool.objects.filter( title__contains=srch_val).values_list('id', flat=True) ) return Q(question_id__in=q_ids) class QualityReplyDB(DataBuilder): def getval_quality_answer_content(self, obj): q = QualityAuthorAnswer.objects.filter(id=obj.quality_answer_id).first() return q and q.content or '' @DB class QualityReplyDQ(DataSQLQuery): model = QualityReply data_model = QualityReplyDB def filter_quality_answer_content(self, srch_key, srch_val, regex=False): q_ids = list(QualityAuthorAnswer.objects.filter( content__contains=srch_val ).values_list('id', flat=True)) return Q(quality_answer_id__in=q_ids) def filter_content(self, srch_key, srch_val, regex=False): return Q(content__contains=srch_val) @classmethod def create(cls, **kwargs): images = [] user_id = kwargs.get('user_id') content = kwargs.get('content') quality_answer_id = kwargs.get('quality_answer_id') try: quality_question = QualityAuthorAnswer.objects.get(id=quality_answer_id) except QualityAuthorAnswer.DoesNotExist: return { 'id': '' } is_online = kwargs.get('is_online') image1 = kwargs.get('image1') if image1: images.append(image1) image2 = kwargs.get('image2') if image2: images.append(image2) image3 = kwargs.get('image3') if image3: images.append(image3) quality_reply = QualityReply.objects.create( quality_answer_id=quality_answer_id, user_id=user_id, content=content, quality_question_id=quality_question.quality_question_id, is_online=is_online, ) image_objects = [] for image in images: try: image_info = Picture.get_image_base_info(image) except: image_info = {} qm = QualityReplyImage( quality_reply_id=quality_reply.id, url=image, width=image_info.get('width'), height=image_info.get('height'), ) image_objects.append(qm) QualityReplyImage.objects.bulk_create(image_objects) return { 'id': quality_reply.id } def update(self, updates, **kwargs): first_reply_id = kwargs.get('id') if not first_reply_id: return is_online = updates.get('is_online') if is_online is False or is_online is True: QualityReply.objects.filter(id=first_reply_id).update(is_online=is_online) return { 'id': first_reply_id } images = [] reply_user_id = updates.get('reply_user') reply_content = updates.get('reply_content') quality_answer_id = updates.get('quality_answer_id') quality_question_id = updates.get('quality_question_id') image1 = updates.get('image1') if image1: images.append(image1) image2 = updates.get('image2') if image2: images.append(image2) image3 = updates.get('image3') if image3: images.append(image3) quality_reply = QualityReply.objects.create( quality_answer_id=quality_answer_id, replied_id=first_reply_id, user_id=reply_user_id, content=reply_content, quality_question_id=quality_question_id, ) image_objects = [] for image in images: try: image_info = Picture.get_image_base_info(image) except: image_info = {} qm = QualityReplyImage( quality_reply_id=quality_reply.id, url=image, width=image_info.get('width'), height=image_info.get('height'), ) image_objects.append(qm) QualityReplyImage.objects.bulk_create(image_objects) return { 'id': quality_reply.id } class QualityAuthorAnswerDB(DataBuilder): pass @DB class QualityAuthorAnswerDQ(DataSQLQuery): model = QualityAuthorAnswer data_model = QualityAuthorAnswerDB