예제 #1
0
파일: storage.py 프로젝트: frankk00/djangae
def serve_file(request, blob_key_or_info, as_download=False, content_type=None, filename=None, offset=None, size=None):
    """
        Serves a file from the blobstore, reads most of the data from the blobinfo by default but you can override stuff
        by passing kwargs.

        You can also pass a Google Cloud Storage filename as `blob_key_or_info` to use Blobstore API to serve the file:
        https://cloud.google.com/appengine/docs/python/blobstore/#Python_Using_the_Blobstore_API_with_Google_Cloud_Storage
    """

    if isinstance(blob_key_or_info, BlobKey):
        info = BlobInfo.get(blob_key_or_info)
        blob_key = blob_key_or_info
    elif isinstance(blob_key_or_info, basestring):
        info = BlobInfo.get(BlobKey(blob_key_or_info))
        blob_key = BlobKey(blob_key_or_info)
    elif isinstance(blob_key_or_info, BlobInfo):
        info = blob_key_or_info
        blob_key = info.key()
    else:
        raise ValueError("Invalid type %s" % blob_key_or_info.__class__)

    if info == None:
        # Lack of blobstore_info means this is a Google Cloud Storage file
        if has_cloudstorage:
            info = cloudstorage.stat(blob_key_or_info)
            info.size = info.st_size
            blob_key = create_gs_key('/gs{0}'.format(blob_key_or_info))
        else:
            raise ImportError("To serve a Cloud Storage file you need to install cloudstorage")

    response = HttpResponse(content_type=content_type or info.content_type)
    response[BLOB_KEY_HEADER] = str(blob_key)
    response['Accept-Ranges'] = 'bytes'
    http_range = request.META.get('HTTP_RANGE')

    if offset or size:
        # Looks a little bonkers, but basically create the HTTP range string, we cast to int first to make sure
        # nothing funky gets into the headers
        http_range = "{}-{}".format(
            str(int(offset)) if offset else "",
            str(int(offset or 0) + size) if size else ""
        )

    if http_range is not None:
        response[BLOB_RANGE_HEADER] = http_range

    if as_download:
        response['Content-Disposition'] = smart_str(
            u'attachment; filename="%s"' % (filename or info.filename)
        )
    elif filename:
        raise ValueError("You can't specify a filename without also specifying as_download")

    if info.size is not None:
        response['Content-Length'] = info.size
    return response
예제 #2
0
 def new_file(self, *args, **kwargs):
     super(BlobstoreFileUploadHandler, self).new_file(*args, **kwargs)
     blobkey = self.content_type_extra.get('blob-key')
     self.active = blobkey is not None
     if self.active:
         self.blobkey = BlobKey(blobkey)
         raise StopFutureHandlers()
예제 #3
0
파일: storage.py 프로젝트: frankk00/djangae
    def new_file(self, field_name, file_name, content_type, content_length, charset=None, content_type_extra=None):
        """
            We can kill a lot of this hackery in Django 1.7 when content_type_extra is actually passed in!
        """
        self.data.seek(0)  # Rewind
        data = self.data.read()

        parts = data.split(self.boundary)

        for part in parts:
            match = re.search('blob-key="?(?P<blob_key>[:a-zA-Z0-9_=-]+)', part)
            blob_key = match.groupdict().get('blob_key') if match else None

            if not blob_key:
                continue

            # OK, we have a blob key, but is it the one for the field?
            match = re.search('\sname="?(?P<field_name>[a-zA-Z0-9_-]+)', part)
            name = match.groupdict().get('field_name') if match else None
            if name != field_name:
                # Nope, not for this field
                continue

            self.blobkey = blob_key
            break

        if self.blobkey:
            self.blobkey = BlobKey(self.blobkey)
            raise StopFutureHandlers()
        else:
            return super(BlobstoreFileUploadHandler, self).new_file(field_name, file_name, content_type, content_length, charset)
예제 #4
0
    def post(self):
        self.response.headers['Content-Type'] = 'text/html'
        template = JINJA_ENVIRONMENT.get_template('main.html')
        user = users.get_current_user()
        blobkey = self.request.get('blobkey')

        action = self.request.get('button')
        if action == 'Post':
            url = ''
            tweet_text = self.request.get('tweet_text')
            myuser_key = ndb.Key('MyUser', user.user_id())
            myuser = myuser_key.get()
            myuser.no_of_tweets += 1
            if blobkey != '':
                url = images.get_serving_url(BlobKey(blobkey),
                                             size=20,
                                             crop=True)
            logging.info(url)
            tweet_key = TweetModel(tweet_text=tweet_text,
                                   tweet_time=datetime.now(),
                                   tweet_username=myuser.username,
                                   tweet_url=url)
            tweet_key.put()
            myuser.put()
            self.redirect('/')
예제 #5
0
    def get(self):
        self.response.headers['Content-Type'] = 'text/html'
        user = users.get_current_user()
        if user:
            myuser_key = ndb.Key('MyUser', user.user_id())
            myuser = myuser_key.get()
            upload_url = blobstore.create_upload_url('/edit')
            pic_key = myuser.DP
            key = BlobKey(str(myuser.DP))
            url = get_serving_url(key)
            template_values = {
                'myuser': myuser,
                'user': user,
                'upload_url': upload_url,
                'pic_key': pic_key,
                'url': url,
            }
            template = JINJA_ENVIRONMENT.get_template('edit.html')
        else:
            template = JINJA_ENVIRONMENT.get_template("error.html")
            template_values = {
                "error": "Please login first!",
                "url": "/",
            }

        self.response.write(template.render(template_values))
예제 #6
0
 def _get_info(self, name):
     if name.startswith('/gs/'):
         assert cloudstorage, 'cloudstorage module is not available.'
         return CloudStorageInfo(name)
     else:
         key = BlobKey(name.split('/', 1)[0])
         return BlobInfo.get(key)
예제 #7
0
 def post(self, nirmal):
     photo_instance = UserPhoto.query(UserPhoto.photoKey == BlobKey(
         self.request.get("blobkey"))).fetch()
     for htc in photo_instance:
         if self.session["userid"] not in htc.like:
             htc.like.append(int(self.session["userid"]))
             htc.put()
     self.redirect("/user/?id=%s" % self.session['userid'])
예제 #8
0
    def new_file(self, field_name, file_name, content_type, content_length, charset=None, content_type_extra=None):
        if content_type_extra:
            self.blobkey = content_type_extra.get('blob-key')

        if self.blobkey:
            self.blobkey = BlobKey(self.blobkey)
            raise StopFutureHandlers()
        else:
            return super(BlobstoreFileUploadHandler, self).new_file(field_name, file_name, content_type, content_length, charset)
예제 #9
0
 def new_file(self, *args, **kwargs):
     super(AppEngineFileUploadHandler, self).new_file(*args, **kwargs)
     blobkey = self.content_type_extra.get('blob-key')
     self.activated = blobkey is not None
     if self.activated:
         self.blobkey = BlobKey(blobkey)
         self.filename = kwargs.get('file_name', None)
         self.file = StringIO()
         raise StopFutureHandlers()
예제 #10
0
파일: manage.py 프로젝트: karimhouty/Octave
    def post(self):
        # key_media = ndb.Key(urlsafe=self.request.get("key_media"))
        key_media = self.request.get("key_media")

        blobkey = BlobKey(key_media)

        media_query = Media.gql("WHERE key_media = :1", blobkey)
        media = media_query.get()
        blobstore.delete(key_media)

        media.key.delete()
예제 #11
0
  def new_file(self, *args, **kwargs):
    """field_name, file_name, content_type, content_length, charset=None"""

    logger.debug('BlobstoreFileUploadHandler.new_file')
    super(BlobstoreFileUploadHandler, self).new_file(*args, **kwargs)

    blobkey = get_blobkey_from_body(self.request.body)
    self.active = blobkey is not None
    if self.active:
      self.blobkey = BlobKey(blobkey)
      raise StopFutureHandlers()
예제 #12
0
    def receive(self, mail_message):
        #Check that the subject contains a valid email address
        email_valid = validate_email(mail_message.subject)
        #If it does then proceed to assign the request
        if email_valid == True:
            #Make sure instructor is lower-case otherwise it is not assigned properly
            instructor = str(mail_message.subject)
            instructor = str.lower(instructor)
            #Generate a fake BlobKey to not upset GAE - this should be restructured in future
            blob_key = BlobKey("null")
            #Generate a horrible uuid index for the request
            requestId = str(uuid.uuid4())

            #Get the body from the email as plain text - this acts as our request desciption
            decodedBody = ''
            textBody = mail_message.bodies('text/plain')
            for content_type, body in textBody:
                decodedBody = body.decode()

            #Submit the request
            main.submit_form(requestId, str(mail_message.sender),
                             str(mail_message.sender), "other", instructor,
                             str(decodedBody), blob_key, "email")

            #Inform the instructor they have a new request
            instructorMessage = mail.EmailMessage(
                sender="MitCircs <*****@*****.**>",
                subject="MitCircs - New Submission")
            instructorMessage.to = instructor
            instructorMessage.html = """<h1 style='text-align: center'>MitCircs - New Request</h1>
            <br> <p style='text-align: center'> You have recieved a new request from:
            <br> <b>""" + str(mail_message.sender) + """</b>
            <br> <br> Request ID:
            <br> <br> <b>""" + requestId + """</b>
            <br> <br> To view this submission, please login to <a href='https://mitcircs.robtaylor.info'>MitCircs</a> and click on "manage requests".
            <br> <br> Thanks,
            <br> The MitCircs Team </p>"""
            instructorMessage.send()
        #The subject doesn't contain a valid email - inform the student of this and don't assign the request
        else:
            studentMessage = mail.EmailMessage(
                sender="MitCircs <*****@*****.**>",
                subject="MitCircs - Submission Error")
            studentMessage.to = mail_message.sender
            studentMessage.html = """<h1 style='text-align: center'>MitCircs - Submission Error</h1>
            <br> <p style='text-align: center'> Your email submission has not been logged. Please ensure you include your instructor's email in the subjext line.
            <br> <br> Thanks,
            <br> The MitCircs Team</p>"""
            studentMessage.send()
예제 #13
0
def serve_file(request,
               blob_key_or_info,
               as_download=False,
               content_type=None,
               filename=None,
               offset=None,
               size=None):
    """
        Serves a file from the blobstore, reads most of the data from the blobinfo by default but you can override stuff
        by passing kwargs.
    """

    if isinstance(blob_key_or_info, BlobKey):
        info = BlobInfo.get(blob_key_or_info)
    elif isinstance(blob_key_or_info, basestring):
        info = BlobInfo.get(BlobKey(blob_key_or_info))
    elif isinstance(blob_key_or_info, BlobInfo):
        info = blob_key_or_info
    else:
        raise ValueError("Invalid type %s" % blob_key_or_info.__class__)

    response = HttpResponse(content_type=content_type or info.content_type)
    response[BLOB_KEY_HEADER] = str(info.key())
    response['Accept-Ranges'] = 'bytes'
    http_range = request.META.get('HTTP_RANGE')

    if offset or size:
        # Looks a little bonkers, but basically create the HTTP range string, we cast to int first to make sure
        # nothing funky gets into the headers
        http_range = "{}-{}".format(
            str(int(offset)) if offset else "",
            str(int(offset or 0) + size) if size else "")

    if http_range is not None:
        response[BLOB_RANGE_HEADER] = http_range

    if as_download:
        response['Content-Disposition'] = smart_str(
            u'attachment; filename="%s"' % filename or info.filename)
    elif filename:
        raise ValueError(
            "You can't specify a filename without also specifying as_download")

    if info.size is not None:
        response['Content-Length'] = info.size
    return response
예제 #14
0
    def get(self):
		self.response.headers['Content-Type'] = 'text/html'
		user = users.get_current_user()
		myuser_key = ndb.Key('MyUser', user.user_id())
		myuser = myuser_key.get()
		post = []
		cap = []
		keys = []
		usr = ndb.Key('MyUser',self.request.get('id')).get()
		for key in reversed(usr.post):
			ndbk = key.get()
			cap.append(ndbk.cap)
			keys.append(ndbk.pst)
		for key in keys:
			post.append(get_serving_url(key))
		fb = 'Follow'
		if user:
			myuser_key = ndb.Key('MyUser', user.user_id())
			myuser = myuser_key.get()

			key = BlobKey(str(usr.DP))
			mimg= get_serving_url(key)
			len1 = len(usr.follows)
			len2 = len(usr.followers)
			if usr.key in myuser.follows:
				fb = 'Unfollow'
			template_values = {
                'myuser' : myuser,
	            'usr' : usr,
                'mimg' : mimg,
                'fb' : fb,
                'len1' : len1,
                'len2' : len2,
				'post' : post,
				'cap' : cap
			}
			template = JINJA_ENVIRONMENT.get_template('userinfo.html')
		else:
			template = JINJA_ENVIRONMENT.get_template("error.html")
			template_values = {
			"error" : "Please login first!" ,
			"url" : "/",
			}
		self.response.write(template.render(template_values))
예제 #15
0
 def get(self):
     self.response.headers['Content-Type'] = 'text/html'
     user = users.get_current_user()
     if user:
         myuser_key = ndb.Key('MyUser', user.user_id())
         myuser = myuser_key.get()
         mypost = None
         post_key = ndb.Key('PostDb', user.user_id())
         mypost = post_key.get()
         upload_url = blobstore.create_upload_url('/adpost')
         key = BlobKey(str(myuser.DP))
         template_values = {
             'myuser': myuser,
             'user': user,
             'upload_url': upload_url,
             'mypost': mypost,
             #'url' : url
         }
         template = JINJA_ENVIRONMENT.get_template('addpost.html')
         self.response.write(template.render(template_values))
예제 #16
0
 def _get_key(self, name):
     return BlobKey(name.split('/', 1)[0])
예제 #17
0
 def file_info(self, name):
     key = BlobKey(name.split('/', 1)[0])
     return BlobInfo(key)
예제 #18
0
def submit_handler():
    #First let's deal with the submitted file
    file = request.files['file']
    #Check the filetype is allowed (doc, docx only)
    if file and extension_check(file.filename):
        #Get file type, generate BlobKey and create supportingDocument object
        header = file.headers['Content-Type']
        blob_string = parse_options_header(header)[1]['blob-key']
        blob_key = BlobKey(blob_string)
        supportingDocument = SupportingDocument(user=session['userId'],
                                                blob_key=blob_key)
        #Make sure we save the object
        supportingDocument.put()

        #Using a UUID as an index... see assignment write-up for why. Sorry in advance!
        requestId = str(uuid.uuid4())

        #Send all our form data to submit_form
        submit = submit_form(id=requestId,
                             email=request.form['email'],
                             name=request.form['name'],
                             reason=request.form['reason'],
                             instructor=request.form['instructor'],
                             description=request.form['description'],
                             file_key=blob_key,
                             requestType="")

        #Now let's notify the instructor that they have a new request
        #Personal email address is used, sorry about that!
        instructorMessage = mail.EmailMessage(
            sender="MitCircs <*****@*****.**>",
            subject="MitCircs - New Submission")
        instructorMessage.to = request.form['instructor']
        #Using some HTML with formatting to make the email less bland
        instructorMessage.html = """<h1 style='text-align: center'>MitCircs - New Request</h1>
        <p style='text-align: center'>Hello """ + request.form[
            'instructor'] + """! 
        <br> <br> You have recieved a new request from:
        <br> <b>""" + request.form['email'] + """</b>
        <br> <br> Request ID: 
        <br> <b>""" + requestId + """</b>
        <br> <br> To view this submission, please login to <a href='https://mitcircs.robtaylor.info'>MitCircs</a> and click on "manage requests".
        <br> <br> Thanks,
        <br> The MitCircs Team </p>"""

        #Now let's notify the student that they submitted the request correctly
        studentMessage = mail.EmailMessage(
            sender="MitCircs <*****@*****.**>",
            subject="MitCircs - Submission Reciept")
        studentMessage.to = request.form['email']
        studentMessage.html = """<h1 style='text-align: center'>MitCircs - Submission Reciept</h1>
        <p style='text-align: center'>Hello """ + request.form['email'] + """! 
        <br> <br> This email is your reciept for your request to:
        <br> <b>""" + request.form['instructor'] + """</b>
        <br> <br> Request ID: 
        <br> <b>""" + requestId + """</b>
        <br> <br> To view this submission, please login to <a href='https://mitcircs.robtaylor.info'>MitCircs</a> and click on "manage requests".
        <br> <br> Thanks,
        <br> The MitCircs Team </p>"""

        #Attempt to send both emails, return to dashboard with error if this doesn't happen
        try:
            instructorMessage.send()
            studentMessage.send()
        except:
            session[
                'failure'] = "Failed to send email to instructor or student. Please check the submission in Manage Requests"
            return render_template('submit_handler.html')

        if submit is not None:
            session['success'] = "The form has been submitted!"
    #Student submitted an incorrect file, inform them of their mistake
    else:
        session[
            'failure'] = "There was an error submitting the form. Please ensure all fields are filled correctly and the file extension is accepted."

    return redirect(url_for('dashboard'))
예제 #19
0
파일: connexus.py 프로젝트: oel92/APT
    def handle_upload(self):
	print "test"
        results = []
        blob_keys = []
        for name, fieldStorage in self.request.POST.items():
            if type(fieldStorage) is unicode:
                continue
            result = {}
            result['name'] = re.sub(
                r'^.*\\',
                '',
                fieldStorage.filename
            )
            result['type'] = fieldStorage.type
            result['size'] = self.get_file_size(fieldStorage.file)

		
            if self.validate(result):
                blob_key = str(
                    self.write_blob(fieldStorage.value, result)
                )
                blob_keys.append(blob_key)
                result['deleteType'] = 'DELETE'
                result['deleteUrl'] = self.request.host_url +\
                    '/?key=' + urllib.quote(blob_key, '')
		

		#image = Image(parent=streamKey)
			
		#upload_files = self.get_uploads('file')
		#if (len(upload_files) > 0 ):
		#	blob_info = upload_files[0]
		#	website = images.get_serving_url(blob_info)
		#	image.blob_url = website
		#	image.blob_key = blob_info.key()
		#	image.comment = self.request.get("comments")
		#	image.put()
		#	stream_obj.date_updated = datetime.datetime.now()
		#	stream_obj.date_only_updated = datetime.datetime.now().date()
		#	stream_obj.num_pics = stream_obj.num_pics + 1
		#	stream_obj.put()
				
									
		#query_params = {'stream_key': stream_obj.key.urlsafe(), 'upload': True}
		#self.redirect('/streamview?' + urllib.urlencode(query_params))


                if (IMAGE_TYPES.match(result['type'])):
                    try:
			print "hello"
			
                        result['url'] = images.get_serving_url(
                            blob_key,
                            secure_url=self.request.host_url.startswith(
                                'https'
                            )
                        )
			print result['url']
                        result['thumbnailUrl'] = result['url'] +\
                            THUMBNAIL_MODIFICATOR
			

			print str(fieldStorage.file)
			print str(fieldStorage)
			print str(fieldStorage.type)
			print blob_key
			
				
			urlString = self.request.get("stream_key")
			streamKey = ndb.Key(urlsafe=urlString)
			image = Image(parent=streamKey)
			
			image.blob_url = result['url']
			key = str(blob_key)
			print key
			image.blob_key = BlobKey(key)
			image.comment = ""	
			long = uniform(-180,180)
			lat = uniform(-70, 70)
			image.longitude = long
			image.latitude = lat
			image.put()
			

			
			stream_obj = streamKey.get()
			stream_obj.date_updated = datetime.datetime.now()
			stream_obj.date_only_updated = datetime.datetime.now().date()
			stream_obj.num_pics = stream_obj.num_pics + 1
			stream_obj.put()
			
                    except:  # Could not get an image serving url
                        pass
                if not 'url' in result:
                    result['url'] = self.request.host_url +\
                        '/' + blob_key + '/' + urllib.quote(
                            result['name'].encode('utf-8'), '')
            results.append(result)
        deferred.defer(
            cleanup,
            blob_keys,
            _countdown=EXPIRATION_TIME
        )
        return results