This commit is contained in:
virusdefender 2017-01-23 16:25:14 +08:00
parent 5c5cf7ff98
commit 32c1b89080
35 changed files with 56 additions and 108 deletions

7
.flake8 Normal file
View File

@ -0,0 +1,7 @@
[flake8]
exclude =
xss_filter.py,
migrations/,
*settings.py
max-line-length = 180
inline-quotes = "

View File

@ -9,4 +9,5 @@ install:
- python manage.py migrate - python manage.py migrate
- python manage.py initadmin - python manage.py initadmin
script: script:
- flake8 .
- python manage.py test - python manage.py test

View File

@ -1,7 +1,6 @@
from __future__ import unicode_literals from __future__ import unicode_literals
import functools import functools
from django.http import HttpResponse
from django.utils.translation import ugettext as _ from django.utils.translation import ugettext as _
from utils.api import JSONResponse from utils.api import JSONResponse

View File

@ -23,4 +23,4 @@ class AdminRequiredMiddleware(object):
path = request.path_info path = request.path_info
if path.startswith("/admin/") or path.startswith("/api/admin/"): if path.startswith("/admin/") or path.startswith("/api/admin/"):
if not(request.user.is_authenticated() and request.user.is_admin()): if not(request.user.is_authenticated() and request.user.is_admin()):
return JSONResponse.response({"error": "login-required", "data": _("Please login in first")}) return JSONResponse.response({"error": "login-required", "data": _("Please login in first")})

View File

@ -3,5 +3,5 @@ from django.conf.urls import url
from ..views.admin import UserAdminAPI from ..views.admin import UserAdminAPI
urlpatterns = [ urlpatterns = [
url(r'^user$', UserAdminAPI.as_view(), name="user_admin_api"), url(r"^user$", UserAdminAPI.as_view(), name="user_admin_api"),
] ]

View File

@ -3,7 +3,7 @@ from django.conf.urls import url
from ..views.oj import UserLoginAPI, UserRegisterAPI, UserChangePasswordAPI from ..views.oj import UserLoginAPI, UserRegisterAPI, UserChangePasswordAPI
urlpatterns = [ urlpatterns = [
url(r'^login$', UserLoginAPI.as_view(), name="user_login_api"), url(r"^login$", UserLoginAPI.as_view(), name="user_login_api"),
url(r'^register$', UserRegisterAPI.as_view(), name="user_register_api"), url(r"^register$", UserRegisterAPI.as_view(), name="user_register_api"),
url(r'^change_password$', UserChangePasswordAPI.as_view(), name="user_change_password_api") url(r"^change_password$", UserChangePasswordAPI.as_view(), name="user_change_password_api")
] ]

View File

@ -32,6 +32,6 @@ class AnnouncementAdminTest(APITestCase):
def test_delete_announcemen(self): def test_delete_announcemen(self):
id = self.test_create_announcement().data["data"]["id"] id = self.test_create_announcement().data["data"]["id"]
resp = self.client.delete(self.url, data={'id': id}) resp = self.client.delete(self.url, data={"id": id})
self.assertSuccess(resp) self.assertSuccess(resp)
self.assertFalse(Announcement.objects.filter(id=id).exists()) self.assertFalse(Announcement.objects.filter(id=id).exists())

View File

@ -3,5 +3,5 @@ from django.conf.urls import url
from ..views import AnnouncementAdminAPI from ..views import AnnouncementAdminAPI
urlpatterns = [ urlpatterns = [
url(r'^announcement$', AnnouncementAdminAPI.as_view(), name="announcement_admin_api"), url(r"^announcement$", AnnouncementAdminAPI.as_view(), name="announcement_admin_api"),
] ]

View File

@ -13,17 +13,17 @@ class EditSMTPConfigSerializer(serializers.Serializer):
class CreateSMTPConfigSerializer(EditSMTPConfigSerializer): class CreateSMTPConfigSerializer(EditSMTPConfigSerializer):
password = serializers.CharField(max_length=128) password = serializers.CharField(max_length=128)
class SMTPConfigSerializer(serializers.ModelSerializer): class SMTPConfigSerializer(serializers.ModelSerializer):
class Meta: class Meta:
model = SMTPConfig model = SMTPConfig
exclude = ["id", "password"] exclude = ["id", "password"]
class TestSMTPConfigSerializer(serializers.Serializer): class TestSMTPConfigSerializer(serializers.Serializer):
email = serializers.EmailField() email = serializers.EmailField()
class CreateEditWebsiteConfigSerializer(serializers.Serializer): class CreateEditWebsiteConfigSerializer(serializers.Serializer):
base_url = serializers.CharField(max_length=128) base_url = serializers.CharField(max_length=128)
@ -56,4 +56,3 @@ class JudgeServerHeartbeatSerializer(serializers.Serializer):
cpu = serializers.FloatField(min_value=0, max_value=100) cpu = serializers.FloatField(min_value=0, max_value=100)
action = serializers.ChoiceField(choices=("heartbeat", )) action = serializers.ChoiceField(choices=("heartbeat", ))
service_url = serializers.CharField(max_length=128, required=False) service_url = serializers.CharField(max_length=128, required=False)

View File

@ -51,7 +51,7 @@ class SMTPConfigTest(APITestCase):
class WebsiteConfigAPITest(APITestCase): class WebsiteConfigAPITest(APITestCase):
def test_create_website_config(self): def test_create_website_config(self):
user = self.create_super_admin() self.create_super_admin()
url = self.reverse("website_config_api") url = self.reverse("website_config_api")
data = {"base_url": "http://test.com", "name": "test name", data = {"base_url": "http://test.com", "name": "test name",
"name_shortcut": "test oj", "footer": "<a>test</a>", "name_shortcut": "test oj", "footer": "<a>test</a>",
@ -60,7 +60,7 @@ class WebsiteConfigAPITest(APITestCase):
self.assertSuccess(resp) self.assertSuccess(resp)
def test_edit_website_config(self): def test_edit_website_config(self):
user = self.create_super_admin() self.create_super_admin()
url = self.reverse("website_config_api") url = self.reverse("website_config_api")
data = {"base_url": "http://test.com", "name": "test name", data = {"base_url": "http://test.com", "name": "test name",
"name_shortcut": "test oj", "footer": "<a>test</a>", "name_shortcut": "test oj", "footer": "<a>test</a>",
@ -103,7 +103,7 @@ class JudgeServerHeartbeatest(APITestCase):
self.assertSuccess(resp) self.assertSuccess(resp)
server = JudgeServer.objects.first() server = JudgeServer.objects.first()
self.assertEqual(server.ip, "127.0.0.1") self.assertEqual(server.ip, "127.0.0.1")
self.assertEqual(server.service_url ,None) self.assertEqual(server.service_url, None)
def test_new_heartbeat_service_url(self): def test_new_heartbeat_service_url(self):
service_url = "http://1.2.3.4:8000/api/judge" service_url = "http://1.2.3.4:8000/api/judge"

View File

@ -3,7 +3,7 @@ from django.conf.urls import url
from ..views import WebsiteConfigAPI, SMTPAPI, JudgeServerAPI from ..views import WebsiteConfigAPI, SMTPAPI, JudgeServerAPI
urlpatterns = [ urlpatterns = [
url(r'^smtp$', SMTPAPI.as_view(), name="smtp_admin_api"), url(r"^smtp$", SMTPAPI.as_view(), name="smtp_admin_api"),
url(r'^website$', WebsiteConfigAPI.as_view(), name="website_config_api"), url(r"^website$", WebsiteConfigAPI.as_view(), name="website_config_api"),
url(r'^judge_server', JudgeServerAPI.as_view(), name="judge_server_api") url(r"^judge_server", JudgeServerAPI.as_view(), name="judge_server_api")
] ]

View File

@ -4,6 +4,6 @@ from ..views import WebsiteConfigAPI, JudgeServerHeartbeatAPI
urlpatterns = [ urlpatterns = [
url(r'^website$', WebsiteConfigAPI.as_view(), name="website_info_api"), url(r"^website$", WebsiteConfigAPI.as_view(), name="website_info_api"),
url(r'^judge_server_heartbeat$', JudgeServerHeartbeatAPI.as_view(), name="judge_server_heartbeat_api") url(r"^judge_server_heartbeat$", JudgeServerHeartbeatAPI.as_view(), name="judge_server_heartbeat_api")
] ]

View File

@ -49,8 +49,6 @@ class SMTPTestAPI(APIView):
@super_admin_required @super_admin_required
@validate_serializer(TestSMTPConfigSerializer) @validate_serializer(TestSMTPConfigSerializer)
def post(self, request): def post(self, request):
email = request.data["email"]
# todo: test send email
return self.success({"result": True}) return self.success({"result": True})
@ -111,7 +109,7 @@ class JudgeServerHeartbeatAPI(CSRFExemptAPIView):
server.cpu_core = data["cpu_core"] server.cpu_core = data["cpu_core"]
server.memory_usage = data["memory"] server.memory_usage = data["memory"]
server.cpu_usage = data["cpu"] server.cpu_usage = data["cpu"]
server.service_url= service_url server.service_url = service_url
server.ip = ip server.ip = ip
server.last_heartbeat = timezone.now() server.last_heartbeat = timezone.now()
server.save() server.save()
@ -126,7 +124,3 @@ class JudgeServerHeartbeatAPI(CSRFExemptAPIView):
last_heartbeat=timezone.now(), last_heartbeat=timezone.now(),
) )
return self.success() return self.success()

View File

@ -1,3 +0,0 @@
from django.contrib import admin
# Register your models here.

View File

@ -103,4 +103,4 @@ class OIContestRank(ContestRank):
submission_info = JSONField(default={}) submission_info = JSONField(default={})
class Meta: class Meta:
db_table = "oi_contenst_rank" db_table = "oi_contenst_rank"

View File

@ -1,3 +0,0 @@
from django.test import TestCase
# Create your tests here.

View File

@ -1,3 +0,0 @@
from django.shortcuts import render
# Create your views here.

View File

@ -3,3 +3,4 @@ djangorestframework==3.3.3
pillow pillow
jsonfield jsonfield
otpauth otpauth
flake8-quotes

View File

@ -1,3 +0,0 @@
from django.contrib import admin
# Register your models here.

View File

@ -1,7 +0,0 @@
from __future__ import unicode_literals
from django.apps import AppConfig
class GroupConfig(AppConfig):
name = 'group'

View File

@ -1,3 +0,0 @@
from django.test import TestCase
# Create your tests here.

View File

@ -1,3 +0,0 @@
from django.shortcuts import render
# Create your views here.

View File

@ -1,9 +0,0 @@
"""
___ _ _ __ _ _ _
/___\ _ __ | |(_) _ __ ___ \ \ _ _ __| | __ _ ___ | |__ _ _ __ _ __| | _ _
// //| '_ \ | || || '_ \ / _ \ \ \| | | | / _` | / _` | / _ \ | '_ \ | | | | / _` | / _` || | | |
/ \_// | | | || || || | | || __/ /\_/ /| |_| || (_| || (_| || __/ | |_) || |_| | | (_| || (_| || |_| |
\___/ |_| |_||_||_||_| |_| \___| \___/ \__,_| \__,_| \__, | \___| |_.__/ \__, | \__, | \__,_| \__,_|
|___/ |___/ |_|
https://github.com/QingdaoU/OnlineJudge
"""

View File

@ -2,5 +2,3 @@
# please set your own SECRET_KEY to a long random string # please set your own SECRET_KEY to a long random string
# SECRET_KEY = "" # SECRET_KEY = ""

View File

@ -3,13 +3,13 @@
class DBRouter(object): class DBRouter(object):
def db_for_read(self, model, **hints): def db_for_read(self, model, **hints):
if model._meta.app_label == 'submission': if model._meta.app_label == "submission":
return 'submission' return "submission"
return "default" return "default"
def db_for_write(self, model, **hints): def db_for_write(self, model, **hints):
if model._meta.app_label == 'submission': if model._meta.app_label == "submission":
return 'submission' return "submission"
return "default" return "default"
def allow_relation(self, obj1, obj2, **hints): def allow_relation(self, obj1, obj2, **hints):

View File

@ -2,9 +2,9 @@
from django.conf.urls import include, url from django.conf.urls import include, url
urlpatterns = [ urlpatterns = [
url(r'^api/', include("account.urls.oj")), url(r"^api/", include("account.urls.oj")),
url(r'^api/admin/', include("account.urls.admin")), url(r"^api/admin/", include("account.urls.admin")),
url(r'^api/admin/', include("announcement.urls.admin")), url(r"^api/admin/", include("announcement.urls.admin")),
url(r'^api/', include("conf.urls.oj")), url(r"^api/", include("conf.urls.oj")),
url(r'^api/admin/', include("conf.urls.admin")) url(r"^api/admin/", include("conf.urls.admin"))
] ]

View File

@ -1,3 +0,0 @@
from django.contrib import admin
# Register your models here.

View File

@ -1,4 +1,3 @@
# coding=utf-8
from __future__ import unicode_literals from __future__ import unicode_literals
from jsonfield import JSONField from jsonfield import JSONField

View File

@ -1,3 +0,0 @@
from django.test import TestCase
# Create your tests here.

View File

@ -1,3 +0,0 @@
from django.shortcuts import render
# Create your views here.

View File

@ -1,2 +1,2 @@
from .api import * from .api import * # NOQA
from ._serializers import * from ._serializers import * # NOQA

View File

@ -18,4 +18,4 @@ class DateTimeTZField(serializers.DateTimeField):
class IDOnlySerializer(serializers.Serializer): class IDOnlySerializer(serializers.Serializer):
id = serializers.IntegerField() id = serializers.IntegerField()

View File

@ -30,4 +30,4 @@ class APITestCase(TestCase):
self.assertTrue(response.data["error"] is None) self.assertTrue(response.data["error"] is None)
def assertFailed(self, response): def assertFailed(self, response):
self.assertTrue(response.data["error"] is not None) self.assertTrue(response.data["error"] is not None)

View File

@ -1,5 +1,3 @@
# coding:utf-8
""" """
Copyright 2013 TY<tianyu0915@gmail.com> Copyright 2013 TY<tianyu0915@gmail.com>
@ -20,6 +18,7 @@ import os
import time import time
import random import random
from io import StringIO
from django.http import HttpResponse from django.http import HttpResponse
from PIL import Image, ImageDraw, ImageFont from PIL import Image, ImageDraw, ImageFont
@ -27,19 +26,19 @@ from PIL import Image, ImageDraw, ImageFont
class Captcha(object): class Captcha(object):
def __init__(self, request): def __init__(self, request):
""" """
初始化,设置各种属性 初始化,设置各种属性
""" """
self.django_request = request self.django_request = request
self.session_key = '_django_captcha_key' self.session_key = "_django_captcha_key"
self.captcha_expires_time = '_django_captcha_expires_time' self.captcha_expires_time = "_django_captcha_expires_time"
# 验证码图片尺寸 # 验证码图片尺寸
self.img_width = 90 self.img_width = 90
self.img_height = 30 self.img_height = 30
def _get_font_size(self, code): def _get_font_size(self, code):
""" """
将图片高度的80%作为字体大小 将图片高度的80%作为字体大小
""" """
s1 = int(self.img_height * 0.8) s1 = int(self.img_height * 0.8)
@ -47,7 +46,7 @@ class Captcha(object):
return int(min((s1, s2)) + max((s1, s2)) * 0.05) return int(min((s1, s2)) + max((s1, s2)) * 0.05)
def _set_answer(self, answer): def _set_answer(self, answer):
""" """
设置答案和过期时间 设置答案和过期时间
""" """
self.django_request.session[self.session_key] = str(answer) self.django_request.session[self.session_key] = str(answer)
@ -57,7 +56,7 @@ class Captcha(object):
""" """
生成随机数或随机字符串 生成随机数或随机字符串
""" """
string = random.sample('abcdefghkmnpqrstuvwxyzABCDEFGHGKMNOPQRSTUVWXYZ23456789', 4) string = random.sample("abcdefghkmnpqrstuvwxyzABCDEFGHGKMNOPQRSTUVWXYZ23456789", 4)
self._set_answer("".join(string)) self._set_answer("".join(string))
return string return string
@ -68,9 +67,9 @@ class Captcha(object):
background = (random.randrange(200, 255), random.randrange(200, 255), random.randrange(200, 255)) background = (random.randrange(200, 255), random.randrange(200, 255), random.randrange(200, 255))
code_color = (random.randrange(0, 50), random.randrange(0, 50), random.randrange(0, 50), 255) code_color = (random.randrange(0, 50), random.randrange(0, 50), random.randrange(0, 50), 255)
font_path = os.path.join(os.path.normpath(os.path.dirname(__file__)), 'timesbi.ttf') font_path = os.path.join(os.path.normpath(os.path.dirname(__file__)), "timesbi.ttf")
image = Image.new('RGB', (self.img_width, self.img_height), background) image = Image.new("RGB", (self.img_width, self.img_height), background)
code = self._make_code() code = self._make_code()
font_size = self._get_font_size(code) font_size = self._get_font_size(code)
draw = ImageDraw.Draw(image) draw = ImageDraw.Draw(image)
@ -82,22 +81,22 @@ class Captcha(object):
# 字符y坐标 # 字符y坐标
y = random.randrange(1, 7) y = random.randrange(1, 7)
# 随机字符大小 # 随机字符大小
font = ImageFont.truetype(font_path.replace('\\', '/'), font_size + random.randrange(-3, 7)) font = ImageFont.truetype(font_path.replace("\\", "/"), font_size + random.randrange(-3, 7))
draw.text((x, y), i, font=font, fill=code_color) draw.text((x, y), i, font=font, fill=code_color)
# 随机化字符之间的距离 字符粘连可以降低识别率 # 随机化字符之间的距离 字符粘连可以降低识别率
x += font_size * random.randrange(6, 8) / 10 x += font_size * random.randrange(6, 8) / 10
buf = StringIO.StringIO() buf = StringIO()
image.save(buf, 'gif') image.save(buf, "gif")
self.django_request.session[self.session_key] = "".join(code) self.django_request.session[self.session_key] = "".join(code)
return HttpResponse(buf.getvalue(), 'image/gif') return HttpResponse(buf.getvalue(), "image/gif")
def check(self, code): def check(self, code):
""" """
检查用户输入的验证码是否正确 检查用户输入的验证码是否正确
""" """
_code = self.django_request.session.get(self.session_key) or '' _code = self.django_request.session.get(self.session_key) or ""
if not _code: if not _code:
return False return False
expires_time = self.django_request.session.get(self.captcha_expires_time) or 0 expires_time = self.django_request.session.get(self.captcha_expires_time) or 0

View File

@ -1,5 +1,3 @@
# coding=utf-8
import json
from django.db import models from django.db import models
from utils.xss_filter import XssHtml from utils.xss_filter import XssHtml
@ -15,7 +13,3 @@ class RichTextField(models.TextField):
parser.feed(value) parser.feed(value)
parser.close() parser.close()
return parser.getHtml() return parser.getHtml()
class JsonField(models.TextField):
pass