Skip to content

Commit

Permalink
Fix deprecations and make flaskbb run again
Browse files Browse the repository at this point in the history
  • Loading branch information
sh4nks committed Jun 7, 2022
1 parent 7d1ac4f commit 4ec2269
Show file tree
Hide file tree
Showing 5 changed files with 16 additions and 123 deletions.
119 changes: 3 additions & 116 deletions flaskbb/utils/fields.py
Original file line number Diff line number Diff line change
Expand Up @@ -10,15 +10,14 @@
:copyright: (c) 2014 by the FlaskBB Team.
:license: BSD, see LICENSE for more details.
"""
from datetime import datetime
import logging
import urllib

from flask import request, current_app, Markup, json
from flask import request, current_app, json
from werkzeug.urls import url_encode
from markupsafe import Markup
from wtforms import ValidationError
from wtforms.fields import DateField, Field
from wtforms.widgets.core import Select, html_params
from wtforms.fields import Field

from flaskbb.utils.helpers import to_bytes, to_unicode
from flaskbb.utils.settings import flaskbb_config
Expand Down Expand Up @@ -138,115 +137,3 @@ class RecaptchaField(Field):
def __init__(self, label='', validators=None, **kwargs):
validators = validators or [RecaptchaValidator()]
super(RecaptchaField, self).__init__(label, validators, **kwargs)


class SelectBirthdayWidget(object):
"""Renders a DateTime field with 3 selects.
For more information see: http://stackoverflow.com/a/14664504
"""
FORMAT_CHOICES = {
'%d': [(x, str(x)) for x in range(1, 32)],
'%m': [(x, str(x)) for x in range(1, 13)]
}

FORMAT_CLASSES = {
'%d': 'select_date_day',
'%m': 'select_date_month',
'%Y': 'select_date_year'
}

def __init__(self, years=None):
"""Initialzes the widget.
:param years: The min year which should be chooseable.
Defatuls to ``1930``.
"""
if years is None:
years = range(1930, datetime.utcnow().year + 1)

super(SelectBirthdayWidget, self).__init__()
self.FORMAT_CHOICES['%Y'] = [(x, str(x)) for x in years]

# TODO(anr): clean up
def __call__(self, field, **kwargs): # noqa: C901
field_id = kwargs.pop('id', field.id)
html = []
allowed_format = ['%d', '%m', '%Y']
surrounded_div = kwargs.pop('surrounded_div', None)
css_class = kwargs.get('class', None)

for date_format in field.format.split():
if date_format in allowed_format:
choices = self.FORMAT_CHOICES[date_format]
id_suffix = date_format.replace('%', '-')
id_current = field_id + id_suffix

if css_class is not None: # pragma: no cover
select_class = "{} {}".format(
css_class, self.FORMAT_CLASSES[date_format]
)
else:
select_class = self.FORMAT_CLASSES[date_format]

kwargs['class'] = select_class

try:
del kwargs['placeholder']
except KeyError:
pass

if surrounded_div is not None:
html.append('<div class="%s">' % surrounded_div)

html.append('<select %s>' % html_params(name=field.name,
id=id_current,
**kwargs))

if field.data:
current_value = int(field.data.strftime(date_format))
else:
current_value = None

for value, label in choices:
selected = (value == current_value)

# Defaults to blank
if value == 1 or value == 1930:
html.append(
Select.render_option("None", " ", selected)
)

html.append(Select.render_option(value, label, selected))

html.append('</select>')

if surrounded_div is not None:
html.append("</div>")

html.append(' ')

return Markup(''.join(html))


class BirthdayField(DateField):
"""Same as DateField, except it allows ``None`` values in case a user
wants to delete his birthday.
"""
widget = SelectBirthdayWidget()

def __init__(self, label=None, validators=None, format='%Y-%m-%d',
**kwargs):
DateField.__init__(self, label, validators, format, **kwargs)

def process_formdata(self, valuelist):
if valuelist:
date_str = ' '.join(valuelist)
try:
self.data = datetime.strptime(date_str, self.format).date()
except ValueError:
self.data = None

# Only except the None value if all values are None.
# A bit dirty though
if valuelist != ["None", "None", "None"]:
raise ValueError("Not a valid date value")
6 changes: 3 additions & 3 deletions flaskbb/utils/forms.py
Original file line number Diff line number Diff line change
Expand Up @@ -8,7 +8,7 @@
:copyright: (c) 2017 by the FlaskBB Team.
:license: BSD, see LICENSE for more details.
"""
from wtforms import (TextField, IntegerField, FloatField, BooleanField,
from wtforms import (StringField, IntegerField, FloatField, BooleanField,
SelectField, SelectMultipleField, validators)
from flask_wtf import FlaskForm
from enum import Enum
Expand Down Expand Up @@ -103,11 +103,11 @@ class SettingsForm(FlaskBBForm):
description=setting.description)
)

# TextField
# StringField
elif setting.value_type == SettingValueType.string:
setattr(
SettingsForm, setting.key,
TextField(setting.name, validators=field_validators,
StringField(setting.name, validators=field_validators,
description=setting.description)
)

Expand Down
3 changes: 1 addition & 2 deletions flaskbb/utils/helpers.py
Original file line number Diff line number Diff line change
Expand Up @@ -15,7 +15,6 @@
import os
import re
import time
import warnings
from datetime import datetime, timedelta
from email import message_from_string
from functools import wraps
Expand All @@ -33,7 +32,7 @@
from flask_babelplus import lazy_gettext as _
from flask_login import current_user
from flask_themes2 import get_themes_list, render_theme_template
from jinja2 import Markup
from markupsafe import Markup
from PIL import ImageFile
from pytz import UTC
from werkzeug.local import LocalProxy
Expand Down
9 changes: 8 additions & 1 deletion flaskbb/utils/settings.py
Original file line number Diff line number Diff line change
Expand Up @@ -9,10 +9,13 @@
:copyright: (c) 2014 by the FlaskBB Team.
:license: BSD, see LICENSE for more details.
"""
import logging
from collections.abc import MutableMapping

from flaskbb.management.models import Setting

logger = logging.getLogger(__name__)


class FlaskBBConfig(MutableMapping):
"""Provides a dictionary like interface for interacting with FlaskBB's
Expand All @@ -23,7 +26,11 @@ def __init__(self, *args, **kwargs):
self.update(dict(*args, **kwargs))

def __getitem__(self, key):
return Setting.as_dict()[key]
try:
return Setting.as_dict()[key]
except KeyError:
logger.info(f"Couldn't find setting for key ${key}")
return None

def __setitem__(self, key, value):
Setting.update({key.lower(): value})
Expand Down
2 changes: 1 addition & 1 deletion tox.ini
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
[tox]
skip_missing_interpreters = true
envlist =
py{36,37,38,39},
py{37,38,39,310},
coverage

[testenv]
Expand Down

0 comments on commit 4ec2269

Please sign in to comment.