blob: c2cb6c7a68cea970e33a9b9098d11ff814eefa40 [file] [log] [blame]
Kanchan Chauhanb3fe6a42016-03-16 18:01:22 +05301# Copyright (c) 2015, Frappe Technologies Pvt. Ltd. and Contributors
2# License: GNU General Public License v3. See license.txt
3
4from __future__ import unicode_literals
5import frappe
Rushabh Mehtab2269dd2016-03-23 18:28:50 +05306import json
Kanchan Chauhanb3fe6a42016-03-16 18:01:22 +05307
8def get_context(context):
9 context.no_cache = 1
10
11 project = frappe.get_doc('Project', frappe.form_dict.project)
12
13 project.has_permission('read')
14
15 context.issues = frappe.get_all('Issue', filters={'project': project.project_name},
16 fields=['subject', 'opening_date', 'resolution_date', 'status', 'name', 'resolution_details','modified','modified_by'])
17
Rushabh Mehtac20c5362016-03-25 17:19:28 +053018 project.tasks = get_tasks(project.name, start=0, item_status='open',
19 search=frappe.form_dict.get("q"))
Rushabh Mehtab2269dd2016-03-23 18:28:50 +053020
Rushabh Mehtac20c5362016-03-25 17:19:28 +053021 project.issues = get_issues(project.name, start=0, item_status='open',
22 search=frappe.form_dict.get("q"))
Rushabh Mehtab2269dd2016-03-23 18:28:50 +053023
Rushabh Mehtac20c5362016-03-25 17:19:28 +053024 project.timelogs = get_timelogs(project.name, start=0,
25 search=frappe.form_dict.get("q"))
Rushabh Mehtab2269dd2016-03-23 18:28:50 +053026
Kanchan Chauhanb3fe6a42016-03-16 18:01:22 +053027 project.timelines = get_timeline(project.project_name, start=0)
Rushabh Mehtab2269dd2016-03-23 18:28:50 +053028
29
Kanchan Chauhanb3fe6a42016-03-16 18:01:22 +053030
31 context.doc = project
Rushabh Mehtab2269dd2016-03-23 18:28:50 +053032
33
Kanchan Chauhanb3fe6a42016-03-16 18:01:22 +053034def get_timeline(project, start=10):
Rushabh Mehtab2269dd2016-03-23 18:28:50 +053035 '''Get timeline from project, tasks, issues'''
36 issues_condition = ''
37 project_issues = get_issues(project)
38
39 if project_issues:
40 issue_names = '({0})'.format(", ".join(["'{0}'".format(i.name) for i in project_issues]))
41 issues_condition = """or (reference_doctype='Issue' and reference_name IN {issue_names})""".format(issue_names=issue_names)
42
43
Kanchan Chauhan2ad801c2016-03-22 16:00:41 +053044 timelines = frappe.db.sql("""
Rushabh Mehtab2269dd2016-03-23 18:28:50 +053045 select
46 sender_full_name,
47 subject, communication_date, comment_type, name, creation, modified_by, reference_doctype, reference_name,
48 _liked_by, comment_type, _comments
49 from
50 tabCommunication
51 where
Kanchan Chauhan2ad801c2016-03-22 16:00:41 +053052 (reference_doctype='Project' and reference_name=%s)
Kanchan Chauhanb3fe6a42016-03-16 18:01:22 +053053 or (timeline_doctype='Project' and timeline_name=%s)
Rushabh Mehtab2269dd2016-03-23 18:28:50 +053054 {issues_condition}
55 order by
Kanchan Chauhan2ad801c2016-03-22 16:00:41 +053056 modified DESC limit {start}, {limit}""".format(
Rushabh Mehtab2269dd2016-03-23 18:28:50 +053057 issues_condition=issues_condition, start=start, limit=10),
Kanchan Chauhan2ad801c2016-03-22 16:00:41 +053058 (project, project), as_dict=True);
Kanchan Chauhanb3fe6a42016-03-16 18:01:22 +053059 for timeline in timelines:
60 timeline.user_image = frappe.db.get_value('User', timeline.modified_by, 'user_image')
Rushabh Mehtab2269dd2016-03-23 18:28:50 +053061 return timelines
62
Kanchan Chauhanb3fe6a42016-03-16 18:01:22 +053063@frappe.whitelist()
Kanchan Chauhan2ad801c2016-03-22 16:00:41 +053064def get_timelines_html(project, start=0):
Rushabh Mehtab2269dd2016-03-23 18:28:50 +053065 return frappe.render_template("erpnext/templates/includes/projects/timeline.html",
Rushabh Mehtac20c5362016-03-25 17:19:28 +053066 {"doc": {
67 "timelines": get_timeline(project, start)}
68 }, is_path=True)
Rushabh Mehtab2269dd2016-03-23 18:28:50 +053069
Kanchan Chauhanb3fe6a42016-03-16 18:01:22 +053070def get_issue_list(project):
71 return [issue.name for issue in get_issues(project)]
72
Rushabh Mehtac20c5362016-03-25 17:19:28 +053073
74
Kanchan Chauhan2ad801c2016-03-22 16:00:41 +053075def get_tasks(project, start=0, search=None, item_status=None):
Kanchan Chauhanb3fe6a42016-03-16 18:01:22 +053076 filters = {"project": project}
77 if search:
78 filters["subject"] = ("like", "%{0}%".format(search))
Rushabh Mehtab2269dd2016-03-23 18:28:50 +053079 if item_status:
Kanchan Chauhan53ce94f2016-03-25 12:04:54 +053080 filters["status"] = item_status
Rushabh Mehtab2269dd2016-03-23 18:28:50 +053081 tasks = frappe.get_all("Task", filters=filters,
Rushabh Mehtac20c5362016-03-25 17:19:28 +053082 fields=["name", "subject", "status", "exp_start_date", "exp_end_date", "priority", "_seen"],
Rushabh Mehtab2269dd2016-03-23 18:28:50 +053083 limit_start=start, limit_page_length=10)
84
Kanchan Chauhanb3fe6a42016-03-16 18:01:22 +053085 for task in tasks:
86 task.todo = frappe.get_all('ToDo',filters={'reference_name':task.name, 'reference_type':'Task'},
87 fields=["assigned_by", "owner", "modified", "modified_by"])
Rushabh Mehtac20c5362016-03-25 17:19:28 +053088
Kanchan Chauhanb3fe6a42016-03-16 18:01:22 +053089 if task.todo:
90 task.todo=task.todo[0]
91 task.todo.user_image = frappe.db.get_value('User', task.todo.owner, 'user_image')
Rushabh Mehtac20c5362016-03-25 17:19:28 +053092
Kanchan Chauhane14389e2016-03-23 14:14:38 +053093 if task._comments:
Rushabh Mehtab2269dd2016-03-23 18:28:50 +053094 task.comment_count = len(json.loads(task._comments or "[]"))
Rushabh Mehtac20c5362016-03-25 17:19:28 +053095
96 task.css_seen = ''
97 if task._seen:
98 if frappe.session.user in json.loads(task._seen):
99 task.css_seen = 'seen'
100
Kanchan Chauhanb3fe6a42016-03-16 18:01:22 +0530101 return tasks
102
103@frappe.whitelist()
Rushabh Mehtac20c5362016-03-25 17:19:28 +0530104def get_task_html(project, start=0, item_status=None):
Rushabh Mehtab2269dd2016-03-23 18:28:50 +0530105 return frappe.render_template("erpnext/templates/includes/projects/project_tasks.html",
Rushabh Mehtac20c5362016-03-25 17:19:28 +0530106 {"doc": {
107 "name": project,
108 "project_name": project,
109 "tasks": get_tasks(project, start, item_status=item_status)}
110 }, is_path=True)
111
112
Rushabh Mehtab2269dd2016-03-23 18:28:50 +0530113
114
Kanchan Chauhan2ad801c2016-03-22 16:00:41 +0530115def get_issues(project, start=0, search=None, item_status=None):
Kanchan Chauhanb3fe6a42016-03-16 18:01:22 +0530116 filters = {"project": project}
117 if search:
118 filters["subject"] = ("like", "%{0}%".format(search))
Rushabh Mehtab2269dd2016-03-23 18:28:50 +0530119 if item_status:
Kanchan Chauhan53ce94f2016-03-25 12:04:54 +0530120 filters["status"] = item_status
Rushabh Mehtab2269dd2016-03-23 18:28:50 +0530121 issues = frappe.get_all("Issue", filters=filters,
122 fields=["name", "subject", "status", "opening_date", "resolution_date", "resolution_details"],
Kanchan Chauhanb3fe6a42016-03-16 18:01:22 +0530123 order_by='modified desc',
Rushabh Mehtab2269dd2016-03-23 18:28:50 +0530124 limit_start=start, limit_page_length=10)
125
Kanchan Chauhanb3fe6a42016-03-16 18:01:22 +0530126 for issue in issues:
127 issue.todo = frappe.get_all('ToDo',filters={'reference_name':issue.name, 'reference_type':'Issue'},
128 fields=["assigned_by", "owner", "modified", "modified_by"])
129 if issue.todo:
130 issue.todo=issue.todo[0]
131 issue.todo.user_image = frappe.db.get_value('User', issue.todo.owner, 'user_image')
Rushabh Mehtab2269dd2016-03-23 18:28:50 +0530132
Kanchan Chauhanb3fe6a42016-03-16 18:01:22 +0530133 return issues
134
135@frappe.whitelist()
Rushabh Mehtac20c5362016-03-25 17:19:28 +0530136def get_issue_html(project, start=0, item_status=None):
Rushabh Mehtab2269dd2016-03-23 18:28:50 +0530137 return frappe.render_template("erpnext/templates/includes/projects/project_issues.html",
Rushabh Mehtac20c5362016-03-25 17:19:28 +0530138 {"doc": {
139 "name": project,
140 "project_name": project,
141 "issues": get_issues(project, start, item_status=item_status)}
142 }, is_path=True)
143
144
145
146
Rushabh Mehtab2269dd2016-03-23 18:28:50 +0530147
Kanchan Chauhanb3fe6a42016-03-16 18:01:22 +0530148def get_timelogs(project, start=0, search=None):
149 filters = {"project": project}
150 if search:
151 filters["title"] = ("like", "%{0}%".format(search))
Rushabh Mehtab2269dd2016-03-23 18:28:50 +0530152
153 timelogs = frappe.get_all('Time Log', filters=filters,
Kanchan Chauhanb3fe6a42016-03-16 18:01:22 +0530154 fields=['name','title','task','activity_type','from_time','to_time','hours','status','modified','modified_by'],
Rushabh Mehtab2269dd2016-03-23 18:28:50 +0530155 limit_start=start, limit_page_length=10)
Kanchan Chauhanb3fe6a42016-03-16 18:01:22 +0530156 for timelog in timelogs:
Rushabh Mehtab2269dd2016-03-23 18:28:50 +0530157 timelog.user_image = frappe.db.get_value('User', timelog.modified_by, 'user_image')
Kanchan Chauhanb3fe6a42016-03-16 18:01:22 +0530158 return timelogs
159
160@frappe.whitelist()
Rushabh Mehtac20c5362016-03-25 17:19:28 +0530161def get_timelog_html(project, start=0):
Rushabh Mehtab2269dd2016-03-23 18:28:50 +0530162 return frappe.render_template("erpnext/templates/includes/projects/project_timelogs.html",
163 {"doc": {"timelogs": get_timelogs(project, start)}}, is_path=True)
164