Operator add/delete/update/list

Brightcells 7 anos atrás
pai
commit
62948fb5c3
6 arquivos alterados com 233 adições e 8 exclusões
  1. 26 3
      api/mch_views.py
  2. 140 0
      api/operator_views.py
  3. 9 1
      api/urls.py
  4. 25 0
      mch/migrations/0018_auto_20180514_1519.py
  5. 12 0
      mch/models.py
  6. 21 4
      utils/error/errno_utils.py

+ 26 - 3
api/mch_views.py

@@ -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
 

+ 140 - 0
api/operator_views.py

@@ -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
+    })

+ 9 - 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 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
+]

+ 25 - 0
mch/migrations/0018_auto_20180514_1519.py

@@ -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
+    ]

+ 12 - 0
mch/models.py

@@ -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)

+ 21 - 4
utils/error/errno_utils.py

@@ -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):