diff --git a/attendance/views.py b/attendance/views.py
index 7f2ea55ca..727cd2df8 100644
--- a/attendance/views.py
+++ b/attendance/views.py
@@ -1167,6 +1167,10 @@ def validate_bulk_attendance(request):
request.user.employee_get,
recipient=attendance.employee_id.employee_user_id,
verb=f"Your attendance for the date {attendance.attendance_date} is validated",
+ verb_ar=f"تم التحقق من حضورك في تاريخ {attendance.attendance_date}",
+ verb_de=f"Ihre Anwesenheit für das Datum {attendance.attendance_date} wurde bestätigt",
+ verb_es=f"Se ha validado su asistencia para la fecha {attendance.attendance_date}",
+ verb_fr=f"Votre présence pour la date {attendance.attendance_date} est validée",
redirect="/attendance/view-my-attendance",
icon="checkmark",
)
@@ -1192,6 +1196,10 @@ def validate_this_attendance(request, obj_id):
request.user.employee_get,
recipient=attendance.employee_id.employee_user_id,
verb=f"Your attendance for the date {attendance.attendance_date} is validated",
+ verb_ar=f"تم تحقيق حضورك في تاريخ {attendance.attendance_date}",
+ verb_de=f"Deine Anwesenheit für das Datum {attendance.attendance_date} ist bestätigt.",
+ verb_es=f"Se valida tu asistencia para la fecha {attendance.attendance_date}.",
+ verb_fr=f"Votre présence pour la date {attendance.attendance_date} est validée.",
redirect="/attendance/view-my-attendance",
icon="checkmark",
)
@@ -1221,6 +1229,10 @@ def revalidate_this_attendance(request, obj_id):
),
verb=f"{attendance.employee_id} requested revalidation for \
{attendance.attendance_date} attendance",
+ verb_ar=f"{attendance.employee_id} طلب إعادة التحقق من حضور تاريخ {attendance.attendance_date}",
+ verb_de=f"{attendance.employee_id} beantragte eine Neubewertung der Teilnahme am {attendance.attendance_date}",
+ verb_es=f"{attendance.employee_id} solicitó la validación nuevamente para la asistencia del {attendance.attendance_date}",
+ verb_fr=f"{attendance.employee_id} a demandé une revalidation pour la présence du {attendance.attendance_date}",
redirect="/attendance/view-my-attendance",
icon="refresh",
)
@@ -1244,6 +1256,10 @@ def approve_overtime(request, obj_id):
request.user.employee_get,
recipient=attendance.employee_id.employee_user_id,
verb=f"Your {attendance.attendance_date}'s attendance overtime approved.",
+ verb_ar=f"تمت الموافقة على إضافة ساعات العمل الإضافية لتاريخ {attendance.attendance_date}.",
+ verb_de=f"Die Überstunden für den {attendance.attendance_date} wurden genehmigt.",
+ verb_es=f"Se ha aprobado el tiempo extra de asistencia para el {attendance.attendance_date}.",
+ verb_fr=f"Les heures supplémentaires pour la date {attendance.attendance_date} ont été approuvées.",
redirect="/attendance/attendance-overtime-view",
icon="checkmark",
)
@@ -1267,6 +1283,10 @@ def approve_bulk_overtime(request):
request.user.employee_get,
recipient=attendance.employee_id.employee_user_id,
verb=f"Overtime approved for {attendance.attendance_date}'s attendance",
+ verb_ar=f"تمت الموافقة على العمل الإضافي لحضور تاريخ {attendance.attendance_date}",
+ verb_de=f"Überstunden für die Anwesenheit am {attendance.attendance_date} genehmigt",
+ verb_es=f"Horas extra aprobadas para la asistencia del {attendance.attendance_date}",
+ verb_fr=f"Heures supplémentaires approuvées pour la présence du {attendance.attendance_date}",
redirect="/attendance/attendance-overtime-view",
icon="checkmark",
)
@@ -1427,9 +1447,9 @@ def dashboard_attendance(request):
JsonResponse: returns data set as json
"""
labels = [
- "On Time",
- "Late Come",
- "On Break",
+ _("On Time"),
+ _("Late Come"),
+ _("On Break"),
]
data_set = []
departments = Department.objects.all()
diff --git a/base/scheduler.py b/base/scheduler.py
index 4987299f1..ebe9f3196 100644
--- a/base/scheduler.py
+++ b/base/scheduler.py
@@ -4,11 +4,12 @@ import calendar
from notifications.signals import notify
-def update_rotating_work_type_assign(rotating_work_type,new_date):
+def update_rotating_work_type_assign(rotating_work_type, new_date):
"""
Here will update the employee work information details and send notification
"""
from django.contrib.auth.models import User
+
employee = rotating_work_type.employee_id
employee_work_info = employee.employee_work_info
work_type1 = rotating_work_type.rotating_work_type_id.work_type1
@@ -26,19 +27,30 @@ def update_rotating_work_type_assign(rotating_work_type,new_date):
bot = User.objects.filter(username="Horilla Bot").first()
if bot is not None:
employee = rotating_work_type.employee_id
- notify.send(bot,recipient=employee.employee_user_id,verb="Your Work Type has been changed.",icon="infinite",redirect="/employee/employee-profile")
+ notify.send(
+ bot,
+ recipient=employee.employee_user_id,
+ verb="Your Work Type has been changed.",
+ verb_ar="لقد تغير نوع عملك.",
+ verb_de="Ihre Art der Arbeit hat sich geändert.",
+ verb_es="Su tipo de trabajo ha sido cambiado.",
+ verb_fr="Votre type de travail a été modifié.",
+ icon="infinite",
+ redirect="/employee/employee-profile",
+ )
return
+
def work_type_rotate_after(rotating_work_work_type):
"""
This method for rotate work type based on after day
"""
- date_today = datetime.now()
+ date_today = datetime.now()
switch_date = rotating_work_work_type.next_change_date
- if switch_date.strftime('%Y-%m-%d') == date_today.strftime('%Y-%m-%d'):
+ if switch_date.strftime("%Y-%m-%d") == date_today.strftime("%Y-%m-%d"):
# calculate the next work type switch date
new_date = date_today + timedelta(days=rotating_work_work_type.rotate_after_day)
- update_rotating_work_type_assign(rotating_work_work_type,new_date)
+ update_rotating_work_type_assign(rotating_work_work_type, new_date)
return
@@ -46,36 +58,38 @@ def work_type_rotate_weekend(rotating_work_type):
"""
This method for rotate work type based on weekend
"""
- date_today = datetime.now()
+ date_today = datetime.now()
switch_date = rotating_work_type.next_change_date
- if switch_date.strftime('%Y-%m-%d') == date_today.strftime('%Y-%m-%d'):
+ if switch_date.strftime("%Y-%m-%d") == date_today.strftime("%Y-%m-%d"):
# calculate the next work type switch date
- day = datetime.now().strftime('%A').lower()
+ day = datetime.now().strftime("%A").lower()
switch_day = rotating_work_type.rotate_every_weekend
if day == switch_day:
new_date = date_today + timedelta(days=7)
- update_rotating_work_type_assign(rotating_work_type,new_date)
+ update_rotating_work_type_assign(rotating_work_type, new_date)
return
+
def work_type_rotate_every(rotating_work_type):
- """
+ """
This method for rotate work type based on every month
"""
date_today = datetime.now()
switch_date = rotating_work_type.next_change_date
day_date = rotating_work_type.rotate_every
- if switch_date.strftime('%Y-%m-%d') == date_today.strftime('%Y-%m-%d'):
+ if switch_date.strftime("%Y-%m-%d") == date_today.strftime("%Y-%m-%d"):
# calculate the next work type switch date
- if day_date == switch_date.strftime('%d').lstrip('0'):
+ if day_date == switch_date.strftime("%d").lstrip("0"):
new_date = date_today.replace(month=date_today.month + 1)
update_rotating_work_type_assign(rotating_work_type, new_date)
- elif day_date == 'last':
- year = date_today.strftime('%Y')
- month = date_today.strftime('%m')
+ elif day_date == "last":
+ year = date_today.strftime("%Y")
+ month = date_today.strftime("%m")
last_day = calendar.monthrange(int(year), int(month) + 1)[1]
new_date = datetime(int(year), int(month) + 1, last_day)
update_rotating_work_type_assign(rotating_work_type, new_date)
- return
+ return
+
def rotate_work_type():
"""
@@ -83,24 +97,25 @@ def rotate_work_type():
and redirect to the chunk method to execute.
"""
from base.models import RotatingWorkTypeAssign
+
rotating_work_types = RotatingWorkTypeAssign.objects.filter(is_active=True)
for rotating_work_type in rotating_work_types:
based_on = rotating_work_type.based_on
- if based_on =='after':
+ if based_on == "after":
work_type_rotate_after(rotating_work_type)
- elif based_on == 'weekly':
+ elif based_on == "weekly":
work_type_rotate_weekend(rotating_work_type)
- elif based_on == 'monthly':
+ elif based_on == "monthly":
work_type_rotate_every(rotating_work_type)
return
-
-def update_rotating_shift_assign(rotating_shift,new_date):
+def update_rotating_shift_assign(rotating_shift, new_date):
"""
- Here will update the employee work information and send notification
+ Here will update the employee work information and send notification
"""
from django.contrib.auth.models import User
+
employee = rotating_shift.employee_id
employee_work_info = employee.employee_work_info
shift1 = rotating_shift.rotating_shift_id.shift1
@@ -115,59 +130,72 @@ def update_rotating_shift_assign(rotating_shift,new_date):
rotating_shift.current_shift = new
rotating_shift.next_shift = next
rotating_shift.save()
- bot = User.objects.filter(username='Horilla Bot').first()
+ bot = User.objects.filter(username="Horilla Bot").first()
if bot is not None:
employee = rotating_shift.employee_id
- notify.send(bot,recipient=employee.employee_user_id,verb="Your shift has been changed.",icon="infinite",redirect="/employee/employee-profile")
+ notify.send(
+ bot,
+ recipient=employee.employee_user_id,
+ verb="Your shift has been changed.",
+ verb_ar="تم تغيير التحول الخاص بك.",
+ verb_de="Ihre Schicht wurde geändert.",
+ verb_es="Tu turno ha sido cambiado.",
+ verb_fr="Votre quart de travail a été modifié.",
+ icon="infinite",
+ redirect="/employee/employee-profile",
+ )
return
+
def shift_rotate_after_day(rotating_shift):
"""
This method for rotate shift based on after day
"""
- date_today = datetime.now()
+ date_today = datetime.now()
switch_date = rotating_shift.next_change_date
- if switch_date.strftime('%Y-%m-%d') == date_today.strftime('%Y-%m-%d'):
+ if switch_date.strftime("%Y-%m-%d") == date_today.strftime("%Y-%m-%d"):
# calculate the next work type switch date
new_date = date_today + timedelta(days=rotating_shift.rotate_after_day)
- update_rotating_shift_assign(rotating_shift,new_date)
+ update_rotating_shift_assign(rotating_shift, new_date)
return
+
def shift_rotate_weekend(rotating_shift):
"""
This method for rotate shift based on weekend
"""
- date_today = datetime.now()
- switch_date = rotating_shift.next_change_date
- if switch_date.strftime('%Y-%m-%d') == date_today.strftime('%Y-%m-%d'):
+ date_today = datetime.now()
+ switch_date = rotating_shift.next_change_date
+ if switch_date.strftime("%Y-%m-%d") == date_today.strftime("%Y-%m-%d"):
# calculate the next work type switch date
- day = datetime.now().strftime('%A').lower()
+ day = datetime.now().strftime("%A").lower()
switch_day = rotating_shift.rotate_every_weekend
if day == switch_day:
new_date = date_today + timedelta(days=7)
- update_rotating_shift_assign(rotating_shift,new_date)
+ update_rotating_shift_assign(rotating_shift, new_date)
return
+
def shift_rotate_every(rotating_shift):
- """
+ """
This method for rotate shift based on every month
"""
date_today = datetime.now()
switch_date = rotating_shift.next_change_date
day_date = rotating_shift.rotate_every
- if switch_date.strftime('%Y-%m-%d') == date_today.strftime('%Y-%m-%d'):
+ if switch_date.strftime("%Y-%m-%d") == date_today.strftime("%Y-%m-%d"):
# calculate the next work type switch date
- if day_date == switch_date.strftime('%d').lstrip('0'):
+ if day_date == switch_date.strftime("%d").lstrip("0"):
new_date = date_today.replace(month=date_today.month + 1)
update_rotating_shift_assign(rotating_shift, new_date)
- elif day_date == 'last':
- year = date_today.strftime('%Y')
- month = date_today.strftime('%m')
+ elif day_date == "last":
+ year = date_today.strftime("%Y")
+ month = date_today.strftime("%m")
last_day = calendar.monthrange(int(year), int(month) + 1)[1]
new_date = datetime(int(year), int(month) + 1, last_day)
update_rotating_shift_assign(rotating_shift, new_date)
- return
-
+ return
+
def rotate_shift():
"""
@@ -175,21 +203,21 @@ def rotate_shift():
and redirect to the chunk method to execute.
"""
from base.models import RotatingShiftAssign
+
rotating_shifts = RotatingShiftAssign.objects.filter(is_active=True)
for rotating_shift in rotating_shifts:
based_on = rotating_shift.based_on
# after day condition
- if based_on =='after':
+ if based_on == "after":
shift_rotate_after_day(rotating_shift)
# weekly condition
- elif based_on == 'weekly':
+ elif based_on == "weekly":
shift_rotate_weekend(rotating_shift)
# monthly condition
- elif based_on == 'monthly':
+ elif based_on == "monthly":
shift_rotate_every(rotating_shift)
-
+
return
-
def switch_shift():
@@ -199,8 +227,10 @@ def switch_shift():
from base.models import ShiftRequest
from django.contrib.auth.models import User
- today =date.today()
- shift_requests = ShiftRequest.objects.filter(canceled=False,approved=True,requested_date__exact=today,shift_changed=False)
+ today = date.today()
+ shift_requests = ShiftRequest.objects.filter(
+ canceled=False, approved=True, requested_date__exact=today, shift_changed=False
+ )
for request in shift_requests:
work_info = request.employee_id.employee_work_info
# updating requested shift to the employee work information.
@@ -209,12 +239,23 @@ def switch_shift():
request.approved = True
request.shift_changed = True
request.save()
- bot = User.objects.filter(username='Horilla Bot').first()
+ bot = User.objects.filter(username="Horilla Bot").first()
if bot is not None:
employee = request.employee_id
- notify.send(bot,recipient=employee.employee_user_id,verb="Shift Changes notification",icon="refresh",redirect="/employee/employee-profile")
+ notify.send(
+ bot,
+ recipient=employee.employee_user_id,
+ verb="Shift Changes notification",
+ verb_ar="التحول تغيير الإخطار",
+ verb_de="Benachrichtigung über Schichtänderungen",
+ verb_es="Notificación de cambios de turno",
+ verb_fr="Notification des changements de quart de travail",
+ icon="refresh",
+ redirect="/employee/employee-profile",
+ )
return
+
def undo_shift():
"""
This method undo previous employees shift information regards to the shift request
@@ -222,9 +263,15 @@ def undo_shift():
from base.models import ShiftRequest
from django.contrib.auth.models import User
- today =date.today()
+ today = date.today()
# here will get all the active shift requests
- shift_requests = ShiftRequest.objects.filter(canceled=False,approved=True,requested_till__lt=today,is_active=True,shift_changed=True)
+ shift_requests = ShiftRequest.objects.filter(
+ canceled=False,
+ approved=True,
+ requested_till__lt=today,
+ is_active=True,
+ shift_changed=True,
+ )
for request in shift_requests:
work_info = request.employee_id.employee_work_info
work_info.shift_id = request.previous_shift_id
@@ -232,22 +279,37 @@ def undo_shift():
# making the instance in-active
request.is_active = False
request.save()
- bot = User.objects.filter(username='Horilla Bot').first()
+ bot = User.objects.filter(username="Horilla Bot").first()
if bot is not None:
employee = request.employee_id
- notify.send(bot,recipient=employee.employee_user_id,verb="Shift changes notification, Requested date expired.",icon="refresh",redirect="/employee/employee-profile")
+ notify.send(
+ bot,
+ recipient=employee.employee_user_id,
+ verb="Shift changes notification, Requested date expired.",
+ verb_ar="التحول يغير الإخطار ، التاريخ المطلوب انتهت صلاحيته.",
+ verb_de="Benachrichtigung über Schichtänderungen, gewünschtes Datum abgelaufen.",
+ verb_es="Notificación de cambios de turno, Fecha solicitada vencida.",
+ verb_fr="Notification de changement d'équipe, la date demandée a expiré.",
+ icon="refresh",
+ redirect="/employee/employee-profile",
+ )
return
-
def switch_work_type():
"""
This method change employees work type information regards to the work type request
"""
from django.contrib.auth.models import User
from base.models import WorkTypeRequest
- today =date.today()
- work_type_requests = WorkTypeRequest.objects.filter(canceled=False,approved=True,requested_date__exact=today,work_type_changed=False)
+
+ today = date.today()
+ work_type_requests = WorkTypeRequest.objects.filter(
+ canceled=False,
+ approved=True,
+ requested_date__exact=today,
+ work_type_changed=False,
+ )
for request in work_type_requests:
work_info = request.employee_id.employee_work_info
# updating requested work type to the employee work information.
@@ -256,12 +318,23 @@ def switch_work_type():
request.approved = True
request.work_type_changed = True
request.save()
- bot = User.objects.filter(username='Horilla Bot').first()
+ bot = User.objects.filter(username="Horilla Bot").first()
if bot is not None:
employee = request.employee_id
- notify.send(bot,recipient=employee.employee_user_id,verb="Work Type Changes notification",icon="swap-horizontal",redirect="/employee/employee-profile")
+ notify.send(
+ bot,
+ recipient=employee.employee_user_id,
+ verb="Work Type Changes notification",
+ verb_ar="إخطار تغييرات نوع العمل",
+ verb_de="Benachrichtigung über Änderungen des Arbeitstyps",
+ verb_es="Notificación de cambios de tipo de trabajo",
+ verb_fr="Notification de changement de type de travail",
+ icon="swap-horizontal",
+ redirect="/employee/employee-profile",
+ )
return
+
def undo_work_type():
"""
This method undo previous employees work type information regards to the work type request
@@ -269,9 +342,15 @@ def undo_work_type():
from base.models import WorkTypeRequest
from django.contrib.auth.models import User
- today =date.today()
+ today = date.today()
# here will get all the active work type requests
- work_type_requests = WorkTypeRequest.objects.filter(canceled=False,approved=True,requested_till__lt=today,is_active=True,work_type_changed=True)
+ work_type_requests = WorkTypeRequest.objects.filter(
+ canceled=False,
+ approved=True,
+ requested_till__lt=today,
+ is_active=True,
+ work_type_changed=True,
+ )
for request in work_type_requests:
work_info = request.employee_id.employee_work_info
# updating employee work information's work type to previous work type
@@ -280,18 +359,28 @@ def undo_work_type():
# making the instance is in-active
request.is_active = False
request.save()
- bot = User.objects.filter(username='Horilla Bot').first()
+ bot = User.objects.filter(username="Horilla Bot").first()
if bot is not None:
employee = request.employee_id
- notify.send(bot,recipient=employee.employee_user_id,verb="Work type changes notification, Requested date expired.",icon="swap-horizontal",redirect="/employee/employee-profile")
+ notify.send(
+ bot,
+ recipient=employee.employee_user_id,
+ verb="Work type changes notification, Requested date expired.",
+ verb_ar="إعلام بتغيير نوع العمل ، انتهاء صلاحية التاريخ المطلوب.",
+ verb_de="Benachrichtigung über Änderungen des Arbeitstyps, angefordertes Datum abgelaufen.",
+ verb_es="Notificación de cambios de tipo de trabajo, fecha solicitada vencida.",
+ verb_fr="Notification de changement de type de travail, la date demandée a expiré.",
+ icon="swap-horizontal",
+ redirect="/employee/employee-profile",
+ )
return
scheduler = BackgroundScheduler()
-scheduler.add_job(rotate_shift, 'interval', seconds=10)
-scheduler.add_job(rotate_work_type, 'interval', seconds=10)
-scheduler.add_job(switch_shift, 'interval', seconds=10)
-scheduler.add_job(undo_shift, 'interval', seconds=10)
-scheduler.add_job(switch_work_type, 'interval', seconds=10)
-scheduler.add_job(undo_work_type, 'interval', seconds=10)
-scheduler.start()
+scheduler.add_job(rotate_shift, "interval", seconds=10)
+scheduler.add_job(rotate_work_type, "interval", seconds=10)
+scheduler.add_job(switch_shift, "interval", seconds=10)
+scheduler.add_job(undo_shift, "interval", seconds=10)
+scheduler.add_job(switch_work_type, "interval", seconds=10)
+scheduler.add_job(undo_work_type, "interval", seconds=10)
+scheduler.start()
diff --git a/base/translator.py b/base/translator.py
index d0e5ab7ec..7e8dcd1ba 100644
--- a/base/translator.py
+++ b/base/translator.py
@@ -58,6 +58,37 @@ _("September"),
_("October"),
_("November"),
_("December"),
+_("One time date"),
+_("Is condition based"),
+_("Is taxable"),
+_("Is fixed"),
+_("Value"),
+_("If choice"),
+_("Is tax"),
+_("If amount"),
+_("If condition"),
+_("Employer rate"),
+_("Contract name"),
+_("Contract start date"),
+_("Contract end date"),
+_("Wage type"),
+_("Calculate daily leave amount"),
+_("Deduction for one leave amount"),
+_("Deduct leave from basic pay"),
+_("Job role"),
+_("Work type"),
+_("Pay frequency"),
+_("Filing status"),
+_("Contract status"),
+_("Contract document"),
+_("Is tax"),
+_("Update compensation"),
+_("Is pretax"),
+_("DASHBOARD"),
+_("SHIFT REQUESTS"),
+_("WORK TYPE REQUESTS"),
+_("ATTENDANCE"),
+_("ASSET"),
_(),
_(),
_(),
@@ -66,23 +97,3 @@ _(),
_(),
_(),
_(),
-_(),
-_(),
-_(),
-_(),
-_(),
-_(),
-_(),
-_(),
-_(),
-_(),
-_(),
-_(),
-_(),
-_(),
-_(),
-_(),
-_(),
-_(),
-_(),
-_(),
\ No newline at end of file
diff --git a/base/views.py b/base/views.py
index ccd1cd740..8a3f65cdf 100644
--- a/base/views.py
+++ b/base/views.py
@@ -1,45 +1,100 @@
+"""
+views.py
+
+This module is used to map url pattens with django views or methods
+"""
+import uuid
+import json
+from notifications.models import Notification
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 _
+from django.contrib import messages
+from django.contrib.auth import authenticate, login, logout
+from django.contrib.auth.models import Group, User, Permission
+from notifications.signals import notify
+from horilla.decorators import permission_required, login_required, manager_can_enter
+from horilla.settings import EMAIL_HOST_USER
+from employee.models import Employee
+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,
+ RotatingShift,
+ ShiftRequest,
+ WorkTypeRequest,
+)
+from base.filters import (
+ ShiftRequestFilter,
+ WorkTypeRequestFilter,
+ RotatingShiftAssignFilters,
+ RotatingWorkTypeAssignFilter,
+)
+from base.methods import choosesubordinates, filtersubordinates, sortby
-
-def custom404(request,exception):
-
- return render(request,'404.html')
+def custom404(request, exception):
+ """
+ Custom 404 method
+ """
+ return render(request, "404.html")
# 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
+ 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
+ employee_workinfo_manager = (
+ instance.employee_id.employee_work_info.reporting_manager_id
+ )
except Exception:
- return HttpResponse('This Employee Dont Have any work information')
+ return HttpResponse("This Employee Dont Have any work information")
return manager == employee_workinfo_manager
def paginator_qry(qryset, page_number):
+ """
+ Common paginator method
+ """
paginator = Paginator(qryset, 50)
qryset = paginator.get_page(page_number)
return qryset
@@ -47,35 +102,35 @@ def paginator_qry(qryset, page_number):
def login_user(request):
"""
- This method is used render login template and authenticate user
+ This method is used render login template and authenticate user
"""
- if request.method == 'POST':
- username = request.POST['username']
- password = request.POST['password']
+ 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')
+ 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')
+ 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:
+ Args:
form: django forms instance
"""
- queryset = form.fields['employee_id'].queryset
+ 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)
+ form.fields["employee_id"].queryset = queryset
+ return form
reset_ids = []
@@ -85,9 +140,9 @@ def forgot_password(request):
"""
This method is used to send the reset password link to the employee email
"""
- if request.method == 'POST':
+ if request.method == "POST":
id = str(uuid.uuid4())
- username = request.POST['email']
+ 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()
@@ -95,25 +150,31 @@ def forgot_password(request):
if employee.email is not None:
send_link(employee, request, id, user)
else:
- messages.error(request, _('No email found.'))
+ messages.error(request, _("No email found."))
else:
- messages.error(request, 'User not found')
- return render(request, 'forgot_password.html')
+ 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})
+ 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)
+ 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)
@@ -123,19 +184,18 @@ 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)
+ user = next((item["user"] for item in reset_ids if item["uuid"] == uuid), None)
form = ResetPasswordForm()
- if request.method == 'POST':
+ 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')
+ 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})
+ return HttpResponse("Link Expired...")
+ return render(request, "reset_password.html", {"form": form})
def logout_user(request):
@@ -144,27 +204,30 @@ def logout_user(request):
"""
if request.user:
logout(request)
- return redirect('/login')
+ return redirect("/login")
@login_required
def home(request):
+ """
+ This method is used to render index page
+ """
if len(EmployeeShiftDay.objects.all()) == 0:
days = (
- ('monday', 'Monday'),
- ('tuesday', 'Tuesday'),
- ('wednesday', 'Wednesday'),
- ('thursday', 'Thursday'),
- ('friday', 'Friday'),
- ('saturday', 'Saturday'),
- ('sunday', 'Sunday'),
+ ("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')
+ return render(request, "index.html")
@login_required
@@ -172,32 +235,32 @@ def common_settings(request):
"""
This method is used to render setting page template
"""
- return render(request, 'settings.html')
+ return render(request, "settings.html")
@login_required
-@permission_required('add_group')
+@permission_required("add_group")
def user_group_create(request):
"""
- This method is used to create user permission group
+ This method is used to create user permission group
"""
form = UserGroupForm()
groups = Group.objects.all()
- if request.method == 'POST':
+ if request.method == "POST":
form = UserGroupForm(request.POST)
if form.is_valid():
form.save()
form = UserGroupForm()
-
- messages.success(request, _('User group created.'))
+
+ messages.success(request, _("User group created."))
return redirect(user_group_create)
- return render(request, 'base/auth/group.html', {'form': form, 'groups': groups})
+ return render(request, "base/auth/group.html", {"form": form, "groups": groups})
@login_required
-@permission_required('add_group')
+@permission_required("add_group")
def group_assign(request):
"""
This method is used to assign user group to the users.
@@ -208,42 +271,50 @@ def group_assign(request):
form = AssignUserGroup(request.POST)
if form.is_valid():
form.save()
- messages.success(request, _('User group assigned.'))
+ 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'))})
+ return render(
+ request,
+ "base/auth/group_assign.html",
+ {"form": form, "groups": paginator_qry(groups, request.GET.get("page"))},
+ )
@login_required
-@permission_required('view_group')
+@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')
+ 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})
+ 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')
+@permission_required("base.view_group")
def user_group_view(request):
"""
- This method is used to render template for view all groups
+ This method is used to render template for view all groups
"""
- search = ''
- if request.GET.get('search') is not None:
- search = request.GET['search']
+ 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})
+ return render(request, "base/auth/group_assign.html", {"data": user_group})
@login_required
-@permission_required('change_group')
-@require_http_methods(['POST'])
+@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.
@@ -254,12 +325,12 @@ def user_group_permission_remove(request, pid, gid):
group = Group.objects.get(id=1)
permission = Permission.objects.get(id=2)
group.permissions.remove(permission)
- return HttpResponseRedirect(request. META. get('HTTP_REFERER', '/'))
+ return HttpResponseRedirect(request.META.get("HTTP_REFERER", "/"))
@login_required
-@permission_required('change_group')
-@require_http_methods(['POST'])
+@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.
@@ -270,11 +341,11 @@ def group_remove_user(request, uid, gid):
group = Group.objects.get(id=gid)
user = User.objects.get(id=uid)
group.user_set.remove(user)
- return HttpResponseRedirect(request. META. get('HTTP_REFERER', '/'))
+ return HttpResponseRedirect(request.META.get("HTTP_REFERER", "/"))
@login_required
-@permission_required('change_group')
+@permission_required("change_group")
def user_group_update(request, id):
"""
This method is used to render updating form template for user permission group
@@ -283,20 +354,20 @@ def user_group_update(request, id):
"""
group = Group.objects.get(id=id)
form = UserGroupForm(instance=group)
- if request.method == 'POST':
+ if request.method == "POST":
form = UserGroupForm(request.POST, instance=group)
if form.is_valid():
form.save()
- messages.success(request, _('User group updated.'))
+ 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})
+ return render(request, "base/auth/group.html", {"form": form, "groups": groups})
@login_required
-@permission_required('base.delete_group')
-@require_http_methods(['POST'])
+@permission_required("base.delete_group")
+@require_http_methods(["POST"])
def user_group_delete(request, id):
"""
This method is used to delete user group
@@ -306,37 +377,38 @@ def user_group_delete(request, id):
"""
try:
user_group = Group.objects.get(id=id).delete()
- messages.success(request, _('User group deleted.'))
+ 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')
-
+ messages.error(request, _("You cannot delete this user group."))
+ return redirect("/settings/user-group-create")
@login_required
-@permission_required('base.add_company')
+@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
+ 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':
+ 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!'))
+
+ messages.success(request, _("Company has been created successfully!"))
return redirect(company_create)
- return render(request, 'base/company/company.html', {'form': form, 'companies': companies})
+ return render(
+ request, "base/company/company.html", {"form": form, "companies": companies}
+ )
@login_required
-@permission_required('base.change_company')
+@permission_required("base.change_company")
def company_update(request, id):
"""
This method is used to update company
@@ -347,18 +419,20 @@ def company_update(request, id):
companies = Company.objects.all()
company = Company.objects.get(id=id)
form = CompanyForm(instance=company)
- if request.method == 'POST':
+ if request.method == "POST":
form = CompanyForm(request.POST, request.FILES, instance=company)
if form.is_valid():
form.save()
- messages.success(request, _('Company updated'))
+ messages.success(request, _("Company updated"))
return redirect(company_create)
- return render(request, 'base/company/company.html', {'form': form, 'companies': companies})
+ return render(
+ request, "base/company/company.html", {"form": form, "companies": companies}
+ )
@login_required
-@permission_required('base.base.delete_company')
-@require_http_methods(['POST'])
+@permission_required("base.base.delete_company")
+@require_http_methods(["POST"])
def company_delete(request, id):
"""
This method is used to delete company
@@ -368,57 +442,62 @@ def company_delete(request, id):
"""
try:
company = Company.objects.get(id=id).delete()
- messages.success(request, _('Company deleted.'))
+ messages.success(request, _("Company deleted."))
except Exception as e:
messages.error(request, e)
- messages.error(request, _('This company already in use'))
+ messages.error(request, _("This company already in use"))
return redirect(company_create)
-
@login_required
-@permission_required('base.add_department')
+@permission_required("base.add_department")
def department(request):
"""
- This method render renders form and template to create department
+ This method render renders form and template to create department
"""
form = DepartmentForm()
departments = Department.objects.all()
- if request.method == 'POST':
+ 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})
+ 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')
+@permission_required("base.change_department")
def department_update(request, id):
"""
This method is used to update department
args:
- id : department instance id
+ 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 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})
+ 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'])
+@permission_required("base.delete_department")
+@require_http_methods(["POST", "DELETE"])
def department_delete(request, id):
"""
This method is used to delete department instance
@@ -427,34 +506,37 @@ def department_delete(request, id):
"""
try:
departments = Department.objects.get(id=id).delete()
- messages.success(request, _('Department deleted.'))
+ messages.success(request, _("Department deleted."))
except Exception as e:
messages.error(request, e)
- messages.error(request, _('Department already in use.'))
+ messages.error(request, _("Department already in use."))
- return redirect('/settings/department-creation')
+ return redirect("/settings/department-creation")
@login_required
-@permission_required('base.add_jobposition')
+@permission_required("base.add_jobposition")
def job_position(request):
"""
- This method is used to create job position
+ This method is used to create job position
"""
departments = Department.objects.all()
form = JobPositionForm()
- if request.method == 'POST':
+ 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})
+ 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')
+@permission_required("base.change_jobposition")
def job_position_update(request, id):
"""
This method is used to update job position
@@ -465,56 +547,60 @@ def job_position_update(request, 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 request.method == "POST":
+ form = JobPositionForm(request.POST, instance=job_position)
if form.is_valid():
form.save()
- messages.success(request, _('Job position updated.'))
+ 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})
+ return render(
+ request,
+ "base/job_position/job_position.html",
+ {"form": form, "departments": departments},
+ )
@login_required
-@permission_required('base.delete_jobposition')
-@require_http_methods(['POST'])
+@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
+ args:
+ id : job position id
"""
try:
job_position = JobPosition.objects.get(id=id).delete()
- messages.success(request, _('Job Position Deleted.'))
+ 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')
+ messages.error(request, _("This job position already in use."))
+ return redirect("/settings/job-position-creation")
@login_required
-@permission_required('base.add_jobrole')
+@permission_required("base.add_jobrole")
def job_role_create(request):
"""
- This method is used to create job role.
+ This method is used to create job role.
"""
form = JobRoleForm()
jobs = JobPosition.objects.all()
- if request.method == 'POST':
+ 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})
+
+ 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')
+@permission_required("base.change_jobrole")
def job_role_update(request, id):
"""
This method is used to update job role instance
@@ -527,55 +613,59 @@ def job_role_update(request, id):
jobs = JobPosition.objects.all()
form = JobRoleForm(instance=job_role)
- if request.method == 'POST':
+ 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})
+ 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'])
+@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
+ id : job role instance id
"""
try:
job_role = JobRole.objects.get(id=id).delete()
- messages.success(request, _('Job Role Deleted.'))
+ 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')
-
+ messages.error(request, _("This job role already in use."))
+ return redirect("/settings/job-role-create")
@login_required
-@permission_required('base.add_worktype')
+@permission_required("base.add_worktype")
def work_type_create(request):
"""
- This method is used to create work type
+ This method is used to create work type
"""
form = WorkTypeForm()
work_types = WorkType.objects.all()
- if request.method == 'POST':
+ 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})
+
+ 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')
+@permission_required("base.change_worktype")
def work_type_update(request, id):
"""
This method is used to update work type instance
@@ -587,54 +677,62 @@ def work_type_update(request, id):
work_type = WorkType.objects.get(id=id)
work_types = WorkType.objects.all()
form = WorkTypeForm(instance=work_type)
- if request.method == 'POST':
+ if request.method == "POST":
form = WorkTypeForm(request.POST, instance=work_type)
if form.is_valid():
form.save()
- messages.success(request, _('Work type updated.'))
+ 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})
+ 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'])
+@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
+ id : work type instance id
"""
try:
work_type = WorkType.objects.get(id=id).delete()
- messages.success(request, _('Work type deleted.'))
+ 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')
+ messages.error(request, _("This work type already in use."))
+ return redirect("/settings/work-type-create")
@login_required
-@permission_required('base.add_rotatingworktype')
+@permission_required("base.add_rotatingworktype")
def rotating_work_type_create(request):
"""
- This method is used to create rotating work type .
+ This method is used to create rotating work type .
"""
form = RotatingWorkTypeForm()
- if request.method == 'POST':
+ if request.method == "POST":
form = RotatingWorkTypeForm(request.POST)
if form.is_valid():
form.save()
form = RotatingWorkTypeForm()
-
- messages.success(request, _('Rotating work type created.'))
+
+ 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()})
+ 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')
+@permission_required("base.change_rotatingworktype")
def rotating_work_type_update(request, id):
"""
This method is used to update rotating work type instance.
@@ -645,239 +743,311 @@ def rotating_work_type_update(request, id):
rotating_work_type = RotatingWorkType.objects.get(id=id)
form = RotatingWorkTypeForm(instance=rotating_work_type)
- if request.method == 'POST':
+ 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.'))
+ 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()})
+ 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'])
+@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
+ 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.'))
+ 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')
-
+ 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')
+@manager_can_enter("base.view_rotatingworktypeassign")
def rotating_work_type_assign(request):
"""
- This method is used to assign rotating work type to employee users
+ This method is used to assign rotating work type to employee users
"""
filter = RotatingWorkTypeAssignFilter(
- queryset=RotatingWorkTypeAssign.objects.filter(is_active=True))
+ queryset=RotatingWorkTypeAssign.objects.filter(is_active=True)
+ )
rwork_type_assign = filter.qs
rwork_type_assign = filtersubordinates(
- request, rwork_type_assign, 'base.view_rotatingworktypeassign')
+ 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')), })
+ 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')
+@manager_can_enter("base.add_rotatingworktypeassign")
def rotating_work_type_assign_add(request):
+ """
+ This method is used to assign rotating work type
+ """
form = RotatingWorkTypeAssignForm()
- form = choosesubordinates(request, form, 'base.add_rotatingworktypeassign')
- if request.method == 'POST':
+ form = choosesubordinates(request, form, "base.add_rotatingworktypeassign")
+ if request.method == "POST":
form = RotatingWorkTypeAssignForm(request.POST)
- form = choosesubordinates(
- request, form, 'base.add_rotatingworktypeassign')
+ 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')
+ 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")
+ notify.send(
+ request.user.employee_get,
+ recipient=users,
+ verb="You are added to rotating work type",
+ verb_ar="تمت إضافتك إلى نوع العمل المتناوب",
+ verb_de="Sie werden zum rotierenden Arbeitstyp hinzugefügt",
+ verb_es="Se le agrega al tipo de trabajo rotativo",
+ verb_fr="Vous êtes ajouté au type de travail rotatif",
+ icon="infinite",
+ redirect="/employee/rotating-work-type-assign",
+ )
- messages.success(request, _('Rotating work type assigned.'))
+ 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') + '')
- return render(request, 'base/rotating_work_type/htmx/rotating_work_type_assign_form.html', {'form': form})
+ request,
+ "base/rotating_work_type/htmx/rotating_work_type_assign_form.html",
+ {"form": form},
+ )
+ return HttpResponse(
+ response.content.decode("utf-8") + ""
+ )
+ return render(
+ request,
+ "base/rotating_work_type/htmx/rotating_work_type_assign_form.html",
+ {"form": form},
+ )
@login_required
-@manager_can_enter('base.view_rotatingworktypeassign')
+@manager_can_enter("base.view_rotatingworktypeassign")
def rotating_work_type_assign_view(request):
"""
- This method renders template to view rotating work type objects
+ 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:
+ 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,
- })
+ 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')
+@manager_can_enter("base.change_rotatingworktypeassign")
def rotating_work_type_assign_update(request, id):
"""
- This method is used to update rotating work type instance
+ 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(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')
+ 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.'))
+ 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') + '')
- return render(request, 'base/rotating_work_type/htmx/rotating_work_type_assign_update_form.html', {'update_form': form})
+ request,
+ "base/rotating_work_type/htmx/rotating_work_type_assign_update_form.html",
+ {"update_form": form},
+ )
+ return HttpResponse(
+ response.content.decode("utf-8") + ""
+ )
+ 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')
+@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)
+ employees_rwork_types = RotatingWorkTypeAssign.objects.filter(
+ is_active=True, employee_id=rwork_type.employee_id
+ )
flag = False
- if len(employees_rwork_types) < 1 :
+ if len(employees_rwork_types) < 1:
rwork_type.is_active = True
flag = True
- message = _('un-archived')
- if request.GET.get('is_active') == 'False':
+ message = _("un-archived")
+ if request.GET.get("is_active") == "False":
rwork_type.is_active = False
- message = _('archived')
- flag = True
+ message = _("archived")
+ flag = True
rwork_type.save()
if flag:
- messages.success(request, _('Rotating shift assign is {message}').format(message=message))
+ 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', '/'))
+ messages.error(request, "Already on record is active")
+ return HttpResponseRedirect(request.META.get("HTTP_REFERER", "/"))
@login_required
-@manager_can_enter('base.change_rotatingworktypeassign')
+@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 = request.POST["ids"]
ids = json.loads(ids)
is_active = True
- message = _('un-archived')
- if request.GET.get('is_active') == 'False':
+ message = _("un-archived")
+ if request.GET.get("is_active") == "False":
is_active = False
- message = _('archived')
+ 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)
+ 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
+ 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))
+ 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,)
+ request,
+ _("Rotating shift for {employee_id} is already exists").format(
+ employee_id=rwork_type_assign.employee_id,
+ ),
)
- return JsonResponse({'message': 'Success'})
+ return JsonResponse({"message": "Success"})
@login_required
-@permission_required('base.delete_rotatingworktypeassign')
+@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 = 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))
+ 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,
+ _("You cannot delete {rwork_type_assign}").format(
+ rwork_type_assign=rwork_type_assign
+ ),
+ )
messages.error(request, e)
- return JsonResponse({'message': 'Success'})
+ return JsonResponse({"message": "Success"})
@login_required
-@permission_required('base.delete_rotatingworktypeassign')
-@require_http_methods(['POST'])
+@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
+ 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.'))
+ 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')
+ messages.error(request, _("You cannot delete this rotating work type."))
+ return redirect("/employee/rotating-work-type-assign")
@login_required
-@permission_required('base.add_employeetype')
+@permission_required("base.add_employeetype")
def employee_type_create(request):
"""
- This method is used to create employee type
+ This method is used to create employee type
"""
form = EmployeeTypeForm()
types = EmployeeType.objects.all()
- if request.method == 'POST':
+ 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})
+ 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')
+@permission_required("base.change_employeetype")
def employee_type_update(request, id):
"""
This method is used to update employee type instance
@@ -889,36 +1059,39 @@ def employee_type_update(request, id):
employee_type = EmployeeType.objects.get(id=id)
employee_types = EmployeeType.objects.all()
form = EmployeeTypeForm(instance=employee_type)
- if request.method == 'POST':
+ if request.method == "POST":
form = EmployeeTypeForm(request.POST, instance=employee_type)
if form.is_valid():
form.save()
- messages.success(request, _('Employee type updated.'))
+ 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})
+ 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'])
+@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
+ id : employee type id
"""
try:
employee_type = EmployeeType.objects.get(id=id).delete()
- messages.success(request, _('Employee type deleted.'))
+ 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')
-
+ messages.error(request, _("This Employee type already in use."))
+ return redirect("/settings/employee-type-create")
@login_required
-@permission_required('base.add_employeeshift')
+@permission_required("base.add_employeeshift")
def employee_shift_create(request):
"""
This method is used to create employee shift
@@ -926,19 +1099,20 @@ def employee_shift_create(request):
form = EmployeeShiftForm()
shifts = EmployeeShift.objects.all()
- if request.method == 'POST':
+ 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})
+ 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')
+@permission_required("base.change_employeeshiftupdate")
def employee_shift_update(request, id):
"""
This method is used to update employee shift instance
@@ -949,137 +1123,150 @@ def employee_shift_update(request, 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 request.method == "POST":
+ form = EmployeeShiftForm(request.POST, instance=employee_shift)
if form.is_valid:
form.save()
- messages.success(request, _('Shift updated'))
+ messages.success(request, _("Shift updated"))
return redirect(employee_shift_create)
- return render(request, 'base/shift/shift.html', {'form': form, 'shifts': employee_shifts})
+ return render(
+ request, "base/shift/shift.html", {"form": form, "shifts": employee_shifts}
+ )
-@login_required
-@permission_required('base.delete_employeeshift')
-@require_http_methods(['POST'])
+@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
+ id : employee shift instance id
"""
try:
employee_shift = EmployeeShift.objects.get(id=id).delete()
- messages.success(request, _('Employee shift deleted.'))
+ 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')
-
+ messages.error(request, _("This shift already in use."))
+ return redirect("/settings/employee-shift-create")
@login_required
-@permission_required('base.add_employeeshiftschedule')
+@permission_required("base.add_employeeshiftschedule")
def employee_shift_schedule_create(request):
"""
- This method is used to create schedule for shift
+ This method is used to create schedule for shift
"""
form = EmployeeShiftScheduleForm()
shifts = EmployeeShift.objects.all()
- if request.method == 'POST':
+ 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})
+ 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')
+@permission_required("base.change_employeeshiftschedule")
def employee_shift_schedule_update(request, id):
"""
- This method is used to update employee shift instance
+ This method is used to update employee shift instance
args:
- id : employee shift instance id
+ 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':
+ if request.method == "POST":
form = EmployeeShiftScheduleUpdateForm(
- request.POST, instance=employee_shift_schedule)
+ request.POST, instance=employee_shift_schedule
+ )
if form.is_valid():
form.save()
- messages.success(request, _('Shift schedule created.'))
+ messages.success(request, _("Shift schedule created."))
return redirect(employee_shift_schedule_create)
- return render(request, 'base/shift/schedule.html', {'form': form, 'shifts': shifts})
+ return render(request, "base/shift/schedule.html", {"form": form, "shifts": shifts})
@login_required
-@permission_required('base.delete_employeeshiftschedule')
-@require_http_methods(['POST'])
+@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
+ id : employee shift instance id
"""
try:
- employee_shift_schedule = EmployeeShiftSchedule.objects.get(
- id=id).delete()
- messages.success(request, _('Shift schedule deleted.'))
+ 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')
-
+ messages.error(request, _("You cannot delete this schedule"))
+ return redirect("/settings/employee-shift-schedule-create")
@login_required
-@permission_required('base.add_rotatingshift')
+@permission_required("base.add_rotatingshift")
def rotating_shift_create(request):
"""
- This method is used to create rotating shift
+ This method is used to create rotating shift
"""
form = RotatingShiftForm()
- if request.method == 'POST':
+ 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()})
+ 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')
+@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
+ id : rotating shift instance id
"""
rotating_shift = RotatingShift.objects.get(id=id)
form = RotatingShiftForm(instance=rotating_shift)
- if request.method == 'POST':
+ 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'))})
+ 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'])
+@permission_required("base.delete_rotatingshift")
+@require_http_methods(["POST"])
def rotating_shift_delete(request, id):
"""
This method is used to delete rotating shift
@@ -1089,81 +1276,113 @@ def rotating_shift_delete(request, id):
"""
try:
rotating_shift = RotatingShift.objects.get(id=id).delete()
- messages.success(request, _('Rotating shift deleted.'))
+ messages.success(request, _("Rotating shift deleted."))
except Exception as e:
messages.error(request, e)
- messages.error(request, _('You cannot delete this rotating shift'))
+ messages.error(request, _("You cannot delete this rotating shift"))
return redirect(rotating_shift_create)
@login_required
-@manager_can_enter('base.view_rotatingshiftassign')
+@manager_can_enter("base.view_rotatingshiftassign")
def rotating_shift_assign(request):
"""
- This method is used to assign rotating shift
+ This method is used to assign rotating shift
"""
form = RotatingShiftAssignForm()
- form = choosesubordinates(request, form, 'base.add_rotatingshiftassign')
+ form = choosesubordinates(request, form, "base.add_rotatingshiftassign")
filter = RotatingShiftAssignFilters(
- queryset=RotatingShiftAssign.objects.filter(is_active=True))
+ queryset=RotatingShiftAssign.objects.filter(is_active=True)
+ )
rshift_assign = filter.qs
rshift_assign = filtersubordinates(
- request, rshift_assign, 'base.view_rotatingshiftassign')
+ 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')),
- })
+ 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')
+@manager_can_enter("base.add_rotatingshiftassign")
def rotating_shift_assign_add(request):
+ """
+ This method is used to add rotating shift assign
+ """
form = RotatingShiftAssignForm()
- form = choosesubordinates(request, form, 'base.add_rotatingshiftassign')
- if request.method == 'POST':
+ form = choosesubordinates(request, form, "base.add_rotatingshiftassign")
+ if request.method == "POST":
form = RotatingShiftAssignForm(request.POST)
- form = choosesubordinates(
- request, form, 'base.add_rotatingshiftassign')
+ 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')
+ 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")
+ notify.send(
+ request.user.employee_get,
+ recipient=users,
+ verb="You are added to rotating shift",
+ verb_ar="تمت إضافتك إلى وردية الدورية",
+ verb_de="Sie werden der rotierenden Arbeitsschicht hinzugefügt",
+ verb_es="Estás agregado a turno rotativo",
+ verb_fr="Vous êtes ajouté au quart de travail rotatif",
+ icon="infinite",
+ redirect="/employee/rotating-shift-assign",
+ )
- messages.success(request, _('Rotating shift assigned.'))
+ 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') + '')
- return render(request, 'base/rotating_shift/htmx/rotating_shift_assign_form.html', {'form': form})
+ request,
+ "base/rotating_shift/htmx/rotating_shift_assign_form.html",
+ {"form": form},
+ )
+ return HttpResponse(
+ response.content.decode("utf-8") + ""
+ )
+ return render(
+ request,
+ "base/rotating_shift/htmx/rotating_shift_assign_form.html",
+ {"form": form},
+ )
@login_required
-@manager_can_enter('base.view_rotatingshiftassign')
+@manager_can_enter("base.view_rotatingshiftassign")
def rotating_shift_assign_view(request):
"""
- This method renders all instance of rotating shift assign to a template
+ This method renders all instance of rotating shift assign to a template
"""
- previous_data = request.environ['QUERY_STRING']
+ previous_data = request.environ["QUERY_STRING"]
rshift_assign = RotatingShiftAssignFilters(request.GET).qs
- if request.GET.get('is_active') is None:
+ 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
- })
+ 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')
+@manager_can_enter("base.change_rotatingshiftassign")
def rotating_shift_assign_update(request, id):
"""
This method is used to update rotating shift assign instance
@@ -1173,63 +1392,82 @@ def rotating_shift_assign_update(request, 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 = 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')
+ 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.'))
+ 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') + '')
- return render(request, 'base/rotating_shift/htmx/rotating_shift_assign_update_form.html', {'update_form': form, })
+ request,
+ "base/rotating_shift/htmx/rotating_shift_assign_update_form.html",
+ {
+ "update_form": form,
+ },
+ )
+ return HttpResponse(
+ response.content.decode("utf-8") + ""
+ )
+ return render(
+ request,
+ "base/rotating_shift/htmx/rotating_shift_assign_update_form.html",
+ {
+ "update_form": form,
+ },
+ )
@login_required
-@manager_can_enter('base.change_rotatingshiftassign')
+@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)
+ 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':
+ message = _("un-archived")
+ if request.GET.get("is_active") == "False":
rshift.is_active = False
flag = True
- message = _('archived')
+ message = _("archived")
rshift.save()
if flag:
- messages.success(request, _('Rotating shift assign is {message}').format(message=message))
+ 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', '/'))
+ messages.error(request, "Already on record is active")
+ return HttpResponseRedirect(request.META.get("HTTP_REFERER", "/"))
@login_required
-@manager_can_enter('base.change_rotatingshiftassign')
+@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 = request.POST["ids"]
ids = json.loads(ids)
is_active = True
- message =_('un-archived')
- if request.GET.get('is_active') == 'False':
+ message = _("un-archived")
+ if request.GET.get("is_active") == "False":
is_active = False
- message =_('archived')
+ 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)
+ 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
@@ -1237,36 +1475,53 @@ def rotating_shift_assign_bulk_archive(request):
rshift_assign.save()
if not flag:
messages.success(
- request, _('Rotating shift for {employee} is {message}').format(employee=rshift_assign.employee_id,message=message))
+ 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)
+ request,
+ _("Rotating shift for {employee} is already exists").format(
+ employee=rshift_assign.employee_id
+ ),
)
- return JsonResponse({'message': 'Success'})
+ return JsonResponse({"message": "Success"})
@login_required
-@permission_required('base.delete_rotatingshiftassign')
+@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 = 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))
+ 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,
+ _("You cannot delete {rshift_assign}").format(
+ rshift_assign=rshift_assign
+ ),
+ )
messages.error(request, e)
- return JsonResponse({'message': 'Success'})
+ return JsonResponse({"message": "Success"})
@login_required
-@permission_required('base.delete_rotatingshiftassign')
-@require_http_methods(['POST'])
+@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
@@ -1274,18 +1529,16 @@ def rotating_shift_assign_delete(request, id):
id : rotating shift assign instance id
"""
try:
- rotating_shift_assign_obj = RotatingShiftAssign.objects.get(
- id=id).delete()
- messages.success(request, _('Rotating shift assign deleted.'))
+ 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')
+ messages.error(request, _("You cannot delete this rotating shift assign."))
+ return redirect("/employee/rotating-shift-assign")
@login_required
-@permission_required('add_permission')
+@permission_required("add_permission")
def employee_permission_assign(request):
"""
This method is used to assign permissions to employee user
@@ -1294,68 +1547,92 @@ def employee_permission_assign(request):
employees = Employee.objects.all()
permissions = Permission.objects.all()
form = AssignPermission()
- if request.method == 'POST':
+ if request.method == "POST":
form = AssignPermission(request.POST)
if form.is_valid():
form.save()
- messages.success(request, _('Employee permission assigned.'))
+ 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}
+ return render(
+ request,
+ "base/auth/permission.html",
+ {"employees": paginator_qry(employees, request.GET.get("page")), "form": form},
)
@login_required
-@require_http_methods(['POST'])
+@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_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}'})
+ 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
+ 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')
+ request, WorkTypeRequest.objects.all(), "base.add_worktyperequest"
+ )
work_type_requests = work_type_requests | WorkTypeRequest.objects.filter(
- employee_id=employee)
+ employee_id=employee
+ )
f = WorkTypeRequestFilter()
form = WorkTypeRequestForm()
- form = choosesubordinates(request, form, 'base.add_worktypereqeust',)
+ 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})
+ 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
@@ -1364,43 +1641,76 @@ 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']
+ 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})
+ 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 .
+ This method is used to create request for work type .
"""
form = WorkTypeRequestForm()
- 'canceled'
- form = choosesubordinates(request, form, 'base.add_worktyperequest',)
+ "canceled"
+ form = choosesubordinates(
+ request,
+ form,
+ "base.add_worktyperequest",
+ )
form = include_employee_instance(request, form)
f = WorkTypeRequestFilter()
- if request.method == 'POST':
+ if request.method == "POST":
form = WorkTypeRequestForm(request.POST)
- form = choosesubordinates(request, form, 'base.add_worktyperequest',)
+ 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})
+ 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:
+ 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}",
+ verb_ar=f"لديك طلب نوع وظيفة جديد للتحقق من {instance.employee_id}",
+ verb_de=f"Sie haben eine neue Arbeitstypanfrage zur Validierung für {instance.employee_id}",
+ verb_es=f"Tiene una nueva solicitud de tipo de trabajo para validar para {instance.employee_id}",
+ verb_fr=f"Vous avez une nouvelle demande de type de travail à valider pour {instance.employee_id}",
+ icon="information",
+ redirect="/shift-requests/shift-request-view",
+ )
+ except Exception as error:
pass
- messages.success(request, _('Work type request added.'))
- return HttpResponse(response.content.decode('utf-8') + '')
+ messages.success(request, _("Work type request added."))
+ return HttpResponse(
+ response.content.decode("utf-8") + ""
+ )
- return render(request, 'work_type_request/request_form.html', {'form': form, 'f': f})
+ return render(
+ request, "work_type_request/request_form.html", {"form": form, "f": f}
+ )
@login_required
@@ -1412,88 +1722,146 @@ def work_type_request_cancel(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:
+ 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.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')
+ 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.",
+ verb_ar="تم إلغاء طلب نوع وظيفتك",
+ verb_de="Ihre Arbeitstypanfrage wurde storniert",
+ verb_es="Su solicitud de tipo de trabajo ha sido cancelada",
+ verb_fr="Votre demande de type de travail a été annulée",
+ redirect="/",
+ icon="close",
+ )
+ return HttpResponseRedirect(request.META.get("HTTP_REFERER", "/"))
+ return HttpResponse("You dont have permission")
@login_required
-@manager_can_enter('base.change_worktyperequest')
+@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 = 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:
+ 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.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', '/'))
+ 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.",
+ verb_ar="تم إلغاء طلب نوع وظيفتك.",
+ verb_de="Ihre Arbeitstypanfrage wurde storniert.",
+ verb_es="Su solicitud de tipo de trabajo ha sido cancelada.",
+ verb_fr="Votre demande de type de travail a été annulée.",
+ 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
+ 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:
-
+ 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
+ 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')
+ 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.",
+ verb_ar="تمت الموافقة على طلب نوع وظيفتك.",
+ verb_de="Ihre Arbeitstypanfrage wurde genehmigt.",
+ verb_es="Su solicitud de tipo de trabajo ha sido aprobada.",
+ verb_fr="Votre demande de type de travail a été approuvée.",
+ redirect="/",
+ icon="checkmark",
+ )
- return HttpResponseRedirect(request. META. get('HTTP_REFERER', '/'))
- return HttpResponse('You Do nt Have Permission')
+ 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
+ This method is used to approve bulk of requested work type
"""
- ids = request.POST['ids']
+ 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
- """
+ 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', '/'))
+ 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.",
+ verb_ar="تمت الموافقة على طلب نوع وظيفتك.",
+ verb_de="Ihre Arbeitstypanfrage wurde genehmigt.",
+ verb_es="Su solicitud de tipo de trabajo ha sido aprobada.",
+ verb_fr="Votre demande de type de travail a été approuvée.",
+ redirect="/",
+ icon="checkmark",
+ )
+ return HttpResponseRedirect(request.META.get("HTTP_REFERER", "/"))
@login_required
@@ -1506,29 +1874,36 @@ def work_type_request_update(request, id):
"""
work_type_request = WorkTypeRequest.objects.get(id=id)
form = WorkTypeRequestForm(instance=work_type_request)
- form = choosesubordinates(request, form, 'base.change_worktyperequest')
+ form = choosesubordinates(request, form, "base.change_worktyperequest")
form = include_employee_instance(request, form)
- if request.method == 'POST':
+ if request.method == "POST":
response = render(
- request, 'work_type_request/request_update_form.html', {'form': form, })
+ 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 = 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') + '')
+ messages.success(request, _("Request Updated Successfully"))
+ return HttpResponse(
+ response.content.decode("utf-8") + ""
+ )
- return render(request, 'work_type_request/request_update_form.html', {'form': form})
+ return render(request, "work_type_request/request_update_form.html", {"form": form})
@login_required
-@permission_required('base.delete_worktyperequest')
-@require_http_methods(['POST'])
+@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:
+ args:
id : work type request instance id
"""
@@ -1536,83 +1911,138 @@ def work_type_request_delete(request, id):
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')
+ messages.success(request, _("Work type request deleted."))
+ notify.send(
+ request.user.employee_get,
+ recipient=employee,
+ verb="Your work type request has been deleted.",
+ verb_ar="تم حذف طلب نوع وظيفتك.",
+ verb_de="Ihre Arbeitstypanfrage wurde gelöscht.",
+ verb_es="Su solicitud de tipo de trabajo ha sido eliminada.",
+ verb_fr="Votre demande de type de travail a été supprimée.",
+ 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', '/'))
+ 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'])
+@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:
+ args:
id : work type request instance id
"""
- ids = request.POST['ids']
+ 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')
+ messages.success(request, _("Work type request deleted."))
+ notify.send(
+ request.user.employee_get,
+ recipient=user,
+ verb="Your work type request has been deleted.",
+ verb_ar="تم حذف طلب نوع وظيفتك.",
+ verb_de="Ihre Arbeitstypanfrage wurde gelöscht.",
+ verb_es="Su solicitud de tipo de trabajo ha sido eliminada.",
+ verb_fr="Votre demande de type de travail a été supprimée.",
+ 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', '/'))
+ 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
+ This method is used to create shift request
"""
form = ShiftRequestForm()
- form = choosesubordinates(request, form, 'base.add_shiftrequest',)
+ form = choosesubordinates(
+ request,
+ form,
+ "base.add_shiftrequest",
+ )
f = ShiftRequestFilter()
- if request.method == 'POST':
+ if request.method == "POST":
form = ShiftRequestForm(request.POST)
- form = choosesubordinates(request, form, 'base.add_shiftrequest')
+ 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})
+ 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")
+ 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}",
+ verb_ar=f"لديك طلب وردية جديد للموافقة عليه لـ {instance.employee_id}",
+ verb_de=f"Sie müssen eine neue Schichtanfrage für {instance.employee_id} genehmigen",
+ verb_es=f"Tiene una nueva solicitud de turno para aprobar para {instance.employee_id}",
+ verb_fr=f"Vous avez une nouvelle demande de quart de travail à approuver pour {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') + '')
- return render(request, 'shift_request/request_form.html', {'form': form, 'f': f})
+ messages.success(request, _("Request Added"))
+ return HttpResponse(
+ response.content.decode("utf-8") + ""
+ )
+ 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
+ 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)
+ 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 = 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})
+ return render(
+ request,
+ "shift_request/shift_request_view.html",
+ {
+ "data": paginator_qry(shift_requests, request.GET.get("page")),
+ "f": f,
+ "form": form,
+ },
+ )
@login_required
@@ -1621,13 +2051,22 @@ 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']
+ 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})
+ 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
@@ -1635,24 +2074,31 @@ def shift_request_update(request, id):
"""
This method is used to update shift request instance
args:
- id : shift request instance id
+ 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 = choosesubordinates(request, form, "base.change_shiftrequest")
form = include_employee_instance(request, form)
- if request.method == 'POST':
+ if request.method == "POST":
response = render(
- request, 'shift_request/request_update_form.html', {'form': form, })
+ request,
+ "shift_request/request_update_form.html",
+ {
+ "form": form,
+ },
+ )
form = ShiftRequestForm(request.POST, instance=shift_request)
- form = choosesubordinates(request, form, 'base.change_shiftrequest')
+ 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') + '')
+ messages.success(request, _("Request Updated Successfully"))
+ return HttpResponse(
+ response.content.decode("utf-8") + ""
+ )
- return render(request, 'shift_request/request_update_form.html', {'form': form})
+ return render(request, "shift_request/request_update_form.html", {"form": form})
@login_required
@@ -1665,84 +2111,134 @@ def shift_request_cancel(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:
+ 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.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')
+ 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.",
+ verb_ar="تم إلغاء طلبك للوردية.",
+ verb_de="Ihr Schichtantrag wurde storniert.",
+ verb_es="Se ha cancelado su solicitud de turno.",
+ verb_fr="Votre demande de quart a été annulée.",
+ redirect="/",
+ icon="close",
+ )
- return HttpResponseRedirect(request. META. get('HTTP_REFERER', '/'))
- return HttpResponse('You cant cancel the request')
+ 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'])
+@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.
+ This method is used to cancel a bunch of shift request.
"""
- ids = request.POST['ids']
+ 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:
+ 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.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', '/'))
+ 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.",
+ verb_ar="تم إلغاء طلبك للوردية.",
+ verb_de="Ihr Schichtantrag wurde storniert.",
+ verb_es="Se ha cancelado su solicitud de turno.",
+ verb_fr="Votre demande de quart a été annulée.",
+ redirect="/",
+ icon="close",
+ )
+ return HttpResponseRedirect(request.META.get("HTTP_REFERER", "/"))
@login_required
-@manager_can_enter('base.change_shiftrequest')
+@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
+ 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:
-
+ 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
+ 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')
+ 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.",
+ verb_ar="تمت الموافقة على طلبك للوردية.",
+ verb_de="Ihr Schichtantrag wurde genehmigt.",
+ verb_es="Se ha aprobado su solicitud de turno.",
+ verb_fr="Votre demande de quart a été approuvée.",
+ 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')
+@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
+ This method is used to approve a bunch of shift request
"""
- ids = request.POST['ids']
+ 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:
+ 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
+ here the request will be approved, can send mail right here
"""
shift_request.approved = True
shift_request.canceled = False
@@ -1750,15 +2246,24 @@ def shift_request_bulk_approve(request):
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', '/'))
+ 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.",
+ verb_ar="تمت الموافقة على طلبك للوردية.",
+ verb_de="Ihr Schichtantrag wurde genehmigt.",
+ verb_es="Se ha aprobado su solicitud de turno.",
+ verb_fr="Votre demande de quart a été approuvée.",
+ redirect="/",
+ icon="checkmark",
+ )
+ return HttpResponseRedirect(request.META.get("HTTP_REFERER", "/"))
@login_required
-@permission_required('delete_shiftrequest')
-@require_http_methods(['POST'])
+@permission_required("delete_shiftrequest")
+@require_http_methods(["POST"])
def shift_request_delete(request, id):
"""
This method is used to delete shift request instance
@@ -1770,19 +2275,28 @@ def shift_request_delete(request, id):
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')
+ messages.success(request, _("Shift request deleted."))
+ notify.send(
+ request.user.employee_get,
+ recipient=user,
+ verb="Your shift request has been deleted.",
+ verb_ar="تم حذف طلب الوردية الخاص بك.",
+ verb_de="Ihr Schichtantrag wurde gelöscht.",
+ verb_es="Se ha eliminado su solicitud de turno.",
+ verb_fr="Votre demande de quart a été supprimée.",
+ 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', '/'))
+ 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'])
+@permission_required("delete_shiftrequest")
+@require_http_methods(["POST"])
def shift_request_bulk_delete(request):
"""
This method is used to delete shift request instance
@@ -1790,7 +2304,7 @@ def shift_request_bulk_delete(request):
id : shift request instance id
"""
- ids = request.POST['ids']
+ ids = request.POST["ids"]
ids = json.loads(ids)
for id in ids:
@@ -1798,58 +2312,106 @@ def shift_request_bulk_delete(request):
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.success(request, _("Shift request deleted."))
+ notify.send(
+ request.user.employee_get,
+ recipient=user,
+ verb="Your shift request has been deleted.",
+ verb_ar="تم حذف طلب الوردية الخاص بك.",
+ verb_de="Ihr Schichtantrag wurde gelöscht.",
+ verb_es="Se ha eliminado su solicitud de turno.",
+ verb_fr="Votre demande de quart a été supprimée.",
+ redirect="/",
+ icon="trash",
+ )
+ except Exception as error:
+ messages.error(request, error)
messages.error(
- request, _('You cannot delete {employee} shift request for the date {date}.').format(employee=shift_request.employee_id,date=shift_request.requested_date))
+ 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', '/'))
+ 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})
+ """
+ This method will render notification items
+ """
+ all_notifications = request.user.notifications.unread()
+ return render(
+ request,
+ "notification/notification_items.html",
+ {"notifications": all_notifications},
+ )
@login_required
def clear_notification(request):
+ """
+ This method is used to clear notification
+ """
try:
request.user.notifications.read().delete()
- messages.success(request, _('Unread notifications removed.'))
+ 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})
+ return render(
+ request,
+ "notification/notification_items.html",
+ {"notifications": notifications},
+ )
@login_required
def delete_notification(request, id):
+ """
+ This method is used to delete notification
+ """
try:
notification = request.user.notifications.get(id=id).delete()
- messages.success(request, _('Notification deleted.'))
+ 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})
+ return render(
+ request, "notification/all_notifications.html", {"notifications": notifications}
+ )
@login_required
def read_notifications(request):
+ """
+ This method is to mark as read the notification
+ """
try:
request.user.notifications.all().mark_all_as_read()
- messages.info(request, _('Notifications marked 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})
+ 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})
+ """
+ This method to render all notifications to template
+ """
+ return render(
+ request,
+ "notification/all_notifications.html",
+ {"notifications": request.user.notifications.all()},
+ )
diff --git a/employee/views.py b/employee/views.py
index eb5a6eecb..056bef0b7 100755
--- a/employee/views.py
+++ b/employee/views.py
@@ -242,9 +242,6 @@ def employee_view_update(request, obj_id):
if request.POST:
if request.POST.get("employee_first_name") is not None:
form = EmployeeForm(request.POST, instance=employee)
- print("----------")
- print(request.POST)
- print("----------")
if form.is_valid():
form.save()
messages.success(
@@ -265,6 +262,10 @@ def employee_view_update(request, obj_id):
request.user.employee_get,
recipient=instance.employee_id.employee_user_id,
verb="Your work details has been updated.",
+ verb_ar="تم تحديث تفاصيل عملك.",
+ verb_de="Ihre Arbeitsdetails wurden aktualisiert.",
+ verb_es="Se han actualizado los detalles de su trabajo.",
+ verb_fr="Vos informations professionnelles ont été mises à jour.",
redirect="/employee/employee-profile",
icon="briefcase",
)
@@ -411,7 +412,7 @@ def employee_update_personal_info(request, obj_id=None):
form = EmployeeForm(request.POST, instance=employee)
if form.is_valid():
form.save()
- if id is None:
+ if obj_id is None:
messages.success(request, _("New Employee Added."))
form = EmployeeForm(request.POST, instance=form.instance)
work_form = EmployeeWorkInformationForm(
@@ -438,7 +439,7 @@ def employee_update_personal_info(request, obj_id=None):
"""
)
- if id is None:
+ if obj_id is None:
return render(
request,
"employee/create_form/form_view.html",
@@ -563,7 +564,7 @@ def employee_card(request):
"""
previous_data = request.environ["QUERY_STRING"]
search = request.GET.get("search")
- if isinstance(search,type(None)):
+ if isinstance(search, type(None)):
search = ""
employees = filtersubordinatesemployeemodel(
request, Employee.objects.all(), "employee.view_employee"
@@ -602,7 +603,7 @@ def employee_list(request):
"""
previous_data = request.environ["QUERY_STRING"]
search = request.GET.get("search")
- if isinstance(search,type(None)):
+ if isinstance(search, type(None)):
search = ""
if request.GET.get("is_active") is None:
filter_obj = EmployeeFilter(
@@ -1140,7 +1141,7 @@ def work_info_import(request):
employee_type_obj.employee_type = employee_type
employee_type_obj.save()
manager_fname, manager_lname = "", ""
- if isinstance(reporting_manager,str) and " " in reporting_manager:
+ if isinstance(reporting_manager, str) and " " in reporting_manager:
manager_fname, manager_lname = reporting_manager.split(" ", 1)
reporting_manager_obj = Employee.objects.filter(
employee_first_name=manager_fname,
@@ -1360,8 +1361,8 @@ def dashboard_employee(request):
Active and in-active employee dashboard
"""
labels = [
- "Active",
- "In-Active",
+ _("Active"),
+ _("In-Active"),
]
employees = Employee.objects.all()
employees = filtersubordinates(request, employees, "employee.view_employee")
@@ -1386,7 +1387,7 @@ def dashboard_employee_gender(request):
"""
This method is used to filter out gender vise employees
"""
- labels = [" Male", "Female", "Others"]
+ labels = [_("Male"), _("Female"), _("Others")]
employees = Employee.objects.all()
employees = filtersubordinates(request, employees, "employee.view_employee")
diff --git a/horilla/settings.py b/horilla/settings.py
index 443bdf13a..4549845e0 100755
--- a/horilla/settings.py
+++ b/horilla/settings.py
@@ -55,6 +55,8 @@ INSTALLED_APPS = [
'onboarding',
'asset',
'attendance',
+ 'payroll',
+
'widget_tweaks',
"django_apscheduler",
@@ -184,8 +186,8 @@ LOGIN_URL = '/login'
EMAIL_USE_TLS = True
EMAIL_HOST = 'smtp.gmail.com'
EMAIL_PORT = 587
-EMAIL_HOST_USER = ''
-EMAIL_HOST_PASSWORD = ''
+EMAIL_HOST_USER = 'samplemail13456@gmail.com'
+EMAIL_HOST_PASSWORD = 'ysfkxwmjxmbmfkrr'
SIMPLE_HISTORY_REVERT_DISABLED=True
@@ -199,17 +201,17 @@ DJANGO_NOTIFICATIONS_CONFIG = {
X_FRAME_OPTIONS = 'SAMEORIGIN'
+LANGUAGE_CODE = 'en-us'
+
LANGUAGES = (
('en', 'English (US)'),
('de', 'Deutsche'),
- ('es','Spanish'),
+ ('es','Español'),
('fr','France'),
('ar', 'عربى'),
)
-LANGUAGE_CODE = 'en-us'
-
LOCALE_PATHS = [
join(BASE_DIR, 'horilla', 'locale'),
]
diff --git a/leave/models.py b/leave/models.py
index 90a4ede9b..c9209bc75 100644
--- a/leave/models.py
+++ b/leave/models.py
@@ -97,6 +97,7 @@ class Holiday(models.Model):
start_date = models.DateField()
end_date = models.DateField(null=True, blank=True)
recurring = models.BooleanField(default=False)
+ objects = models.Manager()
def __str__(self):
return self.name
@@ -109,6 +110,7 @@ class CompanyLeave(models.Model):
based_on_week = models.CharField(
max_length=100, choices=WEEKS, blank=True, null=True)
based_on_week_day = models.CharField(max_length=100, choices=WEEK_DAYS)
+ objects = models.Manager()
class Meta:
unique_together = ('based_on_week', 'based_on_week_day')
diff --git a/leave/views.py b/leave/views.py
index 6c747f654..c05605505 100644
--- a/leave/views.py
+++ b/leave/views.py
@@ -207,6 +207,10 @@ def leave_request_creation(request):
request.user.employee_get,
recipient=leave_request.employee_id.employee_work_info.reporting_manager_id.employee_user_id,
verb=f"New leave request created for {leave_request.employee_id}.",
+ verb_ar=f"تم إنشاء طلب إجازة جديد لـ {leave_request.employee_id}.",
+ verb_de=f"Neuer Urlaubsantrag für {leave_request.employee_id} erstellt.",
+ verb_es=f"Nueva solicitud de permiso creada para {leave_request.employee_id}.",
+ verb_fr=f"Nouvelle demande de congé créée pour {leave_request.employee_id}.",
icon="people-circle",
redirect="/leave/request-view",
)
@@ -309,6 +313,10 @@ def leave_request_update(request, id):
request.user.employee_get,
recipient=leave_request.employee_id.employee_work_info.reporting_manager_id.employee_user_id,
verb=f"Leave request updated for {leave_request.employee_id}.",
+ verb_ar=f"تم تحديث طلب الإجازة لـ {leave_request.employee_id}.",
+ verb_de=f"Urlaubsantrag für {leave_request.employee_id} aktualisiert.",
+ verb_es=f"Solicitud de permiso actualizada para {leave_request.employee_id}.",
+ verb_fr=f"Demande de congé mise à jour pour {leave_request.employee_id}.",
icon="people-circle",
redirect="/leave/request-view",
)
@@ -380,6 +388,10 @@ def leave_request_approve(request, id):
request.user.employee_get,
recipient=leave_request.employee_id.employee_user_id,
verb="Your Leave request has been approved",
+ verb_ar="تمت الموافقة على طلب الإجازة الخاص بك.",
+ verb_de="Ihr Urlaubsantrag wurde genehmigt.",
+ verb_es="Se ha aprobado su solicitud de permiso.",
+ verb_fr="Votre demande de congé a été approuvée.",
icon="people-circle",
redirect="/leave/user-request-view",
)
@@ -421,6 +433,10 @@ def leave_request_cancel(request, id):
request.user.employee_get,
recipient=leave_request.employee_id.employee_user_id,
verb="Your Leave request has been cancelled",
+ verb_ar="تم إلغاء طلب الإجازة الخاص بك.",
+ verb_de="Ihr Urlaubsantrag wurde storniert.",
+ verb_es="Se ha cancelado su solicitud de permiso.",
+ verb_fr="Votre demande de congé a été annulée.",
icon="people-circle",
redirect="/leave/user-request-view",
)
@@ -481,6 +497,10 @@ def leave_assign_one(request, id):
request.user.employee_get,
recipient=employee.employee_user_id,
verb="New leave type is assigned to you",
+ verb_ar="تم تعيين نوع إجازة جديد لك.",
+ verb_de="Ihnen wurde ein neuer Urlaubstyp zugewiesen.",
+ verb_es="Se le ha asignado un nuevo tipo de permiso.",
+ verb_fr="Un nouveau type de congé vous a été attribué.",
icon="people-circle",
redirect="/leave/user-leave",
)
@@ -594,6 +614,10 @@ def leave_assign(request):
request.user.employee_get,
recipient=employee.employee_user_id,
verb="New leave type is assigned to you",
+ verb_ar="تم تعيين نوع إجازة جديد لك.",
+ verb_de="Ihnen wurde ein neuer Urlaubstyp zugewiesen.",
+ verb_es="Se te ha asignado un nuevo tipo de permiso.",
+ verb_fr="Un nouveau type de congé vous a été attribué.",
icon="people-circle",
redirect="/leave/user-leave",
)
@@ -638,6 +662,10 @@ def available_leave_update(request, id):
request.user.employee_get,
recipient=available_leave.employee_id.employee_user_id,
verb=f"Your {available_leave.leave_type_id} leave type updated.",
+ verb_ar=f"تم تحديث نوع إجازتك {available_leave.leave_type_id}.",
+ verb_de=f"Ihr Urlaubstyp {available_leave.leave_type_id} wurde aktualisiert.",
+ verb_es=f"Se ha actualizado su tipo de permiso {available_leave.leave_type_id}.",
+ verb_fr=f"Votre type de congé {available_leave.leave_type_id} a été mis à jour.",
icon="people-circle",
redirect="/leave/user-leave",
)
@@ -1050,6 +1078,10 @@ def user_leave_request(request, id):
request.user.employee_get,
recipient=leave_request.employee_id.employee_work_info.reporting_manager_id.employee_user_id,
verb="You have a new leave request to validate.",
+ verb_ar="لديك طلب إجازة جديد يحتاج إلى التحقق منه.",
+ verb_de="Sie haben eine neue Urlaubsanfrage zur Validierung.",
+ verb_es="Tiene una nueva solicitud de permiso para validar.",
+ verb_fr="Vous avez une nouvelle demande de congé à valider.",
icon="people-circle",
redirect="/leave/user-request-view",
)
diff --git a/onboarding/views.py b/onboarding/views.py
index eddf37a06..f3801a7fe 100644
--- a/onboarding/views.py
+++ b/onboarding/views.py
@@ -94,6 +94,10 @@ def stage_save(form, recruitment, request, rec_id):
request.user.employee_get,
recipient=users,
verb="You are chosen as onboarding stage manager",
+ verb_ar="لقد تم اختيارك كمدير مرحلة التدريب.",
+ verb_de="Sie wurden als Onboarding-Stage-Manager ausgewählt.",
+ verb_es="Ha sido seleccionado/a como responsable de etapa de incorporación.",
+ verb_fr="Vous avez été choisi(e) en tant que responsable de l'étape d'intégration.",
icon="people-circle",
redirect="/onboarding/onboarding-view",
)
@@ -133,6 +137,10 @@ def stage_update(request, stage_id, recruitment_id):
request.user.employee_get,
recipient=users,
verb="You are chosen as onboarding stage manager",
+ verb_ar="لقد تم اختيارك كمدير مرحلة التدريب.",
+ verb_de="Sie wurden als Onboarding-Stage-Manager ausgewählt.",
+ verb_es="Ha sido seleccionado/a como responsable de etapa de incorporación.",
+ verb_fr="Vous avez été choisi(e) en tant que responsable de l'étape d'intégration.",
icon="people-circle",
redirect="/onboarding/onboarding-view",
)
@@ -207,7 +215,11 @@ def task_creation(request, obj_id):
notify.send(
request.user.employee_get,
recipient=users,
- verb="You are chosen as onboarding task manager",
+ verb="You are chosen as an onboarding task manager",
+ verb_ar="لقد تم اختيارك كمدير مهام التدريب.",
+ verb_de="Sie wurden als Onboarding-Aufgabenmanager ausgewählt.",
+ verb_es="Ha sido seleccionado/a como responsable de tareas de incorporación.",
+ verb_fr="Vous avez été choisi(e) en tant que responsable des tâches d'intégration.",
icon="people-circle",
redirect="/onboarding/onboarding-view",
)
@@ -246,7 +258,11 @@ def task_update(request, task_id, recruitment_id):
notify.send(
request.user.employee_get,
recipient=users,
- verb="You are chosen as onboarding task manager",
+ verb="You are chosen as an onboarding task manager",
+ verb_ar="لقد تم اختيارك كمدير مهام التدريب.",
+ verb_de="Sie wurden als Onboarding-Aufgabenmanager ausgewählt.",
+ verb_es="Ha sido seleccionado/a como responsable de tareas de incorporación.",
+ verb_fr="Vous avez été choisi(e) en tant que responsable des tâches d'intégration.",
icon="people-circle",
redirect="/onboarding/onboarding-view",
)
@@ -740,6 +756,10 @@ def candidate_task_update(request, obj_id):
recipient=users,
verb=f"The task {candidate_task.onboarding_task_id} of\
{candidate_task.candidate_id} was updated to {candidate_task.status}.",
+ verb_ar=f"تم تحديث المهمة {candidate_task.onboarding_task_id} للمرشح {candidate_task.candidate_id} إلى {candidate_task.status}.",
+ verb_de=f"Die Aufgabe {candidate_task.onboarding_task_id} des Kandidaten {candidate_task.candidate_id} wurde auf {candidate_task.status} aktualisiert.",
+ verb_es=f"La tarea {candidate_task.onboarding_task_id} del candidato {candidate_task.candidate_id} se ha actualizado a {candidate_task.status}.",
+ verb_fr=f"La tâche {candidate_task.onboarding_task_id} du candidat {candidate_task.candidate_id} a été mise à jour à {candidate_task.status}.",
icon="people-circle",
redirect="/onboarding/onboarding-view",
)
@@ -787,6 +807,10 @@ def candidate_stage_update(request, candidate_id, recruitment_id):
recipient=users,
verb=f"The stage of {candidate_stage.candidate_id} \
was updated to {candidate_stage.onboarding_stage_id}.",
+ verb_ar=f"تم تحديث مرحلة المرشح {candidate_stage.candidate_id} إلى {candidate_stage.onboarding_stage_id}.",
+ verb_de=f"Die Phase des Kandidaten {candidate_stage.candidate_id} wurde auf {candidate_stage.onboarding_stage_id} aktualisiert.",
+ verb_es=f"La etapa del candidato {candidate_stage.candidate_id} se ha actualizado a {candidate_stage.onboarding_stage_id}.",
+ verb_fr=f"L'étape du candidat {candidate_stage.candidate_id} a été mise à jour à {candidate_stage.onboarding_stage_id}.",
icon="people-circle",
redirect="/onboarding/onboarding-view",
)
diff --git a/pms/models.py b/pms/models.py
index c3d93c206..e1370a633 100644
--- a/pms/models.py
+++ b/pms/models.py
@@ -22,13 +22,13 @@ class EmployeeObjective(models.Model):
""" this is a EmployObjective model used for creating Employee objectives """
- STATUS_CHOICES = [
+ STATUS_CHOICES = (
('On Track', _('On Track')),
('Behind', _('Behind')),
('Closed', _('Closed')),
('At Risk', _('At Risk')),
('Not Started', _('Not Started')),
- ]
+ )
objective = models.CharField(null=False, blank=False, max_length=100)
objective_description = models.TextField(blank=False, null=False)
created_at = models.DateField(auto_now_add=True)
@@ -134,11 +134,11 @@ class QuestionOptions(models.Model):
class Feedback(models.Model):
"""feedback model for creating feedback """
STATUS_CHOICES = (
- ('On Track', 'On Track'),
- ('Behind', 'Behind' ),
- ('Closed', 'Closed' ),
- ('At Risk', 'At Risk' ),
- ('Not Started', 'Not Started')
+ ('On Track', _('On Track')),
+ ('Behind', _('Behind') ),
+ ('Closed', _('Closed') ),
+ ('At Risk', _('At Risk') ),
+ ('Not Started', _('Not Started'))
)
review_cycle = models.CharField(max_length=100, null=False, blank=False)
manager_id = models.ForeignKey(Employee, related_name='feedback_manager', on_delete=models.DO_NOTHING, null=True, blank=False)
diff --git a/pms/templates/feedback/feedback_list.html b/pms/templates/feedback/feedback_list.html
index 4b7d371aa..5fcc38055 100644
--- a/pms/templates/feedback/feedback_list.html
+++ b/pms/templates/feedback/feedback_list.html
@@ -54,7 +54,11 @@