forms.py 3.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120
  1. # -*- coding: utf-8 -*-
  2. """
  3. flaskbb.utils.forms
  4. ~~~~~~~~~~~~~~~~~~~
  5. This module contains stuff for forms.
  6. :copyright: (c) 2017 by the FlaskBB Team.
  7. :license: BSD, see LICENSE for more details.
  8. """
  9. from wtforms import (TextField, IntegerField, FloatField, BooleanField,
  10. SelectField, SelectMultipleField, validators)
  11. from flask_wtf import FlaskForm
  12. from flaskbb._compat import text_type
  13. from enum import Enum
  14. class SettingsValueTypes(Enum):
  15. string = 0
  16. integer = 1
  17. float = 3
  18. boolean = 4
  19. select = 5
  20. selectmultiple = 6
  21. def generate_settings_form(settings):
  22. """Generates a settings form which includes field validation
  23. based on our Setting Schema."""
  24. class SettingsForm(FlaskForm):
  25. pass
  26. # now parse the settings in this group
  27. for setting in settings:
  28. field_validators = []
  29. if setting.value_type in {SettingsValueTypes.integer, SettingsValueTypes.float}:
  30. validator_class = validators.NumberRange
  31. elif setting.value_type == SettingsValueTypes.string:
  32. validator_class = validators.Length
  33. # generate the validators
  34. if "min" in setting.extra:
  35. # Min number validator
  36. field_validators.append(
  37. validator_class(min=setting.extra["min"])
  38. )
  39. if "max" in setting.extra:
  40. # Max number validator
  41. field_validators.append(
  42. validator_class(max=setting.extra["max"])
  43. )
  44. # Generate the fields based on value_type
  45. # IntegerField
  46. if setting.value_type == SettingsValueTypes.integer:
  47. setattr(
  48. SettingsForm, setting.key,
  49. IntegerField(setting.name, validators=field_validators,
  50. description=setting.description)
  51. )
  52. # FloatField
  53. elif setting.value_type == SettingsValueTypes.float:
  54. setattr(
  55. SettingsForm, setting.key,
  56. FloatField(setting.name, validators=field_validators,
  57. description=setting.description)
  58. )
  59. # TextField
  60. elif setting.value_type == SettingsValueTypes.string:
  61. setattr(
  62. SettingsForm, setting.key,
  63. TextField(setting.name, validators=field_validators,
  64. description=setting.description)
  65. )
  66. # SelectMultipleField
  67. elif setting.value_type == SettingsValueTypes.selectmultiple:
  68. # if no coerce is found, it will fallback to unicode
  69. if "coerce" in setting.extra:
  70. coerce_to = setting.extra['coerce']
  71. else:
  72. coerce_to = text_type
  73. setattr(
  74. SettingsForm, setting.key,
  75. SelectMultipleField(
  76. setting.name,
  77. choices=setting.extra['choices'](),
  78. coerce=coerce_to,
  79. description=setting.description
  80. )
  81. )
  82. # SelectField
  83. elif setting.value_type == SettingsValueTypes.select:
  84. # if no coerce is found, it will fallback to unicode
  85. if "coerce" in setting.extra:
  86. coerce_to = setting.extra['coerce']
  87. else:
  88. coerce_to = text_type
  89. setattr(
  90. SettingsForm, setting.key,
  91. SelectField(
  92. setting.name,
  93. coerce=coerce_to,
  94. choices=setting.extra['choices'](),
  95. description=setting.description)
  96. )
  97. # BooleanField
  98. elif setting.value_type == SettingsValueTypes.boolean:
  99. setattr(
  100. SettingsForm, setting.key,
  101. BooleanField(setting.name, description=setting.description)
  102. )
  103. return SettingsForm