Beispiel #1
0
    def test_view_contest_uploadcodeform(self):
        self.client.login(username='******', password='******')
        user = auth.get_user(self.client)
        assert user.is_authenticated()

        test_contest = Contest.objects.get(id=22)
        test_team = Team.objects.get(id=3)
        participant = Participant(contest=test_contest, team=test_team)
        participant.save()
        problem = Problem.objects.get(id=1)
        test_submission = Submission(run_id=1,
                                     team=test_team,
                                     problem=problem,
                                     timestamp=datetime.now(timezone.utc),
                                     state="YES",
                                     result="YES")
        test_submission.save()
        data = {"problem": 1, "submit": "Submit", "instance": 1}
        files = {"code_file": SimpleUploadedFile("foo.txt", b"foo")}

        request = self.factory.post(
            reverse("contests:contest", kwargs={'contest_id': 22}), data)
        request.user = user
        request.FILES.update(files)
        resp = displayContest(request, 22)
        self.assertEqual(resp.status_code, 200)
Beispiel #2
0
    def test_view_stat_participant(self):
        self.client.login(username='******', password='******')
        user = auth.get_user(self.client)
        assert user.is_authenticated()

        test_contest = Contest.objects.get(id=22)
        test_team = Team.objects.get(id=3)
        participant = Participant(contest=test_contest, team=test_team)
        participant.save()
        problem = Problem.objects.get(id=1)
        test_submission = Submission(run_id=1,
                                     team=test_team,
                                     problem=problem,
                                     timestamp=datetime.now(timezone.utc),
                                     state="YES",
                                     result="YES")
        test_submission.save()

        self.assertEqual(len(test_team.members.all()), 1)
        test_teammate = User.objects.get(id=9)
        test_team.members.add(test_teammate)
        self.assertEqual(len(test_team.members.all()), 2)

        test_team2 = Team.objects.get(id=4)
        self.assertEqual(len(test_team2.members.all()), 1)
        test_team2.members.add(user)
        self.assertEqual(len(test_team2.members.all()), 2)

        url = reverse("stats:index")
        resp = self.client.get(url)
        self.assertEqual(resp.status_code, 200)
Beispiel #3
0
    def mutate(root, info, problem_id, language_id, source_code):
        user = info.context.user

        my_permissions = list(
            map(lambda perm: perm.code, user.permissions.all()))
        if 'create:submissions' not in my_permissions:
            raise ValueError("You Don't Have Permission To Submit Problem")

        try:
            problem = Problem.objects.filter(contest__id=user.contest.id,
                                             id=problem_id).get()
        except Problem.DoesNotExist:
            raise ValueError("No Such Problem")

        try:
            language = Language.objects.get(pk=language_id)
        except Language.DoesNotExist:
            raise ValueError("No Such Language")

        contest = user.contest
        permitted_langs = list(
            map(lambda lang: lang.id, contest.permitted_languages.all()))
        if language.id not in permitted_langs:
            raise ValueError("Language Is Not Permitted")

        sub = Submission(problem=problem, language=language, issuer=user)
        sub.save()

        filename = "submissions/submission-{}".format(sub.id)
        default_storage.save(filename, source_code)

        return sub
Beispiel #4
0
    def test_close_notification(self):
        self.client.login(username='******', password='******')
        user = auth.get_user(self.client)
        assert user.is_authenticated()

        test_contest = Contest.objects.get(id=7)
        test_team = Team.objects.get(id=1)
        participant = Participant(contest=test_contest, team=test_team)
        participant.save()
        problems = test_contest.problem_set.all()
        problem = list(problems)[0]
        test_submission = Submission(run_id=1,
                                     team=test_team,
                                     problem=problem,
                                     timestamp=datetime.now(timezone.utc),
                                     state="NEW")
        test_submission.save()
        test_notification = Notification(submission=test_submission)
        test_notification.save()
        self.assertEqual(test_notification.id, 1)

        data = {"id": 1}
        resp = self.client.post(reverse("contests:close_notification"),
                                data=data)
        self.assertEqual(resp.status_code, 200)
Beispiel #5
0
def submit_solution(user: User, problem_id: int, language_id: int,
                    source_code: File) -> Submission:
    problem = get_problem_by_id(user, problem_id)
    language = get_language_by_id(language_id)

    contest = user.contest
    permitted_langs = list(
        map(lambda lang: lang.id, contest.permitted_languages.all()))
    if language.id not in permitted_langs:
        raise ForbiddenLanguageError()

    sub = Submission(problem=problem,
                     solution_source=source_code,
                     solution_language=language,
                     issuer=user)
    sub.save()
    # grade_submission.delay(sub)
    grade_submission(sub)

    return sub
Beispiel #6
0
    def test_view_all_judge(self):
        self.client.login(username='******', password='******')
        user = auth.get_user(self.client)
        assert user.is_authenticated()

        test_contest = Contest.objects.get(id=7)
        test_team = Team.objects.get(id=1)
        participant = Participant(contest=test_contest, team=test_team)
        participant.save()
        problems = test_contest.problem_set.all()
        problem = list(problems)[0]
        test_submission = Submission(run_id=1,
                                     team=test_team,
                                     problem=problem,
                                     timestamp=datetime.now(timezone.utc),
                                     state="NEW")
        test_submission.save()

        url = reverse("contests:contest_judge_submissions",
                      kwargs={'contest_id': 7})
        resp = self.client.get(url)
        self.assertEqual(resp.status_code, 200)
Beispiel #7
0
    def test_view_contest_with_wrong_submission(self):
        self.client.login(username='******', password='******')
        user = auth.get_user(self.client)
        assert user.is_authenticated()

        test_contest = Contest.objects.get(id=22)
        test_team = Team.objects.get(id=3)
        participant = Participant(contest=test_contest, team=test_team)
        participant.save()
        problems = test_contest.problem_set.all()
        problem = list(problems)[0]
        self.assertEqual(len(problems), 2)
        test_submission = Submission(run_id=1,
                                     team=test_team,
                                     problem=problem,
                                     timestamp=datetime.now(timezone.utc),
                                     state="NO",
                                     result="WRONG")
        test_submission.save()

        url = reverse("contests:contest", kwargs={'contest_id': 22})
        resp = self.client.get(url)
        self.assertEqual(resp.status_code, 200)
Beispiel #8
0
def problem(request, pk):

    language = [
        'Java', 'NodeJS', 'C', 'C++', 'PHP', 'Python 2', 'Python 3', 'Kotlin',
        'GO Lang', 'C#'
    ]

    details = Problem.objects.get(pk=pk)
    cleanr = re.compile(r'<[^>]+>')

    input = details.psinput
    input = re.sub(cleanr, '', input)
    output = details.psoutput
    output = re.sub(cleanr, '', output)
    input = input.split(";")
    output = output.split(";")
    p = details.pexinput
    cleanr = re.compile(r'<[^>]+>')
    p = re.sub(cleanr, '', p)

    if request.method == 'POST':
        #Submissionid
        usr = request.user.username
        bb = Submission(user=usr)
        bb.save()
        subid = bb.submissionid

        lan = request.POST.get('language')
        code = request.POST.get('code')
        #lang = 'cpp17'
        ver = 0
        if lan == 'Java':
            lan = 'java'
            ver = 3
        elif lan == 'C':
            lan = 'c'
            ver = 4
        elif lan == 'C++':
            lan = 'cpp17'
            ver = 0
        elif lan == 'PHP':
            lan = 'php'
            ver = 3
        elif lan == 'Python 2':
            lan = 'python2'
            ver = 2
        elif lan == 'Python 3':
            lan = 'python3'
            ver = 3
        elif lan == 'GO Lang':
            lan = 'go'
            ver = 3
        elif lan == 'C#':
            lan = 'csharp'
            ver = 3
        elif lan == 'Kotlin':
            lan = 'kotlin'
            ver = 2
        elif lan == 'NodeJS':
            lan = 'nodejs'
            ver = 3

        #submission language
        bb.language = lan
        bb.code = code
        bb.problemid = pk
        bb.save()

        details = Problem.objects.get(pk=pk)

        bb.problemtitle = details.ptitle
        bb.save()
        p = details.pexinput
        cleanr = re.compile(r'<[^>]+>')
        p = re.sub(cleanr, '', p)
        #output
        q = details.pexoutput
        cleanr = re.compile(r'<[^>]+>')
        q = re.sub(cleanr, '', q)

        p = p.split(";")
        q = q.split(";")

        ac = True

        pro = Profile.objects.get(uname=usr)

        for i in range(0, len(p)):
            inp = p[i]
            out = q[i]
            cleanr = re.compile(r'<[^>]+>')
            inp = re.sub(cleanr, '', inp)
            out = re.sub(cleanr, '', out)
            print(inp)
            print(out)
            print(code)

            task = {
                "clientId": "827646b49b0d2e078eb637d28a3d4202",
                "clientSecret":
                "f81ec97b9f03ef577968c605fd1b53fe67a6b3e74bc64f3eb3435e45cb5f0779",
                "script": code,
                "stdin": inp,
                "language": lan,
                "versionIndex": ver
            }
            resp = requests.post("https://api.jdoodle.com/v1/execute",
                                 headers=headers,
                                 json=json.dumps(task))
            resp = resp.json()
            #input
            print(resp)

            if resp['statusCode'] == 200:
                print(200)
                op = resp['output']
                timelimit = resp['cpuTime']
                memorylimit = resp['memory']

                cleanr = re.compile(r'<[^>]+>')
                op = re.sub(cleanr, '', op)

                gtl = float(details.ptimelimit)
                stl = (resp['cpuTime'])
                gml = float(details.pmemorylimit) * 1024
                sml = (resp['memory'])

                if str(stl) == 'None' or str(sml) == 'None':
                    bb.status = 'Syntex Error'
                    bb.save()
                    sub = pro.totalsub
                    sub += 1
                    pro.totalsub = sub
                    wa = pro.totalwa
                    wa += 1
                    pro.totalwa = wa
                    pro.save()
                    messages.info(request, "Syntex Error")
                    return redirect('problem', pk=pk)
                    ac = False
                    break

                else:
                    if float(stl) <= gtl:
                        print(1)
                        if float(sml) <= gml:
                            print(2)
                            if cmp(op, out) == True:
                                print(3)
                                continue
                            else:
                                bb.status = 'Worng Answer'
                                bb.save()
                                sub = pro.totalsub
                                sub += 1
                                pro.totalsub = sub
                                wa = pro.totalwa
                                wa += 1
                                pro.totalwa = wa
                                pro.save()
                                ac = False
                                messages.error(request, 'Wrong Answer')
                                break
                        else:
                            bb.status = 'Memory Limit'
                            bb.save()

                            sub = pro.totalsub
                            sub += 1
                            pro.totalsub = sub
                            me = pro.totalme
                            me += 1
                            pro.totalme = me
                            pro.save()
                            ac = False
                            messages.error(request, 'Memory Limit')
                            break
                    else:
                        bb.status = 'Time Limit'
                        bb.save()

                        sub = pro.totalsub
                        sub += 1
                        pro.totalsub = sub
                        tl = pro.totaltle
                        tl += 1
                        pro.totaltle = tl
                        pro.save()
                        ac = False
                        messages.error(request, 'Time Limit')
                        break

            else:
                bb.status = 'Worng Answer'
                bb.save()
                sub = pro.totalsub
                sub += 1
                pro.totalsub = sub
                wa = pro.totalwa
                wa += 1
                pro.totalwa = wa
                pro.save()
                ac = False
                messages.erroe(request, 'Wrong Answer')
                break

        if ac == True:
            print("ac")
            bb.status = 'Accepted'
            bb.save()

            sub = pro.totalsub
            sub += 1
            pro.totalsub = sub
            ac = pro.totalac
            ac += 1
            pro.totalac = ac
            pro.save()
            messages.success(request, 'Accepted')
        return redirect('profile')

    return render(request, 'front/problem.html', {
        'details': details,
        'language': language,
        'input': input,
        'output': output
    })
Beispiel #9
0
def practice_problem_page(request, pk):
    problem_id = pk
    context = {
        'current_user': None,
        'current_challenge': 'Practice',
        'problem': Problem.objects.get(pk=problem_id),
    }
    if request.user.is_authenticated:
        context['current_user'] = request.user

    if request.method == 'GET':
        # Display a single problem
        return render(request, 'contests/prob-placeholder.html', context)

    elif request.method == 'POST':
        # Code Submission and Evaluation
        submission = Submission()
        submission.user = request.user
        submission.problem = Problem.objects.get(pk=problem_id)
        submission.language = request.POST['language-choice']
        submission.source_file = request.FILES['src-file']
        submission.status = 'Checking'
        submission.save()

        result = falcon.eval_submission(
            problem_code=submission.problem.problem_code,
            src_file_name=submission.source_file.name,
            language=submission.language)
        submission.status = context['response'] = result[0]
        submission.save()
        return render(request, 'contests/sub_response.html', context)