Pylint fixes

This commit is contained in:
Horilla
2025-02-14 10:08:50 +05:30
parent d453c1d192
commit 1634540071
30 changed files with 330 additions and 292 deletions

View File

@@ -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
)

View File

@@ -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

View File

@@ -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")

View File

@@ -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

View File

@@ -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(

View File

@@ -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();
"
""",
),

View File

@@ -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();
"
""",
),

View File

@@ -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>

View File

@@ -37,4 +37,4 @@
</div>
</div>
</div>
</div>
</div>

View File

@@ -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>

View File

@@ -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 %}

View File

@@ -6,4 +6,4 @@
<script>
$('#applyFilter').closest('form').find('[name=is_active]').val('true');
$('#applyFilter').click();
</script>
</script>

View File

@@ -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 %}

View File

@@ -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 %}

View File

@@ -48,4 +48,4 @@
</a>
</div>
{% endif %}
</div>
</div>

View File

@@ -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 %}

View File

@@ -7,4 +7,4 @@
style="width:40px;height:40px"></span>
</a>
</div>
{% endif%}
{% endif%}

View File

@@ -38,4 +38,4 @@
</div>
</div>
</div>
</div>
</div>

View File

@@ -6,4 +6,4 @@
</button>
</form>
{% include 'generic/horilla_form.html' %}
</div>
</div>

View File

@@ -118,8 +118,8 @@
if (!$(event.target).closest('#enlargeattachmentContainer').length) {
hideEnlargeattachment()
}
})
})
</script>
{% endblock %}
{% endblock %}

View File

@@ -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>

View File

@@ -26,4 +26,4 @@
$(buttonId).click();
}
</script>
</script>

View File

@@ -56,4 +56,4 @@
</div>
</div>
</div>
</div>
</div>

View File

@@ -12,4 +12,4 @@
$(this).closest("select")[0].dispatchEvent(new Event("change"));
});
});
</script>
</script>

View File

@@ -34,4 +34,4 @@
</button>
{% include "generic/horilla_list_table.html" %}
</div>
</div>
</div>

View File

@@ -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 %}

View File

@@ -5,4 +5,4 @@
<script>
$('#applyFilter').closest('form').find('[name=field]').val('employee_id');
$('#applyFilter').click();
</script>
</script>

View File

@@ -23,4 +23,4 @@
$(this).closest('.list-quick-add').toggleClass('d-none');
});
});
</script>
</script>

View File

@@ -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>

View File

@@ -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