50 lines
1.3 KiB
Python
50 lines
1.3 KiB
Python
from django import forms
|
|
|
|
from dynamic_preferences import types
|
|
|
|
|
|
SettingSection = types.Section
|
|
|
|
|
|
StringSetting = types.StringPreference
|
|
|
|
|
|
class PasswordSetting(types.StringPreference):
|
|
widget = forms.PasswordInput
|
|
|
|
|
|
class BooleanSetting(types.BooleanPreference):
|
|
# Boolean are supported in JSON, so no need to serialized to a string
|
|
serializer = None
|
|
|
|
|
|
class IntSetting(types.IntegerPreference):
|
|
# Integers are supported in JSON, so no need to serialized to a string
|
|
serializer = None
|
|
|
|
|
|
def validate_config(payload, settings):
|
|
"""
|
|
Dynamic preferences stores settings in a separate database table. However
|
|
it is a bit too much for our use cases, and we simply want to store
|
|
these in a JSONField on the corresponding model row.
|
|
|
|
This validates the payload using the dynamic preferences serializers
|
|
and return a config that is ready to be persisted as JSON
|
|
"""
|
|
final = {}
|
|
|
|
for klass in settings:
|
|
setting = klass()
|
|
setting_id = setting.identifier()
|
|
try:
|
|
value = payload[setting_id]
|
|
except KeyError:
|
|
continue
|
|
|
|
setting.validate(value)
|
|
if setting.serializer:
|
|
value = setting.serializer.serialize(value)
|
|
final[setting_id] = value
|
|
return final
|