Hub Seller Profile and Timeline

- profile details fetched from server
- timeline updates on publishing items
diff --git a/erpnext/hub_node/__init__.py b/erpnext/hub_node/__init__.py
index 471f039..6ac0aba 100644
--- a/erpnext/hub_node/__init__.py
+++ b/erpnext/hub_node/__init__.py
@@ -93,22 +93,23 @@
 	})
 
 	if response:
-		# frappe.db.set_value("Hub Settings", "Hub Settings", "sync_in_progress", 1)
+		frappe.db.set_value("Hub Settings", "Hub Settings", "sync_in_progress", 1)
 		return response
 	else:
 		return ''
 
 def item_sync_postprocess(obj):
 	response = call_hub_method('update_activity_for_seller', {
-		'hub_seller': frappe.db.get_value("Hub Settings", "Hub Settings", "company_email"),
-		'name': obj["remote_id"],
-		'status': obj["status"]
+		'hub_seller': frappe.db.get_value('Hub Settings', 'Hub Settings', 'company_email'),
+		'name': obj['remote_id'],
+		'status': obj['status'],
+		'stats': obj['stats']
 	})
 
 	if response:
-		frappe.db.set_value("Hub Settings", "Hub Settings", "sync_in_progress", 0)
+		frappe.db.set_value('Hub Settings', 'Hub Settings', 'sync_in_progress', 0)
 	else:
-		frappe.throw("Unable to update remote activity")
+		frappe.throw('Unable to update remote activity')
 
 @frappe.whitelist()
 def get_item_favourites(start=0, limit=20, fields=["*"], order_by=None):
diff --git a/erpnext/public/js/hub/marketplace.js b/erpnext/public/js/hub/marketplace.js
index 5261c3f..2214956 100644
--- a/erpnext/public/js/hub/marketplace.js
+++ b/erpnext/public/js/hub/marketplace.js
@@ -724,9 +724,36 @@
 erpnext.hub.Profile = class Profile extends SubPage {
 	make_wrapper() {
 		super.make_wrapper();
+	}
 
-		// Shorthand for profile data;
-		const p = hub.settings;
+	refresh() {
+		this.get_hub_seller_profile(this.keyword)
+			.then(profile => this.render(profile));
+	}
+
+	get_hub_seller_profile() {
+		return hub.call('get_hub_seller_profile', { hub_seller: hub.settings.company_email });
+	}
+
+	render(profile) {
+		const p = profile;
+		const content_by_log_type = this.get_content_by_log_type();
+
+		let activity_logs = (p.hub_seller_activity || []).sort((a, b) => {
+			return new Date(b.creation) - new Date(a.creation);
+		});
+
+		const timeline_items_html = activity_logs
+			.map(log => {
+				const stats = JSON.parse(log.stats);
+				const no_of_items = stats && stats.push_update || '';
+
+				const content = content_by_log_type[log.type];
+				const message = content.get_message(no_of_items);
+				const icon = content.icon;
+				return this.get_timeline_log_item(log.pretty_date, message, icon);
+			})
+			.join('');
 
 		const profile_html = `<div class="hub-item-container">
 			<div class="row visible-xs">
@@ -737,33 +764,58 @@
 			<div class="row">
 				<div class="col-md-3">
 					<div class="hub-item-image">
-						<img src="${'gd'}">
+						<img src="${p.logo}">
 					</div>
 				</div>
 				<div class="col-md-6">
-					<h2>${'title'}</h2>
+					<h2>${p.company}</h2>
 					<div class="text-muted">
-						<p>${'where'}${'dot_spacer'}${'when'}</p>
-						<p>${'rating_html'}${'rating_count'}</p>
+						<p>${p.country}</p>
+						<p>${p.site_name}</p>
 					</div>
 					<hr>
 					<div class="hub-item-description">
-					${'description' ?
-						`<b>${__('Description')}</b>
-						<p>${'description'}</p>
-						` : __('No description')
+					${'description'
+						? `<p>${p.company_description}</p>`
+						: `<p>__('No description')</p`
 					}
 					</div>
 				</div>
 			</div>
+
+			<div class="timeline">
+				<div class="timeline-items">
+					${timeline_items_html}
+				</div>
+			</div>
+
 		</div>`;
 
 		this.$wrapper.html(profile_html);
 	}
 
-	refresh() {}
+	get_timeline_log_item(pretty_date, message, icon) {
+		return `<div class="media timeline-item  notification-content">
+			<div class="small">
+				<i class="octicon ${icon} fa-fw"></i>
+				<span title="Administrator"><b>${pretty_date}</b> ${message}</span>
+			</div>
+		</div>`;
+	}
 
-	render() {}
+	get_content_by_log_type() {
+		return {
+			"Created": {
+				icon: 'octicon-heart',
+				get_message: () => 'Joined Marketplace'
+			},
+			"Items Publish": {
+				icon: 'octicon-bookmark',
+				get_message: (no_of_items) =>
+					`Published ${no_of_items} product${no_of_items > 1 ? 's' : ''} to Marketplace`
+			}
+		}
+	}
 }
 
 erpnext.hub.Publish = class Publish extends SubPage {