diff --git a/apps/assets/views/asset.py b/apps/assets/views/asset.py index 900adefc3..e1a9fcb2d 100644 --- a/apps/assets/views/asset.py +++ b/apps/assets/views/asset.py @@ -248,6 +248,7 @@ class BulkImportAssetView(AdminUserRequiredMixin, JSONResponseMixin, FormView): 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) diff --git a/apps/common/forms.py b/apps/common/forms.py index 0d0f057cf..d7e6b104b 100644 --- a/apps/common/forms.py +++ b/apps/common/forms.py @@ -68,7 +68,7 @@ class BaseForm(forms.Form): class BasicSettingForm(BaseForm): SITE_URL = forms.URLField( label=_("Current SITE URL"), - help_text="http://jumpserver.abc.com:8080" + help_text="eg: http://jumpserver.abc.com:8080" ) USER_GUIDE_URL = forms.URLField( label=_("User Guide URL"), @@ -135,7 +135,7 @@ class LDAPSettingForm(BaseForm): AUTH_LDAP_START_TLS = forms.BooleanField( label=_("Use SSL"), initial=False, required=False ) - AUTH_LDAP = forms.BooleanField(label=_("Enable LDAP auth"), initial=False) + AUTH_LDAP = forms.BooleanField(label=_("Enable LDAP auth"), initial=False, required=False) class TerminalSettingForm(BaseForm): diff --git a/apps/users/apps.py b/apps/users/apps.py index af3dddf8e..f37fa6cf5 100644 --- a/apps/users/apps.py +++ b/apps/users/apps.py @@ -6,3 +6,6 @@ from django.apps import AppConfig class UsersConfig(AppConfig): name = 'users' + def ready(self): + from . import signals_handler + super().ready() diff --git a/apps/users/signals.py b/apps/users/signals.py index f942c39b7..324cd1627 100644 --- a/apps/users/signals.py +++ b/apps/users/signals.py @@ -1,21 +1,5 @@ -# -*- coding: utf-8 -*- -# - -from django.dispatch import Signal, receiver -from django.db.models.signals import post_save - -from common.utils import get_logger -from .models import User - -logger = get_logger(__file__) +from django.dispatch import Signal -@receiver(post_save, sender=User) -def on_user_created(sender, instance=None, created=False, **kwargs): - if created: - logger.debug("Receive user `{}` create signal".format(instance.name)) - from .utils import send_user_created_mail - logger.info(" - Sending welcome mail ...".format(instance.name)) - if instance.email: - send_user_created_mail(instance) +post_user_create = Signal(providing_args=('user',)) diff --git a/apps/users/signals_handler.py b/apps/users/signals_handler.py new file mode 100644 index 000000000..9e1abf350 --- /dev/null +++ b/apps/users/signals_handler.py @@ -0,0 +1,20 @@ +# -*- coding: utf-8 -*- +# + +from django.dispatch import receiver +from django.db.models.signals import post_save + +from common.utils import get_logger +from .models import User + +logger = get_logger(__file__) + + +@receiver(post_save, sender=User) +def on_user_created(sender, instance=None, created=False, **kwargs): + if created: + logger.debug("Receive user `{}` create signal".format(instance.name)) + from .utils import send_user_created_mail + logger.info(" - Sending welcome mail ...".format(instance.name)) + if instance.email: + send_user_created_mail(instance) \ No newline at end of file diff --git a/apps/users/views/user.py b/apps/users/views/user.py index 93f19f313..e85f04877 100644 --- a/apps/users/views/user.py +++ b/apps/users/views/user.py @@ -6,6 +6,7 @@ import json import uuid import csv import codecs +import chardet from io import StringIO from django.contrib import messages @@ -20,6 +21,7 @@ from django.utils.translation import ugettext as _ from django.utils.decorators import method_decorator from django.views import View from django.views.generic.base import TemplateView +from django.db import transaction from django.views.generic.edit import ( CreateView, UpdateView, FormMixin, FormView ) @@ -33,7 +35,7 @@ from common.utils import get_logger, get_object_or_none, is_uuid from .. import forms from ..models import User, UserGroup from ..utils import AdminUserRequiredMixin -from ..signals import on_user_created +from ..signals import post_user_create __all__ = [ @@ -212,8 +214,10 @@ class UserBulkImportView(AdminUserRequiredMixin, JSONResponseMixin, FormView): # todo: need be patch, method to long def form_valid(self, form): - file = form.cleaned_data['file'] - data = file.read().decode('utf-8').strip(codecs.BOM_UTF8.decode('utf-8')) + f = form.cleaned_data['file'] + det_result = chardet.detect(f.read()) + f.seek(0) # reset file seek index + data = f.read().decode(det_result['encoding']).strip(codecs.BOM_UTF8.decode()) csv_file = StringIO(data) reader = csv.reader(csv_file) csv_data = [row for row in reader] @@ -252,15 +256,15 @@ class UserBulkImportView(AdminUserRequiredMixin, JSONResponseMixin, FormView): else: continue user_dict[k] = v - - user = get_object_or_none(User, id=id_) if is_uuid(id_) else None + user = get_object_or_none(User, id=id_) if id_ and is_uuid(id_) else None if not user: try: - groups = user_dict.pop('groups') - user = User.objects.create(**user_dict) - user.groups.set(groups) - created.append(user_dict['username']) - on_user_created.send(self.__class__, user=user) + with transaction.atomic(): + groups = user_dict.pop('groups') + user = User.objects.create(**user_dict) + user.groups.set(groups) + created.append(user_dict['username']) + post_user_create.send(self.__class__, user=user) except Exception as e: failed.append('%s: %s' % (user_dict['username'], str(e))) else: