提交 7794a0f8 编写于 作者: P Pzqqt

wuliu: Implement adding user

上级 2588f66e
......@@ -1270,6 +1270,28 @@ class ManageUsers(_FormBase):
"data-bootstrap-switch": "",
}
class UserForm(_ModelFormBase):
password_again = forms.CharField(label="再次输入密码", widget=forms.PasswordInput)
def __init__(self, *args, **kwargs):
super().__init__(*args, **kwargs)
self.fields["password"].widget.input_type = "password"
self.fields["enabled"].widget.attrs |= {
"data-on-text": "启用",
"data-off-text": "禁用",
"checked": "",
"data-bootstrap-switch": "",
}
self.fields["administrator"].widget.attrs |= {
"data-on-text": "属于",
"data-off-text": "不属于",
"data-bootstrap-switch": "",
}
class Meta:
model = User
fields = ["name", "password", "enabled", "administrator", "department"]
class ManageUserPermission(_FormBase):
user = forms.ModelChoiceField(User.objects.all(), required=False, label="用户")
permission = forms.ModelMultipleChoiceField(Permission.objects.all(), label="权限", required=False)
......
{% extends "wuliu/_layout.html" %}
{% load static %}
{% load wuliu_extras %}
{% block title %}添加用户{% endblock %}
{% block header_title %}添加用户{% endblock %}
{% block head_append_js %}
<script src="{% static 'AdminLTE-3.0.5/plugins/bootstrap-switch/js/bootstrap-switch.min.js' %}"></script>
{% endblock %}
{% block content %}
<form action="{% url 'wuliu:add_user' %}" id="form-add_user" class="form col-12" method="post">
{% csrf_token %}
<fieldset>
<div class="row align-items-end">
{% show_form_input_field form.name "用户名" "col-12 col-md-7" %}
{% show_form_input_field form.password "" "col-12 col-md-7 mb-1" %}
{% show_form_input_field form.password_again "" "col-12 col-md-7 mb-1" %}
<div class="col-12 col-md-5 align-self-end text-md">
<span id="password_again_note"></span>
</div>
<div class="col-12 d-flex flex-column flex-md-row">
<div class="mt-1">
{{ form.enabled }} <span class="mx-1">该用户,</span>
</div>
<div class="mt-1">
{{ form.administrator }} <span class="ml-1">管理员。</span>
</div>
</div>
{% show_form_input_field form.department "" "col-12 col-md-7" %}
</div>
</fieldset>
<button class="btn btn-primary mt-2" type="submit">保存</button>
</form>
<script>
$(document).ready(function() {
$("input[data-bootstrap-switch]").each(function() {
$(this).bootstrapSwitch();
});
let password_flag = false;
let jq_password = '#form-add_user [name="password"]';
let jq_password_again = '#form-add_user [name="password_again"]';
$(jq_password + ', ' + jq_password_again).change(function() {
let new_password = $(jq_password).val().trim();
let new_password_again = $(jq_password_again).val().trim();
if (new_password && new_password_again) {
if (new_password === new_password_again) {
$("#password_again_note").html('<i class="ri-checkbox-circle-fill"></i>').attr("class", "text-success");
password_flag = true;
} else {
$("#password_again_note").html('<i class="ri-close-circle-fill"></i> 两次输入的密码不一致!').attr("class", "text-danger");
password_flag = false;
}
} else {
$("#password_again_note").html("");
password_flag = false;
}
});
$("#form-add_user").submit(function(e) {
if (! password_flag)
e.preventDefault();
})
});
</script>
{% endblock %}
\ No newline at end of file
......@@ -14,9 +14,7 @@
<div class="row align-items-end">
{% show_form_input_field form.user "选择用户" "col-12 col-md-5 mb-1" %}
<div class="col-12 col-md-2">
{% comment "TODO: 实现添加用户的功能" %}
<a class="btn btn-primary mr-2" href="#" style="margin-bottom: 0.375rem;">添加用户</a>
{% endcomment %}
<a class="btn btn-primary mr-2" href="{% url 'wuliu:add_user' %}" style="margin-bottom: 0.375rem;">添加用户</a>
</div>
<div class="col-12 d-flex flex-column flex-md-row">
<div class="mt-1">
......
......@@ -18,6 +18,7 @@ urlpatterns = [
# 系统设置
path("settings/", include([
path("manage_users", views.manage_users, name="manage_users"),
path("add_user", views.add_user, name="add_user"),
path("manage_user_permission", views.manage_user_permission, name="manage_user_permission"),
path("batch_edit_user_permission", views.batch_edit_user_permission, name="batch_edit_user_permission"),
])),
......
......@@ -390,6 +390,44 @@ def manage_users(request):
messages.success(request, "用户 %s 编辑成功!" % user.name)
return redirect("wuliu:manage_users")
@check_administrator
def add_user(request):
if request.method == "GET":
return render(
request,
"wuliu/settings/user/add_user.html",
{"form": forms.UserForm()},
)
if request.method == "POST":
form = forms.UserForm(request.POST)
custom_error_messages = []
def _failed():
messages.error(
request,
mark_safe("<br>".join([
"提交失败!",
*["%s: %s" % (k, "".join(v)) for k, v in form.errors.items()],
*custom_error_messages,
])),
)
return redirect("wuliu:add_user")
if not form.is_valid():
return _failed()
form_cleaned_data = form.cleaned_data
# 不需要检查用户名是否已被占用, form.is_valid时就已经检查了
form.instance.password = make_password(form_cleaned_data["password"])
try:
with transaction.atomic():
new_user = form.save()
except Exception as e:
got_request_exception.send(None, request=request)
custom_error_messages.append(str(e))
return _failed()
messages.success(request, "用户 %s 新增成功!请为该用户分配权限。" % new_user.name)
return redirect("wuliu:manage_users")
@check_administrator
def manage_user_permission(request):
if request.method == "GET":
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册