diff --git a/erpnext/hub_node/api.py b/erpnext/hub_node/api.py index 2a928d44a2..df3e7efb8f 100644 --- a/erpnext/hub_node/api.py +++ b/erpnext/hub_node/api.py @@ -19,6 +19,7 @@ current_user = frappe.session.user @frappe.whitelist() def register_marketplace(company, company_description): validate_registerer() + settings = frappe.get_single('Marketplace Settings') message = settings.register_seller(company, company_description) @@ -151,6 +152,14 @@ def publish_selected_items(items_to_publish): except Exception as e: frappe.log_error(message=e, title='Hub Sync Error') +@frappe.whitelist() +def get_unregistered_users(): + settings = frappe.get_single('Marketplace Settings') + registered_users = [user.user for user in settings.users] + ['Administrator', 'Guest'] + all_users = [user.name for user in frappe.db.get_all('User', filters={'enabled': 1})] + unregistered_users = [user for user in all_users if user not in registered_users] + return unregistered_users + def item_sync_preprocess(intended_item_publish_count): response = call_hub_method('pre_items_publish', { diff --git a/erpnext/hub_node/doctype/marketplace_settings/marketplace_settings.py b/erpnext/hub_node/doctype/marketplace_settings/marketplace_settings.py index ebe8b702ab..5ea3011a86 100644 --- a/erpnext/hub_node/doctype/marketplace_settings/marketplace_settings.py +++ b/erpnext/hub_node/doctype/marketplace_settings/marketplace_settings.py @@ -15,18 +15,16 @@ class MarketplaceSettings(Document): def register_seller(self, company, company_description): - country, currency, description = frappe.db.get_value('Company', company, - ['country', 'default_currency', 'company_description']) + country, currency, company_logo = frappe.db.get_value('Company', company, + ['country', 'default_currency', 'company_logo']) company_details = { 'company': company, 'country': country, - # 'city': '', 'currency': currency, 'company_description': company_description, - # 'company_logo': company_logo, - - 'site_name': frappe.utils.get_url(), + 'company_logo': company_logo, + 'site_name': frappe.utils.get_url() } hub_connection = self.get_connection() diff --git a/erpnext/public/js/hub/Sidebar.vue b/erpnext/public/js/hub/Sidebar.vue index 6e0b26ce58..164e78d30d 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, + hub_registered: hub.is_user_registered(), items: [ { label: __('Browse'), diff --git a/erpnext/public/js/hub/components/ReviewArea.vue b/erpnext/public/js/hub/components/ReviewArea.vue index 070d0a69cb..159fdd112f 100644 --- a/erpnext/public/js/hub/components/ReviewArea.vue +++ b/erpnext/public/js/hub/components/ReviewArea.vue @@ -56,8 +56,6 @@ export default { }, on_submit_review(values) { - values.user = hub.settings.company_email; - this.review_area.reset(); hub.call('add_item_review', { diff --git a/erpnext/public/js/hub/components/profile_dialog.js b/erpnext/public/js/hub/components/profile_dialog.js index ea827ff3bf..636bf1436a 100644 --- a/erpnext/public/js/hub/components/profile_dialog.js +++ b/erpnext/public/js/hub/components/profile_dialog.js @@ -24,16 +24,10 @@ const ProfileDialog = (title = __('Edit Profile'), action={}) => { } } }, - // { - // fieldname: 'company_logo', - // label: __('Logo'), - // fieldtype: 'Attach Image', - // read_only: true - // }, { + label: __('About your company'), fieldname: 'company_description', - label: __('About Your Company'), - fieldtype: 'Long Text' + fieldtype: 'Text' } ]; @@ -48,7 +42,7 @@ const ProfileDialog = (title = __('Edit Profile'), action={}) => { // 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']; + const mandatory_fields = ['company', 'company_description']; mandatory_fields.forEach(field => { const value = form_values[field]; if (!value) { @@ -65,7 +59,7 @@ const ProfileDialog = (title = __('Edit Profile'), action={}) => { // Post create const default_company = frappe.defaults.get_default('company'); dialog.set_value('company', default_company); - dialog.set_value('company_email', frappe.session.user); + dialog.set_value('email', frappe.session.user); return dialog; } diff --git a/erpnext/public/js/hub/marketplace.js b/erpnext/public/js/hub/marketplace.js index 9df6303f6b..bacca47545 100644 --- a/erpnext/public/js/hub/marketplace.js +++ b/erpnext/public/js/hub/marketplace.js @@ -22,17 +22,20 @@ erpnext.hub.Marketplace = class Marketplace { frappe.model.with_doc('Marketplace Settings').then(doc => { hub.settings = doc; - const is_registered = hub.settings.registered; - const is_registered_seller = hub.settings.company_email === frappe.session.user; + this.setup_header(); this.make_sidebar(); this.make_body(); this.setup_events(); 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)); + + if (is_subset(['System Manager', 'Item Manager'], frappe.user_roles)) { + // show buttons only to System Manager + if (!hub.is_seller_registered()) { + 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)); + } } }); } @@ -118,45 +121,73 @@ erpnext.hub.Marketplace = class Marketplace { } 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); + this.get_unregistered_users() + .then(r => { + const user_list = r.message; - 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', ''); - } + 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); - frappe.call('erpnext.hub_node.api.register_users', { - user_list: selected_users - }) - .then(r => { - d.hide(); + 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', ''); + } - if (r.message && r.message.length) { - frappe.show_alert('Added {0} users', [r.message.length]); + 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(); + d.show(); + }); + } + + get_unregistered_users() { + return frappe.call('erpnext.hub_node.api.get_unregistered_users') } } + +Object.assign(hub, { + is_seller_registered() { + return hub.settings.registered; + }, + + is_user_registered() { + return this.is_seller_registered() && hub.settings.users + .filter(hub_user => hub_user.user === frappe.session.user) + .length === 1; + }, +}); + +/** + * Returns true if list_a is subset of list_b + * @param {Array} list_a + * @param {Array} list_b + */ +function is_subset(list_a, list_b) { + return list_a.every(item => list_b.includes(item)); +} diff --git a/erpnext/public/js/hub/pages/Buying.vue b/erpnext/public/js/hub/pages/Buying.vue index ddb4b11db9..ebf593aca4 100644 --- a/erpnext/public/js/hub/pages/Buying.vue +++ b/erpnext/public/js/hub/pages/Buying.vue @@ -13,8 +13,8 @@ v-route="'marketplace/buying/' + item.name" >
- {{ published_items_message }} + {{ __('You can publish upto 200 items.') }}