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)
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)
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)
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))
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)
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)