2017-03-08 11:34:47 -05:00
from django import forms
2017-11-07 11:08:23 -05:00
from django . contrib . auth . forms import AuthenticationForm , PasswordChangeForm as DjangoPasswordChangeForm
2022-04-19 14:44:35 +02:00
from django . contrib . postgres . forms import SimpleArrayField
2021-12-21 20:30:59 -05:00
from django . utils . html import mark_safe
2016-03-01 11:23:03 -05:00
2022-04-19 14:44:35 +02:00
from ipam . formfields import IPNetworkFormField
2021-12-22 09:10:50 -05:00
from netbox . preferences import PREFERENCES
2021-12-21 19:59:33 -05:00
from utilities . forms import BootstrapMixin , DateTimePicker , StaticSelect
2021-12-21 16:29:01 -05:00
from utilities . utils import flatten_dict
from . models import Token , UserConfig
2016-03-01 11:23:03 -05:00
2016-12-21 14:15:18 -05:00
class LoginForm ( BootstrapMixin , AuthenticationForm ) :
2021-05-17 16:27:27 -04:00
pass
2016-03-01 11:23:03 -05:00
2016-12-21 14:15:18 -05:00
class PasswordChangeForm ( BootstrapMixin , DjangoPasswordChangeForm ) :
2016-03-01 11:23:03 -05:00
pass
2017-03-08 11:34:47 -05:00
2021-12-21 17:05:06 -05:00
class UserConfigFormMetaclass ( forms . models . ModelFormMetaclass ) :
2021-12-21 16:29:01 -05:00
2021-12-21 17:05:06 -05:00
def __new__ ( mcs , name , bases , attrs ) :
2021-12-21 16:29:01 -05:00
2021-12-21 17:05:06 -05:00
# Emulate a declared field for each supported user preference
preference_fields = { }
for field_name , preference in PREFERENCES . items ( ) :
2021-12-21 20:30:59 -05:00
description = f ' { preference . description } <br /> ' if preference . description else ' '
help_text = f ' { description } <code> { field_name } </code> '
2021-12-21 17:05:06 -05:00
field_kwargs = {
' label ' : preference . label ,
' choices ' : preference . choices ,
2021-12-21 20:30:59 -05:00
' help_text ' : mark_safe ( help_text ) ,
2021-12-21 17:05:06 -05:00
' coerce ' : preference . coerce ,
' required ' : False ,
2021-12-21 19:59:33 -05:00
' widget ' : StaticSelect ,
2021-12-21 17:05:06 -05:00
}
preference_fields [ field_name ] = forms . TypedChoiceField ( * * field_kwargs )
attrs . update ( preference_fields )
return super ( ) . __new__ ( mcs , name , bases , attrs )
class UserConfigForm ( BootstrapMixin , forms . ModelForm , metaclass = UserConfigFormMetaclass ) :
2022-01-31 15:52:36 -05:00
fieldsets = (
( ' User Interface ' , (
' pagination.per_page ' ,
' pagination.placement ' ,
' ui.colormode ' ,
) ) ,
( ' Miscellaneous ' , (
' data_format ' ,
) ) ,
)
2022-03-03 10:03:43 -05:00
# List of clearable preferences
pk = forms . MultipleChoiceField (
choices = [ ] ,
required = False
)
2021-12-21 16:29:01 -05:00
class Meta :
model = UserConfig
fields = ( )
def __init__ ( self , * args , instance = None , * * kwargs ) :
# Get initial data from UserConfig instance
2021-12-21 17:05:06 -05:00
initial_data = flatten_dict ( instance . data )
2021-12-21 16:29:01 -05:00
kwargs [ ' initial ' ] = initial_data
super ( ) . __init__ ( * args , instance = instance , * * kwargs )
2022-03-03 10:03:43 -05:00
# Compile clearable preference choices
self . fields [ ' pk ' ] . choices = (
( f ' tables. { table_name } ' , ' ' ) for table_name in instance . data . get ( ' tables ' , [ ] )
)
2021-12-21 16:29:01 -05:00
def save ( self , * args , * * kwargs ) :
# Set UserConfig data
2021-12-21 17:05:06 -05:00
for pref_name , value in self . cleaned_data . items ( ) :
2022-03-03 10:03:43 -05:00
if pref_name == ' pk ' :
continue
2021-12-21 16:29:01 -05:00
self . instance . set ( pref_name , value , commit = False )
2022-03-03 10:03:43 -05:00
# Clear selected preferences
for preference in self . cleaned_data [ ' pk ' ] :
self . instance . clear ( preference )
2021-12-21 16:29:01 -05:00
return super ( ) . save ( * args , * * kwargs )
2021-12-22 09:35:29 -05:00
@property
def plugin_fields ( self ) :
return [
name for name in self . fields . keys ( ) if name . startswith ( ' plugins. ' )
]
2021-12-21 16:29:01 -05:00
2017-03-08 11:34:47 -05:00
class TokenForm ( BootstrapMixin , forms . ModelForm ) :
2018-11-27 11:57:29 -05:00
key = forms . CharField (
required = False ,
help_text = " If no key is provided, one will be generated automatically. "
)
2017-03-08 11:34:47 -05:00
2022-04-19 14:44:35 +02:00
allowed_ips = SimpleArrayField (
base_field = IPNetworkFormField ( ) ,
required = False ,
help_text = ' Allowed IPv4/IPv6 networks from where the token can be used. Leave blank for no restrictions. Ex: " 10.1.1.0/24, 192.168.10.16/32, 2001:DB8:1::/64 " ' ,
)
2017-03-08 11:34:47 -05:00
class Meta :
model = Token
2018-11-27 11:57:29 -05:00
fields = [
2022-04-19 14:44:35 +02:00
' key ' , ' write_enabled ' , ' expires ' , ' description ' , ' allowed_ips ' ,
2018-11-27 11:57:29 -05:00
]
2019-12-28 22:55:00 +00:00
widgets = {
' expires ' : DateTimePicker ( ) ,
2017-03-08 11:34:47 -05:00
}