Brak opisu

models.py 34KB

    # -*- coding: utf-8 -*- from django.conf import settings from django.db import models from django.utils.translation import ugettext_lazy as _ from django_models_ext import (BaseModelMixin, ProvinceShortModelMixin, SexModelMixin, upload_file_path, upload_file_url, upload_path) from jsonfield import JSONField from shortuuidfield import ShortUUIDField from TimeConvert import TimeConvert as tc class AdministratorInfo(BaseModelMixin): ADMINISTRATOR = 0 MAINTENANCE = 1 USER_TYPE_TUPLE = ( (ADMINISTRATOR, u'管理员'), (MAINTENANCE, u'维修员'), ) ACTIVATED = 1 DISABLED = 2 DELETED = 3 USER_STATUS_TUPLE = ( (ACTIVATED, u'已激活'), (DISABLED, u'已禁用'), (DELETED, u'已删除'), ) admin_id = ShortUUIDField(_(u'admin_id'), max_length=32, blank=True, null=True, help_text=u'管理员唯一标识', db_index=True, unique=True) admin_type = models.IntegerField(_(u'admin_type'), choices=USER_TYPE_TUPLE, default=ADMINISTRATOR, help_text=u'管理员类型', db_index=True) phone = models.CharField(_(u'phone'), max_length=11, blank=True, null=True, help_text=u'管理员电话', db_index=True) password = models.CharField(_(u'password'), max_length=255, blank=True, null=True, help_text=u'管理员密码') encryption = models.CharField(_(u'encryption'), 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'管理员姓名') 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'品牌名称') user_status = models.IntegerField(_(u'user_status'), choices=USER_STATUS_TUPLE, default=ACTIVATED, help_text=u'管理员状态', db_index=True) class Meta: verbose_name = _(u'管理员信息') verbose_name_plural = _(u'管理员信息') def __unicode__(self): return u'{}-{}'.format(self.name, self.phone) class OperatorInfo(BaseModelMixin): ACTIVATED = 1 DISABLED = 2 DELETED = 3 USER_STATUS_TUPLE = ( (ACTIVATED, u'已激活'), (DISABLED, u'已禁用'), (DELETED, u'已删除'), ) operator_id = ShortUUIDField(_(u'operator_id'), max_length=32, blank=True, null=True, help_text=u'操作员唯一标识', db_index=True, unique=True) phone = models.CharField(_(u'phone'), max_length=11, blank=True, null=True, help_text=u'操作员电话', db_index=True) password = models.CharField(_(u'password'), max_length=255, blank=True, null=True, help_text=u'操作员密码') encryption = models.CharField(_(u'encryption'), 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'操作员姓名') 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'品牌名称') brand_domain = models.CharField(_(u'brand_domain'), max_length=255, blank=True, null=True, help_text=u'品牌域名') user_status = models.IntegerField(_(u'user_status'), choices=USER_STATUS_TUPLE, default=ACTIVATED, help_text=u'操作员状态', db_index=True) class Meta: verbose_name = _(u'操作员信息') verbose_name_plural = _(u'操作员信息') def __unicode__(self): return u'{}-{}'.format(self.name, self.phone) @property def data(self): return { 'operator_id': self.operator_id, 'phone': self.phone, 'name': self.name, } @property def kododata(self): return { 'optor_id': self.operator_id, 'brand_domain': self.brand_domain or settings.KODO_DEFAULT_BRAND_DOMAIN, } class BrandInfo(BaseModelMixin): brand_id = ShortUUIDField(_(u'brand_id'), max_length=32, help_text=u'品牌唯一标识', db_index=True, unique=True) brand_name = models.CharField(_(u'brand_name'), max_length=255, blank=True, null=True, help_text=u'品牌名称') brand_descr = models.TextField(_(u'brand_descr'), max_length=255, blank=True, null=True, help_text=u'品牌描述') tousername = models.CharField(_(u'tousername'), max_length=32, blank=True, null=True, help_text=u'微信公号(ToUserName)', db_index=True, unique=True) brand_logo = models.ImageField(_(u'brand_logo'), upload_to=upload_path, blank=True, null=True, help_text=u'品牌商标') brand_domain = models.CharField(_(u'brand_domain'), max_length=255, blank=True, null=True, help_text=u'品牌域名') clerk_direct_submit = models.BooleanField(_(u'clerk_direct_submit'), default=False, help_text=u'销售员直接提交') position = models.IntegerField(_(u'position'), default=1, help_text=u'排序') class Meta: verbose_name = _(u'品牌信息') verbose_name_plural = _(u'品牌信息') def __unicode__(self): return unicode(self.pk) @property def brand_logo_url(self): return upload_file_url(self.brand_logo) @property def data(self): return { 'brand_id': str(self.pk), 'brand_name': self.brand_name, 'brand_descr': self.brand_descr, } class ModelInfo(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'品牌名称') jancode = models.CharField(_(u'jancode'), max_length=16, blank=True, null=True, help_text=u'JAN_CODE', db_index=True) model_id = ShortUUIDField(_(u'model_id'), max_length=32, help_text=u'型号唯一标识', db_index=True, unique=True) model_name = models.CharField(_(u'model_name'), max_length=32, blank=True, null=True, help_text=u'型号名称') model_uni_name = models.CharField(_(u'model_uni_name'), max_length=32, blank=True, null=True, help_text=u'型号统一名称') model_full_name = models.CharField(_(u'model_full_name'), max_length=255, blank=True, null=True, help_text=u'型号全名称') model_descr = models.TextField(_(u'model_descr'), max_length=255, blank=True, null=True, help_text=u'型号描述') category = models.CharField(_(u'category'), max_length=32, blank=True, null=True, help_text=u'型号类别', db_index=True) warehouse = models.CharField(_(u'warehouse'), max_length=32, blank=True, null=True, help_text=u'所属仓库', db_index=True) image = models.ImageField(_(u'image'), upload_to=upload_path, blank=True, null=True, help_text=u'图片') url = models.CharField(_(u'url'), max_length=255, blank=True, null=True, help_text=u'链接') image2 = models.ImageField(_(u'image2'), upload_to=upload_path, blank=True, null=True, help_text=u'图片2') image3 = models.ImageField(_(u'image3'), upload_to=upload_path, blank=True, null=True, help_text=u'图片3') image4 = models.ImageField(_(u'image4'), upload_to=upload_path, blank=True, null=True, help_text=u'图片4') factory_yuan = models.FloatField(_(u'factory_yuan'), default=1000, help_text=u'出厂价(元)') factory_fee = models.IntegerField(_(u'factory_fee'), default=100000, help_text=u'出厂价(分)') integral = models.IntegerField(_(u'integral'), default=100, help_text=u'积分') is_send_redpack = models.BooleanField(_(u'is_send_redpack'), default=False, help_text=u'是否发放红包', db_index=True) redpack_amount = models.IntegerField(_(u'redpack_amount'), default=0, help_text=u'红包固定金额,单位:分') redpack_max_amount = models.IntegerField(_(u'redpack_max_amount'), default=0, help_text=u'红包金额范围,单位:分)') is_clerk_send_redpack = models.BooleanField(_(u'is_clerk_send_redpack'), default=False, help_text=u'销售员是否发放红包', db_index=True) clerk_redpack_amount = models.IntegerField(_(u'clerk_redpack_amount'), default=0, help_text=u'销售员红包固定金额,单位:分') clerk_redpack_max_amount = models.IntegerField(_(u'clerk_redpack_max_amount'), default=0, help_text=u'销售员红包金额范围,单位:分)') position = models.IntegerField(_(u'position'), default=1, help_text=u'排序') display = models.BooleanField(_(u'display'), default=True, help_text=_(u'Display'), db_index=True) is_important = models.BooleanField(_(u'is_important'), default=False, 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 image2_path(self): return upload_file_path(self.image2) @property def image2_url(self): return upload_file_url(self.image2) @property def image3_path(self): return upload_file_path(self.image3) @property def image3_url(self): return upload_file_url(self.image3) @property def image4_path(self): return upload_file_path(self.image4) @property def image4_url(self): return upload_file_url(self.image4) @property def images(self): imgs = [] if self.image: imgs.append({ 'image_url': self.image_url, 'url': self.url or '', }) if self.image2: imgs.append({ 'image_url': self.image2_url, 'url': self.url or '', }) if self.image3: imgs.append({ 'image_url': self.image3_url, 'url': self.url or '', }) if self.image4: imgs.append({ 'image_url': self.image4_url, 'url': self.url or '', }) return imgs @property def images2(self): imgs = [] if self.image: imgs.append(self.image_url) if self.image2: imgs.append(self.image2_url) if self.image3: imgs.append(self.image3_url) if self.image4: imgs.append(self.image4_url) return imgs @property def data(self): return { 'jancode': self.jancode, 'model_id': str(self.pk), 'model_name': self.model_name, 'model_descr': self.model_descr, } @property def admindata(self): return { 'jancode': self.jancode, 'ModelID': self.pk, 'model_id': self.model_id, 'model_name': self.model_name, 'model_uni_name': self.model_uni_name, 'model_full_name': self.model_full_name, 'model_descr': self.model_descr, 'category': self.category, 'warehouse': self.warehouse, 'image_path': self.image_path, 'image_url': self.image_url, 'image2_path': self.image2_path, 'image2_url': self.image2_url, 'image3_path': self.image3_path, 'image3_url': self.image3_url, 'image4_path': self.image4_path, 'image4_url': self.image4_url, 'model_imgs2': self.images2, 'factory_yuan': self.factory_yuan, 'integral': self.integral, 'is_important': self.is_important, } fulldata = admindata class ModelImageInfo(BaseModelMixin): model_id = models.CharField(_(u'model_id'), max_length=32, blank=True, null=True, help_text=u'型号唯一标识', db_index=True) model_name = models.CharField(_(u'model_name'), max_length=255, blank=True, null=True, help_text=u'型号名称') image = models.ImageField(_(u'image'), upload_to=upload_path, blank=True, null=True, help_text=u'图片') url = models.CharField(_(u'url'), max_length=255, blank=True, null=True, help_text=u'链接') position = models.IntegerField(_(u'position'), default=1, help_text=u'排序') class Meta: verbose_name = _(u'型号图片信息') verbose_name_plural = _(u'型号图片信息') def __unicode__(self): return unicode(self.pk) @property def image_url(self): return upload_file_url(self.image) @property def data(self): return { 'image_url': self.image_url, 'url': self.url, } class DistributorInfo(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'品牌名称') distributor_id = ShortUUIDField(_(u'distributor_id'), max_length=32, help_text=u'经销商唯一标识', db_index=True, unique=True) distributor_name = models.CharField(_(u'distributor_name'), max_length=255, blank=True, null=True, help_text=u'经销商名称') distributor_short_name = models.CharField(_(u'distributor_short_name'), max_length=8, blank=True, null=True, help_text=u'经销商简称') distributor_descr = models.TextField(_(u'distributor_descr'), max_length=255, blank=True, null=True, help_text=u'经销商描述') distributor_province_code = models.CharField(_(u'distributor_province_code'), max_length=6, blank=True, null=True, help_text=u'经销商所在省份编码') distributor_province_name = models.CharField(_(u'distributor_province_name'), max_length=3, choices=ProvinceShortModelMixin.PROVINCE_NAME_TUPLE, default=ProvinceShortModelMixin.PROVINCE_DEFAULT_NAME, blank=True, null=True, help_text=u'经销商所在省份名称') sr_id = models.CharField(_(u'sr_id'), max_length=32, blank=True, null=True, help_text=u'销售担当唯一标识', db_index=True) position = models.IntegerField(_(u'position'), default=1, help_text=u'排序') class Meta: verbose_name = _(u'经销商信息') verbose_name_plural = _(u'经销商信息') def __unicode__(self): return unicode(self.pk) @property def data(self): return { 'distributor_id': str(self.pk), 'distributor_name': self.distributor_name, 'distributor_short_name': self.distributor_short_name, 'distributor_descr': self.distributor_descr, } @property def admindata(self): return { 'distributor_id': self.distributor_id, 'distributor_name': self.distributor_name, 'distributor_short_name': self.distributor_short_name, 'distributor_descr': self.distributor_descr, 'province_code': self.distributor_province_code, 'province_name': self.distributor_province_name, 'sr_id': self.sr_id, } class SaleclerkInfo(BaseModelMixin, SexModelMixin): REFUSED = -1 UNVERIFIED = 0 ACTIVATED = 1 DISABLED = 2 DELETED = 3 ASSIGN = 10 USER_STATUS = ( (REFUSED, u'已拒绝'), (UNVERIFIED, u'未验证'), (ACTIVATED, u'已激活'), (DISABLED, u'已禁用'), (DELETED, u'已删除'), (ASSIGN, 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'品牌名称') distributor_id = models.CharField(_(u'distributor_id'), max_length=32, blank=True, null=True, help_text=u'经销商唯一标识', db_index=True) distributor_name = models.CharField(_(u'distributor_name'), max_length=32, blank=True, null=True, help_text=u'经销商名称') clerk_id = ShortUUIDField(_(u'clerk_id'), max_length=32, help_text=u'店员唯一标识', db_index=True, unique=True) clerk_name = models.CharField(_(u'clerk_name'), max_length=32, blank=True, null=True, help_text=u'店员名称') clerk_sex = models.IntegerField(_(u'clerk_sex'), choices=SexModelMixin.SEX_TUPLE, default=SexModelMixin.MALE, help_text=u'店员性别', db_index=True) clerk_phone = models.CharField(_(u'clerk_phone'), max_length=11, blank=True, null=True, help_text=u'店员联系电话') user_id = models.CharField(_(u'user_id'), max_length=32, blank=True, null=True, help_text=u'用户唯一标识', db_index=True) unionid = models.CharField(_(u'unionid'), max_length=32, blank=True, null=True, help_text=u'微信 UnionID', db_index=True) openid = models.CharField(_(u'openid'), max_length=32, blank=True, null=True, help_text=u'微信 OpenID', db_index=True) num = models.IntegerField(_(u'num'), default=0, help_text=u'支数') integral = models.IntegerField(_(u'integral'), default=0, help_text=u'积分') total_integral = models.IntegerField(_(u'total_integral'), default=0, help_text=u'全部积分') user_status = models.IntegerField(_(u'user_status'), choices=USER_STATUS, default=UNVERIFIED, help_text=u'用户状态', db_index=True) refused_reason = models.TextField(_(u'refused_reason'), blank=True, null=True, help_text=u'审核拒绝原因') is_auth = models.BooleanField(_(u'is_auth'), default=False, help_text=_(u'是否已授权'), db_index=True) test_user = models.BooleanField(_(u'test_user'), default=False, help_text=_(u'是否为测试用户'), db_index=True) class Meta: verbose_name = _(u'经销商销售员信息') verbose_name_plural = _(u'经销商销售员信息') unique_together = ( # ('brand_id', 'unionid'), ('brand_id', 'user_id'), ) def __unicode__(self): return unicode(self.pk) @property def admindata(self): return { 'distributor_id': self.distributor_id, 'distributor_name': self.distributor_name, 'clerk_id': self.clerk_id, 'clerk_name': self.clerk_name, 'clerk_sex': self.clerk_sex, 'clerk_phone': self.clerk_phone, 'num': self.num, 'integral': self.integral, # TODO: 'month_integral': self.integral, 'total_integral': self.total_integral, 'status': self.user_status, 'refused_reason': self.refused_reason, 'is_auth': self.is_auth, } data = admindata class BrandModelDistributorPriceInfo(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'品牌名称') model_id = models.CharField(_(u'model_id'), max_length=32, blank=True, null=True, help_text=u'型号唯一标识', db_index=True) model_name = models.CharField(_(u'model_name'), max_length=255, blank=True, null=True, help_text=u'型号名称') distributor_id = models.CharField(_(u'distributor_id'), max_length=32, blank=True, null=True, help_text=u'经销商唯一标识', db_index=True) distributor_name = models.CharField(_(u'distributor_name'), max_length=255, blank=True, null=True, help_text=u'经销商名称') factory_yuan = models.FloatField(_(u'factory_yuan'), default=1000, help_text=u'出厂价(元)') factory_fee = models.IntegerField(_(u'factory_fee'), default=100000, help_text=u'出厂价(分)') integral = models.IntegerField(_(u'integral'), default=100, help_text=u'积分') class Meta: verbose_name = _(u'品牌/型号/代理商价格信息') verbose_name_plural = _(u'品牌/型号/代理商价格信息') unique_together = ( ('brand_id', 'model_id', 'distributor_id'), ) def __unicode__(self): return unicode(self.pk) class LatestAppInfo(BaseModelMixin): brand_id = models.CharField(_(u'brand_id'), max_length=32, blank=True, null=True, help_text=u'品牌唯一标识', db_index=True) latest_adr_version_code = models.IntegerField(_(u'latest_adr_version_code'), default=0, help_text=u'最新安卓版本号') latest_adr_version_name = models.CharField(_(u'latest_adr_version_name'), max_length=16, blank=True, null=True, help_text=u'最新安卓版本名') latest_adr_app = models.FileField(_(u'latest_adr_app'), upload_to=upload_path, blank=True, null=True, help_text=u'最新版安卓 APP') latest_adr_url = models.URLField(_(u'latest_adr_url'), max_length=255, blank=True, null=True, help_text=u'最新版 APP 链接') latest_ios_version_code = models.IntegerField(_(u'latest_ios_version_code'), default=0, help_text=u'最新 iOS 版本号') latest_ios_version_name = models.CharField(_(u'latest_ios_version_name'), max_length=16, blank=True, null=True, help_text=u'最新 iOS 版本名') latest_ios_url = models.URLField(_(u'latest_ios_url'), max_length=255, blank=True, null=True, help_text=u'最新版 iOS 链接') class Meta: verbose_name = _(u'升级配置信息') verbose_name_plural = _(u'升级配置信息') def __unicode__(self): return u'{0.pk}'.format(self) @property def final_latest_adr_url(self): return self.latest_adr_url or upload_file_url(self.latest_adr_app) @property def data(self): return { 'latest_adr_version_code': self.latest_adr_version_code, 'latest_adr_version_name': self.latest_adr_version_name, 'latest_adr_url': self.final_latest_adr_url, 'latest_ios_version_code': self.latest_ios_version_code, 'latest_ios_version_name': self.latest_ios_version_name, 'latest_ios_url': self.latest_ios_url, } @property def adr(self): return { 'latest_adr_version_code': self.latest_adr_version_code, 'latest_adr_version_name': self.latest_adr_version_name, 'latest_adr_url': self.final_latest_adr_url, } class LatestAppScreenInfo(BaseModelMixin): brand_id = models.CharField(_(u'brand_id'), max_length=32, blank=True, null=True, help_text=u'品牌唯一标识', db_index=True) latest_adr_version_code = models.IntegerField(_(u'latest_adr_version_code'), default=0, help_text=u'最新安卓版本号') latest_adr_version_name = models.CharField(_(u'latest_adr_version_name'), max_length=16, blank=True, null=True, help_text=u'最新安卓版本名') latest_adr_app = models.FileField(_(u'latest_adr_app'), upload_to=upload_path, blank=True, null=True, help_text=u'最新版安卓 APP') latest_adr_url = models.URLField(_(u'latest_adr_url'), max_length=255, blank=True, null=True, help_text=u'最新版 APP 链接') latest_ios_version_code = models.IntegerField(_(u'latest_ios_version_code'), default=0, help_text=u'最新 iOS 版本号') latest_ios_version_name = models.CharField(_(u'latest_ios_version_name'), max_length=16, blank=True, null=True, help_text=u'最新 iOS 版本名') latest_ios_url = models.URLField(_(u'latest_ios_url'), max_length=255, blank=True, null=True, help_text=u'最新版 iOS 链接') class Meta: verbose_name = _(u'升级配置信息(数据大屏)') verbose_name_plural = _(u'升级配置信息(数据大屏)') def __unicode__(self): return u'{0.pk}'.format(self) @property def final_latest_adr_url(self): return self.latest_adr_url or upload_file_url(self.latest_adr_app) @property def data(self): return { 'latest_adr_version_code': self.latest_adr_version_code, 'latest_adr_version_name': self.latest_adr_version_name, 'latest_adr_url': self.final_latest_adr_url, 'latest_ios_version_code': self.latest_ios_version_code, 'latest_ios_version_name': self.latest_ios_version_name, 'latest_ios_url': self.latest_ios_url, } @property def adr(self): return { 'latest_adr_version_code': self.latest_adr_version_code, 'latest_adr_version_name': self.latest_adr_version_name, 'latest_adr_url': self.final_latest_adr_url, } class ConsumeImpressionInfo(BaseModelMixin): UNKNOWN = 0 MALE = 1 FEMALE = 2 SEX_TUPLE = ( (UNKNOWN, u'未知'), (MALE, u'男'), (FEMALE, u'女'), ) LT20 = 1 GTE20LT40 = 2 GTE40LT60 = 3 GTE60 = 4 AGE_RANGE_TUPLE = ( (UNKNOWN, u'未知'), (LT20, u'20岁以下'), (GTE20LT40, u'20-40岁'), (GTE40LT60, u'40-60岁'), (GTE60, u'60岁以上'), ) clerk_id = models.CharField(_(u'clerk_id'), max_length=32, blank=True, null=True, help_text=u'店员唯一标识', db_index=True) brand_id = models.CharField(_(u'brand_id'), max_length=32, blank=True, null=True, help_text=u'品牌唯一标识', db_index=True) model_id = models.CharField(_(u'model_id'), max_length=32, blank=True, null=True, help_text=u'型号唯一标识', db_index=True) serialNo = models.CharField(_(u'serialNo'), max_length=16, blank=True, null=True, help_text=u'序列号', db_index=True) sex = models.IntegerField(_(u'sex'), choices=SEX_TUPLE, default=UNKNOWN, help_text=u'性别') rage = models.IntegerField(_(u'rage'), choices=AGE_RANGE_TUPLE, default=UNKNOWN, help_text=u'年龄段') identity = models.CharField(_(u'identity'), max_length=255, blank=True, null=True, help_text=u'身份') purpose = models.CharField(_(u'purpose'), max_length=255, blank=True, null=True, help_text=u'用途') class Meta: verbose_name = _(u'客户印象') verbose_name_plural = _(u'客户印象') def __unicode__(self): return unicode(self.pk) @property def data(self): return { 'sex': self.sex, 'rage': self.rage, 'identity': self.identity, 'purpose': self.purpose, } class ConsumeInfoSubmitLogInfo(BaseModelMixin): user_id = models.CharField(_(u'user_id'), max_length=32, blank=True, null=True, help_text=u'用户唯一标识', db_index=True) phone = models.CharField(_(u'phone'), max_length=11, blank=True, null=True, help_text=u'用户手机', db_index=True) iv = models.CharField(_(u'iv'), max_length=255, blank=True, null=True, help_text=u'iv') encryptedData = models.CharField(_(u'encryptedData'), max_length=255, blank=True, null=True, help_text=u'encryptedData') lat = models.FloatField(_(u'lat'), default=1.0, help_text=u'纬度') lon = models.FloatField(_(u'lon'), default=1.0, help_text=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'品牌名称') model_id = models.CharField(_(u'model_id'), max_length=32, blank=True, null=True, help_text=u'型号唯一标识', db_index=True) model_name = models.CharField(_(u'model_name'), max_length=255, blank=True, null=True, help_text=u'型号名称') distributor_id = models.CharField(_(u'distributor_id'), max_length=32, blank=True, null=True, help_text=u'经销商唯一标识', db_index=True) distributor_name = models.CharField(_(u'distributor_name'), max_length=255, blank=True, null=True, help_text=u'经销商名称') serialNo = models.CharField(_(u'serialNo'), max_length=16, blank=True, null=True, help_text=u'序列号', db_index=True) verifyResult = models.IntegerField(_(u'verifyResult'), default=0, help_text=u'验证结果', db_index=True) dupload = models.BooleanField(_(u'dupload'), default=False, help_text=_(u'是否为重复提交'), db_index=True) submit_during_activity = models.BooleanField(_(u'submit_during_activity'), default=False, help_text=_(u'是否为活动期间上传'), db_index=True) activity_id = models.IntegerField(_(u'activity_id'), default=0, help_text=_(u'活动唯一标识')) coupon_expire_at = models.DateTimeField(_(u'coupon_expire_at'), blank=True, null=True, help_text=_(u'维修券过期时间')) coupon_value = models.IntegerField(_(u'coupon_value'), default=0, help_text=_(u'维修券金额(单位:分)')) has_used = models.BooleanField(_(u'has_used'), default=False, help_text=_(u'是否已核销'), db_index=True) admin_id = models.CharField(_(u'admin_id'), max_length=32, blank=True, null=True, help_text=u'核销员唯一标识', db_index=True) used_at = models.DateTimeField(_(u'used_at'), blank=True, null=True, help_text=_(u'维修券核销时间')) test_user = models.BooleanField(_(u'test_user'), default=False, help_text=_(u'是否为测试用户'), db_index=True) class Meta: verbose_name = _(u'消费者信息提交记录') verbose_name_plural = _(u'消费者信息提交记录') def __unicode__(self): return unicode(self.pk) @property def final_coupon_expire_at(self): if not self.coupon_expire_at: return '' y = tc.local_string(self.coupon_expire_at, format='%Y') m = tc.local_string(self.coupon_expire_at, format='%m') d = tc.local_string(self.coupon_expire_at, format='%d') return u'{}年{}月{}日'.format(y, m, d) @property def model_info(self): try: info = ModelInfo.objects.get(model_id=self.model_id).fulldata except ModelInfo.DoesNotExist: info = {} return info @property def coupon_info(self): return { 'coupon_expire_at': '', 'coupon_value': 0, 'coupon_has_expired': True, } @property def coupon_info2(self): return self.coupon_info, @property def data(self): if self.submit_during_activity: try: act = ActivityInfo.objects.get(pk=self.activity_id) except ActivityInfo.DoesNotExist: act = None else: act = None return { 'lat': self.lat, 'lon': self.lon, 'brand_id': self.brand_id, 'brand_name': self.brand_name, 'model_id': self.model_id, 'model_name': self.model_name, 'model_info': self.model_info, 'serialNo': self.serialNo, 'verifyResult': self.verifyResult, 'submit_during_activity': self.submit_during_activity, 'coupon_info': act.coupon_info2(created_at=self.created_at) if act else self.coupon_info2, 'final_coupon_info': act.coupon_info(created_at=self.created_at) if act else self.coupon_info, 'has_used': self.has_used, 'used_at': self.used_at, } class ActivityInfo(BaseModelMixin): FIXED_EXPIRED_TIME = 0 CHANGED_EXPIRED_TIME = 1 COUPON_EXPIRED_TIME_TUPLE = ( (FIXED_EXPIRED_TIME, u'固定结束时间'), (CHANGED_EXPIRED_TIME, u'可变结束时间'), ) brand_id = models.CharField(_(u'brand_id'), max_length=32, blank=True, null=True, help_text=u'品牌唯一标识', db_index=True) activity_name = models.CharField(_(u'activity_name'), max_length=255, blank=True, null=True, help_text=u'活动名称') model_uni_names = JSONField(_(u'model_uni_names'), default=[], blank=True, null=True, help_text=u'型号统一名称列表') start_at = models.DateTimeField(_(u'start_at'), help_text=_(u'start_at')) end_at = models.DateTimeField(_(u'end_at'), help_text=_(u'end_at')) coupon_expire_type = models.IntegerField(_(u'coupon_expire_type'), choices=COUPON_EXPIRED_TIME_TUPLE, default=FIXED_EXPIRED_TIME, help_text=_(u'维修券类型')) coupon_valid_period = models.IntegerField(_(u'coupon_valid_period'), default=0, help_text=_(u'维修券有效时间(单位:天)')) coupon_expire_at = models.DateTimeField(_(u'coupon_expire_at'), blank=True, null=True, help_text=_(u'维修券过期时间')) coupon_value = models.IntegerField(_(u'coupon_value'), default=0, help_text=_(u'维修券金额(单位:分)')) class Meta: verbose_name = _(u'活动信息') verbose_name_plural = _(u'活动信息') def __unicode__(self): return unicode(self.pk) def final_expire_at(self, created_at=None): if self.coupon_expire_type == ActivityInfo.FIXED_EXPIRED_TIME: return self.coupon_expire_at return tc.utc_datetime(dt=created_at, days=self.coupon_valid_period) def final_coupon_expire_at(self, created_at=None): final_expire_at = self.final_expire_at(created_at=created_at) if not final_expire_at: return '' y = tc.local_string(final_expire_at, format='%Y') m = tc.local_string(final_expire_at, format='%m') d = tc.local_string(final_expire_at, format='%d') return u'{}年{}月{}日'.format(y, m, d) def has_unexpired_activity(self, model_name): return (self.model_uni_names and model_name in self.model_uni_names) and (self.start_at <= tc.utc_datetime() < self.end_at) def coupon_info(self, created_at=None): return { 'coupon_expire_at': self.final_coupon_expire_at(created_at=created_at), 'coupon_value': self.coupon_value, 'coupon_has_expired': tc.utc_datetime() >= self.final_expire_at(created_at=created_at), } def coupon_info2(self, created_at=None): return self.coupon_info(created_at=created_at), class SlideInfo(BaseModelMixin): brand_id = models.CharField(_(u'brand_id'), max_length=32, blank=True, null=True, help_text=u'品牌唯一标识', db_index=True) image = models.ImageField(_(u'image'), upload_to=upload_path, blank=True, null=True, help_text=u'图片') url = models.CharField(_(u'url'), max_length=255, blank=True, null=True, help_text=u'链接') position = models.IntegerField(_(u'position'), default=1, help_text=u'排序') 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 data(self): return { 'image_url': self.image_url, 'url': self.url, }