Allow extensions to have a project settings page.

This commit is contained in:
Sybren A. Stüvel 2017-05-24 15:48:06 +02:00
parent b7bccfeee3
commit 2ba52e2467
3 changed files with 35 additions and 1 deletions

View File

@ -17,10 +17,14 @@ can then be registered to the application at app creation time:
import abc import abc
import flask
import pillarsdk import pillarsdk
class PillarExtension(object, metaclass=abc.ABCMeta): class PillarExtension(object, metaclass=abc.ABCMeta):
# Set to True when your extension implements the project_settings() method.
has_project_settings = False
@property @property
@abc.abstractmethod @abc.abstractmethod
def name(self): def name(self):
@ -103,3 +107,11 @@ class PillarExtension(object, metaclass=abc.ABCMeta):
""" """
return '' return ''
def project_settings(self, project: pillarsdk.Project) -> flask.Response:
"""Renders the project settings page for this extension.
Set YourExtension.has_project_settings = True and Pillar will call this function.
:returns: a Flask HTTP response
"""

View File

@ -468,6 +468,10 @@ def edit(project: Project):
status=project.status, status=project.status,
) )
# Collect extension pages.
ext_pages = [ext for ext in current_app.pillar_extensions.values()
if ext.has_project_settings]
if form.validate_on_submit(): if form.validate_on_submit():
project = Project.find(project._id, api=api) project = Project.find(project._id, api=api)
project.name = form.name.data project.name = form.name.data
@ -506,6 +510,7 @@ def edit(project: Project):
form=form, form=form,
hidden_fields=hidden_fields, hidden_fields=hidden_fields,
project=project, project=project,
ext_pages=ext_pages,
api=api) api=api)
@ -778,3 +783,15 @@ def delete():
project.delete(api=api) project.delete(api=api)
return jsonify(dict(staus='success', data=dict( return jsonify(dict(staus='success', data=dict(
message='Project deleted {}'.format(project['_id'])))) message='Project deleted {}'.format(project['_id']))))
@blueprint.route('/<project_url>/edit/<extension_name>', methods=['GET', 'POST'])
@login_required
@project_view()
def edit_extension(project: Project, extension_name):
try:
ext = current_app.pillar_extensions[extension_name]
except KeyError:
raise wz_exceptions.NotFound()
return ext.project_settings(project)

View File

@ -65,7 +65,12 @@
a(href="{{ url_for('projects.edit_node_types', project_url=project.url) }}") a(href="{{ url_for('projects.edit_node_types', project_url=project.url) }}")
i.pi-puzzle i.pi-puzzle
| Node Types | Node Types
| {% for ext in ext_pages %}
li(class="{% if title == ext.name %}active{% endif %}")
a(href="{{ url_for('projects.edit_extension', project_url=project.url, extension_name=ext.name) }}")
i(class="pi-{{ext.icon}}")
| {{ext.name | title}}
| {% endfor %}
.project_split(title="Toggle Navigation [T]") .project_split(title="Toggle Navigation [T]")
#project_context-container #project_context-container