Exemple #1
0
    def post(self):
        model_kind = self.request.get('model_kind')
        frequency = self.request.get('frequency')
        date = str_to_date(self.request.get('date_string'))
        store_key_name = self.request.get('store_key_name')

        logging.info('Cleanupworker model kind: %s frequency: \
    %s store: %s' % (model_kind, frequency, store_key_name))

        recursion_flag = False

        if model_kind == 'ProductRenderer':
            store_key = Key.from_path('Store', store_key_name)
            query = get_renderer_query_for_frequency(frequency, date,
                                                     store_key)
            keys = query.fetch(200, TEMPLATE_PRODUCT_COUNT)
        elif model_kind == 'ProductCounter':
            store_key = Key.from_path('Store', store_key_name)
            query = get_counter_query_for_frequency(frequency, date, store_key)
            keys = query.fetch(200)
        elif model_kind == 'UserCounter':
            query = USER_COUNTER_CLEANUP_TARGETS
            keys = query.fetch(200)
        else:
            logging.error('No type found for CleanupWorker :%s' % model_kind)

        if len(keys):
            recursion_flag = True
            pdb.delete(keys)

        if recursion_flag:
            logging.info('Enqueing cleanup for model %s' % model_kind)
            enqueue_cleanup(model_kind, frequency, str(date), store_key_name)
Exemple #2
0
    def get(self):
        user = users.get_current_user()
        r = FlowerbedAdd()
        if self.request.get('lat') and self.request.get('lon'):
            #TODO: check if flowerbed is far enough from others
            #TODO: check if flowerbed is close enough to user
            lat = int(self.request.get('lat')) / 1000000.0
            lon = int(self.request.get('lon')) / 1000000.0
            gamer_key = Key.from_path(kloombaDb.Gamer.kind(), user.user_id())
            gamer_hash = hashlib.md5(user.user_id() + SALT).hexdigest()
            r.timestamp = int(time.time())
            #get backpack
            bp_beds = GqlQuery('SELECT * FROM Backpack WHERE ANCESTOR IS :1 AND name=:2', gamer_key, 'flowerbed').get()
            if bp_beds.amount:
                #lower backpack
                bp_beds.amount -= 1
                bp_beds.put()

                #add flowerbed
                point = GeoPt(lat, lon)
                cell = geocell.compute(point, RULES['GEO_RESOLUTION'])
                flowerbed = kloombaDb.Flowerbed(parent=Key.from_path(kloombaDb.Flowerbed.kind(), cell))
                flowerbed.point = point
                flowerbed.tile = cell
                flowerbed.owner = user.user_id()
                flowerbed.owner_public_id = gamer_hash
                flowerbed.put()

                #save to memcache
                memcache.set(str(flowerbed.key()), flowerbed)

                #add possession
                possession = kloombaDb.Possession(parent=gamer_key)
                possession.flowerbed = flowerbed
                possession.put()

                backpack = GqlQuery('SELECT * FROM Backpack WHERE ANCESTOR IS :1', gamer_key).run()

                #set timestamps
                r.flowerbed.timestamp = int(time.time())
                r.backpack.timestamp = int(time.time())

                #set flowerbed
                r.flowerbed.id = str(flowerbed.key())
                r.flowerbed.latitude = int(self.request.get('lat'))
                r.flowerbed.longitude = int(self.request.get('lon'))
                r.flowerbed.owner = gamer_hash
                r.flowerbed.flowers = 0

                #set backpack
                for i in backpack:
                    bp = r.backpack.item.add()
                    bp.name = i.name
                    bp.amount = i.amount


        if self.request.get('debug', False):
            self.response.out.write(r)
        else:
            self.response.out.write(r.SerializeToString())
Exemple #3
0
 def post(self):
   model_kind = self.request.get('model_kind')
   frequency = self.request.get('frequency')
   date = str_to_date(self.request.get('date_string'))
   store_key_name = self.request.get('store_key_name')
   
   logging.info('Cleanupworker model kind: %s frequency: \
   %s store: %s' %(model_kind,frequency,store_key_name))
   
   recursion_flag = False
   
   if model_kind == 'ProductRenderer':
     store_key = Key.from_path('Store',store_key_name)
     query = get_renderer_query_for_frequency(frequency, date, store_key)
     keys = query.fetch(200, TEMPLATE_PRODUCT_COUNT)
   elif model_kind == 'ProductCounter':
     store_key = Key.from_path('Store',store_key_name)
     query = get_counter_query_for_frequency(frequency, date, store_key)
     keys = query.fetch(200)
   elif model_kind == 'UserCounter':
     query = USER_COUNTER_CLEANUP_TARGETS
     keys = query.fetch(200)
   else:
     logging.error('No type found for CleanupWorker :%s' %model_kind)
   
   if len(keys):
     recursion_flag = True
     pdb.delete(keys)
   
   if recursion_flag:
     logging.info('Enqueing cleanup for model %s' %model_kind)
     enqueue_cleanup(model_kind,frequency,str(date),store_key_name)
    def get(self, randomID):
        NUMBER_OF_COMMENTS_PREVIEWED = 3
        logging.info('you are doing a get to the latest comments downloader')
        """
   if not authorized.checkIfUserIsInWhiteList():
   		self.redirect(authorized.getLoginPage())
   """

        self.session = True
        user = UserInfo()
        user.whoIs(self)

        startKey = Key.from_path('SketchComment',
                                 "-" + randomID + "sketch00000000000000000000")
        endKey = Key.from_path('SketchComment',
                               "-" + randomID + "sketch99999999999999999999")
        # in the local environment
        myModels = db.GqlQuery(
            "SELECT * FROM SketchComment WHERE __key__ >= :1 AND __key__ < :2",
            startKey, endKey).fetch(NUMBER_OF_COMMENTS_PREVIEWED + 1)

        more = False
        if len(myModels) == 4:
            more = True
            myModels = myModels[:3]

        if len(myModels) == 0:
            self.response.out.write("<br>no comments yet")
            return

        for myModel in myModels:

            self.response.out.write('<div class="usercomments">')
            self.response.out.write(
                "<br /><strong><A class=timestamp-link href=\"/byUploader/" +
                myModel.author_nickname + "-" + myModel.author_string_user_id +
                "/\">" + myModel.author_nickname +
                "</A> comment: </strong> <br />")
            self.response.out.write(myModel.body.replace('\n', "<br>"))
            self.response.out.write('<div class="commentdelete">')
            # also check that the user is not anonymous before providing the delete link
            if ((user.user)
                    and (myModel.author_user_id == user.user_id
                         or user.is_current_user_admin
                         or myModel.sketch_author_user_id == user.user_id)):
                self.response.out.write(
                    '<A href=\"/deleteComment/' + myModel.key().name() +
                    '/?backTo=/view/' + randomID +
                    '/\"><img src="/imgs/delete.gif" alt="delete" height="25px" /> Delete</A>'
                )
            self.response.out.write('</div>')
            self.response.out.write("</div><br />")

        if more:
            self.response.out.write(
                "<p><A class=timestamp-link href=\"/comments/" + randomID +
                "/\">more...</A></p>")

        return
Exemple #5
0
  def get(self):
        next = None
        PAGESIZE = 30

        util.insertUsersideCookies(self)

        self.session = True
        user = UserInfo()
        user.whoIs(self)

        bookmark = self.request.get("bookmark")
        if bookmark:
        	bookmark = Key(self.request.get("bookmark"))
        else:
        	if user.user:
        		bookmark = Key.from_path('MySketchesSketch','-%023d' % (int(user.user_id)) + SKETCH_ZEROS)
        	else:
        		bookmark = Key.from_path('MySketchesSketch','-%023d' % (0) + SKETCH_ZEROS)

        if user.user:
        	endKey =  Key.from_path('MySketchesSketch','-%023d' % (int(user.user_id) + 1) + SKETCH_ZEROS)
        else:
        	endKey =  Key.from_path('MySketchesSketch','-%023d' % (1) + SKETCH_ZEROS)
        
        logging.info('starting key  ' + str(bookmark))
        logging.info('starting key  name' + bookmark.name())

        

        q = db.GqlQuery("SELECT * FROM MySketchesSketch WHERE __key__ >= :1 AND __key__ < :2",bookmark,endKey)

        sketches = q.fetch(PAGESIZE+1)
        if len(sketches) == PAGESIZE + 1:
        	next = str(sketches[-1].key())
        	sketches = sketches[:PAGESIZE]
        	logging.info('next key  ' + next)
        	logging.info('next key name ' + sketches[-1].key().name())
        
        if next is None:
        	next = ""

        for sketch in sketches:
        	sketch.stringtags = util.shorten(" ".join(sketch.tags),18)
			
        template_values = {
          'sketches':sketches,
          'bookmark':bookmark,
          'next':next,
          'action':"mySketches",
          'headerTitle':"My sketches",
          }
        self.generate('galleryTemplate.html',template_values)
Exemple #6
0
def post_news_item(news_item_id=None):
  if not users.is_current_user_admin():
    abort(401)

  if news_item_id:
    key = Key.from_path('NewsItem', str(news_item_id))
    news_item = NewsItem.get(key)
    news_item.clearTags();
  else:
    news_item = NewsItem.create()

  # TODO: Most of this code can go in the model with a fromJSONData function
  news_item.title = request.json['title']
  news_item.body = request.json['body']
  news_item.draft = request.json['draft']
  news_item.posted_date = parser.parse(request.json['posted_date'])
  news_item.last_modified_date = parser.parse(request.json['last_modified_date'])
  news_item.put();

  # Loop through the tags to add them
  for tag_name in request.json['tags']:
    tag_name = tag_name.strip()
    if tag_name == '':
      continue  

    tag = Tag(key_name=tag_name, tag=tag_name)
    tag.put()
    news_item_tag = NewsItemTag()
    news_item_tag.tag = tag.key()
    news_item_tag.news_item = news_item.key()
    news_item_tag.put()

  return Response(json.dumps(news_item.jsonData, default=dthandler),  mimetype='application/json')
Exemple #7
0
    def post(self):
        store_key_name = self.request.get('store_key_name')
        date = str_to_date(self.request.get('date_string'))
        frequency = self.request.get('frequency')

        renderers = []
        store_key = Key.from_path('Store', store_key_name)
        query = get_counter_query_for_frequency(frequency, date, store_key)

        product_counters = query.fetch(TEMPLATE_PRODUCT_COUNT)
        key_names = [counter.key().name() for counter in product_counters]
        product_renderers = ProductRenderer.get_by_key_name(
            key_names, _storage=[MEMCACHE, DATASTORE], _result_type=NAME_DICT)
        for counter in product_counters:
            renderer = product_renderers[counter.key().name()]
            try:
                renderer.count = counter.count
                renderers.append(renderer)
            except AttributeError:  #Renderer is none
                renderer = ProductRenderer.build(counter.key_root,
                                                 frequency,
                                                 date,
                                                 count=counter.count)
                if renderer is not None:  #building from existing renderers successful
                    renderers.append(renderer)
                else:
                    enqueue_renderer_info(counter.key_root, counter.count,
                                          frequency, date)
        if len(renderers):
            pdb.put(renderers, _storage=[MEMCACHE, DATASTORE])
Exemple #8
0
  def post(self):
    cl = Checklist.get(Key.from_path('Checklist', long(self.request.get('cl_id'))))
    if not helpers.checkPermissionAndRespond(self, cl=cl, edit=False):
      return
    
    user = users.get_current_user()
    
    for sub in Subscription.all().filter("user ==", user).filter("deleted ==", False):
      if sub.source.key() == cl.key():
        helpers.createResponse(self, 'message_already_subscribed.html', 
          {'old_checklist': cl})
        
    sub = Subscription(
        user=user,
        source=cl,
        deleted=False,                       
                       )        

    sub.put()

    for item in cl.item_set:
      subItem = SubscribedItem(
          subscription=sub,
          original=item,
          finished=False,
          deleted=False,                               
                               )
      subItem.put()
    
    helpers.createResponse(self, 'message_subscribed.html')
Exemple #9
0
  def post(self):
    store_key_name = self.request.get('store_key_name')
    date = str_to_date(self.request.get('date_string'))
    frequency = self.request.get('frequency')
      
    renderers = []
    store_key = Key.from_path('Store',store_key_name)
    query = get_counter_query_for_frequency(frequency, date, store_key)

    product_counters = query.fetch(TEMPLATE_PRODUCT_COUNT)
    key_names = [counter.key().name() for counter in product_counters ]
    product_renderers = ProductRenderer.get_by_key_name(key_names,
                                                        _storage=[MEMCACHE,DATASTORE],
                                                        _result_type=NAME_DICT)
    for counter in product_counters:
      renderer = product_renderers[counter.key().name()]
      try:
        renderer.count = counter.count
        renderers.append(renderer)
      except AttributeError: #Renderer is none
        renderer = ProductRenderer.build(counter.key_root, 
                                         frequency, date,count = counter.count)
        if renderer is not None: #building from existing renderers successful
          renderers.append(renderer)
        else:
          enqueue_renderer_info(counter.key_root, 
                                        counter.count,
                                        frequency,
                                        date)
    if len(renderers):
      pdb.put(renderers, _storage=[MEMCACHE,DATASTORE])
Exemple #10
0
 def get(self):
     str_id = self.request.get('id')
     message = self.request.get('message')
     
     if not str_id or not message:
         self.response.status_int = 400
         self.response.body = "Invalid or missing id and or message."
         return
         
     devices = GqlQuery('SELECT * FROM Device WHERE __key__ = :1',
                        Key.from_path('Device', str_id))
     
     if devices.count() < 1:
         self.response.status_int = 404
         self.response.body = "Target device not registered."
         return
     
     payload = {'registration_ids': [devices.get().token], 'data': {'message': message}}
     headers = {'Content-Type': 'application/json',
                'Authorization': 'key=' + API_KEY}
     result = urlfetch.fetch(url = ANDROID_GCM_URL,
                             payload = json.dumps(payload),
                             method = urlfetch.POST,
                             headers = headers)
     
     self.response.status_int = result.status_code
     self.response.body = result.content
Exemple #11
0
def get_news_item(id):
  if 'uncached' not in request.args:
    return get_news_item_cached(id)

  key = Key.from_path('NewsItem', str(id))
  news_item = NewsItem.get(key)
  return Response(json.dumps(news_item.jsonData, default=dthandler),  mimetype='application/json')
Exemple #12
0
    def post(self):
        result = {'result': True, 'error': ''}

        try:
            # input marshalling
            taskId = int(self.request.get('taskId'))
            projectId = int(self.request.get('projectId'))
            title = self.request.get('title')
            description = self.request.get('description')
            tagJson = unicode(self.request.get('tags'))

            tags = simplejson.loads(tagJson)  # should be an array!

            # add the new tags in case we don't have them already
            Tags.InsertIfNotHere(users.GetCurrentUser(), tags)

            # grab the task
            task = Task.get_by_id(taskId, Key.from_path('Project', projectId))
            task.title = title
            task.description = description
            task.tags = tags
            task.put()

            result['data'] = task.toDict()

        except Exception, e:
            result['result'] = False
            result['error'] = 'Error: %s' % e
Exemple #13
0
 def get(self, **args):
   cl = Checklist.get(Key.from_path("Checklist", long(args['id'])))
   
   if not cl or cl.deleted: 
     helpers.createResponse(self, 'message_not_exist.html')
     return
   
   if not helpers.checkPermissionAndRespond(self, cl=cl, edit=False): return
   
   item_q = cl.item_set.filter("deleted ==", False).order("creation_time")
   cursor = self.request.get('cursor_item')
   if cursor:
     item_q = item_q.with_cursor(cursor)
   items = item_q.fetch(20)
   
   subs = []
   for sub in cl.subscription_set:
       subs.append(sub)
   
   cursor_item = item_q.cursor()
   item_q = item_q.with_cursor(cursor_item)
   helpers.createResponse(self, 'dashboard_items.html', 
       {'items': items,
       'cl': cl,
       'cursor_item': cursor_item,
       'more_items': item_q.count(1) == 1,
       'subs': subs,
       })
Exemple #14
0
 def get(self):
   checklist = Checklist.get(Key.from_path('Checklist', long(self.request.get('cl_id'))))
   if not helpers.checkPermissionAndRespond(self, cl=checklist): return
   if not self.addable(checklist):
     helpers.createResponse(self, 'message_can_not_create_item.html')
     return 
   helpers.createResponse(self, 'create_item.html', {'checklist': checklist})
	def post( self ):
		result = {
			'result': True,
			'error': ''
		}

		try:
			# input marshalling
			taskId = int( self.request.get( 'taskId' ) )
			projectId = int( self.request.get( 'projectId' ) )
			title = self.request.get( 'title' )
			description = self.request.get( 'description' )
			tagJson = unicode( self.request.get( 'tags' ) )

			tags = simplejson.loads( tagJson ) # should be an array!

			# add the new tags in case we don't have them already
			Tags.InsertIfNotHere( users.GetCurrentUser(), tags )

			# grab the task
			task = Task.get_by_id( taskId, Key.from_path( 'Project', projectId ) )
			task.title = title
			task.description = description
			task.tags = tags
			task.put()

			result['data'] = task.toDict()

		except Exception, e:
			result['result'] = False
			result['error'] = 'Error: %s' % e
Exemple #16
0
def FileKey(filename, user):
  if not user:
    u_id = -1
  else:
    u_id = user.user_id()
  
  return Key.from_path('File', '%s_%s' % (filename, u_id))
Exemple #17
0
  def get(self, **args):
    cl = Checklist.get(Key.from_path("Checklist", long(args['id'])))
    
    if not cl or cl.deleted: 
      helpers.createResponse(self, 'message_not_exist.html')
      return
    
    if not helpers.checkPermissionAndRespond(self, cl=cl, edit=False): return
    
    item_q = cl.item_set.filter("deleted ==", False).order("creation_time")
    cursor = self.request.get('cursor')
    if cursor:
      item_q = item_q.with_cursor(cursor)
    items = item_q.fetch(20)

    user = users.get_current_user()
    subscribed = False
    for sub in Subscription.all().filter("user ==", user).filter("deleted ==", False):
      if sub.source.key() == cl.key():
        subscribed = True
        break
   
    helpers.createResponse(self, 'dashboard_subscribe.html', 
        {'items': items,
        'cl': cl,
        'cursor_item': item_q.cursor(),
        'subscribed': subscribed,
        },
                           )   
Exemple #18
0
def make_db_key(key):
    path = reduce(
        operator.add,
        (('Slot', '/'.join(key[:i + 1])) for i in range(len(key))),
        ()
    )
    return Key.from_path(*path)
Exemple #19
0
def get_dudle(id):
    """
    Get dudle for id
    """
    key = Key.from_path('Dudle', id)
    dudle = Dudle.get(key)
    return dudle
Exemple #20
0
	def get(self):
		mcode = self.request.get('mcode')
		lcode = self.request.get('lcode')
		
		q=Lecturer.all()
		q.filter('__key__ =', Key.from_path('Lecturer', lcode))
		lecturers = q.get()
		self.response.write('Lecturer with code "'+lcode+'" is called "'+lecturers.full_name+'"')
		
		q = Module.all()
		q.filter('__key__ = ', Key.from_path('Module',mcode))
		modules = q.get()
		self.response.write('<br/>Module with code "'+modules.code+'" has title "'+modules.title+'"')
		
		Rating(module=modules, lecturer =lecturers).put()
		self.response.write('<br/> Rating probably put successfully')
Exemple #21
0
    def get(self, login_user=None, template_values={}):

        # is import or update going on?
        template_values['update_status'] = memcache.get('update_status')
        template_values['import_status'] = memcache.get('import_status')

        # Check for existing data.
        try:
            counter = StopMeta.get(Key.from_path('StopMeta', 1))
            template_values['production_num_stops'] = counter.counter_stop_no_confirm
            template_values['production_num_stations'] = counter.counter_station_no_confirm
            template_values['production_num_places'] = counter.counter_place_no_confirm
            # confirmation outstanding
            template_values['update_num_stops'] = counter.counter_stop_update_confirm
            template_values['update_num_stations'] = counter.counter_station_update_confirm
            template_values['update_num_places'] = counter.counter_place_update_confirm
            template_values['new_num_stops'] = counter.counter_stop_new_confirm
            template_values['new_num_stations'] = counter.counter_station_new_confirm
            template_values['new_num_places'] = counter.counter_place_new_confirm
            # Administrative hierarchy
            template_values['gov_num'] = Comuna.all().count()+Region.all().count()+Country.all().count()
        except AttributeError:
            # no data in database. Redirect to import page
            self.redirect('/import')

        template_values['upload_url'] = blobstore.create_upload_url('/update/upload')
        path = os.path.join(os.path.dirname(__file__), "pages/update.html")
        self.response.out.write(template.render(path, template_values))
        return
Exemple #22
0
    def get(self):
        r = BookmarkList()
        keys = []

        user = users.get_current_user()
        gamer_key = Key.from_path(kloombaDb.Gamer.kind(), user.user_id())
        bookmarks = GqlQuery('SELECT * FROM Bookmark WHERE ANCESTOR IS :1', gamer_key).run()
        r.timestamp = int(time.time())
        for i in bookmarks:
            keys.append(i.flowerbed.key())

        flowerbeds = kloombaDb.Flowerbed.get(keys) if keys else []
        for i in flowerbeds:
            fb = r.flowerbed.add()
            fb.timestamp = int(time.mktime(i.timestamp.timetuple()))
            fb.id = str(i.key())
            fb.latitude = int(i.point.lat * 1000000)
            fb.longitude = int(i.point.lon * 1000000)
            fb.owner = i.owner_public_id
            fb.flowers = i.flowers


        if self.request.get('debug', False):
            self.response.out.write(r)
        else:
            self.response.out.write(r.SerializeToString())
Exemple #23
0
    def get(self):
        r = BookmarkRemove()

        if not self.request.get('id'):
            return

        fb_key = self.request.get('id')
        user = users.get_current_user()
        gamer_key = Key.from_path(kloombaDb.Gamer.kind(), user.user_id())

        #get bookmark
        bookmark = GqlQuery('SELECT * FROM Bookmark WHERE ANCESTOR IS :1 AND flowerbed=:2', gamer_key, Key(fb_key)).get()

        if not bookmark:
            return

        bookmark.delete()

        r.timestamp = int(time.time())
        r.id = fb_key

        if self.request.get('debug', False):
            self.response.out.write(r)
        else:
            self.response.out.write(r.SerializeToString())
def FileKey(filename, user):
    if not user:
        u_id = -1
    else:
        u_id = user.user_id()

    return Key.from_path('File', '%s_%s' % (filename, u_id))
Exemple #25
0
 def post(self):
   user = self.processPostData()
   syllabusUnitIds = self.request.get_all('keys')
   syllabusUnitKeys = [Key.from_path('SyllabusUnit', int(iid)) for iid in syllabusUnitIds]
   user.syllabusUnitKeys = syllabusUnitKeys
   user.put()
   self.render(user)  
Exemple #26
0
    def get(self):
        r = BookmarkList()
        keys = []

        user = users.get_current_user()
        gamer_key = Key.from_path(kloombaDb.Gamer.kind(), user.user_id())
        bookmarks = GqlQuery('SELECT * FROM Bookmark WHERE ANCESTOR IS :1',
                             gamer_key).run()
        r.timestamp = int(time.time())
        for i in bookmarks:
            keys.append(i.flowerbed.key())

        flowerbeds = kloombaDb.Flowerbed.get(keys) if keys else []
        for i in flowerbeds:
            fb = r.flowerbed.add()
            fb.timestamp = int(time.mktime(i.timestamp.timetuple()))
            fb.id = str(i.key())
            fb.latitude = int(i.point.lat * 1000000)
            fb.longitude = int(i.point.lon * 1000000)
            fb.owner = i.owner_public_id
            fb.flowers = i.flowers

        if self.request.get('debug', False):
            self.response.out.write(r)
        else:
            self.response.out.write(r.SerializeToString())
	def post( self ):
		result = {
			'result': True,
			'error': ''
		}

		try:
			# input marshalling
			projectId = int( self.request.get( 'projectId' ) )
			taskId = int( self.request.get( 'taskId' ) )
			filename = self.request.POST['Filedata'].filename
			imageData = self.request.get( 'Filedata' )
			
			# grab the task
			task = Task.get_by_id( taskId, Key.from_path( 'Project', projectId ) )

			# create
			theImage = db.Blob( imageData )
			i = Image( parent = task, filename = filename, image = theImage )
			i.put()
			
			result['data'] = i.toDict()

		except Exception, e:
			logging.error( e )
			result['result'] = False
			result['error'] = 'Error: %s' % e
Exemple #28
0
    def get(self):
        r = BookmarkRemove()

        if not self.request.get('id'):
            return

        fb_key = self.request.get('id')
        user = users.get_current_user()
        gamer_key = Key.from_path(kloombaDb.Gamer.kind(), user.user_id())

        #get bookmark
        bookmark = GqlQuery(
            'SELECT * FROM Bookmark WHERE ANCESTOR IS :1 AND flowerbed=:2',
            gamer_key, Key(fb_key)).get()

        if not bookmark:
            return

        bookmark.delete()

        r.timestamp = int(time.time())
        r.id = fb_key

        if self.request.get('debug', False):
            self.response.out.write(r)
        else:
            self.response.out.write(r.SerializeToString())
Exemple #29
0
    def post(self):
        num = 0
        for stop in settings.STOP_TYPES:
            counter = StopMeta.get(Key.from_path('StopMeta', 1))
            q = db.Query(Stop, keys_only=True).filter("stop_type =", stop).fetch(100)
            logging.debug(q)
            counter.counter_delta(-len(q), stop, "NO")
            num += len(q)
            db.delete(q)

            q = db.Query(StopUpdate, keys_only=True).filter("stop_type =", stop).fetch(100)
            logging.debug(q)
            counter.counter_delta(-len(q), stop, "UPDATE")
            num += len(q)
            db.delete(q)

            q = db.Query(StopNew, keys_only=True).filter("stop_type =", stop).fetch(100)
            logging.debug(q)
            counter.counter_delta(-len(q), stop, "NEW")
            num += len(q)
            db.delete(q)
            counter.put()

        if num:
            taskqueue.add(url='/purge/delete', queue_name='import')

        memcache.set('import_status', "Deletion finished.", time=30)
Exemple #30
0
      def restate_user():
	user = db.get(Key.from_path("User", "n:" + nonce))
	if not user:
	  return None
	user.atime = datetime.now()
	user.state = 0
	user.put()
	return user
Exemple #31
0
      def chicken_user():
	user = db.get(Key.from_path("User", "n:" + playerid))
	if not user:
	  return None
	user.atime = datetime.now()
	user.state = 9
	user.put()
	return user
Exemple #32
0
def get_comments(news_item_id):
  key = Key.from_path('NewsItem', str(news_item_id))
  # Don't use get_by_id here since this can be a draft and that function
  # doesn't return draft items
  news_item = NewsItem.get(key)
  news_item.add_meta_fields()
  comments = news_item.sorted_comments()
  p = [x.jsonData for x in comments]
  return Response(json.dumps(p, default=dthandler),  mimetype='application/json')
Exemple #33
0
 def delete(self, id):
     u = get_user()
     if u is None:
         abort(404, message="User not found.")
     f = Favorites.all().filter('user', u).filter('beer', Key.from_path('Beer', id)).get()
     if f is None:
         abort(404, message="Favorite not found")
     f.delete()
     return {'favorite': marshal(f, favorite_fields), 'action': 'deleted'}
Exemple #34
0
def delete_news_item(news_item_id):
  if not users.is_current_user_admin():
    abort(401)
  # Don't use get_by_id here since this can be a draft and that function
  # doesn't return draft items
  key = Key.from_path('NewsItem', str(news_item_id))
  news_item = NewsItem.get(key)
  news_item.delete()
  return Response(json.dumps({}),  mimetype='application/json')
Exemple #35
0
def get_dudlr_by_id(id):
    """
    Get dudlr by id.

    @param id: numeric id of the C{Dudlr}
    """
    key = Key.from_path('Dudlr', id)
    dudlr = Dudlr.get(key)#Dudlr.all().filter('name = ', name).get()
    return dudlr
Exemple #36
0
      def handle_login():
	acct = db.get(Key.from_path("Account", "n:" + name))
	if not acct:
	  acct = Account(key_name="n:" + name, level=level,
	              nonce="%X" % random.getrandbits(64))
	  acct.put()
	  return acct.nonce
	else:
	  return ""
  def get(self,randomID):
   NUMBER_OF_COMMENTS_PREVIEWED = 3
   logging.info('you are doing a get to the latest comments downloader')

   """
   if not authorized.checkIfUserIsInWhiteList():
   		self.redirect(authorized.getLoginPage())
   """

   self.session = True
   user = UserInfo()
   user.whoIs(self)

   startKey = Key.from_path('SketchComment' , "-" + randomID + "sketch00000000000000000000")
   endKey = Key.from_path('SketchComment' , "-" + randomID +   "sketch99999999999999999999")
   # in the local environment
   myModels = db.GqlQuery("SELECT * FROM SketchComment WHERE __key__ >= :1 AND __key__ < :2", startKey, endKey).fetch(NUMBER_OF_COMMENTS_PREVIEWED+1)

   more = False
   if len(myModels) == 4:
   		more = True
   		myModels = myModels[:3]

   if len(myModels) == 0:
    	self.response.out.write("<br>no comments yet")
    	return


   for myModel in myModels:

    	self.response.out.write('<div class="usercomments">')
    	self.response.out.write("<br /><strong><A class=timestamp-link href=\"/byUploader/" + myModel.author_nickname+"-"+ myModel.author_string_user_id+"/\">"+myModel.author_nickname+"</A> comment: </strong> <br />")
    	self.response.out.write(myModel.body.replace('\n', "<br>"))
    	self.response.out.write('<div class="commentdelete">')
    	# also check that the user is not anonymous before providing the delete link
    	if ((user.user)and(myModel.author_user_id == user.user_id or user.is_current_user_admin or myModel.sketch_author_user_id == user.user_id)) :
    		self.response.out.write('<A href=\"/deleteComment/'+myModel.key().name()+'/?backTo=/view/'+randomID+'/\"><img src="/imgs/delete.gif" alt="delete" height="25px" /> Delete</A>')
    	self.response.out.write('</div>')
    	self.response.out.write("</div><br />")

   if more:
    	self.response.out.write("<p><A class=timestamp-link href=\"/comments/" + randomID+"/\">more...</A></p>")
    	
   return
Exemple #38
0
  def get(self,randomID):
        next = None
        PAGESIZE = 5

        """
        if not authorized.checkIfUserIsInWhiteList():
        	self.redirect(authorized.getLoginPage())
        """

        util.insertUsersideCookies(self)

        self.session = True
        user = UserInfo()
        user.whoIs(self)


        bookmark = self.request.get("bookmark")
        if bookmark:
        	bookmark = Key(self.request.get("bookmark"))
        else:
        	bookmark = Key.from_path('SketchComment',"-" + randomID + 'sketch00000000000000000000')
        	
        endKey =  Key.from_path('SketchComment',"-" + randomID +      'sketch99999999999999999999')

        q = db.GqlQuery("SELECT * FROM SketchComment WHERE __key__ >= :1 AND __key__ < :2", bookmark, endKey)
        sketchComments = q.fetch(PAGESIZE+1)
        if len(sketchComments) == PAGESIZE + 1:
        	next = str(sketchComments[-1].key())
        	sketchComments = sketchComments[:PAGESIZE]
        
        if next is None:
        	next = ""

        for sketchComment in sketchComments:
        	sketchComment.keyname = sketchComment.key().name()

			
        template_values = {
          'sketchComments':sketchComments,
          'bookmark':bookmark,
          'next':next,
          'randomID':randomID,
          }
        self.generate('commentsTemplate.html',template_values)
Exemple #39
0
 def add_list_item(self, list_id, name, category, desc, url, is_surprise):
     key = Key.from_path('ListDb', list_id)
     return ListItemDb(
         parent_list=key,
         name=name,
         category=category,
         description=desc,
         url=url,
         is_surprise=is_surprise,
     ).put()
Exemple #40
0
    def get(self):
        r = FlowerbedExplore()

        user = users.get_current_user()
        gamer_key = Key.from_path(kloombaDb.Gamer.kind(), user.user_id())
        gamer = GqlQuery('SELECT * FROM Gamer WHERE ANCESTOR IS :1',
                         gamer_key).get()

        if self.request.get('lat') and self.request.get('lon'):
            r.timestamp = int(time.time())
            lat = float(self.request.get('lat')) / 1000000
            lon = float(self.request.get('lon')) / 1000000
            gamer.point = GeoPt(lat, lon)  #update user position
            #take adjacent tiles
            tiles = []
            requests = []
            tile = geocell.compute(GeoPt(lat, lon), RULES['GEO_RESOLUTION'])
            tiles.append(tile)
            tiles.extend(geocell.all_adjacents(tile))

            kind = kloombaDb.Flowerbed.kind()
            #prepare async requests
            for i in tiles:
                request = GqlQuery(
                    'SELECT * FROM Flowerbed WHERE ANCESTOR IS :1',
                    Key.from_path(kind, i)).run()
                requests.append(request)
            for i in requests:
                for j in i:
                    fb = r.flowerbed.add()
                    fb.timestamp = int(time.mktime(j.timestamp.timetuple()))
                    fb.id = str(j.key())
                    fb.latitude = int(j.point.lat * 1000000)
                    fb.longitude = int(j.point.lon * 1000000)
                    fb.owner = j.owner_public_id
                    fb.flowers = j.flowers

        gamer.put()

        if self.request.get('debug', False):
            self.response.out.write(r)
        else:
            self.response.out.write(r.SerializeToString())
Exemple #41
0
    def get(self):
        r = PossessionLost()
        to_delete = []
        poss = []

        user = users.get_current_user()
        gamer_key = Key.from_path(kloombaDb.Gamer.kind(), user.user_id())
        possessions = GqlQuery(
            'SELECT * FROM Possession WHERE ANCESTOR IS :1 AND lost = TRUE',
            gamer_key).run()
        r.timestamp = int(time.time())
        for i in possessions:
            if int(time.time()) - int(time.mktime(i.timestamp.timetuple())
                                      ) > RULES['LOST_FLOWERBED_TIMEOUT']:
                to_delete.append(i.flowerbed.key())
            else:
                poss.append(i)

        deleted = db.delete_async(to_delete)

        if poss:
            keys = [
                kloombaDb.Possession.flowerbed.get_value_for_datastore(i)
                for i in poss
            ]
            flowerbeds = []

            for i in keys:
                fb = memcache.get(str(i))
                if not fb:
                    fb = GqlQuery('SELECT * FROM Flowerbed WHERE __key__=:1',
                                  i).get()
                    if fb and not memcache.add(str(i), fb):
                        logging.error('Memcache set failed')
                if fb:
                    flowerbeds.append(fb)

            for (p, f) in zip(poss, flowerbeds):
                if p and f:
                    fb = r.possession.add()
                    fb.timestamp = int(time.mktime(p.timestamp.timetuple()))
                    fb.flowerbed.timestamp = int(
                        time.mktime(f.timestamp.timetuple()))
                    fb.flowerbed.id = str(f.key())
                    fb.flowerbed.latitude = int(f.point.lat * 1000000)
                    fb.flowerbed.longitude = int(f.point.lon * 1000000)
                    fb.flowerbed.owner = f.owner_public_id
                    fb.flowerbed.flowers = f.flowers

        deleted.get_result()

        if self.request.get('debug', False):
            self.response.out.write(r)
        else:
            self.response.out.write(r.SerializeToString())
def get_game_model(gameid=gid):
    """ Return a Game model for the given game id.

  Args:
    gameid: The game id of the Game.

  Returns:
    The database model for the specified id or None if no such model
    exists.
  """
    return Game.get(Key.from_path('Game', gameid))
Exemple #43
0
def get_game_model(gid):
    """ Return a Game model for the given game id.

  Args:
    gid: The game id of the Game.

  Returns:
    The database model for the specified id or None if no such model
    exists.
  """
    game_key = Key.from_path('Game', gid)
    model = db.get(game_key)
    return model
Exemple #44
0
def get_instance_model(gid, iid):
    """ Return a GameInstance model for the given game and instance ids.

  Args:
    gid: The game id of the GameInstance.
    iid: The instance id of the GameInstance.

  Returns:
    The database model for the specified ids or None if the
    GameInstance doesn't exist..
  """
    instance_key = Key.from_path('Game', gid, 'GameInstance', iid)
    model = db.get(instance_key)
    return model
    def test_db_conversion(self):
        actual_datetime = datetime.datetime.now()
        entity = FieldsWithoutOptionsModel(
            datetime=actual_datetime, date=actual_datetime.date(),
            time=actual_datetime.time(), floating_point=5.97, boolean=True,
            null_boolean=False, text='Hallo', email='*****@*****.**',
            comma_seperated_integer="5,4,3,2",
            ip_address='194.167.1.1', slug='you slugy s**t :)',
            url='http://www.scholardocs.com', long_text=1000*'A',
            indexed_text='hello', xml=2000*'B',
            integer=-400, small_integer=-4, positiv_integer=400,
            positiv_small_integer=4)
        entity.save()

        # get the gae entity (not the django model instance) and test if the
        # fields have been converted right to the corresponding gae database types
        gae_entity = Get(Key.from_path(FieldsWithoutOptionsModel._meta.db_table,
            entity.pk))

        for name, gae_db_type in [('long_text', Text),
                ('indexed_text', unicode), ('xml', Text),
                ('text', unicode), ('ip_address', unicode), ('slug', unicode),
                ('email', unicode),('comma_seperated_integer', unicode),
                ('url', unicode), ('time', datetime.datetime),
                ('datetime', datetime.datetime), ('date', datetime.datetime),
                ('floating_point', float), ('boolean', bool),
                ('null_boolean', bool), ('integer', (int, long)),
                ('small_integer', (int, long)), ('positiv_integer', (int, long)),
                ('positiv_small_integer', (int, long))]:
            self.assertTrue(type(gae_entity[
                FieldsWithoutOptionsModel._meta.get_field_by_name(
                    name)[0].column]) in (isinstance(gae_db_type, (list, tuple)) and \
                        gae_db_type or (gae_db_type, )))

        # get the model instance and check if the fields convert back to the
        # right types
        entity = FieldsWithoutOptionsModel.objects.get()
        for name, expected_type in [('long_text', unicode),
                ('indexed_text', unicode), ('xml', unicode),
                ('text', unicode), ('ip_address', unicode), ('slug', unicode),
                ('email', unicode), ('comma_seperated_integer', unicode),
                ('url', unicode), ('datetime', datetime.datetime),
                ('date', datetime.date), ('time', datetime.time),
                ('floating_point', float), ('boolean', bool),
                ('null_boolean', bool), ('integer', (int, long)),
                ('small_integer', (int, long)), ('positiv_integer', (int, long)),
                ('positiv_small_integer', (int, long))]:
            self.assertTrue(type(getattr(entity, name)) in (isinstance(
                expected_type, (list, tuple)) and expected_type or (expected_type, )))
Exemple #46
0
    def get(self, projectId, taskId, imageId):
        taskId = int(taskId)
        imageId = int(imageId)
        projectId = int(projectId)

        image = Image.get_by_id(
            imageId, Key.from_path('Project', projectId, 'Task', taskId))

        # figure out the mime type based on the filename
        extension = os.path.splitext(image.filename)[1][1:]
        mimeType = 'image/%s' % extension

        self.response.headers['Cache-Control'] = 'max-age=2592000'
        self.response.headers['Content-Type'] = mimeType
        self.response.out.write(image.image)
Exemple #47
0
    def get(self):
        # input marshalling
        projectId = self.request.get('projectId')
        tag = self.request.get('tag')

        # grab the task for the projectId or tag
        if len(projectId) > 0:
            tasks = Task.AllTasksForProject(
                Key.from_path('Project', int(projectId)))
            taskList = [t.toDict() for t in tasks]
        elif tag != None:
            tasks = Task.AllTasksWithTag(tag)
            taskList = [t.toDict() for t in tasks]

        #self.response.headers['Content-Type'] = 'application/json'
        self.response.out.write(simplejson.dumps(taskList))
Exemple #48
0
    def post(self):
        result = {'result': True, 'error': ''}

        try:
            # input marshalling
            imageId = int(self.request.get('imageId'))
            taskId = int(self.request.get('taskId'))
            projectId = int(self.request.get('projectId'))

            # grab the comment and kill it
            image = Image.get_by_id(
                imageId, Key.from_path('Project', projectId, 'Task', taskId))
            image.delete()

        except Exception, e:
            result['result'] = False
            result['error'] = 'Error: %s' % e
Exemple #49
0
  def get(self):
        next = None
        PAGESIZE = 30

        util.insertUsersideCookies(self)

        user = UserInfo()
        user.whoIs(self)

        if user.email == '*****@*****.**':
        	self.generate('limboPage.html')
        	return;

        bookmark = self.request.get("bookmark")
        if bookmark:
        	bookmark = Key(self.request.get("bookmark"))
        else:
        	bookmark = Key.from_path('GallerySketch',SKETCH_ZEROS)

        logging.info('starting key  ' + str(bookmark))
        logging.info('starting key  name' + bookmark.name())
        q = db.GqlQuery("SELECT * FROM GallerySketch WHERE __key__ >= :1", bookmark)
        sketches = q.fetch(PAGESIZE+1)
        
        if len(sketches) == PAGESIZE + 1:
        	next = str(sketches[-1].key())
        	sketches = sketches[:PAGESIZE]
        	logging.info('next key  ' + next)
        	logging.info('next key name ' + sketches[-1].key().name())

        if next is None:
        	next = ""


        for sketch in sketches:
        	sketch.stringtags = util.shorten(" ".join(sketch.tags),18)
			
        template_values = {
          'sketches':sketches,
          'bookmark':bookmark,
          'next':next,
          'action':"gallery",
          'headerTitle':"Gallery",
          }
        self.generate('galleryTemplate.html',template_values)
Exemple #50
0
    def get(self):
        result = {'result': True, 'error': ''}

        # input marshalling
        taskId = int(self.request.get('taskId'))
        projectId = int(self.request.get('projectId'))

        try:
            # grab the task
            task = Task.get_by_id(taskId, Key.from_path('Project', projectId))
            result['task'] = task.toDict()

            # add the comments and images
            result['comments'] = [c.toDict() for c in task.comments]
            result['images'] = [i.toDict() for i in task.images]

        except Exception, e:
            result['result'] = False
            result['error'] = 'Error: %s' % e
Exemple #51
0
    def post(self):
        result = {'result': True, 'error': ''}

        try:
            # input marshalling
            taskId = int(self.request.get('taskId'))
            projectId = int(self.request.get('projectId'))
            completed = bool(self.request.get('completed'))

            # grab the task
            task = Task.get_by_id(taskId, Key.from_path('Project', projectId))
            task.completed = completed
            task.put()

            result['data'] = task.toDict()

        except Exception, e:
            result['result'] = False
            result['error'] = 'Error: %s' % e
Exemple #52
0
    def post(self):
        result = {'result': True, 'error': ''}

        try:
            # input marshalling
            taskId = int(self.request.get('taskId'))
            projectId = int(self.request.get('projectId'))

            # grab the task
            task = Task.get_by_id(taskId, Key.from_path('Project', projectId))
            task.removeAllComments()
            task.removeAllImages()
            task.delete()

            result['data'] = task.toDict()

        except Exception, e:
            result['result'] = False
            result['error'] = 'Error: %s' % e
    def post(self):
        result = {'result': True, 'error': ''}

        try:
            # input marshalling
            projectId = int(self.request.get('projectId'))
            taskId = int(self.request.get('taskId'))
            comment = self.request.get('comment')

            # grab the task
            task = Task.get_by_id(taskId, Key.from_path('Project', projectId))

            # create
            c = Comment(parent=task, text=comment)
            c.put()

            result['data'] = c.toDict()

        except Exception, e:
            result['result'] = False
            result['error'] = 'Error: %s' % e
Exemple #54
0
    def get(self):
        r = BookmarkAdd()

        if not self.request.get('id'):
            return

        fb_key = self.request.get('id')
        user = users.get_current_user()
        gamer_key = Key.from_path(kloombaDb.Gamer.kind(), user.user_id())

        #get flowerbed
        flowerbed = GqlQuery('SELECT * FROM Flowerbed WHERE __key__=:1',
                             fb_key).get()
        if not flowerbed:
            return  #no such flowerbed
        #check bookmark
        bookmark = GqlQuery(
            'SELECT * FROM Bookmark WHERE ANCESTOR IS :1 AND flowerbed=:2',
            gamer_key, Key(fb_key)).get()
        if bookmark:
            return  #bookmark allready exist

        bookmark = kloombaDb.Bookmark(parent=gamer_key)
        bookmark.owner = user.user_id()
        bookmark.flowerbed = flowerbed
        bookmark.put()

        r.timestamp = int(time.time())
        fb = r.flowerbed
        fb.timestamp = int(time.mktime(flowerbed.timestamp.timetuple()))
        fb.id = str(flowerbed.key())
        fb.latitude = int(flowerbed.point.lat * 1000000)
        fb.longitude = int(flowerbed.point.lon * 1000000)
        fb.owner = flowerbed.owner_public_id
        fb.flowers = flowerbed.flowers

        if self.request.get('debug', False):
            self.response.out.write(r)
        else:
            self.response.out.write(r.SerializeToString())
Exemple #55
0
    def post(self):
        result = {'result': True, 'error': ''}

        try:
            # input marshalling
            projectId = int(self.request.get('projectId'))
            taskId = int(self.request.get('taskId'))
            filename = self.request.POST['Filedata'].filename
            imageData = self.request.get('Filedata')

            # grab the task
            task = Task.get_by_id(taskId, Key.from_path('Project', projectId))

            # create
            theImage = db.Blob(imageData)
            i = Image(parent=task, filename=filename, image=theImage)
            i.put()

            result['data'] = i.toDict()

        except Exception, e:
            logging.error(e)
            result['result'] = False
            result['error'] = 'Error: %s' % e
Exemple #56
0
import hashlib
import logging
from google.appengine.ext.db import GqlQuery, Key

from blog.general_handler import GeneralHandler
from db.Highscore import Highscore

k = Key.from_path('Highscore', 'Content')

secret = 'jdks'


class TetrisHandler(GeneralHandler):
    def get(self):
        highscores = GqlQuery(
            "SELECT * FROM Highscore WHERE ANCESTOR IS :1 ORDER BY highscore DESC",
            k)
        self.render('tetris.html', highscores=highscores)

    def post(self):
        name_html = self.get_user()
        score_html = self.request.get('highscore_get')
        speed_html = self.request.get('speed_get')
        multiplier_html = self.request.get('multiplier_get')
        hash_client = self.request.get('hash_get')

        hash_server = hashlib.sha256(
            str(score_html) + str(speed_html) + str(multiplier_html) +
            secret).hexdigest()

        if not name_html:
def get_game(iid, game_id):
    key = Key.from_path('Game', gid, 'GameInstance', iid, 'Message', game_id)
    return Message.get(key)
def guess_command(instance, player, arguments):
  """ Evaluate a guess and determine the score.

  Args:
    instance: The GameInstance database model for this operation.
    player: The player making the guess. Must be the leader of
      the instance.
    arguments: A two element list containg the game id and a second
      list with the guessed colors.

  new_game_command must be invoked before a guess can be made.

  Returns:
    If the player has guessed correctly:
      A two element list containg a score list and a boolean of
      whether or not this game set a new high score. The score list is
      a three element list containing the player's high score, their
      total score and their total number of games played.

    Otherwise:
      A four element list containing the player's remaining score, the
      number of guesses remaining, the number of bulls for this guess
      and the number of cows for this guess.

  Raises:
    ValueError if the player is not the current instance leader and
    only member of the game.
    ValueError if the player has no guesses remaining.
    ValueError if the guess does not have the correct number of
    elements.
    ValueError if no game has been started yet.
  """
  guess = arguments[1]
  if len(guess) != solution_size:
    raise ValueError("Guess was not the right number of elements.")

  game = db.get(Key.from_path('Message', int(arguments[0]),
                              parent = instance.key()))

  if game is None:
    raise ValueError("Game not found. Please start a new game.")
  if game.sender != player:
    raise ValueError("This is not your game. Please start a new game.")

  if guess == game.bac_last_guess:
    return simplejson.loads(game.bac_last_reply)

  if game.bac_guesses_remaining == 0:
    raise ValueError("No turns left, please start a new game.")

  return_content = None

  if guess == game.bac_solution:
    game.bac_guesses_remaining = 0
    new_high_score = False
    score = scoreboard.get_score(instance, player)
    if game.bac_score > score[0]:
      new_high_score = True
      score[0] = game.bac_score
    score[1] = score[1] + game.bac_score
    score[2] = score[2] + 1
    scoreboard.set_score(instance, player, score)
    return_content = [score, new_high_score]
  else:
    game.bac_guesses_remaining -= 1
    bulls = cows = 0
    for i in xrange(solution_size):
      if guess[i] == game.bac_solution[i]:
        bulls += 1
      elif guess[i] in game.bac_solution:
        cows += 1

    score_deduction = solution_size * 2 - cows - 2 * bulls
    game.bac_score -= score_deduction
    return_content = [game.bac_guesses_remaining, game.bac_score,
                      bulls, cows]
  game.bac_last_reply = simplejson.dumps(return_content)
  game.bac_last_guess = guess
  game.put()
  return return_content
Exemple #59
0
    def get(self):
        user = self.user

        # Try to get rendered output from memcache
        rendered = memcache.get('dashboard-' + user.user_id)
        if rendered and not settings.DEBUG:
            return self.response.out.write(rendered)

        # Fetch following users
        following = user.following_users\
                        .order('name')\
                        .fetch(100)

        user_keys = [user.key()] + [u.key() for u in following]

        # Start async fetch of top recipes
        top_recipes = Recipe.all()\
                            .filter('owner IN', user_keys)\
                            .order('-grade')\
                            .run(limit=15)

        # Get and process interesting events
        interesting_events = UserAction.all()\
                                       .filter('owner IN', user_keys)\
                                       .order('-created')\
                                       .fetch(15)

        object_ids = UserAction.gather_object_ids(interesting_events)
        object_ids['users'] = [
            id for id in object_ids['users']
            if id not in [user.key().id()] + user.following
        ]

        # Start async fetch of relevant recipes
        recipes = db.get_async(
            [Key.from_path('Recipe', id) for id in object_ids['recipes']])

        # Start async fetch of relevant brews
        brews = db.get_async(
            [Key.from_path('Brew', id) for id in object_ids['brews']])

        # Convert iterators to  lists of items in memory and setup a map
        # of user id -> user for easy lookups
        following = list(following)
        top_recipes = list(top_recipes)

        user_map = {user.key().id(): user}

        for u in following:
            user_map[u.key().id()] = u

        if object_ids['users']:
            for u in UserPrefs.get_by_id(object_ids['users']):
                user_map[u.key().id()] = u

        # Setup a map of brew id -> brew for easy lookups
        brew_map = {}
        brew_recipe_ids = set()

        for b in brews.get_result():
            brew_recipe_ids.add(b.recipe_key.id())
            brew_map[b.key().id()] = b

        # Async fetch of any recipes brews reference that weren't
        # included in the recipe fetch above...
        brew_recipes = db.get_async([
            Key.from_path('Recipe', id) for id in brew_recipe_ids
            if id not in object_ids['recipes']
        ])

        # Setup a map of recipe id -> recipe for easy lookups
        recipe_map = {}

        for r in recipes.get_result():
            recipe_map[r.key().id()] = r

        for r in brew_recipes.get_result():
            recipe_map[r.key().id()] = r

        # Render and cache for 1 minute
        memcache.set(
            'dashboard-' + user.user_id,
            self.render(
                'dashboard.html', {
                    'following': following,
                    'user_map': user_map,
                    'recipe_map': recipe_map,
                    'brew_map': brew_map,
                    'top_recipes': top_recipes,
                    'interesting_events': interesting_events
                }), self.CACHE_TIME)