Prateeksha Singh | 6495d53 | 2018-08-01 16:38:39 +0530 | [diff] [blame] | 1 | from __future__ import unicode_literals |
Prateeksha Singh | 02c176c | 2018-08-29 14:27:47 +0530 | [diff] [blame] | 2 | import frappe, json |
Prateeksha Singh | 6495d53 | 2018-08-01 16:38:39 +0530 | [diff] [blame] | 3 | from frappe.frappeclient import FrappeClient |
Prateeksha Singh | a525d12 | 2018-08-19 22:31:33 +0530 | [diff] [blame] | 4 | from frappe.desk.form.load import get_attachments |
Suraj Shetty | 3cd0c54 | 2018-08-21 16:29:06 +0530 | [diff] [blame] | 5 | from six import string_types |
Prateeksha Singh | 6495d53 | 2018-08-01 16:38:39 +0530 | [diff] [blame] | 6 | |
| 7 | @frappe.whitelist() |
| 8 | def call_hub_method(method, params=None): |
| 9 | connection = get_hub_connection() |
| 10 | |
Suraj Shetty | 3cd0c54 | 2018-08-21 16:29:06 +0530 | [diff] [blame] | 11 | if isinstance(params, string_types): |
Prateeksha Singh | 6495d53 | 2018-08-01 16:38:39 +0530 | [diff] [blame] | 12 | params = json.loads(params) |
| 13 | |
| 14 | params.update({ |
| 15 | 'cmd': 'hub.hub.api.' + method |
| 16 | }) |
| 17 | |
| 18 | response = connection.post_request(params) |
| 19 | return response |
| 20 | |
Prateeksha Singh | caadd8a | 2018-08-21 19:59:15 +0530 | [diff] [blame] | 21 | def map_fields(items): |
| 22 | field_mappings = get_field_mappings() |
| 23 | table_fields = [d.fieldname for d in frappe.get_meta('Item').get_table_fields()] |
| 24 | |
| 25 | hub_seller = frappe.db.get_value('Hub Settings' , 'Hub Settings', 'company_email') |
| 26 | |
| 27 | for item in items: |
| 28 | for fieldname in table_fields: |
| 29 | item.pop(fieldname, None) |
| 30 | |
| 31 | for mapping in field_mappings: |
| 32 | local_fieldname = mapping.get('local_fieldname') |
| 33 | remote_fieldname = mapping.get('remote_fieldname') |
| 34 | |
| 35 | value = item.get(local_fieldname) |
| 36 | item.pop(local_fieldname, None) |
| 37 | item[remote_fieldname] = value |
| 38 | |
| 39 | item['doctype'] = 'Hub Item' |
| 40 | item['hub_seller'] = hub_seller |
Prateeksha Singh | 40f7c46 | 2018-08-24 16:38:34 +0530 | [diff] [blame] | 41 | item.pop('attachments', None) |
Prateeksha Singh | caadd8a | 2018-08-21 19:59:15 +0530 | [diff] [blame] | 42 | |
| 43 | return items |
| 44 | |
Prateeksha Singh | 6495d53 | 2018-08-01 16:38:39 +0530 | [diff] [blame] | 45 | @frappe.whitelist() |
| 46 | def get_valid_items(search_value=''): |
| 47 | items = frappe.get_list( |
| 48 | 'Item', |
| 49 | fields=["*"], |
| 50 | filters={ |
| 51 | 'item_name': ['like', '%' + search_value + '%'], |
| 52 | 'publish_in_hub': 0 |
| 53 | }, |
| 54 | order_by="modified desc" |
| 55 | ) |
| 56 | |
| 57 | valid_items = filter(lambda x: x.image and x.description, items) |
| 58 | |
Prateeksha Singh | a525d12 | 2018-08-19 22:31:33 +0530 | [diff] [blame] | 59 | def prepare_item(item): |
Prateeksha Singh | 6495d53 | 2018-08-01 16:38:39 +0530 | [diff] [blame] | 60 | item.source_type = "local" |
Prateeksha Singh | a525d12 | 2018-08-19 22:31:33 +0530 | [diff] [blame] | 61 | item.attachments = get_attachments('Item', item.item_code) |
Prateeksha Singh | 6495d53 | 2018-08-01 16:38:39 +0530 | [diff] [blame] | 62 | return item |
| 63 | |
Prateeksha Singh | 02c176c | 2018-08-29 14:27:47 +0530 | [diff] [blame] | 64 | valid_items = map(prepare_item, valid_items) |
Prateeksha Singh | a525d12 | 2018-08-19 22:31:33 +0530 | [diff] [blame] | 65 | |
Prateeksha Singh | 6495d53 | 2018-08-01 16:38:39 +0530 | [diff] [blame] | 66 | return valid_items |
| 67 | |
| 68 | @frappe.whitelist() |
| 69 | def publish_selected_items(items_to_publish): |
| 70 | items_to_publish = json.loads(items_to_publish) |
| 71 | if not len(items_to_publish): |
Prateeksha Singh | 0a60d1c | 2018-08-19 19:39:00 +0530 | [diff] [blame] | 72 | frappe.throw('No items to publish') |
Prateeksha Singh | 6495d53 | 2018-08-01 16:38:39 +0530 | [diff] [blame] | 73 | |
Prateeksha Singh | 40f7c46 | 2018-08-24 16:38:34 +0530 | [diff] [blame] | 74 | for item in items_to_publish: |
| 75 | item_code = item.get('item_code') |
Prateeksha Singh | 6495d53 | 2018-08-01 16:38:39 +0530 | [diff] [blame] | 76 | frappe.db.set_value('Item', item_code, 'publish_in_hub', 1) |
| 77 | |
Prateeksha Singh | 0a60d1c | 2018-08-19 19:39:00 +0530 | [diff] [blame] | 78 | frappe.get_doc({ |
| 79 | 'doctype': 'Hub Tracked Item', |
| 80 | 'item_code': item_code, |
Prateeksha Singh | 40f7c46 | 2018-08-24 16:38:34 +0530 | [diff] [blame] | 81 | 'hub_category': item.get('hub_category'), |
| 82 | 'image_list': item.get('image_list') |
Faris Ansari | 811a2de | 2018-08-28 17:17:29 +0530 | [diff] [blame] | 83 | }).insert(ignore_if_duplicate=True) |
Prateeksha Singh | 0a60d1c | 2018-08-19 19:39:00 +0530 | [diff] [blame] | 84 | |
Prateeksha Singh | caadd8a | 2018-08-21 19:59:15 +0530 | [diff] [blame] | 85 | |
Prateeksha Singh | 40f7c46 | 2018-08-24 16:38:34 +0530 | [diff] [blame] | 86 | items = map_fields(items_to_publish) |
Prateeksha Singh | caadd8a | 2018-08-21 19:59:15 +0530 | [diff] [blame] | 87 | |
Prateeksha Singh | 6495d53 | 2018-08-01 16:38:39 +0530 | [diff] [blame] | 88 | try: |
Prateeksha Singh | 6495d53 | 2018-08-01 16:38:39 +0530 | [diff] [blame] | 89 | item_sync_preprocess() |
Faris Ansari | 811a2de | 2018-08-28 17:17:29 +0530 | [diff] [blame] | 90 | load_base64_image_from_items(items) |
Prateeksha Singh | caadd8a | 2018-08-21 19:59:15 +0530 | [diff] [blame] | 91 | |
| 92 | # TODO: Publish Progress |
| 93 | connection = get_hub_connection() |
| 94 | connection.insert_many(items) |
| 95 | |
| 96 | item_sync_postprocess({ |
| 97 | 'status': 'Success', |
| 98 | 'stats': len(items) |
| 99 | }) |
Prateeksha Singh | 6495d53 | 2018-08-01 16:38:39 +0530 | [diff] [blame] | 100 | except Exception as e: |
Prateeksha Singh | 02c176c | 2018-08-29 14:27:47 +0530 | [diff] [blame] | 101 | frappe.log_error(message=e, title='Hub Sync Error') |
Prateeksha Singh | 6495d53 | 2018-08-01 16:38:39 +0530 | [diff] [blame] | 102 | |
| 103 | def item_sync_preprocess(): |
Prateeksha Singh | 6495d53 | 2018-08-01 16:38:39 +0530 | [diff] [blame] | 104 | hub_seller = frappe.db.get_value("Hub Settings", "Hub Settings", "company_email") |
| 105 | |
| 106 | response = call_hub_method('add_hub_seller_activity', { |
| 107 | 'hub_seller': hub_seller, |
| 108 | 'activity_details': json.dumps({ |
| 109 | 'subject': 'Publishing items', |
| 110 | 'status': 'Success' |
| 111 | }) |
| 112 | }) |
| 113 | |
| 114 | if response: |
| 115 | frappe.db.set_value("Hub Settings", "Hub Settings", "sync_in_progress", 1) |
| 116 | return response |
| 117 | else: |
| 118 | frappe.throw('Unable to update remote activity') |
| 119 | |
| 120 | def item_sync_postprocess(sync_details): |
| 121 | hub_seller = frappe.db.get_value("Hub Settings", "Hub Settings", "company_email") |
| 122 | |
| 123 | response = call_hub_method('add_hub_seller_activity', { |
| 124 | 'hub_seller': hub_seller, |
| 125 | 'activity_details': json.dumps({ |
| 126 | 'subject': 'Publishing items:' + sync_details['status'], |
Prateeksha Singh | caadd8a | 2018-08-21 19:59:15 +0530 | [diff] [blame] | 127 | 'content': str(sync_details['stats']) + ' items synced.' |
Prateeksha Singh | 6495d53 | 2018-08-01 16:38:39 +0530 | [diff] [blame] | 128 | }) |
| 129 | }) |
| 130 | |
| 131 | if response: |
Prateeksha Singh | 6495d53 | 2018-08-01 16:38:39 +0530 | [diff] [blame] | 132 | frappe.db.set_value('Hub Settings', 'Hub Settings', 'last_sync_datetime', frappe.utils.now()) |
| 133 | else: |
| 134 | frappe.throw('Unable to update remote activity') |
| 135 | |
Prateeksha Singh | caadd8a | 2018-08-21 19:59:15 +0530 | [diff] [blame] | 136 | frappe.db.set_value('Hub Settings', 'Hub Settings', 'sync_in_progress', 0) |
| 137 | |
Faris Ansari | 811a2de | 2018-08-28 17:17:29 +0530 | [diff] [blame] | 138 | |
| 139 | def load_base64_image_from_items(items): |
Faris Ansari | 8683bd8 | 2018-08-29 16:18:36 +0530 | [diff] [blame] | 140 | import io, base64, urllib, os, requests, tempfile |
Faris Ansari | 811a2de | 2018-08-28 17:17:29 +0530 | [diff] [blame] | 141 | from frappe.utils.file_manager import get_file_path |
| 142 | |
| 143 | for item in items: |
| 144 | file_path = item['image'] |
| 145 | file_name = os.path.basename(file_path) |
Faris Ansari | 8683bd8 | 2018-08-29 16:18:36 +0530 | [diff] [blame] | 146 | base64content = None |
Faris Ansari | 811a2de | 2018-08-28 17:17:29 +0530 | [diff] [blame] | 147 | |
| 148 | if file_path.startswith('http'): |
Faris Ansari | 8683bd8 | 2018-08-29 16:18:36 +0530 | [diff] [blame] | 149 | # fetch content and then base64 it |
Faris Ansari | 811a2de | 2018-08-28 17:17:29 +0530 | [diff] [blame] | 150 | url = file_path |
Faris Ansari | 8683bd8 | 2018-08-29 16:18:36 +0530 | [diff] [blame] | 151 | response = requests.get(url) |
| 152 | base64content = base64.b64encode(response.content) |
Faris Ansari | 811a2de | 2018-08-28 17:17:29 +0530 | [diff] [blame] | 153 | else: |
Faris Ansari | 8683bd8 | 2018-08-29 16:18:36 +0530 | [diff] [blame] | 154 | # read file then base64 it |
Faris Ansari | 811a2de | 2018-08-28 17:17:29 +0530 | [diff] [blame] | 155 | file_path = os.path.abspath(get_file_path(file_path)) |
Faris Ansari | 8683bd8 | 2018-08-29 16:18:36 +0530 | [diff] [blame] | 156 | with io.open(file_path, 'rb') as f: |
| 157 | base64content = base64.b64encode(f.read()) |
Faris Ansari | 811a2de | 2018-08-28 17:17:29 +0530 | [diff] [blame] | 158 | |
Faris Ansari | 8683bd8 | 2018-08-29 16:18:36 +0530 | [diff] [blame] | 159 | image_data = json.dumps({ |
| 160 | 'file_name': file_name, |
| 161 | 'base64': base64content |
| 162 | }) |
Faris Ansari | 811a2de | 2018-08-28 17:17:29 +0530 | [diff] [blame] | 163 | |
| 164 | item['image'] = image_data |
| 165 | |
| 166 | |
Prateeksha Singh | 6495d53 | 2018-08-01 16:38:39 +0530 | [diff] [blame] | 167 | def get_hub_connection(): |
Faris Ansari | 64202ad | 2018-08-29 15:02:39 +0530 | [diff] [blame] | 168 | read_only = True |
| 169 | |
Prateeksha Singh | 6495d53 | 2018-08-01 16:38:39 +0530 | [diff] [blame] | 170 | if frappe.db.exists('Data Migration Connector', 'Hub Connector'): |
| 171 | hub_connector = frappe.get_doc('Data Migration Connector', 'Hub Connector') |
Faris Ansari | 64202ad | 2018-08-29 15:02:39 +0530 | [diff] [blame] | 172 | |
| 173 | # full rights to user who registered as hub_seller |
| 174 | if hub_connector.username == frappe.session.user: |
| 175 | read_only = False |
| 176 | |
| 177 | if not read_only: |
| 178 | hub_connection = hub_connector.get_connection() |
| 179 | return hub_connection.connection |
Prateeksha Singh | 6495d53 | 2018-08-01 16:38:39 +0530 | [diff] [blame] | 180 | |
| 181 | # read-only connection |
Faris Ansari | 64202ad | 2018-08-29 15:02:39 +0530 | [diff] [blame] | 182 | if read_only: |
Faris Ansari | 114d595 | 2018-08-29 18:24:49 +0530 | [diff] [blame^] | 183 | hub_url = frappe.db.get_single_value('Hub Settings', 'hub_url') |
| 184 | hub_connection = FrappeClient(hub_url) |
Faris Ansari | 64202ad | 2018-08-29 15:02:39 +0530 | [diff] [blame] | 185 | return hub_connection |
Prateeksha Singh | caadd8a | 2018-08-21 19:59:15 +0530 | [diff] [blame] | 186 | |
Prateeksha Singh | caadd8a | 2018-08-21 19:59:15 +0530 | [diff] [blame] | 187 | def get_field_mappings(): |
| 188 | return [] |