Exemple #1
0
def index():
    api = pillar_api()

    # FIXME Sybren: add permission check.
    # TODO: add projections.
    projects = current_flamenco.flamenco_projects()

    for project in projects['_items']:
        attach_project_pictures(project, api)

    projs_with_summaries = [
        (proj, current_flamenco.job_manager.job_status_summary(proj['_id']))
        for proj in projects['_items']
    ]

    last_project = session.get('flamenco_last_project')
    if last_project:
        project = Project(last_project)
        navigation_links = project_navigation_links(project, pillar_api())
        extension_sidebar_links = current_app.extension_sidebar_links(project)
    else:
        project = None
        navigation_links = []
        extension_sidebar_links = []

    return render_template('flamenco/index.html',
                           projs_with_summaries=projs_with_summaries,
                           project=project,
                           navigation_links=navigation_links,
                           extension_sidebar_links=extension_sidebar_links)
def for_project(project, job_id=None, task_id=None):
    api = pillar_api()

    is_archive = request.blueprint == perproject_archive_blueprint.name

    # See if we need to redirect between archive and non-archive view.
    if job_id:
        from .sdk import Job
        job = Job.find(job_id, api=api)
        job_is_archived = job.status == 'archived'

        if job_is_archived != is_archive:
            target_blueprint = blueprint_for_archived[not is_archive]
            target_endpoint = request.endpoint.split('.')[-1]
            new_url = url_for(f'{target_blueprint.name}.{target_endpoint}',
                              **request.view_args)
            return redirect(new_url, code=307)

    navigation_links = project_navigation_links(project, pillar_api())
    extension_sidebar_links = current_app.extension_sidebar_links(project)

    return render_template('flamenco/jobs/list_for_project.html',
                           stats={
                               'nr_of_jobs': '∞',
                               'nr_of_tasks': '∞'
                           },
                           open_job_id=job_id,
                           open_task_id=task_id,
                           project=project,
                           is_archive=is_archive,
                           page_context='archive' if is_archive else 'job',
                           navigation_links=navigation_links,
                           extension_sidebar_links=extension_sidebar_links)
Exemple #3
0
def index():
    api = pillar_api()

    # FIXME Sybren: add permission check.
    # TODO: add projections.
    projects = current_flamenco.flamenco_projects()

    for project in projects['_items']:
        attach_project_pictures(project, api)

    projs_with_summaries = [
        (proj, current_flamenco.job_manager.job_status_summary(proj['_id']))
        for proj in projects['_items']
    ]

    last_project = session.get('flamenco_last_project')
    if last_project:
        project = Project(last_project)
        navigation_links = project_navigation_links(project, pillar_api())
        extension_sidebar_links = current_app.extension_sidebar_links(project)
    else:
        project = None
        navigation_links = []
        extension_sidebar_links = []

    return render_template('flamenco/index.html',
                           projs_with_summaries=projs_with_summaries,
                           project=project,
                           navigation_links=navigation_links,
                           extension_sidebar_links=extension_sidebar_links)
Exemple #4
0
def for_project(project, job_id=None, task_id=None):
    api = pillar_api()

    is_archive = request.blueprint == perproject_archive_blueprint.name

    # See if we need to redirect between archive and non-archive view.
    if job_id:
        from .sdk import Job
        job = Job.find(job_id, api=api)
        job_is_archived = job.status == 'archived'

        if job_is_archived != is_archive:
            target_blueprint = blueprint_for_archived[not is_archive]
            target_endpoint = request.endpoint.split('.')[-1]
            new_url = url_for(f'{target_blueprint.name}.{target_endpoint}', **request.view_args)
            return redirect(new_url, code=307)

    navigation_links = project_navigation_links(project, pillar_api())
    extension_sidebar_links = current_app.extension_sidebar_links(project)

    return render_template('flamenco/jobs/list_for_project.html',
                           stats={'nr_of_jobs': '∞', 'nr_of_tasks': '∞'},
                           open_job_id=job_id,
                           open_task_id=task_id,
                           project=project,
                           is_archive=is_archive,
                           page_context='archive' if is_archive else 'job',
                           navigation_links=navigation_links,
                           extension_sidebar_links=extension_sidebar_links)
Exemple #5
0
def view_node(project_url, node_id):
    """Entry point to view a node in the context of a project"""
    # Some browsers mangle URLs and URL-encode /p/{p-url}/#node-id
    if node_id.startswith('#'):
        return redirect(url_for('projects.view_node',
                                project_url=project_url,
                                node_id=node_id[1:]),
                        code=301)  # permanent redirect

    theatre_mode = 't' in request.args
    api = system_util.pillar_api()
    # First we check if it's a simple string, in which case we are looking for
    # a static page. Maybe we could use bson.objectid.ObjectId.is_valid(node_id)
    if not utils.is_valid_id(node_id):
        # raise wz_exceptions.NotFound('No such node')
        project, node = render_node_page(project_url, node_id, api)
    else:
        # Fetch the node before the project. If this user has access to the
        # node, we should be able to get the project URL too.
        try:
            node = Node.find(node_id, api=api)
        except ForbiddenAccess:
            return render_template('errors/403.html'), 403
        except ResourceNotFound:
            raise wz_exceptions.NotFound('No such node')

        try:
            project = Project.find_one({'where': {"url": project_url, '_id': node.project}},
                                       api=api)
        except ResourceNotFound:
            # In theatre mode, we don't need access to the project at all.
            if theatre_mode:
                project = None
            else:
                raise wz_exceptions.NotFound('No such project')

    og_picture = node.picture = utils.get_file(node.picture, api=api)
    if project:
        if not node.picture:
            og_picture = utils.get_file(project.picture_header, api=api)
        project.picture_square = utils.get_file(project.picture_square, api=api)

    # Append _theatre to load the proper template
    theatre = '_theatre' if theatre_mode else ''

    extension_sidebar_links = current_app.extension_sidebar_links(project)

    return render_template('projects/view{}.html'.format(theatre),
                           api=api,
                           project=project,
                           node=node,
                           show_node=True,
                           show_project=False,
                           og_picture=og_picture,
                           extension_sidebar_links=extension_sidebar_links)
Exemple #6
0
def project_browse(project: pillarsdk.Project):
    """Project view displaying all top-level nodes.

    We render a regular project view, but we introduce an additional template
    variable: browse. By doing that we prevent the regular project view
    from loading and fetch via AJAX a "group" node-like view instead (see
    project_browse_view_nodes).
    """
    return render_template(
        'projects/view.html',
        api=system_util.pillar_api(),
        project=project,
        node=None,
        show_project=True,
        browse=True,
        og_picture=None,
        navigation_links=project_navigation_links(project,
                                                  system_util.pillar_api()),
        extension_sidebar_links=current_app.extension_sidebar_links(project))
Exemple #7
0
def index(manager_id: str = None):
    api = pillar_api()

    if current_user.is_authenticated:
        params = {'where': {'owner': {'$in': current_user.groups}}}
    else:
        params = None
    managers = Manager.all(params=params, api=api)

    if not manager_id and managers['_items']:
        manager_id = managers['_items'][0]._id

    manager_limit_reached = managers['_meta'][
        'total'] >= flamenco.auth.MAX_MANAGERS_PER_USER

    # TODO Sybren: move this to a utility function + check on endpoint to create manager
    may_use_flamenco = current_user.has_cap('flamenco-use')
    can_create_manager = may_use_flamenco and (not manager_limit_reached or
                                               current_user.has_cap('admin'))

    if session.get('flamenco_last_project'):
        project = Project(session.get('flamenco_last_project'))
        navigation_links = project_navigation_links(project, pillar_api())
        extension_sidebar_links = current_app.extension_sidebar_links(project)
    else:
        project = None
        navigation_links = []
        extension_sidebar_links = []

    return render_template('flamenco/managers/index.html',
                           manager_limit_reached=manager_limit_reached,
                           may_use_flamenco=may_use_flamenco,
                           can_create_manager=can_create_manager,
                           max_managers=flamenco.auth.MAX_MANAGERS_PER_USER,
                           managers=managers,
                           open_manager_id=manager_id,
                           project=project,
                           navigation_links=navigation_links,
                           extension_sidebar_links=extension_sidebar_links)
Exemple #8
0
def render_project(project, api, extra_context=None, template_name=None):
    project.picture_square = utils.get_file(project.picture_square, api=api)
    project.picture_header = utils.get_file(project.picture_header, api=api)

    def load_latest(list_of_ids, node_type=None):
        """Loads a list of IDs in reversed order."""

        if not list_of_ids:
            return []

        # Construct query parameters outside the loop.
        projection = {'name': 1, 'user': 1, 'node_type': 1, 'project': 1,
                      'properties.url': 1, 'properties.content_type': 1,
                      'picture': 1}
        params = {'projection': projection, 'embedded': {'user': 1}}

        if node_type == 'post':
            projection['properties.content'] = 1
        elif node_type == 'asset':
            projection['description'] = 1

        list_latest = []
        for node_id in reversed(list_of_ids or ()):
            try:
                node_item = Node.find(node_id, params, api=api)

                node_item.picture = utils.get_file(node_item.picture, api=api)
                list_latest.append(node_item)
            except ForbiddenAccess:
                pass
            except ResourceNotFound:
                log.warning('Project %s refers to removed node %s!',
                            project._id, node_id)

        return list_latest

    project.nodes_featured = load_latest(project.nodes_featured, node_type='asset')
    project.nodes_blog = load_latest(project.nodes_blog, node_type='post')

    # Merge featured assets and blog posts into one activity stream
    def sort_key(item):
        return item._created

    activities = itertools.chain(project.nodes_featured,
                                 project.nodes_blog)
    activity_stream = sorted(activities, key=sort_key, reverse=True)

    if extra_context is None:
        extra_context = {}

    if project.category == 'home' and not current_app.config['RENDER_HOME_AS_REGULAR_PROJECT']:
        template_name = template_name or 'projects/home_index.html'
        return render_template(
            template_name,
            gravatar=utils.gravatar(current_user.email, size=128),
            project=project,
            api=system_util.pillar_api(),
            **extra_context)

    if template_name is None:
        if request.args.get('embed'):
            embed_string = '_embed'
        else:
            embed_string = ''
        template_name = "projects/view{0}.html".format(embed_string)

    extension_sidebar_links = current_app.extension_sidebar_links(project)

    return render_template(template_name,
                           api=api,
                           project=project,
                           node=None,
                           show_node=False,
                           show_project=True,
                           og_picture=project.picture_header,
                           activity_stream=activity_stream,
                           extension_sidebar_links=extension_sidebar_links,
                           **extra_context)