【Django-meeting】教室管理系统Debug:全选查询、时间选择、数字百分比--20230131

58 篇文章 1 订阅

全选查询(避免需一个个点教室)

在这里插入图片描述
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
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值