Giter VIP home page Giter VIP logo

litmus-site's Introduction

DMOJ Site Documentation Status Slack

Django AGPLv3 contest judge frontend for the DMOJ judge system. See it live at https://dmoj.ca/.

A modern online judge and contest platform system, supporting IO-based, interactive, and signature-graded tasks.

Features

Sleek problem formatting

Problems are written in Markdown, with LaTeX-enabled math and figures, as well as syntax highlighting. Problem statements can be saved to PDF for ease of distribution to contestants.

Submit in over 50 languages

Contestants may submit in over 50 programming languages with syntax highlighting. New languages can easily be added to the site, and problem authors can limit the languages which may be used to solve a problem.

Live submission status

Submission pages feature live updates, and submissions may be aborted by both submission authors and administrators. Compilation errors and warnings for a number of languages feature color highlighting.

Configurable contest system

Contests feature an optional rating system, and can be configured to run in any timeframe. Users are also able to participate virtually after the contest ends.

Internationalized interface

Use the site in whatever language you're most comfortable in — currently fully supporting English, Simplified Chinese, and Romanian. Problem authors can provide statements in multiple languages, and DMOJ will display the most relevant one to a reader.

Mobile support

The DMOJ is usable on devices of all sizes, and improvements are constantly being made in this area.

Highly featured administration interface

The DMOJ admin interface is highly versatile, and can be efficiently used for anything from managing users to authoring problem statements.

Miscellaneous others

This is by no means a complete list, but other features in the DMOJ site include:

  • OAuth logins
  • user comments
  • arbitrary flatpages
  • editorial support
  • language-specific resource (time/memory) constraints
  • filterable submissions
  • user rating graphs
  • front-page blog
  • registration emails
  • automated contest email notifying

...and many more!

litmus-site's People

Contributors

aurpine avatar dependabot[bot] avatar faiyaz26 avatar fataleagle avatar injust avatar joonas-yoon avatar kiritofeng avatar phoenix1369 avatar puffyshoggoth avatar quantum5 avatar ssphil21e avatar vdanciu avatar walle256 avatar xyene avatar

Stargazers

 avatar  avatar  avatar

Watchers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

litmus-site's Issues

자동으로 로그아웃 안 되는 문제

로그아웃 안하고 브라우저를 종료하면 여러 사람이 돌아가면서 쓰는 컴퓨터실 특성 상 개인정보가 노출될 가능성이 높으므로 수정 요망

이름과 학번 표시 권한 추가

권한 그룹 중 [교수] 에 "이름과 학번 표시" 권한을 추가하여

소속 멤버 표시, 랭킹, 대회 리더보드 등에서 username 이 아닌 username(display name / student id) 로 보일 수 있도록 UI를 개선하면 좋겠습니다.

관리자 페이지에서 사용자 추가 시 에러

NoReverseMatch at /admin/auth/user/8/change/
Reverse for 'judge_profile_change' with arguments '('',)' not found. 1 pattern(s) tried: [u'admin/judge/profile/(.+)/change/$']

사용자 아이디랑 비밀번호 입력 후 [저장] 을 누르면 위와 같은 에러가 나네요.

하지만 사용자는 정상적으로 추가된 상황입니다.
저장 후 편집 페이지로 넘어가는 url을 못 찾는 거 같네요.

ValueError: Database returned an invalid datetime value

ValueError at /admin/judge/contest/
Database returned an invalid datetime value. Are time zone definitions for your database installed?

Exception Location:
/home/litmus/env/litmus/local/lib/python2.7/site-packages/django/db/models/functions/datetime.py in convert_value, line 198

아직 원인을 모르겠음.

DB에서 등록된 Contest를 삭제했더니 안 나오는데, 대회를 추가할 때 어떤 형식이 안 맞는 것 같음

Litmus1의 problemset 마이그레이션

Litmus(링크)에 있는 problemset을 현재 프로젝트로 이전하는 작업.
Litmus 상에서의 problemset 디렉토리는 /home/litmus/public_html/problem이며
contests에는 문제가 존재하며 하나의 문제에 해당하는 input, output파일이 함께 존재함.
이를 같이 현재 프로젝트로 이전해야 함

유저 매뉴얼 작성

해당 프로젝트의 실제 사용자인(교수님, 학생들)을 위한 사용방법 매뉴얼이 필요합니다.
교수님들의 경우 문제 추가, 데이터 추가, 과제(또는 시험) 생성 및 관리를 위주로
학생들의 경우 가입, 코드 제출 및 채점 방법, FAQ 기타 등등
리트머스2의 첫 사용자가 헤메지 않도록 유저 Friendly한 매뉴얼 작성

채점 오류 메시지에 경로가 노출된다

judge에서 오류가 나면 아래와 같이 표시됨

채점에 문제가 생겼습니다.
자세한 오류 정보

Traceback (most recent call last):
  File "/home/litmus/judge/dmoj/judge.py", line 163, in _begin_grading
    problem = Problem(problem_id, time_limit, memory_limit, load_pretests_only=pretests_only)
  File "/home/litmus/judge/dmoj/problem.py", line 51, in __init__
    self.cases = self._resolve_testcases(self.config['pretest_test_cases' if self.is_pretested else 'test_cases'])
  File "/home/litmus/judge/dmoj/problem.py", line 73, in _resolve_testcases
    for case_config in cfg:
TypeError: 'NoneType' object is not iterable

제출한 소스코드가 아닌 내부 오류 메시지를 출력하기 때문에 혼란이 올 뿐 아니라 보안 이슈도 있어보임

채점 중 페이지가 갱신되지 않음

채점 중일 때 새로고침을 눌러야만 채점 결과가 나오는 현상이 있음.

주기적으로 새로고침을 자동으로 해주는 식으로 해결해야 될 듯함.

문제 복제 시 500 에러

이름이 길어서 -clone-clone-... 이 생략된 상황이면 키 중복 때문에 500 에러가 발생함.

예를 들어, 1234-1234-1234 라는 문제를 복제하면 1234-1234-1234-clone 이여야하지만, 코드가 1234-1234-1234-clo 가 되며,
이걸 다시 복제해도 1234-1234-1234-clo-clone이 되지 못하고 1234-1234-1234-clo 라서 중복 에러. (길이 제한때문에)

관련 이슈: #38

문제 복제(clone)시 문제코드 문제

문제를 복제하면 복제되는 문제의 문제코드는 기존 문제코드에 _clone이 붙는데,
문제코드에는 언더바가 허용되지 않기 때문에 복제까지는 되는데 수정시 오류가 발생합니다.

문제 데이터 업로드할 때 불편함

현재 문제 데이터 압축 파일을 업로드할 때 제출 버튼을 눌러줘야 적용이 되는데, 처음 사용하는 사람들은 당황할 것 같습니다. 적용 버튼을 따로 만드는 게 좋아 보입니다.

대회 관전 시 랭킹과 참가자를 볼 수 없음

버그인지 의도된 것인지 모르겠으나, 권한의 충돌이 생기는 것 같습니다.

상황은 다음과 같습니다.

  • 대회를 만든 사람 A
  • 해당 대회는 소속 X에 대해서만 열린 organization-private
  • 유저 A는 소속 X의 Registrant이고 Administrators
  • 대회 정보 페이지와 문제 목록까지는 보임
  • 랭킹과 참가자 페이지가 Not Found로 넘어감

Navigation bar not working

모바일 UI에서 내비게이션 바가 동작하지 않음.

Image

메뉴 아이콘을 터치하면 왼쪽으로 네비게이션이 펼쳐져야 하는데, 그렇지 못하고 있음.

회원가입 후 인증 활성화 방법

회원가입 시 계정 활성화를 위해 가입된 계정의 이메일 주소로 메일이 전송되는 데,

... 활성화를 위한 인증 코드는 다음과 같습니다.
a8b384b816297a4a055da5a55b4d996294aba7fa

처럼 안내하지만, 인증 대기중인 계정으로 로그인이 되지 않아 인증 코드를 기입할 방법이 없다.

Removal directory named "static/"

django에서는 정적 파일을 특정 디렉토리에 따로 저장하여 제공합니다.
debug 모드에서는 django 앱이 연결해주지만, production 모드에서는 그렇지 않기 때문에 웹 서버(nginx, Apache 등)에서 그 디렉토리를 지정해주어야 합니다.

static 디렉토리(settings.py에서 STATIC_ROOT로 적힌 이름)는 resources 디렉토리를 아래 커맨드로 컴파일하여 생성합니다:

$ python manage.py collectstatic

이에 대한 자세한 내용은 아래를 참고하세요.
https://docs.djangoproject.com/ko/1.11/howto/static-files/
https://docs.djangoproject.com/ko/1.11/ref/contrib/staticfiles/#django-admin-collectstatic

문제는 resource를 통해서만 만들어야 하는 static 디렉토리를 직접 수정하였고, 이를 push 했습니다.
https://github.com/alps-jbnu/litmus-site/commits/a2c857dae416c4dea85233fc542a5da26f99fc56/static

위 커밋을 토대로 resources의 파일들을 수정하고, static 디렉토리를 지우고 새롭게 생성(하거나 무시)해야합니다.

관리자를 위한 공지 작성 폼

메인 화면에서 보이는 News(뉴스)를 작성하기 위한 UI가 필요합니다.

해당 글들은 Blog Post와 연결되어 있습니다.

질의/응답 시스템 개선 필요

댓글 금지로 만들어진 대회에서, 질의 요청을 하면 Ticket이 생성되는데 학생 입장에서는 제출된 Ticket을 다시 확인할 방법이 없다.

[Manage ticket] 링크를 일반 유저에게도 보여주거나, 자신의 것만 볼 수 있도록 개선이 필요해보임.

가능하다면, 질문과 공지 시스템을 새로 만드는 것이 좋아보인다.

port site for python 3

2020년부터 지원 중단되는 python 2 문제도 있고,
Django 2.x 에서 더 이상 python 2.x 를 지원하지 않습니다.

이 레퍼지토리의 베이스인 DMOJ에서는 이미 업데이트를 한 듯 한데, 어떻게 적용할 지는 고민이 필요합니다.

DMOJ/online-judge#300

일부 문제 복제(clone) 오류

SIGSEGV: invalid_state
corrupt page /problem/darksoul-3-goinmul/clone
site: fatal signal: Segmentation fault
site died (signal 500, exit -11)

panic: go back
Traceback (most recent call last):
  File "/home/litmus/env/litmus/local/lib/python2.7/site-packages/django/core/handlers/exception.py", line 41, in inner
    response = get_response(request)
  File "/home/litmus/env/litmus/local/lib/python2.7/site-packages/django/core/handlers/base.py", line 187, in _get_response
    response = self.process_exception_by_middleware(e, request)
  File "/home/litmus/env/litmus/local/lib/python2.7/site-packages/django/core/handlers/base.py", line 185, in _get_response
    response = wrapped_callback(request, *callback_args, **callback_kwargs)
  File "/home/litmus/env/litmus/local/lib/python2.7/site-packages/django/views/decorators/http.py", line 40, in inner
    return func(request, *args, **kwargs)
  File "/home/litmus/env/litmus/local/lib/python2.7/site-packages/django/contrib/auth/decorators.py", line 23, in _wrapped_view
    return view_func(request, *args, **kwargs)
  File "/home/litmus/env/litmus/local/lib/python2.7/site-packages/django/contrib/auth/decorators.py", line 23, in _wrapped_view
    return view_func(request, *args, **kwargs)
  File "/home/litmus/site/judge/views/problem.py", line 627, in clone_problem
    problem.save()
  File "/home/litmus/site/judge/models/problem.py", line 286, in save
    super(Problem, self).save(*args, **kwargs)
  File "/home/litmus/env/litmus/local/lib/python2.7/site-packages/django/db/models/base.py", line 808, in save
    force_update=force_update, update_fields=update_fields)
  File "/home/litmus/env/litmus/local/lib/python2.7/site-packages/django/db/models/base.py", line 838, in save_base
    updated = self._save_table(raw, cls, force_insert, force_update, using, update_fields)
  File "/home/litmus/env/litmus/local/lib/python2.7/site-packages/django/db/models/base.py", line 924, in _save_table
    result = self._do_insert(cls._base_manager, using, fields, update_pk, raw)
  File "/home/litmus/env/litmus/local/lib/python2.7/site-packages/django/db/models/base.py", line 963, in _do_insert
    using=using, raw=raw)
  File "/home/litmus/env/litmus/local/lib/python2.7/site-packages/django/db/models/manager.py", line 85, in manager_method
    return getattr(self.get_queryset(), name)(*args, **kwargs)
  File "/home/litmus/env/litmus/local/lib/python2.7/site-packages/django/db/models/query.py", line 1076, in _insert
    return query.get_compiler(using=using).execute_sql(return_id)
  File "/home/litmus/env/litmus/local/lib/python2.7/site-packages/django/db/models/sql/compiler.py", line 1112, in execute_sql
    cursor.execute(sql, params)
  File "/home/litmus/env/litmus/local/lib/python2.7/site-packages/django/db/backends/utils.py", line 64, in execute
    return self.cursor.execute(sql, params)
  File "/home/litmus/env/litmus/local/lib/python2.7/site-packages/django/db/utils.py", line 94, in __exit__
    six.reraise(dj_exc_type, dj_exc_value, traceback)
  File "/home/litmus/env/litmus/local/lib/python2.7/site-packages/django/db/backends/utils.py", line 64, in execute
    return self.cursor.execute(sql, params)
  File "/home/litmus/env/litmus/local/lib/python2.7/site-packages/django/db/backends/mysql/base.py", line 101, in execute
    return self.cursor.execute(query, args)
  File "/home/litmus/env/litmus/local/lib/python2.7/site-packages/MySQLdb/cursors.py", line 250, in execute
    self.errorhandler(self, exc, value)
  File "/home/litmus/env/litmus/local/lib/python2.7/site-packages/MySQLdb/connections.py", line 50, in defaulterrorhandler
    raise errorvalue
DataError: (1406, "Data too long for column 'code' at row 1")

권한 요청 폼 작성

사용자들의 추가권한이 필요한 경우 프로젝트 내부적으로 권한 상승을 요청할 수 있는 폼이 필요합니다.
사용자가 필요한 권한을 선택해 폼을 작성해 제출하면, 관리자인 Admin 계정으로 승인하거나 반려할 수 있는 시스템이 필요합니다.

problem clarifications 추가 안됨

관리자 UI에서 문제의 PROBLEM CLARIFICATIONS을 작성 후 저장을 눌러도 저장이 안됨.

#42 과 함께 공지 시스템을 고민해볼 필요가 있다.

대회에 있는 댓글 여부

지금 댓글이 문제에도 있고, 대회 소개(info) 에도 있는데 이에 대한 의논이 필요하다.

각 댓글을 어떻게 사용하고 관리할 지

submodule에 관한 문제

git submodule init 명령어를 수행하면
fatal: No url found for submodule path 'static/libs' in .gitmodules
라는 에러가 뜹니다.

그래서 직접 url을 clone하여 다운받았는데 라이브러리가 최신 버전으로 업데이트되면서 버전 충돌이 발생합니다. 예로 우리는 jQuery 1.11.2 버전이 필요하지만 3.4.1 버전이 다운됩니다.

에디터 변경

지금은 markdown 에디터로 작성되고 있는 데, WYSIWYG 에디터인 summernote로 바꾸는 건 어떨까 싶네요.

django의 위젯으로도 있는 것 같고, (https://github.com/summernote/django-summernote) 무료이지만 기존에 작성된 글들을 전부 WYSIWYG에 맞게 수정해야 하는 큰 산이 생기겠군요.

수식(MathJax) 작성 지원도 되기는 합니다. (https://github.com/thisroot/summernote-equation-plugin)

참고로 트게더에서 이 에디터를 사용하고 있습니다.

404 ERROR

서버를 실행하여 localhost:8000에 접속하면 콘솔에

"GET /%3Cfunction%20%3Clambda%3E%20at%200x103fe3d50%3E HTTP/1.1" 404 12332
"GET /%3Cfunction%20%3Clambda%3E%20at%200x104008dd0%3E HTTP/1.1" 404 12332
"GET /%3Cfunction%20%3Clambda%3E%20at%200x103fea250%3E HTTP/1.1" 404 12332
"GET /%3Cfunction%20%3Clambda%3E%20at%200x103fdf8d0%3E HTTP/1.1" 404 12332
"GET /%3Cfunction%20%3Clambda%3E%20at%200x103fee6d0%3E HTTP/1.1" 404 12332

가 출력됩니다.

pip 의존성 설치 중 문제 발생.

image

pip install -r requirements.txt

명령어로 의존성 설치 중에 위와 같은 에러가 발생했습니다.

vmware player로 ubuntu 16.04 LTS 에서 실행 중에 발생했습니다.

혹 해결 방법이 있으면 답변 부탁드립니다.

유지관리를 위한 Documentation 작업

연단위 운영진의 변경과 함께 간편한 프로젝트 실무자의 인수인계를 위해서
#3 와 함께 Github Wiki에 프로젝트를 운영, 유지보수, 오류 해결을 위한 추가적인 Documentation이 필요.

No module named sgbackend

에러 메시지:

ImportError at /accounts/register/
No module named sgbackend
Request Method:   POST
Request URL:   <domain>/accounts/register/
Django Version:   1.11.8
Exception Type:   ImportError
Exception Value:   
No module named sgbackend
Exception Location:   /usr/lib/python2.7/importlib/__in..

이유는 모르겠으나 sendgrid-django, django-sendgrid, sendgrid 중 무엇을 설치해도 sgbackend 모듈을 여전히 찾을 수 없다.

푼 문제 갱신 안됨

문제를 풀면 빨간색 (-) 모양에서 초록색 (v)이 되어야 하는데 갱신이 되지 않음

문제 코드 형식 결정

http://litmus.ga/problem/aplusb2 에서 aplusb2 자리에 오는 것이 문제 코드입니다.
지금은 [a-z0-9]+ (영어 소문자와 숫자)만 허용하고 있습니다.

각 방법에 장단점이 분명히 있으니 의견을 수렴할 겸 투표를 진행하려 합니다.
마음에 드는 댓글(방법)에 👍 또는 👎 를 표시를 해주세요!

투표 방법:
👍 또는 👎는 댓글의 오른쪽 위 +😃 표시를 클릭하면 됩니다.

한글화 작업

site 디렉토리에서 locale/ko/LC_MESSAGES/django.po 파일을 수정하면 됩니다.

변경 사항을 사이트에 적용하는 방법

(venv) $ python manage.py compilemessages
(venv) $ python manage.py compilejsi18n

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. 📊📈🎉

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.