Clerk add/delete/update/list

Brightcells преди 7 години
родител
ревизия
137ed6dee2
променени са 7 файла, в които са добавени 258 реда и са изтрити 8 реда
  1. 4 3
      account/admin.py
  2. 116 0
      api/clerk_views.py
  3. 2 2
      api/model_views.py
  4. 8 1
      api/urls.py
  5. 16 1
      mch/admin.py
  6. 46 0
      mch/migrations/0019_saleclerkinfo.py
  7. 66 1
      mch/models.py

+ 4 - 3
account/admin.py

@@ -35,9 +35,10 @@ class SaleclerkInfoAdmin(admin.ModelAdmin):
35 35
 
36 36
     def save_model(self, request, obj, form, change):
37 37
         obj.save()
38
-        if obj.test_user:
39
-            SaleclerkIntegralIncomeExpensesInfo.objects.filter(franchiser_id=obj.franchiser_id).update(test_user=True)
40
-            SaleclerkSubmitLogInfo.objects.filter(franchiser_id=obj.franchiser_id).update(test_user=True)
38
+        if not obj.test_user:
39
+            return
40
+        SaleclerkIntegralIncomeExpensesInfo.objects.filter(franchiser_id=obj.franchiser_id).update(test_user=True)
41
+        SaleclerkSubmitLogInfo.objects.filter(franchiser_id=obj.franchiser_id).update(test_user=True)
41 42
 
42 43
 
43 44
 admin.site.register(UserInfo, UserInfoAdmin)

+ 116 - 0
api/clerk_views.py

@@ -0,0 +1,116 @@
1
+# -*- coding: utf-8 -*-
2
+
3
+from __future__ import division
4
+
5
+from django_logit import logit
6
+from django_response import response
7
+from paginator import pagination
8
+
9
+from mch.models import AdministratorInfo, DistributorInfo, SaleclerkInfo
10
+from utils.error.errno_utils import AdministratorStatusCode, ProductDistributorStatusCode, SaleclerkStatusCode
11
+
12
+
13
+@logit
14
+def clerk_add(request):
15
+    distributor_id = request.POST.get('distributor_id', '')
16
+    clerk_name = request.POST.get('clerk_name', '')
17
+    clerk_phone = request.POST.get('clerk_phone', '')
18
+
19
+    admin_id = request.session.get('admin_id')
20
+
21
+    try:
22
+        administrator = AdministratorInfo.objects.get(admin_id=admin_id, user_status=AdministratorInfo.ACTIVATED, status=True)
23
+    except AdministratorInfo.DoesNotExist:
24
+        return response(AdministratorStatusCode.ADMINISTRATOR_NOT_FOUND)
25
+
26
+    try:
27
+        distributor = DistributorInfo.objects.get(distributor_id=distributor_id, status=True)
28
+    except DistributorInfo.DoesNotExist:
29
+        return response(ProductDistributorStatusCode.DISTRIBUTOR_NOT_FOUND)
30
+
31
+    SaleclerkInfo.objects.create(
32
+        brand_id=administrator.brand_id,
33
+        distributor_id=distributor_id,
34
+        distributor_name=distributor.distributor_name,
35
+        clerk_name=clerk_name,
36
+        clerk_phone=clerk_phone,
37
+    )
38
+
39
+    return response(200, 'Clerk Add Success', u'销售员添加成功')
40
+
41
+
42
+@logit
43
+def clerk_delete(request):
44
+    distributor_id = request.POST.get('distributor_id', '')
45
+    clerk_id = request.POST.get('clerk_id', '')
46
+
47
+    admin_id = request.session.get('admin_id')
48
+
49
+    try:
50
+        administrator = AdministratorInfo.objects.get(admin_id=admin_id, user_status=AdministratorInfo.ACTIVATED, status=True)
51
+    except AdministratorInfo.DoesNotExist:
52
+        return response(AdministratorStatusCode.ADMINISTRATOR_NOT_FOUND)
53
+
54
+    try:
55
+        clerk = SaleclerkInfo.objects.get(brand_id=administrator.brand_id, clerk_id=clerk_id, status=True)
56
+    except SaleclerkInfo.DoesNotExist:
57
+        return response(SaleclerkStatusCode.CLERK_NOT_FOUND)
58
+
59
+    clerk.status = False
60
+    clerk.save()
61
+
62
+    return response(200, 'Clerk Delete Success', u'销售员删除成功')
63
+
64
+
65
+@logit
66
+def clerk_update(request):
67
+    distributor_id = request.POST.get('distributor_id', '')
68
+    clerk_id = request.POST.get('clerk_id', '')
69
+    clerk_name = request.POST.get('clerk_name', '')
70
+    clerk_phone = request.POST.get('clerk_phone', '')
71
+
72
+    admin_id = request.session.get('admin_id')
73
+
74
+    try:
75
+        administrator = AdministratorInfo.objects.get(admin_id=admin_id, user_status=AdministratorInfo.ACTIVATED, status=True)
76
+    except AdministratorInfo.DoesNotExist:
77
+        return response(AdministratorStatusCode.ADMINISTRATOR_NOT_FOUND)
78
+
79
+    try:
80
+        clerk = SaleclerkInfo.objects.get(brand_id=administrator.brand_id, clerk_id=clerk_id, status=True)
81
+    except SaleclerkInfo.DoesNotExist:
82
+        return response(SaleclerkStatusCode.CLERK_NOT_FOUND)
83
+
84
+    if clerk_name:
85
+        clerk.clerk_name = clerk_name
86
+    if clerk_phone:
87
+        clerk.clerk_phone = clerk_phone
88
+
89
+    clerk.save()
90
+
91
+    return response(200, 'Clerk Update Success', u'销售员更新成功')
92
+
93
+
94
+@logit
95
+def clerk_list(request):
96
+    distributor_id = request.POST.get('distributor_id', '')
97
+    page = request.POST.get('page', 1)
98
+    num = request.POST.get('num', 20)
99
+
100
+    admin_id = request.session.get('admin_id')
101
+
102
+    try:
103
+        administrator = AdministratorInfo.objects.get(admin_id=admin_id, user_status=AdministratorInfo.ACTIVATED, status=True)
104
+    except AdministratorInfo.DoesNotExist:
105
+        return response(AdministratorStatusCode.ADMINISTRATOR_NOT_FOUND)
106
+
107
+    clerks = SaleclerkInfo.objects.filter(brand_id=administrator.brand_id, status=True)
108
+    if distributor_id:
109
+        clerks = clerks.filter(distributor_id=distributor_id)
110
+    clerks, left = pagination(clerks, page, num)
111
+    clerks = [clerk.admindata for clerk in clerks]
112
+
113
+    return response(200, 'Get Clerk List Success', u'获取销售员列表成功', {
114
+        'clerks': clerks,
115
+        'left': left,
116
+    })

+ 2 - 2
api/model_views.py

@@ -7,8 +7,8 @@ from django_logit import logit
7 7
 from django_response import response
8 8
 from paginator import pagination
9 9
 
10
-from mch.models import AdministratorInfo, DistributorInfo, ModelInfo
11
-from utils.error.errno_utils import AdministratorStatusCode, ProductDistributorStatusCode, ProductModelStatusCode
10
+from mch.models import AdministratorInfo, ModelInfo
11
+from utils.error.errno_utils import AdministratorStatusCode, ProductModelStatusCode
12 12
 
13 13
 
14 14
 @logit

+ 8 - 1
api/urls.py

@@ -5,7 +5,7 @@ from django_file_upload import views as file_views
5 5
 
6 6
 from account import tourguide_views
7 7
 from account import views as account_views
8
-from api import distributor_views, encrypt_views, mch_views, model_views, operator_views
8
+from api import clerk_views, distributor_views, encrypt_views, mch_views, model_views, operator_views
9 9
 from box import views as box_views
10 10
 from geo import views as geo_views
11 11
 from group import (groupuser_views, lensman_views, tourguidegroup_views, tourguidegroupadmin_views,
@@ -254,3 +254,10 @@ urlpatterns += [
254 254
     url(r'^distributor/update$', distributor_views.distributor_update, name='distributor_update'),
255 255
     url(r'^distributor/list$', distributor_views.distributor_list, name='distributor_list'),
256 256
 ]
257
+
258
+urlpatterns += [
259
+    url(r'^clerk/add$', clerk_views.clerk_add, name='clerk_add'),
260
+    url(r'^clerk/delete$', clerk_views.clerk_delete, name='clerk_delete'),
261
+    url(r'^clerk/update$', clerk_views.clerk_update, name='clerk_update'),
262
+    url(r'^clerk/list$', clerk_views.clerk_list, name='clerk_list'),
263
+]

+ 16 - 1
mch/admin.py

@@ -8,8 +8,9 @@ from django_admin import DeleteModelAdmin, ReadOnlyModelAdmin
8 8
 from django_models_ext import ProvinceShortModelMixin
9 9
 from pysnippets.strsnippets import strip
10 10
 
11
+from integral.models import SaleclerkIntegralIncomeExpensesInfo, SaleclerkSubmitLogInfo
11 12
 from mch.models import (AdministratorInfo, BrandInfo, BrandModelDistributorPriceInfo, ConsumeInfoSubmitLogInfo,
12
-                        DistributorInfo, LatestAppInfo, ModelImageInfo, ModelInfo, OperatorInfo)
13
+                        DistributorInfo, LatestAppInfo, ModelImageInfo, ModelInfo, OperatorInfo, SaleclerkInfo)
13 14
 
14 15
 
15 16
 class AdministratorInfoAdmin(DeleteModelAdmin, admin.ModelAdmin):
@@ -109,6 +110,19 @@ class DistributorInfoAdmin(DeleteModelAdmin, admin.ModelAdmin):
109 110
         obj.save()
110 111
 
111 112
 
113
+class SaleclerkInfoAdmin(admin.ModelAdmin):
114
+    list_display = ('brand_id', 'brand_name', 'distributor_id', 'distributor_name', 'clerk_id', 'clerk_name', 'clerk_sex', 'clerk_phone', 'unionid', 'openid', 'integral', 'total_integral', 'user_status', 'test_user', 'status', 'created_at', 'updated_at')
115
+    list_filter = ('test_user', 'user_status', 'status')
116
+    search_fields = ('brand_id', 'brand_name', 'distributor_id', 'distributor_name', 'clerk_id', 'clerk_name', 'clerk_phone')
117
+
118
+    def save_model(self, request, obj, form, change):
119
+        obj.save()
120
+        if not obj.test_user:
121
+            return
122
+        SaleclerkIntegralIncomeExpensesInfo.objects.filter(franchiser_id=obj.franchiser_id).update(test_user=True)
123
+        SaleclerkSubmitLogInfo.objects.filter(franchiser_id=obj.franchiser_id).update(test_user=True)
124
+
125
+
112 126
 class BrandModelDistributorPriceInfoAdmin(DeleteModelAdmin, admin.ModelAdmin):
113 127
     list_display = ('brand_id', 'brand_name', 'model_id', 'model_name', 'distributor_id', 'distributor_name', 'factory_yuan', 'integral', 'status', 'created_at', 'updated_at')
114 128
     list_filter = ('brand_name', 'model_name', 'distributor_name', 'status')
@@ -165,6 +179,7 @@ admin.site.register(BrandInfo, BrandInfoAdmin)
165 179
 admin.site.register(ModelInfo, ModelInfoAdmin)
166 180
 # admin.site.register(ModelImageInfo, ModelImageInfoAdmin)
167 181
 admin.site.register(DistributorInfo, DistributorInfoAdmin)
182
+admin.site.register(SaleclerkInfo, SaleclerkInfoAdmin)
168 183
 # admin.site.register(BrandModelDistributorPriceInfo, BrandModelDistributorPriceInfoAdmin)
169 184
 admin.site.register(LatestAppInfo, LatestAppInfoAdmin)
170 185
 admin.site.register(ConsumeInfoSubmitLogInfo, ConsumeInfoSubmitLogInfoAdmin)

+ 46 - 0
mch/migrations/0019_saleclerkinfo.py

@@ -0,0 +1,46 @@
1
+# -*- coding: utf-8 -*-
2
+# Generated by Django 1.11.11 on 2018-05-14 10:28
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', '0018_auto_20180514_1519'),
13
+    ]
14
+
15
+    operations = [
16
+        migrations.CreateModel(
17
+            name='SaleclerkInfo',
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
+                ('sex', models.BooleanField(choices=[(1, '\u7537'), (0, '\u5973')], db_index=True, default=1, help_text='Sex', verbose_name='sex')),
24
+                ('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')),
25
+                ('brand_name', models.CharField(blank=True, help_text='\u54c1\u724c\u540d\u79f0', max_length=255, null=True, verbose_name='brand_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=32, null=True, verbose_name='distributor_name')),
28
+                ('clerk_id', shortuuidfield.fields.ShortUUIDField(blank=True, db_index=True, editable=False, help_text='\u5e97\u5458\u552f\u4e00\u6807\u8bc6', max_length=22, unique=True)),
29
+                ('clerk_name', models.CharField(blank=True, help_text='\u5e97\u5458\u540d\u79f0', max_length=32, null=True, verbose_name='clerk_name')),
30
+                ('clerk_sex', models.IntegerField(choices=[(1, '\u7537'), (0, '\u5973')], db_index=True, default=1, help_text='\u5e97\u5458\u6027\u522b', verbose_name='clerk_sex')),
31
+                ('clerk_phone', models.CharField(blank=True, help_text='\u5e97\u5458\u8054\u7cfb\u7535\u8bdd', max_length=11, null=True, verbose_name='clerk_phone')),
32
+                ('unionid', models.CharField(blank=True, db_index=True, help_text='\u5fae\u4fe1 UnionID', max_length=32, null=True, unique=True, verbose_name='unionid')),
33
+                ('openid', models.CharField(blank=True, db_index=True, help_text='\u5fae\u4fe1 OpenID', max_length=32, null=True, unique=True, verbose_name='openid')),
34
+                ('integral', models.IntegerField(default=0, help_text='\u79ef\u5206', verbose_name='integral')),
35
+                ('total_integral', models.IntegerField(default=0, help_text='\u5168\u90e8\u79ef\u5206', verbose_name='total_integral')),
36
+                ('user_status', models.IntegerField(choices=[(-1, '\u5df2\u62d2\u7edd'), (0, '\u672a\u9a8c\u8bc1'), (1, '\u5df2\u6fc0\u6d3b'), (2, '\u5df2\u7981\u7528'), (3, '\u5df2\u5220\u9664'), (10, '\u5df2\u5206\u914d')], db_index=True, default=0, help_text='\u7528\u6237\u72b6\u6001', verbose_name='user_status')),
37
+                ('refused_reason', models.TextField(blank=True, help_text='\u5ba1\u6838\u62d2\u7edd\u539f\u56e0', null=True, verbose_name='refused_reason')),
38
+                ('is_auth', models.BooleanField(db_index=True, default=False, help_text='\u662f\u5426\u5df2\u6388\u6743', verbose_name='is_auth')),
39
+                ('test_user', models.BooleanField(db_index=True, default=False, help_text='\u662f\u5426\u4e3a\u6d4b\u8bd5\u7528\u6237', verbose_name='test_user')),
40
+            ],
41
+            options={
42
+                'verbose_name': 'saleclerkinfo',
43
+                'verbose_name_plural': 'saleclerkinfo',
44
+            },
45
+        ),
46
+    ]

+ 66 - 1
mch/models.py

@@ -2,7 +2,8 @@
2 2
 
3 3
 from django.db import models
4 4
 from django.utils.translation import ugettext_lazy as _
5
-from django_models_ext import BaseModelMixin, ProvinceShortModelMixin, upload_file_path, upload_file_url, upload_path
5
+from django_models_ext import (BaseModelMixin, ProvinceShortModelMixin, SexModelMixin, upload_file_path,
6
+                               upload_file_url, upload_path)
6 7
 from shortuuidfield import ShortUUIDField
7 8
 
8 9
 
@@ -242,6 +243,70 @@ class DistributorInfo(BaseModelMixin):
242 243
         }
243 244
 
244 245
 
246
+class SaleclerkInfo(BaseModelMixin, SexModelMixin):
247
+    REFUSED = -1
248
+    UNVERIFIED = 0
249
+    ACTIVATED = 1
250
+    DISABLED = 2
251
+    DELETED = 3
252
+    ASSIGN = 10
253
+
254
+    USER_STATUS = (
255
+        (REFUSED, u'已拒绝'),
256
+        (UNVERIFIED, u'未验证'),
257
+        (ACTIVATED, u'已激活'),
258
+        (DISABLED, u'已禁用'),
259
+        (DELETED, u'已删除'),
260
+        (ASSIGN, u'已分配'),
261
+    )
262
+
263
+    brand_id = models.CharField(_(u'brand_id'), max_length=32, blank=True, null=True, help_text=u'品牌唯一标识', db_index=True)
264
+    brand_name = models.CharField(_(u'brand_name'), max_length=255, blank=True, null=True, help_text=u'品牌名称')
265
+
266
+    distributor_id = models.CharField(_(u'distributor_id'), max_length=32, blank=True, null=True, help_text=u'经销商唯一标识', db_index=True)
267
+    distributor_name = models.CharField(_(u'distributor_name'), max_length=32, blank=True, null=True, help_text=u'经销商名称')
268
+
269
+    clerk_id = ShortUUIDField(_(u'clerk_id'), max_length=32, help_text=u'店员唯一标识', db_index=True, unique=True)
270
+    clerk_name = models.CharField(_(u'clerk_name'), max_length=32, blank=True, null=True, help_text=u'店员名称')
271
+    clerk_sex = models.IntegerField(_(u'clerk_sex'), choices=SexModelMixin.SEX_TUPLE, default=SexModelMixin.MALE, help_text=u'店员性别', db_index=True)
272
+    clerk_phone = models.CharField(_(u'clerk_phone'), max_length=11, blank=True, null=True, help_text=u'店员联系电话')
273
+
274
+    unionid = models.CharField(_(u'unionid'), max_length=32, blank=True, null=True, help_text=u'微信 UnionID', db_index=True, unique=True)
275
+    openid = models.CharField(_(u'openid'), max_length=32, blank=True, null=True, help_text=u'微信 OpenID', db_index=True, unique=True)
276
+
277
+    integral = models.IntegerField(_(u'integral'), default=0, help_text=u'积分')
278
+    total_integral = models.IntegerField(_(u'total_integral'), default=0, help_text=u'全部积分')
279
+
280
+    user_status = models.IntegerField(_(u'user_status'), choices=USER_STATUS, default=UNVERIFIED, help_text=u'用户状态', db_index=True)
281
+    refused_reason = models.TextField(_(u'refused_reason'), blank=True, null=True, help_text=u'审核拒绝原因')
282
+
283
+    is_auth = models.BooleanField(_(u'is_auth'), default=False, help_text=_(u'是否已授权'), db_index=True)
284
+
285
+    test_user = models.BooleanField(_(u'test_user'), default=False, help_text=_(u'是否为测试用户'), db_index=True)
286
+
287
+    class Meta:
288
+        verbose_name = _(u'经销商销售员信息')
289
+        verbose_name_plural = _(u'经销商销售员信息')
290
+
291
+    def __unicode__(self):
292
+        return unicode(self.pk)
293
+
294
+    @property
295
+    def admindata(self):
296
+        return {
297
+            'distributor_id': self.distributor_id,
298
+            'distributor_name': self.distributor_name,
299
+            'clerk_id': self.clerk_id,
300
+            'clerk_name': self.clerk_name,
301
+            'clerk_sex': self.clerk_sex,
302
+            'clerk_phone': self.clerk_phone,
303
+            'integral': self.integral,
304
+            'status': self.user_status,
305
+            'refused_reason': self.refused_reason,
306
+            'is_auth': self.is_auth,
307
+        }
308
+
309
+
245 310
 class BrandModelDistributorPriceInfo(BaseModelMixin):
246 311
     brand_id = models.CharField(_(u'brand_id'), max_length=32, blank=True, null=True, help_text=u'品牌唯一标识', db_index=True)
247 312
     brand_name = models.CharField(_(u'brand_name'), max_length=255, blank=True, null=True, help_text=u'品牌名称')