Merge branch 'dev' of github.com:jumpserver/jumpserver into dev

pull/756/head^2
ibuler 2017-09-25 22:15:42 +08:00
commit 0f9ae9efbb
5 changed files with 26 additions and 9 deletions

View File

@ -5,6 +5,7 @@ import csv
import json import json
import uuid import uuid
import codecs import codecs
import chardet
from io import StringIO from io import StringIO
from collections import defaultdict from collections import defaultdict
@ -243,10 +244,11 @@ class BulkImportAssetView(AdminUserRequiredMixin, JSONResponseMixin, FormView):
form_class = forms.FileForm form_class = forms.FileForm
def form_valid(self, form): def form_valid(self, form):
file = form.cleaned_data['file'] f = form.cleaned_data['file']
data = file.read().decode('utf-8').strip( det_result = chardet.detect(f.read())
codecs.BOM_UTF8.decode('utf-8')) f.seek(0) # reset file seek index
csv_file = StringIO(data) file_data = f.read().decode(det_result['encoding']).strip(codecs.BOM_UTF8.decode())
csv_file = StringIO(file_data)
reader = csv.reader(csv_file) reader = csv.reader(csv_file)
csv_data = [row for row in reader] csv_data = [row for row in reader]
fields = [ fields = [
@ -270,8 +272,15 @@ class BulkImportAssetView(AdminUserRequiredMixin, JSONResponseMixin, FormView):
for row in csv_data[1:]: for row in csv_data[1:]:
if set(row) == {''}: if set(row) == {''}:
continue continue
asset_dict = dict(zip(attr, row)) asset_dict = dict(zip(attr, row))
id_ = asset_dict.pop('id', 0) id_ = asset_dict.pop('id', 0)
try:
id_ = int(id_)
except ValueError:
id_ = 0
asset = get_object_or_none(Asset, id=id_) asset = get_object_or_none(Asset, id=id_)
for k, v in asset_dict.items(): for k, v in asset_dict.items():
if k == 'idc': if k == 'idc':
@ -295,11 +304,13 @@ class BulkImportAssetView(AdminUserRequiredMixin, JSONResponseMixin, FormView):
if not asset: if not asset:
try: try:
groups = asset_dict.pop('groups') groups = asset_dict.pop('groups')
if len(Asset.objects.filter(hostname=asset_dict.get('hostname'))):
raise Exception(_('already exists'))
asset = Asset.objects.create(**asset_dict) asset = Asset.objects.create(**asset_dict)
asset.groups.set(groups) asset.groups.set(groups)
created.append(asset_dict['hostname']) created.append(asset_dict['hostname'])
assets.append(asset) assets.append(asset)
except IndexError as e: except Exception as e:
failed.append('%s: %s' % (asset_dict['hostname'], str(e))) failed.append('%s: %s' % (asset_dict['hostname'], str(e)))
else: else:
for k, v in asset_dict.items(): for k, v in asset_dict.items():
@ -317,6 +328,7 @@ class BulkImportAssetView(AdminUserRequiredMixin, JSONResponseMixin, FormView):
if assets: if assets:
update_assets_hardware_info.delay([asset._to_secret_json() for asset in assets]) update_assets_hardware_info.delay([asset._to_secret_json() for asset in assets])
data = { data = {
'created': created, 'created': created,
'created_info': 'Created {}'.format(len(created)), 'created_info': 'Created {}'.format(len(created)),

View File

@ -204,7 +204,7 @@ class User(AbstractUser):
'wechat': self.wechat, 'wechat': self.wechat,
'phone': self.phone, 'phone': self.phone,
'comment': self.comment, 'comment': self.comment,
'date_expired': self.date_expired.strftime('%Y-%m-%d %H:%M:%S') 'date_expired': self.date_expired.strftime('%Y-%m-%d %H:%M:%S') if self.date_expired is not None else None
}) })
@classmethod @classmethod

View File

@ -22,7 +22,7 @@
</ul> </ul>
</div> </div>
<div class="tab-content"> <div class="tab-content">
<div class="col-sm-7"> <div class="col-sm-7" style="padding-left: 0;">
<div class="ibox float-e-margins"> <div class="ibox float-e-margins">
<div class="ibox-title"> <div class="ibox-title">
<span class="label label-primary"><b>{{ user.name }}</b></span> <span class="label label-primary"><b>{{ user.name }}</b></span>

View File

@ -36,6 +36,10 @@
$ sudo yum -y install `cat rpm_requirements.txt` $ sudo yum -y install `cat rpm_requirements.txt`
$ pip install -r requirements.txt -i https://pypi.doubanio.com/simple $ pip install -r requirements.txt -i https://pypi.doubanio.com/simple
// 解决Mac安装ldap提示 Modules/LDAPObject.c:18:10: fatal error: 'sasl.h' file not found
pip install python-ldap \
--global-option=build_ext \
--global-option="-I$(xcrun --show-sdk-path)/usr/include/sasl"
##### 2.3 准备配置文件 ##### 2.3 准备配置文件

View File

@ -5,8 +5,8 @@ djangorestframework>=3.6.2
ForgeryPy ForgeryPy
#openpyxl>=2.4.0 #openpyxl>=2.4.0
celery>=4.0.2 celery>=4.0.2
paramiko>=2.1.2 paramiko==2.1.2
ansible>=2.2.2.0 ansible==2.2.2.0
django-simple-captcha>=0.5.5 django-simple-captcha>=0.5.5
django-formtools>=2.0 django-formtools>=2.0
sshpubkeys>=2.2.0 sshpubkeys>=2.2.0
@ -21,3 +21,4 @@ gssapi
django-rest-swagger django-rest-swagger
django-auth-ldap django-auth-ldap
ldap3 ldap3
chardet>=3.0.4