示例#1
0
    def get(self):
        #gets all of the data for a project - INCLUDING POSTS AND TODOS
        #this is what the browser pings when it wants to see what's changed
         
        #MAKE HEAVY USE OF MEMCACHE HERE TO CHECK IF UPDATED SINCE CACHE, IF NOT USE CACHE
         
        #We need to handle case of user not being member of project - no access page
        #returns a memcache lookup of the proj_key_lastupdated
        
        #check login status
        pjc = login.getProjectMember(deny_access=True)
        if pjc is None:
            self.error(500)
            return
        
        project_id = self.request.get("p", default_value=None)
        if project_id is None:
            logging.error("pj_id_invalid %s" % project_id)
            self.error(500)
            return
    
        project = Project.get_by_id(int(project_id))
        if project is None:
            logging.error("pj_notfound %s" % project_id)
            self.error(500)
            return
            
        #check permissions
        if pjc.key() not in project.users:
            self.error(500)
            return
        
    
        updated = project_handler.getProjectLastUpdated(project_id)
        last_checked = self.request.get("l", default_value='null')
        try:
            last = datetime.datetime.fromtimestamp(float(last_checked))
    
            if updated < last:   #short-circuit if the page wasn't updated recently to save lots of bandwidth
                self.response.out.write("0")
                return
        
        except ValueError:
            pass  #if no last_checked, just send the whole page anyways
        
        
            
        json_dat = getProjectData(project)
        
        #self.response.headers['Content-Type'] = 'application/json'
        self.response.out.write(json_dat)
        
        
        
        
             
#in the future GetProjectDataHandler should actually just return data changed
# since a given date to save on update costs -- too much work for now
示例#2
0
def getProjectData(project):
    if project is None:
        return None
        
    #check the cache to see if it needs updating based on project.updated
    updated = project_handler.getProjectLastUpdated(project_id)
        
    cached_on = memcache.get('$pd-t-%s' % project.key().id())
    if cached_on is not None and cached_on > updated:
        return memcache.get('$pd-%s' % project.key().id())
        
    #if we need update, build a new data dict
    dat = {}
    dat['p_id'] = project.key().id()
    dat['p_name'] = project.name
    dat['p_created'] = int(time.mktime(project.creation.timetuple())) * 1000
    dat['p_updated'] = int(time.mktime(project.updated.timetuple())) * 1000
    dat['p_slot'] = project.slot
    dat['p_creator'] = (project.creator.name, project.creator.key().id())

    dat['p_users'] = []
    for user_key in project.users:
        user = db.get(user_key)
        dat['p_users'].append( (user.name, user.key().id()) )
    
    
    todos = []
    for todo_key in project.tasks:
        todo = db.get(todo_key)
        
        e = {}
        e['t_id'] = todo.key().id()
        e['t_name'] = todo.name
        e['t_desc'] = todo.description
        e['t_tags'] = todo.tags
        e['t_time'] = int(time.mktime(todo.timestamp.timetuple())) * 1000
        e['t_done'] = todo.is_done
        e['t_author'] = (todo.author.name, todo.author.key().id())
        e['t_pos'] = len(todos)
        
        posts = []
        for post_key in todo.posts:
            post = db.get(post_key)
            
            p = {}
            p['w_id'] = post.key().id()
            p['w_pos'] = len(posts)
            p['w_text'] = post.contents
            p['w_author'] = (post.author.name, post.author.key().id())
            
            posts.append(p)
        e['t_posts'] = posts
        
        
        todos.append(e)
    dat['p_todos'] = todos
    
    
    json_dat = json.dumps(dat)
    memcache.add('$pd-%s' % project.key().id(), json_dat)
    memcache.add('$pd-t-%s' % project.key().id(), datetime.datetime.now())