blob: 2a928d44a2246687622f89f778b47061c02a18a3 [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
5import io
6import base64
7import os
8import requests
9
10from frappe import _
Prateeksha Singh6495d532018-08-01 16:38:39 +053011from frappe.frappeclient import FrappeClient
Prateeksha Singha525d122018-08-19 22:31:33 +053012from frappe.desk.form.load import get_attachments
Faris Ansari95e41412018-08-30 11:46:14 +053013from frappe.utils.file_manager import get_file_path
Suraj Shetty3cd0c542018-08-21 16:29:06 +053014from six import string_types
Prateeksha Singh6495d532018-08-01 16:38:39 +053015
Prateeksha Singh810ae012018-09-01 01:14:29 +053016current_user = frappe.session.user
17
Prateeksha Singh4e1fd0b2018-09-01 09:55:43 +053018
Prateeksha Singh6495d532018-08-01 16:38:39 +053019@frappe.whitelist()
Prateeksha Singh47cc30d2018-09-03 13:11:23 +053020def register_marketplace(company, company_description):
Prateeksha Singha8065ff2018-08-31 22:41:26 +053021 validate_registerer()
Faris Ansari255dd0e2018-09-01 14:30:46 +053022 settings = frappe.get_single('Marketplace Settings')
Prateeksha Singh47cc30d2018-09-03 13:11:23 +053023 message = settings.register_seller(company, company_description)
Prateeksha Singha8065ff2018-08-31 22:41:26 +053024
Faris Ansari255dd0e2018-09-01 14:30:46 +053025 if message.get('hub_seller_name'):
Prateeksha Singha8065ff2018-08-31 22:41:26 +053026 settings.registered = 1
Faris Ansari255dd0e2018-09-01 14:30:46 +053027 settings.hub_seller_name = message.get('hub_seller_name')
28 settings.save()
Prateeksha Singha8065ff2018-08-31 22:41:26 +053029
Prateeksha Singhb2b745f2018-09-01 17:20:08 +053030 settings.add_hub_user(frappe.session.user)
Prateeksha Singha8065ff2018-08-31 22:41:26 +053031
Faris Ansari255dd0e2018-09-01 14:30:46 +053032 return { 'ok': 1 }
Prateeksha Singha8065ff2018-08-31 22:41:26 +053033
Prateeksha Singh4e1fd0b2018-09-01 09:55:43 +053034
35@frappe.whitelist()
Faris Ansari68129df2018-09-02 18:29:00 +053036def register_users(user_list):
37 user_list = json.loads(user_list)
38
39 settings = frappe.get_single('Marketplace Settings')
40
41 for user in user_list:
42 settings.add_hub_user(user)
43
44 return user_list
Prateeksha Singh4e1fd0b2018-09-01 09:55:43 +053045
46
Prateeksha Singha8065ff2018-08-31 22:41:26 +053047def validate_registerer():
Prateeksha Singh810ae012018-09-01 01:14:29 +053048 if current_user == 'Administrator':
Prateeksha Singha8065ff2018-08-31 22:41:26 +053049 frappe.throw(_('Please login as another user to register on Marketplace'))
50
Faris Ansari255dd0e2018-09-01 14:30:46 +053051 valid_roles = ['System Manager', 'Item Manager']
52
53 if not frappe.utils.is_subset(valid_roles, frappe.get_roles()):
54 frappe.throw(_('Only users with {0} role can register on Marketplace').format(', '.join(valid_roles)),
55 frappe.PermissionError)
Prateeksha Singha8065ff2018-08-31 22:41:26 +053056
Prateeksha Singh4e1fd0b2018-09-01 09:55:43 +053057
Prateeksha Singha8065ff2018-08-31 22:41:26 +053058@frappe.whitelist()
Prateeksha Singh6495d532018-08-01 16:38:39 +053059def call_hub_method(method, params=None):
60 connection = get_hub_connection()
61
Suraj Shetty3cd0c542018-08-21 16:29:06 +053062 if isinstance(params, string_types):
Prateeksha Singh6495d532018-08-01 16:38:39 +053063 params = json.loads(params)
64
65 params.update({
66 'cmd': 'hub.hub.api.' + method
67 })
68
69 response = connection.post_request(params)
70 return response
71
Prateeksha Singh4e1fd0b2018-09-01 09:55:43 +053072
Prateeksha Singhcaadd8a2018-08-21 19:59:15 +053073def map_fields(items):
74 field_mappings = get_field_mappings()
75 table_fields = [d.fieldname for d in frappe.get_meta('Item').get_table_fields()]
76
Prateeksha Singh85563dd2018-09-03 02:44:27 +053077 hub_seller_name = frappe.db.get_value('Marketplace Settings' , 'Marketplace Settings', 'hub_seller_name')
Prateeksha Singhcaadd8a2018-08-21 19:59:15 +053078
79 for item in items:
80 for fieldname in table_fields:
81 item.pop(fieldname, None)
82
83 for mapping in field_mappings:
84 local_fieldname = mapping.get('local_fieldname')
85 remote_fieldname = mapping.get('remote_fieldname')
86
87 value = item.get(local_fieldname)
88 item.pop(local_fieldname, None)
89 item[remote_fieldname] = value
90
91 item['doctype'] = 'Hub Item'
Prateeksha Singh85563dd2018-09-03 02:44:27 +053092 item['hub_seller'] = hub_seller_name
Prateeksha Singh40f7c462018-08-24 16:38:34 +053093 item.pop('attachments', None)
Prateeksha Singhcaadd8a2018-08-21 19:59:15 +053094
95 return items
96
Prateeksha Singh4e1fd0b2018-09-01 09:55:43 +053097
Prateeksha Singh6495d532018-08-01 16:38:39 +053098@frappe.whitelist()
99def get_valid_items(search_value=''):
100 items = frappe.get_list(
101 'Item',
102 fields=["*"],
103 filters={
Faris Ansari00f6aef2018-08-30 18:54:28 +0530104 'disabled': 0,
Prateeksha Singh6495d532018-08-01 16:38:39 +0530105 'item_name': ['like', '%' + search_value + '%'],
106 'publish_in_hub': 0
107 },
108 order_by="modified desc"
109 )
110
111 valid_items = filter(lambda x: x.image and x.description, items)
112
Prateeksha Singha525d122018-08-19 22:31:33 +0530113 def prepare_item(item):
Prateeksha Singh6495d532018-08-01 16:38:39 +0530114 item.source_type = "local"
Prateeksha Singha525d122018-08-19 22:31:33 +0530115 item.attachments = get_attachments('Item', item.item_code)
Prateeksha Singh6495d532018-08-01 16:38:39 +0530116 return item
117
Prateeksha Singh02c176c2018-08-29 14:27:47 +0530118 valid_items = map(prepare_item, valid_items)
Prateeksha Singha525d122018-08-19 22:31:33 +0530119
Prateeksha Singh6495d532018-08-01 16:38:39 +0530120 return valid_items
121
Prateeksha Singh4e1fd0b2018-09-01 09:55:43 +0530122
Prateeksha Singh6495d532018-08-01 16:38:39 +0530123@frappe.whitelist()
124def publish_selected_items(items_to_publish):
125 items_to_publish = json.loads(items_to_publish)
126 if not len(items_to_publish):
Prateeksha Singh0a60d1c2018-08-19 19:39:00 +0530127 frappe.throw('No items to publish')
Prateeksha Singh6495d532018-08-01 16:38:39 +0530128
Prateeksha Singh40f7c462018-08-24 16:38:34 +0530129 for item in items_to_publish:
130 item_code = item.get('item_code')
Prateeksha Singh6495d532018-08-01 16:38:39 +0530131 frappe.db.set_value('Item', item_code, 'publish_in_hub', 1)
132
Prateeksha Singh0a60d1c2018-08-19 19:39:00 +0530133 frappe.get_doc({
134 'doctype': 'Hub Tracked Item',
135 'item_code': item_code,
Prateeksha Singh40f7c462018-08-24 16:38:34 +0530136 'hub_category': item.get('hub_category'),
137 'image_list': item.get('image_list')
Faris Ansari811a2de2018-08-28 17:17:29 +0530138 }).insert(ignore_if_duplicate=True)
Prateeksha Singh0a60d1c2018-08-19 19:39:00 +0530139
Prateeksha Singh40f7c462018-08-24 16:38:34 +0530140 items = map_fields(items_to_publish)
Prateeksha Singhcaadd8a2018-08-21 19:59:15 +0530141
Prateeksha Singh6495d532018-08-01 16:38:39 +0530142 try:
Prateeksha Singha6f184b2018-08-30 02:30:40 +0530143 item_sync_preprocess(len(items))
Faris Ansari811a2de2018-08-28 17:17:29 +0530144 load_base64_image_from_items(items)
Prateeksha Singhcaadd8a2018-08-21 19:59:15 +0530145
146 # TODO: Publish Progress
147 connection = get_hub_connection()
148 connection.insert_many(items)
149
Prateeksha Singha6f184b2018-08-30 02:30:40 +0530150 item_sync_postprocess()
Prateeksha Singh6495d532018-08-01 16:38:39 +0530151 except Exception as e:
Prateeksha Singh02c176c2018-08-29 14:27:47 +0530152 frappe.log_error(message=e, title='Hub Sync Error')
Prateeksha Singh6495d532018-08-01 16:38:39 +0530153
Prateeksha Singh4e1fd0b2018-09-01 09:55:43 +0530154
Prateeksha Singha6f184b2018-08-30 02:30:40 +0530155def item_sync_preprocess(intended_item_publish_count):
156 response = call_hub_method('pre_items_publish', {
157 'intended_item_publish_count': intended_item_publish_count
Prateeksha Singh6495d532018-08-01 16:38:39 +0530158 })
159
160 if response:
Faris Ansarif9a66c12018-08-31 16:15:06 +0530161 frappe.db.set_value("Marketplace Settings", "Marketplace Settings", "sync_in_progress", 1)
Prateeksha Singh6495d532018-08-01 16:38:39 +0530162 return response
163 else:
164 frappe.throw('Unable to update remote activity')
165
Prateeksha Singh4e1fd0b2018-09-01 09:55:43 +0530166
Prateeksha Singha6f184b2018-08-30 02:30:40 +0530167def item_sync_postprocess():
168 response = call_hub_method('post_items_publish', {})
Prateeksha Singh6495d532018-08-01 16:38:39 +0530169 if response:
Faris Ansarif9a66c12018-08-31 16:15:06 +0530170 frappe.db.set_value('Marketplace Settings', 'Marketplace Settings', 'last_sync_datetime', frappe.utils.now())
Prateeksha Singh6495d532018-08-01 16:38:39 +0530171 else:
172 frappe.throw('Unable to update remote activity')
173
Faris Ansarif9a66c12018-08-31 16:15:06 +0530174 frappe.db.set_value('Marketplace Settings', 'Marketplace Settings', 'sync_in_progress', 0)
Prateeksha Singhcaadd8a2018-08-21 19:59:15 +0530175
Faris Ansari811a2de2018-08-28 17:17:29 +0530176
177def load_base64_image_from_items(items):
Faris Ansari811a2de2018-08-28 17:17:29 +0530178 for item in items:
179 file_path = item['image']
180 file_name = os.path.basename(file_path)
Faris Ansari8683bd82018-08-29 16:18:36 +0530181 base64content = None
Faris Ansari811a2de2018-08-28 17:17:29 +0530182
183 if file_path.startswith('http'):
Faris Ansari8683bd82018-08-29 16:18:36 +0530184 # fetch content and then base64 it
Faris Ansari811a2de2018-08-28 17:17:29 +0530185 url = file_path
Faris Ansari8683bd82018-08-29 16:18:36 +0530186 response = requests.get(url)
187 base64content = base64.b64encode(response.content)
Faris Ansari811a2de2018-08-28 17:17:29 +0530188 else:
Faris Ansari8683bd82018-08-29 16:18:36 +0530189 # read file then base64 it
Faris Ansari811a2de2018-08-28 17:17:29 +0530190 file_path = os.path.abspath(get_file_path(file_path))
Faris Ansari8683bd82018-08-29 16:18:36 +0530191 with io.open(file_path, 'rb') as f:
192 base64content = base64.b64encode(f.read())
Faris Ansari811a2de2018-08-28 17:17:29 +0530193
Faris Ansari8683bd82018-08-29 16:18:36 +0530194 image_data = json.dumps({
195 'file_name': file_name,
196 'base64': base64content
197 })
Faris Ansari811a2de2018-08-28 17:17:29 +0530198
199 item['image'] = image_data
200
201
Prateeksha Singh6495d532018-08-01 16:38:39 +0530202def get_hub_connection():
Prateeksha Singh810ae012018-09-01 01:14:29 +0530203 settings = frappe.get_single('Marketplace Settings')
204 marketplace_url = settings.marketplace_url
Faris Ansari68129df2018-09-02 18:29:00 +0530205 hub_user = settings.get_hub_user(frappe.session.user)
Faris Ansari64202ad2018-08-29 15:02:39 +0530206
Faris Ansari68129df2018-09-02 18:29:00 +0530207 if hub_user:
208 password = hub_user.get_password()
209 hub_connection = FrappeClient(marketplace_url, hub_user.user, password)
Faris Ansari64202ad2018-08-29 15:02:39 +0530210 return hub_connection
Prateeksha Singh810ae012018-09-01 01:14:29 +0530211 else:
212 read_only_hub_connection = FrappeClient(marketplace_url)
213 return read_only_hub_connection
214
Prateeksha Singhcaadd8a2018-08-21 19:59:15 +0530215
216def get_field_mappings():
217 return []