AdministratorInfo/BrandModelDistributorPriceInfo

Brightcells преди 7 години
родител
ревизия
d10bd672ea
променени са 5 файла, в които са добавени 212 реда и са изтрити 4 реда
  1. 64 4
      mch/admin.py
  2. 47 0
      mch/migrations/0015_auto_20180508_1433.py
  3. 41 0
      mch/migrations/0016_auto_20180508_1507.py
  4. 59 0
      mch/models.py
  5. 1 0
      requirements.txt

+ 64 - 4
mch/admin.py

@@ -1,5 +1,6 @@
1 1
 # -*- coding: utf-8 -*-
2 2
 
3
+import monetary
3 4
 from django.conf import settings
4 5
 from django.contrib import admin
5 6
 from django.contrib.auth.hashers import make_password
@@ -7,8 +8,29 @@ from django_admin import DeleteModelAdmin, ReadOnlyModelAdmin
7 8
 from django_models_ext import ProvinceShortModelMixin
8 9
 from pysnippets.strsnippets import strip
9 10
 
10
-from mch.models import (BrandInfo, ConsumeInfoSubmitLogInfo, DistributorInfo, LatestAppInfo, ModelImageInfo, ModelInfo,
11
-                        OperatorInfo)
11
+from mch.models import (AdministratorInfo, BrandInfo, BrandModelDistributorPriceInfo, ConsumeInfoSubmitLogInfo,
12
+                        DistributorInfo, LatestAppInfo, ModelImageInfo, ModelInfo, OperatorInfo)
13
+
14
+
15
+class AdministratorInfoAdmin(DeleteModelAdmin, admin.ModelAdmin):
16
+    list_display = ('admin_id', 'phone', 'password', 'encryption', 'name', 'brand_id', 'brand_name', 'user_status', 'status', 'created_at', 'updated_at')
17
+    list_filter = ('user_status', 'status', 'brand_name')
18
+    readonly_fields = ('encryption', 'brand_name')
19
+
20
+    def save_model(self, request, obj, form, change):
21
+        obj.phone = strip(obj.phone)
22
+        obj.password = strip(obj.password)
23
+        if obj.password:
24
+            obj.encryption = make_password(obj.password, settings.MAKE_PASSWORD_SALT, settings.MAKE_PASSWORD_HASHER)
25
+        obj.password = ''
26
+
27
+        obj.brand_id = strip(obj.brand_id)
28
+        try:
29
+            obj.brand_name = BrandInfo.objects.get(brand_id=obj.brand_id).brand_name
30
+        except BrandInfo.DoesNotExist:
31
+            obj.brand_name = ''
32
+
33
+        obj.save()
12 34
 
13 35
 
14 36
 class OperatorInfoAdmin(DeleteModelAdmin, admin.ModelAdmin):
@@ -37,8 +59,10 @@ class BrandInfoAdmin(DeleteModelAdmin, admin.ModelAdmin):
37 59
 
38 60
 
39 61
 class ModelInfoAdmin(DeleteModelAdmin, admin.ModelAdmin):
40
-    list_display = ('brand_id', 'brand_name', 'model_id', 'model_name', 'model_full_name', 'model_descr', 'image', 'url', 'integral', 'position', 'status', 'created_at', 'updated_at')
62
+    list_display = ('brand_id', 'brand_name', 'model_id', 'model_name', 'model_full_name', 'model_descr', 'image', 'url', 'factory_yuan', 'integral', 'position', 'status', 'created_at', 'updated_at')
41 63
     list_filter = ('brand_name', 'status')
64
+    readonly_fields = ('brand_name', 'factory_fee')
65
+    search_fields = ('brand_id', 'brand_name', 'model_id', 'model_name', 'model_full_name', 'model_descr')
42 66
 
43 67
     def save_model(self, request, obj, form, change):
44 68
         obj.brand_id = strip(obj.brand_id)
@@ -47,6 +71,9 @@ class ModelInfoAdmin(DeleteModelAdmin, admin.ModelAdmin):
47 71
         except BrandInfo.DoesNotExist:
48 72
             obj.brand_name = ''
49 73
 
74
+        obj.factory_fee = monetary.Yuan2Fen(obj.factory_yuan)
75
+        obj.factory_yuan = monetary.Fen2Yuan(obj.factory_fee)
76
+
50 77
         obj.save()
51 78
 
52 79
 
@@ -67,7 +94,7 @@ class ModelImageInfoAdmin(DeleteModelAdmin, admin.ModelAdmin):
67 94
 class DistributorInfoAdmin(DeleteModelAdmin, admin.ModelAdmin):
68 95
     list_display = ('brand_id', 'brand_name', 'distributor_id', 'distributor_name', 'distributor_province_name', 'position', 'status', 'created_at', 'updated_at')
69 96
     list_filter = ('brand_name', 'distributor_province_name', 'status')
70
-    readonly_fields = ('distributor_province_code', )
97
+    readonly_fields = ('brand_name', 'distributor_province_code')
71 98
     search_fields = ('brand_id', 'brand_name', 'distributor_name', 'distributor_descr', 'distributor_province_code', 'distributor_province_name')
72 99
 
73 100
     def save_model(self, request, obj, form, change):
@@ -82,6 +109,37 @@ class DistributorInfoAdmin(DeleteModelAdmin, admin.ModelAdmin):
82 109
         obj.save()
83 110
 
84 111
 
112
+class BrandModelDistributorPriceInfoAdmin(DeleteModelAdmin, admin.ModelAdmin):
113
+    list_display = ('brand_id', 'brand_name', 'model_id', 'model_name', 'distributor_id', 'distributor_name', 'factory_yuan', 'integral', 'status', 'created_at', 'updated_at')
114
+    list_filter = ('brand_name', 'model_name', 'distributor_name', 'status')
115
+    readonly_fields = ('brand_name', 'model_name', 'distributor_name', 'factory_fee', )
116
+    search_fields = ('brand_id', 'brand_name', 'model_id', 'model_name', 'distributor_id', 'distributor_name')
117
+
118
+    def save_model(self, request, obj, form, change):
119
+        obj.brand_id = strip(obj.brand_id)
120
+        try:
121
+            obj.brand_name = BrandInfo.objects.get(brand_id=obj.brand_id).brand_name
122
+        except BrandInfo.DoesNotExist:
123
+            obj.brand_name = ''
124
+
125
+        obj.model_id = strip(obj.model_id)
126
+        try:
127
+            obj.model_name = ModelInfo.objects.get(model_id=obj.model_id).model_name
128
+        except BrandInfo.DoesNotExist:
129
+            obj.model_name = ''
130
+
131
+        obj.distributor_id = strip(obj.distributor_id)
132
+        try:
133
+            obj.distributor_name = DistributorInfo.objects.get(distributor_id=obj.distributor_id).distributor_name
134
+        except BrandInfo.DoesNotExist:
135
+            obj.distributor_name = ''
136
+
137
+        obj.factory_fee = monetary.Yuan2Fen(obj.factory_yuan)
138
+        obj.factory_yuan = monetary.Fen2Yuan(obj.factory_fee)
139
+
140
+        obj.save()
141
+
142
+
85 143
 class LatestAppInfoAdmin(admin.ModelAdmin):
86 144
     list_display = ('latest_adr_version_code', 'latest_adr_version_name', 'latest_adr_app', 'latest_adr_url', 'status', 'created_at', 'updated_at')
87 145
     list_filter = ('status', )
@@ -101,10 +159,12 @@ class ConsumeInfoSubmitLogInfoAdmin(ReadOnlyModelAdmin, admin.ModelAdmin):
101 159
     list_filter = ('test_user', 'verifyResult', 'status')
102 160
 
103 161
 
162
+admin.site.register(AdministratorInfo, AdministratorInfoAdmin)
104 163
 admin.site.register(OperatorInfo, OperatorInfoAdmin)
105 164
 admin.site.register(BrandInfo, BrandInfoAdmin)
106 165
 admin.site.register(ModelInfo, ModelInfoAdmin)
107 166
 # admin.site.register(ModelImageInfo, ModelImageInfoAdmin)
108 167
 admin.site.register(DistributorInfo, DistributorInfoAdmin)
168
+admin.site.register(BrandModelDistributorPriceInfo, BrandModelDistributorPriceInfoAdmin)
109 169
 admin.site.register(LatestAppInfo, LatestAppInfoAdmin)
110 170
 admin.site.register(ConsumeInfoSubmitLogInfo, ConsumeInfoSubmitLogInfoAdmin)

+ 47 - 0
mch/migrations/0015_auto_20180508_1433.py

@@ -0,0 +1,47 @@
1
+# -*- coding: utf-8 -*-
2
+# Generated by Django 1.11.11 on 2018-05-08 06:33
3
+from __future__ import unicode_literals
4
+
5
+from django.db import migrations, models
6
+import shortuuidfield.fields
7
+
8
+
9
+class Migration(migrations.Migration):
10
+
11
+    dependencies = [
12
+        ('mch', '0014_auto_20180508_1058'),
13
+    ]
14
+
15
+    operations = [
16
+        migrations.CreateModel(
17
+            name='AdministratorInfo',
18
+            fields=[
19
+                ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
20
+                ('status', models.BooleanField(db_index=True, default=True, help_text='Status', verbose_name='status')),
21
+                ('created_at', models.DateTimeField(auto_now_add=True, help_text='Create Time', verbose_name='created_at')),
22
+                ('updated_at', models.DateTimeField(auto_now=True, help_text='Update Time', verbose_name='updated_at')),
23
+                ('admin_id', shortuuidfield.fields.ShortUUIDField(blank=True, db_index=True, editable=False, help_text='\u7ba1\u7406\u5458\u552f\u4e00\u6807\u8bc6', max_length=22, null=True, unique=True)),
24
+                ('phone', models.CharField(blank=True, db_index=True, help_text='\u7ba1\u7406\u5458\u7535\u8bdd', max_length=16, null=True, verbose_name='phone')),
25
+                ('password', models.CharField(blank=True, help_text='\u7ba1\u7406\u5458\u5bc6\u7801', max_length=255, null=True, verbose_name='password')),
26
+                ('encryption', models.CharField(blank=True, help_text='\u7ba1\u7406\u5458\u5bc6\u7801', max_length=255, null=True, verbose_name='encryption')),
27
+                ('name', models.CharField(blank=True, help_text='\u7ba1\u7406\u5458\u59d3\u540d', max_length=255, null=True, verbose_name='name')),
28
+                ('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')),
29
+                ('brand_name', models.CharField(blank=True, help_text='\u54c1\u724c\u540d\u79f0', max_length=255, null=True, verbose_name='brand_name')),
30
+                ('user_status', models.IntegerField(choices=[(1, '\u5df2\u6fc0\u6d3b'), (2, '\u5df2\u7981\u7528')], db_index=True, default=1, help_text='\u7ba1\u7406\u5458\u72b6\u6001', verbose_name='user_status')),
31
+            ],
32
+            options={
33
+                'verbose_name': '\u7ba1\u7406\u5458\u4fe1\u606f',
34
+                'verbose_name_plural': '\u7ba1\u7406\u5458\u4fe1\u606f',
35
+            },
36
+        ),
37
+        migrations.AddField(
38
+            model_name='modelinfo',
39
+            name='factory_fee',
40
+            field=models.IntegerField(default=100000, help_text='\u51fa\u5382\u4ef7(\u5206)', verbose_name='factory_fee'),
41
+        ),
42
+        migrations.AddField(
43
+            model_name='modelinfo',
44
+            name='factory_yuan',
45
+            field=models.FloatField(default=1000, help_text='\u51fa\u5382\u4ef7(\u5143)', verbose_name='factory_yuan'),
46
+        ),
47
+    ]

+ 41 - 0
mch/migrations/0016_auto_20180508_1507.py

@@ -0,0 +1,41 @@
1
+# -*- coding: utf-8 -*-
2
+# Generated by Django 1.11.11 on 2018-05-08 07:07
3
+from __future__ import unicode_literals
4
+
5
+from django.db import migrations, models
6
+
7
+
8
+class Migration(migrations.Migration):
9
+
10
+    dependencies = [
11
+        ('mch', '0015_auto_20180508_1433'),
12
+    ]
13
+
14
+    operations = [
15
+        migrations.CreateModel(
16
+            name='BrandModelDistributorPriceInfo',
17
+            fields=[
18
+                ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
19
+                ('status', models.BooleanField(db_index=True, default=True, help_text='Status', verbose_name='status')),
20
+                ('created_at', models.DateTimeField(auto_now_add=True, help_text='Create Time', verbose_name='created_at')),
21
+                ('updated_at', models.DateTimeField(auto_now=True, help_text='Update Time', verbose_name='updated_at')),
22
+                ('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')),
23
+                ('brand_name', models.CharField(blank=True, help_text='\u54c1\u724c\u540d\u79f0', max_length=255, null=True, verbose_name='brand_name')),
24
+                ('model_id', models.CharField(blank=True, db_index=True, help_text='\u578b\u53f7\u552f\u4e00\u6807\u8bc6', max_length=32, null=True, verbose_name='model_id')),
25
+                ('model_name', models.CharField(blank=True, help_text='\u578b\u53f7\u540d\u79f0', max_length=255, null=True, verbose_name='model_name')),
26
+                ('distributor_id', models.CharField(blank=True, db_index=True, help_text='\u7ecf\u9500\u5546\u552f\u4e00\u6807\u8bc6', max_length=32, null=True, verbose_name='distributor_id')),
27
+                ('distributor_name', models.CharField(blank=True, help_text='\u7ecf\u9500\u5546\u540d\u79f0', max_length=255, null=True, verbose_name='distributor_name')),
28
+                ('factory_yuan', models.FloatField(default=1000, help_text='\u51fa\u5382\u4ef7(\u5143)', verbose_name='factory_yuan')),
29
+                ('factory_fee', models.IntegerField(default=100000, help_text='\u51fa\u5382\u4ef7(\u5206)', verbose_name='factory_fee')),
30
+                ('integral', models.IntegerField(default=100, help_text='\u79ef\u5206', verbose_name='integral')),
31
+            ],
32
+            options={
33
+                'verbose_name': '\u578b\u53f7/\u4ee3\u7406\u5546\u4ef7\u683c\u4fe1\u606f',
34
+                'verbose_name_plural': '\u578b\u53f7/\u4ee3\u7406\u5546\u4ef7\u683c\u4fe1\u606f',
35
+            },
36
+        ),
37
+        migrations.AlterUniqueTogether(
38
+            name='brandmodeldistributorpriceinfo',
39
+            unique_together=set([('brand_id', 'model_id', 'distributor_id')]),
40
+        ),
41
+    ]

+ 59 - 0
mch/models.py

@@ -6,6 +6,36 @@ from django_models_ext import BaseModelMixin, ProvinceShortModelMixin, upload_fi
6 6
 from shortuuidfield import ShortUUIDField
7 7
 
8 8
 
9
+class AdministratorInfo(BaseModelMixin):
10
+    ACTIVATED = 1
11
+    DISABLED = 2
12
+
13
+    USER_STATUS_TUPLE = (
14
+        (ACTIVATED, u'已激活'),
15
+        (DISABLED, u'已禁用'),
16
+    )
17
+
18
+    admin_id = ShortUUIDField(_(u'admin_id'), max_length=32, blank=True, null=True, help_text=u'管理员唯一标识', db_index=True, unique=True)
19
+
20
+    phone = models.CharField(_(u'phone'), max_length=16, blank=True, null=True, help_text=u'管理员电话', db_index=True)
21
+    password = models.CharField(_(u'password'), max_length=255, blank=True, null=True, help_text=u'管理员密码')
22
+    encryption = models.CharField(_(u'encryption'), max_length=255, blank=True, null=True, help_text=u'管理员密码')
23
+
24
+    name = models.CharField(_(u'name'), max_length=255, blank=True, null=True, help_text=u'管理员姓名')
25
+
26
+    brand_id = models.CharField(_(u'brand_id'), max_length=32, blank=True, null=True, help_text=u'品牌唯一标识', db_index=True)
27
+    brand_name = models.CharField(_(u'brand_name'), max_length=255, blank=True, null=True, help_text=u'品牌名称')
28
+
29
+    user_status = models.IntegerField(_(u'user_status'), choices=USER_STATUS_TUPLE, default=ACTIVATED, help_text=u'管理员状态', db_index=True)
30
+
31
+    class Meta:
32
+        verbose_name = _(u'管理员信息')
33
+        verbose_name_plural = _(u'管理员信息')
34
+
35
+    def __unicode__(self):
36
+        return u'{}-{}'.format(self.name, self.phone)
37
+
38
+
9 39
 class OperatorInfo(BaseModelMixin):
10 40
     ACTIVATED = 1
11 41
     DISABLED = 2
@@ -77,6 +107,9 @@ class ModelInfo(BaseModelMixin):
77 107
     image = models.ImageField(_(u'image'), upload_to=upload_path, blank=True, null=True, help_text=u'图片')
78 108
     url = models.CharField(_(u'url'), max_length=255, blank=True, null=True, help_text=u'链接')
79 109
 
110
+    factory_yuan = models.FloatField(_(u'factory_yuan'), default=1000, help_text=u'出厂价(元)')
111
+    factory_fee = models.IntegerField(_(u'factory_fee'), default=100000, help_text=u'出厂价(分)')
112
+
80 113
     integral = models.IntegerField(_(u'integral'), default=100, help_text=u'积分')
81 114
 
82 115
     position = models.IntegerField(_(u'position'), default=1, help_text=u'排序')
@@ -171,6 +204,32 @@ class DistributorInfo(BaseModelMixin):
171 204
         }
172 205
 
173 206
 
207
+class BrandModelDistributorPriceInfo(BaseModelMixin):
208
+    brand_id = models.CharField(_(u'brand_id'), max_length=32, blank=True, null=True, help_text=u'品牌唯一标识', db_index=True)
209
+    brand_name = models.CharField(_(u'brand_name'), max_length=255, blank=True, null=True, help_text=u'品牌名称')
210
+
211
+    model_id = models.CharField(_(u'model_id'), max_length=32, blank=True, null=True, help_text=u'型号唯一标识', db_index=True)
212
+    model_name = models.CharField(_(u'model_name'), max_length=255, blank=True, null=True, help_text=u'型号名称')
213
+
214
+    distributor_id = models.CharField(_(u'distributor_id'), max_length=32, blank=True, null=True, help_text=u'经销商唯一标识', db_index=True)
215
+    distributor_name = models.CharField(_(u'distributor_name'), max_length=255, blank=True, null=True, help_text=u'经销商名称')
216
+
217
+    factory_yuan = models.FloatField(_(u'factory_yuan'), default=1000, help_text=u'出厂价(元)')
218
+    factory_fee = models.IntegerField(_(u'factory_fee'), default=100000, help_text=u'出厂价(分)')
219
+
220
+    integral = models.IntegerField(_(u'integral'), default=100, help_text=u'积分')
221
+
222
+    class Meta:
223
+        verbose_name = _(u'型号/代理商价格信息')
224
+        verbose_name_plural = _(u'型号/代理商价格信息')
225
+        unique_together = (
226
+            ('brand_id', 'model_id', 'distributor_id'),
227
+        )
228
+
229
+    def __unicode__(self):
230
+        return unicode(self.pk)
231
+
232
+
174 233
 class LatestAppInfo(BaseModelMixin):
175 234
     latest_adr_version_code = models.IntegerField(_(u'latest_adr_version_code'), default=0, help_text=u'最新安卓版本号')
176 235
     latest_adr_version_name = models.CharField(_(u'latest_adr_version_name'), max_length=16, blank=True, null=True, help_text=u'最新安卓版本名')

+ 1 - 0
requirements.txt

@@ -31,6 +31,7 @@ hiredis==0.2.0
31 31
 isoweek==1.3.3
32 32
 jsonfield==2.0.2
33 33
 mock==2.0.0
34
+monetary==1.0.1
34 35
 pysnippets==1.0.5
35 36
 pywe-jssdk==1.1.0
36 37
 pywe-membercard==1.0.0