diff --git a/account/serializers.py b/account/serializers.py index 5004ee1d..c2a9a1ad 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 a8f37673..f675f0bd 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 c4d2e09f..6ba6b060 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/problem/views.py b/problem/views.py index ba3b5522..6e2d391a 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: 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 00000000..0589440c --- /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 07a6c74a..beb891e0 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 603c4a24..e2856f65 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 ec645ab5..85d24ea9 100644 --- a/template/src/oj/account/settings.html +++ b/template/src/oj/account/settings.html @@ -34,36 +34,43 @@ value="{{ request.user.email }}" readonly>
- +
+
- +
- +
- +
- + + +
+
+
+
@@ -76,3 +83,7 @@
{% endblock %} + +{% block js_block %} + +{% endblock %} diff --git a/template/src/oj/account/user_index.html b/template/src/oj/account/user_index.html index 566a5f59..a829a25d 100644 --- a/template/src/oj/account/user_index.html +++ b/template/src/oj/account/user_index.html @@ -34,7 +34,7 @@ {% if user.userprofile.hduoj_username %}

- + {{ user.userprofile.hduoj_username }}

diff --git a/template/src/oj_base.html b/template/src/oj_base.html index 87497fc7..692bce1f 100644 --- a/template/src/oj_base.html +++ b/template/src/oj_base.html @@ -61,9 +61,11 @@