diff --git a/apps/assets/views/asset.py b/apps/assets/views/asset.py index 596c43d1e..f2b3035df 100644 --- a/apps/assets/views/asset.py +++ b/apps/assets/views/asset.py @@ -5,6 +5,7 @@ import csv import json import uuid import codecs +import chardet from io import StringIO from collections import defaultdict @@ -243,10 +244,11 @@ class BulkImportAssetView(AdminUserRequiredMixin, JSONResponseMixin, FormView): form_class = forms.FileForm def form_valid(self, form): - file = form.cleaned_data['file'] - data = file.read().decode('utf-8').strip( - codecs.BOM_UTF8.decode('utf-8')) - csv_file = StringIO(data) + f = form.cleaned_data['file'] + det_result = chardet.detect(f.read()) + f.seek(0) # reset file seek index + file_data = f.read().decode(det_result['encoding']).strip(codecs.BOM_UTF8.decode()) + csv_file = StringIO(file_data) reader = csv.reader(csv_file) csv_data = [row for row in reader] fields = [ @@ -270,8 +272,15 @@ class BulkImportAssetView(AdminUserRequiredMixin, JSONResponseMixin, FormView): for row in csv_data[1:]: if set(row) == {''}: continue + asset_dict = dict(zip(attr, row)) id_ = asset_dict.pop('id', 0) + + try: + id_ = int(id_) + except ValueError: + id_ = 0 + asset = get_object_or_none(Asset, id=id_) for k, v in asset_dict.items(): if k == 'idc': @@ -295,11 +304,13 @@ class BulkImportAssetView(AdminUserRequiredMixin, JSONResponseMixin, FormView): if not asset: try: 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.groups.set(groups) created.append(asset_dict['hostname']) assets.append(asset) - except IndexError as e: + except Exception as e: failed.append('%s: %s' % (asset_dict['hostname'], str(e))) else: for k, v in asset_dict.items(): @@ -317,6 +328,7 @@ class BulkImportAssetView(AdminUserRequiredMixin, JSONResponseMixin, FormView): if assets: update_assets_hardware_info.delay([asset._to_secret_json() for asset in assets]) + data = { 'created': created, 'created_info': 'Created {}'.format(len(created)), diff --git a/apps/users/models/user.py b/apps/users/models/user.py index fc40ee87a..660b5f350 100644 --- a/apps/users/models/user.py +++ b/apps/users/models/user.py @@ -204,7 +204,7 @@ class User(AbstractUser): 'wechat': self.wechat, 'phone': self.phone, '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 diff --git a/apps/users/templates/users/user_profile.html b/apps/users/templates/users/user_profile.html index 93a14ef86..c57eeb611 100644 --- a/apps/users/templates/users/user_profile.html +++ b/apps/users/templates/users/user_profile.html @@ -22,7 +22,7 @@
-
+
{{ user.name }} diff --git a/docs/install.md b/docs/install.md index 587b012b9..e6b240ab1 100644 --- a/docs/install.md +++ b/docs/install.md @@ -36,6 +36,10 @@ $ sudo yum -y install `cat rpm_requirements.txt` $ 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 准备配置文件 diff --git a/requirements/requirements.txt b/requirements/requirements.txt index e89c13f26..952b041d6 100644 --- a/requirements/requirements.txt +++ b/requirements/requirements.txt @@ -5,8 +5,8 @@ djangorestframework>=3.6.2 ForgeryPy #openpyxl>=2.4.0 celery>=4.0.2 -paramiko>=2.1.2 -ansible>=2.2.2.0 +paramiko==2.1.2 +ansible==2.2.2.0 django-simple-captcha>=0.5.5 django-formtools>=2.0 sshpubkeys>=2.2.0 @@ -21,3 +21,4 @@ gssapi django-rest-swagger django-auth-ldap ldap3 +chardet>=3.0.4