Files
ihrm/base/views.py
2023-05-10 15:06:57 +05:30

1850 lines
69 KiB
Python

from django.shortcuts import render, redirect
from django.contrib import messages
from django.contrib.auth import authenticate, login, logout
from horilla.decorators import permission_required, login_required, manager_can_enter
from django.contrib.auth.models import Group, User, Permission
from base.forms import CompanyForm, DepartmentForm, JobPositionForm, JobRoleForm, EmployeeShiftForm, EmployeeShiftScheduleForm, EmployeeTypeForm, WorkTypeForm, UserGroupForm, RotatingShiftForm, RotatingShiftAssign, RotatingWorkTypeForm, RotatingWorkTypeAssignForm, RotatingShiftAssignForm, ShiftRequestForm, WorkTypeRequestForm, RotatingShiftAssignUpdateForm, RotatingWorkTypeAssignUpdateForm, EmployeeShiftScheduleUpdateForm, AssignUserGroup, AssignPermission, ResetPasswordForm
from base.models import Company, JobPosition, JobRole, Department, WorkType, EmployeeShift, EmployeeShiftDay, EmployeeShiftSchedule, EmployeeType, RotatingWorkType, RotatingWorkTypeAssign, RotatingShiftAssign, RotatingShift, ShiftRequest, WorkTypeRequest
from employee.models import Employee
from django.http import HttpResponse, HttpResponseRedirect, JsonResponse
from datetime import datetime
from django.views.decorators.http import require_http_methods
from base.filters import ShiftRequestFilter, WorkTypeRequestFilter, RotatingShiftAssignFilters, RotatingWorkTypeAssignFilter
from django.core.paginator import Paginator
from django.core.mail import send_mail
import uuid
from horilla.settings import EMAIL_HOST_USER
import json
from base.methods import choosesubordinates, filtersubordinates, sortby
from notifications.signals import notify
from django.utils.translation import gettext as _
# Create your views here.
def is_reportingmanger(request, instance):
"""
If the instance have employee id field then you can use this method to know the request user employee is the reporting manager of the instance
"""
manager = request.user.employee_get
try:
employee_workinfo_manager = instance.employee_id.employee_work_info.reporting_manager_id
except Exception:
return HttpResponse('This Employee Dont Have any work information')
return manager == employee_workinfo_manager
def paginator_qry(qryset, page_number):
paginator = Paginator(qryset, 50)
qryset = paginator.get_page(page_number)
return qryset
def login_user(request):
"""
This method is used render login template and authenticate user
"""
if request.method == 'POST':
username = request.POST['username']
password = request.POST['password']
user = authenticate(request, username=username, password=password)
if user is None:
messages.error(request, _('Invalid username or password.'))
return redirect('/login')
login(request, user)
messages.success(request, _('Login Success'))
return redirect('/')
return render(request, 'login.html')
def include_employee_instance(request, form):
"""
This method is used to include the employee instance to the form
Args:
form: django forms instance
"""
queryset = form.fields['employee_id'].queryset
employee = Employee.objects.filter(employee_user_id=request.user)
if employee.first() is not None:
if queryset.filter(id=employee.first().id).first() is None:
queryset = queryset | employee
form.fields['employee_id'].queryset = queryset
return (form)
reset_ids = []
def forgot_password(request):
"""
This method is used to send the reset password link to the employee email
"""
if request.method == 'POST':
id = str(uuid.uuid4())
username = request.POST['email']
user = User.objects.filter(username=username).first()
if user is not None:
employee = Employee.objects.filter(employee_user_id=user).first()
if employee is not None:
if employee.email is not None:
send_link(employee, request, id, user)
else:
messages.error(request, _('No email found.'))
else:
messages.error(request, 'User not found')
return render(request, 'forgot_password.html')
def send_link(employee, request, id, user):
"""
Here actually the link will send to the employee email
"""
recipient = [employee.email,]
subject = 'Link To Rest Your Password!'
url = request.build_absolute_uri('/') + 'reset-password/' + id
message = f'Reset Your Password {url}.'
reset_ids.append({'uuid': id, 'user': user})
try:
send_mail(subject=subject, message=message,
from_email=EMAIL_HOST_USER, recipient_list=recipient)
response_success = _('Link sended to {recipient}').format(recipient=recipient)
messages.success(request, response_success)
except Exception as e:
messages.error(request, e)
def reset_password(request, uuid):
"""
This method is used to reset the current password for the employee
"""
user = next((item['user']
for item in reset_ids if item['uuid'] == uuid), None)
form = ResetPasswordForm()
if request.method == 'POST':
form = ResetPasswordForm(request.POST)
if form.is_valid():
form.save(user=user)
messages.success(request, _('Password reset success'))
reset_ids.remove({'uuid': uuid, 'user': user})
return redirect('/login')
if user is None:
return HttpResponse('Link Expired...')
return render(request, 'reset_password.html', {'form': form})
def logout_user(request):
"""
This method used to logout the user
"""
if request.user:
logout(request)
return redirect('/login')
@login_required
def home(request):
if len(EmployeeShiftDay.objects.all()) == 0:
days = (
('monday', 'Monday'),
('tuesday', 'Tuesday'),
('wednesday', 'Wednesday'),
('thursday', 'Thursday'),
('friday', 'Friday'),
('saturday', 'Saturday'),
('sunday', 'Sunday'),
)
for day in days:
shift_day = EmployeeShiftDay()
shift_day.day = day[0]
shift_day.save()
return render(request, 'index.html')
@login_required
def common_settings(request):
"""
This method is used to render setting page template
"""
return render(request, 'settings.html')
@login_required
@permission_required('add_group')
def user_group_create(request):
"""
This method is used to create user permission group
"""
form = UserGroupForm()
groups = Group.objects.all()
if request.method == 'POST':
form = UserGroupForm(request.POST)
if form.is_valid():
form.save()
form = UserGroupForm()
messages.success(request, _('User group created.'))
return redirect(user_group_create)
return render(request, 'base/auth/group.html', {'form': form, 'groups': groups})
@login_required
@permission_required('add_group')
def group_assign(request):
"""
This method is used to assign user group to the users.
"""
form = AssignUserGroup()
groups = Group.objects.all()
if request.POST:
form = AssignUserGroup(request.POST)
if form.is_valid():
form.save()
messages.success(request, _('User group assigned.'))
return redirect(group_assign)
return render(request, 'base/auth/group_assign.html', {'form': form, 'groups': paginator_qry(groups, request.GET.get('page'))})
@login_required
@permission_required('view_group')
def group_assign_view(request):
"""
This method is used to search the user groups
"""
search = ''
if request.GET.get('search') is not None:
search = request.GET.get('search')
groups = Group.objects.filter(name__icontains=search)
previous_data = request.environ['QUERY_STRING']
return render(request, 'base/auth/group_assign_view.html', {'groups': paginator_qry(groups, request.GET.get('page')), 'pd': previous_data})
@login_required
@permission_required('base.view_group')
def user_group_view(request):
"""
This method is used to render template for view all groups
"""
search = ''
if request.GET.get('search') is not None:
search = request.GET['search']
user_group = Group.objects.filter()
return render(request, 'base/auth/group_assign.html', {'data': user_group})
@login_required
@permission_required('change_group')
@require_http_methods(['POST'])
def user_group_permission_remove(request, pid, gid):
"""
This method is used to remove permission from group.
args:
pid: permission id
gid: group id
"""
group = Group.objects.get(id=1)
permission = Permission.objects.get(id=2)
group.permissions.remove(permission)
return HttpResponseRedirect(request. META. get('HTTP_REFERER', '/'))
@login_required
@permission_required('change_group')
@require_http_methods(['POST'])
def group_remove_user(request, uid, gid):
"""
This method is used to remove an user from group permission.
args:
uid: user instance id
gid: group instance id
"""
group = Group.objects.get(id=gid)
user = User.objects.get(id=uid)
group.user_set.remove(user)
return HttpResponseRedirect(request. META. get('HTTP_REFERER', '/'))
@login_required
@permission_required('change_group')
def user_group_update(request, id):
"""
This method is used to render updating form template for user permission group
args:
id : group instance id
"""
group = Group.objects.get(id=id)
form = UserGroupForm(instance=group)
if request.method == 'POST':
form = UserGroupForm(request.POST, instance=group)
if form.is_valid():
form.save()
messages.success(request, _('User group updated.'))
return redirect(user_group_create)
groups = Group.objects.all()
return render(request, 'base/auth/group.html', {'form': form, 'groups': groups})
@login_required
@permission_required('base.delete_group')
@require_http_methods(['POST'])
def user_group_delete(request, id):
"""
This method is used to delete user group
args:
id : group instance id
"""
try:
user_group = Group.objects.get(id=id).delete()
messages.success(request, _('User group deleted.'))
except Exception as e:
messages.error(request, e)
messages.error(request, _('You cannot delete this user group.'))
return redirect('/settings/user-group-create')
@login_required
@permission_required('base.add_company')
def company_create(request):
"""
This method render template and form to create company and save if the form is valid
"""
form = CompanyForm()
companies = Company.objects.all()
if request.method == 'POST':
form = CompanyForm(request.POST, request.FILES)
if form.is_valid():
form.save()
form = CompanyForm()
messages.success(request, _('Company has been created successfully!'))
return redirect(company_create)
return render(request, 'base/company/company.html', {'form': form, 'companies': companies})
@login_required
@permission_required('base.change_company')
def company_update(request, id):
"""
This method is used to update company
args:
id : company instance id
"""
companies = Company.objects.all()
company = Company.objects.get(id=id)
form = CompanyForm(instance=company)
if request.method == 'POST':
form = CompanyForm(request.POST, request.FILES, instance=company)
if form.is_valid():
form.save()
messages.success(request, _('Company updated'))
return redirect(company_create)
return render(request, 'base/company/company.html', {'form': form, 'companies': companies})
@login_required
@permission_required('base.base.delete_company')
@require_http_methods(['POST'])
def company_delete(request, id):
"""
This method is used to delete company
args:
id : company instance id
"""
try:
company = Company.objects.get(id=id).delete()
messages.success(request, _('Company deleted.'))
except Exception as e:
messages.error(request, e)
messages.error(request, _('This company already in use'))
return redirect(company_create)
@login_required
@permission_required('base.add_department')
def department(request):
"""
This method render renders form and template to create department
"""
form = DepartmentForm()
departments = Department.objects.all()
if request.method == 'POST':
form = DepartmentForm(request.POST)
if form.is_valid():
form.save()
form = DepartmentForm()
messages.success(
request, _('Department has been created successfully!'))
return render(request, 'base/department/department.html', {'form': form, 'departments': departments})
@login_required
@permission_required('base.change_department')
def department_update(request, id):
"""
This method is used to update department
args:
id : department instance id
"""
department = Department.objects.get(id=id)
departments = Department.objects.all()
form = DepartmentForm(instance=department)
if request.method == 'POST':
form = DepartmentForm(
request.POST, instance=department)
if form.is_valid():
form.save()
messages.success(request, _('Department updated.'))
return redirect('/settings/department-creation')
return render(request, 'base/department/department.html', {'form': form, 'departments': departments})
@login_required
@permission_required('base.delete_department')
@require_http_methods(['POST', 'DELETE'])
def department_delete(request, id):
"""
This method is used to delete department instance
args:
id : department instance id
"""
try:
departments = Department.objects.get(id=id).delete()
messages.success(request, _('Department deleted.'))
except Exception as e:
messages.error(request, e)
messages.error(request, _('Department already in use.'))
return redirect('/settings/department-creation')
@login_required
@permission_required('base.add_jobposition')
def job_position(request):
"""
This method is used to create job position
"""
departments = Department.objects.all()
form = JobPositionForm()
if request.method == 'POST':
form = JobPositionForm(request.POST)
if form.is_valid():
form.save()
messages.success(
request, _('Job Position has been created successfully!'))
return render(request, 'base/job_position/job_position.html', {'form': form, 'departments': departments})
@login_required
@permission_required('base.change_jobposition')
def job_position_update(request, id):
"""
This method is used to update job position
args:
id : job position instance id
"""
job_position = JobPosition.objects.get(id=id)
departments = Department.objects.all()
form = JobPositionForm(instance=job_position)
if request.method == 'POST':
form = JobPositionForm(
request.POST, instance=job_position)
if form.is_valid():
form.save()
messages.success(request, _('Job position updated.'))
return redirect("/settings/job-position-creation")
return render(request, 'base/job_position/job_position.html', {'form': form, 'departments': departments})
@login_required
@permission_required('base.delete_jobposition')
@require_http_methods(['POST'])
def job_position_delete(request, id):
"""
This method is used to delete job position
args:
id : job position id
"""
try:
job_position = JobPosition.objects.get(id=id).delete()
messages.success(request, _('Job Position Deleted.'))
except Exception as e:
messages.error(request, e)
messages.error(request, _('This job position already in use.'))
return redirect('/settings/job-position-creation')
@login_required
@permission_required('base.add_jobrole')
def job_role_create(request):
"""
This method is used to create job role.
"""
form = JobRoleForm()
jobs = JobPosition.objects.all()
if request.method == 'POST':
form = JobRoleForm(request.POST)
if form.is_valid():
form.save()
form = JobRoleForm()
messages.success(
request, _('Job role has been created successfully!'))
return render(request, 'base/job_role/job_role.html', {'form': form, 'job_positions': jobs})
@login_required
@permission_required('base.change_jobrole')
def job_role_update(request, id):
"""
This method is used to update job role instance
args:
id : job role instance id
"""
job_role = JobRole.objects.get(id=id)
jobs = JobPosition.objects.all()
form = JobRoleForm(instance=job_role)
if request.method == 'POST':
form = JobRoleForm(request.POST, instance=job_role)
if form.is_valid():
form.save()
messages.success(request, _('Job role updated.'))
return render(request, 'base/job_role/job_role.html', {'form': form, 'job_positions': jobs})
@login_required
@permission_required('base.delete_jobrole')
@require_http_methods(['POST'])
def job_role_delete(request, id):
"""
This method is used to delete job role
args:
id : job role instance id
"""
try:
job_role = JobRole.objects.get(id=id).delete()
messages.success(request, _('Job Role Deleted.'))
except Exception as e:
messages.error(request, e)
messages.error(request, _('This job role already in use.'))
return redirect('/settings/job-role-create')
@login_required
@permission_required('base.add_worktype')
def work_type_create(request):
"""
This method is used to create work type
"""
form = WorkTypeForm()
work_types = WorkType.objects.all()
if request.method == 'POST':
form = WorkTypeForm(request.POST)
if form.is_valid():
form.save()
form = WorkTypeForm()
messages.success(
request, _('Work Type has been created successfully!'))
return render(request, 'base/work_type/work_type.html', {'form': form, 'work_types': work_types})
@login_required
@permission_required('base.change_worktype')
def work_type_update(request, id):
"""
This method is used to update work type instance
args:
id : work type instance id
"""
work_type = WorkType.objects.get(id=id)
work_types = WorkType.objects.all()
form = WorkTypeForm(instance=work_type)
if request.method == 'POST':
form = WorkTypeForm(request.POST, instance=work_type)
if form.is_valid():
form.save()
messages.success(request, _('Work type updated.'))
return redirect(work_type_create)
return render(request, 'base/work_type/work_type.html', {'form': form, 'work_types': work_types})
@login_required
@permission_required('base.delete_worktype')
@require_http_methods(['POST', 'DELETE'])
def work_type_delete(request, id):
"""
This method is used to delete work type instance
args:
id : work type instance id
"""
try:
work_type = WorkType.objects.get(id=id).delete()
messages.success(request, _('Work type deleted.'))
except Exception as e:
messages.error(request, e)
messages.error(request, _('This work type already in use.'))
return redirect('/settings/work-type-create')
@login_required
@permission_required('base.add_rotatingworktype')
def rotating_work_type_create(request):
"""
This method is used to create rotating work type .
"""
form = RotatingWorkTypeForm()
if request.method == 'POST':
form = RotatingWorkTypeForm(request.POST)
if form.is_valid():
form.save()
form = RotatingWorkTypeForm()
messages.success(request, _('Rotating work type created.'))
return redirect(rotating_work_type_create)
return render(request, 'base/rotating_work_type/rotating_work_type.html', {'form': form, 'rwork_type': RotatingWorkType.objects.all()})
@login_required
@permission_required('base.change_rotatingworktype')
def rotating_work_type_update(request, id):
"""
This method is used to update rotating work type instance.
args:
id : rotating work type instance id
"""
rotating_work_type = RotatingWorkType.objects.get(id=id)
form = RotatingWorkTypeForm(instance=rotating_work_type)
if request.method == 'POST':
form = RotatingWorkTypeForm(request.POST, instance=rotating_work_type)
if form.is_valid():
form.save()
messages.success(request, _('Rotating work type updated.'))
return redirect(rotating_work_type_create)
return render(request, 'base/rotating_work_type/rotating_work_type.html', {'form': form, 'rwork_type': RotatingWorkType.objects.all()})
@login_required
@permission_required('base.delete_rotatingworktype')
@require_http_methods(['POST', 'DELETE'])
def rotating_work_type_delete(request, id):
"""
This method is used to delete rotating work type
args:
id : rotating work type id
"""
try:
rotating_work_type = RotatingWorkType.objects.get(id=id).delete()
messages.success(request, _('Rotating work type deleted.'))
except Exception as e:
messages.error(request, e)
messages.error(request, _('This rotating work type already in use.'))
return redirect('/settings/rotating-work-type-create')
@login_required
@manager_can_enter('base.view_rotatingworktypeassign')
def rotating_work_type_assign(request):
"""
This method is used to assign rotating work type to employee users
"""
filter = RotatingWorkTypeAssignFilter(
queryset=RotatingWorkTypeAssign.objects.filter(is_active=True))
rwork_type_assign = filter.qs
rwork_type_assign = filtersubordinates(
request, rwork_type_assign, 'base.view_rotatingworktypeassign')
return render(request, 'base/rotating_work_type/rotating_work_type_assign.html', {
'f': filter,
'rwork_type_assign': paginator_qry(rwork_type_assign, request.GET.get('page')), })
@login_required
@manager_can_enter('base.add_rotatingworktypeassign')
def rotating_work_type_assign_add(request):
form = RotatingWorkTypeAssignForm()
form = choosesubordinates(request, form, 'base.add_rotatingworktypeassign')
if request.method == 'POST':
form = RotatingWorkTypeAssignForm(request.POST)
form = choosesubordinates(
request, form, 'base.add_rotatingworktypeassign')
if form.is_valid():
form.save()
employee_ids = request.POST.getlist('employee_id')
employees = Employee.objects.filter(
id__in=employee_ids).select_related('employee_user_id')
users = [employee.employee_user_id for employee in employees]
notify.send(request.user.employee_get, recipient=users, verb="You are added to rotating work type",
icon="infinite", redirect="/employee/rotating-work-type-assign")
messages.success(request, _('Rotating work type assigned.'))
response = render(
request, 'base/rotating_work_type/htmx/rotating_work_type_assign_form.html', {'form': form})
return HttpResponse(response.content.decode('utf-8') + '<script>location.reload();</script>')
return render(request, 'base/rotating_work_type/htmx/rotating_work_type_assign_form.html', {'form': form})
@login_required
@manager_can_enter('base.view_rotatingworktypeassign')
def rotating_work_type_assign_view(request):
"""
This method renders template to view rotating work type objects
"""
previous_data = request.environ['QUERY_STRING']
rwork_type_assign = RotatingWorkTypeAssignFilter(
request.GET).qs
if request.GET.get('is_active') is None:
rwork_type_assign = rwork_type_assign.filter(is_active=True)
rwork_type_assign = filtersubordinates(
request, rwork_type_assign, 'base.view_rotatingworktypeassign')
rwork_type_assign = sortby(request, rwork_type_assign, 'orderby')
return render(request, 'base/rotating_work_type/rotating_work_type_assign_view.html', {
'rwork_type_assign': paginator_qry(rwork_type_assign, request.GET.get('page')),
'pd': previous_data,
})
@login_required
@manager_can_enter('base.change_rotatingworktypeassign')
def rotating_work_type_assign_update(request, id):
"""
This method is used to update rotating work type instance
"""
rotating_work_type_assign_obj = RotatingWorkTypeAssign.objects.get(id=id)
form = RotatingWorkTypeAssignUpdateForm(
instance=rotating_work_type_assign_obj)
form = choosesubordinates(
request, form, 'base.change_rotatingworktypeassign')
if request.method == 'POST':
form = RotatingWorkTypeAssignUpdateForm(
request.POST, instance=rotating_work_type_assign_obj)
form = choosesubordinates(
request, form, 'base.change_rotatingworktypeassign')
if form.is_valid():
form.save()
messages.success(request, _('Rotating work type assign updated.'))
response = render(
request, 'base/rotating_work_type/htmx/rotating_work_type_assign_update_form.html', {'update_form': form})
return HttpResponse(response.content.decode('utf-8') + '<script>location.reload();</script>')
return render(request, 'base/rotating_work_type/htmx/rotating_work_type_assign_update_form.html', {'update_form': form})
@login_required
@manager_can_enter('base.change_rotatingworktypeassign')
def rotating_work_type_assign_archive(request, id):
"""
This method is used to archive or un-archive rotating work type assigns
"""
rwork_type = RotatingWorkTypeAssign.objects.get(id=id)
employees_rwork_types = RotatingWorkTypeAssign.objects.filter(is_active=True,employee_id=rwork_type.employee_id)
flag = False
if len(employees_rwork_types) < 1 :
rwork_type.is_active = True
flag = True
message = _('un-archived')
if request.GET.get('is_active') == 'False':
rwork_type.is_active = False
message = _('archived')
flag = True
rwork_type.save()
if flag:
messages.success(request, _('Rotating shift assign is {message}').format(message=message))
else:
messages.error(request,'Already on record is active')
return HttpResponseRedirect(request. META. get('HTTP_REFERER', '/'))
@login_required
@manager_can_enter('base.change_rotatingworktypeassign')
def rotating_work_type_assign_bulk_archive(request):
"""
This method is used to archive/un-archive bulk rotating work type assigns
"""
ids = request.POST['ids']
ids = json.loads(ids)
is_active = True
message = _('un-archived')
if request.GET.get('is_active') == 'False':
is_active = False
message = _('archived')
for id in ids:
# check permission right here...
rwork_type_assign = RotatingWorkTypeAssign.objects.get(id=id)
employees_rwork_type_assign = RotatingWorkTypeAssign.objects.filter(is_active=True,employee_id=rwork_type_assign.employee_id)
flag = True
if len(employees_rwork_type_assign)<1:
flag=False
rwork_type_assign.is_active = is_active
rwork_type_assign.save()
if not flag:
messages.success(
request, _('Rotating shift for {employee_id} is {message}').format(employee_id=rwork_type_assign.employee_id, message=message))
else:
messages.error(
request, _('Rotating shift for {employee_id} is already exists').format(employee_id=rwork_type_assign.employee_id,)
)
return JsonResponse({'message': 'Success'})
@login_required
@permission_required('base.delete_rotatingworktypeassign')
def rotating_work_type_assign_bulk_delete(request):
"""
This method is used to archive/un-archive bulk rotating work type assigns
"""
ids = request.POST['ids']
ids = json.loads(ids)
for id in ids:
rwork_type_assign = RotatingWorkTypeAssign.objects.get(id=id)
try:
rwork_type_assign.delete()
messages.success(request, _('{employee} deleted.').format(employee=rwork_type_assign.employee_id))
except Exception as e:
messages.error(request, _('You cannot delete {rwork_type_assign}').format(rwork_type_assign=rwork_type_assign))
messages.error(request, e)
return JsonResponse({'message': 'Success'})
@login_required
@permission_required('base.delete_rotatingworktypeassign')
@require_http_methods(['POST'])
def rotating_work_type_assign_delete(request, id):
"""
This method is used to delete rotating work type
"""
try:
rotating_work_type_assign_obj = RotatingWorkTypeAssign.objects.get(
id=id).delete()
messages.success(request, _('Rotating work type assign deleted.'))
except Exception as e:
messages.error(request, e)
messages.error(request, _('You cannot delete this rotating work type.'))
return redirect('/employee/rotating-work-type-assign')
@login_required
@permission_required('base.add_employeetype')
def employee_type_create(request):
"""
This method is used to create employee type
"""
form = EmployeeTypeForm()
types = EmployeeType.objects.all()
if request.method == 'POST':
form = EmployeeTypeForm(request.POST)
if form.is_valid():
form.save()
form = EmployeeTypeForm()
messages.success(request, _('Employee type created.'))
return render(request, 'base/employee_type/employee_type.html', {'form': form, 'employee_types': types})
@login_required
@permission_required('base.change_employeetype')
def employee_type_update(request, id):
"""
This method is used to update employee type instance
args:
id : employee type instance id
"""
employee_type = EmployeeType.objects.get(id=id)
employee_types = EmployeeType.objects.all()
form = EmployeeTypeForm(instance=employee_type)
if request.method == 'POST':
form = EmployeeTypeForm(request.POST, instance=employee_type)
if form.is_valid():
form.save()
messages.success(request, _('Employee type updated.'))
return redirect(employee_type_create)
return render(request, 'base/employee_type/employee_type.html', {'form': form, 'employee_types': employee_types})
@login_required
@permission_required('base.delete_employeetype')
@require_http_methods(['POST'])
def employee_type_delete(request, id):
"""
This method is used to delete employee type
args:
id : employee type id
"""
try:
employee_type = EmployeeType.objects.get(id=id).delete()
messages.success(request, _('Employee type deleted.'))
except Exception as e:
messages.error(request, e)
messages.error(request, _('This Employee type already in use.'))
return redirect('/settings/employee-type-create')
@login_required
@permission_required('base.add_employeeshift')
def employee_shift_create(request):
"""
This method is used to create employee shift
"""
form = EmployeeShiftForm()
shifts = EmployeeShift.objects.all()
if request.method == 'POST':
form = EmployeeShiftForm(request.POST)
if form.is_valid():
form.save()
form = EmployeeShiftForm()
messages.success(
request, _('Employee Shift has been created successfully!'))
return render(request, 'base/shift/shift.html', {'form': form, 'shifts': shifts})
@login_required
@permission_required('base.change_employeeshiftupdate')
def employee_shift_update(request, id):
"""
This method is used to update employee shift instance
args:
id : employee shift id
"""
employee_shift = EmployeeShift.objects.get(id=id)
employee_shifts = EmployeeShift.objects.all()
form = EmployeeShiftForm(instance=employee_shift)
if request.method == 'POST':
form = EmployeeShiftForm(
request.POST, instance=employee_shift)
if form.is_valid:
form.save()
messages.success(request, _('Shift updated'))
return redirect(employee_shift_create)
return render(request, 'base/shift/shift.html', {'form': form, 'shifts': employee_shifts})
@login_required
@permission_required('base.delete_employeeshift')
@require_http_methods(['POST'])
def employee_shift_delete(request, id):
"""
This method is used to delete shift
args:
id : employee shift instance id
"""
try:
employee_shift = EmployeeShift.objects.get(id=id).delete()
messages.success(request, _('Employee shift deleted.'))
except Exception as e:
messages.error(request, e)
messages.error(request, _('This shift already in use.'))
return redirect('/settings/employee-shift-create')
@login_required
@permission_required('base.add_employeeshiftschedule')
def employee_shift_schedule_create(request):
"""
This method is used to create schedule for shift
"""
form = EmployeeShiftScheduleForm()
shifts = EmployeeShift.objects.all()
if request.method == 'POST':
form = EmployeeShiftScheduleForm(request.POST)
if form.is_valid():
form.save()
form = EmployeeShiftScheduleForm()
messages.success(
request, _('Employee Shift Schedule has been created successfully!'))
return render(request, 'base/shift/schedule.html', {'form': form, 'shifts': shifts})
@login_required
@permission_required('base.change_employeeshiftschedule')
def employee_shift_schedule_update(request, id):
"""
This method is used to update employee shift instance
args:
id : employee shift instance id
"""
employee_shift_schedule = EmployeeShiftSchedule.objects.get(id=id)
form = EmployeeShiftScheduleUpdateForm(instance=employee_shift_schedule)
shifts = EmployeeShift.objects.all()
if request.method == 'POST':
form = EmployeeShiftScheduleUpdateForm(
request.POST, instance=employee_shift_schedule)
if form.is_valid():
form.save()
messages.success(request, _('Shift schedule created.'))
return redirect(employee_shift_schedule_create)
return render(request, 'base/shift/schedule.html', {'form': form, 'shifts': shifts})
@login_required
@permission_required('base.delete_employeeshiftschedule')
@require_http_methods(['POST'])
def employee_shift_schedule_delete(request, id):
"""
This method is used to delete employee shift instance
args:
id : employee shift instance id
"""
try:
employee_shift_schedule = EmployeeShiftSchedule.objects.get(
id=id).delete()
messages.success(request, _('Shift schedule deleted.'))
except Exception as e:
messages.error(request, e)
messages.error(request, _('You cannot delete this schedule'))
return redirect('/settings/employee-shift-schedule-create')
@login_required
@permission_required('base.add_rotatingshift')
def rotating_shift_create(request):
"""
This method is used to create rotating shift
"""
form = RotatingShiftForm()
if request.method == 'POST':
form = RotatingShiftForm(request.POST)
if form.is_valid():
form.save()
form = RotatingShiftForm()
messages.success(request, _('Rotating shift created.'))
return render(request, 'base/rotating_shift/rotating_shift.html', {'form': form, 'rshifts': RotatingShift.objects.all()})
@login_required
@permission_required('base.change_rotatingshift')
def rotating_shift_update(request, id):
"""
This method is used to update rotating shift instance
args:
id : rotating shift instance id
"""
rotating_shift = RotatingShift.objects.get(id=id)
form = RotatingShiftForm(instance=rotating_shift)
if request.method == 'POST':
form = RotatingShiftForm(request.POST, instance=rotating_shift)
if form.is_valid():
form.save()
form = RotatingShiftForm()
messages.success(request, _('Rotating shift updated.'))
return redirect(rotating_shift_create)
return render(request, 'base/rotating_shift/rotating_shift.html', {'form': form, 'rshifts': paginator_qry(RotatingShift.objects.all(), request.GET.get('page'))})
@login_required
@permission_required('base.delete_rotatingshift')
@require_http_methods(['POST'])
def rotating_shift_delete(request, id):
"""
This method is used to delete rotating shift
args:
id : rotating shift instance id
"""
try:
rotating_shift = RotatingShift.objects.get(id=id).delete()
messages.success(request, _('Rotating shift deleted.'))
except Exception as e:
messages.error(request, e)
messages.error(request, _('You cannot delete this rotating shift'))
return redirect(rotating_shift_create)
@login_required
@manager_can_enter('base.view_rotatingshiftassign')
def rotating_shift_assign(request):
"""
This method is used to assign rotating shift
"""
form = RotatingShiftAssignForm()
form = choosesubordinates(request, form, 'base.add_rotatingshiftassign')
filter = RotatingShiftAssignFilters(
queryset=RotatingShiftAssign.objects.filter(is_active=True))
rshift_assign = filter.qs
rshift_assign = filtersubordinates(
request, rshift_assign, 'base.view_rotatingshiftassign')
return render(request, 'base/rotating_shift/rotating_shift_assign.html', {
'form': form,
'f': filter,
'rshift_assign': paginator_qry(rshift_assign, request.GET.get('page')),
})
@login_required
@manager_can_enter('base.add_rotatingshiftassign')
def rotating_shift_assign_add(request):
form = RotatingShiftAssignForm()
form = choosesubordinates(request, form, 'base.add_rotatingshiftassign')
if request.method == 'POST':
form = RotatingShiftAssignForm(request.POST)
form = choosesubordinates(
request, form, 'base.add_rotatingshiftassign')
if form.is_valid():
form.save()
employee_ids = request.POST.getlist('employee_id')
employees = Employee.objects.filter(
id__in=employee_ids).select_related('employee_user_id')
users = [employee.employee_user_id for employee in employees]
notify.send(request.user.employee_get, recipient=users, verb="You are added to rotating shift",
icon="infinite", redirect="/employee/rotating-shift-assign")
messages.success(request, _('Rotating shift assigned.'))
response = render(
request, 'base/rotating_shift/htmx/rotating_shift_assign_form.html', {'form': form})
return HttpResponse(response.content.decode('utf-8') + '<script>location.reload();</script>')
return render(request, 'base/rotating_shift/htmx/rotating_shift_assign_form.html', {'form': form})
@login_required
@manager_can_enter('base.view_rotatingshiftassign')
def rotating_shift_assign_view(request):
"""
This method renders all instance of rotating shift assign to a template
"""
previous_data = request.environ['QUERY_STRING']
rshift_assign = RotatingShiftAssignFilters(request.GET).qs
if request.GET.get('is_active') is None:
rshift_assign = rshift_assign.filter(is_active=True)
rshift_assign = filtersubordinates(
request, rshift_assign, 'base.view_rotatingshiftassign')
rshift_assign = sortby(request, rshift_assign, 'orderby')
return render(request, 'base/rotating_shift/rotating_shift_assign_view.html', {
'rshift_assign': paginator_qry(rshift_assign, request.GET.get('page')),
'pd': previous_data
})
@login_required
@manager_can_enter('base.change_rotatingshiftassign')
def rotating_shift_assign_update(request, id):
"""
This method is used to update rotating shift assign instance
args:
id : rotating shift assign instance id
"""
rotating_shift_assign_obj = RotatingShiftAssign.objects.get(id=id)
form = RotatingShiftAssignUpdateForm(instance=rotating_shift_assign_obj)
form = choosesubordinates(request, form, 'base.change_rotatingshiftassign')
if request.method == 'POST':
form = RotatingShiftAssignUpdateForm(
request.POST, instance=rotating_shift_assign_obj)
form = choosesubordinates(
request, form, 'base.change_rotatingshiftassign')
if form.is_valid():
form.save()
messages.success(request, _('Rotating shift assign updated.'))
response = render(
request, 'base/rotating_shift/htmx/rotating_shift_assign_update_form.html', {'update_form': form, })
return HttpResponse(response.content.decode('utf-8') + '<script>location.reload();</script>')
return render(request, 'base/rotating_shift/htmx/rotating_shift_assign_update_form.html', {'update_form': form, })
@login_required
@manager_can_enter('base.change_rotatingshiftassign')
def rotating_shift_assign_archive(request, id):
"""
This method is used to archive and unarchive rotating shift assign records
"""
rshift = RotatingShiftAssign.objects.get(id=id)
employees_rshift_assign = RotatingShiftAssign.objects.filter(is_active=True,employee_id=rshift.employee_id)
flag = False
if len(employees_rshift_assign) < 1:
rshift.is_active = True
flag = True
message = _('un-archived')
if request.GET.get('is_active') == 'False':
rshift.is_active = False
flag = True
message = _('archived')
rshift.save()
if flag:
messages.success(request, _('Rotating shift assign is {message}').format(message=message))
else:
messages.error(request,'Already on record is active')
return HttpResponseRedirect(request. META. get('HTTP_REFERER', '/'))
@login_required
@manager_can_enter('base.change_rotatingshiftassign')
def rotating_shift_assign_bulk_archive(request):
"""
This method is used to archive/un-archive bulk rotating shift assigns
"""
ids = request.POST['ids']
ids = json.loads(ids)
is_active = True
message =_('un-archived')
if request.GET.get('is_active') == 'False':
is_active = False
message =_('archived')
for id in ids:
# check permission right here...
rshift_assign = RotatingShiftAssign.objects.get(id=id)
employees_rshift_assign = RotatingShiftAssign.objects.filter(is_active=True,employee_id=rshift_assign.employee_id)
flag = True
if len(employees_rshift_assign) < 1:
flag = False
rshift_assign.is_active = is_active
rshift_assign.save()
if not flag:
messages.success(
request, _('Rotating shift for {employee} is {message}').format(employee=rshift_assign.employee_id,message=message))
else:
messages.error(
request, _('Rotating shift for {employee} is already exists').format(employee=rshift_assign.employee_id)
)
return JsonResponse({'message': 'Success'})
@login_required
@permission_required('base.delete_rotatingshiftassign')
def rotating_shift_assign_bulk_delete(request):
"""
This method is used to bulk delete for rotating shift assign
"""
ids = request.POST['ids']
ids = json.loads(ids)
for id in ids:
rshift_assign = RotatingShiftAssign.objects.get(id=id)
try:
rshift_assign.delete()
messages.success(request, _('{employee} assign deleted.').format(employee =rshift_assign.employee_id))
except Exception as e:
messages.error(request, _('You cannot delete {rshift_assign}').format(rshift_assign=rshift_assign))
messages.error(request, e)
return JsonResponse({'message': 'Success'})
@login_required
@permission_required('base.delete_rotatingshiftassign')
@require_http_methods(['POST'])
def rotating_shift_assign_delete(request, id):
"""
This method is used to delete rotating shift assign instance
args:
id : rotating shift assign instance id
"""
try:
rotating_shift_assign_obj = RotatingShiftAssign.objects.get(
id=id).delete()
messages.success(request, _('Rotating shift assign deleted.'))
except Exception as e:
messages.error(request, e)
messages.error(
request, _('You cannot delete this rotating shift assign.'))
return redirect('/employee/rotating-shift-assign')
@login_required
@permission_required('add_permission')
def employee_permission_assign(request):
"""
This method is used to assign permissions to employee user
"""
employees = Employee.objects.all()
permissions = Permission.objects.all()
form = AssignPermission()
if request.method == 'POST':
form = AssignPermission(request.POST)
if form.is_valid():
form.save()
messages.success(request, _('Employee permission assigned.'))
return redirect(employee_permission_assign)
return render(request, 'base/auth/permission.html', {
'employees': paginator_qry(employees, request.GET.get('page')),
'form': form
})
@login_required
@permission_required('view_permissions')
def employee_permission_search(request, codename=None, uid=None):
"""
This method renders template to view all instances of user permissions
"""
search = ''
if request.GET.get('search') is not None:
search = request.GET.get('search')
employees = Employee.objects.filter(employee_first_name__icontains=search) | Employee.objects.filter(
employee_last_name__icontains=search)
previous_data = request.environ['QUERY_STRING']
return render(request, 'base/auth/permission_view.html', {
'employees': paginator_qry(employees, request.GET.get('page')),
'pd': previous_data}
)
@login_required
@require_http_methods(['POST'])
def remove_permission(request, codename, uid):
"""
This method is used to remove user permission.
"""
user = User.objects.get(id=uid)
permission_codename = codename.split('.')[1]
permission = Permission.objects.filter(codename=permission_codename)
user.user_permissions.remove(*permission)
employees = Employee.objects.all()
page = request.GET.get('page')
return render(request, 'base/auth/permission_view.html', {'employees': paginator_qry(employees, page), 'pd': f'&page={page}'})
@login_required
def work_type_request_view(request):
"""
This method renders template to view all work type requests
"""
employee = Employee.objects.filter(employee_user_id=request.user).first()
work_type_requests = filtersubordinates(
request, WorkTypeRequest.objects.all(), 'base.add_worktyperequest')
work_type_requests = work_type_requests | WorkTypeRequest.objects.filter(
employee_id=employee)
f = WorkTypeRequestFilter()
form = WorkTypeRequestForm()
form = choosesubordinates(request, form, 'base.add_worktypereqeust',)
form = include_employee_instance(request, form)
return render(request, 'work_type_request/work_type_request_view.html', {'data': paginator_qry(work_type_requests, request.GET.get('page')), 'f': f, 'form': form})
@login_required
def work_type_request_search(request):
"""
This method is used to search work type request.
"""
employee = Employee.objects.filter(employee_user_id=request.user).first()
previous_data = request.environ['QUERY_STRING']
f = WorkTypeRequestFilter(request.GET)
work_typ_requests = filtersubordinates(request, f.qs, 'base.add_worktyperequest')
if set(WorkTypeRequest.objects.filter(employee_id = employee)).issubset(set(f.qs)):
work_typ_requests = work_typ_requests | WorkTypeRequest.objects.filter(employee_id = employee)
work_typ_requests = sortby(request, work_typ_requests, 'orderby')
return render(request, 'work_type_request/htmx/requests.html', {'data': paginator_qry(work_typ_requests, request.GET.get('page')), 'pd': previous_data})
@login_required
def work_type_request(request):
"""
This method is used to create request for work type .
"""
form = WorkTypeRequestForm()
'canceled'
form = choosesubordinates(request, form, 'base.add_worktyperequest',)
form = include_employee_instance(request, form)
f = WorkTypeRequestFilter()
if request.method == 'POST':
form = WorkTypeRequestForm(request.POST)
form = choosesubordinates(request, form, 'base.add_worktyperequest',)
form = include_employee_instance(request, form)
response = render(
request, 'work_type_request/request_form.html', {'form': form, 'f': f})
if form.is_valid():
instance = form.save()
try:
notify.send(instance.employee_id, recipient=instance.employee_id.employee_work_info.reporting_manager_id.employee_user_id,
verb=f"You have new work type request to validate for {instance.employee_id}", icon="information", redirect="/shift-requests/shift-request-view")
except Exception as e:
pass
messages.success(request, _('Work type request added.'))
return HttpResponse(response.content.decode('utf-8') + '<script>location.reload();</script>')
return render(request, 'work_type_request/request_form.html', {'form': form, 'f': f})
@login_required
def work_type_request_cancel(request, id):
"""
This method is used to cancel work type request
args:
id : work type request id
"""
work_type_request = WorkTypeRequest.objects.get(id=id)
if is_reportingmanger(request, work_type_request) or request.user.has_perm('base.cancel_worktyperequest') or work_type_request.employee_id == request.user.employee_get and work_type_request.approved == False:
work_type_request.canceled = True
work_type_request.approved = False
work_type_request.employee_id.employee_work_info.work_type_id = work_type_request.previous_work_type_id
work_type_request.employee_id.employee_work_info.save()
work_type_request.save()
messages.success(request, _('Work type request has been canceled.'))
notify.send(request.user.employee_get, recipient=work_type_request.employee_id.employee_user_id,
verb='Your work type request has been canceled.', redirect='/', icon='close')
return HttpResponseRedirect(request. META. get('HTTP_REFERER', '/'))
return HttpResponse('You dont have permission')
@login_required
@manager_can_enter('base.change_worktyperequest')
def work_type_request_bulk_cancel(request):
"""
This method is used to cancel a bunch work type request
"""
ids = request.POST['ids']
ids = json.loads(ids)
for id in ids:
work_type_request = WorkTypeRequest.objects.get(id=id)
if is_reportingmanger(request, work_type_request) or request.user.has_perm('base.cancel_worktyperequest') or work_type_request.employee_id == request.user.employee_get and work_type_request.approved == False:
work_type_request.canceled = True
work_type_request.approved = False
work_type_request.employee_id.employee_work_info.work_type_id = work_type_request.previous_work_type_id
work_type_request.employee_id.employee_work_info.save()
work_type_request.save()
messages.success(request, _('Work type request has been canceled.'))
notify.send(request.user.employee_get, recipient=work_type_request.employee_id.employee_user_id,
verb='Your work type request has been canceled.', redirect='/', icon='close')
return HttpResponseRedirect(request. META. get('HTTP_REFERER', '/'))
@login_required
def work_type_request_approve(request, id):
"""
This method is used to approve requested work type
"""
work_type_request = WorkTypeRequest.objects.get(id=id)
if is_reportingmanger(request, work_type_request) or request.user.has_perm('approve_worktyperequest') or request.user.has_perm('change_worktyperequest') and not work_type_request.approved:
"""
Here the request will be approved, can send mail right here
"""
work_type_request.approved = True
work_type_request.canceled = False
work_type_request.save()
messages.success(request, _('Work type request has been approved.'))
notify.send(request.user.employee_get, recipient=work_type_request.employee_id.employee_user_id,
verb='Your work type request has been Approved.', redirect='/', icon='checkmark')
return HttpResponseRedirect(request. META. get('HTTP_REFERER', '/'))
return HttpResponse('You Do nt Have Permission')
@login_required
def work_type_request_bulk_approve(request):
"""
This method is used to approve bulk of requested work type
"""
ids = request.POST['ids']
ids = json.loads(ids)
for id in ids:
work_type_request = WorkTypeRequest.objects.get(id=id)
if is_reportingmanger(request, work_type_request) or request.user.has_perm('approve_worktyperequest') or request.user.has_perm('change_worktyperequest') and not work_type_request.approved:
"""
Here the request will be approved, can send mail right here
"""
work_type_request.approved = True
work_type_request.canceled = False
employee_work_info = work_type_request.employee_id.employee_work_info
employee_work_info.work_type_id = work_type_request.work_type_id
employee_work_info.save()
work_type_request.save()
messages.success(request, _('Work type request has been approved.'))
notify.send(request.user.employee_get, recipient=work_type_request.employee_id.employee_user_id,
verb='Your work type request has been Approved.', redirect='/', icon='checkmark')
return HttpResponseRedirect(request. META. get('HTTP_REFERER', '/'))
@login_required
def work_type_request_update(request, id):
"""
This method is used to update work type request instance
args:
id : work type request instance id
"""
work_type_request = WorkTypeRequest.objects.get(id=id)
form = WorkTypeRequestForm(instance=work_type_request)
form = choosesubordinates(request, form, 'base.change_worktyperequest')
form = include_employee_instance(request, form)
if request.method == 'POST':
response = render(
request, 'work_type_request/request_update_form.html', {'form': form, })
form = WorkTypeRequestForm(request.POST, instance=work_type_request)
form = choosesubordinates(request, form, 'base.change_worktyperequest')
form = include_employee_instance(request, form)
if form.is_valid():
form.save()
messages.success(request, _('Request Updated Successfully'))
return HttpResponse(response.content.decode('utf-8') + '<script>location.reload();</script>')
return render(request, 'work_type_request/request_update_form.html', {'form': form})
@login_required
@permission_required('base.delete_worktyperequest')
@require_http_methods(['POST'])
def work_type_request_delete(request, id):
"""
This method is used to delete work type request
args:
id : work type request instance id
"""
try:
work_type_request = WorkTypeRequest.objects.get(id=id)
employee = work_type_request.employee_id.employee_user_id
work_type_request.delete()
messages.success(request, _('Work type request deleted.'))
notify.send(request.user.employee_get, recipient=employee,
verb='Your work type request has been deleted.', redirect='/', icon='trash')
except Exception as e:
messages.error(request, e)
messages.error(request, _('You cannot delete this work type request.'))
return HttpResponseRedirect(request. META. get('HTTP_REFERER', '/'))
@login_required
@permission_required('base.delete_worktyperequest')
@require_http_methods(['POST'])
def work_type_request_bulk_delete(request):
"""
This method is used to delete work type request
args:
id : work type request instance id
"""
ids = request.POST['ids']
ids = json.loads(ids)
for id in ids:
try:
work_type_request = WorkTypeRequest.objects.get(id=id)
user = work_type_request.employee_id.employee_user_id
work_type_request.delete()
messages.success(request,_('Work type request deleted.'))
notify.send(request.user.employee_get, recipient=user,
verb='Your work type request has been deleted.', redirect='/', icon='trash')
except Exception as e:
messages.error(request, e)
messages.error(
request, _('You cannot delete {employee} work type request for the date {date}.').format(employee=work_type_request.employee_id,date=work_type_request.requested_date))
return HttpResponseRedirect(request. META. get('HTTP_REFERER', '/'))
@login_required
def shift_request(request):
"""
This method is used to create shift request
"""
form = ShiftRequestForm()
form = choosesubordinates(request, form, 'base.add_shiftrequest',)
f = ShiftRequestFilter()
if request.method == 'POST':
form = ShiftRequestForm(request.POST)
form = choosesubordinates(request, form, 'base.add_shiftrequest')
form = include_employee_instance(request, form)
response = render(
request, 'shift_request/request_form.html', {'form': form, 'f': f})
if form.is_valid():
instance = form.save()
try:
notify.send(instance.employee_id, recipient=instance.employee_id.employee_work_info.reporting_manager_id.employee_user_id,
verb=f"You have new shift request to approve for {instance.employee_id}", icon="information", redirect="/shift-requests/shift-request-view")
except Exception as e:
pass
messages.success(request, _('Request Added'))
return HttpResponse(response.content.decode('utf-8') + '<script>location.reload();</script>')
return render(request, 'shift_request/request_form.html', {'form': form, 'f': f})
@login_required
def shift_request_view(request):
"""
This method renders all shift request instances to a template
"""
employee = Employee.objects.filter(employee_user_id=request.user).first()
shift_requests = filtersubordinates(
request, ShiftRequest.objects.all(), 'base.add_shiftrequest')
shift_requests = shift_requests | ShiftRequest.objects.filter(
employee_id=employee)
f = ShiftRequestFilter()
form = ShiftRequestForm()
form = choosesubordinates(request, form, 'base.add_shiftrequest',)
form = include_employee_instance(request, form)
return render(request, 'shift_request/shift_request_view.html', {'data': paginator_qry(shift_requests, request.GET.get('page')), 'f': f, 'form': form})
@login_required
def shift_request_search(request):
"""
This method is used search shift request by employee and also used to filter shift request.
"""
employee = Employee.objects.filter(employee_user_id=request.user).first()
previous_data = request.environ['QUERY_STRING']
f = ShiftRequestFilter(request.GET)
shift_requests = filtersubordinates(request, f.qs, 'base.add_shiftrequest')
if set(ShiftRequest.objects.filter(employee_id = employee)).issubset(set(f.qs)):
shift_requests = shift_requests | ShiftRequest.objects.filter(employee_id = employee)
shift_requests = sortby(request, shift_requests, 'orderby')
return render(request, 'shift_request/htmx/requests.html', {'data': paginator_qry(shift_requests, request.GET.get('page')), 'pd': previous_data})
@login_required
def shift_request_update(request, id):
"""
This method is used to update shift request instance
args:
id : shift request instance id
"""
shift_request = ShiftRequest.objects.get(id=id)
form = ShiftRequestForm(instance=shift_request)
form = choosesubordinates(request, form, 'base.change_shiftrequest')
form = include_employee_instance(request, form)
if request.method == 'POST':
response = render(
request, 'shift_request/request_update_form.html', {'form': form, })
form = ShiftRequestForm(request.POST, instance=shift_request)
form = choosesubordinates(request, form, 'base.change_shiftrequest')
form = include_employee_instance(request, form)
if form.is_valid():
form.save()
messages.success(request, _('Request Updated Successfully'))
return HttpResponse(response.content.decode('utf-8') + '<script>location.reload();</script>')
return render(request, 'shift_request/request_update_form.html', {'form': form})
@login_required
def shift_request_cancel(request, id):
"""
This method is used to update or cancel shift request
args:
id : shift request id
"""
shift_request = ShiftRequest.objects.get(id=id)
if is_reportingmanger(request, shift_request) or request.user.has_perm('base.cancel_shiftrequest') or shift_request.employee_id == request.user.employee_get and shift_request.approved == False:
shift_request.canceled = True
shift_request.approved = False
shift_request.employee_id.employee_work_info.shift_id = shift_request.previous_shift_id
shift_request.employee_id.employee_work_info.save()
shift_request.save()
messages.success(request, _('Shift request canceled'))
notify.send(request.user.employee_get, recipient=shift_request.employee_id.employee_user_id,
verb='Your shift request has been canceled.', redirect='/', icon='close')
return HttpResponseRedirect(request. META. get('HTTP_REFERER', '/'))
return HttpResponse('You cant cancel the request')
@login_required
@manager_can_enter('base.change_shiftrequest')
@require_http_methods(['POST'])
def shift_request_bulk_cancel(request):
"""
This method is used to cancel a bunch of shift request.
"""
ids = request.POST['ids']
ids = json.loads(ids)
for id in ids:
shift_request = ShiftRequest.objects.get(id=id)
if is_reportingmanger(request, shift_request) or request.user.has_perm('base.cancel_shiftrequest') or shift_request.employee_id == request.user.employee_get and shift_request.approved == False:
shift_request.canceled = True
shift_request.approved = False
shift_request.employee_id.employee_work_info.shift_id = shift_request.previous_shift_id
shift_request.employee_id.employee_work_info.save()
shift_request.save()
messages.success(request, _('Shift request canceled'))
notify.send(request.user.employee_get, recipient=shift_request.employee_id.employee_user_id,
verb='Your shift request has been canceled.', redirect='/', icon='close')
return HttpResponseRedirect(request. META. get('HTTP_REFERER', '/'))
@login_required
@manager_can_enter('base.change_shiftrequest')
def shift_request_approve(request, id):
"""
This method is used to approve shift request
args:
id : shift request instance id
"""
shift_request = ShiftRequest.objects.get(id=id)
if is_reportingmanger(request, shift_request) or request.user.has_perm('approve_shiftrequest') or request.user.has_perm('change_shiftrequest') and not shift_request.approved:
"""
here the request will be approved, can send mail right here
"""
shift_request.approved = True
shift_request.canceled = False
shift_request.save()
messages.success(request, _('Shift has been approved.'))
notify.send(request.user.employee_get, recipient=shift_request.employee_id.employee_user_id,
verb='Your shift request has been approved.', redirect='/', icon='checkmark')
return HttpResponseRedirect(request. META. get('HTTP_REFERER', '/'))
return HttpResponse('You Dont Have Permission')
@login_required
@require_http_methods(['POST'])
@manager_can_enter('base.change_shiftrequest')
def shift_request_bulk_approve(request):
"""
This method is used to approve a bunch of shift request
"""
ids = request.POST['ids']
ids = json.loads(ids)
for id in ids:
shift_request = ShiftRequest.objects.get(id=id)
if is_reportingmanger(request, shift_request) or request.user.has_perm('approve_shiftrequest') or request.user.has_perm('change_shiftrequest') and not shift_request.approved:
"""
here the request will be approved, can send mail right here
"""
shift_request.approved = True
shift_request.canceled = False
employee_work_info = shift_request.employee_id.employee_work_info
employee_work_info.shift_id = shift_request.shift_id
employee_work_info.save()
shift_request.save()
messages.success(request, _('Shift has been approved.'))
notify.send(request.user.employee_get, recipient=shift_request.employee_id.employee_user_id,
verb='Your shift request has been approved.', redirect='/', icon='checkmark')
return HttpResponseRedirect(request. META. get('HTTP_REFERER', '/'))
@login_required
@permission_required('delete_shiftrequest')
@require_http_methods(['POST'])
def shift_request_delete(request, id):
"""
This method is used to delete shift request instance
args:
id : shift request instance id
"""
try:
shift_request = ShiftRequest.objects.get(id=id)
user = shift_request.employee_id.employee_user_id
shift_request.delete()
messages.success(request, _('Shift request deleted.'))
notify.send(request.user.employee_get, recipient=user,
verb='Your shift request has been deleted.', redirect='/', icon='trash')
except Exception as e:
messages.error(request, e)
messages.error(request, _('You cannot delete this shift request.'))
return HttpResponseRedirect(request. META. get('HTTP_REFERER', '/'))
@login_required
@permission_required('delete_shiftrequest')
@require_http_methods(['POST'])
def shift_request_bulk_delete(request):
"""
This method is used to delete shift request instance
args:
id : shift request instance id
"""
ids = request.POST['ids']
ids = json.loads(ids)
for id in ids:
try:
shift_request = ShiftRequest.objects.get(id=id)
user = shift_request.employee_id.employee_user_id
shift_request.delete()
messages.success(request, _('Shift request deleted.'))
notify.send(request.user.employee_get, recipient=user,
verb='Your shift request has been deleted.', redirect='/', icon='trash')
except Exception as e:
messages.error(request, e)
messages.error(
request, _('You cannot delete {employee} shift request for the date {date}.').format(employee=shift_request.employee_id,date=shift_request.requested_date))
return HttpResponseRedirect(request. META. get('HTTP_REFERER', '/'))
@login_required
def notifications(request):
notifications = request.user.notifications.unread()
return render(request, 'notification/notification_items.html', {'notifications': notifications})
@login_required
def clear_notification(request):
try:
request.user.notifications.read().delete()
messages.success(request, _('Unread notifications removed.'))
except Exception as e:
messages.error(request, e)
notifications = request.user.notifications.unread()
return render(request, 'notification/notification_items.html', {'notifications': notifications})
@login_required
def delete_notification(request, id):
try:
notification = request.user.notifications.get(id=id).delete()
messages.success(request, _('Notification deleted.'))
except Exception as e:
messages.error(request, e)
notifications = request.user.notifications.all()
return render(request, 'notification/all_notifications.html', {'notifications': notifications})
@login_required
def read_notifications(request):
try:
request.user.notifications.all().mark_all_as_read()
messages.info(request, _('Notifications marked as read'))
except Exception as e:
messages.error(request, e)
notifications = request.user.notifications.unread()
return render(request, 'notification/notification_items.html', {'notifications': notifications})
@login_required
def all_notifications(request):
notifications = request.user.notifications.all()
return render(request, 'notification/all_notifications.html', {'notifications': notifications})