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
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())