From 2e7190d27d95860869019df434affe9bf3015647 Mon Sep 17 00:00:00 2001 From: Aurélien Bompard Date: Mar 09 2017 18:08:13 +0000 Subject: [PATCH 1/16] Create a table for hub configuration --- diff --git a/hubs/migrations/versions/1d660b32b83a_hub_config.py b/hubs/migrations/versions/1d660b32b83a_hub_config.py new file mode 100644 index 0000000..7f2aefb --- /dev/null +++ b/hubs/migrations/versions/1d660b32b83a_hub_config.py @@ -0,0 +1,85 @@ +# This Alembic database migration is part of the Fedora Hubs project. +# Copyright (C) 2017 The Fedora Project +# +# 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 . +""" +Hub config + +Revision ID: 1d660b32b83a +Revises: 26cc11577009 +Create Date: 2017-03-06 18:31:54.574205 +""" + +from __future__ import absolute_import, unicode_literals + +from alembic import op +import sqlalchemy as sa + + +# revision identifiers, used by Alembic. +revision = '1d660b32b83a' +down_revision = '26cc11577009' +branch_labels = None +depends_on = None + + +def upgrade(): + op.create_table('hubs_config', + sa.Column('id', sa.Integer(), nullable=False), + sa.Column('hub_id', sa.String(length=50), nullable=False), + sa.Column('summary', sa.String(length=128), nullable=True), + sa.Column('left_width', sa.Integer(), nullable=False, server_default="8"), + sa.Column('avatar', sa.String(length=256), nullable=True), + sa.Column('header_img', sa.String(length=256), nullable=True), + sa.ForeignKeyConstraint(['hub_id'], ['hubs.name'], ), + sa.PrimaryKeyConstraint('id') + ) + op.execute(""" + INSERT INTO hubs_config + (hub_id, summary, left_width, avatar, header_img) + SELECT name, summary, left_width, avatar, header_img FROM hubs + """) + # http://alembic.zzzcomputing.com/en/latest/batch.html + with op.batch_alter_table("hubs") as batch_op: + batch_op.drop_column('left_width') + batch_op.drop_column('header_img') + batch_op.drop_column('summary') + batch_op.drop_column('avatar') + + +def downgrade(): + op.add_column('hubs', sa.Column('avatar', sa.VARCHAR(length=256), nullable=True)) + op.add_column('hubs', sa.Column('summary', sa.VARCHAR(length=128), nullable=True)) + op.add_column('hubs', sa.Column('header_img', sa.VARCHAR(length=256), nullable=True)) + op.add_column('hubs', sa.Column('left_width', sa.INTEGER(), server_default="8", nullable=False)) + connection = op.get_bind() + query = "SELECT hub_id, summary, left_width, avatar, header_img FROM hubs_config" + hubs_table = sa.sql.table('hubs', + sa.sql.column('name', sa.String), + sa.sql.column('summary', sa.String), + sa.sql.column('left_width', sa.Integer), + sa.sql.column('avatar', sa.String), + sa.sql.column('header_img', sa.String), + ) + for row in connection.execute(query): + op.execute(hubs_table.update().where( + hubs_table.c.name==op.inline_literal(row["hub_id"]) + ).values({ + "summary": op.inline_literal(row["summary"]), + "left_width": op.inline_literal(row["left_width"]), + "avatar": op.inline_literal(row["avatar"]), + "header_img": op.inline_literal(row["header_img"]), + }) + ) + op.drop_table('hubs_config') diff --git a/hubs/models.py b/hubs/models.py index 70a3043..ed67911 100644 --- a/hubs/models.py +++ b/hubs/models.py @@ -137,17 +137,11 @@ class Association(BASE): class Hub(BASE): __tablename__ = 'hubs' name = sa.Column(sa.String(50), primary_key=True) - summary = sa.Column(sa.String(128)) created_on = sa.Column(sa.DateTime, default=datetime.datetime.utcnow) widgets = relation('Widget', cascade='all,delete', backref='hub') - left_width = sa.Column(sa.Integer, nullable=False, default=8) + config = relation('HubConfig', uselist=False, cascade='all,delete', backref='hub') archived = sa.Column(sa.Boolean, default=False) user_hub = sa.Column(sa.Boolean, default=False) - - # A URL to the "avatar" for this hub. - avatar = sa.Column(sa.String(256), default=placekitten) - header_img = sa.Column(sa.String(256), default=randomheader) - # Timestamps about various kinds of "freshness" last_refreshed = sa.Column(sa.DateTime, default=datetime.datetime.utcnow) last_edited = sa.Column(sa.DateTime, default=datetime.datetime.utcnow) @@ -244,10 +238,11 @@ class Hub(BASE): @classmethod def create_user_hub(cls, session, username, fullname): - hub = cls(name=username, summary=fullname, - avatar=username2avatar(username), - user_hub=True) + hub = cls(name=username, user_hub=True) session.add(hub) + hub_config = HubConfig( + hub=hub, summary=fullname, avatar=username2avatar(username)) + session.add(hub_config) hubs.defaults.add_user_widgets(session, hub, username, fullname) @@ -257,18 +252,19 @@ class Hub(BASE): @classmethod def create_group_hub(cls, session, name, summary, **extra): - hub = cls(name=name, summary=summary, - # TODO -- do something else, smarter for group avatars - avatar=username2avatar(name), - user_hub=False) + hub = cls(name=name, user_hub=False) session.add(hub) + # TODO -- do something else, smarter for group avatars + hub_config = HubConfig( + hub=hub, summary=summary, avatar=username2avatar(name)) + session.add(hub_config) hubs.defaults.add_group_widgets(session, hub, name, summary, **extra) return hub @property def right_width(self): - return 12 - self.left_width + return 12 - self.config.left_width @property def left_widgets(self): @@ -287,11 +283,10 @@ class Hub(BASE): def __json__(self): return { 'name': self.name, - 'summary': self.summary, - 'avatar': self.avatar, + 'config': self.config.__json__(), 'widgets': [widget.idx for widget in self.widgets], - 'left_width': self.left_width, + 'left_width': self.config.left_width, 'owners': [u.username for u in self.owners], 'members': [u.username for u in self.members], @@ -299,7 +294,26 @@ class Hub(BASE): } -def _config_default(context): +class HubConfig(BASE): + __tablename__ = 'hubs_config' + id = sa.Column(sa.Integer, primary_key=True) + hub_id = sa.Column(sa.String(50), sa.ForeignKey('hubs.name'), + nullable=False) + summary = sa.Column(sa.String(128)) + left_width = sa.Column(sa.Integer, nullable=False, default=8) + # A URL to the "avatar" for this hub. + avatar = sa.Column(sa.String(256), default=placekitten) + header_img = sa.Column(sa.String(256), default=randomheader) + + def __json__(self): + return { + 'summary': self.summary, + 'left_width': self.left_width, + 'avatar': self.avatar, + } + + +def _widget_config_default(context): widget_name = context.current_parameters['plugin'] widget = hubs.widgets.registry[widget_name] return json.dumps(dict([ @@ -313,7 +327,7 @@ class Widget(BASE): plugin = sa.Column(sa.String(50), nullable=False) created_on = sa.Column(sa.DateTime, default=datetime.datetime.utcnow) hub_id = sa.Column(sa.String(50), sa.ForeignKey('hubs.name')) - _config = sa.Column(sa.String(256), default=_config_default) + _config = sa.Column(sa.String(256), default=_widget_config_default) index = sa.Column(sa.Integer, nullable=False) left = sa.Column(sa.Boolean, nullable=False, default=False) diff --git a/hubs/templates/hubs.html b/hubs/templates/hubs.html index 8f73175..4dbbf8f 100644 --- a/hubs/templates/hubs.html +++ b/hubs/templates/hubs.html @@ -36,13 +36,13 @@
{% if hub.user_hub %} - +

{{ hub.name }}

-
{{ hub.summary }}
+
{{ hub.config.summary }}
{% else %}

{{ hub.name }}

-
{{ hub.summary }}
+
{{ hub.config.summary }}
{% endif %}
@@ -112,7 +112,7 @@
-
+
-
+
{% if hub.user_hub %}

{{ hub.name }}

@@ -47,9 +47,17 @@
-
+
{% if g.auth.logged_in and hub.is_admin(g.auth.user) %} + {% if not edit %} + + + edit page layout +