diff --git a/apps/templates/_pagination.html b/apps/templates/_pagination.html new file mode 100644 index 000000000..2ff5048f0 --- /dev/null +++ b/apps/templates/_pagination.html @@ -0,0 +1,57 @@ +{% if is_paginated %} +
+
+
+ Showing {{ page_obj.start_index }} to {{ page_obj.end_index }} of {{ paginator.count }} entries +
+
+
+
+ +
+
+
+{% endif %} + diff --git a/apps/users/migrations/0002_auto_20160814_1237.py b/apps/users/migrations/0002_auto_20160814_1237.py new file mode 100644 index 000000000..63caa6e9a --- /dev/null +++ b/apps/users/migrations/0002_auto_20160814_1237.py @@ -0,0 +1,57 @@ +# -*- coding: utf-8 -*- +# Generated by Django 1.10 on 2016-08-14 04:37 +from __future__ import unicode_literals + +import datetime +from django.db import migrations, models +import django.db.models.deletion + + +class Migration(migrations.Migration): + + dependencies = [ + ('users', '0001_initial'), + ] + + operations = [ + migrations.AddField( + model_name='user', + name='comment', + field=models.CharField(blank=True, max_length=200, verbose_name='\u63cf\u8ff0'), + ), + migrations.AlterField( + model_name='user', + name='date_expired', + field=models.DateTimeField(default=datetime.datetime(9999, 12, 31, 23, 59, 59, 999999)), + ), + migrations.AlterField( + model_name='user', + name='phone', + field=models.CharField(max_length=20, verbose_name='\u624b\u673a\u53f7'), + ), + migrations.AlterField( + model_name='user', + name='private_key', + field=models.CharField(max_length=5000, verbose_name='ssh\u79c1\u94a5'), + ), + migrations.AlterField( + model_name='user', + name='public_key', + field=models.CharField(max_length=1000, verbose_name='\u516c\u94a5'), + ), + migrations.AlterField( + model_name='user', + name='role', + field=models.ForeignKey(on_delete=django.db.models.deletion.PROTECT, to='users.Role', verbose_name='\u89d2\u8272'), + ), + migrations.AlterField( + model_name='usergroup', + name='comment', + field=models.TextField(blank=True, verbose_name='\u63cf\u8ff0'), + ), + migrations.AlterField( + model_name='usergroup', + name='name', + field=models.CharField(max_length=100, unique=True, verbose_name='\u7ec4\u540d\u79f0'), + ), + ] diff --git a/apps/users/models.py b/apps/users/models.py index 410608454..99a853072 100644 --- a/apps/users/models.py +++ b/apps/users/models.py @@ -2,8 +2,10 @@ from __future__ import unicode_literals +import datetime + from django.db import models -from django.contrib.auth.models import AbstractUser +from django.contrib.auth.models import AbstractUser, Permission from django.contrib.auth.models import Group as AbstractGroup @@ -16,10 +18,28 @@ class Role(AbstractGroup): class Meta: db_table = 'role' + @classmethod + def init(cls): + roles = { + 'Administrator': {'permissions': Permission.objects.all(), 'comment': '管理员'}, + 'User': {'permissions': [], 'comment': '用户'}, + 'Auditor': {'permissions': Permission.objects.filter(content_type__app_label='audits'), + 'comment': '审计员'}, + } + + for role in cls.objects.all(): + role.permissions.clear() + + cls.objects.all().delete() + + for role_name, props in roles.items(): + role = cls.objects.create(name=role_name, comment=props.get('comment', '')) + role.permissions = props.get('permissions', []) + class UserGroup(models.Model): - name = models.CharField(max_length=100, unique=True, verbose_name='组名称', help_text='请输入组名称') - comment = models.TextField(blank=True, verbose_name='描述', help_text='请输入用户组描述') + name = models.CharField(max_length=100, unique=True, verbose_name='组名称') + comment = models.TextField(blank=True, verbose_name='描述') date_added = models.DateTimeField(auto_now_add=True) created_by = models.CharField(max_length=100) @@ -32,16 +52,17 @@ class UserGroup(models.Model): class User(AbstractUser): groups = models.ManyToManyField(UserGroup) - avatar = models.ImageField(verbose_name='头像', default='') - wechat = models.CharField(max_length=30, verbose_name='微信') - phone = models.CharField(max_length=20, 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='手机号') enable_2FA = models.BooleanField(default=False, verbose_name='启用二次验证') - secret_key_2FA = models.CharField(max_length=16) - role = models.ForeignKey(Role, on_delete=models.PROTECT) - private_key = models.CharField(max_length=5000) # ssh key max length 4096 bit - public_key = models.CharField(max_length=1000) - created_by = models.CharField(max_length=30) - date_expired = models.DateTimeField() + secret_key_2FA = models.CharField(max_length=16, blank=True) + role = models.ForeignKey(Role, on_delete=models.PROTECT, verbose_name='角色') + private_key = models.CharField(max_length=5000, blank=True, verbose_name='ssh私钥') # ssh key max length 4096 bit + public_key = models.CharField(max_length=1000, blank=True, verbose_name='公钥') + comment = models.CharField(max_length=200, blank=True, verbose_name='描述') + created_by = models.CharField(max_length=30, default='') + date_expired = models.DateTimeField(default=datetime.datetime.max) @property def name(self): diff --git a/apps/users/templates/example.html b/apps/users/templates/example.html deleted file mode 100644 index e69de29bb..000000000 diff --git a/apps/users/templates/users/example.html b/apps/users/templates/users/example.html deleted file mode 100644 index e69de29bb..000000000 diff --git a/apps/users/templates/users/user_list.html b/apps/users/templates/users/user_list.html new file mode 100644 index 000000000..9bd2ba2dc --- /dev/null +++ b/apps/users/templates/users/user_list.html @@ -0,0 +1,84 @@ +{% extends 'base.html' %} +{% block content %} +
+
+
+
+
+
查看用户
+ +
+ +
+
+ 添加用户 + 删除所选 + +
+ + + + + + + + + + + + + + + + {% for user in user_list %} + + + + + + + + + + + {% endfor %} + +
+ + 姓名用户名角色用户组资产数量有效
+ + + + {{ user.name }} + + {{ user.username }}{{ user.role.name }} {{ user.group.all }} {{ user.name }}{{ user.name }} + 编辑 + 删除 +
+ {% include '_pagination.html' %} +
+
+
+
+
+ +{% endblock %} diff --git a/apps/users/urls.py b/apps/users/urls.py index 88dda0ca6..ae42a4c85 100644 --- a/apps/users/urls.py +++ b/apps/users/urls.py @@ -1,8 +1,12 @@ from django.conf.urls import url -from . import views + +from .views import UserListView app_name = 'users' urlpatterns = [ - url(r'hello/$', views.hello, name='hello'), + url(r'^$', UserListView.as_view(), name='user-list'), + url(r'^(?P[0-9]+)/$', UserListView.as_view(), name='user-detail'), + 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 0e70df618..50472d359 100644 --- a/apps/users/views.py +++ b/apps/users/views.py @@ -1,6 +1,18 @@ -from django.shortcuts import render -from django.views.generic.base import TemplateView +# ~*~ coding: utf-8 ~*~ + +from django.views.generic.list import ListView + +from .models import User, UserGroup -def hello(request): - return render(request, 'base.html') +class UserListView(ListView): + model = User + paginate_by = 10 + context_object_name = 'user_list' + template_name = 'users/user_list.html' + + def get_context_data(self, **kwargs): + context = super(UserListView, self).get_context_data(**kwargs) + context.update({'path1': '用户管理', 'path2': '用户列表', 'title': '用户列表'}) + return context + diff --git a/requirements.txt b/requirements.txt index e69de29bb..0a8cd2bb2 100644 --- a/requirements.txt +++ b/requirements.txt @@ -0,0 +1,2 @@ +django==1.10 +pillow \ No newline at end of file