예제 #1
0
    def get_data(self):
        """ Returns the list of restaurants tagged to this user.
    
    Searches the data store to return data about the user's bookmarked 
    restaurants, as well as which restaurants the user has been invited to.
    
    Additionally, the invited friends list and owner for each restaurant 
    bookmark returned is populated with data before being rendered, so owners
    and invitees can be rendered.
    
    Returns:
      A dict containing the restaurant data for this user.
    """
        data = super(JsonRestaurantsView, self).get_data()
        provider = restaurants.LabelProvider()
        viewer = self.request.users.get_viewer()
        labels = provider.get_by_user(viewer)
        for label in labels:
            invitees = self.request.users.get_users_by_key_name(
                label.invited_guids)
            if invitees:
                label.invitees = invitees.itervalues()

        invites = provider.get_by_invitee(viewer)
        if invites:
            for invite in invites:
                invite.user = self.request.users.get_user_by_key_name(
                    invite.user.guid)

        data.update({
            "labels": labels,
            "invites": invites,
        })
        return data
예제 #2
0
 def delete(self):
     """ Deletes a restaurant bookmark from the current user's list. """
     viewer = self.request.users.get_viewer()
     label_provider = restaurants.LabelProvider()
     params = self.require_parameters("key")
     label = label_provider.get_by_key(params["key"])
     if label and label.user == viewer:
         label.delete()
     self.render()
예제 #3
0
    def _get_session_provider(self):
        """ Returns an initialized session provider.
    
    This method will attempt to continue an existing session based off of 
    cookie data in the request.  If multiple sessions are found, this method
    will attempt to obtain viewers for each session.  If multiple viewers 
    are found, their accounts will be merged, so this function has 
    significant side effects in certain cases!
    
    If no session is found, then a new session is created.
    
    Returns:
      A session provider that can be used to store data for the current viewer
      across several requests.
    """
        local_session = None
        remote_session = None
        cookies = self.request.cookies

        cookie = settings.SESSION_COOKIE_NAME
        if cookies.has_key(cookie):
            logging.info("Continuing local session (%s)" % cookies[cookie])
            local_session = sessions.SessionProvider(cookies[cookie])

        cookie = settings.FRIENDCONNECT_COOKIE_NAME
        if cookies.has_key(cookie):
            key = hashlib.sha1(cookies[cookie]).hexdigest()
            logging.info("Continuing remote session (%s)" % key)
            remote_session = sessions.SessionProvider(key)

        if remote_session and local_session:
            remote_viewer = remote_session["viewer"]
            local_viewer = local_session["viewer"]
            if remote_viewer:
                logging.info("Remote viewer: %s" % remote_viewer.display_name)
            if local_viewer:
                logging.info("Local viewer: %s" % local_viewer.display_name)
            if remote_viewer and local_viewer:
                logging.info("Logged in twice, merging accounts")
                # TODO: Move this logic somewhere else and remove the restaurants import
                restaurants.LabelProvider().move_user_data(
                    local_viewer, remote_viewer)
                remote_viewer.merge(local_viewer)

                local_session.kill()
                local_session = None
                self.set_cookie(settings.SESSION_COOKIE_NAME, "", -1)
                self.redirect("/")

        if not remote_session and not local_session:
            local_session = sessions.SessionProvider()
            cookie_value = urllib.quote_plus(local_session.key)
            self.set_cookie(settings.SESSION_COOKIE_NAME, cookie_value)
            logging.info("Starting local session (%s)" % local_session.key)

        # TODO: Prefer the local session if a gfc viewer does not exist
        return remote_session or local_session
예제 #4
0
 def post(self):
     """ Adds a new restaurant bookmark for the current user. """
     params = self.require_parameters("restaurant_id")
     viewer = self.request.users.get_viewer()
     label_provider = restaurants.LabelProvider()
     restaurant_provider = restaurants.RestaurantProvider()
     restaurant = restaurant_provider.get_restaurant(
         params["restaurant_id"])
     label_provider.set(viewer, restaurant, "try")
     self.render()
예제 #5
0
 def post(self):
     """ Handles the response from the invite form.
 
 This method adds a posted list of comma separated friend guids to a given 
 invite.  Both of these identifiers come from the POST request.
 """
     params = self.require_parameters("label_id")
     invited_ids = self.request.get("invited_ids", None)
     if invited_ids:
         invited_ids = invited_ids.split(",")
     else:
         invited_ids = []
     logging.info("invited_ids: %s" % invited_ids)
     label = restaurants.LabelProvider().get_by_key(params["label_id"])
     if label and label.user == self.request.users.get_viewer():
         label.invited_guids = invited_ids
         label.put()
     self.render()
예제 #6
0
    def __populate_data(self):
        """ Get data about the viewer's friends. """
        if self.__friends is None:
            try:
                self.__count = int(self.request.get("count"))
            except:
                self.__count = settings.FRIEND_PAGE_SIZE

            try:
                self.__start = int(self.request.get("start"))
            except:
                self.__start = 0

            self.__friends = self.request.users.get_viewer_friends(
                self.__start, self.__count)
            label_provider = restaurants.LabelProvider()
            if self.__friends:
                for friend in self.__friends:
                    labels = label_provider.get_by_user(friend)
                    if labels:
                        friend.labels = labels