summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorHongyuan Ma2018-07-06 15:42:47 +0000
committerHongyuan Ma2018-07-06 15:42:47 +0000
commit9d55abe4b7caa9c8d35ec4e71abbc3668dc587e7 (patch)
tree4c6fbed368040d64166a4a685fd24a20427249ea
parenta651a210fb6f311f4d35db913a637b306c97b888 (diff)
add UserMachineManageSerializer;override jwt handler
-rw-r--r--front-end/src/page/login/index.jsx7
-rw-r--r--front-end/src/service/record-service.jsx1
-rw-r--r--front-end/src/service/user-service.jsx2
-rw-r--r--front-end/src/util/constant.jsx4
-rw-r--r--front-end/src/util/util.jsx37
-rw-r--r--web/apps/test_records/views.py6
-rw-r--r--web/apps/user_operation/serializer.py41
-rw-r--r--web/apps/user_operation/views.py27
-rw-r--r--web/apps/users/jwt_handler.py9
-rw-r--r--web/apps/users/models.py8
-rw-r--r--web/apps/users/serializer.py5
-rw-r--r--web/apps/users/views.py8
-rw-r--r--web/pgperffarm/settings.py7
-rw-r--r--web/pgperffarm/urls.py7
14 files changed, 140 insertions, 29 deletions
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&param1=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),