Example #1
0
def upload():
    '''
    handle requests to api/upload

    params:
    username, password and the file content

    return: ok if success, otherwise a error message will be returned with request content type
    '''
    error = None
    username = request.form['username']
    password = request.form['password']

    table = get_db().Table('Users')

    response = table.get_item(Key={'username': username})

    user = response['Item'] if 'Item' in response else None

    if user is None:
        error = 'User is not valid'
    elif not check_password_hash(user["password"], password):
        error = 'Incorrect password.'

    if error is not None:
        return abort(404, error)

    if 'file' not in request.files:
        error = 'You cannot upload empty file.'
    elif request.files['file'].filename == '':
        error = "Your file name is not valid."
    elif not allowed_file(request.files['file'].filename):
        error = "Your File format is not correct: {}".format(
            request.files['file'].filename)
    elif '\'' in request.files['file'].filename or '\"' in request.files[
            'file'].filename:
        error = "Invalid file name."
    else:
        file = request.files['file']
        filename = file.filename
        id = datetime.utcnow().strftime(
            "%Y-%m-%d-%H-%M-%S-%f") + user['username'].replace(
                '.', '').replace('/', '')
        filename = str(id) + '.' + filename.rsplit('.', 1)[1].lower()

        table = get_db().Table('Images')

        table.put_item(Item={'imageid': filename, 'user': user['username']})

        move_to_s3(file, filename)

        return 'ok\n'

    return abort(404, error)
Example #2
0
def login():
    """handle login request and create a new session for him"""
    if request.method == 'POST':
        username = request.form['username']
        password = request.form['password']
        error = None

        table = get_db().Table('Users')

        response = table.get_item(Key={'username': username})

        user = response['Item'] if 'Item' in response else None

        if user is None:
            error = 'Incorrect username.'
        elif not check_password_hash(user["password"], password):
            error = 'Incorrect password.'

        if error is None:
            session.clear()
            session['username'] = user["username"]
            return redirect(url_for('engine.index'))

        flash(error)

    return render_template('auth/login.html')
Example #3
0
def image_batch(query):
    table = get_db().Table('Index')

    if query != '$ANY$':
        aggr_ids = set([])
        for s in query.split():
            resp = table.scan(
                FilterExpression=Key('label').eq(s.lower())
            )
            if 'Items' in resp:
                for item in resp['Items']:
                    keys = set(item['ids'].keys())
                    if len(aggr_ids)== 0:
                        aggr_ids = keys
                    else:
                        aggr_ids = aggr_ids.intersection(keys)
        response = {'Items' : []}
        if len(aggr_ids) != 0:
            response['Items'].append({'ids': {}, 'label' : query.lower()})
        for imageId in aggr_ids:
            response['Items'][0]['ids'][imageId] = True
            
    else:
        table = get_db().Table('Images')
        response = table.scan()

        if response['Items'] is None:
            response['Items'] = []

        data = response['Items'] if len(response['Items']) <= 12 else sample(response['Items'], 12)
        r = {}
        for d in data:
            r[d['imageid']] = True

        response['Items'] = [{'ids': r}]

    images = response['Items'] if response['Items'] else []

    response = table.scan(
        FilterExpression=Attr('label').contains(query.lower())
    )

    similars = response['Items'] if response['Items'] else []

    similars = list(map(lambda x: x['label'], similars))

    return jsonify({'images': images, 'similars': similars})
Example #4
0
def init_db():

    tables = get_db_client().list_tables()

    for table in tables['TableNames']:
        print('dropping ' + table)
        get_db_client().delete_table(TableName=table)
        waiter = get_db_client().get_waiter('table_not_exists')
        waiter.wait(TableName=table)

    print('creating tables')
    db = get_db()
    db.create_table(
        TableName='Users',
        KeySchema=[
            {
                'AttributeName': 'username',
                'KeyType': 'HASH'  # Partition key
            },
        ],
        AttributeDefinitions=[{
            'AttributeName': 'username',
            'AttributeType': 'S'
        }],
        ProvisionedThroughput={
            'ReadCapacityUnits': 10,
            'WriteCapacityUnits': 10
        })

    db.create_table(
        TableName='Images',
        KeySchema=[{
            'AttributeName': 'imageid',
            'KeyType': 'HASH'  # Partition key
        }],
        AttributeDefinitions=[{
            'AttributeName': 'imageid',
            'AttributeType': 'S'
        }],
        ProvisionedThroughput={
            'ReadCapacityUnits': 10,
            'WriteCapacityUnits': 10
        })
    db.create_table(
        TableName='Index',
        KeySchema=[
            {
                'AttributeName': 'label',
                'KeyType': 'HASH'  # Partition key
            },
        ],
        AttributeDefinitions=[{
            'AttributeName': 'label',
            'AttributeType': 'S'
        }],
        ProvisionedThroughput={
            'ReadCapacityUnits': 10,
            'WriteCapacityUnits': 10
        })
Example #5
0
def remove(id):
    """Show image details by given id"""

    table = get_db().Table('Images')

    table.delete_item(Key={'imageid': str(id)})

    delete_on_s3(id)

    return redirect(url_for('image.index'))
Example #6
0
def index():
    """Show all the images, most recent first."""

    table = get_db().Table('Images')

    response = table.scan(FilterExpression=Attr('user').eq(g.user['username']))

    images = response['Items'] if response['Items'] else []

    for image in images:
        image['imageid'] = str(image['imageid'])
        image['thumb'] = get_url('thumbnails', image['imageid'])

    return render_template('image/index.html', images=images, favorite=False)
Example #7
0
def show(id):
    """Show image details by given id"""

    table = get_db().Table('Images')

    response = table.get_item(Key={'imageid': str(id)})

    image = response['Item'] if 'Item' in response else {
        'imageid': id,
        'user': ''
    }

    return render_template('image/show.html',
                           image=image,
                           like=('likes' in g.user and id in g.user['likes']))
Example #8
0
def like(id):
    table = get_db().Table('Users')

    if 'likes' not in g.user:
        g.user['likes'] = {}

    if id in g.user['likes']:
        g.user['likes'].pop(id, None)
    else:
        g.user['likes'][id] = True

    table.update_item(Key={'username': g.user['username']},
                      UpdateExpression="set likes = :l",
                      ExpressionAttributeValues={':l': g.user['likes']})

    return redirect(url_for('image.show', id=id))
Example #9
0
def load_logged_in_user():
    """load current user from session"""
    username = session.get('username')

    if username is None:
        g.user = None
    else:
        table = get_db().Table('Users')

        response = table.get_item(Key={'username': username})

        data = {}

        if 'Item' in response:
            item = response['Item']
            data.update(item)

        g.user = data
Example #10
0
def register():
    """Register a new user and validates its username and password"""
    if request.method == 'POST':
        username = request.form['username']
        password = request.form['password']
        password2 = request.form['password2']
        table = get_db().Table('Users')
        error = None

        if '\'' in password or '\"' in password:
            error = 'Password cannot contain quotation marks.'
        if '\'' in username or '\"' in username:
            error = 'Username cannot contain quotation marks.'
        if not password2 == password:
            error = 'Password is not matching with password confirmation.'
        if not username:
            error = 'Username is required.'
        elif not password:
            error = 'Password is required.'
        else:

            response = table.get_item(Key={'username': username})

            if 'Item' in response:
                error = 'User {0} is already registered.'.format(username)

        if error is None:
            # the name is available, store it in the database and go to
            # the login page

            table.put_item(Item={
                'username': username,
                'password': generate_password_hash(password)
            })

            session['username'] = username

            return redirect(url_for('engine.index'))

        flash(error)

    return render_template('auth/register.html')
Example #11
0
def register():
    '''
    handle requests to api/register

    params:
    username and password

    return: ok if success, otherwise a error message will be returned with request content type
    '''
    username = request.form['username']
    password = request.form['password']

    table = get_db().Table('Users')
    error = None

    if not username:
        error = 'Username is required.'
    elif not password:
        error = 'Password is required.'
    elif '\'' in password or '\"' in password:
        error = 'Password cannot contain quotation marks.'
    elif '\'' in username or '\"' in username:
        error = 'Username cannot contain quotation marks.'
    else:
        response = table.get_item(Key={'username': username})

        if 'Item' in response:
            error = 'User {0} is already registered.'.format(username)

    if error is None:
        table.put_item(Item={
            'username': username,
            'password': generate_password_hash(password)
        })

        return 'ok\n'

    return abort(404, error)
Example #12
0
def create():
    """Create a new image for the current user."""
    if request.method == 'POST':
        error = None

        if 'file' not in request.files:
            error = 'You cannot upload empty file.'
        elif request.files['file'].filename == '':
            error = "Your file name is not valid."
        elif not allowed_file(request.files['file'].filename):
            error = "Your File format is not correct."
        elif '\'' in request.files['file'].filename or '\"' in request.files[
                'file'].filename:
            error = "Invalid file name."
        else:
            file = request.files['file']
            filename = file.filename
            id = datetime.utcnow().strftime(
                "%Y-%m-%d-%H-%M-%S-%f") + g.user['username'].replace(
                    '.', '').replace('/', '')
            filename = str(id) + '.' + filename.rsplit('.', 1)[1].lower()

            table = get_db().Table('Images')

            table.put_item(Item={
                'imageid': filename,
                'user': g.user['username']
            })

            move_to_s3(file, filename)

        if error is not None:
            flash(error)

        return 'ok\n'

    return render_template('image/create.html')
Example #13
0
def index():
    table = get_db().Table('Index')

    return render_template('engine/index.html')