Files
erpnext/erpnext/templates/pages/projects.py
Marc Ramser 3834d6fbce feat(projects): add option to hide timesheets for project users (#46173)
* feat: add option to hide timesheets for project users

* Added a new "Hide timesheets" checkbox field to Project User doctype that allows to control timesheet visibility for specific users. When enabled, the timesheets section will not be displayed on the project page for that user.

* Update projects.html

(cherry picked from commit f4aba561ce)
2025-03-19 08:05:42 +00:00

122 lines
3.0 KiB
Python

# Copyright (c) 2015, Frappe Technologies Pvt. Ltd. and Contributors
# License: GNU General Public License v3. See license.txt
import frappe
def get_context(context):
project_user = frappe.db.get_value(
"Project User",
{"parent": frappe.form_dict.project, "user": frappe.session.user},
["user", "view_attachments", "hide_timesheets"],
as_dict=True,
)
if frappe.session.user != "Administrator" and (not project_user or frappe.session.user == "Guest"):
raise frappe.PermissionError
context.no_cache = 1
context.show_sidebar = True
project = frappe.get_doc("Project", frappe.form_dict.project)
project.has_permission("read")
project.tasks = get_tasks(
project.name, start=0, item_status="open", search=frappe.form_dict.get("search")
)
if project_user and not project_user.hide_timesheets:
project.timesheets = get_timesheets(project.name, start=0, search=frappe.form_dict.get("search"))
if project_user and project_user.view_attachments:
project.attachments = get_attachments(project.name)
context.doc = project
def get_tasks(project, start=0, search=None, item_status=None):
filters = {"project": project}
if search:
filters["subject"] = ("like", f"%{search}%")
tasks = frappe.get_all(
"Task",
filters=filters,
fields=[
"name",
"subject",
"status",
"modified",
"_assign",
"exp_end_date",
"is_group",
"parent_task",
],
limit_start=start,
limit_page_length=100,
)
task_nest = []
for task in tasks:
if task.is_group:
child_tasks = list(filter(lambda x: x.parent_task == task.name, tasks))
if len(child_tasks):
task.children = child_tasks
task_nest.append(task)
return list(filter(lambda x: not x.parent_task, tasks))
@frappe.whitelist()
def get_task_html(project, start=0, item_status=None):
return frappe.render_template(
"erpnext/templates/includes/projects/project_tasks.html",
{
"doc": {
"name": project,
"project_name": project,
"tasks": get_tasks(project, start, item_status=item_status),
}
},
is_path=True,
)
def get_timesheets(project, start=0, search=None):
filters = {"project": project}
if search:
filters["activity_type"] = ("like", f"%{search}%")
timesheets = frappe.get_all(
"Timesheet Detail",
filters=filters,
fields=["project", "activity_type", "from_time", "to_time", "parent"],
limit_start=start,
limit_page_length=10,
)
for timesheet in timesheets:
info = frappe.get_all(
"Timesheet",
filters={"name": timesheet.parent},
fields=["name", "status", "modified", "modified_by"],
limit_start=start,
limit_page_length=10,
)
if len(info):
timesheet.update(info[0])
return timesheets
@frappe.whitelist()
def get_timesheet_html(project, start=0):
return frappe.render_template(
"erpnext/templates/includes/projects/project_timesheets.html",
{"doc": {"timesheets": get_timesheets(project, start)}},
is_path=True,
)
def get_attachments(project):
return frappe.get_all(
"File",
filters={"attached_to_name": project, "attached_to_doctype": "Project", "is_private": 0},
fields=["file_name", "file_url", "file_size"],
)