Commit 25d9dbe9 authored by ibuler's avatar ibuler

Merge with cmdb

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