zuoyexiuz
This commit is contained in:
commit
84e06bdc45
191
groups/views.py
191
groups/views.py
|
@ -25,6 +25,7 @@ def check_login(func): # 自定义登录验证装饰器
|
|||
|
||||
return warpper
|
||||
|
||||
|
||||
def login(request):
|
||||
# 不允许重复登录
|
||||
if request.session.get('is_login', None):
|
||||
|
@ -146,7 +147,6 @@ def company_userchange_page(request, uid):
|
|||
user = s_models.User.objects.get(pk=uid)
|
||||
except s_models.User.DoesNotExist:
|
||||
raise Http404("User does not exist")
|
||||
print(model_to_dict(user))
|
||||
user_form = UserForm(model_to_dict(user))
|
||||
|
||||
return render(request, 'groups/company_userchange.html', locals())
|
||||
|
@ -199,138 +199,119 @@ def getPosition(address):
|
|||
return json_data
|
||||
|
||||
|
||||
|
||||
def apipositions(req):
|
||||
companys = GroupUser.objects.get(id=req.session['user_id']).group.members.all()
|
||||
positions = companys.values('position', 'partname')
|
||||
return JsonResponse({"code": 1, "data": list(positions)})
|
||||
|
||||
|
||||
def trouble(request): # 隐患排查
|
||||
companys = GroupUser.objects.get(id = req.session['user_id']).group.members.all()
|
||||
positions = companys.values('position','partname')
|
||||
return JsonResponse({"code":1,"data":list(positions)})
|
||||
def trouble(request):#隐患排查
|
||||
return render(request, 'groups/troublepic.html', locals())
|
||||
|
||||
|
||||
def observe(request): # 行为观察
|
||||
def observe(request):#行为观察
|
||||
return render(request, 'groups/observe.html', locals())
|
||||
|
||||
|
||||
def miss(request): # 未遂事件
|
||||
def miss(request):#未遂事件
|
||||
return render(request, 'groups/miss.html', locals())
|
||||
|
||||
|
||||
def risk(request): # 风险管控
|
||||
def risk(request):#风险管控
|
||||
return render(request, 'groups/risk.html', locals())
|
||||
|
||||
|
||||
def train(request): # 教育培训
|
||||
def train(request):#教育培训
|
||||
return render(request, 'groups/train.html', locals())
|
||||
|
||||
|
||||
def exam(request): # 在线考试
|
||||
def exam(request):#在线考试
|
||||
return render(request, 'groups/exam.html', locals())
|
||||
|
||||
|
||||
def troubleChart(request): # 隐患统计图
|
||||
def troubleChart(request):#隐患统计图
|
||||
code = request.GET.get('code')
|
||||
start = request.GET.get('start')
|
||||
end = request.GET.get('end')
|
||||
if code == 'tbpic':
|
||||
companys = GroupUser.objects.get(id=request.session['user_id']).group.members.all()
|
||||
troublelist = s_models.Trouble.objects.filter(deletemark=1, usecomp__in=companys).values('usecomp__partid',
|
||||
'usecomp__partname').annotate(
|
||||
number=Count('troubleid'))
|
||||
if start:
|
||||
troublelist = troublelist.filter(fxsj__gte=start)
|
||||
if end:
|
||||
troublelist = troublelist.filter(fxsj__lte=end)
|
||||
return HttpResponse(json.dumps({'code': 1, 'data': {'troublelist': list(troublelist)}}),
|
||||
content_type='application/json')
|
||||
if code=='tbpic':
|
||||
companys = GroupUser.objects.get(id = request.session['user_id']).group.members.all()
|
||||
troublelist = s_models.Trouble.objects.filter(deletemark=1,usecomp__in=companys).values('usecomp__partid','usecomp__partname')
|
||||
if start:
|
||||
troublelist = troublelist.filter(fxsj__gte=start)
|
||||
if end:
|
||||
troublelist = troublelist.filter(fxsj__lte=end)
|
||||
troublelist=troublelist.annotate(number = Count('usecomp')).order_by('-number')
|
||||
|
||||
|
||||
def observeChart(request): # 行为观察
|
||||
return HttpResponse(json.dumps({'code':1,'data':{'troublelist':list(troublelist)}}), content_type='application/json')
|
||||
def observeChart(request):#行为观察
|
||||
code = request.GET.get('code')
|
||||
start = request.GET.get('start')
|
||||
end = request.GET.get('end')
|
||||
if code == 'obv':
|
||||
companys = GroupUser.objects.get(id=request.session['user_id']).group.members.all()
|
||||
observelist = s_models.Observe.objects.filter(deletemark=1, usecomp__in=companys).values('usecomp__partid',
|
||||
'usecomp__partname').annotate(
|
||||
number=Count('lookid'))
|
||||
if start:
|
||||
observelist = observelist.filter(looktime__gte=start)
|
||||
if end:
|
||||
observelist = observelist.filter(looktime__lte=end)
|
||||
return HttpResponse(json.dumps({'code': 1, 'data': {'observelist': list(observelist)}}),
|
||||
content_type='application/json')
|
||||
|
||||
|
||||
def missChart(request): # 未遂事件
|
||||
if code=='obv':
|
||||
companys = GroupUser.objects.get(id = request.session['user_id']).group.members.all()
|
||||
observelist = s_models.Observe.objects.filter(deletemark=1,usecomp__in=companys).values('usecomp__partid','usecomp__partname')
|
||||
if start:
|
||||
observelist = observelist.filter(looktime__gte=start)
|
||||
if end:
|
||||
observelist = observelist.filter(looktime__lte=end)
|
||||
observelist=observelist.annotate(number = Count('usecomp')).order_by('-number')
|
||||
return HttpResponse(json.dumps({'code':1,'data':{'observelist':list(observelist)}}), content_type='application/json')
|
||||
|
||||
def missChart(request):#未遂事件
|
||||
code = request.GET.get('code')
|
||||
start = request.GET.get('start')
|
||||
end = request.GET.get('end')
|
||||
if code == 'miss':
|
||||
if code=='miss':
|
||||
|
||||
companys = GroupUser.objects.get(id = request.session['user_id']).group.members.all()
|
||||
misslist = s_models.Miss.objects.filter(deletemark=1,usecomp__in=companys).values('usecomp__partid','usecomp__partname')
|
||||
if start:
|
||||
misslist = misslist.filter(misstime__gte=start)
|
||||
if end:
|
||||
misslist = misslist.filter(misstime__lte=end)
|
||||
misslist=misslist.annotate(number = Count('usecomp')).order_by('-number')
|
||||
return HttpResponse(json.dumps({'code':1,'data':{'misslist':list(misslist)}}), content_type='application/json')
|
||||
|
||||
def riskChart(request):#风险管控
|
||||
|
||||
companys = GroupUser.objects.get(id=request.session['user_id']).group.members.all()
|
||||
misslist = s_models.Miss.objects.filter(deletemark=1, usecomp__in=companys).values('usecomp__partid',
|
||||
'usecomp__partname').annotate(
|
||||
number=Count('missid'))
|
||||
if start:
|
||||
misslist = misslist.filter(misstime__gte=start)
|
||||
if end:
|
||||
misslist = misslist.filter(misstime__lte=end)
|
||||
return HttpResponse(json.dumps({'code': 1, 'data': {'misslist': list(misslist)}}),
|
||||
content_type='application/json')
|
||||
|
||||
|
||||
def riskChart(request): # 风险管控
|
||||
code = request.GET.get('code')
|
||||
start = request.GET.get('start')
|
||||
end = request.GET.get('end')
|
||||
if code == 'risk':
|
||||
|
||||
companys = GroupUser.objects.get(id=request.session['user_id']).group.members.all()
|
||||
risklist = s_models.Risk.objects.filter(usecomp__in=companys).values('usecomp__partid',
|
||||
'usecomp__partname').annotate(
|
||||
number=Count('id'))
|
||||
if start:
|
||||
risklist = risklist.filter(createtime__gte=start)
|
||||
if end:
|
||||
risklist = risklist.filter(createtime__lte=end)
|
||||
return HttpResponse(json.dumps({'code': 1, 'data': {'risklist': list(risklist)}}),
|
||||
content_type='application/json')
|
||||
|
||||
|
||||
def trainChart(request): # 教育培训
|
||||
risks = []
|
||||
if code=='risk':
|
||||
companys = GroupUser.objects.get(id = request.session['user_id']).group.members.all()
|
||||
for i in companys:
|
||||
risk= s_models.RiskAct.objects.filter(usecomp__partid=i.partid)
|
||||
if start:
|
||||
risk = risk.filter(createtime__gte=start)
|
||||
if end:
|
||||
risk = risk.filter(createtime__lte=end)
|
||||
datariskact=risk.count()
|
||||
datariskact1=risk.filter(level="低风险").count()
|
||||
datariskact2=risk.filter(level="一般风险").count()
|
||||
datariskact3=risk.filter(level="较大风险").count()
|
||||
datariskact4=risk.filter(level="重大风险").count()
|
||||
risks.append({'companyName':i.partname,'datariskact':datariskact,'datariskact1':datariskact1,'datariskact2':datariskact2,'datariskact3':datariskact3,'datariskact4':datariskact4})
|
||||
return HttpResponse(json.dumps({'code':1,'risks':risks}), content_type='application/json')
|
||||
|
||||
def trainChart(request):#教育培训
|
||||
code = request.GET.get('code')
|
||||
start = request.GET.get('start')
|
||||
end = request.GET.get('end')
|
||||
if code == 'train':
|
||||
companys = GroupUser.objects.get(id=request.session['user_id']).group.members.all()
|
||||
trainlist = s_models.Train.objects.filter(usecomp__in=companys).values('usecomp__partid',
|
||||
'usecomp__partname').annotate(
|
||||
number=Count('trainid'))
|
||||
if start:
|
||||
trainlist = trainlist.filter(starttime__gte=start)
|
||||
if end:
|
||||
trainlist = trainlist.filter(starttime__lte=end)
|
||||
return HttpResponse(json.dumps({'code': 1, 'data': {'trainlist': list(trainlist)}}),
|
||||
content_type='application/json')
|
||||
if code=='train':
|
||||
companys = GroupUser.objects.get(id = request.session['user_id']).group.members.all()
|
||||
trainlist = s_models.Train.objects.filter(usecomp__in=companys,deletemark=1).values('usecomp__partid','usecomp__partname')
|
||||
if start:
|
||||
trainlist = trainlist.filter(starttime__gte=start)
|
||||
if end:
|
||||
trainlist = trainlist.filter(starttime__lte=end)
|
||||
trainlist=trainlist.annotate(number = Count('usecomp')).order_by('-number')
|
||||
|
||||
|
||||
def examChart(request): # 在线考试
|
||||
return HttpResponse(json.dumps({'code':1,'data':{'trainlist':list(trainlist)}}), content_type='application/json')
|
||||
|
||||
def examChart(request):#在线考试
|
||||
code = request.GET.get('code')
|
||||
start = request.GET.get('start')
|
||||
end = request.GET.get('end')
|
||||
examjson = []
|
||||
if code == 'exam':
|
||||
companys = GroupUser.objects.get(id=request.session['user_id']).group.members.all()
|
||||
if code=='exam':
|
||||
companys = GroupUser.objects.get(id = request.session['user_id']).group.members.all()
|
||||
|
||||
for i in companys:
|
||||
examnumber = s_models.ExamTest.objects.filter(usecomps__contains=','+str(i.partid)+',')
|
||||
if start:
|
||||
examnumber = examnumber.filter(usecomps__contains=','+str(i.partid)+',',starttime__gte=start)
|
||||
if end:
|
||||
examnumber = examnumber.filter(usecomps__contains=','+str(i.partid)+',',starttime__lte=end)
|
||||
examjson.append({'companyName':i.partname,'number':examnumber.count()})
|
||||
return HttpResponse(json.dumps({'code':1,'data':examjson}), content_type='application/json')
|
||||
|
||||
|
||||
for i in companys:
|
||||
examlist = s_models.ExamTest.objects.filter(usecomps__contains=',' + str(i.partid) + ',')
|
||||
if start:
|
||||
examlist = examlist.filter(starttime__gte=start)
|
||||
if end:
|
||||
examlist = examlist.filter(starttime__lte=end)
|
||||
number = examlist.count()
|
||||
examjson.append({'companyName': i.partname, 'number': number})
|
||||
return HttpResponse(json.dumps({'code': 1, 'data': examjson}), content_type='application/json')
|
||||
|
||||
|
|
|
@ -0,0 +1,268 @@
|
|||
|
||||
<script>
|
||||
var now = new Date();
|
||||
$(function () {
|
||||
year = now.getFullYear();
|
||||
month = now.getMonth() + 1;
|
||||
for (var i = 0; i < 5; i++) {
|
||||
$('#year').append('<option value="' + (year - i) + '">' + (year - i) + '</option>');
|
||||
$('#years').append('<option value="' + (year - i) + '">' + (year - i) + '</option>');
|
||||
}
|
||||
$.get('api/tool?a=servertime', function (res) {
|
||||
$('#year').combobox().combobox('setValue', res.year);
|
||||
$('#years').combobox().combobox('setValue', res.year);
|
||||
$('#month').combobox().combobox('setValue', res.month);
|
||||
behaviorDate();
|
||||
trainstatistical();
|
||||
})
|
||||
|
||||
});
|
||||
|
||||
function gcpmsearch() {
|
||||
var querydata = $('#fxrpms').serializeJSON();
|
||||
$('#fxrpmtable').datagrid('load', querydata);
|
||||
}
|
||||
//培训分析柱形图
|
||||
function behaviorDate() {
|
||||
var y = $("#year").val();
|
||||
var gcChart = echarts.init(document.getElementById("piecontainer"));
|
||||
|
||||
gcChart.setOption(option = {
|
||||
title: {
|
||||
text: '培训数量趋势图',
|
||||
x: 'left'
|
||||
},
|
||||
tooltip: {
|
||||
trigger: 'axis',
|
||||
axisPointer: { // 坐标轴指示器,坐标轴触发有效
|
||||
type: 'shadow' // 默认为直线,可选为:'line' | 'shadow'
|
||||
}
|
||||
},
|
||||
legend: {
|
||||
|
||||
data: []
|
||||
},
|
||||
xAxis: {
|
||||
type: 'category',
|
||||
data: ['1月', '2月', '3月', '4月', '5月', '6月', '7月','8月','9月','10月','11月','12月']
|
||||
|
||||
},
|
||||
yAxis: {
|
||||
type: 'value'
|
||||
},
|
||||
toolbox: {
|
||||
show: true,
|
||||
feature: {
|
||||
mark: { show: true },
|
||||
dataView: { show: true, readOnly: false },
|
||||
restore: { show: true },
|
||||
saveAsImage: { show: true }
|
||||
}
|
||||
},
|
||||
grid: {
|
||||
left: '3%',
|
||||
right: '4%',
|
||||
bottom: '3%',
|
||||
containLabel: true
|
||||
},
|
||||
|
||||
|
||||
});
|
||||
gcChart.showLoading();
|
||||
$.ajax({
|
||||
type: "get",
|
||||
async: true, //异步请求(同步请求将会锁住浏览器,用户其他操作必须等待请求完成才可以执行)
|
||||
url: "api/trainfg?a=trainfig&year=" + y, //请求发送
|
||||
dataType: "json", //返回数据形式为json
|
||||
success: function (data) {
|
||||
//请求成功时执行该函数内容,data即为服务器返回的json对象
|
||||
console.log(data);
|
||||
if (data) {
|
||||
gcChart.hideLoading(); //隐藏加载动画
|
||||
gcChart.setOption({
|
||||
legend: { data: data.key },
|
||||
series: [{
|
||||
name: '公司级',
|
||||
type: 'bar',
|
||||
stack: '总量',
|
||||
label: {
|
||||
normal: {
|
||||
show: true,
|
||||
position: 'insideRight'
|
||||
}
|
||||
},
|
||||
data: data.companylevel
|
||||
},
|
||||
{
|
||||
name: '车间/工段级',
|
||||
type: 'bar',
|
||||
stack: '总量',
|
||||
label: {
|
||||
normal: {
|
||||
show: true,
|
||||
position: 'insideRight'
|
||||
}
|
||||
},
|
||||
data: data.workshoplevel
|
||||
},
|
||||
{
|
||||
name: '班组级',
|
||||
type: 'bar',
|
||||
stack: '总量',
|
||||
label: {
|
||||
normal: {
|
||||
show: true,
|
||||
position: 'insideRight'
|
||||
}
|
||||
},
|
||||
data: data.teamlevel
|
||||
},
|
||||
{
|
||||
name: '部门分厂级',
|
||||
type: 'bar',
|
||||
stack: '总量',
|
||||
label: {
|
||||
normal: {
|
||||
show: true,
|
||||
position: 'insideRight'
|
||||
}
|
||||
},
|
||||
data: data.departmentlevel
|
||||
}]
|
||||
}
|
||||
);
|
||||
|
||||
}
|
||||
},
|
||||
error: function (errorMsg) {
|
||||
gcChart.hideLoading();
|
||||
}
|
||||
});
|
||||
|
||||
}
|
||||
//培训分析扇形图
|
||||
function trainstatistical() {
|
||||
var y = $("#year").val();
|
||||
var m = $("#month").val();
|
||||
var gcChart = echarts.init(document.getElementById("piecontainer2"));
|
||||
|
||||
gcChart.setOption(option = {
|
||||
title: {
|
||||
text: '培训类型分布',
|
||||
x: 'left'
|
||||
},
|
||||
tooltip: {
|
||||
trigger: 'item',
|
||||
formatter: "{a} <br/>{b} : {c} ({d}%)"
|
||||
},
|
||||
legend: {
|
||||
orient: 'vertical',
|
||||
x: 'left',
|
||||
y: 'bottom',
|
||||
data: []
|
||||
},
|
||||
toolbox: {
|
||||
show: true,
|
||||
feature: {
|
||||
mark: { show: true },
|
||||
dataView: { show: true, readOnly: false },
|
||||
restore: { show: true },
|
||||
saveAsImage: { show: true }
|
||||
}
|
||||
},
|
||||
calculable: true,
|
||||
|
||||
});
|
||||
gcChart.showLoading();
|
||||
$.ajax({
|
||||
type: "get",
|
||||
async: true, //异步请求(同步请求将会锁住浏览器,用户其他操作必须等待请求完成才可以执行)
|
||||
url: "api/trainfg?a=traintype&year=" + y + "&month=" + m, //请求发送
|
||||
dataType: "json", //返回数据形式为json
|
||||
success: function (data) {
|
||||
//请求成功时执行该函数内容,data即为服务器返回的json对象
|
||||
console.log(data)
|
||||
if (data) {
|
||||
gcChart.hideLoading(); //隐藏加载动画
|
||||
gcChart.setOption({
|
||||
legend: {
|
||||
orient: 'vertical',
|
||||
left: 'left',
|
||||
data: ['日常培训', '相关方培训', '在岗人员培训'] },
|
||||
series: [{
|
||||
name: '培训类型',
|
||||
type: 'pie',
|
||||
radius: '55%',
|
||||
center: ['50%', '60%'],
|
||||
data: [
|
||||
{ value: data.daily, name: '日常培训' },
|
||||
{ value: data.related, name: '相关方培训' },
|
||||
{ value: data.jobuser, name: '在岗人员培训' }
|
||||
],
|
||||
itemStyle: {
|
||||
emphasis: {
|
||||
shadowBlur: 10,
|
||||
shadowOffsetX: 0,
|
||||
shadowColor: 'rgba(0, 0, 0, 0.5)'
|
||||
}
|
||||
}
|
||||
}]
|
||||
}
|
||||
);
|
||||
|
||||
}
|
||||
},
|
||||
error: function (errorMsg) {
|
||||
gcChart.hideLoading();
|
||||
}
|
||||
});
|
||||
}
|
||||
|
||||
function funTypeChange() {
|
||||
behaviorDate();//
|
||||
}
|
||||
function funTypeChange2() {
|
||||
trainstatistical();//
|
||||
}
|
||||
|
||||
</script>
|
||||
|
||||
|
||||
<div class="border" id="desktop" style="margin: 10px 10px 0 10px; background: #fff; overflow: auto;">
|
||||
|
||||
<div style="width:100%">
|
||||
<div style="width:80%;margin:auto">
|
||||
<select class="txtInput select3" id="year" name="year" style="width:100px;"></select><label>年</label>
|
||||
|
||||
<button class="btn btn-info" onclick="funTypeChange()"> 查询</button>
|
||||
|
||||
<div id="piecontainer" style="height:400px;width:100%">
|
||||
|
||||
</div>
|
||||
</div>
|
||||
<div style="width:80%;margin:auto">
|
||||
|
||||
<select class="txtInput select3" id="month" name="month" style="width:100px;">
|
||||
<option value="1">1月</option>
|
||||
<option value="2">2月</option>
|
||||
<option value="3">3月</option>
|
||||
<option value="4">4月</option>
|
||||
<option value="5">5月</option>
|
||||
<option value="6">6月</option>
|
||||
<option value="7">7月</option>
|
||||
<option value="8">8月</option>
|
||||
<option value="9">9月</option>
|
||||
<option value="10">10月</option>
|
||||
<option value="11">11月</option>
|
||||
<option value="12">12月</option>
|
||||
</select>
|
||||
<button class="btn btn-info" onclick="funTypeChange2()"> 查询</button>
|
||||
|
||||
<div id="piecontainer2" style="height:400px;width:100%">
|
||||
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
|
|
@ -229,19 +229,19 @@
|
|||
|
||||
|
||||
<div class="border" id="desktop" style="margin: 10px 10px 0 10px; background: #fff; overflow: auto;">
|
||||
|
||||
|
||||
<div style="width:100%">
|
||||
<div style="width:80%;margin:auto">
|
||||
<div style="width:80%;margin:auto;margin-bottom:100px;">
|
||||
<select class="txtInput select3" id="year" name="year" style="width:100px;"></select><label>年</label>
|
||||
|
||||
|
||||
<button class="btn btn-info" onclick="funTypeChange()"> 查询</button>
|
||||
|
||||
<div id="piecontainer" style="height:400px;width:100%">
|
||||
|
||||
</div>
|
||||
</div>
|
||||
<div style="width:80%;margin:auto">
|
||||
|
||||
<div style="width:80%;margin:auto;margin-bottom:100px;">
|
||||
|
||||
<select class="txtInput select3" id="month" name="month" style="width:100px;">
|
||||
<option value="1">1月</option>
|
||||
<option value="2">2月</option>
|
||||
|
@ -262,7 +262,19 @@
|
|||
|
||||
</div>
|
||||
</div>
|
||||
<div style="width: 80%; margin:auto;margin-bottom:100px; ">
|
||||
<table name="" id="fxrpmtable" class='easyui-datagrid' title="培训次数" data-options="rownumbers:true,singleSelect:true,striped: true,method:'get',url: 'api/trainfg?a=trainuser',toolbar:'#fxrpmbar'" style="height:400px">
|
||||
<thead>
|
||||
<tr>
|
||||
|
||||
<th data-options="field:'participant__username',align:'right'" width="30%">姓名</th>
|
||||
<th data-options="field:'count',align:'right'" width="35%">培训次数</th>
|
||||
</tr>
|
||||
</thead>
|
||||
</table>
|
||||
|
||||
|
||||
</div>
|
||||
</div>
|
||||
|
||||
</div>
|
||||
|
||||
|
||||
|
|
|
@ -90,6 +90,7 @@ urlpatterns = [
|
|||
path('html/examhistory/<int:id>/',views.examhistory),
|
||||
path('html/riskact/chose',views.riskactchose),
|
||||
path('html/trainfig',views.trainfigure),
|
||||
path('html/examfig',views.examfigure),
|
||||
#html页面
|
||||
|
||||
|
||||
|
|
|
@ -250,6 +250,10 @@ def bhrhtml(req):
|
|||
return render(req,'behavior.html')
|
||||
def trainfigure(req):
|
||||
return render(req,'trainfigure.html')
|
||||
def examfigure(req):
|
||||
return render(req,'examfigure.html')
|
||||
|
||||
|
||||
def check_login(func):
|
||||
def warpper(request,*args,**kwargs):
|
||||
is_login = request.session.get('userid', None)
|
||||
|
@ -6117,6 +6121,9 @@ def trainfg(req):
|
|||
daily.append(a.filter(traintype__dickeyid=1).count())
|
||||
related.append(a.filter(traintype__dickeyid=108).count())
|
||||
jobuser.append(a.filter(traintype__dickeyid=107).count())
|
||||
return JsonResponse({'code':1,'daily':daily,'related':related,'jobuser':jobuser})
|
||||
|
||||
|
||||
return JsonResponse({'code':1,'daily':daily,'related':related,'jobuser':jobuser})
|
||||
elif a=='trainuser':
|
||||
a = Trainuser.objects.filter(participant__userid=userid)
|
||||
total = a.count()
|
||||
objs = a.annotate(count=Count('participant')).values('participant__username','count')
|
||||
return HttpResponse(transjson(total,objs),content_type="application/json")
|
||||
|
|
Loading…
Reference in New Issue