Merge branch 'develop' of https://github.com/frappe/erpnext into hub-multiuser
diff --git a/erpnext/hub_node/api.py b/erpnext/hub_node/api.py
index fe41919..e69a963 100644
--- a/erpnext/hub_node/api.py
+++ b/erpnext/hub_node/api.py
@@ -1,11 +1,60 @@
 from __future__ import unicode_literals
-import frappe, json
-import io, base64, os, requests
+
+import frappe
+import json
+import io
+import base64
+import os
+import requests
+
+from frappe import _
 from frappe.frappeclient import FrappeClient
 from frappe.desk.form.load import get_attachments
 from frappe.utils.file_manager import get_file_path
 from six import string_types
 
+current_user = frappe.session.user
+
+
+@frappe.whitelist()
+def register_marketplace(company):
+	validate_registerer()
+	settings = frappe.get_single('Marketplace Settings')
+	message = settings.register_seller(company)
+
+	if message.get('hub_seller_name'):
+		settings.registered = 1
+		settings.hub_seller_name = message.get('hub_seller_name')
+		settings.save()
+
+		settings.add_hub_user(frappe.session.user)
+
+	return { 'ok': 1 }
+
+
+@frappe.whitelist()
+def register_users(user_list):
+	user_list = json.loads(user_list)
+
+	settings = frappe.get_single('Marketplace Settings')
+
+	for user in user_list:
+		settings.add_hub_user(user)
+
+	return user_list
+
+
+def validate_registerer():
+	if current_user == 'Administrator':
+		frappe.throw(_('Please login as another user to register on Marketplace'))
+
+	valid_roles = ['System Manager', 'Item Manager']
+
+	if not frappe.utils.is_subset(valid_roles, frappe.get_roles()):
+		frappe.throw(_('Only users with {0} role can register on Marketplace').format(', '.join(valid_roles)),
+			frappe.PermissionError)
+
+
 @frappe.whitelist()
 def call_hub_method(method, params=None):
 	connection = get_hub_connection()
@@ -20,6 +69,7 @@
 	response = connection.post_request(params)
 	return response
 
+
 def map_fields(items):
 	field_mappings = get_field_mappings()
 	table_fields = [d.fieldname for d in frappe.get_meta('Item').get_table_fields()]
@@ -44,6 +94,7 @@
 
 	return items
 
+
 @frappe.whitelist()
 def get_valid_items(search_value=''):
 	items = frappe.get_list(
@@ -68,6 +119,7 @@
 
 	return valid_items
 
+
 @frappe.whitelist()
 def publish_selected_items(items_to_publish):
 	items_to_publish = json.loads(items_to_publish)
@@ -85,7 +137,6 @@
 			'image_list': item.get('image_list')
 		}).insert(ignore_if_duplicate=True)
 
-
 	items = map_fields(items_to_publish)
 
 	try:
@@ -100,6 +151,7 @@
 	except Exception as e:
 		frappe.log_error(message=e, title='Hub Sync Error')
 
+
 def item_sync_preprocess(intended_item_publish_count):
 	response = call_hub_method('pre_items_publish', {
 		'intended_item_publish_count': intended_item_publish_count
@@ -111,6 +163,7 @@
 	else:
 		frappe.throw('Unable to update remote activity')
 
+
 def item_sync_postprocess():
 	response = call_hub_method('post_items_publish', {})
 	if response:
@@ -147,24 +200,18 @@
 
 
 def get_hub_connection():
-	read_only = True
+	settings = frappe.get_single('Marketplace Settings')
+	marketplace_url = settings.marketplace_url
+	hub_user = settings.get_hub_user(frappe.session.user)
 
-	if frappe.db.exists('Data Migration Connector', 'Hub Connector'):
-		hub_connector = frappe.get_doc('Data Migration Connector', 'Hub Connector')
-
-		# full rights to user who registered as hub_seller
-		if hub_connector.username == frappe.session.user:
-			read_only = False
-
-		if not read_only:
-			hub_connection = hub_connector.get_connection()
-			return hub_connection.connection
-
-	# read-only connection
-	if read_only:
-		hub_url = frappe.db.get_single_value('Marketplace Settings', 'hub_url')
-		hub_connection = FrappeClient(hub_url)
+	if hub_user:
+		password = hub_user.get_password()
+		hub_connection = FrappeClient(marketplace_url, hub_user.user, password)
 		return hub_connection
+	else:
+		read_only_hub_connection = FrappeClient(marketplace_url)
+		return read_only_hub_connection
+
 
 def get_field_mappings():
 	return []
diff --git a/erpnext/hub_node/doctype/hub_user/__init__.py b/erpnext/hub_node/doctype/hub_user/__init__.py
new file mode 100644
index 0000000..e69de29
--- /dev/null
+++ b/erpnext/hub_node/doctype/hub_user/__init__.py
diff --git a/erpnext/hub_node/doctype/hub_user/hub_user.json b/erpnext/hub_node/doctype/hub_user/hub_user.json
new file mode 100644
index 0000000..a660022
--- /dev/null
+++ b/erpnext/hub_node/doctype/hub_user/hub_user.json
@@ -0,0 +1,140 @@
+{
+ "allow_copy": 0, 
+ "allow_guest_to_view": 0, 
+ "allow_import": 0, 
+ "allow_rename": 0, 
+ "autoname": "", 
+ "beta": 0, 
+ "creation": "2018-08-31 12:36:45.627531", 
+ "custom": 0, 
+ "docstatus": 0, 
+ "doctype": "DocType", 
+ "document_type": "", 
+ "editable_grid": 1, 
+ "engine": "InnoDB", 
+ "fields": [
+  {
+   "allow_bulk_edit": 0, 
+   "allow_in_quick_entry": 0, 
+   "allow_on_submit": 0, 
+   "bold": 0, 
+   "collapsible": 0, 
+   "columns": 0, 
+   "fieldname": "user", 
+   "fieldtype": "Link", 
+   "hidden": 0, 
+   "ignore_user_permissions": 0, 
+   "ignore_xss_filter": 0, 
+   "in_filter": 0, 
+   "in_global_search": 0, 
+   "in_list_view": 1, 
+   "in_standard_filter": 0, 
+   "label": "User", 
+   "length": 0, 
+   "no_copy": 0, 
+   "options": "User", 
+   "permlevel": 0, 
+   "precision": "", 
+   "print_hide": 0, 
+   "print_hide_if_no_value": 0, 
+   "read_only": 0, 
+   "remember_last_selected_value": 0, 
+   "report_hide": 0, 
+   "reqd": 1, 
+   "search_index": 0, 
+   "set_only_once": 0, 
+   "translatable": 0, 
+   "unique": 1
+  }, 
+  {
+   "allow_bulk_edit": 0, 
+   "allow_in_quick_entry": 0, 
+   "allow_on_submit": 0, 
+   "bold": 0, 
+   "collapsible": 0, 
+   "columns": 0, 
+   "fieldname": "hub_user_name", 
+   "fieldtype": "Data", 
+   "hidden": 0, 
+   "ignore_user_permissions": 0, 
+   "ignore_xss_filter": 0, 
+   "in_filter": 0, 
+   "in_global_search": 0, 
+   "in_list_view": 1, 
+   "in_standard_filter": 0, 
+   "label": "Hub User", 
+   "length": 0, 
+   "no_copy": 0, 
+   "permlevel": 0, 
+   "precision": "", 
+   "print_hide": 0, 
+   "print_hide_if_no_value": 0, 
+   "read_only": 1, 
+   "remember_last_selected_value": 0, 
+   "report_hide": 0, 
+   "reqd": 0, 
+   "search_index": 0, 
+   "set_only_once": 0, 
+   "translatable": 0, 
+   "unique": 0
+  }, 
+  {
+   "allow_bulk_edit": 0, 
+   "allow_in_quick_entry": 0, 
+   "allow_on_submit": 0, 
+   "bold": 0, 
+   "collapsible": 0, 
+   "columns": 0, 
+   "fieldname": "password", 
+   "fieldtype": "Password", 
+   "hidden": 0, 
+   "ignore_user_permissions": 0, 
+   "ignore_xss_filter": 0, 
+   "in_filter": 0, 
+   "in_global_search": 0, 
+   "in_list_view": 1, 
+   "in_standard_filter": 0, 
+   "label": "Hub Password", 
+   "length": 0, 
+   "no_copy": 0, 
+   "permlevel": 0, 
+   "precision": "", 
+   "print_hide": 0, 
+   "print_hide_if_no_value": 0, 
+   "read_only": 1, 
+   "remember_last_selected_value": 0, 
+   "report_hide": 0, 
+   "reqd": 0, 
+   "search_index": 0, 
+   "set_only_once": 0, 
+   "translatable": 0, 
+   "unique": 0
+  }
+ ], 
+ "has_web_view": 0, 
+ "hide_heading": 0, 
+ "hide_toolbar": 0, 
+ "idx": 0, 
+ "image_view": 0, 
+ "in_create": 0, 
+ "is_submittable": 0, 
+ "issingle": 0, 
+ "istable": 1, 
+ "max_attachments": 0, 
+ "modified": "2018-09-01 13:56:07.816894", 
+ "modified_by": "netchamp@rawcoderz.com", 
+ "module": "Hub Node", 
+ "name": "Hub User", 
+ "name_case": "", 
+ "owner": "Administrator", 
+ "permissions": [], 
+ "quick_entry": 1, 
+ "read_only": 0, 
+ "read_only_onload": 0, 
+ "show_name_in_global_search": 0, 
+ "sort_field": "modified", 
+ "sort_order": "DESC", 
+ "track_changes": 1, 
+ "track_seen": 0, 
+ "track_views": 0
+}
\ No newline at end of file
diff --git a/erpnext/hub_node/doctype/hub_user/hub_user.py b/erpnext/hub_node/doctype/hub_user/hub_user.py
new file mode 100644
index 0000000..de43f4e
--- /dev/null
+++ b/erpnext/hub_node/doctype/hub_user/hub_user.py
@@ -0,0 +1,10 @@
+# -*- coding: utf-8 -*-
+# Copyright (c) 2018, Frappe Technologies Pvt. Ltd. and contributors
+# For license information, please see license.txt
+
+from __future__ import unicode_literals
+import frappe
+from frappe.model.document import Document
+
+class HubUser(Document):
+	pass
diff --git a/erpnext/hub_node/doctype/marketplace_settings/marketplace_settings.json b/erpnext/hub_node/doctype/marketplace_settings/marketplace_settings.json
index 5243f38..1283711 100644
--- a/erpnext/hub_node/doctype/marketplace_settings/marketplace_settings.json
+++ b/erpnext/hub_node/doctype/marketplace_settings/marketplace_settings.json
@@ -95,7 +95,7 @@
    "in_global_search": 0, 
    "in_list_view": 0, 
    "in_standard_filter": 0, 
-   "label": "Marketplace URL", 
+   "label": "Marketplace URL (to hide and update label)", 
    "length": 0, 
    "no_copy": 0, 
    "permlevel": 0, 
@@ -215,16 +215,16 @@
    "bold": 0, 
    "collapsible": 0, 
    "columns": 0, 
-   "fieldname": "company_email", 
+   "fieldname": "hub_seller_name", 
    "fieldtype": "Data", 
-   "hidden": 0, 
+   "hidden": 1, 
    "ignore_user_permissions": 0, 
    "ignore_xss_filter": 0, 
    "in_filter": 0, 
    "in_global_search": 0, 
    "in_list_view": 0, 
    "in_standard_filter": 0, 
-   "label": "Company Email", 
+   "label": "Hub Seller Name", 
    "length": 0, 
    "no_copy": 0, 
    "permlevel": 0, 
@@ -247,8 +247,8 @@
    "bold": 0, 
    "collapsible": 0, 
    "columns": 0, 
-   "fieldname": "site_name", 
-   "fieldtype": "Data", 
+   "fieldname": "users", 
+   "fieldtype": "Table", 
    "hidden": 0, 
    "ignore_user_permissions": 0, 
    "ignore_xss_filter": 0, 
@@ -256,138 +256,10 @@
    "in_global_search": 0, 
    "in_list_view": 0, 
    "in_standard_filter": 0, 
-   "label": "Site Name", 
+   "label": "Users", 
    "length": 0, 
    "no_copy": 0, 
-   "permlevel": 0, 
-   "precision": "", 
-   "print_hide": 0, 
-   "print_hide_if_no_value": 0, 
-   "read_only": 1, 
-   "remember_last_selected_value": 0, 
-   "report_hide": 0, 
-   "reqd": 0, 
-   "search_index": 0, 
-   "set_only_once": 0, 
-   "translatable": 0, 
-   "unique": 0
-  }, 
-  {
-   "allow_bulk_edit": 0, 
-   "allow_in_quick_entry": 0, 
-   "allow_on_submit": 0, 
-   "bold": 0, 
-   "collapsible": 0, 
-   "columns": 0, 
-   "fieldname": "country", 
-   "fieldtype": "Link", 
-   "hidden": 0, 
-   "ignore_user_permissions": 0, 
-   "ignore_xss_filter": 0, 
-   "in_filter": 0, 
-   "in_global_search": 0, 
-   "in_list_view": 1, 
-   "in_standard_filter": 0, 
-   "label": "Country", 
-   "length": 0, 
-   "no_copy": 0, 
-   "options": "Country", 
-   "permlevel": 0, 
-   "precision": "", 
-   "print_hide": 0, 
-   "print_hide_if_no_value": 0, 
-   "read_only": 0, 
-   "remember_last_selected_value": 0, 
-   "report_hide": 0, 
-   "reqd": 0, 
-   "search_index": 0, 
-   "set_only_once": 0, 
-   "translatable": 0, 
-   "unique": 0
-  }, 
-  {
-   "allow_bulk_edit": 0, 
-   "allow_in_quick_entry": 0, 
-   "allow_on_submit": 0, 
-   "bold": 0, 
-   "collapsible": 0, 
-   "columns": 0, 
-   "fieldname": "currency", 
-   "fieldtype": "Currency", 
-   "hidden": 0, 
-   "ignore_user_permissions": 0, 
-   "ignore_xss_filter": 0, 
-   "in_filter": 0, 
-   "in_global_search": 0, 
-   "in_list_view": 0, 
-   "in_standard_filter": 0, 
-   "label": "Currency", 
-   "length": 0, 
-   "no_copy": 0, 
-   "permlevel": 0, 
-   "precision": "", 
-   "print_hide": 0, 
-   "print_hide_if_no_value": 0, 
-   "read_only": 0, 
-   "remember_last_selected_value": 0, 
-   "report_hide": 0, 
-   "reqd": 0, 
-   "search_index": 0, 
-   "set_only_once": 0, 
-   "translatable": 0, 
-   "unique": 0
-  }, 
-  {
-   "allow_bulk_edit": 0, 
-   "allow_in_quick_entry": 0, 
-   "allow_on_submit": 0, 
-   "bold": 0, 
-   "collapsible": 0, 
-   "columns": 0, 
-   "fieldname": "logo", 
-   "fieldtype": "Attach Image", 
-   "hidden": 0, 
-   "ignore_user_permissions": 0, 
-   "ignore_xss_filter": 0, 
-   "in_filter": 0, 
-   "in_global_search": 0, 
-   "in_list_view": 0, 
-   "in_standard_filter": 0, 
-   "label": "Company Logo", 
-   "length": 0, 
-   "no_copy": 0, 
-   "permlevel": 0, 
-   "precision": "", 
-   "print_hide": 0, 
-   "print_hide_if_no_value": 0, 
-   "read_only": 0, 
-   "remember_last_selected_value": 0, 
-   "report_hide": 0, 
-   "reqd": 0, 
-   "search_index": 0, 
-   "set_only_once": 0, 
-   "translatable": 0, 
-   "unique": 0
-  }, 
-  {
-   "allow_bulk_edit": 0, 
-   "allow_in_quick_entry": 0, 
-   "allow_on_submit": 0, 
-   "bold": 0, 
-   "collapsible": 0, 
-   "columns": 0, 
-   "fieldname": "company_description", 
-   "fieldtype": "Text Editor", 
-   "hidden": 0, 
-   "ignore_user_permissions": 0, 
-   "ignore_xss_filter": 0, 
-   "in_filter": 0, 
-   "in_global_search": 0, 
-   "in_list_view": 0, 
-   "in_standard_filter": 0, 
-   "label": "Description", 
-   "length": 0, 
-   "no_copy": 0, 
+   "options": "Hub User", 
    "permlevel": 0, 
    "precision": "", 
    "print_hide": 0, 
@@ -479,8 +351,8 @@
  "issingle": 1, 
  "istable": 0, 
  "max_attachments": 0, 
- "modified": "2018-08-31 17:30:37.305704", 
- "modified_by": "netchamp@rawcoderz.com", 
+ "modified": "2018-09-01 17:05:59.600583", 
+ "modified_by": "cave@aperture.com", 
  "module": "Hub Node", 
  "name": "Marketplace Settings", 
  "name_case": "", 
diff --git a/erpnext/hub_node/doctype/marketplace_settings/marketplace_settings.py b/erpnext/hub_node/doctype/marketplace_settings/marketplace_settings.py
index 9b83898..482efad 100644
--- a/erpnext/hub_node/doctype/marketplace_settings/marketplace_settings.py
+++ b/erpnext/hub_node/doctype/marketplace_settings/marketplace_settings.py
@@ -7,98 +7,82 @@
 from frappe.model.document import Document
 from frappe.utils import add_years, now, get_datetime, get_datetime_str
 from frappe import _
+from frappe.frappeclient import FrappeClient
 from erpnext.utilities.product import get_price, get_qty_in_stock
 from six import string_types
 
 class MarketplaceSettings(Document):
 
-	def validate(self):
-		self.site_name = frappe.utils.get_url()
+	def register_seller(self, company):
 
-	def get_marketplace_url(self):
-		return self.marketplace_url
+		country, currency, company_description = frappe.db.get_value('Company', company,
+			['country', 'default_currency', 'company_description'])
 
-	def register(self):
-		""" Create a User on hub.erpnext.org and return username/password """
+		company_details = {
+			'company': company,
+			'country': country,
+			# 'city': '',
+			'currency': currency,
+			'company_description': company_description,
+			# 'company_logo': company_logo,
 
-		if frappe.session.user == 'Administrator':
-			frappe.throw(_('Please login as another user to register on Marketplace'))
-
-		if 'System Manager' not in frappe.get_roles():
-			frappe.throw(_('Only users with System Manager role can register on Marketplace'), frappe.PermissionError)
-
-		self.site_name = frappe.utils.get_url()
-
-		data = {
-			'profile': self.as_json()
+			'site_name': frappe.utils.get_url(),
 		}
-		post_url = self.get_marketplace_url() + '/api/method/hub.hub.api.register'
 
-		response = requests.post(post_url, data=data, headers = {'accept': 'application/json'})
+		hub_connection = self.get_connection()
 
-		response.raise_for_status()
+		response = hub_connection.post_request({
+			'cmd': 'hub.hub.api.add_hub_seller',
+			'company_details': json.dumps(company_details)
+		})
 
-		if response.ok:
-			message = response.json().get('message')
-		else:
-			frappe.throw(json.loads(response.text))
+		return response
 
-		if message.get('email'):
-			self.create_hub_connector(message)
-			self.registered = 1
-			self.save()
 
-		return message or None
+	def add_hub_user(self, user_email):
+		'''Create a Hub User and User record on hub server
+		and if successfull append it to Hub User table
+		'''
 
-	# def unregister(self):
-	# 	""" Disable the User on hub.erpnext.org"""
-
-	# 	hub_connector = frappe.get_doc(
-	# 		'Data Migration Connector', 'Hub Connector')
-
-	# 	connection = hub_connector.get_connection()
-	# 	response_doc = connection.update('User', frappe._dict({'enabled': 0}), hub_connector.username)
-
-	# 	if response_doc['enabled'] == 0:
-	# 		self.enabled = 0
-	# 		self.save()
-
-	def create_hub_connector(self, message):
-		if frappe.db.exists('Data Migration Connector', 'Hub Connector'):
-			hub_connector = frappe.get_doc('Data Migration Connector', 'Hub Connector')
-			hub_connector.hostname = self.get_marketplace_url()
-			hub_connector.username = message['email']
-			hub_connector.password = message['password']
-			hub_connector.save()
+		if not self.registered:
 			return
 
-		frappe.get_doc({
-			'doctype': 'Data Migration Connector',
-			'connector_type': 'Frappe',
-			'connector_name': 'Hub Connector',
-			'hostname': self.get_marketplace_url(),
-			'username': message['email'],
-			'password': message['password']
-		}).insert()
+		hub_connection = self.get_connection()
 
-def reset_hub_publishing_settings(last_sync_datetime = ""):
-	doc = frappe.get_doc("Marketplace Settings", "Marketplace Settings")
-	doc.reset_publishing_settings(last_sync_datetime)
-	doc.in_callback = 1
-	doc.save()
+		first_name, last_name = frappe.db.get_value('User', user_email, ['first_name', 'last_name'])
 
-def reset_hub_settings(last_sync_datetime = ""):
-	doc = frappe.get_doc("Marketplace Settings", "Marketplace Settings")
-	doc.reset_publishing_settings(last_sync_datetime)
-	doc.reset_enable()
-	doc.in_callback = 1
-	doc.save()
-	frappe.msgprint(_("Successfully unregistered."))
+		hub_user = hub_connection.post_request({
+			'cmd': 'hub.hub.api.add_hub_user',
+			'user_email': user_email,
+			'first_name': first_name,
+			'last_name': last_name,
+			'hub_seller': self.hub_seller_name
+		})
 
-@frappe.whitelist()
-def register_seller(**kwargs):
-	settings = frappe.get_doc('Marketplace Settings')
-	settings.update(kwargs)
-	message = settings.register()
+		self.append('users', {
+			'user': hub_user.get('user_email'),
+			'hub_user_name': hub_user.get('hub_user_name'),
+			'password': hub_user.get('password')
+		})
 
-	return message.get('email')
+		self.save()
+
+	def get_hub_user(self, user):
+		'''Return the Hub User doc from the `users` table if password is set'''
+
+		filtered_users = filter(
+			lambda x: x.user == user and x.password,
+			self.users
+		)
+
+		if filtered_users:
+			return filtered_users[0]
+
+
+	def get_connection(self):
+		return FrappeClient(self.marketplace_url)
+
+
+	def unregister(self):
+		"""Disable the User on hubmarket.org"""
+		pass
diff --git a/erpnext/hub_node/doctype/marketplace_settings/test_marketplace_settings.js b/erpnext/hub_node/doctype/marketplace_settings/test_marketplace_settings.js
new file mode 100644
index 0000000..fba3e09
--- /dev/null
+++ b/erpnext/hub_node/doctype/marketplace_settings/test_marketplace_settings.js
@@ -0,0 +1,23 @@
+/* eslint-disable */
+// rename this file from _test_[name] to test_[name] to activate
+// and remove above this line
+
+QUnit.test("test: Marketplace Settings", function (assert) {
+	let done = assert.async();
+
+	// number of asserts
+	assert.expect(1);
+
+	frappe.run_serially([
+		// insert a new Marketplace Settings
+		() => frappe.tests.make('Marketplace Settings', [
+			// values to be set
+			{key: 'value'}
+		]),
+		() => {
+			assert.equal(cur_frm.doc.key, 'value');
+		},
+		() => done()
+	]);
+
+});
diff --git a/erpnext/hub_node/doctype/marketplace_settings/test_marketplace_settings.py b/erpnext/hub_node/doctype/marketplace_settings/test_marketplace_settings.py
new file mode 100644
index 0000000..549b991
--- /dev/null
+++ b/erpnext/hub_node/doctype/marketplace_settings/test_marketplace_settings.py
@@ -0,0 +1,10 @@
+# -*- coding: utf-8 -*-
+# Copyright (c) 2018, Frappe Technologies Pvt. Ltd. and Contributors
+# See license.txt
+from __future__ import unicode_literals
+
+import frappe
+import unittest
+
+class TestMarketplaceSettings(unittest.TestCase):
+	pass
diff --git a/erpnext/public/js/hub/Sidebar.vue b/erpnext/public/js/hub/Sidebar.vue
index cff580e..6e0b26c 100644
--- a/erpnext/public/js/hub/Sidebar.vue
+++ b/erpnext/public/js/hub/Sidebar.vue
@@ -19,7 +19,7 @@
 export default {
 	data() {
 		return {
-			hub_registered: hub.settings.registered && frappe.session.user === hub.settings.company_email,
+			hub_registered: hub.settings.registered,
 			items: [
 				{
 					label: __('Browse'),
diff --git a/erpnext/public/js/hub/components/profile_dialog.js b/erpnext/public/js/hub/components/profile_dialog.js
index ae44659..0f22eaa 100644
--- a/erpnext/public/js/hub/components/profile_dialog.js
+++ b/erpnext/public/js/hub/components/profile_dialog.js
@@ -4,40 +4,12 @@
 			fieldtype: 'Link',
 			fieldname: 'company',
 			label: __('Company'),
-			options: 'Company',
-			onchange: () => {
-				const value = dialog.get_value('company');
-
-				if (value) {
-					frappe.db.get_doc('Company', value)
-						.then(company => {
-							dialog.set_values({
-								country: company.country,
-								currency: company.default_currency
-							});
-						});
-				}
-			}
+			options: 'Company'
 		},
 		{
 			fieldname: 'company_email',
 			label: __('Email'),
 			fieldtype: 'Read Only'
-		},
-		{
-			fieldname: 'country',
-			label: __('Country'),
-			fieldtype: 'Read Only'
-		},
-		{
-			fieldname: 'currency',
-			label: __('Currency'),
-			fieldtype: 'Read Only'
-		},
-		{
-			fieldtype: 'Text',
-			label: __('About your Company'),
-			fieldname: 'company_description'
 		}
 	];
 
@@ -48,7 +20,11 @@
 		primary_action: () => {
 			const form_values = dialog.get_values();
 			let values_filled = true;
-			const mandatory_fields = ['company', 'company_email', 'company_description'];
+
+			// TODO: Say "we notice that the company description and logo isn't set. Please set them in master."
+			// Only then allow to register
+
+			const mandatory_fields = ['company'];
 			mandatory_fields.forEach(field => {
 				const value = form_values[field];
 				if (!value) {
diff --git a/erpnext/public/js/hub/marketplace.js b/erpnext/public/js/hub/marketplace.js
index 7659a36..bdcb353 100644
--- a/erpnext/public/js/hub/marketplace.js
+++ b/erpnext/public/js/hub/marketplace.js
@@ -31,6 +31,8 @@
 			this.refresh();
 			if (!is_registered && !is_registered_seller && frappe.user_roles.includes('System Manager')) {
 				this.page.set_primary_action('Become a Seller', this.show_register_dialog.bind(this))
+			} else {
+				this.page.set_secondary_action('Add Users', this.show_add_user_dialog.bind(this));
 			}
 		});
 	}
@@ -92,23 +94,69 @@
 			__('Become a Seller'),
 			{
 				label: __('Register'),
-				on_submit: this.register_seller.bind(this)
+				on_submit: this.register_marketplace.bind(this)
 			}
 		);
 
 		this.register_dialog.show();
 	}
 
-	register_seller(form_values) {
+	register_marketplace({company, company_email}) {
 		frappe.call({
-		    method: 'erpnext.hub_node.doctype.marketplace_settings.marketplace_settings.register_seller',
-		    args: form_values
-		}).then(() => {
-			this.register_dialog.hide();
-			frappe.set_route('marketplace', 'publish');
-
-		    erpnext.hub.trigger('seller-registered');
+		    method: 'erpnext.hub_node.api.register_marketplace',
+		    args: {
+				company,
+				company_email,
+			}
+		}).then((r) => {
+			if (r.message && r.message.ok) {
+				this.register_dialog.hide();
+				frappe.set_route('marketplace', 'publish');
+				erpnext.hub.trigger('seller-registered');
+			}
 		});
 	}
 
+	show_add_user_dialog() {
+		const user_list = Object.keys(frappe.boot.user_info)
+			.filter(user => !['Administrator', 'Guest', frappe.session.user].includes(user));
+		const d = new frappe.ui.Dialog({
+			title: __('Add Users to Marketplace'),
+			fields: [
+				{
+					label: __('Users'),
+					fieldname: 'users',
+					fieldtype: 'MultiSelect',
+					reqd: 1,
+					get_data() {
+						return user_list;
+					}
+				}
+			],
+			primary_action({ users }) {
+				const selected_users = users.split(',').map(d => d.trim()).filter(Boolean);
+
+				if (!selected_users.every(user => user_list.includes(user))) {
+					d.set_df_property('users', 'description', __('Some emails are invalid'));
+					return;
+				} else {
+					d.set_df_property('users', 'description', '');
+				}
+
+				frappe.call('erpnext.hub_node.api.register_users', {
+					user_list: selected_users
+				})
+				.then(r => {
+					d.hide();
+
+					if (r.message && r.message.length) {
+						frappe.show_alert('Added {0} users', [r.message.length]);
+					}
+				});
+			}
+		});
+
+		d.show();
+	}
+
 }
diff --git a/erpnext/setup/doctype/company/company.json b/erpnext/setup/doctype/company/company.json
index a4c81c5..96d1116 100644
--- a/erpnext/setup/doctype/company/company.json
+++ b/erpnext/setup/doctype/company/company.json
@@ -312,6 +312,102 @@
    "bold": 0, 
    "collapsible": 0, 
    "columns": 0, 
+   "fieldname": "sb_about", 
+   "fieldtype": "Section Break", 
+   "hidden": 0, 
+   "ignore_user_permissions": 0, 
+   "ignore_xss_filter": 0, 
+   "in_filter": 0, 
+   "in_global_search": 0, 
+   "in_list_view": 0, 
+   "in_standard_filter": 0, 
+   "label": "About the Company", 
+   "length": 0, 
+   "no_copy": 0, 
+   "permlevel": 0, 
+   "precision": "", 
+   "print_hide": 0, 
+   "print_hide_if_no_value": 0, 
+   "read_only": 0, 
+   "remember_last_selected_value": 0, 
+   "report_hide": 0, 
+   "reqd": 0, 
+   "search_index": 0, 
+   "set_only_once": 0, 
+   "translatable": 0, 
+   "unique": 0
+  }, 
+  {
+   "allow_bulk_edit": 0, 
+   "allow_in_quick_entry": 0, 
+   "allow_on_submit": 0, 
+   "bold": 0, 
+   "collapsible": 0, 
+   "columns": 0, 
+   "fieldname": "company_logo", 
+   "fieldtype": "Attach Image", 
+   "hidden": 0, 
+   "ignore_user_permissions": 0, 
+   "ignore_xss_filter": 0, 
+   "in_filter": 0, 
+   "in_global_search": 0, 
+   "in_list_view": 0, 
+   "in_standard_filter": 0, 
+   "label": "Company Logo", 
+   "length": 0, 
+   "no_copy": 0, 
+   "permlevel": 0, 
+   "precision": "", 
+   "print_hide": 0, 
+   "print_hide_if_no_value": 0, 
+   "read_only": 0, 
+   "remember_last_selected_value": 0, 
+   "report_hide": 0, 
+   "reqd": 0, 
+   "search_index": 0, 
+   "set_only_once": 0, 
+   "translatable": 0, 
+   "unique": 0
+  }, 
+  {
+   "allow_bulk_edit": 0, 
+   "allow_in_quick_entry": 0, 
+   "allow_on_submit": 0, 
+   "bold": 0, 
+   "collapsible": 0, 
+   "columns": 0, 
+   "fieldname": "company_description", 
+   "fieldtype": "Text Editor", 
+   "hidden": 0, 
+   "ignore_user_permissions": 0, 
+   "ignore_xss_filter": 0, 
+   "in_filter": 0, 
+   "in_global_search": 0, 
+   "in_list_view": 0, 
+   "in_standard_filter": 0, 
+   "label": "Company Description", 
+   "length": 0, 
+   "no_copy": 0, 
+   "permlevel": 0, 
+   "precision": "", 
+   "print_hide": 0, 
+   "print_hide_if_no_value": 0, 
+   "read_only": 0, 
+   "remember_last_selected_value": 0, 
+   "report_hide": 0, 
+   "reqd": 0, 
+   "search_index": 0, 
+   "set_only_once": 0, 
+   "translatable": 0, 
+   "unique": 0
+  }, 
+  {
+   "allow_bulk_edit": 0, 
+   "allow_in_quick_entry": 0, 
+   "allow_on_submit": 0, 
+   "bold": 0, 
+   "collapsible": 0, 
+   "columns": 0, 
    "fieldname": "sales_settings", 
    "fieldtype": "Section Break", 
    "hidden": 0, 
@@ -741,7 +837,7 @@
    "label": "Create Chart Of Accounts Based On", 
    "length": 0, 
    "no_copy": 0, 
-   "options": "\nStandard Template\nExisting Company", 
+   "options": "\nStandard Template\nExisting Company\n\n\n", 
    "permlevel": 0, 
    "precision": "", 
    "print_hide": 0, 
@@ -775,7 +871,7 @@
    "label": "Chart Of Accounts Template", 
    "length": 0, 
    "no_copy": 1, 
-   "options": "", 
+   "options": "\n\n\n", 
    "permlevel": 0, 
    "precision": "", 
    "print_hide": 0, 
@@ -2637,38 +2733,6 @@
    "bold": 0, 
    "collapsible": 0, 
    "columns": 0, 
-   "fieldname": "company_logo", 
-   "fieldtype": "Attach Image", 
-   "hidden": 0, 
-   "ignore_user_permissions": 0, 
-   "ignore_xss_filter": 0, 
-   "in_filter": 0, 
-   "in_global_search": 0, 
-   "in_list_view": 0, 
-   "in_standard_filter": 0, 
-   "label": "Company Logo", 
-   "length": 0, 
-   "no_copy": 0, 
-   "permlevel": 0, 
-   "precision": "", 
-   "print_hide": 0, 
-   "print_hide_if_no_value": 0, 
-   "read_only": 0, 
-   "remember_last_selected_value": 0, 
-   "report_hide": 0, 
-   "reqd": 0, 
-   "search_index": 0, 
-   "set_only_once": 0, 
-   "translatable": 0, 
-   "unique": 0
-  }, 
-  {
-   "allow_bulk_edit": 0, 
-   "allow_in_quick_entry": 0, 
-   "allow_on_submit": 0, 
-   "bold": 0, 
-   "collapsible": 0, 
-   "columns": 0, 
    "fieldname": "lft", 
    "fieldtype": "Int", 
    "hidden": 1, 
@@ -2772,8 +2836,8 @@
  "istable": 0, 
  "max_attachments": 0, 
  "menu_index": 0, 
- "modified": "2018-08-28 15:47:50.757131", 
- "modified_by": "Administrator", 
+ "modified": "2018-09-01 16:03:30.716918", 
+ "modified_by": "cave@aperture.com", 
  "module": "Setup", 
  "name": "Company", 
  "owner": "Administrator", 
@@ -2918,5 +2982,6 @@
  "show_name_in_global_search": 1, 
  "sort_order": "ASC", 
  "track_changes": 1, 
- "track_seen": 0
+ "track_seen": 0, 
+ "track_views": 0
 }
\ No newline at end of file