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'))
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)
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
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 }
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)
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 }
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"))