mirror of
https://gitcode.com/gh_mirrors/hy/Hydro.git
synced 2026-10-17 17:36:08 +08:00
module.add(user,problem,record)
This commit is contained in:
commit
d5b1f623f8
43 files changed
+5965
No files matched your search
@@ -0,0 +1,184 @@
|
||||
/*
|
||||
@app.route('/p/{pid}/solution', 'problem_solution')
|
||||
class ProblemSolutionHandler(base.OperationHandler):
|
||||
SOLUTIONS_PER_PAGE = 20
|
||||
|
||||
@base.requirePerm(builtin.PERM_VIEW_PROBLEM_SOLUTION)
|
||||
@base.get_argument
|
||||
@base.route_argument
|
||||
@base.sanitize
|
||||
async def get(self, *, pid: document.convert_doc_id, page: int=1):
|
||||
uid = self.user['_id'] if self.has_priv(builtin.PRIV_USER_PROFILE) else None
|
||||
pdoc = await problem.get(self.domainId, pid, uid)
|
||||
if pdoc.get('hidden', False):
|
||||
self.check_perm(builtin.PERM_VIEW_PROBLEM_HIDDEN)
|
||||
psdocs, pcount, pscount = await pagination.paginate(
|
||||
problem.get_multi_solution(self.domainId, pdoc['doc_id']),
|
||||
page, self.SOLUTIONS_PER_PAGE)
|
||||
uids = {pdoc['owner_uid']}
|
||||
uids.update(psdoc['owner_uid'] for psdoc in psdocs)
|
||||
for psdoc in psdocs:
|
||||
if 'reply' in psdoc:
|
||||
uids.update(psrdoc['owner_uid'] for psrdoc in psdoc['reply'])
|
||||
udict, dudict, pssdict = await asyncio.gather(
|
||||
user.get_dict(uids),
|
||||
domain.get_dict_user_by_uid(self.domainId, uids),
|
||||
problem.get_dict_solution_status(
|
||||
self.domainId, (psdoc['doc_id'] for psdoc in psdocs), self.user['_id']))
|
||||
dudict[self.user['_id']] = self.domain_user
|
||||
path_components = self.build_path(
|
||||
(self.translate('problem_main'), self.reverse_url('problem_main')),
|
||||
(pdoc['title'], self.reverse_url('problem_detail', pid=pdoc['doc_id'])),
|
||||
(self.translate('problem_solution'), None))
|
||||
self.render('problem_solution.html', path_components=path_components,
|
||||
pdoc=pdoc, psdocs=psdocs, page=page, pcount=pcount, pscount=pscount,
|
||||
udict=udict, dudict=dudict, pssdict=pssdict)
|
||||
|
||||
@base.requirePriv(builtin.PRIV_USER_PROFILE)
|
||||
@base.requirePerm(builtin.PERM_CREATE_PROBLEM_SOLUTION)
|
||||
@base.route_argument
|
||||
@base.require_csrf_token
|
||||
@base.sanitize
|
||||
async def post_submit(self, *, pid: document.convert_doc_id, content: str):
|
||||
pdoc = await problem.get(self.domainId, pid)
|
||||
if pdoc.get('hidden', False):
|
||||
self.check_perm(builtin.PERM_VIEW_PROBLEM_HIDDEN)
|
||||
await problem.add_solution(self.domainId, pdoc['doc_id'], self.user['_id'], content)
|
||||
self.json_or_redirect(self.url)
|
||||
|
||||
@base.requirePriv(builtin.PRIV_USER_PROFILE)
|
||||
@base.route_argument
|
||||
@base.require_csrf_token
|
||||
@base.sanitize
|
||||
async def post_edit_solution(self, *, pid: document.convert_doc_id,
|
||||
psid: document.convert_doc_id, content: str):
|
||||
pdoc = await problem.get(self.domainId, pid)
|
||||
if pdoc.get('hidden', False):
|
||||
self.check_perm(builtin.PERM_VIEW_PROBLEM_HIDDEN)
|
||||
psdoc = await problem.get_solution(self.domainId, psid, pdoc['doc_id'])
|
||||
if not self.own(psdoc, builtin.PERM_EDIT_PROBLEM_SOLUTION_SELF):
|
||||
self.check_perm(builtin.PERM_EDIT_PROBLEM_SOLUTION)
|
||||
psdoc = await problem.set_solution(self.domainId, psdoc['doc_id'],
|
||||
content=content)
|
||||
self.json_or_redirect(self.url)
|
||||
|
||||
@base.requirePriv(builtin.PRIV_USER_PROFILE)
|
||||
@base.route_argument
|
||||
@base.require_csrf_token
|
||||
@base.sanitize
|
||||
async def post_delete_solution(self, *, pid: document.convert_doc_id,
|
||||
psid: document.convert_doc_id):
|
||||
pdoc = await problem.get(self.domainId, pid)
|
||||
if pdoc.get('hidden', False):
|
||||
self.check_perm(builtin.PERM_VIEW_PROBLEM_HIDDEN)
|
||||
psdoc = await problem.get_solution(self.domainId, psid, pdoc['doc_id'])
|
||||
if not self.own(psdoc, builtin.PERM_DELETE_PROBLEM_SOLUTION_SELF):
|
||||
self.check_perm(builtin.PERM_DELETE_PROBLEM_SOLUTION)
|
||||
await oplog.add(self.user['_id'], oplog.TYPE_DELETE_DOCUMENT, doc=psdoc)
|
||||
await problem.delete_solution(self.domainId, psdoc['doc_id'])
|
||||
self.json_or_redirect(self.url)
|
||||
|
||||
@base.requirePriv(builtin.PRIV_USER_PROFILE)
|
||||
@base.route_argument
|
||||
@base.require_csrf_token
|
||||
@base.sanitize
|
||||
async def post_edit_reply(self, *, pid: document.convert_doc_id,
|
||||
psid: document.convert_doc_id, psrid: document.convert_doc_id,
|
||||
content: str):
|
||||
pdoc = await problem.get(self.domainId, pid)
|
||||
if pdoc.get('hidden', False):
|
||||
self.check_perm(builtin.PERM_VIEW_PROBLEM_HIDDEN)
|
||||
psdoc, psrdoc = await problem.get_solution_reply(self.domainId, psid, psrid)
|
||||
if not psdoc or psdoc['parent_doc_id'] != pdoc['doc_id']:
|
||||
raise error.DocumentNotFoundError(self.domainId, document.TYPE_PROBLEM_SOLUTION, psid)
|
||||
if not self.own(psrdoc, builtin.PERM_EDIT_PROBLEM_SOLUTION_REPLY_SELF):
|
||||
self.check_perm(builtin.PERM_EDIT_PROBLEM_SOLUTION_REPLY)
|
||||
await problem.edit_solution_reply(self.domainId, psid, psrid, content)
|
||||
self.json_or_redirect(self.url)
|
||||
|
||||
@base.requirePriv(builtin.PRIV_USER_PROFILE)
|
||||
@base.route_argument
|
||||
@base.require_csrf_token
|
||||
@base.sanitize
|
||||
async def post_delete_reply(self, *, pid: document.convert_doc_id,
|
||||
psid: document.convert_doc_id, psrid: document.convert_doc_id):
|
||||
pdoc = await problem.get(self.domainId, pid)
|
||||
if pdoc.get('hidden', False):
|
||||
self.check_perm(builtin.PERM_VIEW_PROBLEM_HIDDEN)
|
||||
psdoc, psrdoc = await problem.get_solution_reply(self.domainId, psid, psrid)
|
||||
if not psdoc or psdoc['parent_doc_id'] != pdoc['doc_id']:
|
||||
raise error.DocumentNotFoundError(self.domainId, document.TYPE_PROBLEM_SOLUTION, psid)
|
||||
if not self.own(psrdoc, builtin.PERM_DELETE_PROBLEM_SOLUTION_REPLY_SELF):
|
||||
self.check_perm(builtin.PERM_DELETE_PROBLEM_SOLUTION_REPLY)
|
||||
await oplog.add(self.user['_id'], oplog.TYPE_DELETE_SUB_DOCUMENT, sub_doc=psrdoc,
|
||||
doc_type=psdoc['doc_type'], doc_id=psdoc['doc_id'])
|
||||
await problem.delete_solution_reply(self.domainId, psid, psrid)
|
||||
self.json_or_redirect(self.url)
|
||||
|
||||
@base.requirePriv(builtin.PRIV_USER_PROFILE)
|
||||
@base.requirePerm(builtin.PERM_VOTE_PROBLEM_SOLUTION)
|
||||
@base.route_argument
|
||||
@base.require_csrf_token
|
||||
@base.sanitize
|
||||
async def upvote_downvote(self, *,
|
||||
pid: document.convert_doc_id,
|
||||
psid: document.convert_doc_id,
|
||||
value: int):
|
||||
pdoc = await problem.get(self.domainId, pid)
|
||||
if pdoc.get('hidden', False):
|
||||
self.check_perm(builtin.PERM_VIEW_PROBLEM_HIDDEN)
|
||||
psdoc = await problem.get_solution(self.domainId, psid, pdoc['doc_id'])
|
||||
psdoc, pssdoc = await problem.vote_solution(self.domainId, psdoc['doc_id'],
|
||||
self.user['_id'], value)
|
||||
self.json_or_redirect(self.url, vote=psdoc['vote'], user_vote=pssdoc['vote'])
|
||||
|
||||
post_upvote = functools.partialmethod(upvote_downvote, value=1)
|
||||
post_downvote = functools.partialmethod(upvote_downvote, value=-1)
|
||||
|
||||
@base.requirePriv(builtin.PRIV_USER_PROFILE)
|
||||
@base.requirePerm(builtin.PERM_REPLY_PROBLEM_SOLUTION)
|
||||
@base.route_argument
|
||||
@base.require_csrf_token
|
||||
@base.sanitize
|
||||
async def post_reply(self, *,
|
||||
pid: document.convert_doc_id,
|
||||
psid: document.convert_doc_id,
|
||||
content: str):
|
||||
pdoc = await problem.get(self.domainId, pid)
|
||||
if pdoc.get('hidden', False):
|
||||
self.check_perm(builtin.PERM_VIEW_PROBLEM_HIDDEN)
|
||||
psdoc = await problem.get_solution(self.domainId, psid, pdoc['doc_id'])
|
||||
await problem.reply_solution(self.domainId, psdoc['doc_id'], self.user['_id'], content)
|
||||
self.json_or_redirect(self.url)
|
||||
|
||||
|
||||
@app.route('/p/{pid}/solution/{psid:\w{24}}/raw', 'problem_solution_raw')
|
||||
class ProblemSolutionRawHandler(base.Handler):
|
||||
@base.requirePerm(builtin.PERM_VIEW_PROBLEM_SOLUTION)
|
||||
@base.route_argument
|
||||
@base.sanitize
|
||||
async def get(self, *, pid: document.convert_doc_id, psid: document.convert_doc_id):
|
||||
pdoc = await problem.get(self.domainId, pid)
|
||||
if pdoc.get('hidden', False):
|
||||
self.check_perm(builtin.PERM_VIEW_PROBLEM_HIDDEN)
|
||||
psdoc = await problem.get_solution(self.domainId, psid, pdoc['doc_id'])
|
||||
self.response.content_type = 'text/markdown'
|
||||
self.response.text = psdoc['content']
|
||||
|
||||
|
||||
@app.route('/p/{pid}/solution/{psid:\w{24}}/{psrid:\w{24}}/raw', 'problem_solution_reply_raw')
|
||||
class ProblemSolutionReplyRawHandler(base.Handler):
|
||||
@base.requirePerm(builtin.PERM_VIEW_PROBLEM_SOLUTION)
|
||||
@base.route_argument
|
||||
@base.sanitize
|
||||
async def get(self, *, pid: document.convert_doc_id, psid: document.convert_doc_id,
|
||||
psrid: objectid.ObjectId):
|
||||
pdoc = await problem.get(self.domainId, pid)
|
||||
if pdoc.get('hidden', False):
|
||||
self.check_perm(builtin.PERM_VIEW_PROBLEM_HIDDEN)
|
||||
psdoc, psrdoc = await problem.get_solution_reply(self.domainId, psid, psrid)
|
||||
if not psdoc or psdoc['parent_doc_id'] != pdoc['doc_id']:
|
||||
raise error.DocumentNotFoundError(self.domainId, document.TYPE_PROBLEM_SOLUTION, psid)
|
||||
self.response.content_type = 'text/markdown'
|
||||
self.response.text = psrdoc['content']
|
||||
*/
|
||||
Reference in new issue
Block a user