prompt: You will be provided with a partial code base and an issue statement explaining a problem to resolve.
  <issue>
  2.0: Tag string representation is incorrect
  ### Environment
  * Nautobot version (Docker tag too if applicable): `next`, e13883b7b8a4f44bca0c40d8074dcf8f82e544e6
  
  ### Steps to Reproduce
  1. Create a Tag and associate it to any model
  2. View the legacy-UI list view or detail view of that model
  
  <!-- What did you expect to happen? -->
  ### Expected Behavior
  
  Tag name to be displayed
  
  <!-- What happened instead? -->
  ### Observed Behavior
  
  `Tag object (<uuid>)` is displayed.
  
  ![image](https://github.com/nautobot/nautobot/assets/5603551/1da33bf8-f9ee-4fb7-b4cb-4f2c2d682496)
  
  Appears to be a regression due to #3914.
  
  
  </issue>
  <code>
  [start of nautobot/extras/models/tags.py]
  1 from django.contrib.contenttypes.models import ContentType
  2 from django.db import models
  3 from taggit.models import GenericUUIDTaggedItemBase
  4 
  5 from nautobot.core.choices import ColorChoices
  6 from nautobot.core.models import BaseManager, BaseModel
  7 from nautobot.core.models.fields import ColorField
  8 from nautobot.core.models.querysets import RestrictedQuerySet
  9 from nautobot.extras.models import ChangeLoggedModel, CustomFieldModel
  10 from nautobot.extras.models.mixins import NotesMixin
  11 from nautobot.extras.models.relationships import RelationshipModel
  12 from nautobot.extras.utils import extras_features, TaggableClassesQuery
  13 
  14 
  15 #
  16 # Tags
  17 #
  18 
  19 
  20 class TagQuerySet(RestrictedQuerySet):
  21     """Queryset for `Tags` objects."""
  22 
  23     def get_for_model(self, model):
  24         """
  25         Return all `Tags` assigned to the given model.
  26         """
  27         return self.filter(content_types__model=model._meta.model_name, content_types__app_label=model._meta.app_label)
  28 
  29 
  30 # Tag *should* be a `NameColorContentTypesModel` but that way lies circular import purgatory. Sigh.
  31 @extras_features(
  32     "custom_validators",
  33 )
  34 class Tag(BaseModel, ChangeLoggedModel, CustomFieldModel, RelationshipModel, NotesMixin):
  35     name = models.CharField(max_length=100, unique=True)
  36     content_types = models.ManyToManyField(
  37         to=ContentType,
  38         related_name="tags",
  39         limit_choices_to=TaggableClassesQuery(),
  40     )
  41     color = ColorField(default=ColorChoices.COLOR_GREY)
  42     description = models.CharField(
  43         max_length=200,
  44         blank=True,
  45     )
  46 
  47     objects = BaseManager.from_queryset(TagQuerySet)()
  48 
  49     class Meta:
  50         ordering = ["name"]
  51 
  52     def validate_content_types_removal(self, content_types_id):
  53         """Validate content_types to be removed are not tagged to a model"""
  54         errors = {}
  55 
  56         removed_content_types = self.content_types.exclude(id__in=content_types_id)
  57 
  58         # check if tag is assigned to any of the removed content_types
  59         for content_type in removed_content_types:
  60             model = content_type.model_class()
  61             if model.objects.filter(tags=self).exists():
  62                 errors.setdefault("content_types", []).append(
  63                     f"Unable to remove {model._meta.label_lower}. Dependent objects were found."
  64                 )
  65 
  66         return errors
  67 
  68 
  69 class TaggedItem(BaseModel, GenericUUIDTaggedItemBase):
  70     tag = models.ForeignKey(to=Tag, related_name="%(app_label)s_%(class)s_items", on_delete=models.CASCADE)
  71 
  72     class Meta:
  73         index_together = ("content_type", "object_id")
  74         unique_together = [["content_type", "object_id", "tag"]]
  75
  [end of nautobot/extras/models/tags.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/nautobot/extras/models/tags.py b/nautobot/extras/models/tags.py
  --- a/nautobot/extras/models/tags.py
  +++ b/nautobot/extras/models/tags.py
  @@ -46,6 +46,9 @@
   
       objects = BaseManager.from_queryset(TagQuerySet)()
   
  +    def __str__(self):
  +        return self.name
  +
       class Meta:
           ordering = ["name"]
  
verification_info: {"golden_diff": "diff --git a/nautobot/extras/models/tags.py b/nautobot/extras/models/tags.py\n--- a/nautobot/extras/models/tags.py\n+++ b/nautobot/extras/models/tags.py\n@@ -46,6 +46,9 @@\n \n     objects = BaseManager.from_queryset(TagQuerySet)()\n \n+    def __str__(self):\n+        return self.name\n+\n     class Meta:\n         ordering = [\"name\"]\n", "issue": "2.0: Tag string representation is incorrect\n### Environment\r\n* Nautobot version (Docker tag too if applicable): `next`, e13883b7b8a4f44bca0c40d8074dcf8f82e544e6\r\n\r\n### Steps to Reproduce\r\n1. Create a Tag and associate it to any model\r\n2. View the legacy-UI list view or detail view of that model\r\n\r\n<!-- What did you expect to happen? -->\r\n### Expected Behavior\r\n\r\nTag name to be displayed\r\n\r\n<!-- What happened instead? -->\r\n### Observed Behavior\r\n\r\n`Tag object (<uuid>)` is displayed.\r\n\r\n![image](https://github.com/nautobot/nautobot/assets/5603551/1da33bf8-f9ee-4fb7-b4cb-4f2c2d682496)\r\n\r\nAppears to be a regression due to #3914.\r\n\n", "before_files": [{"content": "from django.contrib.contenttypes.models import ContentType\nfrom django.db import models\nfrom taggit.models import GenericUUIDTaggedItemBase\n\nfrom nautobot.core.choices import ColorChoices\nfrom nautobot.core.models import BaseManager, BaseModel\nfrom nautobot.core.models.fields import ColorField\nfrom nautobot.core.models.querysets import RestrictedQuerySet\nfrom nautobot.extras.models import ChangeLoggedModel, CustomFieldModel\nfrom nautobot.extras.models.mixins import NotesMixin\nfrom nautobot.extras.models.relationships import RelationshipModel\nfrom nautobot.extras.utils import extras_features, TaggableClassesQuery\n\n\n#\n# Tags\n#\n\n\nclass TagQuerySet(RestrictedQuerySet):\n    \"\"\"Queryset for `Tags` objects.\"\"\"\n\n    def get_for_model(self, model):\n        \"\"\"\n        Return all `Tags` assigned to the given model.\n        \"\"\"\n        return self.filter(content_types__model=model._meta.model_name, content_types__app_label=model._meta.app_label)\n\n\n# Tag *should* be a `NameColorContentTypesModel` but that way lies circular import purgatory. Sigh.\n@extras_features(\n    \"custom_validators\",\n)\nclass Tag(BaseModel, ChangeLoggedModel, CustomFieldModel, RelationshipModel, NotesMixin):\n    name = models.CharField(max_length=100, unique=True)\n    content_types = models.ManyToManyField(\n        to=ContentType,\n        related_name=\"tags\",\n        limit_choices_to=TaggableClassesQuery(),\n    )\n    color = ColorField(default=ColorChoices.COLOR_GREY)\n    description = models.CharField(\n        max_length=200,\n        blank=True,\n    )\n\n    objects = BaseManager.from_queryset(TagQuerySet)()\n\n    class Meta:\n        ordering = [\"name\"]\n\n    def validate_content_types_removal(self, content_types_id):\n        \"\"\"Validate content_types to be removed are not tagged to a model\"\"\"\n        errors = {}\n\n        removed_content_types = self.content_types.exclude(id__in=content_types_id)\n\n        # check if tag is assigned to any of the removed content_types\n        for content_type in removed_content_types:\n            model = content_type.model_class()\n            if model.objects.filter(tags=self).exists():\n                errors.setdefault(\"content_types\", []).append(\n                    f\"Unable to remove {model._meta.label_lower}. Dependent objects were found.\"\n                )\n\n        return errors\n\n\nclass TaggedItem(BaseModel, GenericUUIDTaggedItemBase):\n    tag = models.ForeignKey(to=Tag, related_name=\"%(app_label)s_%(class)s_items\", on_delete=models.CASCADE)\n\n    class Meta:\n        index_together = (\"content_type\", \"object_id\")\n        unique_together = [[\"content_type\", \"object_id\", \"tag\"]]\n", "path": "nautobot/extras/models/tags.py"}]}