Пример #1
0
 def create_index(cls) -> None:
     db = get_mongodb()
     db.get_collection(cls.collection_name).create_index(
         [("course_id", 1), ("teach_type", 1), ("teacher_id_str", 1)],
         unique=True)
     db.get_collection(cls.collection_name).create_index([("cotc_id", 1)],
                                                         unique=True)
Пример #2
0
 def get_my_review(cls, cotc_id: int, student_id: str) -> Dict:
     db = get_mongodb()
     doc = db.get_collection(cls.collection_name).find_one({
         "cotc_id":
         cotc_id,
         "student_id":
         student_id
     })
     return doc
Пример #3
0
    def get_review(cls, cotc_id: int) -> Dict:
        """
        获得一个教学班集合的评价
        {
            "avg_rate": 4.3,
            "count"   : 1,
            "reviews": [
                {
                    "review"  : "老师讲得好",
                    "rate"    : 5,
                    "stu_name": "16级软件工程专业学生"
                },
            ]
        }

        :param cotc_id: 教学班集合 ID
        :return:
        """
        db = get_mongodb()
        result = db.get_collection(cls.collection_name).aggregate([{
            "$match": {
                "cotc_id": int(cotc_id)
            }
        }, {
            "$project": {
                "_id": 0,
                "student_id": 0,
                "cotc_id": 0
            }
        }, {
            "$group": {
                "_id": None,
                "avg_rate": {
                    "$avg": "$rate"
                },
                "reviews": {
                    "$push": "$$ROOT"
                },
                "count": {
                    "$sum": 1
                }
            }
        }])
        result = list(result)

        if result:
            result = result[0]
        else:
            result = {"avg_rate": 0, "reviews": [], "count": 0}
        return result
Пример #4
0
    def get_id_by_card(cls, card: CardResult) -> int:
        """
        从 api-server 返回的 CardResult 获得对应的“教学班集合” ID,如果不存在则新建
        """
        teachers = [{
            "name": x.name,
            "teacher_id": x.teacher_id
        } for x in card.teachers]
        teacher_name_str = '、'.join([x.name for x in card.teachers])

        card_name = card.name

        teach_type = 1
        if '辅修' in card.name:
            teach_type = 2
        elif '重修' in card.name:
            teach_type = 3
            # 教务会有“线性代数-新校区重修班-重修”这样的名字。对于重修班来说,在同一个老师不同校区对授课内容没有影响,所以这里标准化,
            # 在名字中去掉校区。
            name_splitted = [x for x in card_name.split("-") if x != '']
            card_name = ""
            for item in name_splitted:
                if '重修' not in item:
                    card_name = card_name + item
                else:
                    card_name = card_name + "-重修"
                    break

        db = get_mongodb()
        doc = db.get_collection(cls.collection_name).find_one_and_update(
            {
                'course_id': card.course_id,
                'teach_type': teach_type,
                'teacher_id_str': teacher_list_to_tid_str(card.teachers)
            }, {
                "$setOnInsert": {
                    "cotc_id": Redis.new_cotc_id(),
                    'name': card_name,
                    'teachers': teachers,
                    'teacher_name_str': teacher_name_str
                }
            },
            upsert=True,
            new=True)
        # you must set "new=True" in upsert case
        # https://stackoverflow.com/questions/32811510/mongoose-findoneandupdate-doesnt-return-updated-document

        return doc['cotc_id']
Пример #5
0
 def edit_my_review(cls, cotc_id: int, student_id: str, rate: int,
                    review: str, name: str) -> None:
     db = get_mongodb()
     db.get_collection(cls.collection_name).update_one(
         filter={
             "cotc_id": cotc_id,
             "student_id": student_id
         },
         update={
             "$set": {
                 "rate": rate,
                 "review": review,
                 "student_name": name
             }
         },
         upsert=True)
Пример #6
0
 def create_index(cls) -> None:
     db = get_mongodb()
     db.get_collection(cls.collection_name).create_index([("cotc_id", 1)],
                                                         unique=True)
Пример #7
0
 def get_doc(cls, cotc_id: int) -> Optional[Dict]:
     """获得 cotc_id 对应的文档,可能为 None """
     db = get_mongodb()
     return db.get_collection(cls.collection_name).find_one(
         {'cotc_id': cotc_id})