From 4e5e8a08dec730ebff5a7899a09310adb378c8bb Mon Sep 17 00:00:00 2001 From: Jake Moshenko Date: Fri, 27 Jun 2014 19:18:27 -0400 Subject: [PATCH] Add a maintenance notification kind and make it of the level warning. --- ...2_add_the_maintenance_notification_type.py | 33 ++++++++++++++++++ initdb.py | 13 +++++++ static/css/quay.css | 2 +- static/js/app.js | 30 +++++++++++----- test/data/test.db | Bin 215040 -> 215040 bytes 5 files changed, 69 insertions(+), 9 deletions(-) create mode 100644 data/migrations/versions/4b7ef0c7bdb2_add_the_maintenance_notification_type.py diff --git a/data/migrations/versions/4b7ef0c7bdb2_add_the_maintenance_notification_type.py b/data/migrations/versions/4b7ef0c7bdb2_add_the_maintenance_notification_type.py new file mode 100644 index 000000000..9e5fff425 --- /dev/null +++ b/data/migrations/versions/4b7ef0c7bdb2_add_the_maintenance_notification_type.py @@ -0,0 +1,33 @@ +"""Add the maintenance notification type. + +Revision ID: 4b7ef0c7bdb2 +Revises: bcdde200a1b +Create Date: 2014-06-27 19:09:56.387534 + +""" + +# revision identifiers, used by Alembic. +revision = '4b7ef0c7bdb2' +down_revision = 'bcdde200a1b' + +from alembic import op +from data.model.sqlalchemybridge import gen_sqlalchemy_metadata +from data.database import all_models +import sqlalchemy as sa + + +def upgrade(): + schema = gen_sqlalchemy_metadata(all_models) + op.bulk_insert(schema.tables['notificationkind'], + [ + {'id':4, 'name':'maintenance'}, + ]) + + +def downgrade(): + notificationkind = schema.tables['notificationkind'] + op.execute( + (notificationkind.delete() + .where(notificationkind.c.name == op.inline_literal('maintenance'))) + + ) diff --git a/initdb.py b/initdb.py index cc1471e73..456587220 100644 --- a/initdb.py +++ b/initdb.py @@ -2,8 +2,10 @@ import logging import json import hashlib import random +import calendar from datetime import datetime, timedelta +from email.utils import formatdate from peewee import (SqliteDatabase, create_model_tables, drop_model_tables, savepoint_sqlite) @@ -232,6 +234,7 @@ def initialize_database(): NotificationKind.create(name='password_required') NotificationKind.create(name='over_private_usage') NotificationKind.create(name='expiring_license') + NotificationKind.create(name='maintenance') NotificationKind.create(name='test_notification') @@ -289,6 +292,16 @@ def populate_database(): model.create_notification('test_notification', new_user_1, metadata={'some': 'value'}) + from_date = datetime.utcnow() + to_date = from_date + timedelta(hours=1) + notification_metadata = { + 'from_date': formatdate(calendar.timegm(from_date.utctimetuple())), + 'to_date': formatdate(calendar.timegm(to_date.utctimetuple())), + 'reason': 'database migration' + } + model.create_notification('maintenance', new_user_1, metadata=notification_metadata) + + __generate_repository(new_user_4, 'randomrepo', 'Random repo repository.', False, [], (4, [], ['latest', 'prod'])) diff --git a/static/css/quay.css b/static/css/quay.css index 68e317c70..8586ec9c7 100644 --- a/static/css/quay.css +++ b/static/css/quay.css @@ -582,7 +582,7 @@ i.toggle-icon:hover { .notification-warning { color: #8a6d3b; - background: #fcf8e3; + background: #ffde2f; } .notification-error { diff --git a/static/js/app.js b/static/js/app.js index 397729c3b..242cb9d95 100644 --- a/static/js/app.js +++ b/static/js/app.js @@ -919,6 +919,12 @@ quayApp = angular.module('quay', quayDependencies, function($provide, cfpLoading 'message': 'Your license will expire at: {expires_at} ' + '

Please contact Quay.io support to purchase a new license.', 'page': '/contact/' + }, + 'maintenance': { + 'level': 'warning', + 'message': 'We will be down for schedule maintenance from {from_date} to {to_date} ' + + 'for {reason}. We are sorry about any inconvenience.', + 'page': 'http://status.quay.io/' } }; @@ -4335,7 +4341,11 @@ quayApp.directive('notificationView', function () { 'notification': '=notification', 'parent': '=parent' }, - controller: function($scope, $element, $location, UserService, NotificationService) { + controller: function($scope, $element, $window, $location, UserService, NotificationService) { + var stringStartsWith = function (str, prefix) { + return str.slice(0, prefix.length) == prefix; + }; + $scope.getMessage = function(notification) { return NotificationService.getMessage(notification); }; @@ -4352,14 +4362,18 @@ quayApp.directive('notificationView', function () { $scope.showNotification = function() { var url = NotificationService.getPage($scope.notification); if (url) { - var parts = url.split('?') - $location.path(parts[0]); - - if (parts.length > 1) { - $location.search(parts[1]); - } + if (stringStartsWith(url, 'http://') || stringStartsWith(url, 'https://')) { + $window.location.href = url; + } else { + var parts = url.split('?') + $location.path(parts[0]); + + if (parts.length > 1) { + $location.search(parts[1]); + } - $scope.parent.$hide(); + $scope.parent.$hide(); + } } }; diff --git a/test/data/test.db b/test/data/test.db index 09fbf419a1a7adf0eefa9d31c87ab88082ade226..e5a283ef8c2ad40224e1fc5fc7b879444a2a3c68 100644 GIT binary patch delta 5870 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 Aa{vGU delta 5453 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 Oxa-C*^EjEg{{H}@X?Gp~