def post(self): # should run at most 1/s due to entity group limit """ Task Worker to mark place as updated Params: placeId: string place Id userId: string """ try: logging_ext.log_to_console("AddPlaceChangesWorker") place_id_str = self.request.get('placeId') user_id_str = self.request.get('userId') place_entries = Change.\ query(Change.kind==Change.CHANGE_PLACE, Change.recordId == place_id_str) now = datetime.now() for p in place_entries: if p.when < now: p.when = now p.put() user = User.get_by_id(int(user_id_str)) friends_key_list = user.get_friends_key_list() for user_key in friends_key_list: p = Change.\ query( Change.kind == Change.CHANGE_PLACE, Change.subscriberId == str(user_key.id()), Change.recordId == place_id_str).get() if not p: p = Change() p.kind = Change.CHANGE_PLACE p.subscriberId = str(user_key.id()) p.placeId = place_id_str p.when = now p.put() except: logging_ext.error('** AddPlaceChangesWorker', exc_info=True)
def serialize_user_details(user_id, places_ids, current_user, request, since=None): """ give the list of votes & places_ids for a user @param user_id: int: which user @param places_ids: dict: list of places_ids indexed by key (BY VALUE) @param current_user: int: current user - if same as user_id then we exclude untried @return: """ try: logging.info("serialize_user_details 1") # get it from the cache user_id = int(user_id) votes = Vote.query(Vote.voter == user_id) user = User.get_by_id(user_id) user_profile = user.profile() if getProp(user_profile, 'last_write'): last_write = user_profile.last_write else: last_write = None result = {"votes": votes, "id": user_id, # todo is it first_name? 'name': user_profile.screen_name, 'last_write': last_write} if votes: logging.debug("serialize_user_details: %d votes"%len(votes)) for place_key in votes: if not place_key in places_ids: place_json = Item.id_to_json(place_key) # if user_id == current_user: # place_json['vote'] = votes[place_key]['vote'] if "category" in place_json: places_ids[place_key] = place_json for place_id in places_ids: pl = ndb.Key(Item,place_id).get() json_data = pl.get_json() places_ids[place_id] = json_data logging.debug('serialize_user_details: Added %d places_ids'%len(places_ids)) else: logging.debug("serialize_user_details: No Votes") return result except Exception, e: logging_ext.error("serialize_user_details Exception", exc_info=True)
def post(self): # should run at most 1/s due to entity group limit """ Task Worker to mark votes as updated - deletes all entries for the vote - adds a new one for all friends of voter Params: voteId: string userId: string """ try: logging_ext.log_to_console('AddVoteChangesWorker IN') vote_id_str = self.request.get('voteId') if not vote_id_str: logging_ext.error("** AddVoteChangesWorker: no vote id") return user_id_str = self.request.get('userId') if not user_id_str: logging_ext.error("** AddVoteChangesWorker: no user_id") return user_id = int(user_id_str) me = User.get_by_id(user_id) time = self.request.get('time') old_votes = Change.\ query(Change.kind == Change.CHANGE_VOTE, Change.recordId == vote_id_str).\ fetch(keys_only=True) ndb.delete_multi(old_votes) friends_list = me.get_friends_key_list() for u in friends_list: change = Change() change.kind = Change.CHANGE_VOTE change.recordId = vote_id_str change.subscriberId = str(u.id()) change.when = datetime.strptime( time, views.config['DATETIME_FORMAT']) change.put() except Exception: logging_ext.error("** AddVoteChangesWorker", exc_info=True)
def get(self): """ get the entire user record, including friends' places """ try: if self.user.blocked: raise Exception('Blocked') my_id = self.user_id except: logging_ext.error('getFullUserRecord: User Exception') json.dump({'result':'FAIL'}, self.response.out, default=json_serial) return if my_id: #profile_in("getFullUserRecord") user = User.get_by_id(my_id) if user: # logged in since = None if 'since' in self.request.params: # move since back in time to allow for error since = datetime.datetime.strptime( self.request.params['since'], config['DATETIME_FORMAT']) - \ config['TIMING_DELTA'] # is it for a specific user? if "forUser" in self.request.params: for_1_user = long(self.request.get("forUser")) else: for_1_user = None # either the first lookup is for me, plus everyone, # or it is for a specified user result = { "id": my_id, "admin": self.user.profile().is_admin } if for_1_user: logging.info("getFullUserRecord: 1 user") first_user = for_1_user result["for_1_user"] = for_1_user else: logging.info("getFullUserRecord: 1+ user") first_user = my_id dict_id_place = {} # load the data for the 1 user - me or specified friends_data = [ serialize_user_details( first_user, dict_id_place, my_id, self.request, since)] # was it for all users? If so we've only done ourselves if not for_1_user: # for all users prof = user['p'] if config['all_are_friends']: q = User.gql('') logging.info("getFullUserRecord: %d friends"%q.count()) for user in q: # for userProf in UserProfile().all(): if user.get_id() == my_id: continue # don't add myself again data = serialize_user_details( user.get_id(), dict_id_place, my_id, self.request, since) logging.info("getFullUserRecord: record %s"%data) friends_data.append(data) else: for friend in prof.friends: friends_data.append(serialize_user_details( friend, dict_id_place, my_id, self.request, since)) result["friendsData"] = friends_data logging.debug('getFullUserRecord: return %d places'%len(dict_id_place)) result["places"] = dict_id_place # encode using a custom encoder for datetime json_str = json.dumps( result, default=json_serial) self.response.out.write(json_str) #profile_out("getFullUserRecord") return self.error(401)
def get(self): """ get the user record, including friends' places """ try: if self.user.blocked: raise Exception('Blocked') my_id = self.user_id except: logging_ext.error('getFullUserRecord: User Exception') json.dump({'result':'FAIL'}, self.response.out, default=json_serial) return if my_id: user = User.get_by_id(my_id) if user: # logged in result = { "id": my_id, "admin": self.user.profile().is_admin } since = None if 'since' in self.request.params: # move since back in time to allow for error since = datetime.datetime.strptime( self.request.params['since'], config['DATETIME_FORMAT']) - \ config['TIMING_DELTA'] user_list = [] user_results = [] # is it for a specific user? if "forUser" in self.request.params: user_list.append(user.get(self.request.params['forUser'])) else: if config['all_are_friends']: q = User.gql('') for user in q: user_list.append(user) places = {} my_votes = Vote.query(Vote.voter==my_id) for u in user_list: user_id = u.get_id() if user_id == my_id: votes = my_votes else: votes = Vote.query(Vote.voter==u.get_id()) for v in votes: #add to the list if it's not there, or overwrite if this is my version if not v in places or user_id == my_id: places [v] = Item.id_to_json(v) user_profile = u.profile() if getProp(user_profile, 'last_write'): last_write = user_profile.last_write else: last_write = None user_str = {"votes": votes, "id": u.get_id(), # todo is it first_name? 'name': u.screen_name, 'last_write': last_write} user_results.append(user_str) result["places"] = places result["friendsData"] = user_results json_str = json.dumps( result, default=json_serial) self.response.out.write(json_str) #profile_out("getFullUserRecord") return self.error(401)