示例#1
0
文件: problem.py 项目: vtphan/sandbox
def grade_history(uid=None):
    logged_in_user = auth.get_logged_in_user()
    if uid is not None:
        if logged_in_user.role != "teacher" and logged_in_user.id != uid:
            return "not allowed"
    else:
        uid = logged_in_user.id

    student = StudentRecord(uid)

    try:
        scores = Score.select().where(Score.user == uid)
    except Score.DoesNotExist:
        scores = []

    try:
        brownie = Brownie.get(Brownie.user == uid)
    except Brownie.DoesNotExist:
        brownie = None

    published_pids = red.smembers("published-problems")
    published_pids = sorted(int(p) for p in published_pids)

    return render_template(
        "problem/grade_history.html", scores=scores, brownie=brownie, student=student, published_pids=published_pids
    )
示例#2
0
文件: sandbox.py 项目: vtphan/sandbox
def index():
   logged_in_user = auth.get_logged_in_user()

   user_record = StudentRecord(logged_in_user.id)
   user_record.online = True
   user_record.save()

   # if user is running on another client, close the other.
   sse.close(user_record.id)

   current_channel = sse.current_channel(user_record.id) or user_record.id

   all_users = auth.User.select()
   online_students = StudentRecord.online_students()
   listeners=[ online_students[int(i)].username \
      for i in sse.listening_clients(current_channel) if int(i) in online_students ]

   # notify those who can view boards that the client is online
   messages = {}
   for c, r in online_students.items():
      if user_record.id != c and (r.is_teacher or user_record.open_board):
         messages[c] = dict(cid=user_record.id, board_status=user_record.open_board)
   sse.notify(messages, event='online')

   problem_ids = sorted(int(i) for i in red.smembers('published-problems'))

   return render_template('sandbox.html',
      sum=sum, enumerate=enumerate,
      current_channel = current_channel,
      problem_ids=problem_ids,
      user_record = user_record,
      online_students = online_students,
      all_users = all_users,
      listeners = listeners)
示例#3
0
文件: sandbox.py 项目: vtphan/sandbox
def event_join(host, guest):
   online_students = StudentRecord.online_students()
   ## Key error is possible
   guest_record = online_students[int(guest)]
   host_record = online_students[int(host)]
   host_channel = sse.current_channel(host)
   guest_channel = sse.current_channel(guest)
   sse.listen_to(host, guest)

   m = dict(cid=guest, host_cid=host, board_status=host_record.open_board)

   if host!=guest and int(host)!=int(host_channel):
      # host is elsewhere
      host_of_host = online_students[int(host_channel)]
      m.update(notice = "%s is visiting %s's sandbox" % (host_record.username, host_of_host.username))

   if guest_record.is_teacher:
      pids = sorted(int(i) for i in red.smembers('published-problems'))
      scores = [ [p, host_record.scores.get(p,0)] for p in pids ]
      m.update(scores=scores, brownies=host_record.brownies)

   sse.notify( { guest : m } , event='join')

   ## Inform old channel and new channel of updated listeners list
   guest_listeners = [ online_students[int(i)].username for i in sse.listening_clients(guest_channel) ]
   m = dict(host_cid=guest_channel, listeners=guest_listeners)
   sse.broadcast(guest_channel, m, m, event='listeners-update')

   host_listeners = [ online_students[int(i)].username for i in sse.listening_clients(host) ]
   m = dict(host_cid=host, listeners=host_listeners)
   sse.broadcast(host, m, m, event='listeners-update')
示例#4
0
def grade_history(uid=None):
    logged_in_user = auth.get_logged_in_user()
    if uid is not None:
        if logged_in_user.role != 'teacher' and logged_in_user.id != uid:
            return 'not allowed'
    else:
        uid = logged_in_user.id

    student = StudentRecord(uid)

    try:
        scores = Score.select().where(Score.user == uid)
    except Score.DoesNotExist:
        scores = []

    try:
        brownie = Brownie.get(Brownie.user == uid)
    except Brownie.DoesNotExist:
        brownie = None

    published_pids = red.smembers('published-problems')
    published_pids = sorted(int(p) for p in published_pids)

    return render_template('problem/grade_history.html',
                           scores=scores,
                           brownie=brownie,
                           student=student,
                           published_pids=published_pids)
示例#5
0
def index():
    query = Problem.select(Problem).join(ProblemTag,JOIN_LEFT_OUTER) \
       .join(Tag,JOIN_LEFT_OUTER).distinct().order_by(Problem.id.desc())
    probs = query.execute()

    published_probs = [int(p) for p in red.smembers('published-problems')]
    stats = {p.id: (p.id in published_probs) for p in probs}
    tags = Tag.select()

    return render_template('problem/index.html',
                           stats=stats,
                           probs=probs,
                           tags=tags)
示例#6
0
文件: problem.py 项目: vtphan/sandbox
def index():
    query = (
        Problem.select(Problem)
        .join(ProblemTag, JOIN_LEFT_OUTER)
        .join(Tag, JOIN_LEFT_OUTER)
        .distinct()
        .order_by(Problem.id.desc())
    )
    probs = query.execute()

    published_probs = [int(p) for p in red.smembers("published-problems")]
    stats = {p.id: (p.id in published_probs) for p in probs}
    tags = Tag.select()

    return render_template("problem/index.html", stats=stats, probs=probs, tags=tags)
示例#7
0
文件: problem.py 项目: vtphan/sandbox
def publish_toggle(pid):
    if not red.sismember("published-problems", pid):
        red.sadd("published-problems", pid)
    else:
        red.srem("published-problems", pid)

    all_records = StudentRecord.online_students()
    pids = sorted(int(p) for p in red.smembers("published-problems"))
    messages = {}
    for k, v in all_records.items():
        uid = sse.current_channel(k) if v.is_teacher else k
        scores = [[pid, all_records[uid].scores.get(pid, 0)] for pid in pids]
        messages[k] = dict(cid=uid, scores=scores)
    sse.notify(messages, event="problems-updated")

    return redirect(url_for("problem.index"))
示例#8
0
def remove_db_exist_ids(danmakuMap: MutableMapping[int, DanmakuDO],
                        relationMap: MutableMapping[int, DanmakuRealationDO],
                        cids: AbstractSet[int]):
    """
  剔除数据库中已经存在的danmaku
  """
    print('from redis get cids: %s' % cids.__len__())
    cids_all_danmakuId: Set[int] = set()
    for cid in cids:
        for item in red.smembers(cid):
            cids_all_danmakuId.add(int(item))

    print('all danmaku len: %s' % cids_all_danmakuId.__len__())
    for _id in cids_all_danmakuId:
        danmakuMap.pop(_id, None)
        relationMap.pop(_id, None)
示例#9
0
def publish_toggle(pid):
    if not red.sismember('published-problems', pid):
        red.sadd('published-problems', pid)
    else:
        red.srem('published-problems', pid)

    all_records = StudentRecord.online_students()
    pids = sorted(int(p) for p in red.smembers('published-problems'))
    messages = {}
    for k, v in all_records.items():
        uid = sse.current_channel(k) if v.is_teacher else k
        scores = [[pid, all_records[uid].scores.get(pid, 0)] for pid in pids]
        messages[k] = dict(cid=uid, scores=scores)
    sse.notify(messages, event="problems-updated")

    return redirect(url_for('problem.index'))
示例#10
0
文件: problem.py 项目: vtphan/sandbox
def grade():
    uid = int(request.form["uid"])
    tid = int(request.form["tid"])
    pid = int(request.form["pid"])
    score = int(request.form["score"])

    # Store in redis
    user_record = StudentRecord(uid)
    user_record.scores[pid] = score
    user_record.save()

    pids = sorted(int(i) for i in red.smembers("published-problems"))
    scores = [[p, user_record.scores.get(p, 0)] for p in pids]
    message = dict(cid=user_record.id, scores=scores, pid=pid, score=score)

    sse.notify({uid: message, tid: message}, event="scores-updated")

    # Store in database
    q = Score.update(points=score).where(Score.problem == pid, Score.user == uid)
    if q.execute() == 0:
        q = Score.create(problem=pid, user=uid, points=score)

    return '<i class="icon-okay"></i>'
示例#11
0
文件: sandbox.py 项目: vtphan/sandbox
def event_join(host, guest):
    online_students = StudentRecord.online_students()
    ## Key error is possible
    guest_record = online_students[int(guest)]
    host_record = online_students[int(host)]
    host_channel = sse.current_channel(host)
    guest_channel = sse.current_channel(guest)
    sse.listen_to(host, guest)

    m = dict(cid=guest, host_cid=host, board_status=host_record.open_board)

    if host != guest and int(host) != int(host_channel):
        # host is elsewhere
        host_of_host = online_students[int(host_channel)]
        m.update(notice="%s is visiting %s's sandbox" %
                 (host_record.username, host_of_host.username))

    if guest_record.is_teacher:
        pids = sorted(int(i) for i in red.smembers('published-problems'))
        scores = [[p, host_record.scores.get(p, 0)] for p in pids]
        m.update(scores=scores, brownies=host_record.brownies)

    sse.notify({guest: m}, event='join')

    ## Inform old channel and new channel of updated listeners list
    guest_listeners = [
        online_students[int(i)].username
        for i in sse.listening_clients(guest_channel)
    ]
    m = dict(host_cid=guest_channel, listeners=guest_listeners)
    sse.broadcast(guest_channel, m, m, event='listeners-update')

    host_listeners = [
        online_students[int(i)].username for i in sse.listening_clients(host)
    ]
    m = dict(host_cid=host, listeners=host_listeners)
    sse.broadcast(host, m, m, event='listeners-update')
示例#12
0
文件: sandbox.py 项目: vtphan/sandbox
def index():
    logged_in_user = auth.get_logged_in_user()

    user_record = StudentRecord(logged_in_user.id)
    user_record.online = True
    user_record.save()

    # if user is running on another client, close the other.
    sse.close(user_record.id)

    current_channel = sse.current_channel(user_record.id) or user_record.id

    all_users = auth.User.select()
    online_students = StudentRecord.online_students()
    listeners=[ online_students[int(i)].username \
       for i in sse.listening_clients(current_channel) if int(i) in online_students ]

    # notify those who can view boards that the client is online
    messages = {}
    for c, r in online_students.items():
        if user_record.id != c and (r.is_teacher or user_record.open_board):
            messages[c] = dict(cid=user_record.id,
                               board_status=user_record.open_board)
    sse.notify(messages, event='online')

    problem_ids = sorted(int(i) for i in red.smembers('published-problems'))

    return render_template('sandbox.html',
                           sum=sum,
                           enumerate=enumerate,
                           current_channel=current_channel,
                           problem_ids=problem_ids,
                           user_record=user_record,
                           online_students=online_students,
                           all_users=all_users,
                           listeners=listeners)
示例#13
0
def grade():
    uid = int(request.form['uid'])
    tid = int(request.form['tid'])
    pid = int(request.form['pid'])
    score = int(request.form['score'])

    # Store in redis
    user_record = StudentRecord(uid)
    user_record.scores[pid] = score
    user_record.save()

    pids = sorted(int(i) for i in red.smembers('published-problems'))
    scores = [[p, user_record.scores.get(p, 0)] for p in pids]
    message = dict(cid=user_record.id, scores=scores, pid=pid, score=score)

    sse.notify({uid: message, tid: message}, event="scores-updated")

    # Store in database
    q = Score.update(points=score).where(Score.problem == pid,
                                         Score.user == uid)
    if q.execute() == 0:
        q = Score.create(problem=pid, user=uid, points=score)

    return '<i class="icon-okay"></i>'