Files
ihrm/project/forms.py
2025-09-16 10:40:39 +05:30

330 lines
9.4 KiB
Python

from typing import Any
from django import forms
from django.db.models import Q
from django.template.loader import render_to_string
from django.utils.translation import gettext_lazy as _
from base.forms import ModelForm
from horilla.horilla_middlewares import _thread_locals
from .models import *
class ProjectForm(ModelForm):
"""
Form for Project model
"""
cols = {"description": 12}
class Meta:
"""
Meta class to add the additional info
"""
model = Project
fields = "__all__"
class ProjectTimeSheetForm(ModelForm):
"""
Form for Project model in Time sheet form
"""
def __init__(self, *args, **kwargs):
super(ProjectTimeSheetForm, self).__init__(*args, **kwargs)
self.fields["status"].widget.attrs.update(
{
"style": "width: 100%; height: 47px;",
"class": "oh-select",
}
)
def __init__(self, *args, request=None, **kwargs):
super(ProjectTimeSheetForm, self).__init__(*args, **kwargs)
self.fields["managers"].widget.attrs.update({"id": "managers_id"})
self.fields["status"].widget.attrs.update({"id": "status_id"})
self.fields["members"].widget.attrs.update({"id": "members_id"})
self.fields["title"].widget.attrs.update({"id": "id_project"})
class Meta:
"""
Meta class to add the additional info
"""
model = Project
fields = "__all__"
class TaskForm(ModelForm):
"""
Form for Task model
"""
class Meta:
"""
Meta class to add the additional info
"""
model = Task
fields = "__all__"
# exclude = ("project_id",)
widgets = {
"project": forms.HiddenInput(),
"stage": forms.HiddenInput(),
"sequence": forms.HiddenInput(),
}
class QuickTaskForm(ModelForm):
class Meta:
model = Task
fields = ["title", "task_managers", "project", "stage", "end_date"]
widgets = {
"project": forms.HiddenInput(),
"stage": forms.HiddenInput(),
"end_date": forms.HiddenInput(),
}
def __init__(self, *args, **kwargs):
super(QuickTaskForm, self).__init__(*args, **kwargs)
self.fields["title"].widget.attrs.update(
{"class": "oh-input w-100 mb-2", "placeholder": _("Task Title")}
)
self.fields["task_managers"].required = True
class TaskFormCreate(ModelForm):
"""
Form for Task model in create button inside task view
"""
class Meta:
"""
Meta class to add the additional info
"""
model = Task
fields = "__all__"
# exclude = ("project_id",)
widgets = {
"project": forms.HiddenInput(),
"sequence": forms.HiddenInput(),
"stage": forms.SelectMultiple(
attrs={
"class": "oh-select oh-select-2",
"onchange": "keyResultChange($(this))",
}
),
}
def __init__(self, *args, request=None, **kwargs):
super(TaskFormCreate, self).__init__(*args, **kwargs)
self.fields["stage"].widget.attrs.update({"id": "project_stage"})
def as_p(self):
"""
Render the form fields as HTML table rows with Bootstrap styling.
"""
context = {"form": self}
table_html = render_to_string("common_form.html", context)
return table_html
class TaskAllForm(ModelForm):
"""
Form for Task model in task all view
"""
cols = {
"description": 12,
}
class Meta:
"""
Meta class to add the additional info
"""
model = Task
fields = "__all__"
widgets = {
"sequence": forms.HiddenInput(),
}
def __init__(self, *args, request=None, **kwargs):
super(TaskAllForm, self).__init__(*args, **kwargs)
request = getattr(_thread_locals, "request")
self.fields["stage"].widget.attrs.update({"id": "project_stage"})
self.fields["project"].widget.attrs.update(
{
"onchange": """
$('[name=dynamic_project]').val(this.value);
setTimeout(() => {
$('#getStageButton').click();
}, 100);
"""
}
)
request = getattr(_thread_locals, "request", None)
employee = request.user.employee_get
if not self.instance.pk:
if request.user.is_superuser or request.user.has_perm("project.add_task"):
projects = Project.objects.all()
elif Project.objects.filter(managers=employee).exists():
projects = Project.objects.filter(managers=employee)
else:
projects = Project.objects.none()
self.fields["project"].queryset = projects
else:
task = self.instance
if request.user.is_superuser:
projects = Project.objects.all()
elif employee in task.project.managers.all():
projects = Project.objects.filter(managers=employee)
elif employee in task.task_managers.all():
# Limit fields accessible to task managers
projects = Project.objects.filter(id=self.instance.project.id)
self.fields["project"].disabled = True
self.fields["stage"].disabled = True
self.fields["task_managers"].disabled = True
else:
projects = Project.objects.filter(id=self.instance.project.id)
self.fields["project"].queryset = projects
class TimeSheetForm(ModelForm):
"""
Form for Time Sheet model
"""
cols = {"description": 12}
class Meta:
"""
Meta class to add the additional info
"""
model = TimeSheet
fields = "__all__"
def __init__(self, *args, request=None, **kwargs):
super(TimeSheetForm, self).__init__(*args, **kwargs)
request = getattr(_thread_locals, "request", None)
employee = request.user.employee_get
hx_trigger_value = "change" if self.instance.id else "load,change"
if not self.initial.get("project_id") == "dynamic_create":
self.fields["project_id"].widget.attrs.update(
{
"hx-target": "#id_task_id_parent_div",
"hx-trigger": hx_trigger_value,
"hx-include": "#id_task_id",
"hx-swap": "innerHTML",
"hx-get": "/project/get-tasks-of-project/",
}
)
self.fields["task_id"].widget.attrs.update(
{
"hx-target": "#id_employee_id_parent_div",
"hx-include": "#id_project_id",
"hx-trigger": hx_trigger_value,
"hx-swap": "innerHTML",
"hx-get": "/project/get-members-of-project/",
}
)
if not request.user.has_perm("project.add_timesheet"):
projects = Project.objects.filter(
Q(managers=employee)
| Q(members=employee)
| Q(task__task_members=employee)
| Q(task__task_managers=employee)
).distinct()
self.fields["project_id"].queryset = projects
class TimesheetInTaskForm(ModelForm):
class Meta:
"""
Meta class to add the additional info
"""
model = TimeSheet
fields = "__all__"
widgets = {
"project_id": forms.HiddenInput(),
"task_id": forms.HiddenInput(),
}
class ProjectStageForm(ModelForm):
"""
Form for Project stage model
"""
cols = {
"title": 12,
}
class Meta:
"""
Meta class to add the additional info
"""
model = ProjectStage
fields = "__all__"
# exclude = ("project",)
widgets = {"project": forms.HiddenInput()}
class TaskTimeSheetForm(ModelForm):
"""
Form for Task model in timesheet form
"""
class Meta:
"""
Meta class to add the additional info
"""
model = Task
fields = "__all__"
widgets = {
"project": forms.HiddenInput(),
}
def __init__(self, *args, **kwargs):
super(TaskTimeSheetForm, self).__init__(*args, **kwargs)
# Add style to the start_date and end_date fields
# self.fields["stage"].choices.append(
# ("create_new_project", "Create a new project")
# )
self.fields["status"].widget.attrs.update(
{
"style": "width: 100%; height: 47px;",
"class": "oh-select",
}
)
self.fields["description"].widget.attrs.update(
{
"style": "width: 100%; height: 130px;",
"class": "oh-select",
}
)
self.fields["description"].widget.attrs.update(
{
"style": "width: 100%; height: 130px;",
"class": "oh-select",
}
)
self.fields["stage"].widget.attrs.update({"id": "project_stage"})