Merge pull request #5645 from KanchanChauhan/task-status-update-in-website
Task statuses updated in website
This commit is contained in:
		
						commit
						804b8f7baf
					
				| @ -617,5 +617,5 @@ | ||||
|  "read_only": 0,  | ||||
|  "read_only_onload": 0,  | ||||
|  "sort_order": "ASC",  | ||||
|  "track_seen": 0 | ||||
|  "track_seen": 1 | ||||
| } | ||||
| @ -3,5 +3,8 @@ from __future__ import unicode_literals | ||||
| import frappe | ||||
| 
 | ||||
| def get_context(context): | ||||
| 	# do your magic here | ||||
| 	pass | ||||
| 	if frappe.form_dict.project: | ||||
| 		context.parents = [{'title': frappe.form_dict.project, 'route': '/projects?project='+ frappe.form_dict.project}] | ||||
| 		 | ||||
| 	elif context.doc and context.doc.get('project'): | ||||
| 		context.parents = [{'title': context.doc.project, 'route': '/projects?project='+ context.doc.project}] | ||||
| @ -6,6 +6,7 @@ | ||||
|  "beta": 0,  | ||||
|  "creation": "2013-05-24 19:29:08",  | ||||
|  "custom": 0,  | ||||
|  "default_print_format": "test123",  | ||||
|  "docstatus": 0,  | ||||
|  "doctype": "DocType",  | ||||
|  "document_type": "Document",  | ||||
| @ -2125,6 +2126,7 @@ | ||||
|  "hide_toolbar": 0,  | ||||
|  "icon": "icon-shopping-cart",  | ||||
|  "idx": 82,  | ||||
|  "image_view": 0,  | ||||
|  "in_create": 0,  | ||||
|  "in_dialog": 0,  | ||||
|  "is_submittable": 1,  | ||||
| @ -2132,7 +2134,7 @@ | ||||
|  "istable": 0,  | ||||
|  "max_attachments": 1,  | ||||
|  "menu_index": 0,  | ||||
|  "modified": "2016-05-10 12:16:13.978635",  | ||||
|  "modified": "2016-07-05 16:44:01.301063",  | ||||
|  "modified_by": "Administrator",  | ||||
|  "module": "Selling",  | ||||
|  "name": "Quotation",  | ||||
|  | ||||
| @ -12,4 +12,3 @@ | ||||
|     	{%- endif %} | ||||
|     </div> | ||||
| {% endmacro %} | ||||
| 
 | ||||
|  | ||||
| @ -21,6 +21,7 @@ | ||||
| .item-timestamp | ||||
| { | ||||
| 	font-size: 10px; | ||||
| 	margin-left: 15px; | ||||
| } | ||||
| .page-container .project-item { | ||||
| 	padding-top: 5px; | ||||
|  | ||||
| @ -1,2 +0,0 @@ | ||||
| {% macro back_link(doc) %}&back-to=/projects?project={{ doc.name }}&back-to-title={{ doc.project_name }}{% endmacro %} | ||||
| 
 | ||||
| @ -1,27 +1,32 @@ | ||||
| {%- from "templates/includes/projects/macros.html" import back_link -%} | ||||
| 
 | ||||
| {% for task in doc.tasks %} | ||||
| 	<div class='task'> | ||||
| 		<a class="no-decoration task-link {{ task.css_seen }}" href="/tasks?name={{ task.name }}"> | ||||
| 		<div class='row project-item'> | ||||
| 			<div class='col-xs-1 gravatar-top'> | ||||
| 				{% if task.todo %} | ||||
| 				<span class="avatar avatar-small" title="{{ task.todo.owner }}"> | ||||
| 					<img src="{{ task.todo.user_image }}"> | ||||
| 				</span> | ||||
| 				{% else %} | ||||
| 				<span class="avatar avatar-small avatar-empty"></span> | ||||
| 				{% endif %}				 | ||||
| 			<div class='col-xs-9'> | ||||
| 				<span class="indicator {{ "red" if task.status=="Open" else "green" if task.status=="Closed" else "darkgrey" }}" title="{{ task.status }}"  > {{ task.subject }}</span>  | ||||
| 	 				<div class="small text-muted item-timestamp" | ||||
| 	 					title="{{ frappe.utils.pretty_date(task.modified) }}"> | ||||
| 	 					modified {{ frappe.utils.pretty_date(task.modified) }} | ||||
| 	 				</div> | ||||
| 			</div> | ||||
| 			<div class='col-xs-11'> | ||||
| 				<a class="no-decoration task-link {{ task.css_seen }}" href="/tasks?name={{ task.name }}{{ back_link(doc) }}"> | ||||
| 					<div class="task-subject">{{ task.subject }}</div> | ||||
| 					<span class="item-timestamp">modified {{ frappe.utils.pretty_date(task.modified) }}</span> | ||||
| 				</a> | ||||
| 			<div class='col-xs-1'>{% if task.todo %} | ||||
| 					{% if task.todo.user_image %} | ||||
| 						<span class="avatar avatar-small" title="{{ task.todo.owner }}"> | ||||
| 							<img src="{{ task.todo.user_image }}"> | ||||
| 						</span> | ||||
| 					{% else %} | ||||
| 						<span class="avatar avatar-small standard-image" title="Assigned to {{ task.todo.owner }}"> | ||||
| 							 | ||||
| 						</span> | ||||
| 					{% endif %}		 | ||||
| 				{% endif %}	 </div> | ||||
| 			<div class='col-xs-2'> | ||||
| 				<span class="pull-right list-comment-count small {{ "text-extra-muted" if task.comment_count==0 else "text-muted" }}"> | ||||
| 					<i class="octicon octicon-comment-discussion"></i> | ||||
| 						{{ task.comment_count }} | ||||
| 				</span> | ||||
| 			</div> | ||||
| 		</div> | ||||
| 		</a> | ||||
| 	</div> | ||||
| {% endfor %} | ||||
|  | ||||
| @ -1,21 +0,0 @@ | ||||
| {%- from "templates/includes/projects/macros.html" import back_link -%} | ||||
| 
 | ||||
| {% for timelog in doc.timelogs %} | ||||
| <div class='timelog'> | ||||
|   <div class='row project-item'> | ||||
|     <div class='col-xs-1 gravatar-top'> | ||||
| 		<span class="avatar avatar-small" title="{{ timelog.modified_by }}"> <img src="{{ timelog.user_image }}"></span> | ||||
| 	</div>  | ||||
| 		<div class='col-xs-11'> | ||||
|       	<a class="no-decoration timelog-link {{ timelog.css_seen }}" href="/time-log?name={{ timelog.name}}{{ back_link(doc) }}"> | ||||
| 			<div class="timelog-subject">{{ timelog.title }}</div>  | ||||
| 			<span class="item-timestamp">From {{ frappe.format_date(timelog.from_time) }} to {{ 				frappe.format_date(timelog.to_time) }}</span> | ||||
| 		</a> | ||||
| 		<span class="pull-right list-comment-count small {{ "text-extra-muted" if timelog.comment_count==0 else "text-muted" }}"> | ||||
| 			<i class="octicon octicon-comment-discussion"></i> | ||||
| 				{{ timelog.comment_count }} | ||||
| 		</span> | ||||
|     </div>    | ||||
|   </div> | ||||
| </div> | ||||
| {% endfor %} | ||||
							
								
								
									
										23
									
								
								erpnext/templates/includes/projects/project_timesheets.html
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										23
									
								
								erpnext/templates/includes/projects/project_timesheets.html
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,23 @@ | ||||
| {% for timesheet in doc.timesheets %} | ||||
| <div class='timesheet'> | ||||
| 	<a class="no-decoration timesheet-link {{ timesheet.css_seen }}" href="/timesheet/{{ timesheet.info.name}}"> | ||||
| 		<div class='row project-item'> | ||||
| 			<div class='col-xs-9'> | ||||
| 				<span class="indicator {{ "blue" if timesheet.info.status=="Submitted" else "red" if timesheet.info.status=="Draft" else "darkgrey" }}" title="{{ timesheet.info.status }}"  > {{ timesheet.info.name }} </span>  | ||||
| 				<div class="small text-muted item-timestamp"> | ||||
| 				From {{ frappe.format_date(timesheet.from_time) }} to {{ frappe.format_date(timesheet.to_time) }} | ||||
| 			</div> | ||||
| 			</div> | ||||
| 				<div class='col-xs-1 gravatar-top'> | ||||
| 				<span class="avatar avatar-small" title="{{ timesheet.info.modified_by }}"> <img src="{{ timesheet.info.user_image }}"></span> | ||||
| 			</div>  | ||||
| 			<div class='col-xs-2'> | ||||
| 				<span class="pull-right list-comment-count small {{ "text-extra-muted" if timesheet.comment_count==0 else "text-muted" }}"> | ||||
| 				<i class="octicon octicon-comment-discussion"></i> | ||||
| 				{{ timesheet.info.comment_count }} | ||||
| 				</span>  | ||||
| 			</div> | ||||
| 		</div> | ||||
| 	</a> | ||||
| </div> | ||||
| {% endfor %} | ||||
| @ -2,7 +2,6 @@ | ||||
| 
 | ||||
| {% block title %}{{ doc.project_name }}{% endblock %} | ||||
| 
 | ||||
| {%- from "templates/includes/projects/macros.html" import back_link -%} | ||||
| {% block header %} | ||||
| 	<h1>{{ doc.project_name }}</h1> | ||||
| {% endblock %} | ||||
| @ -25,11 +24,11 @@ | ||||
| 
 | ||||
| <div class="clearfix"> | ||||
|   <h4 style="float: left;">{{ _("Tasks") }}</h4> | ||||
|   <a class="btn btn-secondary btn-default btn-sm" style="float: right; position: relative; top: 10px;" href='/tasks?new=1&project={{ doc.project_name }}{{ back_link(doc) }}'>New task</a> | ||||
|   <a class="btn btn-secondary btn-default btn-sm" style="float: right; position: relative; top: 10px;" href='/tasks?new=1&project={{ doc.project_name }}'>New task</a> | ||||
| </div> | ||||
| 
 | ||||
| <p> | ||||
| <a class='small underline task-status-switch' data-status='Open'>{{ _("Show closed") }}</a> | ||||
| <!-- <a class='small underline task-status-switch' data-status='Open'>{{ _("Show closed") }}</a> --> | ||||
| </p> | ||||
| 
 | ||||
| {% if doc.tasks %} | ||||
| @ -46,17 +45,17 @@ | ||||
| 
 | ||||
| <div class='padding'></div> | ||||
| 
 | ||||
| <h4>{{ _("Time Logs") }}</h4> | ||||
| <h4>{{ _("Timesheets") }}</h4> | ||||
| 
 | ||||
| {% if doc.timelogs %} | ||||
| {% if doc.timesheets %} | ||||
| 	<div class='project-timelogs'> | ||||
| 	{% include "erpnext/templates/includes/projects/project_timelogs.html" %} | ||||
| 	{% include "erpnext/templates/includes/projects/project_timesheets.html" %} | ||||
| 	</div> | ||||
| 	{% if doc.timelogs|length > 9 %} | ||||
| 	{% if doc.timesheets|length > 9 %} | ||||
| 		<p><a class='more-timelogs small underline'>{{ _("More") }}</a><p> | ||||
| 	{% endif %} | ||||
| {% else %} | ||||
| 	<p class="text-muted">No time logs</p> | ||||
| 	<p class="text-muted">No time sheets</p> | ||||
| {% endif %} | ||||
| </div> | ||||
| 
 | ||||
|  | ||||
| @ -11,7 +11,6 @@ def get_context(context): | ||||
| 		raise frappe.PermissionError | ||||
| 		 | ||||
| 	context.no_cache = 1 | ||||
| 	context.show_search = True | ||||
| 	context.show_sidebar = True | ||||
| 	project = frappe.get_doc('Project', frappe.form_dict.project) | ||||
| 
 | ||||
| @ -20,9 +19,8 @@ def get_context(context): | ||||
| 	project.tasks = get_tasks(project.name, start=0, item_status='open', | ||||
| 		search=frappe.form_dict.get("search")) | ||||
| 
 | ||||
| 	project.timelogs = [] | ||||
| 	# project.timelogs = get_timelogs(project.name, start=0, | ||||
| 		# search=frappe.form_dict.get("search")) | ||||
| 	project.timesheets = get_timesheets(project.name, start=0, | ||||
| 		search=frappe.form_dict.get("search")) | ||||
| 
 | ||||
| 
 | ||||
| 	context.doc = project | ||||
| @ -32,8 +30,8 @@ def get_tasks(project, start=0, search=None, item_status=None): | ||||
| 	filters = {"project": project} | ||||
| 	if search: | ||||
| 		filters["subject"] = ("like", "%{0}%".format(search)) | ||||
| 	if item_status: | ||||
| 		filters["status"] = item_status | ||||
| 	# if item_status: | ||||
| # 		filters["status"] = item_status | ||||
| 	tasks = frappe.get_all("Task", filters=filters, | ||||
| 		fields=["name", "subject", "status", "_seen", "_comments", "modified", "description"], | ||||
| 		limit_start=start, limit_page_length=10) | ||||
| @ -65,27 +63,32 @@ def get_task_html(project, start=0, item_status=None): | ||||
| 			"tasks": get_tasks(project, start, item_status=item_status)} | ||||
| 		}, is_path=True) | ||||
| 
 | ||||
| def get_timelogs(project, start=0, search=None): | ||||
| def get_timesheets(project, start=0, search=None): | ||||
| 	filters = {"project": project} | ||||
| 	if search: | ||||
| 		filters["title"] = ("like", "%{0}%".format(search)) | ||||
| 		filters["activity_type"] = ("like", "%{0}%".format(search)) | ||||
| 
 | ||||
| 	timelogs = frappe.get_all('Time Log', filters=filters, | ||||
| 	fields=['name','title','task','activity_type','from_time','to_time','_comments','_seen','status','modified','modified_by'], | ||||
| 	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 timelog in timelogs: | ||||
| 		timelog.user_image = frappe.db.get_value('User', timelog.modified_by, 'user_image') | ||||
| 		 | ||||
| 		timelog.comment_count = len(json.loads(timelog._comments or "[]")) | ||||
| 	for timesheet in timesheets: | ||||
| 		timesheet.infos = frappe.get_all('Timesheet', filters={"name": timesheet.parent}, | ||||
| 			fields=['name','_comments','_seen','status','modified','modified_by'], | ||||
| 			limit_start=start, limit_page_length=10) | ||||
| 
 | ||||
| 		timelog.css_seen = '' | ||||
| 		if timelog._seen: | ||||
| 			if frappe.session.user in json.loads(timelog._seen): | ||||
| 				timelog.css_seen = 'seen'	 | ||||
| 	return timelogs | ||||
| 		for timesheet.info in timesheet.infos: | ||||
| 			timesheet.info.user_image = frappe.db.get_value('User', timesheet.info.modified_by, 'user_image') | ||||
| 
 | ||||
| 			timesheet.info.comment_count = len(json.loads(timesheet.info._comments or "[]")) | ||||
| 
 | ||||
| 			timesheet.info.css_seen = '' | ||||
| 			if timesheet.info._seen: | ||||
| 				if frappe.session.user in json.loads(timesheet.info._seen): | ||||
| 					timesheet.info.css_seen = 'seen'		 | ||||
| 	return timesheets | ||||
| 
 | ||||
| @frappe.whitelist() | ||||
| def get_timelog_html(project, start=0): | ||||
| 	return frappe.render_template("erpnext/templates/includes/projects/project_timelogs.html", | ||||
| 		{"doc": {"timelogs": get_timelogs(project, start)}}, is_path=True) | ||||
| 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) | ||||
| 
 | ||||
|  | ||||
		Loading…
	
	
			
			x
			
			
		
	
		Reference in New Issue
	
	Block a user