Example #1
0
	def get(self):
		#take in geo_point
		#set radius, expand, get all deals
		
		
		
		request_point = levr.geo_converter('42.35,-71.110')
		center_hash = geohash.encode(request_point.lat,request_point.lon,precision=6)
		all_squares = geohash.expand(center_hash)
		
		all = levr.Business.all().count()
		self.response.out.write(all)
		self.response.out.write('<br/>')
		
		keys = []
		for query_hash in all_squares:
			q = levr.Business.all(keys_only=True).filter('geo_hash >=',query_hash).filter('geo_hash <=',query_hash+"{")
			keys.extend(q.fetch(None))
		
		self.response.out.write(str(keys.__len__())+"<br/>")
		
		#get all deals
		deals = levr.Business.get(keys)
		logging.debug(deals)
		for deal in deals:
			self.response.out.write(deal.geo_hash+"<br/>")
Example #2
0
    def post(self):
        #curl --data 'businessName=alonsostestbusiness&vicinity=testVicinity&phone=%2B16052610083&geoPoint=-71.234,43.2345' http://www.levr.com/api/merchant/initialize | python -mjson.tool
        '''REMEMBER PHONE NUMBER FORMATTING STUFF'''
        api_utils.send_error(
            self,
            'Hey ethan. Ask alonso about the formatting of the phone number.')
        return

        #Grab incoming merchant data
        business_name = self.request.get('businessName')
        if business_name == '':
            api_utils.send_error(
                self, 'Required parameter not passed: businessName')
            return
        vicinity = self.request.get('vicinity')
        if vicinity == '':
            api_utils.send_error(self,
                                 'Required parameter not passed: vicinity')
            return
        phone = self.request.get('phone')
        if phone == '':
            api_utils.send_error(self, 'Required parameter not passed: phone')
            return
        geo_point = self.request.get('geoPoint')
        if geo_point == '':
            api_utils.send_error(self,
                                 'Required parameter not passed: geo_point')
            return

        #check if business entity already exists based on phone number
        business = levr.Business.gql('WHERE business_name = :1 AND phone = :2',
                                     business_name, phone).get()

        if business:
            #if a business has been created and an owner has been set, return an error
            if business.owner:
                logging.info('Owner is set!')
                api_utils.send_error(
                    self,
                    'That business has already been verified. If you need help, email [email protected]'
                )
                return
            #if a business has been created but no owner has been set, return the business
        else:
            logging.debug('Creating a new business.')
            #create a new business entity with no owner
            business = levr.Business()
            business.business_name = business_name
            business.vicinity = vicinity
            business.phone = phone
            business.geo_point = levr.geo_converter(geo_point)
            business.activation_code = str(int(time.time()))[-4:]
            #put
            business.put()

        #reply with business object
        response = {'business': api_utils.package_business(business)}
        api_utils.send_response(self, response)
Example #3
0
def get_deals_in_area(tags,request_point,precision=5):
	'''
	tags = list of tags that are strings
	request point is db.GeoPt format
	precision is int
	'''
	request_point = levr.geo_converter('42.35,-71.110')
	logging.debug(precision)
	center_hash = geohash.encode(request_point.lat,request_point.lon,precision=precision)
	logging.debug(center_hash)
	hash_set = geohash.expand(center_hash)
	logging.debug(hash_set)
	
	##DEBUG
	ref_query = levr.Deal.all().filter('deal_status =','active')
	for tag in tags:
		if tag != 'all':
			ref_query.filter('tags =',tag)
	ref_deals = ref_query.fetch(None)
	logging.info("total number of deals: "+str(ref_deals.__len__()))
#	for d in ref_deals:
#		logging.debug(d.geo_hash)
	##/DEBUG
	
	
	####build search query
	#only grabbing deal keys, then batch get array
	deal_keys = []
	for query_hash in hash_set:
		#only grab keys for deals that have active status
		q = levr.Deal.all(keys_only=True).filter('deal_status =','active')
		#grab all deals where primary_cat is in tags
		for tag in tags:
			#all is a special keyword
			if tag != 'all':
				logging.debug('tag: '+str(tag))
				q.filter('tags =',tag)
		#filter by geohash
		q.filter('geo_hash >=',query_hash).filter('geo_hash <=',query_hash+"{") #max bound
#					logging.debug(q)
#					logging.debug(levr_utils.log_dict(q.__dict__))
		
		#get all keys for this neighborhood
		fetched_deals = q.fetch(None)
		logging.info('From: '+query_hash+", fetched: "+str(fetched_deals.__len__()))
		
		deal_keys.extend(fetched_deals)
#					logging.debug(deal_keys)
	
	#batch get results. here is where we would set the number of results we want and the offset
	deals = levr.Deal.get(deal_keys)
	
	logging.info('number of deals fetched: '+str(deals.__len__()))
	
	return deals
Example #4
0
	def post(self):
		#curl --data 'businessName=alonsostestbusiness&vicinity=testVicinity&phone=%2B16052610083&geoPoint=-71.234,43.2345' http://www.levr.com/api/merchant/initialize | python -mjson.tool
		
		'''REMEMBER PHONE NUMBER FORMATTING STUFF'''
		api_utils.send_error(self,'Hey ethan. Ask alonso about the formatting of the phone number.')
		return
		
		#Grab incoming merchant data
		business_name = self.request.get('businessName')
		if business_name == '':
			api_utils.send_error(self,'Required parameter not passed: businessName')
			return
		vicinity = self.request.get('vicinity')
		if vicinity == '':
			api_utils.send_error(self,'Required parameter not passed: vicinity')
			return
		phone = self.request.get('phone')
		if phone == '':
			api_utils.send_error(self,'Required parameter not passed: phone')
			return
		geo_point = self.request.get('geoPoint')
		if geo_point == '':
			api_utils.send_error(self,'Required parameter not passed: geo_point')
			return
		
		#check if business entity already exists based on phone number
		business = levr.Business.gql('WHERE business_name = :1 AND phone = :2',business_name,phone).get()
		
		
		if business:
			#if a business has been created and an owner has been set, return an error
			if business.owner:
				logging.info('Owner is set!')
				api_utils.send_error(self,'That business has already been verified. If you need help, email [email protected]')
				return
			#if a business has been created but no owner has been set, return the business
		else:
			logging.debug('Creating a new business.')
			#create a new business entity with no owner
			business = levr.Business()
			business.business_name = business_name
			business.vicinity = vicinity
			business.phone = phone
			business.geo_point = levr.geo_converter(geo_point)
			business.activation_code = str(int(time.time()))[-4:]
			#put
			business.put()
		
		#reply with business object
		response = {'business':api_utils.package_business(business)}
		api_utils.send_response(self,response)
Example #5
0
def dealCreate(params,origin,upload_flag=True):
	'''pass in "self"'''
	logging.debug('DEAL CREATE')
	
	logging.debug("origin: "+str(origin))
	logging.debug(log_dict(params))
	
	
	logging.debug("image was uploaded: "+str(upload_flag))
	#init tags list for deal
	tags = []
	
	#business information - never create business unless old phone
		#just want to get tags to store on deal
	#get deal information
	#create deals with appropriate owners
	
	'''

	
	#####merchant_edit
		params = {
				'uid'			#uid is businessOwner
				'business'		#businessID
				'deal'			#dealID
				'deal_description'
				'deal_line1'
				'deal_line2'
				}
		!!! check for uploaded image !!!
		

	#####merchant_create
		params = {
				'uid'			#uid is businessOwner
				'business'
				'deal_line1'
				'deal_line2' 	#optional
				'deal_description'
				'img_key'
				}
		
	#####phone_existing_business
		params = {
				'uid' 			#uid is ninja
				'business' 
				'deal_description'
				'deal_line1'
				!!! no deal_line2 !!!
				}
	#####phone_new_business
		params = {
				'uid'			#uid is ninja
				'business_name'
				'geo_point'
				'vicinity'
				'types'
				'deal_description'
				'deal_line1'
				}
	#####admin_review
		params = {
				'uid'		#uid is ninja
				'deal'		#deal id
				'business'	#business id
				'deal_line1'
				'deal_line2'
				'deal_description'
				'tags'
				'end date'
				!!! other stuff !!!
				}
	'''
	
	
	#==== deal information ====#
	
	
	#==== business stuff ====#
	if origin == 'phone_new_business':
		#The business to which a deal is being uploaded is not targeted
		logging.debug('origin is phone, new business being added')
		
		
		#business name
		if 'business_name' in params:
			business_name = params['business_name']
			logging.debug("business name: "+str(business_name))
		else:
			raise KeyError('business_name not in params')
		#geo point
		
		if 'geo_point' in params:
			geo_point = params['geo_point']
			geo_point = levr.geo_converter(geo_point)
			logging.debug("geo point: "+str(geo_point))
			#create geohash from geopoint
			geo_hash = geohash.encode(geo_point.lat,geo_point.lon)
			logging.info(geo_hash)
		else:
			raise KeyError('geo_point not in params')
		
		#vicinity
		if 'vicinity' in params:
			vicinity = params['vicinity']
			logging.debug("vicinity: "+str(vicinity))
		else:
			raise KeyError('vicinity not in params')
		
		#types
		if 'types' in params:
			types = params['types']
			logging.debug('start types')
			logging.debug(types)
			logging.debug(type(types))
			types = levr.tagger(types)
			logging.debug(types)
			logging.debug('end types')
		else:
			raise KeyError('types not in params')
		#check if business exists - get businessID
#		business= levr.Business.gql("WHERE business_name=:1 and geo_point=:2", business_name, geo_point).get()
		business = levr.Business.all().filter('business_name =',business_name).filter('vicinity =',vicinity).get()
		logging.debug('start business info')
		logging.debug(log_model_props(business))
		logging.debug('end business info')
		
		if not business:
			logging.debug('business doesnt exist')
			#if a business doesn't exist in db, then create a new one
			business = levr.Business()
			
			
			
			
			#add data to the new business
			business.business_name 	= business_name
			business.vicinity 		= vicinity
			business.geo_point		= geo_point
			business.types			= types
			business.geo_hash		= geo_hash
			
			logging.debug(log_model_props(business))
			#put business
			business.put()
			
			
		else:
			logging.debug('business exists')
			#business exists- grab its tags
			logging.debug(geo_hash)
		
		#grab the businesses tags
		tags.extend(business.create_tags())
		#get businessID - not encrypted - from database
		businessID = business.key()
		logging.debug("businessID: "+str(businessID))
		
		#Create tags
		
		logging.debug('-------------------------------------------')
		logging.debug(tags)
	else:
		#BusinessID was passed, grab the business
		logging.debug('not oldphoone')
		
		if 'business' in params:
			businessID = params['business']
			businessID	= enc.decrypt_key(businessID)
			businessID	= db.Key(businessID)
			business	= levr.Business.get(businessID)
		else:
			raise KeyError('business not passed in params')
		#get the tags from the business
		tags.extend(business.create_tags())
		
		#grab all the other information that needs to go into the deals
		business_name 	= business.business_name
		geo_point		= business.geo_point
		vicinity		= business.vicinity
		geo_hash		= business.geo_hash
		
		logging.debug(log_model_props(business))
		

	logging.debug('!!!!!')
	#====Deal Information Lines ====#
	#deal line 1
	if 'deal_line1' in params:
		deal_text	= params['deal_line1']
		logging.debug(deal_text)
		tags.extend(levr.tagger(deal_text))
		logging.info(tags)
	else:
		raise KeyError('deal_line1 not passed in params')
	
	#deal line 2
	if origin != 'phone_existing_business' and origin != 'phone_new_business':
		if 'deal_line2' in params:
			secondary_name = params['deal_line2']
		else:
			secondary_name = False
		logging.debug(secondary_name)
		if secondary_name:
			#deal is bundled
			logging.debug('deal is bundled')
			tags.extend(levr.tagger(secondary_name))
			logging.info(tags)
			deal_type = 'bundle'
		else:
			#deal is not bundled
			'deal is NOT bundled'
			deal_type = 'single'
	else:
		#phone uploaded deals do not pass deal_line2
		deal_type = 'single'
	
	#description
	if 'deal_description' in params:
		description = params['deal_description']
		#truncate description to a length of 500 chars
		logging.debug(description.__len__())
		description = description[:500]
		logging.debug(description)
		tags.extend(levr.tagger(description))
		logging.info(tags)
	else:
		raise KeyError('deal_description not passed in params')
	
	
	
	
	#==== create the deal entity ====#
	if origin	== 'merchant_create':
		#web deals get active status and are the child of the owner
		ownerID = params['uid']
		ownerID = enc.decrypt_key(ownerID)
		
		deal = levr.Deal(parent = db.Key(ownerID))
		deal.is_exclusive		= True

	elif origin	=='merchant_edit':
		dealID	= params['deal']
		dealID	= enc.decrypt_key(dealID)
		deal	= levr.Deal.get(dealID)

	elif origin	=='phone_existing_business' or origin == 'phone_new_business':
		#phone deals are the child of a ninja
		logging.debug('STOP!')
		uid = enc.decrypt_key(params['uid'])

		deal = levr.CustomerDeal(parent = db.Key(uid))
		deal.is_exclusive		= False
		
		
		deal.date_end			= datetime.now() + timedelta(days=7)

	elif origin == 'admin_review':
		#deal has already been uploaded by ninja - rewriting info that has been reviewed
		dealID = enc.decrypt_key(params['deal'])
		deal = levr.CustomerDeal.get(db.Key(dealID))
		deal.been_reviewed		= True
		deal.date_start			= datetime.now()
		days_active				= int(params['days_active'])
		deal.date_end			= datetime.now() + timedelta(days=days_active)
		
		new_tags = params['extra_tags']
		tags.extend(levr.tagger(new_tags))
		logging.debug('!!!!!!!!!!!!')
		logging.debug(tags)
	
	
	#==== Link deal to blobstore image ====#
	if upload_flag == True:
		#an image has been uploaded, and the blob needs to be tied to the deal
		logging.debug('image uploaded')
		if origin == 'merchant_edit' or origin == 'admin_review':
			#an image was uploaded, so remove the old one.
			blob = deal.img
			blob.delete()
		#if an image has been uploaded, add it to the deal. otherwise do nothing.
		#assumes that if an image already exists, that it the old one has been deleted elsewhere
		blob_key = params['img_key']
		deal.img= blob_key
	else:
		#an image was not uploaded. do nothing
		logging.debug('image not uploaded')
	
	
	
	
	
	#add the data
	deal.deal_text 			= deal_text
	deal.deal_type			= deal_type
	deal.description 		= description
	deal.tags				= list(set(tags)) #list->set->list removes duplicates
	deal.business_name		= business_name
	deal.businessID			= businessID.__str__()
	deal.vicinity			= vicinity
	deal.geo_point			= geo_point
	logging.debug(geo_hash)
	deal.geo_hash			= geo_hash
	
	#secondary_name
	if deal_type == 'bundle':
		deal.secondary_name = secondary_name
	
	
	
	#put the deal
	deal.put()
	
	#dealput is the deal key i.e. dealID
	logging.debug(log_model_props(deal))
	logging.debug(log_model_props(business))
	
	share_url = create_share_url(deal)
	
	if origin == 'phone_existing_business' or origin =='phone_new_business':
		#needs share url and dealID
		return share_url,deal
	else:
		#return share url
		return share_url
Example #6
0
    def post(self):
        try:
            logging.info('''
			
			THE FOURSQUARE BUSINESS TASK IS RUNNING
			
			''')

            payload = json.loads(self.request.body)
            logging.debug(payload)

            geo_point = levr.geo_converter(payload['geo_str'])

            query = payload['query']

            key = payload['key']

            match = api_utils.match_foursquare_business(geo_point, query)

            logging.info(match)

            business = levr.Business.get(key)

            if match:
                logging.info('Foursquare ID found: ' + match['foursquare_id'])

                #are there any previously added foursquare businesses?
                #q_orphans = levr.Business.gql('WHERE foursquare_id=:1',match['foursquare_id'])

                #grab a duplicate business
                duplicate_business = levr.Business.gql(
                    'WHERE foursquare_id=:1', match['foursquare_id']).get()

                keys = []
                if duplicate_business:
                    #grab all the deal keys from that business
                    keys = levr.Deal.gql('WHERE businessID = :1',
                                         str(duplicate_business.key())).fetch(
                                             None, keys_only=True)


#					duplicate_business.delete()

#update business entity
                business.foursquare_id = match['foursquare_id']
                business.foursquare_name = match['foursquare_name']
                business.foursquare_linked = True
                business.put()

                deals = list(set(db.get(keys)))
                for deal in deals:
                    deal.businessID = str(business.key())
                    deal.business = business
                    logging.debug('UPDATED DEAL BUSINESSID')
                db.put(deals)
                if duplicate_business:
                    duplicate_business.delete()
                    logging.debug('DELETED ORIGINAL FOURSQUARE BUSINESS')
            else:
                #update to show notfound
                logging.info('No foursquare match found.')

            #go grab all the deals and update

        except:
            levr.log_error()
Example #7
0
    def post(self):
        #decode the input JSON and pull out the action parameter
        try:
            decoded = json.loads(self.request.body)
            action = decoded["action"]
            logging.info(action)
            try:
                uid = enc.decrypt_key(decoded["in"]["uid"])
                user = levr.Customer.get(uid)
                logging.debug(
                    levr_utils.log_model_props(user, ['alias', 'email']))
            except Exception, e:
                #				logging.debug(uid)
                logging.debug(e)

            #switch action
            #***************signup************************************************
            if action == "signup":
                logging.info('signup')
                #grab email/password from request body
                email = decoded["in"]["email"]
                alias = decoded["in"]["alias"]
                pw = decoded["in"]["pw"]
                toEcho = levr_utils.signupCustomer(email, alias, pw)

            #***************login*************************************************
            elif action == "login":
                logging.info('login')
                #grab email/password from request body
                email_or_owner = decoded["in"]["email_or_owner"]
                pw = decoded["in"]["pw"]

                toEcho = levr_utils.loginCustomer(email_or_owner, pw)

            #***************dealResults************************************************
            elif action == "popularItems":
                logging.info('popularItems')
                lat = decoded['in']['latitude']
                lon = decoded['in']['longitude']

                request_point = levr.geo_converter(str(lat) + "," + str(lon))

                #get all deals in the area
                deals = levr_utils.get_deals_in_area(['all'], request_point)

                #compile a list of all of the tags
                tags = []
                for deal in deals:
                    tags.extend(list(set(deal.tags)))
                tags.sort()
                logging.debug(tags)

                #convert list of all tags to a dict of key=tag, val=frequency
                count = {}
                for tag in tags:
                    #					logging.debug(tag in count)
                    if tag in count:
                        count[tag] += 1
                    else:
                        count[tag] = 1

                #DEBUG
                #convert dict of tag:freq into list of tuples
                tuple_list1 = []
                for key in count:
                    tuple_list1.append((count[key], key))
                tuple_list1.sort()
                tuple_list1.reverse()
                logging.debug(tuple_list1)
                #/DEBUG

                #remove unwanted stuff
                new_count = {}
                for tag in count:
                    #search occurs more than once
                    if count[tag] > 1:
                        #tag is not a number
                        if tag.isdigit() == False:
                            #tag is not in blacklist
                            if tag not in blacklist:
                                new_count[tag] = count[tag]

#				logging.debug(levr_utils.log_dict(count))

#convert dict of tag:freq into list of tuples
                tuple_list = []
                for key in new_count:
                    tuple_list.append((new_count[key], key))
                tuple_list.sort()
                tuple_list.reverse()

                logging.debug(tuple_list)
                #				for i in tuple_list:
                #					logging.debug(i)

                #select only the most popular ones, and convert to list
                word_list = [x[1] for x in tuple_list]

                #if the popular items list is longer than 6, send entire list, else only send 6
                logging.debug(word_list.__len__())
                if word_list.__len__() < 6:
                    popularItems = word_list
                else:
                    popularItems = word_list[:6]

                data = {'popularItems': popularItems}
                toEcho = {'success': True, 'data': data}

            elif action == "dealResults":
                logging.info('dealResults')
                logging.info(decoded['in'])
                #grab primaryCat from the request body
                primaryCat = decoded["in"]["primaryCat"]
                #search term
                #				start 		= decoded["in"]["start"]
                #starting index of search results
                #!!!not used
                numResults = decoded["in"]["size"]
                geo_point = decoded["in"]["geoPoint"]
                try:
                    precision = int(decoded['in']['precision'])
                except:
                    precision = 5

                logging.debug(numResults)
                #length of search results list
                #should be None if we want all results

                #normalize search query
                primaryCat = primaryCat.lower()

                ###filter by location - get neighborhoods
                request_point = levr.geo_converter(geo_point)
                #

                #normalize search query
                primaryCat = primaryCat.lower()
                #otherwise, search based on the tags
                tags = levr.tagger(primaryCat)
                logging.debug(tags)

                #batch get results. here is where we would set the number of results we want and the offset
                results = levr_utils.get_deals_in_area(tags, request_point,
                                                       precision)

                logging.info('number of deals fetched: ' +
                             str(results.__len__()))
                #define an empty "dealResults" LIST, and initialize the counter to 0
                #initialize isEmpty to 1
                isEmpty = True
                dealResults = []
                #iterate over the results
                #Want to grab deal information for each category
                for result in results:
                    #					logging.info('Rank: ' + str(result.rank))
                    #break if results limit is hit
                    isEmpty = False
                    #trade an object for a phone-formatted dictionary
                    deal = levr.phoneFormat(result, 'list', primaryCat)
                    #indicate that this is not a sentinel
                    deal['isSentinel'] = False
                    logging.debug(result.geo_hash)
                    #push the whole dictionary onto a list
                    dealResults.append(deal)
                    #increment the counter
#					resultsPushed += 1
                logging.debug(dealResults.__len__())

                ##debug
                #				deals = levr.Deal.all().fetch(None)
                #				for d in deals:
                #					logging.debug(d.geo_hash)

                #				############OLD
                #				#normalize search query
                #				primaryCat = primaryCat.lower()
                #
                #
                #				#build search query
                #				q = levr.Deal.all()
                #
                #				logging.debug("total number of deals: "+str(q.count()))
                #				#only active deals
                #				q.filter('deal_status','active')
                #				#primaryCat will be mapresults to return everything
                #				if primaryCat == 'all':
                #					#get all deals - no filter
                #					logging.debug('all')
                #				else:
                #					logging.debug('not all')
                #					#normalize search query
                #					primaryCat = primaryCat.lower()
                #					#otherwise, search based on the tags
                #					tags = levr.tagger(primaryCat)
                #					logging.debug(tags)
                #					#grab all deals where primary_cat is in tags
                #					for tag in tags:
                #						logging.debug('tag: '+str(tag))
                #						q.filter('tags =',tag)
                #
                #				###filter by location
                #				request_point = levr.geo_converter(geo_point)
                #				request_point = levr.geo_converter('42.35,-71.110')
                #				center_hash = geohash.encode(request_point.lat,request_point.lon,precision=6)
                #				hash_set = geohash.expand(center_hash)
                #
                #				#get keys of all corresponding deals
                #				deal_keys = []
                #				for query_hash in hash_set:
                #					q.filter('geo_hash >=',query_hash) #min bound
                #					q.filter('geo_hash <=',query_hash+"{") #max bound
                #					deal_keys.extend(q.fetch(None))
                #
                #				#batch get results. here is where we would set the number of results we want and the offset
                #				results = levr.Deal.get(deal_keys)
                #				logging.debug
                #				#define an empty "dealResults" LIST, and initialize the counter to 0
                #				#initialize isEmpty to 1
                #				isEmpty = True
                #				#iterate over the results
                #				#Want to grab deal information for each category
                #				for result in results:
                ##					logging.info('Rank: ' + str(result.rank))
                #					#break if results limit is hit
                #					isEmpty = False
                #					#trade an object for a phone-formatted dictionary
                #					deal = levr.phoneFormat(result,'list',primaryCat)
                #					#indicate that this is not a sentinel
                #					deal['isSentinel'] = False
                #					#push the whole dictionary onto a list
                #					dealResults.append(deal)
                #					#increment the counter
                ##					resultsPushed += 1
                #				###########################/OLD

                #				#if isempty is true, send back suggested searches instead
                #				if isEmpty == False:
                #					dealResults.append({"isSentinel":True})
                #
                #				#go get (all) suggested searches
                #				q = levr.EmptySetResponse.all()
                #				#sory by index
                #				q.order('index')
                #				#loop through and append to data
                #				for result in q:
                #					searchObj = {"isSentinel":False,
                #								"primaryCat":result.primary_cat,
                #								"imgURL": levr_utils.URL+"/phone/img?size=emptySet&dealID=" + enc.encrypt_key(result.key())
                #					}
                #					#push to stack
                #					dealResults.append(searchObj)
                #get notifications
                #				ninja = levr.Customer.get(uid)
                #				notifications = ninja.get_notifications()

                #add boundary
                lon = [
                    -71.13128751569184, -71.13747576487495, -71.13221920314751,
                    -71.1315606660475, -71.1309193072284, -71.1297731686955,
                    -71.12886527141396, -71.12773981063141, -71.12726203628873,
                    -71.1216289071829, -71.12121164180434, -71.10497418088163,
                    -71.1040140000405, -71.10267756839711, -71.0946922485677,
                    -71.09243243954906, -71.09227823963506, -71.0950832349529,
                    -71.097815779737, -71.11251814985596, -71.11356954283684,
                    -71.11706884229781, -71.11779512636194, -71.11965434764042,
                    -71.12212678446998, -71.12626327632834, -71.13026582412857
                ]
                lat = [
                    42.35604793867138, 42.3536306062291, 42.35301975662632,
                    42.35130590336475, 42.35025979303107, 42.34889896173047,
                    42.3474035881804, 42.34587017442897, 42.3454410032402,
                    42.34240376898205, 42.34200386027403, 42.34665152547006,
                    42.34437686280481, 42.34335156373593, 42.34544719585433,
                    42.34689842049458, 42.35112647889721, 42.35062769794382,
                    42.35071497934108, 42.35189268933054, 42.35225746246078,
                    42.35405913476999, 42.35424633071435, 42.35461863217454,
                    42.35493709975472, 42.35550741935002, 42.35597048179658
                ]

                boundary = {"lat": lat, "lon": lon}

                if primaryCat == 'all':
                    #echo back data - include boundary
                    toEcho = {
                        "success": True,
                        "data": dealResults,
                        "isEmpty": isEmpty,
                        "boundary": boundary
                    }  #,"notifications":notifications}
                else:
                    toEcho = {
                        "success": True,
                        "data": dealResults,
                        "isEmpty": isEmpty
                    }  #,"notifications":notifications}
            #***************getUserFavs************************************************
            elif action == "getUserFavs":
                '''
				Grabs all of the favorites of a user - only data to show on list
				input : uid
				output: name, description, dealValue, dealType, imgPath, businessName, primaryCat
				'''
                logging.info('getUserFavs')
                #grab inputs
                uid = enc.decrypt_key(decoded["in"]["uid"])
                logging.debug(uid)
                logging.debug(decoded["in"]["uid"])
                #grab user entity
                user = levr.Customer.get(uid)

                #grab list of favorties - list of deal keys
                favorites = user.favorites
                logging.debug(favorites)

                #batch grab favorited deals
                deals = levr.Deal.get(favorites)
                logging.debug(deals)

                #format deals for output to phone
                formatted_deals = []
                for deal in deals:
                    try:
                        formatted_deals.append(levr.phoneFormat(deal, 'list'))
                    except:
                        logging.warning(
                            'deal exists in favorites but was removed from the db'
                        )
                        logging.warning(deal)
#				formatted_deals	= [levr.phoneFormat(deal,'list') for deal in deals]

#assign formatted deals to data list that doesnt follow standards
                data = formatted_deals

                #get notifications
                notifications = user.get_notifications()

                #output
                toEcho = {
                    "success": True,
                    "data": data,
                    'notifications': notifications
                }
            #ADD FAVORITE***********************************************************
            elif action == "addFav":
                '''
				User pressed add favorite button = add favorite mapping
				input: dealID,uid,primaryCat
				output: success = bool
				'''
                logging.info('addFav')
                #get inputs
                uid = enc.decrypt_key(decoded["in"]["uid"])
                dealID = enc.decrypt_key(decoded["in"]["dealID"])

                #get user entity
                user = levr.Customer.get(uid)

                #append dealID to favorites property
                user.favorites.append(db.Key(dealID))
                logging.debug(user.favorites)
                #
                #get notifications
                notifications = user.get_notifications()

                #close entity
                user.put()

                #output
                toEcho = {"success": True, "notifications": notifications}
            #DELETE FAVORITE********************************************************
            elif action == "delFav":
                '''
				User presses delete favorite button - delete favorite mapping
				input: dealID,uid,primaryCat
				output: success = bool
				'''
                logging.info('delFav')
                #get inputs
                uid = enc.decrypt_key(decoded["in"]["uid"])
                dealID = enc.decrypt_key(decoded["in"]["dealID"])
                deal_to_delete = db.Key(dealID)
                logging.debug(deal_to_delete)

                #get user entity
                user = levr.Customer.get(uid)
                logging.debug(levr_utils.log_model_props(user))

                #grab favorites list
                favorites = user.favorites
                logging.debug(favorites)

                #generate new favorites list without requested dealID
                new_favorites = [
                    deal for deal in favorites if deal != deal_to_delete
                ]
                logging.debug(new_favorites)

                #reassign user favorites to new list
                user.favorites = new_favorites
                logging.debug(user.favorites)

                #get notifications
                notifications = user.get_notifications()

                #close entity
                user.put()

                toEcho = {"success": True, "notificaions": notifications}
            #***************getOneDeal************************************************
            elif action == "getOneDeal":
                '''
				Information to show on the deal information screen.
				input	: primaryCat,dealID
				output	: json object of all information necessary to describe deal
				'''
                logging.info('getOneDeal')
                #grab input dealID
                dealID = enc.decrypt_key(decoded["in"]["dealID"])
                primary_cat = decoded["in"]["primaryCat"]
                #fetch deal
                result = levr.Deal.get(dealID)
                #convert fetched deal into dictionary
                deal = levr.phoneFormat(result, 'deal')
                #push the primary onto the dictionary
                deal.update({"primaryCat": primary_cat})
                #echo back success!

                #				#get notifications
                #				ninja = levr.Customer.get(uid)
                #				notifications = ninja.get_notifications()
                toEcho = {
                    "success": True,
                    "data": deal
                }  #,"notificaions":notifications}

            elif action == "getMyDeals":
                '''
				returns all of the deals that were uploaded by the ninja
				input	: uid
				output	: list of deal objects
				'''
                logging.info('getMyDeals')
                uid = enc.decrypt_key(decoded["in"]["uid"])
                logging.debug("encrypted uid: " + str(decoded["in"]["uid"]))
                logging.debug("uid: " + str(uid))
                #grab all deal children of the user
                deals = levr.CustomerDeal.gql(
                    "WHERE ANCESTOR IS :1 ORDER BY date_uploaded DESC",
                    uid).fetch(None)
                logging.debug(deals)
                #format CUSTOMER deals
                data = [levr.phoneFormat(x, 'myDeals') for x in deals]
                #I believe this will just return data:None if deals is empty

                #flush their notifications
                ninja = levr.Customer.get(uid)

                #				ninja.flush_new_redeem_count()
                #				ninja.put()
                #get new notifications
                notifications = ninja.get_notifications()

                #Grab their cash out requests, if they exist
                cor_q = levr.CashOutRequest.gql(
                    "WHERE ANCESTOR IS :1 AND status=:2", uid, 'pending')
                cor = cor_q.get()
                if cor != None:
                    notifications["isPendingCashOut"] = True
                else:
                    notifications["isPendingCashOut"] = False
                notifications["pendingCashOutAmount"] = ninja.money_available
                toEcho = {
                    "success": True,
                    "data": data,
                    "notifications": notifications
                }

            elif action == "getMyStats":
                '''
				returns the user's statistics
				input	: uid
				output	: 
				'''
                logging.info('getMyStats')
                uid = enc.decrypt_key(decoded['in']['uid'])
                #get user information
                user = db.get(uid)
                #format user information
                data = user.get_stats()

                #get new notifications
                notifications = user.get_notifications()
                toEcho = {
                    "success": True,
                    "data": data,
                    "notifications": notifications
                }

            elif action == "checkRedeem":
                logging.info('checkRedeem')
                #grab corresponding deal
                uid = enc.decrypt_key(decoded['in']['uid'])
                dealID = enc.decrypt_key(decoded['in']['dealID'])

                #grab the customer
                customer = levr.Customer.get(uid)

                #new notifications?
                notifications = customer.get_notifications()
                #don't try and redeem the same deal twice. . .
                if str(dealID) in customer.redemptions:
                    toEcho = {
                        "success": False,
                        "data": {
                            "message": "You have already redeemed this deal."
                        },
                        "notifications": notifications
                    }
                else:
                    toEcho = {"success": True, "notifications": notifications}

                #!!!!!!!!REMOVE THIS WHEN CHECKING IS PUT BACK IN
#				toEcho = {"success":True,"notifications":notifications}

            elif action == "getRedeemScreen":
                logging.info('getRedeemScreen')
                #grab inputs
                dealID = enc.decrypt_key(decoded['in']['dealID'])

                #grab the deal
                deal = levr.Deal.get(dealID)

                #format the deal
                data = levr.phoneFormat(deal, 'dealsScreen')

                #echo
                toEcho = {"success": True, "data": data}

            elif action == "redeem":
                logging.info('redeem')
                #grab corresponding deal
                uid = enc.decrypt_key(decoded['in']['uid'])
                dealID = enc.decrypt_key(decoded['in']['dealID'])

                #grab the deal
                deal = levr.Deal.get(dealID)
                #grab the customer
                customer = levr.Customer.get(uid)

                #don't try and redeem the same deal twice. . .
                #				if dealID in customer.redemptions:
                #					raise Exception('Cannot redeem a deal more than once')
                #increment deal "redeemed" count by 1
                deal.count_redeemed += 1
                #add deal to "redeemed" for the customer
                customer.redemptions.append(dealID)
                ###get customer new_redemptions if they are a ninja
                notifications = customer.get_notifications()
                #update customer
                customer.put()

                #Is this a deal uploaded by a ninja? If so, do ninja things
                if type(deal) is levr.CustomerDeal:
                    #update deal ninjaStats
                    deal.gate_count = int(
                        math.floor(deal.count_redeemed /
                                   deal.gate_requirement))
                    if deal.gate_count > deal.gate_max:
                        #reset if over
                        deal.gate_count = deal.gate_max
                    #update deal.earned_total
                    difference = deal.update_earned_total()
                    #put deal
                    deal.put()
                    #get the ninja
                    ninjaKey = deal.key().parent()
                    ninja = levr.Customer.get(ninjaKey)

                    #update the ninja's earned amount
                    ninja.update_money_earned(difference)

                    #update the ninja's available amount
                    ninja.update_money_available(difference)

                    #notify the ninja of new redemptions
                    ninja.increment_new_redeem_count()

                    #echo stats
                    ninja.echo_stats()
                    deal.echo_stats()

                    #update ninja
                    ninja.put()
                else:
                    #deal is owned by a business - FOR THE FUTURE!
                    logging.info('Business!')
                    pass

                toEcho = {"success": True, "notifications": notifications}
            elif action == "cashOut":
                logging.info('cashOut')
                uid = enc.decrypt_key(decoded['in']['uid'])
                #				uid = 'ahNkZXZ-bGV2ci1wcm9kdWN0aW9ucg8LEghDdXN0b21lchiYAQw'
                #grab the ninja
                ninja = levr.Customer.get(uid)
                #delete any current cashOutRequests
                q = levr.CashOutRequest.gql(
                    'WHERE ANCESTOR IS :1 AND status=:2', ninja.key(),
                    'pending').fetch(None)
                for result in q:
                    result.delete()
                #create a new cashOut request
                cor = levr.CashOutRequest(parent=ninja)
                cor.amount = ninja.money_available
                cor.money_available_paytime = cor.amount
                #get notifications
                notifications = ninja.get_notifications()
                if cor.amount == 0:
                    toEcho = {
                        "success": False,
                        "data": {
                            "message":
                            "You need to earn something before you can cash out!",
                            "notifications": notifications
                        }
                    }
                else:
                    cor.status = 'pending'
                    cor.date_created = datetime.now()
                    cor.put()
                    toEcho = {"success": True, "notifications": notifications}

                    ## ====== SPOOF ACCEPTANCE FOR BETA TEST ====== ##

                    logging.debug(levr_utils.log_model_props(ninja))
                    logging.debug(levr_utils.log_model_props(cor))

                    #get corID
                    #get cor
                    #get the larger amount if money available at paytime is different
                    if cor.amount != cor.money_available_paytime:
                        amount = cor.money_available_paytime
                        cor.note = 'The money available at paytime was greater than when the COR was created, so the paytime balance was used.'
                    else:
                        amount = cor.amount
                    #get payment email
                    receiver_email = ninja.email

                    #set cor to "paid"
                    cor.status = "paid"
                    cor.date_paid = datetime.now()
                    cor.payKey = 'this is a pay key'

                    cor.put()

                    #for each deal, make paid_out == earned_total
                    q = levr.CustomerDeal.gql('WHERE ANCESTOR IS :1',
                                              ninja.key())
                    for deal in q:
                        deal.paid_out = deal.earned_total
                        deal.put()

                    #are number consistent?
                    logging.debug(cor.amount)
                    logging.debug(cor.money_available_paytime)
                    if cor.amount != cor.money_available_paytime:
                        #remember to encrypt the key if this is being used for anything
                        #other than just error logging
                        logging.error('PAY MISMATCH AT UID:' +
                                      ninja.key().__str__())
                        #send email here later

                    #set ninja money_available back to 0
                    ninja.money_available = 0.0

                    #increment money_paid for the customer
                    ninja.money_paid += amount

                    #update ninja
                    ninja.put()
                    logging.info('Payment completed!')
                    logging.debug(levr_utils.log_model_props(ninja))
                    logging.debug(levr_utils.log_model_props(cor))
                    #send email to the ninja confirming their cashout!
                    message = mail.EmailMessage(sender="LEVR <*****@*****.**>",
                                                subject="Levr Cash Out",
                                                to=receiver_email)
                    logging.debug(message)
                    body = 'Hey Beta Tester,\n\n'
                    body += "You submitted a request to be paid for uploading deals to the Levr platform.\n\n"
                    body += "If this were real life, this email would be letting you know that you were about to be paid via paypal an amount of $" + str(
                        amount) + ". "
                    body += "Unfortunately your reality is being simulated. "
                    body += "\n\nThanks for helping us test.\nSincerely,\nThe Levr Team"


#					#alt body for when not in beta
#					message = mail.EmailMessage(
#						sender	="LEVR <*****@*****.**>",
#						subject	="Levr Cash Out",
#						to		=receiver_email)
#					body = 'Hey '+ninja.alias+',\n\n'
#					body += "You have submitted a request to be paid for the deals that you've uploaded to Levr.\n\n"
#					body += "The amount you have requested is: $"+str(amount)+".\n\n"
#					body += "Your request is in the process of being reviewed. If accepted, we will send you an email with instructions to receive your payment via PayPal."
#					body += "\n\nSincerely,\nThe Levr Team"
#					message.body = body
#					logging.debug(body)
#					message.send()
#
            elif action == "getTargetedBusinesses":
                #get businesses that have property targeted = True
                logging.info('getTargetedBusinesses')
                businesses = levr.Business.all().filter(
                    'targeted =', True).order('-business_name').fetch(None)

                data = {'targetedBusinesses': []}

                for business in businesses:
                    data['targetedBusinesses'].append({
                        "businessName":
                        business.business_name,
                        "geoPoint":
                        str(business.geo_point),
                        "vicinity":
                        business.vicinity,
                        "businessID":
                        enc.encrypt_key(business.key())
                    })

                toEcho = {"success": True, "data": data}

            elif action == "fetchUploadURL":
                logging.info('fetchUploadURL')
                upload_url = blobstore.create_upload_url('/phone/uploadDeal')
                logging.debug(upload_url)
                toEcho = {"success": True, "data": {"url": upload_url}}

            elif action == "checkBounty":
                logging.info('fetchUploadURL')
                where = "College campuses in Boston, MA"
                what = "Offers on food, drink, clothing, and entertainment"
                toEcho = {
                    "success": True,
                    "data": {
                        "where": where,
                        "what": what
                    }
                }
            elif action == "reportDeal":
                #user reports a deal
                logging.info('reportDeal')
                uid = enc.decrypt_key(decoded['in']['uid'])
                dealID = enc.decrypt_key(decoded['in']['dealID'])

                #				uid = 'ahNkZXZ-bGV2ci1wcm9kdWN0aW9ucg8LEghDdXN0b21lchiRAQw'
                #				dealID = 'ahNkZXZ-bGV2ci1wcm9kdWN0aW9uchoLEghCdXNpbmVzcxiTAQwLEgREZWFsGJQBDA'
                #				dealID = 'ahNkZXZ-bGV2ci1wcm9kdWN0aW9uchoLEghDdXN0b21lchiSAQwLEgREZWFsGJUBDA'
                #				dateTime = enc.decrypt_key(decoded['in']['dateTime'])

                #create report Entity
                report = levr.ReportedDeal(uid=db.Key(uid),
                                           dealID=db.Key(dealID)).put()

                #get human readable info for email
                deal = levr.Deal.get(dealID)
                business = db.get(deal.businessID)
                business_name = business.business_name

                deal_text = deal.deal_text
                user = levr.Customer.get(uid)
                alias = user.display_name

                logging.debug(report)

                #send notification via email
                message = mail.EmailMessage(
                    sender="LEVR AUTOMATED <*****@*****.**>",
                    subject="New Reported Deal",
                    to="*****@*****.**")

                logging.debug(message)
                body = 'New Reported Deal\n\n'
                body += 'reporter uid: ' + str(uid) + "\n\n"
                body += 'reporter display_name: ' + str(alias) + "\n\n"
                body += 'Business name: ' + str(business_name) + "\n\n"
                body += 'Business vicinity: ' + str(business.vicinity) + "\n\n"
                body += "Deal: " + str(deal_text) + "\n\n"
                body += "dealID: " + str(dealID) + "\n\n"
                message.body = body
                logging.debug(message.body)
                message.send()

                notifications = user.get_notifications()
                toEcho = {"success": True, "notifications": notifications}
            elif action == 'ninjaHasShared':
                logging.info(action)
                uid = enc.decrypt_key(decoded['in']['uid'])
                dealID = enc.decrypt_key(decoded['in']['dealID'])

                keys = [dealID, uid]
                logging.debug(keys)
                #pull deal and user
                entities = db.get(keys)
                deal = entities[0]
                user = entities[1]

                logging.debug(
                    levr_utils.log_model_props(deal, [
                        'deal_text', 'business_name', 'gate_max',
                        'has_been_shared'
                    ]))

                deal.share_deal()
                deal.put()

                logging.debug(
                    levr_utils.log_model_props(
                        deal, ['gate_max', 'has_been_shared']))

                notifications = user.get_notifications()
                toEcho = {"success": True, "notifications": notifications}
            else:
                raise Exception('Unrecognized action')
Example #8
0
	def post(self):
		#get uploaded image
		upload = self.get_uploads()[0]
#		upload = self.request.get('img')
#		upload = blobstore.Blob(upload)
		blob_key= upload.key()
		img_key = blob_key
		logging.info(upload)
		
		
		
#		ethan = pat = alonso = ninja = False
		# new customer
		ethan = levr.Customer.all(keys_only=True).filter('email','*****@*****.**').get()
		levr_token = 'tlvXNw9F5Qgnqm_uKxYUx9xeyJHSRDnfBbVmUwvDWzQ'
		if not ethan:
			ethan = levr.Customer(levr_token = levr_token)
			ethan.email	= '*****@*****.**'
			ethan.pw 	= enc.encrypt_password('ethan')
			ethan.alias	= 'ethan owns the deals'
			ethan.favorites	= []
			ethan.tester = True
			ethan.levr_token = 'tlvXNw9F5Qgnqm_uKxYUx9xeyJHSRDnfBbVmUwvDWzQ'
#			ethan.foursquare_id = 37756769
			ethan.foursquare_token = 'IDMTODCAKR34GOI5MSLEQ1IWDJA5SYU0PGHT4F5CAIMPR4CR'
#			ethan.twitter_token = '819972614-2HoAwfJcHCOePogonjPbNNxuQQsvHeYeJ3U2KasI'
			ethan.twitter_screen_name = 'LevrDevr'
			ethan.twitter_id	= 819972614
			ethan = ethan.put()
		'AAACEdEose0cBANvf0FVOdH0NpoqLDZCnt8ZAlVfiYqe90CH1S7rOAEZC7ZChI340ElsX0bYXXOZC1Ks1kWU4JmsGMpUWzp7fm6CfIHKdXwN4ZAvVCFfGMa'
		pat = levr.Customer.all(keys_only=True).filter('email','*****@*****.**').get()
		if not pat:
			pat = levr.Customer(levr_token = levr_token)
			pat.email	= '*****@*****.**'
			pat.pw 	= enc.encrypt_password('patrick')
			pat.alias	= 'patrick'
			pat.favorites	= []
			pat.tester = True
			pat.levr_token = 'tlvXNw9F5Qgnqm_uKxYUx9xeyJHSRDnfBbVmUwvDWzQ'
#			pat.foursquare_id = 22161113
			pat.foursquare_token = 'ML4L1LW3SO0SKUXLKWMMBTSOWIUZ34NOTWTWRW41D0ANDBAX'
#			pat.twitter_friends_by_sn = ['LevrDevr']
			pat = pat.put()
		
		
		alonso = levr.Customer.all(keys_only=True).filter('email','*****@*****.**').get()
		if not alonso:
			alonso = levr.Customer(levr_token = levr_token)
			alonso.email	= '*****@*****.**'
			alonso.pw 	= enc.encrypt_password('alonso')
			alonso.alias	= 'alonso'
			alonso.favorites	= []
#			alonso.foursquare_token = '4PNJWJM0CAJ4XISEYR4PWS1DUVGD0MKFDMC4ODL3XGU115G0'
			alonso.tester = True
			
			alonso.levr_token = 'tlvXNw9F5Qgnqm_uKxYUx9xeyJHSRDnfBbVmUwvDWzQ'
#			alonso.foursquare_id = 32773785
			alonso.foursquare_token = 'RGTMFLSGVHNMZMYKSMW4HYFNEE0ZRA5PTD4NJE34RHUOQ5LZ'
			
			alonso = alonso.put()
		
		ninja = levr.Customer.all(keys_only=True).filter('email','*****@*****.**').get()
		if not ninja:
			ninja = levr.Customer(levr_token = levr_token)
			ninja.email	= '*****@*****.**'
			ninja.pw 	= enc.encrypt_password('santa')
			ninja.alias	= 'Followed'
			ninja.favorites = []
			ninja.tester = True
			ninja.levr_token = 'tlvXNw9F5Qgnqm_uKxYUx9xeyJHSRDnfBbVmUwvDWzQ'
			ninja = ninja.put()
			
			
		
		
		
		params = {
					'uid'				: ethan,
					'business_name'		: 'Als Sweatshop',
					'geo_point'			: levr.geo_converter('42.343880,-71.059570'),
					'vicinity'			: '10 Buick St',
					'types'				: 'Establishment,Food',
					'deal_description'	: 'This is a description gut guts who why when you buy a shoe with feet',
					'deal_line1'		: 'I am a deal',
					'distance'			: '10', #is -1 if unknown = double
					'development'		: True,
					'img_key'			: img_key
					}

		levr.dealCreate(params,'phone_new_business')
		
		params = {
					'uid'				: ethan,
					'business_name'		: 'Als Sweatshop 2',
					'geo_point'			: levr.geo_converter('42.343879999999999, -71.059569999999994'),
					'vicinity'			: '10 Buick St',
					'types'				: 'Establishment,Food',
					'deal_description'	: 'This is a description gut guts who why when you buy a shoe with feet',
					'deal_line1'		: 'I am a deal',
					'distance'			: '10', #is -1 if unknown = double
					'development'		: True,
					'img_key'			: img_key
					}
		
		deal = levr.dealCreate(params,'phone_new_business')
		p = db.get(pat)
		p.upvotes.append(deal.key())
		p.put()
		params = {
					'uid'				: ethan,
					'business_name'		: 'Als Sweatshop',
					'geo_point'			: levr.geo_converter('42.343880,-71.059575'),
					'vicinity'			: '10 Buick St',
					'types'				: 'Establishment,Food',
					'deal_description'	: 'This is a description gut guts who why when you buy a shoe with feet',
					'deal_line1'		: 'I am a deal',
					'distance'			: '10', #is -1 if unknown = double
					'development'		: True,
					'img_key'			: img_key
					}
		
		deal = levr.dealCreate(params,'phone_new_business')
		
		bus = levr.Business.gql('WHERE business_name=:1','Als Sweatshop').get()
		
		ant = levr.Customer.get(ethan)
		
		ant.owner_of = str(bus.key())
		ant.put()
		a = db.get(alonso)
		a.upvotes.append(deal.key())
		a.put()
		
		
		self.redirect('/new/test')
Example #9
0
	def post(self):
		#decode the input JSON and pull out the action parameter
		try:
			decoded = json.loads(self.request.body)
			action = decoded["action"]
			logging.info(action)
			try:
				uid	= enc.decrypt_key(decoded["in"]["uid"])
				user = levr.Customer.get(uid)
				logging.debug(levr_utils.log_model_props(user,['alias','email']))
			except Exception, e:
#				logging.debug(uid)
				logging.debug(e)
					
			#switch action
			#***************signup************************************************
			if action == "signup":
				logging.info('signup')
				#grab email/password from request body
				email = decoded["in"]["email"]
				alias = decoded["in"]["alias"]
				pw = decoded["in"]["pw"]
				toEcho = levr_utils.signupCustomer(email,alias,pw)
		
			#***************login*************************************************
			elif action == "login":
				logging.info('login')
			#grab email/password from request body
				email_or_owner = decoded["in"]["email_or_owner"]
				pw = decoded["in"]["pw"]
				
				toEcho = levr_utils.loginCustomer(email_or_owner,pw)
			
			#***************dealResults************************************************
			elif action == "popularItems":
				logging.info('popularItems')
				lat = decoded['in']['latitude']
				lon = decoded['in']['longitude']
				
				request_point = levr.geo_converter(str(lat)+","+str(lon))
				
				#get all deals in the area
				deals = levr_utils.get_deals_in_area(['all'],request_point)
				
				#compile a list of all of the tags
				tags = []
				for deal in deals:
					tags.extend(list(set(deal.tags)))
				tags.sort()
				logging.debug(tags)
				
				
				
				#convert list of all tags to a dict of key=tag, val=frequency
				count = {}
				for tag in tags:
#					logging.debug(tag in count)
					if tag in count:
						count[tag] += 1
					else:
						count[tag] = 1
						
				#DEBUG
				#convert dict of tag:freq into list of tuples
				tuple_list1 = []
				for key in count:
					tuple_list1.append((count[key],key))
				tuple_list1.sort()
				tuple_list1.reverse()
				logging.debug(tuple_list1)
				#/DEBUG
				
				#remove unwanted stuff
				new_count = {}
				for tag in count:
					#search occurs more than once
					if count[tag] >1:
						#tag is not a number
						if tag.isdigit() == False:
							#tag is not in blacklist
							if tag not in blacklist:
								new_count[tag] = count[tag]
					
#				logging.debug(levr_utils.log_dict(count))

				
				#convert dict of tag:freq into list of tuples
				tuple_list = []
				for key in new_count:
					tuple_list.append((new_count[key],key))
				tuple_list.sort()
				tuple_list.reverse()
				
				logging.debug(tuple_list)
#				for i in tuple_list:
#					logging.debug(i)
				
				#select only the most popular ones, and convert to list
				word_list = [x[1] for x in tuple_list]
				
				
				#if the popular items list is longer than 6, send entire list, else only send 6
				logging.debug(word_list.__len__())
				if word_list.__len__()<6:
					popularItems = word_list
				else:
					popularItems = word_list[:6]
				
				
				data = {
					'popularItems' : popularItems
					}
				toEcho = {'success': True,'data':data}
			
			elif action == "dealResults":
				logging.info('dealResults')
				logging.info(decoded['in'])
				#grab primaryCat from the request body
				primaryCat 	= decoded["in"]["primaryCat"]
					#search term
#				start 		= decoded["in"]["start"]
					#starting index of search results
					#!!!not used
				numResults 	= decoded["in"]["size"]
				geo_point	= decoded["in"]["geoPoint"]
				try:
					precision = int(decoded['in']['precision'])
				except:
					precision = 5
				
				logging.debug(numResults)
					#length of search results list
					#should be None if we want all results
				
				
				#normalize search query
				primaryCat = primaryCat.lower()
				
				###filter by location - get neighborhoods
				request_point = levr.geo_converter(geo_point)
				
				#normalize search query
				primaryCat = primaryCat.lower()
				#otherwise, search based on the tags
				tags = levr.tagger(primaryCat)
				logging.debug(tags)
				
				#batch get results. here is where we would set the number of results we want and the offset
				results = levr_utils.get_deals_in_area(tags,request_point,precision)
				
				
				
				#define an empty "dealResults" LIST, and initialize the counter to 0
				#initialize isEmpty to 1
				isEmpty = True
				dealResults = []
				#iterate over the results
				#Want to grab deal information for each category
				for result in results:
#					logging.info('Rank: ' + str(result.rank))
					#break if results limit is hit
					isEmpty = False
					#trade an object for a phone-formatted dictionary
					deal = levr.phoneFormat(result,'list',primaryCat)
					#indicate that this is not a sentinel
					deal['isSentinel'] = False
					logging.debug(result.geo_hash)
					#push the whole dictionary onto a list
					dealResults.append(deal)
					#increment the counter
#					resultsPushed += 1
				logging.debug(dealResults.__len__())
				
				##debug
#				deals = levr.Deal.all().fetch(None)
#				for d in deals:
#					logging.debug(d.geo_hash)
				
				
#				############OLD
#				#normalize search query
#				primaryCat = primaryCat.lower()
#				
#				
#				#build search query
#				q = levr.Deal.all()
#				
#				logging.debug("total number of deals: "+str(q.count()))
#				#only active deals
#				q.filter('deal_status','active')
#				#primaryCat will be mapresults to return everything
#				if primaryCat == 'all':
#					#get all deals - no filter
#					logging.debug('all')
#				else:
#					logging.debug('not all')
#					#normalize search query
#					primaryCat = primaryCat.lower()
#					#otherwise, search based on the tags
#					tags = levr.tagger(primaryCat)
#					logging.debug(tags)
#					#grab all deals where primary_cat is in tags
#					for tag in tags:
#						logging.debug('tag: '+str(tag))
#						q.filter('tags =',tag)
#				
#				###filter by location
#				request_point = levr.geo_converter(geo_point)
#				request_point = levr.geo_converter('42.35,-71.110')
#				center_hash = geohash.encode(request_point.lat,request_point.lon,precision=6)
#				hash_set = geohash.expand(center_hash)
#				
#				#get keys of all corresponding deals
#				deal_keys = []
#				for query_hash in hash_set:
#					q.filter('geo_hash >=',query_hash) #min bound
#					q.filter('geo_hash <=',query_hash+"{") #max bound
#					deal_keys.extend(q.fetch(None))
#				
#				#batch get results. here is where we would set the number of results we want and the offset
#				results = levr.Deal.get(deal_keys)
#				logging.debug
#				#define an empty "dealResults" LIST, and initialize the counter to 0
#				#initialize isEmpty to 1
#				isEmpty = True
#				#iterate over the results
#				#Want to grab deal information for each category
#				for result in results:
##					logging.info('Rank: ' + str(result.rank))
#					#break if results limit is hit
#					isEmpty = False
#					#trade an object for a phone-formatted dictionary
#					deal = levr.phoneFormat(result,'list',primaryCat)
#					#indicate that this is not a sentinel
#					deal['isSentinel'] = False
#					#push the whole dictionary onto a list
#					dealResults.append(deal)
#					#increment the counter
##					resultsPushed += 1
#				###########################/OLD


#				#if isempty is true, send back suggested searches instead
#				if isEmpty == False:
#					dealResults.append({"isSentinel":True})
#		
#				#go get (all) suggested searches
#				q = levr.EmptySetResponse.all()
#				#sory by index
#				q.order('index')
#				#loop through and append to data
#				for result in q:
#					searchObj = {"isSentinel":False,
#								"primaryCat":result.primary_cat,
#								"imgURL": levr_utils.URL+"/phone/img?size=emptySet&dealID=" + enc.encrypt_key(result.key())
#					} 
#					#push to stack
#					dealResults.append(searchObj)
				#get notifications
#				ninja = levr.Customer.get(uid)
#				notifications = ninja.get_notifications()

				#add boundary
				lon = [-71.13128751569184, -71.13747576487495, -71.13221920314751, -71.1315606660475, -71.1309193072284, -71.1297731686955, -71.12886527141396, -71.12773981063141, -71.12726203628873, -71.1216289071829, -71.12121164180434, -71.10497418088163, -71.1040140000405, -71.10267756839711, -71.0946922485677, -71.09243243954906, -71.09227823963506, -71.0950832349529, -71.097815779737, -71.11251814985596, -71.11356954283684, -71.11706884229781, -71.11779512636194, -71.11965434764042, -71.12212678446998, -71.12626327632834, -71.13026582412857]
				lat = [42.35604793867138, 42.3536306062291, 42.35301975662632, 42.35130590336475, 42.35025979303107, 42.34889896173047, 42.3474035881804, 42.34587017442897, 42.3454410032402, 42.34240376898205, 42.34200386027403, 42.34665152547006, 42.34437686280481, 42.34335156373593, 42.34544719585433, 42.34689842049458, 42.35112647889721, 42.35062769794382, 42.35071497934108, 42.35189268933054, 42.35225746246078, 42.35405913476999, 42.35424633071435, 42.35461863217454, 42.35493709975472, 42.35550741935002, 42.35597048179658]
				
				boundary = {"lat":lat,
							"lon":lon}
				
				if primaryCat == 'all':
					#echo back data - include boundary
					toEcho = {"success":True,"data":dealResults,"isEmpty":isEmpty,"boundary":boundary}#,"notifications":notifications}
				else:
					toEcho = {"success":True,"data":dealResults,"isEmpty":isEmpty}#,"notifications":notifications}
			#***************getUserFavs************************************************
			elif action == "getUserFavs":
				'''
				Grabs all of the favorites of a user - only data to show on list
				input : uid
				output: name, description, dealValue, dealType, imgPath, businessName, primaryCat
				'''
				logging.info('getUserFavs')
				#grab inputs
				uid	= enc.decrypt_key(decoded["in"]["uid"])
				logging.debug(uid)
				logging.debug(decoded["in"]["uid"])
				#grab user entity
				user	= levr.Customer.get(uid)
				
				#grab list of favorties - list of deal keys
				favorites	= user.favorites
				logging.debug(favorites)
				
				#batch grab favorited deals
				deals	= levr.Deal.get(favorites)
				logging.debug(deals)
				
				#format deals for output to phone
				formatted_deals = []
				for deal in deals:
					try:
						formatted_deals.append(levr.phoneFormat(deal,'list'))
					except:
						logging.warning('deal exists in favorites but was removed from the db')
						logging.warning(deal)
#				formatted_deals	= [levr.phoneFormat(deal,'list') for deal in deals]
				
				#assign formatted deals to data list that doesnt follow standards
				data = formatted_deals
				
				#get notifications
				notifications = user.get_notifications()
				
				#output
				toEcho = {"success":True,"data":data,'notifications':notifications}
			#ADD FAVORITE***********************************************************
			elif action == "addFav":
				'''
				User pressed add favorite button = add favorite mapping
				input: dealID,uid,primaryCat
				output: success = bool
				'''
				logging.info('addFav')
				#get inputs
				uid 		= enc.decrypt_key(decoded["in"]["uid"])
				dealID 		= enc.decrypt_key(decoded["in"]["dealID"])
				
				#get user entity
				user		= levr.Customer.get(uid)
				
				#append dealID to favorites property
				user.favorites.append(db.Key(dealID))
				logging.debug(user.favorites)
#				
				#get notifications
				notifications = user.get_notifications()
				
				#close entity
				user.put()
				
				#output
				toEcho = {"success":True,"notifications":notifications}
			#DELETE FAVORITE********************************************************
			elif action == "delFav":
				'''
				User presses delete favorite button - delete favorite mapping
				input: dealID,uid,primaryCat
				output: success = bool
				'''
				logging.info('delFav')
				#get inputs
				uid 	= enc.decrypt_key(decoded["in"]["uid"])
				dealID 	= enc.decrypt_key(decoded["in"]["dealID"])
				deal_to_delete	= db.Key(dealID)
				logging.debug(deal_to_delete)
				
				#get user entity
				user	= levr.Customer.get(uid)
				logging.debug(levr_utils.log_model_props(user))
				
				#grab favorites list
				favorites	= user.favorites
				logging.debug(favorites)
				
				#generate new favorites list without requested dealID
				new_favorites	= [deal for deal in favorites if deal != deal_to_delete]
				logging.debug(new_favorites)
				
				#reassign user favorites to new list
				user.favorites	= new_favorites
				logging.debug(user.favorites)
				
				#get notifications
				notifications = user.get_notifications()
				
				#close entity
				user.put()
				
				toEcho = {"success":True,"notificaions":notifications}
			#***************getOneDeal************************************************
			elif action == "getOneDeal":
				'''
				Information to show on the deal information screen.
				input	: primaryCat,dealID
				output	: json object of all information necessary to describe deal
				'''
				logging.info('getOneDeal')
				#grab input dealID
				dealID 		= enc.decrypt_key(decoded["in"]["dealID"])
				primary_cat = decoded["in"]["primaryCat"]
				#fetch deal
				result = levr.Deal.get(dealID)
				#convert fetched deal into dictionary
				deal = levr.phoneFormat(result,'deal')
				#push the primary onto the dictionary
				deal.update({"primaryCat":primary_cat})
				#echo back success!
				
#				#get notifications
#				ninja = levr.Customer.get(uid)
#				notifications = ninja.get_notifications()
				toEcho = {"success":True,"data":deal}#,"notificaions":notifications}

			elif action == "getMyDeals":
				'''
				returns all of the deals that were uploaded by the ninja
				input	: uid
				output	: list of deal objects
				'''
				logging.info('getMyDeals')
				uid	= enc.decrypt_key(decoded["in"]["uid"])
				logging.debug("encrypted uid: "+str(decoded["in"]["uid"]))
				logging.debug("uid: "+str(uid))
				#grab all deal children of the user
				deals = levr.CustomerDeal.gql("WHERE ANCESTOR IS :1 ORDER BY date_uploaded DESC",uid).fetch(None)
				logging.debug(deals)
				#format CUSTOMER deals
				data = [levr.phoneFormat(x,'myDeals') for x in deals]
				#I believe this will just return data:None if deals is empty
				
				#flush their notifications
				ninja = levr.Customer.get(uid)
				
#				ninja.flush_new_redeem_count()
#				ninja.put()
				#get new notifications
				notifications = ninja.get_notifications()
				
				#Grab their cash out requests, if they exist
				cor_q = levr.CashOutRequest.gql("WHERE ANCESTOR IS :1 AND status=:2",uid,'pending')
				cor = cor_q.get()
				if cor != None:
					notifications["isPendingCashOut"] = True
				else:
					notifications["isPendingCashOut"] = False
				notifications["pendingCashOutAmount"] = ninja.money_available
				toEcho = {"success":True,"data":data,"notifications":notifications}
				
			elif action == "getMyStats":
				'''
				returns the user's statistics
				input	: uid
				output	: 
				'''
				logging.info('getMyStats')
				uid = enc.decrypt_key(decoded['in']['uid'])
				#get user information
				user = db.get(uid)
				#format user information
				data = user.get_stats()
				
				#get new notifications
				notifications = user.get_notifications()
				toEcho = {"success":True,"data":data,"notifications":notifications}
				
			elif action == "checkRedeem":
				logging.info('checkRedeem')
				#grab corresponding deal
				uid 	= enc.decrypt_key(decoded['in']['uid'])
				dealID 	= enc.decrypt_key(decoded['in']['dealID'])
				
				#grab the customer
				customer = levr.Customer.get(uid)
				
				#new notifications?
				notifications = customer.get_notifications()
				#don't try and redeem the same deal twice. . .
				if str(dealID) in customer.redemptions:
					toEcho = {"success":False,"data":{"message":"You have already redeemed this deal."},"notifications":notifications}
				else:
					toEcho = {"success":True,"notifications":notifications}
				
				#!!!!!!!!REMOVE THIS WHEN CHECKING IS PUT BACK IN	
#				toEcho = {"success":True,"notifications":notifications}
				
			elif action == "getRedeemScreen":
				logging.info('getRedeemScreen')
				#grab inputs
				dealID 	= enc.decrypt_key(decoded['in']['dealID'])
				
				#grab the deal
				deal = levr.Deal.get(dealID)
				
				#format the deal
				data = levr.phoneFormat(deal,'dealsScreen')
				
				#echo
				toEcho = {"success":True,"data":data}
			
			elif action == "redeem":
				logging.info('redeem')
				#grab corresponding deal
				uid 	= enc.decrypt_key(decoded['in']['uid'])
				dealID 	= enc.decrypt_key(decoded['in']['dealID'])
				
				#grab the deal
				deal = levr.Deal.get(dealID)
				#grab the customer
				customer = levr.Customer.get(uid)
				
				#don't try and redeem the same deal twice. . .
#				if dealID in customer.redemptions:
#					raise Exception('Cannot redeem a deal more than once')
				#increment deal "redeemed" count by 1
				deal.count_redeemed += 1
				#add deal to "redeemed" for the customer
				customer.redemptions.append(dealID)
				###get customer new_redemptions if they are a ninja
				notifications = customer.get_notifications()
				#update customer
				customer.put()
				
				#Is this a deal uploaded by a ninja? If so, do ninja things
				if type(deal) is levr.CustomerDeal:
					#update deal ninjaStats
					deal.gate_count = int(math.floor(deal.count_redeemed / deal.gate_requirement))
					if deal.gate_count > deal.gate_max:
						#reset if over
						deal.gate_count = deal.gate_max
					#update deal.earned_total
					difference = deal.update_earned_total()
					#put deal
					deal.put()
					#get the ninja
					ninjaKey = deal.key().parent()
					ninja = levr.Customer.get(ninjaKey)
					
					#update the ninja's earned amount
					ninja.update_money_earned(difference)
					
					#update the ninja's available amount
					ninja.update_money_available(difference)
					
					#notify the ninja of new redemptions
					ninja.increment_new_redeem_count()
					
					#echo stats
					ninja.echo_stats()
					deal.echo_stats()

					#update ninja
					ninja.put()
				else:
					#deal is owned by a business - FOR THE FUTURE!
					logging.info('Business!')
					pass	
			
				toEcho = {"success":True,"notifications":notifications}
			elif action == "cashOut":
				logging.info('cashOut')
				uid = enc.decrypt_key(decoded['in']['uid'])
#				uid = 'ahNkZXZ-bGV2ci1wcm9kdWN0aW9ucg8LEghDdXN0b21lchiYAQw'
				#grab the ninja
				ninja = levr.Customer.get(uid)
				#delete any current cashOutRequests
				q = levr.CashOutRequest.gql('WHERE ANCESTOR IS :1 AND status=:2',ninja.key(),'pending').fetch(None)
				for result in q:
					result.delete()
				#create a new cashOut request
				cor = levr.CashOutRequest(parent=ninja)
				cor.amount = ninja.money_available
				cor.money_available_paytime = cor.amount
				#get notifications
				notifications = ninja.get_notifications()
				if cor.amount == 0:
					toEcho = {"success":False,"data":{"message":"You need to earn something before you can cash out!","notifications":notifications}}
				else:
					cor.status = 'pending'
					cor.date_created = datetime.now()
					cor.put()
					toEcho = {"success":True,"notifications":notifications}
				
				
				
				
				
				
					## ====== SPOOF ACCEPTANCE FOR BETA TEST ====== ##
				
				
				
				
				
					logging.debug(levr_utils.log_model_props(ninja))
					logging.debug(levr_utils.log_model_props(cor))
					
					#get corID
					#get cor
					#get the larger amount if money available at paytime is different
					if cor.amount != cor.money_available_paytime:
						amount = cor.money_available_paytime
						cor.note = 'The money available at paytime was greater than when the COR was created, so the paytime balance was used.'
					else:
						amount = cor.amount
					#get payment email
					receiver_email = ninja.email
				
					#set cor to "paid"
					cor.status = "paid"
					cor.date_paid = datetime.now()
					cor.payKey = 'this is a pay key'
				
					cor.put()
				
					#for each deal, make paid_out == earned_total
					q = levr.CustomerDeal.gql('WHERE ANCESTOR IS :1',ninja.key())
					for deal in q:
						deal.paid_out = deal.earned_total
						deal.put()
				
					#are number consistent?
					logging.debug(cor.amount)
					logging.debug(cor.money_available_paytime)
					if cor.amount != cor.money_available_paytime:
						#remember to encrypt the key if this is being used for anything
						#other than just error logging
						logging.error('PAY MISMATCH AT UID:' + ninja.key().__str__())
						#send email here later
				
					#set ninja money_available back to 0
					ninja.money_available = 0.0
				
					#increment money_paid for the customer
					ninja.money_paid += amount
					
					#update ninja
					ninja.put()
					logging.info('Payment completed!')
					logging.debug(levr_utils.log_model_props(ninja))
					logging.debug(levr_utils.log_model_props(cor))
					#send email to the ninja confirming their cashout!
					message = mail.EmailMessage(
						sender	="LEVR <*****@*****.**>",
						subject	="Levr Cash Out",
						to		=receiver_email)
					logging.debug(message)
					body = 'Hey Beta Tester,\n\n'
					body += "You submitted a request to be paid for uploading deals to the Levr platform.\n\n"
					body += "If this were real life, this email would be letting you know that you were about to be paid via paypal an amount of $"+str(amount)+". "
					body += "Unfortunately your reality is being simulated. "
					body += "\n\nThanks for helping us test.\nSincerely,\nThe Levr Team"
					
#					#alt body for when not in beta
#					message = mail.EmailMessage(
#						sender	="LEVR <*****@*****.**>",
#						subject	="Levr Cash Out",
#						to		=receiver_email)
#					body = 'Hey '+ninja.alias+',\n\n'
#					body += "You have submitted a request to be paid for the deals that you've uploaded to Levr.\n\n"
#					body += "The amount you have requested is: $"+str(amount)+".\n\n"
#					body += "Your request is in the process of being reviewed. If accepted, we will send you an email with instructions to receive your payment via PayPal."
#					body += "\n\nSincerely,\nThe Levr Team"
#					message.body = body
#					logging.debug(body)
#					message.send()
#				
			elif action == "getTargetedBusinesses":
				#get businesses that have property targeted = True
				logging.info('getTargetedBusinesses')
				businesses = levr.Business.all().filter('targeted =',True).order('-business_name').fetch(None)
				
				data = {
					'targetedBusinesses':[]
					}
				
				for business in businesses:
					data['targetedBusinesses'].append({
						"businessName"	: business.business_name,
						"geoPoint"		: str(business.geo_point),
						"vicinity"		: business.vicinity,
						"businessID"	: enc.encrypt_key(business.key())
					})
				
				toEcho = {"success":True,"data":data}
			
			elif action == "fetchUploadURL":
				logging.info('fetchUploadURL')
				upload_url = blobstore.create_upload_url('/phone/uploadDeal')
				logging.debug(upload_url)
				toEcho = {"success":True, "data":{"url":upload_url}}

			elif action == "checkBounty":
				logging.info('fetchUploadURL')
				where = "College campuses in Boston, MA"
				what = "Offers on food, drink, clothing, and entertainment"
				toEcho = {"success":True,"data":{"where":where,"what":what}}
			elif action == "reportDeal":
				#user reports a deal
				logging.info('reportDeal')
				uid = enc.decrypt_key(decoded['in']['uid'])
				dealID = enc.decrypt_key(decoded['in']['dealID'])
				
#				uid = 'ahNkZXZ-bGV2ci1wcm9kdWN0aW9ucg8LEghDdXN0b21lchiRAQw'
#				dealID = 'ahNkZXZ-bGV2ci1wcm9kdWN0aW9uchoLEghCdXNpbmVzcxiTAQwLEgREZWFsGJQBDA'
#				dealID = 'ahNkZXZ-bGV2ci1wcm9kdWN0aW9uchoLEghDdXN0b21lchiSAQwLEgREZWFsGJUBDA'
#				dateTime = enc.decrypt_key(decoded['in']['dateTime'])

				#create report Entity
				report = levr.ReportedDeal(
										uid = db.Key(uid),
										dealID = db.Key(dealID)
										).put()
				
				#get human readable info for email
				deal = levr.Deal.get(dealID)
				business_name = deal.business_name
				logging.debug(business_name)
				
				if deal.deal_type == "single":
					deal_text = deal.deal_text
				else:
					deal_text = deal.deal_text +" with purchase of "+deal.secondary_name
				
				user = levr.Customer.get(uid)
				alias = user.alias
				
				deal_class = str(deal.class_name())
				if deal_class == 'CustomerDeal':
					deal_kind = "Ninja Deal"
				elif deal_class == 'Deal':
					deal_kind = "Business Deal"
				else:
					raise ValueError('deal class_name not recognized')
				
				logging.debug(report)
				
				#send notification via email
				message = mail.EmailMessage(
					sender	="LEVR AUTOMATED <*****@*****.**>",
					subject	="New Reported Deal",
					to		="*****@*****.**")
				
				logging.debug(message)
				body = 'New Reported Deal\n\n'
				body += 'reporter uid: '  +str(uid)+"\n\n"
				body += 'reporter alias: ' +str(alias)+"\n\n"
				body += 'Business name: '+str(business_name)+"\n\n"
				body += "Deal: "+str(deal_text)+"\n\n"
				body += "Deal Kind: "+deal_kind+"\n\n"
				body += "dealID: "+str(dealID)+"\n\n"
				message.body = body
				logging.debug(message.body)
				message.send()
				
				notifications = user.get_notifications()
				toEcho = {"success":True,"notifications":notifications}
			elif action == 'ninjaHasShared':
				logging.info(action)
				uid = enc.decrypt_key(decoded['in']['uid'])
				dealID = enc.decrypt_key(decoded['in']['dealID'])
				
				
				keys = [dealID,uid]
				logging.debug(keys)
				#pull deal and user
				entities = db.get(keys)
				deal = entities[0]
				user = entities[1]
				
				logging.debug(levr_utils.log_model_props(deal,['deal_text','business_name','gate_max','has_been_shared']))
				
				deal.share_deal()
				deal.put()
				
				logging.debug(levr_utils.log_model_props(deal,['gate_max','has_been_shared']))

				
				notifications = user.get_notifications()
				toEcho = {"success":True,"notifications":notifications}
			else:
				raise Exception('Unrecognized action')
Example #10
0
	def post(self):
			#A business owner is signing up in the tour
		try:
			logging.debug(self.request.headers)
			logging.debug(self.request.body)
			logging.debug(self.request.params)
			
			owner = levr.BusinessOwner(
				#create owner with contact info, put and get key
				email			=self.request.get('email'),
				pw				=enc.encrypt_password(self.request.get('password')),
				validated		=False
				).put()
			logging.debug(owner)
			
			#get the business info from the form
			business_name	= self.request.get('business_name')
			geo_point		= levr.geo_converter(self.request.get('geo_point'))
			vicinity		= self.request.get('vicinity')
			types			= self.request.get_all('types[]')
			
			#parse business name to create an upload email
			logging.debug(business_name)
			name_str = levr.tagger(business_name)
			logging.debug(name_str)
			#create unique identifier for the business
			if name_str[0] == 'the' or name_str[0] == 'a' or name_str[0] == 'an':
				#dont like the word the in front
				logging.debug('flag the!')
				identifier = ''.join(name_str[1:3])
			else:
				identifier = ''.join(name_str[:2])
			upload_email = "u+"+identifier+"@levr.com"
			
			#check if that already exists
			num = levr.Business.all().filter('upload_email =',upload_email).count()
			
			logging.debug(num)
			if num != 0:
				#a business already exists with that upload email
				#increment the 
				upload_email = "u+"+identifier+str(num)+"@levr.com"
			
			logging.debug(upload_email)
			
			#check if business exists in database
			business = levr.Business.all().filter('business_name =', business_name).filter('vicinity =',vicinity).get()
			logging.debug(business)
			
			if business:
				logging.debug(levr_utils.log_model_props(business))
				logging.debug(owner)
				logging.debug(upload_email)
				logging.debug('flag business already exists')
				#have to delete business entity instead of update because gae wont update reference on owner entity
				if business.owner == None:
					#grab this business! 
					business.owner	= owner
					upload_email	= upload_email
					#TODO targeted will be set to false in the future, removing signed businesses from the ninja pool
#					targeted		= False
				else:
#					db.delete(business)
					logging.error('A business owner just signed up claiming a business that another person has claimed')
			else:
				logging.debug('flag business does not exist')
			
				#create business entity
				business = levr.Business(
					#create business
					owner			=owner,
					business_name	=business_name,
					vicinity		=vicinity,
					geo_point		=geo_point,
					types			=types,
					upload_email	=upload_email
					#TODO targeted will be set to false in the future, removing signed businesses from the ninja pool
#					targeted		=False
					)
			logging.debug(levr_utils.log_model_props(business))
			business.put()
			
			#creates new session for the new business
			session = get_current_session()
			session['ownerID']	= enc.encrypt_key(owner)
			session['loggedIn']	= True
			session['validated']= False
			logging.debug(session)


			#send email to pat so that he will know that there is a new business.
			message = mail.EmailMessage(
				sender	="LEVR AUTOMATED <*****@*****.**>",
				subject	="New Merchant signup",
				to		="*****@*****.**")
			logging.debug(message)
			body = 'New merchant\n\n'
			body += 'Business: '  +str(business_name)+"\n\n"
			body += 'Business ID: '+str(business)+"\n\n"
			body += "Owner Email:"+str(self.request.get('email'))+"\n\n"
			message.body = body
			message.send()


			#forward to appropriate page
			if self.request.get('destination') == 'upload':
				self.redirect('/merchants/upload')
			elif self.request.get('destination') == 'create':
				self.redirect('/merchants/deal')
		except:
			levr.log_error(self.request.body)
Example #11
0
	def post(self):
		logging.debug('Foursquare push request received!')
		logging.debug(self.request.body)
		checkin = json.loads(self.request.get('checkin'))
		secret = self.request.get('secret')
		logging.debug(checkin)
		
		#verify that the secret passed matches ours
		hc_secret = 'LB3J4Q5VQWZPOZATSMOAEDOE5UYNL5P44YCR0FCPWFNXLR2K'
		if hc_secret != secret:
			#raise an exception
			logging.debug('SECRETS DO NOT MATCH')
		
		#go look in our database for a matching foursquare venue id
		business = levr.Business.gql('WHERE foursquare_id = :1',checkin["venue"]["id"]).get()
		#business = levr.Business.get('ahFzfmxldnItcHJvZHVjdGlvbnIQCxIIQnVzaW5lc3MY-dIBDA')
		
		#initialize the response object
		reply = {
			'CHECKIN_ID'		: checkin['id'],
			'text'				: 'Hi there! We seem to be having some issues. Back soon!',
			'url'				: 'http://www.levr.com',
			'contentID'			: 'BWANHHPAHAHA'
		}
		
		if business:	#business found
			#for deal in levr.Deal().all().filter('businessID =', str(business.key())).run():
			q = levr.Deal.gql("WHERE businessID = :1 AND deal_status = :2 ORDER BY count_redeemed DESC",str(business.key()),'active')
			numdeals = q.count()
			if numdeals > 1:	#many deals found
				topdeal = q.get()
				reply['text'] = "There are "+str(numdeals)+" deals here! Click to browse."
				reply['url'] = '' #deeplink into dealResults screen
			elif numdeals == 1:	#only one deal found
				topdeal = q.get()
				reply['text'] = topdeal.deal_text+". Click to redeem."
				reply['url'] = '' #deeplink into dealDetail screen
			else:	#no deals found
				reply['text'] = "See any deals? Pay it forward: click to upload."
				reply['url'] = '' #deeplink into deal upload screen
		else:			#no business found
			#ask pat for all the deals within walking distance
			url = 'http://www.levr.com/phone'
			ll = str(checkin['venue']['location']['lat'])+','+str(checkin['venue']['location']['lng'])
			request_point = levr.geo_converter(ll)
			precision = 6
			results = levr_utils.get_deals_in_area(['all'],request_point,precision)

			if len(results) > 0:
				reply['text'] = "There are "+str(len(results))+" deals near you - click to view."
				reply['url'] = '' #deeplink into deal upload screen
			else:
				reply['text'] = "See any deals? Pay it forward: click to upload."
				reply['url'] = '' #deeplink into deal upload screen
			
		url = 'https://api.foursquare.com/v2/checkins/'+reply['CHECKIN_ID']+'/reply?v=20120920&oauth_token='+'PZVIKS4EH5IFBJX1GH5TUFYAA3Z5EX55QBJOE3YDXKNVYESZ'
		logging.debug(url)
		result = urlfetch.fetch(url=url,
								payload=urllib.urlencode(reply),
								method=urlfetch.POST)
		logging.debug(levr_utils.log_dict(result.__dict__))
Example #12
0
	def post(self):
		try:
			logging.info('''
			
			THE FOURSQUARE BUSINESS TASK IS RUNNING
			
			''')
			
			payload = json.loads(self.request.body)
			logging.debug(payload)
			
			geo_point = levr.geo_converter(payload['geo_str'])
			
			query = payload['query']
			
			key = payload['key']
			
			match = api_utils.match_foursquare_business(geo_point,query)
	
			logging.info(match)
			
			business = levr.Business.get(key)
			
			if match:
				logging.info('Foursquare ID found: '+match['foursquare_id'])
				
				#are there any previously added foursquare businesses?
				#q_orphans = levr.Business.gql('WHERE foursquare_id=:1',match['foursquare_id'])
				
				#grab a duplicate business
				duplicate_business = levr.Business.gql('WHERE foursquare_id=:1',match['foursquare_id']).get()
				
				keys = []
				if duplicate_business:
					#grab all the deal keys from that business
					keys = levr.Deal.gql('WHERE businessID = :1',str(duplicate_business.key())).fetch(None,keys_only=True)
#					duplicate_business.delete()
				
				#update business entity
				business.foursquare_id = match['foursquare_id']
				business.foursquare_name = match['foursquare_name']
				business.foursquare_linked	=	True
				business.put()
				
				deals = list(set(db.get(keys)))
				for deal in deals:
					deal.businessID = str(business.key())
					deal.business = business
					logging.debug('UPDATED DEAL BUSINESSID')
				db.put(deals)
				if duplicate_business:
					duplicate_business.delete()
					logging.debug('DELETED ORIGINAL FOURSQUARE BUSINESS')
			else:
				#update to show notfound
				logging.info('No foursquare match found.')
				
				
			#go grab all the deals and update
			
		except:
			levr.log_error()