From e4888417bfb23313618e4c65539debe5a833b880 Mon Sep 17 00:00:00 2001 From: virusdefender <1670873886@qq.com> Date: Mon, 9 Nov 2015 20:17:51 +0800 Subject: [PATCH 1/5] =?UTF-8?q?=E5=B0=86=E9=A6=96=E9=A1=B5=E9=A2=98?= =?UTF-8?q?=E7=9B=AE=E4=BF=AE=E6=94=B9=E4=B8=BA=E6=AF=8F=E9=A1=B540?= =?UTF-8?q?=E9=81=93?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- problem/views.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/problem/views.py b/problem/views.py index ba3b552..6e2d391 100644 --- a/problem/views.py +++ b/problem/views.py @@ -294,7 +294,7 @@ def problem_list_page(request, page=1): return error_page(request, u"标签不存在") problems = tag.problem_set.all().filter(visible=True) - paginator = Paginator(problems, 20) + paginator = Paginator(problems, 40) try: current_page = paginator.page(int(page)) except Exception: From f6b37fa42ae1b93df3924d6f09011c9564fb47d6 Mon Sep 17 00:00:00 2001 From: virusdefender <1670873886@qq.com> Date: Mon, 9 Nov 2015 21:11:39 +0800 Subject: [PATCH 2/5] =?UTF-8?q?=E5=A2=9E=E5=8A=A0=E4=BF=AE=E6=94=B9?= =?UTF-8?q?=E4=B8=AA=E4=BA=BA=E8=B5=84=E6=96=99=E7=9A=84=E5=8A=9F=E8=83=BD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- account/serializers.py | 12 ++++++- account/views.py | 30 +++++++++++++++--- oj/urls.py | 3 +- static/src/js/app/oj/account/settings.js | 40 ++++++++++++++++++++++++ static/src/js/build.js | 6 +++- static/src/js/config.js | 1 + template/src/oj/account/settings.html | 30 ++++++++++++------ template/src/oj_base.html | 3 +- 8 files changed, 107 insertions(+), 18 deletions(-) create mode 100644 static/src/js/app/oj/account/settings.js diff --git a/account/serializers.py b/account/serializers.py index 5004ee1..c2a9a1a 100644 --- a/account/serializers.py +++ b/account/serializers.py @@ -61,4 +61,14 @@ class ResetPasswordSerializer(serializers.Serializer): class SSOSerializer(serializers.Serializer): - token = serializers.CharField(max_length=40) \ No newline at end of file + token = serializers.CharField(max_length=40) + + +class EditUserProfileSerializer(serializers.Serializer): + avatar = serializers.CharField(max_length=50, required=False, default=None) + phone = serializers.CharField(min_length=11, max_length=11, required=False, allow_blank=True, default=None) + blog = serializers.URLField(required=False, allow_blank=True, default=None) + mood = serializers.CharField(max_length=60, required=False, allow_blank=True, default=None) + hduoj_username = serializers.CharField(max_length=30, required=False, allow_blank=True, default=None) + bestcoder_username = serializers.CharField(max_length=30, required=False, allow_blank=True, default=None) + codeforces_username = serializers.CharField(max_length=30, required=False, allow_blank=True, default=None) \ No newline at end of file diff --git a/account/views.py b/account/views.py index a8f3767..f675f0b 100644 --- a/account/views.py +++ b/account/views.py @@ -18,11 +18,11 @@ from mail.tasks import send_email from .decorators import login_required from .models import User, UserProfile -from .serializers import (UserLoginSerializer, UsernameCheckSerializer, - UserRegisterSerializer, UserChangePasswordSerializer, - EmailCheckSerializer, UserSerializer, EditUserSerializer, +from .serializers import (UserLoginSerializer, UserRegisterSerializer, + UserChangePasswordSerializer, + UserSerializer, EditUserSerializer, ApplyResetPasswordSerializer, ResetPasswordSerializer, - SSOSerializer) + SSOSerializer, EditUserProfileSerializer) from .decorators import super_admin_required @@ -300,6 +300,28 @@ def user_index_page(request, username): return render(request, "oj/account/user_index.html", {"user": user, "blog_link": blog_link}) +class UserProfileAPIView(APIView): + @login_required + def put(self, request): + serializer = EditUserProfileSerializer(data=request.data) + if serializer.is_valid(): + data = serializer.data + user_profile = request.user.userprofile + + if data["avatar"]: + user_profile.avatar = data["avatar"] + user_profile.mood = data["mood"] + user_profile.hduoj_username = data["hduoj_username"] + user_profile.bestcoder_username = data["bestcoder_username"] + user_profile.codeforces_username = data["codeforces_username"] + user_profile.blog = data["blog"] + + user_profile.save() + return success_response(u"修改成功") + else: + return serializer_invalid_response(serializer) + + class SSOAPIView(APIView): def post(self, request): serializer = SSOSerializer(data=request.data) diff --git a/oj/urls.py b/oj/urls.py index c4d2e09..6ba6b06 100644 --- a/oj/urls.py +++ b/oj/urls.py @@ -6,7 +6,7 @@ from django.views.generic import TemplateView from account.views import (UserLoginAPIView, UsernameCheckAPIView, UserRegisterAPIView, UserChangePasswordAPIView, EmailCheckAPIView, UserAdminAPIView, UserInfoAPIView, - ApplyResetPasswordAPIView, SSOAPIView) + ApplyResetPasswordAPIView, SSOAPIView, UserProfileAPIView) from announcement.views import AnnouncementAdminAPIView @@ -127,6 +127,7 @@ urlpatterns = [ url(r'^account/settings/$', TemplateView.as_view(template_name="oj/account/settings.html"), name="account_setting_page"), url(r'^account/settings/avatar/$', TemplateView.as_view(template_name="oj/account/avatar.html"), name="avatar_settings_page"), url(r'^account/sso/$', SSOAPIView.as_view(), name="sso_api"), + url('^api/account/userprofile/$', UserProfileAPIView.as_view(), name="userprofile_api"), ] diff --git a/static/src/js/app/oj/account/settings.js b/static/src/js/app/oj/account/settings.js new file mode 100644 index 0000000..0589440 --- /dev/null +++ b/static/src/js/app/oj/account/settings.js @@ -0,0 +1,40 @@ +require(["jquery", "bsAlert", "csrfToken", "validator"], function ($, bsAlert, csrfTokenHeader) { + $('form').validator().on('submit', function (e) { + if (!e.isDefaultPrevented()) { + var phone = $("#phone").val(); + var hduoj_username = $("#hduoj_username").val(); + var bestcoder_username = $("#bestcoder_username").val(); + var codeforces_username = $("#codeforces_username").val(); + var blog = $("#blog").val(); + var mood = $("#mood").val(); + + $.ajax({ + beforeSend: csrfTokenHeader, + url: "/api/account/userprofile/", + data: { + phone: phone, + hduoj_username: hduoj_username, + bestcoder_username: bestcoder_username, + codeforces_username: codeforces_username, + blog: blog, + mood: mood + }, + dataType: "json", + method: "put", + success: function (data) { + if (!data.code) { + bsAlert("修改成功"); + } + else{ + bsAlert(data.data); + } + }, + error: function () { + bsAlert("额 好像出错了,请刷新页面重试。如还有问题,请填写页面导航栏上的反馈。") + } + + }); + return false; + } + }); +}); \ No newline at end of file diff --git a/static/src/js/build.js b/static/src/js/build.js index 07a6c74..beb891e 100644 --- a/static/src/js/build.js +++ b/static/src/js/build.js @@ -75,6 +75,7 @@ groupDetail_20_pack: "app/admin/group/groupDetail", editContest_21_pack: "app/admin/contest/editContest", group_22_pack: "app/admin/group/group", + settings_23_pack: "app/oj/account/settings" }, shim: { avalon: { @@ -159,7 +160,10 @@ }, { name: "group_22_pack" - } + }, + { + name: "settings_23_pack" + }, ], optimizeCss: "standard", }) \ No newline at end of file diff --git a/static/src/js/config.js b/static/src/js/config.js index 603c4a2..e2856f6 100644 --- a/static/src/js/config.js +++ b/static/src/js/config.js @@ -77,6 +77,7 @@ var require = { groupDetail_20_pack: "app/admin/group/groupDetail", editContest_21_pack: "app/admin/contest/editContest", group_22_pack: "app/admin/group/group", + settings_23_pack: "app/oj/account/settings" }, shim: { avalon: { diff --git a/template/src/oj/account/settings.html b/template/src/oj/account/settings.html index ec645ab..a2efedc 100644 --- a/template/src/oj/account/settings.html +++ b/template/src/oj/account/settings.html @@ -34,36 +34,42 @@ value="{{ request.user.email }}" readonly>