Delete Model: Role

pull/530/head
ibuler 2016-08-24 17:14:21 +08:00
parent b97b34961c
commit 1d5faa3101
21 changed files with 119 additions and 177 deletions

File diff suppressed because one or more lines are too long

View File

@ -1 +1 @@
[{"model": "users.role", "pk": 1, "fields": {"name": "Administrator", "date_added": "2016-08-20T17:03:42.631Z", "created_by": "System", "comment": "\u7ba1\u7406\u5458", "permissions": [16, 17, 18, 19, 20, 21, 10, 11, 12, 13, 14, 15, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 1, 2, 3, 4, 5, 6, 7, 8, 9]}}, {"model": "users.role", "pk": 2, "fields": {"name": "User", "date_added": "2016-08-20T17:03:42.671Z", "created_by": "System", "comment": "\u7528\u6237", "permissions": []}}, {"model": "users.role", "pk": 3, "fields": {"name": "Auditor", "date_added": "2016-08-20T17:03:42.683Z", "created_by": "System", "comment": "\u5ba1\u8ba1\u5458", "permissions": []}}, {"model": "users.usergroup", "pk": 1, "fields": {"name": "ALL", "comment": "Default usergroup for all user", "date_added": "2016-08-20T17:03:42.693Z", "created_by": "System"}}, {"model": "users.user", "pk": 1, "fields": {"password": "pbkdf2_sha256$30000$xZUhPadgI8rs$n2rm5futcOv7Ww4b4BflN8K90Vk3u7ozfnOS7GQq0ns=", "last_login": null, "is_superuser": false, "first_name": "", "last_name": "", "is_staff": false, "is_active": true, "date_joined": "2016-08-20T17:03:42.752Z", "username": "admin", "name": "Administrator", "email": "admin@jumpserver.org", "avatar": "", "wechat": "", "phone": "", "enable_otp": false, "secret_key_otp": "", "role": 1, "private_key": "", "public_key": "", "comment": "Administrator is the super user of system", "date_expired": "2086-08-03T17:03:42.753Z", "created_by": "System", "user_permissions": [], "groups": [1]}}] [{"model": "users.role", "pk": 1, "fields": {"name": "Administrator", "date_added": "2016-08-20T17:03:42.631Z", "created_by": "System", "comment": "\u7ba1\u7406\u5458", "permissions": [16, 17, 18, 19, 20, 21, 10, 11, 12, 13, 14, 15, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 1, 2, 3, 4, 5, 6, 7, 8, 9]}}, {"model": "users.role", "pk": 2, "fields": {"name": "User", "date_added": "2016-08-20T17:03:42.671Z", "created_by": "System", "comment": "\u7528\u6237", "permissions": []}}, {"model": "users.role", "pk": 3, "fields": {"name": "Auditor", "date_added": "2016-08-20T17:03:42.683Z", "created_by": "System", "comment": "\u5ba1\u8ba1\u5458", "permissions": []}}, {"model": "users.usergroup", "pk": 1, "fields": {"name": "ALL", "comment": "Default usergroup for all user", "date_added": "2016-08-20T17:03:42.693Z", "created_by": "System"}}, {"model": "users.user", "pk": 1, "fields": {"password": "pbkdf2_sha256$30000$xZUhPadgI8rs$n2rm5futcOv7Ww4b4BflN8K90Vk3u7ozfnOS7GQq0ns=", "last_login": null, "is_superuser": false, "first_name": "", "last_name": "", "is_staff": false, "is_active": true, "date_joined": "2016-08-20T17:03:42.752Z", "username": "admin", "name": "Administrator", "email": "admin@jumpserver.org", "avatar": "", "wechat": "", "phone": "", "enable_otp": false, "secret_key_otp": "", "role": 1, "private_key": "", "public_key": "", "comment": "Administrator is the super user of system", "date_expired": "2086-08-03T17:03:42.753Z", "created_by": "System", "user_permissions": [], "groups": [1]}}][{"model": "users.usergroup", "pk": 1, "fields": {"name": "Default", "comment": "Default user group for all user", "date_added": "2016-08-24T08:24:34.436Z", "created_by": "System"}}, {"model": "users.user", "pk": 1, "fields": {"password": "pbkdf2_sha256$30000$MC3vobX7pa0C$l9qIj4UwHqODnj1hMvVy9DjLxbBumZaioQWIFrWQR7c=", "last_login": null, "first_name": "", "last_name": "", "is_active": true, "date_joined": "2016-08-24T08:24:34.438Z", "username": "admin", "name": "Administrator", "email": "admin@jumpserver.org", "role": "Admin", "avatar": "", "wechat": "", "phone": "", "enable_otp": false, "secret_key_otp": "", "private_key": "", "public_key": "", "comment": "Administrator is the super user of system", "date_expired": "2086-08-07T08:24:34.438Z", "created_by": "System", "user_permissions": [], "groups": [1]}}]

1
apps/fixtures/users.json Normal file
View File

@ -0,0 +1 @@
[{"model": "users.usergroup", "pk": 1, "fields": {"name": "Default", "comment": "Default user group for all user", "date_added": "2016-08-24T08:24:34.436Z", "created_by": "System"}}, {"model": "users.user", "pk": 1, "fields": {"password": "pbkdf2_sha256$30000$MC3vobX7pa0C$l9qIj4UwHqODnj1hMvVy9DjLxbBumZaioQWIFrWQR7c=", "last_login": null, "first_name": "", "last_name": "", "is_active": true, "date_joined": "2016-08-24T08:24:34.438Z", "username": "admin", "name": "Administrator", "email": "admin@jumpserver.org", "role": "Admin", "avatar": "", "wechat": "", "phone": "", "enable_otp": false, "secret_key_otp": "", "private_key": "", "public_key": "", "comment": "Administrator is the super user of system", "date_expired": "2086-08-07T08:24:34.438Z", "created_by": "System", "user_permissions": [], "groups": [1]}}]

File diff suppressed because one or more lines are too long

View File

@ -31,7 +31,7 @@ urlpatterns = [
url(r'^users/', include('users.urls')), url(r'^users/', include('users.urls')),
url(r'^assets/', include('assets.urls')), url(r'^assets/', include('assets.urls')),
url(r'^terminal/', include('webterminal.urls')), url(r'^terminal/', include('webterminal.urls')),
url(r'^api/(?P<version>.*)/(?P<module>.*)/(?P<api>.*)', view), # url(r'^api/(?P<version>.*)/(?P<module>.*)/(?P<api>.*)', view),
# url(r'^admin/', admin.site.urls), # url(r'^admin/', admin.site.urls),
] ]

View File

@ -2,7 +2,7 @@
{% if is_paginated %} {% if is_paginated %}
<div class="col-sm-4"> <div class="col-sm-4">
<div class="dataTables_info text-center" id="editable_info" role="status" aria-live="polite"> <div class="dataTables_info text-center" id="editable_info" role="status" aria-live="polite">
Showing {{ page_obj.start_index }} to {{ page_obj.end_index }} of {{ paginator.count }} entries {{ page_obj.start_index }} - {{ page_obj.end_index }} of {{ paginator.count }}
</div> </div>
</div> </div>
<div class="col-sm-4"> <div class="col-sm-4">

View File

@ -1,12 +1,18 @@
# ~*~ coding: utf-8 ~*~ # ~*~ coding: utf-8 ~*~
# #
from rest_framework import viewsets from rest_framework import generics
from rest_framework import mixins
from .serializers import UserSerializer from .serializers import UserSerializer
from .models import User, UserGroup, Role from .models import User, UserGroup
class UserViewSet(viewsets.ModelViewSet): class UserListApi(generics.ListCreateAPIView):
queryset = User.objects.all()
serializer_class = UserSerializer
class UserDetailApi(generics.RetrieveUpdateDestroyAPIView):
queryset = User.objects.all() queryset = User.objects.all()
serializer_class = UserSerializer serializer_class = UserSerializer

View File

@ -3,8 +3,10 @@
from django.conf.urls import url, include from django.conf.urls import url, include
from .api import UserViewSet from .api import UserListApi, UserDetailApi
urlpatterns = [ urlpatterns = [
url(r'^v1/users/$', UserListApi.as_view()),
url(r'^v1/users/(?P<pk>[0-9]+)/$', UserDetailApi.as_view()),
] ]

View File

@ -17,7 +17,6 @@ class UserAddForm(ModelForm):
help_texts = { help_texts = {
'username': '* required', 'username': '* required',
'email': '* required', 'email': '* required',
'groups': '* required'
} }
widgets = { widgets = {

View File

@ -1,10 +1,9 @@
# -*- coding: utf-8 -*- # -*- coding: utf-8 -*-
# Generated by Django 1.10 on 2016-08-20 16:21 # Generated by Django 1.10 on 2016-08-24 08:23
from __future__ import unicode_literals from __future__ import unicode_literals
import django.contrib.auth.models import django.contrib.auth.models
from django.db import migrations, models from django.db import migrations, models
import django.db.models.deletion
import django.utils.timezone import django.utils.timezone
import users.models import users.models
@ -24,15 +23,14 @@ class Migration(migrations.Migration):
('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
('password', models.CharField(max_length=128, verbose_name='password')), ('password', models.CharField(max_length=128, verbose_name='password')),
('last_login', models.DateTimeField(blank=True, null=True, verbose_name='last login')), ('last_login', models.DateTimeField(blank=True, null=True, verbose_name='last login')),
('is_superuser', models.BooleanField(default=False, help_text='Designates that this user has all permissions without explicitly assigning them.', verbose_name='superuser status')),
('first_name', models.CharField(blank=True, max_length=30, verbose_name='first name')), ('first_name', models.CharField(blank=True, max_length=30, verbose_name='first name')),
('last_name', models.CharField(blank=True, max_length=30, verbose_name='last name')), ('last_name', models.CharField(blank=True, max_length=30, verbose_name='last name')),
('is_staff', models.BooleanField(default=False, help_text='Designates whether the user can log into this admin site.', verbose_name='staff status')),
('is_active', models.BooleanField(default=True, help_text='Designates whether this user should be treated as active. Unselect this instead of deleting accounts.', verbose_name='active')), ('is_active', models.BooleanField(default=True, help_text='Designates whether this user should be treated as active. Unselect this instead of deleting accounts.', verbose_name='active')),
('date_joined', models.DateTimeField(default=django.utils.timezone.now, verbose_name='date joined')), ('date_joined', models.DateTimeField(default=django.utils.timezone.now, verbose_name='date joined')),
('username', models.CharField(max_length=20, unique=True, verbose_name='\u7528\u6237\u540d')), ('username', models.CharField(max_length=20, unique=True, verbose_name='\u7528\u6237\u540d')),
('name', models.CharField(help_text='* required', max_length=20, verbose_name='\u59d3\u540d')), ('name', models.CharField(blank=True, max_length=20, verbose_name='\u59d3\u540d')),
('email', models.EmailField(help_text='* required', max_length=30, unique=True, verbose_name='\u90ae\u4ef6')), ('email', models.EmailField(max_length=30, unique=True, verbose_name='\u90ae\u4ef6')),
('role', models.CharField(choices=[('Admin', '\u7ba1\u7406\u5458'), ('User', '\u7528\u6237')], default='User', max_length=10, verbose_name='\u89d2\u8272')),
('avatar', models.ImageField(upload_to='avatar', verbose_name='\u5934\u50cf')), ('avatar', models.ImageField(upload_to='avatar', verbose_name='\u5934\u50cf')),
('wechat', models.CharField(blank=True, max_length=30, verbose_name='\u5fae\u4fe1')), ('wechat', models.CharField(blank=True, max_length=30, verbose_name='\u5fae\u4fe1')),
('phone', models.CharField(blank=True, max_length=20, verbose_name='\u624b\u673a\u53f7')), ('phone', models.CharField(blank=True, max_length=20, verbose_name='\u624b\u673a\u53f7')),
@ -51,18 +49,6 @@ class Migration(migrations.Migration):
('objects', django.contrib.auth.models.UserManager()), ('objects', django.contrib.auth.models.UserManager()),
], ],
), ),
migrations.CreateModel(
name='Role',
fields=[
('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
('name', models.CharField(max_length=80, unique=True, verbose_name='name')),
('comment', models.CharField(blank=True, max_length=80)),
('permissions', models.ManyToManyField(blank=True, to='auth.Permission', verbose_name='permissions')),
],
options={
'db_table': 'role',
},
),
migrations.CreateModel( migrations.CreateModel(
name='UserGroup', name='UserGroup',
fields=[ fields=[
@ -79,12 +65,7 @@ class Migration(migrations.Migration):
migrations.AddField( migrations.AddField(
model_name='user', model_name='user',
name='groups', name='groups',
field=models.ManyToManyField(help_text='* required', to='users.UserGroup', verbose_name='\u7528\u6237\u7ec4'), field=models.ManyToManyField(to='users.UserGroup', verbose_name='\u7528\u6237\u7ec4'),
),
migrations.AddField(
model_name='user',
name='role',
field=models.ForeignKey(on_delete=django.db.models.deletion.PROTECT, to='users.Role', verbose_name='\u89d2\u8272'),
), ),
migrations.AddField( migrations.AddField(
model_name='user', model_name='user',

View File

@ -1,28 +0,0 @@
# -*- coding: utf-8 -*-
# Generated by Django 1.10 on 2016-08-20 16:51
from __future__ import unicode_literals
from django.db import migrations, models
import django.utils.timezone
class Migration(migrations.Migration):
dependencies = [
('users', '0001_initial'),
]
operations = [
migrations.AddField(
model_name='role',
name='created_by',
field=models.CharField(default='System', max_length=100),
preserve_default=False,
),
migrations.AddField(
model_name='role',
name='date_added',
field=models.DateTimeField(auto_now_add=True, default=django.utils.timezone.now),
preserve_default=False,
),
]

View File

@ -1,30 +0,0 @@
# -*- coding: utf-8 -*-
# Generated by Django 1.10 on 2016-08-22 05:16
from __future__ import unicode_literals
from django.db import migrations, models
class Migration(migrations.Migration):
dependencies = [
('users', '0002_auto_20160821_0051'),
]
operations = [
migrations.AlterField(
model_name='user',
name='email',
field=models.EmailField(max_length=30, unique=True, verbose_name='\u90ae\u4ef6'),
),
migrations.AlterField(
model_name='user',
name='groups',
field=models.ManyToManyField(to='users.UserGroup', verbose_name='\u7528\u6237\u7ec4'),
),
migrations.AlterField(
model_name='user',
name='name',
field=models.CharField(max_length=20, verbose_name='\u59d3\u540d'),
),
]

View File

@ -10,43 +10,43 @@ from django.contrib.auth.models import AbstractUser, Permission
from django.db import OperationalError from django.db import OperationalError
class Role(models.Model): # class Role(models.Model):
name = models.CharField('name', max_length=80, unique=True) # name = models.CharField('name', max_length=80, unique=True)
permissions = models.ManyToManyField( # permissions = models.ManyToManyField(
Permission, # Permission,
verbose_name='permissions', # verbose_name='permissions',
blank=True, # blank=True,
) # )
date_added = models.DateTimeField(auto_now_add=True) # date_added = models.DateTimeField(auto_now_add=True)
created_by = models.CharField(max_length=100) # created_by = models.CharField(max_length=100)
comment = models.CharField(max_length=80, blank=True) # comment = models.CharField(max_length=80, blank=True)
#
# def __unicode__(self):
# return self.name
#
# def delete(self, using=None, keep_parents=False):
# if self.user_set.all().count() > 0:
# raise OperationalError('Role %s has some member, should not be delete.' % self.name)
# else:
# return super(Role, self).delete(using=using, keep_parents=keep_parents)
#
# class Meta:
# db_table = 'role'
#
# @classmethod
# def initial(cls):
# roles = {
# 'Administrator': {'permissions': Permission.objects.all(), 'comment': '管理员'},
# 'User': {'permissions': [], 'comment': '用户'},
# 'Auditor': {'permissions': Permission.objects.filter(content_type__app_label='audits'),
# 'comment': '审计员'},
# }
def __unicode__(self): # for role_name, props in roles.items():
return self.name # if not cls.objects.filter(name=role_name):
# role = cls.objects.create(name=role_name, comment=props.get('comment', ''), created_by='System')
def delete(self, using=None, keep_parents=False): # if props.get('permissions'):
if self.user_set.all().count() > 0: # role.permissions = props.get('permissions')
raise OperationalError('Role %s has some member, should not be delete.' % self.name)
else:
return super(Role, self).delete(using=using, keep_parents=keep_parents)
class Meta:
db_table = 'role'
@classmethod
def initial(cls):
roles = {
'Administrator': {'permissions': Permission.objects.all(), 'comment': '管理员'},
'User': {'permissions': [], 'comment': '用户'},
'Auditor': {'permissions': Permission.objects.filter(content_type__app_label='audits'),
'comment': '审计员'},
}
for role_name, props in roles.items():
if not cls.objects.filter(name=role_name):
role = cls.objects.create(name=role_name, comment=props.get('comment', ''), created_by='System')
if props.get('permissions'):
role.permissions = props.get('permissions')
class UserGroup(models.Model): class UserGroup(models.Model):
@ -91,20 +91,25 @@ def date_expired_default():
class User(AbstractUser): class User(AbstractUser):
ROLE_CHOICES = (
('Admin', '管理员'),
('User', '用户'),
)
username = models.CharField(max_length=20, unique=True, verbose_name='用户名') username = models.CharField(max_length=20, unique=True, verbose_name='用户名')
name = models.CharField(max_length=20, blank=True, verbose_name='姓名') name = models.CharField(max_length=20, blank=True, verbose_name='姓名')
email = models.EmailField(max_length=30, unique=True, verbose_name='邮件') email = models.EmailField(max_length=30, unique=True, verbose_name='邮件')
groups = models.ManyToManyField(UserGroup, verbose_name='用户组') groups = models.ManyToManyField(UserGroup, blank=True, verbose_name='用户组')
role = models.CharField(choices=ROLE_CHOICES, default='User', max_length=10, blank=True, verbose_name='角色')
avatar = models.ImageField(upload_to="avatar", verbose_name='头像') avatar = models.ImageField(upload_to="avatar", verbose_name='头像')
wechat = models.CharField(max_length=30, blank=True, verbose_name='微信') wechat = models.CharField(max_length=30, blank=True, verbose_name='微信')
phone = models.CharField(max_length=20, blank=True, verbose_name='手机号') phone = models.CharField(max_length=20, blank=True, verbose_name='手机号')
enable_otp = models.BooleanField(default=False, verbose_name='启用二次验证') enable_otp = models.BooleanField(default=False, verbose_name='启用二次验证')
secret_key_otp = models.CharField(max_length=16, blank=True) secret_key_otp = models.CharField(max_length=16, blank=True)
role = models.ForeignKey(Role, on_delete=models.SET('None'), verbose_name='角色')
private_key = models.CharField(max_length=5000, blank=True, verbose_name='ssh私钥') # ssh key max length 4096 bit 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='公钥') public_key = models.CharField(max_length=1000, blank=True, verbose_name='公钥')
comment = models.TextField(max_length=200, blank=True, verbose_name='描述') comment = models.TextField(max_length=200, blank=True, verbose_name='描述')
date_expired = models.DateTimeField(default=date_expired_default, verbose_name='有效期') date_expired = models.DateTimeField(default=date_expired_default, blank=True, null=True, verbose_name='有效期')
created_by = models.CharField(max_length=30, default='') created_by = models.CharField(max_length=30, default='')
@property @property
@ -120,16 +125,43 @@ class User(AbstractUser):
def password_raw(self, raw_password): def password_raw(self, raw_password):
self.set_password(raw_password) self.set_password(raw_password)
@property
def is_expired(self): def is_expired(self):
if self.date_expired > timezone.now(): if self.date_expired > timezone.now():
return False return False
else: else:
return True return True
@property
def is_superuser(self):
if self.role == 'Admin':
return True
else:
return False
@is_superuser.setter
def is_superuser(self, value):
if value is True:
self.role = 'Admin'
else:
self.role = 'User'
@property
def is_staff(self):
if self.is_authenticated and self.is_active and not self.is_expired:
return True
else:
return False
@is_staff.setter
def is_staff(self, value):
pass
def save(self, *args, **kwargs): def save(self, *args, **kwargs):
# If user not set name, it's default equal username # If user not set name, it's default equal username
if not self.name: if not self.name:
self.name = self.username self.name = self.username
super(User, self).save(*args, **kwargs) super(User, self).save(*args, **kwargs)
# Set user default group 'All' # Set user default group 'All'
# Todo: It's have bug # Todo: It's have bug
@ -148,7 +180,7 @@ class User(AbstractUser):
email='admin@jumpserver.org', email='admin@jumpserver.org',
name='Administrator', name='Administrator',
password_raw='admin', password_raw='admin',
role=Role.objects.get(name='Administrator'), role='Admin',
comment='Administrator is the super user of system', comment='Administrator is the super user of system',
created_by='System') created_by='System')
user.save() user.save()
@ -166,11 +198,11 @@ class User(AbstractUser):
email=forgery_py.internet.email_address(), email=forgery_py.internet.email_address(),
name=forgery_py.name.full_name(), name=forgery_py.name.full_name(),
password=make_password(forgery_py.lorem_ipsum.word()), password=make_password(forgery_py.lorem_ipsum.word()),
role=choice(Role.objects.all()), role=choice(dict(User.ROLE_CHOICES).keys()),
wechat=forgery_py.internet.user_name(True), wechat=forgery_py.internet.user_name(True),
comment=forgery_py.lorem_ipsum.sentence(), comment=forgery_py.lorem_ipsum.sentence(),
created_by=choice(cls.objects.all()).username, created_by=choice(cls.objects.all()).username,
) )
try: try:
user.save() user.save()
except IntegrityError: except IntegrityError:
@ -181,12 +213,12 @@ class User(AbstractUser):
def init_all_models(): def init_all_models():
for model in (Role, UserGroup, User): for model in (UserGroup, User):
if hasattr(model, 'initial'): if hasattr(model, 'initial'):
model.initial() model.initial()
def generate_fake(): def generate_fake():
for model in (Role, UserGroup, User): for model in (UserGroup, User):
if hasattr(model, 'generate_fake'): if hasattr(model, 'generate_fake'):
model.generate_fake() model.generate_fake()

View File

@ -3,13 +3,16 @@
from rest_framework import serializers from rest_framework import serializers
from .models import Role, User, UserGroup from .models import User, UserGroup
class UserSerializer(serializers.ModelSerializer): class UserSerializer(serializers.ModelSerializer):
class Meta: class Meta:
model = User model = User
exclude = ['first_name', 'last_name', 'is_staff'] exclude = [
'password', 'first_name', 'last_name', 'is_staff', 'secret_key_otp',
'private_key', 'public_key',
]
class UserGroupSerializer(serializers.ModelSerializer): class UserGroupSerializer(serializers.ModelSerializer):
@ -18,7 +21,3 @@ class UserGroupSerializer(serializers.ModelSerializer):
fields = '__all__' fields = '__all__'
class RoleSerializer(serializers.ModelSerializer):
class Meta:
model = Role
fields = '__all__'

View File

@ -31,8 +31,8 @@
{% csrf_token %} {% csrf_token %}
<h3>账户</h3> <h3>账户</h3>
{% block username %} {% endblock %} {% block username %} {% endblock %}
{{ form.name|bootstrap_horizontal }}
{{ form.email|bootstrap_horizontal }} {{ form.email|bootstrap_horizontal }}
{{ form.name|bootstrap_horizontal }}
{{ form.groups|bootstrap_horizontal }} {{ form.groups|bootstrap_horizontal }}
<div class="hr-line-dashed"></div> <div class="hr-line-dashed"></div>

View File

@ -92,7 +92,7 @@
{% endif %} {% endif %}
<tr> <tr>
<td>角色:</td> <td>角色:</td>
<td><b>{{ user.role.name }}</b></td> <td><b>{{ user.get_role_display }}</b></td>
</tr> </tr>
<tr> <tr>
<td>有效期:</td> <td>有效期:</td>

View File

@ -30,7 +30,7 @@
</a> </a>
</td> </td>
<td class="text-center">{{ user.username }}</td> <td class="text-center">{{ user.username }}</td>
<td class="text-center">{{ user.role.name }}</td> <td class="text-center">{{ user.get_role_display }}</td>
<td class="text-center" title="{% for user_group in user.group.all %} {{ user_group.name }} {% endfor %}"> {{ user.groups.all|join_queryset_attr:"name" }} </td> <td class="text-center" title="{% for user_group in user.group.all %} {{ user_group.name }} {% endfor %}"> {{ user.groups.all|join_queryset_attr:"name" }} </td>
<th class="text-center">{{ user.name }}</th> <th class="text-center">{{ user.name }}</th>
<td class="text-center"> <td class="text-center">

View File

@ -4,7 +4,7 @@
from random import choice from random import choice
import forgery_py import forgery_py
from users.models import User, UserGroup, Role, init_all_models from users.models import User, UserGroup, init_all_models
def gen_username(): def gen_username():
@ -20,5 +20,5 @@ def gen_name():
def get_role(): def get_role():
role = choice(Role.objects.all()) role = choice(dict(User.ROLE_CHOICES).keys())
return role return role

View File

@ -3,9 +3,9 @@
from django.utils import timezone from django.utils import timezone
from django.shortcuts import reverse from django.shortcuts import reverse
from django.test import TestCase, Client, TransactionTestCase from django.test import TestCase, TransactionTestCase
from django.db import IntegrityError from django.db import IntegrityError
from users.models import User, UserGroup, Role, init_all_models from users.models import User, UserGroup, init_all_models
from django.contrib.auth.models import Permission from django.contrib.auth.models import Permission
from .base import gen_name, gen_username, gen_email, get_role from .base import gen_name, gen_username, gen_email, get_role
@ -22,8 +22,6 @@ class UserModelTest(TransactionTestCase):
def test_initial(self): def test_initial(self):
self.assertEqual(User.objects.all().count(), 2) self.assertEqual(User.objects.all().count(), 2)
self.assertEqual(Role.objects.all().count(), 3)
self.assertEqual(UserGroup.objects.all().count(), 1)
@property @property
def role(self): def role(self):
@ -32,7 +30,7 @@ class UserModelTest(TransactionTestCase):
# 创建一个姓名一致的用户, 应该创建成功 # 创建一个姓名一致的用户, 应该创建成功
def test_user_name_duplicate(self): def test_user_name_duplicate(self):
user1 = User(name='test', username=gen_username(), password_raw=gen_username(), user1 = User(name='test', username=gen_username(), password_raw=gen_username(),
email=gen_email(), role=self.role) email=gen_email())
try: try:
user1.save() user1.save()
user1.delete() user1.delete()
@ -59,7 +57,7 @@ class UserModelTest(TransactionTestCase):
user = User(name=gen_name(), username=gen_username(), user = User(name=gen_name(), username=gen_username(),
email=gen_email(), role=self.role, date_expired=date) email=gen_email(), role=self.role, date_expired=date)
self.assertTrue(user.is_expired()) self.assertTrue(user.is_expired)
# 测试用户默认会输入All用户组 # 测试用户默认会输入All用户组
def test_user_with_default_group(self): def test_user_with_default_group(self):
@ -80,26 +78,6 @@ class UserModelTest(TransactionTestCase):
def tearDown(self): def tearDown(self):
User.objects.all().delete() User.objects.all().delete()
UserGroup.objects.all().delete() UserGroup.objects.all().delete()
Role.objects.all().delete()
class RoleModelTestCase(TransactionTestCase):
def setUp(self):
Role.objects.all().delete()
Role.initial()
def test_role_initial(self):
self.assertEqual(Role.objects.all().count(), 3)
def test_create_new_role(self):
role = Role(name=gen_name(), comment=gen_name()*3)
role.save()
role.permissions = Permission.objects.all()
role.save()
self.assertEqual(Role.objects.count(), 4)
role = Role.objects.last()
self.assertEqual(role.permissions.all().count(), Permission.objects.all().count())
class UserGroupModelTestCase(TransactionTestCase): class UserGroupModelTestCase(TransactionTestCase):

View File

@ -2,7 +2,7 @@
# -*- coding: utf-8 -*- # -*- coding: utf-8 -*-
# #
from users.models import User, UserGroup, Role, init_all_models from users.models import User, UserGroup, init_all_models
from django.shortcuts import reverse from django.shortcuts import reverse
from django.test import TestCase, Client, TransactionTestCase from django.test import TestCase, Client, TransactionTestCase
@ -45,7 +45,7 @@ class UserAddTests(TestCase):
'name': gen_name(), 'name': gen_name(),
'email': gen_email(), 'email': gen_email(),
'groups': [UserGroup.objects.first().id, ], 'groups': [UserGroup.objects.first().id, ],
'role': get_role().id, 'role': get_role(),
'date_expired': '2086-08-06 19:12:22', 'date_expired': '2086-08-06 19:12:22',
} }

View File

@ -11,7 +11,7 @@ from django.views.generic.detail import DetailView
from django.contrib.messages.views import SuccessMessageMixin from django.contrib.messages.views import SuccessMessageMixin
from django.conf import settings from django.conf import settings
from .models import User, UserGroup, Role from .models import User, UserGroup
from .forms import UserAddForm, UserUpdateForm, UserGroupForm from .forms import UserAddForm, UserUpdateForm, UserGroupForm
@ -53,9 +53,10 @@ class UserAddView(SuccessMessageMixin, CreateView):
return context return context
def form_valid(self, form): def form_valid(self, form):
user = form.save() user = form.save(commit=False)
user.created_by = self.request.user.username or 'Admin' user.created_by = self.request.user.username or 'System'
user.save() user.save()
form.save_m2m()
return super(UserAddView, self).form_valid(form) return super(UserAddView, self).form_valid(form)
def get_success_message(self, cleaned_data): def get_success_message(self, cleaned_data):