@@ -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) |
@@ -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 |
+ }) |
@@ -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 |
@@ -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 |
+] |
@@ -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) |
@@ -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 |
+ ] |
@@ -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'品牌名称') |