diff --git a/project/cbv/dashboard.py b/project/cbv/dashboard.py index 5c8deee8d..40ccc2220 100644 --- a/project/cbv/dashboard.py +++ b/project/cbv/dashboard.py @@ -10,6 +10,7 @@ from django.db.models import Count, Q from django.db.models.query import QuerySet from django.urls import resolve, reverse from django.utils.decorators import method_decorator +from django.utils.functional import cached_property from django.utils.translation import gettext_lazy as _ from base.methods import get_subordinates @@ -70,16 +71,6 @@ class ProjectDetailView(HorillaDetailedView): model = Project title = _("Details") header = {"title": "title", "subtitle": "", "avatar": "get_avatar"} - body = [ - (_("Manager"), "manager"), - (_("Members"), "get_members"), - (_("Status"), "status_column"), - (_("No of Tasks"), "task_count"), - (_("Start date"), "start_date"), - (_("End date"), "end_date"), - (_("Document"), "get_document_html"), - (_("Description"), "description"), - ] def __init__(self, **kwargs: Any) -> None: super().__init__(**kwargs) @@ -106,3 +97,17 @@ class ProjectDetailView(HorillaDetailedView): queryset = super().get_queryset() queryset = queryset.annotate(task_count=Count("task")) return queryset + + @cached_property + def body(self): + get_field = self.model()._meta.get_field + return [ + (get_field("managers").verbose_name, "get_managers"), + (get_field("members").verbose_name, "get_members"), + (get_field("status").verbose_name, "get_status_display"), + (_("No of Tasks"), "task_count"), + (get_field("start_date").verbose_name, "start_date"), + (get_field("end_date").verbose_name, "end_date"), + (get_field("document").verbose_name, "get_document_html"), + (get_field("description").verbose_name, "description"), + ] diff --git a/project/cbv/projects.py b/project/cbv/projects.py index 1890fc552..f258e90f6 100644 --- a/project/cbv/projects.py +++ b/project/cbv/projects.py @@ -56,7 +56,12 @@ class ProjectsNavView(HorillaNavView): Nav bar """ + filter_form_context_name = "form" + filter_instance = ProjectFilter() + search_swap_target = "#listContainer" + group_by_fields = ["status", "is_active"] template_name = "cbv/projects/project_nav.html" + filter_body_template = "cbv/projects/filter.html" def __init__(self, **kwargs: Any) -> None: super().__init__(**kwargs) @@ -139,16 +144,6 @@ class ProjectsNavView(HorillaNavView): hx-get="{reverse('create-project')}" """ - group_by_fields = [ - ("status", _("Status")), - ("is_active", _("Is active")), - ] - nav_title = Project._meta.verbose_name_plural - filter_instance = ProjectFilter() - filter_form_context_name = "form" - filter_body_template = "cbv/projects/filter.html" - search_swap_target = "#listContainer" - @method_decorator(login_required, name="dispatch") @method_decorator( @@ -159,6 +154,9 @@ class ProjectsList(HorillaListView): Projects list view """ + model = Project + filter_class = ProjectFilter + def get_queryset(self): queryset = super().get_queryset() if not self.request.user.has_perm("project.view_project"): @@ -178,26 +176,26 @@ class ProjectsList(HorillaListView): @cached_property def columns(self): - instance = self.model() + get_field = self.model()._meta.get_field return [ - (instance._meta.get_field("title").verbose_name, "title"), - (instance._meta.get_field("managers").verbose_name, "get_managers"), - (instance._meta.get_field("members").verbose_name, "get_members"), - (instance._meta.get_field("status").verbose_name, "status_column"), - (instance._meta.get_field("start_date").verbose_name, "start_date"), - (instance._meta.get_field("end_date").verbose_name, "end_date"), - (instance._meta.get_field("document").verbose_name, "get_document_html"), - (instance._meta.get_field("description").verbose_name, "get_description"), + (get_field("title").verbose_name, "title"), + (get_field("managers").verbose_name, "get_managers"), + (get_field("members").verbose_name, "get_members"), + (get_field("status").verbose_name, "get_status_display"), + (get_field("start_date").verbose_name, "start_date"), + (get_field("end_date").verbose_name, "end_date"), + (get_field("document").verbose_name, "get_document_html"), + (get_field("description").verbose_name, "get_description"), ] - model = Project - filter_class = ProjectFilter - - sortby_mapping = [ - ("Project", "title"), - ("Start Date", "start_date"), - ("End Date", "end_date"), - ] + @cached_property + def sortby_mapping(self): + get_field = self.model()._meta.get_field + return [ + (get_field("title").verbose_name, "title"), + (get_field("start_date").verbose_name, "start_date"), + (get_field("end_date").verbose_name, "end_date"), + ] row_status_indications = [ ( @@ -281,8 +279,8 @@ class ProjectFormView(HorillaFormView): form view for create project """ - form_class = ProjectForm model = Project + form_class = ProjectForm new_display_title = _("Create") + " " + model._meta.verbose_name def __init__(self, **kwargs): @@ -393,7 +391,7 @@ class ProjectCardView(HorillaCardView): details = { "image_src": "get_avatar", "title": "{get_task_badge_html}", - "subtitle": "Status : {status_column}
Start date : {start_date}
End date : {end_date}", + "subtitle": "Status : {get_status_display}
Start date : {start_date}
End date : {end_date}", } card_status_class = "status-{status}" diff --git a/project/cbv/tasks.py b/project/cbv/tasks.py index 7d781cde0..d729f0560 100644 --- a/project/cbv/tasks.py +++ b/project/cbv/tasks.py @@ -12,6 +12,7 @@ from django.http import HttpResponse from django.shortcuts import render from django.urls import reverse from django.utils.decorators import method_decorator +from django.utils.functional import cached_property from django.utils.translation import gettext_lazy as _ from base.methods import get_subordinates @@ -52,6 +53,7 @@ class TaskListView(HorillaListView): model = Task filter_class = TaskAllFilter + action_method = "actions" def __init__(self, **kwargs: Any) -> None: super().__init__(**kwargs) @@ -81,26 +83,30 @@ class TaskListView(HorillaListView): ) return queryset.distinct() - columns = [ - (_("Task"), "title"), - (_("Project"), "project"), - (_("Stage"), "stage"), - (_("Mangers"), "get_managers"), - (_("Members"), "get_members"), - (_("End Date"), "end_date"), - (_("Status"), "status_column"), - (_("Description"), "description"), - ] + @cached_property + def columns(self): + get_field = self.model()._meta.get_field + return [ + (get_field("title").verbose_name, "title"), + (get_field("project").verbose_name, "project"), + (get_field("stage").verbose_name, "stage"), + (get_field("task_managers").verbose_name, "get_managers"), + (get_field("task_members").verbose_name, "get_members"), + (get_field("end_date").verbose_name, "end_date"), + (get_field("status").verbose_name, "get_status_display"), + (get_field("description").verbose_name, "get_description"), + ] - sortby_mapping = [ - ("Task", "title"), - ("Project", "project__title"), - ("Stage", "stage"), - ("End Date", "end_date"), - ("Status", "status"), - ] - - action_method = "actions" + @cached_property + def sortby_mapping(self): + get_field = self.model()._meta.get_field + return [ + (get_field("title").verbose_name, "title"), + (get_field("project").verbose_name, "project__title"), + (get_field("stage").verbose_name, "stage"), + (get_field("end_date").verbose_name, "end_date"), + (get_field("status").verbose_name, "status"), + ] row_status_indications = [ ( @@ -164,11 +170,15 @@ class TasksNavBar(HorillaNavView): navbar of teh page """ - nav_title = _("Tasks") - filter_instance = TaskAllFilter() + group_by_fields = [ + "project", + "stage", + "status", + ] filter_form_context_name = "form" - filter_body_template = "cbv/tasks/task_filter.html" + filter_instance = TaskAllFilter() search_swap_target = "#listContainer" + filter_body_template = "cbv/tasks/task_filter.html" def __init__(self, **kwargs: Any) -> None: super().__init__(**kwargs) @@ -237,12 +247,6 @@ class TasksNavBar(HorillaNavView): }, ] - group_by_fields = [ - ("project", _("Project")), - ("stage", _("Stage")), - ("status", _("Status")), - ] - @method_decorator(login_required, name="dispatch") class TaskCreateForm(HorillaFormView): @@ -250,10 +254,10 @@ class TaskCreateForm(HorillaFormView): Form view for create and update tasks """ - form_class = TaskAllForm model = Task + form_class = TaskAllForm template_name = "cbv/tasks/task_form.html" - new_display_title = _("Create Task") + new_display_title = _("Create") + " " + model._meta.verbose_name def __init__(self, **kwargs: Any) -> None: super().__init__(**kwargs) @@ -407,22 +411,23 @@ class TaskDetailView(HorillaDetailedView): model = Task title = _("Task Details") - + action_method = "detail_view_actions" header = {"title": "title", "subtitle": "project", "avatar": "get_avatar"} - body = [ - (_("Task"), "title"), - (_("Project"), "project"), - (_("Stage"), "stage"), - (_("Task Mangers"), "get_managers"), - (_("Task Members"), "get_members"), - (_("Status"), "status_column"), - (_("End Date"), "end_date"), - (_("Description"), "description"), - (_("Document"), "document_col", True), - ] - - action_method = "detail_view_actions" + @cached_property + def body(self): + get_field = self.model()._meta.get_field + return [ + (get_field("title").verbose_name, "title"), + (get_field("project").verbose_name, "project"), + (get_field("stage").verbose_name, "stage"), + (get_field("task_managers").verbose_name, "get_managers"), + (get_field("task_members").verbose_name, "get_members"), + (get_field("status").verbose_name, "get_status_display"), + (get_field("end_date").verbose_name, "end_date"), + (get_field("description").verbose_name, "description"), + (get_field("document").verbose_name, "document_col", True), + ] @method_decorator(login_required, name="dispatch") diff --git a/project/cbv/timesheet.py b/project/cbv/timesheet.py index 57d9634c3..296b6ae95 100644 --- a/project/cbv/timesheet.py +++ b/project/cbv/timesheet.py @@ -11,6 +11,7 @@ from django.http import HttpResponse from django.shortcuts import render from django.urls import resolve, reverse from django.utils.decorators import method_decorator +from django.utils.functional import cached_property from django.utils.translation import gettext_lazy as _ from employee.models import Employee @@ -52,7 +53,22 @@ class TimeSheetNavView(HorillaNavView): Nav bar """ + filter_form_context_name = "form" + filter_instance = TimeSheetFilter() + search_swap_target = "#listContainer" template_name = "cbv/timesheet/timesheet_nav.html" + filter_body_template = "cbv/timesheet/filter.html" + group_by_fields = [ + "employee_id", + "project_id", + "date", + "status", + "employee_id__employee_work_info__reporting_manager_id", + "employee_id__employee_work_info__department_id", + "employee_id__employee_work_info__job_position_id", + "employee_id__employee_work_info__employee_type_id", + "employee_id__employee_work_info__company_id", + ] def __init__(self, **kwargs: Any) -> None: super().__init__(**kwargs) @@ -105,27 +121,6 @@ class TimeSheetNavView(HorillaNavView): 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__department_id", _("Department")), - ("employee_id__employee_work_info__job_position_id", _("Job Position")), - ("employee_id__employee_work_info__employee_type_id", _("Employement Type")), - ("employee_id__employee_work_info__company_id", _("Company")), - ] - - nav_title = _("Time Sheet") - filter_instance = TimeSheetFilter() - filter_form_context_name = "form" - filter_body_template = "cbv/timesheet/filter.html" - search_swap_target = "#listContainer" - @method_decorator(login_required, name="dispatch") @method_decorator( @@ -136,6 +131,9 @@ class TimeSheetList(HorillaListView): Time sheet list view """ + model = TimeSheet + filter_class = TimeSheetFilter + def get_queryset(self): queryset = super().get_queryset() if not self.request.user.has_perm("project.view_timesheet"): @@ -153,26 +151,37 @@ class TimeSheetList(HorillaListView): self.search_url = reverse("time-sheet-list") self.action_method = "actions" - model = TimeSheet - filter_class = TimeSheetFilter + @cached_property + def columns(self): + get_field = self.model()._meta.get_field + return [ + ( + get_field("employee_id").verbose_name, + "employee_id", + "employee_id__get_avatar", + ), + (get_field("project_id").verbose_name, "project_id"), + (get_field("task_id").verbose_name, "task_id"), + (get_field("date").verbose_name, "date"), + (get_field("time_spent").verbose_name, "time_spent"), + (get_field("status").verbose_name, "get_status_display"), + (get_field("description").verbose_name, "description"), + ] - columns = [ - (_("Employee"), "employee_id", "employee_id__get_avatar"), - (_("Project"), "project_id"), - (_("Task"), "task_id"), - (_("Date"), "date"), - (_("Time Spent"), "time_spent"), - (_("Status"), "status_column"), - (_("Description"), "description"), - ] - - sortby_mapping = [ - ("Employee", "employee_id__employee_first_name", "employee_id__get_avatar"), - ("Project", "project_id__title"), - ("Task", "task_id__title"), - ("Time Spent", "time_spent"), - ("Date", "date"), - ] + @cached_property + def sortby_mapping(self): + get_field = self.model()._meta.get_field + return [ + ( + get_field("employee_id").verbose_name, + "employee_id__employee_first_name", + "employee_id__get_avatar", + ), + (get_field("project_id").verbose_name, "project_id__title"), + (get_field("task_id").verbose_name, "task_id__title"), + (get_field("time_spent").verbose_name, "time_spent"), + (get_field("date").verbose_name, "date"), + ] row_status_indications = [ ( @@ -267,6 +276,10 @@ class TimeSheetFormView(HorillaFormView): form view for create project """ + form_class = TimeSheetForm + model = TimeSheet + new_display_title = _("Create") + " " + model._meta.verbose_name + def __init__(self, **kwargs: Any) -> None: super().__init__(**kwargs) self.dynamic_create_fields = [ @@ -279,7 +292,7 @@ class TimeSheetFormView(HorillaFormView): form_class = TimeSheetForm model = TimeSheet - new_display_title = _("Create Time Sheet") + new_display_title = _("Create") + " " + model._meta.verbose_name # template_name = "cbv/timesheet/form.html" def get_initial(self) -> dict: @@ -485,13 +498,15 @@ class TimeSheetDetailView(HorillaDetailedView): "subtitle": "project_id", "avatar": "employee_id__get_avatar", } - - body = [ - (_("Task"), "task_id"), - (_("Date"), "date"), - (_("Time Spent"), "time_spent"), - (_("Status"), "status_column"), - (_("Description"), "description"), - ] - action_method = "detail_actions" + + @cached_property + def body(self): + get_field = self.model()._meta.get_field + return [ + (get_field("task_id").verbose_name, "task_id"), + (get_field("date").verbose_name, "date"), + (get_field("time_spent").verbose_name, "time_spent"), + (get_field("status").verbose_name, "get_status_display"), + (get_field("description").verbose_name, "description"), + ] diff --git a/project/filters.py b/project/filters.py index 8e6263ea9..00e48e762 100644 --- a/project/filters.py +++ b/project/filters.py @@ -77,6 +77,7 @@ class TaskAllFilter(HorillaFilterSet): field_name="end_date", lookup_expr="lte", widget=forms.DateInput(attrs={"type": "date"}), + label=_("End Till"), ) class Meta: @@ -91,6 +92,12 @@ class TaskAllFilter(HorillaFilterSet): "status", ] + def __init__(self, *args, **kwargs): + super().__init__(*args, **kwargs) + self.form.fields["end_till"].label = ( + f"{self.Meta.model()._meta.get_field('end_date').verbose_name} Till" + ) + def filter_by_task(self, queryset, _, value): queryset = queryset.filter(title__icontains=value) return queryset @@ -140,6 +147,11 @@ class TimeSheetFilter(HorillaFilterSet): "status", ] + def __init__(self, *args, **kwargs): + super().__init__(*args, **kwargs) + self.form.fields["start_from"].label = _("Start Date From") + self.form.fields["end_till"].label = _("End Date Till") + def filter_by_employee(self, queryset, _, value): """ Filter queryset by first name or last name. diff --git a/project/models.py b/project/models.py index bbf777780..cba958850 100644 --- a/project/models.py +++ b/project/models.py @@ -236,9 +236,6 @@ class Project(HorillaModel): def __str__(self): return self.title - def status_column(self): - return dict(self.PROJECT_STATUS).get(self.status) - class Meta: """ Meta class to add the additional info @@ -540,7 +537,7 @@ class TimeSheet(HorillaModel): on_delete=models.CASCADE, verbose_name=_("Employee"), ) - date = models.DateField(default=timezone.now) + date = models.DateField(default=timezone.now, verbose_name=_("Date")) time_spent = models.CharField( null=True, default="00:00", @@ -635,5 +632,5 @@ class TimeSheet(HorillaModel): return url class Meta: - verbose_name = _("TimeSheet") - verbose_name_plural = _("TimeSheets") + verbose_name = _("Time Sheet") + verbose_name_plural = _("Time Sheets") diff --git a/project/templates/cbv/tasks/task_filter.html b/project/templates/cbv/tasks/task_filter.html index 13d8f1ae3..6e8e33bf5 100644 --- a/project/templates/cbv/tasks/task_filter.html +++ b/project/templates/cbv/tasks/task_filter.html @@ -9,32 +9,31 @@
- - {{form.task_manager}} + + {{form.task_managers}}
- + {{form.stage}}
- + {{form.project}}
- + {{form.status}}
- + {{form.end_till}}
- -
diff --git a/project/templates/cbv/timesheet/filter.html b/project/templates/cbv/timesheet/filter.html index abd72ebea..daa4e40b3 100644 --- a/project/templates/cbv/timesheet/filter.html +++ b/project/templates/cbv/timesheet/filter.html @@ -6,29 +6,29 @@
- + {{form.project_id}}
- + {{form.status}}
- + {{form.task}}
- + {{form.date}}
{% if perms.project.view_timesheet or request.user|is_reportingmanager %}
- + {{form.employee_id}}
@@ -43,13 +43,13 @@
- + {{form.start_from}}
- + {{form.end_till}}
diff --git a/project/templates/task/new/filter_task.html b/project/templates/task/new/filter_task.html index 14c5018a0..614082c01 100644 --- a/project/templates/task/new/filter_task.html +++ b/project/templates/task/new/filter_task.html @@ -7,27 +7,27 @@
- + {{f.form.task_managers}}
- + {{f.form.stage}}
- + {{f.form.task_members}}
- + {{f.form.status}}
- + {{f.form.end_till}}
diff --git a/project/templates/task/new/task_kanban_view.html b/project/templates/task/new/task_kanban_view.html index 3be8a5c13..64fad9a94 100644 --- a/project/templates/task/new/task_kanban_view.html +++ b/project/templates/task/new/task_kanban_view.html @@ -122,8 +122,8 @@
- -