blob: af34844d46b0729d3d629695c85bcf62da9240e0 [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 Singh4e1fd0b2018-09-01 09:55:43 +053020def register_marketplace(**kwargs):
Prateeksha Singha8065ff2018-08-31 22:41:26 +053021 settings = frappe.get_single('Marketplace Settings')
22 settings.update(kwargs)
23 settings.users = []
24
25 validate_registerer()
Prateeksha Singha8065ff2018-08-31 22:41:26 +053026 message = settings.register()
27
28 if message.get('email'):
29 settings.registered = 1
30
Prateeksha Singh747c4642018-09-01 00:12:17 +053031 settings.append('users', {
Prateeksha Singh810ae012018-09-01 01:14:29 +053032 'user': current_user,
33 'name': current_user,
Prateeksha Singh747c4642018-09-01 00:12:17 +053034 'username': kwargs.get('username'),
35 'password': message.get('password')
36 })
Prateeksha Singha8065ff2018-08-31 22:41:26 +053037
Prateeksha Singh747c4642018-09-01 00:12:17 +053038 user_emails = kwargs.get('users').strip()[:-1].split(', ')
39 for email in user_emails:
40 settings.append('users', {'user': email, 'name': email})
41
42 settings.insert()
Prateeksha Singha8065ff2018-08-31 22:41:26 +053043
44 return message
45
Prateeksha Singh4e1fd0b2018-09-01 09:55:43 +053046
47@frappe.whitelist()
48def register_user(username, first_name, company):
49 pass
50
51
Prateeksha Singha8065ff2018-08-31 22:41:26 +053052def validate_registerer():
Prateeksha Singh810ae012018-09-01 01:14:29 +053053 if current_user == 'Administrator':
Prateeksha Singha8065ff2018-08-31 22:41:26 +053054 frappe.throw(_('Please login as another user to register on Marketplace'))
55
56 if 'System Manager' not in frappe.get_roles():
57 frappe.throw(_('Only users with System Manager role can register on Marketplace'), frappe.PermissionError)
58
Prateeksha Singh4e1fd0b2018-09-01 09:55:43 +053059
Prateeksha Singha8065ff2018-08-31 22:41:26 +053060@frappe.whitelist()
Prateeksha Singh6495d532018-08-01 16:38:39 +053061def call_hub_method(method, params=None):
62 connection = get_hub_connection()
63
Suraj Shetty3cd0c542018-08-21 16:29:06 +053064 if isinstance(params, string_types):
Prateeksha Singh6495d532018-08-01 16:38:39 +053065 params = json.loads(params)
66
67 params.update({
68 'cmd': 'hub.hub.api.' + method
69 })
70
71 response = connection.post_request(params)
72 return response
73
Prateeksha Singh4e1fd0b2018-09-01 09:55:43 +053074
Prateeksha Singhcaadd8a2018-08-21 19:59:15 +053075def map_fields(items):
76 field_mappings = get_field_mappings()
77 table_fields = [d.fieldname for d in frappe.get_meta('Item').get_table_fields()]
78
Faris Ansarif9a66c12018-08-31 16:15:06 +053079 hub_seller = frappe.db.get_value('Marketplace Settings' , 'Marketplace Settings', 'company_email')
Prateeksha Singhcaadd8a2018-08-21 19:59:15 +053080
81 for item in items:
82 for fieldname in table_fields:
83 item.pop(fieldname, None)
84
85 for mapping in field_mappings:
86 local_fieldname = mapping.get('local_fieldname')
87 remote_fieldname = mapping.get('remote_fieldname')
88
89 value = item.get(local_fieldname)
90 item.pop(local_fieldname, None)
91 item[remote_fieldname] = value
92
93 item['doctype'] = 'Hub Item'
94 item['hub_seller'] = hub_seller
Prateeksha Singh40f7c462018-08-24 16:38:34 +053095 item.pop('attachments', None)
Prateeksha Singhcaadd8a2018-08-21 19:59:15 +053096
97 return items
98
Prateeksha Singh4e1fd0b2018-09-01 09:55:43 +053099
Prateeksha Singh6495d532018-08-01 16:38:39 +0530100@frappe.whitelist()
101def get_valid_items(search_value=''):
102 items = frappe.get_list(
103 'Item',
104 fields=["*"],
105 filters={
Faris Ansari00f6aef2018-08-30 18:54:28 +0530106 'disabled': 0,
Prateeksha Singh6495d532018-08-01 16:38:39 +0530107 'item_name': ['like', '%' + search_value + '%'],
108 'publish_in_hub': 0
109 },
110 order_by="modified desc"
111 )
112
113 valid_items = filter(lambda x: x.image and x.description, items)
114
Prateeksha Singha525d122018-08-19 22:31:33 +0530115 def prepare_item(item):
Prateeksha Singh6495d532018-08-01 16:38:39 +0530116 item.source_type = "local"
Prateeksha Singha525d122018-08-19 22:31:33 +0530117 item.attachments = get_attachments('Item', item.item_code)
Prateeksha Singh6495d532018-08-01 16:38:39 +0530118 return item
119
Prateeksha Singh02c176c2018-08-29 14:27:47 +0530120 valid_items = map(prepare_item, valid_items)
Prateeksha Singha525d122018-08-19 22:31:33 +0530121
Prateeksha Singh6495d532018-08-01 16:38:39 +0530122 return valid_items
123
Prateeksha Singh4e1fd0b2018-09-01 09:55:43 +0530124
Prateeksha Singh6495d532018-08-01 16:38:39 +0530125@frappe.whitelist()
126def publish_selected_items(items_to_publish):
127 items_to_publish = json.loads(items_to_publish)
128 if not len(items_to_publish):
Prateeksha Singh0a60d1c2018-08-19 19:39:00 +0530129 frappe.throw('No items to publish')
Prateeksha Singh6495d532018-08-01 16:38:39 +0530130
Prateeksha Singh40f7c462018-08-24 16:38:34 +0530131 for item in items_to_publish:
132 item_code = item.get('item_code')
Prateeksha Singh6495d532018-08-01 16:38:39 +0530133 frappe.db.set_value('Item', item_code, 'publish_in_hub', 1)
134
Prateeksha Singh0a60d1c2018-08-19 19:39:00 +0530135 frappe.get_doc({
136 'doctype': 'Hub Tracked Item',
137 'item_code': item_code,
Prateeksha Singh40f7c462018-08-24 16:38:34 +0530138 'hub_category': item.get('hub_category'),
139 'image_list': item.get('image_list')
Faris Ansari811a2de2018-08-28 17:17:29 +0530140 }).insert(ignore_if_duplicate=True)
Prateeksha Singh0a60d1c2018-08-19 19:39:00 +0530141
Prateeksha Singh40f7c462018-08-24 16:38:34 +0530142 items = map_fields(items_to_publish)
Prateeksha Singhcaadd8a2018-08-21 19:59:15 +0530143
Prateeksha Singh6495d532018-08-01 16:38:39 +0530144 try:
Prateeksha Singha6f184b2018-08-30 02:30:40 +0530145 item_sync_preprocess(len(items))
Faris Ansari811a2de2018-08-28 17:17:29 +0530146 load_base64_image_from_items(items)
Prateeksha Singhcaadd8a2018-08-21 19:59:15 +0530147
148 # TODO: Publish Progress
149 connection = get_hub_connection()
150 connection.insert_many(items)
151
Prateeksha Singha6f184b2018-08-30 02:30:40 +0530152 item_sync_postprocess()
Prateeksha Singh6495d532018-08-01 16:38:39 +0530153 except Exception as e:
Prateeksha Singh02c176c2018-08-29 14:27:47 +0530154 frappe.log_error(message=e, title='Hub Sync Error')
Prateeksha Singh6495d532018-08-01 16:38:39 +0530155
Prateeksha Singh4e1fd0b2018-09-01 09:55:43 +0530156
Prateeksha Singha6f184b2018-08-30 02:30:40 +0530157def item_sync_preprocess(intended_item_publish_count):
158 response = call_hub_method('pre_items_publish', {
159 'intended_item_publish_count': intended_item_publish_count
Prateeksha Singh6495d532018-08-01 16:38:39 +0530160 })
161
162 if response:
Faris Ansarif9a66c12018-08-31 16:15:06 +0530163 frappe.db.set_value("Marketplace Settings", "Marketplace Settings", "sync_in_progress", 1)
Prateeksha Singh6495d532018-08-01 16:38:39 +0530164 return response
165 else:
166 frappe.throw('Unable to update remote activity')
167
Prateeksha Singh4e1fd0b2018-09-01 09:55:43 +0530168
Prateeksha Singha6f184b2018-08-30 02:30:40 +0530169def item_sync_postprocess():
170 response = call_hub_method('post_items_publish', {})
Prateeksha Singh6495d532018-08-01 16:38:39 +0530171 if response:
Faris Ansarif9a66c12018-08-31 16:15:06 +0530172 frappe.db.set_value('Marketplace Settings', 'Marketplace Settings', 'last_sync_datetime', frappe.utils.now())
Prateeksha Singh6495d532018-08-01 16:38:39 +0530173 else:
174 frappe.throw('Unable to update remote activity')
175
Faris Ansarif9a66c12018-08-31 16:15:06 +0530176 frappe.db.set_value('Marketplace Settings', 'Marketplace Settings', 'sync_in_progress', 0)
Prateeksha Singhcaadd8a2018-08-21 19:59:15 +0530177
Faris Ansari811a2de2018-08-28 17:17:29 +0530178
179def load_base64_image_from_items(items):
Faris Ansari811a2de2018-08-28 17:17:29 +0530180 for item in items:
181 file_path = item['image']
182 file_name = os.path.basename(file_path)
Faris Ansari8683bd82018-08-29 16:18:36 +0530183 base64content = None
Faris Ansari811a2de2018-08-28 17:17:29 +0530184
185 if file_path.startswith('http'):
Faris Ansari8683bd82018-08-29 16:18:36 +0530186 # fetch content and then base64 it
Faris Ansari811a2de2018-08-28 17:17:29 +0530187 url = file_path
Faris Ansari8683bd82018-08-29 16:18:36 +0530188 response = requests.get(url)
189 base64content = base64.b64encode(response.content)
Faris Ansari811a2de2018-08-28 17:17:29 +0530190 else:
Faris Ansari8683bd82018-08-29 16:18:36 +0530191 # read file then base64 it
Faris Ansari811a2de2018-08-28 17:17:29 +0530192 file_path = os.path.abspath(get_file_path(file_path))
Faris Ansari8683bd82018-08-29 16:18:36 +0530193 with io.open(file_path, 'rb') as f:
194 base64content = base64.b64encode(f.read())
Faris Ansari811a2de2018-08-28 17:17:29 +0530195
Faris Ansari8683bd82018-08-29 16:18:36 +0530196 image_data = json.dumps({
197 'file_name': file_name,
198 'base64': base64content
199 })
Faris Ansari811a2de2018-08-28 17:17:29 +0530200
201 item['image'] = image_data
202
203
Prateeksha Singh6495d532018-08-01 16:38:39 +0530204def get_hub_connection():
Prateeksha Singh810ae012018-09-01 01:14:29 +0530205 settings = frappe.get_single('Marketplace Settings')
206 marketplace_url = settings.marketplace_url
Prateeksha Singh4e1fd0b2018-09-01 09:55:43 +0530207 current_user_records = filter(
208 lambda x: x.user == current_user and x.password,
209 settings.users
210 )
Faris Ansari64202ad2018-08-29 15:02:39 +0530211
Prateeksha Singh810ae012018-09-01 01:14:29 +0530212 if current_user_records:
213 record = current_user_records[0]
214 password = frappe.get_doc('Hub User', current_user).get_password()
215 hub_connection = FrappeClient(marketplace_url, record.user, password)
Faris Ansari64202ad2018-08-29 15:02:39 +0530216 return hub_connection
Prateeksha Singh810ae012018-09-01 01:14:29 +0530217 else:
218 read_only_hub_connection = FrappeClient(marketplace_url)
219 return read_only_hub_connection
220
Prateeksha Singhcaadd8a2018-08-21 19:59:15 +0530221
222def get_field_mappings():
223 return []