Zine

open source content publishing system


Changeset 1317:b0da263525fc


Ignore:
Timestamp:
07/16/09 23:49:33 (3 years ago)
Author:
s0undt3ch
Branch:
default
Message:

logging module checkpoint. Will revert back to yeild'ing.

Location:
zine
Files:
1 added
4 edited

Legend:

Unmodified
Added
Removed
  • zine/templates/admin/perform_upgrade.html

    r1314 r1317  
    7272      font-family: 'Consolas', 'Bitstream Vera Sans Mono', 'Monaco', monospace; 
    7373    } 
    74  
    7574  </style> 
     75  <script type="text/javascript" src="{{ jquery_url }}"></script> 
    7676</head> 
    7777 
     
    8282      <p>{% trans %}<b>Database upgrade in progress!</b>{% endtrans %}</p> 
    8383    {% elif live_log is defined %} 
     84 
    8485      <h1>{{ _("Upgrading...") }}</h1> 
    8586      <p>{% trans %}Upgrade in process. 
    8687        <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. 
    9190          Please <a href="{{ blog_url }}">check your blog</a> to see if the 
    9291          upgrade was perfect. 
     
    9493          once you finish. 
    9594      {% 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> 
    97103    {% else %} 
    98104      <h1>{{ _("Upgrade") }}</h1> 
     
    101107      <form action="" method="POST"> 
    102108        <input type="submit" name="upgrade" value="Upgrade!"> 
     109        <input type="button" id="upgrade" name="upgrade_" value="Upgrade!!"> 
    103110      </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> 
    104122    {%- endif %} 
    105123  </div> 
  • zine/upgrades/__init__.py

    r1316 r1317  
    5858        root_logger = logging.getLogger() 
    5959        root_logger.setLevel(logging.DEBUG) 
    60         handler = loggers.LogHandler(sys.stdout) 
     60        handler = loggers.CliLogHandler(sys.stdout) 
    6161        handler.setFormatter(loggers.LogFormatter("%(message)s")) 
    6262        root_logger.addHandler(handler) 
  • zine/upgrades/loggers.py

    r1316 r1317  
    1212import types 
    1313import logging 
     14from logging.handlers import BufferingHandler 
    1415 
    1516def getTerminalSize(): 
     
    7374        return s 
    7475 
    75 class LogHandler(logging.StreamHandler): 
     76class CliLogHandler(logging.StreamHandler): 
    7677    def emit(self, record): 
    7778        """ 
     
    101102            self.handleError(record) 
    102103 
     104class 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  
    1010    :license: BSD, see LICENSE for more details. 
    1111""" 
     12# http://github.com/darwin/firelogger 
     13# http://github.com/darwin/firepython 
    1214 
     15import logging 
     16import simplejson 
    1317from os import remove 
    1418from os.path import isfile 
    1519from time import time 
     20from threading import Thread 
     21from uuid import uuid4 
    1622from sqlalchemy.sql import and_ 
    1723from zine.database import db, privileges, users, user_privileges 
     24from zine.environment import SHARED_DATA 
    1825from zine.i18n import load_core_translations 
    19 from zine.upgrades import ManageDatabase 
     26from zine.upgrades import ManageDatabase, loggers 
    2027from zine.utils.crypto import check_pwhash 
     28 
     29from werkzeug import SharedDataMiddleware 
    2130from werkzeug.utils import redirect 
    2231from werkzeug.contrib.securecookie import SecureCookie 
     
    4150        self.database_engine = app.database_engine 
    4251        self.lockfile = app.upgrade_lockfile 
     52#        self.jquery_url = app.url_adapter.build('core/shared', 
     53#                                                {'filename': 'js/jQuery.js'}) 
    4354        self.blog_url = app.url_adapter.build('blog/index') 
    4455        self.login_url = app.url_adapter.build('account/login') 
    4556        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 
    4676 
    4777    def __getattr__(self, name): 
     
    79109 
    80110    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): 
    82114            return redirect('') 
    83115 
     
    97129                        request.is_somebody = True 
    98130                        return redirect('') 
    99  
    100131            response = Response() 
    101132            response.www_authenticate.set_basic() 
     
    110141 
    111142        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) 
    118154                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 
    121161 
    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 
    127173 
    128174        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) 
    130178 
    131179    def __call__(self, environ, start_response): 
    132180        request = self.get_request(environ) 
     181        if request.path == self.jquery_url: 
     182            return SharedDataMiddleware(self, {'/shared': SHARED_DATA})(environ, start_response) 
    133183        response = self.dispatch(request) 
    134184        if request.session.should_save: 
Note: See TracChangeset for help on using the changeset viewer.