From f6ee17426a512934852227900489b91ab02b09bc Mon Sep 17 00:00:00 2001 From: Hongyuan Ma Date: Thu, 21 Jun 2018 12:54:51 +0800 Subject: [PATCH] adapt get_dataset_info in TestRecordDetailSerializer --- web/apps/test_records/models.py | 8 +-- web/apps/test_records/serializer.py | 97 ++++++++++++++++++++--------- web/apps/test_records/views.py | 14 ++--- web/apps/users/serializer.py | 5 +- 4 files changed, 81 insertions(+), 43 deletions(-) diff --git a/web/apps/test_records/models.py b/web/apps/test_records/models.py index 18056b3..0758850 100644 --- a/web/apps/test_records/models.py +++ b/web/apps/test_records/models.py @@ -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: diff --git a/web/apps/test_records/serializer.py b/web/apps/test_records/serializer.py index 8e65657..fad7a9c 100644 --- a/web/apps/test_records/serializer.py +++ b/web/apps/test_records/serializer.py @@ -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) + 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) + 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): diff --git a/web/apps/test_records/views.py b/web/apps/test_records/views.py index 9aeaa70..40803f9 100644 --- a/web/apps/test_records/views.py +++ b/web/apps/test_records/views.py @@ -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) - - diff --git a/web/apps/users/serializer.py b/web/apps/users/serializer.py index 251e023..2f6a12f 100644 --- a/web/apps/users/serializer.py +++ b/web/apps/users/serializer.py @@ -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') -- 2.39.5