Source code for frostmark.models
'''
ORM SQLAlchemy models for Frostmark application storage.
'''
from ensure import ensure_annotations
from sqlalchemy import Column, Integer, String, BLOB, ForeignKey
from sqlalchemy.orm import relationship
from frostmark.db import BASE
[docs]class Folder(BASE):
'''
Folder item for grouping bookmarks.
ID 0 is reserved for ROOT folder.
'''
# pylint: disable=too-few-public-methods
__tablename__ = 'folder'
__ROOT_ID__ = 0
__ROOT_NAME__ = 'ROOT'
id = Column(Integer, primary_key=True, nullable=False, autoincrement=True)
folder_name = Column(String, nullable=False, default='')
parent_folder_id = Column(
Integer, ForeignKey('folder.id'),
nullable=False, default=0
)
# not a column
bookmarks = relationship('Bookmark', backref=__tablename__)
parent_folder = relationship(
'Folder', backref=__tablename__, remote_side='Folder.id'
)
@staticmethod
@ensure_annotations
def get_root() -> tuple:
'''
Return root folder constants to e.g. create root folder value in DB
if it does not exist.
'''
return (Folder.__ROOT_ID__, Folder.__ROOT_NAME__)
def __repr__(self):
return (
"<Folder("
"id=%s, name='%s', parent_folder_id=%s"
")>" % (
self.id, self.folder_name,
self.parent_folder_id,
)
)
[docs]class Bookmark(BASE):
'''
Bookmark item containing URL, title, icon (favicon.ico) and folder_id.
'''
# pylint: disable=too-few-public-methods
__tablename__ = 'bookmark'
id = Column(Integer, primary_key=True, nullable=False, autoincrement=True)
title = Column(String, nullable=False)
url = Column(String, nullable=False)
icon = Column(BLOB, nullable=False)
folder_id = Column(
Integer, ForeignKey('folder.id'),
nullable=False, default=0
)
def __repr__(self):
return (
"<Bookmark("
"id=%s, title='%s', url='%s', folder_id=%s"
")>" % (
self.id, self.title,
self.url, self.folder_id
)
)