user-pserm

This commit is contained in:
ibuler 2016-09-11 16:59:19 +08:00
parent 70cae93a4b
commit 324bb68667
11 changed files with 223 additions and 70 deletions

View File

@ -25,6 +25,7 @@ urlpatterns = [
url(r'^$', TemplateView.as_view(template_name='base.html'), name='index'), url(r'^$', TemplateView.as_view(template_name='base.html'), name='index'),
url(r'^(api/)?users/', include('users.urls')), url(r'^(api/)?users/', include('users.urls')),
url(r'^assets/', include('assets.urls')), url(r'^assets/', include('assets.urls')),
url(r'^perms/', include('perms.urls')),
url(r'^terminal/', include('webterminal.urls')), url(r'^terminal/', include('webterminal.urls')),
] ]

View File

@ -4,14 +4,23 @@ from __future__ import absolute_import, unicode_literals
from django import forms from django import forms
from django.utils.translation import ugettext_lazy as _ from django.utils.translation import ugettext_lazy as _
from users.models import User, UserGroup from .hands import User, UserGroup, Asset, AssetGroup, SystemUser
from assets.models import Asset, AssetGroup, SystemUser from .models import PermUserAsset
from .models import UserAssetPerm
class UserAssetPermForm(forms.ModelForm): class PermUserAssetForm(forms.ModelForm):
class Meta: class Meta:
model = UserAssetPerm model = PermUserAsset
fields = [ fields = [
'assets', 'asset_groups', 'system_users', 'date_expired', 'comment' 'user', 'action', 'assets', 'asset_groups', 'system_users', 'date_expired', 'comment'
] ]
widgets = {
'user': forms.HiddenInput(attrs={'style': 'display: none'}),
'assets': forms.SelectMultiple(attrs={'class': 'select2',
'data-placeholder': _('Select assets')}),
'asset_groups': forms.SelectMultiple(attrs={'class': 'select2',
'data-placeholder': _('Select asset groups')}),
'system_users': forms.SelectMultiple(attrs={'class': 'select2',
'data-placeholder': _('Select system users')}),
}

View File

@ -5,7 +5,8 @@ from django.db import models
from django.utils.translation import ugettext_lazy as _ from django.utils.translation import ugettext_lazy as _
from users.utils import AdminUserRequiredMixin
from users.models import User, UserGroup
from assets.models import Asset, AssetGroup, SystemUser

View File

@ -23,7 +23,7 @@ class PermUserAsset(models.Model):
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, blank=True) created_by = models.CharField(max_length=128, blank=True)
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'), blank=True)
def __unicode__(self): def __unicode__(self):
return '%(id)s: %(user)s %(action)s' % { return '%(id)s: %(user)s %(action)s' % {

View File

@ -0,0 +1,80 @@
{% extends 'base.html' %}
{% load i18n %}
{% load static %}
{% load bootstrap %}
{% block custom_head_css_js %}
<link href="{% static "css/plugins/select2/select2.min.css" %}" rel="stylesheet">
<script src="{% static "js/plugins/select2/select2.full.min.js" %}"></script>
<link href="{% static "css/plugins/datepicker/datepicker3.css" %}" rel="stylesheet">
{% endblock %}
{% block content %}
<div class="wrapper wrapper-content animated fadeInRight">
<div class="row">
<div class="col-sm-12">
<div class="ibox float-e-margins">
<div class="ibox-title">
<h5>{% trans 'Create asset perm for ' %}<b>{{ user.name }}</b></h5>
<div class="ibox-tools">
<a class="collapse-link">
<i class="fa fa-chevron-up"></i>
</a>
<a class="dropdown-toggle" data-toggle="dropdown" href="#">
<i class="fa fa-wrench"></i>
</a>
<a class="close-link">
<i class="fa fa-times"></i>
</a>
</div>
</div>
<div class="ibox-content">
<form enctype="multipart/form-data" method="post" class="form-horizontal" action="" >
{% csrf_token %}
<input name="{{ form.user.html_name }}" hidden="hidden" style="display: none" value="{{ user.id }}">
{{ form.action|bootstrap_horizontal }}
{{ form.assets|bootstrap_horizontal }}
{{ form.asset_groups|bootstrap_horizontal }}
{{ form.system_users |bootstrap_horizontal }}
<div class="form-group {% if form.date_expired.errors %} has-error {% endif %}" id="date_5">
<label for="{{ form.date_expired.id_for_label }}" class="col-sm-2 control-label">{{ form.date_expired.label }}</label>
<div class="col-sm-9">
<div class="input-group date">
<span class="input-group-addon"><i class="fa fa-calendar"></i></span>
<input id="{{ form.date_expired.id_for_label }}" name="{{ form.date_expired.html_name }}" type="text" class="form-control" value="{{ form.date_expired.value|date:'Y-m-d' }}">
</div>
<span class="help-block ">{{ form.date_expired.errors }}</span>
</div>
</div>
{{ form.comment|bootstrap_horizontal }}
<div class="form-group">
<div class="col-sm-4 col-sm-offset-2">
<button class="btn btn-white" type="reset">{% trans 'Reset' %}</button>
<button id="submit_button" class="btn btn-primary" type="submit">{% trans 'Submit' %}</button>
</div>
</div>
</form>
</div>
</div>
</div>
</div>
</div>
{% endblock %}
{% block custom_foot_js %}
<script src="{% static 'js/plugins/datapicker/bootstrap-datepicker.js' %}"></script>
<script>
$(document).ready(function () {
$('.select2').select2();
$('.input-group.date').datepicker({
format: "yyyy-mm-dd",
todayBtn: "linked",
keyboardNavigation: false,
forceParse: false,
calendarWeeks: true,
autoclose: true
})
})
</script>
{% endblock %}

View File

@ -0,0 +1,66 @@
{% extends '_list_base.html' %}
{% load i18n %}
{% load common_tags %}
{% block content_left_head %}
<a href="{% url 'users:user-create' %}" class="btn btn-sm btn-primary "> {% trans "Create perm " %} </a>
{% 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 'Role' %}</th>
<th class="text-center">{% trans 'Asset num' %}</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 perm in page_obj %}
<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>
<th class="text-center">35/40</th>
<th class="text-center">20</th>
<th class="text-center">3</th>
<td class="text-center">
<a href="{% url 'perms:perm-user-asset-create' pk=user.id %}" class="btn btn-xs btn-info">{% trans 'Create perm' %}</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 'Flush' %}</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

@ -2,6 +2,7 @@
{% load i18n %} {% load i18n %}
{% load common_tags %} {% load common_tags %}
{% block content_left_head %} {% block content_left_head %}
<a href="{% url 'users:user-create' %}" class="btn btn-sm btn-primary "> {% trans "Batch create perm " %} </a>
{% endblock %} {% endblock %}
{% block table_head %} {% block table_head %}
@ -10,9 +11,8 @@
</th> </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=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"><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 'Role' %}</th>
<th class="text-center">{% trans 'Asset available' %}</th> <th class="text-center">{% trans 'Asset num' %}</th>
<th class="text-center">{% trans 'Asset unavailable' %}</th>
<th class="text-center">{% trans 'Asset group' %}</th> <th class="text-center">{% trans 'Asset group' %}</th>
<th class="text-center">{% trans 'System user' %}</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"><a href="{% url 'users:user-list' %}?sort=date_expired">{% trans 'Active' %}</a></th>
@ -32,18 +32,12 @@
</td> </td>
<td class="text-center">{{ user.username }}</td> <td class="text-center">{{ user.username }}</td>
<td class="text-center">{{ user.get_role_display }}</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">35/40</th>
<th class="text-center">{{ user.name }}</th> <th class="text-center">20</th>
<th class="text-center">3</th>
<td class="text-center"> <td class="text-center">
{% if user.is_expired and user.is_active %} <a href="{% url 'perms:perm-user-asset-create' pk=user.id %}" class="btn btn-xs btn-info">{% trans 'Create perm' %}</a>
<i class="fa fa-times text-danger"></i> <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 'Flush' %}</a>
{% 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> </td>
</tr> </tr>
{% endfor %} {% endfor %}

View File

@ -7,9 +7,10 @@ app_name = 'perms'
urlpatterns = [ urlpatterns = [
# Resource asset url # Resource asset url
url(r'^user$', views.PermUserAssetListView.as_view(), name='perm-user-list'), url(r'^user$', views.PermUserListView.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<pk>[0-9]+)/perm-asset/$', views.PermUserAssetListView.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<pk>[0-9]+)/perm-asset/create$', views.PermUserAssetCreateView.as_view(),
name='perm-user-asset-create'),
# url(r'^user/(?P<user>[0-9]+)$', views.AssetListView.as_view(), name='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/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]+)$', views.AssetDetailView.as_view(), name='asset-detail'),

View File

@ -13,7 +13,7 @@ from django.views.generic.detail import DetailView, SingleObjectMixin
from .hands import AdminUserRequiredMixin, User, UserGroup from .hands import AdminUserRequiredMixin, User, UserGroup
from .models import PermUserAsset, PermUserGroupAsset from .models import PermUserAsset, PermUserGroupAsset
from .forms import UserAssetPermForm from .forms import PermUserAssetForm
class PermUserListView(AdminUserRequiredMixin, ListView): class PermUserListView(AdminUserRequiredMixin, ListView):
@ -35,7 +35,7 @@ class PermUserListView(AdminUserRequiredMixin, ListView):
# Todo: Default order by lose asset connection num # Todo: Default order by lose asset connection num
self.queryset = super(PermUserListView, 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_joined')
if keyword: if keyword:
self.queryset = self.queryset.filter(Q(name__icontains=keyword) | self.queryset = self.queryset.filter(Q(name__icontains=keyword) |
@ -46,58 +46,59 @@ class PermUserListView(AdminUserRequiredMixin, ListView):
return self.queryset return self.queryset
class PermUserAssetListView(AdminUserRequiredMixin, ListView): class PermUserAssetListView(AdminUserRequiredMixin, SingleObjectMixin, ListView):
model = PermUserAsset
paginate_by = settings.CONFIG.DISPLAY_PER_PAGE paginate_by = settings.CONFIG.DISPLAY_PER_PAGE
context_object_name = 'system_user_list' context_object_name = 'perm_user_asset_list'
template_name = 'assets/system_user_list.html' template_name = 'perms/perm_user_asset_list.html'
model = User
def get(self, request, *args, **kwargs):
self.object = self.get_object(queryset=User.objects.all())
return super(PermUserAssetListView, self).get(request, *args, **kwargs)
def get_context_data(self, **kwargs): def get_context_data(self, **kwargs):
context = { context = {
'app': _('Assets'), 'app': _('Assets'),
'action': _('System user list'), 'action': _('User perm asset list'),
'keyword': self.request.GET.get('keyword', '') 'keyword': self.request.GET.get('keyword', '')
} }
kwargs.update(context) kwargs.update(context)
return super(PermUserAssetListView, self).get_context_data(**kwargs) return super(PermUserAssetListView, self).get_context_data(**kwargs)
def get_queryset(self): def get_queryset(self):
# Todo: Default order by lose asset connection num self.queryset = self.object.permuserasset_set.all()
self.queryset = super(PermUserAssetListView, self).get_queryset()
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))
if sort:
self.queryset = self.queryset.order_by(sort)
return self.queryset return self.queryset
#
#
# class PermUserAssetCreateView(AdminUserRequiredMixin, SuccessMessageMixin, CreateView): class PermUserAssetCreateView(AdminUserRequiredMixin, SuccessMessageMixin, CreateView):
# model = PermUserAsset model = PermUserAsset
# form_class = PermUserAssetForm form_class = PermUserAssetForm
# template_name = 'assets/system_user_create_update.html' template_name = 'perms/perm_user_asset_create_update.html'
# success_url = reverse_lazy('assets:system-user-list') success_url = reverse_lazy('perms:perm-user-list')
# success_message = _('Create system user <a href="%s">%s</a> successfully.') success_message = _('Create user asset perm <a href="%s">%s</a> successfully.')
#
# def get_context_data(self, **kwargs): def get_initial(self):
# context = { return {'user': self.get_object(queryset=User.objects.all())}
# 'app': _('Assets'),
# 'action': _('Create system user'), def form_invalid(self, form):
# } print(form.errors)
# kwargs.update(context) return super(PermUserAssetCreateView, self).form_invalid(form)
# return super(PermUserAssetCreateView, self).get_context_data(**kwargs)
# def get_context_data(self, **kwargs):
# def get_success_message(self, cleaned_data): context = {
# return self.success_message % ( 'app': _('Perms'),
# reverse_lazy('assets:system-user-detail', kwargs={'pk': self.object.pk}), 'action': _('Create user asset perm'),
# self.object.name, 'user': self.get_object(queryset=User.objects.all()),
# ) }
# kwargs.update(context)
# return super(PermUserAssetCreateView, self).get_context_data(**kwargs)
def get_success_message(self, cleaned_data):
return self.success_message % (
reverse_lazy('perms:perm-user-asset-list', kwargs={'pk': self.object.user.id})
)
# class PermUserAssetUpdateView(AdminUserRequiredMixin, UpdateView): # class PermUserAssetUpdateView(AdminUserRequiredMixin, UpdateView):
# model = PermUserAsset # model = PermUserAsset
# form_class = PermUserAssetForm # form_class = PermUserAssetForm

View File

@ -30,7 +30,7 @@
<a href="#"><i class="fa fa-edit"></i> <span class="nav-label">{% trans 'Perms' %}</span><span class="fa arrow"></span></a> <a href="#"><i class="fa fa-edit"></i> <span class="nav-label">{% trans 'Perms' %}</span><span class="fa arrow"></span></a>
<ul class="nav nav-second-level"> <ul class="nav nav-second-level">
<li id="sudo"> <li id="sudo">
<a class="sudo" href="">{% trans 'User perm' %}</a> <a class="sudo" href="{% url 'perms:perm-user-list' %}">{% trans 'User perm' %}</a>
</li> </li>
<li id="role"> <li id="role">
<a href="">{% trans 'User group perm' %}</a> <a href="">{% trans 'User group perm' %}</a>

View File

@ -10,5 +10,5 @@
:license: GPL v2, see LICENSE for more details. :license: GPL v2, see LICENSE for more details.
""" """
from users.utils import AdminUserRequiredMixin