mirror of
https://github.com/QingdaoU/OnlineJudge.git
synced 2024-09-21 16:33:22 +00:00
Merge branch 'virusdefender-dev' of https://git.coding.net/virusdefender/qduoj
This commit is contained in:
commit
7116cec4d5
@ -61,4 +61,14 @@ class ResetPasswordSerializer(serializers.Serializer):
|
||||
|
||||
|
||||
class SSOSerializer(serializers.Serializer):
|
||||
token = serializers.CharField(max_length=40)
|
||||
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)
|
@ -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)
|
||||
|
@ -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"),
|
||||
]
|
||||
|
||||
|
||||
|
@ -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:
|
||||
|
40
static/src/js/app/oj/account/settings.js
Normal file
40
static/src/js/app/oj/account/settings.js
Normal 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;
|
||||
}
|
||||
});
|
||||
});
|
@ -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",
|
||||
})
|
@ -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: {
|
||||
|
@ -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 %}
|
||||
|
@ -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>
|
||||
|
@ -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>
|
||||
|
Loading…
Reference in New Issue
Block a user