<Segment vertical>Farmer Info</Segment>
<FarmerCard machine={machine}></FarmerCard>
{/*//todo add a catalog*/}
+ <div className="affix">aaaa</div>
</div>
<div className="col-md-9">
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>
class Meta:
model = TestBranch
- fields = ('branch_name',)
+ fields = ('branch_name','id')
class TestCategorySerializer(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):
'''
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
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):
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
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")
# 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'),