diff --git a/application/accounts/templates/accounts/user_permissions_list.html b/application/accounts/templates/accounts/user_permissions_list.html index 5c6fcc7..61077a4 100644 --- a/application/accounts/templates/accounts/user_permissions_list.html +++ b/application/accounts/templates/accounts/user_permissions_list.html @@ -21,7 +21,7 @@
- +
@@ -77,4 +77,119 @@ {% include "authority_modal.html" %} + + + + + + {% endblock %} \ No newline at end of file diff --git a/application/accounts/urls.py b/application/accounts/urls.py index d27c738..2b37d99 100644 --- a/application/accounts/urls.py +++ b/application/accounts/urls.py @@ -2,9 +2,7 @@ from django.urls import path, include from django.contrib.auth import views as auth_views -from application.accounts.views import logout_view, user_permissions_list, get_user_existing_permissions, \ - save_user_permissions, refresh_user_permissions, group_perm_list, get_group_permissions, save_group_permissions, \ - user_homepage_view +from .views import * urlpatterns = [ path('login/', auth_views.LoginView.as_view(template_name='accounts/login.html'), name='user_login'), @@ -18,4 +16,5 @@ urlpatterns = [ path('groups_permissions//', get_group_permissions, name='get_group_permissions'), path('groups_save_permissions//', save_group_permissions, name='save_group_permissions'), path('homepage', user_homepage_view, name='user_homepage'), + path('create_account_profile', create_account_profile, name='create_account_profile'), ] diff --git a/application/accounts/views.py b/application/accounts/views.py index 9518f36..3665a29 100644 --- a/application/accounts/views.py +++ b/application/accounts/views.py @@ -1,6 +1,8 @@ # 标准库导入 import json +from datetime import datetime +from django.db import transaction from django.http import JsonResponse, HttpResponseBadRequest from django.shortcuts import redirect, render, get_object_or_404 from django.utils.decorators import method_decorator @@ -17,9 +19,12 @@ from django.views.decorators.http import require_http_methods from XH_Digital_Management import settings # 本地Django应用导入 from application.accounts.models import AccountProfile +from application.hrm_mgnt.models import EmployeeInformation from common.auth import group_required from common.utils.page_helper import paginate_query_and_assign_numbers +from pypinyin import lazy_pinyin + def format_permissions(permissions): action_prefixes = ['Can add ', 'Can change ', 'Can delete ', 'Can view '] @@ -84,7 +89,7 @@ class CustomLoginView(LoginView): def logout_view(request): logout(request) # Redirect to a success page, such as the home page - return redirect('user_homepage') + return redirect('user_login') @login_required @@ -99,7 +104,7 @@ def user_permissions_list(request): query_set = query_set.filter(employee_information__name__icontains=name) if primary_department: query_set = query_set.filter(employee_information__primary_department=primary_department) - query_set = query_set.filter(user__is_superuser=True) + # query_set = query_set.filter(user__is_superuser=True) items = paginate_query_and_assign_numbers( request=request, @@ -444,3 +449,58 @@ def user_homepage_view(request): 'user': request.user, } return render(request, 'user_homepage.html', context) + + +@login_required +@group_required('系统管理') +def create_account_profile(request): + if request.method == 'POST': + data = json.loads(request.body) + employee_info_ids = data.get('employee_ids') # 获取employee_ids列表 + + # 检查是否提供了必填信息 + if not employee_info_ids: + return JsonResponse({'success': False, 'message': 'Employee Information IDs are required.'}) + + # 在事务中创建AccountProfile + with transaction.atomic(): + created_profiles = [] + for employee_info_id in employee_info_ids: + # 尝试获取 employee_information 实例 + try: + employee_information = EmployeeInformation.objects.get(employee_id=employee_info_id) + except EmployeeInformation.DoesNotExist as e: + return JsonResponse({'success': False, 'message': str(e)}) + + # 检查 employee_information 是否已经有对应的AccountProfile + if AccountProfile.objects.filter(employee_information=employee_information).exists(): + return JsonResponse( + {'success': False, 'message': f'Employee Information ID {employee_info_id} is already bound to an AccountProfile.'}) + + # 将姓名转换为拼音作为用户名 + username_base = ''.join(lazy_pinyin(employee_information.name)) + username = username_base + counter = 1 + while User.objects.filter(username=username).exists(): + username = f"{username_base}{counter}" + counter += 1 + + # 创建默认密码 + date_str = datetime.now().strftime('%Y%m%d') + password = f"{username_base}{date_str}" + + # 创建新的 User 实例 + user = User.objects.create_user( + username=username, + email=employee_information.email, + password=password + ) + + # 创建新的AccountProfile实例 + account_profile = AccountProfile.objects.create( + user=user, + employee_information=employee_information + ) + created_profiles.append(account_profile) + + return JsonResponse({'success': True, 'message': f'Created {len(created_profiles)} AccountProfiles successfully.'}) diff --git a/application/hrm_mgnt/urls.py b/application/hrm_mgnt/urls.py index 12dc009..61122f7 100644 --- a/application/hrm_mgnt/urls.py +++ b/application/hrm_mgnt/urls.py @@ -27,4 +27,6 @@ urlpatterns = [ path('pst_list/add/', pst_list_add, name='pst_list_add'), path('pst_list/modify/', pst_list_modify, name='pst_list_modify'), path('pst_list/delete/', pst_list_delete, name='pst_list_delete'), + + path('emp_list_for_create_account_profile/', emp_list_for_create_account_profile, name='emp_list_for_create_account_profile'), ] diff --git a/application/hrm_mgnt/views.py b/application/hrm_mgnt/views.py index 70deffd..1bd7bab 100644 --- a/application/hrm_mgnt/views.py +++ b/application/hrm_mgnt/views.py @@ -1,4 +1,5 @@ -from django.http import JsonResponse, Http404 +from django.core.paginator import Paginator +from django.http import JsonResponse, Http404 from django.shortcuts import render, get_object_or_404, redirect from django.template.loader import render_to_string from django.urls import reverse @@ -669,3 +670,35 @@ def pst_list_delete(request): Position.objects.filter(position_id=position_id).delete() return JsonResponse({"message": "删除成功"}) return JsonResponse({"message": "无效的请求方法"}, status=405) + + +def emp_list_for_create_account_profile(request): + # 查询还没有创建AccountProfile的员工信息 + query_set = EmployeeInformation.objects.exclude(account_profile__isnull=False).order_by('-employee_id') + + # 获取查询参数 + name = request.GET.get('name', '') + + # 根据提供的参数进行筛选 + if name: + query_set = query_set.filter(name__icontains=name) + + # 对查询结果进行分页 + paginator = Paginator(query_set, 10) # 每页显示10条记录 + page_number = request.GET.get('page') + page_obj = paginator.get_page(page_number) + + # 创建员工信息的列表,包含需要的字段 + employees = list(page_obj.object_list.values( + 'employee_id', 'name', 'email', 'mobile_number', 'primary_department', 'position' + )) + + # 返回JSON响应 + return JsonResponse({ + 'success': True, + 'employees': employees, + 'has_previous': page_obj.has_previous(), + 'has_next': page_obj.has_next(), + 'num_pages': paginator.num_pages, + 'current_page': page_obj.number + }) diff --git a/requirements.txt b/requirements.txt index 3319273..f1a33e2 100644 --- a/requirements.txt +++ b/requirements.txt @@ -6,4 +6,5 @@ asgiref==3.8.1 sqlparse==0.5.0 openpyxl==3.1.3 numpy==1.26.4 -pytz==2024.1 \ No newline at end of file +pytz==2024.1 +pypinyin==0.51.0 \ No newline at end of file