mirror of
https://github.com/frappe/erpnext.git
synced 2026-08-26 21:35:19 +00:00
* 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)
122 lines
3.0 KiB
Python
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"],
|
|
)
|