Pylint fixes
This commit is contained in:
@@ -2,14 +2,14 @@
|
||||
Accessibility
|
||||
"""
|
||||
|
||||
|
||||
from django.contrib.auth.context_processors import PermWrapper
|
||||
|
||||
from employee.models import Employee
|
||||
from project.models import Project, Task
|
||||
|
||||
|
||||
def task_crud_accessibility(request, instance: object = None, user_perms: PermWrapper = [], *args, **kwargs
|
||||
def task_crud_accessibility(
|
||||
request, instance: object = None, user_perms: PermWrapper = [], *args, **kwargs
|
||||
) -> bool:
|
||||
"""
|
||||
to access crud operations
|
||||
@@ -17,15 +17,23 @@ def task_crud_accessibility(request, instance: object = None, user_perms: PermWr
|
||||
employee = request.user.employee_get
|
||||
is_task_manager = employee in instance.task_managers.all()
|
||||
is_project_manager = employee in instance.project.managers.all()
|
||||
if (request.user.has_perm("project.view_task") or is_project_manager or is_task_manager):
|
||||
if (
|
||||
request.user.has_perm("project.view_task")
|
||||
or is_project_manager
|
||||
or is_task_manager
|
||||
):
|
||||
return True
|
||||
else:
|
||||
return False
|
||||
|
||||
def project_manager_accessibility(request, instance: object = None, user_perms: PermWrapper = [], *args, **kwargs
|
||||
|
||||
def project_manager_accessibility(
|
||||
request, instance: object = None, user_perms: PermWrapper = [], *args, **kwargs
|
||||
) -> bool:
|
||||
"""
|
||||
to access edit Project
|
||||
"""
|
||||
return (request.user.employee_get in instance.managers.all() or
|
||||
request.user.is_superuser)
|
||||
return (
|
||||
request.user.employee_get in instance.managers.all()
|
||||
or request.user.is_superuser
|
||||
)
|
||||
|
||||
@@ -1,33 +1,44 @@
|
||||
|
||||
|
||||
from project.methods import any_project_manager, any_project_member, any_task_manager, any_task_member, has_subordinates
|
||||
from django.contrib import messages
|
||||
from django.http import HttpResponseRedirect
|
||||
|
||||
from horilla.horilla_middlewares import _thread_locals
|
||||
from project.methods import (
|
||||
any_project_manager,
|
||||
any_project_member,
|
||||
any_task_manager,
|
||||
any_task_member,
|
||||
has_subordinates,
|
||||
)
|
||||
|
||||
# from project.sidebar import has_subordinates
|
||||
|
||||
|
||||
decorator_with_arguments = lambda decorator: lambda *args, **kwargs: lambda func: decorator(func, *args, **kwargs)
|
||||
decorator_with_arguments = (
|
||||
lambda decorator: lambda *args, **kwargs: lambda func: decorator(
|
||||
func, *args, **kwargs
|
||||
)
|
||||
)
|
||||
|
||||
|
||||
@decorator_with_arguments
|
||||
def is_projectmanager_or_member_or_perms(function,perm):
|
||||
def is_projectmanager_or_member_or_perms(function, perm):
|
||||
def _function(self, *args, **kwargs):
|
||||
"""
|
||||
This method is used to check the employee is project manager or not
|
||||
This method is used to check the employee is project manager or not
|
||||
"""
|
||||
request = getattr(_thread_locals,"request")
|
||||
if not getattr(self,"request",None):
|
||||
request = getattr(_thread_locals, "request")
|
||||
if not getattr(self, "request", None):
|
||||
self.request = request
|
||||
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)
|
||||
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(self, *args, **kwargs)
|
||||
messages.info(request, "You don't have permission.")
|
||||
return HttpResponseRedirect(request.META.get("HTTP_REFERER", "/"))
|
||||
|
||||
return _function
|
||||
|
||||
@@ -5,18 +5,19 @@ Dashbord of project
|
||||
import calendar
|
||||
import datetime
|
||||
from typing import Any
|
||||
from django.db.models import Count
|
||||
|
||||
from django.db.models import Count, Q
|
||||
from django.db.models.query import QuerySet
|
||||
from django.urls import resolve, reverse
|
||||
from django.utils.translation import gettext_lazy as _
|
||||
from django.utils.decorators import method_decorator
|
||||
from django.db.models import Q
|
||||
from django.utils.translation import gettext_lazy as _
|
||||
|
||||
from base.methods import get_subordinates
|
||||
from horilla_views.generic.cbv.views import HorillaListView, HorillaDetailedView
|
||||
from horilla_views.cbv_methods import login_required
|
||||
from horilla_views.generic.cbv.views import HorillaDetailedView, HorillaListView
|
||||
from project.cbv.cbv_decorators import is_projectmanager_or_member_or_perms
|
||||
from project.filters import ProjectFilter
|
||||
from project.models import Project
|
||||
from project.cbv.cbv_decorators import is_projectmanager_or_member_or_perms
|
||||
|
||||
|
||||
@method_decorator(login_required, name="dispatch")
|
||||
|
||||
@@ -4,10 +4,12 @@ This page handles the cbv methods for project stages
|
||||
|
||||
import logging
|
||||
from typing import Any
|
||||
from django.http import HttpResponse
|
||||
from django.utils.translation import gettext_lazy as _
|
||||
from django.utils.decorators import method_decorator
|
||||
|
||||
from django.contrib import messages
|
||||
from django.http import HttpResponse
|
||||
from django.utils.decorators import method_decorator
|
||||
from django.utils.translation import gettext_lazy as _
|
||||
|
||||
from horilla_views.cbv_methods import login_required
|
||||
from horilla_views.generic.cbv.views import HorillaFormView
|
||||
|
||||
|
||||
@@ -3,13 +3,17 @@ CBV of projects page
|
||||
"""
|
||||
|
||||
from typing import Any
|
||||
from django.http import HttpResponse
|
||||
from django.utils.translation import gettext_lazy as _
|
||||
from django.utils.decorators import method_decorator
|
||||
from django.urls import reverse
|
||||
|
||||
from django.contrib import messages
|
||||
from django.db.models import Q
|
||||
from django.http import HttpResponse
|
||||
from django.urls import reverse
|
||||
from django.utils.decorators import method_decorator
|
||||
from django.utils.translation import gettext_lazy as _
|
||||
from django.views.generic import ListView
|
||||
|
||||
from employee.models import Employee
|
||||
from horilla.horilla_middlewares import _thread_locals
|
||||
from horilla_views.cbv_methods import login_required, permission_required
|
||||
from horilla_views.generic.cbv.views import (
|
||||
HorillaCardView,
|
||||
@@ -21,10 +25,13 @@ from horilla_views.generic.cbv.views import (
|
||||
from project.cbv.cbv_decorators import is_projectmanager_or_member_or_perms
|
||||
from project.filters import ProjectFilter
|
||||
from project.forms import ProjectForm
|
||||
from project.methods import any_project_manager, any_project_member, is_project_manager_or_super_user, you_dont_have_permission
|
||||
from project.methods import (
|
||||
any_project_manager,
|
||||
any_project_member,
|
||||
is_project_manager_or_super_user,
|
||||
you_dont_have_permission,
|
||||
)
|
||||
from project.models import Project
|
||||
from django.db.models import Q
|
||||
from horilla.horilla_middlewares import _thread_locals
|
||||
|
||||
|
||||
@method_decorator(login_required, name="dispatch")
|
||||
@@ -49,6 +56,7 @@ class ProjectsNavView(HorillaNavView):
|
||||
"""
|
||||
|
||||
template_name = "cbv/projects/project_nav.html"
|
||||
|
||||
def __init__(self, **kwargs: Any) -> None:
|
||||
super().__init__(**kwargs)
|
||||
self.search_url = reverse("project-list-view")
|
||||
@@ -124,6 +132,7 @@ class ProjectsNavView(HorillaNavView):
|
||||
hx-target="#genericModalBody"
|
||||
hx-get="{reverse('create-project')}"
|
||||
"""
|
||||
|
||||
group_by_fields = [
|
||||
("status", _("Status")),
|
||||
("is_active", _("Is active")),
|
||||
@@ -149,20 +158,16 @@ class ProjectsList(HorillaListView):
|
||||
if not self.request.user.has_perm("project.view_project"):
|
||||
employee = self.request.user.employee_get
|
||||
task_filter = queryset.filter(
|
||||
Q(task__task_members=employee)
|
||||
| Q(task__task_managers=employee)
|
||||
)
|
||||
project_filter = queryset.filter(
|
||||
Q(managers=employee)
|
||||
| Q(members=employee)
|
||||
Q(task__task_members=employee) | Q(task__task_managers=employee)
|
||||
)
|
||||
project_filter = queryset.filter(Q(managers=employee) | Q(members=employee))
|
||||
queryset = task_filter | project_filter
|
||||
return queryset.distinct()
|
||||
|
||||
def __init__(self, **kwargs: Any) -> None:
|
||||
super().__init__(**kwargs)
|
||||
self.search_url = reverse("project-list-view")
|
||||
if (self.request.user.is_superuser ):
|
||||
if self.request.user.is_superuser:
|
||||
self.action_method = "actions"
|
||||
|
||||
model = Project
|
||||
@@ -203,7 +208,7 @@ class ProjectsList(HorillaListView):
|
||||
onclick="
|
||||
$('#applyFilter').closest('form').find('[name=status]').val('in_progress');
|
||||
$('#applyFilter').click();
|
||||
|
||||
|
||||
"
|
||||
""",
|
||||
),
|
||||
@@ -214,7 +219,7 @@ class ProjectsList(HorillaListView):
|
||||
onclick="
|
||||
$('#applyFilter').closest('form').find('[name=status]').val('completed');
|
||||
$('#applyFilter').click();
|
||||
|
||||
|
||||
"
|
||||
""",
|
||||
),
|
||||
@@ -225,7 +230,7 @@ class ProjectsList(HorillaListView):
|
||||
onclick="
|
||||
$('#applyFilter').closest('form').find('[name=status]').val('on_hold');
|
||||
$('#applyFilter').click();
|
||||
|
||||
|
||||
"
|
||||
""",
|
||||
),
|
||||
@@ -236,7 +241,7 @@ class ProjectsList(HorillaListView):
|
||||
onclick="
|
||||
$('#applyFilter').closest('form').find('[name=status]').val('cancelled');
|
||||
$('#applyFilter').click();
|
||||
|
||||
|
||||
"
|
||||
""",
|
||||
),
|
||||
@@ -247,7 +252,7 @@ class ProjectsList(HorillaListView):
|
||||
onclick="
|
||||
$('#applyFilter').closest('form').find('[name=status]').val('expired');
|
||||
$('#applyFilter').click();
|
||||
|
||||
|
||||
"
|
||||
""",
|
||||
),
|
||||
@@ -270,15 +275,12 @@ class ProjectFormView(HorillaFormView):
|
||||
form_class = ProjectForm
|
||||
model = Project
|
||||
new_display_title = _("Create Project")
|
||||
|
||||
|
||||
def __init__(self, **kwargs):
|
||||
super().__init__(**kwargs)
|
||||
user = self.request.user
|
||||
|
||||
if (not user.is_superuser and
|
||||
not user.has_perm("project.add_project")
|
||||
|
||||
):
|
||||
|
||||
if not user.is_superuser and not user.has_perm("project.add_project"):
|
||||
self.template_name = "decorator_404.html"
|
||||
|
||||
def get_context_data(self, **kwargs):
|
||||
@@ -295,7 +297,9 @@ class ProjectFormView(HorillaFormView):
|
||||
if HTTP_REFERER and "task-view/" in HTTP_REFERER:
|
||||
form.save()
|
||||
messages.success(self.request, message)
|
||||
return self.HttpResponse("<script>window.location.reload()</script>")
|
||||
return self.HttpResponse(
|
||||
"<script>window.location.reload()</script>"
|
||||
)
|
||||
else:
|
||||
message = _("New project created")
|
||||
form.save()
|
||||
@@ -326,32 +330,29 @@ class ProjectCardView(HorillaCardView):
|
||||
if not self.request.user.has_perm("project.view_project"):
|
||||
employee = self.request.user.employee_get
|
||||
task_filter = queryset.filter(
|
||||
Q(task__task_members=employee)
|
||||
| Q(task__task_managers=employee)
|
||||
)
|
||||
project_filter = queryset.filter(
|
||||
Q(managers=employee)
|
||||
| Q(members=employee)
|
||||
Q(task__task_members=employee) | Q(task__task_managers=employee)
|
||||
)
|
||||
project_filter = queryset.filter(Q(managers=employee) | Q(members=employee))
|
||||
queryset = task_filter | project_filter
|
||||
return queryset.distinct()
|
||||
|
||||
def __init__(self, **kwargs: Any) -> None:
|
||||
super().__init__(**kwargs)
|
||||
self.search_url = reverse("project-card-view")
|
||||
if (self.request.user.has_perm("project.change_project")
|
||||
if (
|
||||
self.request.user.has_perm("project.change_project")
|
||||
or self.request.user.has_perm("project.delete_project")
|
||||
or any_project_manager(self.request.user)
|
||||
or any_project_member(self.request.user)
|
||||
):
|
||||
):
|
||||
self.actions = [
|
||||
{
|
||||
"action": "Edit",
|
||||
"accessibility": "project.cbv.accessibility.project_manager_accessibility",
|
||||
"attrs": """
|
||||
hx-get='{get_update_url}'
|
||||
hx-get='{get_update_url}'
|
||||
hx-target='#genericModalBody'
|
||||
data-toggle="oh-modal-toggle"
|
||||
data-toggle="oh-modal-toggle"
|
||||
data-target="#genericModal"
|
||||
class="oh-dropdown__link"
|
||||
""",
|
||||
@@ -372,7 +373,7 @@ class ProjectCardView(HorillaCardView):
|
||||
onclick="
|
||||
event.stopPropagation()
|
||||
deleteItem({get_delete_url});
|
||||
"
|
||||
"
|
||||
class="oh-dropdown__link oh-dropdown__link--danger"
|
||||
""",
|
||||
},
|
||||
@@ -403,7 +404,7 @@ class ProjectCardView(HorillaCardView):
|
||||
onclick="
|
||||
$('#applyFilter').closest('form').find('[name=status]').val('in_progress');
|
||||
$('#applyFilter').click();
|
||||
|
||||
|
||||
"
|
||||
""",
|
||||
),
|
||||
@@ -414,7 +415,7 @@ class ProjectCardView(HorillaCardView):
|
||||
onclick="
|
||||
$('#applyFilter').closest('form').find('[name=status]').val('completed');
|
||||
$('#applyFilter').click();
|
||||
|
||||
|
||||
"
|
||||
""",
|
||||
),
|
||||
@@ -425,7 +426,7 @@ class ProjectCardView(HorillaCardView):
|
||||
onclick="
|
||||
$('#applyFilter').closest('form').find('[name=status]').val('on_hold');
|
||||
$('#applyFilter').click();
|
||||
|
||||
|
||||
"
|
||||
""",
|
||||
),
|
||||
@@ -436,7 +437,7 @@ class ProjectCardView(HorillaCardView):
|
||||
onclick="
|
||||
$('#applyFilter').closest('form').find('[name=status]').val('cancelled');
|
||||
$('#applyFilter').click();
|
||||
|
||||
|
||||
"
|
||||
""",
|
||||
),
|
||||
@@ -447,7 +448,7 @@ class ProjectCardView(HorillaCardView):
|
||||
onclick="
|
||||
$('#applyFilter').closest('form').find('[name=status]').val('expired');
|
||||
$('#applyFilter').click();
|
||||
|
||||
|
||||
"
|
||||
""",
|
||||
),
|
||||
@@ -480,13 +481,14 @@ class ProjectCardView(HorillaCardView):
|
||||
# context,
|
||||
# )
|
||||
|
||||
|
||||
class ProjectsTabView(ListView):
|
||||
model = Project
|
||||
template_name = "cbv/projects/project_tab.html"
|
||||
context_object_name = "projects"
|
||||
|
||||
def get_queryset(self):
|
||||
pk = self.kwargs.get('pk')
|
||||
pk = self.kwargs.get("pk")
|
||||
queryset = Project.objects.filter(
|
||||
Q(manager=pk)
|
||||
| Q(members=pk)
|
||||
@@ -497,13 +499,14 @@ class ProjectsTabView(ListView):
|
||||
|
||||
def get_context_data(self, **kwargs):
|
||||
context = super().get_context_data(**kwargs)
|
||||
pk = self.kwargs.get('pk')
|
||||
pk = self.kwargs.get("pk")
|
||||
if pk:
|
||||
employees = Employee.objects.filter(id=pk).distinct()
|
||||
employee = employees.first()
|
||||
context["employee"] = employee
|
||||
return context
|
||||
|
||||
|
||||
# Remove the command lines after horilla converted into CBV
|
||||
# from employee.cbv.employee_profile import EmployeeProfileView
|
||||
# EmployeeProfileView.add_tab(
|
||||
|
||||
@@ -4,14 +4,16 @@ This page handles the cbv methods for task page
|
||||
|
||||
import logging
|
||||
from typing import Any
|
||||
|
||||
from django import forms
|
||||
from django.contrib import messages
|
||||
from django.db.models import Q
|
||||
from django.http import HttpResponse
|
||||
from django.contrib import messages
|
||||
from django.shortcuts import render
|
||||
from django.utils.translation import gettext_lazy as _
|
||||
from django.urls import reverse
|
||||
from django.utils.decorators import method_decorator
|
||||
from django.utils.translation import gettext_lazy as _
|
||||
|
||||
from base.methods import get_subordinates
|
||||
from horilla_views.cbv_methods import login_required
|
||||
from horilla_views.generic.cbv.views import (
|
||||
@@ -19,8 +21,8 @@ from horilla_views.generic.cbv.views import (
|
||||
HorillaDetailedView,
|
||||
HorillaFormView,
|
||||
HorillaListView,
|
||||
TemplateView,
|
||||
HorillaNavView,
|
||||
TemplateView,
|
||||
)
|
||||
from project.cbv.project_stage import StageDynamicCreateForm
|
||||
from project.cbv.projects import DynamicProjectCreationFormView
|
||||
@@ -118,7 +120,7 @@ class TaskListView(HorillaListView):
|
||||
onclick="
|
||||
$('#applyFilter').closest('form').find('[name=status]').val('in_progress');
|
||||
$('#applyFilter').click();
|
||||
|
||||
|
||||
"
|
||||
""",
|
||||
),
|
||||
@@ -129,7 +131,7 @@ class TaskListView(HorillaListView):
|
||||
onclick="
|
||||
$('#applyFilter').closest('form').find('[name=status]').val('completed');
|
||||
$('#applyFilter').click();
|
||||
|
||||
|
||||
"
|
||||
""",
|
||||
),
|
||||
@@ -140,7 +142,7 @@ class TaskListView(HorillaListView):
|
||||
onclick="
|
||||
$('#applyFilter').closest('form').find('[name=status]').val('expired');
|
||||
$('#applyFilter').click();
|
||||
|
||||
|
||||
"
|
||||
""",
|
||||
),
|
||||
@@ -455,7 +457,7 @@ class TaskCardView(HorillaCardView):
|
||||
"attrs": """
|
||||
href="{get_archive_url}"
|
||||
onclick="return confirm('Do you want to {archive_status} this task?')"
|
||||
class="oh-dropdown__link"
|
||||
class="oh-dropdown__link"
|
||||
""",
|
||||
},
|
||||
{
|
||||
@@ -465,7 +467,7 @@ class TaskCardView(HorillaCardView):
|
||||
onclick="
|
||||
event.stopPropagation()
|
||||
deleteItem({get_delete_url});
|
||||
"
|
||||
"
|
||||
class="oh-dropdown__link oh-dropdown__link--danger"
|
||||
""",
|
||||
},
|
||||
@@ -525,7 +527,7 @@ class TaskCardView(HorillaCardView):
|
||||
onclick="
|
||||
$('#applyFilter').closest('form').find('[name=status]').val('in_progress');
|
||||
$('#applyFilter').click();
|
||||
|
||||
|
||||
"
|
||||
""",
|
||||
),
|
||||
@@ -536,7 +538,7 @@ class TaskCardView(HorillaCardView):
|
||||
onclick="
|
||||
$('#applyFilter').closest('form').find('[name=status]').val('completed');
|
||||
$('#applyFilter').click();
|
||||
|
||||
|
||||
"
|
||||
""",
|
||||
),
|
||||
@@ -547,7 +549,7 @@ class TaskCardView(HorillaCardView):
|
||||
onclick="
|
||||
$('#applyFilter').closest('form').find('[name=status]').val('expired');
|
||||
$('#applyFilter').click();
|
||||
|
||||
|
||||
"
|
||||
""",
|
||||
),
|
||||
|
||||
@@ -3,13 +3,16 @@ CBV of time sheet page
|
||||
"""
|
||||
|
||||
from typing import Any
|
||||
|
||||
from django import forms
|
||||
from django.contrib import messages
|
||||
from django.db.models import Q
|
||||
from django.http import HttpResponse
|
||||
from django.shortcuts import render
|
||||
from django.utils.translation import gettext_lazy as _
|
||||
from django.utils.decorators import method_decorator
|
||||
from django.urls import resolve, reverse
|
||||
from django.contrib import messages
|
||||
from django.utils.decorators import method_decorator
|
||||
from django.utils.translation import gettext_lazy as _
|
||||
|
||||
from employee.models import Employee
|
||||
from horilla_views.cbv_methods import login_required
|
||||
from horilla_views.generic.cbv.views import (
|
||||
@@ -26,7 +29,6 @@ from project.cbv.tasks import DynamicTaskCreateFormView
|
||||
from project.filters import TimeSheetFilter
|
||||
from project.forms import TimeSheetForm
|
||||
from project.models import Project, Task, TimeSheet
|
||||
from django.db.models import Q
|
||||
|
||||
|
||||
@method_decorator(login_required, name="dispatch")
|
||||
@@ -49,8 +51,9 @@ class TimeSheetNavView(HorillaNavView):
|
||||
"""
|
||||
Nav bar
|
||||
"""
|
||||
|
||||
template_name = "cbv/timesheet/timesheet_nav.html"
|
||||
|
||||
|
||||
def __init__(self, **kwargs: Any) -> None:
|
||||
super().__init__(**kwargs)
|
||||
self.search_url = reverse("time-sheet-list")
|
||||
@@ -93,7 +96,7 @@ class TimeSheetNavView(HorillaNavView):
|
||||
""",
|
||||
},
|
||||
]
|
||||
|
||||
|
||||
self.create_attrs = f"""
|
||||
onclick = "event.stopPropagation();"
|
||||
data-toggle="oh-modal-toggle"
|
||||
@@ -101,12 +104,16 @@ class TimeSheetNavView(HorillaNavView):
|
||||
hx-target="#genericModalBody"
|
||||
hx-get="{reverse('create-time-sheet')}"
|
||||
"""
|
||||
|
||||
group_by_fields = [
|
||||
("employee_id", _("Employee")),
|
||||
("project_id", _("Project")),
|
||||
("date", _("Date")),
|
||||
("status", _("Status")),
|
||||
("employee_id__employee_work_info__reporting_manager_id", _("Reporting Manager")),
|
||||
(
|
||||
"employee_id__employee_work_info__reporting_manager_id",
|
||||
_("Reporting Manager"),
|
||||
),
|
||||
("employee_id__employee_work_info__department_id", _("Department")),
|
||||
("employee_id__employee_work_info__job_position_id", _("Job Position")),
|
||||
("employee_id__employee_work_info__employee_type_id", _("Employement Type")),
|
||||
@@ -175,7 +182,7 @@ class TimeSheetList(HorillaListView):
|
||||
onclick="
|
||||
$('#applyFilter').closest('form').find('[name=status]').val('in_Progress');
|
||||
$('#applyFilter').click();
|
||||
|
||||
|
||||
"
|
||||
""",
|
||||
),
|
||||
@@ -186,7 +193,7 @@ class TimeSheetList(HorillaListView):
|
||||
onclick="
|
||||
$('#applyFilter').closest('form').find('[name=status]').val('completed');
|
||||
$('#applyFilter').click();
|
||||
|
||||
|
||||
"
|
||||
""",
|
||||
),
|
||||
@@ -211,7 +218,6 @@ class TaskTimeSheet(TimeSheetList):
|
||||
row_status_indications = False
|
||||
bulk_select_option = False
|
||||
|
||||
|
||||
def __init__(self, **kwargs: Any) -> None:
|
||||
super().__init__(**kwargs)
|
||||
self.view_id = "task-timesheet-container"
|
||||
@@ -225,7 +231,7 @@ class TaskTimeSheet(TimeSheetList):
|
||||
context = super().get_context_data(**kwargs)
|
||||
task_id = self.kwargs.get("task_id")
|
||||
task = Task.objects.get(id=task_id)
|
||||
project = task.project
|
||||
project = task.project
|
||||
context["task_id"] = task_id
|
||||
context["project"] = project
|
||||
context["task"] = task
|
||||
@@ -236,18 +242,19 @@ class TaskTimeSheet(TimeSheetList):
|
||||
def get_queryset(self):
|
||||
queryset = HorillaListView.get_queryset(self)
|
||||
task_id = self.kwargs.get("task_id")
|
||||
task = Task.objects.filter( id = task_id).first()
|
||||
task = Task.objects.filter(id=task_id).first()
|
||||
queryset = TimeSheet.objects.filter(task_id=task_id)
|
||||
queryset = queryset.filter(task_id=task_id)
|
||||
employee_id = self.request.GET.get("employee_id")
|
||||
if employee_id:
|
||||
employee = Employee.objects.filter(id = employee_id ).first()
|
||||
if (not employee in task.task_managers.all()
|
||||
employee = Employee.objects.filter(id=employee_id).first()
|
||||
if (
|
||||
not employee in task.task_managers.all()
|
||||
and not employee in task.project.managers.all()
|
||||
and not employee.employee_user_id.is_superuser
|
||||
):
|
||||
queryset = queryset.filter(employee_id=employee_id)
|
||||
|
||||
|
||||
return queryset
|
||||
|
||||
|
||||
@@ -294,7 +301,7 @@ class TimeSheetFormView(HorillaFormView):
|
||||
task = Task.objects.get(id=task_id)
|
||||
project = task.project
|
||||
employee = Employee.objects.filter(id=user_employee_id)
|
||||
|
||||
|
||||
if self.form.instance.pk:
|
||||
task_id = self.form.instance.task_id.id
|
||||
project = self.form.instance.project_id
|
||||
@@ -312,46 +319,54 @@ class TimeSheetFormView(HorillaFormView):
|
||||
self.form_class.verbose_name = _("Update Time Sheet")
|
||||
# If the timesheet create from task or project
|
||||
if project:
|
||||
if (self.request.user.is_superuser or
|
||||
self.request.user.has_perm("project.add_project")
|
||||
):
|
||||
members = ( project.managers.all() |
|
||||
project.members.all() |
|
||||
task.task_members.all() |task.task_managers.all()
|
||||
).distinct()
|
||||
elif ( employee.first() in project.managers.all()):
|
||||
if self.request.user.is_superuser or self.request.user.has_perm(
|
||||
"project.add_project"
|
||||
):
|
||||
members = (
|
||||
employee | project.members.all() |
|
||||
task.task_members.all() | task.task_managers.all()
|
||||
project.managers.all()
|
||||
| project.members.all()
|
||||
| task.task_members.all()
|
||||
| task.task_managers.all()
|
||||
).distinct()
|
||||
elif( employee.first() in task.task_managers.all() ):
|
||||
members = ( employee | task.task_members.all()).distinct()
|
||||
else :
|
||||
elif employee.first() in project.managers.all():
|
||||
members = (
|
||||
employee
|
||||
| project.members.all()
|
||||
| task.task_members.all()
|
||||
| task.task_managers.all()
|
||||
).distinct()
|
||||
elif employee.first() in task.task_managers.all():
|
||||
members = (employee | task.task_members.all()).distinct()
|
||||
else:
|
||||
members = employee
|
||||
if task_id:
|
||||
self.form.fields["project_id"].widget = forms.HiddenInput()
|
||||
self.form.fields["task_id"].widget = forms.HiddenInput()
|
||||
self.form.fields["employee_id"].queryset = members
|
||||
|
||||
|
||||
# If the timesheet create directly
|
||||
else :
|
||||
else:
|
||||
employee = self.request.user.employee_get
|
||||
if self.request.user.has_perm('project.add_timesheet'):
|
||||
if self.request.user.has_perm("project.add_timesheet"):
|
||||
projects = Project.objects.all()
|
||||
else:
|
||||
projects = (
|
||||
Project.objects.filter(managers = employee) |
|
||||
Project.objects.filter(members = employee) |
|
||||
Project.objects.filter(
|
||||
id__in=Task.objects.filter(task_managers=employee).values_list('project', flat=True)
|
||||
) |
|
||||
Project.objects.filter(
|
||||
id__in=Task.objects.filter(task_members=employee).values_list('project', flat=True)
|
||||
Project.objects.filter(managers=employee)
|
||||
| Project.objects.filter(members=employee)
|
||||
| Project.objects.filter(
|
||||
id__in=Task.objects.filter(task_managers=employee).values_list(
|
||||
"project", flat=True
|
||||
)
|
||||
)
|
||||
| Project.objects.filter(
|
||||
id__in=Task.objects.filter(task_members=employee).values_list(
|
||||
"project", flat=True
|
||||
)
|
||||
)
|
||||
).distinct()
|
||||
self.form.fields['project_id'].queryset = projects
|
||||
self.form.fields["project_id"].queryset = projects
|
||||
return context
|
||||
|
||||
|
||||
def form_valid(self, form: TimeSheetForm) -> HttpResponse:
|
||||
if form.is_valid():
|
||||
if form.instance.pk:
|
||||
@@ -394,9 +409,9 @@ class TimeSheetCardView(HorillaCardView):
|
||||
{
|
||||
"action": "Edit",
|
||||
"attrs": """
|
||||
hx-get='{get_update_url}'
|
||||
hx-get='{get_update_url}'
|
||||
hx-target='#genericModalBody'
|
||||
data-toggle="oh-modal-toggle"
|
||||
data-toggle="oh-modal-toggle"
|
||||
data-target="#genericModal"
|
||||
class="oh-dropdown__link"
|
||||
""",
|
||||
@@ -407,7 +422,7 @@ class TimeSheetCardView(HorillaCardView):
|
||||
onclick="
|
||||
event.stopPropagation()
|
||||
deleteItem({get_delete_url});
|
||||
"
|
||||
"
|
||||
class="oh-dropdown__link oh-dropdown__link--danger"
|
||||
""",
|
||||
},
|
||||
@@ -429,7 +444,7 @@ class TimeSheetCardView(HorillaCardView):
|
||||
onclick="
|
||||
$('#applyFilter').closest('form').find('[name=status]').val('in_Progress');
|
||||
$('#applyFilter').click();
|
||||
|
||||
|
||||
"
|
||||
""",
|
||||
),
|
||||
@@ -440,7 +455,7 @@ class TimeSheetCardView(HorillaCardView):
|
||||
onclick="
|
||||
$('#applyFilter').closest('form').find('[name=status]').val('completed');
|
||||
$('#applyFilter').click();
|
||||
|
||||
|
||||
"
|
||||
""",
|
||||
),
|
||||
|
||||
@@ -34,7 +34,7 @@
|
||||
{% endif %}
|
||||
{% if perms.project.delete_project or request.user|is_project_manager:instance %}
|
||||
{% if instance.is_active %}
|
||||
<a
|
||||
<a
|
||||
class="oh-btn oh-btn--light-bkg w-100"
|
||||
href="{{instance.get_archive_url}}"
|
||||
onclick="return confirm('Do you want to {{instance.archive_status}} this project?')"
|
||||
@@ -43,7 +43,7 @@
|
||||
<ion-icon name="archive"></ion-icon>
|
||||
</a>
|
||||
{% else %}
|
||||
<a
|
||||
<a
|
||||
class="oh-btn oh-btn--light-bkg w-100"
|
||||
href="{{instance.get_archive_url}}"
|
||||
onclick="return confirm('Do you want to {{instance.archive_status}} this project?')"
|
||||
@@ -67,4 +67,4 @@
|
||||
></ion-icon>
|
||||
</a>
|
||||
{% endif %}
|
||||
</div>
|
||||
</div>
|
||||
|
||||
@@ -37,4 +37,4 @@
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
@@ -10,7 +10,7 @@
|
||||
<span class="helpdesk__card-value b" name="" id="">{{project}}</span>
|
||||
</li>
|
||||
</ul>
|
||||
|
||||
|
||||
<span class="helpdesk__card-value me-3" style="display:flex">
|
||||
{% if perms.pms.change_project or request.user|is_project_manager_or_member:project %}
|
||||
<select id="status" class="oh-select oh-select--sm ms-3 mr-1 " name="status" title="Status"
|
||||
@@ -43,7 +43,7 @@
|
||||
title="{% trans 'Edit' %}"
|
||||
><ion-icon name="create-outline"></ion-icon
|
||||
></a>
|
||||
{% endif %}
|
||||
{% endif %}
|
||||
</div>
|
||||
{% endif %}
|
||||
</span>
|
||||
@@ -88,14 +88,14 @@
|
||||
<span class="helpdesk__card-label">{% trans "Start date:" %}</span>
|
||||
<span class="helpdesk__card-value" name="" id=""
|
||||
>{{project.start_date}}
|
||||
</span
|
||||
</span
|
||||
>
|
||||
</li>
|
||||
<li class="helpdesk__card-item">
|
||||
<span class="helpdesk__card-label">{% trans "End date:" %}</span>
|
||||
<span class="helpdesk__card-value" name="" id=""
|
||||
>{{project.end_date}}
|
||||
</span
|
||||
</span
|
||||
>
|
||||
<span title = 'due {% if project.end_date == today %} today {% else %}in {{project.end_date|sub:today}}{% endif %}'>
|
||||
<ion-icon
|
||||
@@ -117,9 +117,9 @@
|
||||
{{project.description}}
|
||||
</p>
|
||||
</details>
|
||||
|
||||
|
||||
</div>
|
||||
</li>
|
||||
</ul>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
@@ -14,9 +14,9 @@
|
||||
onclick = "event.stopPropagation();"
|
||||
class="oh-btn "
|
||||
title="{% trans 'View Project' %}"
|
||||
hx-target="#genericModalBody"
|
||||
data-target="#genericModal"
|
||||
data-toggle="oh-modal-toggle"
|
||||
hx-target="#genericModalBody"
|
||||
data-target="#genericModal"
|
||||
data-toggle="oh-modal-toggle"
|
||||
hx-get="{% url 'project-detailed-view' project.id %}"
|
||||
|
||||
><ion-icon
|
||||
@@ -31,8 +31,7 @@
|
||||
<div class="panel view-employees" id="panel{{ employee.id }}" data-user-id="{{ employee.id }}">
|
||||
<div class="oh-general__tab-target oh-profile-section">
|
||||
<div hx-get="{% url 'tasks-list-individual-view' %}?employee_id={{ employee.id }}&project_id={{ project.id }}" hx-trigger="load">
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
{% endfor %}
|
||||
|
||||
|
||||
@@ -6,4 +6,4 @@
|
||||
<script>
|
||||
$('#applyFilter').closest('form').find('[name=is_active]').val('true');
|
||||
$('#applyFilter').click();
|
||||
</script>
|
||||
</script>
|
||||
|
||||
@@ -16,4 +16,4 @@
|
||||
<h3 style="font-size:20px" class="oh-404__subtitle">{% trans "No projects assigned to this employee." %}</h3>
|
||||
</div>
|
||||
</div>
|
||||
{% endif %}
|
||||
{% endif %}
|
||||
|
||||
@@ -25,37 +25,37 @@
|
||||
.status-completed{
|
||||
border-left: 3.4px solid yellowgreen !important;
|
||||
border-radius: 4px 0 0 4px;
|
||||
|
||||
|
||||
}
|
||||
.status-cancelled {
|
||||
|
||||
|
||||
border-left: 3.4px solid red !important;
|
||||
border-radius: 4px 0 0 4px;
|
||||
|
||||
|
||||
}
|
||||
.status-expired {
|
||||
|
||||
|
||||
border-left: 3.4px solid gray !important;
|
||||
border-radius: 4px 0 0 4px;
|
||||
|
||||
|
||||
}
|
||||
.status-on_hold {
|
||||
|
||||
|
||||
border-left: 3.4px solid orange !important;
|
||||
border-radius: 4px 0 0 4px;
|
||||
|
||||
|
||||
}
|
||||
.status-in_progress {
|
||||
|
||||
|
||||
border-left: 3.4px solid rgb(103, 171, 238); !important;
|
||||
border-radius: 4px 0 0 4px;
|
||||
|
||||
|
||||
}
|
||||
.status-new {
|
||||
|
||||
|
||||
border-left: 3.4px solid cyan !important;
|
||||
border-radius: 4px 0 0 4px;
|
||||
|
||||
|
||||
}
|
||||
</style>
|
||||
<meta name="csrf-token" content="{{ csrf_token }}">
|
||||
@@ -77,9 +77,9 @@
|
||||
style="display: none"
|
||||
></div>
|
||||
|
||||
|
||||
<div
|
||||
class="oh-wrapper"
|
||||
|
||||
<div
|
||||
class="oh-wrapper"
|
||||
id="listContainer">
|
||||
<div class="animated-background">
|
||||
</div>
|
||||
@@ -102,7 +102,7 @@
|
||||
</button>
|
||||
<div class="oh-modal__dialog-body p-0 pt-2" id="projectImportModalBody">
|
||||
<form
|
||||
|
||||
|
||||
id="projectImportForm"
|
||||
enctype="multipart/form-data"
|
||||
>
|
||||
@@ -118,14 +118,14 @@
|
||||
<div class="modal-body">
|
||||
|
||||
{% csrf_token %}
|
||||
|
||||
|
||||
<div class="oh-dropdown__import-form">
|
||||
<label class="oh-dropdown__import-label" for="uploadFile">
|
||||
<ion-icon name="cloud-upload" class="oh-dropdown__import-form-icon md hydrated" role="img" aria-label="cloud upload"></ion-icon>
|
||||
<span class="oh-dropdown__import-form-title">{% trans "Upload a File" %}</span>
|
||||
<span class="oh-dropdown__import-form-text">{% trans "Drag and drop files here" %}</span>
|
||||
</label>
|
||||
<input type="file" name="file" id="projectImportFile" />
|
||||
<input type="file" name="file" id="projectImportFile" />
|
||||
</div>
|
||||
</div>
|
||||
<div class="modal-footer d-flex flex-row-reverse">
|
||||
@@ -140,10 +140,10 @@
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
<script src="{% static 'cbv/deleteFunc.js' %}"></script>
|
||||
<script src="{% static 'cbv/deleteFunc.js' %}"></script>
|
||||
<script src="{% static '/project/import.js' %}"></script>
|
||||
<script src="{% static '/project/project_action.js' %}"></script>
|
||||
|
||||
|
||||
|
||||
{% endblock %}
|
||||
|
||||
{% endblock %}
|
||||
|
||||
@@ -48,4 +48,4 @@
|
||||
</a>
|
||||
</div>
|
||||
{% endif %}
|
||||
</div>
|
||||
</div>
|
||||
|
||||
@@ -24,4 +24,4 @@
|
||||
<ion-icon name="trash-outline" role="img" class="md hydrated" aria-label="create outline"></ion-icon>
|
||||
{% trans "Delete" %}
|
||||
</a>
|
||||
{% endif %}
|
||||
{% endif %}
|
||||
|
||||
@@ -7,4 +7,4 @@
|
||||
style="width:40px;height:40px"></span>
|
||||
</a>
|
||||
</div>
|
||||
{% endif%}
|
||||
{% endif%}
|
||||
|
||||
@@ -38,4 +38,4 @@
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
@@ -6,4 +6,4 @@
|
||||
</button>
|
||||
</form>
|
||||
{% include 'generic/horilla_form.html' %}
|
||||
</div>
|
||||
</div>
|
||||
|
||||
@@ -118,8 +118,8 @@
|
||||
if (!$(event.target).closest('#enlargeattachmentContainer').length) {
|
||||
hideEnlargeattachment()
|
||||
}
|
||||
})
|
||||
})
|
||||
</script>
|
||||
|
||||
|
||||
{% endblock %}
|
||||
{% endblock %}
|
||||
|
||||
@@ -20,4 +20,4 @@
|
||||
<ion-icon name="trash-outline" role="img" class="md hydrated" aria-label="create outline"></ion-icon>
|
||||
{% trans "Delete" %}
|
||||
</a>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
@@ -26,4 +26,4 @@
|
||||
$(buttonId).click();
|
||||
}
|
||||
|
||||
</script>
|
||||
</script>
|
||||
|
||||
@@ -56,4 +56,4 @@
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
@@ -12,4 +12,4 @@
|
||||
$(this).closest("select")[0].dispatchEvent(new Event("change"));
|
||||
});
|
||||
});
|
||||
</script>
|
||||
</script>
|
||||
|
||||
@@ -34,4 +34,4 @@
|
||||
</button>
|
||||
{% include "generic/horilla_list_table.html" %}
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
@@ -1,51 +1,51 @@
|
||||
{% extends "index.html" %}
|
||||
{% load i18n %}{% load static %}
|
||||
|
||||
|
||||
{% block content %}
|
||||
<style>
|
||||
.completed--dot {
|
||||
background-color: yellowgreen;
|
||||
}
|
||||
|
||||
.in-progress--dot {
|
||||
background-color: orange;
|
||||
}
|
||||
|
||||
.new--dot {
|
||||
background-color: cyan;
|
||||
}
|
||||
|
||||
.status-completed {
|
||||
border-left: 3.4px solid yellowgreen !important;
|
||||
border-radius: 4px 0 0 4px;
|
||||
|
||||
}
|
||||
|
||||
.status-in_Progress {
|
||||
|
||||
border-left: 3.4px solid orange !important;
|
||||
border-radius: 4px 0 0 4px;
|
||||
|
||||
}
|
||||
</style>
|
||||
<meta name="csrf-token" content="{{ csrf_token }}">
|
||||
|
||||
|
||||
|
||||
<div hx-get="{% url " time-sheet-nav" %}" hx-trigger="load">
|
||||
</div>
|
||||
|
||||
|
||||
{% include "generic/components.html" %}
|
||||
|
||||
|
||||
<div class="oh-checkpoint-badge mb-2" id="selectedInstances" data-ids="[]" data-clicked="" style="display: none"></div>
|
||||
|
||||
|
||||
<div class="oh-wrapper" id="listContainer">
|
||||
<div class="animated-background"></div>
|
||||
</div>
|
||||
<script src="{% static 'cbv/deleteFunc.js' %}"></script>
|
||||
<script src="{% static 'time_sheet/time_sheet_action.js' %}"></script>
|
||||
{% endblock %}
|
||||
{% extends "index.html" %}
|
||||
{% load i18n %}{% load static %}
|
||||
|
||||
|
||||
{% block content %}
|
||||
<style>
|
||||
.completed--dot {
|
||||
background-color: yellowgreen;
|
||||
}
|
||||
|
||||
.in-progress--dot {
|
||||
background-color: orange;
|
||||
}
|
||||
|
||||
.new--dot {
|
||||
background-color: cyan;
|
||||
}
|
||||
|
||||
.status-completed {
|
||||
border-left: 3.4px solid yellowgreen !important;
|
||||
border-radius: 4px 0 0 4px;
|
||||
|
||||
}
|
||||
|
||||
.status-in_Progress {
|
||||
|
||||
border-left: 3.4px solid orange !important;
|
||||
border-radius: 4px 0 0 4px;
|
||||
|
||||
}
|
||||
</style>
|
||||
<meta name="csrf-token" content="{{ csrf_token }}">
|
||||
|
||||
|
||||
|
||||
<div hx-get="{% url 'time-sheet-nav' %}" hx-trigger="load">
|
||||
</div>
|
||||
|
||||
|
||||
{% include "generic/components.html" %}
|
||||
|
||||
|
||||
<div class="oh-checkpoint-badge mb-2" id="selectedInstances" data-ids="[]" data-clicked="" style="display: none"></div>
|
||||
|
||||
|
||||
<div class="oh-wrapper" id="listContainer">
|
||||
<div class="animated-background"></div>
|
||||
</div>
|
||||
<script src="{% static 'cbv/deleteFunc.js' %}"></script>
|
||||
<script src="{% static 'time_sheet/time_sheet_action.js' %}"></script>
|
||||
{% endblock %}
|
||||
|
||||
@@ -5,4 +5,4 @@
|
||||
<script>
|
||||
$('#applyFilter').closest('form').find('[name=field]').val('employee_id');
|
||||
$('#applyFilter').click();
|
||||
</script>
|
||||
</script>
|
||||
|
||||
@@ -23,4 +23,4 @@
|
||||
$(this).closest('.list-quick-add').toggleClass('d-none');
|
||||
});
|
||||
});
|
||||
</script>
|
||||
</script>
|
||||
|
||||
@@ -9,7 +9,7 @@
|
||||
{% for message in messages %}
|
||||
<div class="oh-alert oh-alert--animated {{message.tags}}">
|
||||
{{ message }}
|
||||
</div>
|
||||
</div>
|
||||
{% endfor %}
|
||||
</div>
|
||||
{% endif %}
|
||||
@@ -29,15 +29,15 @@
|
||||
class="oh-kanban__section stages"
|
||||
data-container='stages'
|
||||
id="kanban{{stage.id}}"
|
||||
|
||||
|
||||
data-project-id = "{{project.id}}"
|
||||
>
|
||||
<div class="oh-kanban__section-head stage ms-4" style="cursor: pointer;"
|
||||
<div class="oh-kanban__section-head stage ms-4" style="cursor: pointer;"
|
||||
data-stage-id="{{stage.id}}"
|
||||
data-sequence = "{{stage.sequence}}"
|
||||
data-project-id='{{project.id}}'>
|
||||
<div class="d-flex">
|
||||
<span class="oh-kanban__section-title" data-type="label">{{stage.title}}</span>
|
||||
<span class="oh-kanban__section-title" data-type="label">{{stage.title}}</span>
|
||||
</div>
|
||||
<div class="oh-tabs__input-badge-container">
|
||||
<span class="oh-badge oh-badge--secondary oh-badge--small oh-badge--round mr-1">
|
||||
@@ -45,21 +45,21 @@
|
||||
</span>
|
||||
</div>
|
||||
{% comment %} drop down menu {% endcomment %}
|
||||
<div class="oh-kanban__head-actions oh-kanban__dropdown" >
|
||||
<div class="oh-kanban__head-actions oh-kanban__dropdown" >
|
||||
<div class="oh-kanban__head-actions oh-kanban__dropdown">
|
||||
<div >
|
||||
<a class="" @click="open = !open" style="padding:20px"
|
||||
hx-get='{% url "create-task" stage.id %}'
|
||||
hx-target='#TaskFormTarget' class="oh-dropdown__link"
|
||||
data-toggle="oh-modal-toggle"
|
||||
hx-get='{% url "create-task" stage.id %}'
|
||||
hx-target='#TaskFormTarget' class="oh-dropdown__link"
|
||||
data-toggle="oh-modal-toggle"
|
||||
data-target="#TaskModal"
|
||||
data-key=".oh-kanban__section"
|
||||
onclick="handleCreateTaskClick(event)"
|
||||
>
|
||||
<ion-icon name="add-sharp" role="img" class="md hydrated mt-1" aria-label="add sharp"></ion-icon>
|
||||
</a>
|
||||
</a>
|
||||
</div>
|
||||
|
||||
|
||||
<button class="oh-btn oh-btn--small oh-btn--transparent oh-kanban__btn oh-kanban__dropdown-toggle">
|
||||
<ion-icon name="ellipsis-vertical-sharp" role="img" class="md hydrated" aria-label="ellipsis vertical sharp"></ion-icon>
|
||||
</button>
|
||||
@@ -67,14 +67,14 @@
|
||||
<div class="oh-dropdown__menu oh-dropdown__menu--right">
|
||||
<ul class="oh-dropdown__items">
|
||||
<li class="oh-dropdown__item">
|
||||
<a
|
||||
hx-get='{% url "update-project-stage" stage.id %}'
|
||||
hx-target='#TaskFormTarget' class="oh-dropdown__link"
|
||||
data-toggle="oh-modal-toggle"
|
||||
<a
|
||||
hx-get='{% url "update-project-stage" stage.id %}'
|
||||
hx-target='#TaskFormTarget' class="oh-dropdown__link"
|
||||
data-toggle="oh-modal-toggle"
|
||||
data-target="#TaskModal"
|
||||
data-key=".oh-kanban__section"
|
||||
>{% trans "Edit" %}
|
||||
</a>
|
||||
</a>
|
||||
</li>
|
||||
<li class="oh-dropdown__item">
|
||||
<form action="{% url 'delete-project-stage' stage.id %}" onsubmit="return confirm('{% trans "Are you sure you want to delete this stage?" %}');" method="post">
|
||||
@@ -86,14 +86,14 @@
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
{% comment %} task inside stage {% endcomment %}
|
||||
<div
|
||||
<div
|
||||
class="oh-kanban__section-body ui-sortable tasks-container"
|
||||
style="left-padding:10px;"
|
||||
data-stage-id='{{stage.id}}'
|
||||
style="left-padding:10px;"
|
||||
data-stage-id='{{stage.id}}'
|
||||
data-project-id="{{project.id}}"
|
||||
>
|
||||
|
||||
@@ -105,11 +105,11 @@
|
||||
data-task="{{task.title}}"
|
||||
id="task-{{task.id}}"
|
||||
style="cursor: pointer;overflow: visible;left-padding:10px"
|
||||
>
|
||||
>
|
||||
<div class="oh-kanban__card-head">
|
||||
<a hx-get='{% url "task-details" task.id %}?view=card'
|
||||
hx-target='#TaskFormTarget' class="oh-dropdown__link"
|
||||
data-toggle="oh-modal-toggle"
|
||||
<a hx-get='{% url "task-details" task.id %}?view=card'
|
||||
hx-target='#TaskFormTarget' class="oh-dropdown__link"
|
||||
data-toggle="oh-modal-toggle"
|
||||
data-target="#TaskModal"
|
||||
data-key=".oh-kanban__section"
|
||||
>
|
||||
@@ -121,9 +121,9 @@
|
||||
alt="task"
|
||||
/>
|
||||
</div>
|
||||
|
||||
|
||||
<div class="oh-kanban-card__details">
|
||||
<span class="oh-kanban-card__title">
|
||||
<span class="oh-kanban-card__title">
|
||||
{{task}}
|
||||
</span>
|
||||
<span class="oh-kanban-card__subtitle">{{task.task_manager}} </span><br>
|
||||
@@ -132,10 +132,10 @@
|
||||
</div>
|
||||
</div>
|
||||
</a>
|
||||
|
||||
|
||||
|
||||
{% comment %} drop down inside card {% endcomment %}
|
||||
|
||||
|
||||
<div class="oh-kanban__card-actions oh-kanban__dropdown">
|
||||
<button
|
||||
class="oh-btn oh-btn--small oh-btn--transparent oh-kanban__btn oh-kanban__dropdown-toggle"
|
||||
@@ -151,14 +151,14 @@
|
||||
<div class="oh-dropdown__menu oh-dropdown__menu--right">
|
||||
<ul class="oh-dropdown__items">
|
||||
<li class="oh-dropdown__item">
|
||||
<a
|
||||
hx-get='{% url "update-task" task.id %}?project_task=true'
|
||||
hx-target='#TaskFormTarget' class="oh-dropdown__link"
|
||||
data-toggle="oh-modal-toggle"
|
||||
<a
|
||||
hx-get='{% url "update-task" task.id %}?project_task=true'
|
||||
hx-target='#TaskFormTarget' class="oh-dropdown__link"
|
||||
data-toggle="oh-modal-toggle"
|
||||
data-target="#TaskModal"
|
||||
data-key=".oh-kanban__section"
|
||||
>{% trans "Edit" %}
|
||||
</a>
|
||||
</a>
|
||||
</li>
|
||||
<li class="oh-dropdown__item">
|
||||
<form action="{% url 'delete-task' task.id %}?view=card" onsubmit="return confirm('{% trans "Are you sure you want to delete this task?" %}');" method="post">
|
||||
@@ -171,14 +171,14 @@
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
|
||||
</div>
|
||||
{% endif %}
|
||||
{% endfor %}
|
||||
{% endfor %}
|
||||
</div>
|
||||
</div>
|
||||
{% endfor %}
|
||||
|
||||
|
||||
{% comment %} <a
|
||||
class="oh-btn oh-btn--secondary oh-btn--shadow"
|
||||
data-toggle="oh-modal-toggle"
|
||||
@@ -188,10 +188,10 @@
|
||||
>
|
||||
<ion-icon class="me-1" name="add-outline"></ion-icon>{% trans "Stage" %}
|
||||
</a> {% endcomment %}
|
||||
|
||||
|
||||
</div>
|
||||
|
||||
</div>
|
||||
|
||||
</div>
|
||||
</div>
|
||||
{% else %}
|
||||
<div style="height: 380px; display:flex;align-items: center;justify-content: center;" class="">
|
||||
@@ -201,9 +201,7 @@
|
||||
</div>
|
||||
</div>
|
||||
{% endif %}
|
||||
|
||||
|
||||
|
||||
{% comment %} js files {% endcomment %}
|
||||
<script src="{% static '/project/task_pipeline.js' %}"></script>
|
||||
|
||||
|
||||
|
||||
@@ -1,66 +1,65 @@
|
||||
"""
|
||||
This module is used to write custom template filters.
|
||||
"""
|
||||
|
||||
from django.template.defaultfilters import register
|
||||
|
||||
from project.models import Project
|
||||
|
||||
|
||||
@register.filter(name="task_crud_perm")
|
||||
def task_crud_perm(user,task):
|
||||
def task_crud_perm(user, task):
|
||||
"""
|
||||
This method is used to check the requested user is task manager or project manager or has permission
|
||||
"""
|
||||
try:
|
||||
employee = user.employee_get
|
||||
is_task_manager = (employee in task.task_managers.all())
|
||||
is_project_manager = (employee in task.project.managers.all())
|
||||
is_task_manager = employee in task.task_managers.all()
|
||||
is_project_manager = employee in task.project.managers.all()
|
||||
return is_task_manager or is_project_manager
|
||||
|
||||
|
||||
except Exception as _:
|
||||
return False
|
||||
|
||||
|
||||
@register.filter(name="time_sheet_crud_perm")
|
||||
def time_sheet_crud_perm(user,timesheet):
|
||||
def time_sheet_crud_perm(user, timesheet):
|
||||
"""
|
||||
This method is used to check the requested user is task manager or project manager or has permission
|
||||
"""
|
||||
try:
|
||||
employee = user.employee_get
|
||||
is_task_manager = (employee in timesheet.task_id.task_managers.all())
|
||||
is_project_manager = (employee in timesheet.project_id.managers.all())
|
||||
is_own_timesheet = (timesheet.employee_id == employee )
|
||||
is_task_manager = employee in timesheet.task_id.task_managers.all()
|
||||
is_project_manager = employee in timesheet.project_id.managers.all()
|
||||
is_own_timesheet = timesheet.employee_id == employee
|
||||
|
||||
return is_task_manager or is_project_manager or is_own_timesheet
|
||||
|
||||
|
||||
except Exception as _:
|
||||
return False
|
||||
|
||||
|
||||
@register.filter(name="is_project_manager_or_member")
|
||||
def is_project_manager_or_member(user,project):
|
||||
def is_project_manager_or_member(user, project):
|
||||
"""
|
||||
This method will return true, if the user is manger or member of the project
|
||||
"""
|
||||
employee = user.employee_get
|
||||
|
||||
|
||||
return (
|
||||
Project.objects.filter(
|
||||
id=project.id, managers=employee
|
||||
).exists()
|
||||
or Project.objects.filter(
|
||||
id=project.id, members=employee
|
||||
).exists()
|
||||
Project.objects.filter(id=project.id, managers=employee).exists()
|
||||
or Project.objects.filter(id=project.id, members=employee).exists()
|
||||
)
|
||||
|
||||
|
||||
@register.filter(name="is_project_manager")
|
||||
def is_project_manager(user,project):
|
||||
def is_project_manager(user, project):
|
||||
"""
|
||||
This method will return true, if the user is manager of the project
|
||||
"""
|
||||
employee = user.employee_get
|
||||
return Project.objects.filter(id=project.id,managers=employee).exists()
|
||||
return Project.objects.filter(id=project.id, managers=employee).exists()
|
||||
|
||||
|
||||
@register.filter(name="is_task_manager")
|
||||
def is_task_manager(user, task):
|
||||
@@ -68,8 +67,8 @@ def is_task_manager(user, task):
|
||||
This method will return True if the user is a manager of the task.
|
||||
"""
|
||||
try:
|
||||
employee = user.employee_get
|
||||
employee = user.employee_get
|
||||
return employee in task.task_managers.all()
|
||||
except AttributeError:
|
||||
# Handle cases where user or task might not have the expected structure
|
||||
return False
|
||||
return False
|
||||
|
||||
Reference in New Issue
Block a user