diff --git a/.flake8 b/.flake8
new file mode 100644
index 00000000..73f40c5c
--- /dev/null
+++ b/.flake8
@@ -0,0 +1,7 @@
+[flake8]
+exclude =
+ xss_filter.py,
+ migrations/,
+ *settings.py
+max-line-length = 180
+inline-quotes = "
diff --git a/.travis.yml b/.travis.yml
index cc7748e4..b41d54b1 100644
--- a/.travis.yml
+++ b/.travis.yml
@@ -9,4 +9,5 @@ install:
- python manage.py migrate
- python manage.py initadmin
script:
+ - flake8 .
- python manage.py test
diff --git a/account/decorators.py b/account/decorators.py
index c5da9215..baa7aad5 100644
--- a/account/decorators.py
+++ b/account/decorators.py
@@ -1,7 +1,6 @@
from __future__ import unicode_literals
import functools
-from django.http import HttpResponse
from django.utils.translation import ugettext as _
from utils.api import JSONResponse
diff --git a/account/middleware.py b/account/middleware.py
index d0927213..e494f1a0 100644
--- a/account/middleware.py
+++ b/account/middleware.py
@@ -23,4 +23,4 @@ class AdminRequiredMiddleware(object):
path = request.path_info
if path.startswith("/admin/") or path.startswith("/api/admin/"):
if not(request.user.is_authenticated() and request.user.is_admin()):
- return JSONResponse.response({"error": "login-required", "data": _("Please login in first")})
\ No newline at end of file
+ return JSONResponse.response({"error": "login-required", "data": _("Please login in first")})
diff --git a/account/urls/admin.py b/account/urls/admin.py
index 8f1b7f18..372ba244 100644
--- a/account/urls/admin.py
+++ b/account/urls/admin.py
@@ -3,5 +3,5 @@ from django.conf.urls import url
from ..views.admin import UserAdminAPI
urlpatterns = [
- url(r'^user$', UserAdminAPI.as_view(), name="user_admin_api"),
+ url(r"^user$", UserAdminAPI.as_view(), name="user_admin_api"),
]
diff --git a/account/urls/oj.py b/account/urls/oj.py
index e7badd92..bdcde3c5 100644
--- a/account/urls/oj.py
+++ b/account/urls/oj.py
@@ -3,7 +3,7 @@ from django.conf.urls import url
from ..views.oj import UserLoginAPI, UserRegisterAPI, UserChangePasswordAPI
urlpatterns = [
- url(r'^login$', UserLoginAPI.as_view(), name="user_login_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"^login$", UserLoginAPI.as_view(), name="user_login_api"),
+ url(r"^register$", UserRegisterAPI.as_view(), name="user_register_api"),
+ url(r"^change_password$", UserChangePasswordAPI.as_view(), name="user_change_password_api")
]
diff --git a/announcement/tests.py b/announcement/tests.py
index 03543065..adab067f 100644
--- a/announcement/tests.py
+++ b/announcement/tests.py
@@ -32,6 +32,6 @@ class AnnouncementAdminTest(APITestCase):
def test_delete_announcemen(self):
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.assertFalse(Announcement.objects.filter(id=id).exists())
diff --git a/announcement/urls/admin.py b/announcement/urls/admin.py
index c3e22033..fefc160d 100644
--- a/announcement/urls/admin.py
+++ b/announcement/urls/admin.py
@@ -3,5 +3,5 @@ from django.conf.urls import url
from ..views import AnnouncementAdminAPI
urlpatterns = [
- url(r'^announcement$', AnnouncementAdminAPI.as_view(), name="announcement_admin_api"),
+ url(r"^announcement$", AnnouncementAdminAPI.as_view(), name="announcement_admin_api"),
]
diff --git a/conf/serializers.py b/conf/serializers.py
index 37640b33..693c11ea 100644
--- a/conf/serializers.py
+++ b/conf/serializers.py
@@ -13,17 +13,17 @@ class EditSMTPConfigSerializer(serializers.Serializer):
class CreateSMTPConfigSerializer(EditSMTPConfigSerializer):
password = serializers.CharField(max_length=128)
-
+
class SMTPConfigSerializer(serializers.ModelSerializer):
class Meta:
model = SMTPConfig
exclude = ["id", "password"]
-
+
class TestSMTPConfigSerializer(serializers.Serializer):
email = serializers.EmailField()
-
+
class CreateEditWebsiteConfigSerializer(serializers.Serializer):
base_url = serializers.CharField(max_length=128)
@@ -56,4 +56,3 @@ class JudgeServerHeartbeatSerializer(serializers.Serializer):
cpu = serializers.FloatField(min_value=0, max_value=100)
action = serializers.ChoiceField(choices=("heartbeat", ))
service_url = serializers.CharField(max_length=128, required=False)
-
diff --git a/conf/tests.py b/conf/tests.py
index f6777716..647d9448 100644
--- a/conf/tests.py
+++ b/conf/tests.py
@@ -51,7 +51,7 @@ class SMTPConfigTest(APITestCase):
class WebsiteConfigAPITest(APITestCase):
def test_create_website_config(self):
- user = self.create_super_admin()
+ self.create_super_admin()
url = self.reverse("website_config_api")
data = {"base_url": "http://test.com", "name": "test name",
"name_shortcut": "test oj", "footer": "test",
@@ -60,7 +60,7 @@ class WebsiteConfigAPITest(APITestCase):
self.assertSuccess(resp)
def test_edit_website_config(self):
- user = self.create_super_admin()
+ self.create_super_admin()
url = self.reverse("website_config_api")
data = {"base_url": "http://test.com", "name": "test name",
"name_shortcut": "test oj", "footer": "test",
@@ -103,7 +103,7 @@ class JudgeServerHeartbeatest(APITestCase):
self.assertSuccess(resp)
server = JudgeServer.objects.first()
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):
service_url = "http://1.2.3.4:8000/api/judge"
diff --git a/conf/urls/admin.py b/conf/urls/admin.py
index 456e6c01..daecea22 100644
--- a/conf/urls/admin.py
+++ b/conf/urls/admin.py
@@ -3,7 +3,7 @@ from django.conf.urls import url
from ..views import WebsiteConfigAPI, SMTPAPI, JudgeServerAPI
urlpatterns = [
- url(r'^smtp$', SMTPAPI.as_view(), name="smtp_admin_api"),
- url(r'^website$', WebsiteConfigAPI.as_view(), name="website_config_api"),
- url(r'^judge_server', JudgeServerAPI.as_view(), name="judge_server_api")
+ url(r"^smtp$", SMTPAPI.as_view(), name="smtp_admin_api"),
+ url(r"^website$", WebsiteConfigAPI.as_view(), name="website_config_api"),
+ url(r"^judge_server", JudgeServerAPI.as_view(), name="judge_server_api")
]
diff --git a/conf/urls/oj.py b/conf/urls/oj.py
index 3e3c1962..47a8dd89 100644
--- a/conf/urls/oj.py
+++ b/conf/urls/oj.py
@@ -4,6 +4,6 @@ from ..views import WebsiteConfigAPI, JudgeServerHeartbeatAPI
urlpatterns = [
- 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"^website$", WebsiteConfigAPI.as_view(), name="website_info_api"),
+ url(r"^judge_server_heartbeat$", JudgeServerHeartbeatAPI.as_view(), name="judge_server_heartbeat_api")
]
diff --git a/conf/views.py b/conf/views.py
index 746fbfb2..5c6be3f0 100644
--- a/conf/views.py
+++ b/conf/views.py
@@ -49,8 +49,6 @@ class SMTPTestAPI(APIView):
@super_admin_required
@validate_serializer(TestSMTPConfigSerializer)
def post(self, request):
- email = request.data["email"]
- # todo: test send email
return self.success({"result": True})
@@ -111,7 +109,7 @@ class JudgeServerHeartbeatAPI(CSRFExemptAPIView):
server.cpu_core = data["cpu_core"]
server.memory_usage = data["memory"]
server.cpu_usage = data["cpu"]
- server.service_url= service_url
+ server.service_url = service_url
server.ip = ip
server.last_heartbeat = timezone.now()
server.save()
@@ -126,7 +124,3 @@ class JudgeServerHeartbeatAPI(CSRFExemptAPIView):
last_heartbeat=timezone.now(),
)
return self.success()
-
-
-
-
diff --git a/contest/admin.py b/contest/admin.py
deleted file mode 100644
index 8c38f3f3..00000000
--- a/contest/admin.py
+++ /dev/null
@@ -1,3 +0,0 @@
-from django.contrib import admin
-
-# Register your models here.
diff --git a/contest/models.py b/contest/models.py
index c7d3b4ab..b61bad0a 100644
--- a/contest/models.py
+++ b/contest/models.py
@@ -103,4 +103,4 @@ class OIContestRank(ContestRank):
submission_info = JSONField(default={})
class Meta:
- db_table = "oi_contenst_rank"
\ No newline at end of file
+ db_table = "oi_contenst_rank"
diff --git a/contest/tests.py b/contest/tests.py
index 7ce503c2..e69de29b 100644
--- a/contest/tests.py
+++ b/contest/tests.py
@@ -1,3 +0,0 @@
-from django.test import TestCase
-
-# Create your tests here.
diff --git a/contest/views.py b/contest/views.py
index 91ea44a2..e69de29b 100644
--- a/contest/views.py
+++ b/contest/views.py
@@ -1,3 +0,0 @@
-from django.shortcuts import render
-
-# Create your views here.
diff --git a/deploy/requirements.txt b/deploy/requirements.txt
index 39972325..47f3b9f2 100644
--- a/deploy/requirements.txt
+++ b/deploy/requirements.txt
@@ -3,3 +3,4 @@ djangorestframework==3.3.3
pillow
jsonfield
otpauth
+flake8-quotes
diff --git a/group/admin.py b/group/admin.py
deleted file mode 100644
index 8c38f3f3..00000000
--- a/group/admin.py
+++ /dev/null
@@ -1,3 +0,0 @@
-from django.contrib import admin
-
-# Register your models here.
diff --git a/group/apps.py b/group/apps.py
deleted file mode 100644
index d1471c0d..00000000
--- a/group/apps.py
+++ /dev/null
@@ -1,7 +0,0 @@
-from __future__ import unicode_literals
-
-from django.apps import AppConfig
-
-
-class GroupConfig(AppConfig):
- name = 'group'
diff --git a/group/tests.py b/group/tests.py
index 7ce503c2..e69de29b 100644
--- a/group/tests.py
+++ b/group/tests.py
@@ -1,3 +0,0 @@
-from django.test import TestCase
-
-# Create your tests here.
diff --git a/group/views.py b/group/views.py
index 91ea44a2..e69de29b 100644
--- a/group/views.py
+++ b/group/views.py
@@ -1,3 +0,0 @@
-from django.shortcuts import render
-
-# Create your views here.
diff --git a/oj/__init__.py b/oj/__init__.py
index c19c0794..e69de29b 100644
--- a/oj/__init__.py
+++ b/oj/__init__.py
@@ -1,9 +0,0 @@
-"""
- ___ _ _ __ _ _ _
- /___\ _ __ | |(_) _ __ ___ \ \ _ _ __| | __ _ ___ | |__ _ _ __ _ __| | _ _
- // //| '_ \ | || || '_ \ / _ \ \ \| | | | / _` | / _` | / _ \ | '_ \ | | | | / _` | / _` || | | |
-/ \_// | | | || || || | | || __/ /\_/ /| |_| || (_| || (_| || __/ | |_) || |_| | | (_| || (_| || |_| |
-\___/ |_| |_||_||_||_| |_| \___| \___/ \__,_| \__,_| \__, | \___| |_.__/ \__, | \__, | \__,_| \__,_|
- |___/ |___/ |_|
-https://github.com/QingdaoU/OnlineJudge
-"""
\ No newline at end of file
diff --git a/oj/custom_settings.example.py b/oj/custom_settings.example.py
index 89c8c0ec..5def48ed 100644
--- a/oj/custom_settings.example.py
+++ b/oj/custom_settings.example.py
@@ -2,5 +2,3 @@
# please set your own SECRET_KEY to a long random string
# SECRET_KEY = ""
-
-
diff --git a/oj/db_router.py b/oj/db_router.py
index 3a20427c..c264ba4f 100644
--- a/oj/db_router.py
+++ b/oj/db_router.py
@@ -3,13 +3,13 @@
class DBRouter(object):
def db_for_read(self, model, **hints):
- if model._meta.app_label == 'submission':
- return 'submission'
+ if model._meta.app_label == "submission":
+ return "submission"
return "default"
def db_for_write(self, model, **hints):
- if model._meta.app_label == 'submission':
- return 'submission'
+ if model._meta.app_label == "submission":
+ return "submission"
return "default"
def allow_relation(self, obj1, obj2, **hints):
diff --git a/oj/urls.py b/oj/urls.py
index 162e4392..dc3930ef 100644
--- a/oj/urls.py
+++ b/oj/urls.py
@@ -2,9 +2,9 @@
from django.conf.urls import include, url
urlpatterns = [
- url(r'^api/', include("account.urls.oj")),
- url(r'^api/admin/', include("account.urls.admin")),
- url(r'^api/admin/', include("announcement.urls.admin")),
- url(r'^api/', include("conf.urls.oj")),
- url(r'^api/admin/', include("conf.urls.admin"))
+ url(r"^api/", include("account.urls.oj")),
+ url(r"^api/admin/", include("account.urls.admin")),
+ url(r"^api/admin/", include("announcement.urls.admin")),
+ url(r"^api/", include("conf.urls.oj")),
+ url(r"^api/admin/", include("conf.urls.admin"))
]
diff --git a/problem/admin.py b/problem/admin.py
deleted file mode 100644
index 8c38f3f3..00000000
--- a/problem/admin.py
+++ /dev/null
@@ -1,3 +0,0 @@
-from django.contrib import admin
-
-# Register your models here.
diff --git a/problem/models.py b/problem/models.py
index 6cdbd615..97d623b9 100644
--- a/problem/models.py
+++ b/problem/models.py
@@ -1,4 +1,3 @@
-# coding=utf-8
from __future__ import unicode_literals
from jsonfield import JSONField
diff --git a/problem/tests.py b/problem/tests.py
index 7ce503c2..e69de29b 100644
--- a/problem/tests.py
+++ b/problem/tests.py
@@ -1,3 +0,0 @@
-from django.test import TestCase
-
-# Create your tests here.
diff --git a/problem/views.py b/problem/views.py
index 91ea44a2..e69de29b 100644
--- a/problem/views.py
+++ b/problem/views.py
@@ -1,3 +0,0 @@
-from django.shortcuts import render
-
-# Create your views here.
diff --git a/utils/api/__init__.py b/utils/api/__init__.py
index 0cf3185a..dedbe3a9 100644
--- a/utils/api/__init__.py
+++ b/utils/api/__init__.py
@@ -1,2 +1,2 @@
-from .api import *
-from ._serializers import *
\ No newline at end of file
+from .api import * # NOQA
+from ._serializers import * # NOQA
diff --git a/utils/api/_serializers.py b/utils/api/_serializers.py
index d0488901..3e887873 100644
--- a/utils/api/_serializers.py
+++ b/utils/api/_serializers.py
@@ -18,4 +18,4 @@ class DateTimeTZField(serializers.DateTimeField):
class IDOnlySerializer(serializers.Serializer):
- id = serializers.IntegerField()
\ No newline at end of file
+ id = serializers.IntegerField()
diff --git a/utils/api/tests.py b/utils/api/tests.py
index 5cf83c68..5ff30f85 100644
--- a/utils/api/tests.py
+++ b/utils/api/tests.py
@@ -30,4 +30,4 @@ class APITestCase(TestCase):
self.assertTrue(response.data["error"] is None)
def assertFailed(self, response):
- self.assertTrue(response.data["error"] is not None)
\ No newline at end of file
+ self.assertTrue(response.data["error"] is not None)
diff --git a/utils/captcha/__init__.py b/utils/captcha/__init__.py
index a05d237e..f1754a4f 100644
--- a/utils/captcha/__init__.py
+++ b/utils/captcha/__init__.py
@@ -1,5 +1,3 @@
-# coding:utf-8
-
"""
Copyright 2013 TY
@@ -20,6 +18,7 @@ import os
import time
import random
+from io import StringIO
from django.http import HttpResponse
from PIL import Image, ImageDraw, ImageFont
@@ -27,19 +26,19 @@ from PIL import Image, ImageDraw, ImageFont
class Captcha(object):
def __init__(self, request):
- """
+ """
初始化,设置各种属性
"""
self.django_request = request
- self.session_key = '_django_captcha_key'
- self.captcha_expires_time = '_django_captcha_expires_time'
+ self.session_key = "_django_captcha_key"
+ self.captcha_expires_time = "_django_captcha_expires_time"
# 验证码图片尺寸
self.img_width = 90
self.img_height = 30
def _get_font_size(self, code):
- """
+ """
将图片高度的80%作为字体大小
"""
s1 = int(self.img_height * 0.8)
@@ -47,7 +46,7 @@ class Captcha(object):
return int(min((s1, s2)) + max((s1, s2)) * 0.05)
def _set_answer(self, 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))
return string
@@ -68,9 +67,9 @@ class Captcha(object):
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)
- 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()
font_size = self._get_font_size(code)
draw = ImageDraw.Draw(image)
@@ -82,22 +81,22 @@ class Captcha(object):
# 字符y坐标
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)
# 随机化字符之间的距离 字符粘连可以降低识别率
x += font_size * random.randrange(6, 8) / 10
- buf = StringIO.StringIO()
- image.save(buf, 'gif')
+ buf = StringIO()
+ image.save(buf, "gif")
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):
"""
检查用户输入的验证码是否正确
"""
- _code = self.django_request.session.get(self.session_key) or ''
+ _code = self.django_request.session.get(self.session_key) or ""
if not _code:
return False
expires_time = self.django_request.session.get(self.captcha_expires_time) or 0
diff --git a/utils/models.py b/utils/models.py
index 5e229864..a3e15b06 100644
--- a/utils/models.py
+++ b/utils/models.py
@@ -1,5 +1,3 @@
-# coding=utf-8
-import json
from django.db import models
from utils.xss_filter import XssHtml
@@ -15,7 +13,3 @@ class RichTextField(models.TextField):
parser.feed(value)
parser.close()
return parser.getHtml()
-
-
-class JsonField(models.TextField):
- pass
\ No newline at end of file