Add decorators.give_theme_cookie to decouple from render_template.

I realized it was not appropriate for render_template to be handling
this responsibility, but previously did not think of another way.
Now I did.
master
voussoir 2021-06-04 21:29:23 -07:00
parent 1554b86c11
commit 7f8a007e2d
No known key found for this signature in database
GPG Key ID: 5F7554F8C26DACCB
2 changed files with 26 additions and 15 deletions

View File

@ -66,6 +66,7 @@ def decorate_and_route(*route_args, **route_kwargs):
# same one multiple times. The _fully_decorated will track that. # same one multiple times. The _fully_decorated will track that.
if not hasattr(endpoint, '_fully_decorated'): if not hasattr(endpoint, '_fully_decorated'):
endpoint = flasktools.ensure_response_type(endpoint) endpoint = flasktools.ensure_response_type(endpoint)
endpoint = decorators.give_theme_cookie(endpoint)
endpoint = decorators.catch_etiquette_exception(endpoint) endpoint = decorators.catch_etiquette_exception(endpoint)
endpoint = session_manager.give_token(endpoint) endpoint = session_manager.give_token(endpoint)
@ -162,10 +163,7 @@ def back_url():
def render_template(request, template_name, **kwargs): def render_template(request, template_name, **kwargs):
session = session_manager.get(request) session = session_manager.get(request)
theme = request.cookies.get('etiquette_theme', None)
old_theme = request.cookies.get('etiquette_theme', None)
new_theme = request.args.get('theme', None)
theme = new_theme or old_theme or 'slate'
response = flask.render_template( response = flask.render_template(
template_name, template_name,
@ -174,17 +172,6 @@ def render_template(request, template_name, **kwargs):
theme=theme, theme=theme,
**kwargs, **kwargs,
) )
if not isinstance(response, flasktools.RESPONSE_TYPES):
response = flask.Response(response)
if new_theme is None:
pass
elif new_theme == '':
response.set_cookie('etiquette_theme', value='', expires=0)
elif new_theme != old_theme:
response.set_cookie('etiquette_theme', value=new_theme, expires=2147483647)
return response return response
def send_file(filepath, override_mimetype=None): def send_file(filepath, override_mimetype=None):

View File

@ -1,8 +1,10 @@
import flask; from flask import request import flask; from flask import request
import functools import functools
import time import time
import werkzeug.datastructures
from voussoirkit import dotdict from voussoirkit import dotdict
from voussoirkit import flasktools
from voussoirkit import passwordy from voussoirkit import passwordy
from voussoirkit import sentinel from voussoirkit import sentinel
@ -107,6 +109,28 @@ def catch_etiquette_exception(function):
flask.abort(response) flask.abort(response)
return wrapped return wrapped
def give_theme_cookie(function):
@functools.wraps(function)
def wrapped(*args, **kwargs):
old_theme = request.cookies.get('etiquette_theme', None)
new_theme = request.args.get('theme', None)
theme = new_theme or old_theme or 'slate'
request.cookies = werkzeug.datastructures.MultiDict(request.cookies)
request.cookies['etiquette_theme'] = theme
response = function(*args, **kwargs)
if new_theme is None:
pass
elif new_theme == '':
response.set_cookie('etiquette_theme', value='', expires=0)
elif new_theme != old_theme:
response.set_cookie('etiquette_theme', value=new_theme, expires=2147483647)
return response
return wrapped
def required_fields(fields, forbid_whitespace=False): def required_fields(fields, forbid_whitespace=False):
''' '''
Declare that the endpoint requires certain POST body fields. Without them, Declare that the endpoint requires certain POST body fields. Without them,