diff --git a/apps/jumpserver/settings.py b/apps/jumpserver/settings.py index 069bd52bf..32ba50722 100644 --- a/apps/jumpserver/settings.py +++ b/apps/jumpserver/settings.py @@ -125,10 +125,11 @@ USE_TZ = True # https://docs.djangoproject.com/en/1.10/howto/static-files/ STATIC_URL = '/static/' +MEDIA_URL = '/media/' STATICFILES_DIRS = ( os.path.join(BASE_DIR, "static"), ) AUTH_USER_MODEL = 'users.User' BOOTSTRAP_COLUMN_COUNT = 11 -MEDIA_ROOT = os.path.join(BASE_DIR, 'img').replace('\\', '/') + '/' +MEDIA_ROOT = os.path.join(BASE_DIR, 'media').replace('\\', '/') + '/' diff --git a/apps/jumpserver/urls.py b/apps/jumpserver/urls.py index f86796eb8..89f7d9dd7 100644 --- a/apps/jumpserver/urls.py +++ b/apps/jumpserver/urls.py @@ -14,10 +14,15 @@ Including another URLconf 2. Add a URL to urlpatterns: url(r'^blog/', include('blog.urls')) """ from django.conf.urls import url, include -#from django.contrib import admin +from django.conf import settings +from django.conf.urls.static import static urlpatterns = [ url(r'^users/', include('users.urls')), url(r'^assets/', include('assets.urls')), # url(r'^admin/', admin.site.urls), ] + +if settings.DEBUG: + urlpatterns += static(settings.MEDIA_URL, document_root=settings.MEDIA_ROOT) + diff --git a/apps/media/avatar/广宏伟蓝底.jpg b/apps/media/avatar/广宏伟蓝底.jpg new file mode 100644 index 000000000..c25759210 Binary files /dev/null and b/apps/media/avatar/广宏伟蓝底.jpg differ diff --git a/apps/static/css/style.css b/apps/static/css/style.css index 38dd7400d..1e8eaa02b 100644 --- a/apps/static/css/style.css +++ b/apps/static/css/style.css @@ -4582,4 +4582,5 @@ body.skin-3 { border-color: #23c6c8; border-style: solid; border-width: 1px -} \ No newline at end of file +} + diff --git a/apps/users/forms.py b/apps/users/forms.py index 9974c47ae..01521980c 100644 --- a/apps/users/forms.py +++ b/apps/users/forms.py @@ -6,11 +6,11 @@ from django import forms from .models import User, UserGroup -class UserForm(ModelForm): +class UserAddForm(ModelForm): class Meta: model = User fields = [ - 'username', 'name', 'email', 'groups', 'wechat', 'avatar', + 'username', 'name', 'email', 'groups', 'wechat', 'phone', 'enable_2FA', 'role', 'date_expired', 'comment', ] # widgets = { @@ -18,3 +18,11 @@ class UserForm(ModelForm): # } +class UserUpdateForm(ModelForm): + class Meta: + model = User + fields = [ + 'name', 'email', 'groups', 'wechat', 'avatar', + 'phone', 'enable_2FA', 'role', 'date_expired', 'comment', + ] + diff --git a/apps/users/models.py b/apps/users/models.py index 1769fb208..0fad694a9 100644 --- a/apps/users/models.py +++ b/apps/users/models.py @@ -61,7 +61,7 @@ class User(AbstractUser): name = models.CharField(max_length=20, verbose_name='姓名', help_text='* required') email = models.EmailField(max_length=30, unique=True, verbose_name='邮件', help_text='* required') groups = models.ManyToManyField(UserGroup, verbose_name='用户组') - avatar = models.ImageField(upload_to="avatar", verbose_name='头像', blank=True) + avatar = models.ImageField(upload_to="avatar", verbose_name='头像') wechat = models.CharField(max_length=30, blank=True, verbose_name='微信') phone = models.CharField(max_length=20, blank=True, verbose_name='手机号') enable_2FA = models.BooleanField(default=False, verbose_name='启用二次验证') diff --git a/apps/users/templates/users/_user.html b/apps/users/templates/users/_user.html index c2d3d742e..36d20ceec 100644 --- a/apps/users/templates/users/_user.html +++ b/apps/users/templates/users/_user.html @@ -26,7 +26,7 @@
-
+ {% csrf_token %}

账户

{% block username %} {% endblock %} diff --git a/apps/users/templates/users/user_detail.html b/apps/users/templates/users/user_detail.html index ae59d61aa..cc8a32907 100644 --- a/apps/users/templates/users/user_detail.html +++ b/apps/users/templates/users/user_detail.html @@ -1,22 +1,25 @@ {% extends 'base.html' %} {% load common_tags %} +{% load users_tags %} {% load static %} -{% block content %} -
-
-
-
-{#
#} +{% block content %} +
+
+
+
+ {#
#}
-
+
- + + + + + + + + + - - - - - - + +
- + Active: +
+
+ + +
+
+
二次验证: +
+
+ + +
+
+
重置密码: + + +
姓名:{{ user.name }}
描述:{{ user.comment }}重置密钥: + + + +
@@ -150,16 +186,17 @@ - + - + - + @@ -172,6 +209,12 @@ - + {% endblock %} +{% block custom_footer_js %} + +{% endblock %} \ No newline at end of file diff --git a/apps/users/templates/users/user_edit.html b/apps/users/templates/users/user_edit.html index 3ee4be3d3..93344d346 100644 --- a/apps/users/templates/users/user_edit.html +++ b/apps/users/templates/users/user_edit.html @@ -3,7 +3,7 @@
- +
{% endblock %} diff --git a/apps/users/templatetags/example_tags.py b/apps/users/templatetags/__init__.py similarity index 100% rename from apps/users/templatetags/example_tags.py rename to apps/users/templatetags/__init__.py diff --git a/apps/users/templatetags/users/example_tags.py b/apps/users/templatetags/users/example_tags.py deleted file mode 100644 index e69de29bb..000000000 diff --git a/apps/users/templatetags/users_tags.py b/apps/users/templatetags/users_tags.py new file mode 100644 index 000000000..64451bd3e --- /dev/null +++ b/apps/users/templatetags/users_tags.py @@ -0,0 +1,38 @@ +# ~*~ coding: utf-8 ~*~ + +import urllib +import hashlib + +from django import template +from django.utils import timezone +from django.conf import settings +from django.conf.urls.static import static + + +register = template.Library() + + +@register.filter +def join_queryset_attr(queryset, attr, delimiter=', '): + return delimiter.join([getattr(obj, attr, '') for obj in queryset]) + + +@register.filter +def is_expired(datetime): + if datetime > timezone.now(): + return False + else: + return True + + +@register.filter +def user_avatar_url(user, size=64): + if user.avatar: + return user.avatar.url + gravatar_url = "https://www.gravatar.com/avatar/" \ + + hashlib.md5(user.email.lower()).hexdigest() + "?" + gravatar_url += urllib.urlencode({'d': 'identicon', 's': str(size)}) + return gravatar_url + + + diff --git a/apps/users/views.py b/apps/users/views.py index a0f27a3d3..1ff8474db 100644 --- a/apps/users/views.py +++ b/apps/users/views.py @@ -7,7 +7,7 @@ from django.views.generic.edit import CreateView, DeleteView, UpdateView from django.views.generic.detail import DetailView from .models import User, UserGroup, Role -from .forms import UserForm +from .forms import UserAddForm, UserUpdateForm class UserListView(ListView): @@ -33,7 +33,7 @@ class UserListView(ListView): class UserAddView(CreateView): model = User - form_class = UserForm + form_class = UserAddForm initial = {'role': Role.objects.get(name='User')} template_name = 'users/user_add.html' success_url = reverse_lazy('users:user-list') @@ -52,17 +52,27 @@ class UserAddView(CreateView): class UserUpdateView(UpdateView): model = User - form_class = UserForm + form_class = UserUpdateForm template_name = 'users/user_edit.html' + context_object_name = 'user' success_url = reverse_lazy('users:user-list') def form_valid(self, form): - user = form.save() + username = self.object.username + user = form.save(commit=False) + user.username = username + user.save() password = self.request.POST.get('password', '') if password: user.set_password(password) return super(UserUpdateView, self).form_valid(form) + def form_invalid(self, form): + print(self.request.FILES) + print(form['avatar'].value()) + print(form.errors) + return super(UserUpdateView, self).form_invalid(form) + class UserDeleteView(DeleteView): model = User @@ -70,7 +80,7 @@ class UserDeleteView(DeleteView): template_name = 'users/user_delete_confirm.html' -class UserDetailView(DeleteView): +class UserDetailView(DetailView): model = User template_name = 'users/user_detail.html' context_object_name = "user"
- + +
姓名:姓名: {{ user.name }}
描述:描述: {{ user.comment }}