summaryrefslogtreecommitdiff
path: root/fbin/db.py
diff options
context:
space:
mode:
authorJon Bergli Heier <snakebite@jvnv.net>2017-04-09 09:02:09 +0200
committerJon Bergli Heier <snakebite@jvnv.net>2017-04-09 09:02:09 +0200
commitb36f9c05071ea549ed59e703270fcf223b60df03 (patch)
tree8992c6bcaa5b0d64cbd589588b2539523125548c /fbin/db.py
parentaf750a6598d53b8a5cb58092dd5b523ea7e967ca (diff)
Major rewrite to use jab/oauth.
Highlights: - Uses the oauth branch of jab. - Changed design to use bootstrap. - Some minor changes to functionality in file uploading and listing. - API is currently disabled and incomplete.
Diffstat (limited to 'fbin/db.py')
-rw-r--r--fbin/db.py121
1 files changed, 121 insertions, 0 deletions
diff --git a/fbin/db.py b/fbin/db.py
new file mode 100644
index 0000000..dfe3b17
--- /dev/null
+++ b/fbin/db.py
@@ -0,0 +1,121 @@
+from contextlib import contextmanager
+import mimetypes
+import os
+
+from flask import current_app
+from sqlalchemy import create_engine, Column, Integer, String, DateTime, Text, Index, ForeignKey, Boolean
+from sqlalchemy.ext.declarative import declarative_base
+from sqlalchemy.orm import sessionmaker, relation, backref
+from sqlalchemy.orm.exc import NoResultFound
+from sqlalchemy.exc import IntegrityError
+from sqlalchemy.sql import and_
+
+engine = create_engine(current_app.config['DB_URI'])
+
+Base = declarative_base(bind = engine)
+
+class User(Base):
+ __tablename__ = 'users'
+
+ id = Column(Integer, primary_key = True)
+ username = Column(String, unique = True, index = True)
+ jab_id = Column(String(24), unique = True, index = True)
+ files = relation('File', backref = 'user', order_by = 'File.date.desc()')
+
+ def __init__(self, username, jab_id):
+ self.username = username
+ self.jab_id = jab_id
+
+class UserSession(Base):
+ __tablename__ = 'sessions'
+
+ id = Column(Integer, primary_key = True)
+ user_id = Column(Integer, ForeignKey('users.id'), index = True)
+ access_token = Column(String)
+ refresh_token = Column(String)
+ updated = Column(DateTime)
+
+ def __init__(self, user_id, access_token, refresh_token):
+ self.user_id = user_id
+ self.access_token = access_token
+ self.refresh_token = refresh_token
+
+class File(Base):
+ __tablename__ = 'files'
+
+ id = Column(Integer, primary_key = True)
+ hash = Column(String, unique = True, index = True)
+ filename = Column(String)
+ date = Column(DateTime)
+ user_id = Column(Integer, ForeignKey('users.id'), nullable = True)
+ ip = Column(String)
+ accessed = Column(DateTime)
+
+ def __init__(self, hash, filename, date, user_id = None, ip = None):
+ self.hash = hash
+ self.filename = filename
+ self.date = date
+ self.user_id = user_id
+ self.ip = ip
+
+ @staticmethod
+ def pretty_size(size):
+ if size is None:
+ return 'N/A'
+ suffixes = (('TiB', 2**40), ('GiB', 2**30), ('MiB', 2**20), ('KiB', 2**10))
+ for suf, threshold in suffixes:
+ if size >= threshold:
+ return '{:.2f} {}'.format(size / threshold, suf)
+ else:
+ continue
+ return '{} B'.format(size)
+
+ def get_path(self):
+ return os.path.join(current_app.config['FILE_DIRECTORY'], self.hash + os.path.splitext(self.filename)[1])
+
+ def get_thumb_path(self):
+ return os.path.join(current_app.config['THUMB_DIRECTORY'], self.hash + '.jpg')
+
+ def get_size(self):
+ try:
+ return os.path.getsize(self.get_path())
+ except OSError:
+ return None
+
+ @property
+ def formatted_size(self):
+ return self.pretty_size(self.get_size())
+
+ @property
+ def formatted_date(self):
+ return self.date.strftime('%Y-%m-%d %H:%M:%S UTC')
+
+ def get_mime_type(self):
+ return mimetypes.guess_type(self.filename, strict = False)[0] or 'application/octet-stream'
+
+ def is_image(self):
+ return self.get_mime_type().startswith('image')
+
+ @property
+ def ext(self):
+ return os.path.splitext(self.filename)[1]
+
+ @property
+ def exists(self):
+ return os.path.exists(self.get_path())
+
+Base.metadata.create_all()
+Session = sessionmaker(bind = engine, autoflush = True, autocommit = False)
+
+@contextmanager
+def session_scope():
+ session = Session()
+ try:
+ session.expire_on_commit = False
+ yield session
+ session.commit()
+ except:
+ session.rollback()
+ raise
+ finally:
+ session.close()