Changeset 1317:b0da263525fc
- Timestamp:
- 07/16/09 23:49:33 (3 years ago)
- Branch:
- default
- Location:
- zine
- Files:
-
- 1 added
- 4 edited
-
templates/admin/perform_upgrade.html (modified) (4 diffs)
-
templates/upgrade_maintenance.html (added)
-
upgrades/__init__.py (modified) (1 diff)
-
upgrades/loggers.py (modified) (3 diffs)
-
upgrades/webapp.py (modified) (5 diffs)
Legend:
- Unmodified
- Added
- Removed
-
zine/templates/admin/perform_upgrade.html
r1314 r1317 72 72 font-family: 'Consolas', 'Bitstream Vera Sans Mono', 'Monaco', monospace; 73 73 } 74 75 74 </style> 75 <script type="text/javascript" src="{{ jquery_url }}"></script> 76 76 </head> 77 77 … … 82 82 <p>{% trans %}<b>Database upgrade in progress!</b>{% endtrans %}</p> 83 83 {% elif live_log is defined %} 84 84 85 <h1>{{ _("Upgrading...") }}</h1> 85 86 <p>{% trans %}Upgrade in process. 86 87 <strong>Don't hit cancel!</strong>{% endtrans %}</p> 87 {%- for event in live_log %}{{ event }}{%- endfor %} 88 <p>{% trans %}Database upgraded successfully.{% endtrans %}</p> 89 <br/> 90 <div class="message">{% trans %}Zine is in maintenance mode. 88 <div id="livelog"><div/> 89 <div class="message" style="display: none;">{% trans %}Zine is in maintenance mode. 91 90 Please <a href="{{ blog_url }}">check your blog</a> to see if the 92 91 upgrade was perfect. … … 94 93 once you finish. 95 94 {% endtrans %}</div> 96 {{ finish() }} 95 <script type="text/javascript"> 96 jQuery(document).ready( function() { 97 function appendData(data) { 98 jQuery("#livelog").append(data) 99 } 100 jQuery.post('/', {}, appendData, 'html'); 101 }); 102 </script> 97 103 {% else %} 98 104 <h1>{{ _("Upgrade") }}</h1> … … 101 107 <form action="" method="POST"> 102 108 <input type="submit" name="upgrade" value="Upgrade!"> 109 <input type="button" id="upgrade" name="upgrade_" value="Upgrade!!"> 103 110 </form> 111 <div id="livelog"><div/> 112 <script type="text/javascript"> 113 jQuery(document).ready( function() { 114 function appendData(data) { 115 jQuery("#livelog").append(data) 116 } 117 jQuery("#upgrade").click( function() { 118 jQuery.post('{{ upgrade_url }}', {}, appendData, 'html'); 119 }); 120 }); 121 </script> 104 122 {%- endif %} 105 123 </div> -
zine/upgrades/__init__.py
r1316 r1317 58 58 root_logger = logging.getLogger() 59 59 root_logger.setLevel(logging.DEBUG) 60 handler = loggers. LogHandler(sys.stdout)60 handler = loggers.CliLogHandler(sys.stdout) 61 61 handler.setFormatter(loggers.LogFormatter("%(message)s")) 62 62 root_logger.addHandler(handler) -
zine/upgrades/loggers.py
r1316 r1317 12 12 import types 13 13 import logging 14 from logging.handlers import BufferingHandler 14 15 15 16 def getTerminalSize(): … … 73 74 return s 74 75 75 class LogHandler(logging.StreamHandler):76 class CliLogHandler(logging.StreamHandler): 76 77 def emit(self, record): 77 78 """ … … 101 102 self.handleError(record) 102 103 104 class WebLogHandler(BufferingHandler): 105 def __init__(self): 106 BufferingHandler.__init__(self, -1) 107 108 def shouldFlush(self, record): 109 # We force it to never flush. We'll explicitly do the flushing 110 return (len(self.buffer) < self.capacity) -
zine/upgrades/webapp.py
r1314 r1317 10 10 :license: BSD, see LICENSE for more details. 11 11 """ 12 # http://github.com/darwin/firelogger 13 # http://github.com/darwin/firepython 12 14 15 import logging 16 import simplejson 13 17 from os import remove 14 18 from os.path import isfile 15 19 from time import time 20 from threading import Thread 21 from uuid import uuid4 16 22 from sqlalchemy.sql import and_ 17 23 from zine.database import db, privileges, users, user_privileges 24 from zine.environment import SHARED_DATA 18 25 from zine.i18n import load_core_translations 19 from zine.upgrades import ManageDatabase 26 from zine.upgrades import ManageDatabase, loggers 20 27 from zine.utils.crypto import check_pwhash 28 29 from werkzeug import SharedDataMiddleware 21 30 from werkzeug.utils import redirect 22 31 from werkzeug.contrib.securecookie import SecureCookie … … 41 50 self.database_engine = app.database_engine 42 51 self.lockfile = app.upgrade_lockfile 52 # self.jquery_url = app.url_adapter.build('core/shared', 53 # {'filename': 'js/jQuery.js'}) 43 54 self.blog_url = app.url_adapter.build('blog/index') 44 55 self.login_url = app.url_adapter.build('account/login') 45 56 self.maintenance_url = app.url_adapter.build('admin/maintenance') 57 58 self.jquery_url = '/shared/js/jQuery.js' 59 self.logging_url = '/livelog' 60 self.upgrade_url = '/upgrade/%s' % uuid4().hex 61 self.who_is_upgrading = None 62 63 # Setup logging 64 root_logger = logging.getLogger() 65 root_logger.setLevel(logging.DEBUG) 66 handler = loggers.WebLogHandler() 67 handler.setFormatter(loggers.LogFormatter("%(message)s")) 68 root_logger.addHandler(handler) 69 self.log_handler = handler 70 import sys 71 handler = loggers.CliLogHandler(sys.stdout) 72 handler.setFormatter(loggers.LogFormatter("%(message)s")) 73 root_logger.addHandler(handler) 74 # self.__call__ = SharedDataMiddleware(self.__call__, {'/shared': SHARED_DATA}) 75 46 76 47 77 def __getattr__(self, name): … … 79 109 80 110 def dispatch(self, request): 81 if request.path not in ('/', self.login_url): 111 print request.path, self.jquery_url, self.jquery_url == request.path, SHARED_DATA 112 if request.path not in ('/', self.logging_url, self.login_url, 113 self.jquery_url, self.upgrade_url): 82 114 return redirect('') 83 115 … … 97 129 request.is_somebody = True 98 130 return redirect('') 99 100 131 response = Response() 101 132 response.www_authenticate.set_basic() … … 110 141 111 142 if request.method == 'POST': 112 open(self.lockfile, 'w').write('locked on database upgrade\n') 113 mdb = ManageDatabase(request.app) 114 db.session.close() # Close open sessions 115 def finish(): 116 # this runs after the upgrade finishes 117 remove(self.lockfile) 143 if request.path == self.upgrade_url: 144 mdb = ManageDatabase(request.app) 145 Thread(target=mdb.cmd_upgrade, args=(), kwargs={}).start() 146 while 1: 147 response = Response('1' + ''.join(self.log_handler.buffer) 148 # , _stream=True 149 ) 150 self.log_handler.flush() 151 else: 152 open(self.lockfile, 'w').write('locked on database upgrade\n') 153 mdb = ManageDatabase(request.app) 118 154 db.session.close() # Close open sessions 119 self.wants_reload = True # Force application reload 120 return '' # just because I need to return something to jinja 155 def finish(): 156 # this runs after the upgrade finishes 157 remove(self.lockfile) 158 db.session.close() # Close open sessions 159 self.wants_reload = True # Force application reload 160 return '' # just because I need to return something to jinja 121 161 122 return render_response(request, 'admin/perform_upgrade.html', 123 live_log=mdb.cmd_upgrade(), _stream=True, 124 finish=finish, blog_url=self.blog_url, 125 maintenance_url=self.maintenance_url, 126 in_progress=False) 162 def start_upgrade(): 163 mdb.cmd_upgrade() 164 return True 165 166 response = render_response(request, 167 'admin/perform_upgrade.html', live_log=start_upgrade() and True or False, 168 finish=finish, blog_url=self.blog_url, 169 maintenance_url=self.maintenance_url, 170 logging_url=self.logging_url, in_progress=False, 171 jquery_url=self.jquery_url) 172 return response 127 173 128 174 return render_response(request, 'admin/perform_upgrade.html', 129 in_progress=isfile(self.lockfile)) 175 in_progress=isfile(self.lockfile), 176 jquery_url=self.jquery_url, 177 upgrade_url=self.upgrade_url) 130 178 131 179 def __call__(self, environ, start_response): 132 180 request = self.get_request(environ) 181 if request.path == self.jquery_url: 182 return SharedDataMiddleware(self, {'/shared': SHARED_DATA})(environ, start_response) 133 183 response = self.dispatch(request) 134 184 if request.session.should_save:
Note: See TracChangeset
for help on using the changeset viewer.