add GetStatusRecordList
authorHongyuan Ma <CS_MaleicAcid@163.com>
Mon, 23 Jul 2018 18:18:43 +0000 (02:18 +0800)
committerHongyuan Ma <CS_MaleicAcid@163.com>
Mon, 23 Jul 2018 18:18:43 +0000 (02:18 +0800)
front-end/src/page/detailInfo/index.jsx
front-end/src/page/login/index.jsx
web/apps/test_records/serializer.py
web/apps/test_records/views.py
web/pgperffarm/urls.py

index 3938c229032a6e19952bc53eb99c71d454e3f3ee..af9008e50bd704b9729d207019887fed6bbf8e70 100644 (file)
@@ -218,6 +218,7 @@ class DetailInfo extends React.Component {
                     <Segment vertical>Farmer Info</Segment>
                     <FarmerCard machine={machine}></FarmerCard>
                     {/*//todo add a catalog*/}
+                    <div className="affix">aaaa</div>
                 </div>
 
                 <div className="col-md-9">
index 12b8b009cb62fea02129e7987d66d0aa3d98064a..317690e708664d018a049fffb2bdb75dbcbece5f 100644 (file)
@@ -74,71 +74,41 @@ class Login extends React.Component {
         return (
             <div id="page-wrapper">
                 <div className="row">
-                    <div class="col-lg-6">
-                        <h4>Disabled Form States</h4>
-                        <form role="form">
-                            <fieldset disabled="">
-                                <div class="form-group">
-                                    <label for="disabledSelect">Disabled input</label>
-                                    <input class="form-control" id="disabledInput" type="text" placeholder="Disabled input" disabled="">
-                                </div>
-                                <div class="form-group">
-                                    <label for="disabledSelect">Disabled select menu</label>
-                                    <select id="disabledSelect" class="form-control">
-                                        <option>Disabled select</option>
-                                    </select>
-                                </div>
-                                <div class="checkbox">
-                                    <label>
-                                        <input type="checkbox">Disabled Checkbox
-                                    </label>
-                                </div>
-                                <button type="submit" class="btn btn-primary">Disabled Button</button>
-                            </fieldset>
-                        </form>
-                        <h4>Form Validation States</h4>
-                        <form role="form">
-                            <div class="form-group has-success">
-                                <label class="control-label" for="inputSuccess">Input with success</label>
-                                <input type="text" class="form-control" id="inputSuccess">
-                            </div>
-                            <div class="form-group has-warning">
-                                <label class="control-label" for="inputWarning">Input with warning</label>
-                                <input type="text" class="form-control" id="inputWarning">
-                            </div>
-                            <div class="form-group has-error">
-                                <label class="control-label" for="inputError">Input with error</label>
-                                <input type="text" class="form-control" id="inputError">
+                    <div className="col-lg-16">
+                        <div className="panel panel-default">
+                            <div className="panel-heading">
+                                login to manage your machines!
                             </div>
-                        </form>
-                        <h4>Input Groups</h4>
-                        <form role="form">
-                            <div class="form-group input-group">
-                                <span class="input-group-addon">@</span>
-                                <input type="text" class="form-control" placeholder="Username">
-                            </div>
-                            <div class="form-group input-group">
-                                <input type="text" class="form-control">
-                                    <span class="input-group-addon">.00</span>
-                            </div>
-                            <div class="form-group input-group">
-                                            <span class="input-group-addon"><i class="fa fa-eur"></i>
-                                            </span>
-                                <input type="text" class="form-control" placeholder="Font Awesome Icon">
-                            </div>
-                            <div class="form-group input-group">
-                                <span class="input-group-addon">$</span>
-                                <input type="text" class="form-control">
-                                    <span class="input-group-addon">.00</span>
-                            </div>
-                            <div class="form-group input-group">
-                                <input type="text" class="form-control">
-                                            <span class="input-group-btn">
-                                                <button class="btn btn-default" type="button"><i class="fa fa-search"></i>
-                                                </button>
-                                            </span>
+                            <div className="panel-body">
+                                <div className="row">
+                                    {/*<!-- /.col-lg-6 (nested) -->*/}
+                                    <div className="col-lg-12">
+                                        <h4>Login Form</h4>
+                                        <form role="form">
+                                            <div className="form-group">
+                                                {/*<label className="control-label" for="inputLogin"> login input</label>*/}
+                                                <input type="text" className="form-control" id="inputLogin"
+                                                       placeholder="Username or email"
+                                                       name="username"
+                                                       onKeyUp={e => this.onInputKeyUp(e)}
+                                                       onChange={e => this.onInputChange(e)}/>
+                                            </div>
+                                            <div className="form-group">
+                                                <input type="text" className="form-control" id="inputPwd"
+                                                       name="password"
+                                                       placeholder="password" onKeyUp={e => this.onInputKeyUp(e)}
+                                                       onChange={e => this.onInputChange(e)}/>
+                                            </div>
+                                            <button type="button" className="btn btn-primary"  onClick={e => {this.onSubmit(e)}}>Button</button>
+                                        </form>
+                                    </div>
+                                    {/*<!-- /.col-lg-6 (nested) -->*/}
+                                </div>
+                                {/*<!-- /.row (nested) -->*/}
                             </div>
-                        </form>
+                            {/*<!-- /.panel-body -->*/}
+                        </div>
+                        {/*<!-- /.panel -->*/}
                     </div>
                     {/*<!-- /.col-lg-12 -->*/}
                 </div>
index 11a8cf3edbb794798297b85b9f766325b066bf54..19732a221da738a63f41022960c578548e495f66 100644 (file)
@@ -15,7 +15,7 @@ class TestBranchSerializer(serializers.ModelSerializer):
 
     class Meta:
         model = TestBranch
-        fields = ('branch_name',)
+        fields = ('branch_name','id')
 
 
 class TestCategorySerializer(serializers.ModelSerializer):
@@ -136,6 +136,64 @@ class CreateTestDateSetSerializer(serializers.ModelSerializer):
         model = TestDataSet
         fields = "__all__"
 
+class TestStatusRecordListSerializer(serializers.ModelSerializer):
+    '''
+    use ModelSerializer
+    '''
+    pg_info = PGInfoSerializer()
+    linux_info = LinuxInfoSerializer()
+    meta_info = MetaInfoSerializer()
+    branch = serializers.SerializerMethodField()
+    trend = serializers.SerializerMethodField()
+    machine_info = serializers.SerializerMethodField()
+
+    # client_max_num = serializers.SerializerMethodField()
+    class Meta:
+        model = TestRecord
+        fields = ('uuid', 'add_time', 'machine_info', 'pg_info', 'branch', 'trend', 'linux_info', 'meta_info')
+
+    def get_branch(self, obj):
+        branch = TestBranch.objects.filter(id=obj.branch.id).first()
+
+        serializer = TestBranchSerializer(branch)
+        return serializer.data["branch_name"]
+
+    def get_trend(self, obj):
+        dataset_list = TestDataSet.objects.filter(test_record_id=obj.id).values_list('status').annotate(Count('id'))
+        data_list_count = TestDataSet.objects.filter(test_record_id=obj.id).count()
+
+        trend = {}
+        trend['improved'] = 0
+        trend['quo'] = 0
+        trend['regressive'] = 0
+        trend['none'] = 0
+        trend['is_first'] = False
+        for i in dataset_list:
+            if i[0] == DB_ENUM['status']['improved']:
+                trend['improved'] += i[1]
+            elif i[0] == DB_ENUM['status']['quo']:
+                trend['quo'] += i[1]
+            elif i[0] == DB_ENUM['status']['regressive']:
+                trend['regressive'] += i[1]
+            elif i[0] == DB_ENUM['status']['none']:
+                trend['none'] += i[1]
+
+        if (data_list_count == trend['none']):
+            trend['is_first'] = True
+
+        print str(data_list_count)
+        return trend
+
+    def get_machine_info(self, obj):
+        machine_data = UserMachine.objects.filter(id=obj.test_machine_id)
+
+        machine_info_serializer = UserMachineSerializer(machine_data, many=True)
+        return machine_info_serializer.data
+
+    # def get_client_max_num(self, obj):
+    #     ro_client_num = TestResult.objects.filter(Q(test_record_id=obj.id ) ,test_cate_id=1).order_by('clients').distinct('clients').count()
+    #     rw_client_num = TestResult.objects.filter(Q(test_record_id=obj.id ) ,test_cate_id=2).order_by('clients').distinct('clients').count()
+    #     return max(ro_client_num,rw_client_num)
 
 class TestRecordListSerializer(serializers.ModelSerializer):
     '''
index a5679763e2d1216bd3311d7fb53fd59b50468963..fd0c2d5d071362a277f9c66f3671ce2a82cce1f1 100644 (file)
@@ -5,14 +5,16 @@ import django_filters
 import shortuuid
 
 from django.contrib.auth.hashers import make_password
+from django.db.models import Count
+# from requests import request
 from rest_framework.pagination import PageNumberPagination
 
 from exception import TestDataUploadError
 from test_records.filters import TestRecordListFilter
-from models import UserMachine, TestCategory
+from models import UserMachine, TestCategory, TestBranch
 from pgperffarm.settings import DB_ENUM
 from user_operation.views import UserMachinePermission
-from .serializer import MachineHistoryRecordSerializer
+from .serializer import MachineHistoryRecordSerializer, TestStatusRecordListSerializer, TestBranchSerializer
 from .serializer import TestRecordListSerializer, TestRecordDetailSerializer, LinuxInfoSerializer, MetaInfoSerializer, \
     PGInfoSerializer, CreateTestRecordSerializer, CreateTestDateSetSerializer, TestResultSerializer
 
@@ -54,18 +56,25 @@ class TestRecordListViewSet(mixins.ListModelMixin, viewsets.GenericViewSet):
     filter_backends = (django_filters.rest_framework.DjangoFilterBackend,)
     filter_class = TestRecordListFilter
 
-class TestStatusRecordListViewSet(mixins.ListModelMixin, viewsets.GenericViewSet):
+@api_view(['GET'])
+def GetStatusRecordList(request, format=None):
     """
-    List test records
+    List lastest test records involve all branches
     """
 
-    queryset = TestRecord.objects.all().order_by('add_time')
-    serializer_class = TestRecordListSerializer
-    pagination_class = StandardResultsSetPagination
-    filter_backends = (django_filters.rest_framework.DjangoFilterBackend,)
-    filter_class = TestRecordListFilter
+    queryset = TestBranch.objects.all().order_by('branch_order').values_list('id','branch_name').annotate(num_records=Count('testrecord')).filter(num_records__gt=0)
+    # print queryset # <QuerySet [(1, u'HEAD', 3), (2, u'10_STABLE', 2)]>
 
+    ret = {'branch_num':queryset.__len__(),'result':[]}
+    for branch_item in queryset:
 
+        target_record = TestRecord.objects.filter(branch_id=branch_item[0]).order_by('test_machine_id','-add_time').distinct('test_machine_id').all()
+        # print target_record  # <QuerySet [(1, u'HEAD', 3), (2, u'10_STABLE', 2)]>
+        data = TestRecordListSerializer(target_record,many=True)
+        obj = {'branch':branch_item[1],'data':data.data}
+        ret["result"].append(obj)
+    # msg = 'ok!'
+    return Response(ret, status=status.HTTP_201_CREATED)
 
 
 class TestRecordDetailViewSet(mixins.RetrieveModelMixin, viewsets.GenericViewSet):
index 2077330fa937eeeb6e834e9a5e9abc4b63d4d84e..c2d5d43002cf424e9c29539b42407d176c32d6e0 100644 (file)
@@ -22,7 +22,7 @@ from django.views.generic.base import RedirectView
 from rest_framework.documentation import include_docs_urls
 from rest_framework.routers import DefaultRouter
 from test_records.views import TestRecordListViewSet, TestRecordCreate, TestRecordDetailViewSet, \
-    MachineHistoryRecordViewSet, TestStatusRecordListViewSet
+    MachineHistoryRecordViewSet, GetStatusRecordList
 from test_records.auth import MachineAuthToken
 # from test_records.view_base import TestListView
 
@@ -35,7 +35,7 @@ from user_operation.views import UserMachineListViewSet, UserPortalInfoViewSet,
 
 router = DefaultRouter()
 router.register(r'records', TestRecordListViewSet, base_name="records")
-router.register(r'status-records', TestStatusRecordListViewSet, base_name="status-records")
+router.register(r'status-records', TestStatusRecordListViewSet, base_name="status-records")
 router.register(r'detail', TestRecordDetailViewSet, base_name="detail")
 router.register(r'machine-records', MachineHistoryRecordViewSet, base_name="machine-records")
 router.register(r'machine-records-by-branch', UserMachineRecordByBranchListViewSet, base_name="machine-records-by-branch")
@@ -61,6 +61,8 @@ urlpatterns = [
     # url(r'status/$', TestListView.as_view(), name='test-list'),
     # url(r'detail', TestRecordDetailViewSet ,name="detail"),
     url(r'upload/$', TestRecordCreate, name='test-upload'),
+    url(r'status-records/$', GetStatusRecordList, name='status-records'),
+
     # url(r'portal/$', UserPortalInfoViewSet, name='portal'),
     # url(r'my-machine/$', UserMachineList.as_view(), name='my-machine'),