review/web_ui.py @ b45d0345f936 flask

More cleanup.
author Steve Losh <steve@stevelosh.com>
date Fri, 11 Jun 2010 20:59:24 -0400
parents e57c86639185
children 93e7fb8a1323
from __future__ import with_statement

"""The review extension's web UI."""

import sys, os
from hashlib import md5

from mercurial import commands, cmdutil, hg, templatefilters
from mercurial.node import short, hex
from mercurial.util import email

import api

def unbundle():
    package_path = os.path.split(os.path.realpath(__file__))[0]
    template_path = os.path.join(package_path, 'web_templates')
    media_path = os.path.join(package_path, 'web_media')
    top_path = os.path.split(package_path)[0]
    bundled_path = os.path.join(top_path, 'bundled')
    flask_path = os.path.join(bundled_path, 'flask')
    jinja2_path = os.path.join(bundled_path, 'jinja2')
    werkzeug_path = os.path.join(bundled_path, 'werkzeug')
    simplejson_path = os.path.join(bundled_path, 'simplejson')

    sys.path.insert(0, flask_path)
    sys.path.insert(0, werkzeug_path)
    sys.path.insert(0, jinja2_path)
    sys.path.insert(0, simplejson_path)

unbundle()

from flask import Flask, render_template
app = Flask(__name__)

LOG_PAGE_LEN = 1000000

def _item_gravatar(item):
    return 'http://www.gravatar.com/avatar/%s/' % md5(email(item.author)).hexdigest()

def _line_type(line):
    return 'rem' if line[0] == '-' else 'add' if line[0] == '+' else 'con'

utils = {
    'node_short': short,
    'basename': os.path.basename,
    'md5': md5,
    'email': email,
    'templatefilters': templatefilters,
    'len': len,
    'item_gravatar': _item_gravatar,
    'line_type': _line_type,
}

datastore = None
site_read_only = False

def _render(template, **kwargs):
    return render_template(template, read_only=site_read_only, utils=utils,
        datastore=datastore, **kwargs)


@app.route('/')
def index():
    rev_max = datastore.target['tip'].rev()
    rev_min = rev_max - LOG_PAGE_LEN if rev_max >= LOG_PAGE_LEN else 0
    rcsets = [datastore[r] for r in xrange(rev_max, rev_min, -1)]
    return _render('index.html', title='', rcsets=rcsets)


@app.route('/changeset/<revhash>/')
def changeset(revhash):
    #if kwargs and not self.read_only:
        #signoff = kwargs.get('signoff', None)
        #if signoff:
            #if signoff not in ['yes', 'no', 'neutral']:
                #return 'Invalid signoff type.'
            #if signoff == 'neutral':
                #signoff = ''
            #body = kwargs.get('new-signoff-body', '')
            #rcset = self.datastore[rev_id]
            #rcset.add_signoff(body, signoff, force=True)
            #raise cherrypy.HTTPRedirect("/changeset/%s/" % rev_id)
        
        #filename = kwargs.get('filename', '')
        #lines = str(kwargs['lines']) if 'lines' in kwargs else ''
        #if lines:
            #lines = lines.split(',')
        #body = kwargs['new-comment-body']
        
        #if body:
            #rcset = self.datastore[rev_id]
            #rcset.add_comment(body, filename, lines)
        
        #raise cherrypy.HTTPRedirect("/changeset/%s/" % rev_id)
    
    rcset = datastore[revhash]
    rev = rcset.target[revhash]
    
    cu_signoffs = rcset.signoffs_for_current_user()
    cu_signoff = cu_signoffs[0] if cu_signoffs else None
    
    return _render('changeset.html',
        title='%s:%s' % (rev.rev(), short(rev.node())),
        rcset=rcset, rev=rev, cu_signoff=cu_signoff
    )

#class ReviewWebUI(object):
    #@cherrypy.expose
    #def pull(self, **kwargs):
        #if not self.read_only:
            #if 'path' not in kwargs:
                #return 'OH GOD HOW DID THIS GET HERE I AM NOT GOOD WITH LINKS'
            #path = kwargs['path']
            
            #commands.pull(
                #self.datastore.repo.ui, self.datastore.repo, path, **{
                    #'update': True
                #}
            #)
        
        #raise cherrypy.HTTPRedirect("/")
    #@cherrypy.expose
    #def push(self, **kwargs):
        #if not self.read_only:
            #if 'path' not in kwargs:
                #return 'OH GOD HOW DID THIS GET HERE I AM NOT GOOD WITH LINKS'
            #path = kwargs['path']
            
            #commands.push(
                #self.datastore.repo.ui,self.datastore.repo, path, **{}
            #)
        
        #raise cherrypy.HTTPRedirect("/")


def load_interface(ui, repo, read_only=False, open=False, address='127.0.0.1', port=8080):
    if open:
        import webbrowser
        webbrowser.open('http://localhost:%d/' % port)
        
    global datastore, site_read_only
    datastore = api.ReviewDatastore(ui, repo)
    site_read_only = read_only

    app.debug = True
    app.run()