view pylons_app/controllers/admin.py @ 127:20dc7a5eb748

Html changes and cleanups, made folders for html templates, implemented tags and branches pages
author Marcin Kuzminski <marcin@python-works.com>
date Mon, 03 May 2010 19:07:54 +0200
parents 2811259dc12d
children 919b5bcd8630
line wrap: on
line source

import logging

from pylons import request, response, session, tmpl_context as c, url, app_globals as g
from pylons.controllers.util import abort, redirect

from pylons_app.lib.base import BaseController, render
import os
from pylons_app.lib import auth
from pylons_app.model.forms import LoginForm
import formencode
import formencode.htmlfill as htmlfill
from pylons_app.model import meta
from pylons_app.model.db import Users, UserLogs
from webhelpers.paginate import Page
from pylons_app.lib.utils import check_repo
log = logging.getLogger(__name__)

class AdminController(BaseController):

    def __before__(self):
        
        c.admin_user = session.get('admin_user', False)
        c.admin_username = session.get('admin_username')
        
    def index(self):
        # Return a rendered template
        if request.POST:
            #import Login Form validator class
            login_form = LoginForm()

            try:
                c.form_result = login_form.to_python(dict(request.params))
                if auth.admin_auth(c.form_result['username'], c.form_result['password']):
                    session['admin_user'] = True
                    session['admin_username'] = c.form_result['username']
                    session.save()
                    return redirect(url('admin_home'))
                else:
                    raise formencode.Invalid('Login Error', None, None,
                                             error_dict={'username':'invalid login',
                                                         'password':'invalid password'})
                                      
            except formencode.Invalid, error:
                c.form_result = error.value
                c.form_errors = error.error_dict or {}
                html = render('admin/admin.html')

                return htmlfill.render(
                    html,
                    defaults=c.form_result,
                    encoding="UTF-8"
                )
        if c.admin_user:
            sa = meta.Session
                             
            users_log = sa.query(UserLogs)\
                .order_by(UserLogs.action_date.desc())
            p = int(request.params.get('page', 1))
            c.users_log = Page(users_log, page=p, items_per_page=10)
            c.log_data = render('admin/admin_log.html')
            if request.params.get('partial'):
                return c.log_data
        return render('admin/admin.html')

    def hgrc(self, dirname):
        filename = os.path.join(dirname, '.hg', 'hgrc')
        return filename

    def add_repo(self, new_repo):
        

        #extra check it can be add since it's the command
        if new_repo == '_admin':
            c.msg = 'DENIED'
            c.new_repo = ''
            return render('add.html')

        new_repo = new_repo.replace(" ", "_")
        new_repo = new_repo.replace("-", "_")

        try:
            self._create_repo(new_repo)
            c.new_repo = new_repo
            c.msg = 'added repo'
        except Exception as e:
            c.new_repo = 'Exception when adding: %s' % new_repo
            c.msg = str(e)

        return render('add.html')


    def _create_repo(self, repo_name):
        if repo_name in [None, '', 'add']:
            raise Exception('undefined repo_name of repo')

        if check_repo(repo_name, g.base_path):
            log.info('creating repo %s in %s', repo_name, self.repo_path)
            cmd = """mkdir %s && hg init %s""" \
                    % (self.repo_path, self.repo_path)
            os.popen(cmd)