Exemplo n.º 1
0
def today_course_():
    now = SyncCurrent().get_date()
    return redirect(
        url_for('schedule.today_course',
                year=now.year,
                month=now.month,
                day=now.day))
Exemplo n.º 2
0
    def search_by_class(cls,
                        visible_group_classes: List[GroupClass],
                        start_from: datetime = None) -> RxManyRef[Group]:
        current = SyncCurrent.get_date()
        if start_from is None:
            start_from = current - timedelta(days=30)

        return RxTable(Group).where(Group.cls.in_(visible_group_classes),
                                    Group.start > start_from)
Exemplo n.º 3
0
    def test1_where(self):
        from rx_sharh.rxdb import RxTable
        from rx_sharh.states.database import User
        from rx_sharh.components.date import SyncCurrent, timedelta

        with RxTable(User) as c:
            (c.where(id=lambda id: id > 100).where(
                User.birthday > SyncCurrent.get_date() -
                timedelta(minutes=100)).limit(10).foreach(print))
Exemplo n.º 4
0
def index():
    user: db.User = g.user

    if user.is_authenticated:
        if user.status == Status.ready:
            return redirect(url_for('profile.bind_phone'))

        week_num, weekday = SyncCurrent.to_week_index(
        ), SyncCurrent.to_weekday()

        user: db.User = g.user

        current_day_courses: Dict[
            SectionId,
            List[db.Course]] = course_helper.Controller.course_schedule(
                [each.course for each in user.ref_courses],
                week_index=week_num,
                weekday=weekday)
        current_time_activities: 'List[Tuple[GroupId, db.Activity]]' = tuple(
            (each.group_id, each.activity) for each in flatten(
                each.group.ref_activitys for each in user.ref_groups)
            if each.is_active)
    else:
        flash('学生使用学号登录,老师使用工号后5位登录。初始密码与账号相同。')
        current_day_courses = {}
        current_time_activities = ()

    today = SyncCurrent.get_date()
    return render_template('index.html',
                           preview=make_index_preview(
                               current_time_activities,
                               current_day_courses).set_indent(1).__str__(),
                           user=user,
                           title='首页',
                           side_info=load_side_info(user),
                           side_options=load_side_options(),
                           toweek=DateHelper.to_week_index(today),
                           today=DateHelper.to_weekday(today),
                           funclist_ess=load_function_list())
Exemplo n.º 5
0
    def add(cls, plus=1):
        ip = request.remote_addr
        current = SyncCurrent.get_date()
        if ip in cls._ip_list:
            delta = (current - cls._ip_visit_record_time[ip]
                     ).total_seconds() / seconds_one_day
            score = cls._ip_list[ip] + plus
            score = 0 if delta >= score else score - delta
            cls._ip_list[ip] = score
        else:
            score = cls._ip_list[ip] = plus

        cls._ip_visit_record_time[ip] = current
        return score
Exemplo n.º 6
0
def stop_sign(sign_name):
    sign_dao = RxTable(db.Sign)
    sign = sign_dao.where(name=sign_name).first()
    if not sign:
        flash("实例不存在!")
        Config.app.logger.warning('{}'.format(sign_name))
        return redirect(url_for('attendance.stop', sign_name=sign_name, status=1, qrcode=0))

    with RxRecord(sign) as sign_rx:
        sign_rx.mutate(end=SyncCurrent.get_date(), is_active=0)

    flash('停止签到')

    return redirect(url_for('attendance.stop', sign_name=sign_name, status=0, qrcode=0))
Exemplo n.º 7
0
def make_index_preview(activities: List[Tuple[GroupId, db.Activity]],
                       courses: Dict[SectionId, List[db.Course]]):
    return inc.Collapsible(
        inc.Li << inc.CollapsibleHeader(inc.Icon("edit_location"), "活动") <<
        inc.CollapsibleBody(
            inc.Collection(
                inc.Attr("id", "index_activity"),
                *(inc.CollectionItemA(
                    inc.Href(
                        f'group/room%3Fgroup%3D{group_id}%3Fchannel%3Dpublic'),
                    activity.name) for group_id, activity in activities))),
        inc.Li << inc.CollapsibleHeader(inc.Icon("all_inclusive"), "课程") <<
        inc.CollapsibleBody(
            inc.Collection(
                inc.Attr("id", "index_course"),
                *(inc.CollectionItemA('|'.join(
                    map(lambda _: _.name, courses[Section(i).name])))
                  for i in sorted(
                      sections_to_select.intersection(
                          range(1, 15)[SyncCurrent.to_section().value - 1:]))
                  if courses.get(Section(i).name)))))
Exemplo n.º 8
0
def issue():
    user = g.user
    form = request.form
    turn_in = False if not user.is_authenticated else True
    issue_dao = RxTable(db.Issue)
    if request.method == "GET":
        return render_template('issue.html',
                               turn_in=turn_in,
                               issue_list=issue_dao,
                               db=db)
    elif request.method == "POST":
        if not turn_in:
            return jsonify('请先登录ヽ(✿゚▽゚)ノ')
        if len(form) < 2:
            return jsonify('请务必让我了解该问题的具体位置~')
        with issue_dao:
            issue_dao.add(user_id=user.id,
                          content=form['issueContent'],
                          module=getattr(db.IssueType, form['issueType']),
                          time=SyncCurrent.get_date(),
                          state=db.IssueState.open)
            if issue_dao.is_succeed:
                return redirect_with_302('issue')
Exemplo n.º 9
0
def center():
    """签到中心主页"""

    user: db.User = g.user
    form = request.form

    normal_signs: 'Dict[int, List[db.UserSign]]' = linq.Flow(
        user_sign
        for user_sign in user.ref_signs
        if
        user_sign.user_cls == db.Role.normal
    ).GroupBy(
        lambda user_sign: user_sign.is_sign
    ).Unboxed()

    sign_completed = (each.sign for each in normal_signs[1])

    sign_on = (each.sign for each in normal_signs[0])

    now = SyncCurrent.get_date()
    half_a_month = date.timedelta(30)

    # 只选激活的
    sign_completed = tuple(each for each in sign_completed if not each.end or now < each.end + half_a_month)
    sign_on = tuple(each for each in sign_on if each.is_active and (not each.end or now < each.end + half_a_month))

    manager_ids = [each.ref_users.filter(db.UserSign.user_cls == db.Role.leader).first().user_id for each in
                   sign_completed]

    sign_completed = tuple(zip(manager_ids, sign_completed))

    def get_group_status_and_activities(user_group: db.UserGroup) -> Tuple[db.Group, List[db.Activity]]:
        group = user_group.group
        acts = [each.activity for each in group.ref_activitys if each.is_active]
        return group, acts

    managing_activities: List[Tuple[db.Group, List[db.Activity]]] = [get_group_status_and_activities(each) for each
                                                                     in user.ref_groups if
                                                                     each.user_cls != db.Role.normal]

    current_courses = [uc.course for uc in user.ref_courses
                       if course_helper.Controller.is_ready(uc.course, date=date.SyncCurrent.get_date())]

    if user.permission == Permission.teacher:
        # 所有管理的课程
        managing_courses = current_courses
        # taking_courses = ()

    else:
        managing_courses = ()
        # taking_courses = current_courses

    return render_template('attendance/center.html',
                           title="签到中心",
                           user=user,
                           form=form,
                           sign_stats=inc.Collection(
                               inc.CollectionItemA("历史统计记录", inc.Href(url_for('attendance.course_list')))
                           ) if user.permission == Permission.teacher else "<br>",
                           sign_on=sign_on,
                           sign_completed=sign_completed,
                           activity_ready=managing_activities,
                           course_ready=managing_courses,
                           side_info=load_side_info(user),
                           side_options=load_side_options())
Exemplo n.º 10
0
def stop(sign_name, qrcode, status):
    """开始签到跳转, 停止签到"""

    sign = RxTable(db.Sign).where(name=sign_name).first()

    if not sign:
        flash("实例不存在!")
        Config.app.logger.warning('{}'.format(sign_name))
        return redirect(url_for('attendance.center'))

    if not status:
        need_sign_num, actual_sign_num, sign_users, not_sign_users = sign_helper.Controller.statistics(sign)
        # 将签到信息记录置于redis中缓存
        if sign.cls == db.SignClass.course:
            cls = 'c'

            @curry
            def make_student_info(user: db.User, is_sign: int):
                stu = user.ref_students.first().student
                return dict(name=stu.name,
                            number=stu.number,
                            is_sign=is_sign)

            inst_id = sign.inst_id

            cache_storage.set(
                name_pattern(cls, inst_id, None, "week"),
                SyncCurrent.to_week_index()
            )

            cache_storage.hset(
                name_pattern(cls, inst_id, None, "values"),
                SyncCurrent.to_week_index(),
                json.dumps(dict(
                    应到=need_sign_num,
                    实到=actual_sign_num,
                    人员=[*RxList(sign_users)
                        .map(make_student_info(is_sign=1)),
                        *RxList(not_sign_users)
                        .map(make_student_info(is_sign=0))]
                ))
            )

        return render_template('attendance/stop.html',
                               sign_name=sign_name,
                               sign_code=sign.sign_code,
                               status=status,
                               need_sign_num=need_sign_num,  # 应到人数, int
                               actual_sign_num=actual_sign_num,  # 实到人数,int
                               sign_users=map(get_name_id, sign_users),  # 签到的用户, List[User]
                               not_sign_users=map(get_name_id, not_sign_users))  # 未签到的用户, List[User]

    if qrcode:
        return render_template('attendance/qrcode.html',
                               title="签到管理",
                               sign_name=sign_name,
                               status=status)

    return render_template('attendance/stop.html',
                           title="签到管理",
                           sign_name=sign_name,
                           sign_code=sign.sign_code,
                           status=status)
Exemplo n.º 11
0
def toweek_course_():
    return redirect(
        url_for('schedule.toweek_course',
                week_num=SyncCurrent.to_week_index()))