bug fixes
This commit is contained in:
@@ -1,10 +1,5 @@
|
||||
import time
|
||||
import pytz
|
||||
|
||||
from django.contrib import auth
|
||||
from django.utils import timezone
|
||||
from django.utils.translation import ugettext as _
|
||||
from django.db import connection
|
||||
from django.utils.timezone import now
|
||||
from django.utils.deprecation import MiddlewareMixin
|
||||
|
||||
from utils.api import JSONResponse
|
||||
@@ -14,14 +9,11 @@ class SessionRecordMiddleware(MiddlewareMixin):
|
||||
def process_request(self, request):
|
||||
if request.user.is_authenticated():
|
||||
session = request.session
|
||||
ip = request.META.get("HTTP_X_REAL_IP", "UNKNOWN IP")
|
||||
user_agent = request.META.get("HTTP_USER_AGENT", "")
|
||||
_ip = session.setdefault("ip", ip)
|
||||
_user_agent = session.setdefault("user_agent", user_agent)
|
||||
if ip != _ip or user_agent != _user_agent:
|
||||
session.modified = True
|
||||
session["user_agent"] = request.META.get("HTTP_USER_AGENT", "")
|
||||
session["ip"] = request.META.get("HTTP_X_REAL_IP", "UNKNOWN IP")
|
||||
session["last_activity"] = now()
|
||||
user_sessions = request.user.session_keys
|
||||
if request.session.session_key not in user_sessions:
|
||||
if session.session_key not in user_sessions:
|
||||
user_sessions.append(session.session_key)
|
||||
request.user.save()
|
||||
|
||||
|
||||
@@ -50,7 +50,7 @@ class Migration(migrations.Migration):
|
||||
fields=[
|
||||
('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
|
||||
('problems_status', jsonfield.fields.JSONField(default={})),
|
||||
('avatar', models.CharField(default=account.models._default_avatar, max_length=50)),
|
||||
('avatar', models.CharField(default="default.png", max_length=50)),
|
||||
('blog', models.URLField(blank=True, null=True)),
|
||||
('mood', models.CharField(blank=True, max_length=200, null=True)),
|
||||
('accepted_problem_number', models.IntegerField(default=0)),
|
||||
|
||||
@@ -72,7 +72,7 @@ class UserProfile(models.Model):
|
||||
oi_problems_status = JSONField(default={})
|
||||
|
||||
real_name = models.CharField(max_length=32, blank=True, null=True)
|
||||
avatar = models.CharField(max_length=256, default=f"{settings.IMAGE_UPLOAD_DIR}/default.png")
|
||||
avatar = models.CharField(max_length=256, default=f"/{settings.IMAGE_UPLOAD_DIR}/default.png")
|
||||
blog = models.URLField(blank=True, null=True)
|
||||
mood = models.CharField(max_length=256, blank=True, null=True)
|
||||
github = models.CharField(max_length=64, blank=True, null=True)
|
||||
|
||||
@@ -26,7 +26,6 @@ class UserRegisterSerializer(serializers.Serializer):
|
||||
class UserChangePasswordSerializer(serializers.Serializer):
|
||||
old_password = serializers.CharField()
|
||||
new_password = serializers.CharField(min_length=6)
|
||||
captcha = serializers.CharField()
|
||||
|
||||
|
||||
class UserSerializer(serializers.ModelSerializer):
|
||||
@@ -46,6 +45,7 @@ class UserProfileSerializer(serializers.ModelSerializer):
|
||||
|
||||
class Meta:
|
||||
model = UserProfile
|
||||
fields = "__all__"
|
||||
|
||||
|
||||
class UserInfoSerializer(serializers.ModelSerializer):
|
||||
|
||||
@@ -8,11 +8,9 @@ from otpauth import OtpAuth
|
||||
|
||||
from utils.api.tests import APIClient, APITestCase
|
||||
from utils.shortcuts import rand_str
|
||||
from utils.cache import default_cache
|
||||
from utils.constants import CacheKey
|
||||
from options.options import SysOptions
|
||||
|
||||
from .models import AdminType, ProblemPermission, User
|
||||
from conf.models import WebsiteConfig
|
||||
|
||||
|
||||
class PermissionDecoratorTest(APITestCase):
|
||||
@@ -157,13 +155,9 @@ class UserRegisterAPITest(CaptchaTest):
|
||||
self.data = {"username": "test_user", "password": "testuserpassword",
|
||||
"real_name": "real_name", "email": "test@qduoj.com",
|
||||
"captcha": self._set_captcha(self.client.session)}
|
||||
# clea cache in redis
|
||||
default_cache.delete(CacheKey.website_config)
|
||||
|
||||
def test_website_config_limit(self):
|
||||
website = WebsiteConfig.objects.create()
|
||||
website.allow_register = False
|
||||
website.save()
|
||||
SysOptions.allow_register = False
|
||||
resp = self.client.post(self.register_url, data=self.data)
|
||||
self.assertDictEqual(resp.data, {"error": "error", "data": "Register have been disabled by admin"})
|
||||
|
||||
@@ -247,7 +241,6 @@ class TwoFactorAuthAPITest(APITestCase):
|
||||
def setUp(self):
|
||||
self.url = self.reverse("two_factor_auth_api")
|
||||
self.create_user("test", "test123")
|
||||
self.create_website_config()
|
||||
|
||||
def _get_tfa_code(self):
|
||||
user = User.objects.first()
|
||||
@@ -295,7 +288,6 @@ class ApplyResetPasswordAPITest(CaptchaTest):
|
||||
user.email = "test@oj.com"
|
||||
user.save()
|
||||
self.url = self.reverse("apply_reset_password_api")
|
||||
self.create_website_config()
|
||||
self.data = {"email": "test@oj.com", "captcha": self._set_captcha(self.client.session)}
|
||||
|
||||
def _refresh_captcha(self):
|
||||
|
||||
@@ -3,7 +3,7 @@ from django.conf.urls import url
|
||||
from ..views.oj import (ApplyResetPasswordAPI, ResetPasswordAPI,
|
||||
UserChangePasswordAPI, UserRegisterAPI,
|
||||
UserLoginAPI, UserLogoutAPI, UsernameOrEmailCheck,
|
||||
SSOAPI, AvatarUploadAPI, TwoFactorAuthAPI, UserProfileAPI,
|
||||
AvatarUploadAPI, TwoFactorAuthAPI, UserProfileAPI,
|
||||
UserRankAPI, CheckTFARequiredAPI, SessionManagementAPI)
|
||||
|
||||
from utils.captcha.views import CaptchaAPIView
|
||||
|
||||
@@ -1,5 +1,4 @@
|
||||
import os
|
||||
import pickle
|
||||
from datetime import timedelta
|
||||
from importlib import import_module
|
||||
|
||||
@@ -16,15 +15,14 @@ from utils.constants import ContestRuleType
|
||||
from options.options import SysOptions
|
||||
from utils.api import APIView, validate_serializer
|
||||
from utils.captcha import Captcha
|
||||
from utils.shortcuts import rand_str, img2base64, timestamp2utcstr
|
||||
from utils.shortcuts import rand_str, img2base64, datetime2str
|
||||
from ..decorators import login_required
|
||||
from ..models import User, UserProfile
|
||||
from ..serializers import (ApplyResetPasswordSerializer, ResetPasswordSerializer,
|
||||
UserChangePasswordSerializer, UserLoginSerializer,
|
||||
UserRegisterSerializer, UsernameOrEmailCheckSerializer,
|
||||
RankInfoSerializer)
|
||||
from ..serializers import (SSOSerializer, TwoFactorAuthCodeSerializer,
|
||||
UserProfileSerializer,
|
||||
from ..serializers import (TwoFactorAuthCodeSerializer, UserProfileSerializer,
|
||||
EditUserProfileSerializer, AvatarUploadForm)
|
||||
from ..tasks import send_email_async
|
||||
|
||||
@@ -81,7 +79,7 @@ class AvatarUploadAPI(APIView):
|
||||
img.write(chunk)
|
||||
user_profile = request.user.userprofile
|
||||
|
||||
user_profile.avatar = f"{settings.IMAGE_UPLOAD_DIR}/{name}"
|
||||
user_profile.avatar = f"/{settings.IMAGE_UPLOAD_DIR}/{name}"
|
||||
user_profile.save()
|
||||
return self.success("Succeeded")
|
||||
|
||||
@@ -327,7 +325,7 @@ class SessionManagementAPI(APIView):
|
||||
s["current_session"] = True
|
||||
s["ip"] = session["ip"]
|
||||
s["user_agent"] = session["user_agent"]
|
||||
s["last_activity"] = timestamp2utcstr(session["last_activity"])
|
||||
s["last_activity"] = datetime2str(session["last_activity"])
|
||||
s["session_key"] = key
|
||||
result.append(s)
|
||||
if modified:
|
||||
|
||||
Reference in New Issue
Block a user