添加了题目列表每个题目前边状态指示标志:ac /没有/正在进行,因为数据是存在用户表里的所以缓存的时候可以做到与题目数据分开

This commit is contained in:
sxw@401 2015-09-15 16:41:13 +08:00
parent 0683d0914b
commit 01215a71ad
7 changed files with 62 additions and 3 deletions

View File

@ -0,0 +1,19 @@
# -*- coding: utf-8 -*-
from __future__ import unicode_literals
from django.db import models, migrations
class Migration(migrations.Migration):
dependencies = [
('account', '0001_initial'),
]
operations = [
migrations.AddField(
model_name='user',
name='problems_status',
field=models.TextField(blank=True),
),
]

View File

@ -30,6 +30,9 @@ class User(AbstractBaseUser):
create_time = models.DateTimeField(auto_now_add=True) create_time = models.DateTimeField(auto_now_add=True)
# 0代表不是管理员 1是普通管理员 2是超级管理员 # 0代表不是管理员 1是普通管理员 2是超级管理员
admin_type = models.IntegerField(default=0) admin_type = models.IntegerField(default=0)
# JSON字典用来表示该用户的问题的解决状态 1为ac2为正在进行
problems_status = models.TextField(blank=True)
USERNAME_FIELD = 'username' USERNAME_FIELD = 'username'
REQUIRED_FIELDS = [] REQUIRED_FIELDS = []

View File

@ -2,6 +2,7 @@
import logging import logging
import redis import redis
import json
from judge.judger_controller.settings import redis_config from judge.judger_controller.settings import redis_config
from judge.judger.result import result from judge.judger.result import result
@ -9,6 +10,7 @@ from submission.models import Submission
from problem.models import Problem from problem.models import Problem
from contest.models import ContestProblem, Contest, ContestSubmission from contest.models import ContestProblem, Contest, ContestSubmission
from account.models import User from account.models import User
logger = logging.getLogger("app_info") logger = logging.getLogger("app_info")
@ -35,6 +37,20 @@ class MessageQueue(object):
problem.save() problem.save()
except Problem.DoesNotExist: except Problem.DoesNotExist:
logger.warning("Submission problem does not exist, submission_id: " + submission_id) logger.warning("Submission problem does not exist, submission_id: " + submission_id)
# 更新该用户的解题状态
try:
user = User.objects.get(pk=submission.user_id)
except User.DoesNotExist:
logger.warning("Submission user does not exist, submission_id: " + submission_id)
continue
if user.problems_status:
problems_status = json.loads(user.problems_status)
else:
problems_status = {}
problems_status[str(problem.id)] = 1
user.problems_status = json.dumps(problems_status)
user.save()
# 普通题目的话,到这里就结束了 # 普通题目的话,到这里就结束了
continue continue

View File

@ -282,11 +282,16 @@ def problem_list_page(request, page=1):
except Exception: except Exception:
pass pass
if request.user.is_authenticated() and request.user.problems_status:
problems_status = json.loads(request.user.problems_status)
else:
problems_status = {}
print problems_status
# 右侧标签列表 按照关联的题目的数量排序 排除题目数量为0的 # 右侧标签列表 按照关联的题目的数量排序 排除题目数量为0的
tags = ProblemTag.objects.annotate(problem_number=Count("problem")).filter(problem_number__gt=0).order_by("-problem_number") tags = ProblemTag.objects.annotate(problem_number=Count("problem")).filter(problem_number__gt=0).order_by("-problem_number")
return render(request, "oj/problem/problem_list.html", return render(request, "oj/problem/problem_list.html",
{"problems": current_page, "page": int(page), {"problems": current_page, "page": int(page),
"previous_page": previous_page, "next_page": next_page, "previous_page": previous_page, "next_page": next_page,
"keyword": keyword, "tag": tag_text, "keyword": keyword, "tag": tag_text,"problems_status": problems_status,
"tags": tags, "difficulty_order": difficulty_order}) "tags": tags, "difficulty_order": difficulty_order})

View File

@ -46,7 +46,14 @@ class SubmissionAPIView(APIView):
judge.delay(submission.id, problem.time_limit, problem.memory_limit, problem.test_case_id) judge.delay(submission.id, problem.time_limit, problem.memory_limit, problem.test_case_id)
except Exception: except Exception:
return error_response(u"提交判题任务失败") return error_response(u"提交判题任务失败")
# 修改用户解题状态
if request.user.problems_status:
problems_status = json.loads(request.user.problems_status)
else:
problems_status = {}
problems_status[str(data["problem_id"])] = 2
request.user.problems_status = json.dumps(problems_status)
request.user.save()
# 增加redis 中判题队列长度的计数器 # 增加redis 中判题队列长度的计数器
r = redis.Redis(host=redis_config["host"], port=redis_config["port"], db=redis_config["db"]) r = redis.Redis(host=redis_config["host"], port=redis_config["port"], db=redis_config["db"])
r.incr("judge_queue_length") r.incr("judge_queue_length")

View File

@ -28,7 +28,7 @@
<tbody> <tbody>
{% for item in problems %} {% for item in problems %}
<tr> <tr>
<th><span class="glyphicon glyphicon-ok ac-flag"></span></th> <th><span class="{% get_problem_status problems_status item.id %}"></span></th>
<th scope="row"><a href="/problem/{{ item.id }}/">{{ item.id }}</a></th> <th scope="row"><a href="/problem/{{ item.id }}/">{{ item.id }}</a></th>
<td><a href="/problem/{{ item.id }}/">{{ item.title }}</a></td> <td><a href="/problem/{{ item.id }}/">{{ item.title }}</a></td>
<td> <td>

View File

@ -8,7 +8,16 @@ def get_problem_accepted_radio(problem):
return "0%" return "0%"
def get_problem_status(problems_status, problem_id):
if str(problem_id) in problems_status:
if problems_status[str(problem_id)] == 1:
return "glyphicon glyphicon-ok ac-flag"
return "glyphicon glyphicon-minus dealing-flag"
return ""
from django import template from django import template
register = template.Library() register = template.Library()
register.filter("accepted_radio", get_problem_accepted_radio) register.filter("accepted_radio", get_problem_accepted_radio)
register.simple_tag(get_problem_status, name="get_problem_status")