新建account_profile

This commit is contained in:
王思川 2024-06-09 21:23:41 +08:00
parent 57be495664
commit fb9dc0d69a
6 changed files with 218 additions and 8 deletions

View File

@ -21,7 +21,7 @@
</div> </div>
<div class="col-md-4 mt-4 text-end"> <div class="col-md-4 mt-4 text-end">
<button class="btn btn-outline-secondary" data-bs-toggle="modal" data-bs-target="#modifyRecordsModal">修改记录</button> <button class="btn btn-outline-secondary" data-bs-toggle="modal" data-bs-target="#modifyRecordsModal">修改记录</button>
<button class="btn btn-outline-secondary" data-bs-toggle="modal" data-bs-target="#addModifyModal">添加</button> <button class="btn btn-outline-secondary" data-bs-toggle="modal" data-bs-target="#createAccountProfileModal">添加</button>
</div> </div>
</div> </div>
</div> </div>
@ -77,4 +77,119 @@
{% include "authority_modal.html" %} {% include "authority_modal.html" %}
<!-- 模态框 -->
<div class="modal fade" id="createAccountProfileModal" tabindex="-1" aria-labelledby="createAccountProfileLabel" aria-hidden="true">
<div class="modal-dialog modal-lg">
<div class="modal-content">
<div class="modal-header">
<h5 class="modal-title" id="createAccountProfileLabel">创建账户</h5>
<button type="button" class="btn-close" data-bs-dismiss="modal" aria-label="Close"></button>
</div>
<div class="modal-body">
<!-- 员工信息列表 -->
<table class="table">
<thead>
<tr>
<th scope="col"><input type="checkbox" id="selectAll"></th>
<th scope="col">名称</th>
<th scope="col">邮箱</th>
<th scope="col">手机号</th>
<th scope="col">一级部门</th>
<th scope="col">职务</th>
</tr>
</thead>
<tbody id="employeeList">
<!-- 员工信息行将通过服务器端代码动态生成 -->
</tbody>
</table>
</div>
<div class="modal-footer">
<button type="button" class="btn btn-secondary" data-bs-dismiss="modal">关闭</button>
<button type="button" class="btn btn-primary" id="createAccountProfiles">创建账户</button>
</div>
</div>
</div>
</div>
<!-- JavaScript 用于处理批量创建账户 -->
<script>
// 页面加载完成后获取员工信息列表
document.addEventListener('DOMContentLoaded', function() {
fetchEmployeeList();
});
// 获取员工列表的函数
function fetchEmployeeList() {
fetch('{% url 'emp_list_for_create_account_profile' %}', { // 替换为实际的URL路径
headers: {
'X-CSRFToken': '{{ csrf_token }}' // 确保添加CSRF令牌
}
})
.then(response => response.json())
.then(data => {
if(data.success) {
const employeeList = document.getElementById('employeeList');
employeeList.innerHTML = ''; // 清空现有列表
data.employees.forEach(employee => {
employeeList.innerHTML += `
<tr>
<td><input type="checkbox" value="${employee.employee_id}"></td>
<td>${employee.name}</td>
<td>${employee.email}</td>
<td>${employee.mobile_number}</td>
<td>${employee.primary_department}</td>
<td>${employee.position}</td>
</tr>
`;
});
} else {
alert("获取员工列表失败:" + data.message);
}
})
.catch(error => {
console.error('Error:', error);
});
}
// 创建账户的事件处理函数
document.getElementById('createAccountProfiles').addEventListener('click', function() {
const selectedEmployeeIds = [];
document.querySelectorAll('#employeeList input[type="checkbox"]:checked').forEach(checkbox => {
selectedEmployeeIds.push(checkbox.value);
});
fetch('{% url 'create_account_profile' %}', { // 替换为实际的URL路径
method: 'POST',
body: JSON.stringify({ employee_ids: selectedEmployeeIds }),
headers: {
'Content-Type': 'application/json',
'X-CSRFToken': '{{ csrf_token }}' // 确保添加CSRF令牌
},
})
.then(response => response.json())
.then(data => {
if(data.success) {
// 处理成功逻辑
alert(data.message);
$('#createAccountProfileModal').modal('hide');
fetchEmployeeList(); // 刷新员工列表
} else {
// 处理失败逻辑
alert(data.message);
}
})
.catch(error => {
console.error('Error:', error);
});
});
// 全选复选框的事件处理函数
document.getElementById('selectAll').addEventListener('click', function(event) {
const checked = event.target.checked;
document.querySelectorAll('#employeeList input[type="checkbox"]').forEach(checkbox => {
checkbox.checked = checked;
});
});
</script>
{% endblock %} {% endblock %}

View File

@ -2,9 +2,7 @@ from django.urls import path, include
from django.contrib.auth import views as auth_views from django.contrib.auth import views as auth_views
from application.accounts.views import logout_view, user_permissions_list, get_user_existing_permissions, \ from .views import *
save_user_permissions, refresh_user_permissions, group_perm_list, get_group_permissions, save_group_permissions, \
user_homepage_view
urlpatterns = [ urlpatterns = [
path('login/', auth_views.LoginView.as_view(template_name='accounts/login.html'), name='user_login'), path('login/', auth_views.LoginView.as_view(template_name='accounts/login.html'), name='user_login'),
@ -18,4 +16,5 @@ urlpatterns = [
path('groups_permissions/<int:group_id>/', get_group_permissions, name='get_group_permissions'), path('groups_permissions/<int:group_id>/', get_group_permissions, name='get_group_permissions'),
path('groups_save_permissions/<int:group_id>/', save_group_permissions, name='save_group_permissions'), path('groups_save_permissions/<int:group_id>/', save_group_permissions, name='save_group_permissions'),
path('homepage', user_homepage_view, name='user_homepage'), path('homepage', user_homepage_view, name='user_homepage'),
path('create_account_profile', create_account_profile, name='create_account_profile'),
] ]

View File

@ -1,6 +1,8 @@
# 标准库导入 # 标准库导入
import json import json
from datetime import datetime
from django.db import transaction
from django.http import JsonResponse, HttpResponseBadRequest from django.http import JsonResponse, HttpResponseBadRequest
from django.shortcuts import redirect, render, get_object_or_404 from django.shortcuts import redirect, render, get_object_or_404
from django.utils.decorators import method_decorator 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 from XH_Digital_Management import settings
# 本地Django应用导入 # 本地Django应用导入
from application.accounts.models import AccountProfile from application.accounts.models import AccountProfile
from application.hrm_mgnt.models import EmployeeInformation
from common.auth import group_required from common.auth import group_required
from common.utils.page_helper import paginate_query_and_assign_numbers from common.utils.page_helper import paginate_query_and_assign_numbers
from pypinyin import lazy_pinyin
def format_permissions(permissions): def format_permissions(permissions):
action_prefixes = ['Can add ', 'Can change ', 'Can delete ', 'Can view '] action_prefixes = ['Can add ', 'Can change ', 'Can delete ', 'Can view ']
@ -84,7 +89,7 @@ class CustomLoginView(LoginView):
def logout_view(request): def logout_view(request):
logout(request) logout(request)
# Redirect to a success page, such as the home page # Redirect to a success page, such as the home page
return redirect('user_homepage') return redirect('user_login')
@login_required @login_required
@ -99,7 +104,7 @@ def user_permissions_list(request):
query_set = query_set.filter(employee_information__name__icontains=name) query_set = query_set.filter(employee_information__name__icontains=name)
if primary_department: if primary_department:
query_set = query_set.filter(employee_information__primary_department=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( items = paginate_query_and_assign_numbers(
request=request, request=request,
@ -444,3 +449,58 @@ def user_homepage_view(request):
'user': request.user, 'user': request.user,
} }
return render(request, 'user_homepage.html', context) 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.'})

View File

@ -27,4 +27,6 @@ urlpatterns = [
path('pst_list/add/', pst_list_add, name='pst_list_add'), 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/modify/', pst_list_modify, name='pst_list_modify'),
path('pst_list/delete/', pst_list_delete, name='pst_list_delete'), 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'),
] ]

View File

@ -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.shortcuts import render, get_object_or_404, redirect
from django.template.loader import render_to_string from django.template.loader import render_to_string
from django.urls import reverse from django.urls import reverse
@ -669,3 +670,35 @@ def pst_list_delete(request):
Position.objects.filter(position_id=position_id).delete() Position.objects.filter(position_id=position_id).delete()
return JsonResponse({"message": "删除成功"}) return JsonResponse({"message": "删除成功"})
return JsonResponse({"message": "无效的请求方法"}, status=405) 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
})

View File

@ -6,4 +6,5 @@ asgiref==3.8.1
sqlparse==0.5.0 sqlparse==0.5.0
openpyxl==3.1.3 openpyxl==3.1.3
numpy==1.26.4 numpy==1.26.4
pytz==2024.1 pytz==2024.1
pypinyin==0.51.0