mirror of https://github.com/jumpserver/jumpserver
Bugfix (#2350)
* [Update] 权限页面增加过滤规则 * [Update] 修改terminal注册,更新以后使用api完成 * [Update] 修改terminal注册,更新以后使用api完成 * [Update] 修改更新注册逻辑pull/2357/head
parent
176052e8e9
commit
2a0e68c58f
Binary file not shown.
|
@ -8,7 +8,7 @@ msgid ""
|
|||
msgstr ""
|
||||
"Project-Id-Version: Jumpserver 0.3.3\n"
|
||||
"Report-Msgid-Bugs-To: \n"
|
||||
"POT-Creation-Date: 2019-01-15 17:56+0800\n"
|
||||
"POT-Creation-Date: 2019-01-16 17:58+0800\n"
|
||||
"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
|
||||
"Last-Translator: ibuler <ibuler@qq.com>\n"
|
||||
"Language-Team: Jumpserver team<ibuler@qq.com>\n"
|
||||
|
@ -67,8 +67,8 @@ msgstr "网域"
|
|||
#: assets/templates/assets/asset_update.html:35 perms/forms.py:45
|
||||
#: perms/forms.py:52 perms/models.py:85
|
||||
#: perms/templates/perms/asset_permission_list.html:57
|
||||
#: perms/templates/perms/asset_permission_list.html:77
|
||||
#: perms/templates/perms/asset_permission_list.html:126
|
||||
#: perms/templates/perms/asset_permission_list.html:78
|
||||
#: perms/templates/perms/asset_permission_list.html:128
|
||||
#: xpack/plugins/cloud/models.py:123
|
||||
#: xpack/plugins/cloud/templates/cloud/sync_instance_task_detail.html:63
|
||||
#: xpack/plugins/cloud/templates/cloud/sync_instance_task_instance.html:66
|
||||
|
@ -119,7 +119,7 @@ msgstr "端口"
|
|||
#: perms/models.py:31
|
||||
#: perms/templates/perms/asset_permission_create_update.html:45
|
||||
#: perms/templates/perms/asset_permission_list.html:56
|
||||
#: perms/templates/perms/asset_permission_list.html:123
|
||||
#: perms/templates/perms/asset_permission_list.html:125
|
||||
#: terminal/backends/command/models.py:13 terminal/models.py:143
|
||||
#: terminal/templates/terminal/command_list.html:40
|
||||
#: terminal/templates/terminal/command_list.html:73
|
||||
|
@ -185,7 +185,7 @@ msgstr "名称"
|
|||
#: assets/templates/assets/system_user_detail.html:62
|
||||
#: assets/templates/assets/system_user_list.html:30
|
||||
#: audits/templates/audits/login_log_list.html:49
|
||||
#: perms/templates/perms/asset_permission_list.html:76
|
||||
#: perms/templates/perms/asset_permission_list.html:74
|
||||
#: perms/templates/perms/asset_permission_user.html:55 users/forms.py:15
|
||||
#: users/forms.py:33 users/models/authentication.py:77 users/models/user.py:53
|
||||
#: users/templates/users/_select_user_modal.html:14
|
||||
|
@ -277,7 +277,7 @@ msgstr "IP"
|
|||
#: assets/templates/assets/user_asset_list.html:45
|
||||
#: assets/templates/assets/user_asset_list.html:150 common/forms.py:130
|
||||
#: perms/templates/perms/asset_permission_asset.html:54
|
||||
#: perms/templates/perms/asset_permission_list.html:75
|
||||
#: perms/templates/perms/asset_permission_list.html:77
|
||||
#: users/templates/users/user_granted_asset.html:44
|
||||
#: users/templates/users/user_group_granted_asset.html:44
|
||||
msgid "Hostname"
|
||||
|
@ -637,7 +637,7 @@ msgstr "默认资产组"
|
|||
#: perms/models.py:29
|
||||
#: perms/templates/perms/asset_permission_create_update.html:41
|
||||
#: perms/templates/perms/asset_permission_list.html:54
|
||||
#: perms/templates/perms/asset_permission_list.html:117 templates/index.html:87
|
||||
#: perms/templates/perms/asset_permission_list.html:119 templates/index.html:87
|
||||
#: terminal/backends/command/models.py:12 terminal/models.py:142
|
||||
#: terminal/templates/terminal/command_list.html:32
|
||||
#: terminal/templates/terminal/command_list.html:72
|
||||
|
@ -724,7 +724,8 @@ msgstr "登录模式"
|
|||
#: perms/models.py:33 perms/models.py:87
|
||||
#: perms/templates/perms/asset_permission_detail.html:140
|
||||
#: perms/templates/perms/asset_permission_list.html:58
|
||||
#: perms/templates/perms/asset_permission_list.html:129 templates/_nav.html:25
|
||||
#: perms/templates/perms/asset_permission_list.html:79
|
||||
#: perms/templates/perms/asset_permission_list.html:131 templates/_nav.html:25
|
||||
#: terminal/backends/command/models.py:14 terminal/models.py:144
|
||||
#: terminal/templates/terminal/command_list.html:48
|
||||
#: terminal/templates/terminal/command_list.html:74
|
||||
|
@ -884,7 +885,7 @@ msgstr "自动生成密钥"
|
|||
#: assets/templates/assets/asset_update.html:64
|
||||
#: assets/templates/assets/gateway_create_update.html:53
|
||||
#: perms/templates/perms/asset_permission_create_update.html:50
|
||||
#: terminal/templates/terminal/terminal_update.html:42
|
||||
#: terminal/templates/terminal/terminal_update.html:40
|
||||
msgid "Other"
|
||||
msgstr "其它"
|
||||
|
||||
|
@ -906,7 +907,7 @@ msgstr "其它"
|
|||
#: common/templates/common/security_setting.html:70
|
||||
#: common/templates/common/terminal_setting.html:68
|
||||
#: perms/templates/perms/asset_permission_create_update.html:80
|
||||
#: terminal/templates/terminal/terminal_update.html:47
|
||||
#: terminal/templates/terminal/terminal_update.html:45
|
||||
#: users/templates/users/_user.html:50
|
||||
#: users/templates/users/user_bulk_update.html:23
|
||||
#: users/templates/users/user_detail.html:176
|
||||
|
@ -941,7 +942,7 @@ msgstr "重置"
|
|||
#: perms/templates/perms/asset_permission_create_update.html:81
|
||||
#: terminal/templates/terminal/command_list.html:103
|
||||
#: terminal/templates/terminal/session_list.html:127
|
||||
#: terminal/templates/terminal/terminal_update.html:48
|
||||
#: terminal/templates/terminal/terminal_update.html:46
|
||||
#: users/templates/users/_user.html:51
|
||||
#: users/templates/users/forgot_password.html:45
|
||||
#: users/templates/users/user_bulk_update.html:24
|
||||
|
@ -1025,7 +1026,7 @@ msgstr "测试"
|
|||
#: assets/templates/assets/system_user_detail.html:26
|
||||
#: assets/templates/assets/system_user_list.html:92 audits/models.py:32
|
||||
#: perms/templates/perms/asset_permission_detail.html:30
|
||||
#: perms/templates/perms/asset_permission_list.html:175
|
||||
#: perms/templates/perms/asset_permission_list.html:177
|
||||
#: terminal/templates/terminal/terminal_detail.html:16
|
||||
#: terminal/templates/terminal/terminal_list.html:71
|
||||
#: users/templates/users/user_detail.html:25
|
||||
|
@ -1060,7 +1061,7 @@ msgstr "更新"
|
|||
#: common/templates/common/terminal_setting.html:112
|
||||
#: ops/templates/ops/task_list.html:72
|
||||
#: perms/templates/perms/asset_permission_detail.html:34
|
||||
#: perms/templates/perms/asset_permission_list.html:176
|
||||
#: perms/templates/perms/asset_permission_list.html:178
|
||||
#: terminal/templates/terminal/terminal_list.html:73
|
||||
#: users/templates/users/user_detail.html:30
|
||||
#: users/templates/users/user_group_detail.html:32
|
||||
|
@ -1173,7 +1174,6 @@ msgstr "快速修改"
|
|||
#: perms/models.py:88
|
||||
#: perms/templates/perms/asset_permission_create_update.html:52
|
||||
#: perms/templates/perms/asset_permission_detail.html:120
|
||||
#: perms/templates/perms/asset_permission_list.html:73
|
||||
#: terminal/templates/terminal/terminal_list.html:34
|
||||
#: users/templates/users/_select_user_modal.html:18
|
||||
#: users/templates/users/user_detail.html:144
|
||||
|
@ -2572,7 +2572,8 @@ msgstr "组织管理"
|
|||
|
||||
#: perms/forms.py:39 perms/models.py:30 perms/models.py:86
|
||||
#: perms/templates/perms/asset_permission_list.html:55
|
||||
#: perms/templates/perms/asset_permission_list.html:120 templates/_nav.html:14
|
||||
#: perms/templates/perms/asset_permission_list.html:75
|
||||
#: perms/templates/perms/asset_permission_list.html:122 templates/_nav.html:14
|
||||
#: users/forms.py:273 users/models/group.py:26 users/models/user.py:61
|
||||
#: users/templates/users/_select_user_modal.html:16
|
||||
#: users/templates/users/user_detail.html:213
|
||||
|
@ -2658,6 +2659,7 @@ msgid "Create permission"
|
|||
msgstr "创建授权规则"
|
||||
|
||||
#: perms/templates/perms/asset_permission_list.html:59
|
||||
#: perms/templates/perms/asset_permission_list.html:73
|
||||
#: users/templates/users/user_list.html:28 xpack/plugins/cloud/models.py:53
|
||||
#: xpack/plugins/cloud/templates/cloud/account_detail.html:60
|
||||
#: xpack/plugins/cloud/templates/cloud/account_list.html:14
|
||||
|
@ -3545,6 +3547,10 @@ msgstr "用户认证源来自 {}, 请去相应系统修改密码"
|
|||
msgid "Administrator is the super user of system"
|
||||
msgstr "Administrator是初始的超级管理员"
|
||||
|
||||
#: users/serializers/v2.py:40
|
||||
msgid "name not unique"
|
||||
msgstr "名称重复"
|
||||
|
||||
#: users/templates/users/_base_otp.html:27
|
||||
msgid "Home page"
|
||||
msgstr "首页"
|
||||
|
|
|
@ -161,6 +161,87 @@ function activeNav() {
|
|||
}
|
||||
}
|
||||
|
||||
function formSubmit(props) {
|
||||
/*
|
||||
{
|
||||
"form": $("form"),
|
||||
"url": "",
|
||||
"method": "POST",
|
||||
"redirect_to": "",
|
||||
"success": function(data, textStatue, jqXHR){},
|
||||
"error": function(jqXHR, textStatus, errorThrown) {}
|
||||
}
|
||||
*/
|
||||
props = props || {};
|
||||
var data = props.data || props.form.serializeObject();
|
||||
var redirect_to = props.redirect_to;
|
||||
$.ajax({
|
||||
url: props.url,
|
||||
type: props.method || 'POST',
|
||||
data: JSON.stringify(data),
|
||||
contentType: props.content_type || "application/json; charset=utf-8",
|
||||
dataType: props.data_type || "json"
|
||||
}).done(function (data, textState, jqXHR) {
|
||||
if (redirect_to) {
|
||||
location.href = redirect_to;
|
||||
} else if (typeof props.success === 'function') {
|
||||
return props.success(data, textState, jqXHR);
|
||||
}
|
||||
}).fail(function(jqXHR, textStatus, errorThrown) {
|
||||
if (typeof props.error === 'function') {
|
||||
return props.error(jqXHR, textStatus, errorThrown)
|
||||
}
|
||||
if (!props.form) {
|
||||
alert(jqXHR.responseText);
|
||||
return
|
||||
}
|
||||
if (jqXHR.status === 400) {
|
||||
var errors = jqXHR.responseJSON;
|
||||
var noneFieldErrorRef = props.form.children('.alert-danger');
|
||||
if (noneFieldErrorRef.length !== 1) {
|
||||
props.form.prepend('<div class="alert alert-danger" style="display: none"></div>');
|
||||
noneFieldErrorRef = props.form.children('.alert-danger');
|
||||
}
|
||||
var noneFieldErrorMsg = "";
|
||||
noneFieldErrorRef.css("display", "none");
|
||||
noneFieldErrorRef.html("");
|
||||
props.form.find(".help-block.error").html("");
|
||||
props.form.find(".form-group.has-error").removeClass("has-error");
|
||||
|
||||
if (typeof errors !== "object") {
|
||||
noneFieldErrorMsg = errors;
|
||||
if (noneFieldErrorRef.length === 1) {
|
||||
noneFieldErrorRef.css('display', 'block');
|
||||
noneFieldErrorRef.html(noneFieldErrorMsg);
|
||||
}
|
||||
return
|
||||
}
|
||||
$.each(errors, function (k, v) {
|
||||
var fieldRef = props.form.find('input[name="' + k + '"]');
|
||||
var formGroupRef = fieldRef.parents('.form-group');
|
||||
var parentRef = fieldRef.parent();
|
||||
var helpBlockRef = parentRef.children('.help-block.error');
|
||||
if (helpBlockRef.length === 0) {
|
||||
parentRef.append('<div class="help-block error"></div>');
|
||||
helpBlockRef = parentRef.children('.help-block.error');
|
||||
}
|
||||
if (fieldRef.length === 1 && formGroupRef.length === 1) {
|
||||
formGroupRef.addClass('has-error');
|
||||
var help_msg = v.join("<br/>") ;
|
||||
helpBlockRef.html(help_msg);
|
||||
} else {
|
||||
noneFieldErrorMsg += v + '<br/>';
|
||||
}
|
||||
});
|
||||
if (noneFieldErrorRef.length === 1 && noneFieldErrorMsg !== '') {
|
||||
noneFieldErrorRef.css('display', 'block');
|
||||
noneFieldErrorRef.html(noneFieldErrorMsg);
|
||||
}
|
||||
}
|
||||
|
||||
})
|
||||
}
|
||||
|
||||
function APIUpdateAttr(props) {
|
||||
// props = {url: .., body: , success: , error: , method: ,}
|
||||
props = props || {};
|
||||
|
@ -195,9 +276,6 @@ function APIUpdateAttr(props) {
|
|||
}).fail(function(jqXHR, textStatus, errorThrown) {
|
||||
if (flash_message) {
|
||||
var msg = "";
|
||||
console.log(jqXHR);
|
||||
console.log(textStatus);
|
||||
console.log(errorThrown);
|
||||
if (user_fail_message) {
|
||||
msg = user_fail_message;
|
||||
} else if (jqXHR.responseJSON) {
|
||||
|
@ -213,6 +291,7 @@ function APIUpdateAttr(props) {
|
|||
toastr.error(msg);
|
||||
}
|
||||
if (typeof props.error === 'function') {
|
||||
console.log(jqXHR);
|
||||
return props.error(jqXHR.responseText, jqXHR.status);
|
||||
}
|
||||
});
|
||||
|
|
|
@ -1,12 +1,16 @@
|
|||
# -*- coding: utf-8 -*-
|
||||
#
|
||||
from rest_framework import viewsets
|
||||
from rest_framework import viewsets, generics
|
||||
from rest_framework import status
|
||||
from rest_framework.response import Response
|
||||
|
||||
from common.permissions import IsSuperUser, WithBootstrapToken
|
||||
|
||||
|
||||
from ...models import Terminal
|
||||
from ...serializers import v2 as serializers
|
||||
|
||||
__all__ = ['TerminalViewSet', 'TerminalRegistrationViewSet']
|
||||
__all__ = ['TerminalViewSet', 'TerminalRegistrationApi']
|
||||
|
||||
|
||||
class TerminalViewSet(viewsets.ModelViewSet):
|
||||
|
@ -15,8 +19,19 @@ class TerminalViewSet(viewsets.ModelViewSet):
|
|||
permission_classes = [IsSuperUser]
|
||||
|
||||
|
||||
class TerminalRegistrationViewSet(viewsets.ModelViewSet):
|
||||
queryset = Terminal.objects.filter(is_deleted=False)
|
||||
class TerminalRegistrationApi(generics.CreateAPIView):
|
||||
serializer_class = serializers.TerminalRegistrationSerializer
|
||||
permission_classes = [WithBootstrapToken]
|
||||
http_method_names = ['post']
|
||||
|
||||
def create(self, request, *args, **kwargs):
|
||||
data = request.data
|
||||
serializer = serializers.TerminalSerializer(
|
||||
data=data, context={'request': request}
|
||||
)
|
||||
serializer.is_valid(raise_exception=True)
|
||||
terminal = serializer.save()
|
||||
sa_serializer = serializer.sa_serializer_class(instance=terminal.user)
|
||||
data['service_account'] = sa_serializer.data
|
||||
return Response(data, status=status.HTTP_201_CREATED)
|
||||
|
||||
|
|
|
@ -39,5 +39,3 @@ class TerminalForm(forms.ModelForm):
|
|||
'name', 'remote_addr', 'comment',
|
||||
'command_storage', 'replay_storage',
|
||||
]
|
||||
help_texts = {
|
||||
}
|
||||
|
|
|
@ -31,8 +31,6 @@ class TerminalSerializer(serializers.ModelSerializer):
|
|||
return cache.get(key)
|
||||
|
||||
|
||||
|
||||
|
||||
class SessionSerializer(BulkSerializerMixin, serializers.ModelSerializer):
|
||||
command_amount = serializers.SerializerMethodField()
|
||||
command_store = get_multi_command_storage()
|
||||
|
|
|
@ -3,7 +3,7 @@
|
|||
from rest_framework import serializers
|
||||
|
||||
from common.utils import get_request_ip
|
||||
from users.serializers.v2 import ServiceAccountRegistrationSerializer
|
||||
from users.serializers.v2 import ServiceAccountSerializer
|
||||
from ..models import Terminal
|
||||
|
||||
|
||||
|
@ -11,36 +11,48 @@ __all__ = ['TerminalSerializer', 'TerminalRegistrationSerializer']
|
|||
|
||||
|
||||
class TerminalSerializer(serializers.ModelSerializer):
|
||||
class Meta:
|
||||
model = Terminal
|
||||
fields = [
|
||||
'id', 'name', 'remote_addr', 'comment',
|
||||
]
|
||||
read_only_fields = ['id', 'remote_addr']
|
||||
|
||||
|
||||
class TerminalRegistrationSerializer(serializers.ModelSerializer):
|
||||
service_account = ServiceAccountRegistrationSerializer(read_only=True)
|
||||
service_account_serializer = None
|
||||
sa_serializer_class = ServiceAccountSerializer
|
||||
sa_serializer = None
|
||||
|
||||
class Meta:
|
||||
model = Terminal
|
||||
fields = [
|
||||
'id', 'name', 'remote_addr', 'comment', 'service_account'
|
||||
'id', 'name', 'remote_addr', 'command_storage',
|
||||
'replay_storage', 'user', 'is_accepted', 'is_deleted',
|
||||
'date_created', 'comment'
|
||||
]
|
||||
read_only_fields = ['id', 'remote_addr', 'service_account']
|
||||
read_only_fields = ['id', 'remote_addr', 'user', 'date_created']
|
||||
|
||||
def validate(self, attrs):
|
||||
self.service_account_serializer = ServiceAccountRegistrationSerializer(data=attrs)
|
||||
self.service_account_serializer.is_valid(raise_exception=True)
|
||||
return attrs
|
||||
def is_valid(self, raise_exception=False):
|
||||
valid = super().is_valid(raise_exception=raise_exception)
|
||||
if not valid:
|
||||
return valid
|
||||
data = {'name': self.validated_data.get('name')}
|
||||
kwargs = {'data': data}
|
||||
if self.instance and self.instance.user:
|
||||
kwargs['instance'] = self.instance.user
|
||||
self.sa_serializer = ServiceAccountSerializer(**kwargs)
|
||||
valid = self.sa_serializer.is_valid(raise_exception=True)
|
||||
return valid
|
||||
|
||||
def save(self, **kwargs):
|
||||
instance = super().save(**kwargs)
|
||||
sa = self.sa_serializer.save()
|
||||
instance.user = sa
|
||||
instance.save()
|
||||
return instance
|
||||
|
||||
def create(self, validated_data):
|
||||
request = self.context.get('request')
|
||||
sa = self.service_account_serializer.save()
|
||||
instance = super().create(validated_data)
|
||||
instance.is_accepted = True
|
||||
instance.user = sa
|
||||
instance.remote_addr = get_request_ip(request)
|
||||
if request:
|
||||
instance.remote_addr = get_request_ip(request)
|
||||
instance.save()
|
||||
return instance
|
||||
|
||||
|
||||
class TerminalRegistrationSerializer(serializers.Serializer):
|
||||
name = serializers.CharField(max_length=128)
|
||||
comment = serializers.CharField(max_length=128)
|
||||
service_account = ServiceAccountSerializer(read_only=True)
|
||||
|
|
|
@ -33,8 +33,6 @@
|
|||
<h3>{% trans 'Info' %}</h3>
|
||||
{% bootstrap_field form.name layout="horizontal" %}
|
||||
{% bootstrap_field form.remote_addr layout="horizontal" %}
|
||||
{# {% bootstrap_field form.ssh_port layout="horizontal" %}#}
|
||||
{# {% bootstrap_field form.http_port layout="horizontal" %}#}
|
||||
{% bootstrap_field form.command_storage layout="horizontal" %}
|
||||
{% bootstrap_field form.replay_storage layout="horizontal" %}
|
||||
|
||||
|
@ -60,14 +58,14 @@
|
|||
<script>
|
||||
$(document).ready(function () {
|
||||
$('.select2').select2();
|
||||
|
||||
$('.input-group.date').datepicker({
|
||||
format: "yyyy-mm-dd",
|
||||
todayBtn: "linked",
|
||||
keyboardNavigation: false,
|
||||
forceParse: false,
|
||||
calendarWeeks: true,
|
||||
autoclose: true
|
||||
}).on('submit', 'form', function (e) {
|
||||
e.preventDefault();
|
||||
var form = $('form');
|
||||
formSubmit({
|
||||
'url': '{% url 'api-terminal-v2:terminal-detail' pk=DEFAULT_PK %}'.replace('{{ DEFAULT_PK }}', '{{ object.id }}'),
|
||||
'form': form,
|
||||
'method': 'PUT',
|
||||
'redirect_to': '{% url "terminal:terminal-list" %}'
|
||||
});
|
||||
})
|
||||
</script>
|
||||
|
|
|
@ -11,10 +11,11 @@ app_name = 'terminal'
|
|||
|
||||
router = BulkRouter()
|
||||
router.register(r'terminal', api.TerminalViewSet, 'terminal')
|
||||
router.register(r'terminal-registrations', api.TerminalRegistrationViewSet, 'terminal-registration')
|
||||
|
||||
|
||||
urlpatterns = [
|
||||
path('terminal-registrations/', api.TerminalRegistrationApi.as_view(),
|
||||
name='terminal-registration')
|
||||
]
|
||||
|
||||
urlpatterns += router.urls
|
||||
|
|
|
@ -7,6 +7,6 @@ from ...serializers import v2 as serializers
|
|||
|
||||
|
||||
class ServiceAccountRegistrationViewSet(viewsets.ModelViewSet):
|
||||
serializer_class = serializers.ServiceAccountRegistrationSerializer
|
||||
serializer_class = serializers.ServiceAccountSerializer
|
||||
permission_classes = (WithBootstrapToken,)
|
||||
http_method_names = ['post']
|
||||
|
|
|
@ -1,5 +1,6 @@
|
|||
# -*- coding: utf-8 -*-
|
||||
#
|
||||
from django.utils.translation import ugettext as _
|
||||
from rest_framework import serializers
|
||||
from ..models import User, AccessKey
|
||||
|
||||
|
@ -12,7 +13,7 @@ class AccessKeySerializer(serializers.ModelSerializer):
|
|||
read_only_fields = ['id', 'secret']
|
||||
|
||||
|
||||
class ServiceAccountRegistrationSerializer(serializers.ModelSerializer):
|
||||
class ServiceAccountSerializer(serializers.ModelSerializer):
|
||||
access_key = AccessKeySerializer(read_only=True)
|
||||
|
||||
class Meta:
|
||||
|
@ -30,15 +31,22 @@ class ServiceAccountRegistrationSerializer(serializers.ModelSerializer):
|
|||
def validate_name(self, name):
|
||||
email = self.get_email()
|
||||
username = self.get_username()
|
||||
if User.objects.filter(email=email) or \
|
||||
User.objects.filter(username=username):
|
||||
raise serializers.ValidationError('name not unique', code='unique')
|
||||
if self.instance:
|
||||
users = User.objects.exclude(id=self.instance.id)
|
||||
else:
|
||||
users = User.objects.all()
|
||||
if users.filter(email=email) or \
|
||||
users.filter(username=username):
|
||||
raise serializers.ValidationError(_('name not unique'), code='unique')
|
||||
return name
|
||||
|
||||
def save(self, **kwargs):
|
||||
self.validated_data['email'] = self.get_email()
|
||||
self.validated_data['username'] = self.get_username()
|
||||
self.validated_data['role'] = User.ROLE_APP
|
||||
return super().save(**kwargs)
|
||||
|
||||
def create(self, validated_data):
|
||||
validated_data['email'] = self.get_email()
|
||||
validated_data['username'] = self.get_username()
|
||||
validated_data['role'] = User.ROLE_APP
|
||||
instance = super().create(validated_data)
|
||||
instance.create_access_key()
|
||||
return instance
|
||||
|
|
Loading…
Reference in New Issue