Add user perm model and form

pull/530/head
ibuler 2016-09-11 09:50:42 +08:00
parent 627a5825f4
commit 70cae93a4b
8 changed files with 283 additions and 95 deletions

View File

@ -1,10 +1,11 @@
# ~*~ coding: utf-8 ~*~ # ~*~ coding: utf-8 ~*~
from rest_framework import serializers from rest_framework import serializers
from .models import (
AssetGroup,Asset,IDC,AssetExtend
)
from rest_framework import viewsets, serializers from rest_framework import viewsets, serializers
from .models import AssetGroup, Asset, IDC, AssetExtend
class AssetGroupSerializer(serializers.ModelSerializer): class AssetGroupSerializer(serializers.ModelSerializer):
class Meta: class Meta:
model = AssetGroup model = AssetGroup
@ -13,11 +14,13 @@ class AssetGroupSerializer(serializers.ModelSerializer):
# 'private_key', 'public_key', 'avatar', # 'private_key', 'public_key', 'avatar',
# ] # ]
class AssetSerializer(serializers.ModelSerializer): class AssetSerializer(serializers.ModelSerializer):
class Meta: class Meta:
model = Asset model = Asset
# fields = ('id', 'title', 'code', 'linenos', 'language', 'style') # fields = ('id', 'title', 'code', 'linenos', 'language', 'style')
class IDCSerializer(serializers.ModelSerializer): class IDCSerializer(serializers.ModelSerializer):
class Meta: class Meta:
model = IDC model = IDC
@ -25,8 +28,10 @@ class IDCSerializer(serializers.ModelSerializer):
class AssetGroupViewSet(viewsets.ModelViewSet): class AssetGroupViewSet(viewsets.ModelViewSet):
""" """ API endpoint that allows AssetGroup to be viewed or edited.
API endpoint that allows AssetGroup to be viewed or edited.
some other comment
""" """
queryset = AssetGroup.objects.all() queryset = AssetGroup.objects.all()
serializer_class = AssetGroupSerializer serializer_class = AssetGroupSerializer

View File

@ -12,3 +12,4 @@
from users.utils import AdminUserRequiredMixin from users.utils import AdminUserRequiredMixin
from users.models import User, UserGroup

View File

@ -1,5 +1,5 @@
# -*- coding: utf-8 -*- # -*- coding: utf-8 -*-
# Generated by Django 1.10 on 2016-09-08 03:02 # Generated by Django 1.10 on 2016-09-10 16:40
from __future__ import unicode_literals from __future__ import unicode_literals
from django.db import migrations, models from django.db import migrations, models
@ -43,7 +43,7 @@ class Migration(migrations.Migration):
('port', models.IntegerField(blank=True, null=True, verbose_name='Port')), ('port', models.IntegerField(blank=True, null=True, verbose_name='Port')),
('username', models.CharField(blank=True, max_length=16, null=True, verbose_name='Admin user')), ('username', models.CharField(blank=True, max_length=16, null=True, verbose_name='Admin user')),
('password', models.CharField(blank=True, max_length=256, null=True, verbose_name='Admin password')), ('password', models.CharField(blank=True, max_length=256, null=True, verbose_name='Admin password')),
('mac_addr', models.CharField(blank=True, max_length=20, null=True, verbose_name='Mac address')), ('mac_address', models.CharField(blank=True, max_length=20, null=True, verbose_name='Mac address')),
('brand', models.CharField(blank=True, max_length=64, null=True, verbose_name='Brand')), ('brand', models.CharField(blank=True, max_length=64, null=True, verbose_name='Brand')),
('cpu', models.CharField(blank=True, max_length=64, null=True, verbose_name='CPU')), ('cpu', models.CharField(blank=True, max_length=64, null=True, verbose_name='CPU')),
('memory', models.CharField(blank=True, max_length=128, null=True, verbose_name='Memory')), ('memory', models.CharField(blank=True, max_length=128, null=True, verbose_name='Memory')),
@ -57,7 +57,7 @@ class Migration(migrations.Migration):
('is_active', models.BooleanField(default=True, verbose_name='Is active')), ('is_active', models.BooleanField(default=True, verbose_name='Is active')),
('date_created', models.DateTimeField(auto_now=True, null=True, verbose_name='Date added')), ('date_created', models.DateTimeField(auto_now=True, null=True, verbose_name='Date added')),
('comment', models.CharField(blank=True, max_length=128, null=True, verbose_name='Comment')), ('comment', models.CharField(blank=True, max_length=128, null=True, verbose_name='Comment')),
('admin_user', models.ForeignKey(null=True, on_delete=django.db.models.deletion.SET_NULL, to='assets.AdminUser', verbose_name='Admin user')), ('admin_user', models.ForeignKey(null=True, on_delete=django.db.models.deletion.SET_NULL, related_name='assets', to='assets.AdminUser', verbose_name='Admin user')),
], ],
options={ options={
'db_table': 'asset', 'db_table': 'asset',
@ -129,21 +129,21 @@ class Migration(migrations.Migration):
fields=[ fields=[
('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')),
('name', models.CharField(max_length=128, unique=True, verbose_name='Name')), ('name', models.CharField(max_length=128, unique=True, verbose_name='Name')),
('username', models.CharField(blank=True, max_length=16, verbose_name='Username')), ('username', models.CharField(max_length=16, verbose_name='Username')),
('password', models.CharField(blank=True, max_length=256, verbose_name='Password')), ('_password', models.CharField(blank=True, max_length=256, verbose_name='Password')),
('protocol', models.CharField(default='ssh', max_length=16, verbose_name='Protocol')), ('protocol', models.CharField(choices=[('ssh', 'ssh')], default='ssh', max_length=16, verbose_name='Protocol')),
('private_key', models.CharField(blank=True, max_length=4096, verbose_name='SSH private key')), ('_private_key', models.CharField(blank=True, max_length=4096, verbose_name='SSH private key')),
('public_key', models.CharField(blank=True, max_length=4096, verbose_name='SSH public key')), ('_public_key', models.CharField(blank=True, max_length=4096, verbose_name='SSH public key')),
('is_default', models.BooleanField(default=True, verbose_name='As default')), ('as_default', models.BooleanField(default=False, verbose_name='As default')),
('auto_push', models.BooleanField(default=True, verbose_name='Auto push')), ('auto_push', models.BooleanField(default=True, verbose_name='Auto push')),
('auto_update', models.BooleanField(default=True, verbose_name='Auto update pass/key')), ('auto_update', models.BooleanField(default=True, verbose_name='Auto update pass/key')),
('sudo', models.TextField(blank=True, max_length=4096, verbose_name='Sudo')), ('sudo', models.TextField(default='/user/bin/whoami', max_length=4096, verbose_name='Sudo')),
('shell', models.CharField(blank=True, max_length=64, verbose_name='Shell')), ('shell', models.CharField(default='/bin/bash', max_length=64, verbose_name='Shell')),
('home', models.CharField(blank=True, max_length=64, verbose_name='Home')), ('home', models.CharField(blank=True, max_length=64, verbose_name='Home')),
('uid', models.IntegerField(blank=True, verbose_name='Uid')), ('uid', models.IntegerField(blank=True, null=True, verbose_name='Uid')),
('date_created', models.DateTimeField(auto_now=True, null=True)), ('date_created', models.DateTimeField(auto_now=True)),
('created_by', models.CharField(blank=True, max_length=32, verbose_name='Created by')), ('created_by', models.CharField(blank=True, max_length=32, verbose_name='Created by')),
('comment', models.CharField(blank=True, max_length=128, verbose_name='Comment')), ('comment', models.TextField(blank=True, max_length=128, verbose_name='Comment')),
], ],
options={ options={
'db_table': 'system_user', 'db_table': 'system_user',
@ -177,7 +177,7 @@ class Migration(migrations.Migration):
migrations.AddField( migrations.AddField(
model_name='asset', model_name='asset',
name='system_user', name='system_user',
field=models.ManyToManyField(blank=True, to='assets.SystemUser', verbose_name='System User'), field=models.ManyToManyField(blank=True, related_name='assets', to='assets.SystemUser', verbose_name='System User'),
), ),
migrations.AddField( migrations.AddField(
model_name='asset', model_name='asset',

View File

@ -2,22 +2,77 @@ from __future__ import unicode_literals, absolute_import
from django.db import models from django.db import models
from django.utils.translation import ugettext_lazy as _ from django.utils.translation import ugettext_lazy as _
from django.utils import timezone
from users.models import User, UserGroup from users.models import User, UserGroup
from assets.models import Asset, AssetGroup, SystemUser from assets.models import Asset, AssetGroup, SystemUser
from common.utils import date_expired_default from common.utils import date_expired_default
class UserAssetPerm(models.Model): class PermUserAsset(models.Model):
user = models.ForeignKey(User, related_name='asset_perm', on_delete=models.CASCADE) ACTION_CHOICE = (
assets = models.ManyToManyField(Asset, related_name='user_perms', blank=True) ('1', 'Allow'),
asset_groups = models.ManyToManyField(AssetGroup, related_name='user_perm', blank=True) ('0', 'Deny'),
system_users = models.ManyToManyField(SystemUser, related_name='user_perm', blank=True) )
user = models.ForeignKey(User, on_delete=models.CASCADE)
action = models.CharField(choices=ACTION_CHOICE, max_length=8, default='1')
assets = models.ManyToManyField(Asset, blank=True)
asset_groups = models.ManyToManyField(AssetGroup, blank=True)
system_users = models.ManyToManyField(SystemUser, blank=True)
date_expired = models.DateTimeField(default=date_expired_default, verbose_name=_('Date expired'))
created_by = models.CharField(max_length=128, blank=True)
date_created = models.DateTimeField(auto_now=True)
comment = models.TextField(verbose_name=_('Comment'))
def __unicode__(self):
return '%(id)s: %(user)s %(action)s' % {
'id': self.id,
'user': self.user.username,
'action': self.action,
}
@property
def is_expired(self):
if self.date_expired > timezone.now():
return False
else:
return True
class Meta:
db_table = 'perm_user_asset'
class PermUserGroupAsset(models.Model):
ACTION_CHOICES = (
('0', 'Deny'),
('1', 'Allow'),
)
user_group = models.ForeignKey(User, on_delete=models.CASCADE)
action = models.CharField(choices=ACTION_CHOICES, max_length=8, default='1')
assets = models.ManyToManyField(Asset, blank=True)
asset_groups = models.ManyToManyField(AssetGroup, blank=True)
system_users = models.ManyToManyField(SystemUser, blank=True)
date_expired = models.DateTimeField(default=date_expired_default, verbose_name=_('Date expired')) date_expired = models.DateTimeField(default=date_expired_default, verbose_name=_('Date expired'))
created_by = models.CharField(max_length=128) created_by = models.CharField(max_length=128)
date_created = models.DateTimeField(auto_now=True) date_created = models.DateTimeField(auto_now=True)
comment = models.TextField(verbose_name=_('Comment')) comment = models.TextField(verbose_name=_('Comment'))
def __unicode__(self):
return '%(id)s: %(user)s %(action)s' % {
'id': self.id,
'user': self.user_group.name,
'action': self.action,
}
@property
def is_expired(self):
if self.date_expired > timezone.now():
return False
else:
return True
class Meta:
db_table = 'perm_user_group_asset'
class UserGroupAssetPerm(models.Model):
pass

View File

@ -0,0 +1,72 @@
{% extends '_list_base.html' %}
{% load i18n %}
{% load common_tags %}
{% block content_left_head %}
{% endblock %}
{% block table_head %}
<th class="text-center">
<input type="checkbox" id="check_all" onclick="checkAll('check_all', 'checked')">
</th>
<th class="text-center"><a href="{% url 'users:user-list' %}?sort=name">{% trans 'Name' %}</a></th>
<th class="text-center"><a href="{% url 'users:user-list' %}?sort=username">{% trans 'Username' %}</a></th>
<th class="text-center">{% trans 'User group' %}</th>
<th class="text-center">{% trans 'Asset available' %}</th>
<th class="text-center">{% trans 'Asset unavailable' %}</th>
<th class="text-center">{% trans 'Asset group' %}</th>
<th class="text-center">{% trans 'System user' %}</th>
<th class="text-center"><a href="{% url 'users:user-list' %}?sort=date_expired">{% trans 'Active' %}</a></th>
<th class="text-center"></th>
{% endblock %}
{% block table_body %}
{% for user in user_list %}
<tr class="gradeX">
<td class="text-center">
<input type="checkbox" name="checked" value="{{ user.id }}">
</td>
<td class="text-center">
<a href="{% url 'users:user-detail' pk=user.id %}">
{{ user.name }}
</a>
</td>
<td class="text-center">{{ user.username }}</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>
<th class="text-center">{{ user.name }}</th>
<td class="text-center">
{% if user.is_expired and user.is_active %}
<i class="fa fa-times text-danger"></i>
{% else %}
<i class="fa fa-check text-navy"></i>
{% endif %}
</td>
<td class="text-center">
<a href="{% url 'users:user-update' pk=user.id %}" class="btn btn-xs btn-info">{% trans 'Update' %}</a>
<a href="{% url 'users:user-delete' pk=user.id %}" class="btn btn-xs btn-danger del {% if user.id == request.user.id or user.username == 'admin' %} disabled {% endif %}">{% trans 'Delete' %}</a>
</td>
</tr>
{% endfor %}
{% endblock %}
{% block content_bottom_left %}
<form id="" method="get" action="" class=" mail-search">
<div class="input-group">
<select class="form-control m-b" style="width: auto">
<option>{% trans 'Delete selected' %}</option>
<option>{% trans 'Update selected' %}</option>
<option>{% trans 'Deactive selected' %}</option>
<option>{% trans 'Export selected' %}</option>
</select>
<div class="input-group-btn pull-left" style="padding-left: 5px;">
<button id='search_btn' type="submit" style="height: 32px;" class="btn btn-sm btn-primary">
{% trans 'Submit' %}
</button>
</div>
</div>
</form>
{% endblock %}

View File

@ -1 +1,19 @@
# coding:utf-8
from django.conf.urls import url from django.conf.urls import url
import views
app_name = 'perms'
urlpatterns = [
# Resource asset url
url(r'^user$', views.PermUserAssetListView.as_view(), name='perm-user-list'),
# url(r'^user/(?P<user>[0-9]+)/perm-asset/$', views.AssetListView.as_view(), name='perm-user-asset-list'),
# url(r'^user/(?P<user>[0-9]+)/perm-asset/$', views.AssetListView.as_view(), name='perm-user-asset-list'),
# url(r'^user/(?P<user>[0-9]+)$', views.AssetListView.as_view(), name='asset-list'),
# url(r'^asset/create$', views.AssetCreateView.as_view(), name='asset-create'),
# url(r'^asset/(?P<pk>[0-9]+)$', views.AssetDetailView.as_view(), name='asset-detail'),
# url(r'^asset/(?P<pk>[0-9]+)/update', views.AssetUpdateView.as_view(), name='asset-update'),
# url(r'^asset/(?P<pk>[0-9]+)/delete$', views.AssetDeleteView.as_view(), name='asset-delete'),
]

View File

@ -2,31 +2,38 @@
from __future__ import unicode_literals, absolute_import from __future__ import unicode_literals, absolute_import
from django.views.generic.list import ListView from django.utils.translation import ugettext as _
from django.conf import settings from django.conf import settings
from django.db.models import Q
from django.views.generic import TemplateView, ListView
from django.views.generic.edit import CreateView, DeleteView, FormView, UpdateView
from django.urls import reverse_lazy
from django.contrib.messages.views import SuccessMessageMixin
from django.views.generic.detail import DetailView, SingleObjectMixin
from .hands import AdminUserRequiredMixin from .hands import AdminUserRequiredMixin, User, UserGroup
from .models import UserAssetPerm, UserGroupAssetPerm from .models import PermUserAsset, PermUserGroupAsset
from .forms import UserAssetPermForm
class SystemUserListView(AdminUserRequiredMixin, ListView): class PermUserListView(AdminUserRequiredMixin, ListView):
model = UserAssetPerm model = User
paginate_by = settings.CONFIG.DISPLAY_PER_PAGE paginate_by = settings.CONFIG.DISPLAY_PER_PAGE
context_object_name = 'system_user_list' context_object_name = 'user_list'
template_name = 'assets/system_user_list.html' template_name = 'perms/perm_user_list.html'
def get_context_data(self, **kwargs): def get_context_data(self, **kwargs):
context = { context = {
'app': _('Assets'), 'app': _('Perms'),
'action': _('System user list'), 'action': _('Perms user list'),
'keyword': self.request.GET.get('keyword', '') 'keyword': self.request.GET.get('keyword', '')
} }
kwargs.update(context) kwargs.update(context)
return super(SystemUserListView, self).get_context_data(**kwargs) return super(PermUserListView, self).get_context_data(**kwargs)
def get_queryset(self): def get_queryset(self):
# Todo: Default order by lose asset connection num # Todo: Default order by lose asset connection num
self.queryset = super(SystemUserListView, self).get_queryset() self.queryset = super(PermUserListView, self).get_queryset()
self.keyword = keyword = self.request.GET.get('keyword', '') self.keyword = keyword = self.request.GET.get('keyword', '')
self.sort = sort = self.request.GET.get('sort', '-date_created') self.sort = sort = self.request.GET.get('sort', '-date_created')
@ -39,62 +46,92 @@ class SystemUserListView(AdminUserRequiredMixin, ListView):
return self.queryset return self.queryset
class SystemUserCreateView(AdminUserRequiredMixin, SuccessMessageMixin, CreateView): class PermUserAssetListView(AdminUserRequiredMixin, ListView):
model = SystemUser model = PermUserAsset
form_class = SystemUserForm paginate_by = settings.CONFIG.DISPLAY_PER_PAGE
template_name = 'assets/system_user_create_update.html' context_object_name = 'system_user_list'
success_url = reverse_lazy('assets:system-user-list') template_name = 'assets/system_user_list.html'
success_message = _('Create system user <a href="%s">%s</a> successfully.')
def get_context_data(self, **kwargs): def get_context_data(self, **kwargs):
context = { context = {
'app': _('Assets'), 'app': _('Assets'),
'action': _('Create system user'), 'action': _('System user list'),
'keyword': self.request.GET.get('keyword', '')
} }
kwargs.update(context) kwargs.update(context)
return super(SystemUserCreateView, self).get_context_data(**kwargs) return super(PermUserAssetListView, self).get_context_data(**kwargs)
def get_success_message(self, cleaned_data): def get_queryset(self):
return self.success_message % ( # Todo: Default order by lose asset connection num
reverse_lazy('assets:system-user-detail', kwargs={'pk': self.object.pk}), self.queryset = super(PermUserAssetListView, self).get_queryset()
self.object.name, self.keyword = keyword = self.request.GET.get('keyword', '')
) self.sort = sort = self.request.GET.get('sort', '-date_created')
if keyword:
self.queryset = self.queryset.filter(Q(name__icontains=keyword) |
Q(comment__icontains=keyword))
class SystemUserUpdateView(AdminUserRequiredMixin, UpdateView): if sort:
model = SystemUser self.queryset = self.queryset.order_by(sort)
form_class = SystemUserForm return self.queryset
template_name = 'assets/system_user_create_update.html' #
success_message = _('Update system user <a href="%s">%s</a> successfully.') #
# class PermUserAssetCreateView(AdminUserRequiredMixin, SuccessMessageMixin, CreateView):
def get_context_data(self, **kwargs): # model = PermUserAsset
context = { # form_class = PermUserAssetForm
'app': _('Assets'), # template_name = 'assets/system_user_create_update.html'
'action': _('Update system user') # success_url = reverse_lazy('assets:system-user-list')
} # success_message = _('Create system user <a href="%s">%s</a> successfully.')
kwargs.update(context) #
return super(SystemUserUpdateView, self).get_context_data(**kwargs) # def get_context_data(self, **kwargs):
# context = {
def get_success_url(self): # 'app': _('Assets'),
success_url = reverse_lazy('assets:system-user-detail', pk=self.object.pk) # 'action': _('Create system user'),
return success_url # }
# kwargs.update(context)
# return super(PermUserAssetCreateView, self).get_context_data(**kwargs)
class SystemUserDetailView(AdminUserRequiredMixin, DetailView): #
template_name = 'assets/system_user_detail.html' # def get_success_message(self, cleaned_data):
context_object_name = 'system_user' # return self.success_message % (
model = SystemUser # reverse_lazy('assets:system-user-detail', kwargs={'pk': self.object.pk}),
# self.object.name,
def get_context_data(self, **kwargs): # )
context = { #
'app': _('Assets'), #
'action': _('System user detail') # class PermUserAssetUpdateView(AdminUserRequiredMixin, UpdateView):
} # model = PermUserAsset
kwargs.update(context) # form_class = PermUserAssetForm
return super(SystemUserDetailView, self).get_context_data(**kwargs) # template_name = 'assets/system_user_create_update.html'
# success_message = _('Update system user <a href="%s">%s</a> successfully.')
#
class SystemUserDeleteView(AdminUserRequiredMixin, DeleteView): # def get_context_data(self, **kwargs):
model = SystemUser # context = {
template_name = 'assets/delete_confirm.html' # 'app': _('Assets'),
success_url = 'assets:system-user-list' # 'action': _('Update system user')
# }
# kwargs.update(context)
# return super(PermUserAssetUpdateView, self).get_context_data(**kwargs)
#
# def get_success_url(self):
# success_url = reverse_lazy('assets:system-user-detail', pk=self.object.pk)
# return success_url
#
#
# class PermUserAssetDetailView(AdminUserRequiredMixin, DetailView):
# template_name = 'assets/system_user_detail.html'
# context_object_name = 'system_user'
# model = PermUserAsset
#
# def get_context_data(self, **kwargs):
# context = {
# 'app': _('Assets'),
# 'action': _('System user detail')
# }
# kwargs.update(context)
# return super(PermUserAssetDetailView, self).get_context_data(**kwargs)
#
#
# class PermUserAssetDeleteView(AdminUserRequiredMixin, DeleteView):
# model = PermUserAsset
# template_name = 'assets/delete_confirm.html'
# success_url = 'assets:system-user-list'