예제 #1
0
 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
예제 #2
0
def patch(key, val):
    act = get_or_none(Activity, key=key)
    if act:
        act.timestamp = val
        act.save()
    else:
        print "failed to find", key
예제 #3
0
    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}
예제 #4
0
    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}
예제 #5
0
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)
예제 #6
0
파일: problem.py 프로젝트: ipkn/algospot
    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}
예제 #7
0
def patch(key, val):
    act = get_or_none(Activity, key=key)
    if act:
        act.timestamp = val
        act.save()
    else:
        print "failed to find", key
예제 #8
0
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)})
예제 #9
0
파일: views.py 프로젝트: Corea/algospot
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)
예제 #10
0
    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
예제 #11
0
파일: models.py 프로젝트: Corea/algospot
    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
예제 #12
0
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()
예제 #13
0
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()
예제 #14
0
파일: problem.py 프로젝트: quadr/algospot
 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}
예제 #15
0
 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
예제 #16
0
 def get_user(self, user_id):
     return get_or_none(User, pk=user_id)
예제 #17
0
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)
        })