prompt: You will be provided with a partial code base and an issue statement explaining a problem to resolve.
  <issue>
  Tunnel Group is not selectable as column in VPN tunnels list
  ### Deployment Type
  
  Self-hosted
  
  ### NetBox Version
  
  v3.7.2
  
  ### Python Version
  
  3.11
  
  ### Steps to Reproduce
  
  1. Go to VPN - Tunnels
  2. Click Configure Table
  
  
  ### Expected Behavior
  
  There is the Tunnel Group column
  
  ### Observed Behavior
  
  There is no Tunnel Group column that could be shown
  
  </issue>
  <code>
  [start of netbox/vpn/tables/tunnels.py]
  1 import django_tables2 as tables
  2 from django.utils.translation import gettext_lazy as _
  3 from django_tables2.utils import Accessor
  4 
  5 from netbox.tables import NetBoxTable, columns
  6 from tenancy.tables import TenancyColumnsMixin
  7 from vpn.models import *
  8 
  9 __all__ = (
  10     'TunnelTable',
  11     'TunnelGroupTable',
  12     'TunnelTerminationTable',
  13 )
  14 
  15 
  16 class TunnelGroupTable(NetBoxTable):
  17     name = tables.Column(
  18         verbose_name=_('Name'),
  19         linkify=True
  20     )
  21     tunnel_count = columns.LinkedCountColumn(
  22         viewname='vpn:tunnel_list',
  23         url_params={'group_id': 'pk'},
  24         verbose_name=_('Tunnels')
  25     )
  26     tags = columns.TagColumn(
  27         url_name='vpn:tunnelgroup_list'
  28     )
  29 
  30     class Meta(NetBoxTable.Meta):
  31         model = TunnelGroup
  32         fields = (
  33             'pk', 'id', 'name', 'tunnel_count', 'description', 'slug', 'tags', 'actions', 'created', 'last_updated',
  34         )
  35         default_columns = ('pk', 'name', 'tunnel_count', 'description')
  36 
  37 
  38 class TunnelTable(TenancyColumnsMixin, NetBoxTable):
  39     name = tables.Column(
  40         verbose_name=_('Name'),
  41         linkify=True
  42     )
  43     status = columns.ChoiceFieldColumn(
  44         verbose_name=_('Status')
  45     )
  46     ipsec_profile = tables.Column(
  47         verbose_name=_('IPSec profile'),
  48         linkify=True
  49     )
  50     terminations_count = columns.LinkedCountColumn(
  51         accessor=Accessor('count_terminations'),
  52         viewname='vpn:tunneltermination_list',
  53         url_params={'tunnel_id': 'pk'},
  54         verbose_name=_('Terminations')
  55     )
  56     comments = columns.MarkdownColumn(
  57         verbose_name=_('Comments'),
  58     )
  59     tags = columns.TagColumn(
  60         url_name='vpn:tunnel_list'
  61     )
  62 
  63     class Meta(NetBoxTable.Meta):
  64         model = Tunnel
  65         fields = (
  66             'pk', 'id', 'name', 'status', 'encapsulation', 'ipsec_profile', 'tenant', 'tenant_group', 'tunnel_id',
  67             'termination_count', 'description', 'comments', 'tags', 'created', 'last_updated',
  68         )
  69         default_columns = ('pk', 'name', 'status', 'encapsulation', 'tenant', 'terminations_count')
  70 
  71 
  72 class TunnelTerminationTable(TenancyColumnsMixin, NetBoxTable):
  73     tunnel = tables.Column(
  74         verbose_name=_('Tunnel'),
  75         linkify=True
  76     )
  77     role = columns.ChoiceFieldColumn(
  78         verbose_name=_('Role')
  79     )
  80     termination_parent = tables.Column(
  81         accessor='termination__parent_object',
  82         linkify=True,
  83         orderable=False,
  84         verbose_name=_('Host')
  85     )
  86     termination = tables.Column(
  87         verbose_name=_('Interface'),
  88         linkify=True
  89     )
  90     ip_addresses = tables.ManyToManyColumn(
  91         accessor=tables.A('termination__ip_addresses'),
  92         orderable=False,
  93         linkify_item=True,
  94         verbose_name=_('IP Addresses')
  95     )
  96     outside_ip = tables.Column(
  97         verbose_name=_('Outside IP'),
  98         linkify=True
  99     )
  100     tags = columns.TagColumn(
  101         url_name='vpn:tunneltermination_list'
  102     )
  103 
  104     class Meta(NetBoxTable.Meta):
  105         model = TunnelTermination
  106         fields = (
  107             'pk', 'id', 'tunnel', 'role', 'termination_parent', 'termination', 'ip_addresses', 'outside_ip', 'tags',
  108             'created', 'last_updated',
  109         )
  110         default_columns = (
  111             'pk', 'id', 'tunnel', 'role', 'termination_parent', 'termination', 'ip_addresses', 'outside_ip',
  112         )
  113
  [end of netbox/vpn/tables/tunnels.py]
  </code>
  
  I need you to solve this issue by generating a single patch file that I can apply directly to this repository using git apply. Please respond with a single patch file in the following format.
  <patch>
  diff --git a/file.py b/file.py
  --- a/file.py
  +++ b/file.py
  @@ -1,27 +1,35 @@
   def euclidean(a, b):
  -    while b:
  -        a, b = b, a % b
  -    return a
  +    if b == 0:
  +        return a
  +    return euclidean(b, a % b)
   
   
   def bresenham(x0, y0, x1, y1):
       points = []
       dx = abs(x1 - x0)
       dy = abs(y1 - y0)
  -    sx = 1 if x0 < x1 else -1
  -    sy = 1 if y0 < y1 else -1
  -    err = dx - dy
  +    x, y = x0, y0
  +    sx = -1 if x0 > x1 else 1
  +    sy = -1 if y0 > y1 else 1
   
  -    while True:
  -        points.append((x0, y0))
  -        if x0 == x1 and y0 == y1:
  -            break
  -        e2 = 2 * err
  -        if e2 > -dy:
  -            err -= dy
  -            x0 += sx
  -        if e2 < dx:
  -            err += dx
  -            y0 += sy
  +    if dx > dy:
  +        err = dx / 2.0
  +        while x != x1:
  +            points.append((x, y))
  +            err -= dy
  +            if err < 0:
  +                y += sy
  +                err += dx
  +            x += sx
  +    else:
  +        err = dy / 2.0
  +        while y != y1:
  +            points.append((x, y))
  +            err -= dx
  +            if err < 0:
  +                x += sx
  +                err += dy
  +            y += sy
  +
  +    points.append((x, y))
       return points
  
  </patch>
golden_diff: diff --git a/netbox/vpn/tables/tunnels.py b/netbox/vpn/tables/tunnels.py
  --- a/netbox/vpn/tables/tunnels.py
  +++ b/netbox/vpn/tables/tunnels.py
  @@ -40,6 +40,10 @@
           verbose_name=_('Name'),
           linkify=True
       )
  +    group = tables.Column(
  +        verbose_name=_('Group'),
  +        linkify=True
  +    )
       status = columns.ChoiceFieldColumn(
           verbose_name=_('Status')
       )
  @@ -63,10 +67,10 @@
       class Meta(NetBoxTable.Meta):
           model = Tunnel
           fields = (
  -            'pk', 'id', 'name', 'status', 'encapsulation', 'ipsec_profile', 'tenant', 'tenant_group', 'tunnel_id',
  -            'termination_count', 'description', 'comments', 'tags', 'created', 'last_updated',
  +            'pk', 'id', 'name', 'group', 'status', 'encapsulation', 'ipsec_profile', 'tenant', 'tenant_group',
  +            'tunnel_id', 'termination_count', 'description', 'comments', 'tags', 'created', 'last_updated',
           )
  -        default_columns = ('pk', 'name', 'status', 'encapsulation', 'tenant', 'terminations_count')
  +        default_columns = ('pk', 'name', 'group', 'status', 'encapsulation', 'tenant', 'terminations_count')
   
   
   class TunnelTerminationTable(TenancyColumnsMixin, NetBoxTable):
  
verification_info: {"golden_diff": "diff --git a/netbox/vpn/tables/tunnels.py b/netbox/vpn/tables/tunnels.py\n--- a/netbox/vpn/tables/tunnels.py\n+++ b/netbox/vpn/tables/tunnels.py\n@@ -40,6 +40,10 @@\n         verbose_name=_('Name'),\n         linkify=True\n     )\n+    group = tables.Column(\n+        verbose_name=_('Group'),\n+        linkify=True\n+    )\n     status = columns.ChoiceFieldColumn(\n         verbose_name=_('Status')\n     )\n@@ -63,10 +67,10 @@\n     class Meta(NetBoxTable.Meta):\n         model = Tunnel\n         fields = (\n-            'pk', 'id', 'name', 'status', 'encapsulation', 'ipsec_profile', 'tenant', 'tenant_group', 'tunnel_id',\n-            'termination_count', 'description', 'comments', 'tags', 'created', 'last_updated',\n+            'pk', 'id', 'name', 'group', 'status', 'encapsulation', 'ipsec_profile', 'tenant', 'tenant_group',\n+            'tunnel_id', 'termination_count', 'description', 'comments', 'tags', 'created', 'last_updated',\n         )\n-        default_columns = ('pk', 'name', 'status', 'encapsulation', 'tenant', 'terminations_count')\n+        default_columns = ('pk', 'name', 'group', 'status', 'encapsulation', 'tenant', 'terminations_count')\n \n \n class TunnelTerminationTable(TenancyColumnsMixin, NetBoxTable):\n", "issue": "Tunnel Group is not selectable as column in VPN tunnels list\n### Deployment Type\n\nSelf-hosted\n\n### NetBox Version\n\nv3.7.2\n\n### Python Version\n\n3.11\n\n### Steps to Reproduce\n\n1. Go to VPN - Tunnels\r\n2. Click Configure Table\r\n\n\n### Expected Behavior\n\nThere is the Tunnel Group column\n\n### Observed Behavior\n\nThere is no Tunnel Group column that could be shown\n", "before_files": [{"content": "import django_tables2 as tables\nfrom django.utils.translation import gettext_lazy as _\nfrom django_tables2.utils import Accessor\n\nfrom netbox.tables import NetBoxTable, columns\nfrom tenancy.tables import TenancyColumnsMixin\nfrom vpn.models import *\n\n__all__ = (\n    'TunnelTable',\n    'TunnelGroupTable',\n    'TunnelTerminationTable',\n)\n\n\nclass TunnelGroupTable(NetBoxTable):\n    name = tables.Column(\n        verbose_name=_('Name'),\n        linkify=True\n    )\n    tunnel_count = columns.LinkedCountColumn(\n        viewname='vpn:tunnel_list',\n        url_params={'group_id': 'pk'},\n        verbose_name=_('Tunnels')\n    )\n    tags = columns.TagColumn(\n        url_name='vpn:tunnelgroup_list'\n    )\n\n    class Meta(NetBoxTable.Meta):\n        model = TunnelGroup\n        fields = (\n            'pk', 'id', 'name', 'tunnel_count', 'description', 'slug', 'tags', 'actions', 'created', 'last_updated',\n        )\n        default_columns = ('pk', 'name', 'tunnel_count', 'description')\n\n\nclass TunnelTable(TenancyColumnsMixin, NetBoxTable):\n    name = tables.Column(\n        verbose_name=_('Name'),\n        linkify=True\n    )\n    status = columns.ChoiceFieldColumn(\n        verbose_name=_('Status')\n    )\n    ipsec_profile = tables.Column(\n        verbose_name=_('IPSec profile'),\n        linkify=True\n    )\n    terminations_count = columns.LinkedCountColumn(\n        accessor=Accessor('count_terminations'),\n        viewname='vpn:tunneltermination_list',\n        url_params={'tunnel_id': 'pk'},\n        verbose_name=_('Terminations')\n    )\n    comments = columns.MarkdownColumn(\n        verbose_name=_('Comments'),\n    )\n    tags = columns.TagColumn(\n        url_name='vpn:tunnel_list'\n    )\n\n    class Meta(NetBoxTable.Meta):\n        model = Tunnel\n        fields = (\n            'pk', 'id', 'name', 'status', 'encapsulation', 'ipsec_profile', 'tenant', 'tenant_group', 'tunnel_id',\n            'termination_count', 'description', 'comments', 'tags', 'created', 'last_updated',\n        )\n        default_columns = ('pk', 'name', 'status', 'encapsulation', 'tenant', 'terminations_count')\n\n\nclass TunnelTerminationTable(TenancyColumnsMixin, NetBoxTable):\n    tunnel = tables.Column(\n        verbose_name=_('Tunnel'),\n        linkify=True\n    )\n    role = columns.ChoiceFieldColumn(\n        verbose_name=_('Role')\n    )\n    termination_parent = tables.Column(\n        accessor='termination__parent_object',\n        linkify=True,\n        orderable=False,\n        verbose_name=_('Host')\n    )\n    termination = tables.Column(\n        verbose_name=_('Interface'),\n        linkify=True\n    )\n    ip_addresses = tables.ManyToManyColumn(\n        accessor=tables.A('termination__ip_addresses'),\n        orderable=False,\n        linkify_item=True,\n        verbose_name=_('IP Addresses')\n    )\n    outside_ip = tables.Column(\n        verbose_name=_('Outside IP'),\n        linkify=True\n    )\n    tags = columns.TagColumn(\n        url_name='vpn:tunneltermination_list'\n    )\n\n    class Meta(NetBoxTable.Meta):\n        model = TunnelTermination\n        fields = (\n            'pk', 'id', 'tunnel', 'role', 'termination_parent', 'termination', 'ip_addresses', 'outside_ip', 'tags',\n            'created', 'last_updated',\n        )\n        default_columns = (\n            'pk', 'id', 'tunnel', 'role', 'termination_parent', 'termination', 'ip_addresses', 'outside_ip',\n        )\n", "path": "netbox/vpn/tables/tunnels.py"}]}