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)

+ 8 - 0
tenancy/apps.py

@@ -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'

+ 71 - 0
tenancy/migrations/0001_initial.py

@@ -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
+    ]

+ 34 - 0
tenancy/migrations/0002_auto_20221105_2323.py

@@ -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
tenancy/migrations/__init__.py


+ 142 - 0
tenancy/models.py

@@ -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
+        }

+ 7 - 0
tenancy/tests.py

@@ -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.

+ 7 - 0
tenancy/views.py

@@ -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.

kodo - Gogs: Go Git Service

Nav apraksta

huangqimin: 3d0d214667 :sparkles: Member Infos 6 gadi atpakaļ
..
__init__.py 3d0d214667 :sparkles: Member Infos 6 gadi atpakaļ
dummy_backend.py 3d0d214667 :sparkles: Member Infos 6 gadi atpakaļ
pillow_backend.py 3d0d214667 :sparkles: Member Infos 6 gadi atpakaļ