def get(self, filename):
        image = Image.get_by_filename(filename)
        if not image:
            return self.abort(404)

        # Gather the information we take from the user.
        identifier = self.request.get('identifier', '')
        ip_address = self.request.remote_addr
        referrer = self.request.referrer
        user_agent = self.request.headers.get('User-Agent', '')
        visitor_uuid = self.request.cookies.get('VISITOR_UUID', '')

        # If they're not in our database, create a new entity to track them.
        visitor = Visitor.get_by_uuid(visitor_uuid)
        if visitor is None:
            visitor = Visitor()
            visitor.put()

        visit = Visit(identifier=identifier, ip_address=ip_address,
                      user_agent=user_agent, referrer=referrer,
                      image=image.key, visitor=visitor.key)
        visit.put()

        # Dispatch a task to send the visit to keen.io for analysis.
        visit_key = visit.key.urlsafe()
        logging.info('Dispatching task to process {visit_key}'
        .format(visit_key=visit_key))
        taskqueue.add(url=self.uri_for('analytics'),
                      params={'visit_key': visit_key})

        self.response.content_type = str(image.content_type)
        self.response.set_cookie(key='VISITOR_UUID', value=visitor.uuid)
        self.response.out.write(image.data)
Beispiel #2
0
    def post(self):
        error = None
        user = users.get_current_user()

        if not user:
            return self.abort(404)

        filename = self.request.POST.get('filename', '')
        image_source = self.request.POST.get('image_source', '')

        if Image.get_by_filename(filename):
            error = ('File with filename {filename} already exists.'
                     .format(filename=filename))
            logging.error(error)

        try:
            response = urlfetch.fetch(image_source)

        except urlfetch.DownloadError as e:
            error = ('Failed to download file \'{filename}\''
                     .format(filename=filename))
            logging.exception(e.message)

        if response.status_code == 404:
            error = '{filename} not found.'.format(filename=filename)

        if error is not None:
            self.session.add_flash(value=error, level='error')
            return self.render_to_response('images.haml')

        # Store the image in the datastore and ensure the write is fully applied
        # before redirecting.
        image_data = response.content
        content_type = response.headers.get('Content-Type', '')
        image = Image(data=image_data, filename=filename, user=user,
                      content_type=content_type)
        image.put().get()

        return self.redirect_to('image')
 def test_get_by_filename(self):
     image = Image(filename=self.DEFAULT_FILENAME)
     image.put()
     self.assertEqual(image.key, Image.get_by_filename(image.filename).key)
     self.assertIsNone(Image.get_by_filename('not.jpg'))