25
+        migrations.AlterField(
26
+            model_name='usercouponinfo',
27
+            name='has_used',
28
+            field=models.BooleanField(default=False, help_text='\u662f\u5426\u5df2\u6838\u9500', verbose_name='has_used'),
29
+        ),
30
+        migrations.AlterField(
31
+            model_name='usercouponinfo',
32
+            name='is_coupon_admin_writeoff',
33
+            field=models.BooleanField(default=True, help_text='\u662f\u5426\u662f\u7ba1\u7406\u5458\u6838\u9500', verbose_name='is_coupon_admin_writeoff'),
34
+        ),
35
+        migrations.AlterField(
36
+            model_name='usercouponinfo',
37
+            name='status',
38
+            field=models.BooleanField(default=True, help_text='Status', verbose_name='status'),
39
+        ),
40
+    ]

+ 0 - 28
coupon/migrations/0017_auto_20201130_0148.py

@@ -1,28 +0,0 @@
1
-# Generated by Django 2.2.15 on 2020-11-29 17:48
2
-
3
-from django.db import migrations, models
4
-
5
-
6
-class Migration(migrations.Migration):
7
-
8
-    dependencies = [
9
-        ('coupon', '0016_auto_20201130_0131'),
10
-    ]
11
-
12
-    operations = [
13
-        migrations.AlterField(
14
-            model_name='couponinfo',
15
-            name='is_coupon_admin_writeoff',
16
-            field=models.BooleanField(default=True, help_text='是否是管理员核销', verbose_name='is_coupon_admin_writeoff'),
17
-        ),
18
-        migrations.AlterField(
19
-            model_name='usercouponinfo',
20
-            name='has_used',
21
-            field=models.BooleanField(default=False, help_text='是否已核销', verbose_name='has_used'),
22
-        ),
23
-        migrations.AlterField(
24
-            model_name='usercouponinfo',
25
-            name='is_coupon_admin_writeoff',
26
-            field=models.BooleanField(default=True, help_text='是否是管理员核销', verbose_name='is_coupon_admin_writeoff'),
27
-        ),
28
-    ]

+ 5 - 3
group/migrations/0047_auto_20201130_0148.py

@@ -1,4 +1,6 @@
1
-# Generated by Django 2.2.15 on 2020-11-29 17:48
1
+# -*- coding: utf-8 -*-
2
+# Generated by Django 1.11.29 on 2020-12-02 04:03
3
+from __future__ import unicode_literals
2 4
 
3 5
 from django.db import migrations, models
4 6
 
@@ -13,11 +15,11 @@ class Migration(migrations.Migration):
13 15
         migrations.AlterField(
14 16
             model_name='groupphotoinfo',
15 17
             name='has_watermark',
16
-            field=models.BooleanField(default=False, help_text='是否有水印', verbose_name='has_watermark'),
18
+            field=models.BooleanField(default=False, help_text='\u662f\u5426\u6709\u6c34\u5370', verbose_name='has_watermark'),
17 19
         ),
18 20
         migrations.AlterField(
19 21
             model_name='photothumbupinfo',
20 22
             name='thumbup',
21
-            field=models.BooleanField(default=True, help_text='用户点赞', verbose_name='thumbup'),
23
+            field=models.BooleanField(default=True, help_text='\u7528\u6237\u70b9\u8d5e', verbose_name='thumbup'),
22 24
         ),
23 25
     ]

+ 11 - 9
integral/migrations/0021_auto_20201130_0148.py

@@ -1,4 +1,6 @@
1
-# Generated by Django 2.2.15 on 2020-11-29 17:48
1
+# -*- coding: utf-8 -*-
2
+# Generated by Django 1.11.29 on 2020-12-02 04:03
3
+from __future__ import unicode_literals
2 4
 
3 5
 from django.db import migrations, models
4 6
 
@@ -13,41 +15,41 @@ class Migration(migrations.Migration):
13 15
         migrations.AlterField(
14 16
             model_name='saleclerkintegralincomeexpensesinfo',
15 17
             name='test_user',
16
-            field=models.BooleanField(default=False, help_text='是否为测试用户', verbose_name='test_user'),
18
+            field=models.BooleanField(default=False, help_text='\u662f\u5426\u4e3a\u6d4b\u8bd5\u7528\u6237', verbose_name='test_user'),
17 19
         ),
18 20
         migrations.AlterField(
19 21
             model_name='saleclerksubmitloginfo',
20 22
             name='dupload',
21
-            field=models.BooleanField(default=False, help_text='是否为重复提交', verbose_name='dupload'),
23
+            field=models.BooleanField(default=False, help_text='\u662f\u5426\u4e3a\u91cd\u590d\u63d0\u4ea4', verbose_name='dupload'),
22 24
         ),
23 25
         migrations.AlterField(
24 26
             model_name='saleclerksubmitloginfo',
25 27
             name='has_scan',
26
-            field=models.BooleanField(default=False, help_text='是否被消费者扫过', verbose_name='has_scan'),
28
+            field=models.BooleanField(default=False, help_text='\u662f\u5426\u88ab\u6d88\u8d39\u8005\u626b\u8fc7', verbose_name='has_scan'),
27 29
         ),
28 30
         migrations.AlterField(
29 31
             model_name='saleclerksubmitloginfo',
30 32
             name='is_staff_delete',
31
-            field=models.BooleanField(default=False, help_text='是否管理员删除', verbose_name='is_staff_delete'),
33
+            field=models.BooleanField(default=False, help_text='\u662f\u5426\u7ba1\u7406\u5458\u5220\u9664', verbose_name='is_staff_delete'),
32 34
         ),
33 35
         migrations.AlterField(
34 36
             model_name='saleclerksubmitloginfo',
35 37
             name='is_upload_qiniu',
36
-            field=models.BooleanField(default=False, help_text='是否已上传七牛', verbose_name='is_upload_qiniu'),
38
+            field=models.BooleanField(default=False, help_text='\u662f\u5426\u5df2\u4e0a\u4f20\u4e03\u725b', verbose_name='is_upload_qiniu'),
37 39
         ),
38 40
         migrations.AlterField(
39 41
             model_name='saleclerksubmitloginfo',
40 42
             name='is_wxwork',
41
-            field=models.BooleanField(default=False, help_text='是否为企业微信端', verbose_name='is_wxwork'),
43
+            field=models.BooleanField(default=False, help_text='\u662f\u5426\u4e3a\u4f01\u4e1a\u5fae\u4fe1\u7aef', verbose_name='is_wxwork'),
42 44
         ),
43 45
         migrations.AlterField(
44 46
             model_name='saleclerksubmitloginfo',
45 47
             name='test_sn',
46
-            field=models.BooleanField(default=False, help_text='是否为测试序列号', verbose_name='test_sn'),
48
+            field=models.BooleanField(default=False, help_text='\u662f\u5426\u4e3a\u6d4b\u8bd5\u5e8f\u5217\u53f7', verbose_name='test_sn'),
47 49
         ),
48 50
         migrations.AlterField(
49 51
             model_name='saleclerksubmitloginfo',
50 52
             name='test_user',
51
-            field=models.BooleanField(default=False, help_text='是否为测试用户', verbose_name='test_user'),
53
+            field=models.BooleanField(default=False, help_text='\u662f\u5426\u4e3a\u6d4b\u8bd5\u7528\u6237', verbose_name='test_user'),
52 54
         ),
53 55
     ]

+ 4 - 2
marketcode/migrations/0005_auto_20201130_0148.py

@@ -1,4 +1,6 @@
1
-# Generated by Django 2.2.15 on 2020-11-29 17:48
1
+# -*- coding: utf-8 -*-
2
+# Generated by Django 1.11.29 on 2020-12-02 04:03
3
+from __future__ import unicode_literals
2 4
 
3 5
 from django.db import migrations, models
4 6
 
@@ -13,6 +15,6 @@ class Migration(migrations.Migration):
13 15
         migrations.AlterField(
14 16
             model_name='marketcodeinfo',
15 17
             name='has_used',
16
-            field=models.BooleanField(default=False, help_text='是否已使用', verbose_name='has_used'),
18
+            field=models.BooleanField(default=False, help_text='\u662f\u5426\u5df2\u4f7f\u7528', verbose_name='has_used'),
17 19
         ),
18 20
     ]

+ 60 - 3
mch/migrations/0058_auto_20201130_0131.py

@@ -1,4 +1,6 @@
1
-# Generated by Django 2.2.15 on 2020-11-29 17:31
1
+# -*- coding: utf-8 -*-
2
+# Generated by Django 1.11.29 on 2020-12-02 04:03
3
+from __future__ import unicode_literals
2 4
 
3 5
 from django.db import migrations, models
4 6
 
@@ -37,10 +39,30 @@ class Migration(migrations.Migration):
37 39
         ),
38 40
         migrations.AlterField(
39 41
             model_name='consumeinfosubmitloginfo',
42
+            name='dupload',
43
+            field=models.BooleanField(default=False, help_text='\u662f\u5426\u4e3a\u91cd\u590d\u63d0\u4ea4', verbose_name='dupload'),
44
+        ),
45
+        migrations.AlterField(
46
+            model_name='consumeinfosubmitloginfo',
47
+            name='has_used',
48
+            field=models.BooleanField(default=False, help_text='\u662f\u5426\u5df2\u6838\u9500', verbose_name='has_used'),
49
+        ),
50
+        migrations.AlterField(
51
+            model_name='consumeinfosubmitloginfo',
40 52
             name='status',
41 53
             field=models.BooleanField(default=True, help_text='Status', verbose_name='status'),
42 54
         ),
43 55
         migrations.AlterField(
56
+            model_name='consumeinfosubmitloginfo',
57
+            name='submit_during_activity',
58
+            field=models.BooleanField(default=False, help_text='\u662f\u5426\u4e3a\u6d3b\u52a8\u671f\u95f4\u4e0a\u4f20', verbose_name='submit_during_activity'),
59
+        ),
60
+        migrations.AlterField(
61
+            model_name='consumeinfosubmitloginfo',
62
+            name='test_user',
63
+            field=models.BooleanField(default=False, help_text='\u662f\u5426\u4e3a\u6d4b\u8bd5\u7528\u6237', verbose_name='test_user'),
64
+        ),
65
+        migrations.AlterField(
44 66
             model_name='distributorinfo',
45 67
             name='status',
46 68
             field=models.BooleanField(default=True, help_text='Status', verbose_name='status'),
@@ -58,7 +80,7 @@ class Migration(migrations.Migration):
58 80
         migrations.AlterField(
59 81
             model_name='maintenancemaninfo',
60 82
             name='sex',
61
-            field=models.IntegerField(choices=[(0, '未知'), (1, '男'), (2, '女')], default=0, help_text='Sex', verbose_name='sex'),
83
+            field=models.IntegerField(choices=[(0, '\u672a\u77e5'), (1, '\u7537'), (2, '\u5973')], default=0, help_text='Sex', verbose_name='sex'),
62 84
         ),
63 85
         migrations.AlterField(
64 86
             model_name='maintenancemaninfo',
@@ -67,6 +89,16 @@ class Migration(migrations.Migration):
67 89
         ),
68 90
         migrations.AlterField(
69 91
             model_name='modelcamerabodyinfo',
92
+            name='is_ILDC',
93
+            field=models.BooleanField(default=False, help_text='\u662f\u5426\u9700\u8981\u539f\u5382\u8f6c\u63a5\u73af', verbose_name='is_ILDC'),
94
+        ),
95
+        migrations.AlterField(
96
+            model_name='modelcamerabodyinfo',
97
+            name='is_important',
98
+            field=models.BooleanField(default=False, help_text='\u662f\u5426\u91cd\u8981\u578b\u53f7', verbose_name='is_important'),
99
+        ),
100
+        migrations.AlterField(
101
+            model_name='modelcamerabodyinfo',
70 102
             name='status',
71 103
             field=models.BooleanField(default=True, help_text='Status', verbose_name='status'),
72 104
         ),
@@ -77,6 +109,16 @@ class Migration(migrations.Migration):
77 109
         ),
78 110
         migrations.AlterField(
79 111
             model_name='modelinfo',
112
+            name='display',
113
+            field=models.BooleanField(default=True, help_text='Display', verbose_name='display'),
114
+        ),
115
+        migrations.AlterField(
116
+            model_name='modelinfo',
117
+            name='is_important',
118
+            field=models.BooleanField(default=False, help_text='\u662f\u5426\u91cd\u8981\u578b\u53f7', verbose_name='is_important'),
119
+        ),
120
+        migrations.AlterField(
121
+            model_name='modelinfo',
80 122
             name='status',
81 123
             field=models.BooleanField(default=True, help_text='Status', verbose_name='status'),
82 124
         ),
@@ -87,12 +129,27 @@ class Migration(migrations.Migration):
87 129
         ),
88 130
         migrations.AlterField(
89 131
             model_name='saleclerkinfo',
132
+            name='is_auth',
133
+            field=models.BooleanField(default=False, help_text='\u662f\u5426\u5df2\u6388\u6743', verbose_name='is_auth'),
134
+        ),
135
+        migrations.AlterField(
136
+            model_name='saleclerkinfo',
137
+            name='is_online_sales',
138
+            field=models.BooleanField(default=False, help_text='\u662f\u5426\u4e3a\u7f51\u9500', verbose_name='is_online_sales'),
139
+        ),
140
+        migrations.AlterField(
141
+            model_name='saleclerkinfo',
90 142
             name='sex',
91
-            field=models.IntegerField(choices=[(0, '未知'), (1, '男'), (2, '女')], default=0, help_text='Sex', verbose_name='sex'),
143
+            field=models.IntegerField(choices=[(0, '\u672a\u77e5'), (1, '\u7537'), (2, '\u5973')], default=0, help_text='Sex', verbose_name='sex'),
92 144
         ),
93 145
         migrations.AlterField(
94 146
             model_name='saleclerkinfo',
95 147
             name='status',
96 148
             field=models.BooleanField(default=True, help_text='Status', verbose_name='status'),
97 149
         ),
150
+        migrations.AlterField(
151
+            model_name='saleclerkinfo',
152
+            name='test_user',
153
+            field=models.BooleanField(default=False, help_text='\u662f\u5426\u4e3a\u6d4b\u8bd5\u7528\u6237', verbose_name='test_user'),
154
+        ),
98 155
     ]

+ 0 - 68
mch/migrations/0059_auto_20201130_0148.py

@@ -1,68 +0,0 @@
1
-# Generated by Django 2.2.15 on 2020-11-29 17:48
2
-
3
-from django.db import migrations, models
4
-
5
-
6
-class Migration(migrations.Migration):
7
-
8
-    dependencies = [
9
-        ('mch', '0058_auto_20201130_0131'),
10
-    ]
11
-
12
-    operations = [
13
-        migrations.AlterField(
14
-            model_name='consumeinfosubmitloginfo',
15
-            name='dupload',
16
-            field=models.BooleanField(default=False, help_text='是否为重复提交', verbose_name='dupload'),
17
-        ),
18
-        migrations.AlterField(
19
-            model_name='consumeinfosubmitloginfo',
20
-            name='has_used',
21
-            field=models.BooleanField(default=False, help_text='是否已核销', verbose_name='has_used'),
22
-        ),
23
-        migrations.AlterField(
24
-            model_name='consumeinfosubmitloginfo',
25
-            name='submit_during_activity',
26
-            field=models.BooleanField(default=False, help_text='是否为活动期间上传', verbose_name='submit_during_activity'),
27
-        ),
28
-        migrations.AlterField(
29
-            model_name='consumeinfosubmitloginfo',
30
-            name='test_user',
31
-            field=models.BooleanField(default=False, help_text='是否为测试用户', verbose_name='test_user'),
32
-        ),
33
-        migrations.AlterField(
34
-            model_name='modelcamerabodyinfo',
35
-            name='is_ILDC',
36
-            field=models.BooleanField(default=False, help_text='是否需要原厂转接环', verbose_name='is_ILDC'),
37
-        ),
38
-        migrations.AlterField(
39
-            model_name='modelcamerabodyinfo',
40
-            name='is_important',
41
-            field=models.BooleanField(default=False, help_text='是否重要型号', verbose_name='is_important'),
42
-        ),
43
-        migrations.AlterField(
44
-            model_name='modelinfo',
45
-            name='display',
46
-            field=models.BooleanField(default=True, help_text='Display', verbose_name='display'),
47
-        ),
48
-        migrations.AlterField(
49
-            model_name='modelinfo',
50
-            name='is_important',
51
-            field=models.BooleanField(default=False, help_text='是否重要型号', verbose_name='is_important'),
52
-        ),
53
-        migrations.AlterField(
54
-            model_name='saleclerkinfo',
55
-            name='is_auth',
56
-            field=models.BooleanField(default=False, help_text='是否已授权', verbose_name='is_auth'),
57
-        ),
58
-        migrations.AlterField(
59
-            model_name='saleclerkinfo',
60
-            name='is_online_sales',
61
-            field=models.BooleanField(default=False, help_text='是否为网销', verbose_name='is_online_sales'),
62
-        ),
63
-        migrations.AlterField(
64
-            model_name='saleclerkinfo',
65
-            name='test_user',
66
-            field=models.BooleanField(default=False, help_text='是否为测试用户', verbose_name='test_user'),
67
-        ),
68
-    ]

+ 46 - 14
member/migrations/0019_auto_20201130_0131.py

@@ -1,4 +1,6 @@
1
-# Generated by Django 2.2.15 on 2020-11-29 17:31
1
+# -*- coding: utf-8 -*-
2
+# Generated by Django 1.11.29 on 2020-12-02 04:03
3
+from __future__ import unicode_literals
2 4
 
3 5
 from django.db import migrations, models
4 6
 import shortuuidfield.fields
@@ -18,26 +20,36 @@ class Migration(migrations.Migration):
18 20
                 ('status', models.BooleanField(default=True, help_text='Status', verbose_name='status')),
19 21
                 ('created_at', models.DateTimeField(auto_now_add=True, help_text='Create Time', verbose_name='created_at')),
20 22
                 ('updated_at', models.DateTimeField(auto_now=True, help_text='Update Time', verbose_name='updated_at')),
21
-                ('brand_id', models.CharField(blank=True, db_index=True, help_text='品牌唯一标识', max_length=32, null=True, verbose_name='brand_id')),
22
-                ('brand_name', models.CharField(blank=True, help_text='品牌名称', max_length=255, null=True, verbose_name='brand_name')),
23
-                ('group_share_id', shortuuidfield.fields.ShortUUIDField(blank=True, db_index=True, editable=False, help_text='活动群组分享唯一标识', max_length=22, null=True, unique=True)),
24
-                ('share_user_id', models.CharField(blank=True, db_index=True, help_text='分享用户唯一标识', max_length=32, null=True, verbose_name='share_user_id')),
25
-                ('click_user_id', models.CharField(blank=True, db_index=True, help_text='点击用户唯一标识', max_length=32, null=True, verbose_name='click_user_id')),
26
-                ('open_gid', models.CharField(blank=True, db_index=True, help_text='群组唯一标识', max_length=32, null=True, verbose_name='open_gid')),
27
-                ('activity_id', models.CharField(blank=True, db_index=True, help_text='活动唯一标识', max_length=32, null=True, verbose_name='activity_id')),
28
-                ('title', models.CharField(blank=True, help_text='活动名称', max_length=255, null=True, verbose_name='title')),
29
-                ('is_integral', models.BooleanField(default=False, help_text='是否有积分', verbose_name='is_integral')),
30
-                ('integral', models.IntegerField(default=0, help_text='积分', verbose_name='integral')),
23
+                ('brand_id', models.CharField(blank=True, db_index=True, help_text='\u54c1\u724c\u552f\u4e00\u6807\u8bc6', max_length=32, null=True, verbose_name='brand_id')),
24
+                ('brand_name', models.CharField(blank=True, help_text='\u54c1\u724c\u540d\u79f0', max_length=255, null=True, verbose_name='brand_name')),
25
+                ('group_share_id', shortuuidfield.fields.ShortUUIDField(blank=True, db_index=True, editable=False, help_text='\u6d3b\u52a8\u7fa4\u7ec4\u5206\u4eab\u552f\u4e00\u6807\u8bc6', max_length=22, null=True, unique=True)),
26
+                ('share_user_id', models.CharField(blank=True, db_index=True, help_text='\u5206\u4eab\u7528\u6237\u552f\u4e00\u6807\u8bc6', max_length=32, null=True, verbose_name='share_user_id')),
27
+                ('click_user_id', models.CharField(blank=True, db_index=True, help_text='\u70b9\u51fb\u7528\u6237\u552f\u4e00\u6807\u8bc6', max_length=32, null=True, verbose_name='click_user_id')),
28
+                ('open_gid', models.CharField(blank=True, db_index=True, help_text='\u7fa4\u7ec4\u552f\u4e00\u6807\u8bc6', max_length=32, null=True, verbose_name='open_gid')),
29
+                ('activity_id', models.CharField(blank=True, db_index=True, help_text='\u6d3b\u52a8\u552f\u4e00\u6807\u8bc6', max_length=32, null=True, verbose_name='activity_id')),
30
+                ('title', models.CharField(blank=True, help_text='\u6d3b\u52a8\u540d\u79f0', max_length=255, null=True, verbose_name='title')),
31
+                ('is_integral', models.BooleanField(default=False, help_text='\u662f\u5426\u6709\u79ef\u5206', verbose_name='is_integral')),
32
+                ('integral', models.IntegerField(default=0, help_text='\u79ef\u5206', verbose_name='integral')),
31 33
             ],
32 34
             options={
33
-                'verbose_name': '会员活动群组分享信息',
34
-                'verbose_name_plural': '会员活动群组分享信息',
35
+                'verbose_name': '\u4f1a\u5458\u6d3b\u52a8\u7fa4\u7ec4\u5206\u4eab\u4fe1\u606f',
36
+                'verbose_name_plural': '\u4f1a\u5458\u6d3b\u52a8\u7fa4\u7ec4\u5206\u4eab\u4fe1\u606f',
35 37
             },
36 38
         ),
37 39
         migrations.AddField(
38 40
             model_name='memberactivityinfo',
39 41
             name='group_share_integral',
40
-            field=models.IntegerField(default=0, help_text='群组分享会员积分', verbose_name='group_share_integral'),
42
+            field=models.IntegerField(default=0, help_text='\u7fa4\u7ec4\u5206\u4eab\u4f1a\u5458\u79ef\u5206', verbose_name='group_share_integral'),
43
+        ),
44
+        migrations.AlterField(
45
+            model_name='goodsinfo',
46
+            name='is_slider',
47
+            field=models.BooleanField(default=True, help_text='\u662f\u5426\u4e3a\u8f6e\u64ad\u5546\u54c1', verbose_name='is_slider'),
48
+        ),
49
+        migrations.AlterField(
50
+            model_name='goodsinfo',
51
+            name='only_for_member',
52
+            field=models.BooleanField(default=False, help_text='\u4f1a\u5458\u4e13\u5c5e', verbose_name='only_for_member'),
41 53
         ),
42 54
         migrations.AlterField(
43 55
             model_name='goodsinfo',
@@ -46,11 +58,26 @@ class Migration(migrations.Migration):
46 58
         ),
47 59
         migrations.AlterField(
48 60
             model_name='goodsorderinfo',
61
+            name='has_send_template_message',
62
+            field=models.BooleanField(default=True, help_text='\u662f\u5426\u5df2\u53d1\u9001\u6a21\u7248\u6d88\u606f', verbose_name='has_send_template_message'),
63
+        ),
64
+        migrations.AlterField(
65
+            model_name='goodsorderinfo',
49 66
             name='status',
50 67
             field=models.BooleanField(default=True, help_text='Status', verbose_name='status'),
51 68
         ),
52 69
         migrations.AlterField(
53 70
             model_name='memberactivityinfo',
71
+            name='is_signup',
72
+            field=models.BooleanField(default=True, help_text='\u662f\u5426\u6709\u62a5\u540d\u529f\u80fd', verbose_name='is_signup'),
73
+        ),
74
+        migrations.AlterField(
75
+            model_name='memberactivityinfo',
76
+            name='is_slider',
77
+            field=models.BooleanField(default=True, help_text='\u662f\u5426\u4e3a\u8f6e\u64ad\u6d3b\u52a8', verbose_name='is_slider'),
78
+        ),
79
+        migrations.AlterField(
80
+            model_name='memberactivityinfo',
54 81
             name='status',
55 82
             field=models.BooleanField(default=True, help_text='Status', verbose_name='status'),
56 83
         ),
@@ -66,6 +93,11 @@ class Migration(migrations.Migration):
66 93
         ),
67 94
         migrations.AlterField(
68 95
             model_name='rightinfo',
96
+            name='is_send_coupon',
97
+            field=models.BooleanField(default=False, help_text='\u662f\u5426\u53d1\u5238', verbose_name='is_send_coupon'),
98
+        ),
99
+        migrations.AlterField(
100
+            model_name='rightinfo',
69 101
             name='status',
70 102
             field=models.BooleanField(default=True, help_text='Status', verbose_name='status'),
71 103
         ),

+ 0 - 43
member/migrations/0020_auto_20201130_0148.py

@@ -1,43 +0,0 @@
1
-# Generated by Django 2.2.15 on 2020-11-29 17:48
2
-
3
-from django.db import migrations, models
4
-
5
-
6
-class Migration(migrations.Migration):
7
-
8
-    dependencies = [
9
-        ('member', '0019_auto_20201130_0131'),
10
-    ]
11
-
12
-    operations = [
13
-        migrations.AlterField(
14
-            model_name='goodsinfo',
15
-            name='is_slider',
16
-            field=models.BooleanField(default=True, help_text='是否为轮播商品', verbose_name='is_slider'),
17
-        ),
18
-        migrations.AlterField(
19
-            model_name='goodsinfo',
20
-            name='only_for_member',
21
-            field=models.BooleanField(default=False, help_text='会员专属', verbose_name='only_for_member'),
22
-        ),
23
-        migrations.AlterField(
24
-            model_name='goodsorderinfo',
25
-            name='has_send_template_message',
26
-            field=models.BooleanField(default=True, help_text='是否已发送模版消息', verbose_name='has_send_template_message'),
27
-        ),
28
-        migrations.AlterField(
29
-            model_name='memberactivityinfo',
30
-            name='is_signup',
31
-            field=models.BooleanField(default=True, help_text='是否有报名功能', verbose_name='is_signup'),
32
-        ),
33
-        migrations.AlterField(
34
-            model_name='memberactivityinfo',
35
-            name='is_slider',
36
-            field=models.BooleanField(default=True, help_text='是否为轮播活动', verbose_name='is_slider'),
37
-        ),
38
-        migrations.AlterField(
39
-            model_name='rightinfo',
40
-            name='is_send_coupon',
41
-            field=models.BooleanField(default=False, help_text='是否发券', verbose_name='is_send_coupon'),
42
-        ),
43
-    ]

+ 3 - 6
message/migrations/0014_auto_20201130_0131.py

@@ -1,4 +1,6 @@
1
-# Generated by Django 2.2.15 on 2020-11-29 17:31
1
+# -*- coding: utf-8 -*-
2
+# Generated by Django 1.11.29 on 2020-12-02 04:03
3
+from __future__ import unicode_literals
2 4
 
3 5
 from django.db import migrations, models
4 6
 
@@ -27,11 +29,6 @@ class Migration(migrations.Migration):
27 29
         ),
28 30
         migrations.AlterField(
29 31
             model_name='usermessageinfo',
30
-            name='msg_type',
31
-            field=models.CharField(db_index=True, default='system', help_text='消息类型', max_length=8, verbose_name='msg_type'),
32
-        ),
33
-        migrations.AlterField(
34
-            model_name='usermessageinfo',
35 32
             name='status',
36 33
             field=models.BooleanField(default=True, help_text='Status', verbose_name='status'),
37 34
         ),

+ 4 - 2
pay/migrations/0013_auto_20201130_0148.py

@@ -1,4 +1,6 @@
1
-# Generated by Django 2.2.15 on 2020-11-29 17:48
1
+# -*- coding: utf-8 -*-
2
+# Generated by Django 1.11.29 on 2020-12-02 04:03
3
+from __future__ import unicode_literals
2 4
 
3 5
 from django.db import migrations, models
4 6
 
@@ -13,6 +15,6 @@ class Migration(migrations.Migration):
13 15
         migrations.AlterField(
14 16
             model_name='orderinfo',
15 17
             name='reback_status',
16
-            field=models.BooleanField(default=False, help_text='退款状态', verbose_name='reback_status'),
18
+            field=models.BooleanField(default=False, help_text='\u9000\u6b3e\u72b6\u6001', verbose_name='reback_status'),
17 19
         ),
18 20
     ]

+ 2 - 2
requirements_dj.txt

@@ -1,6 +1,6 @@
1 1
 Django==1.11.29
2 2
 django-admin==2.0.1
3
-django-cors-headers==3.0.2
3
+django-cors-headers==3.5.0
4 4
 django-curtail-uuid==1.0.4
5 5
 django-daterange-filter==1.3.0
6 6
 django-detect==1.0.18
@@ -23,4 +23,4 @@ django-shortuuidfield==0.1.3
23 23
 django-six==1.0.4
24 24
 django-uniapi==1.0.10
25 25
 django-we==1.5.6
26
-djangorestframework==3.7.7
26
+djangorestframework==3.12.2

+ 2 - 1
requirements_pywe.txt

@@ -1,10 +1,11 @@
1
+pyqywe_miniapp==1.0.0
1 2
 pywe-card==1.0.0
2 3
 pywe-component==1.0.1
3 4
 pywe-component-authorizer-token==1.1.1
4 5
 pywe-component-preauthcode==1.0.3
5 6
 pywe-jssdk==1.1.0
6 7
 pywe-marketcode==1.0.3
7
-pywe-membercard==1.0.1
8
+pywe-membercard==1.0.3
8 9
 pywe-custom-message==1.0.1
9 10
 pywe-event-message==1.0.1
10 11
 pywe-miniapp==1.1.6

+ 6 - 4
sales/migrations/0009_auto_20201130_0148.py

@@ -1,4 +1,6 @@
1
-# Generated by Django 2.2.15 on 2020-11-29 17:48
1
+# -*- coding: utf-8 -*-
2
+# Generated by Django 1.11.29 on 2020-12-02 04:03
3
+from __future__ import unicode_literals
2 4
 
3 5
 from django.db import migrations, models
4 6
 
@@ -13,16 +15,16 @@ class Migration(migrations.Migration):
13 15
         migrations.AlterField(
14 16
             model_name='salesresponsibilityinfo',
15 17
             name='is_auth',
16
-            field=models.BooleanField(default=False, help_text='是否已授权', verbose_name='is_auth'),
18
+            field=models.BooleanField(default=False, help_text='\u662f\u5426\u5df2\u6388\u6743', verbose_name='is_auth'),
17 19
         ),
18 20
         migrations.AlterField(
19 21
             model_name='salesresponsibilityinfo',
20 22
             name='is_super',
21
-            field=models.BooleanField(default=False, help_text='是否超级销售担当', verbose_name='is_super'),
23
+            field=models.BooleanField(default=False, help_text='\u662f\u5426\u8d85\u7ea7\u9500\u552e\u62c5\u5f53', verbose_name='is_super'),
22 24
         ),
23 25
         migrations.AlterField(
24 26
             model_name='salesresponsibilityinfomodelssalestatisticinfo',
25 27
             name='is_important',
26
-            field=models.BooleanField(default=True, help_text='是否重要型号', verbose_name='is_important'),
28
+            field=models.BooleanField(default=True, help_text='\u662f\u5426\u91cd\u8981\u578b\u53f7', verbose_name='is_important'),
27 29
         ),
28 30
     ]

kodo - Gogs: Go Git Service

Keine Beschreibung

admin_views.py 67KB

    # -*- coding: utf-8 -*- from __future__ import division import json from collections import defaultdict from datetime import datetime from django.conf import settings from django.contrib.auth.hashers import make_password from django.db import transaction from django.db.models import Count, Q, Sum from django_logit import logit from django_query import get_query_value from django_response import response from paginator import pagination from pysnippets.strsnippets import strip from TimeConvert import TimeConvert as tc from account.models import UserInfo from api.encrypt_views import get_ciphertext from coupon.models import CouponInfo, UserCouponInfo from integral.models import SaleclerkSubmitLogInfo from kodo.decorators import check_admin from logs.models import AdministratorLoginLogInfo, ComplementCodeLogInfo, MchInfoEncryptLogInfo from mch.models import AdministratorInfo, BrandInfo, ConsumeInfoSubmitLogInfo, DistributorInfo, ModelInfo from member.models import (GoodsInfo, GoodsOrderInfo, MemberActivityContributionInfo, MemberActivityContributionWelfareInfo, MemberActivityContributionWelfareUnlockingInfo, MemberActivityGroupShareInfo, MemberActivityInfo, MemberActivitySignupInfo) from pre.custom_message import sendtemplatemessage, sendwxasubscribemessage from statistic.models import ConsumeModelSaleStatisticInfo, ConsumeSaleStatisticInfo, ConsumeUserStatisticInfo from utils.error.errno_utils import (AdministratorStatusCode, ComplementCodeStatusCode, CouponStatusCode, MemberActivityContributionStatusCode, MemberActivityContributionWelfareStatusCode, MemberActivityContributionWelfareUnblockingStatusCode, MemberActivityStatusCode, MemberGoodStatusCode, ProductCouponStatusCode, ProductMachineStatusCode, UserStatusCode) WECHAT = settings.WECHAT @logit @check_admin def querysn(request, administrator): model_id = request.POST.get('model_id', '') sn = request.POST.get('sn', '') if administrator.admin_type != AdministratorInfo.MAINTENANCE: return response(AdministratorStatusCode.MAINTENANCE_NOT_FOUND) log = ConsumeInfoSubmitLogInfo.objects.filter(brand_id=administrator.brand_id, model_id=model_id, serialNo=sn, submit_during_activity=True, status=True).order_by('has_used', '-pk').first() if not log: log = ConsumeInfoSubmitLogInfo.objects.filter(brand_id=administrator.brand_id, model_id=model_id, serialNo=sn, status=True).order_by('-submit_during_activity', 'dupload').first() if not log: return response(ProductMachineStatusCode.SN_NOT_FOUND) return response(200, 'Query SN Success', u'查询序列号成功', data=log.data) @logit @check_admin def queryusedsn(request, administrator): if administrator.admin_type != AdministratorInfo.MAINTENANCE: return response(AdministratorStatusCode.MAINTENANCE_NOT_FOUND) logs = ConsumeInfoSubmitLogInfo.objects.filter(brand_id=administrator.brand_id, admin_id=administrator.admin_id, has_used=True, status=True).order_by('-used_at') logs = [log.data for log in logs] return response(200, 'Query Used SN Success', u'查询核销序列号成功', data={ 'logs': logs, }) @logit @check_admin @transaction.atomic def usecoupon(request, administrator): model_id = request.POST.get('model_id', '') sn = request.POST.get('sn', '') if administrator.admin_type != AdministratorInfo.MAINTENANCE: return response(AdministratorStatusCode.MAINTENANCE_NOT_FOUND) log = ConsumeInfoSubmitLogInfo.objects.filter( brand_id=administrator.brand_id, model_id=model_id, serialNo=sn, submit_during_activity=True, has_used=False, status=True ).first() if not log: return response(ProductMachineStatusCode.SN_NOT_FOUND) logdata = log.data if logdata.get('final_coupon_info', {}).get('coupon_has_expired', True): return response(ProductCouponStatusCode.COUPON_HAS_EXPIRED) log.has_used = True log.used_at = tc.utc_datetime() log.save() return response(200, 'Use Coupon Success', u'核销优惠券成功') @logit @check_admin def userinfo(request, administrator): page = request.POST.get('page', 1) num = request.POST.get('num', 20) userinfos = UserInfo.objects.filter(status=True).order_by('-pk') count = userinfos.count() userinfos, left = pagination(userinfos, page, num) userinfos = [userinfo.admindata for userinfo in userinfos] return response(200, 'Userinfo Success', u'用户列表获取成功', data={ 'userinfos': userinfos, 'count': count, 'left': left, }) @logit @check_admin def query_usercoupons(request, administrator): user_id = request.POST.get('user_id', '') # 校验用户是否存在 try: user = UserInfo.objects.get(user_id=user_id) except UserInfo.DoesNotExist: return response(UserStatusCode.USER_NOT_FOUND) coupons = UserCouponInfo.objects.filter(brand_id=administrator.brand_id, user_id=user_id, status=True).order_by('-pk') coupons = [coupon.admindata for coupon in coupons] return response(200, 'User Coupon Success', u'用户劵列表获取成功', data={ 'coupons': coupons, }) @logit @check_admin def query_usergoods(request, administrator): user_id = request.POST.get('user_id', '') dupload = request.POST.get('dupload', '') # 校验用户是否存在 try: user = UserInfo.objects.get(user_id=user_id) except UserInfo.DoesNotExist: return response(UserStatusCode.USER_NOT_FOUND) logs = ConsumeInfoSubmitLogInfo.objects.filter(brand_id=administrator.brand_id, user_id=user_id, status=True).order_by('-pk') if dupload: logs = logs.filter(dupload=dupload) logs = [log.adminuserdata for log in logs] return response(200, 'Userinfo Goods Success', u'用户商品列表获取成功', data={ 'logs': logs, }) @logit @check_admin def query_userinfo(request, administrator): query = request.POST.get('query', '') level = request.POST.get('level', '') is_member = request.POST.get('is_member', '') code_version = request.POST.get('code_version', 0) sex = request.POST.get('sex', '') subscribe = request.POST.get('subscribe', '') has_membercard = request.POST.get('has_membercard', '') province = request.POST.get('province', '') start_time = request.POST.get('start_time', '') end_time = request.POST.get('end_time', '') page = request.POST.get('page', 1) num = request.POST.get('num', 20) userinfos = UserInfo.objects.filter(Q(status=True) & (Q(user_id__icontains=query) | Q(nickname__icontains=query) | Q(phone__icontains=query) | Q(memberusercardcode__icontains=query))).order_by('-pk') if level: userinfos = userinfos.filter(level=level) if code_version: userinfos = userinfos.filter(code_version=code_version) if subscribe: userinfos = userinfos.filter(subscribe=subscribe) if has_membercard: userinfos = userinfos.filter(has_membercard=has_membercard) if is_member: userinfos = userinfos.filter(level__gte=1) if sex: userinfos = userinfos.filter(sex=sex) if province: userinfos = userinfos.filter(province_name=province) if start_time and end_time: ftime = datetime.strptime(start_time + ' 00:00:00', '%Y%m%d %H:%M:%S') ttime = datetime.strptime(end_time + ' 23:59:59', '%Y%m%d %H:%M:%S') userinfos = userinfos.filter(created_at__range=[ftime, ttime]) count = userinfos.count() userinfos, left = pagination(userinfos, page, num) userinfos = [userinfo.admindata for userinfo in userinfos] return response(200, 'Userinfo Success', u'用户列表获取成功', data={ 'userinfos': userinfos, 'count': count, 'left': left }) @logit @check_admin @transaction.atomic def userinfo_update(request, administrator): user_id = request.POST.get('user_id', '') integral = int(request.POST.get('integral', 0)) # 校验用户是否存在 try: user = UserInfo.objects.select_for_update().get(user_id=user_id, status=True) except UserInfo.DoesNotExist: return response(UserStatusCode.USER_NOT_FOUND) user.integral = integral user.save() return response(200, 'Userinfo Update Success', u'修改用户信息成功', data={}) # 统计 @check_admin def statistic_userprofile(request, administrator): start_time = request.POST.get('start_time', '') end_time = request.POST.get('end_time', '') model_name = request.POST.get('model_name', '') if model_name: logs = ConsumeModelSaleStatisticInfo.objects.filter(model_name=model_name, ymd__gte=start_time, ymd__lte=end_time) else: logs = ConsumeModelSaleStatisticInfo.objects.filter(ymd__gte=start_time, ymd__lte=end_time) sexs = {0: 0, 1: 0, 2: 0} subscribes = {0: 0, 1: 0} has_membercards = {0: 0, 1: 0} provinces = defaultdict(int) for log in logs: for user in log.users: try: user = UserInfo.objects.get(user_id=user, status=True) except UserInfo.DoesNotExist: continue provinces[user.province_name] += 1 sexs[user.sex] += 1 subscribes[user.subscribe] += 1 has_membercards[user.has_membercard] += 1 return response(200, 'Get User Profile Success', u'获取用户画像成功', data={ 'provinces': provinces, 'sexs': sexs, 'subscribe': subscribes, 'has_membercards': has_membercards, }) @check_admin def statistic_daily(request, administrator): start_time = request.POST.get('start_time', '') end_time = request.POST.get('end_time', '') sale_logs = ConsumeSaleStatisticInfo.objects.filter(ymd__gte=start_time, ymd__lte=end_time) user_logs = ConsumeUserStatisticInfo.objects.filter(ymd__gte=start_time, ymd__lte=end_time) sale_logs = [log.data for log in sale_logs] user_logs = [log.data for log in user_logs] return response(200, 'Get User Sales Statistic Success', u'获取销量统计成功', data={ 'sale_logs': sale_logs, 'user_logs': user_logs, }) @check_admin def statistic_model(request, administrator): brand_id = request.POST.get('brand_id', settings.KODO_DEFAULT_BRAND_ID) admin_id = request.POST.get('admin_id', '') start_time = request.POST.get('start_time', '') end_time = request.POST.get('end_time', '') logs = ConsumeModelSaleStatisticInfo.objects.filter(ymd__gte=start_time, ymd__lte=end_time).values_list('model_name').annotate(Sum('num')) logs = [{'model_name': log[0], 'num': log[1]} for log in logs] return response(200, 'Get Model Statistic Success', u'获取型号统计成功', data={ 'logs': logs }) @check_admin def statistic_distributor(request, administrator): start_time = request.POST.get('start_time', '') end_time = request.POST.get('end_time', '') model_name = request.POST.get('model_name', '') distributor_name = request.POST.get('distributor_name', '') daily_sql = 'select id, Count(*) AS num, Count(code_version=1 or NULL) AS code1 , Count(code_version=2 or NULL) AS code2, Count((code_version=1 AND has_scan=True) or NULL) AS has_code1_scan_num, Count((code_version=2 AND has_scan=True) or NULL) AS has_code2_scan_num FROM integral_saleclerksubmitloginfo where ymd >= %s AND ymd <= %s AND test_user=False AND dupload=False AND test_sn=False AND status=True %s %s GROUP BY ymd;' % (start_time, end_time, ('AND model_uni_name="%s"' % (model_name)) if model_name else '', ('AND distributor_name="%s"' % (distributor_name)) if distributor_name else '') daily_logs = SaleclerkSubmitLogInfo.objects.raw(daily_sql) daily_logs = [{'ymd': log.ymd, 'num': log.num, 'code1': log.code1, 'code2': log.code2, 'has_code1_scan_num': log.has_code1_scan_num, 'has_code2_scan_num': log.has_code2_scan_num} for log in daily_logs] model_logs = [] if model_name == '': model_sql = 'select id, model_uni_name, Count(*) AS num, Count(code_version=1 or NULL) AS code1 , Count(code_version=2 or NULL) AS code2, Count((code_version=1 AND has_scan=True) or NULL) AS has_code1_scan_num, Count((code_version=2 AND has_scan=True) or NULL) AS has_code2_scan_num FROM integral_saleclerksubmitloginfo where ymd >= %s AND ymd <= %s AND test_user=False AND dupload=False AND test_sn=False AND status=True %s GROUP BY model_uni_name;' % (start_time, end_time, ('AND distributor_name="%s"' % (distributor_name)) if distributor_name else '') model_logs = SaleclerkSubmitLogInfo.objects.raw(model_sql) model_logs = [{'model_uni_name': log.model_uni_name, 'num': log.num, 'code1': log.code1, 'code2': log.code2, 'has_code1_scan_num': log.has_code1_scan_num, 'has_code2_scan_num': log.has_code2_scan_num} for log in model_logs] distributor_logs = [] if distributor_name == '': distributor_sql = 'select id, distributor_name, Count(*) AS num, Count(code_version=1 or NULL) AS code1 , Count(code_version=2 or NULL) AS code2, Count((code_version=1 AND has_scan=True) or NULL) AS has_code1_scan_num, Count((code_version=2 AND has_scan=True) or NULL) AS has_code2_scan_num FROM integral_saleclerksubmitloginfo where ymd >= %s AND ymd <= %s AND test_user=False AND dupload=False AND test_sn=False AND status=True %s GROUP BY distributor_name;' % (start_time, end_time, ('AND model_uni_name="%s"' % (model_name)) if model_name else '') distributor_logs = SaleclerkSubmitLogInfo.objects.raw(distributor_sql) distributor_logs = [{'distributor_name': log.distributor_name, 'num': log.num, 'code1': log.code1, 'code2': log.code2, 'has_code1_scan_num': log.has_code1_scan_num, 'has_code2_scan_num': log.has_code2_scan_num} for log in distributor_logs] return response(200, 'Get Distributor Statistic Success', u'获取经销商统计成功', data={ 'daily_logs': daily_logs, 'model_logs': model_logs, 'distributor_logs': distributor_logs }) @check_admin def dashboard(request, administrator): start_time = request.POST.get('start_time', '') end_time = request.POST.get('end_time', '') # 销售员统计 sale_logs = SaleclerkSubmitLogInfo.objects.filter(ymd__gte=start_time, ymd__lte=end_time, test_user=False, dupload=False, test_sn=False, status=True) sale_count = sale_logs.count() sale_daily_logs = list(sale_logs.values('ymd').annotate(num=Count('pk'))) sale_model_logs = list(sale_logs.values('model_uni_name').annotate(num=Count('pk')).order_by('-num'))[:10] sale_distributor_logs = list(sale_logs.values('distributor_name').annotate(num=Count('pk')).order_by('-num'))[:10] # 消费者统计 logs = ConsumeInfoSubmitLogInfo.objects.filter(ymd__gte=start_time, ymd__lte=end_time, test_user=False, dupload=False, status=True) consumer_count = logs.count() consumer_daily_logs = list(logs.values('ymd').annotate(num=Count('pk')).order_by('ymd')) consumer_model_logs = list(logs.values('model_uni_name').annotate(num=Count('pk')).order_by('-num'))[:10] consumer_province_logs = list(logs.values('province').annotate(num=Count('pk')).order_by('-num'))[:10] return response(200, 'Get Distributor Statistic Success', u'获取经销商统计成功', data={ 'sale_daily_logs': sale_daily_logs, 'sale_model_logs': sale_model_logs, 'sale_distributor_logs': sale_distributor_logs, 'consumer_daily_logs': consumer_daily_logs, 'consumer_model_logs': consumer_model_logs, 'consumer_province_logs': consumer_province_logs, 'sale_count': sale_count, 'consumer_count': consumer_count, }) @check_admin def statistic_consumer(request, administrator): start_time = request.POST.get('start_time', '') end_time = request.POST.get('end_time', '') model_name = request.POST.get('model_name', '') # 消费者统计 daily_sql = 'select id, Count(id) AS num, Count(code_version=1 or NULL) AS code1 , Count(code_version=2 or NULL) AS code2 FROM mch_consumeinfosubmitloginfo where ymd >= %s AND ymd <= %s AND test_user=False AND dupload=False AND status=True %s GROUP BY ymd;' % (start_time, end_time, ('AND model_uni_name="%s"' % (model_name)) if model_name else '') daily_logs = ConsumeInfoSubmitLogInfo.objects.raw(daily_sql) daily_logs = [{'ymd': log.ymd, 'num': log.num, 'code1': log.code1, 'code2': log.code2} for log in daily_logs] model_logs = [] if model_name == '': model_sql = 'select id, model_uni_name, Count(id) AS num, Count(code_version=1 or NULL) AS code1 , Count(code_version=2 or NULL) AS code2 FROM mch_consumeinfosubmitloginfo where ymd >= %s AND ymd <= %s AND test_user=False AND dupload=False AND status=True GROUP BY model_uni_name ORDER BY num desc;' % (start_time, end_time) model_logs = ConsumeInfoSubmitLogInfo.objects.raw(model_sql) model_logs = [{'model_uni_name': log.model_uni_name, 'num': log.num, 'code1': log.code1, 'code2': log.code2} for log in model_logs] province_sql = 'select id, province, Count(id) AS num, Count(code_version=1 or NULL) AS code1, Count(code_version=2 or NULL) AS code2 FROM mch_consumeinfosubmitloginfo where ymd >= %s AND ymd <= %s AND test_user=False AND dupload=False AND status=True %s GROUP BY province ORDER BY num desc;' % (start_time, end_time, ('AND model_uni_name="%s"' % (model_name)) if model_name else '') province_logs = ConsumeInfoSubmitLogInfo.objects.raw(province_sql) province_logs = [{'province': log.province, 'num': log.num, 'code1': log.code1, 'code2': log.code2} for log in province_logs] return response(200, 'Get Consumer Statistic Success', u'获取消费者统计成功', data={ 'daily_logs': daily_logs, 'model_logs': model_logs, 'province_logs': province_logs, }) @check_admin def statistic_member(request, administrator): start_time = request.POST.get('start_time', '') end_time = request.POST.get('end_time', '') # 消费者统计 if start_time and end_time: start_time = datetime.strptime(start_time, '%Y%m%d') end_time = datetime.strptime(end_time + ' 23:59:59', '%Y%m%d %H:%M:%S') userinfos = UserInfo.objects.filter(test_user=False, level__gte=1, resgister_at__range=(start_time, end_time)) else: userinfos = UserInfo.objects.filter(test_user=False, level__gte=1, status=True) # 关注公众号数 mp_num = userinfos.filter(subscribe=True).count() # 领取保卡数 membercard_num = userinfos.filter(has_membercard=True).count() # 会员级别 level_logs = list(userinfos.values('level').annotate(num=Count('user_id'))) # 会员积分 integral_logs = list(userinfos.values('integral').annotate(num=Count('user_id'))) # 镜头数 shot_logs = list(userinfos.values('shots_num').annotate(num=Count('user_id'))) # 性别 sex_logs = list(userinfos.values('sex').annotate(num=Count('user_id'))) # 省份 province_logs = list(userinfos.values('province_name').annotate(num=Count('user_id')).order_by('-num')) return response(200, 'Get Consumer Statistic Success', u'获取消费者统计成功', data={ 'mp_num': mp_num, 'membercard_num': membercard_num, 'level_logs': level_logs, 'integral_logs': integral_logs, 'shot_logs': shot_logs, 'sex_logs': sex_logs, 'province_logs': province_logs, }) @check_admin def statistic_coupon(request, administrator): start_time = request.POST.get('start_time', '') end_time = request.POST.get('end_time', '') if start_time and end_time: start_time = datetime.strptime(start_time, '%Y%m%d') end_time = datetime.strptime(end_time + ' 23:59:59', '%Y%m%d %H:%M:%S') coupons = UserCouponInfo.objects.filter(active_at__range=(start_time, end_time), status=True) else: coupons = UserCouponInfo.objects.filter(status=True) froms_logs = list(coupons.values('coupon_from').annotate(num=Count('user_coupon_id'))) type_logs = list(coupons.values('coupon_title', 'coupon_value').annotate(num=Count('user_coupon_id'))) if start_time and end_time: used_coupons = UserCouponInfo.objects.filter(used_at__range=(start_time, end_time), status=True) else: used_coupons = UserCouponInfo.objects.filter(has_used=True, status=True) type_has_used_logs = list(used_coupons.values('coupon_title', 'coupon_value').annotate(num=Count('user_coupon_id'))) return response(200, 'Get Consumer Statistic Success', u'获取用户劵统计成功', data={ 'froms_logs': froms_logs, 'type_logs': type_logs, 'type_has_used_logs': type_has_used_logs, }) @check_admin def record_consumer(request, administrator): start_time = request.POST.get('start_time', '') end_time = request.POST.get('end_time', '') query = request.POST.get('query', '') dupload = request.POST.get('dupload', '') code_version = request.POST.get('code_version', 0) page = request.POST.get('page', 1) num = request.POST.get('num', 20) logs = ConsumeInfoSubmitLogInfo.objects.filter(Q(status=True) & Q(test_user=False) & (Q(model_name__icontains=query) | Q(phone__icontains=query) | Q(serialNo__icontains=query))).order_by('-pk') if dupload: logs = logs.filter(dupload=dupload) if code_version: logs = logs.filter(code_version=code_version) if start_time and end_time: logs = logs.filter(ymd__gte=start_time, ymd__lte=end_time) count = logs.count() logs, left = pagination(logs, page, num) logs = [log.admindata for log in logs] return response(200, 'Get Consumer Record Success', u'获取消费者销售记录成功', data={ 'logs': logs, 'count': count, 'left': left }) @check_admin def record_consumer_batch(request, administrator): logs = json.loads(request.POST.get('logs', '[]')) infos = [] unknows = [] for log in logs: try: infos.append(ConsumeInfoSubmitLogInfo.objects.get(model_name__icontains=log['model_name'], serialNo=log['code'], status=True, dupload=False).admindata) except ConsumeInfoSubmitLogInfo.DoesNotExist: unknows.append(log) return response(200, 'Batch Get Record Sale Success', u'批量获取销售员销售记录', data={ 'logs': infos, 'unknows': unknows }) @check_admin def record_sale(request, administrator): page = request.POST.get('page', 1) num = request.POST.get('num', 20) start_time = request.POST.get('start_time', '') end_time = request.POST.get('end_time', '') query = request.POST.get('query', '') dupload = request.POST.get('dupload', '') has_scan = request.POST.get('has_scan', '') code_version = request.POST.get('code_version', 0) is_online_sale = request.POST.get('is_online_sale', '') logs = SaleclerkSubmitLogInfo.objects.filter(Q(status=True) & Q(test_user=False) & Q(test_sn=False) & (Q(model_name__icontains=query) | Q(clerk_name__icontains=query) | Q(distributor_name__icontains=query) | Q(code__icontains=query))).order_by('-created_at') if dupload: logs = logs.filter(dupload=dupload) if code_version: logs = logs.filter(code_version=code_version) if has_scan: logs = logs.filter(has_scan=has_scan) if start_time and end_time: logs = logs.filter(ymd__gte=start_time, ymd__lte=end_time) if is_online_sale: logs = logs.filter(remark=('扫描条形码' if is_online_sale == '1' else '')) count = logs.count() logs, left = pagination(logs, page, num) logs = [log.admindata for log in logs] return response(200, 'Get Sale Record Success', u'获取销售员销售记录成功', data={ 'logs': logs, 'count': count, 'left': left }) @check_admin def record_sale_batch(request, administrator): logs = json.loads(request.POST.get('logs', '[]')) infos = [] unknows = [] for log in logs: try: infos.append(SaleclerkSubmitLogInfo.objects.get(model_name__icontains=log['model_name'], code=log['code'], status=True, dupload=False).admindata) except SaleclerkSubmitLogInfo.DoesNotExist: unknows.append(log) return response(200, 'Batch Get Record Sale Success', u'批量获取销售员销售记录', data={ 'logs': infos, 'unknows': unknows }) @check_admin def model_list(request, administrator): infos = list(ModelInfo.objects.filter(status=True).values_list('model_uni_name', flat=True).distinct().order_by('model_uni_name')) return response(200, 'Get Model List Success', u'获取型号列表成功', data={ 'models': infos }) @check_admin def distributor_list(request, administrator): infos = list(DistributorInfo.objects.filter(status=True).values_list('distributor_name', flat=True).distinct().order_by('distributor_name')) return response(200, 'Get Model List Success', u'获取经销商列表成功', data={ 'distributors': infos }) @check_admin def member_goods_order(request, administrator): query = request.POST.get('query', '') good_type = request.POST.get('good_type', '') page = request.POST.get('page', 1) num = request.POST.get('num', 20) order_status = int(request.POST.get('order_status', 0)) start_time = request.POST.get('start_time', '') end_time = request.POST.get('end_time', '') orders = GoodsOrderInfo.objects.filter(Q(phone__icontains=query) | Q(user_id=query) | Q(title__icontains=query) & Q(status=True)).order_by('-pk') if good_type: orders = orders.filter(good_type=good_type) if start_time and end_time: start_time = datetime.strptime(start_time, '%Y%m%d') end_time = datetime.strptime(end_time + ' 23:59:59', '%Y%m%d %H:%M:%S') orders = orders.filter(created_at__range=(start_time, end_time)) # 未发货,即快递单号为空 if order_status == 1: orders = orders.filter(Q(tracking_number__isnull=True) | Q(tracking_number='')) elif order_status == 2: orders = orders.filter(tracking_number__isnull=False).exclude(tracking_number='') count = orders.count() orders, left = pagination(orders, page, num) orders = [order.admindata for order in orders] return response(200, 'Get Member Goods Order List Success', u'获取会员商品订单列表成功', data={ 'orders': orders, 'left': left, 'count': count }) @check_admin def member_goods_order_update(request, administrator): order_id = request.POST.get('order_id', '') tracking_number = request.POST.get('tracking_number', '') remark = request.POST.get('remark', u'您的礼品正在快马加鞭赶来,请耐心等待呦~') if not send_trackingNumber_message(order_id, tracking_number, remark): return response(400001, 'Member Goods Order Update Failure', u'会员商品订单修改失败') return response(200, 'Member Goods Order Update Success', u'会员商品订单修改成功') @check_admin def member_goods_order_batch_update(request, administrator): orders = json.loads(request.POST.get('orders', '[]')) err_orders = [] for order in orders: if not send_trackingNumber_message(order.get('order_id', ''), order.get('tracking_number', ''), order.get('remark', u'您的礼品正在快马加鞭赶来,请耐心等待呦~')): err_orders.append(order.get('order_id', '')) if err_orders: return response(40001, 'Member Goods Order Update Error', u'部分会员商品订单修改失败', data={ 'orders': err_orders }) return response(200, 'Member Goods Order Update Success', u'会员商品订单修改成功') def send_trackingNumber_message(order_id, tracking_number, remark): try: order = GoodsOrderInfo.objects.get(order_id=order_id, status=True) order.remark = remark order.tracking_number = tracking_number if tracking_number and order.good_type == GoodsInfo.PHYSICAL and not order.has_send_template_message: order.has_send_template_message = True # 校验用户是否存在 user = UserInfo.objects.get(user_id=order.user_id) data = { "thing6": { "value": order.title, "color": "#173177" }, "character_string7": { "value": tracking_number, "color": "#173177" }, "number2": { "value": order.integral, "color": "#173177" }, "thing5": { "value": order.remark, "color": "#173177" }, } res = sendwxasubscribemessage(openid=user.openid_miniapp, template_id=settings.TEMPLATE_ID_TRACKING, data=data, miniprogram_state=None, lang=None, page=None) order.send_template_message_res = json.dumps(res) order.save() return True except Exception: return False @check_admin def record_warehouse(request, administrator): model_name = request.POST.get('model_name', '') sn = request.POST.get('sn', '') start_time = request.POST.get('start_time', '') end_time = request.POST.get('end_time', '') page = request.POST.get('page', 1) num = request.POST.get('num', 20) models = ModelInfo.objects.filter(model_name__icontains=model_name, status=True).values_list('pk', flat=True) logs = MchInfoEncryptLogInfo.objects.filter(model_pk__in=models, sn__icontains=sn, status=True) if start_time and end_time: start_time = datetime.strptime(start_time, '%Y%m%d') end_time = datetime.strptime(end_time + ' 23:59:59', '%Y%m%d %H:%M:%S') logs = logs.filter(created_at__range=(start_time, end_time)) logs = logs.order_by('-pk') count = logs.count() logs, left = pagination(logs, page, num) logs = [log.admindata for log in logs] return response(200, 'Get Warehouse Record Success', u'获取入库记录成功', data={ 'logs': logs, 'left': left, 'count': count }) @check_admin def member_activity_list(request, administrator): activity_type = request.POST.get('activity_type', '') title = request.POST.get('title', '') start_time = request.POST.get('start_time', '') end_time = request.POST.get('end_time', '') page = request.POST.get('page', 1) num = request.POST.get('num', 20) logs = MemberActivityInfo.objects.filter(status=True) if activity_type: logs = logs.filter(activity_type=activity_type) if title: logs = logs.filter(title__icontains=title) if start_time and end_time: start_time = datetime.strptime(start_time, '%Y%m%d') end_time = datetime.strptime(end_time + ' 23:59:59', '%Y%m%d %H:%M:%S') logs = logs.filter(created_at__range=(start_time, end_time)) logs = logs.order_by('-pk') count = logs.count() logs, left = pagination(logs, page, num) logs = [log.admindata for log in logs] return response(200, 'Get Member Activity Record Success', u'获取会员活动成功', data={ 'logs': logs, 'left': left, 'count': count }) @check_admin def member_activity_detail(request, administrator): activity_id = request.POST.get('activity_id', '') try: log = MemberActivityInfo.objects.get(activity_id=activity_id) except MemberActivityInfo.DoesNotExist: return response(MemberActivityStatusCode.ACTIVITY_NOT_FOUND) return response(200, 'Get Member Activity Record Details Success', u'获取会员活动详情成功', data={ 'log': log.admindetails, }) @check_admin def member_activity_update(request, administrator): activity_id = request.POST.get('activity_id', '') activity_type = int(request.POST.get('activity_type', 0)) title = request.POST.get('title', '') subtitle = request.POST.get('subtitle', '') start_date = tc.to_date(request.POST.get('start_date', '') or settings.DEFAULT_START_DATE) end_date = date = tc.to_date(request.POST.get('end_date', '') or settings.DEFAULT_END_DATE) start_display_date = tc.to_date(request.POST.get('start_display_date', '') or settings.DEFAULT_START_DATE) end_display_date = tc.to_date(request.POST.get('end_display_date', '') or settings.DEFAULT_END_DATE) city = request.POST.get('city', '') location = request.POST.get('location', '') integral = int(request.POST.get('integral', 0)) is_slider = request.POST.get('is_slider', 0) slider_image_path = request.POST.get('banner_path', '') or request.POST.get('slider_image_path', '') cover_path = request.POST.get('cover_path', '') # image_path = request.POST.get('image_path', '') or request.POST.get('banner_path', '') limit_image_num = int(request.POST.get('limit_image_num', 3)) is_signup = request.POST.get('is_signup', 0) group_share_max_integral = int(request.POST.get('share_max_integral', 0)) group_share_integral = int(request.POST.get('share_integral', 0)) content_rich_text = request.POST.get('content_rich_text', '') share_h5_link = request.POST.get('share_h5_link', '') activity_state = int(request.POST.get('activity_state', 0)) poster_kv_img_url = request.POST.get('poster_kv_img_url', '') poster_content = request.POST.get('poster_content', '') contribution_content_placeholder = request.POST.get('contribution_content_placeholder', '') try: log = MemberActivityInfo.objects.get(activity_id=activity_id, status=True) except MemberActivityInfo.DoesNotExist: return response(MemberActivityStatusCode.ACTIVITY_NOT_FOUND) log.activity_type = activity_type log.title = title log.subtitle = subtitle log.date = date log.start_date = start_date log.end_date = end_date log.start_display_date = start_display_date log.end_display_date = end_display_date log.city = city log.location = location log.integral = integral log.is_slider = is_slider log.slider_image = slider_image_path log.cover = cover_path # log.image = image_path log.limit_image_num = limit_image_num log.is_signup = is_signup log.group_share_integral = group_share_integral log.group_share_max_integral = group_share_max_integral log.content_rich_text = content_rich_text log.share_h5_link = share_h5_link log.activity_state = activity_state log.poster_kv_img_url = poster_kv_img_url log.poster_content = poster_content log.contribution_content_placeholder = contribution_content_placeholder log.save() return response(200, 'MemberActivityInfo Update Success', u'会员活动更新成功') @check_admin def member_activity_create(request, administrator): activity_type = int(request.POST.get('activity_type', 0)) title = request.POST.get('title', '') subtitle = request.POST.get('subtitle', '') start_date = tc.to_date(request.POST.get('start_date', '') or settings.DEFAULT_START_DATE) end_date = date = tc.to_date(request.POST.get('end_date', '') or settings.DEFAULT_END_DATE) start_display_date = tc.to_date(request.POST.get('start_display_date', '') or settings.DEFAULT_START_DATE) end_display_date = tc.to_date(request.POST.get('end_display_date', '') or settings.DEFAULT_END_DATE) city = request.POST.get('city', '') location = request.POST.get('location', '') integral = int(request.POST.get('integral', 0)) is_slider = request.POST.get('is_slider', 0) slider_image_path = request.POST.get('banner_path', '') or request.POST.get('slider_image_path', '') cover_path = request.POST.get('cover_path', '') # image_path = request.POST.get('image_path', '') or request.POST.get('banner_path', '') limit_image_num = int(request.POST.get('limit_image_num', 3)) is_signup = request.POST.get('is_signup', 0) group_share_max_integral = int(request.POST.get('share_max_integral', 0)) group_share_integral = int(request.POST.get('share_integral', 0)) content_rich_text = request.POST.get('content_rich_text', '') share_h5_link = request.POST.get('share_h5_link', '') activity_state = int(request.POST.get('activity_state', 0)) poster_kv_img_url = request.POST.get('poster_kv_img_url', '') poster_content = request.POST.get('poster_content', '') contribution_content_placeholder = request.POST.get('contribution_content_placeholder', '') act = MemberActivityInfo.objects.create( brand_id=administrator.brand_id, activity_type=activity_type, title=title, subtitle=subtitle, date=date, start_date=start_date, end_date=end_date, start_display_date=start_display_date, end_display_date=end_display_date, city=city, location=location, integral=integral, is_slider=is_slider, slider_image=slider_image_path, cover=cover_path, # image=image_path, limit_image_num=limit_image_num, is_signup=is_signup, group_share_max_integral=group_share_max_integral, group_share_integral=group_share_integral, content_rich_text=content_rich_text, share_h5_link=share_h5_link, activity_state=activity_state, poster_kv_img_url=poster_kv_img_url, poster_content=poster_content, contribution_content_placeholder=contribution_content_placeholder, ) return response(200, 'MemberActivityInfo Create Success', u'会员活动创建成功', data={ 'activity': act.admindetails }) @check_admin def member_activity_share_list(request, administrator): activity_id = request.POST.get('activity_id', '') page = int(request.POST.get('page', 1)) num = int(request.POST.get('num', 20)) logs = MemberActivityGroupShareInfo.objects.filter(activity_id=activity_id, status=True) total_integral = logs.aggregate(Sum('integral'))['integral__sum'] logs = logs.values('share_user_id').annotate(integral_sum=Sum('integral'), group_count=Count('open_gid'), user_count=Count('click_user_id')).order_by('-user_count') count = logs.count() logs, left = pagination(logs, page, num) return response(200, 'Get Member Activity Record Success', u'获取会员活动成功', data={ 'logs': list(logs), 'count': count, 'left': left, 'total_integral': total_integral }) @check_admin def member_activity_register_list(request, administrator): activity_id = request.POST.get('activity_id', '') page = int(request.POST.get('page', 1)) num = int(request.POST.get('num', 20)) logs = MemberActivitySignupInfo.objects.filter(activity_id=activity_id, status=True) count = logs.count() logs, left = pagination(logs, page, num) logs = [log.admindata for log in logs] return response(200, 'Get Member Activity Record Success', u'获取会员活动成功', data={ 'logs': list(logs), 'count': count, 'left': left, }) @logit @check_admin def member_activity_contribute_list(request, administrator): brand_id = request.POST.get('brand_id', settings.KODO_DEFAULT_BRAND_ID) activity_id = request.POST.get('activity_id', '') content_type = get_query_value(request, 'content_type', val_cast_type='int') audit_status = request.POST.get('audit_status', '') is_selected = request.POST.get('is_selected', '') query = request.POST.get('query', '') page = request.POST.get('page', 1) num = request.POST.get('num', 20) contributions = MemberActivityContributionInfo.objects.filter(activity_id=activity_id, status=True) if 'content_type' in request.POST: contributions = contributions.filter(content_type=content_type) if audit_status != '': contributions = contributions.filter(audit_status=audit_status) if is_selected != '': contributions = contributions.filter(is_selected=is_selected) if query: contributions = contributions.filter(Q(title__icontains=query) | Q(user_name__icontains=query)) contributions = contributions.order_by('-pk') count = contributions.count() contributions, left = pagination(contributions, page, num) contributions = [contribution.admindata for contribution in contributions] return response(data={ 'contributions': contributions, 'left': left, 'count': count }) @check_admin @transaction.atomic def member_activity_contribute_audit(request, administrator): contribution_id = request.POST.get('contribution_id', '') audit_status = get_query_value(request, 'audit_status', val_cast_type='int') try: contribution = MemberActivityContributionInfo.objects.select_for_update().get(contribution_id=contribution_id, status=True) except MemberActivityContributionInfo.DoesNotExist: return response(MemberActivityContributionStatusCode.ACTIVITY_CONTRIBUTION_NOT_FOUND) contribution.audit_status = audit_status contribution.save() return response(200, 'Member Activity Contribution Audit Success', u'会员活动投稿审批成功') @check_admin @transaction.atomic def member_activity_contribute_selected(request, administrator): contribution_id = request.POST.get('contribution_id', '') selected = get_query_value(request, 'selected', val_cast_type='int') try: contribution = MemberActivityContributionInfo.objects.select_for_update().get(contribution_id=contribution_id, status=True) except MemberActivityContributionInfo.DoesNotExist: return response(MemberActivityContributionStatusCode.ACTIVITY_CONTRIBUTION_NOT_FOUND) contribution.is_selected = selected contribution.save() return response(200, 'Member Activity Contribution Selected Success', u'会员活动投稿入围成功') @check_admin def member_activity_contribute_welfare_list(request, administrator): welfare_type = request.POST.get('welfare_type', '') welfare_title = request.POST.get('welfare_title', '') page = request.POST.get('page', 1) num = request.POST.get('num', 20) welfares = MemberActivityContributionWelfareInfo.objects.filter(status=True) if welfare_type: welfares = welfares.filter(welfare_type=welfare_type) if welfare_title: welfares = welfares.filter(welfare_title__icontains=welfare_title) welfares = welfares.order_by('-pk') count = welfares.count() welfares, left = pagination(welfares, page, num) welfares = [welfare.data for welfare in welfares] return response(200, 'Get Member Activity Contribute Welfare List Success', u'获取会员活动投稿福利列表成功', data={ 'welfares': welfares, 'left': left, 'count': count }) @check_admin def member_activity_contribute_welfare_detail(request, administrator): welfare_id = request.POST.get('welfare_id', '') try: welfare = MemberActivityContributionWelfareInfo.objects.get(welfare_id=welfare_id) except MemberActivityContributionWelfareInfo.DoesNotExist: return response(MemberActivityContributionWelfareStatusCode.ACTIVITY_CONTRIBUTION_WELFARE_NOT_FOUND) return response(200, 'Get Member Activity Contribute Welfare Detail Success', u'获取会员活动投稿福利详情成功', data={ 'welfare': welfare.data, }) @check_admin def member_activity_contribute_welfare_update(request, administrator): activity_id = request.POST.get('activity_id', '') welfare_id = request.POST.get('welfare_id', '') welfare_type = int(request.POST.get('welfare_type', 0)) welfare_title = request.POST.get('welfare_title', '') welfare_detail = request.POST.get('welfare_detail', '') welfare_value = request.POST.get('welfare_value', 0) welfare_image_path = request.POST.get('welfare_image_path', '') try: welfare = MemberActivityContributionWelfareInfo.objects.get(welfare_id=welfare_id, status=True) except MemberActivityContributionWelfareInfo.DoesNotExist: return response(MemberActivityContributionWelfareStatusCode.ACTIVITY_CONTRIBUTION_WELFARE_NOT_FOUND) welfare.activity_id = activity_id welfare.welfare_type = welfare_type welfare.welfare_title = welfare_title welfare.welfare_detail = welfare_detail welfare.welfare_value = welfare_value if welfare_value else 0 welfare.welfare_image = welfare_image_path welfare.save() return response(200, 'Update Member Activity Contribute Welfare Success', u'更新会员活动投稿福利成功') @check_admin def member_activity_contribute_welfare_create(request, administrator): activity_id = request.POST.get('activity_id', '') welfare_type = int(request.POST.get('welfare_type', 0)) welfare_title = request.POST.get('welfare_title', '') welfare_detail = request.POST.get('welfare_detail', '') welfare_value = request.POST.get('welfare_value', 0) welfare_image_path = request.POST.get('welfare_image_path', None) MemberActivityContributionWelfareInfo.objects.create( brand_id=administrator.brand_id, activity_id=activity_id, welfare_type=welfare_type, welfare_title=welfare_title, welfare_detail=welfare_detail, welfare_value=welfare_value if welfare_value else 0, welfare_image=welfare_image_path, ) return response(200, 'Create Member Activity Contribute Welfare Success', u'创建会员活动投稿福利成功') @check_admin def member_activity_contribute_welfare_delete(request, administrator): welfare_id = request.POST.get('welfare_id', '') try: welfare = MemberActivityContributionWelfareInfo.objects.get(welfare_id=welfare_id, status=True) except MemberActivityContributionWelfareInfo.DoesNotExist: return response(MemberActivityContributionWelfareStatusCode.ACTIVITY_CONTRIBUTION_WELFARE_NOT_FOUND) welfare.status = False welfare.save() return response(200, 'Delete Member Activity Contribute Welfare Success', u'删除会员活动投稿福利成功') @check_admin def member_activity_contribute_welfare_unlock(request, administrator): admin_id = request.POST.get('admin_id', '') contribution_id = request.POST.get('contribution_id', '') welfare_id = request.POST.get('welfare_id', '') try: contribution = MemberActivityContributionInfo.objects.get(contribution_id=contribution_id, status=True) except MemberActivityContributionInfo.DoesNotExist: return response(MemberActivityContributionStatusCode.ACTIVITY_CONTRIBUTION_NOT_FOUND) try: welfare = MemberActivityContributionWelfareInfo.objects.get(welfare_id=welfare_id, status=True) except MemberActivityContributionWelfareInfo.DoesNotExist: return response(MemberActivityContributionWelfareStatusCode.ACTIVITY_CONTRIBUTION_WELFARE_NOT_FOUND) unlocking_info, _ = MemberActivityContributionWelfareUnlockingInfo.objects.get_or_create( brand_id=administrator.brand_id, user_id=contribution.user_id, activity_id=contribution.activity_id, welfare_id=welfare_id, defaults={ 'admin_id': admin_id, 'contribution_id': contribution_id, 'welfare_type': welfare.welfare_type, 'welfare_value': welfare.welfare_value, } ) # Send template_message try: user = UserInfo.objects.get(user_id=contribution.user_id, status=True) except UserInfo.DoesNotExist: return response(UserStatusCode.USER_NOT_FOUND) try: act = MemberActivityInfo.objects.get(activity_id=contribution.activity_id, status=True) except MemberActivityInfo.DoesNotExist: return (MemberActivityStatusCode.ACTIVITY_NOT_FOUND) data = { "first": { "value": u'你的活动福利已解锁。', "color": "#173177" }, "keyword1": { "value": act.title, "color": "#173177" }, "keyword2": { "value": welfare.welfare_title, "color": "#173177" }, "remark": { "value": u'请点击详情填写收货地址。' if welfare.welfare_type == 0 else u'请点击详情进入小程序,收取福利。', "color": "#173177" } } wxcfg = WECHAT.get('MINIAPP', {}) appid = wxcfg.get('appID') sendtemplatemessage(openid=user.openid, template_id=settings.TEMPLATE_ID_UNLOCKING_WELFARE, data=data, miniappid=appid, minipagepath='/pages/member/activity/activity?unlocking_id={}'.format(unlocking_info.unlocking_id)) return response(200, 'Unlock Member Activity Contribute Welfare Success', u'解锁会员活动投稿福利成功') @logit @check_admin def member_activity_contribute_welfare_unlocking_list(request, administrator): user_id = request.POST.get('user_id', '') activity_id = request.POST.get('activity_id', '') contribution_id = request.POST.get('contribution_id', '') welfare_id = request.POST.get('welfare_id', '') page = request.POST.get('page', 1) num = request.POST.get('num', 20) unlockings = MemberActivityContributionWelfareUnlockingInfo.objects.filter(status=True) if user_id: unlockings = unlockings.filter(user_id=user_id) if activity_id: unlockings = unlockings.filter(activity_id=activity_id) if contribution_id: unlockings = unlockings.filter(contribution_id=contribution_id) if welfare_id: unlockings = unlockings.filter(welfare_id=welfare_id) unlockings = unlockings.order_by('-pk') count = unlockings.count() unlockings, left = pagination(unlockings, page, num) unlockings = [unlocking.data for unlocking in unlockings] return response(data={ 'unlockings': unlockings, 'left': left, 'count': count, }) @logit @check_admin def member_activity_contribute_welfare_unlocking_detail(request, administrator): unlocking_id = request.POST.get('unlocking_id', '') try: unlocking = MemberActivityContributionWelfareUnlockingInfo.objects.get(unlocking_id=unlocking_id, status=True) except MemberActivityContributionWelfareUnlockingInfo.DoesNotExist: return response(MemberActivityContributionWelfareUnblockingStatusCode.ACTIVITY_CONTRIBUTION_WELFARE_UNBLOCKING_NOT_FOUND) return response(data=unlocking.data) @logit @check_admin @transaction.atomic def member_activity_contribute_welfare_unlocking_update(request, administrator): unlocking_id = request.POST.get('unlocking_id', '') name = request.POST.get('name', '') phone = request.POST.get('phone', '') address = request.POST.get('address', '') tracking_number = request.POST.get('tracking_number', '') try: unlocking = MemberActivityContributionWelfareUnlockingInfo.objects.select_for_update().get(unlocking_id=unlocking_id, status=True) except MemberActivityContributionWelfareUnlockingInfo.DoesNotExist: return response(MemberActivityContributionWelfareUnblockingStatusCode.ACTIVITY_CONTRIBUTION_WELFARE_UNBLOCKING_NOT_FOUND) if name: unlocking.name = name if phone: unlocking.phone = phone if address: unlocking.address = address if tracking_number: unlocking.tracking_number = tracking_number unlocking.save() return response(200, 'Update Member Activity Contribute Welfare Unblocking Success', u'更新会员活动投稿福利解锁成功') @logit @check_admin @transaction.atomic def member_activity_contribute_welfare_unlocking_delete(request, administrator): unlocking_id = request.POST.get('unlocking_id', '') try: unlocking = MemberActivityContributionWelfareUnlockingInfo.objects.select_for_update().get(unlocking_id=unlocking_id, status=True) except MemberActivityContributionWelfareUnlockingInfo.DoesNotExist: return response(MemberActivityContributionWelfareUnblockingStatusCode.ACTIVITY_CONTRIBUTION_WELFARE_UNBLOCKING_NOT_FOUND) unlocking.status = False unlocking.save() return response(200, 'Delete Member Activity Contribute Welfare Unblocking Success', u'删除会员活动投稿福利解锁成功') @check_admin def coupon_list(request, administrator): title = request.POST.get('title', '') start_time = request.POST.get('start_time', '') end_time = request.POST.get('end_time', '') page = request.POST.get('page', 1) num = request.POST.get('num', 20) logs = CouponInfo.objects.filter(coupon_title__icontains=title, status=True) if start_time and end_time: start_time = datetime.strptime(start_time, '%Y%m%d') end_time = datetime.strptime(end_time + ' 23:59:59', '%Y%m%d %H:%M:%S') logs = logs.filter(created_at__range=(start_time, end_time)) logs = logs.order_by('-pk') count = logs.count() logs, left = pagination(logs, page, num) logs = [log.admindata for log in logs] return response(200, 'Get CouponInfo List Success', u'获取劵列表成功', data={ 'logs': logs, 'left': left, 'count': count }) @check_admin def coupon_detail(request, administrator): coupon_id = request.POST.get('coupon_id', '') try: log = CouponInfo.objects.get(coupon_id=coupon_id) except CouponInfo.DoesNotExist: return response(CouponStatusCode.COUPON_NOT_FOUND) log = log.admindetails return response(200, 'Get Member Activity Record Details Success', u'获取会员活动详情成功', data={ 'log': log, }) @check_admin def coupon_create(request, administrator): coupon_title = request.POST.get('coupon_title', '') coupon_detail = request.POST.get('coupon_detail', '') coupon_value = int(request.POST.get('coupon_value', 0)) coupon_image = request.POST.get('coupon_image', '') coupon_expire_type = int(request.POST.get('coupon_expire_type', 0)) coupon_valid_period = int(request.POST.get('coupon_valid_period', 0)) coupon_expire_at = request.POST.get('coupon_expire_at', '') is_coupon_admin_writeoff = int(request.POST.get('is_coupon_admin_writeoff', 1)) info = CouponInfo.objects.create( brand_id=administrator.brand_id, coupon_title=coupon_title, coupon_detail=coupon_detail, coupon_value=coupon_value, coupon_image=coupon_image, coupon_expire_type=coupon_expire_type, coupon_valid_period=coupon_valid_period, is_coupon_admin_writeoff=is_coupon_admin_writeoff, ) if coupon_expire_at: info.coupon_expire_at = datetime.strptime(coupon_expire_at + ' 23:59:59', '%Y-%m-%d %H:%M:%S') info.save() return response(200, 'CouponInfo Create Success', u'劵创建成功') @check_admin def coupon_update(request, administrator): coupon_id = request.POST.get('coupon_id', '') coupon_title = request.POST.get('coupon_title', '') coupon_detail = request.POST.get('coupon_detail', '') coupon_value = int(request.POST.get('coupon_value', 0)) coupon_image = request.POST.get('coupon_image', '') coupon_expire_type = int(request.POST.get('coupon_expire_type', 0)) coupon_valid_period = int(request.POST.get('coupon_valid_period', 0)) coupon_expire_at = request.POST.get('coupon_expire_at', '') is_coupon_admin_writeoff = int(request.POST.get('is_coupon_admin_writeoff', 1)) try: log = CouponInfo.objects.get(coupon_id=coupon_id, status=True) except CouponInfo.DoesNotExist: return response(CouponStatusCode.COUPON_NOT_FOUND) log.brand_id = administrator.brand_id log.coupon_title = coupon_title log.coupon_detail = coupon_detail log.coupon_value = coupon_value log.coupon_image = coupon_image log.coupon_expire_type = coupon_expire_type log.coupon_valid_period = coupon_valid_period if coupon_expire_at: log.coupon_expire_at = datetime.strptime(coupon_expire_at + ' 23:59:59', '%Y-%m-%d %H:%M:%S') log.is_coupon_admin_writeoff = is_coupon_admin_writeoff log.save() return response(200, 'CouponInfo Update Success', u'劵更新成功') @check_admin def coupon_delete(request, administrator): coupon_id = request.POST.get('activity_id', '') try: log = CouponInfo.objects.get(coupon_id=coupon_id, status=True) except CouponInfo.DoesNotExist: return response(CouponStatusCode.COUPON_NOT_FOUND) log.status = False log.save() return response(200, 'CouponInfo Delete Success', u'劵删除成功') @check_admin def member_goods_list(request, administrator): title = request.POST.get('title', '') page = request.POST.get('page', 1) num = request.POST.get('num', 20) logs = GoodsInfo.objects.filter(title__icontains=title, only_for_member=False).order_by('-pk') count = logs.count() logs, left = pagination(logs, page, num) logs = [log.admindata for log in logs] return response(200, 'Get Member Goods Success', u'获取会员商品成功', data={ 'logs': logs, 'left': left, 'count': count }) @check_admin def member_goods_detail(request, administrator): good_id = request.POST.get('good_id', '') try: log = GoodsInfo.objects.get(good_id=good_id) except GoodsInfo.DoesNotExist: return response(MemberGoodStatusCode.GOOD_NOT_FOUND) log = log.admindetails return response(200, 'Get Member Goods Details Success', u'获取积分商品详情成功', data={ 'log': log, }) @check_admin def member_goods_update(request, administrator): good_id = request.POST.get('good_id', '') title = request.POST.get('title', '') desc = request.POST.get('desc', '') value = int(request.POST.get('value', 0)) left_num = int(request.POST.get('left_num', 0)) image = request.POST.get('image_path', '') coupon_id = request.POST.get('coupon_id', '') slider_image = request.POST.get('slider_path', '') integral = int(request.POST.get('integral', 0)) fee = int(request.POST.get('fee', 0)) try: log = GoodsInfo.objects.get(good_id=good_id, status=True) except GoodsInfo.DoesNotExist: return response(MemberGoodStatusCode.GOOD_NOT_FOUND) log.title = title log.desc = desc log.value = value log.left_num = left_num log.image = image log.coupon_id = coupon_id log.slider_image = slider_image log.integral = integral log.fee = fee log.save() return response(200, 'GoodsInfo Update Success', u'积分商品更新成功') @check_admin def member_goods_create(request, administrator): good_type = int(request.POST.get('good_type', 0)) title = request.POST.get('title', '') desc = request.POST.get('desc', '') value = int(request.POST.get('value', 0)) left_num = int(request.POST.get('left_num', 0)) image = request.POST.get('image_path', '') coupon_id = request.POST.get('coupon_id', '') slider_image = request.POST.get('slider_path', '') integral = int(request.POST.get('integral', 0)) fee = int(request.POST.get('fee', 0)) GoodsInfo.objects.create( brand_id=administrator.brand_id, good_type=good_type, title=title, desc=desc, value=value, left_num=left_num, image=image, coupon_id=coupon_id, slider_image=slider_image, integral=integral, fee=fee, ) return response(200, 'GoodsInfo Create Success', u'积分商品创建成功') @check_admin def complement_code_list(request, administrator): start_time = request.POST.get('start_time', '') end_time = request.POST.get('end_time', '') type_ = request.POST.get('type', '') query = request.POST.get('query', '') page = request.POST.get('page', 1) num = request.POST.get('num', 20) logs = ComplementCodeLogInfo.objects.filter(status=True) if start_time and end_time: start_time = datetime.strptime(start_time, '%Y%m%d') end_time = datetime.strptime(end_time + ' 23:59:59', '%Y%m%d %H:%M:%S') logs = logs.filter(created_at__range=(start_time, end_time)) if type_ == 'todo': logs = logs.filter(audit_status=ComplementCodeLogInfo.AUDIT_TODO) elif type_ == 'pass': logs = logs.filter(audit_status=ComplementCodeLogInfo.AUDIT_PASS) elif type_ == 'refused': logs = logs.filter(audit_status=ComplementCodeLogInfo.AUDIT_REFUSED) logs = logs.order_by('audit_status', '-pk') if query: logs = logs.filter(Q(phone=query) | Q(name__icontains=query) | Q(sn=query)) count = logs.count() logs, left = pagination(logs, page, num) logs = [log.data for log in logs] return response(200, 'Get Complement Code List Success', u'获取补码列表成功', data={ 'logs': logs, 'left': left, 'count': count }) @check_admin @transaction.atomic def complement_code_audit(request, administrator): brand_id = request.POST.get('brand_id', settings.KODO_DEFAULT_BRAND_ID) admin_id = request.POST.get('admin_id', '') log_id = request.POST.get('log_id', '') audit_status = int(request.POST.get('audit_status', 0)) # -1 审核不通过, 1 审核通过 if audit_status not in [ComplementCodeLogInfo.AUDIT_REFUSED, ComplementCodeLogInfo.AUDIT_PASS]: return response(ComplementCodeStatusCode.COMPLEMENT_CODE_STATUS_INVALID) try: log = ComplementCodeLogInfo.objects.select_for_update().get(log_id=log_id, status=True) except ComplementCodeLogInfo.DoesNotExist: return response(ComplementCodeStatusCode.COMPLEMENT_CODE_NOT_FOUND) if log.audit_status != ComplementCodeLogInfo.AUDIT_TODO: return response(ComplementCodeStatusCode.COMPLEMENT_CODE_HAS_AUDITED) log.audit_status = audit_status log.save() # 如果"审核通过" if log.audit_status == ComplementCodeLogInfo.AUDIT_PASS: try: brand = BrandInfo.objects.get(brand_id=brand_id) except BrandInfo.DoesNotExist: brand = None try: model = ModelInfo.objects.get(model_id=log.model_id) except ModelInfo.DoesNotExist: model = None # brand_id#model_id#distributor_id#sn#time # AAAA#AAAAAA#AAAAA#AAAAAAAAAAAAAA#180224 # brand_pk, model_pk, distributor_pk, sn, time = plaintext.split('#') plaintext = '{}#{}#{}#{}#{}'.format( brand.pk if brand else 0, model.pk if model else 0, 0, log.sn, tc.local_string(format='%Y%m%d')[2:], ) ciphertext = get_ciphertext(plaintext, admin_id, True) log.ciphertext = ciphertext log.save() try: user = UserInfo.objects.get(user_id=log.user_id, status=True) except UserInfo.DoesNotExist: return response(UserStatusCode.USER_NOT_FOUND) # Send template_message data = { "first": { "value": u'你的补码申请已通过,请点击消息绑定您的电子保修卡', "color": "#173177" }, "keyword1": { "value": log.name, "color": "#173177" }, "keyword2": { "value": log.model_name, "color": "#173177" }, "keyword3": { "value": log.sn, "color": "#173177" }, "remark": { "value": u'感谢您的使用', "color": "#173177" } } wxcfg = WECHAT.get('MINIAPP', {}) appid = wxcfg.get('appID') sendtemplatemessage(openid=user.openid, template_id=settings.TEMPLATE_ID_COMPLEMENT, data=data, miniappid=appid, minipagepath='/pages/register/consumer/consumer?q={}&marketcode=1'.format(ciphertext)) return response(data={ 'ciphertext': ciphertext, }) return response() @check_admin @transaction.atomic def complement_code_contacted(request, administrator): log_id = request.POST.get('log_id', '') is_contacted = int(request.POST.get('is_contacted', 0)) # 0 未联系, 1 已联系 try: log = ComplementCodeLogInfo.objects.select_for_update().get(log_id=log_id, status=True) except ComplementCodeLogInfo.DoesNotExist: return response(ComplementCodeStatusCode.COMPLEMENT_CODE_NOT_FOUND) log.is_contacted = is_contacted log.save() return response() @check_admin def administrator_list(request, administrator): page = request.POST.get('page', 1) num = request.POST.get('num', 20) if administrator.admin_type != AdministratorInfo.ADMINISTRATOR: return response(AdministratorStatusCode.ADMINISTRATOR_PERMISSION_DENIED) logs = AdministratorInfo.objects.filter(status=True).order_by('-created_at') count = logs.count() logs, left = pagination(logs, page, num) logs = [log.admindata for log in logs] return response(200, 'Get Admin List Success', u'获取后台管理员成功', data={ 'logs': logs, 'left': left, 'count': count }) @check_admin def administrator_create(request, administrator): admin_type = request.POST.get('admin_type', '') phone = request.POST.get('phone', '') name = request.POST.get('name', '') password = request.POST.get('password', '') brand_name = request.POST.get('brand_name', '') if administrator.admin_type != AdministratorInfo.ADMINISTRATOR: return response(AdministratorStatusCode.ADMINISTRATOR_PERMISSION_DENIED) encryption = make_password(strip(password), settings.MAKE_PASSWORD_SALT, settings.MAKE_PASSWORD_HASHER) AdministratorInfo.objects.create( brand_id=administrator.brand_id, brand_name=brand_name or administrator.brand_name, admin_type=admin_type, phone=phone, name=name, password='', encryption=encryption, ) return response(200, 'Create Admin Success', u'创建后台管理员成功') @check_admin def administrator_update(request, administrator): target_admin_id = request.POST.get('target_admin_id', '') admin_type = int(request.POST.get('admin_type', -1)) phone = request.POST.get('phone', '') name = request.POST.get('name', '') password = request.POST.get('password', '') if administrator.admin_type != AdministratorInfo.ADMINISTRATOR: return response(AdministratorStatusCode.ADMINISTRATOR_PERMISSION_DENIED) target_admin = AdministratorInfo.objects.get(admin_id=target_admin_id, status=True) if admin_type != -1: target_admin.admin_type = admin_type if phone: target_admin.phone = phone if name: target_admin.name = name AdministratorLoginLogInfo.objects.filter(admin_id=target_admin_id).update(admin_name=name) if password: encryption = make_password(strip(password), settings.MAKE_PASSWORD_SALT, settings.MAKE_PASSWORD_HASHER) target_admin.encryption = encryption target_admin.save() return response(200, 'Update Admin Success', u'更新后台管理员成功') @check_admin def administrator_delete(request, administrator): target_admin_id = request.POST.get('target_admin_id', '') if administrator.admin_type != AdministratorInfo.ADMINISTRATOR: return response(AdministratorStatusCode.ADMINISTRATOR_PERMISSION_DENIED) AdministratorInfo.objects.filter(admin_id=target_admin_id).update(status=False) return response(200, 'Delete Admin Success', u'删除后台管理员成功') @check_admin def administrator_login_list(request, administrator): page = request.POST.get('page', 1) num = request.POST.get('num', 20) target_admin_id = request.POST.get('target_admin_id', '') if administrator.admin_type != AdministratorInfo.ADMINISTRATOR: return response(AdministratorStatusCode.ADMINISTRATOR_PERMISSION_DENIED) logs = AdministratorLoginLogInfo.objects.filter(status=True).order_by('-login_at') if target_admin_id: logs = logs.filter(admin_id=target_admin_id) count = logs.count() logs, left = pagination(logs, page, num) logs = [log.admindata for log in logs] return response(200, 'Get Administrator Login List Success', u'获取后台管理员登录日志成功', data={ 'logs': logs, 'left': left, 'count': count })