diff options
author | Takeshi KOMIYA <i.tkomiya@gmail.com> | 2017-04-09 12:06:35 +0900 |
---|---|---|
committer | Takeshi KOMIYA <i.tkomiya@gmail.com> | 2017-04-22 17:54:20 +0900 |
commit | fef9f870d40481c042e1d1f6bda38a1ca009a973 (patch) | |
tree | e17aa3b7bc9a1ae5505931bcdd1586296f7de135 /sphinx/websupport/storage/sqlalchemystorage.py | |
parent | 45887c7d62dde461f2741f1cb9e2cc1ca26a42dd (diff) | |
download | sphinx-git-fef9f870d40481c042e1d1f6bda38a1ca009a973.tar.gz |
Split websupport to sphinxcontrib-websupport package
Diffstat (limited to 'sphinx/websupport/storage/sqlalchemystorage.py')
-rw-r--r-- | sphinx/websupport/storage/sqlalchemystorage.py | 167 |
1 files changed, 1 insertions, 166 deletions
diff --git a/sphinx/websupport/storage/sqlalchemystorage.py b/sphinx/websupport/storage/sqlalchemystorage.py index 48997b032..dc5e9400b 100644 --- a/sphinx/websupport/storage/sqlalchemystorage.py +++ b/sphinx/websupport/storage/sqlalchemystorage.py @@ -9,169 +9,4 @@ :license: BSD, see LICENSE for details. """ -from datetime import datetime - -import sqlalchemy -from sqlalchemy.orm import aliased -from sqlalchemy.sql import func - -from sphinx.websupport.errors import CommentNotAllowedError, \ - UserNotAuthorizedError -from sphinx.websupport.storage import StorageBackend -from sphinx.websupport.storage.sqlalchemy_db import Base, Node, \ - Comment, CommentVote, Session -from sphinx.websupport.storage.differ import CombinedHtmlDiff - -if sqlalchemy.__version__[:3] < '0.5': # type: ignore - raise ImportError('SQLAlchemy version 0.5 or greater is required for this ' - 'storage backend; you have version %s' % sqlalchemy.__version__) - - -class SQLAlchemyStorage(StorageBackend): - """ - A :class:`.StorageBackend` using SQLAlchemy. - """ - - def __init__(self, uri): - self.engine = sqlalchemy.create_engine(uri) - Base.metadata.bind = self.engine - Base.metadata.create_all() - Session.configure(bind=self.engine) - - def pre_build(self): - self.build_session = Session() - - def has_node(self, id): - session = Session() - node = session.query(Node).filter(Node.id == id).first() - session.close() - return bool(node) - - def add_node(self, id, document, source): - node = Node(id, document, source) - self.build_session.add(node) - self.build_session.flush() - - def post_build(self): - self.build_session.commit() - self.build_session.close() - - def add_comment(self, text, displayed, username, time, - proposal, node_id, parent_id, moderator): - session = Session() - proposal_diff = None - proposal_diff_text = None - - if node_id and proposal: - node = session.query(Node).filter(Node.id == node_id).one() - differ = CombinedHtmlDiff(node.source, proposal) - proposal_diff = differ.make_html() - proposal_diff_text = differ.make_text() - elif parent_id: - parent = session.query(Comment.displayed).\ - filter(Comment.id == parent_id).one() - if not parent.displayed: - raise CommentNotAllowedError( - "Can't add child to a parent that is not displayed") - - comment = Comment(text, displayed, username, 0, - time or datetime.now(), proposal, proposal_diff) - session.add(comment) - session.flush() - # We have to flush the session before setting the path so the - # Comment has an id. - comment.set_path(node_id, parent_id) - session.commit() - d = comment.serializable() - d['document'] = comment.node.document - d['proposal_diff_text'] = proposal_diff_text - session.close() - return d - - def delete_comment(self, comment_id, username, moderator): - session = Session() - comment = session.query(Comment).\ - filter(Comment.id == comment_id).one() - if moderator: - # moderator mode: delete the comment and all descendants - # find descendants via path - session.query(Comment).filter( - Comment.path.like(comment.path + '.%')).delete(False) - session.delete(comment) - session.commit() - session.close() - return True - elif comment.username == username: - # user mode: do not really delete, but remove text and proposal - comment.username = '[deleted]' - comment.text = '[deleted]' - comment.proposal = '' - session.commit() - session.close() - return False - else: - session.close() - raise UserNotAuthorizedError() - - def get_metadata(self, docname, moderator): - session = Session() - subquery = session.query( - Comment.node_id, - func.count('*').label('comment_count')).group_by( - Comment.node_id).subquery() - nodes = session.query(Node.id, subquery.c.comment_count).outerjoin( - (subquery, Node.id == subquery.c.node_id)).filter( - Node.document == docname) - session.close() - session.commit() - return dict([(k, v or 0) for k, v in nodes]) - - def get_data(self, node_id, username, moderator): - session = Session() - node = session.query(Node).filter(Node.id == node_id).one() - session.close() - comments = node.nested_comments(username, moderator) - return {'source': node.source, - 'comments': comments} - - def process_vote(self, comment_id, username, value): - session = Session() - - subquery = session.query(CommentVote).filter( - CommentVote.username == username).subquery() - vote_alias = aliased(CommentVote, subquery) - q = session.query(Comment, vote_alias).outerjoin(vote_alias).filter( - Comment.id == comment_id) - comment, vote = q.one() - - if vote is None: - vote = CommentVote(comment_id, username, value) - comment.rating += value - else: - comment.rating += value - vote.value - vote.value = value - - session.add(vote) - session.commit() - session.close() - - def update_username(self, old_username, new_username): - session = Session() - - session.query(Comment).filter(Comment.username == old_username).\ - update({Comment.username: new_username}) - session.query(CommentVote).\ - filter(CommentVote.username == old_username).\ - update({CommentVote.username: new_username}) - - session.commit() - session.close() - - def accept_comment(self, comment_id): - session = Session() - session.query(Comment).filter(Comment.id == comment_id).update( - {Comment.displayed: True} - ) - - session.commit() - session.close() +from sphinxcontrib.websupport.storage.sqlalchemystorage import SQLAlchemyStorage # NOQA |