From 9d55abe4b7caa9c8d35ec4e71abbc3668dc587e7 Mon Sep 17 00:00:00 2001 From: Hongyuan Ma Date: Fri, 6 Jul 2018 23:42:47 +0800 Subject: [PATCH] add UserMachineManageSerializer;override jwt handler --- front-end/src/page/login/index.jsx | 7 ++-- front-end/src/service/record-service.jsx | 1 + front-end/src/service/user-service.jsx | 2 ++ front-end/src/util/constant.jsx | 4 +++ front-end/src/util/util.jsx | 37 ++++++++++++++------- web/apps/test_records/views.py | 6 ++-- web/apps/user_operation/serializer.py | 41 ++++++++++++++++++++++++ web/apps/user_operation/views.py | 27 +++++++++++++++- web/apps/users/jwt_handler.py | 9 ++++++ web/apps/users/models.py | 8 +++++ web/apps/users/serializer.py | 5 ++- web/apps/users/views.py | 8 ----- web/pgperffarm/settings.py | 7 +++- web/pgperffarm/urls.py | 7 +++- 14 files changed, 140 insertions(+), 29 deletions(-) create mode 100644 web/apps/user_operation/serializer.py create mode 100644 web/apps/users/jwt_handler.py diff --git a/front-end/src/page/login/index.jsx b/front-end/src/page/login/index.jsx index c2de98a..bbf6bb4 100644 --- a/front-end/src/page/login/index.jsx +++ b/front-end/src/page/login/index.jsx @@ -11,7 +11,7 @@ class Login extends React.Component { this.state = { username: '', password: '', - redirect: 'portal' + redirect: _util.getUrlParam('redirect') || 'portal', } } @@ -42,11 +42,12 @@ class Login extends React.Component { // check success if (checkResult.status) { _user.login(loginInfo).then((res) => { + console.dir(res) _util.setStorage('userInfo', res); this.props.history.push(this.state.redirect); }, (errMsg) => { - console.log(errMsg) - // _util.errorTips(errMsg); + // console.log(errMsg) + _util.errorTips(errMsg); }); } // check failure diff --git a/front-end/src/service/record-service.jsx b/front-end/src/service/record-service.jsx index 987d517..c45e766 100644 --- a/front-end/src/service/record-service.jsx +++ b/front-end/src/service/record-service.jsx @@ -1,5 +1,6 @@ import PGUtil from 'util/util.jsx' import PGConstant from 'util/constant.jsx' +// const _const = new PGConstant(); const _util = new PGUtil(); class Record{ diff --git a/front-end/src/service/user-service.jsx b/front-end/src/service/user-service.jsx index 9f0c7c0..611bd41 100644 --- a/front-end/src/service/user-service.jsx +++ b/front-end/src/service/user-service.jsx @@ -1,5 +1,6 @@ import PGUtil from 'util/util.jsx' import PGConstant from 'util/constant.jsx' + const _util = new PGUtil(); class User{ @@ -42,6 +43,7 @@ class User{ url : url }); } + // getUserList(pageNum){ // # todo // } diff --git a/front-end/src/util/constant.jsx b/front-end/src/util/constant.jsx index ce6f901..6e8c9a8 100644 --- a/front-end/src/util/constant.jsx +++ b/front-end/src/util/constant.jsx @@ -1,5 +1,9 @@ const object = { base_url:'http://127.0.0.1:8000', + + name:'好123', + USER_UNLOGIN_CODE:10, + }; export default object; \ No newline at end of file diff --git a/front-end/src/util/util.jsx b/front-end/src/util/util.jsx index 7202929..0af29a2 100644 --- a/front-end/src/util/util.jsx +++ b/front-end/src/util/util.jsx @@ -1,4 +1,6 @@ -const BASE_URL = '127.0.0.1:8000' + +import PGConstant from 'util/constant.jsx' +// const _const = new PGConstant(); class PGUtil { request(param) { return new Promise((resolve, reject) => { @@ -11,16 +13,16 @@ class PGUtil { // request success typeof resolve === 'function' && resolve(res, res.msg); - // if (0 === res.status) { - // typeof resolve === 'function' && resolve(res.data, res.msg); - // } - // // nologin force to login - // else if (10 === res.status) { - // this.doLogin(); - // } - // else { - // typeof reject === 'function' && reject(res.msg || res.data); - // } + if (0 === res.status) { + typeof resolve === 'function' && resolve(res.data, res.msg); + } + // nologin force to login + else if (PGConstant.USER_UNLOGIN_CODE === res.status) { + this.doLogin(); + } + else { + typeof reject === 'function' && reject(res.msg || res.data); + } }, error: err => { typeof reject === 'function' && reject(err.statusText); @@ -29,6 +31,19 @@ class PGUtil { }); } + // redirect to login + doLogin(){ + window.location.href = '/login?redirect=' + encodeURIComponent(window.location.pathname); + } + + getUrlParam(name){ + // param=123¶m1=456 + let queryString = window.location.search.split('?')[1] || '', + reg = new RegExp("(^|&)" + name + "=([^&]*)(&|$)"), + result = queryString.match(reg); + return result ? decodeURIComponent(result[2]) : null; + } + // success tips successTips(successMsg) { alert(successMsg); diff --git a/web/apps/test_records/views.py b/web/apps/test_records/views.py index de86c6f..e5fcfa3 100644 --- a/web/apps/test_records/views.py +++ b/web/apps/test_records/views.py @@ -11,7 +11,7 @@ from exception import TestDataUploadError from filters import TestRecordListFilter from models import UserMachine, TestCategory from pgperffarm.settings import DB_ENUM -from users.views import UserMachinePermission +from user_operation.views import UserMachinePermission from .serializer import MachineHistoryRecordSerializer from .serializer import TestRecordListSerializer, TestRecordDetailSerializer, LinuxInfoSerializer, MetaInfoSerializer, \ PGInfoSerializer, CreateTestRecordSerializer, CreateTestDateSetSerializer, TestResultSerializer @@ -77,7 +77,7 @@ def TestRecordCreate(request, format=None): # jsLoads = json.loads(data[0]) # todo get machine by token - test_machine = UserMachine.objects.filter(secret) + # test_machine = UserMachine.objects.filter(secret) from django.db import transaction @@ -162,7 +162,7 @@ def TestRecordCreate(request, format=None): 'metric': dataset['metric'], 'median': dataset['median'], 'test_cate': test_cate.id, - # status,percentage calc by receiver + # status,percentage will calc by receiver 'status': -1, 'percentage': 0.0, } diff --git a/web/apps/user_operation/serializer.py b/web/apps/user_operation/serializer.py new file mode 100644 index 0000000..dcaa32b --- /dev/null +++ b/web/apps/user_operation/serializer.py @@ -0,0 +1,41 @@ +from rest_framework import serializers + +from users.serializer import AliasSerializer +from test_records.models import TestRecord +from users.models import UserMachine, Alias, UserProfile +import hashlib + +class UserMachineManageSerializer(serializers.ModelSerializer): + ''' + use UserMachineSerializer + ''' + + alias = serializers.SerializerMethodField() + reports = serializers.SerializerMethodField() + owner = serializers.SerializerMethodField() + avatar = serializers.SerializerMethodField() + class Meta: + model = UserMachine + fields = ('alias', 'os_name', 'os_version', 'comp_name', 'comp_version', 'reports', 'owner' , 'avatar', 'state') + + def get_alias(self, obj): + target_alias = Alias.objects.filter(id=obj.alias_id).first() + + serializer = AliasSerializer(target_alias) + return serializer.data['name'] + + def get_reports(self, obj): + reports_num = TestRecord.objects.filter(test_machine_id=obj.id).count() + return reports_num + + def get_owner(self, obj): + target_owner = UserProfile.objects.filter(id=obj.machine_owner_id).values('email').first() + + return target_owner['email'] + + def get_avatar(self, obj): + target_owner = UserProfile.objects.filter(id=obj.machine_owner_id).values('email').first() + + avatar = 'http://s.gravatar.com/avatar/' + hashlib.md5(target_owner['email']).hexdigest() + print avatar + return avatar diff --git a/web/apps/user_operation/views.py b/web/apps/user_operation/views.py index e784a0b..5e8ea8a 100644 --- a/web/apps/user_operation/views.py +++ b/web/apps/user_operation/views.py @@ -2,5 +2,30 @@ from __future__ import unicode_literals from django.shortcuts import render +from rest_framework import mixins, viewsets, permissions -# Create your views here. +from rest_framework import authentication +from rest_framework_jwt.authentication import JSONWebTokenAuthentication + +from models import UserMachine +from serializer import UserMachineManageSerializer + + +class UserMachineListViewSet(mixins.ListModelMixin, viewsets.GenericViewSet): + """ + List test records + """ + authentication_classes = (JSONWebTokenAuthentication, authentication.SessionAuthentication ) + queryset = UserMachine.objects.all().order_by('add_time') + serializer_class = UserMachineManageSerializer + # pagination_class = StandardResultsSetPagination + +class UserMachinePermission(permissions.BasePermission): + """ + Machine permission check + """ + + def has_permission(self, request, view): + secret = request.data.secret + ret = UserMachine.objects.filter(machine_secret=secret,is_active=1).exists() + return ret \ No newline at end of file diff --git a/web/apps/users/jwt_handler.py b/web/apps/users/jwt_handler.py new file mode 100644 index 0000000..73611e5 --- /dev/null +++ b/web/apps/users/jwt_handler.py @@ -0,0 +1,9 @@ +from serializer import JWTUserProfileSerializer + + +def jwt_response_payload_handler(token, user=None, request=None): + return { + 'token': token, + 'username': JWTUserProfileSerializer(user).data['username'], + 'status': 1 + } \ No newline at end of file diff --git a/web/apps/users/models.py b/web/apps/users/models.py index 2b5eb62..c7c0a6e 100644 --- a/web/apps/users/models.py +++ b/web/apps/users/models.py @@ -43,6 +43,14 @@ class UserMachine(models.Model): comp_version = models.CharField(max_length=32, verbose_name="compiler version") add_time = models.DateTimeField(default=timezone.now, verbose_name="machine added time") + STATE_CHOICE = ( + ('prohibited', -1), + ('pending', 0), + ('active', 1), + + ) + state = models.IntegerField(choices=STATE_CHOICE, default=0,verbose_name="state", help_text="machine state") + class Meta: verbose_name = "user machines" verbose_name_plural = "user machines" diff --git a/web/apps/users/serializer.py b/web/apps/users/serializer.py index 772bf96..c3fffc8 100644 --- a/web/apps/users/serializer.py +++ b/web/apps/users/serializer.py @@ -2,7 +2,6 @@ from rest_framework import serializers from test_records.models import TestRecord from users.models import UserMachine, Alias, UserProfile -from django.db.models import Q import hashlib class AliasSerializer(serializers.ModelSerializer): @@ -49,3 +48,7 @@ class UserMachineSerializer(serializers.ModelSerializer): print avatar return avatar +class JWTUserProfileSerializer(serializers.ModelSerializer): + class Meta: + model = UserProfile + fields = ('username', ) \ No newline at end of file diff --git a/web/apps/users/views.py b/web/apps/users/views.py index fc6795f..6ba4b36 100644 --- a/web/apps/users/views.py +++ b/web/apps/users/views.py @@ -25,12 +25,4 @@ class CustomBackend(ModelBackend): return None -class UserMachinePermission(permissions.BasePermission): - """ - Machine permission check - """ - def has_permission(self, request, view): - secret = request.data.secret - ret = UserMachine.objects.filter(machine_secret=secret,is_active=1).exists() - return ret diff --git a/web/pgperffarm/settings.py b/web/pgperffarm/settings.py index 8f6d381..8606f39 100644 --- a/web/pgperffarm/settings.py +++ b/web/pgperffarm/settings.py @@ -187,4 +187,9 @@ CORS_ALLOW_HEADERS = ( 'x-requested-with', 'Pragma', ) -ALLOWED_HOSTS = ['*'] \ No newline at end of file +ALLOWED_HOSTS = ['*'] + +JWT_AUTH = { + 'JWT_RESPONSE_PAYLOAD_HANDLER': + 'users.jwt_handler.jwt_response_payload_handler', +} \ No newline at end of file diff --git a/web/pgperffarm/urls.py b/web/pgperffarm/urls.py index 3e536a5..e3b3d52 100644 --- a/web/pgperffarm/urls.py +++ b/web/pgperffarm/urls.py @@ -31,11 +31,16 @@ from test_records.auth import MachineAuthToken # 'get': 'list', # 'post': 'create' # }) +from user_operation.views import UserMachineListViewSet + router = DefaultRouter() router.register(r'records', TestRecordListViewSet, base_name="records") router.register(r'detail', TestRecordDetailViewSet, base_name="detail") router.register(r'machine', MachineHistoryRecordViewSet, base_name="machine") -# router.register(r'detail', TestRecordListViewSet) + +# user's machine manage list +router.register(r'my-machine', UserMachineListViewSet, base_name="my-machine") + urlpatterns = [ # url(r'^admin/', admin.site.urls), -- 2.39.5