diff --git a/apps/assets/forms.py b/apps/assets/forms.py index 1338a7449..f2f28ad46 100644 --- a/apps/assets/forms.py +++ b/apps/assets/forms.py @@ -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')}), } diff --git a/apps/assets/templates/assets/asset_group_list.html b/apps/assets/templates/assets/asset_group_list.html index 484c131f4..b69bfa8b9 100644 --- a/apps/assets/templates/assets/asset_group_list.html +++ b/apps/assets/templates/assets/asset_group_list.html @@ -29,7 +29,7 @@ {{ asset_group.assets.count }} {{ asset_group.comment }} - {% trans 'Edit' %} + {% trans 'Update' %} {% trans 'Delete' %} diff --git a/apps/locale/zh/LC_MESSAGES/django.mo b/apps/locale/zh/LC_MESSAGES/django.mo index e6457f782..13d91f86f 100644 Binary files a/apps/locale/zh/LC_MESSAGES/django.mo and b/apps/locale/zh/LC_MESSAGES/django.mo differ diff --git a/apps/locale/zh/LC_MESSAGES/django.po b/apps/locale/zh/LC_MESSAGES/django.po index c405456f4..255849ad4 100644 --- a/apps/locale/zh/LC_MESSAGES/django.po +++ b/apps/locale/zh/LC_MESSAGES/django.po @@ -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 \n" "Language-Team: Jumpserver team\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 "" "
\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%s success." -msgstr "创建用户%s 成功" +msgid "Create user %s success." +msgstr "创建用户 %s 成功" -#: 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 "用户名或密码错误" diff --git a/apps/templates/_header_bar.html b/apps/templates/_header_bar.html index 66699be53..419ca717f 100644 --- a/apps/templates/_header_bar.html +++ b/apps/templates/_header_bar.html @@ -19,9 +19,15 @@
  • + {% if user.is_authenticated %} - Log out + {% trans 'Logout' %} + {% else %} + + {% trans 'Login' %} + + {% endif %}
  • diff --git a/apps/templates/_user_profile.html b/apps/templates/_user_profile.html index 5f61faf90..0341fdb68 100644 --- a/apps/templates/_user_profile.html +++ b/apps/templates/_user_profile.html @@ -8,7 +8,7 @@ - {{ request.user.name }} + {{ user.name }} {{ request.user.get_role_display | default:_('User') }} diff --git a/apps/users/forms.py b/apps/users/forms.py index 7f90f0f5e..8eb8ebcf8 100644 --- a/apps/users/forms.py +++ b/apps/users/forms.py @@ -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 diff --git a/apps/users/models.py b/apps/users/models.py index c6fe74c91..a1ee15f08 100644 --- a/apps/users/models.py +++ b/apps/users/models.py @@ -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')) diff --git a/apps/users/templates/users/_user.html b/apps/users/templates/users/_user.html index b8acec82c..937b25005 100644 --- a/apps/users/templates/users/_user.html +++ b/apps/users/templates/users/_user.html @@ -14,7 +14,7 @@
    - - - diff --git a/apps/users/templates/users/user_detail.html b/apps/users/templates/users/user_detail.html index 1bf190259..6ecc6467d 100644 --- a/apps/users/templates/users/user_detail.html +++ b/apps/users/templates/users/user_detail.html @@ -178,7 +178,7 @@
    - {% trans 'Usergroup' %} + {% trans 'User group' %}
    @@ -186,7 +186,7 @@ diff --git a/apps/users/templates/users/user_list.html b/apps/users/templates/users/user_list.html index 3980bba17..74edf727c 100644 --- a/apps/users/templates/users/user_list.html +++ b/apps/users/templates/users/user_list.html @@ -12,7 +12,7 @@ - + @@ -34,14 +34,14 @@ diff --git a/apps/users/templates/users/user_update.html b/apps/users/templates/users/user_update.html index fb3725a75..f0a0907e2 100644 --- a/apps/users/templates/users/user_update.html +++ b/apps/users/templates/users/user_update.html @@ -1,5 +1,6 @@ {% extends 'users/_user.html' %} {% load i18n %} +{% block user_template_title %}{% trans "Update user" %}{% endblock %} {% block username %}
    @@ -16,4 +17,4 @@
    -{% endblock %} \ No newline at end of file +{% endblock %} diff --git a/apps/users/urls.py b/apps/users/urls.py index 138f6144f..7c249b413 100644 --- a/apps/users/urls.py +++ b/apps/users/urls.py @@ -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[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[0-9]+)$', api.UserDetailDeleteUpdateApi.as_view(), name='user-detail-api'), + url(r'^v1/users/(?P[0-9]+)$', + api.UserDetailDeleteUpdateApi.as_view(), name='user-detail-api'), url(r'^v1/users/(?P[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[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[0-9]+)$', + api.UserGroupDetailDeleteUpdateApi.as_view(), name='user-group-detail-api'), ] diff --git a/apps/users/utils.py b/apps/users/utils.py index 587c8ec7d..7b3222c29 100644 --- a/apps/users/utils.py +++ b/apps/users/utils.py @@ -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), } diff --git a/apps/users/views.py b/apps/users/views.py index f23b3a84c..1017d2f65 100644 --- a/apps/users/views.py +++ b/apps/users/views.py @@ -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%s success.') + success_message = _('Create user %s 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):
    - {% for group in groups %} {% endfor %} @@ -195,7 +195,7 @@
    - +
    {% trans 'Name' %} {% trans 'Username' %} {% trans 'Role' %}{% trans 'Usergroup' %}{% trans 'User group' %} {% trans 'Asset num' %} {% trans 'Active' %} {{ user.groups.all|join_queryset_attr:"name" }} {{ user.name }} - {% if user.is_expired %} + {% if user.is_expired and user.is_active %} {% else %} {% endif %} - {% trans 'Edit' %} + {% trans 'Update' %} {% trans 'Delete' %}