blob: df5ad9f13fa62f4c8175b57cdcd28ae8bb310620 [file] [log] [blame]
#-*- python -*-
import logging
from datetime import datetime, timedelta
import urllib2
# Non-stdlib imports
import pkg_resources
import pymongo
from tg import expose, validate, redirect, response, flash
from tg.decorators import with_trailing_slash, without_trailing_slash
from tg.controllers import RestController
from pylons import tmpl_context as c, app_globals as g
from pylons import request, response
from formencode import validators
from webob import exc
import MySQLdb
import json
# Pyforge-specific imports
from allura.app import Application, ConfigOption, SitemapEntry
from allura.app import DefaultAdminController
from allura.lib import helpers as h
from allura.lib.search import search
from allura.lib.decorators import require_post
from allura.lib.security import has_access, require_access
from allura.lib import widgets as w
from allura.lib.widgets.subscriptions import SubscribeForm
from allura.lib.widgets import form_fields as ffw
from allura import model as M
from allura.controllers import BaseController, AppDiscussionController
# Local imports
from bitergiametrics import model as BM
from bitergiametrics import version
from bitergiametrics import widgets
from bitergiametrics import tasks
from forgetracker import model as TM
log = logging.getLogger(__name__)
class W:
thread=w.Thread(
page=None, limit=None, page_size=None, count=None,
style='linear')
# pager = widgets.BlogPager()
# new_post_form = widgets.NewPostForm()
# edit_post_form = widgets.EditPostForm()
view_metrics_form = widgets.ViewMetricsForm()
# label_edit = ffw.LabelEdit()
# subscribe_form = SubscribeForm()
class BitergiaMetricsApp(Application):
__version__ = version.__version__
tool_label='Metrics'
default_mount_label='Metrics'
default_mount_point='metrics'
permissions = ['configure', 'read', 'write', 'admin']
ordinal=14
installable=True
config_options = Application.config_options
icons={
24:'images/blog_24.png',
32:'images/blog_32.png',
48:'images/blog_48.png'
}
def __init__(self, project, config):
Application.__init__(self, project, config)
self.root = RootController()
self.admin = MetricsAdminController(self)
@property
@h.exceptionless([], log)
def sitemap(self):
menu_id = self.config.options.mount_label.title()
with h.push_config(c, app=self):
return [
SitemapEntry(menu_id, '.')[self.sidebar_menu()] ]
@h.exceptionless([], log)
def sidebar_menu(self):
base = c.app.url
links = [
SitemapEntry('Summary', base),
# SitemapEntry('Source Code', base),
SitemapEntry(' Source Evolution ', self.config.url() + 'scm_milestone0'),
# SitemapEntry(' Commits & committers', self.config.url() + 'commits_commiters'),
# SitemapEntry(' Ratio commits/committer', self.config.url() + 'ratio_commits_commiters'),
# SitemapEntry(' Lines added/removed', self.config.url() + 'lines_added_removed'),
# SitemapEntry('Tickets', base),
SitemapEntry(' Tickets Evolution ', self.config.url() + 'its_milestone0'),
SitemapEntry(' Mailing Evolution ', self.config.url() + 'mls_milestone0'),
# SitemapEntry(' Open & closed', self.config.url() + 'open_closed'),
# SitemapEntry('Tools', self.config.url() + 'open_closed'),
# SitemapEntry(' Bicho', self.config.url() + 'bicho'),
# SitemapEntry(' CVSAnaly', self.config.url() + 'cvsanaly'),
]
return links
def admin_menu(self):
return super(BitergiaMetricsApp, self).admin_menu(force_options=True)
def install(self, project):
'Set up any default permissions and roles here'
super(BitergiaMetricsApp, self).install(project)
# Setup permissions
role_admin = M.ProjectRole.by_name('Admin')._id
role_developer = M.ProjectRole.by_name('Developer')._id
role_auth = M.ProjectRole.by_name('*authenticated')._id
role_anon = M.ProjectRole.by_name('*anonymous')._id
self.config.acl = [
M.ACE.allow(role_anon, 'read'),
M.ACE.allow(role_developer, 'write'),
M.ACE.allow(role_admin, 'configure'),
M.ACE.allow(role_admin, 'admin'),
]
def uninstall(self, project):
"Remove all the tool's artifacts from the database"
# BM.Attachment.query.remove(dict(app_config_id=c.app.config._id))
# BM.BlogPost.query.remove(dict(app_config_id=c.app.config._id))
# BM.BlogPostSnapshot.query.remove(dict(app_config_id=c.app.config._id))
super(BitergiaMetricsApp, self).uninstall(project)
class RootController(BaseController):
def __init__(self):
# setattr(self, 'feed.atom', self.feed)
# setattr(self, 'feed.rss', self.feed)
# self._discuss = AppDiscussionController()
pass
# Metrics
@expose('jinja:bitergiametrics:templates/metrics/scm_milestone0.html')
@with_trailing_slash
def scm_milestone0(self, page=0, limit=10, **kw):
return dict()
@expose('jinja:bitergiametrics:templates/metrics/its_milestone0.html')
@with_trailing_slash
def its_milestone0(self, page=0, limit=10, **kw):
return dict()
@expose('jinja:bitergiametrics:templates/metrics/mls_milestone0.html')
@with_trailing_slash
def mls_milestone0(self, page=0, limit=10, **kw):
return dict()
# Tools management
@expose('jinja:bitergiametrics:templates/metrics/bicho.html')
@with_trailing_slash
@validate(dict(when=validators.UnicodeString(if_empty=None)))
def bicho(self, when=None, **kw):
if not when:
when = ''
else:
log.info("Executing bicho")
tasks.launch_bicho.post("PROJECT")
return dict(when=when)
# FIXME: Clean testing code and direct SQL to MySQL
@expose('jinja:bitergiametrics:templates/metrics/index.html')
@with_trailing_slash
def index(self, page=0, limit=10, **kw):
return dict()
# TODO: Use this class to configure Bitergia Metrics Tools
class MetricsAdminController(DefaultAdminController):
def __init__(self, app):
self.app = app
@without_trailing_slash
@expose('jinja:bitergiametrics:templates/metrics/admin_options.html')
def options(self):
return dict(app=self.app,
allow_config=has_access(self.app, 'configure')())
@without_trailing_slash
@expose()
@require_post()
def set_options(self, show_discussion=False):
self.app.config.options['show_discussion'] = show_discussion and True or False
flash('Metrics options updated')
redirect(h.really_unicode(c.project.url()+'admin/tools').encode('utf-8'))