示例#1
0
def clearLesson(request):
    lessondata = Lesson.objects.get(id=request.GET.get('lessonid'))
    if not has_course_permission(request.user, lessondata.course):
        if request.is_ajax():
            return HttpResponse(json.dumps({
                'error': 101,
                'message': '没有权限'
            }),
                                content_type="application/json")
        else:
            return render(request, 'error.html', {'message': '没有权限'})
    if request.is_ajax():
        return HttpResponse(json.dumps(lessondata.cleardata()),
                            content_type="application/json")
    else:
        re = lessondata.cleardata()
        if re['error'] != 0:
            return render(
                request, 'error.html', {
                    'message':
                    re['message'],
                    'submessage':
                    lessondata.course.title,
                    'jumpurl':
                    str(
                        reverse('course:information',
                                args=[lessondata.course.id]))
                })
        else:
            return redirect(
                reverse('course:information', args=[lessondata.course.id]))
示例#2
0
def checkin(request, lessonid):
    lesson = Lesson.objects.get(id=lessonid)
    if not has_course_permission(request.user, lesson.course):
        return render(request, 'error.html', {'message': '没有权限'})
    if lesson.status not in (LESSON_STATUS_CHECKIN,
                             LESSON_STATUS_CHECKIN_AGAIN,
                             LESSON_STATUS_CHECKIN_ADD):
        return render(
            request, 'error.html', {
                'message':
                '签到还未开始',
                'submessage':
                lesson.course.title,
                'jumpurl':
                str(reverse('course:information', args=[lesson.course.id]))
            })

    studentlist = Studentcourse.objects.filter(
        course=lesson.course).select_related('student').order_by(
            'student__studentid').all()
    data = {'lessondata': lesson, 'studentlist': studentlist}
    if lesson.status == LESSON_STATUS_CHECKIN_ADD:
        data['checkintype'] = u'补签'
    elif lesson.status == LESSON_STATUS_CHECKIN_AGAIN:
        data['checkintype'] = u'再签'
    data['firstqrstr'] = generateqrstr(lessonid)
    data['refreshtime'] = settings.QRCODEREFRESHTIME
    return render(request, 'checkin.html', data)
示例#3
0
def getqrstr(request, lessonid):
    lesson = Lesson.objects.get(id=lessonid)
    if not (has_course_permission(request.user, lesson.course) or request.user.has_perm('course_control')):
        return HttpResponse(json.dumps({'error': 101, 'message': '没有权限'}), content_type="application/json")
    str = generateqrstr(lessonid)
    data = {'qr': str}
    return HttpResponse(json.dumps(data), content_type="application/json")
示例#4
0
def resourceupload(request):
    coursedata = Course.objects.get(id=request.POST.get('courseid'))
    if not has_course_permission(request.user, coursedata):
        return HttpResponse(json.dumps({'error': u'没有权限上传到此课程'}),
                            content_type="application/json")
    res = Courseresource(course=coursedata,
                         uploadtime=time.strftime('%Y-%m-%d %H:%M:%S',
                                                  time.localtime()))
    res.file = request.FILES['file_data']
    res.title = res.file.name
    res.save()
    send_resource_notification.delay(res.id)
    deleteurl = reverse('course:resourcedelete', args=[])
    initialpreviewdata = res.initialPreview()
    data = {
        'initialPreview': [initialpreviewdata['data']],
        'initialPreviewConfig': [
            {
                'caption': res.title,
                'url': deleteurl,
                'key': res.id
            },
        ]
    }
    if 'type' in initialpreviewdata:
        data['initialPreviewConfig'][0]['type'] = initialpreviewdata['type']
    if 'filetype' in initialpreviewdata:
        data['initialPreviewConfig'][0]['filetype'] = initialpreviewdata[
            'filetype']
    return HttpResponse(json.dumps(data), content_type="application/json")
示例#5
0
def sethomeworkscore(request):
    homeworkcommit = Homeworkcommit.objects.select_related(
        'coursehomework').get(id=request.GET.get('homeworkcommitid'))
    score = request.GET.get('score')
    if not score.isdigit():
        return HttpResponse(json.dumps({
            'error': 101,
            'message': '分数只能设置为数字'
        }),
                            content_type="application/json")
    if not has_course_permission(request.user,
                                 homeworkcommit.coursehomework.course):
        return HttpResponse(json.dumps({
            'error': 101,
            'message': '没有权限'
        }),
                            content_type="application/json")
    homeworkcommit.score = score
    homeworkcommit.save()
    return HttpResponse(json.dumps({
        'error': 0,
        'score': score,
        'message': '评分成功'
    }),
                        content_type="application/json")
示例#6
0
def changecheckinstatus(request, lessonid):
    lesson = Lesson.objects.get(id=lessonid)
    studentid = request.GET.get('studentid', default=False) or request.GET.get('pk')
    newstatus = request.GET.get('newstatus', default=False) or request.GET.get('value')
    try:
        student = Student.objects.get(studentid=studentid)
    except ObjectDoesNotExist:
        return HttpResponse(json.dumps({'error': 101, 'message': '未找到,请输入正确的学号'}), content_type="application/json")
    if not (has_course_permission(request.user, lesson.course) or request.user.has_perm('checkin_modify')):
        return HttpResponse(json.dumps({'error': 101, 'message': '没有权限'}), content_type="application/json")
    try:
        checkin = Checkin.objects.get(student=student, lesson=lesson)
    except ObjectDoesNotExist:
        if not Studentcourse.objects.filter(course=lesson.course, student=student).exists():
            Studentcourse.objects.create(course=lesson.course, student=student)
        checkin = Checkin(student=student, lesson=lesson)
    """ 关闭请假不允许修改功能
    if checkin.status > 10:  # ASK
        return HttpResponse(json.dumps({'error': 101, 'message': '学生已经请假'}), content_type="application/json")
    """
    if newstatus == 'newcheckin':
        data = student_checkin(student, lesson)
    elif newstatus == 'delete':
        checkin.status = CHECKIN_STATUS_NORMAL
        checkin.save()
        data = {'studentid': studentid, 'status': checkin.status}
    elif newstatus == 'late':
        checkin.status = CHECKIN_STATUS_LATE
        checkin.save()
        data = {'studentid': studentid, 'status': checkin.status}
    elif newstatus == 'success':
        checkin.status = CHECKIN_STATUS_SUCCESS
        checkin.save()
        data = {'studentid': studentid, 'status': checkin.status}
    elif newstatus == 'early':
        checkin.status = CHECKIN_STATUS_EARLY
        checkin.save()
        data = {'studentid': studentid, 'status': checkin.status}
    elif newstatus == 'lateearly':
        checkin.status = CHECKIN_STATUS_LATEEARLY
        checkin.save()
        data = {'studentid': studentid, 'status': checkin.status}
    elif newstatus == 'private_ask':
        checkin.status = CHECKIN_STATUS_PRIVATE_ASK
        checkin.save()
        data = {'studentid': studentid, 'status': checkin.status}
    elif newstatus == 'public_ask':
        checkin.status = CHECKIN_STATUS_PRIVATE_ASK
        checkin.save()
        data = {'studentid': studentid, 'status': checkin.status}
    elif newstatus == 'sick_ask':
        checkin.status = CHECKIN_STATUS_SICK_ASK
        checkin.save()
        data = {'studentid': studentid, 'status': checkin.status}
    elif newstatus.isdigit():
        checkin.status = newstatus
        checkin.save()
        data = {'studentid': studentid, 'status': checkin.status}
    return HttpResponse(json.dumps(data), content_type="application/json")
示例#7
0
def switch_to_add(request, lessonid):
    lesson = Lesson.objects.get(id=lessonid)
    if not has_course_permission(request.user, lesson.course):
        return render(request, 'error.html', {'message': '没有权限'})
    if lesson.status == LESSON_STATUS_CHECKIN:
        lesson.status = LESSON_STATUS_CHECKIN_ADD
    lesson.save()
    return redirect(reverse('checkin:qrcheckin', args=[lesson.id]))
示例#8
0
def resourcedelete(request):
    key = request.POST.get('key')
    res = Courseresource.objects.get(id=key)
    if not has_course_permission(request.user, res.course):
        return HttpResponse(json.dumps({'error': u'没有权限删除此课程文件'}),
                            content_type="application/json")
    res.file.delete()
    res.delete()
    return HttpResponse(json.dumps([]), content_type="application/json")
示例#9
0
def resource(request, courseid):
    coursedata = Course.objects.get(id=courseid)
    resources = Courseresource.objects.filter(course=coursedata).all()
    resources.order_by('uploadtime')
    return render(
        request, 'resource.html', {
            'coursedata': coursedata,
            'courseperms': has_course_permission(request.user, coursedata),
            'resources': resources
        })
示例#10
0
def studentcourse(request, courseid):
    coursedata = Course.objects.get(id=courseid)
    students = Studentcourse.objects.filter(course=coursedata). \
        select_related('student', 'student__classid', 'student__classid__major', 'student__classid__department') \
        .order_by('student_id').all()
    return render(
        request, 'studentcourse.html', {
            'coursedata': coursedata,
            'students': students,
            'courseperms': has_course_permission(request.user, coursedata)
        })
示例#11
0
def get_homework_commit(request, commit_id):
    commit = get_object_or_404(Homeworkcommit, pk=commit_id)
    course = commit.coursehomework.course
    courseperms = has_course_permission(request.user, course)
    if not courseperms:
        return HttpResponse(json.dumps({
            'error': 101,
            'message': '没有权限'
        }),
                            content_type="application/json")
    return render(request, 'homework_commit.html', {'commit': commit})
示例#12
0
def information(request, courseid):
    coursedata = Course.objects.get(id=courseid)
    lessondata = Lesson.objects.filter(course=coursedata) \
        .exclude(status=LESSON_STATUS_TRANSFERRED) \
        .order_by('week', 'day', 'time').all()
    return render(
        request, 'information.html', {
            'coursedata': coursedata,
            'lessondata': lessondata,
            'courseperms': has_course_permission(request.user, coursedata)
        })
示例#13
0
def stopCheckin(request, lessonid):
    lesson = Lesson.objects.get(id=lessonid)
    if not has_course_permission(request.user, lesson.course):
        return render(request, 'error.html', {'message': '没有权限'})
    if lesson.status in (LESSON_STATUS_CHECKIN, LESSON_STATUS_CHECKIN_ADD, LESSON_STATUS_CHECKIN_AGAIN):
        re = endcheckin(lessonid)
        if re['error'] != 0:
            return render(request, 'error.html',
                          {'message': re['message'],
                           'submessage': lesson.course.title,
                           'jumpurl': str(
                               reverse('course:information', args=[lesson.course.id]))})
    # checkin_start(lessonruntimeid)
    return redirect(reverse('checkin:lesson_data', args=[lesson.id]))
示例#14
0
def remind_homework(request, homeworkid):
    homework = Coursehomework.objects.select_related('course').get(
        id=homeworkid)
    if not has_course_permission(request.user, homework.course):
        return HttpResponse(json.dumps({
            'error': 101,
            'message': '没有权限'
        }),
                            content_type="application/json")
    send_homework_remind.delay(homework.id)
    return HttpResponse(json.dumps({
        'error': 0,
        'message': '催交成功'
    }),
                        content_type="application/json")
示例#15
0
def sendmessage(request, courseid):
    coursedata = Course.objects.get(id=courseid)
    messages = CourseMessage.objects.filter(
        course=coursedata).order_by('-time').all()
    data = {
        'coursedata': coursedata,
        'courseperms': has_course_permission(request.user, coursedata),
        'messages': messages
    }
    if request.META['REQUEST_METHOD'] == 'POST':
        message = request.POST.get('message')
        errorsendstudentnames = sendmessagetocoursestudent(coursedata, message)
        data['send'] = True
        data['errorsendstudentnames'] = errorsendstudentnames
    return render(request, 'sendmessage.html', data)
示例#16
0
def clearcheckin(request, lessonid):
    lesson = Lesson.objects.get(id=lessonid)
    if not has_course_permission(request.user, lesson.course):
        return render(request, 'error.html', {'message': '没有权限'})
    if request.GET.get('deleteall', 0):
        clear_checkin(lesson)
    elif request.GET.get('deletethis', 0):
        if lesson.ischeckinnow():
            clear_last_checkin(lesson)
            cache.delete('lesson_%d_clear_flag' % lesson.id)
        elif cache.get('lesson_%d_clear_flag' % lesson.id, default=False):
            clear_last_checkin(lesson)
            cache.delete('lesson_%d_clear_flag' % lesson.id)
        else:
            return render(request, 'error.html', {'message': '无法清除', 'submessage': '间隔时间太久'})
    return redirect(reverse('checkin:lesson_data', args=[lesson.id]))
示例#17
0
def setperformance_score(request, courseid):
    course = Course.objects.get(id=courseid)
    student = Student.objects.get(studentid=request.GET.get('studentid'))
    score = request.GET.get('score')
    if not has_course_permission(request.user, course):
        return HttpResponse(json.dumps({
            'error': 101,
            'message': '没有权限'
        }),
                            content_type="application/json")
    sc = Studentcourse.objects.get(student=student, course=course)
    sc.performance_score += int(score)
    sc.save()
    return HttpResponse(json.dumps({
        'error': 0,
        'message': '加分成功',
        'performance_score': sc.performance_score
    }),
                        content_type="application/json")
示例#18
0
def leavehomeworkcomment(request):
    homeworkcommit = Homeworkcommit.objects.select_related(
        'coursehomework').get(id=request.POST.get('homeworkcommitid'))
    comment = request.POST.get('comment', '')
    if comment == '':
        return HttpResponse(json.dumps({
            'error': 101,
            'message': '留言不能为空'
        }),
                            content_type="application/json")
    if not has_course_permission(request.user,
                                 homeworkcommit.coursehomework.course):
        return HttpResponse(json.dumps({
            'error': 101,
            'message': '没有权限'
        }),
                            content_type="application/json")
    homeworkcommit.comment = comment
    homeworkcommit.save()
    # send wechat notification
    article = {
        "title":
        u"作业留言提醒!",
        "description":
        u"教师留言:" + comment,
        "url":
        "%s%s" % (settings.DOMAIN,
                  reverse('course:homework',
                          args=[homeworkcommit.coursehomework.course_id]) +
                  '?homeworkid=%d' % homeworkcommit.coursehomework_id),
        "image":
        "%s/static/img/homework.png"
    }
    wechat_client.message.send_articles(
        agent_id=settings.AGENTID,
        user_ids=[homeworkcommit.student.user.openid],
        articles=[article])
    return HttpResponse(json.dumps({
        'error': 0,
        'message': '留言成功'
    }),
                        content_type="application/json")
示例#19
0
def studentcourse_selectdata(request, courseid):
    course = Course.objects.get(id=courseid)
    courseperms = has_course_permission(request.user, course)
    if not courseperms:
        return HttpResponse(json.dumps({
            'error': 101,
            'message': '没有权限'
        }),
                            content_type="application/json")
    wd = request.GET['wd']
    limit = 5
    offset = 0
    # lessondata = Lesson.objects.all()[offset: (offset + limit)]
    studentcourse_data = Studentcourse.objects.filter(
        course=course).values_list('student')
    studentdata = Student.objects.filter(
        studentid__in=studentcourse_data).order_by('studentid')
    count = studentdata.filter(
        (Q(name__icontains=wd) | Q(studentid__startswith=wd))).count()
    studentdata = studentdata.select_related('classid').select_related(
        'major').select_related('department').filter(
            (Q(name__icontains=wd)
             | Q(studentid__startswith=wd)))[offset:(offset + limit)]

    rows = []
    for p in studentdata:
        ld = {
            'id': p.studentid,
            'name': p.name,
            'sex': (p.sex - 1 and [u'女'] or [u'男'])[0],
            'class': (p.classid and [p.classid.name] or [None])[0],
            'major': (p.major and [p.major.name] or [None])[0],
            'department': p.department.name
        }
        rows.append(ld)
    data = {'total': count, 'rows': rows}
    return HttpResponse(json.dumps(data), content_type="application/json")
示例#20
0
def startCheckin(request, lessonid):
    lesson = Lesson.objects.get(id=lessonid)
    if not has_course_permission(request.user, lesson.course):
        return render(request, 'error.html', {'message': '没有权限'})
    mode = request.GET.get('mode', default='first')
    auto_start = False
    if mode == 'startfirst':  # 自动开启课程模式
        mode = 'first'
        auto_start = True

    if lesson.status == LESSON_STATUS_AWAIT:
        if auto_start:
            re = lesson.startlesson()
            if re['error'] != 0:
                return render(request, 'error.html',
                              {'message': re['message'],
                               'submessage': lesson.course.title,
                               'jumpurl': str(
                                   reverse('course:information', args=[lesson.course.id]))})
        else:
            return render(request, 'error.html',
                          {'message': '课程还未开始',
                           'submessage': lesson.course.title,
                           'jumpurl': str(
                               reverse('course:information', args=[lesson.course.id]))})
    if lesson.status == LESSON_STATUS_NOW:
        re = startcheckin(lessonid, mode)
        if re['error'] != 0:
            return render(request, 'error.html', {'message': re['message'], 'submessage': lesson.course.title})
        return redirect(reverse('checkin:qrcheckin', args=[lessonid]))
    elif lesson.status in (LESSON_STATUS_CHECKIN, LESSON_STATUS_CHECKIN_ADD, LESSON_STATUS_CHECKIN_AGAIN):
        return redirect(reverse('checkin:qrcheckin', args=[lessonid]))
    return render(request, 'error.html',
                  {'message': '开始签到失败',
                   'submessage': lesson.course.title,
                   'jumpurl': str(
                       reverse('course:information', args=[lesson.course.id]))})
示例#21
0
def homework(request, courseid):
    coursedata = Course.objects.get(id=courseid)
    courseperms = has_course_permission(request.user, coursedata)
    coursestudent = is_course_student(coursedata, request.user)
    if request.GET.get('newhomework'):
        if request.META['REQUEST_METHOD'] == 'POST':
            if not courseperms:
                return HttpResponse(json.dumps({
                    'error': 101,
                    'message': '没有权限'
                }),
                                    content_type="application/json")
            title = request.POST.get('title')
            deadline = request.POST.get('deadline')
            type = request.POST.get('type')
            if type == 'onlinesubmit':
                type = COURSE_HOMEWORK_TYPE_ONLINESUBMIT
            elif type == 'nosubmit':
                type = COURSE_HOMEWORK_TYPE_NOSUBMIT
            instruction = request.POST.get('instruction')
            attachments = request.FILES.getlist('attachment')
            weight = request.POST.get('weight')
            try:
                homework = Coursehomework.objects.create(title=title,
                                                         deadline=deadline,
                                                         type=type,
                                                         weight=weight,
                                                         course=coursedata)
            except ValidationError:
                return render(request, 'error.html', {'message': '截止日期格式错误'})
            homework.instruction = instruction
            homework.deal_base64img()
            homework.save()
            for file in attachments:
                homework.attachment.add(
                    Homeworkfile.objects.create(file=file, title=file.name))
            send_homework_notification.delay(homework.id)
            return redirect(
                reverse('course:homework', args=[courseid]) +
                '?homeworkid=%d' % homework.id)
        else:
            return render(request, 'newhomework.html', {
                'coursedata': coursedata,
                'courseperms': courseperms
            })
    elif request.GET.get('homeworkid'):
        homeworkdata = get_object_or_404(Coursehomework,
                                         pk=request.GET.get('homeworkid'))
        data = {
            'coursedata': coursedata,
            'courseperms': courseperms,
            'homework': homeworkdata,
            'coursestudent': coursestudent
        }
        if request.META[
                'REQUEST_METHOD'] == 'POST' and COURSE_HOMEWORK_TYPE_ONLINESUBMIT == homeworkdata.type:
            if not coursestudent:
                return HttpResponse(json.dumps({
                    'error': 101,
                    'message': '上课名单里没有你'
                }),
                                    content_type="application/json")
            text = request.POST.get('text')
            attachments = request.FILES.getlist('attachment')
            commitdata, created = Homeworkcommit.objects.get_or_create(
                student=coursestudent, coursehomework=homeworkdata)
            if commitdata.score:
                pass  # 已经判完分数
            commitdata.text = text
            commitdata.deal_base64img()
            commitdata.submittime = time.strftime('%Y-%m-%d %H:%M:%S',
                                                  time.localtime())
            if not created and attachments:
                for ca in commitdata.attachment.exclude(title=None).all():
                    ca.file.delete()
                    ca.delete()
            for file in attachments:
                commitdata.attachment.add(
                    Homeworkfile.objects.create(file=file, title=file.name))
            commitdata.save()
            return redirect(
                reverse('course:homework', args=[courseid]) +
                '?homeworkid=%d' % homeworkdata.id)
        else:
            if coursestudent:
                try:
                    commitdata = Homeworkcommit.objects.get(
                        student=coursestudent, coursehomework=homeworkdata)
                    data['commitdata'] = commitdata
                except:
                    pass
            if courseperms:
                allcommit = Homeworkcommit.objects.filter(
                    coursehomework=homeworkdata, student=OuterRef('studentid'))
                students = Student.objects.filter(
                    studentid__in=Studentcourse.objects.filter(course=coursedata) \
                        .values_list('student', flat=True)).order_by('studentid').only('name').annotate(
                    score=Subquery(allcommit.values('score')[:1]),
                    time=Subquery(allcommit.values('submittime')[:1]),
                    submitid=Subquery(allcommit.values('id')[:1])
                )
                # data['allcommit'] = allcommit
                data['students'] = students
        return render(request, 'homeworkinformation.html', data)
    elif request.GET.get('delhomeworkid'):
        if not courseperms:
            return HttpResponse(json.dumps({
                'error': 101,
                'message': '没有权限'
            }),
                                content_type="application/json")
        homeworkdata = Coursehomework.objects.get(
            id=request.GET.get('delhomeworkid'))
        for ca in homeworkdata.attachment.all():
            ca.file.delete()
            ca.delete()
        for hc in Homeworkcommit.objects.filter(
                coursehomework=homeworkdata).all():
            for ca in hc.attachment.all():
                ca.file.delete()
                ca.delete()
            hc.delete()
        homeworkdata.delete()
        return redirect(reverse('course:homework', args=[courseid]))
    elif request.GET.get('edithomeworkid'):
        homeworkdata = Coursehomework.objects.get(
            id=request.GET.get('edithomeworkid'))
        if request.META['REQUEST_METHOD'] == 'POST':
            if not courseperms:
                return HttpResponse(json.dumps({
                    'error': 101,
                    'message': '没有权限'
                }),
                                    content_type="application/json")
            homeworkdata.title = request.POST.get('title')
            homeworkdata.deadline = request.POST.get('deadline')
            type = request.POST.get('type')
            if type == 'onlinesubmit':
                type = COURSE_HOMEWORK_TYPE_ONLINESUBMIT
            elif type == 'nosubmit':
                type = COURSE_HOMEWORK_TYPE_NOSUBMIT
            homeworkdata.type = type
            homeworkdata.instruction = request.POST.get('instruction')
            attachments = request.FILES.getlist('attachment')
            if attachments:
                homeworkdata.weight = request.POST.get('weight')
                homeworkdata.deal_base64img()
                for ca in homeworkdata.attachment.exclude(title=None).all():
                    ca.file.delete()
                    ca.delete()
                for file in attachments:
                    homeworkdata.attachment.add(
                        Homeworkfile.objects.create(file=file,
                                                    title=file.name))
            homeworkdata.save()
            return redirect(
                reverse('course:homework', args=[courseid]) +
                '?homeworkid=%d' % homeworkdata.id)
        else:
            return render(
                request, 'newhomework.html', {
                    'coursedata': coursedata,
                    'courseperms': courseperms,
                    'homework': homeworkdata
                })
    else:
        homeworks = Coursehomework.objects.filter(course=coursedata).only('title', 'deadline') \
            .order_by('-deadline').all()
        return render(
            request, 'homeworklist.html', {
                'coursedata': coursedata,
                'courseperms': courseperms,
                'homeworks': homeworks,
                'coursestudent': coursestudent
            })
示例#22
0
def settings(request, courseid):
    course = Course.objects.get(id=courseid)
    try:
        scoreregulation = Scoreregulation.objects.get(course=course)
    except ObjectDoesNotExist:
        scoreregulation = Scoreregulation(course=course)
    if request.META['REQUEST_METHOD'] == 'POST':
        type = request.GET.get('type')
        if type == 'checkinscore':
            scoreregulation.normal = request.POST.get('normal')
            scoreregulation.success = request.POST.get('success')
            scoreregulation.early = request.POST.get('early')
            scoreregulation.lateearly = request.POST.get('lateearly')
            scoreregulation.late = request.POST.get('late')
            scoreregulation.private_ask = request.POST.get('private_ask')
            scoreregulation.public_ask = request.POST.get('public_ask')
            scoreregulation.sick_ask = request.POST.get('sick_ask')
            scoreregulation.save()
        elif type == 'people':
            students = request.POST.getlist('addstudents', default=None)
            exempt_students = request.POST.getlist('exempt_students',
                                                   default=None)
            del_students = request.POST.getlist('delstudents', default=None)
            teachers = request.POST.getlist('addteachers', default=None)
            disable_sync = request.POST.get('disable_sync', default=None)
            add_student_from_course = request.POST.get(
                'add_student_from_course', default=None)
            if disable_sync and disable_sync == 'on':
                disable_sync = True
            else:
                disable_sync = False
            if course.disable_sync != disable_sync:
                course.disable_sync = disable_sync
                course.save()
            if add_student_from_course and add_student_from_course != '':
                try:
                    if add_student_from_course.isdigit():
                        from_course = Course.objects.get(
                            id=int(add_student_from_course))
                    else:
                        from_course = Course.objects.get(
                            serialnumber=add_student_from_course)
                except ObjectDoesNotExist:
                    return render(request, 'error.html',
                                  {'message': '没有找到课程,请检查课程编号或id'})
                new_students = Studentcourse.objects.filter(
                    course=from_course).values_list('student', flat=True)
                new_students_create = []
                for ns in new_students:
                    if not Studentcourse.objects.filter(
                            course=course, student_id=ns).exists():
                        new_students_create.append(
                            Studentcourse(course=course, student_id=ns))
                Studentcourse.objects.bulk_create(new_students_create)
            if students:
                for s in students:
                    if not Studentcourse.objects.filter(course=course,
                                                        student_id=s).exists():
                        Studentcourse.objects.create(course=course,
                                                     student_id=s)
            if del_students:
                for s in del_students:
                    Studentcourse.objects.filter(course=course,
                                                 student_id=s).delete()
            # exempt_students:
            old_exempt_students_id = []
            for s in course.exempt_students.all():
                old_exempt_students_id.append(s.studentid)
            new_exempt_students = Student.objects.filter(
                studentid__in=exempt_students).all()
            course.exempt_students.set(new_exempt_students)
            Studentcourse.objects.filter(
                course=course, student__in=new_exempt_students).delete()
            for s in new_exempt_students:
                try:
                    old_exempt_students_id.remove(s.studentid)
                except ValueError:
                    pass
            for s in old_exempt_students_id:
                Studentcourse.objects.create(course=course, student_id=s)
            if teachers:
                for t in teachers:
                    course.teachers.add(Teacher.objects.get(teacherid=t))

    data = {
        'normal': scoreregulation.normal,
        'success': scoreregulation.success,
        'early': scoreregulation.early,
        'lateearly': scoreregulation.lateearly,
        'late': scoreregulation.late,
        'private_ask': scoreregulation.private_ask,
        'public_ask': scoreregulation.public_ask,
        'sick_ask': scoreregulation.sick_ask,
        'coursedata': course,
        'exempt_students': course.exempt_students.all(),
        'courseperms': has_course_permission(request.user, course)
    }
    return render(request, 'settings.html', data)
示例#23
0
def lesson_data(request, lessonid):
    lesson = Lesson.objects.get(id=lessonid)
    if not (has_course_permission(request.user, lesson.course)
            or request.user.has_perm('checkin_view')):
        return render(request, 'error.html', {'message': '没有权限'})
    t = {
        'lessondata': lesson,
        'coursedata': lesson.course,
        'courseperms': has_course_permission(request.user, lesson.course)
    }
    if lesson.ischeckinnow():
        return redirect(reverse('checkin:qrcheckin', args=[lessonid]))
    if not (lesson.isnow() or lesson.isend()):
        return render(
            request, 'error.html', {
                'message': '课程还未开启',
                'jumpurl': reverse('course:information',
                                   args=[lesson.course_id])
            })
    checkinrecord = Checkinrecord.objects.filter(lesson=lesson)
    checkincount = checkinrecord.count()

    shouldnumber = lesson.shouldnumber
    actuallynumber = lesson.actuallynumber
    asknumber = lesson.asknumber
    notreachnumber = lesson.notreachnumber
    t['shouldnumber'] = shouldnumber
    t['actuallynumber'] = actuallynumber
    t['asknumber'] = asknumber
    t['notreachnumber'] = notreachnumber

    checkin_success = Checkin.objects.filter(lesson=lesson).filter(
        status=CHECKIN_STATUS_SUCCESS).count()
    checkin_early = Checkin.objects.filter(lesson=lesson).filter(
        status=CHECKIN_STATUS_EARLY).count()
    checkin_late = Checkin.objects.filter(lesson=lesson).filter(
        status=CHECKIN_STATUS_LATE).count()
    checkin_lateearly = Checkin.objects.filter(lesson=lesson).filter(
        status=CHECKIN_STATUS_LATEEARLY).count()
    checkin_normal = Checkin.objects.filter(lesson=lesson).filter(
        status=CHECKIN_STATUS_NORMAL).count()
    t['checkin_success'] = checkin_success
    t['checkin_early'] = checkin_early
    t['checkin_late'] = checkin_late
    t['checkin_lateearly'] = checkin_lateearly
    t['checkin_normal'] = checkin_normal

    t['checkincount'] = checkincount
    if not checkincount == 0:
        checkinrecord = checkinrecord.order_by('time').all()
        t['checkinrecord'] = checkinrecord

    sc = Studentcourse.objects.filter(course=lesson.course,
                                      student=OuterRef('student'))
    checkindata = Checkin.objects.filter(lesson=lesson).exclude(
        status__gt=10).select_related(
            'student').select_related('student__classid').order_by(
                'abnormal', 'student__studentid').annotate(
                    score=Subquery(sc.values('performance_score')[:1])).only(
                        'student_id', 'student__name',
                        'student__classid__name', 'status', 'abnormal')
    students = []
    for c in checkindata:
        students.append({
            'studentid':
            c.student_id,
            'name':
            c.student.name,
            'class':
            c.student.classid.name if c.student.classid else None,
            'score':
            c.score,
            'status':
            c.status,
            'abnormal':
            c.abnormal,
        })
    t['students'] = json.dumps(students)

    askdata = Checkin.objects.filter(
        lesson=lesson, status__gt=10).select_related('student').select_related(
            'student__classid').select_related(
                'student__classid__department').select_related(
                    'student__classid__major').all()
    t['askdata'] = askdata
    t['canclearlastdata'] = cache.get('lesson_%d_clear_flag' % lesson.id,
                                      default=False)
    return render(request, 'lesson_data.html', t)
示例#24
0
def course_data(request, courseid):
    modify = False
    if request.GET.get('mode', default=None) == 'modify':
        modify = True
    course = Course.objects.get(id=courseid)
    if not (has_course_permission(request.user, course)
            or request.user.has_perm('checkin_view')):
        return render(request, 'error.html', {'message': '没有权限'})
    alllesson = Lesson.objects.filter(course=course).exclude(
        status=LESSON_STATUS_AWAIT).order_by('week', 'day', 'time').all()
    allhomework = Coursehomework.objects.filter(course=course).exclude(type=COURSE_HOMEWORK_TYPE_NOSUBMIT) \
        .order_by('deadline').all()
    homework_count = allhomework.count()
    columns = [[
        {
            'field': 'name',
            'title': u'学生',
            'rowspan': 2,
            'align': 'center',
            'valign': 'middle',
            'searchable': True
        },
        {
            'field': 'studentid',
            'title': u'学号',
            'rowspan': 2,
            'align': 'center',
            'valign': 'middle',
            'searchable': True,
            'sortable': True
        },
        {
            'field': 'class',
            'title': u'班级',
            'rowspan': 2,
            'align': 'center',
            'valign': 'middle'
        },
        {
            'field': 'ratio',
            'title': u'出勤率',
            'rowspan': 2,
            'align': 'center',
            'valign': 'middle'
        },
        {
            'field': 'score',
            'title': u'考勤分数',
            'rowspan': 2,
            'align': 'center',
            'valign': 'middle'
        },
        {
            'field': 'performance_score',
            'title': u'表现分数',
            'rowspan': 2,
            'align': 'center',
            'valign': 'middle'
        },
        {
            'title': u'签到数据',
            'colspan': alllesson.count(),
            'align': 'center'
        },
    ], []]
    if homework_count > 0:
        columns[0].append({
            'title': u'作业数据',
            'colspan': homework_count,
            'align': 'center'
        })

    # for i in range(0, count - 1):
    #    columns.append({'field': 'lesson%d' % i, 'title': i + 1, 'formatter': 'identifierFormatter'})
    for i, l in enumerate(alllesson):
        if modify and l.status != LESSON_STATUS_AWAIT and l.status != LESSON_STATUS_CANCLE:
            columns[1].append({
                'field': 'lesson%d' % l.id,
                'title': i + 1,
                'align': 'center',
                'editable': {
                    'url': reverse('checkin:changecheckinstatus', args=[l.id])
                }
            })
        else:
            columns[1].append({
                'field': 'lesson%d' % l.id,
                'title': i + 1,
                'align': 'center',
                'formatter': 'identifierFormatter',
                'cellStyle': 'cellStyle'
            })
    for i, l in enumerate(allhomework):
        columns[1].append({
            'field': 'homework%d' % l.id,
            'title': i + 1,
            'align': 'center'
        })

    studentdata = Studentcourse.objects.filter(course=course).select_related('student') \
        .select_related('student__classid').order_by('student').all()
    lessondata = []
    '''for s in studentdata:
        studentcheckindata[s.student.studentid] = {'studentid': s.student.studentid, 'name': s.student.name}
    for l in alllesson:
        checkin = Checkin.objects.filter(lesson=l).all()
        for c in checkin:
    '''
    count = Checkin.objects.filter(
        lesson__course=course).distinct('lesson').count()
    try:
        scoreregulation = Scoreregulation.objects.get(course=course)
    except ObjectDoesNotExist:
        scoreregulation = Scoreregulation(course=course)
    for s in studentdata:
        studentdata = {
            'studentid': s.student.studentid,
            'name': s.student.name,
            'class': s.student.classid.name if s.student.classid else None
        }
        homeworkdata = Homeworkcommit.objects.filter(
            student=s.student, coursehomework__in=allhomework).all()
        for h in homeworkdata:
            studentdata['homework%d' %
                        (h.coursehomework_id)] = h.score if h.score else '未评'
        checkindata = Checkin.objects.filter(
            student=s.student, lesson__course=course).order_by(
                'lesson__week', 'lesson__day',
                'lesson__time').select_related('lesson').all()
        ratio = 0.0
        score = 0.0
        totalscore = 0
        for c in checkindata:
            studentdata['lesson%d' % (c.lesson.id)] = c.status
            if c.status != CHECKIN_STATUS_NORMAL:
                ratio += 1
            score += scoreregulation.getscore(c.status)
            totalscore += 100
        if count == 0:
            ratio = 1
        else:
            ratio = ratio / count
        if totalscore == 0:
            score = 100
        else:
            score = int((score / totalscore) * 100)
        studentdata['ratio'] = '%.1f%%' % (ratio * 100)
        studentdata['score'] = '%d' % (score)
        studentdata['performance_score'] = '%d' % (s.performance_score)
        lessondata.append(studentdata)
    data = {'header': json.dumps(columns), 'newrows': json.dumps(lessondata)}
    return render(
        request, 'course_data.html', {
            'coursedata': course,
            'data': data,
            'courseperms': has_course_permission(request.user, course)
        })