Пример #1
0
def _make_file_path(user_name, album_title, fname):
    with db.pg_connection(config['app-database']) as (_, cur, err):
        if err:
            return False

        # Get database id's
        data = db.query_one(
            cur, '''
SELECT u.id_user, a.id_album
FROM travel_log.album a
JOIN travel_log.user u ON u.id_user = a.fk_user
WHERE u.user_name = %(user)s AND album_title = %(album)s AND NOT is_deleted
            ''', {
                'user': user_name,
                'album': album_title
            })
        uid, aid = data.id_user, data.id_album

        # Generate file path and name
        fs_path = os.path.join(config['storage-engine']['path'], str(uid),
                               str(aid))
        if not os.path.isdir(fs_path):
            os.makedirs(fs_path)

        filename = hashlib.sha256(
            ('%s-%s-%s-%s' % (uid, aid, time.time(), secure_filename(fname))
             ).encode('utf-8')).hexdigest()
        fs_file = os.path.join(fs_path, '%s.jpg' % filename)
        rel_path = os.path.join(str(uid), str(aid), '%s.jpg' % filename)

        return (fs_file, rel_path, aid)
    return False
Пример #2
0
def load_album(current_user, user_name, album_title):
    album = None
    with db.pg_connection(config['app-database']) as (_, cur, err):
        if err:
            logger.error(err)

        try:
            album = db.query_one(
                cur, '''
SELECT *
FROM travel_log.album a
JOIN travel_log.user u ON u.id_user = a.fk_user
WHERE u.user_name = %(user)s AND a.album_title = %(album)s
  AND NOT a.is_deleted
                ''', {
                    'user': user_name,
                    'album': album_title
                })
        except Exception as e:
            logger.error(e)

    if album:
        bg = album.background
        if not bg.startswith('#'):
            bg = url_for('image.images', filename=bg)
        return jsonify({
            'description': album.album_desc,
            'background': bg,
            'autoplay_delay': album.autoplay_delay
        })

    return jsonify({})
Пример #3
0
def get_share_type(user_name, album_title):
    logger.debug('{Module|Share} get_share_type(%s, %s)', user_name,
                 album_title)

    with db.pg_connection(config['app-database']) as (_, cur, err):
        if err:
            logger.error(err)

        try:
            share_type = db.query_one(
                cur, '''
SELECT
  st.share_type_name
FROM travel_log.share s
JOIN travel_log.share_type st ON st.id_share_type = s.fk_share_type
JOIN travel_log.user u ON u.id_user = s.fk_user
JOIN travel_log.album a ON a.id_album = s.fk_album
WHERE u.user_name = %(user)s AND a.album_title = %(album)s
  AND NOT a.is_deleted
                ''', {
                    'user': user_name,
                    'album': album_title
                })
        except Exception as e:
            logger.error(e)

    if share_type and share_type.share_type_name:
        return share_type.share_type_name

    return 'Private'
Пример #4
0
def store_item_fs(file_storage, user_name, album_title):
    fname = _make_file_path(user_name, album_title, file_storage.filename)
    if not fname:
        return False
    fs_file, rel_path, aid = fname

    # TODO: we need to make sure writing to the
    # filesystem/database happens as a transaction, i.e. either
    # both or none.

    try:
        img = Image.open(BytesIO(file_storage.read()))
    except Exception as e:
        logger.error(e)
        return False

    file_storage.seek(0)
    meta_data = get_meta_data(img)
    zoom = DEFAULT_ZOOM_LEVEL if (meta_data['lat']
                                  and meta_data['lon']) else None
    write_image(file_storage, img, fs_file)

    result = False
    with db.pg_connection(config['app-database']) as (_, cur, err):
        if err:
            logger.error(err)

        # Store item in database
        try:
            new_item = db.query_one(
                cur, '''
INSERT INTO travel_log.item (fk_album, image, ts, lat, lon, zoom)
VALUES (%(aid)s, %(image)s, %(ts)s, %(lat)s, %(lon)s, %(zoom)s)
RETURNING id_item
                ''', {
                    'aid': aid,
                    'image': rel_path,
                    'ts': meta_data['date_time'],
                    'lat': meta_data['lat'],
                    'lon': meta_data['lon'],
                    'zoom': zoom
                })
            result = new_item.id_item
        except Exception as e:
            logger.error(e)

    return result
Пример #5
0
def create_new_album(id_user, album_title, album_desc):
    logger.debug('{Modules|Album} create_new_album(%s, %s, %s)', id_user,
                 album_title, album_desc)

    success = False
    with db.pg_connection(config['app-database']) as (_, cur, err):
        if err:
            logger.error(err)

        try:
            album = db.query_one(
                cur,
                'SELECT id_album FROM travel_log.album WHERE album_title = %(album)s and fk_user = %(user)s AND NOT is_deleted;',
                {
                    'album': album_title,
                    'user': id_user
                })
            if not album.id_album:
                cur.execute(
                    'INSERT INTO travel_log.album (album_title, album_desc, fk_user) VALUES (%(title)s, %(desc)s, %(user)s);',
                    {
                        'title': album_title,
                        'desc': album_desc,
                        'user': id_user
                    })

                cur.execute(
                    '''
INSERT INTO travel_log.share (fk_album, fk_share_type, fk_user)
  SELECT
    id_album,
    id_share_type,
     %(user)s
  FROM travel_log.album a
  CROSS JOIN travel_log.share_type st
  WHERE a.fk_user = %(user)s
    AND a.album_title = %(title)s
    AND st.share_type_name = \'Private\'
                ''', {
                        'title': album_title,
                        'user': id_user
                    })
                success = True
        except Exception as e:
            logger.error(e)

    return {'success': success}
Пример #6
0
def get_user_id(user_name):
    result = None
    with db.pg_connection(config['app-database']) as (_, cur, err):
        if err:
            logger.error(err)

        try:
            user = db.query_one(
                cur, '''
SELECT id_user
  FROM travel_log.user
 WHERE user_name = %(user)s
                ''', {'user': user_name})
            result = user.id_user
        except Exception as e:
            logger.error(e)
    return result
Пример #7
0
def is_shared(current_user, user_name, album_title, secret_part):
    if is_current_user(user_name, current_user):
        return True

    share_type = None
    with db.pg_connection(config['app-database']) as (_, cur, err):
        if err:
            logger.error(err)

        try:
            share_type = db.query_one(
                cur,
                '''
SELECT
  st.share_type_name,
  s.secret
FROM travel_log.share s
JOIN travel_log.share_type st ON st.id_share_type = s.fk_share_type
JOIN travel_log.album a ON a.id_album = s.fk_album
JOIN travel_log.user u ON u.id_user = s.fk_user
WHERE a.album_title = %(album)s
  AND u.user_name = %(user)s
  AND NOT a.is_deleted
                ''',
                {'user': user_name, 'album': album_title}
            )
        except Exception as e:
            logger.error(e)

    if not share_type:
        return False

    if share_type.share_type_name == 'Public':
        return True

    if share_type.share_type_name == 'Hidden':
        if share_type.secret and share_type.secret == secret_part:
            return True

    return False