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
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({})
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'
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
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}
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
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