diff --git a/apps/jumpserver/settings.py b/apps/jumpserver/settings.py index 898362e82..395edd221 100644 --- a/apps/jumpserver/settings.py +++ b/apps/jumpserver/settings.py @@ -36,6 +36,7 @@ INSTALLED_APPS = [ 'perms.apps.PermsConfig', 'ops.apps.OpsConfig', 'audits.apps.AuditsConfig', + 'bootstrapform', # 'django.contrib.admin', 'django.contrib.auth', 'django.contrib.contenttypes', @@ -128,3 +129,4 @@ STATICFILES_DIRS = ( ) AUTH_USER_MODEL = 'users.User' +BOOTSTRAP_COLUMN_COUNT = 11 diff --git a/apps/users/forms.py b/apps/users/forms.py new file mode 100644 index 000000000..fb353a1b3 --- /dev/null +++ b/apps/users/forms.py @@ -0,0 +1,15 @@ +# ~*~ coding: utf-8 ~*~ + +from django.forms import ModelForm + +from .models import User, UserGroup + + +class UserForm(ModelForm): + class Meta: + model = User + fields = [ + 'username', 'name', 'email', 'groups', 'wechat', + 'phone', 'enable_2FA', 'role', 'comment', + ] + diff --git a/apps/users/migrations/0003_auto_20160814_1758.py b/apps/users/migrations/0003_auto_20160814_1758.py new file mode 100644 index 000000000..b2f908b2b --- /dev/null +++ b/apps/users/migrations/0003_auto_20160814_1758.py @@ -0,0 +1,56 @@ +# -*- coding: utf-8 -*- +# Generated by Django 1.10 on 2016-08-14 09:58 +from __future__ import unicode_literals + +from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + ('users', '0002_auto_20160814_1237'), + ] + + operations = [ + migrations.AddField( + model_name='user', + name='name', + field=models.CharField(default='guanghongwei', max_length=20), + preserve_default=False, + ), + migrations.AlterField( + model_name='user', + name='avatar', + field=models.ImageField(blank=True, upload_to=b'', verbose_name='\u5934\u50cf'), + ), + migrations.AlterField( + model_name='user', + name='created_by', + field=models.CharField(default='', max_length=30), + ), + migrations.AlterField( + model_name='user', + name='phone', + field=models.CharField(blank=True, max_length=20, verbose_name='\u624b\u673a\u53f7'), + ), + migrations.AlterField( + model_name='user', + name='private_key', + field=models.CharField(blank=True, max_length=5000, verbose_name='ssh\u79c1\u94a5'), + ), + migrations.AlterField( + model_name='user', + name='public_key', + field=models.CharField(blank=True, max_length=1000, verbose_name='\u516c\u94a5'), + ), + migrations.AlterField( + model_name='user', + name='secret_key_2FA', + field=models.CharField(blank=True, max_length=16), + ), + migrations.AlterField( + model_name='user', + name='wechat', + field=models.CharField(blank=True, max_length=30, verbose_name='\u5fae\u4fe1'), + ), + ] diff --git a/apps/users/models.py b/apps/users/models.py index 99a853072..0b31f697d 100644 --- a/apps/users/models.py +++ b/apps/users/models.py @@ -51,7 +51,10 @@ class UserGroup(models.Model): class User(AbstractUser): - groups = models.ManyToManyField(UserGroup) + username = models.CharField(max_length=20, unique=True, verbose_name='用户名') + name = models.CharField(max_length=20, verbose_name='姓名') + email = models.EmailField(max_length=30, unique=True, verbose_name='邮件') + groups = models.ManyToManyField(UserGroup, verbose_name='用户组') avatar = models.ImageField(verbose_name='头像', blank=True) wechat = models.CharField(max_length=30, blank=True, verbose_name='微信') phone = models.CharField(max_length=20, blank=True, verbose_name='手机号') @@ -64,9 +67,5 @@ class User(AbstractUser): created_by = models.CharField(max_length=30, default='') date_expired = models.DateTimeField(default=datetime.datetime.max) - @property - def name(self): - return self.first_name + self.last_name - class Meta: db_table = 'user' diff --git a/apps/users/templates/users/user_add.html b/apps/users/templates/users/user_add.html new file mode 100644 index 000000000..1a7f45aae --- /dev/null +++ b/apps/users/templates/users/user_add.html @@ -0,0 +1,121 @@ +{% extends 'base.html' %} +{% load bootstrap %} + +{% block content %} +
+
+
+
+
+
填写用户信息
+ +
+
+
+ {% csrf_token %} +

账户

+ {{ form.username|bootstrap_horizontal }} + {{ form.name|bootstrap_horizontal }} + {{ form.email|bootstrap_horizontal }} + {{ form.groups|bootstrap_horizontal }} + +
+

密码

+
+ +
+ 生成重置密码连接,通过邮件发送给用户 +
+
+ +
+

角色安全

+
+ +
+ +
+
+
+
+
+
+ +
+
+
+
+ +
+
+
+
+
+
+ + +
+
+
+
+
+
+
+
+{% endblock %} +{% block self_footer_js %} + + +{% endblock %} \ No newline at end of file diff --git a/apps/users/urls.py b/apps/users/urls.py index ae42a4c85..91e674bd3 100644 --- a/apps/users/urls.py +++ b/apps/users/urls.py @@ -1,12 +1,13 @@ from django.conf.urls import url -from .views import UserListView +from .views import UserListView, UserAddView app_name = 'users' urlpatterns = [ url(r'^$', UserListView.as_view(), name='user-list'), url(r'^(?P[0-9]+)/$', UserListView.as_view(), name='user-detail'), + url(r'^add/$', UserAddView.as_view(), name='user-add'), url(r'^(?P[0-9]+)/edit/$', UserListView.as_view(), name='user-edit'), url(r'^(?P[0-9]+)/delete/$', UserListView.as_view(), name='user-delete'), ] diff --git a/apps/users/views.py b/apps/users/views.py index 50472d359..d639ec5cd 100644 --- a/apps/users/views.py +++ b/apps/users/views.py @@ -1,8 +1,10 @@ # ~*~ coding: utf-8 ~*~ from django.views.generic.list import ListView +from django.views.generic.edit import CreateView from .models import User, UserGroup +from .forms import UserForm class UserListView(ListView): @@ -16,3 +18,9 @@ class UserListView(ListView): context.update({'path1': '用户管理', 'path2': '用户列表', 'title': '用户列表'}) return context + +class UserAddView(CreateView): + model = User + form_class = UserForm + template_name = 'users/user_add.html' +