# -*- coding: utf-8 -*- from django.db import models from django.utils.translation import ugettext_lazy as _ from django_models_ext import BaseModelMixin from jsonfield import JSONField from shortuuidfield import ShortUUIDField from TimeConvert import TimeConvert as tc from mch.models import AdministratorInfo, ModelInfo class TenancyShotInfo(BaseModelMixin): TENANCY_STATUS = ( (0, u'未租'), (1, u'已租'), ) admin_id = models.CharField(_(u'admin_id'), max_length=32, blank=True, null=True, help_text=u'经手人唯一标识', db_index=True) shot_id = ShortUUIDField(_(u'shot_id'), max_length=32, blank=True, null=True, help_text=u'镜头唯一标识', db_index=True, unique=True) 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'型号名称') sn = models.CharField(_(u'sn'), max_length=32, blank=True, null=True, help_text=u'序列号', db_index=True) front_cap_status = models.BooleanField(_(u'front_cap_status'), default=False, help_text=u'前盖状态') rear_cap_status = models.BooleanField(_(u'rear_cap_status'), default=False, help_text=u'后盖状态') lens_hood_status = models.BooleanField(_(u'lens_hood_status'), default=False, help_text=u'遮光罩状态') tripod_ring_status = models.BooleanField(_(u'tripod_ring_status'), default=False, help_text=u'脚架环状态') appearance_performance_status = models.BooleanField(_(u'appearance_performance_status'), default=False, help_text=u'外观性能状态') tenancy_status = models.IntegerField(_(u'tenancy_status'), choices=TENANCY_STATUS, default=0, help_text=u'租借状态') class Meta: verbose_name = _(u'租赁镜头信息') verbose_name_plural = _(u'租赁镜头信息') def __unicode__(self): return '%d' % self.pk @property def data(self): try: model = ModelInfo.objects.get(model_id=self.model_id, status=True) except ModelInfo.DoesNotExist: model = None return { 'shot_id': self.shot_id, 'model_id': self.model_id, 'model_info': model.admindata if model else {}, 'sn': self.sn, 'front_cap_status': self.front_cap_status, 'rear_cap_status': self.rear_cap_status, 'lens_hood_status': self.lens_hood_status, 'tripod_ring_status': self.tripod_ring_status, 'appearance_performance_status': self.appearance_performance_status, 'tenancy_status': self.tenancy_status, 'tenancy_status_str': dict(TenancyShotInfo.TENANCY_STATUS).get(self.tenancy_status), 'created_at': tc.local_string(utc_dt=self.created_at), } class TenancyShotRequestInfo(BaseModelMixin): TENANCY_TRACKING_SEND = u'寄出运送中' TENANCY_TRACKING_SEND_SIGNED = u'寄出签收' TENANCY_TRACKING_BACK = u'寄回运送中' TENANCY_TRACKING_BACK_SIGNED = u'寄回签收' AUDIT_PASS = 1 AUDIT_STATUS = ( (0, u'未审批'), (1, u'已通过'), (2, u'未通过'), ) request_id = ShortUUIDField(_(u'request_id'), max_length=32, blank=True, null=True, help_text=u'申请唯一标识', db_index=True, unique=True) admin_id = models.CharField(_(u'admin_id'), max_length=32, blank=True, null=True, help_text=u'经手人唯一标识', db_index=True) shot_id = models.CharField(_(u'shot_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) user_id = models.CharField(_(u'user_id'), max_length=32, blank=True, null=True, help_text=u'用户唯一标识', db_index=True) # 镜头配件信息 front_cap_status = models.BooleanField(_(u'front_cap_status'), default=False, help_text=u'前盖状态') rear_cap_status = models.BooleanField(_(u'rear_cap_status'), default=False, help_text=u'后盖状态') lens_hood_status = models.BooleanField(_(u'lens_hood_status'), default=False, help_text=u'遮光罩状态') tripod_ring_status = models.BooleanField(_(u'tripod_ring_status'), default=False, help_text=u'脚架环状态') appearance_performance_status = models.BooleanField(_(u'appearance_performance_status'), default=False, help_text=u'外观性能状态') # 身份证信息 identity_card_number = models.CharField(_(u'identity_card_number'), max_length=32, blank=True, null=True, help_text=u'身份证号') identity_card_name = models.CharField(_(u'identity_card_name'), max_length=32, 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=11, blank=True, null=True, help_text=u'用户电话') location = models.CharField(_(u'location'), max_length=255, blank=True, null=True, help_text=u'用户地址') postcode = models.CharField(_(u'postcode'), 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'用途') return_date = models.DateField(_(u'return_date'), blank=True, null=True, help_text=u'预定归还日期') # 公司 =》 用户 express_name = models.CharField(_(u'express_name'), max_length=255, blank=True, null=True, help_text=u'快递公司') express_com = models.CharField(_(u'express_com'), 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'快递单号') tracking_info = JSONField(_(u'tracking_info'), blank=True, null=True, default={}, help_text=u'快递信息') tracking_signed = models.BooleanField(_(u'tracking_signed'), default=False, help_text=u'快递是否已签收') tracking_signed_images = JSONField(_(u'tracking_signed_images'), blank=True, null=True, default=[], help_text=u'快递签收图片列表') # 用户 =》 公司 back_express_name = models.CharField(_(u'back_express_name'), max_length=255, blank=True, null=True, help_text=u'寄回快递公司') back_express_com = models.CharField(_(u'back_express_com'), max_length=255, blank=True, null=True, help_text=u'寄回快递编码') back_tracking_number = models.CharField(_(u'back_tracking_number'), max_length=255, blank=True, null=True, help_text=u'寄回快递单号') back_tracking_info = JSONField(_(u'back_tracking_info'), blank=True, null=True, default={}, help_text=u'寄回快递信息') back_tracking_signed = models.BooleanField(_(u'back_tracking_signed'), default=False, help_text=u'寄回快递是否已签收') audit_status = models.IntegerField(_(u'audit_status'), choices=AUDIT_STATUS, default=0, help_text=u'审批状态', db_index=True) # REQUEST_STATUS = ( # (0, u'寄出'), # (1, u'寄出已签收'), # (2, u'寄回'), # (3, u'寄回已签收并检查无损坏'), # ) # request_status = models.IntegerField(_(u'request_status'), choices=REQUEST_STATUS, default=0, help_text=u'租借申请状态') request_status = models.CharField(_(u'request_status'), max_length=16, default='', help_text=u'租借申请状态') request_status_at = JSONField(_(u'request_status_at'), blank=True, null=True, default={}, help_text=u'租借申请状态变更时间') remark = models.CharField(_(u'remark'), max_length=256, default='', help_text=u'备注') class Meta: verbose_name = _(u'租赁镜头申请信息') verbose_name_plural = _(u'租赁镜头申请信息') def __unicode__(self): return '%d' % self.pk @property def data(self): try: shot = TenancyShotInfo.objects.get(shot_id=self.shot_id) except TenancyShotInfo.DoesNotExist: shot = None try: model = ModelInfo.objects.get(model_id=self.model_id, status=True) except ModelInfo.DoesNotExist: model = None return { 'req_id': self.request_id, 'request_id': self.request_id, 'shot_id': self.shot_id, 'model_info': model.admindata, 'shot_info': shot.data if shot else {}, 'front_cap_status': self.front_cap_status, 'rear_cap_status': self.rear_cap_status, 'lens_hood_status': self.lens_hood_status, 'tripod_ring_status': self.tripod_ring_status, 'appearance_performance_status': self.appearance_performance_status, 'front_cap_status': self.front_cap_status, 'rear_cap_status': self.rear_cap_status, 'lens_hood_status': self.lens_hood_status, 'tripod_ring_status': self.tripod_ring_status, 'appearance_performance_status': self.appearance_performance_status, 'user_id': self.user_id, 'name': self.name, 'phone': self.phone, 'location': self.location, 'postcode': self.postcode, 'purpose': self.purpose, 'return_date': tc.local_date_string(self.return_date), 'express_name': self.express_name, 'express_com': self.express_com, 'tracking_number': self.tracking_number, 'tracking_info': self.tracking_info, 'tracking_signed': self.tracking_signed, 'tracking_signed_images': self.tracking_signed_images, 'back_express_name': self.back_express_name, 'back_express_com': self.back_express_com, 'back_tracking_number': self.back_tracking_number, 'back_tracking_info': self.back_tracking_info, 'back_tracking_signed': self.back_tracking_signed, 'audit_status': self.audit_status, 'request_status': self.request_status, 'request_status_at': {k: tc.local_date_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()}, 'created_at': tc.local_date_string(utc_dt=self.created_at), 'remark': self.remark, } @property def admindata(self): try: admin = AdministratorInfo.objects.get(admin_id=self.admin_id) except AdministratorInfo.DoesNotExist: admin = None try: shot = TenancyShotInfo.objects.get(shot_id=self.shot_id, status=True) except TenancyShotInfo.DoesNotExist: shot = None try: model = ModelInfo.objects.get(model_id=self.model_id, status=True) except ModelInfo.DoesNotExist: model = None return { 'req_id': self.request_id, 'request_id': self.request_id, 'shot_id': self.shot_id, 'shot_info': shot.data if shot else {}, 'model_info': model.admindata, 'user_id': self.user_id, 'name': self.name, 'phone': self.phone, 'location': self.location, 'postcode': self.postcode, 'purpose': self.purpose, 'return_date': tc.local_date_string(self.return_date), 'express_name': self.express_name, 'express_com': self.express_com, 'tracking_number': self.tracking_number, 'tracking_info': self.tracking_info, 'tracking_signed': self.tracking_signed, 'tracking_signed_images': self.tracking_signed_images, 'back_express_name': self.back_express_name, 'back_express_com': self.back_express_com, 'back_tracking_number': self.back_tracking_number, 'back_tracking_info': self.back_tracking_info, 'back_tracking_signed': self.back_tracking_signed, 'audit_status': self.audit_status, 'request_status': self.request_status, '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()}, 'created_at': tc.local_string(utc_dt=self.created_at), 'admin_id': self.admin_id, 'admin_data': admin.admindata if admin else {}, 'front_cap_status': self.front_cap_status, 'rear_cap_status': self.rear_cap_status, 'lens_hood_status': self.lens_hood_status, 'tripod_ring_status': self.tripod_ring_status, 'appearance_performance_status': self.appearance_performance_status, 'remark': self.remark, }