diff --git a/apps/media/avatar/广宏伟蓝底.jpg b/apps/media/avatar/广宏伟蓝底.jpg deleted file mode 100644 index c25759210..000000000 Binary files a/apps/media/avatar/广宏伟蓝底.jpg and /dev/null differ diff --git a/apps/static/css/plugins/cropper/cropper.min.css b/apps/static/css/plugins/cropper/cropper.min.css new file mode 100755 index 000000000..534bae197 --- /dev/null +++ b/apps/static/css/plugins/cropper/cropper.min.css @@ -0,0 +1,9 @@ +/*! + * Cropper v0.7.6-beta + * https://github.com/fengyuanchen/cropper + * + * Copyright 2014 Fengyuan Chen + * Released under the MIT license + */ + +.cropper-container{position:relative;overflow:hidden;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;-webkit-tap-highlight-color:transparent;-webkit-touch-callout:none}.cropper-container img{width:100%;height:100%;min-width:0!important;min-height:0!important;max-width:none!important;max-height:none!important}.cropper-modal,.cropper-canvas{position:absolute;top:0;right:0;bottom:0;left:0}.cropper-canvas{background-color:#fff;opacity:0;filter:alpha(opacity=0)}.cropper-modal{background-color:#000;opacity:.5;filter:alpha(opacity=50)}.cropper-dragger{position:absolute;top:10%;left:10%;width:80%;height:80%}.cropper-viewer{display:block;width:100%;height:100%;overflow:hidden;outline-width:1px;outline-style:solid;outline-color:#69f;outline-color:rgba(51,102,255,.75)}.cropper-dashed{position:absolute;display:block;border:0 dashed #fff;opacity:.5;filter:alpha(opacity=50)}.cropper-dashed.dashed-h{top:33.3%;left:0;width:100%;height:33.3%;border-top-width:1px;border-bottom-width:1px}.cropper-dashed.dashed-v{top:0;left:33.3%;width:33.3%;height:100%;border-right-width:1px;border-left-width:1px}.cropper-face,.cropper-line,.cropper-point{position:absolute;display:block;width:100%;height:100%;opacity:.1;filter:alpha(opacity=10)}.cropper-face{top:0;left:0;cursor:move;background-color:#fff}.cropper-line{background-color:#69f}.cropper-line.line-e{top:0;right:-3px;width:5px;cursor:e-resize}.cropper-line.line-n{top:-3px;left:0;height:5px;cursor:n-resize}.cropper-line.line-w{top:0;left:-3px;width:5px;cursor:w-resize}.cropper-line.line-s{bottom:-3px;left:0;height:5px;cursor:s-resize}.cropper-point{width:5px;height:5px;background-color:#69f;opacity:.75;filter:alpha(opacity=75)}.cropper-point.point-e{top:50%;right:-3px;margin-top:-3px;cursor:e-resize}.cropper-point.point-n{top:-3px;left:50%;margin-left:-3px;cursor:n-resize}.cropper-point.point-w{top:50%;left:-3px;margin-top:-3px;cursor:w-resize}.cropper-point.point-s{bottom:-3px;left:50%;margin-left:-3px;cursor:s-resize}.cropper-point.point-ne{top:-3px;right:-3px;cursor:ne-resize}.cropper-point.point-nw{top:-3px;left:-3px;cursor:nw-resize}.cropper-point.point-sw{bottom:-3px;left:-3px;cursor:sw-resize}.cropper-point.point-se{right:-3px;bottom:-3px;width:20px;height:20px;cursor:se-resize;opacity:1;filter:alpha(opacity=100)}.cropper-point.point-se:before{position:absolute;right:-50%;bottom:-50%;display:block;width:200%;height:200%;content:" ";background-color:#69f;opacity:0;filter:alpha(opacity=0)}@media (min-width:768px){.cropper-point.point-se{width:15px;height:15px}}@media (min-width:992px){.cropper-point.point-se{width:10px;height:10px}}@media (min-width:1200px){.cropper-point.point-se{width:5px;height:5px;opacity:.75;filter:alpha(opacity=75)}}.cropper-hidden{display:none!important}.cropper-invisible{position:fixed;top:0;left:0;z-index:-1;width:auto!important;max-width:none!important;height:auto!important;max-height:none!important;opacity:0;filter:alpha(opacity=0)}.cropper-move{cursor:move}.cropper-crop{cursor:crosshair}.cropper-disabled .cropper-canvas,.cropper-disabled .cropper-face,.cropper-disabled .cropper-line,.cropper-disabled .cropper-point{cursor:not-allowed} \ No newline at end of file diff --git a/apps/templates/_nav_user.html b/apps/templates/_nav_user.html index 609c0104b..48d7be8b1 100644 --- a/apps/templates/_nav_user.html +++ b/apps/templates/_nav_user.html @@ -16,7 +16,7 @@
  • - {% trans 'Terminal' %} + {% trans 'Terminal' %}
  • - {% trans 'Settings' %} + {% trans 'Settings' %}
  • @@ -38,67 +38,72 @@
    - - + + + + + - + - + - + - + - + + + + + + + + + - + - + + + + + - + - - - - - - + +
    用户名
    + +
    {% trans 'Username' %} {{ user.username }}
    姓名{% trans 'Name' %} {{ user.name }}
    权限{% trans 'Role' %} {{ user.get_role_display }}
    Email{% trans 'Email' %} {{ user.email }}
    激活{% trans 'Active' %} {{ user.is_active|yesno:"Yes,No,Unkown" }}
    添加日期{% trans 'OTP' %}{{ user.enable_otp|yesno:"Yes,No,Unkown" }}
    {% trans 'Public key fingerprint' %}{{ user.public_key_hash }}
    {% trans 'Date joined' %} {{ user.date_joined|date:"Y-m-d H:i:s" }}
    最后登录{% trans 'Last login' %} {{ user.last_login|date:"Y-m-d H:i:s" }}
    所在用户组{% trans 'Date expired' %}{{ user.date_expired|date:"Y-m-d H:i:s" }}
    {% trans 'User groups' %} - {% for group in user.groups.all %} - - {{ group.name }} - - {% endfor %} + + {% for group in user.groups.all %} + + + + {% endfor %} +
    + {{ group.name }} +
    授权主机数量{% trans 'Perm assets' %} {{ assets | length }}
    授权主机组 - {% for group in asset_groups %} - - {{ group.name }} - - {% endfor %} -
    授权规则 - {% for perm in permissions %} - - {{ perm.name }} - - {% endfor %} - {% trans 'Comment' %}:{{ user.comment }}
    @@ -106,23 +111,49 @@
    -
    -
    -
    - {% trans "Update Public Key" %} - +
    +
    +
    + {% trans 'Quick modify' %}
    -
    -

    {% trans "Paste your SSH Public Key here" %}

    - - +
    + + + + + + + + + + + + + + + + + + + + +
    {% trans 'Reset password' %}: + + + +
    {% trans 'Reset public key' %}: + + + +
    {% trans 'Test admin user' %}: + + + +
    {% trans 'Test system pingpong' %}: + + + +
    diff --git a/apps/users/templates/users/user_profile_update.html b/apps/users/templates/users/user_profile_update.html new file mode 100644 index 000000000..1d926d7c6 --- /dev/null +++ b/apps/users/templates/users/user_profile_update.html @@ -0,0 +1,77 @@ +{% extends 'base.html' %} +{% load static %} +{% load i18n %} +{% load bootstrap %} + +{% block custom_head_css_js %} + + + + + +{% endblock %} +{% block content %} +
    +
    +
    +
    + +
    +
    +
    + {% csrf_token %} +

    {% trans 'Account' %}

    +{# {{ form.avatar|bootstrap_horizontal }}#} + {{ form.username|bootstrap_horizontal }} + {{ form.name|bootstrap_horizontal }} + {{ form.email|bootstrap_horizontal }} + +
    +

    {% trans 'Profile' %}

    + {{ form.phone|bootstrap_horizontal }} + {{ form.wechat|bootstrap_horizontal }} +
    +
    +
    + + +
    +
    +
    +
    +
    +
    +
    +
    +
    +{% endblock %} + +{% block custom_foot_js %} + + +{% endblock %} diff --git a/apps/users/urls/views_urls.py b/apps/users/urls/views_urls.py index 9ec2fecf6..a51b5738e 100644 --- a/apps/users/urls/views_urls.py +++ b/apps/users/urls/views_urls.py @@ -25,6 +25,9 @@ urlpatterns = [ url(r'^profile/$', views.UserProfileView.as_view(), name='user-profile'), + url(r'^profile/update/$', + views.UserProfileUpdateView.as_view(), + name='user-profile-update'), # User view url(r'^user$', views.UserListView.as_view(), name='user-list'), diff --git a/apps/users/views/user.py b/apps/users/views/user.py index eaa9b26b4..03e00ab1b 100644 --- a/apps/users/views/user.py +++ b/apps/users/views/user.py @@ -36,7 +36,9 @@ from perms.models import AssetPermission __all__ = ['UserListView', 'UserCreateView', 'UserDetailView', 'UserUpdateView', 'UserAssetPermissionCreateView', 'UserAssetPermissionView', 'UserGrantedAssetView', - 'UserExportView', 'UserBulkImportView', 'UserProfileView'] + 'UserExportView', 'UserBulkImportView', 'UserProfileView', + 'UserProfileUpdateView', + ] logger = get_logger(__name__) @@ -311,18 +313,40 @@ class UserProfileView(LoginRequiredMixin, TemplateView): template_name = 'users/user_profile.html' def get_context_data(self, **kwargs): - from perms.utils import (get_user_granted_assets, - get_user_granted_asset_groups, - get_user_asset_permissions) + from perms.utils import get_user_granted_assets assets = get_user_granted_assets(self.request.user) - asset_groups = get_user_granted_asset_groups(self.request.user) - permissions = get_user_asset_permissions(self.request.user) context = { 'app': 'User', 'action': 'User Profile', 'assets': assets, - 'asset_groups': asset_groups, - 'permissions': permissions } kwargs.update(context) return super(UserProfileView, self).get_context_data(**kwargs) + + +class UserProfileUpdateView(LoginRequiredMixin, UpdateView): + template_name = 'users/user_profile_update.html' + model = User + form_class = forms.UserProfileForm + success_url = reverse_lazy('users:user-profile') + success_message = _('Create user %s successfully.') + + def get_object(self, queryset=None): + return self.request.user + + def get_success_message(self, cleaned_data): + return self.success_message % ( + reverse_lazy('users:user-detail', kwargs={'pk': self.object.pk}), + self.object.name, + ) + + def get_context_data(self, **kwargs): + from perms.utils import get_user_granted_assets + assets = get_user_granted_assets(self.request.user) + context = { + 'app': 'User', + 'action': 'User Profile', + 'assets': assets, + } + kwargs.update(context) + return super(UserProfileUpdateView, self).get_context_data(**kwargs) \ No newline at end of file