Page MenuHome
No OneTemporary

import functools
import logging
from flask import Blueprint, render_template
from pillar.api.utils import jsonify
from pillar.web.system_util import pillar_api
import pillarsdk
blueprint = Blueprint('attract', __name__)
log = logging.getLogger(__name__)
def index():
return render_template('attract/index.html')
def subversion_kick():
from . import subversion
# TODO: each project should have its own SVN server.
svn_server_url = 'svn://localhost/agent327''Re-examining SVN server %s', svn_server_url)
client = subversion.obtain(svn_server_url)
# TODO: last_seen_revision should be stored, probably at the project level.
last_seen_revision = 0
observer = subversion.CommitLogObserver(client, last_seen_revision=last_seen_revision)
return jsonify({
'previous_last_seen_revision': last_seen_revision,
'last_seen_revision': observer.last_seen_revision,
def error_project_not_setup_for_attract():
return render_template('attract/errors/project_not_setup.html')
def attract_project_view(extra_project_projections=None):
"""Decorator, replaces the first parameter project_url with the actual project.
Assumes the first parameter to the decorated function is 'project_url'. It then
looks up that project, checks that it's set up for Attract, and passes it to the
decorated function.
If not set up for attract, uses error_project_not_setup_for_attract() to render
the response.
:param extra_project_projections: extra projections to use on top of the ones already
used by this decorator.
:type extra_project_projections: dict
if callable(extra_project_projections):
raise TypeError('Use with @attract_project_view() <-- note the parentheses')
projections = {
'_id': 1,
'name': 1,
'node_types': 1,
# We don't need this here, but this way the wrapped function has access
# to the orignal URL passed to it.
'url': 1,
if extra_project_projections:
def decorator(wrapped):
def wrapper(project_url, *args, **kwargs):
api = pillar_api()
project = pillarsdk.Project.find_by_url(
{'projection': projections},
node_type = project.get_node_type('attract.task')
if not node_type:
log.warning('createProject url=%s does not have node type attract.task',
return error_project_not_setup_for_attract()
return wrapped(project, *args, **kwargs)
return wrapper
return decorator

File Metadata

Mime Type
Fri, Oct 30, 4:05 PM (1 d, 23 h)
Storage Engine
Storage Format
Raw Data
Storage Handle

Event Timeline