|  | # -*- coding: utf-8 -*-
from django.db import models
from django.utils.translation import ugettext_lazy as _
from django_models_ext import BaseModelMixin, upload_file_path, upload_file_url, upload_path
from shortuuidfield import ShortUUIDField
from TimeConvert import TimeConvert as tc
from mch.models import ModelInfo
from simditor.fields import RichTextField
class GoodsInfo(BaseModelMixin):
    PHYSICAL = 0
    VIRTUAL = 1
    GOOD_TYPE_TUPLE = (
        (PHYSICAL, u'实物'),
        (VIRTUAL, u'虚拟'),
    )
    brand_id = models.CharField(_(u'brand_id'), max_length=32, blank=True, null=True, help_text=u'品牌唯一标识', db_index=True)
    brand_name = models.CharField(_(u'brand_name'), max_length=255, blank=True, null=True, help_text=u'品牌名称')
    good_id = ShortUUIDField(_(u'good_id'), max_length=32, blank=True, null=True, help_text=u'商品唯一标识', db_index=True, unique=True)
    good_type = models.IntegerField(_(u'good_type'), choices=GOOD_TYPE_TUPLE, default=VIRTUAL, help_text=u'商品类型', db_index=True)
    title = models.CharField(_(u'title'), max_length=255, blank=True, null=True, help_text=u'商品名称')
    desc = RichTextField(_(u'desc'), blank=True, null=True, help_text=u'商品描述')
    value = models.IntegerField(_(u'value'), default=99999, help_text=u'商品价值,单位分')
    left_num = models.IntegerField(_(u'left_num'), default=0, help_text=u'商品库存', db_index=True)
    image = models.ImageField(_(u'image'), upload_to=upload_path, blank=True, null=True, help_text=u'商品图片')
    coupon_id = models.CharField(_(u'coupon_id'), max_length=32, blank=True, null=True, help_text=u'券唯一标识', db_index=True)
    is_slider = models.BooleanField(_(u'is_slider'), default=True, help_text=u'是否为轮播商品', db_index=True)
    slider_image = models.ImageField(_(u'slider_image'), upload_to=upload_path, blank=True, null=True, help_text=u'商品轮播图片')
    integral = models.IntegerField(_(u'integral'), default=99999, help_text=u'兑换所需积分')
    fee = models.IntegerField(_(u'fee'), default=99999, help_text=u'兑换需额外支付金额,单位分')
    minlevel = models.IntegerField(_(u'minlevel'), default=0, help_text=u'兑换最低会员级别', db_index=True)
    only_for_member = models.BooleanField(_(u'only_for_member'), default=False, help_text=u'会员专属', db_index=True)
    position = models.IntegerField(_(u'position'), default=1, help_text=u'排序', db_index=True)
    class Meta:
        verbose_name = _(u'会员商品信息')
        verbose_name_plural = _(u'会员商品信息')
    def __unicode__(self):
        return unicode(self.pk)
    @property
    def image_path(self):
        return upload_file_path(self.image)
    @property
    def image_url(self):
        return upload_file_url(self.image)
    @property
    def slider_image_path(self):
        return upload_file_path(self.slider_image)
    @property
    def slider_image_url(self):
        return upload_file_url(self.slider_image)
    def has_member_exchange(self, user_id=None):
        if not self.only_for_member:
            return False
        if not user_id:
            return False
        return GoodsOrderInfo.objects.filter(good_id=self.good_id, user_id=user_id).exists()
    def data(self, user_id=None):
        return {
            'good_id': self.good_id,
            'good_type': self.good_type,
            'title': self.title,
            'image': self.image_url,
            'slider_image': self.slider_image_url,
            'integral': self.integral,
            'fee': self.fee,
            'minlevel': self.minlevel,
            'only_for_member': self.only_for_member,
            'has_member_exchange': self.has_member_exchange(user_id),
            'able': True,
            'value': self.value,
        }
    
    def details(self, user_id):
        detail = self.data(user_id)
        detail['desc'] = self.desc
        return detail
class GoodsOrderInfo(BaseModelMixin):
    PHYSICAL = 0
    VIRTUAL = 1
    GOOD_TYPE_TUPLE = (
        (PHYSICAL, u'实物'),
        (VIRTUAL, u'虚拟'),
    )
    brand_id = models.CharField(_(u'brand_id'), max_length=32, blank=True, null=True, help_text=u'品牌唯一标识', db_index=True)
    brand_name = models.CharField(_(u'brand_name'), max_length=255, blank=True, null=True, help_text=u'品牌名称')
    order_id = ShortUUIDField(_(u'order_id'), max_length=32, blank=True, null=True, help_text=u'订单唯一标识', db_index=True, unique=True)
    user_id = models.CharField(_(u'user_id'), max_length=32, blank=True, null=True, help_text=u'用户唯一标识', db_index=True)
    good_id = models.CharField(_(u'good_id'), max_length=32, blank=True, null=True, help_text=u'商品唯一标识', db_index=True)
    good_type = models.IntegerField(_(u'good_type'), choices=GOOD_TYPE_TUPLE, default=VIRTUAL, help_text=u'商品类型', db_index=True)
    title = models.CharField(_(u'title'), max_length=255, blank=True, null=True, help_text=u'商品名称')
    name = models.CharField(_(u'name'), max_length=255, blank=True, null=True, help_text=u'姓名')
    phone = models.CharField(_(u'phone'), max_length=255, blank=True, null=True, help_text=u'电话')
    address = models.CharField(_(u'address'), max_length=255, blank=True, null=True, help_text=u'地址')
    tracking_number = models.CharField(_(u'tracking_number'), max_length=255, blank=True, null=True, help_text=u'快递单号')
    has_send_template_message = models.BooleanField(_(u'has_send_template_message'), default=True, help_text=u'是否已发送模版消息', db_index=True)
    class Meta:
        verbose_name = _(u'会员商品订单信息')
        verbose_name_plural = _(u'会员商品订单信息')
    def __unicode__(self):
        return unicode(self.pk)
class RightInfo(BaseModelMixin):
    PHYSICAL = 0
    VIRTUAL = 1
    COUPON = 2
    RIGHT_TYPE_TUPLE = (
        (PHYSICAL, u'实物'),
        (VIRTUAL, u'虚拟'),
        (COUPON, u'优惠券'),
    )
    brand_id = models.CharField(_(u'brand_id'), max_length=32, blank=True, null=True, help_text=u'品牌唯一标识', db_index=True)
    brand_name = models.CharField(_(u'brand_name'), max_length=255, blank=True, null=True, help_text=u'品牌名称')
    right_id = ShortUUIDField(_(u'right_id'), max_length=32, blank=True, null=True, help_text=u'权益唯一标识', db_index=True, unique=True)
    right_type = models.IntegerField(_(u'right_type'), choices=RIGHT_TYPE_TUPLE, default=VIRTUAL, help_text=u'权益类型', db_index=True)
    icon = models.ImageField(_(u'icon'), upload_to=upload_path, blank=True, null=True, help_text=u'权益图标')
    title = models.CharField(_(u'title'), max_length=255, blank=True, null=True, help_text=u'权益名称')
    subtitle = models.CharField(_(u'subtitle'), max_length=255, blank=True, null=True, help_text=u'权益二级名称')
    detail = RichTextField(_(u'detail'), blank=True, null=True, help_text=u'权益详情')
    level1 = models.CharField(_(u'level1'), max_length=255, blank=True, null=True, help_text=u'level1')
    level2 = models.CharField(_(u'level2'), max_length=255, blank=True, null=True, help_text=u'level2')
    level3 = models.CharField(_(u'level3'), max_length=255, blank=True, null=True, help_text=u'level3')
    level4 = models.CharField(_(u'level4'), max_length=255, blank=True, null=True, help_text=u'level4')
    level5 = models.CharField(_(u'level5'), max_length=255, blank=True, null=True, help_text=u'level5')
    minlevel = models.IntegerField(_(u'minlevel'), default=0, help_text=u'权益最低会员级别')
    position = models.IntegerField(_(u'position'), default=1, help_text=u'排序', db_index=True)
    # 券相关
    is_send_coupon = models.BooleanField(_(u'is_send_coupon'), default=False, help_text=_(u'是否发券'), db_index=True)
    coupon_num = models.IntegerField(_(u'coupon_num'), default=0, help_text=_(u'券每会员级别发放张数'))
    coupon_level1_num = models.IntegerField(_(u'coupon_level1_num'), default=0, help_text=_(u'券每会员级别发放张数'))
    coupon_level2_num = models.IntegerField(_(u'coupon_level2_num'), default=0, help_text=_(u'券每会员级别发放张数'))
    coupon_level3_num = models.IntegerField(_(u'coupon_level3_num'), default=0, help_text=_(u'券每会员级别发放张数'))
    coupon_level4_num = models.IntegerField(_(u'coupon_level4_num'), default=0, help_text=_(u'券每会员级别发放张数'))
    coupon_level5_num = models.IntegerField(_(u'coupon_level5_num'), default=0, help_text=_(u'券每会员级别发放张数'))
    coupon_level1_id = models.CharField(_(u'coupon_level1_id'), max_length=32, blank=True, null=True, help_text=u'券唯一标识', db_index=True)
    coupon_level2_id = models.CharField(_(u'coupon_level2_id'), max_length=32, blank=True, null=True, help_text=u'券唯一标识', db_index=True)
    coupon_level3_id = models.CharField(_(u'coupon_level3_id'), max_length=32, blank=True, null=True, help_text=u'券唯一标识', db_index=True)
    coupon_level4_id = models.CharField(_(u'coupon_level4_id'), max_length=32, blank=True, null=True, help_text=u'券唯一标识', db_index=True)
    coupon_level5_id = models.CharField(_(u'coupon_level5_id'), max_length=32, blank=True, null=True, help_text=u'券唯一标识', db_index=True)
    class Meta:
        verbose_name = _(u'会员权益信息')
        verbose_name_plural = _(u'会员权益信息')
    def __unicode__(self):
        return unicode(self.pk)
    @property
    def icon_path(self):
        return upload_file_path(self.icon)
    @property
    def icon_url(self):
        return upload_file_url(self.icon)
    @property
    def data(self):
        return {
            'right_id': self.right_id,
            'right_type': self.right_type,
            'icon': self.icon_url,
            'title': self.title,
            'subtitle': self.subtitle,
            'detail': self.detail,
            'level1': self.level1,
            'level2': self.level2,
            'level3': self.level3,
            'level4': self.level4,
            'level5': self.level5,
            'minlevel': self.minlevel,
            'able': True,
            'left_num': 3,
            'left_tip': 3,
        }
class ShotTypeInfo(BaseModelMixin):
    brand_id = models.CharField(_(u'brand_id'), max_length=32, blank=True, null=True, help_text=u'品牌唯一标识', db_index=True)
    brand_name = models.CharField(_(u'brand_name'), max_length=255, blank=True, null=True, help_text=u'品牌名称')
    shot_type_id = ShortUUIDField(_(u'shot_type_id'), max_length=32, blank=True, null=True, help_text=u'镜头类型唯一标识', db_index=True, unique=True)
    shot_type_name = models.CharField(_(u'shot_type_name'), max_length=255, blank=True, null=True, help_text=u'镜头类型名称')
    position = models.IntegerField(_(u'position'), default=1, help_text=u'排序', db_index=True)
    class Meta:
        verbose_name = _(u'镜头类型信息')
        verbose_name_plural = _(u'镜头类型信息')
    def __unicode__(self):
        return unicode(self.pk)
    @property
    def shots(self):
        models = ModelInfo.objects.filter(shot_type_id=self.shot_type_id, status=True)
        return [model.member_shot_data for model in models]
    @property
    def data(self):
        return {
            'type_id': self.shot_type_id,
            'type_name': self.shot_type_name,
            'shots': self.shots,
        }
class MemberActivityInfo(BaseModelMixin):
    brand_id = models.CharField(_(u'brand_id'), max_length=32, blank=True, null=True, help_text=u'品牌唯一标识', db_index=True)
    brand_name = models.CharField(_(u'brand_name'), max_length=255, blank=True, null=True, help_text=u'品牌名称')
    activity_id = ShortUUIDField(_(u'activity_id'), max_length=32, blank=True, null=True, help_text=u'活动唯一标识', db_index=True, unique=True)
    title = models.CharField(_(u'title'), max_length=255, blank=True, null=True, help_text=u'活动名称')
    subtitle = models.CharField(_(u'subtitle'), max_length=255, blank=True, null=True, help_text=u'活动二级名称')
    date = models.DateField(_(u'date'), blank=True, null=True, help_text=u'活动时间')
    city = models.CharField(_(u'city'), max_length=255, blank=True, null=True, help_text=u'活动城市')
    location = models.CharField(_(u'location'), max_length=255, blank=True, null=True, help_text=u'活动地点')
    lat = models.FloatField(_(u'lat'), default=1.0, help_text=u'纬度')
    lon = models.FloatField(_(u'lon'), default=1.0, help_text=u'经度')
    integral = models.IntegerField(_(u'integral'), default=0, help_text=u'会员积分')
    image = models.ImageField(_(u'image'), upload_to=upload_path, blank=True, null=True, help_text=u'活动内容图片')
    cover = models.ImageField(_(u'cover'), upload_to=upload_path, blank=True, null=True, help_text=u'活动列表图片')
    is_slider = models.BooleanField(_(u'is_slider'), default=True, help_text=u'是否为轮播活动', db_index=True)
    slider_image = models.ImageField(_(u'slider_image'), upload_to=upload_path, blank=True, null=True, help_text=u'活动轮播图片')
    content_rich_text = RichTextField(_(u'content_rich_text'), blank=True, null=True, help_text=u'活动描述')
    share_img_link = models.CharField(_(u'share_img_link'), max_length=255, blank=True, null=True, help_text=u'活动图片分享')
    share_h5_link = models.CharField(_(u'share_h5_link'), max_length=255, blank=True, null=True, help_text=u'活动H5分享')
    position = models.IntegerField(_(u'position'), default=1, help_text=u'排序', db_index=True)
    class Meta:
        verbose_name = _(u'会员活动信息')
        verbose_name_plural = _(u'会员活动信息')
    def __unicode__(self):
        return unicode(self.pk)
    @property
    def image_path(self):
        return upload_file_path(self.image)
    @property
    def image_url(self):
        return upload_file_url(self.image)
    @property
    def cover_path(self):
        return upload_file_path(self.cover)
    @property
    def cover_url(self):
        return upload_file_url(self.cover)
    @property
    def slider_image_path(self):
        return upload_file_path(self.slider_image)
    @property
    def slider_image_url(self):
        return upload_file_url(self.slider_image)
    @property
    def final_state(self):
        if not self.date:
            return u'报名中'
        tdate = tc.local_date()
        if tdate < self.date:
            return u'报名中'
        if tdate == self.date:
            return u'活动中'
        return u'已结束'
    def is_signed(self, user_id):
        # 是否已报名
        return MemberActivitySignupInfo.objects.filter(user_id=user_id, activity_id=self.activity_id, status=True).exists()
    def data(self, user_id):
        return {
            'id': self.activity_id,
            'activity_id': self.activity_id,
            'title': self.title,
            'subtitle': self.subtitle,
            'date': tc.local_string(self.date, format='%Y-%m-%d'),
            'city': self.city,
            'location': self.location,
            'lat': self.lat,
            'lon': self.lon,
            'integral': self.integral,
            'cover_url': self.cover_url,
            'share_img_link': self.share_img_link,
            'share_h5_link': self.share_h5_link,
            'slider_image': self.slider_image_url,
            'state': self.final_state,
            'is_signed': self.is_signed(user_id),
        }
    def details(self, user_id):
        return {
            'id': self.activity_id,
            'activity_id': self.activity_id,
            'title': self.title,
            'subtitle': self.subtitle,
            'date': tc.local_string(self.date, format='%Y-%m-%d'),
            'city': self.city,
            'location': self.location,
            'lat': self.lat,
            'lon': self.lon,
            'integral': self.integral,
            'content_rich_text': self.content_rich_text,
            'cover_url': self.cover_url,
            'share_img_link': self.share_img_link,
            'share_h5_link': self.share_h5_link,
            'slider_image': self.slider_image_url,
            'state': self.final_state,
            'is_signed': self.is_signed(user_id),
        }
class MemberActivitySignupInfo(BaseModelMixin):
    brand_id = models.CharField(_(u'brand_id'), max_length=32, blank=True, null=True, help_text=u'品牌唯一标识', db_index=True)
    brand_name = models.CharField(_(u'brand_name'), max_length=255, blank=True, null=True, help_text=u'品牌名称')
    signup_id = ShortUUIDField(_(u'signup_id'), max_length=32, blank=True, null=True, help_text=u'活动报名唯一标识', db_index=True, unique=True)
    user_id = models.CharField(_(u'user_id'), max_length=32, blank=True, null=True, help_text=u'用户唯一标识', db_index=True)
    activity_id = models.CharField(_(u'activity_id'), max_length=32, blank=True, null=True, help_text=u'活动唯一标识', db_index=True)
    title = models.CharField(_(u'title'), max_length=255, blank=True, null=True, help_text=u'活动名称')
    name = models.CharField(_(u'name'), max_length=255, blank=True, null=True, help_text=u'姓名')
    phone = models.CharField(_(u'phone'), max_length=255, blank=True, null=True, help_text=u'电话')
    class Meta:
        verbose_name = _(u'会员活动报名信息')
        verbose_name_plural = _(u'会员活动报名信息')
        unique_together = (
            ('user_id', 'activity_id'),
        )
    def __unicode__(self):
        return unicode(self.pk)
class MemberActivitySigninInfo(BaseModelMixin):
    brand_id = models.CharField(_(u'brand_id'), max_length=32, blank=True, null=True, help_text=u'品牌唯一标识', db_index=True)
    brand_name = models.CharField(_(u'brand_name'), max_length=255, blank=True, null=True, help_text=u'品牌名称')
    signin_id = ShortUUIDField(_(u'signin_id'), max_length=32, blank=True, null=True, help_text=u'活动签到唯一标识', db_index=True, unique=True)
    user_id = models.CharField(_(u'user_id'), max_length=32, blank=True, null=True, help_text=u'用户唯一标识', db_index=True)
    activity_id = models.CharField(_(u'activity_id'), max_length=32, blank=True, null=True, help_text=u'活动唯一标识', db_index=True)
    title = models.CharField(_(u'title'), max_length=255, blank=True, null=True, help_text=u'活动名称')
    class Meta:
        verbose_name = _(u'会员活动签到信息')
        verbose_name_plural = _(u'会员活动签到信息')
        unique_together = (
            ('user_id', 'activity_id'),
        )
    def __unicode__(self):
        return unicode(self.pk)
 |