add UserMachineManageSerializer;override jwt handler
authorHongyuan Ma <CS_MaleicAcid@163.com>
Fri, 6 Jul 2018 15:42:47 +0000 (23:42 +0800)
committerHongyuan Ma <CS_MaleicAcid@163.com>
Fri, 6 Jul 2018 15:42:47 +0000 (23:42 +0800)
14 files changed:
front-end/src/page/login/index.jsx
front-end/src/service/record-service.jsx
front-end/src/service/user-service.jsx
front-end/src/util/constant.jsx
front-end/src/util/util.jsx
web/apps/test_records/views.py
web/apps/user_operation/serializer.py [new file with mode: 0644]
web/apps/user_operation/views.py
web/apps/users/jwt_handler.py [new file with mode: 0644]
web/apps/users/models.py
web/apps/users/serializer.py
web/apps/users/views.py
web/pgperffarm/settings.py
web/pgperffarm/urls.py

index c2de98a7821e92546ab09ae4ad656c4181d36a9e..bbf6bb44085dcc1e12dbdaad8754344889cd1435 100644 (file)
@@ -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
index 987d517184abcf09ba8f7eed4b877b87a37801f0..c45e7669ba23aed7a11cdf3b03073e7568a3bbef 100644 (file)
@@ -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{
index 9f0c7c0150266e528b28160df4d94820f6fcca75..611bd41561fd6a6ecaa380f9db26f355fd2cc17f 100644 (file)
@@ -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
     // }
index ce6f901bbdbb8682032d25c1379007da6a5921e6..6e8c9a8af58ec7f5585bebdf56edb9bb35adb1d6 100644 (file)
@@ -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
index 72029293d538df36583ff2df9378b7b68318f205..0af29a2ef8e8fc4167af4b57a709af8608d2bc34 100644 (file)
@@ -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);
index de86c6fc23bba49738ad063ef7217b47e2d96806..e5fcfa36bd357738fa8fbdf41e19f1a03db38459 100644 (file)
@@ -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 (file)
index 0000000..dcaa32b
--- /dev/null
@@ -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
index e784a0bd2ca964dad77a68f8c0a31f8e9ae27a36..5e8ea8afe58261a285063c492ecf03be9efd7384 100644 (file)
@@ -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 (file)
index 0000000..73611e5
--- /dev/null
@@ -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
index 2b5eb6250b5afb94b1b2c6e986bac6fed23d3016..c7c0a6e481767641265970d2ff7d230b87380139 100644 (file)
@@ -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"
index 772bf9671e237215ea059a49441617e2e11f2b44..c3fffc8c91b1ade14e025d940074340806f95aba 100644 (file)
@@ -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
index fc6795f9b0fc61dc227c0c13a0de6996d1a8f24b..6ba4b36029924481cbeaf370a66e95ba4003fb7e 100644 (file)
@@ -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
index 8f6d3818d3265a1f5e9f93b53c2d15af2d16872a..8606f3940b7b2ba466525103504b00d328107c37 100644 (file)
@@ -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
index 3e536a522240ab5e4b11a475c5dc085847dba523..e3b3d52fa29b73787d3bbf3fb03116cf09813fe4 100644 (file)
@@ -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),