Files
ihrm/project/methods.py

240 lines
6.7 KiB
Python
Raw Permalink Normal View History

import random
from django.contrib import messages
from django.core.paginator import Paginator
from django.http import HttpResponse, HttpResponseRedirect
from django.shortcuts import render
from base.methods import get_pagination, get_subordinates
from employee.models import Employee
from project.models import Project, Task, TimeSheet
decorator_with_arguments = (
lambda decorator: lambda *args, **kwargs: lambda func: decorator(
func, *args, **kwargs
)
)
def strtime_seconds(time):
"""
this method is used to reconvert time in H:M formate string back to seconds and return it
args:
time : time in H:M format
"""
ftr = [3600, 60, 1]
return sum(a * b for a, b in zip(ftr, map(int, time.split(":"))))
def paginator_qry(qryset, page_number):
"""
This method is used to generate common paginator limit.
"""
paginator = Paginator(qryset, get_pagination())
qryset = paginator.get_page(page_number)
return qryset
def random_color_generator():
r = random.randint(0, 255)
g = random.randint(0, 255)
b = random.randint(0, 255)
if r == g or g == b or b == r:
random_color_generator()
return f"rgba({r}, {g}, {b} , 0.7)"
# color_palette=[]
# Function to generate distinct colors for each project
def generate_colors(num_colors):
# Define a color palette with distinct colors
color_palette = [
"rgba(255, 99, 132, 1)", # Red
"rgba(54, 162, 235, 1)", # Blue
"rgba(255, 206, 86, 1)", # Yellow
"rgba(75, 192, 192, 1)", # Green
"rgba(153, 102, 255, 1)", # Purple
"rgba(255, 159, 64, 1)", # Orange
]
if num_colors > len(color_palette):
for i in range(num_colors - len(color_palette)):
color_palette.append(random_color_generator())
colors = []
for i in range(num_colors):
# color=random_color_generator()
colors.append(color_palette[i % len(color_palette)])
return colors
def any_project_manager(user):
employee = user.employee_get
if employee.project_managers.all().exists():
return True
else:
return False
def any_project_member(user):
employee = user.employee_get
if employee.project_members.all().exists():
return True
else:
return False
def any_task_manager(user):
employee = user.employee_get
if employee.task_set.all().exists():
return True
else:
return False
def any_task_member(user):
employee = user.employee_get
if employee.tasks.all().exists():
return True
else:
return False
@decorator_with_arguments
def is_projectmanager_or_member_or_perms(function, perm):
def _function(request, *args, **kwargs):
"""
This method is used to check the employee is project manager or not
"""
user = request.user
if (
user.has_perm(perm)
or any_project_manager(user)
or any_project_member(user)
or any_task_manager(user)
or any_task_member(user)
):
return function(request, *args, **kwargs)
messages.info(request, "You don't have permission.")
return HttpResponseRedirect(request.META.get("HTTP_REFERER", "/"))
return _function
def is_task_member(request, task_id):
"""
This method is used to check the employee is task member or not
"""
if (
request.user.has_perm("project.change_task")
or request.user.employee_get in Task.objects.get(id=task_id).task_managers.all()
or request.user.employee_get in Task.objects.get(id=task_id).task_members.all()
):
return True
return False
def is_task_manager(request, task_id):
"""
This method is used to check the employee is task member or not
"""
if (
request.user.has_perm("project.delete_task")
or request.user.employee_get in Task.objects.get(id=task_id).task_managers.all()
):
return True
return False
def time_sheet_update_permissions(request, time_sheet_id):
if (
request.user.has_perm("project.change_timesheet")
or request.user.employee_get
== TimeSheet.objects.get(id=time_sheet_id).employee_id
or TimeSheet.objects.get(id=time_sheet_id).employee_id
in Employee.objects.filter(
employee_work_info__reporting_manager_id=request.user.employee_get
)
):
return True
else:
return False
def time_sheet_delete_permissions(request, time_sheet_id):
employee = request.user.employee_get
timesheet = TimeSheet.objects.filter(id=time_sheet_id).first()
if (
request.user.has_perm("project.delete_timesheet")
or timesheet.employee_id == employee
or employee in timesheet.task_id.task_managers.all()
or employee in timesheet.task_id.project.managers.all()
):
return True
else:
return False
def get_all_project_members_and_managers():
all_projects = Project.objects.all()
all_tasks = Task.objects.all()
all_ids = set()
for project in all_projects:
all_ids.update(
manager.id for manager in project.managers.all()
) # Add manager ID
all_ids.update(member.id for member in project.members.all()) # Add member IDs
for task in all_tasks:
all_ids.update(
task_manager.id for task_manager in task.task_managers.all()
) # Add task manager ID
all_ids.update(
task_member.id for task_member in task.task_members.all()
) # Add task member IDs
# Return a single queryset for all employees
return Employee.objects.filter(id__in=all_ids)
def has_subordinates(request):
"""
used to check whether the project contain users subordinates or not
"""
all_members_info = get_all_project_members_and_managers()
subordinates = get_subordinates(request)
member = {member for member in all_members_info}
for subordinate in subordinates:
if subordinate in member:
return True
return False
def is_project_manager_or_super_user(request, project):
"""
Method to check whether user is a manager of project or
user is a super user.
"""
return (
request.user.employee_get in project.managers.all() or request.user.is_superuser
)
def you_dont_have_permission(request):
"""
Method to return you dont have permission
"""
messages.info(request, "You dont have permission.")
previous_url = request.META.get("HTTP_REFERER", "/")
key = "HTTP_HX_REQUEST"
if key in request.META.keys():
return render(request, "decorator_404.html")
script = f'<script>window.location.href = "{previous_url}"</script>'
return HttpResponse(script)