| @@ -0,0 +1,24 @@ | ||
| 1 | +# -*- coding: utf-8 -*- | |
| 2 | +# Generated by Django 3.2.16 on 2022-11-05 15:16 | |
| 3 | + | |
| 4 | +from django.db import migrations, models | |
| 5 | + | |
| 6 | + | |
| 7 | +class Migration(migrations.Migration): | |
| 8 | + | |
| 9 | + dependencies = [ | |
| 10 | +        ('account', '0056_alter_userintegralincomeexpensesinfo_integral_from'), | |
| 11 | + ] | |
| 12 | + | |
| 13 | + operations = [ | |
| 14 | + migrations.AddField( | |
| 15 | + model_name='userinfo', | |
| 16 | + name='identity_card_name', | |
| 17 | + field=models.CharField(blank=True, help_text='身份证姓名', max_length=32, null=True, verbose_name='identity_card_name'), | |
| 18 | + ), | |
| 19 | + migrations.AddField( | |
| 20 | + model_name='userinfo', | |
| 21 | + name='identity_card_number', | |
| 22 | + field=models.CharField(blank=True, help_text='身份证号', max_length=32, null=True, verbose_name='identity_card_number'), | |
| 23 | + ), | |
| 24 | + ] | 
| @@ -102,8 +102,8 @@ class UserInfo(BaseModelMixin, LensmanTypeBoolMixin): | ||
| 102 | 102 | province_name = models.CharField(_(u'province_name'), max_length=255, blank=True, null=True, help_text=u'用户省份信息') | 
| 103 | 103 |  | 
| 104 | 104 | # 用户身份 | 
| 105 | - islensman = models.BooleanField(_(u'islensman'), default=False, help_text=_(u'摄影师?')) | |
| 106 | - istourguide = models.BooleanField(_(u'istourguide'), default=False, help_text=_(u'导游?')) | |
| 105 | + islensman = models.BooleanField(_(u'islensman'), default=False, help_text=u'摄影师?') | |
| 106 | + istourguide = models.BooleanField(_(u'istourguide'), default=False, help_text=u'导游?') | |
| 107 | 107 |  | 
| 108 | 108 | balance = models.IntegerField(_(u'balance'), default=0, help_text=u'用户余额(分)') | 
| 109 | 109 | freeze_income_balance = models.IntegerField(_(u'freeze_income_balance'), default=0, help_text=u'用户收入冻结余额(分)') | 
| @@ -112,25 +112,25 @@ class UserInfo(BaseModelMixin, LensmanTypeBoolMixin): | ||
| 112 | 112 | user_status = models.IntegerField(_(u'user_status'), choices=USER_STATUS, default=UNVERIFIED, help_text=u'用户状态') | 
| 113 | 113 | outtake_status = models.IntegerField(_(u'outtake_status'), choices=USER_STATUS, default=UNVERIFIED, help_text=u'花絮摄影师状态') | 
| 114 | 114 |  | 
| 115 | - assign_ip = models.CharField(_(u'assign_ip'), max_length=32, blank=True, null=True, help_text=_(u'分配IP')) | |
| 116 | - assign_at = models.DateTimeField(_(u'assign_at'), blank=True, null=True, help_text=_(u'分配时间')) | |
| 115 | + assign_ip = models.CharField(_(u'assign_ip'), max_length=32, blank=True, null=True, help_text=u'分配IP') | |
| 116 | + assign_at = models.DateTimeField(_(u'assign_at'), blank=True, null=True, help_text=u'分配时间') | |
| 117 | 117 |  | 
| 118 | - signup_ip = models.CharField(_(u'signup_ip'), max_length=32, blank=True, null=True, help_text=_(u'注册IP')) | |
| 119 | - signup_at = models.DateTimeField(_(u'signup_at'), blank=True, null=True, help_text=_(u'注册时间')) | |
| 118 | + signup_ip = models.CharField(_(u'signup_ip'), max_length=32, blank=True, null=True, help_text=u'注册IP') | |
| 119 | + signup_at = models.DateTimeField(_(u'signup_at'), blank=True, null=True, help_text=u'注册时间') | |
| 120 | 120 |  | 
| 121 | - login_ip = models.CharField(_(u'login_ip'), max_length=32, blank=True, null=True, help_text=_(u'登录IP')) | |
| 122 | - login_at = models.DateTimeField(_(u'login_at'), blank=True, null=True, help_text=_(u'登录时间')) | |
| 121 | + login_ip = models.CharField(_(u'login_ip'), max_length=32, blank=True, null=True, help_text=u'登录IP') | |
| 122 | + login_at = models.DateTimeField(_(u'login_at'), blank=True, null=True, help_text=u'登录时间') | |
| 123 | 123 |  | 
| 124 | 124 | subscribe = models.IntegerField(_(u'subscribe'), default=0, help_text=u'是否关注', db_index=True) | 
| 125 | - new_subscribe = models.BooleanField(_(u'new_subscribe'), default=False, help_text=_(u'是否新增关注')) | |
| 125 | + new_subscribe = models.BooleanField(_(u'new_subscribe'), default=False, help_text=u'是否新增关注') | |
| 126 | 126 |  | 
| 127 | 127 | code_version = models.IntegerField(_(u'code_version'), default=1, help_text=u'统览码版本', db_index=True) | 
| 128 | 128 |  | 
| 129 | - has_membercard = models.BooleanField(_(u'has_membercard'), default=False, help_text=_(u'是否激活会员卡')) | |
| 130 | - membercardid = models.CharField(_(u'membercardid'), max_length=32, blank=True, null=True, help_text=_(u'会员卡编号'), db_index=True) | |
| 131 | - memberusercardcode = models.CharField(_(u'memberusercardcode'), max_length=32, blank=True, null=True, help_text=_(u'用户会员卡编号'), db_index=True) | |
| 129 | + has_membercard = models.BooleanField(_(u'has_membercard'), default=False, help_text=u'是否激活会员卡') | |
| 130 | + membercardid = models.CharField(_(u'membercardid'), max_length=32, blank=True, null=True, help_text=u'会员卡编号', db_index=True) | |
| 131 | + memberusercardcode = models.CharField(_(u'memberusercardcode'), max_length=32, blank=True, null=True, help_text=u'用户会员卡编号', db_index=True) | |
| 132 | 132 |  | 
| 133 | - test_user = models.BooleanField(_(u'test_user'), default=False, help_text=_(u'是否为测试用户')) | |
| 133 | + test_user = models.BooleanField(_(u'test_user'), default=False, help_text=u'是否为测试用户') | |
| 134 | 134 |  | 
| 135 | 135 | # 会员信息 | 
| 136 | 136 | integral = models.IntegerField(_(u'integral'), default=0, help_text=u'会员积分') | 
| @@ -140,12 +140,16 @@ class UserInfo(BaseModelMixin, LensmanTypeBoolMixin): | ||
| 140 | 140 | level = models.IntegerField(_(u'level'), choices=LEVEL_TUPLE, default=MEMBER_NO, help_text=u'会员等级') | 
| 141 | 141 |  | 
| 142 | 142 | # 优惠券信息 | 
| 143 | - coupon_expire_at = models.DateTimeField(_(u'coupon_expire_at'), blank=True, null=True, help_text=_(u'优惠券过期时间')) | |
| 143 | + coupon_expire_at = models.DateTimeField(_(u'coupon_expire_at'), blank=True, null=True, help_text=u'优惠券过期时间') | |
| 144 | 144 |  | 
| 145 | 145 | # 维修员信息 | 
| 146 | - is_maintenance = models.BooleanField(_(u'is_maintenance'), default=False, help_text=_(u'是否维修员')) | |
| 146 | + is_maintenance = models.BooleanField(_(u'is_maintenance'), default=False, help_text=u'是否维修员') | |
| 147 | 147 |  | 
| 148 | - resgister_at = models.DateTimeField(_(u'resgister_at'), blank=True, null=True, help_text=_(u'注册镜头时间')) | |
| 148 | + resgister_at = models.DateTimeField(_(u'resgister_at'), blank=True, null=True, help_text=u'注册镜头时间') | |
| 149 | + | |
| 150 | + # 身份证信息 | |
| 151 | + identity_card_number = models.CharField(_(u'identity_card_number'), max_length=32, blank=True, null=True, help_text=u'身份证号') | |
| 152 | + identity_card_name = models.CharField(_(u'identity_card_name'), max_length=32, blank=True, null=True, help_text=u'身份证姓名') | |
| 149 | 153 |  | 
| 150 | 154 | class Meta: | 
| 151 | 155 | verbose_name = _(u'userinfo') | 
| @@ -26,14 +26,14 @@ class CouponInfo(BaseModelMixin): | ||
| 26 | 26 |  | 
| 27 | 27 | coupon_title = models.CharField(_(u'coupon_title'), max_length=255, blank=True, null=True, help_text=u'券标题') | 
| 28 | 28 | coupon_detail = RichTextField(_(u'coupon_detail'), blank=True, null=True, help_text=u'券详情') | 
| 29 | - coupon_value = models.IntegerField(_(u'coupon_value'), default=0, help_text=_(u'维修券金额(单位:分)')) | |
| 29 | + coupon_value = models.IntegerField(_(u'coupon_value'), default=0, help_text=u'维修券金额(单位:分)') | |
| 30 | 30 | coupon_image = models.ImageField(_(u'coupon_image'), upload_to=upload_path, blank=True, null=True, help_text=u'券图片') | 
| 31 | 31 |  | 
| 32 | - coupon_expire_type = models.IntegerField(_(u'coupon_expire_type'), choices=COUPON_EXPIRED_TIME_TUPLE, default=FIXED_EXPIRED_TIME, help_text=_(u'维修券类型')) | |
| 33 | - coupon_valid_period = models.IntegerField(_(u'coupon_valid_period'), default=0, help_text=_(u'维修券有效时间(单位:天)')) | |
| 34 | - coupon_expire_at = models.DateTimeField(_(u'coupon_expire_at'), blank=True, null=True, help_text=_(u'维修券过期时间')) | |
| 32 | + coupon_expire_type = models.IntegerField(_(u'coupon_expire_type'), choices=COUPON_EXPIRED_TIME_TUPLE, default=FIXED_EXPIRED_TIME, help_text=u'维修券类型') | |
| 33 | + coupon_valid_period = models.IntegerField(_(u'coupon_valid_period'), default=0, help_text=u'维修券有效时间(单位:天)') | |
| 34 | + coupon_expire_at = models.DateTimeField(_(u'coupon_expire_at'), blank=True, null=True, help_text=u'维修券过期时间') | |
| 35 | 35 |  | 
| 36 | - is_coupon_admin_writeoff = models.BooleanField(_(u'is_coupon_admin_writeoff'), default=True, help_text=_(u'是否是管理员核销')) | |
| 36 | + is_coupon_admin_writeoff = models.BooleanField(_(u'is_coupon_admin_writeoff'), default=True, help_text=u'是否是管理员核销') | |
| 37 | 37 | coupon_limit_model_ids = JSONField(_(u'coupon_limit_model_ids'), blank=True, null=True, help_text=u'券限制使用 model_ids') | 
| 38 | 38 |  | 
| 39 | 39 | class Meta: | 
| @@ -101,9 +101,9 @@ class UserCouponInfo(BaseModelMixin): | ||
| 101 | 101 | coupon_value = models.IntegerField(_(u'coupon_value'), default=0, blank=True, null=True, help_text=u'券金额(单位:分)') | 
| 102 | 102 | coupon_image = models.ImageField(_(u'coupon_image'), upload_to=upload_path, blank=True, null=True, help_text=u'券图片') | 
| 103 | 103 |  | 
| 104 | - active_at = models.DateTimeField(_(u'active_at'), blank=True, null=True, help_text=_(u'生效时间')) | |
| 105 | - expire_at = models.DateTimeField(_(u'expire_at'), blank=True, null=True, help_text=_(u'过期时间')) | |
| 106 | - coupon_valid_period = models.IntegerField(_(u'coupon_valid_period'), default=0, help_text=_(u'券有效时间(单位:天)')) | |
| 104 | + active_at = models.DateTimeField(_(u'active_at'), blank=True, null=True, help_text=u'生效时间') | |
| 105 | + expire_at = models.DateTimeField(_(u'expire_at'), blank=True, null=True, help_text=u'过期时间') | |
| 106 | + coupon_valid_period = models.IntegerField(_(u'coupon_valid_period'), default=0, help_text=u'券有效时间(单位:天)') | |
| 107 | 107 |  | 
| 108 | 108 | coupon_limit_model_ids = JSONField(_(u'coupon_limit_model_ids'), blank=True, null=True, help_text=u'券限制使用 model_ids') | 
| 109 | 109 |  | 
| @@ -111,7 +111,7 @@ class UserCouponInfo(BaseModelMixin): | ||
| 111 | 111 | admin_id = models.CharField(_(u'admin_id'), max_length=32, blank=True, null=True, help_text=u'核销员唯一标识', db_index=True) | 
| 112 | 112 | admin_name = models.CharField(_(u'admin_name'), max_length=255, blank=True, null=True, help_text=u'核销员名称', db_index=True) | 
| 113 | 113 | used_at = models.DateTimeField(_(u'used_at'), blank=True, null=True, help_text=u'维修券核销时间') | 
| 114 | - is_coupon_admin_writeoff = models.BooleanField(_(u'is_coupon_admin_writeoff'), default=True, help_text=_(u'是否是管理员核销')) | |
| 114 | + is_coupon_admin_writeoff = models.BooleanField(_(u'is_coupon_admin_writeoff'), default=True, help_text=u'是否是管理员核销') | |
| 115 | 115 |  | 
| 116 | 116 | clerk_id = models.CharField(_(u'admin_id'), max_length=32, blank=True, null=True, help_text=u'销售员唯一标识', db_index=True) | 
| 117 | 117 | clerk_name = models.CharField(_(u'clerk_name'), max_length=32, blank=True, null=True, help_text=u'销售员名称', db_index=True) | 
| @@ -49,7 +49,7 @@ class SaleclerkIntegralIncomeExpensesInfo(BaseModelMixin): | ||
| 49 | 49 |  | 
| 50 | 50 | remark = models.CharField(_(u'remark'), max_length=255, blank=True, null=True, help_text=u'备注') | 
| 51 | 51 |  | 
| 52 | - test_user = models.BooleanField(_(u'test_user'), default=False, help_text=_(u'是否为测试用户')) | |
| 52 | + test_user = models.BooleanField(_(u'test_user'), default=False, help_text=u'是否为测试用户') | |
| 53 | 53 |  | 
| 54 | 54 | class Meta: | 
| 55 | 55 | verbose_name = _(u'saleclerkintegralincomeexpensesinfo') | 
| @@ -104,26 +104,26 @@ class SaleclerkSubmitLogInfo(BaseModelMixin): | ||
| 104 | 104 | image = models.FileField(_(u'image'), upload_to=upload_path, blank=True, null=True, help_text=u'图片') | 
| 105 | 105 | code_image = models.FileField(_(u'code_image'), upload_to=upload_path, blank=True, null=True, help_text=u'序列号图片') | 
| 106 | 106 |  | 
| 107 | - has_scan = models.BooleanField(_(u'has_scan'), default=False, help_text=_(u'是否被消费者扫过')) | |
| 107 | + has_scan = models.BooleanField(_(u'has_scan'), default=False, help_text=u'是否被消费者扫过') | |
| 108 | 108 |  | 
| 109 | 109 | remark = models.CharField(_(u'remark'), max_length=255, blank=True, null=True, help_text=u'备注') | 
| 110 | 110 |  | 
| 111 | - dupload = models.BooleanField(_(u'dupload'), default=False, help_text=_(u'是否为重复提交')) | |
| 111 | + dupload = models.BooleanField(_(u'dupload'), default=False, help_text=u'是否为重复提交') | |
| 112 | 112 |  | 
| 113 | - test_user = models.BooleanField(_(u'test_user'), default=False, help_text=_(u'是否为测试用户')) | |
| 114 | - test_sn = models.BooleanField(_(u'test_sn'), default=False, help_text=_(u'是否为测试序列号')) | |
| 113 | + test_user = models.BooleanField(_(u'test_user'), default=False, help_text=u'是否为测试用户') | |
| 114 | + test_sn = models.BooleanField(_(u'test_sn'), default=False, help_text=u'是否为测试序列号') | |
| 115 | 115 |  | 
| 116 | 116 | ym = models.IntegerField(_(u'ym'), default=0, help_text=u'年月', db_index=True) # 例:201712, tc.local_string(format='%Y%m') | 
| 117 | 117 | ymd = models.IntegerField(_(u'ymd'), default=0, help_text=u'年月日', db_index=True) # 例:20171208, tc.local_string(format='%Y%m%d') | 
| 118 | 118 |  | 
| 119 | 119 | trackingNo = models.CharField(_(u'trackingNo'), max_length=32, blank=True, null=True, help_text=u'快递单号') | 
| 120 | 120 |  | 
| 121 | - is_wxwork = models.BooleanField(_(u'is_wxwork'), default=False, help_text=_(u'是否为企业微信端')) | |
| 121 | + is_wxwork = models.BooleanField(_(u'is_wxwork'), default=False, help_text=u'是否为企业微信端') | |
| 122 | 122 |  | 
| 123 | - is_staff_delete = models.BooleanField(_(u'is_staff_delete'), default=False, help_text=_(u'是否管理员删除')) | |
| 124 | - code_version = models.IntegerField(_(u'code_version'), default=1, help_text=_(u'统览码版本'), db_index=True) | |
| 123 | + is_staff_delete = models.BooleanField(_(u'is_staff_delete'), default=False, help_text=u'是否管理员删除') | |
| 124 | + code_version = models.IntegerField(_(u'code_version'), default=1, help_text=u'统览码版本', db_index=True) | |
| 125 | 125 |  | 
| 126 | - is_upload_qiniu = models.BooleanField(_(u'is_upload_qiniu'), default=False, help_text=_(u'是否已上传七牛')) | |
| 126 | + is_upload_qiniu = models.BooleanField(_(u'is_upload_qiniu'), default=False, help_text=u'是否已上传七牛') | |
| 127 | 127 |  | 
| 128 | 128 | class Meta: | 
| 129 | 129 | verbose_name = _(u'销售员扫码出库记录') | 
| @@ -50,6 +50,7 @@ INSTALLED_APPS = ( | ||
| 50 | 50 | 'django_admin', | 
| 51 | 51 | 'django_rlog', | 
| 52 | 52 | 'django_we', | 
| 53 | + 'daterange_filter', | |
| 53 | 54 | 'corsheaders', | 
| 54 | 55 | 'simditor', | 
| 55 | 56 | 'api', | 
| @@ -71,8 +72,8 @@ INSTALLED_APPS = ( | ||
| 71 | 72 | 'server', | 
| 72 | 73 | 'staff', | 
| 73 | 74 | 'statistic', | 
| 75 | + 'tenancy', | |
| 74 | 76 | 'website', | 
| 75 | - 'daterange_filter', | |
| 76 | 77 | ) | 
| 77 | 78 |  | 
| 78 | 79 |  INSTALLED_APPS += ('multidomain', ) | 
| @@ -148,7 +148,7 @@ class ComplementCodeLogInfo(BaseModelMixin): | ||
| 148 | 148 |  | 
| 149 | 149 | is_contacted = models.BooleanField(_(u'is_contacted'), default=False, help_text=u'是否已联系用户') | 
| 150 | 150 |  | 
| 151 | - is_upload_qiniu = models.BooleanField(_(u'is_upload_qiniu'), default=False, help_text=_(u'是否已上传七牛')) | |
| 151 | + is_upload_qiniu = models.BooleanField(_(u'is_upload_qiniu'), default=False, help_text=u'是否已上传七牛') | |
| 152 | 152 |  | 
| 153 | 153 | class Meta: | 
| 154 | 154 | verbose_name = _(u'补码记录') | 
| @@ -198,8 +198,8 @@ class ComplementCodeLogInfo(BaseModelMixin): | ||
| 198 | 198 | class AdministratorLoginLogInfo(BaseModelMixin): | 
| 199 | 199 | admin_id = models.CharField(_(u'admin_id'), max_length=32, blank=True, null=True, help_text=u'管理员唯一标识') | 
| 200 | 200 | admin_name = models.CharField(_(u'name'), max_length=255, blank=True, null=True, help_text=u'管理员姓名') | 
| 201 | - login_ip = models.CharField(_(u'login_ip'), max_length=32, blank=True, null=True, help_text=_(u'登录IP')) | |
| 202 | - login_at = models.DateTimeField(_(u'login_at'), blank=True, null=True, help_text=_(u'登录时间')) | |
| 201 | + login_ip = models.CharField(_(u'login_ip'), max_length=32, blank=True, null=True, help_text=u'登录IP') | |
| 202 | + login_at = models.DateTimeField(_(u'login_at'), blank=True, null=True, help_text=u'登录时间') | |
| 203 | 203 |  | 
| 204 | 204 | @property | 
| 205 | 205 | def admindata(self): | 
| @@ -0,0 +1,24 @@ | ||
| 1 | +# -*- coding: utf-8 -*- | |
| 2 | +# Generated by Django 3.2.16 on 2022-11-05 15:16 | |
| 3 | + | |
| 4 | +from django.db import migrations, models | |
| 5 | + | |
| 6 | + | |
| 7 | +class Migration(migrations.Migration): | |
| 8 | + | |
| 9 | + dependencies = [ | |
| 10 | +        ('marketcode', '0007_alter_marketcodeinfo_status'), | |
| 11 | + ] | |
| 12 | + | |
| 13 | + operations = [ | |
| 14 | + migrations.AlterField( | |
| 15 | + model_name='marketcodeinfo', | |
| 16 | + name='code_index', | |
| 17 | + field=models.IntegerField(default=0, help_text='该码在批次中的偏移量', verbose_name='code_index'), | |
| 18 | + ), | |
| 19 | + migrations.AlterField( | |
| 20 | + model_name='marketcodeinfo', | |
| 21 | + name='code_url', | |
| 22 | + field=models.CharField(blank=True, db_index=True, help_text='28位普通码字符', max_length=128, null=True, verbose_name='code_url'), | |
| 23 | + ), | |
| 24 | + ] | 
| @@ -11,10 +11,10 @@ class MarketCodeInfo(BaseModelMixin): | ||
| 11 | 11 |  | 
| 12 | 12 | lattice = models.CharField(_(u'code'), max_length=361, blank=True, null=True, help_text=u'361 字节的 01 点阵,用于支持生成 19 * 19 的微型码,0 为白,1 为黑') | 
| 13 | 13 | code = models.CharField(_(u'code'), max_length=16, blank=True, null=True, help_text=u'九位的字符串原始码', db_index=True) | 
| 14 | - code_index = models.IntegerField(_(u'code_index'), default=0, help_text=u'该码在批次中的偏移量 ') | |
| 15 | - code_url = models.CharField(_(u'code_url'), max_length=128, blank=True, null=True, help_text=u'28位普通码字符 ', db_index=True) | |
| 14 | + code_index = models.IntegerField(_(u'code_index'), default=0, help_text=u'该码在批次中的偏移量') | |
| 15 | + code_url = models.CharField(_(u'code_url'), max_length=128, blank=True, null=True, help_text=u'28位普通码字符', db_index=True) | |
| 16 | 16 |  | 
| 17 | - has_used = models.BooleanField(_(u'has_used'), default=False, help_text=_(u'是否已使用')) | |
| 17 | + has_used = models.BooleanField(_(u'has_used'), default=False, help_text=u'是否已使用') | |
| 18 | 18 |  | 
| 19 | 19 | class Meta: | 
| 20 | 20 | verbose_name = _(u'一物一码信息') | 
| @@ -0,0 +1,19 @@ | ||
| 1 | +# -*- coding: utf-8 -*- | |
| 2 | +# Generated by Django 3.2.16 on 2022-11-05 15:16 | |
| 3 | + | |
| 4 | +from django.db import migrations, models | |
| 5 | + | |
| 6 | + | |
| 7 | +class Migration(migrations.Migration): | |
| 8 | + | |
| 9 | + dependencies = [ | |
| 10 | +        ('mch', '0063_auto_20210915_1653'), | |
| 11 | + ] | |
| 12 | + | |
| 13 | + operations = [ | |
| 14 | + migrations.AlterField( | |
| 15 | + model_name='modelinfo', | |
| 16 | + name='display', | |
| 17 | + field=models.BooleanField(default=True, help_text='是否显示', verbose_name='display'), | |
| 18 | + ), | |
| 19 | + ] | 
| @@ -173,15 +173,15 @@ class ModelInfo(BaseModelMixin): | ||
| 173 | 173 |  | 
| 174 | 174 | position = models.IntegerField(_(u'position'), default=1, help_text=u'排序') | 
| 175 | 175 |  | 
| 176 | - display = models.BooleanField(_(u'display'), default=True, help_text=_(u'Display')) | |
| 176 | + display = models.BooleanField(_(u'display'), default=True, help_text=u'是否显示') | |
| 177 | 177 |  | 
| 178 | - is_important = models.BooleanField(_(u'is_important'), default=False, help_text=_(u'是否重要型号')) | |
| 178 | + is_important = models.BooleanField(_(u'is_important'), default=False, help_text=u'是否重要型号') | |
| 179 | 179 |  | 
| 180 | 180 | shot_type_id = models.CharField(_(u'shot_type_id'), max_length=32, blank=True, null=True, help_text=u'镜头类型唯一标识', db_index=True) | 
| 181 | 181 | shot_member_integral = models.IntegerField(_(u'shot_member_integral'), default=0, help_text=u'【消费者】镜头会员积分') | 
| 182 | 182 | shot_member_image = models.ImageField(_(u'shot_member_image'), upload_to=upload_path, blank=True, null=True, help_text=u'镜头会员图片') | 
| 183 | 183 | shot_member_name = models.CharField(_(u'shot_member_name'), max_length=255, blank=True, null=True, help_text=u'型号全名称') | 
| 184 | - is_show_shot = models.BooleanField(_(u'is_show_shot'), default=False, help_text=_(u'是否在镜头类型里显示')) | |
| 184 | + is_show_shot = models.BooleanField(_(u'is_show_shot'), default=False, help_text=u'是否在镜头类型里显示') | |
| 185 | 185 |  | 
| 186 | 186 | class Meta: | 
| 187 | 187 | verbose_name = _(u'型号信息') | 
| @@ -340,13 +340,13 @@ class ModelCameraBodyInfo(BaseModelMixin): | ||
| 340 | 340 | model_name = models.CharField(_(u'model_name'), max_length=32, blank=True, null=True, help_text=u'型号名称') | 
| 341 | 341 | model_full_name = models.CharField(_(u'model_full_name'), max_length=255, blank=True, null=True, help_text=u'型号全名称') | 
| 342 | 342 | model_image = models.ImageField(_(u'model_image'), upload_to=upload_path, blank=True, null=True, help_text=u'镜头图片') | 
| 343 | - is_important = models.BooleanField(_(u'is_important'), default=False, help_text=_(u'是否重要型号')) | |
| 343 | + is_important = models.BooleanField(_(u'is_important'), default=False, help_text=u'是否重要型号') | |
| 344 | 344 |  | 
| 345 | 345 | camera_brand_name = models.CharField(_(u'camera_brand_name'), max_length=255, blank=True, null=True, help_text=u'机身品牌') | 
| 346 | 346 | camera_name = models.CharField(_(u'camera_name'), max_length=255, blank=True, null=True, help_text=u'机身名称') | 
| 347 | 347 | camera_image = models.ImageField(_(u'camera_image'), upload_to=upload_path, blank=True, null=True, help_text=u'机身图片') | 
| 348 | 348 | camera_market_time = models.DateField(_(u'camera_market_time'), blank=True, null=True, help_text=u'机身上市日期') | 
| 349 | - is_ILDC = models.BooleanField(_(u'is_ILDC'), default=False, help_text=_(u'是否需要原厂转接环')) | |
| 349 | + is_ILDC = models.BooleanField(_(u'is_ILDC'), default=False, help_text=u'是否需要原厂转接环') | |
| 350 | 350 | remark = models.CharField(_(u'remark'), max_length=255, blank=True, null=True, help_text=u'备注') | 
| 351 | 351 |  | 
| 352 | 352 | class Meta: | 
| @@ -492,11 +492,11 @@ class SaleclerkInfo(BaseModelMixin, SexModelMixin): | ||
| 492 | 492 | user_status = models.IntegerField(_(u'user_status'), choices=USER_STATUS, default=UNVERIFIED, help_text=u'用户状态', db_index=True) | 
| 493 | 493 | refused_reason = models.TextField(_(u'refused_reason'), blank=True, null=True, help_text=u'审核拒绝原因') | 
| 494 | 494 |  | 
| 495 | - is_auth = models.BooleanField(_(u'is_auth'), default=False, help_text=_(u'是否已授权')) | |
| 495 | + is_auth = models.BooleanField(_(u'is_auth'), default=False, help_text=u'是否已授权') | |
| 496 | 496 |  | 
| 497 | - test_user = models.BooleanField(_(u'test_user'), default=False, help_text=_(u'是否为测试用户')) | |
| 497 | + test_user = models.BooleanField(_(u'test_user'), default=False, help_text=u'是否为测试用户') | |
| 498 | 498 |  | 
| 499 | - is_online_sales = models.BooleanField(_(u'is_online_sales'), default=False, help_text=_(u'是否为网销')) | |
| 499 | + is_online_sales = models.BooleanField(_(u'is_online_sales'), default=False, help_text=u'是否为网销') | |
| 500 | 500 |  | 
| 501 | 501 | class Meta: | 
| 502 | 502 | verbose_name = _(u'经销商销售员信息') | 
| @@ -695,15 +695,15 @@ class ConsumeInfoSubmitLogInfo(BaseModelMixin): | ||
| 695 | 695 |  | 
| 696 | 696 | verifyResult = models.IntegerField(_(u'verifyResult'), default=0, help_text=u'验证结果', db_index=True) | 
| 697 | 697 |  | 
| 698 | - dupload = models.BooleanField(_(u'dupload'), default=False, help_text=_(u'是否为重复提交')) | |
| 698 | + dupload = models.BooleanField(_(u'dupload'), default=False, help_text=u'是否为重复提交') | |
| 699 | 699 |  | 
| 700 | - submit_during_activity = models.BooleanField(_(u'submit_during_activity'), default=False, help_text=_(u'是否为活动期间上传')) | |
| 701 | - activity_id = models.IntegerField(_(u'activity_id'), default=0, help_text=_(u'活动唯一标识')) | |
| 702 | - coupon_expire_at = models.DateTimeField(_(u'coupon_expire_at'), blank=True, null=True, help_text=_(u'维修券过期时间')) | |
| 703 | - coupon_value = models.IntegerField(_(u'coupon_value'), default=0, help_text=_(u'维修券金额(单位:分)')) | |
| 704 | - has_used = models.BooleanField(_(u'has_used'), default=False, help_text=_(u'是否已核销')) | |
| 700 | + submit_during_activity = models.BooleanField(_(u'submit_during_activity'), default=False, help_text=u'是否为活动期间上传') | |
| 701 | + activity_id = models.IntegerField(_(u'activity_id'), default=0, help_text=u'活动唯一标识') | |
| 702 | + coupon_expire_at = models.DateTimeField(_(u'coupon_expire_at'), blank=True, null=True, help_text=u'维修券过期时间') | |
| 703 | + coupon_value = models.IntegerField(_(u'coupon_value'), default=0, help_text=u'维修券金额(单位:分)') | |
| 704 | + has_used = models.BooleanField(_(u'has_used'), default=False, help_text=u'是否已核销') | |
| 705 | 705 | admin_id = models.CharField(_(u'admin_id'), max_length=32, blank=True, null=True, help_text=u'核销员唯一标识', db_index=True) | 
| 706 | - used_at = models.DateTimeField(_(u'used_at'), blank=True, null=True, help_text=_(u'维修券核销时间')) | |
| 706 | + used_at = models.DateTimeField(_(u'used_at'), blank=True, null=True, help_text=u'维修券核销时间') | |
| 707 | 707 |  | 
| 708 | 708 | code_version = models.IntegerField(_(u'code_version'), default=1, help_text=u'统览码版本', db_index=True) | 
| 709 | 709 |  | 
| @@ -714,7 +714,7 @@ class ConsumeInfoSubmitLogInfo(BaseModelMixin): | ||
| 714 | 714 |  | 
| 715 | 715 | province = models.CharField(_(u'province'), max_length=32, blank=True, null=True, help_text=u'省份', db_index=True) | 
| 716 | 716 |  | 
| 717 | - test_user = models.BooleanField(_(u'test_user'), default=False, help_text=_(u'是否为测试用户')) | |
| 717 | + test_user = models.BooleanField(_(u'test_user'), default=False, help_text=u'是否为测试用户') | |
| 718 | 718 |  | 
| 719 | 719 | class Meta: | 
| 720 | 720 | verbose_name = _(u'消费者信息提交记录') | 
| @@ -813,15 +813,15 @@ class ActivityInfo(BaseModelMixin): | ||
| 813 | 813 |  | 
| 814 | 814 | model_uni_names = JSONField(_(u'model_uni_names'), default=[], blank=True, null=True, help_text=u'型号统一名称列表') | 
| 815 | 815 |  | 
| 816 | - start_at = models.DateTimeField(_(u'start_at'), help_text=_(u'start_at')) | |
| 817 | - end_at = models.DateTimeField(_(u'end_at'), help_text=_(u'end_at')) | |
| 816 | + start_at = models.DateTimeField(_(u'start_at'), help_text=u'start_at') | |
| 817 | + end_at = models.DateTimeField(_(u'end_at'), help_text=u'end_at') | |
| 818 | 818 |  | 
| 819 | 819 | coupon_id = models.CharField(_(u'coupon_id'), max_length=32, blank=True, null=True, help_text=u'券唯一标识', db_index=True) | 
| 820 | 820 |  | 
| 821 | - coupon_expire_type = models.IntegerField(_(u'coupon_expire_type'), choices=COUPON_EXPIRED_TIME_TUPLE, default=FIXED_EXPIRED_TIME, help_text=_(u'维修券类型')) | |
| 822 | - coupon_valid_period = models.IntegerField(_(u'coupon_valid_period'), default=0, help_text=_(u'维修券有效时间(单位:天)')) | |
| 823 | - coupon_expire_at = models.DateTimeField(_(u'coupon_expire_at'), blank=True, null=True, help_text=_(u'维修券过期时间')) | |
| 824 | - coupon_value = models.IntegerField(_(u'coupon_value'), default=0, help_text=_(u'维修券金额(单位:分)')) | |
| 821 | + coupon_expire_type = models.IntegerField(_(u'coupon_expire_type'), choices=COUPON_EXPIRED_TIME_TUPLE, default=FIXED_EXPIRED_TIME, help_text=u'维修券类型') | |
| 822 | + coupon_valid_period = models.IntegerField(_(u'coupon_valid_period'), default=0, help_text=u'维修券有效时间(单位:天)') | |
| 823 | + coupon_expire_at = models.DateTimeField(_(u'coupon_expire_at'), blank=True, null=True, help_text=u'维修券过期时间') | |
| 824 | + coupon_value = models.IntegerField(_(u'coupon_value'), default=0, help_text=u'维修券金额(单位:分)') | |
| 825 | 825 |  | 
| 826 | 826 | class Meta: | 
| 827 | 827 | verbose_name = _(u'活动信息') | 
| @@ -50,7 +50,7 @@ class GoodsInfo(BaseModelMixin, BrandInfoMixin): | ||
| 50 | 50 |  | 
| 51 | 51 | position = models.IntegerField(_(u'position'), default=1, help_text=u'排序', db_index=True) | 
| 52 | 52 |  | 
| 53 | - is_upload_qiniu = models.BooleanField(_(u'is_upload_qiniu'), default=False, help_text=_(u'是否已上传七牛')) | |
| 53 | + is_upload_qiniu = models.BooleanField(_(u'is_upload_qiniu'), default=False, help_text=u'是否已上传七牛') | |
| 54 | 54 |  | 
| 55 | 55 | class Meta: | 
| 56 | 56 | verbose_name = _(u'会员商品信息') | 
| @@ -238,14 +238,14 @@ class RightInfo(BaseModelMixin, BrandInfoMixin): | ||
| 238 | 238 | position = models.IntegerField(_(u'position'), default=1, help_text=u'排序', db_index=True) | 
| 239 | 239 |  | 
| 240 | 240 | # 券相关 | 
| 241 | - is_send_coupon = models.BooleanField(_(u'is_send_coupon'), default=False, help_text=_(u'是否发券')) | |
| 242 | - is_continue_send_coupon = models.BooleanField(_(u'is_continue_send_coupon'), default=False, help_text=_(u'是否持续发券')) | |
| 243 | - coupon_num = models.IntegerField(_(u'coupon_num'), default=0, help_text=_(u'券每会员级别发放张数')) | |
| 244 | - coupon_level1_num = models.IntegerField(_(u'coupon_level1_num'), default=0, help_text=_(u'券每会员级别发放张数')) | |
| 245 | - coupon_level2_num = models.IntegerField(_(u'coupon_level2_num'), default=0, help_text=_(u'券每会员级别发放张数')) | |
| 246 | - coupon_level3_num = models.IntegerField(_(u'coupon_level3_num'), default=0, help_text=_(u'券每会员级别发放张数')) | |
| 247 | - coupon_level4_num = models.IntegerField(_(u'coupon_level4_num'), default=0, help_text=_(u'券每会员级别发放张数')) | |
| 248 | - coupon_level5_num = models.IntegerField(_(u'coupon_level5_num'), default=0, help_text=_(u'券每会员级别发放张数')) | |
| 241 | + is_send_coupon = models.BooleanField(_(u'is_send_coupon'), default=False, help_text=u'是否发券') | |
| 242 | + is_continue_send_coupon = models.BooleanField(_(u'is_continue_send_coupon'), default=False, help_text=u'是否持续发券') | |
| 243 | + coupon_num = models.IntegerField(_(u'coupon_num'), default=0, help_text=u'券每会员级别发放张数') | |
| 244 | + coupon_level1_num = models.IntegerField(_(u'coupon_level1_num'), default=0, help_text=u'券每会员级别发放张数') | |
| 245 | + coupon_level2_num = models.IntegerField(_(u'coupon_level2_num'), default=0, help_text=u'券每会员级别发放张数') | |
| 246 | + coupon_level3_num = models.IntegerField(_(u'coupon_level3_num'), default=0, help_text=u'券每会员级别发放张数') | |
| 247 | + coupon_level4_num = models.IntegerField(_(u'coupon_level4_num'), default=0, help_text=u'券每会员级别发放张数') | |
| 248 | + coupon_level5_num = models.IntegerField(_(u'coupon_level5_num'), default=0, help_text=u'券每会员级别发放张数') | |
| 249 | 249 | coupon_level1_id = models.CharField(_(u'coupon_level1_id'), max_length=32, blank=True, null=True, help_text=u'券唯一标识', db_index=True) | 
| 250 | 250 | coupon_level2_id = models.CharField(_(u'coupon_level2_id'), max_length=32, blank=True, null=True, help_text=u'券唯一标识', db_index=True) | 
| 251 | 251 | coupon_level3_id = models.CharField(_(u'coupon_level3_id'), max_length=32, blank=True, null=True, help_text=u'券唯一标识', db_index=True) | 
| @@ -387,7 +387,7 @@ class MemberActivityInfo(BaseModelMixin, BrandInfoMixin): | ||
| 387 | 387 |  | 
| 388 | 388 | position = models.IntegerField(_(u'position'), default=1, help_text=u'排序', db_index=True) | 
| 389 | 389 |  | 
| 390 | - is_upload_qiniu = models.BooleanField(_(u'is_upload_qiniu'), default=False, help_text=_(u'是否已上传七牛')) | |
| 390 | + is_upload_qiniu = models.BooleanField(_(u'is_upload_qiniu'), default=False, help_text=u'是否已上传七牛') | |
| 391 | 391 |  | 
| 392 | 392 | class Meta: | 
| 393 | 393 | verbose_name = _(u'会员活动信息') | 
| @@ -788,10 +788,10 @@ class MemberActivityContributionWelfareInfo(BaseModelMixin, BrandInfoMixin): | ||
| 788 | 788 | welfare_type = models.IntegerField(_(u'welfare_type'), choices=WELFARE_TYPE, default=0, help_text=u'福利类型', db_index=True) | 
| 789 | 789 | welfare_title = models.CharField(_(u'welfare_title'), max_length=255, blank=True, null=True, help_text=u'福利标题') | 
| 790 | 790 | welfare_detail = RichTextField(_(u'welfare_detail'), blank=True, null=True, help_text=u'福利详情') | 
| 791 | - welfare_value = models.IntegerField(_(u'welfare_value'), default=0, help_text=_(u'福利数量')) | |
| 791 | + welfare_value = models.IntegerField(_(u'welfare_value'), default=0, help_text=u'福利数量') | |
| 792 | 792 | welfare_image = models.ImageField(_(u'welfare_image'), upload_to=upload_path, blank=True, null=True, help_text=u'福利图片') | 
| 793 | 793 |  | 
| 794 | - is_upload_qiniu = models.BooleanField(_(u'is_upload_qiniu'), default=False, help_text=_(u'是否已上传七牛')) | |
| 794 | + is_upload_qiniu = models.BooleanField(_(u'is_upload_qiniu'), default=False, help_text=u'是否已上传七牛') | |
| 795 | 795 |  | 
| 796 | 796 | class Meta: | 
| 797 | 797 | verbose_name = _(u'会员活动投稿福利信息') | 
| @@ -844,7 +844,7 @@ class MemberActivityContributionWelfareUnlockingInfo(BaseModelMixin, BrandInfoMi | ||
| 844 | 844 |  | 
| 845 | 845 | welfare_id = models.CharField(_(u'welfare_id'), max_length=32, blank=True, null=True, help_text=u'福利唯一标识', db_index=True) | 
| 846 | 846 | welfare_type = models.IntegerField(_(u'welfare_type'), choices=WELFARE_TYPE, default=0, help_text=u'福利类型', db_index=True) | 
| 847 | - welfare_value = models.IntegerField(_(u'welfare_value'), default=0, help_text=_(u'福利数量')) | |
| 847 | + welfare_value = models.IntegerField(_(u'welfare_value'), default=0, help_text=u'福利数量') | |
| 848 | 848 |  | 
| 849 | 849 | name = models.CharField(_(u'name'), max_length=255, blank=True, null=True, help_text=u'姓名') | 
| 850 | 850 | phone = models.CharField(_(u'phone'), max_length=255, blank=True, null=True, help_text=u'电话') | 
| @@ -852,7 +852,7 @@ class MemberActivityContributionWelfareUnlockingInfo(BaseModelMixin, BrandInfoMi | ||
| 852 | 852 |  | 
| 853 | 853 | tracking_number = models.CharField(_(u'tracking_number'), max_length=255, blank=True, null=True, help_text=u'快递单号') | 
| 854 | 854 |  | 
| 855 | - is_handled = models.BooleanField(_(u'is_handled'), default=False, help_text=_(u'是否已处理')) | |
| 855 | + is_handled = models.BooleanField(_(u'is_handled'), default=False, help_text=u'是否已处理') | |
| 856 | 856 |  | 
| 857 | 857 | class Meta: | 
| 858 | 858 | verbose_name = _(u'会员活动投稿福利解锁信息') | 
| @@ -39,9 +39,9 @@ class SalesResponsibilityInfo(BaseModelMixin): | ||
| 39 | 39 | user_status = models.IntegerField(_(u'user_status'), choices=USER_STATUS_TUPLE, default=UNVERIFIED, help_text=u'用户状态', db_index=True) | 
| 40 | 40 | refused_reason = models.TextField(_(u'refused_reason'), blank=True, null=True, help_text=u'审核拒绝原因') | 
| 41 | 41 |  | 
| 42 | - is_auth = models.BooleanField(_(u'is_auth'), default=False, help_text=_(u'是否已授权')) | |
| 42 | + is_auth = models.BooleanField(_(u'is_auth'), default=False, help_text=u'是否已授权') | |
| 43 | 43 |  | 
| 44 | - is_super = models.BooleanField(_(u'is_super'), default=False, help_text=_(u'是否超级销售担当')) | |
| 44 | + is_super = models.BooleanField(_(u'is_super'), default=False, help_text=u'是否超级销售担当') | |
| 45 | 45 |  | 
| 46 | 46 | class Meta: | 
| 47 | 47 | verbose_name = _(u'销售担当信息') | 
| @@ -91,7 +91,7 @@ class SalesResponsibilityInfoModelsSaleStatisticInfo(BaseModelMixin): | ||
| 91 | 91 | # 型号 | 
| 92 | 92 | model_id = models.CharField(_(u'model_id'), max_length=32, help_text=u'型号唯一标识', db_index=True) | 
| 93 | 93 | model_name = models.CharField(_(u'model_name'), max_length=255, blank=True, null=True, help_text=u'型号名称', db_index=True) | 
| 94 | - is_important = models.BooleanField(_(u'is_important'), default=True, help_text=_(u'是否重要型号')) | |
| 94 | + is_important = models.BooleanField(_(u'is_important'), default=True, help_text=u'是否重要型号') | |
| 95 | 95 |  | 
| 96 | 96 | ymd = models.IntegerField(_(u'ymd'), default=0, help_text=u'年月日', db_index=True) # 例:20171208, tc.local_string(format='%Y%m%d'), 0 为全部 | 
| 97 | 97 |  | 
| @@ -0,0 +1,18 @@ | ||
| 1 | +# -*- coding: utf-8 -*- | |
| 2 | + | |
| 3 | +from django.contrib import admin | |
| 4 | + | |
| 5 | +from tenancy.models import TenancyShotInfo, TenancyShotRequestInfo | |
| 6 | + | |
| 7 | + | |
| 8 | +class TenancyShotInfoAdmin(admin.ModelAdmin): | |
| 9 | +    list_display = ('shot_id', 'model_name', 'sn', 'fittings_type', 'tenancy_status', 'status', 'created_at', 'updated_at') | |
| 10 | +    list_filter = ('fittings_type', 'tenancy_status', 'status') | |
| 11 | + | |
| 12 | + | |
| 13 | +class TenancyShotRequestInfoAdmin(admin.ModelAdmin): | |
| 14 | +    list_display = ('request_id', 'shot_id', 'user_id', 'identity_card_number', 'identity_card_name', 'name', 'phone', 'location', 'postcode', 'purpose', 'return_date', 'express_name', 'express_com', 'tracking_number', 'tracking_signed', 'back_express_name', 'back_express_com', 'back_tracking_number', 'back_tracking_signed', 'audit_status', 'request_status', 'status', 'created_at', 'updated_at') | |
| 15 | + | |
| 16 | + | |
| 17 | +admin.site.register(TenancyShotInfo, TenancyShotInfoAdmin) | |
| 18 | +admin.site.register(TenancyShotRequestInfo, TenancyShotRequestInfoAdmin) | 
| @@ -0,0 +1,8 @@ | ||
| 1 | +# -*- coding: utf-8 -*- | |
| 2 | +from __future__ import unicode_literals | |
| 3 | + | |
| 4 | +from django.apps import AppConfig | |
| 5 | + | |
| 6 | + | |
| 7 | +class TenancyConfig(AppConfig): | |
| 8 | + name = 'tenancy' | 
| @@ -0,0 +1,71 @@ | ||
| 1 | +# -*- coding: utf-8 -*- | |
| 2 | +# Generated by Django 3.2.16 on 2022-11-05 14:52 | |
| 3 | + | |
| 4 | +from django.db import migrations, models | |
| 5 | +import jsonfield.fields | |
| 6 | +import shortuuidfield.fields | |
| 7 | + | |
| 8 | + | |
| 9 | +class Migration(migrations.Migration): | |
| 10 | + | |
| 11 | + initial = True | |
| 12 | + | |
| 13 | + dependencies = [ | |
| 14 | + ] | |
| 15 | + | |
| 16 | + operations = [ | |
| 17 | + migrations.CreateModel( | |
| 18 | + name='TenancyShotInfo', | |
| 19 | + fields=[ | |
| 20 | +                ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), | |
| 21 | +                ('status', models.BooleanField(default=True, help_text='Status', verbose_name='status')), | |
| 22 | +                ('created_at', models.DateTimeField(auto_now_add=True, help_text='Create Time', verbose_name='created_at')), | |
| 23 | +                ('updated_at', models.DateTimeField(auto_now=True, help_text='Update Time', verbose_name='updated_at')), | |
| 24 | +                ('shot_id', shortuuidfield.fields.ShortUUIDField(blank=True, db_index=True, editable=False, help_text='镜头唯一标识', max_length=22, null=True, unique=True)), | |
| 25 | +                ('model_name', models.CharField(blank=True, help_text='型号名称', max_length=255, null=True, verbose_name='model_name')), | |
| 26 | +                ('sn', models.CharField(blank=True, db_index=True, help_text='序列号', max_length=32, null=True, verbose_name='sn')), | |
| 27 | +                ('fittings_type', models.IntegerField(choices=[(0, '前盖'), (1, '后盖'), (2, '遮光罩'), (3, '脚架环'), (4, '外观性能')], default=0, help_text='配件类型', verbose_name='fittings_type')), | |
| 28 | +                ('tenancy_status', models.IntegerField(choices=[(0, '未租'), (1, '已租')], default=0, help_text='租借状态', verbose_name='tenancy_status')), | |
| 29 | + ], | |
| 30 | +            options={ | |
| 31 | + 'verbose_name': '租赁镜头信息', | |
| 32 | + 'verbose_name_plural': '租赁镜头信息', | |
| 33 | + }, | |
| 34 | + ), | |
| 35 | + migrations.CreateModel( | |
| 36 | + name='TenancyShotRequestInfo', | |
| 37 | + fields=[ | |
| 38 | +                ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), | |
| 39 | +                ('status', models.BooleanField(default=True, help_text='Status', verbose_name='status')), | |
| 40 | +                ('created_at', models.DateTimeField(auto_now_add=True, help_text='Create Time', verbose_name='created_at')), | |
| 41 | +                ('updated_at', models.DateTimeField(auto_now=True, help_text='Update Time', verbose_name='updated_at')), | |
| 42 | +                ('request_id', shortuuidfield.fields.ShortUUIDField(blank=True, db_index=True, editable=False, help_text='申请唯一标识', max_length=22, null=True, unique=True)), | |
| 43 | +                ('shot_id', models.CharField(blank=True, db_index=True, help_text='镜头唯一标识', max_length=32, null=True, verbose_name='shot_id')), | |
| 44 | +                ('user_id', models.CharField(blank=True, db_index=True, help_text='用户唯一标识', max_length=32, null=True, verbose_name='user_id')), | |
| 45 | +                ('name', models.CharField(blank=True, help_text='姓名', max_length=255, null=True, verbose_name='name')), | |
| 46 | +                ('phone', models.CharField(blank=True, help_text='电话', max_length=11, null=True, verbose_name='phone')), | |
| 47 | +                ('location', models.CharField(blank=True, help_text='用户地址', max_length=255, null=True, verbose_name='location')), | |
| 48 | +                ('postcode', models.CharField(blank=True, help_text='用户邮政编码', max_length=255, null=True, verbose_name='postcode')), | |
| 49 | +                ('purpose', models.CharField(blank=True, help_text='用途', max_length=255, null=True, verbose_name='purpose')), | |
| 50 | +                ('return_date', models.DateField(blank=True, help_text='预定归还日期', null=True, verbose_name='return_date')), | |
| 51 | +                ('express_name', models.CharField(blank=True, help_text='快递公司', max_length=255, null=True, verbose_name='express_name')), | |
| 52 | +                ('express_com', models.CharField(blank=True, help_text='快递编码', max_length=255, null=True, verbose_name='express_com')), | |
| 53 | +                ('tracking_number', models.CharField(blank=True, help_text='快递单号', max_length=255, null=True, verbose_name='tracking_number')), | |
| 54 | +                ('tracking_info', jsonfield.fields.JSONField(blank=True, default={}, help_text='快递信息', null=True, verbose_name='tracking_info')), | |
| 55 | +                ('tracking_signed', models.BooleanField(default=False, help_text='快递是否已签收', verbose_name='tracking_signed')), | |
| 56 | +                ('tracking_signed_images', jsonfield.fields.JSONField(blank=True, default=[], help_text='快递签收图片列表', null=True, verbose_name='tracking_signed_images')), | |
| 57 | +                ('back_express_name', models.CharField(blank=True, help_text='寄回快递公司', max_length=255, null=True, verbose_name='back_express_name')), | |
| 58 | +                ('back_express_com', models.CharField(blank=True, help_text='寄回快递编码', max_length=255, null=True, verbose_name='back_express_com')), | |
| 59 | +                ('back_tracking_number', models.CharField(blank=True, help_text='寄回快递单号', max_length=255, null=True, verbose_name='back_tracking_number')), | |
| 60 | +                ('back_tracking_info', jsonfield.fields.JSONField(blank=True, default={}, help_text='寄回快递信息', null=True, verbose_name='back_tracking_info')), | |
| 61 | +                ('back_tracking_signed', models.BooleanField(default=False, help_text='寄回快递是否已签收', verbose_name='back_tracking_signed')), | |
| 62 | +                ('audit_status', models.IntegerField(choices=[(0, '未审批'), (1, '已通过'), (2, '未通过')], db_index=True, default=0, help_text='审批状态', verbose_name='audit_status')), | |
| 63 | +                ('request_status', models.CharField(default='', help_text='租借申请状态', max_length=16, verbose_name='request_status')), | |
| 64 | +                ('request_status_at', jsonfield.fields.JSONField(blank=True, default={}, help_text='租借申请状态变更时间', null=True, verbose_name='request_status_at')), | |
| 65 | + ], | |
| 66 | +            options={ | |
| 67 | + 'verbose_name': '租赁镜头申请信息', | |
| 68 | + 'verbose_name_plural': '租赁镜头申请信息', | |
| 69 | + }, | |
| 70 | + ), | |
| 71 | + ] | 
| @@ -0,0 +1,34 @@ | ||
| 1 | +# -*- coding: utf-8 -*- | |
| 2 | +# Generated by Django 3.2.16 on 2022-11-05 15:23 | |
| 3 | + | |
| 4 | +from django.db import migrations, models | |
| 5 | + | |
| 6 | + | |
| 7 | +class Migration(migrations.Migration): | |
| 8 | + | |
| 9 | + dependencies = [ | |
| 10 | +        ('tenancy', '0001_initial'), | |
| 11 | + ] | |
| 12 | + | |
| 13 | + operations = [ | |
| 14 | + migrations.AddField( | |
| 15 | + model_name='tenancyshotrequestinfo', | |
| 16 | + name='identity_card_name', | |
| 17 | + field=models.CharField(blank=True, help_text='身份证姓名', max_length=32, null=True, verbose_name='identity_card_name'), | |
| 18 | + ), | |
| 19 | + migrations.AddField( | |
| 20 | + model_name='tenancyshotrequestinfo', | |
| 21 | + name='identity_card_number', | |
| 22 | + field=models.CharField(blank=True, help_text='身份证号', max_length=32, null=True, verbose_name='identity_card_number'), | |
| 23 | + ), | |
| 24 | + migrations.AlterField( | |
| 25 | + model_name='tenancyshotrequestinfo', | |
| 26 | + name='name', | |
| 27 | + field=models.CharField(blank=True, help_text='用户姓名', max_length=255, null=True, verbose_name='name'), | |
| 28 | + ), | |
| 29 | + migrations.AlterField( | |
| 30 | + model_name='tenancyshotrequestinfo', | |
| 31 | + name='phone', | |
| 32 | + field=models.CharField(blank=True, help_text='用户电话', max_length=11, null=True, verbose_name='phone'), | |
| 33 | + ), | |
| 34 | + ] | 
| @@ -0,0 +1,142 @@ | ||
| 1 | +# -*- coding: utf-8 -*- | |
| 2 | + | |
| 3 | +from django.db import models | |
| 4 | +from django.utils.translation import ugettext_lazy as _ | |
| 5 | +from django_models_ext import BaseModelMixin | |
| 6 | +from jsonfield import JSONField | |
| 7 | +from shortuuidfield import ShortUUIDField | |
| 8 | +from TimeConvert import TimeConvert as tc | |
| 9 | + | |
| 10 | +from mch.models import ModelInfo | |
| 11 | + | |
| 12 | + | |
| 13 | +class TenancyShotInfo(BaseModelMixin): | |
| 14 | + FITTINGS_TYPE = ( | |
| 15 | + (0, u'前盖'), | |
| 16 | + (1, u'后盖'), | |
| 17 | + (2, u'遮光罩'), | |
| 18 | + (3, u'脚架环'), | |
| 19 | + (4, u'外观性能'), | |
| 20 | + ) | |
| 21 | + | |
| 22 | + TENANCY_STATUS = ( | |
| 23 | + (0, u'未租'), | |
| 24 | + (1, u'已租'), | |
| 25 | + ) | |
| 26 | + | |
| 27 | + shot_id = ShortUUIDField(_(u'shot_id'), max_length=32, blank=True, null=True, help_text=u'镜头唯一标识', db_index=True, unique=True) | |
| 28 | + model_name = models.CharField(_(u'model_name'), max_length=255, blank=True, null=True, help_text=u'型号名称') | |
| 29 | + sn = models.CharField(_(u'sn'), max_length=32, blank=True, null=True, help_text=u'序列号', db_index=True) | |
| 30 | + fittings_type = models.IntegerField(_(u'fittings_type'), choices=FITTINGS_TYPE, default=0, help_text=u'配件类型') | |
| 31 | + tenancy_status = models.IntegerField(_(u'tenancy_status'), choices=TENANCY_STATUS, default=0, help_text=u'租借状态') | |
| 32 | + | |
| 33 | + class Meta: | |
| 34 | + verbose_name = _(u'租赁镜头信息') | |
| 35 | + verbose_name_plural = _(u'租赁镜头信息') | |
| 36 | + | |
| 37 | + def __unicode__(self): | |
| 38 | + return '%d' % self.pk | |
| 39 | + | |
| 40 | + @property | |
| 41 | + def data(self): | |
| 42 | +        return { | |
| 43 | + 'shot_id': self.shot_id, | |
| 44 | + 'model_name': self.model_name, | |
| 45 | + 'sn': self.sn, | |
| 46 | + 'fittings_type': self.fittings_type, | |
| 47 | + 'fittings_type_str': dict(TenancyShotInfo.FITTINGS_TYPE).get(self.fittings_type), | |
| 48 | + 'tenancy_status': self.tenancy_status, | |
| 49 | + 'tenancy_status_str': dict(TenancyShotInfo.TENANCY_STATUS).get(self.tenancy_status), | |
| 50 | + 'created_at': tc.local_string(utc_dt=self.created_at), | |
| 51 | + } | |
| 52 | + | |
| 53 | + | |
| 54 | +class TenancyShotRequestInfo(BaseModelMixin): | |
| 55 | + AUDIT_PASS = 1 | |
| 56 | + AUDIT_STATUS = ( | |
| 57 | + (0, u'未审批'), | |
| 58 | + (1, u'已通过'), | |
| 59 | + (2, u'未通过'), | |
| 60 | + ) | |
| 61 | + | |
| 62 | + request_id = ShortUUIDField(_(u'request_id'), max_length=32, blank=True, null=True, help_text=u'申请唯一标识', db_index=True, unique=True) | |
| 63 | + shot_id = models.CharField(_(u'shot_id'), max_length=32, blank=True, null=True, help_text=u'镜头唯一标识', db_index=True) | |
| 64 | + | |
| 65 | + user_id = models.CharField(_(u'user_id'), max_length=32, blank=True, null=True, help_text=u'用户唯一标识', db_index=True) | |
| 66 | + | |
| 67 | + # 身份证信息 | |
| 68 | + identity_card_number = models.CharField(_(u'identity_card_number'), max_length=32, blank=True, null=True, help_text=u'身份证号') | |
| 69 | + identity_card_name = models.CharField(_(u'identity_card_name'), max_length=32, blank=True, null=True, help_text=u'身份证姓名') | |
| 70 | + | |
| 71 | + # 邮寄信息 | |
| 72 | + name = models.CharField(_(u'name'), max_length=255, blank=True, null=True, help_text=u'用户姓名') | |
| 73 | + phone = models.CharField(_(u'phone'), max_length=11, blank=True, null=True, help_text=u'用户电话') | |
| 74 | + location = models.CharField(_(u'location'), max_length=255, blank=True, null=True, help_text=u'用户地址') | |
| 75 | + postcode = models.CharField(_(u'postcode'), max_length=255, blank=True, null=True, help_text=u'用户邮政编码') | |
| 76 | + | |
| 77 | + # 租赁信息 | |
| 78 | + purpose = models.CharField(_(u'purpose'), max_length=255, blank=True, null=True, help_text=u'用途') | |
| 79 | + return_date = models.DateField(_(u'return_date'), blank=True, null=True, help_text=u'预定归还日期') | |
| 80 | + | |
| 81 | + # 公司 =》 用户 | |
| 82 | + express_name = models.CharField(_(u'express_name'), max_length=255, blank=True, null=True, help_text=u'快递公司') | |
| 83 | + express_com = models.CharField(_(u'express_com'), max_length=255, blank=True, null=True, help_text=u'快递编码') | |
| 84 | + tracking_number = models.CharField(_(u'tracking_number'), max_length=255, blank=True, null=True, help_text=u'快递单号') | |
| 85 | +    tracking_info = JSONField(_(u'tracking_info'), blank=True, null=True, default={}, help_text=u'快递信息') | |
| 86 | + tracking_signed = models.BooleanField(_(u'tracking_signed'), default=False, help_text=u'快递是否已签收') | |
| 87 | + tracking_signed_images = JSONField(_(u'tracking_signed_images'), blank=True, null=True, default=[], help_text=u'快递签收图片列表') | |
| 88 | + | |
| 89 | + # 用户 =》 公司 | |
| 90 | + back_express_name = models.CharField(_(u'back_express_name'), max_length=255, blank=True, null=True, help_text=u'寄回快递公司') | |
| 91 | + back_express_com = models.CharField(_(u'back_express_com'), max_length=255, blank=True, null=True, help_text=u'寄回快递编码') | |
| 92 | + back_tracking_number = models.CharField(_(u'back_tracking_number'), max_length=255, blank=True, null=True, help_text=u'寄回快递单号') | |
| 93 | +    back_tracking_info = JSONField(_(u'back_tracking_info'), blank=True, null=True, default={}, help_text=u'寄回快递信息') | |
| 94 | + back_tracking_signed = models.BooleanField(_(u'back_tracking_signed'), default=False, help_text=u'寄回快递是否已签收') | |
| 95 | + | |
| 96 | + audit_status = models.IntegerField(_(u'audit_status'), choices=AUDIT_STATUS, default=0, help_text=u'审批状态', db_index=True) | |
| 97 | + # REQUEST_STATUS = ( | |
| 98 | + # (0, u'寄出'), | |
| 99 | + # (1, u'寄出已签收'), | |
| 100 | + # (2, u'寄回'), | |
| 101 | + # (3, u'寄回已签收并检查无损坏'), | |
| 102 | + # ) | |
| 103 | + # request_status = models.IntegerField(_(u'request_status'), choices=REQUEST_STATUS, default=0, help_text=u'租借申请状态') | |
| 104 | + request_status = models.CharField(_(u'request_status'), max_length=16, default='', help_text=u'租借申请状态') | |
| 105 | +    request_status_at = JSONField(_(u'request_status_at'), blank=True, null=True, default={}, help_text=u'租借申请状态变更时间') | |
| 106 | + | |
| 107 | + class Meta: | |
| 108 | + verbose_name = _(u'租赁镜头申请信息') | |
| 109 | + verbose_name_plural = _(u'租赁镜头申请信息') | |
| 110 | + | |
| 111 | + def __unicode__(self): | |
| 112 | + return '%d' % self.pk | |
| 113 | + | |
| 114 | + @property | |
| 115 | + def data(self): | |
| 116 | +        return { | |
| 117 | + 'request_id': self.request_id, | |
| 118 | + 'shot_id': self.shot_id, | |
| 119 | + 'user_id': self.user_id, | |
| 120 | + 'name': self.name, | |
| 121 | + 'phone': self.phone, | |
| 122 | + 'location': self.location, | |
| 123 | + 'postcode': self.postcode, | |
| 124 | + 'purpose': self.purpose, | |
| 125 | + 'return_date': tc.local_date_string(self.return_date), | |
| 126 | + 'express_name': self.express_name, | |
| 127 | + 'express_com': self.express_com, | |
| 128 | + 'tracking_number': self.tracking_number, | |
| 129 | + 'tracking_info': self.tracking_info, | |
| 130 | + 'tracking_signed': self.tracking_signed, | |
| 131 | + 'tracking_signed_images': self.tracking_signed_images, | |
| 132 | + 'back_express_name': self.back_express_name, | |
| 133 | + 'back_express_com': self.back_express_com, | |
| 134 | + 'back_tracking_number': self.back_tracking_number, | |
| 135 | + 'back_tracking_info': self.back_tracking_info, | |
| 136 | + 'back_tracking_signed': self.back_tracking_signed, | |
| 137 | + 'audit_status': self.audit_status, | |
| 138 | + 'request_status': self.request_status, | |
| 139 | +            'request_status_at': {k: tc.local_string(utc_dt=tc.string_to_utc_datetime(v, format='%Y-%m-%dT%H:%M:%S.%fZ')) for k, v in self.request_status_at.items()}, | |
| 140 | + 'created_at': tc.local_string(utc_dt=self.created_at), | |
| 141 | + 'updated_at': tc.local_string(utc_dt=self.updated_at), | |
| 142 | + } | 
| @@ -0,0 +1,7 @@ | ||
| 1 | +# -*- coding: utf-8 -*- | |
| 2 | +from __future__ import unicode_literals | |
| 3 | + | |
| 4 | +from django.test import TestCase | |
| 5 | + | |
| 6 | + | |
| 7 | +# Create your tests here. | 
| @@ -0,0 +1,7 @@ | ||
| 1 | +# -*- coding: utf-8 -*- | |
| 2 | +from __future__ import unicode_literals | |
| 3 | + | |
| 4 | +from django.shortcuts import render | |
| 5 | + | |
| 6 | + | |
| 7 | +# Create your views here. |