mirror of https://github.com/jumpserver/jumpserver
Merge with cmdb
commit
25d9dbe93c
|
@ -16,7 +16,7 @@ class AssetForm(forms.ModelForm):
|
|||
]
|
||||
|
||||
widgets = {
|
||||
'groups': forms.SelectMultiple(attrs={'class': 'select2', 'data-placeholder': _('Join assetgroups')}),
|
||||
'groups': forms.SelectMultiple(attrs={'class': 'select2', 'data-placeholder': _('Select asset groups')}),
|
||||
}
|
||||
|
||||
|
||||
|
|
|
@ -29,7 +29,7 @@
|
|||
<td class="text-center">{{ asset_group.assets.count }}</td>
|
||||
<td class="text-center">{{ asset_group.comment }}</td>
|
||||
<td class="text-center">
|
||||
<a href="{% url 'assets:asset-group-update' pk=asset_group.id %}" class="btn btn-xs btn-info">{% trans 'Edit' %}</a>
|
||||
<a href="{% url 'assets:asset-group-update' pk=asset_group.id %}" class="btn btn-xs btn-info">{% trans 'Update' %}</a>
|
||||
<a href="{% url 'assets:asset-group-delete' pk=asset_group.id %}" class="btn btn-xs btn-danger del">{% trans 'Delete' %}</a>
|
||||
</td>
|
||||
</tr>
|
||||
|
|
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: 2016-09-05 20:18+0800\n"
|
||||
"POT-Creation-Date: 2016-09-06 15:08+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"
|
||||
|
@ -17,12 +17,20 @@ msgstr ""
|
|||
"Content-Type: text/plain; charset=UTF-8\n"
|
||||
"Content-Transfer-Encoding: 8bit\n"
|
||||
|
||||
#: assets/forms.py:20
|
||||
msgid "Join assetgroups"
|
||||
msgstr "添加到用户组"
|
||||
#: assets/forms.py:19
|
||||
msgid "Select asset groups"
|
||||
msgstr "添加到资产组"
|
||||
|
||||
#: assets/forms.py:25 assets/models.py:144 templates/_nav.html:21
|
||||
msgid "Asset"
|
||||
msgstr "资产"
|
||||
|
||||
#: assets/forms.py:28
|
||||
msgid "Select assets"
|
||||
msgstr "选择资产"
|
||||
|
||||
#: assets/models.py:9 assets/models.py:21 assets/models.py:54
|
||||
#: assets/models.py:76 assets/templates/assets/assetgroup_list.html:12
|
||||
#: assets/models.py:76 assets/templates/assets/asset_group_list.html:12
|
||||
#: users/models.py:60 users/models.py:107
|
||||
#: users/templates/users/user_detail.html:69
|
||||
#: users/templates/users/user_list.html:12
|
||||
|
@ -38,7 +46,7 @@ msgstr "创建者"
|
|||
|
||||
#: assets/models.py:11 assets/models.py:30 assets/models.py:44
|
||||
#: assets/models.py:62 assets/models.py:91 assets/models.py:128
|
||||
#: assets/models.py:147 assets/templates/assets/assetgroup_list.html:14
|
||||
#: assets/models.py:147 assets/templates/assets/asset_group_list.html:14
|
||||
#: users/models.py:61 users/models.py:118
|
||||
#: users/templates/users/user_detail.html:113
|
||||
msgid "Comment"
|
||||
|
@ -81,20 +89,21 @@ msgstr "KEY"
|
|||
msgid "VALUE"
|
||||
msgstr "VALUE"
|
||||
|
||||
#: assets/models.py:55 assets/models.py:77 users/forms.py:12
|
||||
#: users/models.py:106 users/templates/users/login.html:54
|
||||
#: assets/models.py:55 assets/models.py:77 users/forms.py:13
|
||||
#: users/models.py:106 users/templates/users/login.html:53
|
||||
#: users/templates/users/user_detail.html:73
|
||||
#: users/templates/users/user_edit.html:5
|
||||
#: users/templates/users/user_list.html:13
|
||||
#: users/templates/users/user_update.html:6
|
||||
msgid "Username"
|
||||
msgstr "用户名"
|
||||
|
||||
#: assets/models.py:56 assets/models.py:78 users/forms.py:13
|
||||
#: users/templates/users/login.html:57
|
||||
#: assets/models.py:56 assets/models.py:78 users/forms.py:15
|
||||
#: users/templates/users/login.html:56
|
||||
#: users/templates/users/reset_password.html:52
|
||||
#: users/templates/users/user_add.html:8 users/templates/users/user_add.html:10
|
||||
#: users/templates/users/user_edit.html:12
|
||||
#: users/templates/users/user_edit.html:14
|
||||
#: users/templates/users/user_create.html:8
|
||||
#: users/templates/users/user_create.html:10
|
||||
#: users/templates/users/user_update.html:13
|
||||
#: users/templates/users/user_update.html:15
|
||||
msgid "Password"
|
||||
msgstr "密码"
|
||||
|
||||
|
@ -130,7 +139,7 @@ msgstr "Sudo"
|
|||
msgid "Shell"
|
||||
msgstr "Shell"
|
||||
|
||||
#: assets/models.py:87 templates/_header_bar.html:35 templates/_nav.html:4
|
||||
#: assets/models.py:87 templates/_header_bar.html:41 templates/_nav.html:4
|
||||
msgid "Home"
|
||||
msgstr "仪表盘"
|
||||
|
||||
|
@ -170,6 +179,10 @@ msgstr "管理用户"
|
|||
msgid "Admin password"
|
||||
msgstr "管理员密码"
|
||||
|
||||
#: assets/models.py:110
|
||||
msgid "System User"
|
||||
msgstr "系统用户"
|
||||
|
||||
#: assets/models.py:111 templates/_nav.html:23
|
||||
msgid "IDC"
|
||||
msgstr "机房"
|
||||
|
@ -230,75 +243,72 @@ msgstr "序列号"
|
|||
msgid "Is active"
|
||||
msgstr "是否激活"
|
||||
|
||||
#: assets/models.py:144 assets/templates/assets/assetgroup_add.html:35
|
||||
#: templates/_nav.html:21
|
||||
msgid "Asset"
|
||||
msgstr "资产"
|
||||
|
||||
#: assets/templates/assets/assetgroup_add.html:16
|
||||
#: assets/templates/assets/assetgroup_list.html:5 assets/views.py:60
|
||||
#: assets/templates/assets/asset_group_create.html:16
|
||||
#: assets/templates/assets/asset_group_list.html:5 assets/views.py:60
|
||||
#: assets/views.py:98
|
||||
msgid "Create asset group"
|
||||
msgstr "创建资产组"
|
||||
|
||||
#: assets/templates/assets/assetgroup_add.html:37
|
||||
msgid "Select asset"
|
||||
msgstr "选择资产"
|
||||
|
||||
#: assets/templates/assets/assetgroup_add.html:49
|
||||
#: assets/templates/assets/asset_group_create.html:50
|
||||
#: users/templates/users/_user.html:70
|
||||
#: users/templates/users/user_detail.html:162
|
||||
#: users/templates/users/user_detail.html:170
|
||||
msgid "Reset"
|
||||
msgstr "重置"
|
||||
|
||||
#: assets/templates/assets/assetgroup_add.html:50
|
||||
#: assets/templates/assets/assetgroup_list.html:51
|
||||
#: assets/templates/assets/asset_group_create.html:51
|
||||
#: assets/templates/assets/asset_group_list.html:51
|
||||
#: users/templates/users/_user.html:71
|
||||
#: users/templates/users/forget_password.html:44
|
||||
#: users/templates/users/forgot_password.html:44
|
||||
#: users/templates/users/user_list.html:63
|
||||
msgid "Submit"
|
||||
msgstr "提交"
|
||||
|
||||
#: assets/templates/assets/assetgroup_list.html:13
|
||||
#: assets/templates/assets/asset_group_list.html:13
|
||||
#: users/templates/users/user_list.html:16
|
||||
msgid "Asset num"
|
||||
msgstr "资产数量"
|
||||
|
||||
#: assets/templates/assets/assetgroup_list.html:32
|
||||
#: assets/templates/assets/asset_group_list.html:32
|
||||
#: users/templates/users/user_list.html:44
|
||||
msgid "Edit"
|
||||
msgstr "编辑"
|
||||
msgid "Update"
|
||||
msgstr "更新"
|
||||
|
||||
#: assets/templates/assets/assetgroup_list.html:33
|
||||
#: assets/templates/assets/asset_group_list.html:33
|
||||
#: users/templates/users/user_list.html:45
|
||||
msgid "Delete"
|
||||
msgstr "删除"
|
||||
|
||||
#: assets/templates/assets/assetgroup_list.html:43
|
||||
#: assets/templates/assets/asset_group_list.html:43
|
||||
#: users/templates/users/user_list.html:55
|
||||
msgid "Delete selected"
|
||||
msgstr "批量删除"
|
||||
|
||||
#: assets/templates/assets/assetgroup_list.html:44
|
||||
#: assets/templates/assets/asset_group_list.html:44
|
||||
#: users/templates/users/user_list.html:56
|
||||
msgid "Update selected"
|
||||
msgstr "批量更新"
|
||||
|
||||
#: assets/templates/assets/assetgroup_list.html:45
|
||||
#: assets/templates/assets/asset_group_list.html:45
|
||||
#: users/templates/users/user_list.html:57
|
||||
msgid "Deactive selected"
|
||||
msgstr "禁用所选"
|
||||
|
||||
#: assets/templates/assets/assetgroup_list.html:46
|
||||
#: assets/templates/assets/asset_group_list.html:46
|
||||
#: users/templates/users/user_list.html:58
|
||||
msgid "Export selected"
|
||||
msgstr "批量导出"
|
||||
|
||||
#: assets/views.py:59 assets/views.py:74 templates/_nav.html:18
|
||||
#: assets/templates/assets/asset_list.html:27
|
||||
msgid "Create asset"
|
||||
msgstr "创建资产"
|
||||
|
||||
#: assets/views.py:59 assets/views.py:78 assets/views.py:97
|
||||
#: templates/_nav.html:18
|
||||
msgid "Assets"
|
||||
msgstr "资产管理"
|
||||
|
||||
#: assets/views.py:75
|
||||
#: assets/views.py:79
|
||||
msgid "Asset group list"
|
||||
msgstr "资产组列表"
|
||||
|
||||
|
@ -314,16 +324,27 @@ msgstr "欢迎使用Jumpserver开源跳板机系统"
|
|||
msgid "Help"
|
||||
msgstr "帮助"
|
||||
|
||||
#: templates/_nav.html:9 users/views.py:100 users/views.py:113
|
||||
#: users/views.py:153 users/views.py:170 users/views.py:195 users/views.py:208
|
||||
#: templates/_header_bar.html:24 templates/_user_profile.html:21
|
||||
msgid "Logout"
|
||||
msgstr "注销登录"
|
||||
|
||||
#: templates/_header_bar.html:28 users/templates/users/login.html:42
|
||||
#: users/templates/users/login.html:61
|
||||
msgid "Login"
|
||||
msgstr "登录"
|
||||
|
||||
#: templates/_nav.html:9 users/views.py:50 users/views.py:63 users/views.py:103
|
||||
#: users/views.py:120 users/views.py:145 users/views.py:158
|
||||
msgid "Users"
|
||||
msgstr "用户管理"
|
||||
|
||||
#: templates/_nav.html:12 users/models.py:103
|
||||
#: templates/_nav.html:12 templates/_user_profile.html:14 users/models.py:103
|
||||
msgid "User"
|
||||
msgstr "用户"
|
||||
|
||||
#: templates/_nav.html:13
|
||||
#: templates/_nav.html:13 users/models.py:109
|
||||
#: users/templates/users/user_detail.html:181
|
||||
#: users/templates/users/user_list.html:15
|
||||
msgid "User group"
|
||||
msgstr "用户组"
|
||||
|
||||
|
@ -379,10 +400,6 @@ msgstr "访问官网"
|
|||
msgid "Profile"
|
||||
msgstr "个人信息"
|
||||
|
||||
#: templates/_user_profile.html:21
|
||||
msgid "Logout"
|
||||
msgstr "注销登录"
|
||||
|
||||
#: templates/captcha/image.html:3
|
||||
msgid "Play CAPTCHA as audio file"
|
||||
msgstr ""
|
||||
|
@ -391,7 +408,8 @@ msgstr ""
|
|||
msgid "Captcha"
|
||||
msgstr "验证码"
|
||||
|
||||
#: users/forms.py:31 users/forms.py:50
|
||||
#: users/forms.py:34 users/forms.py:54
|
||||
#: users/templates/users/user_detail.html:189
|
||||
msgid "Join user groups"
|
||||
msgstr "添加到用户组"
|
||||
|
||||
|
@ -403,11 +421,6 @@ msgstr "管理员"
|
|||
msgid "Email"
|
||||
msgstr "邮件"
|
||||
|
||||
#: users/models.py:109 users/templates/users/user_detail.html:181
|
||||
#: users/templates/users/user_list.html:15
|
||||
msgid "Usergroup"
|
||||
msgstr "用户组"
|
||||
|
||||
#: users/models.py:110 users/templates/users/user_detail.html:93
|
||||
#: users/templates/users/user_list.html:14
|
||||
msgid "Role"
|
||||
|
@ -446,7 +459,7 @@ msgid "System"
|
|||
msgstr "系统"
|
||||
|
||||
#: users/templates/users/_user.html:17 users/templates/users/user_list.html:5
|
||||
#: users/views.py:113
|
||||
#: users/views.py:63
|
||||
msgid "Create user"
|
||||
msgstr "创建用户"
|
||||
|
||||
|
@ -458,18 +471,15 @@ msgstr "账户"
|
|||
msgid "Security and Role"
|
||||
msgstr "角色安全"
|
||||
|
||||
#: users/templates/users/forget_password.html:26
|
||||
msgid "Forget password"
|
||||
#: users/templates/users/forgot_password.html:26
|
||||
#: users/templates/users/login.html:64
|
||||
msgid "Forgot password"
|
||||
msgstr "忘记密码"
|
||||
|
||||
#: users/templates/users/forget_password.html:33
|
||||
#: users/templates/users/forgot_password.html:33
|
||||
msgid "Input your email, that will send a mail to your"
|
||||
msgstr "输入您的邮箱, 将会发一封重置短信邮件到您的邮箱中"
|
||||
|
||||
#: users/templates/users/login.html:42 users/templates/users/login.html:62
|
||||
msgid "Login"
|
||||
msgstr "登录"
|
||||
|
||||
#: users/templates/users/login.html:47
|
||||
msgid "Captcha invalid"
|
||||
msgstr "验证码错误"
|
||||
|
@ -487,7 +497,7 @@ msgstr "再次输入密码"
|
|||
msgid "Setting"
|
||||
msgstr "设置"
|
||||
|
||||
#: users/templates/users/user_add.html:12
|
||||
#: users/templates/users/user_create.html:12
|
||||
msgid "Reset link will be generated and sent to the user. "
|
||||
msgstr "生成重置密码连接,通过邮件发送给用户"
|
||||
|
||||
|
@ -495,7 +505,7 @@ msgstr "生成重置密码连接,通过邮件发送给用户"
|
|||
msgid "Confirm delete"
|
||||
msgstr "确认删除"
|
||||
|
||||
#: users/templates/users/user_detail.html:18 users/views.py:170
|
||||
#: users/templates/users/user_detail.html:18 users/views.py:120
|
||||
msgid "User detail"
|
||||
msgstr "用户详情"
|
||||
|
||||
|
@ -523,18 +533,31 @@ msgstr "快速修改"
|
|||
msgid "Reset ssh key"
|
||||
msgstr "重置密钥"
|
||||
|
||||
#: users/templates/users/user_detail.html:189
|
||||
msgid "Select usergroups"
|
||||
msgstr "选择用户组"
|
||||
|
||||
#: users/templates/users/user_detail.html:198
|
||||
msgid "Add"
|
||||
msgstr "添加"
|
||||
msgid "Join"
|
||||
msgstr "加入"
|
||||
|
||||
#: users/templates/users/user_group_create.html:16 users/views.py:158
|
||||
msgid "Create user group"
|
||||
msgstr "创建用户组"
|
||||
|
||||
#: users/templates/users/user_list.html:17
|
||||
#, fuzzy
|
||||
msgid "Active"
|
||||
msgstr "激活"
|
||||
|
||||
#: users/templates/users/user_update.html:3 users/views.py:103
|
||||
msgid "Update user"
|
||||
msgstr "编辑用户"
|
||||
|
||||
#: users/urls.py:23
|
||||
msgid "Logout success"
|
||||
msgstr "退出登录成功"
|
||||
|
||||
#: users/urls.py:24
|
||||
msgid "Logout success, return login page"
|
||||
msgstr "退出登录成功,返回到登录页面"
|
||||
|
||||
#: users/utils.py:47
|
||||
msgid "Begin to generate ssh private key ..."
|
||||
msgstr "开始生成ssh密钥"
|
||||
|
@ -636,69 +659,47 @@ msgstr ""
|
|||
" </br>\n"
|
||||
" "
|
||||
|
||||
#: users/views.py:53
|
||||
msgid "Username or password invalid"
|
||||
msgstr "用户名或密码错误"
|
||||
|
||||
#: users/views.py:70
|
||||
msgid "Logout success"
|
||||
msgstr "退出登录成功"
|
||||
|
||||
#: users/views.py:71
|
||||
msgid "Logout success, return login page"
|
||||
msgstr "退出登录成功,返回到登录页面"
|
||||
|
||||
#: users/views.py:100
|
||||
#: users/views.py:50
|
||||
msgid "User list"
|
||||
msgstr "用户列表"
|
||||
|
||||
#: users/views.py:109
|
||||
#: users/views.py:59
|
||||
#, python-format
|
||||
msgid "Create user<a href=\"%s\">%s</a> success."
|
||||
msgstr "创建用户<a href=\"%s\">%s</a> 成功"
|
||||
msgid "Create user <a href=\"%s\">%s</a> success."
|
||||
msgstr "创建用户 <a href=\"%s\">%s</a> 成功"
|
||||
|
||||
#: users/views.py:153
|
||||
msgid "Edit user"
|
||||
msgstr "编辑用户"
|
||||
|
||||
#: users/views.py:195
|
||||
msgid "Usergroup list"
|
||||
#: users/views.py:145
|
||||
msgid "User group list"
|
||||
msgstr "用户组列表"
|
||||
|
||||
#: users/views.py:208
|
||||
msgid "Create usergroup"
|
||||
msgstr "创建用户组"
|
||||
|
||||
#: users/views.py:240
|
||||
#: users/views.py:190
|
||||
msgid "Email address invalid, input again"
|
||||
msgstr "邮箱地址错误,重新输入"
|
||||
|
||||
#: users/views.py:251
|
||||
#: users/views.py:201
|
||||
msgid "Send reset password message"
|
||||
msgstr "发送重置密码邮件"
|
||||
|
||||
#: users/views.py:252
|
||||
#: users/views.py:202
|
||||
msgid "Send reset password mail success, login your mail box and follow it "
|
||||
msgstr ""
|
||||
"发送重置邮件成功, 请登录邮箱查看, 按照提示操作 (如果没收到,请等待3-5分钟)"
|
||||
|
||||
#: users/views.py:264
|
||||
#: users/views.py:214
|
||||
msgid "Reset password success"
|
||||
msgstr "重置密码成功"
|
||||
|
||||
#: users/views.py:265
|
||||
#: users/views.py:215
|
||||
msgid "Reset password success, return to login page"
|
||||
msgstr "重置密码成功,返回到登录页面"
|
||||
|
||||
#: users/views.py:281 users/views.py:294
|
||||
#: users/views.py:231 users/views.py:244
|
||||
msgid "Token invalid or expired"
|
||||
msgstr "Token错误或失效"
|
||||
|
||||
#: users/views.py:290
|
||||
#: users/views.py:240
|
||||
msgid "Password not same"
|
||||
msgstr "密码不一致"
|
||||
|
||||
#, fuzzy
|
||||
#~| msgid "Asset groups"
|
||||
#~ msgid "Assetgroup"
|
||||
#~ msgstr "用户组"
|
||||
#~ msgid "Username or password invalid"
|
||||
#~ msgstr "用户名或密码错误"
|
||||
|
|
|
@ -19,9 +19,15 @@
|
|||
</a>
|
||||
</li>
|
||||
<li>
|
||||
{% if user.is_authenticated %}
|
||||
<a href="{% url 'users:logout' %}">
|
||||
<i class="fa fa-sign-out"></i> Log out
|
||||
<i class="fa fa-sign-out"></i>{% trans 'Logout' %}
|
||||
</a>
|
||||
{% else %}
|
||||
<a href="{% url 'users:login' %}">
|
||||
<i class="fa fa-sign-in"></i>{% trans 'Login' %}
|
||||
</a>
|
||||
{% endif %}
|
||||
</li>
|
||||
</ul>
|
||||
</nav>
|
||||
|
|
|
@ -8,7 +8,7 @@
|
|||
<a data-toggle="dropdown" class="dropdown-toggle" href="#">
|
||||
<span class="clear">
|
||||
<span class="block m-t-xs">
|
||||
<strong class="font-bold"> {{ request.user.name }}<span style="color: #8095a8"></span></strong>
|
||||
<strong class="font-bold"> {{ user.name }}<span style="color: #8095a8"></span></strong>
|
||||
</span>
|
||||
<span class="text-muted text-xs block">
|
||||
{{ request.user.get_role_display | default:_('User') }}<b class="caret"></b>
|
||||
|
|
|
@ -1,20 +1,23 @@
|
|||
# ~*~ coding: utf-8 ~*~
|
||||
|
||||
from django.forms import ModelForm
|
||||
from django import forms
|
||||
from captcha.fields import CaptchaField
|
||||
from django.contrib.auth.forms import AuthenticationForm
|
||||
from django.utils.translation import gettext_lazy as _
|
||||
|
||||
from captcha.fields import CaptchaField
|
||||
|
||||
from .models import User, UserGroup
|
||||
|
||||
|
||||
class UserLoginForm(forms.Form):
|
||||
class UserLoginForm(AuthenticationForm):
|
||||
username = forms.CharField(label=_('Username'), max_length=100)
|
||||
password = forms.CharField(label=_('Password'), widget=forms.PasswordInput, max_length=100)
|
||||
password = forms.CharField(
|
||||
label=_('Password'), widget=forms.PasswordInput, max_length=100,
|
||||
strip=False)
|
||||
captcha = CaptchaField()
|
||||
|
||||
|
||||
class UserCreateForm(ModelForm):
|
||||
class UserCreateForm(forms.ModelForm):
|
||||
class Meta:
|
||||
model = User
|
||||
fields = [
|
||||
|
@ -32,7 +35,8 @@ class UserCreateForm(ModelForm):
|
|||
}
|
||||
|
||||
|
||||
class UserUpdateForm(ModelForm):
|
||||
class UserUpdateForm(forms.ModelForm):
|
||||
|
||||
class Meta:
|
||||
model = User
|
||||
fields = [
|
||||
|
@ -47,11 +51,12 @@ class UserUpdateForm(ModelForm):
|
|||
}
|
||||
|
||||
widgets = {
|
||||
'groups': forms.SelectMultiple(attrs={'class': 'select2', 'data-placeholder': _('Join usergroups')}),
|
||||
'groups': forms.SelectMultiple(attrs={'class': 'select2', 'data-placeholder': _('Join user groups')}),
|
||||
}
|
||||
|
||||
|
||||
class UserGroupForm(ModelForm):
|
||||
class UserGroupForm(forms.ModelForm):
|
||||
|
||||
class Meta:
|
||||
model = UserGroup
|
||||
|
||||
|
|
|
@ -106,7 +106,7 @@ class User(AbstractUser):
|
|||
username = models.CharField(max_length=20, unique=True, verbose_name=_('Username'))
|
||||
name = models.CharField(max_length=20, blank=True, verbose_name=_('Name'))
|
||||
email = models.EmailField(max_length=30, unique=True, verbose_name=_('Email'))
|
||||
groups = models.ManyToManyField(UserGroup, related_name='users', blank=True, verbose_name=_('Usergroup'))
|
||||
groups = models.ManyToManyField(UserGroup, related_name='users', blank=True, verbose_name=_('User group'))
|
||||
role = models.CharField(choices=ROLE_CHOICES, default='User', max_length=10, blank=True, verbose_name=_('Role'))
|
||||
avatar = models.ImageField(upload_to="avatar", verbose_name=_('Avatar'))
|
||||
wechat = models.CharField(max_length=30, blank=True, verbose_name=_('Wechat'))
|
||||
|
|
|
@ -14,7 +14,7 @@
|
|||
<div class="col-sm-12">
|
||||
<div class="ibox float-e-margins">
|
||||
<div class="ibox-title">
|
||||
<h5>{% trans 'Create user' %}</h5>
|
||||
<h5>{% block user_template_title %}{% trans 'Create user' %}{% endblock %}</h5>
|
||||
<div class="ibox-tools">
|
||||
<a class="collapse-link">
|
||||
<i class="fa fa-chevron-up"></i>
|
||||
|
@ -94,4 +94,4 @@
|
|||
});
|
||||
})
|
||||
</script>
|
||||
{% endblock %}
|
||||
{% endblock %}
|
||||
|
|
|
@ -23,7 +23,7 @@
|
|||
<div class="ibox-content">
|
||||
|
||||
<img src="{% static 'img/logo.png' %}" style="margin: auto" width="82" height="82">
|
||||
<h2 class="font-bold" style="display: inline">{% trans 'Forget password' %} ?</h2>
|
||||
<h2 class="font-bold" style="display: inline">{% trans 'Forgot password' %} ?</h2>
|
||||
|
||||
<h1></h1>
|
||||
{% if errors %}
|
|
@ -45,11 +45,10 @@
|
|||
{% if form.errors %}
|
||||
{% if 'captcha' in form.errors %}
|
||||
<p class="red-fonts">{% trans 'Captcha invalid' %}</p>
|
||||
{% else %}
|
||||
<p class="red-fonts">{{ form.non_field_errors.as_text }}</p>
|
||||
{% endif %}
|
||||
{% endif %}
|
||||
{% if errors %}
|
||||
<p class="red-fonts">{{ errors }}</p>
|
||||
{% endif %}
|
||||
<div class="form-group">
|
||||
<input type="text" class="form-control" name="{{ form.username.html_name }}" placeholder="{% trans 'Username' %}" required="">
|
||||
</div>
|
||||
|
@ -61,8 +60,8 @@
|
|||
</div>
|
||||
<button type="submit" class="btn btn-primary block full-width m-b">{% trans 'Login' %}</button>
|
||||
|
||||
<a href="{% url 'users:forget-password' %}">
|
||||
<small>Forgot password?</small>
|
||||
<a href="{% url 'users:forgot-password' %}">
|
||||
<small>{% trans 'Forgot password' %}?</small>
|
||||
</a>
|
||||
|
||||
<p class="text-muted text-center">
|
||||
|
@ -84,7 +83,4 @@
|
|||
</div>
|
||||
</div>
|
||||
</body>
|
||||
|
||||
</html>
|
||||
|
||||
|
||||
|
|
|
@ -178,7 +178,7 @@
|
|||
|
||||
<div class="panel panel-info">
|
||||
<div class="panel-heading">
|
||||
<i class="fa fa-info-circle"></i> {% trans 'Usergroup' %}
|
||||
<i class="fa fa-info-circle"></i> {% trans 'User group' %}
|
||||
</div>
|
||||
<div class="panel-body">
|
||||
<table class="table">
|
||||
|
@ -186,7 +186,7 @@
|
|||
<form>
|
||||
<tr>
|
||||
<td colspan="2" class="no-borders">
|
||||
<select data-placeholder="{% trans 'Select usergroups' %}" class="select2" style="width: 100%" multiple="" tabindex="4">
|
||||
<select data-placeholder="{% trans 'Join user groups' %}" class="select2" style="width: 100%" multiple="" tabindex="4">
|
||||
{% for group in groups %}
|
||||
<option value="{{ group.id }}">{{ group.name }}</option>
|
||||
{% endfor %}
|
||||
|
@ -195,7 +195,7 @@
|
|||
</tr>
|
||||
<tr>
|
||||
<td colspan="2" class="no-borders">
|
||||
<button type="button" class="btn btn-info btn-small">{% trans 'Add' %}</button>
|
||||
<button type="button" class="btn btn-info btn-small">{% trans 'Join' %}</button>
|
||||
</td>
|
||||
</tr>
|
||||
</form>
|
||||
|
|
|
@ -12,7 +12,7 @@
|
|||
<th class="text-center"><a href="{% url 'users:user-list' %}?sort=name">{% trans 'Name' %}</a></th>
|
||||
<th class="text-center"><a href="{% url 'users:user-list' %}?sort=username">{% trans 'Username' %}</a></th>
|
||||
<th class="text-center">{% trans 'Role' %}</th>
|
||||
<th class="text-center">{% trans 'Usergroup' %}</th>
|
||||
<th class="text-center">{% trans 'User group' %}</th>
|
||||
<th class="text-center">{% trans 'Asset num' %}</th>
|
||||
<th class="text-center"><a href="{% url 'users:user-list' %}?sort=date_expired">{% trans 'Active' %}</a></th>
|
||||
<th class="text-center"></th>
|
||||
|
@ -34,14 +34,14 @@
|
|||
<td class="text-center" title="{% for user_group in user.group.all %} {{ user_group.name }} {% endfor %}"> {{ user.groups.all|join_queryset_attr:"name" }} </td>
|
||||
<th class="text-center">{{ user.name }}</th>
|
||||
<td class="text-center">
|
||||
{% if user.is_expired %}
|
||||
{% if user.is_expired and user.is_active %}
|
||||
<i class="fa fa-times text-danger"></i>
|
||||
{% else %}
|
||||
<i class="fa fa-check text-navy"></i>
|
||||
{% endif %}
|
||||
</td>
|
||||
<td class="text-center">
|
||||
<a href="{% url 'users:user-update' pk=user.id %}" class="btn btn-xs btn-info">{% trans 'Edit' %}</a>
|
||||
<a href="{% url 'users:user-update' pk=user.id %}" class="btn btn-xs btn-info">{% trans 'Update' %}</a>
|
||||
<a href="{% url 'users:user-delete' pk=user.id %}" class="btn btn-xs btn-danger del {% if user.id == request.user.id or user.username == 'admin' %} disabled {% endif %}">{% trans 'Delete' %}</a>
|
||||
</td>
|
||||
</tr>
|
||||
|
|
|
@ -1,5 +1,6 @@
|
|||
{% extends 'users/_user.html' %}
|
||||
{% load i18n %}
|
||||
{% block user_template_title %}{% trans "Update user" %}{% endblock %}
|
||||
{% block username %}
|
||||
<div class="form-group">
|
||||
<label for="{{ form.username.id_for_label }}" class="col-sm-2 control-label">{% trans 'Username' %}</label>
|
||||
|
@ -16,4 +17,4 @@
|
|||
<input id="password" name="password" type="password" class="form-control">
|
||||
</div>
|
||||
</div>
|
||||
{% endblock %}
|
||||
{% endblock %}
|
||||
|
|
|
@ -1,20 +1,38 @@
|
|||
from django.conf.urls import url, include
|
||||
from django.conf.urls import url
|
||||
from django.contrib.auth import views as auth_views
|
||||
from django.urls import reverse_lazy
|
||||
from django.utils.translation import ugettext as _
|
||||
|
||||
import views
|
||||
import api
|
||||
from .forms import UserLoginForm
|
||||
|
||||
app_name = 'users'
|
||||
|
||||
urlpatterns = [
|
||||
url(r'^login$', views.UserLoginView.as_view(), name='login'),
|
||||
url(r'^logout$', views.UserLogoutView.as_view(), name='logout'),
|
||||
url(r'^password/forget$', views.UserForgetPasswordView.as_view(), name='forget-password'),
|
||||
url(r'^password/forget/sendmail-success$',
|
||||
views.UserForgetPasswordSendmailSuccessView.as_view(), name='forget-password-sendmail-success'),
|
||||
url(r'^login$',
|
||||
auth_views.login,
|
||||
{'template_name': "users/login.html",
|
||||
'authentication_form': UserLoginForm,
|
||||
'redirect_authenticated_user': True},
|
||||
name='login'),
|
||||
url(r'^logout$',
|
||||
auth_views.logout,
|
||||
{
|
||||
"template_name": "common/flash_message_standalone.html",
|
||||
"extra_context": {
|
||||
'title': _('Logout success'),
|
||||
'messages': _('Logout success, return login page'),
|
||||
'redirect_url': '/users/login',
|
||||
'auto_redirect': True,
|
||||
}
|
||||
},
|
||||
name='logout'),
|
||||
url(r'^password/forgot$', views.UserForgotPasswordView.as_view(), name='forgot-password'),
|
||||
url(r'^password/forgot/sendmail-success$',
|
||||
views.UserForgotPasswordSendmailSuccessView.as_view(), name='forgot-password-sendmail-success'),
|
||||
url(r'^password/reset$', views.UserResetPasswordView.as_view(), name='reset-password'),
|
||||
url(r'^password/reset/success$', views.UserResetPasswordSuccessView.as_view(), name='reset-password-success'),
|
||||
url(r'^password/reset/success$', views.UserResetPasswordSuccessView.as_view(),
|
||||
name='reset-password-success'),
|
||||
url(r'^user$', views.UserListView.as_view(), name='user-list'),
|
||||
url(r'^user/(?P<pk>[0-9]+)$', views.UserDetailView.as_view(), name='user-detail'),
|
||||
url(r'^user/create$', views.UserCreateView.as_view(), name='user-create'),
|
||||
|
@ -30,8 +48,10 @@ urlpatterns = [
|
|||
|
||||
urlpatterns += [
|
||||
url(r'^v1/users$', api.UserListAddApi.as_view(), name='user-list-api'),
|
||||
url(r'^v1/users/(?P<pk>[0-9]+)$', api.UserDetailDeleteUpdateApi.as_view(), name='user-detail-api'),
|
||||
url(r'^v1/users/(?P<pk>[0-9]+)$',
|
||||
api.UserDetailDeleteUpdateApi.as_view(), name='user-detail-api'),
|
||||
url(r'^v1/users/(?P<pk>[0-9]+)/active$', api.UserActiveApi.as_view(), name='user-active-api'),
|
||||
url(r'^v1/usergroups$', api.UserGroupListAddApi.as_view(), name='user-group-list-api'),
|
||||
url(r'^v1/usergroups/(?P<pk>[0-9]+)$', api.UserGroupDetailDeleteUpdateApi.as_view(), name='user-group-detail-api'),
|
||||
url(r'^v1/user-groups$', api.UserGroupListAddApi.as_view(), name='user-group-list-api'),
|
||||
url(r'^v1/user-groups/(?P<pk>[0-9]+)$',
|
||||
api.UserGroupDetailDeleteUpdateApi.as_view(), name='user-group-detail-api'),
|
||||
]
|
||||
|
|
|
@ -86,7 +86,7 @@ def user_add_success_next(user):
|
|||
'name': user.name,
|
||||
'rest_password_url': reverse('users:reset-password', external=True),
|
||||
'rest_password_token': user.generate_reset_token(),
|
||||
'forget_password_url': reverse('users:forget-password', external=True),
|
||||
'forget_password_url': reverse('users:forgot-password', external=True),
|
||||
'email': user.email,
|
||||
'login_url': reverse('users:login', external=True),
|
||||
}
|
||||
|
@ -117,7 +117,7 @@ def send_reset_password_mail(user):
|
|||
'name': user.name,
|
||||
'rest_password_url': reverse('users:reset-password', external=True),
|
||||
'rest_password_token': user.generate_reset_token(),
|
||||
'forget_password_url': reverse('users:forget-password', external=True),
|
||||
'forget_password_url': reverse('users:forgot-password', external=True),
|
||||
'email': user.email,
|
||||
'login_url': reverse('users:login', external=True),
|
||||
}
|
||||
|
|
|
@ -4,78 +4,28 @@ from __future__ import unicode_literals
|
|||
|
||||
import logging
|
||||
|
||||
from django.shortcuts import get_object_or_404, reverse, render, Http404, redirect
|
||||
from django.conf import settings
|
||||
from django.contrib.messages.views import SuccessMessageMixin
|
||||
from django.db.models import Q
|
||||
from django.http import HttpResponseRedirect
|
||||
from django.shortcuts import get_object_or_404, reverse
|
||||
from django.urls import reverse_lazy
|
||||
from django.utils.translation import ugettext as _
|
||||
from django.db.models import Q
|
||||
from django.views.generic.base import View, TemplateView
|
||||
from django.views.generic.base import TemplateView
|
||||
from django.views.generic.list import ListView
|
||||
from django.views.generic.edit import CreateView, DeleteView, UpdateView, ProcessFormView, FormView
|
||||
from django.views.generic.edit import CreateView, DeleteView, UpdateView
|
||||
from django.views.generic.detail import DetailView
|
||||
from django.contrib.messages.views import SuccessMessageMixin
|
||||
from django.conf import settings
|
||||
from django.http import HttpResponseRedirect
|
||||
from django.contrib.auth import views as auth_view, authenticate, login, logout
|
||||
|
||||
from common.utils import get_object_or_none
|
||||
|
||||
from .models import User, UserGroup
|
||||
from .forms import UserCreateForm, UserUpdateForm, UserGroupForm, UserLoginForm
|
||||
from .utils import AdminUserRequiredMixin, ssh_key_gen, user_add_success_next, send_reset_password_mail
|
||||
from .utils import AdminUserRequiredMixin, user_add_success_next, send_reset_password_mail
|
||||
|
||||
|
||||
logger = logging.getLogger('jumpserver.users.views')
|
||||
|
||||
|
||||
class UserLoginView(FormView):
|
||||
template_name = 'users/login.html'
|
||||
form_class = UserLoginForm
|
||||
redirect_field_name = 'next'
|
||||
|
||||
def get(self, request, *args, **kwargs):
|
||||
if self.request.user.is_staff:
|
||||
return redirect(request.POST.get(self.redirect_field_name, reverse('index')))
|
||||
# Todo: Django have bug, lose context issue: https://github.com/django/django/pull/7202
|
||||
# so we jump it and use origin method render_to_response
|
||||
# return super(UserLoginView, self).get(request, *args, **kwargs)
|
||||
return self.render_to_response(self.get_context_data(**kwargs))
|
||||
|
||||
def post(self, request, *args, **kwargs):
|
||||
form = self.get_form()
|
||||
if not form.is_valid():
|
||||
return self.form_invalid(form)
|
||||
|
||||
username = form['username'].value()
|
||||
password = form['password'].value()
|
||||
|
||||
user = authenticate(username=username, password=password)
|
||||
if user is None:
|
||||
kwargs.update({'errors': _('Username or password invalid')})
|
||||
return self.get(request, *args, **kwargs)
|
||||
|
||||
login(request, user)
|
||||
return redirect(request.GET.get(self.redirect_field_name, reverse('index')))
|
||||
|
||||
|
||||
class UserLogoutView(TemplateView):
|
||||
template_name = 'common/flash_message_standalone.html'
|
||||
|
||||
def get(self, request, *args, **kwargs):
|
||||
logout(request)
|
||||
|
||||
return super(UserLogoutView, self).get(request)
|
||||
|
||||
def get_context_data(self, **kwargs):
|
||||
context = {
|
||||
'title': _('Logout success'),
|
||||
'messages': _('Logout success, return login page'),
|
||||
'redirect_url': reverse('users:login'),
|
||||
'auto_redirect': True,
|
||||
}
|
||||
kwargs.update(context)
|
||||
return super(UserLogoutView, self).get_context_data(**kwargs)
|
||||
|
||||
|
||||
class UserListView(AdminUserRequiredMixin, ListView):
|
||||
model = User
|
||||
paginate_by = settings.CONFIG.DISPLAY_PER_PAGE
|
||||
|
@ -106,7 +56,7 @@ class UserCreateView(AdminUserRequiredMixin, SuccessMessageMixin, CreateView):
|
|||
form_class = UserCreateForm
|
||||
template_name = 'users/user_create.html'
|
||||
success_url = reverse_lazy('users:user-list')
|
||||
success_message = _('Create user<a href="%s">%s</a> success.')
|
||||
success_message = _('Create user <a href="%s">%s</a> success.')
|
||||
|
||||
def get_context_data(self, **kwargs):
|
||||
context = super(UserCreateView, self).get_context_data(**kwargs)
|
||||
|
@ -150,7 +100,7 @@ class UserUpdateView(AdminUserRequiredMixin, UpdateView):
|
|||
|
||||
def get_context_data(self, **kwargs):
|
||||
context = super(UserUpdateView, self).get_context_data(**kwargs)
|
||||
context.update({'app': _('Users'), 'action': _('Edit user')})
|
||||
context.update({'app': _('Users'), 'action': _('Update user')})
|
||||
return context
|
||||
|
||||
|
||||
|
@ -192,7 +142,7 @@ class UserGroupListView(AdminUserRequiredMixin, ListView):
|
|||
|
||||
def get_context_data(self, **kwargs):
|
||||
context = super(UserGroupListView, self).get_context_data(**kwargs)
|
||||
context.update({'app': _('Users'), 'action': _('Usergroup list'), 'keyword': self.keyword})
|
||||
context.update({'app': _('Users'), 'action': _('User group list'), 'keyword': self.keyword})
|
||||
return context
|
||||
|
||||
|
||||
|
@ -230,8 +180,8 @@ class UserGroupDeleteView(DeleteView):
|
|||
pass
|
||||
|
||||
|
||||
class UserForgetPasswordView(TemplateView):
|
||||
template_name = 'users/forget_password.html'
|
||||
class UserForgotPasswordView(TemplateView):
|
||||
template_name = 'users/forgot_password.html'
|
||||
|
||||
def post(self, request, *args, **kwargs):
|
||||
email = request.POST.get('email')
|
||||
|
@ -240,10 +190,10 @@ class UserForgetPasswordView(TemplateView):
|
|||
return self.get(request, errors=_('Email address invalid, input again'))
|
||||
else:
|
||||
send_reset_password_mail(user)
|
||||
return HttpResponseRedirect(reverse('users:forget-password-sendmail-success'))
|
||||
return HttpResponseRedirect(reverse('users:forgot-password-sendmail-success'))
|
||||
|
||||
|
||||
class UserForgetPasswordSendmailSuccessView(TemplateView):
|
||||
class UserForgotPasswordSendmailSuccessView(TemplateView):
|
||||
template_name = 'common/flash_message_standalone.html'
|
||||
|
||||
def get_context_data(self, **kwargs):
|
||||
|
@ -253,7 +203,7 @@ class UserForgetPasswordSendmailSuccessView(TemplateView):
|
|||
'redirect_url': reverse('users:login'),
|
||||
}
|
||||
kwargs.update(context)
|
||||
return super(UserForgetPasswordSendmailSuccessView, self).get_context_data(**kwargs)
|
||||
return super(UserForgotPasswordSendmailSuccessView, self).get_context_data(**kwargs)
|
||||
|
||||
|
||||
class UserResetPasswordSuccessView(TemplateView):
|
||||
|
|
Loading…
Reference in New Issue