@@ -11,11 +11,13 @@ from pywe_storage import RedisStorage |
||
11 | 11 |
from TimeConvert import TimeConvert as tc |
12 | 12 |
|
13 | 13 |
from account.models import UserInfo |
14 |
-from mch.models import BrandInfo, ConsumeInfoSubmitLogInfo, DistributorInfo, LatestAppInfo, ModelInfo, OperatorInfo |
|
14 |
+from mch.models import (AdministratorInfo, BrandInfo, ConsumeInfoSubmitLogInfo, DistributorInfo, LatestAppInfo, |
|
15 |
+ ModelInfo, OperatorInfo) |
|
15 | 16 |
from statistic.models import (ConsumeDistributorSaleStatisticInfo, ConsumeModelSaleStatisticInfo, |
16 | 17 |
ConsumeProvinceSaleStatisticInfo, ConsumeSaleStatisticInfo) |
17 |
-from utils.error.errno_utils import (OperatorStatusCode, ProductBrandStatusCode, ProductDistributorStatusCode, |
|
18 |
- ProductModelStatusCode, SaleclerkStatusCode, UserStatusCode) |
|
18 |
+from utils.error.errno_utils import (AdministratorStatusCode, OperatorStatusCode, ProductBrandStatusCode, |
|
19 |
+ ProductDistributorStatusCode, ProductModelStatusCode, SaleclerkStatusCode, |
|
20 |
+ UserStatusCode) |
|
19 | 21 |
from utils.redis.connect import r |
20 | 22 |
|
21 | 23 |
|
@@ -44,6 +46,27 @@ def login_api(request): |
||
44 | 46 |
|
45 | 47 |
|
46 | 48 |
@logit |
49 |
+def admin_login_api(request): |
|
50 |
+ phone = request.POST.get('phone', '') |
|
51 |
+ password = request.POST.get('password', '') |
|
52 |
+ |
|
53 |
+ try: |
|
54 |
+ administrator = AdministratorInfo.objects.get(phone=phone, status=True) |
|
55 |
+ except AdministratorInfo.DoesNotExist: |
|
56 |
+ return response(AdministratorStatusCode.ADMINISTRATOR_NOT_FOUND) |
|
57 |
+ |
|
58 |
+ if administrator.user_status == OperatorInfo.DISABLED: |
|
59 |
+ return response(AdministratorStatusCode.ADMINISTRATOR_NOT_ACTIVATED) |
|
60 |
+ |
|
61 |
+ if not check_password(password, administrator.encryption): |
|
62 |
+ return response(AdministratorStatusCode.ADMINISTRATOR_PASSWORD_ERROR) |
|
63 |
+ |
|
64 |
+ request.session['admin_id'] = administrator.admin_id |
|
65 |
+ |
|
66 |
+ return response(200, 'Admin Login Success', u'管理员登录成功') |
|
67 |
+ |
|
68 |
+ |
|
69 |
+@logit |
|
47 | 70 |
def bmd_infos(request): |
48 | 71 |
optor_id = request.POST.get('optor_id', '') |
49 | 72 |
|
@@ -0,0 +1,140 @@ |
||
1 |
+# -*- coding: utf-8 -*- |
|
2 |
+ |
|
3 |
+from __future__ import division |
|
4 |
+ |
|
5 |
+from django.conf import settings |
|
6 |
+from django.contrib.auth.hashers import check_password, make_password |
|
7 |
+from django_logit import logit |
|
8 |
+from django_response import response |
|
9 |
+from paginator import pagination |
|
10 |
+from pywe_miniapp import get_phone_number |
|
11 |
+from pywe_storage import RedisStorage |
|
12 |
+from TimeConvert import TimeConvert as tc |
|
13 |
+ |
|
14 |
+from account.models import UserInfo |
|
15 |
+from mch.models import (AdministratorInfo, BrandInfo, ConsumeInfoSubmitLogInfo, DistributorInfo, LatestAppInfo, |
|
16 |
+ ModelInfo, OperatorInfo) |
|
17 |
+from statistic.models import (ConsumeDistributorSaleStatisticInfo, ConsumeModelSaleStatisticInfo, |
|
18 |
+ ConsumeProvinceSaleStatisticInfo, ConsumeSaleStatisticInfo) |
|
19 |
+from utils.error.errno_utils import (AdministratorStatusCode, OperatorStatusCode, ProductBrandStatusCode, |
|
20 |
+ ProductDistributorStatusCode, ProductModelStatusCode, SaleclerkStatusCode, |
|
21 |
+ UserStatusCode) |
|
22 |
+from utils.redis.connect import r |
|
23 |
+ |
|
24 |
+ |
|
25 |
+WECHAT = settings.WECHAT |
|
26 |
+ |
|
27 |
+ |
|
28 |
+@logit |
|
29 |
+def operator_add(request): |
|
30 |
+ name = request.POST.get('name', '') |
|
31 |
+ phone = request.POST.get('phone', '') |
|
32 |
+ password = request.POST.get('password', '') |
|
33 |
+ |
|
34 |
+ admin_id = request.session.get('admin_id') |
|
35 |
+ |
|
36 |
+ try: |
|
37 |
+ administrator = AdministratorInfo.objects.get(admin_id=admin_id, user_status=AdministratorInfo.ACTIVATED, status=True) |
|
38 |
+ except AdministratorInfo.DoesNotExist: |
|
39 |
+ return response(AdministratorStatusCode.ADMINISTRATOR_NOT_FOUND) |
|
40 |
+ |
|
41 |
+ try: |
|
42 |
+ operator = OperatorInfo.objects.get(brand_id=administrator.brand_id, phone=phone, user_status=OperatorInfo.ACTIVATED, status=True) |
|
43 |
+ except OperatorInfo.DoesNotExist: |
|
44 |
+ operator = None |
|
45 |
+ |
|
46 |
+ if operator: |
|
47 |
+ return response(OperatorStatusCode.OPERATOR_PHONE_ALREADY_EXISTS) |
|
48 |
+ |
|
49 |
+ encryption = make_password(password, settings.MAKE_PASSWORD_SALT, settings.MAKE_PASSWORD_HASHER) |
|
50 |
+ |
|
51 |
+ OperatorInfo.objects.create( |
|
52 |
+ brand_id=administrator.brand_id, |
|
53 |
+ name=name, |
|
54 |
+ phone=phone, |
|
55 |
+ encryption=encryption, |
|
56 |
+ ) |
|
57 |
+ |
|
58 |
+ return response(200, 'Operator Add Success', u'操作员添加成功') |
|
59 |
+ |
|
60 |
+ |
|
61 |
+@logit |
|
62 |
+def operator_delete(request): |
|
63 |
+ operator_id = request.POST.get('operator_id', '') |
|
64 |
+ |
|
65 |
+ admin_id = request.session.get('admin_id') |
|
66 |
+ |
|
67 |
+ try: |
|
68 |
+ administrator = AdministratorInfo.objects.get(admin_id=admin_id, user_status=AdministratorInfo.ACTIVATED, status=True) |
|
69 |
+ except AdministratorInfo.DoesNotExist: |
|
70 |
+ return response(AdministratorStatusCode.ADMINISTRATOR_NOT_FOUND) |
|
71 |
+ |
|
72 |
+ try: |
|
73 |
+ operator = OperatorInfo.objects.get(brand_id=administrator.brand_id, operator_id=operator_id, status=True) |
|
74 |
+ except OperatorInfo.DoesNotExist: |
|
75 |
+ return response(OperatorStatusCode.OPERATOR_NOT_FOUND) |
|
76 |
+ |
|
77 |
+ if operator.user_status == OperatorStatusCode.OPERATOR_HAS_DISABLED: |
|
78 |
+ return response(OperatorStatusCode.OPERATOR_HAS_DISABLED) |
|
79 |
+ elif operator.user_status == OperatorStatusCode.OPERATOR_HAS_DELETED: |
|
80 |
+ return response(OperatorStatusCode.OPERATOR_HAS_DELETED) |
|
81 |
+ |
|
82 |
+ operator.user_status = OperatorInfo.DELETED |
|
83 |
+ operator.save() |
|
84 |
+ |
|
85 |
+ return response(200, 'Operator Delete Success', u'操作员删除成功') |
|
86 |
+ |
|
87 |
+ |
|
88 |
+@logit |
|
89 |
+def operator_update(request): |
|
90 |
+ operator_id = request.POST.get('operator_id', '') |
|
91 |
+ name = request.POST.get('name', '') |
|
92 |
+ password = request.POST.get('password', '') |
|
93 |
+ |
|
94 |
+ admin_id = request.session.get('admin_id') |
|
95 |
+ |
|
96 |
+ try: |
|
97 |
+ administrator = AdministratorInfo.objects.get(admin_id=admin_id, user_status=AdministratorInfo.ACTIVATED, status=True) |
|
98 |
+ except AdministratorInfo.DoesNotExist: |
|
99 |
+ return response(AdministratorStatusCode.ADMINISTRATOR_NOT_FOUND) |
|
100 |
+ |
|
101 |
+ try: |
|
102 |
+ operator = OperatorInfo.objects.get(brand_id=administrator.brand_id, operator_id=operator_id, status=True) |
|
103 |
+ except OperatorInfo.DoesNotExist: |
|
104 |
+ return response(OperatorStatusCode.OPERATOR_NOT_FOUND) |
|
105 |
+ |
|
106 |
+ if operator.user_status == OperatorStatusCode.OPERATOR_HAS_DISABLED: |
|
107 |
+ return response(OperatorStatusCode.OPERATOR_HAS_DISABLED) |
|
108 |
+ elif operator.user_status == OperatorStatusCode.OPERATOR_HAS_DELETED: |
|
109 |
+ return response(OperatorStatusCode.OPERATOR_HAS_DELETED) |
|
110 |
+ |
|
111 |
+ if name: |
|
112 |
+ operator.name = name |
|
113 |
+ if password: |
|
114 |
+ operator.encryption = make_password(password, settings.MAKE_PASSWORD_SALT, settings.MAKE_PASSWORD_HASHER) |
|
115 |
+ |
|
116 |
+ operator.save() |
|
117 |
+ |
|
118 |
+ return response(200, 'Operator Update Success', u'操作员更新成功') |
|
119 |
+ |
|
120 |
+ |
|
121 |
+@logit |
|
122 |
+def operator_list(request): |
|
123 |
+ page = request.POST.get('page', 1) |
|
124 |
+ num = request.POST.get('num', 20) |
|
125 |
+ |
|
126 |
+ admin_id = request.session.get('admin_id') |
|
127 |
+ |
|
128 |
+ try: |
|
129 |
+ administrator = AdministratorInfo.objects.get(admin_id=admin_id, user_status=AdministratorInfo.ACTIVATED, status=True) |
|
130 |
+ except AdministratorInfo.DoesNotExist: |
|
131 |
+ return response(AdministratorStatusCode.ADMINISTRATOR_NOT_FOUND) |
|
132 |
+ |
|
133 |
+ optors = OperatorInfo.objects.filter(brand_id=administrator.brand_id, user_status=OperatorInfo.ACTIVATED, status=True) |
|
134 |
+ optors, left = pagination(optors, page, num) |
|
135 |
+ optors = [optor.data for optor in optors] |
|
136 |
+ |
|
137 |
+ return response(200, 'Get Operator List Success', u'获取操作员列表成功', { |
|
138 |
+ 'optors': optors, |
|
139 |
+ 'left': left, |
|
140 |
+ }) |
@@ -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 encrypt_views, mch_views |
|
8 |
+from api import encrypt_views, mch_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, |
@@ -189,6 +189,7 @@ urlpatterns += [ |
||
189 | 189 |
# Kodo |
190 | 190 |
urlpatterns += [ |
191 | 191 |
url(r'^login$', mch_views.login_api, name='login_api'), |
192 |
+ url(r'^admin/login$', mch_views.admin_login_api, name='admin_login_api'), |
|
192 | 193 |
] |
193 | 194 |
|
194 | 195 |
urlpatterns += [ |
@@ -232,3 +233,10 @@ urlpatterns += [ |
||
232 | 233 |
url(r'^tj/consumer$', tj_views.tj_consumer, name='tj_consumer'), # 统计数据(消费者维度) |
233 | 234 |
url(r'^tj/generate$', tj_views.tj_generate, name='tj_generate'), # 统计数据生成 |
234 | 235 |
] |
236 |
+ |
|
237 |
+urlpatterns += [ |
|
238 |
+ url(r'^operator/add$', operator_views.operator_add, name='operator_add'), |
|
239 |
+ url(r'^operator/delete$', operator_views.operator_delete, name='operator_delete'), |
|
240 |
+ url(r'^operator/update$', operator_views.operator_update, name='operator_update'), |
|
241 |
+ url(r'^operator/list$', operator_views.operator_list, name='operator_list'), |
|
242 |
+] |
@@ -0,0 +1,25 @@ |
||
1 |
+# -*- coding: utf-8 -*- |
|
2 |
+# Generated by Django 1.11.11 on 2018-05-14 07:19 |
|
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', '0017_auto_20180508_1830'), |
|
12 |
+ ] |
|
13 |
+ |
|
14 |
+ operations = [ |
|
15 |
+ migrations.AlterField( |
|
16 |
+ model_name='administratorinfo', |
|
17 |
+ name='user_status', |
|
18 |
+ field=models.IntegerField(choices=[(1, '\u5df2\u6fc0\u6d3b'), (2, '\u5df2\u7981\u7528'), (3, '\u5df2\u5220\u9664')], db_index=True, default=1, help_text='\u7ba1\u7406\u5458\u72b6\u6001', verbose_name='user_status'), |
|
19 |
+ ), |
|
20 |
+ migrations.AlterField( |
|
21 |
+ model_name='operatorinfo', |
|
22 |
+ name='user_status', |
|
23 |
+ field=models.IntegerField(choices=[(1, '\u5df2\u6fc0\u6d3b'), (2, '\u5df2\u7981\u7528'), (3, '\u5df2\u5220\u9664')], db_index=True, default=1, help_text='\u64cd\u4f5c\u5458\u72b6\u6001', verbose_name='user_status'), |
|
24 |
+ ), |
|
25 |
+ ] |
@@ -9,10 +9,12 @@ from shortuuidfield import ShortUUIDField |
||
9 | 9 |
class AdministratorInfo(BaseModelMixin): |
10 | 10 |
ACTIVATED = 1 |
11 | 11 |
DISABLED = 2 |
12 |
+ DELETED = 3 |
|
12 | 13 |
|
13 | 14 |
USER_STATUS_TUPLE = ( |
14 | 15 |
(ACTIVATED, u'已激活'), |
15 | 16 |
(DISABLED, u'已禁用'), |
17 |
+ (DELETED, u'已删除'), |
|
16 | 18 |
) |
17 | 19 |
|
18 | 20 |
admin_id = ShortUUIDField(_(u'admin_id'), max_length=32, blank=True, null=True, help_text=u'管理员唯一标识', db_index=True, unique=True) |
@@ -39,10 +41,12 @@ class AdministratorInfo(BaseModelMixin): |
||
39 | 41 |
class OperatorInfo(BaseModelMixin): |
40 | 42 |
ACTIVATED = 1 |
41 | 43 |
DISABLED = 2 |
44 |
+ DELETED = 3 |
|
42 | 45 |
|
43 | 46 |
USER_STATUS_TUPLE = ( |
44 | 47 |
(ACTIVATED, u'已激活'), |
45 | 48 |
(DISABLED, u'已禁用'), |
49 |
+ (DELETED, u'已删除'), |
|
46 | 50 |
) |
47 | 51 |
|
48 | 52 |
operator_id = ShortUUIDField(_(u'operator_id'), max_length=32, blank=True, null=True, help_text=u'操作员唯一标识', db_index=True, unique=True) |
@@ -65,6 +69,14 @@ class OperatorInfo(BaseModelMixin): |
||
65 | 69 |
def __unicode__(self): |
66 | 70 |
return u'{}-{}'.format(self.name, self.phone) |
67 | 71 |
|
72 |
+ @property |
|
73 |
+ def data(self): |
|
74 |
+ return { |
|
75 |
+ 'operator_id': self.operator_id, |
|
76 |
+ 'phone': self.phone, |
|
77 |
+ 'name': self.name, |
|
78 |
+ } |
|
79 |
+ |
|
68 | 80 |
|
69 | 81 |
class BrandInfo(BaseModelMixin): |
70 | 82 |
brand_id = ShortUUIDField(_(u'brand_id'), max_length=32, help_text=u'品牌唯一标识', db_index=True, unique=True) |
@@ -69,13 +69,30 @@ class TourGuideStatusCode(BaseStatusCode): |
||
69 | 69 |
TOURGUIDE_NOT_ACTIVATED = StatusCodeField(400115, 'Tour Guide Not Activated', description=u'导游帐号未激活') |
70 | 70 |
|
71 | 71 |
|
72 |
-class OperatorStatusCode(BaseStatusCode): |
|
72 |
+class AdministratorStatusCode(BaseStatusCode): |
|
73 | 73 |
""" 操作员相关错误码 4002xx """ |
74 |
- OPERATOR_NOT_FOUND = StatusCodeField(400201, 'Operator Not Found', description=u'操作员不存在') |
|
74 |
+ ADMINISTRATOR_NOT_FOUND = StatusCodeField(400201, 'Administrator Not Found', description=u'管理员不存在') |
|
75 |
+ # 密码 |
|
76 |
+ ADMINISTRATOR_PASSWORD_ERROR = StatusCodeField(400202, 'Administrator Password Error', description=u'管理员密码错误') |
|
77 |
+ # 手机号 |
|
78 |
+ ADMINISTRATOR_PHONE_ALREADY_EXISTS = StatusCodeField(400205, 'Administrator Phone Already Exists', description=u'管理员手机号已经存在') |
|
79 |
+ # 状态 |
|
80 |
+ ADMINISTRATOR_NOT_ACTIVATED = StatusCodeField(400215, 'Administrator Not Activated', description=u'管理员未激活') |
|
81 |
+ ADMINISTRATOR_HAS_DISABLED = StatusCodeField(400216, 'Administrator Has Disabled', description=u'管理员已禁用') |
|
82 |
+ ADMINISTRATOR_HAS_DELETED = StatusCodeField(400217, 'Administrator Has Deleted', description=u'管理员已删除') |
|
83 |
+ |
|
84 |
+ |
|
85 |
+class OperatorStatusCode(BaseStatusCode): |
|
86 |
+ """ 操作员相关错误码 4003xx """ |
|
87 |
+ OPERATOR_NOT_FOUND = StatusCodeField(400301, 'Operator Not Found', description=u'操作员不存在') |
|
75 | 88 |
# 密码 |
76 |
- OPERATOR_PASSWORD_ERROR = StatusCodeField(400202, 'Operator Password Error', description=u'操作员密码错误') |
|
89 |
+ OPERATOR_PASSWORD_ERROR = StatusCodeField(400302, 'Operator Password Error', description=u'操作员密码错误') |
|
90 |
+ # 手机号 |
|
91 |
+ OPERATOR_PHONE_ALREADY_EXISTS = StatusCodeField(400305, 'Operator Phone Already Exists', description=u'操作员手机号已经存在') |
|
77 | 92 |
# 状态 |
78 |
- OPERATOR_NOT_ACTIVATED = StatusCodeField(400215, 'Operator Not Activated', description=u'操作员未激活') |
|
93 |
+ OPERATOR_NOT_ACTIVATED = StatusCodeField(400315, 'Operator Not Activated', description=u'操作员未激活') |
|
94 |
+ OPERATOR_HAS_DISABLED = StatusCodeField(400316, 'Operator Has Disabled', description=u'操作员已禁用') |
|
95 |
+ OPERATOR_HAS_DELETED = StatusCodeField(400317, 'Operator Has Deleted', description=u'操作员已删除') |
|
79 | 96 |
|
80 | 97 |
|
81 | 98 |
class UserStatusCode(BaseStatusCode): |