activity.py 6.41 KB
# coding=utf8

from __future__ import unicode_literals, absolute_import, print_function

from django.db import models
from django.utils import timezone
from gm_dataquery.dict_mixin import to_dict
from gm_types.gaia import ACTIVITY_PARTICIPATE_REASON, ACTIVITY_TYPE_SOC
from gm_upload import ImgUrlField, IMG_TYPE

from talos.libs.datetime_utils import get_timestamp_or_none
from talos.libs.image_utils import get_full_path
from talos.rpc import logging_exception
from talos.services import UserService
from talos.services.doctor import DoctorService
from talos.services import UserConvertService


class Activity(models.Model):
    class Meta:
        verbose_name = u'免费活动'
        db_table = 'api_activity'
        app_label = 'talos'

    title = models.CharField(max_length=128, null=False, verbose_name=u'活动名称')
    banner = ImgUrlField(img_type=IMG_TYPE.BANNER, max_length=128, null=False, verbose_name='bannerl')
    description = models.TextField(max_length=2000, verbose_name=u'详细描述')
    points = models.IntegerField(verbose_name=u'参加活动需要的美分')
    start_time = models.DateTimeField(verbose_name=u'起始时间', default=timezone.now)
    end_time = models.DateTimeField(verbose_name=u'结束时间', null=True, blank=True)
    is_online = models.BooleanField(default=True, verbose_name=u'上线')
    show_win_list = models.BooleanField(default=True, verbose_name=u'展示中奖名单')
    win_limit = models.IntegerField(verbose_name=u'可中奖人数', default=0)
    show_topics = models.BooleanField(default=True, verbose_name=u'展示活动帖子')
    participate_limit = models.IntegerField(verbose_name=u'每人可参与次数', default=1)
    participants = models.IntegerField(verbose_name=u'已报名人数', default=0)
    doctor_id = models.CharField(max_length=100, null=True, blank=True, default=None, verbose_name=u'关联医生的外键id')
    # 富文本编辑器
    description_richtext = models.TextField(default='', blank=True, max_length=2000, verbose_name=u'详细描述')
    must_image = models.BooleanField(default=False, verbose_name=u'图片是否为空')
    act_type = models.CharField(
        choices=ACTIVITY_TYPE_SOC,
        default=ACTIVITY_TYPE_SOC.NORMAL,
        max_length=16,
        verbose_name=u'活动类型'
    )

    def can_participate(self, user_id, user_points=0):  # TODO CR 这段逻辑应该挪到 person 中去
        # activity should be online
        if not self.is_online:
            return False, ACTIVITY_PARTICIPATE_REASON.CLOSED

        # start_time <= now <=end_time
        now = timezone.now()
        if self.start_time > now:
            return False, ACTIVITY_PARTICIPATE_REASON.NOT_STARTED

        if self.end_time < now:
            return False, ACTIVITY_PARTICIPATE_REASON.CLOSED

        # 去掉免费活动参加门槛
        # if self.points > user_points:
        #     return False, ACTIVITY_PARTICIPATE_REASON.NOT_ENOUGH_POINTS

        # check paticipate limit
        from talos.models.topic.topic import Problem
        # TODO CR 拆activity的时候拆 现在先这样
        activity_topics = Problem.objects.filter(user_id=user_id, activity=self).count()
        if activity_topics >= self.participate_limit:
            return False, ACTIVITY_PARTICIPATE_REASON.PARTICIPATE_LIMIT

        return True, ACTIVITY_PARTICIPATE_REASON.OK

    def to_dict(self, simple=True):
        """convert to dict for jsonify.

        args:
            simple: True just return following fields, False return all fields
              - banner
              - participants
              - id
              - status_text
              - act_type

        NOTE:
            if show_win_list is true and simple is False, return extra fields
            winners.
        """
        if simple:
            data = to_dict(
                self,
                fields=['id', 'banner', 'participants', 'is_online', 'act_type'],
            )

        else:
            data = to_dict(self)

            try:
                data['winners'] = []
                if self.show_win_list:
                    person_ids = list(set(self.winners.values_list('person_id', flat=True)))
                    users = UserConvertService.get_user_info_by_person_ids(person_ids=person_ids)
                    for person_id in person_ids:
                        user = users.get(person_id)
                        data['winners'].append({
                            'id': user["person_id"],
                            'user_id': user["user_id"],
                            'phone': '',
                            'doctor_id': user["doctor_id"],
                            'doctor_type': user["doctor_type"],
                            'hospital_id': user["hospital_id"],
                            'nickname': user["user_name"],
                            'portrait': user["portrait"] or get_full_path(u'img%2Fuser_portrait.png', '-thumb'),
                        })
            except:
                logging_exception()

        # convert datetime field to timestamp
        data['start_time'] = get_timestamp_or_none(self.start_time)
        data['end_time'] = get_timestamp_or_none(self.end_time)
        data['mk_description'] = self.description
        data['rich_text'] = self.description_richtext
        data["title"] = self.title
        return data

    @property
    def doctor(self):
        return DoctorService.get_doctor_from_doctor_id(self.doctor_id)


class ActivityWinlist(models.Model):
    class Meta:
        verbose_name = u'免费活动中奖名单'
        db_table = 'api_activitywinlist'
        app_label = 'talos'

    activity = models.ForeignKey(Activity, verbose_name=u'免费活动', related_name='winners')
    person_id = models.CharField(verbose_name=u'用户外键id', max_length=64)
    topic = models.IntegerField(verbose_name=u'中奖帖子')
    created_at = models.DateTimeField(verbose_name=u'中奖时间', default=timezone.now)


class ActivityAlert(models.Model):
    class Meta:
        verbose_name = u'活动提醒名单'
        db_table = 'api_activity_alert'
        app_label = 'talos'

    activity = models.ForeignKey(Activity, verbose_name=u'免费活动')
    person_id = models.CharField(verbose_name=u'用户外键id', max_length=64)
    is_online = models.BooleanField(default=True, verbose_name=u'上线')
    create_time = models.DateTimeField(verbose_name=u'创建时间', default=timezone.now)
    update_time = models.DateTimeField(verbose_name=u'更新时间', auto_now=True)