Esempio n. 1
0
def register():
    """注册:第一步:输入学号或教工号"""
    if request.method == 'GET':
        return render_template('user/register.html')
    else:
        if not request.form.get("xh", None):  # 表单为空
            flash(MSG_EMPTY_USERNAME)
            return redirect(url_for("user.register"))
        # todo: change frontend to tell users that teachers can register now
        # 检查学号/教工号是否存在
        try:
            entity_service.get_people_info(request.form.get("xh", None))
        except entity_service.PeopleNotFoundError:
            flash(MSG_USERNAME_NOT_EXIST)
            return redirect(url_for("user.register"))
        except Exception as e:
            return handle_exception_with_error_page(e)

        r = _set_current_registering(request.form.get("xh", None))
        if r:
            return r

        # 如果输入的学号或教工号已经注册,跳转到登录页面
        if user_service.user_exist(
                session[SESSION_USER_REGISTERING].identifier):
            flash(MSG_ALREADY_REGISTERED)
            return redirect(url_for('user.login'))

        return redirect(url_for('user.register_choice'))
Esempio n. 2
0
def main():
    """用户主页"""
    try:
        is_student, student = entity_service.get_people_info(
            session[SESSION_CURRENT_USER].identifier)
        if not is_student:
            return "Teacher is not supported at the moment. Stay tuned!"
    except Exception as e:
        return handle_exception_with_error_page(e)

    pending_grant_reqs = user_service.get_pending_requests(
        session[SESSION_CURRENT_USER].identifier)
    pending_grant_names = []
    for req in pending_grant_reqs:
        pending_grant_names.append(
            entity_service.get_people_info(req.user_id)[1].name)

    return render_template(
        'user/main.html',
        name=session[SESSION_CURRENT_USER].name,
        student_id_encoded=session[SESSION_CURRENT_USER].identifier_encoded,
        last_semester=student.semesters[-1] if student.semesters else None,
        privacy_level=user_service.get_privacy_level(
            session[SESSION_CURRENT_USER].identifier),
        pending_grant_names=pending_grant_names)
Esempio n. 3
0
def _set_current_user(identifier: str):
    """
    设置session中当前登录用户为参数中的学号

    :param identifier: 学号或教工号
    """
    is_student, people = entity_service.get_people_info(identifier)
    session[SESSION_CURRENT_USER] = UserSession(
        user_type=USER_TYPE_STUDENT if is_student else USER_TYPE_TEACHER,
        identifier=people.student_id if is_student else people.teacher_id,
        identifier_encoded=people.student_id_encoded
        if is_student else people.teacher_id_encoded,
        name=people.name)
    def __init__(self, people: List[str], date: datetime.date, current_user: str):
        """多人日程展示。输入学号或教工号列表及日期,输出多人在当天的日程"""
        from everyclass.server import logger
        from everyclass.server.entity import service
        from everyclass.server.user import service as user_service
        from everyclass.server.entity import service as entity_service

        accessible_people_ids = []
        accessible_people = []
        inaccessible_people = []

        for identifier in people:
            if user_service.has_access(identifier, current_user)[0]:
                accessible_people_ids.append(identifier)
            else:
                inaccessible_people.append(People(entity_service.get_student(identifier).name, encrypt(RTYPE_STUDENT, identifier)))
        self.schedules = list()

        for identifier in accessible_people_ids:
            is_student, people_info = service.get_people_info(identifier)

            accessible_people.append(
                People(people_info.name, encrypt(RTYPE_STUDENT, identifier) if is_student else encrypt(RTYPE_TEACHER, identifier)))

            semester, week, day = domain.get_semester_date(date)
            if is_student:
                cards = service.get_student_timetable(identifier, semester).cards
            else:
                cards = service.get_teacher_timetable(identifier, semester).cards

            cards = filter(lambda c: week in c.weeks and c.lesson[0] == str(day), cards)  # 用日期所属的周次和星期过滤card

            event_dict = {}
            for card in cards:
                time = card.lesson[1:5]  # "10102" -> "0102"
                if time not in event_dict:
                    event_dict[time] = Event(name=card.name, room=card.room)
                else:
                    # 课程重叠
                    logger.warning("time of card overlapped", extra={'people_identifier': identifier,
                                                                     'date': date})

            # 给没课的位置补充None
            for i in range(1, 10, 2):
                key = f"{i:02}{i + 1:02}"
                if key not in event_dict:
                    event_dict[key] = None

            self.schedules.append(event_dict)
        self.inaccessible_people = inaccessible_people
        self.accessible_people = accessible_people
Esempio n. 5
0
    def __json_encode__(self):
        from everyclass.server.entity import service as entity_service

        is_student, info = entity_service.get_people_info(self.user_id)

        return {
            'record_id':
            self.record_id,
            'user_id':
            encrypt(RTYPE_STUDENT if is_student else RTYPE_TEACHER,
                    self.user_id),
            'user_type':
            'student' if is_student else 'teacher',
            'last_semester':
            info.semesters[-1],
            'name':
            info.name
        }
Esempio n. 6
0
def _set_current_registering(identifier: str):
    """
    将正在注册的用户并保存到 SESSION_USER_REGISTERING

    :param identifier: 学号或教工号
    :return: None if there is no exception. Otherwise return an error page.
    """
    with tracer.trace('rpc_get_student'):
        try:
            is_student, people = entity_service.get_people_info(identifier)
            session[SESSION_USER_REGISTERING] = UserSession(
                user_type=USER_TYPE_STUDENT
                if is_student else USER_TYPE_TEACHER,
                identifier=people.student_id
                if is_student else people.teacher_id,
                identifier_encoded=people.student_id_encoded
                if is_student else people.teacher_id_encoded,
                name=people.name)
        except Exception as e:
            return handle_exception_with_error_page(e)
Esempio n. 7
0
    def __json_encode__(self):
        from everyclass.server.entity.service import get_people_info

        return {
            'class_id':
            self.klass_id,
            'name':
            self.course.name,
            'teachers':
            [{
                'name': t.name,
                'title': t.title
            } for t in
             [get_people_info(teacher_id)[1] for teacher_id in self.teachers]],
            # todo 速度太慢了,entity要出批量查询接口
            'score':
            round(self.score, 1),
            'review_quote':
            self.review_quote
        }
Esempio n. 8
0
def login():
    """
    登录页

    判断学生是否未注册,若已经注册,渲染登录页。否则跳转到注册页面。
    """
    if request.method == 'GET':
        if session.get(SESSION_LAST_VIEWED_STUDENT, None):
            user_name = session[SESSION_LAST_VIEWED_STUDENT].name
        else:
            user_name = None

        return render_template('user/login.html', name=user_name)
    else:  # 表单提交
        if not request.form.get("password", None):
            flash(MSG_EMPTY_PASSWORD)
            return redirect(url_for("user.login"))

        # captcha
        if not TencentCaptcha.verify_old():
            flash(MSG_INVALID_CAPTCHA)
            return redirect(url_for("user.login"))

        if request.form.get("xh", None):  # 已手动填写用户名
            identifier = request.form["xh"]

            # 检查学号/教工号是否存在
            try:
                entity_service.get_people_info(identifier)
            except entity_service.PeopleNotFoundError:
                flash(MSG_USERNAME_NOT_EXIST)
                return redirect(url_for("user.login"))
            except Exception as e:
                return handle_exception_with_error_page(e)

        else:
            if session.get(SESSION_LAST_VIEWED_STUDENT, None):
                identifier = session[
                    SESSION_LAST_VIEWED_STUDENT].sid_orig  # 没有手动填写,使用获取最后浏览的学生
            else:
                flash(MSG_EMPTY_USERNAME)  # 没有最后浏览的学生,必须填写用户名
                return redirect(url_for("user.login"))

        try:
            success = user_service.check_password(identifier,
                                                  request.form["password"])
        except everyclass.server.user.exceptions.UserNotExists:
            # 未注册
            flash(MSG_NOT_REGISTERED)
            return redirect(url_for("user.register"))

        if success:
            try:
                _set_current_user(identifier)
            except Exception as e:
                return handle_exception_with_error_page(e)

            return redirect(url_for("user.main"))
        else:
            flash(MSG_WRONG_PASSWORD)
            return redirect(url_for("user.login"))