forms.py 2.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293
  1. from django import forms
  2. from django.contrib.auth.forms import AuthenticationForm, PasswordChangeForm as DjangoPasswordChangeForm
  3. from django.utils.html import mark_safe
  4. from netbox.preferences import PREFERENCES
  5. from utilities.forms import BootstrapMixin, DateTimePicker, StaticSelect
  6. from utilities.utils import flatten_dict
  7. from .models import Token, UserConfig
  8. class LoginForm(BootstrapMixin, AuthenticationForm):
  9. pass
  10. class PasswordChangeForm(BootstrapMixin, DjangoPasswordChangeForm):
  11. pass
  12. class UserConfigFormMetaclass(forms.models.ModelFormMetaclass):
  13. def __new__(mcs, name, bases, attrs):
  14. # Emulate a declared field for each supported user preference
  15. preference_fields = {}
  16. for field_name, preference in PREFERENCES.items():
  17. description = f'{preference.description}<br />' if preference.description else ''
  18. help_text = f'{description}<code>{field_name}</code>'
  19. field_kwargs = {
  20. 'label': preference.label,
  21. 'choices': preference.choices,
  22. 'help_text': mark_safe(help_text),
  23. 'coerce': preference.coerce,
  24. 'required': False,
  25. 'widget': StaticSelect,
  26. }
  27. preference_fields[field_name] = forms.TypedChoiceField(**field_kwargs)
  28. attrs.update(preference_fields)
  29. return super().__new__(mcs, name, bases, attrs)
  30. class UserConfigForm(BootstrapMixin, forms.ModelForm, metaclass=UserConfigFormMetaclass):
  31. class Meta:
  32. model = UserConfig
  33. fields = ()
  34. fieldsets = (
  35. ('User Interface', (
  36. 'pagination.per_page',
  37. 'ui.colormode',
  38. )),
  39. ('Miscellaneous', (
  40. 'data_format',
  41. )),
  42. )
  43. def __init__(self, *args, instance=None, **kwargs):
  44. # Get initial data from UserConfig instance
  45. initial_data = flatten_dict(instance.data)
  46. kwargs['initial'] = initial_data
  47. super().__init__(*args, instance=instance, **kwargs)
  48. def save(self, *args, **kwargs):
  49. # Set UserConfig data
  50. for pref_name, value in self.cleaned_data.items():
  51. self.instance.set(pref_name, value, commit=False)
  52. return super().save(*args, **kwargs)
  53. @property
  54. def plugin_fields(self):
  55. return [
  56. name for name in self.fields.keys() if name.startswith('plugins.')
  57. ]
  58. class TokenForm(BootstrapMixin, forms.ModelForm):
  59. key = forms.CharField(
  60. required=False,
  61. help_text="If no key is provided, one will be generated automatically."
  62. )
  63. class Meta:
  64. model = Token
  65. fields = [
  66. 'key', 'write_enabled', 'expires', 'description',
  67. ]
  68. widgets = {
  69. 'expires': DateTimePicker(),
  70. }