From a9280dd05f695cc4a1af98a2971ee170c6837b2d Mon Sep 17 00:00:00 2001 From: Francesco Siddi Date: Wed, 30 Aug 2017 23:13:03 +0200 Subject: [PATCH] Introducing settings for blender-cloud Moved Blender Cloud specific settings from Pillar into this application. --- cloud/routes.py | 70 ++++++++++++++++++++++- src/templates/users/settings/_sidebar.pug | 20 +++++++ src/templates/users/settings/billing.pug | 68 ++++++++++++++++++++++ src/templates/users/settings/emails.pug | 27 +++++++++ 4 files changed, 182 insertions(+), 3 deletions(-) create mode 100644 src/templates/users/settings/_sidebar.pug create mode 100644 src/templates/users/settings/billing.pug create mode 100644 src/templates/users/settings/emails.pug diff --git a/cloud/routes.py b/cloud/routes.py index 9013c73..1fccd07 100644 --- a/cloud/routes.py +++ b/cloud/routes.py @@ -1,12 +1,17 @@ import itertools +import json import logging -from pillarsdk import Node, Project +import pillar.api +from pillar.web.users import forms + +from pillarsdk import Node, Project, User, exceptions as sdk_exceptions, Group from pillarsdk.exceptions import ResourceNotFound -from flask_login import current_user -from flask import Blueprint, current_app, render_template, redirect, session, url_for +from flask_login import current_user, login_required +from flask import Blueprint, current_app, render_template, redirect, session, url_for, abort, flash from pillar.web.utils import system_util, get_file, current_user_is_authenticated from pillar.web.utils import attach_project_pictures +from pillar.web.settings import blueprint as blueprint_settings blueprint = Blueprint('cloud', __name__) log = logging.getLogger(__name__) @@ -204,3 +209,62 @@ def get_random_featured_nodes(): featured_node_documents.append(node_document) return featured_node_documents + + +@blueprint_settings.route('/emails', methods=['GET', 'POST']) +@login_required +def emails(): + """Main email settings. + """ + if current_user.has_role('protected'): + return abort(404) # TODO: make this 403, handle template properly + api = system_util.pillar_api() + user = User.find(current_user.objectid, api=api) + + # Force creation of settings for the user (safely remove this code once + # implemented on account creation level, and after adding settings to all + # existing users) + if not user.settings: + user.settings = dict(email_communications=1) + user.update(api=api) + + if user.settings.email_communications is None: + user.settings.email_communications = 1 + user.update(api=api) + + # Generate form + form = forms.UserSettingsEmailsForm( + email_communications=user.settings.email_communications) + + if form.validate_on_submit(): + try: + user.settings.email_communications = form.email_communications.data + user.update(api=api) + flash("Profile updated", 'success') + except sdk_exceptions.ResourceInvalid as e: + message = json.loads(e.content) + flash(message) + + return render_template('users/settings/emails.html', form=form, title='emails') + + +@blueprint_settings.route('/billing') +@login_required +def billing(): + """View the subscription status of a user + """ + if current_user.has_role('protected'): + return abort(404) # TODO: make this 403, handle template properly + api = system_util.pillar_api() + user = User.find(current_user.objectid, api=api) + groups = [] + if user.groups: + for group_id in user.groups: + group = Group.find(group_id, api=api) + groups.append(group.name) + + store_user = pillar.api.blender_cloud.subscription.fetch_subscription_info(user.email) + + return render_template( + 'users/settings/billing.html', + store_user=store_user, groups=groups, title='billing') diff --git a/src/templates/users/settings/_sidebar.pug b/src/templates/users/settings/_sidebar.pug new file mode 100644 index 0000000..8a025ae --- /dev/null +++ b/src/templates/users/settings/_sidebar.pug @@ -0,0 +1,20 @@ +#settings-sidebar + .settings-header + .settings-title Settings + .settings-content + ul + a(class="{% if title == 'profile' %}active{% endif %}", + href="{{ url_for('settings.profile') }}") + li + i.pi-vcard + | Profile + a(class="{% if title == 'emails' %}active{% endif %}", + href="{{ url_for('settings.emails') }}") + li + i.pi-email + | Emails + a(class="{% if title == 'billing' %}active{% endif %}", + href="{{ url_for('settings.billing') }}") + li + i.pi-credit-card + | Subscription diff --git a/src/templates/users/settings/billing.pug b/src/templates/users/settings/billing.pug new file mode 100644 index 0000000..e11965f --- /dev/null +++ b/src/templates/users/settings/billing.pug @@ -0,0 +1,68 @@ +| {% extends 'layout.html' %} +| {% block head %} +style(type='text/css'). + button#recheck_subscription { + margin-top: 1em; + } +| {% endblock %} +| {% block body %} +.container + #settings + | {% include 'users/settings/_sidebar.html'%} + #settings-container + .settings-header + .settings-title Subscription + + .settings-content + + | {% if store_user['cloud_access'] %} + h3.subscription-active + i.pi-check + | Your subscription is active + h4 Thank you for supporting us! + + hr + + p Subscription expires on: {{ store_user['expiration_date'][:10] }} + a(href="https://store.blender.org/my-account/subscriptions/") Manage your subscription on Blender Store + | {% else %} + + | {% if 'demo' in groups %} + h3.subscription-demo + i.pi-heart-filled + | You have a free account + + hr + + p You have full access to the Blender Cloud, provided by the Blender Institute. This account is meant for free evaluation of the service. Get in touch with #[a(href="mailto:cloudsupport@blender.org") cloudsupport@blender.org] if you have any questions. + + | {% else %} + h3.subscription-missing + i.pi-info + | You do not have an active subscription. + h3 + a(href="https://store.blender.org/product/membership/") Get full access to Blender Cloud now! + | {% endif %} + + | {% endif %} + + p + button#recheck_subscription.btn.btn-default(onclick="javascript:recheck_subscription(this)") Re-check my subscription + hr + + +script. + function recheck_subscription(button) { + $(button).text('Checking'); + + $.get('/api/bcloud/update-subscription') + .done(function() { + window.location.reload(); + }) + .fail(function() { + alert('Unable to update subscription, please check your internet connection.'); + }) + ; + } + +| {% endblock %} diff --git a/src/templates/users/settings/emails.pug b/src/templates/users/settings/emails.pug new file mode 100644 index 0000000..9c8e6e9 --- /dev/null +++ b/src/templates/users/settings/emails.pug @@ -0,0 +1,27 @@ +| {% extends 'layout.html' %} +| {% block body %} +.container + #settings + | {% include 'users/settings/_sidebar.html'%} + #settings-container + .settings-header + .settings-title Emails + + .settings-content + + .settings-form + form#settings-form(method='POST', action="{{url_for('settings.emails')}}") + | {{ form.csrf_token }} + | {% for subfield in form.email_communications %} + .form-group. + {{ subfield }} + {{ subfield.label }} + | {% endfor %} + + .buttons + button.btn.btn-default.button-submit(type='submit') + i.pi-check + | Save Changes + + +| {% endblock %}