Commit bc232c4f authored by wangyong's avatar wangyong

merge cmdb

parents 342e4bde 02b5483d
...@@ -6,7 +6,6 @@ from django.utils.translation import gettext_lazy as _ ...@@ -6,7 +6,6 @@ from django.utils.translation import gettext_lazy as _
class AssetForm(forms.ModelForm): class AssetForm(forms.ModelForm):
class Meta: class Meta:
model = Asset model = Asset
...@@ -22,6 +21,25 @@ class AssetForm(forms.ModelForm): ...@@ -22,6 +21,25 @@ class AssetForm(forms.ModelForm):
class AssetGroupForm(forms.ModelForm): class AssetGroupForm(forms.ModelForm):
assets = forms.ModelMultipleChoiceField(queryset=Asset.objects.all(),
label=_('Asset'),
required=False,
widget=forms.SelectMultiple(
attrs={'class': 'select2', 'data-placeholder': _('Select assets')})
)
def __init__(self, *args, **kwargs):
if kwargs.get('instance'):
initial = kwargs.get('initial', {})
initial['assets'] = kwargs['instance'].assets.all()
super(AssetGroupForm, self).__init__(*args, **kwargs)
def _save_m2m(self):
super(AssetGroupForm, self)._save_m2m()
assets = self.cleaned_data['assets']
self.instance.assets.clear()
self.instance.assets.add(*tuple(assets))
class Meta: class Meta:
model = AssetGroup model = AssetGroup
fields = [ fields = [
......
This diff is collapsed.
...@@ -14,7 +14,7 @@ class AssetGroup(models.Model): ...@@ -14,7 +14,7 @@ class AssetGroup(models.Model):
return self.name return self.name
class Meta: class Meta:
db_table = 'assetgroup' db_table = 'asset_group'
class IDC(models.Model): class IDC(models.Model):
...@@ -128,10 +128,14 @@ class Asset(models.Model): ...@@ -128,10 +128,14 @@ class Asset(models.Model):
comment = models.CharField(max_length=128, blank=True, verbose_name=_('Comment')) comment = models.CharField(max_length=128, blank=True, verbose_name=_('Comment'))
def __unicode__(self): def __unicode__(self):
return self.ip return '%(ip)s:%(port)d' % {'ip': self.ip, 'port': self.port}
def initial(self):
pass
class Meta: class Meta:
db_table = 'asset' db_table = 'asset'
index_together = ('ip', 'port')
class Label(models.Model): class Label(models.Model):
......
...@@ -40,24 +40,9 @@ ...@@ -40,24 +40,9 @@
{{ form.port|bootstrap_horizontal }} {{ form.port|bootstrap_horizontal }}
{# <div class="form-group" id="id_port">#}
{# <label class="col-sm-2 control-label">端口</label>#}
{# <div class="col-sm-9">#}
{# <input type="text" placeholder="" name="port" class="form-control">#}
{# </div>#}
{# </div>#}
{# <div class="form-group" id="id_type">#}
{# <label class="col-sm-2 control-label">资产类型</label>#}
{# <div class="col-sm-9">#}
{# <input type="text" placeholder="" name="type" class="form-control">#}
{# </div>#}
{# </div>#}
{{ form.type|bootstrap_horizontal }} {{ form.type|bootstrap_horizontal }}
{{ form.comment|bootstrap_horizontal }} {{ form.comment|bootstrap_horizontal }}
<div class="hr-line-dashed"></div> <div class="hr-line-dashed"></div>
<h3>关联资产用户</h3> <h3>关联资产用户</h3>
<div class="form-group"> <div class="form-group">
......
...@@ -30,24 +30,25 @@ ...@@ -30,24 +30,25 @@
<form method="post" id="userForm" class="form-horizontal" action="" > <form method="post" id="userForm" class="form-horizontal" action="" >
{% csrf_token %} {% csrf_token %}
{{ form.name|bootstrap_horizontal }} {{ form.name|bootstrap_horizontal }}
{{ form.assets|bootstrap_horizontal }}
<div class="form-group"> {# <div class="form-group">#}
<label for="users" class="col-sm-2 control-label">{% trans 'Asset' %}</label> {# <label for="users" class="col-sm-2 control-label">{% trans 'Asset' %}</label>#}
<div class="col-sm-9"> {# <div class="col-sm-9">#}
<select name="assets" id="assets" data-placeholder="{% trans 'Select asset' %}" class="select2 form-control m-b" multiple tabindex="2"> {# <select name="assets" id="assets" data-placeholder="{% trans 'Select asset' %}" class="select2 form-control m-b" multiple tabindex="2">#}
{% for asset in assets %} {# {% for asset in assets %}#}
<option value="{{ asset.id }}">{{ asset.hostname }}</option> {# <option value="{{ asset.id }}">{{ asset.ip }}:{{ asset.port }}</option>#}
{% endfor %} {# {% endfor %}#}
</select> {# </select>#}
</div> {# </div>#}
</div> {# </div>#}
{{ form.comment|bootstrap_horizontal }} {{ form.comment|bootstrap_horizontal }}
<div class="form-group"> <div class="form-group">
<div class="col-sm-4 col-sm-offset-2"> <div class="col-sm-4 col-sm-offset-2">
<button class="btn btn-white" type="reset">取消</button> <button class="btn btn-white" type="reset">{% trans 'Reset' %}</button>
<button id="submit_button" class="btn btn-primary" type="submit">确认保存</button> <button id="submit_button" class="btn btn-primary" type="submit">{% trans 'Submit' %}</button>
</div> </div>
</div> </div>
</form> </form>
......
...@@ -2,35 +2,35 @@ ...@@ -2,35 +2,35 @@
{% load i18n %} {% load i18n %}
{% load common_tags %} {% load common_tags %}
{% block content_left_head %} {% block content_left_head %}
<a href="{% url 'assets:assetgroup-add' %}" class="btn btn-sm btn-primary "> {% trans "Create asset group" %} </a> <a href="{% url 'assets:asset-group-create' %}" class="btn btn-sm btn-primary "> {% trans "Create asset group" %} </a>
{% endblock %} {% endblock %}
{% block table_head %} {% block table_head %}
<th class="text-center"> <th class="text-center">
<input type="checkbox" id="check_all" onclick="checkAll('check_all', 'checked')"> <input type="checkbox" id="check_all" onclick="checkAll('check_all', 'checked')">
</th> </th>
<th class="text-center"><a href="{% url 'assets:assetgroup-list' %}?sort=name">{% trans 'Name' %}</a></th> <th class="text-center"><a href="{% url 'assets:asset-group-list' %}?sort=name">{% trans 'Name' %}</a></th>
<th class="text-center">{% trans 'Asset num' %}</th> <th class="text-center">{% trans 'Asset num' %}</th>
<th class="text-center"><a href="{% url 'assets:assetgroup-list' %}?sort=date_expired">{% trans 'Comment' %}</a></th> <th class="text-center"><a href="{% url 'assets:asset-group-list' %}?sort=date_expired">{% trans 'Comment' %}</a></th>
<th class="text-center"></th> <th class="text-center"></th>
{% endblock %} {% endblock %}
{% block table_body %} {% block table_body %}
{% for assetgroup in assetgroups %} {% for asset_group in asset_group_list %}
<tr class="gradeX"> <tr class="gradeX">
<td class="text-center"> <td class="text-center">
<input type="checkbox" name="checked" value="{{ user.id }}"> <input type="checkbox" name="checked" value="{{ asset_group.id }}">
</td> </td>
<td class="text-center"> <td class="text-center">
<a href="{% url 'assets:assetgroup-detail' pk=user.id %}"> <a href="{% url 'assets:asset-group-detail' pk=asset_group.id %}">
{{ assetgroup.name }} {{ asset_group.name }}
</a> </a>
</td> </td>
<td class="text-center">{{ assetgroup.comment }}</td> <td class="text-center">{{ asset_group.assets.count }}</td>
<td class="text-center">{{ assetgroup.comment }}</td> <td class="text-center">{{ asset_group.comment }}</td>
<td class="text-center"> <td class="text-center">
<a href="{% url 'users:user-edit' pk=user.id %}" class="btn btn-xs btn-info">{% trans 'Edit' %}</a> <a href="{% url 'assets:asset-group-update' pk=asset_group.id %}" class="btn btn-xs btn-info">{% trans 'Edit' %}</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> <a href="{% url 'assets:asset-group-delete' pk=asset_group.id %}" class="btn btn-xs btn-danger del">{% trans 'Delete' %}</a>
</td> </td>
</tr> </tr>
{% endfor %} {% endfor %}
...@@ -48,12 +48,10 @@ ...@@ -48,12 +48,10 @@
<div class="input-group-btn pull-left" style="padding-left: 5px;"> <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"> <button id='search_btn' type="submit" style="height: 32px;" class="btn btn-sm btn-primary">
{% trans 'Commit' %} {% trans 'Submit' %}
</button> </button>
</div> </div>
</div> </div>
</form> </form>
{% endblock %} {% endblock %}
{% extends 'base.html' %} {% extends 'base.html' %}
{% load i18n %}
{% block content %} {% block content %}
<div class="wrapper wrapper-content animated fadeInRight"> <div class="wrapper wrapper-content animated fadeInRight">
...@@ -23,7 +24,7 @@ ...@@ -23,7 +24,7 @@
<div class="ibox-content"> <div class="ibox-content">
<form id="asset_form"> <form id="asset_form">
<div class="col-sm-1" style="padding-left: 0"> <div class="col-sm-1" style="padding-left: 0">
<a href="{% url 'assets:asset-add' %}" class="btn btn-sm btn-primary "> 添加资产 </a> <a href="{% url 'assets:asset-create' %}" class="btn btn-sm btn-primary "> {% trans 'Create asset' %}</a>
</div> </div>
<div class="col-sm-7" style="padding-left: 0px"> <div class="col-sm-7" style="padding-left: 0px">
......
...@@ -14,14 +14,14 @@ app_name = 'assets' ...@@ -14,14 +14,14 @@ app_name = 'assets'
urlpatterns = [ urlpatterns = [
url(r'^$', views.AssetListView.as_view(), name='asset-index'), url(r'^$', views.AssetListView.as_view(), name='asset-index'),
url(r'^asset$', views.AssetListView.as_view(), name='asset-list'), url(r'^asset$', views.AssetListView.as_view(), name='asset-list'),
url(r'^asset/add$', views.AssetAddView.as_view(), name='asset-add'), 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'),
url(r'^asset/(?P<pk>[0-9]+)$/edit', views.AssetEditView.as_view(), name='asset-edit'), 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'), url(r'^asset/(?P<pk>[0-9]+)/delete$', views.AssetDeleteView.as_view(), name='asset-delete'),
url(r'^assetgroup$', views.AssetGroupListView.as_view(), name='assetgroup-list'), url(r'^asset-group$', views.AssetGroupListView.as_view(), name='asset-group-list'),
url(r'^assetgroup/add$', views.AssetGroupAddView.as_view(), name='assetgroup-add'), url(r'^asset-group/create$', views.AssetGroupCreateView.as_view(), name='asset-group-create'),
url(r'^assetgroup/(?P<pk>[0-9]+)$', views.AssetGroupDetailView.as_view(), name='assetgroup-detail'), url(r'^asset-group/(?P<pk>[0-9]+)$', views.AssetGroupDetailView.as_view(), name='asset-group-detail'),
url(r'^assetgroup/(?P<pk>[0-9]+)$/edit', views.AssetGroupEditView.as_view(), name='assetgroup-edit'), url(r'^asset-group/(?P<pk>[0-9]+)/update$', views.AssetGroupUpdateView.as_view(), name='asset-group-update'),
url(r'^assetgroup/(?P<pk>[0-9]+)/delete$', views.AssetGroupDeleteView.as_view(), name='assetgroup-delete'), url(r'^asset-group/(?P<pk>[0-9]+)/delete$', views.AssetGroupDeleteView.as_view(), name='asset-group-delete'),
# url(r'^api/v1.0/', include(router.urls)), # url(r'^api/v1.0/', include(router.urls)),
] ]
...@@ -2,32 +2,32 @@ ...@@ -2,32 +2,32 @@
from __future__ import absolute_import, unicode_literals from __future__ import absolute_import, unicode_literals
from django.utils.translation import ugettext as _ from django.utils.translation import ugettext as _
from django.shortcuts import get_object_or_404
from django.views.generic import TemplateView, ListView from django.views.generic import TemplateView, ListView
from django.urls import reverse_lazy from django.urls import reverse_lazy
from django.views.generic.edit import CreateView, DeleteView, FormView, UpdateView from django.views.generic.edit import CreateView, DeleteView, FormView, UpdateView
from django.views.generic import TemplateView, ListView from django.views.generic import TemplateView, ListView
from django.views.generic.edit import CreateView, DeleteView, FormView, UpdateView from django.views.generic.edit import CreateView, DeleteView, FormView, UpdateView
from django.urls import reverse_lazy from django.urls import reverse_lazy
from django.views.generic.detail import DetailView from django.views.generic.detail import DetailView
from .models import Asset, AssetGroup, IDC, AssetExtend from .models import Asset, AssetGroup, IDC, AssetExtend
from .forms import AssetForm, AssetGroupForm from .forms import AssetForm, AssetGroupForm
from .utils import AdminUserRequiredMixin from .utils import AdminUserRequiredMixin
class AssetAddView(CreateView): class AssetCreateView(CreateView):
model = Asset model = Asset
form_class = AssetForm form_class = AssetForm
template_name = 'assets/asset_add.html' template_name = 'assets/asset_create.html'
success_url = reverse_lazy('assets:asset-list') success_url = reverse_lazy('assets:asset-list')
def form_invalid(self, form): def form_invalid(self, form):
print(form.errors) print(form.errors)
return super(AssetAddView, self).form_invalid(form) return super(AssetCreateView, self).form_invalid(form)
class AssetEditView(UpdateView): class AssetUpdateView(UpdateView):
pass pass
...@@ -48,10 +48,11 @@ class AssetDetailView(DetailView): ...@@ -48,10 +48,11 @@ class AssetDetailView(DetailView):
template_name = 'assets/asset_detail.html' template_name = 'assets/asset_detail.html'
class AssetGroupAddView(CreateView): class AssetGroupCreateView(CreateView):
model = AssetGroup model = AssetGroup
form_class = AssetGroupForm form_class = AssetGroupForm
template_name = 'assets/assetgroup_add.html' template_name = 'assets/asset_group_create.html'
success_url = reverse_lazy('assets:asset-group-list')
def get_context_data(self, **kwargs): def get_context_data(self, **kwargs):
context = { context = {
...@@ -60,13 +61,17 @@ class AssetGroupAddView(CreateView): ...@@ -60,13 +61,17 @@ class AssetGroupAddView(CreateView):
'assets': Asset.objects.all(), 'assets': Asset.objects.all(),
} }
kwargs.update(context) kwargs.update(context)
return super(AssetGroupAddView, self).get_context_data(**kwargs) return super(AssetGroupCreateView, self).get_context_data(**kwargs)
def form_valid(self, form):
print(form.data)
return super(AssetGroupCreateView, self).form_valid(form)
class AssetGroupListView(ListView): class AssetGroupListView(ListView):
model = AssetGroup model = AssetGroup
context_object_name = 'assetgroups' context_object_name = 'asset_group_list'
template_name = 'assets/assetgroup_list.html' template_name = 'assets/asset_group_list.html'
def get_context_data(self, **kwargs): def get_context_data(self, **kwargs):
context = { context = {
...@@ -81,8 +86,20 @@ class AssetGroupDetailView(DetailView): ...@@ -81,8 +86,20 @@ class AssetGroupDetailView(DetailView):
pass pass
class AssetGroupEditView(UpdateView): class AssetGroupUpdateView(UpdateView):
pass model = AssetGroup
form_class = AssetGroupForm
template_name = 'assets/asset_group_create.html'
success_url = reverse_lazy('assets:asset-group-list')
def get_context_data(self, **kwargs):
context = {
'app': _('Assets'),
'action': _('Create asset group'),
'assets': Asset.objects.all(),
}
kwargs.update(context)
return super(AssetGroupUpdateView, self).get_context_data(**kwargs)
class AssetGroupDeleteView(DeleteView): class AssetGroupDeleteView(DeleteView):
......
This source diff could not be displayed because it is too large. You can view the blob instead.
[{"model": "users.usergroup", "pk": 1, "fields": {"name": "Default", "comment": "Default user group for all user", "date_added": "2016-09-02T14:32:32Z", "created_by": "System"}}, {"model": "users.user", "pk": 1, "fields": {"password": "pbkdf2_sha256$30000$QU8p6Y6ep8VP$Zhrgn0Issfc8ozrNSdSGmyb3X7lRAbc3EEWdc2RTj/M=", "last_login": null, "first_name": "", "last_name": "", "is_active": true, "date_joined": "2016-09-02T14:32:32Z", "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", "is_first_login": false, "date_expired": "2086-08-16T14:32:32Z", "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-09-05T11:39:25.770Z", "created_by": "System"}}, {"model": "users.user", "pk": 1, "fields": {"password": "pbkdf2_sha256$30000$5ReHkQOQA2Hk$DIW0b5U/uK+U0xqjA3QpYvBcODNhm2MPCm7YWbQys3I=", "last_login": null, "first_name": "", "last_name": "", "is_active": true, "date_joined": "2016-09-05T11:39:25.771Z", "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", "is_first_login": false, "date_expired": "2086-08-19T11:39:25.771Z", "created_by": "System", "user_permissions": [], "groups": [1]}}]
\ No newline at end of file \ No newline at end of file
[{"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]}}] [{"model": "users.usergroup", "pk": 1, "fields": {"name": "Default", "comment": "Default user group for all user", "date_added": "2016-09-05T11:39:25.770Z", "created_by": "System"}}, {"model": "users.user", "pk": 1, "fields": {"password": "pbkdf2_sha256$30000$5ReHkQOQA2Hk$DIW0b5U/uK+U0xqjA3QpYvBcODNhm2MPCm7YWbQys3I=", "last_login": null, "first_name": "", "last_name": "", "is_active": true, "date_joined": "2016-09-05T11:39:25.771Z", "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", "is_first_login": false, "date_expired": "2086-08-19T11:39:25.771Z", "created_by": "System", "user_permissions": [], "groups": [1]}}]
\ No newline at end of file \ No newline at end of file
This source diff could not be displayed because it is too large. You can view the blob instead.
...@@ -75,12 +75,12 @@ INSTALLED_APPS = [ ...@@ -75,12 +75,12 @@ INSTALLED_APPS = [
MIDDLEWARE = [ MIDDLEWARE = [
'django.middleware.security.SecurityMiddleware', 'django.middleware.security.SecurityMiddleware',
'django.contrib.sessions.middleware.SessionMiddleware', 'django.contrib.sessions.middleware.SessionMiddleware',
'django.middleware.locale.LocaleMiddleware',
'django.middleware.common.CommonMiddleware', 'django.middleware.common.CommonMiddleware',
'django.middleware.csrf.CsrfViewMiddleware', 'django.middleware.csrf.CsrfViewMiddleware',
'django.contrib.auth.middleware.AuthenticationMiddleware', 'django.contrib.auth.middleware.AuthenticationMiddleware',
'django.contrib.messages.middleware.MessageMiddleware', 'django.contrib.messages.middleware.MessageMiddleware',
'django.middleware.clickjacking.XFrameOptionsMiddleware', 'django.middleware.clickjacking.XFrameOptionsMiddleware',
'django.middleware.locale.LocaleMiddleware',
] ]
ROOT_URLCONF = 'jumpserver.urls' ROOT_URLCONF = 'jumpserver.urls'
...@@ -92,6 +92,7 @@ TEMPLATES = [ ...@@ -92,6 +92,7 @@ TEMPLATES = [
'APP_DIRS': True, 'APP_DIRS': True,
'OPTIONS': { 'OPTIONS': {
'context_processors': [ 'context_processors': [
'django.template.context_processors.i18n',
'django.template.context_processors.debug', 'django.template.context_processors.debug',
'django.template.context_processors.request', 'django.template.context_processors.request',
'django.contrib.auth.context_processors.auth', 'django.contrib.auth.context_processors.auth',
...@@ -215,7 +216,7 @@ LOGGING = { ...@@ -215,7 +216,7 @@ LOGGING = {
# Internationalization # Internationalization
# https://docs.djangoproject.com/en/1.10/topics/i18n/ # https://docs.djangoproject.com/en/1.10/topics/i18n/
LANGUAGE_CODE = 'en_US' LANGUAGE_CODE = 'en-us'
TIME_ZONE = 'Asia/Shanghai' TIME_ZONE = 'Asia/Shanghai'
......
This diff is collapsed.
#!/usr/bin/env python #!/usr/bin/env python
import os import os
import sys import sys
import errno
if __name__ == "__main__": if __name__ == "__main__":
try:
os.makedirs('../logs')
except:
pass
os.environ.setdefault("DJANGO_SETTINGS_MODULE", "jumpserver.settings") os.environ.setdefault("DJANGO_SETTINGS_MODULE", "jumpserver.settings")
try: try:
from django.core.management import execute_from_command_line from django.core.management import execute_from_command_line
......
...@@ -6,18 +6,19 @@ ...@@ -6,18 +6,19 @@
<script src="{% static "js/inspinia.js" %}"></script> <script src="{% static "js/inspinia.js" %}"></script>
<script src="{% static "js/jumpserver.js" %}"></script> <script src="{% static "js/jumpserver.js" %}"></script>
<!-- active menu -->
<script> <script>
<!-- active menu -->
var url_array = document.location.pathname.split("/"); var url_array = document.location.pathname.split("/");
s1 = url_array[1]; app = url_array[1];
s2 = url_array[2]; resource = url_array[2];
if (s1 == ''){ if (app == ''){
$('#index').addClass('active') $('#index').addClass('active')
} else { } else {
$("#"+s1).addClass('active'); $("#"+app).addClass('active');
$('#'+s1+' .'+s2).addClass('active'); $('#'+app+' #'+resource).addClass('active');
} }
<!-- ajax set cookie -->
function getCookie(name) { function getCookie(name) {
var cookieValue = null; var cookieValue = null;
if (document.cookie && document.cookie !== '') { if (document.cookie && document.cookie !== '') {
...@@ -46,8 +47,10 @@ ...@@ -46,8 +47,10 @@
beforeSend: function(xhr, settings) { beforeSend: function(xhr, settings) {
if (!csrfSafeMethod(settings.type) && !this.crossDomain) { if (!csrfSafeMethod(settings.type) && !this.crossDomain) {
xhr.setRequestHeader("X-CSRFToken", csrftoken); xhr.setRequestHeader("X-CSRFToken", csrftoken);
{# xhr.setRequestHeader("sessionid", sessionid);#}
} }
} }
}); });
<!-- textarea rows -->
$('textarea').attr('rows', 5)
</script> </script>
\ No newline at end of file
...@@ -11,7 +11,7 @@ ...@@ -11,7 +11,7 @@
</div> </div>
<ul class="nav navbar-top-links navbar-right"> <ul class="nav navbar-top-links navbar-right">
<li> <li>
<span class="m-r-sm text-muted welcome-message">{% trans 'Welcome use Jumpserver system' %}</span> <span class="m-r-sm text-muted welcome-message">{% trans 'Welcome to use Jumpserver system' %}</span>
</li> </li>
<li class="dropdown"> <li class="dropdown">
<a class="dropdown-toggle count-info" data-toggle="dropdown" href="#"> <a class="dropdown-toggle count-info" data-toggle="dropdown" href="#">
......
...@@ -9,30 +9,30 @@ ...@@ -9,30 +9,30 @@
<i class="fa fa-group"></i> <span class="nav-label">{% trans 'Users' %}</span><span class="fa arrow"></span> <i class="fa fa-group"></i> <span class="nav-label">{% trans 'Users' %}</span><span class="fa arrow"></span>
</a> </a>
<ul class="nav nav-second-level active"> <ul class="nav nav-second-level active">
<li class="users"><a href="{% url 'users:user-list' %}">{% trans 'User' %}</a></li> <li id="user"><a href="{% url 'users:user-list' %}">{% trans 'User' %}</a></li>
<li class="usergroups"><a href="{% url 'users:usergroup-list' %}">{% trans 'Usergroup' %}</a></li> <li id="user-group"><a href="{% url 'users:user-group-list' %}">{% trans 'User group' %}</a></li>
</ul> </ul>
</li> </li>
<li id=""> <li id="assets">
<a> <a>
<i class="fa fa-inbox"></i> <span class="nav-label">{% trans 'Assets' %}</span><span class="fa arrow"></span> <i class="fa fa-inbox"></i> <span class="nav-label">{% trans 'Assets' %}</span><span class="fa arrow"></span>
</a> </a>
<ul class="nav nav-second-level"> <ul class="nav nav-second-level">
<li class="{% url 'assets:asset-list' %}"><a href="">{% trans 'Asset' %}</a></li> <li id="asset"><a href="{% url 'assets:asset-list' %}">{% trans 'Asset' %}</a></li>
<li class=""><a href="{% url 'assets:assetgroup-list' %}">{% trans 'Assetgroup' %}</a></li> <li id="asset-group"><a href="{% url 'assets:asset-group-list' %}">{% trans 'Asset group' %}</a></li>
<li class=""><a href="">{% trans 'IDC' %}</a></li> <li id="idc"><a href="">{% trans 'IDC' %}</a></li>
<li class=""><a href="">{% trans 'Assetadmin' %}</a></li> <li id="admin-user"><a href="">{% trans 'Admin user' %}</a></li>
<li class=""><a href="">{% trans 'Assetuser' %}</a></li> <li id="system-user"><a href="">{% trans 'System user' %}</a></li>
<li class=""><a href="">{% trans 'Label' %}</a></li> <li id=""><a href="">{% trans 'Label' %}</a></li>
</ul> </ul>
</li> </li>
<li id=""> <li id="">
<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 class="sudo"> <li id="sudo">
<a class="sudo" href="">{% trans 'Perm' %}</a> <a class="sudo" href="">{% trans 'Perm' %}</a>
</li> </li>
<li class="role"> <li id="role">
<a href="">{% trans 'Create perm' %}</a> <a href="">{% trans 'Create perm' %}</a>
</li> </li>
</ul> </ul>
...@@ -47,8 +47,8 @@ ...@@ -47,8 +47,8 @@
<i class="fa fa-download"></i> <span class="nav-label">{% trans 'File' %}</span><span class="fa arrow"></span> <i class="fa fa-download"></i> <span class="nav-label">{% trans 'File' %}</span><span class="fa arrow"></span>
</a> </a>
<ul class="nav nav-second-level"> <ul class="nav nav-second-level">
<li class="upload"><a href="">{% trans 'File upload' %}</a></li> <li id="upload"><a href="">{% trans 'File upload' %}</a></li>
<li class="download"><a href="">{% trans 'File download' %}</a></li> <li id="download"><a href="">{% trans 'File download' %}</a></li>
</ul> </ul>
</li> </li>
<li id=""> <li id="">
......
...@@ -11,7 +11,7 @@ ...@@ -11,7 +11,7 @@
<strong class="font-bold"> {{ request.user.name }}<span style="color: #8095a8"></span></strong> <strong class="font-bold"> {{ request.user.name }}<span style="color: #8095a8"></span></strong>
</span> </span>
<span class="text-muted text-xs block"> <span class="text-muted text-xs block">
{{ request.user.get_role_display | default:"{% trans 'User' %}" }}<b class="caret"></b> {{ request.user.get_role_display | default:_('User') }}<b class="caret"></b>
</span> </span>
</span> </span>
</a> </a>
......
{% load i18n %}
<div class="row"> <div class="row">
<div class="col-sm-6"> <div class="col-sm-6">
<input autocomplete="off" id="{{id}}_1" class="form-control" name="{{name}}_1" type="text" /> <input autocomplete="off" id="{{id}}_1" class="form-control" name="{{name}}_1" placeholder="{% trans 'Captcha' %}" type="text" />
<span class="red-fonts" id="captcha-error" style="display: none">验证码错误</span>
</div> </div>
</div> </div>
</br> </br>
...@@ -14,7 +14,7 @@ class UserLoginForm(forms.Form): ...@@ -14,7 +14,7 @@ class UserLoginForm(forms.Form):
captcha = CaptchaField() captcha = CaptchaField()
class UserAddForm(ModelForm): class UserCreateForm(ModelForm):
class Meta: class Meta:
model = User model = User
fields = [ fields = [
...@@ -28,7 +28,7 @@ class UserAddForm(ModelForm): ...@@ -28,7 +28,7 @@ class UserAddForm(ModelForm):
} }
widgets = { widgets = {
'groups': forms.SelectMultiple(attrs={'class': 'select2', 'data-placeholder': _('Join usergroups')}), 'groups': forms.SelectMultiple(attrs={'class': 'select2', 'data-placeholder': _('Join user groups')}),
} }
......
...@@ -66,7 +66,7 @@ class UserGroup(models.Model): ...@@ -66,7 +66,7 @@ class UserGroup(models.Model):
return self.name return self.name
class Meta: class Meta:
db_table = 'usergroup' db_table = 'user-group'
@classmethod @classmethod
def initial(cls): def initial(cls):
......
...@@ -7,7 +7,7 @@ from .models import User, UserGroup ...@@ -7,7 +7,7 @@ from .models import User, UserGroup
class UserSerializer(serializers.ModelSerializer): class UserSerializer(serializers.ModelSerializer):
groups = serializers.HyperlinkedRelatedField(many=True, read_only=True, view_name='users:usergroup-detail-api') groups = serializers.HyperlinkedRelatedField(many=True, read_only=True, view_name='users:user-group-detail-api')
class Meta: class Meta:
model = User model = User
......
...@@ -47,11 +47,12 @@ ...@@ -47,11 +47,12 @@
<div class="col-sm-9"> <div class="col-sm-9">
<div class="input-group date"> <div class="input-group date">
<span class="input-group-addon"><i class="fa fa-calendar"></i></span> <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:'m/d/Y' }}"> <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> </div>
<span class="help-block ">{{ form.date_expired.errors }}</span> <span class="help-block ">{{ form.date_expired.errors }}</span>
</div> </div>
</div> </div>
{# {{ form.date_expired|bootstrap_horizontal }}#}
<div class="form-group"> <div class="form-group">
<label for="{{ form.enable_otp.id_for_label }}" class="col-sm-2 control-label">{% trans 'Enable OTP' %}</label> <label for="{{ form.enable_otp.id_for_label }}" class="col-sm-2 control-label">{% trans 'Enable OTP' %}</label>
<div class="col-sm-8"> <div class="col-sm-8">
...@@ -67,7 +68,7 @@ ...@@ -67,7 +68,7 @@
<div class="form-group"> <div class="form-group">
<div class="col-sm-4 col-sm-offset-2"> <div class="col-sm-4 col-sm-offset-2">
<button class="btn btn-white" type="reset">{% trans 'Reset' %}</button> <button class="btn btn-white" type="reset">{% trans 'Reset' %}</button>
<button id="submit_button" class="btn btn-primary" type="submit">{% trans 'Commit' %}</button> <button id="submit_button" class="btn btn-primary" type="submit">{% trans 'Submit' %}</button>
</div> </div>
</div> </div>
</form> </form>
...@@ -84,6 +85,7 @@ ...@@ -84,6 +85,7 @@
$('.select2').select2(); $('.select2').select2();
$('.input-group.date').datepicker({ $('.input-group.date').datepicker({
format: "yyyy-mm-dd",
todayBtn: "linked", todayBtn: "linked",
keyboardNavigation: false, keyboardNavigation: false,
forceParse: false, forceParse: false,
......
...@@ -41,7 +41,7 @@ ...@@ -41,7 +41,7 @@
<input type="email" name="email" class="form-control" placeholder="Email address" required=""> <input type="email" name="email" class="form-control" placeholder="Email address" required="">
</div> </div>
<button type="submit" class="btn btn-primary block full-width m-b">{% trans 'Commit' %}</button> <button type="submit" class="btn btn-primary block full-width m-b">{% trans 'Submit' %}</button>
</form> </form>
</div> </div>
......
...@@ -13,11 +13,8 @@ ...@@ -13,11 +13,8 @@
<script src="{% static "js/jumpserver.js" %}"></script> <script src="{% static "js/jumpserver.js" %}"></script>
<style> <style>
.captcha { .captcha {
float: right; float: right;
} }
#id_captcha_1 {
}
</style> </style>
</head> </head>
......
{% extends 'base.html' %} {% extends 'base.html' %}
{% load static %} {% load static %}
{% load i18n %}
{% load bootstrap %} {% load bootstrap %}
{% block custom_head_css_js %} {% block custom_head_css_js %}
<link href="{% static "css/plugins/select2/select2.min.css" %}" rel="stylesheet"> <link href="{% static "css/plugins/select2/select2.min.css" %}" rel="stylesheet">
...@@ -12,7 +13,7 @@ ...@@ -12,7 +13,7 @@
<div class="col-sm-12"> <div class="col-sm-12">
<div class="ibox float-e-margins"> <div class="ibox float-e-margins">
<div class="ibox-title"> <div class="ibox-title">
<h5>填写用户组信息</h5> <h5>{% trans 'Create user group' %}</h5>
<div class="ibox-tools"> <div class="ibox-tools">
<a class="collapse-link"> <a class="collapse-link">
<i class="fa fa-chevron-up"></i> <i class="fa fa-chevron-up"></i>
......
{% extends '_list_base.html' %} {% extends '_list_base.html' %}
{% load i18n %}
{% load common_tags %} {% load common_tags %}
{% block content_left_head %} {% block content_left_head %}
<a href="{% url 'users:usergroup-add' %}" class="btn btn-sm btn-primary "> 添加用户组 </a> <a href="{% url 'users:user-group-create' %}" class="btn btn-sm btn-primary "> 添加用户组 </a>
{% endblock %} {% endblock %}
{% block table_head %} {% block table_head %}
<th class="text-center"> <th class="text-center">
<input type="checkbox" id="check_all" onclick="checkAll('check_all', 'checked')"> <input type="checkbox" id="check_all" onclick="checkAll('check_all', 'checked')">
</th> </th>
<th class="text-center"><a href="{% url 'users:usergroup-list' %}?sort=name">名称</a></th> <th class="text-center"><a href="{% url 'users:user-group-list' %}?sort=name">名称</a></th>
<th class="text-center">用户数量</th> <th class="text-center">用户数量</th>
<th class="text-center">资产数量</th> <th class="text-center">资产数量</th>
<th class="text-center">描述</th> <th class="text-center">描述</th>
...@@ -16,22 +17,22 @@ ...@@ -16,22 +17,22 @@
{% endblock %} {% endblock %}
{% block table_body %} {% block table_body %}
{% for usergroup in usergroup_list %} {% for user_group in user_group_list %}
<tr class="gradeX"> <tr class="gradeX">
<td class="text-center"> <td class="text-center">
<input type="checkbox" name="checked" value="{{ usergroup.id }}"> <input type="checkbox" name="checked" value="{{ user_group.id }}">
</td> </td>
<td class="text-center"> <td class="text-center">
<a href="{% url 'users:usergroup-detail' pk=usergroup.id %}"> <a href="{% url 'users:user-group-detail' pk=user_group.id %}">
{{ usergroup.name }} {{ user_group.name }}
</a> </a>
</td> </td>
<td class="text-center">{{ usergroup.users.all|length }}</td> <td class="text-center">{{ user_group.users.all|length }}</td>
<td class="text-center">数量</td> <td class="text-center">数量</td>
<th class="text-center">{{ usergroup.comment|truncatewords:8 }}</th> <th class="text-center">{{ user_group.comment|truncatewords:8 }}</th>
<td class="text-center"> <td class="text-center">
<a href="{% url 'users:usergroup-edit' pk=usergroup.id %}" class="btn btn-xs btn-info">编辑</a> <a href="{% url 'users:user-group-update' pk=user_group.id %}" class="btn btn-xs btn-info">编辑</a>
<a href="{% url 'users:usergroup-delete' pk=usergroup.id %}" class="btn btn-xs btn-danger del">删除</a> <a href="{% url 'users:user-group-delete' pk=user_group.id %}" class="btn btn-xs btn-danger del">删除</a>
</td> </td>
</tr> </tr>
{% endfor %} {% endfor %}
......
...@@ -2,7 +2,7 @@ ...@@ -2,7 +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-add' %}" class="btn btn-sm btn-primary "> {% trans "Create user" %} </a> <a href="{% url 'users:user-create' %}" class="btn btn-sm btn-primary "> {% trans "Create user" %} </a>
{% endblock %} {% endblock %}
{% block table_head %} {% block table_head %}
...@@ -41,7 +41,7 @@ ...@@ -41,7 +41,7 @@
{% endif %} {% endif %}
</td> </td>
<td class="text-center"> <td class="text-center">
<a href="{% url 'users:user-edit' pk=user.id %}" class="btn btn-xs btn-info">{% trans 'Edit' %}</a> <a href="{% url 'users:user-update' pk=user.id %}" class="btn btn-xs btn-info">{% trans 'Edit' %}</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> <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>
...@@ -60,7 +60,7 @@ ...@@ -60,7 +60,7 @@
<div class="input-group-btn pull-left" style="padding-left: 5px;"> <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"> <button id='search_btn' type="submit" style="height: 32px;" class="btn btn-sm btn-primary">
{% trans 'Commit' %} {% trans 'Submit' %}
</button> </button>
</div> </div>
......
...@@ -54,7 +54,7 @@ class UserAddTests(TestCase): ...@@ -54,7 +54,7 @@ class UserAddTests(TestCase):
'date_expired': '2086-08-06 19:12:22', 'date_expired': '2086-08-06 19:12:22',
} }
response = self.client.post(reverse('users:user-add'), data) response = self.client.post(reverse('users:user-create'), data)
self.assertEqual(response.status_code, 302) self.assertEqual(response.status_code, 302)
self.assertEqual(response['location'], reverse('users:user-list')) self.assertEqual(response['location'], reverse('users:user-list'))
......
...@@ -17,14 +17,14 @@ urlpatterns = [ ...@@ -17,14 +17,14 @@ urlpatterns = [
url(r'^password/reset/success$', views.UserResetPasswordSuccessView.as_view(), name='reset-password-success'), url(r'^password/reset/success$', views.UserResetPasswordSuccessView.as_view(), name='reset-password-success'),
url(r'^user$', views.UserListView.as_view(), name='user-list'), url(r'^user$', views.UserListView.as_view(), name='user-list'),
url(r'^user/(?P<pk>[0-9]+)$', views.UserDetailView.as_view(), name='user-detail'), url(r'^user/(?P<pk>[0-9]+)$', views.UserDetailView.as_view(), name='user-detail'),
url(r'^user/add$', views.UserAddView.as_view(), name='user-add'), url(r'^user/create$', views.UserCreateView.as_view(), name='user-create'),
url(r'^user/(?P<pk>[0-9]+)/edit$', views.UserUpdateView.as_view(), name='user-edit'), url(r'^user/(?P<pk>[0-9]+)/update$', views.UserUpdateView.as_view(), name='user-update'),
url(r'^user/(?P<pk>[0-9]+)/delete$', views.UserDeleteView.as_view(), name='user-delete'), url(r'^user/(?P<pk>[0-9]+)/delete$', views.UserDeleteView.as_view(), name='user-delete'),
url(r'^usergroup$', views.UserGroupListView.as_view(), name='usergroup-list'), url(r'^user-group$', views.UserGroupListView.as_view(), name='user-group-list'),
url(r'^usergroup/(?P<pk>[0-9]+)$', views.UserGroupDetailView.as_view(), name='usergroup-detail'), url(r'^user-group/(?P<pk>[0-9]+)$', views.UserGroupDetailView.as_view(), name='user-group-detail'),
url(r'^usergroup/add/$', views.UserGroupAddView.as_view(), name='usergroup-add'), url(r'^user-group/create$', views.UserGroupCreateView.as_view(), name='user-group-create'),
url(r'^usergroup/(?P<pk>[0-9]+)/edit$', views.UserGroupUpdateView.as_view(), name='usergroup-edit'), url(r'^user-group/(?P<pk>[0-9]+)/update$', views.UserGroupUpdateView.as_view(), name='user-group-update'),
url(r'^usergroup/(?P<pk>[0-9]+)/delete$', views.UserGroupDeleteView.as_view(), name='usergroup-delete'), url(r'^user-group/(?P<pk>[0-9]+)/delete$', views.UserGroupDeleteView.as_view(), name='user-group-delete'),
] ]
...@@ -32,6 +32,6 @@ urlpatterns += [ ...@@ -32,6 +32,6 @@ urlpatterns += [
url(r'^v1/users$', api.UserListAddApi.as_view(), name='user-list-api'), url(r'^v1/users$', api.UserListAddApi.as_view(), name='user-list-api'),
url(r'^v1/users/(?P<pk>[0-9]+)$', api.UserDetailDeleteUpdateApi.as_view(), name='user-detail-api'), url(r'^v1/users/(?P<pk>[0-9]+)$', api.UserDetailDeleteUpdateApi.as_view(), name='user-detail-api'),
url(r'^v1/users/(?P<pk>[0-9]+)/active$', api.UserActiveApi.as_view(), name='user-active-api'), url(r'^v1/users/(?P<pk>[0-9]+)/active$', api.UserActiveApi.as_view(), name='user-active-api'),
url(r'^v1/usergroups$', api.UserGroupListAddApi.as_view(), name='usergroup-list-api'), url(r'^v1/usergroups$', api.UserGroupListAddApi.as_view(), name='user-group-list-api'),
url(r'^v1/usergroups/(?P<pk>[0-9]+)$', api.UserGroupDetailDeleteUpdateApi.as_view(), name='usergroup-detail-api'), url(r'^v1/usergroups/(?P<pk>[0-9]+)$', api.UserGroupDetailDeleteUpdateApi.as_view(), name='user-group-detail-api'),
] ]
...@@ -20,7 +20,7 @@ from django.contrib.auth import views as auth_view, authenticate, login, logout ...@@ -20,7 +20,7 @@ from django.contrib.auth import views as auth_view, authenticate, login, logout
from common.utils import get_object_or_none from common.utils import get_object_or_none
from .models import User, UserGroup from .models import User, UserGroup
from .forms import UserAddForm, UserUpdateForm, UserGroupForm, UserLoginForm from .forms import UserCreateForm, UserUpdateForm, UserGroupForm, UserLoginForm
from .utils import AdminUserRequiredMixin, ssh_key_gen, user_add_success_next, send_reset_password_mail from .utils import AdminUserRequiredMixin, ssh_key_gen, user_add_success_next, send_reset_password_mail
...@@ -101,15 +101,15 @@ class UserListView(AdminUserRequiredMixin, ListView): ...@@ -101,15 +101,15 @@ class UserListView(AdminUserRequiredMixin, ListView):
return context return context
class UserAddView(AdminUserRequiredMixin, SuccessMessageMixin, CreateView): class UserCreateView(AdminUserRequiredMixin, SuccessMessageMixin, CreateView):
model = User model = User
form_class = UserAddForm form_class = UserCreateForm
template_name = 'users/user_add.html' template_name = 'users/user_create.html'
success_url = reverse_lazy('users:user-list') success_url = reverse_lazy('users:user-list')
success_message = _('Create user<a href="%s">%s</a> success.') success_message = _('Create user<a href="%s">%s</a> success.')
def get_context_data(self, **kwargs): def get_context_data(self, **kwargs):
context = super(UserAddView, self).get_context_data(**kwargs) context = super(UserCreateView, self).get_context_data(**kwargs)
context.update({'app': _('Users'), 'action': _('Create user')}) context.update({'app': _('Users'), 'action': _('Create user')})
return context return context
...@@ -117,10 +117,8 @@ class UserAddView(AdminUserRequiredMixin, SuccessMessageMixin, CreateView): ...@@ -117,10 +117,8 @@ class UserAddView(AdminUserRequiredMixin, SuccessMessageMixin, CreateView):
user = form.save(commit=False) user = form.save(commit=False)
user.created_by = self.request.user.username or 'System' user.created_by = self.request.user.username or 'System'
user.save() user.save()
user_add_success_next(user) user_add_success_next(user)
return super(UserCreateView, 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):
return self.success_message % ( return self.success_message % (
...@@ -132,7 +130,7 @@ class UserAddView(AdminUserRequiredMixin, SuccessMessageMixin, CreateView): ...@@ -132,7 +130,7 @@ class UserAddView(AdminUserRequiredMixin, SuccessMessageMixin, CreateView):
class UserUpdateView(AdminUserRequiredMixin, UpdateView): class UserUpdateView(AdminUserRequiredMixin, UpdateView):
model = User model = User
form_class = UserUpdateForm form_class = UserUpdateForm
template_name = 'users/user_edit.html' template_name = 'users/user_update.html'
context_object_name = 'user' context_object_name = 'user'
success_url = reverse_lazy('users:user-list') success_url = reverse_lazy('users:user-list')
...@@ -177,8 +175,8 @@ class UserDetailView(AdminUserRequiredMixin, DetailView): ...@@ -177,8 +175,8 @@ class UserDetailView(AdminUserRequiredMixin, DetailView):
class UserGroupListView(AdminUserRequiredMixin, ListView): class UserGroupListView(AdminUserRequiredMixin, ListView):
model = UserGroup model = UserGroup
paginate_by = settings.CONFIG.DISPLAY_PER_PAGE paginate_by = settings.CONFIG.DISPLAY_PER_PAGE
context_object_name = 'usergroup_list' context_object_name = 'user_group_list'
template_name = 'users/usergroup_list.html' template_name = 'users/user_group_list.html'
ordering = '-date_added' ordering = '-date_added'
def get_queryset(self): def get_queryset(self):
...@@ -198,26 +196,26 @@ class UserGroupListView(AdminUserRequiredMixin, ListView): ...@@ -198,26 +196,26 @@ class UserGroupListView(AdminUserRequiredMixin, ListView):
return context return context
class UserGroupAddView(AdminUserRequiredMixin, CreateView): class UserGroupCreateView(AdminUserRequiredMixin, CreateView):
model = UserGroup model = UserGroup
form_class = UserGroupForm form_class = UserGroupForm
template_name = 'users/usergroup_add.html' template_name = 'users/user_group_create.html'
success_url = reverse_lazy('users:usergroup-list') success_url = reverse_lazy('users:user-group-list')
def get_context_data(self, **kwargs): def get_context_data(self, **kwargs):
context = super(UserGroupAddView, self).get_context_data(**kwargs) context = super(UserGroupCreateView, self).get_context_data(**kwargs)
users = User.objects.all() users = User.objects.all()
context.update({'app': _('Users'), 'action': _('Create usergroup'), 'users': users}) context.update({'app': _('Users'), 'action': _('Create user group'), 'users': users})
return context return context
def form_valid(self, form): def form_valid(self, form):
usergroup = form.save() user_group = form.save()
users_id_list = self.request.POST.getlist('users', []) users_id_list = self.request.POST.getlist('users', [])
users = [get_object_or_404(User, id=user_id) for user_id in users_id_list] users = [get_object_or_404(User, id=user_id) for user_id in users_id_list]
usergroup.created_by = self.request.user.username or 'Admin' user_group.created_by = self.request.user.username or 'Admin'
usergroup.users.add(*tuple(users)) user_group.users.add(*tuple(users))
usergroup.save() user_group.save()
return super(UserGroupAddView, self).form_valid(form) return super(UserGroupCreateView, self).form_valid(form)
class UserGroupUpdateView(UpdateView): class UserGroupUpdateView(UpdateView):
......
...@@ -3,7 +3,7 @@ ...@@ -3,7 +3,7 @@
## 语言框架 ## 语言框架
1. Python 2.7 由于ansible目前不支持python3 1. Python 2.7 由于ansible目前不支持python3
2. Django 1.10 (最新版本) 2. Django 1.10 (最新版本)
3. Terminal Websocket使用go实现 3. Terminal Websocket使用go实现 (未来)
## Django规范 ## Django规范
...@@ -32,7 +32,8 @@ Python方面大致的风格,我们采用pocoo的[Style Guidance](http://www.po ...@@ -32,7 +32,8 @@ Python方面大致的风格,我们采用pocoo的[Style Guidance](http://www.po
#### 最大行长度 #### 最大行长度
按PEP8规范,Python一般限制最大79个字符, 如果有必要最多84个字符 按PEP8规范,Python一般限制最大79个字符, 但是Django的命名,url等通常比较长,
而且21世纪都是宽屏了,所以我们限制最大120字符
**补充说明:HTML代码不受此规范约束。** **补充说明:HTML代码不受此规范约束。**
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment