From 8bd82176356540b88eece24b96d7eb6a2260d718 Mon Sep 17 00:00:00 2001 From: Cédric Bonhomme Date: Sun, 12 Feb 2017 16:41:09 +0100 Subject: prototypefor bookmarks --- src/web/models/__init__.py | 6 ++++- src/web/models/article.py | 8 +++--- src/web/models/bookmark.py | 67 ++++++++++++++++++++++++++++++++++++++++++++++ src/web/models/tag.py | 40 ++++++++++++++++++++++----- src/web/models/user.py | 4 +++ 5 files changed, 114 insertions(+), 11 deletions(-) create mode 100644 src/web/models/bookmark.py (limited to 'src/web/models') diff --git a/src/web/models/__init__.py b/src/web/models/__init__.py index 1fc0c3e0..c8fc1aef 100644 --- a/src/web/models/__init__.py +++ b/src/web/models/__init__.py @@ -33,8 +33,12 @@ from .article import Article from .icon import Icon from .category import Category from .tag import Tag +from .tag import BookmarkTag +from .tag import ArticleTag +from .bookmark import Bookmark -__all__ = ['Feed', 'Role', 'User', 'Article', 'Icon', 'Category', 'Tag'] +__all__ = ['Feed', 'Role', 'User', 'Article', 'Icon', 'Category', 'Tag', + 'Bookmark', 'ArticleTag', 'BookmarkTag'] import os diff --git a/src/web/models/article.py b/src/web/models/article.py index 87ad1a9a..923d6869 100644 --- a/src/web/models/article.py +++ b/src/web/models/article.py @@ -52,10 +52,10 @@ class Article(db.Model, RightMixin): category_id = db.Column(db.Integer(), db.ForeignKey('category.id')) # relationships - tag_objs = db.relationship('Tag', back_populates='article', - cascade='all,delete-orphan', - lazy=False, - foreign_keys='[Tag.article_id]') + tag_objs = db.relationship('ArticleTag', back_populates='article', + cascade='all,delete-orphan', + lazy=False, + foreign_keys='[ArticleTag.article_id]') tags = association_proxy('tag_objs', 'text') # index diff --git a/src/web/models/bookmark.py b/src/web/models/bookmark.py new file mode 100644 index 00000000..a796cffa --- /dev/null +++ b/src/web/models/bookmark.py @@ -0,0 +1,67 @@ +#! /usr/bin/env python +# -*- coding: utf-8 -*- + +# Newspipe - A Web based news aggregator. +# Copyright (C) 2010-2016 Cédric Bonhomme - https://www.cedricbonhomme.org +# +# For more information : https://github.com/newspipe/newspipe +# +# This program is free software: you can redistribute it and/or modify +# it under the terms of the GNU Affero General Public License as +# published by the Free Software Foundation, either version 3 of the +# License, or (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU Affero General Public License for more details. +# +# You should have received a copy of the GNU Affero General Public License +# along with this program. If not, see . + +__author__ = "Cedric Bonhomme" +__version__ = "$Revision: 0.1 $" +__date__ = "$Date: 2016/12/07 $" +__revision__ = "$Date: 2016/12/07 $" +__copyright__ = "Copyright (c) Cedric Bonhomme" +__license__ = "GPLv3" + +from bootstrap import db +from datetime import datetime +from sqlalchemy.orm import validates +from sqlalchemy.ext.associationproxy import association_proxy + +from web.models.right_mixin import RightMixin + + +class Bookmark(db.Model, RightMixin): + """ + Represent a bookmark. + """ + id = db.Column(db.Integer(), primary_key=True) + href = db.Column(db.String(), default="") + description = db.Column(db.String(), default="FR") + extended = db.Column(db.String()) + shared = db.Column(db.Boolean(), default=False) + to_read = db.Column(db.Boolean(), default=False) + time = db.Column(db.DateTime(), default=datetime.utcnow) + user_id = db.Column(db.Integer(), db.ForeignKey('user.id')) + + # relationships + tag_objs = db.relationship('BookmarkTag', back_populates='bookmark', + cascade='all,delete-orphan', + lazy=False, + foreign_keys='[BookmarkTag.bookmark_id]') + tags = association_proxy('tag_objs', 'text') + + + @validates('description') + def validates_title(self, key, value): + return str(value).strip() + + @validates('extended') + def validates_description(self, key, value): + return str(value).strip() + + def __repr__(self): + return '' % (self.href) diff --git a/src/web/models/tag.py b/src/web/models/tag.py index 8d7fe4d4..d43ce300 100644 --- a/src/web/models/tag.py +++ b/src/web/models/tag.py @@ -8,15 +8,43 @@ from bootstrap import db class Tag(db.Model): - text = Column(String, primary_key=True, unique=False) + id = db.Column(db.Integer(), primary_key=True) + text = Column(String, unique=False) + obj = db.Column(db.String, default='article') + user_id = db.Column(db.Integer(), db.ForeignKey('user.id'), nullable=False) - # foreign keys - article_id = Column(Integer, ForeignKey('article.id', ondelete='CASCADE'), - primary_key=True) + __mapper_args__ = { + 'polymorphic_on': obj + } + + + def __init__(self, text): + self.text = text + + +class ArticleTag(Tag): + __mapper_args__ = { + 'polymorphic_identity': 'article' + } + id = db.Column(db.Integer, db.ForeignKey('tag.id', ondelete='CASCADE'), + primary_key=True) # relationships + article_id = Column(Integer, ForeignKey('article.id', ondelete='CASCADE'), + nullable=False) article = relationship('Article', back_populates='tag_objs', foreign_keys=[article_id]) - def __init__(self, text): - self.text = text + +class BookmarkTag(Tag): + __mapper_args__ = { + 'polymorphic_identity': 'bookmark' + } + id = db.Column(db.Integer, db.ForeignKey('tag.id', ondelete='CASCADE'), + primary_key=True) + + # relationships + bookmark_id = Column(Integer, ForeignKey('bookmark.id', ondelete='CASCADE'), + nullable=False) + bookmark = relationship('Bookmark', back_populates='tag_objs', + foreign_keys=[bookmark_id]) diff --git a/src/web/models/user.py b/src/web/models/user.py index 460958e0..d2b3c52a 100644 --- a/src/web/models/user.py +++ b/src/web/models/user.py @@ -38,6 +38,7 @@ from bootstrap import db from web.models.right_mixin import RightMixin from web.models.category import Category from web.models.feed import Feed +from web.models.bookmark import Bookmark class User(db.Model, UserMixin, RightMixin): @@ -71,6 +72,9 @@ class User(db.Model, UserMixin, RightMixin): feeds = db.relationship('Feed', backref='user', cascade='all, delete-orphan', foreign_keys=[Feed.user_id]) + bookmarks = db.relationship('Bookmark', backref='user', + cascade='all, delete-orphan', + foreign_keys=[Bookmark.user_id]) @staticmethod def _fields_base_write(): -- cgit