update TestRecordListSerializer;add trend field;
authorHongyuan Ma <CS_MaleicAcid@163.com>
Mon, 18 Jun 2018 02:54:57 +0000 (10:54 +0800)
committerHongyuan Ma <CS_MaleicAcid@163.com>
Mon, 18 Jun 2018 02:54:57 +0000 (10:54 +0800)
client/post-example/results.json
web/apps/test_records/models.py
web/apps/test_records/serializer.py
web/apps/test_records/views.py
web/pgperffarm/settings.py

index e189d89277fa31809bd164b88bbe763c5a68ee43..1e5d9139263a732dd0beed418fe7797a13b6d1f3 100644 (file)
@@ -4,7 +4,7 @@
             "10": {
                 "1": {
                     "std": 397.30643899999995, 
-                    "metric": 11892.645435, 
+                    "metric": 11292.645435, 
                     "median": 11892.645435, 
                     "results": [
                         {
@@ -37,7 +37,7 @@
                 }, 
                 "2": {
                     "std": 252.71243850000064, 
-                    "metric": 28953.186513499997, 
+                    "metric": 28983.186513499997, 
                     "median": 28953.186513499997, 
                     "results": [
                         {
@@ -70,7 +70,7 @@
                 }, 
                 "4": {
                     "std": 285.0294699999995, 
-                    "metric": 28795.454019999997, 
+                    "metric": 38295.454019999997, 
                     "median": 28795.454019999997, 
                     "results": [
                         {
             "10": {
                 "1": {
                     "std": 86.91589850000001, 
-                    "metric": 150.6329775, 
+                    "metric": 350.6329775, 
                     "median": 150.6329775, 
                     "results": [
                         {
                 }, 
                 "2": {
                     "std": 4.182392499999992, 
-                    "metric": 280.8884175, 
+                    "metric": 180.8884175, 
                     "median": 280.8884175, 
                     "results": [
                         {
                 }, 
                 "4": {
                     "std": 15.571989000000002, 
-                    "metric": 399.858649, 
+                    "metric": 390.858649, 
                     "median": 399.858649, 
                     "results": [
                         {
index ddd34cce7edc86bcf1258e508329ee9dc06b6127..df89e222e491afb88941521eadaa00dfec846cb1 100644 (file)
@@ -168,7 +168,9 @@ def calc_status(sender, instance, **kwargs):
     print("prev dataset is: " + str(prevTestDataSet.id))
 
     percentage = (instance.metric - prevTestDataSet.metric)/prevTestDataSet.metric
-
+    print('instance.metric is:' + str(instance.metric))
+    print('prevTestDataSet.metric is:' + str(prevTestDataSet.metric))
+    print('percentage is:' + str(percentage))
     status = 0
     if(percentage >= 0.05):
         status = 1
@@ -180,8 +182,7 @@ def calc_status(sender, instance, **kwargs):
     instance.percentage = percentage
     instance.status = status
     instance.prev_id = prevTestDataSet.id
-    # print instance
-    # instance.save()
+
     return
 
 
index 143638b47e71f44d349cc0444b22d6c736252717..1389968979ba5d1b6197c71e723cfbb5a8862ed9 100644 (file)
@@ -1,8 +1,12 @@
 from rest_framework import serializers
+
+from pgperffarm.settings import DB_ENUM
 from test_records.models import TestRecord, TestResult, PGInfo, LinuxInfo ,MetaInfo, TestDataSet
 from users.serializer import UserMachineSerializer
 from users.models import UserMachine
-from django.db.models import Q
+from django.db.models import Q, QuerySet, Count
+
+
 class PGInfoSerializer(serializers.ModelSerializer):
 
     '''
@@ -67,28 +71,12 @@ class CreateTestDateSetSerializer(serializers.ModelSerializer):
         'status': -1,
         'percentage': 0.0,
     '''
-    # def create(self, validated_data):
-    #     testDataSet = TestDataSet(
-    #         test_record=validated_data['test_record'],
-    #         clients=validated_data['clients'],
-    #         scale=validated_data['scale'],
-    #         std=validated_data['std'],
-    #         metric=validated_data['metric'],
-    #         test_cate=validated_data['test_cate'],
-    #         prev=validated_data['prev'],
-    #         status=validated_data['status'],
-    #         percentage=validated_data['percentage'],
-    #     )
-    #
-    #     # testDataSet.set_password(validated_data['password'])
-    #     testDataSet.save()
-    #     return testDataSet
 
     class Meta:
         model = TestDataSet
         fields = "__all__"
 
-class TestRecordSerializer(serializers.ModelSerializer):
+class TestRecordListSerializer(serializers.ModelSerializer):
 
     '''
     use ModelSerializer
@@ -96,36 +84,51 @@ class TestRecordSerializer(serializers.ModelSerializer):
     pg_info =PGInfoSerializer()
     linux_info = LinuxInfoSerializer()
     meta_info = MetaInfoSerializer()
-    ro_info = serializers.SerializerMethodField()
-    rw_info = serializers.SerializerMethodField()
+
+    trend = serializers.SerializerMethodField()
     machine_info = serializers.SerializerMethodField()
-    client_max_num = serializers.SerializerMethodField()
+    client_max_num = serializers.SerializerMethodField()
     class Meta:
         model = TestRecord
-        fields = ('add_time', 'machine_info', 'pg_info', 'linux_info', 'meta_info', 'ro_info', 'rw_info', 'client_max_num')
-
-    def get_ro_info(self, obj):
-        all_data = TestResult.objects.filter(Q(test_record_id=obj.id ) ,test_cate_id=1)
+        fields = ('add_time', 'machine_info', 'pg_info', 'trend', 'linux_info', 'meta_info')
+
+    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
 
-        ro_info_serializer = TestResultSerializer(all_data, many=True, context={'request': self.context['request']})
-        return ro_info_serializer.data
-
-    def get_rw_info(self, obj):
-        all_data = TestResult.objects.filter(Q(test_record_id=obj.id) ,test_cate_id=2)
-
-        rw_info_serializer = TestResultSerializer(all_data, many=True, context={'request': self.context['request']})
-        return rw_info_serializer.data
 
     def get_machine_info(self, obj):
-        machine_data = UserMachine.objects.filter(Q(id=obj.test_machine_id.id))
+        machine_data = UserMachine.objects.filter(Q(id=obj.test_machine_id))
 
         machine_info_serializer = UserMachineSerializer(machine_data,many=True, context={'request': self.context['request']})
         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)
+    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 TestRecordDetailSerializer(serializers.ModelSerializer):
 
index 919a161692b1584046b092fe6230bc798bb33269..5e259426c0b4448dcbd64dbe2b8e7e20a5824b9e 100644 (file)
@@ -7,7 +7,7 @@ from rest_framework.pagination import PageNumberPagination
 from exception import TestDataUploadError
 from models import UserMachine, TestCategory
 from pgperffarm.settings import DB_ENUM
-from .serializer import TestRecordSerializer, TestRecordDetailSerializer, LinuxInfoSerializer, MetaInfoSerializer, \
+from .serializer import TestRecordListSerializer, TestRecordDetailSerializer, LinuxInfoSerializer, MetaInfoSerializer, \
     PGInfoSerializer, CreateTestRecordSerializer, CreateTestDateSetSerializer, TestResultSerializer
 from rest_framework.views import APIView
 from rest_framework.decorators import api_view
@@ -21,7 +21,7 @@ import json
 
 
 class StandardResultsSetPagination(PageNumberPagination):
-    page_size = 10
+    page_size = 5
     page_size_query_param = 'page_size'
     max_page_size = 100
 
@@ -30,8 +30,8 @@ class TestRecordListViewSet(mixins.ListModelMixin, viewsets.GenericViewSet):
     """
     List test records
     """
-    queryset = TestRecord.objects.all()
-    serializer_class = TestRecordSerializer
+    queryset = TestRecord.objects.all().order_by('add_time')
+    serializer_class = TestRecordListSerializer
     pagination_class = StandardResultsSetPagination
 
 
@@ -58,6 +58,8 @@ def TestRecordCreate(request, format=None):
     # obj = data[0].pgbench
     # jsLoads = json.loads(data[0])
 
+    # todo get machine by token
+    # todo hash the json_data to ensure unique
     from django.db import transaction
 
     try:
index b4d34a05540c573a1bc357982f5d6e13bbf0d8fe..afe66afc1d5ec57b14d4451b9ba24b10ebca71ff 100644 (file)
@@ -141,6 +141,12 @@ DB_ENUM = {
     "mode":{
         "simple":1,
         "other":2
+    },
+    "status": {
+        "none": -1,
+        "improved": 1,
+        "quo": 2,
+        "regressive": 3
     }
 }