mirror of https://github.com/jumpserver/jumpserver
Merge branch 'dev' of github.com:jumpserver/jumpserver into dev
commit
0f9ae9efbb
|
@ -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)),
|
||||||
|
|
|
@ -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
|
||||||
|
|
|
@ -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>
|
||||||
|
|
|
@ -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 准备配置文件
|
||||||
|
|
||||||
|
|
|
@ -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
|
||||||
|
|
Loading…
Reference in New Issue