全选查询(避免需一个个点教室)
views.py增加字段classroomschedule_classroom_name3
# 查询教室情况
def classroom_query(request):
'''查询教室空闲情况,方便提出教室预定的申请'''
# 申请成功则跳转,否则就返回空白表单
# 验证权限
hr_permission = request.user.has_perm('myclassroom.add_classpermission')
print('hr_permission',hr_permission)
# 提交查询条件(2023.1.31增加全选功能)
classroomschedule_all = classroomschedule.objects.all()
if (('classroomschedule_date_start' in request.POST and request.POST['classroomschedule_date_start'] ) or \
('classroomschedule_date_end' in request.POST and request.POST['classroomschedule_date_end'] )) and \
(('classroomschedule_classroom_name3' in request.POST and request.POST['classroomschedule_classroom_name3'] ) or \
('classroomschedule_classroom_name2' in request.POST and request.POST['classroomschedule_classroom_name2'] )) :
# 获取POST数据
classroomschedule_date_start = request.POST.get('classroomschedule_date_start', '')
classroomschedule_date_end = request.POST.get('classroomschedule_date_end', '')
classroomschedule_classroom_name3 = request.POST.get('classroomschedule_classroom_name3', '')
classroomschedule_classroom_name3 = classroomschedule_classroom_name3.split(',')
print('classroomschedule_classroom_name3',classroomschedule_classroom_name3)
classroomschedule_classroom_name2 = request.POST.getlist('classroomschedule_classroom_name2', '')
print('classroomschedule_classroom_name2',classroomschedule_classroom_name2)
print("request.POST",request.POST)
'''查询booking模型'''
# 无选择条件就返回所有数据
classroomschedule_items = classroomschedule_all
if classroomschedule_date_start :
classroomschedule_self1 = classroomschedule_all.filter(classroomschedule_date__gte=classroomschedule_date_start)
classroomschedule_items = classroomschedule_items & classroomschedule_self1
if classroomschedule_date_end :
classroomschedule_self1 = classroomschedule_all.filter(classroomschedule_date__lte=classroomschedule_date_end)
classroomschedule_items = classroomschedule_items & classroomschedule_self1
# 全选或选部分教室
if classroomschedule_classroom_name3 !=['']:
classroomschedule_self3_total = classroomschedule_all.filter(classroomschedule_classroom_name=classroomschedule_classroom_name3[0])
print('classroomschedule_self3_total_first',classroomschedule_self3_total)
for i in range(len(classroomschedule_classroom_name3)):
print('classroomschedule_classroom_name3[i]',classroomschedule_classroom_name3[i])
classroomschedule_self3 = classroomschedule_all.filter(classroomschedule_classroom_name=classroomschedule_classroom_name3[i])
classroomschedule_self3_total = classroomschedule_self3_total | classroomschedule_self3
print('classroomschedule_self3_total',classroomschedule_self3_total)
classroomschedule_items = (classroomschedule_items & classroomschedule_self3_total)
else:
classroomschedule_self2_total = classroomschedule_all.filter(classroomschedule_classroom_name=classroomschedule_classroom_name2[0])
print('classroomschedule_self2_total_first',classroomschedule_self2_total)
for i in range(len(classroomschedule_classroom_name2)):
print('classroomschedule_classroom_name2[i]',classroomschedule_classroom_name2[i])
classroomschedule_self2 = classroomschedule_all.filter(classroomschedule_classroom_name=classroomschedule_classroom_name2[i])
classroomschedule_self2_total = classroomschedule_self2_total | classroomschedule_self2
print('classroomschedule_self2_total',classroomschedule_self2_total)
classroomschedule_items = (classroomschedule_items & classroomschedule_self2_total)
classroomschedule_items = classroomschedule_items.order_by('classroomschedule_date')
print('classroomschedule_items',classroomschedule_items)
return render(request, 'classroom_get_classroomschedule.html',locals())
# 返回空白表单
else:
# 获取用户信息
hr_permission = request.user.has_perm('myclassroom.add_classpermission')
print('hr_permission',hr_permission)
# 获取公开且生效的教室
classroom_all = classroom.objects.all()
classroom_public_active = classroom_all.filter(Q(classroom_public='Y') & Q(classroom_active='Y'))
classroom_all_active = classroom_all.filter(Q(classroom_active='Y'))
if hr_permission:
classroom_ORM = classroom_all_active.values_list('classroom_name', flat=True)
classroom_list = list(set(classroom_ORM))
classroom_list.sort()
else:
classroom_ORM = classroom_public_active.values_list('classroom_name', flat=True)
classroom_list = list(set(classroom_ORM))
classroom_list.sort()
context={"classroom_list":json.dumps(classroom_list),'hr_permission':hr_permission,}
return render(request, 'classroom_query.html',context=context)
# return render(request, 'classroom_query.html',context={})
classroom_query.html
{% extends 'base.html' %}
{% load static %}
{% load i18n %}
{% block body_block %}
<script src="{% static 'js/jquery.min.js' %}"></script>
<div class="container">
<div class="row py-4 align-items-center" style="font-size:15px;">
<!--查询条件-->
<div class="col-lg-12 col-md-12">
<form action="/classroom_query/" method="POST">
{% csrf_token %}
<div class="py-3 text-center">
<h2>{% translate "查询教室" %}</h2>
<p class="lead">{% translate "请您在选择开始日期、结束日期后,挑选您要查询的教室,并按【查询】以获得教室预订情况。" %}</p>
</div>
<br>
<div class="form-group ml-4 py-3 text-center" id="app">
<div class="row">
<label class="my-0 mr-2 col-4">{% translate "开始日期" %}</label>
<input class="form-control col-6" type="date" style="font-size:15px;" id="classroomschedule_date_start" name="classroomschedule_date_start" />
</div>
<br>
<div class="row">
<label class="my-0 mr-2 col-4">{% translate "结束日期" %}</label>
<input class="form-control col-6" type="date" style="font-size:15px;" id="classroomschedule_date_end" name="classroomschedule_date_end" />
</div>
<br>
<div class="row" >
<label class="my-0 mr-2 col-4">{% translate "教室名称" %}</label>
<div class="row my-0 mr-2 col-6">
<div>
<input type="checkbox" class="m-0" :value="classroom_options" v-model="checkedClassroom" name="classroomschedule_classroom_name3">
<label class="m-1">全选</label>
</div>
<div v-for="option in classroom_options">
<input type="checkbox" class="m-0" :value="option" v-model="checkedClassroom" name="classroomschedule_classroom_name2">
<label class="m-1">[[ option ]]</label>
<br>
</div>
</div>
</div>
<div class="row" ><label class="my-0 mr-2 col-4"></label><span>{% translate "选择的教室为" %}: [[ checkedClassroom ]]</span></div>
<hr>
<input class="ml-2 btn-small btn-primary col-2 p-1" type="submit" value="{% translate '查询' %}">
</div>
</form>
</div>
</div>
</div>
<br>
<br>
<br>
<script>
$(function(){
var today = new Date();//返回当前日期时间
var yyyy = today.getFullYear();//获取当前年份
var MM = today.getMonth() + 1;//因为getMonth()方法获取的是索引值,所以要+1
var dd = today.getDate();//返回一个月中的某一天
console.log(yyyy)
MM = checkTime(MM);//调用下面的checkTime函数,设置小于10的时间数字格式,例如5秒显示成05秒
dd = checkTime(dd);
var time = yyyy + "-" + MM + "-" + dd;
var dateControl = $("#classroomschedule_date_start");
dateControl.val(time);
function checkTime(i) {
if (i < 10) {
i = "0" + i;//这里如果是一位数则在前面添加一位0
}
return i;
}
});
</script>
<script>
$(function(){
var today = new Date();//返回当前日期时间
var yyyy = today.getFullYear();//获取当前年份
var MM = today.getMonth() + 1;//因为getMonth()方法获取的是索引值,所以要+1
var dd = today.getDate();//返回一个月中的某一天
console.log(yyyy)
MM = checkTime(MM);//调用下面的checkTime函数,设置小于10的时间数字格式,例如5秒显示成05秒
dd = checkTime(dd);
var time = yyyy + "-" + MM + "-" + dd;
var dateControl = $("#classroomschedule_date_end");
dateControl.val(time);
function checkTime(i) {
if (i < 10) {
i = "0" + i;//这里如果是一位数则在前面添加一位0
}
return i;
}
});
</script>
<script type="text/javascript">
// 获取变量值
var classroom_list_js = JSON.parse('{{ classroom_list|safe }}');
console.log(classroom_list_js)
var app = new Vue({
delimiters:['[[', ']]'],
el: '#app',
data() {
return {
checkedClassroom: [],
classroom_options: classroom_list_js,
}
},
methods:{
// add:function () {
// this.arrlist.push()
// }
},
computed: {
// // 计算属性的 getter
// computed_message_plantid: function () {
// // `this` 指向 vm 实例
// return this.message_plantid
// }
}
});
</script>
<br>
<br>
{% endblock %}
时间选择(避免手动选时间)
booking_apply.html 利用vue的data属性,返回时间段。
{% extends 'base.html' %}
{% load static %}
{% load i18n %}
{% block body_block %}
<script src="{% static 'js/jquery.min.js' %}"></script>
<div class="container">
<div class="row py-4 align-items-center">
<!--展示显示人员-->
<div class="col-lg-12 col-md-12 mt-0" style="background-color: #fff;">
<!--表单-->
<div class="py-3 text-center">
<h2>{% translate "教室借订申请" %}</h2>
<p class="lead">{% translate "请您填写条件进行申请,开始时间请选00分或30分,结束时间请选29分或59分。" %}</p>
{% for contentitem in content_items %}
<div><a type="button" class="ml-2 btn btn-primary" target="_blank" href="{{contentitem.file_1.url}}" >{% translate "教室管理5S标准" %}</a></div>
{% endfor %}
</div>
<form class="text-center" method="post" id="app" οninput="OnInput (event)">
{% csrf_token %}
<div class="row mt-3">
<div class="col-4 text-body font-weight-bold ml-3">{% translate "预定教室名称" %}</div>
<div class="col-6">
<select class="custom-select" name="booking_classroom_name" id="inputGroupSelect02" required="required" >
<option value=''></option>
<option v-for="option in classroom_options" :value="option">
[[ option ]]
</option>
</select>
</div>
</div>
<div class="row mt-3">
<div class="col-4 text-body font-weight-bold ml-3">{% translate "参与人数" %}</div>
<div class="col-6">
<input class="col-12 form-control" type="number" min='1' max='200' required="required" id="booking_classroom_person_hc" name="booking_classroom_person_hc">
</div>
</div>
<div class="row mt-3">
<div class="col-4 text-body font-weight-bold ml-3">{% translate "预定类别" %}</div>
<div class="col-6">
<select class="custom-select" name="booking_type" id="booking_type" required="required" >
<option value=''></option>
<option value='HR培训课程'>{% translate "HR培训课程" %}</option>
<option value='非HR培训课程'>{% translate "非HR培训课程" %}</option>
<option value='会议'>{% translate "会议" %}</option>
<option value='其他'>{% translate "其他" %}</option>
</select>
</div>
</div>
<div class="row mt-3">
<div class="col-4 text-body font-weight-bold ml-3">{% translate "预定事宜说明" %}</div>
<div class="col-6">
<input class="form-control" type="text" required="required" style="font-size:15px;" id="booking_content" name="booking_content" />
</div>
</div>
<div class="row mt-3">
<div class="col-4 text-body font-weight-bold ml-3">{% translate "预定日期" %}</div>
<div class="col-6">
{% if hr_permission or request.user.is_superuser %}
<input class="form-control" type="date" required="required" style="font-size:15px;" min="{{ date_min_hr }}" max="{{ date_max_hr }}" id="booking_date" name="booking_date" />
{% else %}
<input class="form-control" type="date" required="required" style="font-size:15px;" min="{{ date_min_user }}" max="{{ date_max_user }}" id="booking_date" name="booking_date" />
{% endif %}
</div>
</div>
<!-- <div class="row mt-3">
<div class="col-4 text-body font-weight-bold ml-3">{% translate "开始时间" %}<br>{% translate "(请选00分或30分开始)" %}</div>
<div class="col-6">
<input class="form-control" type="time" required="required" style="font-size:15px;" id="booking_start_time" name="booking_start_time" />
</div>
</div> -->
<div class="row mt-3">
<div class="col-4 text-body font-weight-bold ml-3">{% translate "开始时间" %}<br>{% translate "(请选00分或30分开始)" %}</div>
<div class="col-6">
<select class="custom-select" name="booking_start_time" id="booking_start_time" required="required" >
<option value=''></option>
<option v-for="booking_start_time_option in booking_start_time_options" :value="booking_start_time_option">
[[ booking_start_time_option ]]
</option>
</select>
</div>
</div>
<!-- <div class="row mt-3">
<div class="col-4 text-body font-weight-bold ml-3">{% translate "结束时间" %}<br>{% translate "(请选29分或59分结尾)" %}</div>
<div class="col-6">
<input class="form-control" type="time" required="required" style="font-size:15px;" id="booking_end_time" name="booking_end_time" />
</div>
</div> -->
<div class="row mt-3">
<div class="col-4 text-body font-weight-bold ml-3">{% translate "结束时间" %}<br>{% translate "(请选29分或59分结尾)" %}</div>
<div class="col-6">
<select class="custom-select" name="booking_end_time" id="booking_end_time" required="required" >
<option value=''></option>
<option v-for="booking_end_time_option in booking_end_time_options" :value="booking_end_time_option">
[[ booking_end_time_option ]]
</option>
</select>
</div>
</div>
<div class="row mt-3">
<div class="col-4 text-body font-weight-bold ml-3">{% translate "预定人工号" %}</div>
<div class="col-6">
<input class="form-control" type="text" required="required" style="font-size:15px;" id="booking_employee_id" name="booking_employee_id" readonly value="{{ request.user.username }}"/>
</div>
</div>
<div class="row mt-3">
<div class="col-4 text-body font-weight-bold ml-3">{% translate "预定人姓名" %}</div>
<div class="col-6">
<input class="form-control" type="text" required="required" style="font-size:15px;" id="booking_employee_name" name="booking_employee_name" placeholder="中文名"/>
</div>
</div>
<div class="row mt-3">
<div class="col-4 text-body font-weight-bold ml-3">{% translate "预定人电话(长号)" %}</div>
<div class="col-6">
<input class="form-control" type="number" required="required" min='13000000000' max='19999999999' style="font-size:15px;" id="booking_employee_phone" name="booking_employee_phone" placeholder="长号"/>
</div>
</div>
<div class="row mt-3">
<div class="col-4 text-body font-weight-bold ml-3">{% translate "预定填写日期" %}</div>
<div class="col-6">
<input class="form-control" type="date" required="required" readonly style="font-size:15px;" id="booking_fill_date" name="booking_fill_date" />
</div>
</div>
<div class="row mt-3">
<span class="col-5"></span><input class="ml-2 btn-small btn-primary col-2 p-1" type="submit" value="提交/submit">
</div>
</form>
</div>
</div>
</div>
<!-- 验证一个手机号:第一位是1,第二位是3-9,以后每一位都是0-9 -->
<!-- <script>
var inputs =document.getElementById('booking_employee_phone');
var spans =document.getElementById('spans22');
var patt = /^[1][3-9][\d]{9}/
spans.innerText = '验证失败'
function OnInput (event) {
if (patt.test(inputs.value)) {
spans.innerText = '验证成功'
console.log(inputs.value)
} else{
spans.innerText = '验证失败';
spans.style.color = 'red'
console.log(inputs.value)
}
}
</script> -->
<!-- 自动获取日期 -->
<script>
$(function(){
var today = new Date();//返回当前日期时间
var yyyy = today.getFullYear();//获取当前年份
var MM = today.getMonth() + 1;//因为getMonth()方法获取的是索引值,所以要+1
var dd = today.getDate();//返回一个月中的某一天
console.log(yyyy)
MM = checkTime(MM);//调用下面的checkTime函数,设置小于10的时间数字格式,例如5秒显示成05秒
dd = checkTime(dd);
var time = yyyy + "-" + MM + "-" + dd;
var dateControl = $("#booking_fill_date");
dateControl.val(time);
function checkTime(i) {
if (i < 10) {
i = "0" + i;//这里如果是一位数则在前面添加一位0
}
return i;
}
});
</script>
<!-- 自动带出教室 -->
<script type="text/javascript">
// 获取变量值
var classroom_list_js = JSON.parse('{{ classroom_list|safe }}');
console.log(classroom_list_js)
var app = new Vue({
delimiters:['[[', ']]'],
el: '#app',
data() {
return {
classroom_options: classroom_list_js,
booking_start_time_options:['08:00','08:30','09:00','09:30','10:00','10:30','11:00','11:30',
'12:00','12:30','13:00','13:30','14:00','14:30','15:00','15:30',
'16:00','16:30','17:00','17:30','18:00','18:30','19:00','19:30',
'20:00'],
booking_end_time_options:['08:29','08:59','09:29','09:59','10:29','10:59','11:29','11:59',
'12:29','12:59','13:29','13:59','14:29','14:59','15:29','15:59',
'16:29','16:59','17:29','17:59','18:29','18:59','19:29','19:59',
'20:29',
]
}
},
methods:{
// add:function () {
// this.arrlist.push()
// }
},
computed: {
// // 计算属性的 getter
// computed_message_plantid: function () {
// // `this` 指向 vm 实例
// return this.message_plantid
// }
}
});
</script>
<br>
<br>
<br>
<br>
<br>
{% endblock %}
数字百分比优化(避免出现小数位数过长)
更优解法:在round之前先乘100 plant1_question2_zhuanyexunlian = round(float(TrainingRequest_plant1_all.filter(Q(question2__icontains='专业训练')).count())*100/float(TrainingRequest_plant1_all_count),2)
参考链接https://blog.csdn.net/weixin_50181817/article/details/108789920
schedules.py的函数中的round()加上 Decimal()。
def confdict_handle():
# email_remark_1为True时
while webmail_items.first().email_remark_1=='True':
try:
loca_time = datetime.now().strftime('%Y-%m-%d %H:%M:%S')
print('本地时间:'+str(loca_time))
print('booking数量',len(booking.objects.all()))
# 整理邮件内容
booking_all = booking.objects.all()
booking_times = len(booking_all.filter(Q(booking_date=datetime.now().date())))
booking_agree_items = booking_all.filter(Q(booking_date=datetime.now().date())\
& Q(booking_approve_Y_N='Y'))
booking_agree_times = len(booking_all.filter(Q(booking_date=datetime.now().date())\
& Q(booking_approve_Y_N='Y')))
# 计算预约时数
Hour_sum = 0
if booking_agree_items:
for each_booking_agree_items in booking_agree_items:
Minutes_sum = count_minutes(str(each_booking_agree_items.booking_end_time)) - count_minutes(str(each_booking_agree_items.booking_start_time)) + 1
Hour_sum = Hour_sum + Minutes_sum/60
print('Hour_sum',Hour_sum)
Hour_sum = round(Hour_sum,1)
# 计算教室利用率
use_percentage = 0
classroom_hours = classroom.objects.filter(Q(classroom_active='Y')).count()*8
try:
#use_percentage = round((Hour_sum / classroom_hours),4)*100
use_percentage = round((Decimal(Hour_sum) / Decimal(classroom_hours)),3)*100
except Exception as e:
print('发生错误,错误信息为:', e)
pass
print('classroom_hours',classroom_hours)
print('use_percentage',use_percentage)
email_remark_2_new = get_msg5(booking_times=booking_times,booking_agree_times=booking_agree_times,Hour_sum=Hour_sum,use_percentage=use_percentage)
print('email_remark_2_new',email_remark_2_new)
ExchangeEmailSent.send_exchange_mail(subject='【教室借订系统】教室使用状态通知-{0}'.format(datetime.now().date()),body=email_remark_2_new)
if webmail_items.first().email_remark_2:
time.sleep(int(webmail_items.first().email_remark_2))
else:
time.sleep(60*60*24)
except Exception as e:
print('发生错误,错误信息为:', e)
pass