Advertisement
Guest User

Untitled

a guest
Aug 17th, 2017
69
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 10.94 KB | None | 0 0
  1. import base64
  2. import logging
  3. import sys
  4. import traceback
  5.  
  6. import gevent
  7. import simplejson as json
  8. import xlrd
  9. from gg_restclient import RestClient
  10. from helpers import retrieve_value
  11. from webapp.models import SpreadsheetUploadResult
  12.  
  13. log = logging.getLogger('order.processor')
  14. rest_client = RestClient()
  15.  
  16.  
  17. def validate_field_lengths(order):
  18. err_msg = "Error due to field {field!s} length exceeded maximum value"
  19. validation_failures = []
  20. if len(order['xref']) > 18:
  21. validation_failures.append(err_msg.format(field='xref'))
  22. if len(order['ship_to']['name_line1']) > 35:
  23. validation_failures.append(err_msg.format(field='name_line1'))
  24. if len(order['ship_to']['name_line2']) > 35:
  25. validation_failures.append(err_msg.format(field='name_line2'))
  26. if len(order['ship_to']['addr_line1']) > 35:
  27. validation_failures.append(err_msg.format(field='addr_line1'))
  28. if len(order['ship_to']['addr_line2']) > 35:
  29. validation_failures.append(err_msg.format(field='addr_line2'))
  30. if len(order['ship_to']['city']) > 35:
  31. validation_failures.append(err_msg.format(field='city'))
  32. if len(order['ship_to']['state']) > 3:
  33. validation_failures.append(err_msg.format(field='state'))
  34. if len(order['ship_to']['zip']) > 10:
  35. validation_failures.append(err_msg.format(field='zip'))
  36. if len(order['ship_to']['country']) > 13:
  37. validation_failures.append(err_msg.format(field='country'))
  38. if len(order['ship_to']['phone']) > 25:
  39. validation_failures.append(err_msg.format(field='phone'))
  40. if len(order['ship_to']['email']) > 250:
  41. validation_failures.append(err_msg.format(field='email'))
  42. if len(order['ship_method']) > 15:
  43. validation_failures.append(err_msg.format(field='ship_method'))
  44. if len(order['options']['third_party_account']) > 16:
  45. validation_failures.append(err_msg.format(field='third_party_account'))
  46. if len(order['notes']) > 40:
  47. validation_failures.append(err_msg.format(field='notes'))
  48. if len(order['group_name']) > 10:
  49. validation_failures.append(err_msg.format(field='handle'))
  50.  
  51. for item in order['items']:
  52. if not item['sku']:
  53. validation_failures.append(
  54. "Error due to order containing an empty SKU")
  55. else:
  56. if len(item['sku']) > 16:
  57. validation_failures.append(err_msg.format(field='sku'))
  58. if 'division' in item and len(item['division']) > 6:
  59. validation_failures.append(err_msg.format(field='division'))
  60.  
  61. if validation_failures:
  62. return '; '.join(validation_failures)
  63. return None
  64.  
  65.  
  66. def process_order_upload(to_exec):
  67. failed_rows = []
  68. misc_failures = []
  69. try:
  70. workbook = xlrd.open_workbook(
  71. file_contents=base64.b64decode(to_exec.file_data))
  72.  
  73. orders = {}
  74.  
  75. sh = workbook.sheet_by_index(0)
  76.  
  77. log.info('number of rows in this spreadsheet is: %d', sh.nrows)
  78.  
  79. for i in range(1, sh.nrows):
  80. try:
  81. gevent.sleep(0)
  82. log.debug('processing row %d', i)
  83. client_order_id = retrieve_value(sh, i, 0)
  84. ship_via = retrieve_value(sh, i, 1)
  85. name_line1 = retrieve_value(sh, i, 2)
  86. name_line2 = retrieve_value(sh, i, 3)
  87. addr_line1 = retrieve_value(sh, i, 4)
  88. addr_line2 = retrieve_value(sh, i, 5)
  89. city = retrieve_value(sh, i, 6)
  90. state = retrieve_value(sh, i, 7)
  91. zip = retrieve_value(sh, i, 8)
  92. email = retrieve_value(sh, i, 9)
  93. phone = retrieve_value(sh, i, 10)
  94. sku = retrieve_value(sh, i, 11).strip()
  95. qty = retrieve_value(sh, i, 12)
  96. country = retrieve_value(sh, i, 13)
  97. ship_short = retrieve_value(sh, i, 14)
  98. third_party_account = retrieve_value(sh, i, 15)
  99. notes = retrieve_value(sh, i, 16)
  100. division = retrieve_value(sh, i, 17).upper().strip()
  101. ship_options = retrieve_value(sh, i, 18).upper().replace(
  102. ' ', '').split(',')
  103. handle = retrieve_value(sh, i, 19)
  104.  
  105. if client_order_id not in orders:
  106. log.info('%s not found, creating new order from row',
  107. client_order_id)
  108. orders[client_order_id] = {
  109. 'ship_via': ship_via,
  110. 'name_line1': name_line1,
  111. 'name_line2': name_line2,
  112. 'addr_line1': addr_line1,
  113. 'addr_line2': addr_line2,
  114. 'city': city,
  115. 'state': state,
  116. 'zip': zip,
  117. 'email': email,
  118. 'phone': phone,
  119. 'country': country,
  120. 'items': [],
  121. 'ship_short': ship_short,
  122. 'third_party_account': third_party_account,
  123. 'delivery_confirmation': 'D' in ship_options,
  124. 'insurance': 'I' in ship_options,
  125. 'saturday_delivery': 'S' in ship_options,
  126. 'signature_required': 'R' in ship_options,
  127. 'notes': notes,
  128. 'handle': handle
  129. }
  130.  
  131. def lookup_item(client_order_id, sku, division):
  132. for item in orders[client_order_id]['items']:
  133. if item['sku'] == sku:
  134. if (not division) and ('division' not in item):
  135. return item
  136. elif item['division'] == division:
  137. return item
  138. return None
  139.  
  140. item = lookup_item(client_order_id, sku, division)
  141.  
  142. if not item:
  143. item = {'sku': sku, 'qty': int(qty)}
  144. if division:
  145. item['division'] = division
  146. orders[client_order_id]['items'].append(item)
  147. else:
  148. item['qty'] += int(qty)
  149.  
  150. log.debug('current order is: %s', str(orders[client_order_id]))
  151. except Exception as e:
  152. traceback.print_exc(e)
  153. failed_rows.append(i)
  154. log.warning('failure processing row %d',
  155. i,
  156. exc_info=sys.exc_info())
  157.  
  158. #okay, orders is fully populated, now generate the proper order svc json for each
  159. json_orders = []
  160.  
  161. def generate_item_dict(item):
  162. item_dict = {
  163. 'sku': item['sku'].encode('utf-8'),
  164. 'qty': item['qty']
  165. }
  166. if 'division' in item:
  167. item_dict['division'] = item['division'].encode('utf-8')
  168. return item_dict
  169.  
  170. for k, v in orders.iteritems():
  171. gevent.sleep(0)
  172. try:
  173. jorder = {
  174. 'xref': k.encode('utf-8'),
  175. 'items': [generate_item_dict(item) for item in v['items']],
  176. 'ship_to': {
  177. 'name_line1': v['name_line1'].encode('utf-8'),
  178. 'name_line2': v['name_line2'].encode('utf-8'),
  179. 'addr_line1': v['addr_line1'].encode('utf-8'),
  180. 'addr_line2': v['addr_line2'].encode('utf-8'),
  181. 'city': v['city'].encode('utf-8'),
  182. 'state': v['state'].encode('utf-8'),
  183. 'zip': v['zip'].encode('utf-8'),
  184. 'country': v['country'].encode('utf-8'),
  185. 'phone': v['phone'].encode('utf-8'),
  186. 'email': v['email'].encode('utf-8')
  187. },
  188. 'bill_to': {
  189. 'name_line1': v['name_line1'].encode('utf-8'),
  190. 'name_line2': v['name_line2'].encode('utf-8'),
  191. 'addr_line1': v['addr_line1'].encode('utf-8'),
  192. 'addr_line2': v['addr_line2'].encode('utf-8'),
  193. 'city': v['city'].encode('utf-8'),
  194. 'state': v['state'].encode('utf-8'),
  195. 'zip': v['zip'].encode('utf-8'),
  196. 'country': v['country'].encode('utf-8'),
  197. 'phone': v['phone'].encode('utf-8'),
  198. 'email': v['email'].encode('utf-8')
  199. },
  200. 'ship_method': v['ship_via'].encode('utf-8'),
  201. 'client': to_exec.client_id.encode('utf-8'),
  202. 'origin': 'Spreadsheet Upload',
  203. 'notes': v['notes'].encode('utf-8'),
  204. 'options': {
  205. 'ship_complete': False
  206. if v['ship_short'] == 'Y' else True,
  207. 'third_party_account': v['third_party_account'],
  208. 'delivery_confirmation': v['delivery_confirmation'],
  209. 'insurance': v['insurance'],
  210. 'saturday_delivery': v['saturday_delivery'],
  211. 'signature_required': v['signature_required']
  212. },
  213. 'group_name': v['handle']
  214. }
  215. json_orders.append(jorder)
  216. except Exception as e:
  217. traceback.print_exc(e)
  218. try:
  219. misc_failures.append(
  220. 'Failure constructing order for order with xref ' +
  221. str(k))
  222. log.warning('Failure constructing order with xref %s',
  223. str(k),
  224. exc_info=sys.exc_info())
  225. except:
  226. pass
  227.  
  228. for jorder in json_orders:
  229. gevent.sleep(0)
  230. try:
  231. validation_msg = validate_field_lengths(jorder)
  232. if validation_msg:
  233. misc_failures.append('Order ' + jorder['xref'] + ': ' +
  234. validation_msg)
  235. continue
  236.  
  237. resp = rest_client.create_order(json.dumps(jorder))
  238. to_exec.results.append(
  239. SpreadsheetUploadResult(numen_id=resp['id'],
  240. xref=jorder['xref'],
  241. success=True))
  242.  
  243. except Exception as e:
  244. traceback.print_exc()
  245. to_exec.results.append(SpreadsheetUploadResult(xref=jorder[
  246. 'xref'], success=False,
  247. msg=e.message))
  248. log.critical('Error response back from Order Creation',
  249. exc_info=sys.exc_info())
  250. except Exception as e:
  251. traceback.print_exc()
  252. log.critical('General error in processing', exc_info=sys.exc_info())
  253. return (failed_rows, misc_failures)
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement