mirror of https://github.com/jumpserver/jumpserver
[Bugfix] 用户csv导入编码问题
parent
8e2891d7d7
commit
9292e48554
|
@ -248,6 +248,7 @@ class BulkImportAssetView(AdminUserRequiredMixin, JSONResponseMixin, FormView):
|
||||||
f = form.cleaned_data['file']
|
f = form.cleaned_data['file']
|
||||||
det_result = chardet.detect(f.read())
|
det_result = chardet.detect(f.read())
|
||||||
f.seek(0) # reset file seek index
|
f.seek(0) # reset file seek index
|
||||||
|
|
||||||
file_data = f.read().decode(det_result['encoding']).strip(codecs.BOM_UTF8.decode())
|
file_data = f.read().decode(det_result['encoding']).strip(codecs.BOM_UTF8.decode())
|
||||||
csv_file = StringIO(file_data)
|
csv_file = StringIO(file_data)
|
||||||
reader = csv.reader(csv_file)
|
reader = csv.reader(csv_file)
|
||||||
|
|
|
@ -68,7 +68,7 @@ class BaseForm(forms.Form):
|
||||||
class BasicSettingForm(BaseForm):
|
class BasicSettingForm(BaseForm):
|
||||||
SITE_URL = forms.URLField(
|
SITE_URL = forms.URLField(
|
||||||
label=_("Current SITE URL"),
|
label=_("Current SITE URL"),
|
||||||
help_text="http://jumpserver.abc.com:8080"
|
help_text="eg: http://jumpserver.abc.com:8080"
|
||||||
)
|
)
|
||||||
USER_GUIDE_URL = forms.URLField(
|
USER_GUIDE_URL = forms.URLField(
|
||||||
label=_("User Guide URL"),
|
label=_("User Guide URL"),
|
||||||
|
@ -135,7 +135,7 @@ class LDAPSettingForm(BaseForm):
|
||||||
AUTH_LDAP_START_TLS = forms.BooleanField(
|
AUTH_LDAP_START_TLS = forms.BooleanField(
|
||||||
label=_("Use SSL"), initial=False, required=False
|
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):
|
class TerminalSettingForm(BaseForm):
|
||||||
|
|
|
@ -6,3 +6,6 @@ from django.apps import AppConfig
|
||||||
class UsersConfig(AppConfig):
|
class UsersConfig(AppConfig):
|
||||||
name = 'users'
|
name = 'users'
|
||||||
|
|
||||||
|
def ready(self):
|
||||||
|
from . import signals_handler
|
||||||
|
super().ready()
|
||||||
|
|
|
@ -1,21 +1,5 @@
|
||||||
# -*- coding: utf-8 -*-
|
from django.dispatch import Signal
|
||||||
#
|
|
||||||
|
|
||||||
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__)
|
|
||||||
|
|
||||||
|
|
||||||
@receiver(post_save, sender=User)
|
post_user_create = Signal(providing_args=('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)
|
|
||||||
|
|
||||||
|
|
|
@ -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)
|
|
@ -6,6 +6,7 @@ import json
|
||||||
import uuid
|
import uuid
|
||||||
import csv
|
import csv
|
||||||
import codecs
|
import codecs
|
||||||
|
import chardet
|
||||||
from io import StringIO
|
from io import StringIO
|
||||||
|
|
||||||
from django.contrib import messages
|
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.utils.decorators import method_decorator
|
||||||
from django.views import View
|
from django.views import View
|
||||||
from django.views.generic.base import TemplateView
|
from django.views.generic.base import TemplateView
|
||||||
|
from django.db import transaction
|
||||||
from django.views.generic.edit import (
|
from django.views.generic.edit import (
|
||||||
CreateView, UpdateView, FormMixin, FormView
|
CreateView, UpdateView, FormMixin, FormView
|
||||||
)
|
)
|
||||||
|
@ -33,7 +35,7 @@ from common.utils import get_logger, get_object_or_none, is_uuid
|
||||||
from .. import forms
|
from .. import forms
|
||||||
from ..models import User, UserGroup
|
from ..models import User, UserGroup
|
||||||
from ..utils import AdminUserRequiredMixin
|
from ..utils import AdminUserRequiredMixin
|
||||||
from ..signals import on_user_created
|
from ..signals import post_user_create
|
||||||
|
|
||||||
|
|
||||||
__all__ = [
|
__all__ = [
|
||||||
|
@ -212,8 +214,10 @@ class UserBulkImportView(AdminUserRequiredMixin, JSONResponseMixin, FormView):
|
||||||
|
|
||||||
# todo: need be patch, method to long
|
# todo: need be patch, method to long
|
||||||
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(codecs.BOM_UTF8.decode('utf-8'))
|
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)
|
csv_file = StringIO(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]
|
||||||
|
@ -252,15 +256,15 @@ class UserBulkImportView(AdminUserRequiredMixin, JSONResponseMixin, FormView):
|
||||||
else:
|
else:
|
||||||
continue
|
continue
|
||||||
user_dict[k] = v
|
user_dict[k] = v
|
||||||
|
user = get_object_or_none(User, id=id_) if id_ and is_uuid(id_) else None
|
||||||
user = get_object_or_none(User, id=id_) if is_uuid(id_) else None
|
|
||||||
if not user:
|
if not user:
|
||||||
try:
|
try:
|
||||||
|
with transaction.atomic():
|
||||||
groups = user_dict.pop('groups')
|
groups = user_dict.pop('groups')
|
||||||
user = User.objects.create(**user_dict)
|
user = User.objects.create(**user_dict)
|
||||||
user.groups.set(groups)
|
user.groups.set(groups)
|
||||||
created.append(user_dict['username'])
|
created.append(user_dict['username'])
|
||||||
on_user_created.send(self.__class__, user=user)
|
post_user_create.send(self.__class__, user=user)
|
||||||
except Exception as e:
|
except Exception as e:
|
||||||
failed.append('%s: %s' % (user_dict['username'], str(e)))
|
failed.append('%s: %s' % (user_dict['username'], str(e)))
|
||||||
else:
|
else:
|
||||||
|
|
Loading…
Reference in New Issue