Prateeksha Singh | 6495d53 | 2018-08-01 16:38:39 +0530 | [diff] [blame] | 1 | from __future__ import unicode_literals |
Prateeksha Singh | a8065ff | 2018-08-31 22:41:26 +0530 | [diff] [blame] | 2 | |
| 3 | import frappe |
| 4 | import json |
| 5 | import io |
| 6 | import base64 |
| 7 | import os |
| 8 | import requests |
| 9 | |
| 10 | from frappe import _ |
Prateeksha Singh | 6495d53 | 2018-08-01 16:38:39 +0530 | [diff] [blame] | 11 | from frappe.frappeclient import FrappeClient |
Prateeksha Singh | a525d12 | 2018-08-19 22:31:33 +0530 | [diff] [blame] | 12 | from frappe.desk.form.load import get_attachments |
Faris Ansari | 95e4141 | 2018-08-30 11:46:14 +0530 | [diff] [blame] | 13 | from frappe.utils.file_manager import get_file_path |
Suraj Shetty | 3cd0c54 | 2018-08-21 16:29:06 +0530 | [diff] [blame] | 14 | from six import string_types |
Prateeksha Singh | 6495d53 | 2018-08-01 16:38:39 +0530 | [diff] [blame] | 15 | |
Prateeksha Singh | 810ae01 | 2018-09-01 01:14:29 +0530 | [diff] [blame] | 16 | current_user = frappe.session.user |
| 17 | |
Prateeksha Singh | 4e1fd0b | 2018-09-01 09:55:43 +0530 | [diff] [blame^] | 18 | |
Prateeksha Singh | 6495d53 | 2018-08-01 16:38:39 +0530 | [diff] [blame] | 19 | @frappe.whitelist() |
Prateeksha Singh | 4e1fd0b | 2018-09-01 09:55:43 +0530 | [diff] [blame^] | 20 | def register_marketplace(**kwargs): |
Prateeksha Singh | a8065ff | 2018-08-31 22:41:26 +0530 | [diff] [blame] | 21 | settings = frappe.get_single('Marketplace Settings') |
| 22 | settings.update(kwargs) |
| 23 | settings.users = [] |
| 24 | |
| 25 | validate_registerer() |
Prateeksha Singh | a8065ff | 2018-08-31 22:41:26 +0530 | [diff] [blame] | 26 | message = settings.register() |
| 27 | |
| 28 | if message.get('email'): |
| 29 | settings.registered = 1 |
| 30 | |
Prateeksha Singh | 747c464 | 2018-09-01 00:12:17 +0530 | [diff] [blame] | 31 | settings.append('users', { |
Prateeksha Singh | 810ae01 | 2018-09-01 01:14:29 +0530 | [diff] [blame] | 32 | 'user': current_user, |
| 33 | 'name': current_user, |
Prateeksha Singh | 747c464 | 2018-09-01 00:12:17 +0530 | [diff] [blame] | 34 | 'username': kwargs.get('username'), |
| 35 | 'password': message.get('password') |
| 36 | }) |
Prateeksha Singh | a8065ff | 2018-08-31 22:41:26 +0530 | [diff] [blame] | 37 | |
Prateeksha Singh | 747c464 | 2018-09-01 00:12:17 +0530 | [diff] [blame] | 38 | 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 Singh | a8065ff | 2018-08-31 22:41:26 +0530 | [diff] [blame] | 43 | |
| 44 | return message |
| 45 | |
Prateeksha Singh | 4e1fd0b | 2018-09-01 09:55:43 +0530 | [diff] [blame^] | 46 | |
| 47 | @frappe.whitelist() |
| 48 | def register_user(username, first_name, company): |
| 49 | pass |
| 50 | |
| 51 | |
Prateeksha Singh | a8065ff | 2018-08-31 22:41:26 +0530 | [diff] [blame] | 52 | def validate_registerer(): |
Prateeksha Singh | 810ae01 | 2018-09-01 01:14:29 +0530 | [diff] [blame] | 53 | if current_user == 'Administrator': |
Prateeksha Singh | a8065ff | 2018-08-31 22:41:26 +0530 | [diff] [blame] | 54 | 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 Singh | 4e1fd0b | 2018-09-01 09:55:43 +0530 | [diff] [blame^] | 59 | |
Prateeksha Singh | a8065ff | 2018-08-31 22:41:26 +0530 | [diff] [blame] | 60 | @frappe.whitelist() |
Prateeksha Singh | 6495d53 | 2018-08-01 16:38:39 +0530 | [diff] [blame] | 61 | def call_hub_method(method, params=None): |
| 62 | connection = get_hub_connection() |
| 63 | |
Suraj Shetty | 3cd0c54 | 2018-08-21 16:29:06 +0530 | [diff] [blame] | 64 | if isinstance(params, string_types): |
Prateeksha Singh | 6495d53 | 2018-08-01 16:38:39 +0530 | [diff] [blame] | 65 | 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 Singh | 4e1fd0b | 2018-09-01 09:55:43 +0530 | [diff] [blame^] | 74 | |
Prateeksha Singh | caadd8a | 2018-08-21 19:59:15 +0530 | [diff] [blame] | 75 | def 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 Ansari | f9a66c1 | 2018-08-31 16:15:06 +0530 | [diff] [blame] | 79 | hub_seller = frappe.db.get_value('Marketplace Settings' , 'Marketplace Settings', 'company_email') |
Prateeksha Singh | caadd8a | 2018-08-21 19:59:15 +0530 | [diff] [blame] | 80 | |
| 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 Singh | 40f7c46 | 2018-08-24 16:38:34 +0530 | [diff] [blame] | 95 | item.pop('attachments', None) |
Prateeksha Singh | caadd8a | 2018-08-21 19:59:15 +0530 | [diff] [blame] | 96 | |
| 97 | return items |
| 98 | |
Prateeksha Singh | 4e1fd0b | 2018-09-01 09:55:43 +0530 | [diff] [blame^] | 99 | |
Prateeksha Singh | 6495d53 | 2018-08-01 16:38:39 +0530 | [diff] [blame] | 100 | @frappe.whitelist() |
| 101 | def get_valid_items(search_value=''): |
| 102 | items = frappe.get_list( |
| 103 | 'Item', |
| 104 | fields=["*"], |
| 105 | filters={ |
Faris Ansari | 00f6aef | 2018-08-30 18:54:28 +0530 | [diff] [blame] | 106 | 'disabled': 0, |
Prateeksha Singh | 6495d53 | 2018-08-01 16:38:39 +0530 | [diff] [blame] | 107 | '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 Singh | a525d12 | 2018-08-19 22:31:33 +0530 | [diff] [blame] | 115 | def prepare_item(item): |
Prateeksha Singh | 6495d53 | 2018-08-01 16:38:39 +0530 | [diff] [blame] | 116 | item.source_type = "local" |
Prateeksha Singh | a525d12 | 2018-08-19 22:31:33 +0530 | [diff] [blame] | 117 | item.attachments = get_attachments('Item', item.item_code) |
Prateeksha Singh | 6495d53 | 2018-08-01 16:38:39 +0530 | [diff] [blame] | 118 | return item |
| 119 | |
Prateeksha Singh | 02c176c | 2018-08-29 14:27:47 +0530 | [diff] [blame] | 120 | valid_items = map(prepare_item, valid_items) |
Prateeksha Singh | a525d12 | 2018-08-19 22:31:33 +0530 | [diff] [blame] | 121 | |
Prateeksha Singh | 6495d53 | 2018-08-01 16:38:39 +0530 | [diff] [blame] | 122 | return valid_items |
| 123 | |
Prateeksha Singh | 4e1fd0b | 2018-09-01 09:55:43 +0530 | [diff] [blame^] | 124 | |
Prateeksha Singh | 6495d53 | 2018-08-01 16:38:39 +0530 | [diff] [blame] | 125 | @frappe.whitelist() |
| 126 | def publish_selected_items(items_to_publish): |
| 127 | items_to_publish = json.loads(items_to_publish) |
| 128 | if not len(items_to_publish): |
Prateeksha Singh | 0a60d1c | 2018-08-19 19:39:00 +0530 | [diff] [blame] | 129 | frappe.throw('No items to publish') |
Prateeksha Singh | 6495d53 | 2018-08-01 16:38:39 +0530 | [diff] [blame] | 130 | |
Prateeksha Singh | 40f7c46 | 2018-08-24 16:38:34 +0530 | [diff] [blame] | 131 | for item in items_to_publish: |
| 132 | item_code = item.get('item_code') |
Prateeksha Singh | 6495d53 | 2018-08-01 16:38:39 +0530 | [diff] [blame] | 133 | frappe.db.set_value('Item', item_code, 'publish_in_hub', 1) |
| 134 | |
Prateeksha Singh | 0a60d1c | 2018-08-19 19:39:00 +0530 | [diff] [blame] | 135 | frappe.get_doc({ |
| 136 | 'doctype': 'Hub Tracked Item', |
| 137 | 'item_code': item_code, |
Prateeksha Singh | 40f7c46 | 2018-08-24 16:38:34 +0530 | [diff] [blame] | 138 | 'hub_category': item.get('hub_category'), |
| 139 | 'image_list': item.get('image_list') |
Faris Ansari | 811a2de | 2018-08-28 17:17:29 +0530 | [diff] [blame] | 140 | }).insert(ignore_if_duplicate=True) |
Prateeksha Singh | 0a60d1c | 2018-08-19 19:39:00 +0530 | [diff] [blame] | 141 | |
Prateeksha Singh | 40f7c46 | 2018-08-24 16:38:34 +0530 | [diff] [blame] | 142 | items = map_fields(items_to_publish) |
Prateeksha Singh | caadd8a | 2018-08-21 19:59:15 +0530 | [diff] [blame] | 143 | |
Prateeksha Singh | 6495d53 | 2018-08-01 16:38:39 +0530 | [diff] [blame] | 144 | try: |
Prateeksha Singh | a6f184b | 2018-08-30 02:30:40 +0530 | [diff] [blame] | 145 | item_sync_preprocess(len(items)) |
Faris Ansari | 811a2de | 2018-08-28 17:17:29 +0530 | [diff] [blame] | 146 | load_base64_image_from_items(items) |
Prateeksha Singh | caadd8a | 2018-08-21 19:59:15 +0530 | [diff] [blame] | 147 | |
| 148 | # TODO: Publish Progress |
| 149 | connection = get_hub_connection() |
| 150 | connection.insert_many(items) |
| 151 | |
Prateeksha Singh | a6f184b | 2018-08-30 02:30:40 +0530 | [diff] [blame] | 152 | item_sync_postprocess() |
Prateeksha Singh | 6495d53 | 2018-08-01 16:38:39 +0530 | [diff] [blame] | 153 | except Exception as e: |
Prateeksha Singh | 02c176c | 2018-08-29 14:27:47 +0530 | [diff] [blame] | 154 | frappe.log_error(message=e, title='Hub Sync Error') |
Prateeksha Singh | 6495d53 | 2018-08-01 16:38:39 +0530 | [diff] [blame] | 155 | |
Prateeksha Singh | 4e1fd0b | 2018-09-01 09:55:43 +0530 | [diff] [blame^] | 156 | |
Prateeksha Singh | a6f184b | 2018-08-30 02:30:40 +0530 | [diff] [blame] | 157 | def 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 Singh | 6495d53 | 2018-08-01 16:38:39 +0530 | [diff] [blame] | 160 | }) |
| 161 | |
| 162 | if response: |
Faris Ansari | f9a66c1 | 2018-08-31 16:15:06 +0530 | [diff] [blame] | 163 | frappe.db.set_value("Marketplace Settings", "Marketplace Settings", "sync_in_progress", 1) |
Prateeksha Singh | 6495d53 | 2018-08-01 16:38:39 +0530 | [diff] [blame] | 164 | return response |
| 165 | else: |
| 166 | frappe.throw('Unable to update remote activity') |
| 167 | |
Prateeksha Singh | 4e1fd0b | 2018-09-01 09:55:43 +0530 | [diff] [blame^] | 168 | |
Prateeksha Singh | a6f184b | 2018-08-30 02:30:40 +0530 | [diff] [blame] | 169 | def item_sync_postprocess(): |
| 170 | response = call_hub_method('post_items_publish', {}) |
Prateeksha Singh | 6495d53 | 2018-08-01 16:38:39 +0530 | [diff] [blame] | 171 | if response: |
Faris Ansari | f9a66c1 | 2018-08-31 16:15:06 +0530 | [diff] [blame] | 172 | frappe.db.set_value('Marketplace Settings', 'Marketplace Settings', 'last_sync_datetime', frappe.utils.now()) |
Prateeksha Singh | 6495d53 | 2018-08-01 16:38:39 +0530 | [diff] [blame] | 173 | else: |
| 174 | frappe.throw('Unable to update remote activity') |
| 175 | |
Faris Ansari | f9a66c1 | 2018-08-31 16:15:06 +0530 | [diff] [blame] | 176 | frappe.db.set_value('Marketplace Settings', 'Marketplace Settings', 'sync_in_progress', 0) |
Prateeksha Singh | caadd8a | 2018-08-21 19:59:15 +0530 | [diff] [blame] | 177 | |
Faris Ansari | 811a2de | 2018-08-28 17:17:29 +0530 | [diff] [blame] | 178 | |
| 179 | def load_base64_image_from_items(items): |
Faris Ansari | 811a2de | 2018-08-28 17:17:29 +0530 | [diff] [blame] | 180 | for item in items: |
| 181 | file_path = item['image'] |
| 182 | file_name = os.path.basename(file_path) |
Faris Ansari | 8683bd8 | 2018-08-29 16:18:36 +0530 | [diff] [blame] | 183 | base64content = None |
Faris Ansari | 811a2de | 2018-08-28 17:17:29 +0530 | [diff] [blame] | 184 | |
| 185 | if file_path.startswith('http'): |
Faris Ansari | 8683bd8 | 2018-08-29 16:18:36 +0530 | [diff] [blame] | 186 | # fetch content and then base64 it |
Faris Ansari | 811a2de | 2018-08-28 17:17:29 +0530 | [diff] [blame] | 187 | url = file_path |
Faris Ansari | 8683bd8 | 2018-08-29 16:18:36 +0530 | [diff] [blame] | 188 | response = requests.get(url) |
| 189 | base64content = base64.b64encode(response.content) |
Faris Ansari | 811a2de | 2018-08-28 17:17:29 +0530 | [diff] [blame] | 190 | else: |
Faris Ansari | 8683bd8 | 2018-08-29 16:18:36 +0530 | [diff] [blame] | 191 | # read file then base64 it |
Faris Ansari | 811a2de | 2018-08-28 17:17:29 +0530 | [diff] [blame] | 192 | file_path = os.path.abspath(get_file_path(file_path)) |
Faris Ansari | 8683bd8 | 2018-08-29 16:18:36 +0530 | [diff] [blame] | 193 | with io.open(file_path, 'rb') as f: |
| 194 | base64content = base64.b64encode(f.read()) |
Faris Ansari | 811a2de | 2018-08-28 17:17:29 +0530 | [diff] [blame] | 195 | |
Faris Ansari | 8683bd8 | 2018-08-29 16:18:36 +0530 | [diff] [blame] | 196 | image_data = json.dumps({ |
| 197 | 'file_name': file_name, |
| 198 | 'base64': base64content |
| 199 | }) |
Faris Ansari | 811a2de | 2018-08-28 17:17:29 +0530 | [diff] [blame] | 200 | |
| 201 | item['image'] = image_data |
| 202 | |
| 203 | |
Prateeksha Singh | 6495d53 | 2018-08-01 16:38:39 +0530 | [diff] [blame] | 204 | def get_hub_connection(): |
Prateeksha Singh | 810ae01 | 2018-09-01 01:14:29 +0530 | [diff] [blame] | 205 | settings = frappe.get_single('Marketplace Settings') |
| 206 | marketplace_url = settings.marketplace_url |
Prateeksha Singh | 4e1fd0b | 2018-09-01 09:55:43 +0530 | [diff] [blame^] | 207 | current_user_records = filter( |
| 208 | lambda x: x.user == current_user and x.password, |
| 209 | settings.users |
| 210 | ) |
Faris Ansari | 64202ad | 2018-08-29 15:02:39 +0530 | [diff] [blame] | 211 | |
Prateeksha Singh | 810ae01 | 2018-09-01 01:14:29 +0530 | [diff] [blame] | 212 | 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 Ansari | 64202ad | 2018-08-29 15:02:39 +0530 | [diff] [blame] | 216 | return hub_connection |
Prateeksha Singh | 810ae01 | 2018-09-01 01:14:29 +0530 | [diff] [blame] | 217 | else: |
| 218 | read_only_hub_connection = FrappeClient(marketplace_url) |
| 219 | return read_only_hub_connection |
| 220 | |
Prateeksha Singh | caadd8a | 2018-08-21 19:59:15 +0530 | [diff] [blame] | 221 | |
| 222 | def get_field_mappings(): |
| 223 | return [] |