Skip to content

Commit

Permalink
Adds email settings page
Browse files Browse the repository at this point in the history
  • Loading branch information
bslatkin committed Aug 5, 2013
1 parent 4600227 commit 506e2e5
Show file tree
Hide file tree
Showing 9 changed files with 120 additions and 12 deletions.
2 changes: 1 addition & 1 deletion dpxdt/server/auth.py
Original file line number Diff line number Diff line change
Expand Up @@ -577,7 +577,7 @@ def save_admin_log(build, **kwargs):

@app.route('/activity')
@fresh_login_required
@build_access_required('id')
@build_access_required('build_id')
def view_admin_log():
"""Page for viewing the log of admin activity."""
build = g.build
Expand Down
14 changes: 12 additions & 2 deletions dpxdt/server/forms.py
Original file line number Diff line number Diff line change
Expand Up @@ -19,8 +19,8 @@

# Local libraries
from flask.ext.wtf import (
BooleanField, DataRequired, Form, HiddenField, IntegerField,
Length, NumberRange, Required, SubmitField, TextField)
BooleanField, DataRequired, Email, Form, HiddenField, IntegerField,
Length, NumberRange, Optional, Required, SubmitField, TextField)

# Local modules
from . import app
Expand Down Expand Up @@ -96,3 +96,13 @@ class ModifyWorkQueueTaskForm(Form):
action = HiddenField()
delete = SubmitField('Delete')
retry = SubmitField('Retry')


class SettingsForm(Form):
"""Form for modifying build settings."""

send_email = BooleanField('Send notification emails')
email_alias = TextField('Mailing list for notifications',
validators=[Optional(), Email()])
build_id = HiddenField(validators=[NumberRange(min=1)])
save = SubmitField('Save')
35 changes: 32 additions & 3 deletions dpxdt/server/frontend.py
Original file line number Diff line number Diff line change
Expand Up @@ -340,6 +340,35 @@ def view_run():
return response


@app.route('/static/dummy')
def view_dummy_url():
return app.send_static_file('dummy/index.html')
@app.route('/settings', methods=['GET', 'POST'])
@auth.build_access_required('build_id')
def build_settings():
build = g.build

settings_form = forms.SettingsForm()

if settings_form.validate_on_submit():
build.send_email = settings_form.send_email.data
build.email_alias = settings_form.email_alias.data

logging.info('Setting build_id=%r, send_email=%r, email_alias=%r',
build.id, build.send_email, build.email_alias)

db.session.add(build)
db.session.commit()

signals.build_updated.send(app, build=build, user=current_user)

return redirect(url_for(
request.endpoint,
build_id=build.id))

# Update form values for rendering
settings_form.build_id.data = build.id
settings_form.email_alias.data = build.email_alias
settings_form.send_email.data = build.send_email

return render_template(
'view_settings.html',
build=build,
settings_form=settings_form)
7 changes: 6 additions & 1 deletion dpxdt/server/operations.py
Original file line number Diff line number Diff line change
Expand Up @@ -320,12 +320,17 @@ def evict(self):



# Connect API events to cache eviction.
# Connect Frontend and API events to cache eviction.


def _evict_user_cache(sender, user=None, build=None):
UserOps(user.get_id()).evict()


def _evict_build_cache(sender, build=None, release=None, run=None):
BuildOps(build.id).evict()


signals.build_updated.connect(_evict_user_cache, app)
signals.release_updated_via_api.connect(_evict_build_cache, app)
signals.run_updated_via_api.connect(_evict_build_cache, app)
6 changes: 6 additions & 0 deletions dpxdt/server/signals.py
Original file line number Diff line number Diff line change
Expand Up @@ -23,6 +23,12 @@
_signals = Namespace()


# The build settings have been modified. Sender is the app. Arguments
# are (models.Build, models.User). Signal is sent immediately *after* the
# Build is committed to the DB.
build_updated = _signals.signal('build-updated')


# A release has been created or updated via the API. Sender is the app.
# Arguments are (models.Build, models.Release). Signal is sent immediately
# *after* the Release is committed to the DB.
Expand Down
5 changes: 4 additions & 1 deletion dpxdt/server/templates/view_admins.html
Original file line number Diff line number Diff line change
Expand Up @@ -30,7 +30,10 @@ <h4>Add admin</h4>
<form action="{{ url_for('manage_admins') }}" method="post">
{{ add_form.csrf_token }}
{{ add_form.build_id }}
{{ add_form.email_address.label }} {{ add_form.email_address }}
<div>
{{ add_form.email_address.label }}
{{ add_form.email_address }}
</div>
<br>
{{ add_form.add(class_='btn btn-primary') }}
</form>
Expand Down
5 changes: 4 additions & 1 deletion dpxdt/server/templates/view_api_keys.html
Original file line number Diff line number Diff line change
Expand Up @@ -30,7 +30,10 @@ <h4>Create a new API key</h4>
<form action="{{ url_for('manage_api_keys') }}" method="post">
{{ create_form.csrf_token }}
{{ create_form.build_id }}
{{ create_form.purpose.label }} {{ create_form.purpose }}
<div>
{{ create_form.purpose.label }}
{{ create_form.purpose }}
</div>
<br>
{{ create_form.create(class_='btn btn-primary') }}
</form>
Expand Down
8 changes: 5 additions & 3 deletions dpxdt/server/templates/view_build.html
Original file line number Diff line number Diff line change
Expand Up @@ -129,10 +129,12 @@ <h4>Releases</h4>

{% block footer_left %}

<a href="{{ url_for('manage_admins', build_id=build.id) }}">Manage admins</a>
<a href="{{ url_for('build_settings', build_id=build.id) }}">Settings</a>
&ndash;
<a href="{{ url_for('manage_api_keys', build_id=build.id) }}">Set up API keys</a>
<a href="{{ url_for('manage_admins', build_id=build.id) }}">Admins</a>
&ndash;
<a href="{{ url_for('view_admin_log', id=build.id) }}">Activity log</a>
<a href="{{ url_for('manage_api_keys', build_id=build.id) }}">API keys</a>
&ndash;
<a href="{{ url_for('view_admin_log', build_id=build.id) }}">Activity</a>

{% endblock footer_left %}
50 changes: 50 additions & 0 deletions dpxdt/server/templates/view_settings.html
Original file line number Diff line number Diff line change
@@ -0,0 +1,50 @@
{% extends 'base.html' %}

{% block title -%}
{{ build.name }} &rsaquo; Settings
{%- endblock title %}

{% block description -%}
Settings for '{{ build.name }}'
{%- endblock description %}

{% block body %}

<div class="row">
<div class="span12">
<h4>Settings</h4>

{% if settings_form.errors %}
<div class="row">
<div class="span6 alert alert-error">
{% for field, field_errors in settings_form.errors|dictsort %}
<div>
Invalid {{ settings_form[field].label(class="inline") }}
</div>
{% endfor %}
</div>
</div>
{% endif %}

<form autocomplete="off" action="{{ url_for('build_settings') }}" method="post">
{{ settings_form.csrf_token }}
{{ settings_form.build_id }}
<div>
<label class="checkbox" for="{{ settings_form.send_email.label.field_id }}">
{{ settings_form.send_email }}
{{ settings_form.send_email.label.text }}
</label>
<span class="help-block">e.g., When a release is ready for review</span>
</div>
<div>
{{ settings_form.email_alias.label }}
{{ settings_form.email_alias }}
<span class="help-block">Otherwise sent to build admins</span>
</div>
<br>
{{ settings_form.save(class_='btn btn-primary') }}
</form>
</div>
</div>

{% endblock body %}

0 comments on commit 506e2e5

Please sign in to comment.