Support scan jancode

Brightcells преди 6 години
родител
ревизия
3f9969cafc
променени са 9 файла, в които са добавени 136 реда и са изтрити 9 реда
  1. 4 2
      api/mch_views.py
  2. 22 0
      api/model_views.py
  3. 3 3
      api/urls.py
  4. 1 0
      kodo/settings.py
  5. 3 3
      mch/admin.py
  6. 45 0
      mch/migrations/0023_auto_20180826_0448.py
  7. 13 1
      mch/models.py
  8. BIN
      pre/static/models_20180816.xls
  9. 45 0
      pre/views.py

+ 4 - 2
api/mch_views.py

@@ -95,8 +95,9 @@ def bmd_infos(request):
95 95
     brands = BrandInfo.objects.filter(brand_id=operator.brand_id, status=True).order_by('position')
96 96
     brands = [brand.data for brand in brands]
97 97
 
98
-    models = ModelInfo.objects.filter(brand_id=operator.brand_id, status=True).order_by('position')
99
-    models = [model.data for model in models]
98
+    tmpmodels = ModelInfo.objects.filter(brand_id=operator.brand_id, display=True, status=True).order_by('position')
99
+    models = [model.data for model in tmpmodels]
100
+    jancodes = {model.jancode: model.data for model in tmpmodels}
100 101
 
101 102
     distributors = DistributorInfo.objects.filter(brand_id=operator.brand_id, status=True).order_by('position')
102 103
     distributors = [distributor.data for distributor in distributors]
@@ -105,6 +106,7 @@ def bmd_infos(request):
105 106
         'optor_id': operator.operator_id,
106 107
         'brands': brands,
107 108
         'models': models,
109
+        'jancodes': jancodes,
108 110
         'distributors': distributors,
109 111
     })
110 112
 

+ 22 - 0
api/model_views.py

@@ -13,12 +13,17 @@ from utils.error.errno_utils import AdministratorStatusCode, ProductModelStatusC
13 13
 
14 14
 @logit
15 15
 def model_add(request):
16
+    jancode = request.POST.get('jancode', '')
16 17
     model_name = request.POST.get('model_name', '')
18
+    model_uni_name = request.POST.get('model_uni_name', '')
17 19
     model_full_name = request.POST.get('model_full_name', '')
18 20
     image_path = request.POST.get('image_path', '')
19 21
     factory_yuan = request.POST.get('factory_yuan', 1000)
20 22
     integral = int(request.POST.get('integral', 100))
21 23
 
24
+    category = request.POST.get('category', '')
25
+    warehouse = request.POST.get('warehouse', '')
26
+
22 27
     admin_id = request.session.get('admin_id')
23 28
 
24 29
     try:
@@ -28,8 +33,12 @@ def model_add(request):
28 33
 
29 34
     ModelInfo.objects.create(
30 35
         brand_id=administrator.brand_id,
36
+        jancode=jancode,
31 37
         model_name=model_name,
38
+        model_uni_name=model_uni_name,
32 39
         model_full_name=model_full_name,
40
+        category=category,
41
+        warehouse=warehouse,
33 42
         image=image_path,
34 43
         factory_yuan=factory_yuan,
35 44
         factory_fee=monetary.Yuan2Fen(factory_yuan),
@@ -63,13 +72,18 @@ def model_delete(request):
63 72
 
64 73
 @logit
65 74
 def model_update(request):
75
+    jancode = request.POST.get('jancode', '')
66 76
     model_id = request.POST.get('model_id', '')
67 77
     model_name = request.POST.get('model_name', '')
78
+    model_uni_name = request.POST.get('model_uni_name', '')
68 79
     model_full_name = request.POST.get('model_full_name', '')
69 80
     image_path = request.POST.get('image_path', '')
70 81
     factory_yuan = request.POST.get('factory_yuan', 1000)
71 82
     integral = int(request.POST.get('integral', 100))
72 83
 
84
+    category = request.POST.get('category', '')
85
+    warehouse = request.POST.get('warehouse', '')
86
+
73 87
     admin_id = request.session.get('admin_id')
74 88
 
75 89
     try:
@@ -82,10 +96,18 @@ def model_update(request):
82 96
     except ModelInfo.DoesNotExist:
83 97
         return response(ProductModelStatusCode.MODEL_NOT_FOUND)
84 98
 
99
+    if jancode:
100
+        modelObj.jancode = jancode
85 101
     if model_name:
86 102
         modelObj.model_name = model_name
103
+    if model_uni_name:
104
+        modelObj.model_uni_name = model_uni_name
87 105
     if model_full_name:
88 106
         modelObj.model_full_name = model_full_name
107
+    if category:
108
+        modelObj.category = category
109
+    if warehouse:
110
+        modelObj.warehouse = warehouse
89 111
     if image_path:
90 112
         modelObj.distributor_province_name = image_path
91 113
     if factory_yuan:

+ 3 - 3
api/urls.py

@@ -194,9 +194,9 @@ urlpatterns += [
194 194
 ]
195 195
 
196 196
 urlpatterns += [
197
-    url(r'^brands$', mch_views.brands_list, name='brands_list'),
198
-    url(r'^models$', mch_views.models_list, name='models_list'),
199
-    url(r'^distributors$', mch_views.distributors_list, name='distributors_list'),
197
+    # url(r'^brands$', mch_views.brands_list, name='brands_list'),
198
+    # url(r'^models$', mch_views.models_list, name='models_list'),
199
+    # url(r'^distributors$', mch_views.distributors_list, name='distributors_list'),
200 200
     url(r'^infos$', mch_views.bmd_infos, name='bmd_infos'),
201 201
 
202 202
     url(r'^log/upload$', file_views.file_upload, name='log_upload'),

+ 1 - 0
kodo/settings.py

@@ -381,6 +381,7 @@ DEBUG_STATISTIC_DATA_FLAG = False
381 381
 
382 382
 KODO_DEFAULT_BRAND_PK = 0
383 383
 KODO_DEFAULT_BRAND_ID = ''
384
+KODO_DEFAULT_BRAND_NAME = ''
384 385
 KODO_DEFAULT_BRAND_DOMAIN = ''
385 386
 
386 387
 KODO_CLERK_AUTH_URL = 'http://pai.ai/w/o?r=http%3A%2F%2Fkodo.xfoto.com.cn%2Fp%2Fclerk%3Fbrand_id%3D{0}'

+ 3 - 3
mch/admin.py

@@ -63,10 +63,10 @@ class BrandInfoAdmin(DeleteModelAdmin, admin.ModelAdmin):
63 63
 
64 64
 
65 65
 class ModelInfoAdmin(DeleteModelAdmin, admin.ModelAdmin):
66
-    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')
67
-    list_filter = ('brand_name', 'status')
66
+    list_display = ('brand_id', 'brand_name', 'jancode', 'model_id', 'model_uni_name', 'model_name', 'model_full_name', 'model_descr', 'category', 'warehouse', 'image', 'url', 'factory_yuan', 'integral', 'position', 'display', 'status', 'created_at', 'updated_at')
67
+    list_filter = ('brand_name', 'category', 'warehouse', 'display', 'status')
68 68
     readonly_fields = ('brand_name', 'factory_fee')
69
-    search_fields = ('brand_id', 'brand_name', 'model_id', 'model_name', 'model_full_name', 'model_descr')
69
+    search_fields = ('brand_id', 'brand_name', 'jancode', 'model_id', 'model_uni_name', 'model_name', 'model_full_name', 'model_descr', 'category', 'warehouse')
70 70
 
71 71
     def save_model(self, request, obj, form, change):
72 72
         obj.brand_id = strip(obj.brand_id)

+ 45 - 0
mch/migrations/0023_auto_20180826_0448.py

@@ -0,0 +1,45 @@
1
+# -*- coding: utf-8 -*-
2
+# Generated by Django 1.11.15 on 2018-08-25 20:48
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', '0022_auto_20180522_1355'),
12
+    ]
13
+
14
+    operations = [
15
+        migrations.AddField(
16
+            model_name='modelinfo',
17
+            name='category',
18
+            field=models.CharField(blank=True, db_index=True, help_text='\u578b\u53f7\u7c7b\u522b', max_length=32, null=True, verbose_name='category'),
19
+        ),
20
+        migrations.AddField(
21
+            model_name='modelinfo',
22
+            name='display',
23
+            field=models.BooleanField(db_index=True, default=True, help_text='Display', verbose_name='display'),
24
+        ),
25
+        migrations.AddField(
26
+            model_name='modelinfo',
27
+            name='jancode',
28
+            field=models.CharField(blank=True, db_index=True, help_text='JAN_CODE', max_length=16, null=True, verbose_name='jancode'),
29
+        ),
30
+        migrations.AddField(
31
+            model_name='modelinfo',
32
+            name='model_uni_name',
33
+            field=models.CharField(blank=True, help_text='\u578b\u53f7\u7edf\u4e00\u540d\u79f0', max_length=32, null=True, verbose_name='model_uni_name'),
34
+        ),
35
+        migrations.AddField(
36
+            model_name='modelinfo',
37
+            name='warehouse',
38
+            field=models.CharField(blank=True, db_index=True, help_text='\u6240\u5c5e\u4ed3\u5e93', max_length=32, null=True, verbose_name='warehouse'),
39
+        ),
40
+        migrations.AlterField(
41
+            model_name='modelinfo',
42
+            name='model_name',
43
+            field=models.CharField(blank=True, help_text='\u578b\u53f7\u540d\u79f0', max_length=32, null=True, verbose_name='model_name'),
44
+        ),
45
+    ]

+ 13 - 1
mch/models.py

@@ -122,11 +122,17 @@ class ModelInfo(BaseModelMixin):
122 122
     brand_id = models.CharField(_(u'brand_id'), max_length=32, blank=True, null=True, help_text=u'品牌唯一标识', db_index=True)
123 123
     brand_name = models.CharField(_(u'brand_name'), max_length=255, blank=True, null=True, help_text=u'品牌名称')
124 124
 
125
+    jancode = models.CharField(_(u'jancode'), max_length=16, blank=True, null=True, help_text=u'JAN_CODE', db_index=True)
126
+
125 127
     model_id = ShortUUIDField(_(u'model_id'), max_length=32, help_text=u'型号唯一标识', db_index=True, unique=True)
126
-    model_name = models.CharField(_(u'model_name'), max_length=255, blank=True, null=True, help_text=u'型号名称')
128
+    model_name = models.CharField(_(u'model_name'), max_length=32, blank=True, null=True, help_text=u'型号名称')
129
+    model_uni_name = models.CharField(_(u'model_uni_name'), max_length=32, blank=True, null=True, help_text=u'型号统一名称')
127 130
     model_full_name = models.CharField(_(u'model_full_name'), max_length=255, blank=True, null=True, help_text=u'型号全名称')
128 131
     model_descr = models.TextField(_(u'model_descr'), max_length=255, blank=True, null=True, help_text=u'型号描述')
129 132
 
133
+    category = models.CharField(_(u'category'), max_length=32, blank=True, null=True, help_text=u'型号类别', db_index=True)
134
+    warehouse = models.CharField(_(u'warehouse'), max_length=32, blank=True, null=True, help_text=u'所属仓库', db_index=True)
135
+
130 136
     image = models.ImageField(_(u'image'), upload_to=upload_path, blank=True, null=True, help_text=u'图片')
131 137
     url = models.CharField(_(u'url'), max_length=255, blank=True, null=True, help_text=u'链接')
132 138
 
@@ -137,6 +143,8 @@ class ModelInfo(BaseModelMixin):
137 143
 
138 144
     position = models.IntegerField(_(u'position'), default=1, help_text=u'排序')
139 145
 
146
+    display = models.BooleanField(_(u'display'), default=True, help_text=_(u'Display'), db_index=True)
147
+
140 148
     class Meta:
141 149
         verbose_name = _(u'型号信息')
142 150
         verbose_name_plural = _(u'型号信息')
@@ -176,9 +184,13 @@ class ModelInfo(BaseModelMixin):
176 184
     @property
177 185
     def admindata(self):
178 186
         return {
187
+            'jancode': self.jancode,
179 188
             'model_id': self.model_id,
180 189
             'model_name': self.model_name,
190
+            'model_uni_name': self.model_uni_name,
181 191
             'model_full_name': self.model_full_name,
192
+            'category': self.category,
193
+            'warehouse': self.warehouse,
182 194
             'image_path': self.image_path,
183 195
             'image_url': self.image_url,
184 196
             'factory_yuan': self.factory_yuan,

BIN
pre/static/models_20180816.xls


+ 45 - 0
pre/views.py

@@ -2,6 +2,10 @@
2 2
 
3 3
 from __future__ import division
4 4
 
5
+import xlrd
6
+from django.conf import settings
7
+from pysnippets.strsnippets import strip
8
+
5 9
 from mch.models import BrandInfo, DistributorInfo, ModelInfo
6 10
 from statistic.models import (ConsumeDistributorSaleStatisticInfo, ConsumeModelSaleStatisticInfo,
7 11
                               ConsumeProvinceSaleStatisticInfo, DistributorSaleStatisticInfo, ModelSaleStatisticInfo,
@@ -91,3 +95,44 @@ def pre_all():
91 95
     pre_provinces()
92 96
     pre_models()
93 97
     pre_distributors()
98
+
99
+
100
+# In [55]: cv
101
+# Out[55]: 991000295147.0
102
+#
103
+# In [56]: str(cv)
104
+# Out[56]: '9.91000295147e+11'
105
+#
106
+# In [57]: repr(cv)
107
+# Out[57]: '991000295147.0'
108
+def convert_to_str(cv):
109
+    if isinstance(cv, (int, float)):
110
+        cv = repr(cv)[:-2] if repr(cv).endswith('.0') else repr(cv)
111
+    if isinstance(cv, str):
112
+        cv = cv.strip()
113
+    return cv
114
+
115
+
116
+def pre_new_models(fpath='./pre/static/models_20180816.xls'):
117
+    workbook = xlrd.open_workbook(fpath)
118
+    # sheet = workbook.sheet_by_name('SMR')
119
+    sheets = workbook.sheets()
120
+    sheet = sheets[0]
121
+    nrows = sheet.nrows
122
+    for idx in range(1, nrows):
123
+        rvals = sheet.row_values(idx)
124
+        print rvals
125
+
126
+        jancode = strip(rvals[0])
127
+        if not jancode:
128
+            continue
129
+
130
+        mdl, _ = ModelInfo.objects.get_or_create(jancode=jancode)
131
+        mdl.brand_id = settings.KODO_DEFAULT_BRAND_ID
132
+        mdl.brand_name = settings.KODO_DEFAULT_BRAND_NAME
133
+        mdl.model_name = strip(rvals[1])
134
+        mdl.model_uni_name = strip(rvals[2])
135
+        mdl.category = strip(rvals[3])
136
+        mdl.model_full_name = strip(rvals[4])
137
+        mdl.warehouse = strip(rvals[5])
138
+        mdl.save()