prompt: We are currently solving the following issue within our repository. Here is the issue text:
  --- BEGIN ISSUE ---
  Banner edit fields should be larger
  ### NetBox version
  
  v3.1.6
  
  ### Feature type
  
  Change to existing functionality
  
  ### Proposed functionality
  
  Currently the Login, Top and Bottom banner edit fields in Config revisions are small input fields: they only show a few words at the time. It makes editing the banners somewhat hard.
  
  I propose that the input fields are shown larger, preferably as multi-line input fields, to make it easier to edit the HTML-containing banners.
  
  ### Use case
  
  Communicating upcoming maintenances or specific login instructions is easier when the banner input fields are easier to edit.
  
  ### Database changes
  
  None
  
  ### External dependencies
  
  None
  
  --- END ISSUE ---
  
  Below are some code segments, each from a relevant file. One or more of these files may contain bugs.
  --- BEGIN FILES ---
  Path: `netbox/netbox/config/parameters.py`
  Content:
  ```
  1 from django import forms
  2 from django.contrib.postgres.forms import SimpleArrayField
  3 
  4 
  5 class ConfigParam:
  6 
  7     def __init__(self, name, label, default, description='', field=None, field_kwargs=None):
  8         self.name = name
  9         self.label = label
  10         self.default = default
  11         self.field = field or forms.CharField
  12         self.description = description
  13         self.field_kwargs = field_kwargs or {}
  14 
  15 
  16 PARAMS = (
  17 
  18     # Banners
  19     ConfigParam(
  20         name='BANNER_LOGIN',
  21         label='Login banner',
  22         default='',
  23         description="Additional content to display on the login page"
  24     ),
  25     ConfigParam(
  26         name='BANNER_TOP',
  27         label='Top banner',
  28         default='',
  29         description="Additional content to display at the top of every page"
  30     ),
  31     ConfigParam(
  32         name='BANNER_BOTTOM',
  33         label='Bottom banner',
  34         default='',
  35         description="Additional content to display at the bottom of every page"
  36     ),
  37 
  38     # IPAM
  39     ConfigParam(
  40         name='ENFORCE_GLOBAL_UNIQUE',
  41         label='Globally unique IP space',
  42         default=False,
  43         description="Enforce unique IP addressing within the global table",
  44         field=forms.BooleanField
  45     ),
  46     ConfigParam(
  47         name='PREFER_IPV4',
  48         label='Prefer IPv4',
  49         default=False,
  50         description="Prefer IPv4 addresses over IPv6",
  51         field=forms.BooleanField
  52     ),
  53 
  54     # Racks
  55     ConfigParam(
  56         name='RACK_ELEVATION_DEFAULT_UNIT_HEIGHT',
  57         label='Rack unit height',
  58         default=22,
  59         description="Default unit height for rendered rack elevations",
  60         field=forms.IntegerField
  61     ),
  62     ConfigParam(
  63         name='RACK_ELEVATION_DEFAULT_UNIT_WIDTH',
  64         label='Rack unit width',
  65         default=220,
  66         description="Default unit width for rendered rack elevations",
  67         field=forms.IntegerField
  68     ),
  69 
  70     # Security
  71     ConfigParam(
  72         name='ALLOWED_URL_SCHEMES',
  73         label='Allowed URL schemes',
  74         default=(
  75             'file', 'ftp', 'ftps', 'http', 'https', 'irc', 'mailto', 'sftp', 'ssh', 'tel', 'telnet', 'tftp', 'vnc',
  76             'xmpp',
  77         ),
  78         description="Permitted schemes for URLs in user-provided content",
  79         field=SimpleArrayField,
  80         field_kwargs={'base_field': forms.CharField()}
  81     ),
  82 
  83     # Pagination
  84     ConfigParam(
  85         name='PAGINATE_COUNT',
  86         label='Default page size',
  87         default=50,
  88         field=forms.IntegerField
  89     ),
  90     ConfigParam(
  91         name='MAX_PAGE_SIZE',
  92         label='Maximum page size',
  93         default=1000,
  94         field=forms.IntegerField
  95     ),
  96 
  97     # Validation
  98     ConfigParam(
  99         name='CUSTOM_VALIDATORS',
  100         label='Custom validators',
  101         default={},
  102         description="Custom validation rules (JSON)",
  103         field=forms.JSONField
  104     ),
  105 
  106     # NAPALM
  107     ConfigParam(
  108         name='NAPALM_USERNAME',
  109         label='NAPALM username',
  110         default='',
  111         description="Username to use when connecting to devices via NAPALM"
  112     ),
  113     ConfigParam(
  114         name='NAPALM_PASSWORD',
  115         label='NAPALM password',
  116         default='',
  117         description="Password to use when connecting to devices via NAPALM"
  118     ),
  119     ConfigParam(
  120         name='NAPALM_TIMEOUT',
  121         label='NAPALM timeout',
  122         default=30,
  123         description="NAPALM connection timeout (in seconds)",
  124         field=forms.IntegerField
  125     ),
  126     ConfigParam(
  127         name='NAPALM_ARGS',
  128         label='NAPALM arguments',
  129         default={},
  130         description="Additional arguments to pass when invoking a NAPALM driver (as JSON data)",
  131         field=forms.JSONField
  132     ),
  133 
  134     # Miscellaneous
  135     ConfigParam(
  136         name='MAINTENANCE_MODE',
  137         label='Maintenance mode',
  138         default=False,
  139         description="Enable maintenance mode",
  140         field=forms.BooleanField
  141     ),
  142     ConfigParam(
  143         name='GRAPHQL_ENABLED',
  144         label='GraphQL enabled',
  145         default=True,
  146         description="Enable the GraphQL API",
  147         field=forms.BooleanField
  148     ),
  149     ConfigParam(
  150         name='CHANGELOG_RETENTION',
  151         label='Changelog retention',
  152         default=90,
  153         description="Days to retain changelog history (set to zero for unlimited)",
  154         field=forms.IntegerField
  155     ),
  156     ConfigParam(
  157         name='MAPS_URL',
  158         label='Maps URL',
  159         default='https://maps.google.com/?q=',
  160         description="Base URL for mapping geographic locations"
  161     ),
  162 
  163 )
  164
  ```
  --- END FILES ---
  
  Please first localize the bug based on the issue statement, and then generate a patch according to the `git diff` format fenced by three backticks.
  
  Here is an example:
  
  ```diff
  diff --git a/examples/server_async.py b/examples/server_async.py
  --- a/examples/server_async.py
  +++ b/examples/server_async.py
  @@ -313,4 +313,4 @@
   
   
   if __name__ == "__main__":
  -    asyncio.run(run_async_server("."), debug=True)
  +    asyncio.run(run_async_server(), debug=True)
  diff --git a/examples/server_sync.py b/examples/server_sync.py
  --- a/examples/server_sync.py
  +++ b/examples/server_sync.py
  @@ -313,5 +313,5 @@
   
   
   if __name__ == "__main__":
  -    server = run_sync_server(".")
  +    server = run_sync_server()
       server.shutdown()
  
  ```
  
golden_diff: diff --git a/netbox/netbox/config/parameters.py b/netbox/netbox/config/parameters.py
  --- a/netbox/netbox/config/parameters.py
  +++ b/netbox/netbox/config/parameters.py
  @@ -20,19 +20,28 @@
           name='BANNER_LOGIN',
           label='Login banner',
           default='',
  -        description="Additional content to display on the login page"
  +        description="Additional content to display on the login page",
  +        field_kwargs={
  +            'widget': forms.Textarea(),
  +        },
       ),
       ConfigParam(
           name='BANNER_TOP',
           label='Top banner',
           default='',
  -        description="Additional content to display at the top of every page"
  +        description="Additional content to display at the top of every page",
  +        field_kwargs={
  +            'widget': forms.Textarea(),
  +        },
       ),
       ConfigParam(
           name='BANNER_BOTTOM',
           label='Bottom banner',
           default='',
  -        description="Additional content to display at the bottom of every page"
  +        description="Additional content to display at the bottom of every page",
  +        field_kwargs={
  +            'widget': forms.Textarea(),
  +        },
       ),
   
       # IPAM
  
verification_info: {"golden_diff": "diff --git a/netbox/netbox/config/parameters.py b/netbox/netbox/config/parameters.py\n--- a/netbox/netbox/config/parameters.py\n+++ b/netbox/netbox/config/parameters.py\n@@ -20,19 +20,28 @@\n         name='BANNER_LOGIN',\n         label='Login banner',\n         default='',\n-        description=\"Additional content to display on the login page\"\n+        description=\"Additional content to display on the login page\",\n+        field_kwargs={\n+            'widget': forms.Textarea(),\n+        },\n     ),\n     ConfigParam(\n         name='BANNER_TOP',\n         label='Top banner',\n         default='',\n-        description=\"Additional content to display at the top of every page\"\n+        description=\"Additional content to display at the top of every page\",\n+        field_kwargs={\n+            'widget': forms.Textarea(),\n+        },\n     ),\n     ConfigParam(\n         name='BANNER_BOTTOM',\n         label='Bottom banner',\n         default='',\n-        description=\"Additional content to display at the bottom of every page\"\n+        description=\"Additional content to display at the bottom of every page\",\n+        field_kwargs={\n+            'widget': forms.Textarea(),\n+        },\n     ),\n \n     # IPAM\n", "issue": "Banner edit fields should be larger\n### NetBox version\n\nv3.1.6\n\n### Feature type\n\nChange to existing functionality\n\n### Proposed functionality\n\nCurrently the Login, Top and Bottom banner edit fields in Config revisions are small input fields: they only show a few words at the time. It makes editing the banners somewhat hard.\r\n\r\nI propose that the input fields are shown larger, preferably as multi-line input fields, to make it easier to edit the HTML-containing banners.\n\n### Use case\n\nCommunicating upcoming maintenances or specific login instructions is easier when the banner input fields are easier to edit.\n\n### Database changes\n\nNone\n\n### External dependencies\n\nNone\n", "before_files": [{"content": "from django import forms\nfrom django.contrib.postgres.forms import SimpleArrayField\n\n\nclass ConfigParam:\n\n    def __init__(self, name, label, default, description='', field=None, field_kwargs=None):\n        self.name = name\n        self.label = label\n        self.default = default\n        self.field = field or forms.CharField\n        self.description = description\n        self.field_kwargs = field_kwargs or {}\n\n\nPARAMS = (\n\n    # Banners\n    ConfigParam(\n        name='BANNER_LOGIN',\n        label='Login banner',\n        default='',\n        description=\"Additional content to display on the login page\"\n    ),\n    ConfigParam(\n        name='BANNER_TOP',\n        label='Top banner',\n        default='',\n        description=\"Additional content to display at the top of every page\"\n    ),\n    ConfigParam(\n        name='BANNER_BOTTOM',\n        label='Bottom banner',\n        default='',\n        description=\"Additional content to display at the bottom of every page\"\n    ),\n\n    # IPAM\n    ConfigParam(\n        name='ENFORCE_GLOBAL_UNIQUE',\n        label='Globally unique IP space',\n        default=False,\n        description=\"Enforce unique IP addressing within the global table\",\n        field=forms.BooleanField\n    ),\n    ConfigParam(\n        name='PREFER_IPV4',\n        label='Prefer IPv4',\n        default=False,\n        description=\"Prefer IPv4 addresses over IPv6\",\n        field=forms.BooleanField\n    ),\n\n    # Racks\n    ConfigParam(\n        name='RACK_ELEVATION_DEFAULT_UNIT_HEIGHT',\n        label='Rack unit height',\n        default=22,\n        description=\"Default unit height for rendered rack elevations\",\n        field=forms.IntegerField\n    ),\n    ConfigParam(\n        name='RACK_ELEVATION_DEFAULT_UNIT_WIDTH',\n        label='Rack unit width',\n        default=220,\n        description=\"Default unit width for rendered rack elevations\",\n        field=forms.IntegerField\n    ),\n\n    # Security\n    ConfigParam(\n        name='ALLOWED_URL_SCHEMES',\n        label='Allowed URL schemes',\n        default=(\n            'file', 'ftp', 'ftps', 'http', 'https', 'irc', 'mailto', 'sftp', 'ssh', 'tel', 'telnet', 'tftp', 'vnc',\n            'xmpp',\n        ),\n        description=\"Permitted schemes for URLs in user-provided content\",\n        field=SimpleArrayField,\n        field_kwargs={'base_field': forms.CharField()}\n    ),\n\n    # Pagination\n    ConfigParam(\n        name='PAGINATE_COUNT',\n        label='Default page size',\n        default=50,\n        field=forms.IntegerField\n    ),\n    ConfigParam(\n        name='MAX_PAGE_SIZE',\n        label='Maximum page size',\n        default=1000,\n        field=forms.IntegerField\n    ),\n\n    # Validation\n    ConfigParam(\n        name='CUSTOM_VALIDATORS',\n        label='Custom validators',\n        default={},\n        description=\"Custom validation rules (JSON)\",\n        field=forms.JSONField\n    ),\n\n    # NAPALM\n    ConfigParam(\n        name='NAPALM_USERNAME',\n        label='NAPALM username',\n        default='',\n        description=\"Username to use when connecting to devices via NAPALM\"\n    ),\n    ConfigParam(\n        name='NAPALM_PASSWORD',\n        label='NAPALM password',\n        default='',\n        description=\"Password to use when connecting to devices via NAPALM\"\n    ),\n    ConfigParam(\n        name='NAPALM_TIMEOUT',\n        label='NAPALM timeout',\n        default=30,\n        description=\"NAPALM connection timeout (in seconds)\",\n        field=forms.IntegerField\n    ),\n    ConfigParam(\n        name='NAPALM_ARGS',\n        label='NAPALM arguments',\n        default={},\n        description=\"Additional arguments to pass when invoking a NAPALM driver (as JSON data)\",\n        field=forms.JSONField\n    ),\n\n    # Miscellaneous\n    ConfigParam(\n        name='MAINTENANCE_MODE',\n        label='Maintenance mode',\n        default=False,\n        description=\"Enable maintenance mode\",\n        field=forms.BooleanField\n    ),\n    ConfigParam(\n        name='GRAPHQL_ENABLED',\n        label='GraphQL enabled',\n        default=True,\n        description=\"Enable the GraphQL API\",\n        field=forms.BooleanField\n    ),\n    ConfigParam(\n        name='CHANGELOG_RETENTION',\n        label='Changelog retention',\n        default=90,\n        description=\"Days to retain changelog history (set to zero for unlimited)\",\n        field=forms.IntegerField\n    ),\n    ConfigParam(\n        name='MAPS_URL',\n        label='Maps URL',\n        default='https://maps.google.com/?q=',\n        description=\"Base URL for mapping geographic locations\"\n    ),\n\n)\n", "path": "netbox/netbox/config/parameters.py"}], "after_files": [{"content": "from django import forms\nfrom django.contrib.postgres.forms import SimpleArrayField\n\n\nclass ConfigParam:\n\n    def __init__(self, name, label, default, description='', field=None, field_kwargs=None):\n        self.name = name\n        self.label = label\n        self.default = default\n        self.field = field or forms.CharField\n        self.description = description\n        self.field_kwargs = field_kwargs or {}\n\n\nPARAMS = (\n\n    # Banners\n    ConfigParam(\n        name='BANNER_LOGIN',\n        label='Login banner',\n        default='',\n        description=\"Additional content to display on the login page\",\n        field_kwargs={\n            'widget': forms.Textarea(),\n        },\n    ),\n    ConfigParam(\n        name='BANNER_TOP',\n        label='Top banner',\n        default='',\n        description=\"Additional content to display at the top of every page\",\n        field_kwargs={\n            'widget': forms.Textarea(),\n        },\n    ),\n    ConfigParam(\n        name='BANNER_BOTTOM',\n        label='Bottom banner',\n        default='',\n        description=\"Additional content to display at the bottom of every page\",\n        field_kwargs={\n            'widget': forms.Textarea(),\n        },\n    ),\n\n    # IPAM\n    ConfigParam(\n        name='ENFORCE_GLOBAL_UNIQUE',\n        label='Globally unique IP space',\n        default=False,\n        description=\"Enforce unique IP addressing within the global table\",\n        field=forms.BooleanField\n    ),\n    ConfigParam(\n        name='PREFER_IPV4',\n        label='Prefer IPv4',\n        default=False,\n        description=\"Prefer IPv4 addresses over IPv6\",\n        field=forms.BooleanField\n    ),\n\n    # Racks\n    ConfigParam(\n        name='RACK_ELEVATION_DEFAULT_UNIT_HEIGHT',\n        label='Rack unit height',\n        default=22,\n        description=\"Default unit height for rendered rack elevations\",\n        field=forms.IntegerField\n    ),\n    ConfigParam(\n        name='RACK_ELEVATION_DEFAULT_UNIT_WIDTH',\n        label='Rack unit width',\n        default=220,\n        description=\"Default unit width for rendered rack elevations\",\n        field=forms.IntegerField\n    ),\n\n    # Security\n    ConfigParam(\n        name='ALLOWED_URL_SCHEMES',\n        label='Allowed URL schemes',\n        default=(\n            'file', 'ftp', 'ftps', 'http', 'https', 'irc', 'mailto', 'sftp', 'ssh', 'tel', 'telnet', 'tftp', 'vnc',\n            'xmpp',\n        ),\n        description=\"Permitted schemes for URLs in user-provided content\",\n        field=SimpleArrayField,\n        field_kwargs={'base_field': forms.CharField()}\n    ),\n\n    # Pagination\n    ConfigParam(\n        name='PAGINATE_COUNT',\n        label='Default page size',\n        default=50,\n        field=forms.IntegerField\n    ),\n    ConfigParam(\n        name='MAX_PAGE_SIZE',\n        label='Maximum page size',\n        default=1000,\n        field=forms.IntegerField\n    ),\n\n    # Validation\n    ConfigParam(\n        name='CUSTOM_VALIDATORS',\n        label='Custom validators',\n        default={},\n        description=\"Custom validation rules (JSON)\",\n        field=forms.JSONField\n    ),\n\n    # NAPALM\n    ConfigParam(\n        name='NAPALM_USERNAME',\n        label='NAPALM username',\n        default='',\n        description=\"Username to use when connecting to devices via NAPALM\"\n    ),\n    ConfigParam(\n        name='NAPALM_PASSWORD',\n        label='NAPALM password',\n        default='',\n        description=\"Password to use when connecting to devices via NAPALM\"\n    ),\n    ConfigParam(\n        name='NAPALM_TIMEOUT',\n        label='NAPALM timeout',\n        default=30,\n        description=\"NAPALM connection timeout (in seconds)\",\n        field=forms.IntegerField\n    ),\n    ConfigParam(\n        name='NAPALM_ARGS',\n        label='NAPALM arguments',\n        default={},\n        description=\"Additional arguments to pass when invoking a NAPALM driver (as JSON data)\",\n        field=forms.JSONField\n    ),\n\n    # Miscellaneous\n    ConfigParam(\n        name='MAINTENANCE_MODE',\n        label='Maintenance mode',\n        default=False,\n        description=\"Enable maintenance mode\",\n        field=forms.BooleanField\n    ),\n    ConfigParam(\n        name='GRAPHQL_ENABLED',\n        label='GraphQL enabled',\n        default=True,\n        description=\"Enable the GraphQL API\",\n        field=forms.BooleanField\n    ),\n    ConfigParam(\n        name='CHANGELOG_RETENTION',\n        label='Changelog retention',\n        default=90,\n        description=\"Days to retain changelog history (set to zero for unlimited)\",\n        field=forms.IntegerField\n    ),\n    ConfigParam(\n        name='MAPS_URL',\n        label='Maps URL',\n        default='https://maps.google.com/?q=',\n        description=\"Base URL for mapping geographic locations\"\n    ),\n\n)\n", "path": "netbox/netbox/config/parameters.py"}]}