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)
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')
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})
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 })
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'))
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)
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']))
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))
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
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')
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)
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')
def index(): table = get_db().Table('Index') return render_template('engine/index.html')