+# -*- coding: utf-8 -*-
+
+from django.contrib import admin
+
+from tenancy.models import TenancyShotInfo, TenancyShotRequestInfo
+
+
+class TenancyShotInfoAdmin(admin.ModelAdmin):
+ list_display = ('shot_id', 'model_name', 'sn', 'fittings_type', 'tenancy_status', 'status', 'created_at', 'updated_at')
+ list_filter = ('fittings_type', 'tenancy_status', 'status')
+
+
+class TenancyShotRequestInfoAdmin(admin.ModelAdmin):
+ 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')
+
+
+admin.site.register(TenancyShotInfo, TenancyShotInfoAdmin)
+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. |