This commit is contained in:
esp 2015-11-10 18:59:41 +08:00
commit 7116cec4d5
10 changed files with 111 additions and 20 deletions

View File

@ -62,3 +62,13 @@ class ResetPasswordSerializer(serializers.Serializer):
class SSOSerializer(serializers.Serializer):
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)

View File

@ -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)

View File

@ -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"),
]

View File

@ -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:

View File

@ -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;
}
});
});

View File

@ -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",
})

View File

@ -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: {

View File

@ -34,36 +34,43 @@
value="{{ request.user.email }}" readonly>
</div>
<div class="form-group col-md-6"><label>手机</label>
<input name="phone" type="text" class="form-control"
data-error="请填写手机号码" value="{{ request.user.phone }}">
<input name="phone" type="text" maxlength="11" id="phone"
class="form-control" value="{% if request.user.userprofile.phone %}{{ request.user.userprofile.phone }}{% endif %}">
</div>
<div class="help-block with-errors"></div>
</div>
<div class="row">
<div class="form-group col-md-6">
<label>hduoj 用户名</label>
<input name=hduoj" type="text" class="form-control"
value="{{ request.user.hduoj_username }}">
<input name=hduoj" type="text" class="form-control" id="hduoj_username"
value="{% if request.user.userprofile.hduoj_username %}{{ request.user.userprofile.hduoj_username }}{% endif %}">
<div class="help-block with-errors"></div>
</div>
<div class="form-group col-md-6">
<label>BestCoder 用户名</label>
<input name=bestcoder" type="text" class="form-control"
value="{{ request.user.bestcoder_username }}">
<input name=bestcoder" type="text" class="form-control" id="bestcoder_username"
value="{% if request.user.userprofile.bestcoder_username %}{{ request.user.userprofile.bestcoder_username }}{% endif %}">
<div class="help-block with-errors"></div>
</div>
<div class="form-group col-md-6">
<label>Codeforces 用户名</label>
<input name=codeforces" type="text" class="form-control"
value="{{ request.user.bestcoder_username }}">
<input name=codeforces" type="text" class="form-control" id="codeforces_username"
value="{% if request.user.userprofile.codeforces_username %}{{ request.user.userprofile.codeforces_username }}{% endif %}">
<div class="help-block with-errors"></div>
</div>
<div class="form-group col-md-12"><label>blog</label>
<input name=blog" type="url" class="form-control"
value="{{ request.user.blog }}">
<input name=blog" type="url" class="form-control" id="blog"
value="{% if request.user.userprofile.blog %}{{ request.user.userprofile.blog }}{% endif %}" data-error="请填写正确的网址">
<div class="help-block with-errors"></div>
</div>
<div class="form-group col-md-12"><label>签名</label>
<input name=mood" type="text" maxlength="60" class="form-control" id="mood"
value="{% if request.user.userprofile.mood %}{{ request.user.userprofile.mood }}{% endif %}" data-error="字数限制在30字以内">
<div class="help-block with-errors"></div>
</div>
@ -76,3 +83,7 @@
</div>
</div>
{% endblock %}
{% block js_block %}
<script src="/static/js/app/oj/account/settings.js"></script>
{% endblock %}

View File

@ -34,7 +34,7 @@
{% if user.userprofile.hduoj_username %}
<p class="list-group-item">
<img src="/static/img/oj_logo/hdu_logo.png" id="oj-logo">
<a href="http://bestcoder.hdu.edu.cn/rating.php?user={{ user.userprofile.hduoj_username }}" target="_blank">
<a href="http://acm.hdu.edu.cn/userstatus.php?user={{ user.userprofile.hduoj_username }}" target="_blank">
{{ user.userprofile.hduoj_username }}
</a>
</p>

View File

@ -61,9 +61,11 @@
<ul class="dropdown-menu">
{% if request.user.admin_type > 0 %}
<li><a href="/admin/">后台管理</a></li>
<li role="separator" class="divider"></li>
{% endif %}
<li><a href="/user/{{ request.user.username }}/">我的主页</a></li>
<li><a href="/submissions/">我的提交</a></li>
<li><a href="#">我的资料</a></li>
<li><a href="/account/settings/">设置</a></li>
<li role="separator" class="divider"></li>
<li><a href="/logout/">退出</a></li>
</ul>