def get(self): self.response.headers['Content-Type'] = 'text/plain' sale_ids = [] brands = defaultdict(dict) content = helper.fetch('http://m.gilt.com/pagegen_service/sale/mobile_sale_set') if content: sale_groups = json.loads(content).get('data').get('mobile_sale_set').get('sale_groups') active_sales = [sale_group.get('sales') for sale_group in sale_groups if sale_group.get('title') == 'Active Sales'][0] for sale_data in active_sales: sale_id = sale_data.get('id') sale_name = sale_data.get('name') sale_data['stores'] = [str(store.lower()) for store in sale_data['stores']] sale = Sale.create(sale_data) if sale: new_sale_msg = "Created sale %s - %s.\nhttp://%s/tasks/fetch/sale/%d\n\n" % \ (sale_id, sale_name, self.request.host, sale_id) else: new_sale_msg = "Sale %s - %s already exists.\n\n" % (sale_id, sale_name) self.response.out.write(new_sale_msg) sale_ids.append(sale_id) for brand in sale_data.get('brands') or []: Brand.create(brand_id=brand.get('id'), name=brand.get('name')) for sale_id in sale_ids: task_name = TASK_NAME_FETCH_SALE % (TASK_QUEUE_FETCH_SALE, sale_id, datetime.now().microsecond) task = taskqueue.Task(url='/tasks/fetch/sale/%s' % (sale_id), \ params={'brands': brands[sale_id]}, name=task_name, method='GET') try: task.add(TASK_QUEUE_FETCH_SALE) task_msg = "Added task '%s' to task queue '%s'.\n" except TaskAlreadyExistsError: task_msg = "Task '%s' already exists in task queue '%s'.\n" except TombstonedTaskError: task_msg = "Task '%s' is tombstoned in task queue '%s'.\n" self.response.out.write("%s\n%s" % (task.url, task_msg % (task.name, TASK_QUEUE_FETCH_SALE)))
def get(self, sale_id): self.response.headers['Content-Type'] = 'text/plain' sale_id = int(sale_id) sale = Sale.lookup(sale_id) if not sale: self.response.out.write('Sale id %d not found.\n' % (sale_id)) else: url = "%s/sale/mobile_sale_listing?sale_id=%d" % (API_SVC, sale_id) content = helper.fetch(url) products_data = json.loads(content)['data']['products'] if products_data and len(products_data): brand_entities = [Brand.get_by_key_name(str(product['brand_id'])) for product in products_data.values()] brands = dict([(int(brand.id), brand) for brand in brand_entities if brand]) for product_id, product_data in products_data.items(): brand_id = product_data['brand_id'] brand = Brand.lookup(brand_id) product_id = int(product_id) product_data['name'] = mod_product_string(product_data['name']) product_data['description'] = mod_product_string(product_data['description'], '\n') product_data['categories'] = list(itertools.chain(*([k.split('_') for k in product_data['category_keys']]))) product = Product.create(product_id, product_data, sale, brands.get(brand_id) or Brand.create(brand_id)) if not product: self.response.out.write("Did not create product %d - %s.\n" % (product_id, product_data['name'])) else: self.response.out.write("Created product %d - %s.\n" % (product_id, product_data['name'])) prices = [] sizes = [] looks = product_data['looks'] if looks: for look_data in looks: look_id = look_data['look_id'] look = Look.create(look_id, look_data, product) if not look: self.response.out.write('\tDid not create Look for look id %d.\n' % look_id) else: self.response.out.write('\tCreated look id %d for product %d %s.\n' % (look_id, product_id, product.name)) prices.extend([look_data.get(price_key) for price_key in PRICE_KEYS]) skus = look_data.get('skus') or [] for sku_data in skus: size = sku_data.get('size') if size: if size[0].isdigit(): sizes.extend(size.split('/')) else: sizes.append(size) sku_id = sku_data['sku_id'] sku = SKU.create(sku_id, sku_data, look or Look.get_by_key_name("%s" % look_id)) if sku: self.response.out.write('\t\t- Created SKU %d.\n' % sku_id) prices.extend([sku_data.get(price_key) for price_key in PRICE_KEYS]) else: self.response.out.write('\t\t- Did not create SKU %d.\n' % sku_id) prices = list(frozenset(filter(lambda price: price and price > 0, prices))) if prices: product.lowest_price = min(prices) product.highest_price = max(prices) if sizes: product.sizes = list(frozenset(sizes)) product.put() self.response.out.write("\n\n")