Example #1
0
	def get_for_product_and_cart(cls, cartKey, productName, quantity=999):
		try:
			pn = utils.clean_product_number(productName)
			return ndb.Key(Order, str(pn), parent=cartKey).get()
		except:
			logging.error("Error with query in function get_for_UserKey for Model class Order ")
			return None
Example #2
0
	def get_for_UserKey(cls, uk, pn=None, quantity=999):
		## uk = User Key
		## pn = Manufacturers Product Number
		try:
			if pn:
				n = utils.clean_product_number(pn)
				return ndb.Key(Alert, str(n), parent=uk).get()
			else:
				return cls.query(ancestor=uk).fetch(quantity)
		except:
			logging.error("Error with query in function get_for_UserKey for Model class OrderItem")
			return None
Example #3
0
	def get_for_UserKey(cls, uk, pn=None, sup=None, quantity=999):
		##: uk = User Key
		try:
			if pn != None or sup != None:
				p = utils.clean_product_number(pn)
				logging.info('Going to run ndb.Key - get()')
				return ndb.Key(MarketMaker, str(p)+str(sup), parent=cls.uk).get()
			logging.info('Going to run Query on MarketMaker Model')
			return cls.query(ancestor=uk).order(-cls.cd).fetch(quantity)
		except:
			logging.error("Error with query in function get_for_UserKey for Model class OrderItem")
			return None
Example #4
0
	def create_order(cls, cartKey, productKey, qnt, put_model=True):
		try:
			product = productKey.get()
			if product:
				pn = utils.clean_product_number(product.pn)
				order = cls(
							key = ndb.Key(Order, str(pn), parent=cartKey),
							pk = productKey, ##: Product Model Key
							ck = cartKey, ##: Cart Model Key
							q = int(qnt), ##: Quantity for Order
							)
				if put_model:
					orderKey = order.put()
					if orderKey:
						return order
				else:
					return order
			return None
		except Exception as e:
			logging.error("Error creating the order model in function create_order for Model class Order : -- %s " % str(e))
			return None
Example #5
0
	def clean_pn(cls):
		return utils.clean_product_number(cls.pn)
Example #6
0
	def _pre_put_hook(cls):
		pn = utils.clean_product_number(cls.pn)
		key = ndb.Key(Alert, "A_"+str(mpn), parent=cls.uk)
		cls.key = key
Example #7
0
	def clean_pn(cls):
		return utils.clean_product_number(cls.key.id())
Example #8
0
	def get_for_product(cls, productPN, productKey):
		pn = utils.clean_product_number(productPN)
		return ndb.Key(ProductTierPrice, str(pn), parent=productKey).get()
Example #9
0
	def _pre_put_hook(cls):
		p = utils.clean_product_number(cls.pn)
		key = ndb.Key(MarketMaker, str(p)+str(cls.sup), parent=cls.uk)
		cls.key = key
Example #10
0
	def _pre_put_hook(cls):
		pn = utils.clean_product_number(cls.pn)
		key = ndb.Key(ProductTierPrice, str(pn), parent=cls.pk)
		cls.key = key
Example #11
0
	def get_by_seller_and_pn(sellerID, productNumber):
		pn = utils.clean_product_number(productNumber)
		sellerKey = ndb.Key(userModels.Seller, str(sellerID)).get(keys_only=True)
		if sellerKey: return ndb.Key(Product, str(pn), parent=sellerKey).get()
		return None
Example #12
0
	def get_by_pn(pn, quantity=999):
		## pn = Manufacturer Product Number
		n = utils.clean_product_number(pn)
		qry = Product.query(Product.pn == n)
		return qry.fetch(quantity)
Example #13
0
	def _pre_put_hook(cls):
		n = utils.clean_product_number(cls.pn)
		key = ndb.Key(Product, str(n), parent=cls.sk)
		cls.key = key
		if not cls.cp:  cls.cp  = cls.bup
		if not cls.hup: cls.hup = cls.bup
Example #14
0
	def post(self):
		try:
			if not self.addProduct_form.validate():
				raise Exception('addProduct_form did not Validate, in function POST of GetProductFormHandler')
			logging.info("addProduct_form Form Was valid")
			
			best_price = None
			productModel = None
			quantity = 1
			
			##: Try to fetch the data from the Form responce
			productNumber = str(self.addProduct_form.productNumber.data).strip() ##: Product Number
			urlsafeSellerKey = str(self.addProduct_form.urlsafeSellerKey.data).strip() ##: Urlsafe Seller Key
			urlsafeCartKey = str(self.request.POST.get('ck', None)).strip() ##: Urlsafe Cart Key Optional
			qnt = self.request.POST.get('qnt', None) ##: Urlsafe Seller Key
			logging.info('here')
			if qnt:
				try:
					quantity = int(qnt)
				except:
					logging.error('The quantity supplied in the form submission could not be converted into an integer')
					message = _('Sorry, the quantity supplied in the form submission was not valid. Please try again later.')
					self.add_message(message, 'error')
					try:
						self.redirect(self.request.referer)
					except:
						self.redirect_to('home')
			
			cleanProductNUmber = utils.clean_product_number(productNumber)
			logging.info('here')
			
			sellerKey = ndb.Key(urlsafe=urlsafeSellerKey)
			productKey = ndb.Key(shoppingModels.Product, cleanProductNUmber, parent=sellerKey)
			productModel = productKey.get()
			if not productModel:
				logging.info('here')
				
				########################################################################
				#################
				########   We don't have this product yet so we must Parse the website.
				#################
				########################################################################
				try:
					sellerModel = ndb.Key(urlsafe=urlsafeSellerKey).get()
					logging.info('here')
					
					if not sellerModel:
						raise Exception('Seller of requested product was not found.')
					if sellerModel.parser == 'DIGIKEY':
						# Call to parser
						logging.info('Product Number to search: {}'.format(productNumber))
						productModel, best_price_cents = parsers.DK_Search(sellerModel, str(productNumber), int(quantity))
					else:
						raise Exception('At this time we cannot get product info from Seller')

					# Check over results of Parser
					if not productModel:
						raise Exception('Missing a productModel from the parser response')
					if not best_price_cents:
						raise Exception('Missing a best_price_cents from the parser response')
					best_price = float(best_price_cents)/100 # convert to dollars

				except Exception as e:
					logging.error('Error creating a productModel: -- {}'.format(e))
					message = _('Sorry, we could not retrieve your product request. Please try again later.')
					self.add_message(message, 'error')
					try:
						return self.redirect(self.request.referer)
					except:
						return self.redirect_to('home')

			##: A Product Model was found
			else:
				logging.info('here')
				
				########################################################################
				#################
				########   Send to bestPrice script
				#################
				########################################################################
				try:
					best_price = bestPrice.getBestPrice(productModel.key.urlsafe(), int(quantity))
					if not best_price:
						raise Exception('Best price returned None for product number: {}'.format(productModel.pn))
				except Exception as e:
					logging.error('Error finding Product and/or Price in function getProduct of ProductRequestHandler : %s' % e)
					message = _('Sorry, we could not find a price result for your product request. Please try again later.')
					self.add_message(message, 'error')
					try:
						return self.redirect(self.request.referer)
					except:
						return self.redirect_to('home')
			
			if not productModel or not best_price:
				raise Exception('Either the productModel or the best_price is missing')

			if urlsafeCartKey:
				logging.info('here')
				old_order_subtotal = 0
				
				cartModel = ndb.Key(urlsafe=urlsafeCartKey).get()
				if not cartModel:
					raise Exception('cartModel was not found using the urlsafeCartKey given in the form.')

				##: Check to see if user already created this Order within this Cart
				currentOrder = shoppingModels.Order.get_for_product_and_cart(cartModel.key, str(productModel.pn))
				newOrder = None
				##: Create or Update the Order Model
				if currentOrder:
					logging.info('here')
					old_order_subtotal = currentOrder.st ##: must record the old subTotal before updating the QNT
					newOrder = currentOrder.update_order_add_qnt(currentOrder, int(quantity), put_model=False)
				else:
					logging.info('here')
					old_order_subtotal = 0
					newOrder = shoppingModels.Order.create_order(cartModel.key, productModel.key, int(quantity), put_model=False)

				##: Update the Cart for the Totals Costs
				if newOrder:
					##: Updatte the Cart's subtotals
					orderSubTotal = (int(newOrder.st)-int(old_order_subtotal))
					oldCartSubTotal = cartModel.st
					newCartSubTotal = int(oldCartSubTotal) + int(orderSubTotal)
					shoppingModels.Cart.update_subtotal_values(cartModel, newCartSubTotal, oldCartSubTotal, put_model=False)

				ndb.put_multi( [cartModel, newOrder] )

				message = _('We have found the requested Product: {} and have added it to your cart {}.'.format(productModel.pn, cartModel.n))
				self.add_message(message, 'success')
			else:
				message = _('We have saved the requested Product: {} to our database.'.format(productModel.pn))
				self.add_message(message, 'success')
			
		except Exception as e:
			logging.error('Error finding or creating Product in function post of GetProductFormHandler : %s' % e)
			message = _('Sorry, there was an error getting the Product requested. Please try again later.')
			self.add_message(message, 'error')
		finally:
			logging.info('here')
			
			try:
				self.redirect(self.request.referer)
			except:
				self.redirect_to('home')