Ejemplo n.º 1
0
def download():
    '''Grabs the latest.'''

    # Download Files
    date_str = date.today().strftime("%Y_%m_%d")
    new_folder_path = "data/downloaded_%s" % date_str
    download_files(new_folder_path)


    # Delete if already exist in database
    for path, subdirs, files in os.walk(new_folder_path):
        for f in files:
            if already_downloaded(path + '/' + f):
                print "Didn't save '%s' because it was already in the database." % f
                os.remove(path + '/' + f)
            else:
                print "Saved new file '%s/%s'" % (path, f)

                File.create(
                    name = f,
                    years=next(re.finditer(r'\d{4}_\d{4}', f)),
                    sha1 = sha1OfFile(path + '/' + f),
                    updated = date.today(),
                    ingested = False
                )
Ejemplo n.º 2
0
async def file_create(token: Optional[str] = Header(None), file: bytes = FastFile(...)):
    print(token, len(file))
    """
    创建文件
    """
    user = security.get_current_user(token)
    file = File.create('', '', user.id, file, '')

    return {"file": file.id}
Ejemplo n.º 3
0
def folder(folder_name):
    try:
        folder = Folder.get(Folder.name == folder_name)
    except peewee.DoesNotExist:
        return jsonify(message="error"), 404

    if request.method == "GET":
        return jsonify(message="OK", data=model_to_dict(folder, backrefs=True))

    if request.method == "POST":
        f = request.files["file"]
        if f:
            actual_filename = generate_filename(folder_name, f.filename)
            target_file = os.path.join(
                os.path.expanduser(config.UPLOAD_FOLDER), actual_filename)
            if os.path.exists(target_file):
                return jsonify(message="error"), 409

            try:
                f.save(target_file)
                f2 = File.create(folder=folder,
                                 filename=f.filename,
                                 public_share_url=generate_url(),
                                 open_public_share=False)
                f2.save()
            except Exception as e:
                print(e)
                return jsonify(message="error"), 500

            return jsonify(message="OK"), 201

    if request.method == "DELETE":
        try:
            for f in folder.files:
                actual_filename = generate_filename(folder_name, f.filename)
                target_file = os.path.join(
                    os.path.expanduser(config.UPLOAD_FOLDER), actual_filename)
                f2 = File.get(File.filename == f.filename)
                f2.delete_instance()
                if os.path.exists(target_file):
                    os.remove(target_file)
            folder.delete_instance()
        except Exception as e:
            return jsonify(message="error"), 409

    return jsonify(message="OK")
Ejemplo n.º 4
0
def folder(folder_name):
    try:
        f = Folder.get(name=folder_name)
    except peewee.DoesNotExist:
        return jsonify(message='error'), 404

    if request.method == 'POST':
        file = request.files['file']
        if file:
            actual_filename = secure_filename(
                folder_name + '_' + file.filename)
            if os.path.exists(os.path.join(app.config['UPLOAD_FOLDER'], actual_filename)):
                return jsonify(message='error'), 409
            file.save(
                os.path.join(app.config['UPLOAD_FOLDER'], actual_filename))
            f2 = File.create(folder=folder_name,
                             filename=file.filename,
                             public_share_url=generate_url(),
                             private_share_url=generate_url(),
                             private_share_password=generate_password(),
                             open_public_share=False,
                             open_private_share=False)
            f2.save()
            return jsonify(message='OK'), 201

    if request.method == 'GET':
        files = File.select().where(File.folder == folder_name)
        items = [{
            'filename': x.filename,
            'public': x.public_share_url,
            'private': x.private_share_url,
            'password': x.private_share_password,
            'openPublic': x.open_public_share,
            'openPrivate': x.open_private_share
        } for x in files]

        return jsonify(message='OK', items=items)

    if request.method == 'DELETE':
        try:
            f.delete_instance()
        except peewee.IntegrityError:
            return jsonify(message='error'), 409
        return jsonify(message='OK')
Ejemplo n.º 5
0
def add_file(**kwargs):
    file = File.create(**kwargs)
    return file
Ejemplo n.º 6
0
def create_file(args):
    fingerprint = user = None
    if args.authorization is not None:
        try:
            user = helpers.get_user(args.authorization)
        except:
            raise ApiError('Invalid Authentication')

    if args.fingerprint is not None and user is None:
        fingerprint = args.fingerprint

    min_vanity = max_vanity = args.vanity.count('/')
    for part in args.vanity.split('/'):
        minv, maxv = parse_vanity_part(part)
        min_vanity += minv
        max_vanity += maxv

    if min_vanity < MIN_VANITY_LENGTH or MAX_VANITY_LENGTH < max_vanity:
        raise ApiError(
            'Vanity has to be at least or in between {} and {} characters long'
            .format(MIN_VANITY_LENGTH, MAX_VANITY_LENGTH))

    fextension = None
    if args.type == 'multipart':
        storage = next(request.files.values(), None)
        if storage is None:
            raise ApiError('A file must be uploaded')
        if args.filename is None:
            args.filename = storage.filename
        else:
            # get original extension from uploaded file
            # just incase we generate filename in future
            if '.' in storage.filename:
                fextension = storage.filename.split('.')[-1]
        mimetype = storage.mimetype
        stream = storage.stream
        stream.seek(0, 2)
        fsize = stream.tell()
        stream.seek(0)
    elif args.type == 'raw':
        mimetype = request.mimetype
        stream = request.stream
        fsize = request.content_length
    else:
        raise ApiError('Invalid Upload Type')

    #check filesize

    fname = None
    if args.filename is None:
        fname = [generate_vanity()]
    else:
        fname = args.filename.split('.')

    if 1 < len(fname):
        # do we want to use the original filename's extension all the time?
        if fextension is None:
            fextension = fname.pop(-1)
        elif fextension.lower() == fname[-1].lower():
            fextension = fname.pop(-1)

    mime = Mimetype.get_or_none(id=mimetype)
    if mime is None:
        if fextension is None:
            raise InvalidMimetype()
        mextension = MimetypeExtension.get_or_none(
            extension=fextension.lower())
        if mextension is None:
            raise InvalidMimetype()
        # mime = mextension.mime
        mimetype = mextension.mimetype_id
    else:
        # use extension to determine filetype
        if mime.id == 'application/octet-stream':
            if fextension is not None:
                mextension = MimetypeExtension.get_or_none(
                    extension=fextension.lower())
                if mextension is not None:
                    mimetype = mextension.mimetype_id
    # check flags

    if fextension is not None:
        mextension = MimetypeExtension.get_or_none(
            mimetype=mimetype, extension=fextension.lower())
        # keep extension incase its not found
        if mextension is None:
            fname.append(fextension)
            fextension = None
        else:
            # set it to the stored version, just this or fextension.lower()
            fextension = mextension.extension

    if fextension is None:
        mextension = (MimetypeExtension.select().where(
            MimetypeExtension.mimetype == mimetype).order_by(
                MimetypeExtension.priority.desc()).limit(1).execute())
        if mextension:
            fextension = mextension[0].extension
        else:
            if mimetype.endswith('+json'):
                fextension = 'json'
            elif mimetype.endswith('+xml'):
                fextension = 'xml'

    fname = '.'.join(fname)[:256]  # just incase they send a huge text lol
    while '{random}' in fname:
        fname = fname.replace('{random}', generate_vanity(), 1)
    fname = re.sub(FILENAME_REGEX, '_', fname[:128])

    # we read the filedata now to get the hashes of it
    fdata = stream.read(fsize)

    hblake2b = hashlib.blake2b(fdata).hexdigest()
    hmd5 = hashlib.md5(fdata).hexdigest()
    hsha1 = hashlib.sha1(fdata).hexdigest()

    fid = Snowflake.generate()
    fhash = FileHash.get_or_none(blake2b=hblake2b, md5=hmd5, sha1=hsha1)
    if fhash is None:
        fhash = FileHash.create(
            id=Snowflake.generate(),
            blake2b=hblake2b,
            md5=hmd5,
            sha1=hsha1,
            size=fsize,
        )
        # upload it now
        bucket = current_app.gcs.get_bucket(current_app.config.storage_bucket)
        blob = bucket.blob('files/{}'.format(fhash.id))
        blob.upload_from_string(fdata,
                                content_type='application/octet-stream',
                                predefined_acl='publicRead')

    unique = False
    while not unique:
        fvanity = generate_vanity(args.vanity)
        unique = bool(File.get_or_none(vanity=fvanity) is None)

    fobj = File.create(
        id=fid,
        vanity=fvanity,
        mimetype=mimetype,
        extension=fextension,
        filename=fname,
        hash=fhash,
        user=user,
        fingerprint=fingerprint,
    )
    return ApiResponse(fobj.to_dict())
Ejemplo n.º 7
0
users[0].email = '*****@*****.**'
print(classes[0])
print(users[1].classes)
users[1].classes.append(classes[0])
users[2].user_classes.append(UserClass(classes[0], users[2], 'teacher'))

session.add_all(users)
session.add_all(classes)

session.commit()

mimi = User.create('*****@*****.**', '123456')
mimi.name = 'Mimi'

file1 = File.create('image.png', '', mimi.id, b'12345', 'image/png')
file2 = File.create('image.png', '', mimi.id, b'67890', 'image/png')
print(File.get_file_by_id(file1.id))
print(File.get_files_by_owner(mimi.id))

file1.update(file1.name, 'This is an image', file1.owner, file1.content,
             file1.mime)

print(file1.description)

session.commit()

for instance in session.query(User).order_by(User.id):
    print(instance)

print(User.get_user_by_name('Mimi2'))