diff --git a/apps/users/serializers/v1.py b/apps/users/serializers/v1.py
index 63fe52699..864618823 100644
--- a/apps/users/serializers/v1.py
+++ b/apps/users/serializers/v1.py
@@ -36,7 +36,7 @@ class UserSerializer(BulkSerializerMixin, serializers.ModelSerializer):
'date_password_last_updated', 'date_expired', 'avatar_url',
]
extra_kwargs = {
- 'password': {'write_only': True, 'required': False},
+ 'password': {'write_only': True, 'required': False, 'allow_null': True, 'allow_blank': True},
'public_key': {'write_only': True},
'groups_display': {'label': _('Groups name')},
'source_display': {'label': _('Source name')},
@@ -56,13 +56,17 @@ class UserSerializer(BulkSerializerMixin, serializers.ModelSerializer):
raise serializers.ValidationError(msg)
return value
- @staticmethod
- def validate_password(value):
+ def validate_password(self, password):
from ..utils import check_password_rules
- if not check_password_rules(value):
+ password_strategy = self.initial_data.get('password_strategy')
+ if password_strategy == '0':
+ return
+ if password_strategy is None and not password:
+ return
+ if not check_password_rules(password):
msg = _('Password does not match security rules')
raise serializers.ValidationError(msg)
- return value
+ return password
@staticmethod
def change_password_to_raw(validated_data):
diff --git a/apps/users/templates/users/user_create.html b/apps/users/templates/users/user_create.html
index 13bb26cbc..5e15b5469 100644
--- a/apps/users/templates/users/user_create.html
+++ b/apps/users/templates/users/user_create.html
@@ -4,9 +4,7 @@
{% block user_template_title %}{% trans "Create user" %}{% endblock %}
{% block password %}
{% bootstrap_field form.password_strategy layout="horizontal" %}
-
- {% bootstrap_field form.password layout="horizontal" %}
-
+ {% bootstrap_field form.password layout="horizontal" %}
{# 密码popover #}
@@ -29,7 +27,7 @@ function passwordCheck() {
progress = $('#id_progress'),
password_check_rules = {{ password_check_rules|safe }},
minLength = 6,
- top = idPassword.offset().top - $('.navbar').outerHeight(true) - $('.page-heading').outerHeight(true) - 10 + 34,
+ top = idPassword.offset().top - $('.navbar').outerHeight(true) - $('.page-heading').outerHeight(true) -77 + 34,
left = 377,
i18n_fallback = {
"veryWeak": "{% trans 'Very weak' %}",
@@ -67,9 +65,9 @@ var password_strategy_radio_input = 'input[type=radio][name=password_strategy]';
function passwordStrategyFieldsDisplay(){
var val = $('input:radio[name="password_strategy"]:checked').val();
if(val === '0'){
- $('#custom_password').addClass('hidden')
+ $('#id_password').parents('.form-group').addClass('hidden')
}else {
- $('#custom_password').removeClass('hidden')
+ $('#id_password').parents('.form-group').removeClass('hidden')
}
}
$(document).ready(function () {
@@ -78,7 +76,25 @@ $(document).ready(function () {
}).on('change', password_strategy_radio_input, function(){
passwordStrategyFieldsDisplay()
- })
+})
+.on("submit", "form", function (evt) {
+ evt.preventDefault();
+ var the_url = '{% url 'api-users:user-list' %}';
+ var redirect_to = '{% url "users:user-list" %}';
+ var method = "POST";
+ var form = $("form");
+ var data = form.serializeObject();
+ objectAttrsIsList(data, ['groups']);
+ objectAttrsIsDatetime(data,['date_expired']);
+ var props = {
+ url: the_url,
+ data: data,
+ method: method,
+ form: form,
+ redirect_to: redirect_to
+ };
+ formSubmit(props);
+})
{% endblock %}
diff --git a/apps/users/templates/users/user_update.html b/apps/users/templates/users/user_update.html
index cc4855e1f..67c7c155c 100644
--- a/apps/users/templates/users/user_update.html
+++ b/apps/users/templates/users/user_update.html
@@ -29,58 +29,76 @@
{% block custom_foot_js %}
{{ block.super }}
{% endblock %}