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/>")
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)
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
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)
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
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()
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')
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')
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')
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)
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__))
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()