CRM - 講師與學生

1、講師與學生簡介

1.初始化  course_record, study_record.
2.學習記錄
3.錄入成績
4.顯示成績 ajax 查詢 柱狀圖展現成績 highcharts

5.上傳做業(os模塊)
6.下載做業

2、初始化course_record,study_record

錄入courserecord數據javascript

 

3、批量生成學習記錄

 

知識點css

1. 與course_record 關聯得班級對應得學生

    students_list = Student.objects.filter(class_list__id = course_record.class_obj.pk)
    for student in students_list:
        student_obj = StudyRecord(course_record=course_record,student=student)
        temp.append(student_obj)

 

2. 批量插入

StudyRecord.objects.bulk_create(temp)  

 

    def patch_studyrecord(self,request,queryset):
        # print('queryset:--》',queryset)
        temp = []
        for course_record in queryset:
            # 與course_record 關聯得班級對應得學生
            students_list = Student.objects.filter(class_list__id = course_record.class_obj.pk)
            for student in students_list:
                student_obj = StudyRecord(course_record=course_record,student=student)
                temp.append(student_obj)

        StudyRecord.objects.bulk_create(temp)

    actions = [patch_studyrecord]
    patch_studyrecord.short_description = "批量生成學習記錄"

 

4、查看學習記錄

知識點html

1. ?course_record=%s 過濾;

     mark_safe("<a href='/stark/crm/studyrecord/?course_record=%s'>記錄</a>"%(obj.pk))
        
    改一下全局的:
# if filter_field in self.list_filter: if filter_field !="page": filter_condition.children.append((filter_field, val))

 

2. record,score顯示;get_field_display

        放到全局:
        if field_obj.choices:
            val = getattr(obj,"get_"+field+"_display")
        else:
            val = getattr(obj, field)

 

3. 批量處理遲到

   queryset.update(record="late")

 

    -----------------------
    
    def record(self, obj=None, header=False):
        if header:
            return "學習記錄"
        return mark_safe("<a href='/stark/crm/studyrecord/?course_record=%s'>記錄</a>"%(obj.pk))
    
    list_display = ["class_obj", 'day_num', "teacher", record, record_score ]
    
    ---------------------
    
    class StudyRecordConfig(ModelStark):
        list_display = ['student','course_record','record','score']
    
        def patch_late(self, request, queryset):
            queryset.update(record="late")
    
        patch_late.short_description = "遲到"
        actions = [patch_late]
    
    site.register(StudyRecord,StudyRecordConfig)

 

5、錄入成績

 

知識點前端

 1. mark_safe

 mark_safe("<a href='record_score/%s'>錄入成績</a>"%obj.pk)

 

2. 新增url

    def extra_url(self):
        temp = []
        temp.append(url(r'^record_score/(\d+)', self.score))
        return temp  

 

3. form表單提交數據

    request.post:
    '''
        <QueryDict: {'csrfmiddlewaretoken': ['muIrf7pwbxIueSJcKADRlZEGVbzzRZOaiGVkBV8DGYC2V9gmxZtyZgujddFtTojk'],
        'score_33': ['100'], 'homework_note_33': ['很好'], 
        'score_34': ['85'], 'homework_note_34': ['棒'],
        'score_35': ['60'], 'homework_note_35': ['None']}>
    ''' 

 

4. 處理數據( field, pk = key.rsplit('_', 1) )

    data = {}  # data={"33":{"score":100,"homework_note":'xxx'},}
    for key,value in request.POST.items():
        if key == "csrfmiddlewaretoken":continue
        field, pk = key.rsplit('_', 1)

        if pk in data:
            data[pk][field] = value
        else:
            data[pk] = {field:value}

    print("data-->",data)
    '''
         {'33': {'score': '100', 'homework_note': '很好'}, 
         '34': {'score': '85', 'homework_note': '棒'}, 
         '35': {'score': '60', 'homework_note': 'None'}}
    '''

 

5. 更新數據

    for pk,update_data  in data.items():
        StudyRecord.objects.filter(pk=pk).update(**update_data)

 

6. 跳轉當前頁面

 return redirect(request.path)

 

7. get請求

    study_record_list = StudyRecord.objects.filter(course_record__id=course_record_id)
    score_choices = StudyRecord.score_choices
    return render(request,'score.html',locals())

 

    def score(self,request, course_record_id):
        if request.method == "POST":
            print('post::::', request.POST)
            '''
            <QueryDict: {'csrfmiddlewaretoken': ['muIrf7pwbxIueSJcKADRlZEGVbzzRZOaiGVkBV8DGYC2V9gmxZtyZgujddFtTojk'],
            'score_33': ['100'], 'homework_note_33': ['很好'], 
            'score_34': ['85'], 'homework_note_34': ['棒'],
             'score_35': ['60'], 'homework_note_35': ['None']}>
            '''
            data = {}  # data={"33":{"score":100,"homework_note":'xxx'},}
            for key,value in request.POST.items():
                if key == "csrfmiddlewaretoken":continue
                field, pk = key.rsplit('_', 1)

                if pk in data:
                    data[pk][field] = value
                else:
                    data[pk] = {field:value}

            print("data-->",data)
            '''
             {'33': {'score': '90', 'homework_note': '很好'}, 
             '34': {'score': '80', 'homework_note': '幫幫噠'}, 
             '35': {'score': '50', 'homework_note': '沒問題'}}

            '''
            for pk,update_data  in data.items():
                StudyRecord.objects.filter(pk=pk).update(**update_data)

            return redirect(request.path)

        else:
            study_record_list = StudyRecord.objects.filter(course_record__id=course_record_id)
            score_choices = StudyRecord.score_choices
            return render(request,'score.html',locals())

    def extra_url(self):
        temp = []
        temp.append(url(r'^record_score/(\d+)', self.score))
        return temp 
    
    
   def record_score(self, obj=None, header=False):
        if header:
            return "錄入成績"
        return mark_safe("<a href='record_score/%s'>錄入成績</a>"%obj.pk)

   list_display = ["class_obj", 'day_num', "teacher", record, record_score ]

 

score.htmljava

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
    <link rel="stylesheet" href="">
    <link rel="stylesheet" href="/static/bootstrap/css/bootstrap.css">
</head>
<body>

<h3>錄入成績</h3>

<div class="container">
    <div class="row">
        <div class="col-md-9 col-md-offset-1">
            <form action="" method="post">
                {% csrf_token %}
                <table class="table table-bordered table-striped">
                    <thead>
                    <tr>
                        <th>學生姓名</th>
                        <th>考勤</th>
                        <th>成績</th>
                        <th>批語</th>
                    </tr>
                    </thead>
                    <tbody>
                        {% for study_record in study_record_list %}
                        <tr>
                            <td>{{ study_record.student }}</td>
                            <td>{{ study_record.get_record_display }}</td>
                            <td style="width: 100px; padding: 5px 10px;">
                                <select name="score_{{ study_record.pk }}" id="" class="form-control">
                                    {% for item in score_choices %}
                                        {% if study_record.score == item.0 %}
                                            <option selected value="{{ item.0 }}">{{ item.1 }}</option>
                                        {% else %}
                                             <option value="{{ item.0 }}">{{ item.1 }}</option>
                                        {% endif %}
                                    {% endfor %}
                                </select>

                            </td>
                            <td>
                                <textarea name="homework_note_{{ study_record.pk }}" id="" cols="30" rows="3" class="form-control">{{ study_record.homework_note }}</textarea>
                            </td>
                        </tr>
                        {% endfor %}

                    </tbody>
                </table>
                <input type="submit" class="btn btn-default pull-right">
            </form>
        </div>
    </div>
</div>


</body>
</html>

 

6、查當作績 - highcharts 

 

知識點jquery

 1. 查當作績

mark_safe("<a href='/stark/crm/student/score_view/%s'>查當作績</a>"%obj.pk)

2. 擴展url

temp.append(url(r'^score_view/(\d+)', self.score_view))

3. get

student = Student.objects.filter(pk=sid).first()
class_list = student.class_list.all()

4. request.is_ajax

sid = request.GET.get('sid')
cid = request.GET.get('cid')

5. 跨表查詢

準備數據:[['day94', 85], ['day95', 85], ['day96', 60]]
study_record_list = StudyRecord.objects.filter(student=sid,course_record__class_obj=cid)

data_list = []
for study_record in study_record_list:
day_num = study_record.course_record.day_num
data_list.append(["day%s"%day_num,study_record.score])

print('----',data_list) # [['day94', 85], ['day95', 85], ['day96', 60]]

6. JsonResponse()

返回JsonResponse,非字典須要加上 safe = False
return JsonResponse(data_list,safe=False)

7. 前端

注意:cid sid 用法; ajax 顯示 highcharts 柱狀圖
<a class="check_chart" cid="{{ cls.pk }}" sid="{{ student.pk }}">查當作績</a>

<div id="container" style="width: 600px; height: 400px;"></div>

<script type="text/javascript">
    $('.check_chart').click(function () {
        $.ajax({
            url:"",
            type:"get",
            data:{
                cid:$(this).attr('cid'),
                sid:$(this).attr('sid')
            },
            success:function (data) {
                // 顯示柱狀圖
                var chart = Highcharts.chart('container', {
                    chart: {
                        type: 'column'
                    },
                    title: {
                        text: '查看學生天天的成績'
                    },
                    subtitle: {
                        text: '數據截止 2017-03,來源: <a href="https://en.wikipedia.org/wiki/List_of_cities_proper_by_population">Wikipedia</a>'
                    },
                    xAxis: {
                        type: 'category',
                        labels: {
                            rotation: -45  // 設置軸標籤旋轉角度
                        }
                    },
                    yAxis: {
                        min: 0,
                        title: {
                            text: '分數'
                        }
                    },
                    legend: {
                        enabled: false
                    },
                    tooltip: {
                        pointFormat: '分數: <b>{point.y:.1f} </b>'
                    },
                    series: [{
                        name: '總人口',
                        data: data,
                        dataLabels: {
                            enabled: true,
                            rotation: -90,
                            color: '#FFFFFF',
                            align: 'right',
                            format: '{point.y:.1f}', // :.1f 爲保留 1 位小數
                            y: 10
                        }
                    }]
                });
            }
        })

    });

</script>
 
from django.http import JsonResponse
class StudentConfig(ModelStark):
    def score_view(self,request,sid):
        if request.is_ajax():
            # print(request.GET)
            cid = request.GET.get('cid')
            sid = request.GET.get('sid')

            # 跨表查
            study_record_list = StudyRecord.objects.filter(student=sid,course_record__class_obj=cid)

            data_list = []
            for study_record in study_record_list:
                day_num = study_record.course_record.day_num
                data_list.append(["day%s"%day_num,study_record.score])
                #  # [['day94', 85], ['day95', 85], ['day96', -1]]
            return JsonResponse(data_list,safe=False)

        else:
            student = Student.objects.filter(pk=sid).first()
            class_list = student.class_list.all()
            return render(request,'score_view.html', locals())

    def extra_url(self):
        temp = []
        temp.append(url(r"^score_view/(\d+)",self.score_view))
        return temp

    def score_show(self, obj=None, header=False):
        if header:
            return "查當作績"
        return mark_safe("<a href='score_view/%s'>查當作績</a>"%obj.pk)

    list_display = ['customer','class_list',score_show]
    list_display_links = ['customer']


site.register(Student,StudentConfig)

 

crm/stark.py

# -*- coding:utf-8 -*-

from .models import *
from stark.service.stark import site, ModelStark
from django.utils.safestring import mark_safe
from django.conf.urls import url
from django.shortcuts import HttpResponse,reverse,redirect,render

class DepartmentConfig(ModelStark):
    list_display = ['title', 'code']

site.register(Department, DepartmentConfig)

class UserInfoConfig(ModelStark):
    list_display = ["name", 'email', 'depart']

site.register(UserInfo, UserInfoConfig)

class ClassListConfig(ModelStark):
    def display_classname(self,obj=None,header=False):
        if header:
            return "班級名稱"
        return "%s(%s)"%(obj.course.name, obj.semester)

    list_display = [display_classname, 'tutor', 'teachers']

site.register(ClassList, ClassListConfig)

class CustomerConfig(ModelStark):
    def display_course(self, obj=None, header=False):
        if header:
            return "諮詢課程"

        temp = []
        for course in obj.course.all():
            temp.append("<a href='/stark/crm/customer/cancel_course/%s/%s' style='border:1px solid #369; padding:3px 6px;'><span>%s</span></a>&nbsp;"%(obj.pk,course.pk,course.name))

        return mark_safe("".join(temp))

    def cancel_course(self, request, customer_id, course_id):
        customer_obj = Customer.objects.filter(pk=customer_id).first()
        customer_obj.course.remove(course_id)
        return redirect(self.get_list_url())  # 重定向到當前表得查看頁面

    def extra_url(self):
        temp = []
        temp.append(url(r'^cancel_course/(\d+)/(\d+)', self.cancel_course))
        return temp

    list_display = ["name", "gender",display_course ,"consultant"]

site.register(Customer, CustomerConfig)


class ConsultRecordConfig(ModelStark):
    list_display = ["customer", 'consultant','date','note']

site.register(ConsultRecord, ConsultRecordConfig)


from django.http import JsonResponse
class StudentConfig(ModelStark):
    def score_view(self,request,sid):
        if request.is_ajax():
            # print(request.GET)
            cid = request.GET.get('cid')
            sid = request.GET.get('sid')

            # 跨表查
            study_record_list = StudyRecord.objects.filter(student=sid,course_record__class_obj=cid)

            data_list = []
            for study_record in study_record_list:
                day_num = study_record.course_record.day_num
                data_list.append(["day%s"%day_num,study_record.score])
                #  # [['day94', 85], ['day95', 85], ['day96', -1]]
            return JsonResponse(data_list,safe=False)

        else:
            student = Student.objects.filter(pk=sid).first()
            class_list = student.class_list.all()
            return render(request,'score_view.html', locals())

    def extra_url(self):
        temp = []
        temp.append(url(r"^score_view/(\d+)",self.score_view))
        return temp

    def score_show(self, obj=None, header=False):
        if header:
            return "查當作績"
        return mark_safe("<a href='score_view/%s'>查當作績</a>"%obj.pk)

    list_display = ['customer','class_list',score_show]
    list_display_links = ['customer']


site.register(Student,StudentConfig)


class CourseRecordConfig(ModelStark):

    def score(self,request, course_record_id):
        if request.method == "POST":
            print('post::::', request.POST)
            """
            <QueryDict: {'csrfmiddlewaretoken': ['muIrf7pwbxIueSJcKADRlZEGVbzzRZOaiGVkBV8DGYC2V9gmxZtyZgujddFtTojk'],
            'score_33': ['100'], 'homework_note_33': ['很好'], 
            'score_34': ['85'], 'homework_note_34': ['棒'],
             'score_35': ['60'], 'homework_note_35': ['None']}>
            """
            data = {}  # data={"33":{"score":100,"homework_note":'xxx'},}
            for key,value in request.POST.items():
                if key == "csrfmiddlewaretoken":continue
                field, pk = key.rsplit('_', 1)

                if pk in data:
                    data[pk][field] = value
                else:
                    data[pk] = {field:value}

            print("data-->",data)
            """
             {'33': {'score': '90', 'homework_note': '很好'}, 
             '34': {'score': '80', 'homework_note': '幫幫噠'}, 
             '35': {'score': '50', 'homework_note': '沒問題'}}

            """
            for pk,update_data  in data.items():
                StudyRecord.objects.filter(pk=pk).update(**update_data)

            return redirect(request.path)

        else:
            study_record_list = StudyRecord.objects.filter(course_record__id=course_record_id)
            score_choices = StudyRecord.score_choices
            return render(request,'score.html',locals())

    def extra_url(self):
        temp = []
        temp.append(url(r'^record_score/(\d+)', self.score))
        return temp

    def record(self, obj=None, header=False):
        if header:
            return "學習記錄"
        return mark_safe("<a href='/stark/crm/studyrecord/?course_record=%s'>記錄</a>"%(obj.pk))

    def record_score(self, obj=None, header=False):
        if header:
            return "錄入成績"
        return mark_safe("<a href='record_score/%s'>錄入成績</a>"%obj.pk)

    list_display = ["class_obj", 'day_num', "teacher", record, record_score ]

    def patch_studyrecord(self,request,queryset):
        # print('queryset:--》',queryset)
        temp = []
        for course_record in queryset:
            # 與course_record 關聯得班級對應得學生
            students_list = Student.objects.filter(class_list__id = course_record.class_obj.pk)
            for student in students_list:
                student_obj = StudyRecord(course_record=course_record,student=student)
                temp.append(student_obj)

        StudyRecord.objects.bulk_create(temp)

    actions = [patch_studyrecord]
    patch_studyrecord.short_description = "批量生成學習記錄"


site.register(CourseRecord,CourseRecordConfig)


class StudyRecordConfig(ModelStark):
    list_display = ['student','course_record','record','score']

    def patch_late(self, request, queryset):
        queryset.update(record="late")

    patch_late.short_description = "遲到"
    actions = [patch_late]

site.register(StudyRecord,StudyRecordConfig)

site.register(Course)
site.register(School)
stark.py

 

score_view.html

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
    <link rel="stylesheet" href="/static/bootstrap/css/bootstrap.css">
    <script src="/static/js/jquery-1.12.4.min.js"></script>
    <script src="/static/chart/highcharts.js"></script>
</head>
<body>
<h3>查看{{ student }}成績</h3>

<div class="container">
    <div class="row">
        <div class="col-md-9">
            <form action="">
                <table class="table-bordered table table-striped">
                    <thead>
                    <tr>
                        <th>班級</th>
                        <th>班主任</th>
                        <th>任課老師</th>
                        <th>課程成績</th>
                    </tr>
                    </thead>
                    <tbody>
                    {% for cls in class_list %}
                        <tr>
                            <td>{{ cls }}</td>
                            <td>{{ cls.tutor }}</td>
                            <td>
                                {% for teacher in cls.teachers.all %}
                                    <span>{{ teacher }}</span>,
                                {% endfor %}

                            </td>
                            <td>
                                <a class="check_chart" cid="{{ cls.pk }}" sid="{{ student.pk }}">查當作績</a>
                            </td>
                        </tr>
                    {% endfor %}

                    </tbody>
                </table>
            </form>
        </div>
    </div>

</div>

<div id="container" style="width: 600px; height: 400px;"></div>

<script type="text/javascript">
    $('.check_chart').click(function () {
        $.ajax({
            url:"",
            type:"get",
            data:{
                cid:$(this).attr('cid'),
                sid:$(this).attr('sid')
            },
            success:function (data) {
                // 顯示柱狀圖
                var chart = Highcharts.chart('container', {
                    chart: {
                        type: 'column'
                    },
                    title: {
                        text: '查看學生天天的成績'
                    },
                    subtitle: {
                        text: '數據截止 2017-03,來源: <a href="https://en.wikipedia.org/wiki/List_of_cities_proper_by_population">Wikipedia</a>'
                    },
                    xAxis: {
                        type: 'category',
                        labels: {
                            rotation: -45  // 設置軸標籤旋轉角度
                        }
                    },
                    yAxis: {
                        min: 0,
                        title: {
                            text: '分數'
                        }
                    },
                    legend: {
                        enabled: false
                    },
                    tooltip: {
                        pointFormat: '分數: <b>{point.y:.1f} </b>'
                    },
                    series: [{
                        name: '總人口',
                        data: data,
                        dataLabels: {
                            enabled: true,
                            rotation: -90,
                            color: '#FFFFFF',
                            align: 'right',
                            format: '{point.y:.1f}', // :.1f 爲保留 1 位小數
                            y: 10
                        }
                    }]
                });
            }
        })

    });

</script>

</body>
</html>
score_view.html
相關文章
相關標籤/搜索