# -*- coding: utf-8 -*- from datetime import datetime 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, } def maintaindata(self, level): right_detail = '' if level == 1: right_detail = self.level1 if self.level1 else '' elif level == 2: right_detail = self.level2 if self.level2 else '' elif level == 3: right_detail = self.level3 if self.level3 else '' elif level == 4: right_detail = self.level4 if self.level4 else '' elif level == 5: right_detail = self.level5 if self.level5 else '' return right_detail 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': self.date.strftime('%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': self.date.strftime('%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)