From 5a73abc2e536cc49e953d4d432c9af7e966a59fd Mon Sep 17 00:00:00 2001
From: virusdefender <1670873886@qq.com>
Date: Sun, 8 Nov 2015 22:57:25 +0800
Subject: [PATCH 1/9] =?UTF-8?q?=E9=9A=90=E8=97=8F=E9=A2=98=E7=9B=AE?=
=?UTF-8?q?=E4=B8=8D=E6=98=BE=E7=A4=BA=E5=85=AC=E5=BC=80=E6=8C=89=E9=92=AE?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
---
template/src/admin/contest/contest_list.html | 148 -------------------
template/src/admin/contest/problem_list.html | 2 +-
2 files changed, 1 insertion(+), 149 deletions(-)
diff --git a/template/src/admin/contest/contest_list.html b/template/src/admin/contest/contest_list.html
index 829f6b2..1781eac 100644
--- a/template/src/admin/contest/contest_list.html
+++ b/template/src/admin/contest/contest_list.html
@@ -41,153 +41,5 @@
-
-
-
diff --git a/template/src/admin/contest/problem_list.html b/template/src/admin/contest/problem_list.html
index 0fb852a..a59bb6c 100644
--- a/template/src/admin/contest/problem_list.html
+++ b/template/src/admin/contest/problem_list.html
@@ -27,7 +27,7 @@
@@ -61,15 +63,17 @@
{{ user.create_time }}
+
+
{{ user.userprofile.accepted_number }}
AC
-
+
{{ user.userprofile.submissions_number }}
Submissions
From 7375fc4b3fd61b760e27cfdfe7d2b0a2f1bfd2e4 Mon Sep 17 00:00:00 2001
From: virusdefender <1670873886@qq.com>
Date: Sun, 8 Nov 2015 23:15:20 +0800
Subject: [PATCH 4/9] =?UTF-8?q?=E6=95=B4=E7=90=86=E6=A0=BC=E5=BC=8F?=
=?UTF-8?q?=EF=BC=9B=E4=BF=AE=E6=94=B9=E9=83=A8=E5=88=86=E6=A0=B7=E5=BC=8F?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
---
template/src/oj/account/settings.html | 115 +++++++++++++-------------
1 file changed, 57 insertions(+), 58 deletions(-)
diff --git a/template/src/oj/account/settings.html b/template/src/oj/account/settings.html
index 6f88512..ec645ab 100644
--- a/template/src/oj/account/settings.html
+++ b/template/src/oj/account/settings.html
@@ -13,67 +13,66 @@
修改密码
-
-

-
-
{% endblock %}
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 5/9] =?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 6/9] =?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>