adapt get_dataset_info in TestRecordDetailSerializer
authorHongyuan Ma <CS_MaleicAcid@163.com>
Thu, 21 Jun 2018 04:54:51 +0000 (12:54 +0800)
committerHongyuan Ma <CS_MaleicAcid@163.com>
Thu, 21 Jun 2018 04:54:51 +0000 (12:54 +0800)
web/apps/test_records/models.py
web/apps/test_records/serializer.py
web/apps/test_records/views.py
web/apps/users/serializer.py

index 18056b38a3c02ec291ee182453b5880a4cf8feb4..0758850da474d469cda8dbb2ee318fd11d804b7c 100644 (file)
@@ -98,7 +98,8 @@ class TestRecord(models.Model):
     test_desc = models.TextField(verbose_name="test desc", help_text="test desc")
     # test_branch_id = models.ForeignKey(TestBranch, verbose_name="test category", help_text="test category")
     meta_time = models.DateTimeField(default=timezone.now, verbose_name="meta time")
-    hash = models.CharField(unique=True, default='', max_length=128, verbose_name="record hash", help_text="record hash")
+    hash = models.CharField(unique=True, default='', max_length=128, verbose_name="record hash",
+                            help_text="record hash")
     uuid = models.CharField(unique=True, default='', max_length=64, verbose_name="record uuid", help_text="record uuid")
     add_time = models.DateTimeField(default=timezone.now, verbose_name="test added time")
 
@@ -169,12 +170,12 @@ def calc_status(sender, instance, **kwargs):
 
     print("prev dataset is: " + str(prevTestDataSet.id))
 
-    percentage = (instance.metric - prevTestDataSet.metric)/prevTestDataSet.metric
+    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):
+    if (percentage >= 0.05):
         status = 1
     elif (percentage <= -0.05):
         status = 3
@@ -188,7 +189,6 @@ def calc_status(sender, instance, **kwargs):
     return
 
 
-
 class TestResult(models.Model):
     """
     test result sample:
index 8e65657cea019201e87253d79f4377330214a439..fad7a9c6c08e809940218912053fea2ab9287b08 100644 (file)
@@ -1,53 +1,67 @@
 from rest_framework import serializers
 
 from pgperffarm.settings import DB_ENUM
-from test_records.models import TestRecord, TestResult, PGInfo, LinuxInfo ,MetaInfo, TestDataSet
+from test_records.models import TestRecord, TestResult, PGInfo, LinuxInfo, MetaInfo, TestDataSet, TestCategory
 from users.serializer import UserMachineSerializer
 from users.models import UserMachine
-from django.db.models import Q, QuerySet, Count
+from django.db.models import Count
 
 
-class PGInfoSerializer(serializers.ModelSerializer):
+class TestCategorySerializer(serializers.ModelSerializer):
+    '''
+    use TestCategorySerializer
+    '''
+
+    class Meta:
+        model = TestCategory
+        fields = ('cate_name', 'cate_sn')
+
 
+class PGInfoSerializer(serializers.ModelSerializer):
     '''
-    use ModelSerializer
+    use PGInfoSerializer
     '''
+
     class Meta:
         model = PGInfo
-        fields = "__all__"
+        fields = ('pg_branch',)
+
 
 class LinuxInfoSerializer(serializers.ModelSerializer):
     '''
-    use ModelSerializer
+    use LinuxInfoSerializer
     '''
 
     class Meta:
         model = LinuxInfo
-        fields = "__all__"
+        fields = ('mounts', 'cpuinfo', 'sysctl', 'meminfo')
 
-class MetaInfoSerializer(serializers.ModelSerializer):
 
+class MetaInfoSerializer(serializers.ModelSerializer):
     '''
-    use ModelSerializer
+    use MetaInfoSerializer
     '''
+
     class Meta:
         model = MetaInfo
-        fields = "__all__"
+        fields = ('date', 'uname', 'benchmark', 'name')
 
-class TestResultSerializer(serializers.ModelSerializer):
 
+class TestResultSerializer(serializers.ModelSerializer):
     '''
     use TestResultSerializer
     '''
+
     class Meta:
         model = TestResult
         fields = "__all__"
 
-class CreateTestRecordSerializer(serializers.ModelSerializer):
 
+class CreateTestRecordSerializer(serializers.ModelSerializer):
     '''
     create ModelSerializer
     '''
+
     # pg_info =PGInfoSerializer()
     # linux_info = LinuxInfoSerializer()
     # meta_info = MetaInfoSerializer()
@@ -56,8 +70,8 @@ class CreateTestRecordSerializer(serializers.ModelSerializer):
         model = TestRecord
         fields = "__all__"
 
-class CreateTestDateSetSerializer(serializers.ModelSerializer):
 
+class CreateTestDateSetSerializer(serializers.ModelSerializer):
     '''
     create TestDateSetSerializer
         'test_record': testRecordRet.id,
@@ -76,17 +90,18 @@ class CreateTestDateSetSerializer(serializers.ModelSerializer):
         model = TestDataSet
         fields = "__all__"
 
-class TestRecordListSerializer(serializers.ModelSerializer):
 
+class TestRecordListSerializer(serializers.ModelSerializer):
     '''
     use ModelSerializer
     '''
-    pg_info =PGInfoSerializer()
+    pg_info = PGInfoSerializer()
     linux_info = LinuxInfoSerializer()
     meta_info = MetaInfoSerializer()
 
     trend = serializers.SerializerMethodField()
     machine_info = serializers.SerializerMethodField()
+
     # client_max_num = serializers.SerializerMethodField()
     class Meta:
         model = TestRecord
@@ -112,17 +127,17 @@ class TestRecordListSerializer(serializers.ModelSerializer):
             elif i[0] == DB_ENUM['status']['none']:
                 trend['none'] += i[1]
 
-        if(data_list_count == trend['none']):
+        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, context={'request': self.context['request']})
+        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):
@@ -131,37 +146,59 @@ class TestRecordListSerializer(serializers.ModelSerializer):
     #     return max(ro_client_num,rw_client_num)
 
 
-class TestDataSetSerializer(serializers.ModelSerializer):
-
+class TestDataSetDetailSerializer(serializers.ModelSerializer):
     class Meta:
         model = TestDataSet
         fields = "__all__"
 
-class TestRecordDetailSerializer(serializers.ModelSerializer):
 
+class TestRecordDetailSerializer(serializers.ModelSerializer):
     '''
     use ModelSerializer
     '''
-    pg_info =PGInfoSerializer()
+    pg_info = PGInfoSerializer()
     linux_info = LinuxInfoSerializer()
+    test_machine = UserMachineSerializer()
     meta_info = MetaInfoSerializer()
     dataset_info = serializers.SerializerMethodField()
+
     # rw_info = serializers.SerializerMethodField()
     class Meta:
         model = TestRecord
-        fields = "__all__"
+        fields = (
+            'uuid', 'pg_info', 'linux_info', 'meta_info', 'dataset_info', 'test_desc', 'meta_time', 'test_machine')
 
     def get_dataset_info(self, obj):
-        dataset_list = TestDataSet.objects.filter(test_record_id=obj.id).values_list('scale').annotate(Count('id'))
+        dataset_list = TestDataSet.objects.filter(test_record_id=obj.id).values_list('test_cate_id').annotate(
+            Count('id'))
         # print(target_dataset)
 
         dataset = {}
-        # < QuerySet[(20, 2), (10, 4)] >
-        for item in dataset_list:
-            dataset[item[0]] = []
-            target_dataset = TestDataSet.objects.filter(test_record_id=obj.id, scale=item[0])
-            dataset_serializer = TestDataSetSerializer(target_dataset, many=True)
-            dataset[item[0]] = dataset_serializer.data
+        # < QuerySet[(1, 3), (2, 3)] >
+
+        for cate_item in dataset_list:
+
+            cate_info = TestCategory.objects.filter(id=cate_item[0]).first()
+            cate_info_serializer = TestCategorySerializer(cate_info)
+            cate_sn = cate_info_serializer.data["cate_sn"]
+            dataset[cate_sn] = {}
+
+            dataset_scale_list = TestDataSet.objects.filter(test_record_id=obj.id, test_cate=cate_item[0]).values_list(
+                'scale').annotate(Count('id'))
+            # print(dataset_scale_list) <QuerySet [(10, 2), (20, 1)]>
+            for scale_item in dataset_scale_list:
+                dataset[cate_sn][scale_item[0]] = {}
+
+                dataset_client_list = TestDataSet.objects.filter(test_record_id=obj.id,test_cate=cate_item[0]).values_list('clients').annotate( Count('id'))
+                # print(dataset_client_list) <QuerySet [(1, 1), (2, 1), (4, 1)]>
+                for client_item in dataset_client_list:
+                    dataset[cate_sn][scale_item[0]][client_item[0]] = []
+
+                # target_dataset = TestDataSet.objects.filter(test_record_id=obj.id, test_cate=cate_item[0],
+                #                                             scale=scale_item[0])
+                # dataset_serializer = TestDataSetDetailSerializer(target_dataset, many=True)
+                # dataset[cate_sn][scale_item[0]] = dataset_serializer.data
+
         return dataset
 
     # def get_ro_info(self, obj):
index 9aeaa7072cf62c4fd09192471a98fb4b1f616485..40803f960fb970fdaab2eff88a2ce1cbc93cefc4 100644 (file)
@@ -36,11 +36,13 @@ class TestRecordListViewSet(mixins.ListModelMixin, viewsets.GenericViewSet):
     queryset = TestRecord.objects.all().order_by('add_time')
     serializer_class = TestRecordListSerializer
     pagination_class = StandardResultsSetPagination
-class TestRecordDetailViewSet( mixins.RetrieveModelMixin, viewsets.GenericViewSet):
+
+
+class TestRecordDetailViewSet(mixins.RetrieveModelMixin, viewsets.GenericViewSet):
     """
     detail test records
     """
-    lookup_field = 'hash'
+    lookup_field = 'uuid'
     queryset = TestRecord.objects.all().order_by('add_time')
     serializer_class = TestRecordDetailSerializer
     pagination_class = StandardResultsSetPagination
@@ -68,7 +70,7 @@ def TestRecordCreate(request, format=None):
     try:
 
         record_hash = make_password(str(json_data), 'pg_perf_farm')
-        print(record_hash.__len__())
+        # print(record_hash.__len__()) 77
         r = TestRecord.objects.filter(hash=record_hash).count()
         if r != 0:
             raise TestDataUploadError("The same record already exists, please do not submit it twice.")
@@ -95,7 +97,7 @@ def TestRecordCreate(request, format=None):
 
             # pg_data = json_data['postgres']
             pg_data = {
-                'pg_branch':1
+                'pg_branch': 1
             }
             pgInfo = PGInfoSerializer(data=pg_data)
             pgInfoRet = None
@@ -136,7 +138,7 @@ def TestRecordCreate(request, format=None):
                 for scale, dataset_list in tag_list.iteritems():
                     print "ro[%s]=" % scale, dataset_list
                     for client_num, dataset in dataset_list.iteritems():
-                        print 'std is:'+ str(dataset['std'])
+                        print 'std is:' + str(dataset['std'])
 
                         test_dataset_data = {
                             'test_record': testRecordRet.id,
@@ -183,5 +185,3 @@ def TestRecordCreate(request, format=None):
 
     msg = 'upload success!'
     return Response(msg, status=status.HTTP_201_CREATED)
-
-
index 251e023131ef6e7a12f8235da5a1ab1de5bb2f62..2f6a12f93b13aee846136319cc890d63412329a2 100644 (file)
@@ -2,12 +2,13 @@ from rest_framework import serializers
 from users.models import UserMachine
 from django.db.models import Q
 
-class UserMachineSerializer(serializers.ModelSerializer):
 
+class UserMachineSerializer(serializers.ModelSerializer):
     '''
     use UserMachineSerializer
     '''
+
     class Meta:
         model = UserMachine
         # fields = "__all__"
-        fields = ('alias', 'os_name', 'os_version' ,'comp_name', 'comp_version')
\ No newline at end of file
+        fields = ('alias', 'os_name', 'os_version', 'comp_name', 'comp_version')