def authenticate(self, username=None, password=None): if not username or not password: return None user = get_or_none(User, username=username) if not user: user = get_or_none(User, email=username) if not user: return user if user.password.startswith(MAGIC): stored = user.password[len(MAGIC):] if get_hash(password, stored) == stored: user.set_password(password) return user return None
def patch(key, val): act = get_or_none(Activity, key=key) if act: act.timestamp = val act.save() else: print "failed to find", key
def go(): problem = get_or_none(Problem, id=id) if not problem: return {"success": False, "error": u"존재하지 않는 문제입니다."} checker = ObjectPermissionChecker(request.user) if not checker.has_perm('edit_problem', problem) and problem.user != request.user: return {"success": False, "error": u"권한이 없습니다."} if request.method != "POST": return {"success": False, "error": u"POST 접근하셔야 합니다."} file = request.FILES["file"] md5 = md5file(file) target_path = os.path.join("judge-attachments", md5, file.name) storage = DefaultStorage() storage.save(target_path, file) new_attachment = Attachment(problem=problem, file=target_path) new_attachment.save() # 해당 오브젝트에 대해 아무 퍼미션이나 있으면 처리됨. 문제의 경우 PUBLISHED 일 때는 이 권한을 사용하지 않아서 안전하다 visible_users = get_users_with_perms(problem, with_group_users=False) visible_groups = get_groups_with_perms(problem) publish("problem-attachment-%s" % datetime.now().strftime('%s.%f'), "problem", "problem-attachment", actor=request.user, target=problem, timestamp=datetime.now(), visible_users=visible_users, visible_groups=visible_groups, verb=u"문제 {target}에 첨부파일 %s 을 추가했습니다." % file.name) return {"success": True}
def edit(request, slug): params = {"slug": slug} page = get_or_none(Page, slug=slug) text = page.current_revision.text if page and page.current_revision else "" form = EditForm(data=request.POST or None, initial={"text": text}) if request.method == "POST" and form.is_valid(): if not page: page = Page(title=unslugify(slug), slug=slug) page.save() form.save(page, request.user) return redirect(reverse("wiki-detail", kwargs={"slug": page.slug})) params["form"] = form if page: params["action"] = "Edit" params["title"] = page.title params["modified"] = page.modified_on params["action"] = "Edit" else: params["title"] = unslugify(slug) params["modified"] = "NULL" params["action"] = "Create" return render(request, "edit.html", params)
def go(): problem = get_or_none(Problem, id=id) if not problem: return {"success": False, "error": u"존재하지 않는 문제입니다."} if not request.user.is_superuser and problem.user != request.user: return {"success": False, "error": u"권한이 없습니다."} if request.method != "POST": return {"success": False, "error": u"POST 접근하셔야 합니다."} file = request.FILES["file"] md5 = md5file(file) target_path = os.path.join("judge-attachments", md5, file.name) storage = DefaultStorage() storage.save(target_path, file) new_attachment = Attachment(problem=problem, file=target_path) new_attachment.save() publish( "problem-attachment-%s" % datetime.now().strftime("%s.%f"), "problem", "problem-attachment", actor=request.user, target=problem, timestamp=datetime.now(), admin_only=True, verb=u"문제 {target}에 첨부파일 %s 을 추가했습니다." % file.name, ) return {"success": True}
def recent(request, page=1): checker = ObjectPermissionChecker(request.user) submissions = Submission.objects.all().order_by("-id") filters = {} empty_message = u"제출된 답안이 없습니다." title_add = [] # only superuser can see all nonpublic submissions. # as an exception, if we are filtering by a problem, the author can see # nonpublic submissions. also, everybody can see their nonpublic # submissions. only_public = not request.user.is_superuser if request.GET.get("problem"): slug = request.GET["problem"] problem = get_object_or_404(Problem, slug=slug) if request.user == problem.user or checker.has_perm('read_problem', problem): only_public = False if (problem.state != Problem.PUBLISHED and request.user != problem.user and not checker.has_perm('read_problem', problem)): raise Http404 submissions = submissions.filter(problem=problem) title_add.append(slug) filters["problem"] = slug if "state" in request.GET: state = request.GET["state"] submissions = submissions.filter(state=state) filters["state"] = state title_add.append(Submission.STATES_KOR[int(state)]) if request.GET.get("user"): username = request.GET["user"] user = get_or_none(User, username=username) if not user: empty_message = u"해당 사용자가 없습니다." submissions = submissions.none() else: submissions = submissions.filter(user=user) filters["user"] = username title_add.append(username) if user == request.user: only_public = False if only_public: submissions = submissions.filter(is_public=True) return render(request, "submission/recent.html", {"title": u"답안 목록" + (": " if title_add else "") + ",".join(title_add), "filters": filters, "empty_message": empty_message, "pagination": setup_paginator(submissions, page, "judge-submission-recent", {}, filters)})
def refresh(problem, user): # TODO: 언젠가.. 최적화한다. -_- # PUBLISHED 가 아니면 Solver 인스턴스는 존재하지 않는다. if problem.state != Problem.PUBLISHED: return # Solver 인스턴스를 찾음. 없으면 만듬. instance = get_or_none(Solver, problem=problem, user=user) if not instance: instance = Solver(problem=problem, user=user) instance.save() # 이 사람의 서브미션 목록을 찾는다 submissions = Submission.objects.filter(problem=problem, is_public=True, user=user).order_by("id") accepted = submissions.filter(state=Submission.ACCEPTED) # 풀었나? 못 풀었나? prev_solved = instance.solved if accepted.count() == 0: instance.solved = False instance.incorrect_tries = submissions.count() instance.fastest_submission = instance.shortest_submission = None else: instance.solved = True first = accepted[0] instance.when = first.submitted_on incorrect = submissions.filter(id__lt=first.id) instance.incorrect_tries = incorrect.count() instance.fastest_submission = accepted.order_by("time")[0] instance.shortest_submission = accepted.order_by("length")[0] instance.save() if instance.solved != prev_solved: # 유저 프로필에 푼 문제 수 업데이트 profile = user.get_profile() profile.solved_problems = Solver.objects.filter( user=user, solved=True).count() profile.save() # 처음으로 풀었을 경우 알림을 보낸다 id = "solved-%d-%d" % (problem.id, user.id) if instance.solved: # 풀었다! publish(id, "solved", "judge", target=problem, actor=user, timestamp=instance.fastest_submission.submitted_on, verb=u"%d번의 시도만에 문제 {target}를 해결했습니다." % (instance.incorrect_tries + 1)) else: # 리저지 등 관계로 풀었던 문제를 못푼게 됨. depublish(id) # TODO: 가장 빠른 솔루션, 가장 짧은 솔루션이 등장했을 경우 # newsfeed entry를 보낸다 return instance
def refresh(problem, user): # TODO: 언젠가.. 최적화한다. -_- # PUBLISHED 가 아니면 Solver 인스턴스는 존재하지 않는다. if problem.state != Problem.PUBLISHED: return # Solver 인스턴스를 찾음. 없으면 만듬. instance = get_or_none(Solver, problem=problem, user=user) if not instance: instance = Solver(problem=problem, user=user) instance.save() # 이 사람의 서브미션 목록을 찾는다 submissions = Submission.objects.filter(problem=problem, is_public=True, user=user).order_by("id") accepted = submissions.filter(state=Submission.ACCEPTED) # 풀었나? 못 풀었나? prev_solved = instance.solved if accepted.count() == 0: instance.solved = False instance.incorrect_tries = submissions.count() instance.fastest_submission = instance.shortest_submission = None else: instance.solved = True first = accepted[0] instance.when = first.submitted_on incorrect = submissions.filter(id__lt=first.id) instance.incorrect_tries = incorrect.count() instance.fastest_submission = accepted.order_by("time")[0] instance.shortest_submission = accepted.order_by("length")[0] instance.save() if instance.solved != prev_solved: # 유저 프로필에 푼 문제 수 업데이트 profile = user.get_profile() profile.solved_problems = Solver.objects.filter(user=user, solved=True).count() profile.save() # 처음으로 풀었을 경우 알림을 보낸다 id = "solved-%d-%d" % (problem.id, user.id) if instance.solved: # 풀었다! publish(id, "solved", "judge", target=problem, actor=user, timestamp=instance.fastest_submission.submitted_on, verb=u"%d번의 시도만에 문제 {target}를 해결했습니다." % (instance.incorrect_tries + 1)) else: # 리저지 등 관계로 풀었던 문제를 못푼게 됨. depublish(id) # TODO: 가장 빠른 솔루션, 가장 짧은 솔루션이 등장했을 경우 # newsfeed entry를 보낸다 return instance
def migrate_attachments(db, upload): attachments = fetch_all(db, "GDN_Attachment") for attachment in attachments: origin = os.path.join(upload, attachment["Path"]) md5 = md5file(origin) name = sanitize_filename(attachment["Name"]) target_path = os.path.join("judge-attachments", md5, name) copy_to = os.path.join(settings.MEDIA_ROOT, target_path) try: os.makedirs(os.path.dirname(copy_to)) except: pass shutil.copy(origin, copy_to) problem = get_or_none(Problem, id=attachment["Problem"]) if not problem: continue new_attachment = Attachment(problem=problem, id=attachment["No"], file=target_path) new_attachment.save()
def go(): problem = get_or_none(Problem, id=id) if not problem: return {"success": False, "error": u"존재하지 않는 문제입니다."} if not request.user.is_superuser and problem.user != request.user: return {"success": False, "error": u"권한이 없습니다."} if request.method != "POST": return {"success": False, "error": u"POST 접근하셔야 합니다."} file = request.FILES["file"] md5 = md5file(file) target_path = os.path.join("judge-attachments", md5, file.name) storage = DefaultStorage() storage.save(target_path, file) new_attachment = Attachment(problem=problem, file=target_path) new_attachment.save() return {"success": True}
def authenticate(self, username=None, password=None): user = get_or_none(User, email=username) if not user: return user if user.check_password(password): return user return None
def get_user(self, user_id): return get_or_none(User, pk=user_id)
def recent(request, page=1): checker = ObjectPermissionChecker(request.user) submissions = Submission.objects.all().order_by("-id") filters = {} empty_message = u"제출된 답안이 없습니다." title_add = [] # only superuser can see all nonpublic submissions. # as an exception, if we are filtering by a problem, the author can see # nonpublic submissions. also, everybody can see their nonpublic # submissions. only_public = not request.user.is_superuser if request.GET.get("problem"): slug = request.GET["problem"] problem = get_object_or_404(Problem, slug=slug) if request.user == problem.user or checker.has_perm( 'read_problem', problem): only_public = False if (problem.state != Problem.PUBLISHED and request.user != problem.user and not checker.has_perm('read_problem', problem)): raise Http404 submissions = submissions.filter(problem=problem) title_add.append(slug) filters["problem"] = slug if "state" in request.GET: state = request.GET["state"] submissions = submissions.filter(state=state) filters["state"] = state title_add.append(Submission.STATES_KOR[int(state)]) if request.GET.get("user"): username = request.GET["user"] user = get_or_none(User, username=username) if not user: empty_message = u"해당 사용자가 없습니다." submissions = submissions.none() else: submissions = submissions.filter(user=user) filters["user"] = username title_add.append(username) if user == request.user: only_public = False if only_public: submissions = submissions.filter(is_public=True) problems = Problem.objects.filter(state=Problem.PUBLISHED).order_by("slug") users = User.objects.order_by("username") return render( request, "submission/recent.html", { "title": u"답안 목록" + (": " if title_add else "") + ",".join(title_add), "problems": problems, "users": users, "filters": filters, "empty_message": empty_message, "pagination": setup_paginator(submissions, page, "judge-submission-recent", {}, filters) })