From 2e20ead09b1b8e7df539de04c8eeefa0b9235508 Mon Sep 17 00:00:00 2001 From: Kyle Mahan Date: Sun, 19 Apr 2015 09:29:10 -0700 Subject: [PATCH] add migration from users_to_feeds table to subscriptions table --- migrations/versions/564f5a5061f_.py | 74 +++++++++++++ woodwind/models.py | 9 +- woodwind/static/open_in_new_window.png | Bin 0 -> 1568 bytes woodwind/static/open_in_new_window2.png | Bin 0 -> 396 bytes woodwind/static/style.css | 4 +- woodwind/static/style.scss | 5 +- woodwind/tasks.py | 28 ++--- woodwind/templates/_entry.jinja2 | 8 +- woodwind/templates/base.jinja2 | 2 +- .../{feeds.jinja2 => subscriptions.jinja2} | 52 ++++----- woodwind/views.py | 100 +++++++++--------- 11 files changed, 183 insertions(+), 99 deletions(-) create mode 100644 migrations/versions/564f5a5061f_.py create mode 100644 woodwind/static/open_in_new_window.png create mode 100644 woodwind/static/open_in_new_window2.png rename woodwind/templates/{feeds.jinja2 => subscriptions.jinja2} (53%) diff --git a/migrations/versions/564f5a5061f_.py b/migrations/versions/564f5a5061f_.py new file mode 100644 index 0000000..ab01906 --- /dev/null +++ b/migrations/versions/564f5a5061f_.py @@ -0,0 +1,74 @@ +"""empty message + +Revision ID: 564f5a5061f +Revises: 5824a5f06dd +Create Date: 2015-04-19 07:49:24.416817 + +""" + +# revision identifiers, used by Alembic. +revision = '564f5a5061f' +down_revision = '5824a5f06dd' + +from alembic import op +import sqlalchemy as sa +from woodwind.models import JsonType + + +def upgrade(): + ### commands auto generated by Alembic - please adjust! ### + subsc = op.create_table( + 'subscription', + sa.Column('id', sa.Integer(), nullable=False), + sa.Column('user_id', sa.Integer(), sa.ForeignKey('user.id'), nullable=False), + sa.Column('feed_id', sa.Integer(), sa.ForeignKey('feed.id'), nullable=False), + sa.Column('name', sa.String(length=256), nullable=True), + sa.Column('tags', JsonType(), nullable=True), + sa.PrimaryKeyConstraint('id') + ) + + feed = sa.table( + 'feed', + sa.column('id', sa.Integer()), + sa.column('name', sa.String())) + + u2f = sa.table( + 'users_to_feeds', + sa.column('user_id', sa.Integer()), + sa.column('feed_id', sa.Integer())) + + values = sa.select( + [u2f.c.user_id, u2f.c.feed_id, feed.c.name] + ).select_from( + u2f.join(feed, feed.c.id == u2f.c.feed_id) + ) + + op.execute(subsc.insert().from_select( + ['user_id', 'feed_id', 'name'], values)) + + op.drop_table('users_to_feeds') + ### end Alembic commands ### + + +def downgrade(): + ### commands auto generated by Alembic - please adjust! ### + u2f = op.create_table( + 'users_to_feeds', + sa.Column('user_id', sa.INTEGER(), autoincrement=False, nullable=True), + sa.Column('feed_id', sa.INTEGER(), autoincrement=False, nullable=True), + sa.ForeignKeyConstraint(['feed_id'], ['feed.id'], name='users_to_feeds_feed_id_fkey'), + sa.ForeignKeyConstraint(['user_id'], ['user.id'], name='users_to_feeds_user_id_fkey') + ) + + subsc = sa.table( + 'subscription', + sa.Column('user_id', sa.Integer()), + sa.Column('feed_id', sa.Integer()), + ) + + op.execute(u2f.insert().from_select( + ['user_id', 'feed_id'], + sa.select([subsc.c.user_id, subsc.c.feed_id]))) + + op.drop_table('subscription') + ### end Alembic commands ### diff --git a/woodwind/models.py b/woodwind/models.py index c34cd3f..dfea7fc 100644 --- a/woodwind/models.py +++ b/woodwind/models.py @@ -71,7 +71,6 @@ class User(db.Model): class Feed(db.Model): id = db.Column(db.Integer, primary_key=True) - users = db.relationship(User, secondary='users_to_feeds', backref='feeds') # the name of this feed name = db.Column(db.String(256)) # url that we subscribed to; periodically check if the feed url @@ -108,12 +107,16 @@ class Feed(db.Model): class Subscription(db.Model): id = db.Column(db.Integer, primary_key=True) - users = db.relationship(User, backref='subscriptions') + user_id = db.Column(db.Integer, db.ForeignKey(User.id)) + feed_id = db.Column(db.Integer, db.ForeignKey(Feed.id)) + # user-editable name of this subscribed feed name = db.Column(db.String(256)) - feed = db.relationship(Feed, backref='subscriptions') tags = db.Column(JsonType) + user = db.relationship(User, backref='subscriptions') + feed = db.relationship(Feed, backref='subscriptions') + class Entry(db.Model): id = db.Column(db.Integer, primary_key=True) diff --git a/woodwind/static/open_in_new_window.png b/woodwind/static/open_in_new_window.png new file mode 100644 index 0000000000000000000000000000000000000000..3e595aa83ee575ad1a9d46e9475d28357f10e692 GIT binary patch literal 1568 zcmbtUYfuwc7`;niK?@03l>kCw9nn6aKnE#-gbGy(6A%yqQ6dtlRY^gRhc;}WqoEN~ z!72>c_^8&}7G~-LMe9agl2Ry?>I`6oAdv8?n2koWx+cA#ojPOdk9L3Tx%d0Nd(PSK z-n$j?!euTqJ!b*{T%wmpCIEoIAp)FG2WRcwJU;ZmXCFfWwvO$cUt(8-MhLC3}9t*4&z(&@;wtXXZP`A6KMCh-Re9dLwSi zn#*eD*taF^oqB!b{(8X6JFAHW^TN>@ir-z(ar#o@RXPWatQJGn7d+~+G$9f*zQo~7 z-g?lpUqO$CxQy{C@I0$)X*vo>FW`zJPeDMl0ii_x56sQuN|U>`&8(7_e$H7WbeIGL z3l-3!zrnUK#G%r(hW?Ok2<=clqS=m1utU&>(>xr()K3QjS~e66DsqzUgqK|8b7VqruIlHdoy~ee1PS_kp91iL`7G&-b7UhLhX3 zlpgxssxWOQeXw9F!3mNwj4a8poS#OchpxNrvM@9%0wj^XqVCn)e&b8Vof*1g#sCgw zZs**t)y05DTMLILWyBw?9&ojtg&l#doNCNJKwKsmH{G#oe?(0jQ=QJaxtKpm*Q=WQ zkou4x&&)N~@@qqZEr>lq+^NNHIfKDqz?Cwd0eJ=uPlG}S!*CA>KPdyVv`FCLu(*Ih zNfE8>^0{|*!iTi2ppyp{uYTOAy1)?7E_?8ig<#Mfhld7IzL4bKima9Oeo(AjqkBRC znP4dthVsw{bVDkjIqutGqyiUeym%e=!UM~48A=7w(Bxb1R|sZ|XV2N;L+J4l*-j7eZ|2;!P-}>EeC@i3tNGDJUr;Jmp^c=K>!1=ff@i5_yY_9&OikI za|jE$@s7L1!lYseib%8y1 ztxd{Pts`i&{-8|hc51S2dy_uUdZwE)bFkE-BBvBhW#S8drcKVqjn@ z2!e`u>zVY*xbC%reo)YKQPp4ltNEgOrDWZ-QVi;*9pK+|KE?3d|3vX`{Ka@is0s$= z>!uyyXUS#Nd1-OVW`*s19%BLLn0v>dZrVRsFFdq`6AW;RVP?>qjIfSl98DDta^V^J zc)%*IyEZ2}OEDaFAz~Sqo#M@W_o{xu_5!Z5i+lXSDBnXWHb^ntVJ`z*!BS?{!$pc= zqi))w11W|B{J>3TLw&4GwpV@hRZ|R)9VYOUVi?bYxKlUnexcX$EN+tqC)mwV(k)Kk qY$4CGlVa#);{S^(#W2LP@6-#s%vT6(BJ>#m0000{{ context.title }} {% endif %} {% if context.content %} -
+
{{ context.content_cleaned | add_preview }}
{% endif %} @@ -42,7 +42,7 @@

{{ entry.title }}

{% endif %} {% if entry.content %} -
+
{{ entry.content_cleaned | add_preview }}
{% endif %} @@ -50,7 +50,9 @@