blob: 2035174c98326d7973165799f509b2fd14d5e823 [file] [log] [blame]
Prateeksha Singh6495d532018-08-01 16:38:39 +05301from __future__ import unicode_literals
Prateeksha Singha8065ff2018-08-31 22:41:26 +05302
3import frappe
4import json
Prateeksha Singha8065ff2018-08-31 22:41:26 +05305
6from frappe import _
Prateeksha Singh6495d532018-08-01 16:38:39 +05307from frappe.frappeclient import FrappeClient
Prateeksha Singha525d122018-08-19 22:31:33 +05308from frappe.desk.form.load import get_attachments
Suraj Shetty3cd0c542018-08-21 16:29:06 +05309from six import string_types
Prateeksha Singh6495d532018-08-01 16:38:39 +053010
Prateeksha Singh810ae012018-09-01 01:14:29 +053011current_user = frappe.session.user
12
Prateeksha Singh4e1fd0b2018-09-01 09:55:43 +053013
Prateeksha Singh6495d532018-08-01 16:38:39 +053014@frappe.whitelist()
Prateeksha Singh47cc30d2018-09-03 13:11:23 +053015def register_marketplace(company, company_description):
Prateeksha Singha8065ff2018-08-31 22:41:26 +053016 validate_registerer()
Faris Ansariad0be6a2018-09-03 15:42:00 +053017
Faris Ansari255dd0e2018-09-01 14:30:46 +053018 settings = frappe.get_single('Marketplace Settings')
Prateeksha Singh47cc30d2018-09-03 13:11:23 +053019 message = settings.register_seller(company, company_description)
Prateeksha Singha8065ff2018-08-31 22:41:26 +053020
Faris Ansari255dd0e2018-09-01 14:30:46 +053021 if message.get('hub_seller_name'):
Prateeksha Singha8065ff2018-08-31 22:41:26 +053022 settings.registered = 1
Faris Ansari255dd0e2018-09-01 14:30:46 +053023 settings.hub_seller_name = message.get('hub_seller_name')
24 settings.save()
Prateeksha Singha8065ff2018-08-31 22:41:26 +053025
Prateeksha Singhb2b745f2018-09-01 17:20:08 +053026 settings.add_hub_user(frappe.session.user)
Prateeksha Singha8065ff2018-08-31 22:41:26 +053027
Faris Ansari255dd0e2018-09-01 14:30:46 +053028 return { 'ok': 1 }
Prateeksha Singha8065ff2018-08-31 22:41:26 +053029
Prateeksha Singh4e1fd0b2018-09-01 09:55:43 +053030
31@frappe.whitelist()
Faris Ansari68129df2018-09-02 18:29:00 +053032def register_users(user_list):
33 user_list = json.loads(user_list)
34
35 settings = frappe.get_single('Marketplace Settings')
36
37 for user in user_list:
38 settings.add_hub_user(user)
39
40 return user_list
Prateeksha Singh4e1fd0b2018-09-01 09:55:43 +053041
42
Prateeksha Singha8065ff2018-08-31 22:41:26 +053043def validate_registerer():
Prateeksha Singh810ae012018-09-01 01:14:29 +053044 if current_user == 'Administrator':
Prateeksha Singha8065ff2018-08-31 22:41:26 +053045 frappe.throw(_('Please login as another user to register on Marketplace'))
46
Faris Ansari255dd0e2018-09-01 14:30:46 +053047 valid_roles = ['System Manager', 'Item Manager']
48
49 if not frappe.utils.is_subset(valid_roles, frappe.get_roles()):
50 frappe.throw(_('Only users with {0} role can register on Marketplace').format(', '.join(valid_roles)),
51 frappe.PermissionError)
Prateeksha Singha8065ff2018-08-31 22:41:26 +053052
Prateeksha Singh4e1fd0b2018-09-01 09:55:43 +053053
Prateeksha Singha8065ff2018-08-31 22:41:26 +053054@frappe.whitelist()
Prateeksha Singh6495d532018-08-01 16:38:39 +053055def call_hub_method(method, params=None):
56 connection = get_hub_connection()
57
Suraj Shetty3cd0c542018-08-21 16:29:06 +053058 if isinstance(params, string_types):
Prateeksha Singh6495d532018-08-01 16:38:39 +053059 params = json.loads(params)
60
61 params.update({
62 'cmd': 'hub.hub.api.' + method
63 })
64
65 response = connection.post_request(params)
66 return response
67
Prateeksha Singh4e1fd0b2018-09-01 09:55:43 +053068
Prateeksha Singhcaadd8a2018-08-21 19:59:15 +053069def map_fields(items):
70 field_mappings = get_field_mappings()
71 table_fields = [d.fieldname for d in frappe.get_meta('Item').get_table_fields()]
72
Mangesh-Khairnar8287c3d2019-11-29 15:52:29 +053073 hub_seller_name = frappe.db.get_value('Marketplace Settings', 'Marketplace Settings', 'hub_seller_name')
Prateeksha Singhcaadd8a2018-08-21 19:59:15 +053074
75 for item in items:
76 for fieldname in table_fields:
77 item.pop(fieldname, None)
78
79 for mapping in field_mappings:
80 local_fieldname = mapping.get('local_fieldname')
81 remote_fieldname = mapping.get('remote_fieldname')
82
83 value = item.get(local_fieldname)
84 item.pop(local_fieldname, None)
85 item[remote_fieldname] = value
86
87 item['doctype'] = 'Hub Item'
Prateeksha Singh85563dd2018-09-03 02:44:27 +053088 item['hub_seller'] = hub_seller_name
Prateeksha Singh40f7c462018-08-24 16:38:34 +053089 item.pop('attachments', None)
Prateeksha Singhcaadd8a2018-08-21 19:59:15 +053090
91 return items
92
Prateeksha Singh4e1fd0b2018-09-01 09:55:43 +053093
Prateeksha Singh6495d532018-08-01 16:38:39 +053094@frappe.whitelist()
95def get_valid_items(search_value=''):
96 items = frappe.get_list(
97 'Item',
98 fields=["*"],
99 filters={
Faris Ansari00f6aef2018-08-30 18:54:28 +0530100 'disabled': 0,
Prateeksha Singh6495d532018-08-01 16:38:39 +0530101 'item_name': ['like', '%' + search_value + '%'],
102 'publish_in_hub': 0
103 },
104 order_by="modified desc"
105 )
106
107 valid_items = filter(lambda x: x.image and x.description, items)
108
Prateeksha Singha525d122018-08-19 22:31:33 +0530109 def prepare_item(item):
Prateeksha Singh6495d532018-08-01 16:38:39 +0530110 item.source_type = "local"
Prateeksha Singha525d122018-08-19 22:31:33 +0530111 item.attachments = get_attachments('Item', item.item_code)
Prateeksha Singh6495d532018-08-01 16:38:39 +0530112 return item
113
Prateeksha Singh02c176c2018-08-29 14:27:47 +0530114 valid_items = map(prepare_item, valid_items)
Prateeksha Singha525d122018-08-19 22:31:33 +0530115
Prateeksha Singh6495d532018-08-01 16:38:39 +0530116 return valid_items
117
Mangesh-Khairnar01503822019-12-05 02:10:57 +0530118@frappe.whitelist()
Mangesh-Khairnarc1a1e7d2019-12-19 20:11:37 +0530119def update_item(ref_doc, data):
Mangesh-Khairnar01503822019-12-05 02:10:57 +0530120 data = json.loads(data)
121
Mangesh-Khairnarc1a1e7d2019-12-19 20:11:37 +0530122 data.update(dict(doctype='Hub Item', name=ref_doc))
Mangesh-Khairnar01503822019-12-05 02:10:57 +0530123 try:
124 connection = get_hub_connection()
125 connection.update(data)
126 except Exception as e:
127 frappe.log_error(message=e, title='Hub Sync Error')
Prateeksha Singh4e1fd0b2018-09-01 09:55:43 +0530128
Prateeksha Singh6495d532018-08-01 16:38:39 +0530129@frappe.whitelist()
130def publish_selected_items(items_to_publish):
131 items_to_publish = json.loads(items_to_publish)
Mangesh-Khairnar4bea44b2019-12-13 15:05:43 +0530132 items_to_update = []
Prateeksha Singh6495d532018-08-01 16:38:39 +0530133 if not len(items_to_publish):
Anurag Mishra841d8522019-07-03 15:15:08 +0530134 frappe.throw(_('No items to publish'))
Prateeksha Singh6495d532018-08-01 16:38:39 +0530135
Prateeksha Singh40f7c462018-08-24 16:38:34 +0530136 for item in items_to_publish:
137 item_code = item.get('item_code')
Prateeksha Singh6495d532018-08-01 16:38:39 +0530138 frappe.db.set_value('Item', item_code, 'publish_in_hub', 1)
139
Mangesh-Khairnar4bea44b2019-12-13 15:05:43 +0530140 hub_dict = {
Prateeksha Singh0a60d1c2018-08-19 19:39:00 +0530141 'doctype': 'Hub Tracked Item',
142 'item_code': item_code,
Mangesh-Khairnar4bea44b2019-12-13 15:05:43 +0530143 'published': 1,
Prateeksha Singh40f7c462018-08-24 16:38:34 +0530144 'hub_category': item.get('hub_category'),
145 'image_list': item.get('image_list')
Mangesh-Khairnar4bea44b2019-12-13 15:05:43 +0530146 }
147 if frappe.db.exists('Hub Tracked Item', item_code):
148 items_to_update.append(item)
149 hub_tracked_item = frappe.get_doc('Hub Tracked Item', item_code)
150 hub_tracked_item.update(hub_dict)
Mangesh-Khairnar7a5b9a72019-12-24 17:39:15 +0530151 hub_tracked_item.save()
Mangesh-Khairnar4bea44b2019-12-13 15:05:43 +0530152 else:
153 frappe.get_doc(hub_dict).insert(ignore_if_duplicate=True)
Prateeksha Singh0a60d1c2018-08-19 19:39:00 +0530154
Mangesh-Khairnar4bea44b2019-12-13 15:05:43 +0530155 items_to_publish = list(filter(lambda x: x not in items_to_update, items_to_publish))
156 new_items = map_fields(items_to_publish)
157 existing_items = map_fields(items_to_update)
Prateeksha Singhcaadd8a2018-08-21 19:59:15 +0530158
Prateeksha Singh6495d532018-08-01 16:38:39 +0530159 try:
Prateeksha Singha6f184b2018-08-30 02:30:40 +0530160 item_sync_preprocess(len(items))
Faris Ansari49ccdd62018-09-03 17:24:17 +0530161 convert_relative_image_urls_to_absolute(items)
Prateeksha Singhcaadd8a2018-08-21 19:59:15 +0530162
163 # TODO: Publish Progress
164 connection = get_hub_connection()
Mangesh-Khairnar4bea44b2019-12-13 15:05:43 +0530165 connection.insert_many(new_items)
166 connection.bulk_update(existing_items)
Prateeksha Singhcaadd8a2018-08-21 19:59:15 +0530167
Prateeksha Singha6f184b2018-08-30 02:30:40 +0530168 item_sync_postprocess()
Prateeksha Singh6495d532018-08-01 16:38:39 +0530169 except Exception as e:
Prateeksha Singh02c176c2018-08-29 14:27:47 +0530170 frappe.log_error(message=e, title='Hub Sync Error')
Prateeksha Singh6495d532018-08-01 16:38:39 +0530171
Faris Ansariad0be6a2018-09-03 15:42:00 +0530172@frappe.whitelist()
Mangesh-Khairnar0cb27832019-12-09 19:24:29 +0530173def unpublish_item(item_code, hub_item_name):
Mangesh-Khairnar8287c3d2019-11-29 15:52:29 +0530174 ''' Remove item listing from the marketplace '''
Mangesh-Khairnar8287c3d2019-11-29 15:52:29 +0530175
Mangesh-Khairnar0cb27832019-12-09 19:24:29 +0530176 response = call_hub_method('unpublish_item', {
177 'hub_item_name': hub_item_name
178 })
Mangesh-Khairnar8287c3d2019-11-29 15:52:29 +0530179
Mangesh-Khairnar0cb27832019-12-09 19:24:29 +0530180 if response:
181 frappe.db.set_value('Item', item_code, 'publish_in_hub', 0)
182 else:
183 frappe.throw(_('Unable to update remote activity'))
Mangesh-Khairnar8287c3d2019-11-29 15:52:29 +0530184
185@frappe.whitelist()
Faris Ansariad0be6a2018-09-03 15:42:00 +0530186def get_unregistered_users():
187 settings = frappe.get_single('Marketplace Settings')
188 registered_users = [user.user for user in settings.users] + ['Administrator', 'Guest']
189 all_users = [user.name for user in frappe.db.get_all('User', filters={'enabled': 1})]
190 unregistered_users = [user for user in all_users if user not in registered_users]
191 return unregistered_users
192
Prateeksha Singh4e1fd0b2018-09-01 09:55:43 +0530193
Prateeksha Singha6f184b2018-08-30 02:30:40 +0530194def item_sync_preprocess(intended_item_publish_count):
195 response = call_hub_method('pre_items_publish', {
196 'intended_item_publish_count': intended_item_publish_count
Prateeksha Singh6495d532018-08-01 16:38:39 +0530197 })
198
199 if response:
Faris Ansarif9a66c12018-08-31 16:15:06 +0530200 frappe.db.set_value("Marketplace Settings", "Marketplace Settings", "sync_in_progress", 1)
Prateeksha Singh6495d532018-08-01 16:38:39 +0530201 return response
202 else:
Anurag Mishra841d8522019-07-03 15:15:08 +0530203 frappe.throw(_('Unable to update remote activity'))
Prateeksha Singh6495d532018-08-01 16:38:39 +0530204
Prateeksha Singh4e1fd0b2018-09-01 09:55:43 +0530205
Prateeksha Singha6f184b2018-08-30 02:30:40 +0530206def item_sync_postprocess():
207 response = call_hub_method('post_items_publish', {})
Prateeksha Singh6495d532018-08-01 16:38:39 +0530208 if response:
Faris Ansarif9a66c12018-08-31 16:15:06 +0530209 frappe.db.set_value('Marketplace Settings', 'Marketplace Settings', 'last_sync_datetime', frappe.utils.now())
Prateeksha Singh6495d532018-08-01 16:38:39 +0530210 else:
Anurag Mishra841d8522019-07-03 15:15:08 +0530211 frappe.throw(_('Unable to update remote activity'))
Prateeksha Singh6495d532018-08-01 16:38:39 +0530212
Faris Ansarif9a66c12018-08-31 16:15:06 +0530213 frappe.db.set_value('Marketplace Settings', 'Marketplace Settings', 'sync_in_progress', 0)
Prateeksha Singhcaadd8a2018-08-21 19:59:15 +0530214
Faris Ansari811a2de2018-08-28 17:17:29 +0530215
Faris Ansari49ccdd62018-09-03 17:24:17 +0530216def convert_relative_image_urls_to_absolute(items):
Faris Ansari31e54312018-09-14 15:31:35 +0530217 from six.moves.urllib.parse import urljoin
Faris Ansari49ccdd62018-09-03 17:24:17 +0530218
Faris Ansari811a2de2018-08-28 17:17:29 +0530219 for item in items:
220 file_path = item['image']
Faris Ansari811a2de2018-08-28 17:17:29 +0530221
Faris Ansari49ccdd62018-09-03 17:24:17 +0530222 if file_path.startswith('/files/'):
223 item['image'] = urljoin(frappe.utils.get_url(), file_path)
Faris Ansari811a2de2018-08-28 17:17:29 +0530224
225
Prateeksha Singh6495d532018-08-01 16:38:39 +0530226def get_hub_connection():
Prateeksha Singh810ae012018-09-01 01:14:29 +0530227 settings = frappe.get_single('Marketplace Settings')
228 marketplace_url = settings.marketplace_url
Faris Ansari68129df2018-09-02 18:29:00 +0530229 hub_user = settings.get_hub_user(frappe.session.user)
Faris Ansari64202ad2018-08-29 15:02:39 +0530230
Faris Ansari68129df2018-09-02 18:29:00 +0530231 if hub_user:
232 password = hub_user.get_password()
233 hub_connection = FrappeClient(marketplace_url, hub_user.user, password)
Faris Ansari64202ad2018-08-29 15:02:39 +0530234 return hub_connection
Prateeksha Singh810ae012018-09-01 01:14:29 +0530235 else:
236 read_only_hub_connection = FrappeClient(marketplace_url)
237 return read_only_hub_connection
238
Prateeksha Singhcaadd8a2018-08-21 19:59:15 +0530239
240def get_field_mappings():
241 return []