Advertisement
Guest User

Untitled

a guest
Dec 11th, 2016
117
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Python 9.28 KB | None | 0 0
  1. class StockCheckerApp(object):
  2.     def __init__(self, master, width=1200, height=1200):
  3.         self.sku = ''
  4.         self.client_id = ''
  5.         self.cycle = 1
  6.  
  7.         # set dimensions
  8.         master.geometry('{}x{}'.format(width, height))
  9.  
  10.         # set title of window
  11.         master.wm_title('Adidas Stock Checker')
  12.  
  13.         self.left_frame = Frame(master, width=width/2, height=height)
  14.         self.left_frame.pack(side=LEFT)
  15.  
  16.         self.right_frame = Frame(master, width=width/2, height=height)
  17.         self.right_frame.pack(side=RIGHT)
  18.  
  19.         # sku label and input
  20.         self.sku_label = Label(self.left_frame, text='Enter SKU:')
  21.         self.sku_label.pack(anchor='w')
  22.         self.sku_input = Entry(self.left_frame)
  23.         self.sku_input.insert(0, 'SKU Here')
  24.         self.sku_input.pack(anchor='w')
  25.  
  26.         add_space(self.left_frame)
  27.  
  28.         # client id label and input
  29.         self.client_id_label = Label(self.left_frame, text='Enter Client ID:')
  30.         self.client_id_label.pack(anchor='w')
  31.         self.client_id_input = Entry(self.left_frame)
  32.         self.client_id_input.insert(0, 'Client ID Here')
  33.         self.client_id_input.pack(anchor='w')
  34.  
  35.         add_space(self.left_frame)
  36.  
  37.         # region label and input
  38.         self.region_label = Label(self.left_frame, text='Enter region:')
  39.         self.region_label.pack(anchor='w')
  40.         self.region_input = Entry(self.left_frame)
  41.         self.region_input.insert(0, 'Region Here')
  42.         self.region_input.pack(anchor='w')
  43.  
  44.         add_space(self.left_frame)
  45.  
  46.         """ START OF REFRESH MODE VARIABLES """
  47.  
  48.         # refresh checkbox
  49.         self.refresh_var = BooleanVar()
  50.         self.refresh_checkbox = Checkbutton(self.left_frame, text='Refresh Mode', variable=self.refresh_var)
  51.         self.refresh_checkbox.bind("<Button-1>", self.update_refresh_mode)
  52.         self.refresh_checkbox.pack(anchor='w')
  53.  
  54.         # refresh amount input and label
  55.         self.refresh_amt_label = Label(self.left_frame, text='Enter Refresh Amount:')
  56.         self.refresh_amt_label.pack(anchor='w')
  57.         self.refresh_amt_input = Entry(self.left_frame)
  58.         self.refresh_amt_input.insert(0, 'Refresh Amount Here')
  59.         self.refresh_amt_input.pack(anchor='w')
  60.  
  61.         # refresh delay input and label
  62.         self.refresh_dly_label = Label(self.left_frame, text='Enter Refresh Delay (Seconds):')
  63.         self.refresh_dly_label.pack(anchor='w')
  64.         self.refresh_dly_input = Entry(self.left_frame)
  65.         self.refresh_dly_input.insert(0, 'Refresh Delay Here')
  66.         self.refresh_dly_input.pack(anchor='w')
  67.  
  68.         """  END OF REFRESH MODE VARIABLES  """
  69.         self.disable_refresh()
  70.  
  71.         add_space(self.left_frame)
  72.  
  73.         self.submit_btn = Button(self.left_frame, text='Display Stock', command=self.get_stock)
  74.         self.submit_btn.pack(anchor='w')
  75.  
  76.         add_space(self.left_frame)
  77.         add_space(self.left_frame)
  78.         add_space(self.left_frame)
  79.  
  80.         self.status = Label(self.left_frame)
  81.         self.status.pack(anchor='w')
  82.         self.update_status('Awaiting SKU...')
  83.  
  84.         self.quit_btn = Button(self.left_frame, text='Quit', command=master.quit)
  85.         self.quit_btn.pack(anchor='w')
  86.  
  87.     def update_refresh_mode(self, event=''):
  88.         # you must take the opposite since the function is called
  89.         # before the change of the checkbox
  90.         active = not self.refresh_var.get()
  91.  
  92.         if active:
  93.             self.enable_refresh()
  94.         else:
  95.             self.disable_refresh()
  96.  
  97.     def disable_refresh(self):
  98.         self.refresh_amt_label.configure(state="disabled")
  99.         self.refresh_amt_input.configure(state="disabled")
  100.         self.refresh_dly_label.configure(state="disabled")
  101.         self.refresh_dly_input.configure(state="disabled")
  102.  
  103.     def enable_refresh(self):
  104.         self.refresh_amt_label.configure(state="normal")
  105.         self.refresh_amt_input.configure(state="normal")
  106.         self.refresh_dly_label.configure(state="normal")
  107.         self.refresh_dly_input.configure(state="normal")
  108.  
  109.     def update_status(self, status):
  110.         self.status['text'] = 'Status: '+status
  111.  
  112.     def get_stock(self):
  113.         self.sku = self.sku_input.get().strip()
  114.         self.client_id = self.client_id_input.get().strip()
  115.         self.cycle = 1
  116.  
  117.         region = self.region_input.get()
  118.  
  119.         if self.refresh_var.get():
  120.             validity = self.refresh_is_valid()
  121.             if not validity[0]:
  122.                 self.update_status(validity[1])
  123.                 self.enable_submit()
  124.                 return
  125.             else:
  126.                 amt = int(self.refresh_amt_input.get())
  127.                 dly = float(self.refresh_dly_input.get())
  128.  
  129.                 if amt <= 0:
  130.                     self.update_status('Please enter a non-zero/negative amount.')
  131.                     return
  132.                 if dly < 0:
  133.                     self.update_status('Please enter a non-negative delay.')
  134.                     return
  135.         else:
  136.             amt = 1
  137.             dly = 1
  138.  
  139.         thread = Thread(name=self.sku+'_'+region, target=self.check_stock, args=[region, amt, dly])
  140.         thread.daemon = True
  141.         thread.start()
  142.  
  143.         self.disable_submit()
  144.  
  145.     def check_stock(self, region, refresh=1, delay=1):
  146.         self.update_status('Cycle {} retrieving {}...'.format(self.cycle, self.sku))
  147.  
  148.         region = region.upper()
  149.         given_sku = self.sku
  150.         is_main_sku = '_' not in self.sku
  151.  
  152.         s = requests.Session()
  153.         s.headers['User-Agent'] = 'Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/48.0.2564.116 Safari/537.36'
  154.  
  155.         base = 'http://production-us-adidasgroup.demandware.net/s/adidas-{}/dw/shop/v15_6/products/'.format(region)
  156.         if region != 'US' and region != 'CA' and region != 'MX':
  157.             base = base.replace('-us', '-store')
  158.  
  159.         url = base+self.sku
  160.  
  161.         params = {
  162.             'client_id': self.client_id,
  163.             'expand': 'availability,variations,prices'
  164.         }
  165.  
  166.         res = s.get(url, params=params)
  167.         json_dict = res.json()
  168.  
  169.         if is_main_sku and 'fault' in json_dict:
  170.             err_msg = json_dict['fault']['message']
  171.             self.update_status(err_msg)
  172.             return
  173.  
  174.         qty = json_dict['inventory']['ats']
  175.         stock = list()
  176.  
  177.         if is_main_sku:
  178.             variants = json_dict['variants']
  179.             variant_attrs = json_dict['variation_attributes'][0]['values']
  180.             for variant in variants:
  181.                 index = variants.index(variant)
  182.                 self.sku = variant['product_id']
  183.  
  184.                 entry_name = self.sku+' ({})'.format(variant_attrs[index]['name'])
  185.  
  186.                 entry = {entry_name: self.check_stock(region)}
  187.                 stock.append(entry)
  188.  
  189.             total = 0
  190.             for entry in stock:
  191.                 sku = list(entry)[0]
  192.                 total += entry[sku]
  193.             stock.append({'Total': total})
  194.  
  195.             self.update_status('Cycle {} retrieved {}'.format(self.cycle, given_sku))
  196.  
  197.             self.display_stock(stock, json_dict['name'])
  198.  
  199.             self.sku = given_sku
  200.             if refresh > 1:
  201.                 self.cycle += 1
  202.                 time.sleep(delay)
  203.                 self.check_stock(region, refresh-1)
  204.             else:
  205.                 self.enable_submit()
  206.         else:
  207.             return qty
  208.  
  209.     def display_stock(self, stock_entries, product_name=''):
  210.         # clear frame of any previous entries
  211.         for child in self.right_frame.winfo_children():
  212.             child.destroy()
  213.  
  214.         name_label_display = Entry(self.right_frame)
  215.         name_label_display.insert(0, 'Name')
  216.         name_label_display.configure(state='readonly')
  217.         name_label_display.grid(row=0, column=0)
  218.  
  219.         name_display = Entry(self.right_frame)
  220.         name_display.insert(0, product_name)
  221.         name_display.configure(state='readonly')
  222.         name_display.grid(row=0, column=1)
  223.  
  224.         for stock_entry in stock_entries:
  225.             sku = list(stock_entry)[0]
  226.  
  227.             i = stock_entries.index(stock_entry)+1
  228.  
  229.             sku_display = Entry(self.right_frame)
  230.             sku_display.insert(0, sku)
  231.             sku_display.configure(state='readonly')
  232.             sku_display.grid(row=i, column=0)
  233.  
  234.             qty_display = Entry(self.right_frame)
  235.             qty_display.insert(0, str(stock_entry[sku]))
  236.             qty_display.configure(state='readonly')
  237.             qty_display.grid(row=i, column=1)
  238.  
  239.     def refresh_is_valid(self):
  240.         err_msg = ''
  241.         valid = True
  242.  
  243.         try:
  244.             float(self.refresh_dly_input.get())
  245.         except ValueError:
  246.             err_msg = 'Please input valid refresh delay'
  247.             valid = False
  248.  
  249.         try:
  250.             int(self.refresh_amt_input.get())
  251.         except ValueError:
  252.             err_msg = 'Please input valid refresh amount'
  253.             valid = False
  254.  
  255.         return valid, err_msg
  256.  
  257.     def disable_submit(self):
  258.         self.submit_btn.configure(state='disabled')
  259.  
  260.     def enable_submit(self):
  261.         self.submit_btn.configure(state='normal')
  262.  
  263.  
  264. def add_space(frame):
  265.     space = Label(frame)
  266.     space.pack()
  267.  
  268.  
  269. root = Tk()
  270. # root.resizable(width=False, height=False)
  271.  
  272. app = StockCheckerApp(root)
  273.  
  274. root.mainloop()
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement