prompt: You will be provided with a partial code base and an issue statement explaining a problem to resolve.
  <issue>
  Update error message on check availability section in the request form
  ### Issue description
  
  To keep language consistent, we should update the error message in the check availability section in the request form from:
  
  This
  
  > That domain isn't available. Try entering another one. Contact us if you need help coming up with a domain. 
  
  
  To this
  
  > That domain isn’t available. [Read more about choosing your .gov domain.](https://beta.get.gov/domains/choosing/) 
  
  
  Note that the hyperlink in the new message should open in a new tab so as to not take the user our of the request flow
  
  ### Acceptance criteria
  
  - [ ] error message is updated
  - [ ] link opens in new tab
  
  ### Additional context
  
  _No response_
  
  ### Links to other issues
  
  _No response_
  
  </issue>
  <code>
  [start of src/api/views.py]
  1 """Internal API views"""
  2 from django.apps import apps
  3 from django.views.decorators.http import require_http_methods
  4 from django.http import JsonResponse
  5 
  6 import requests
  7 
  8 from login_required import login_not_required
  9 
  10 from cachetools.func import ttl_cache
  11 
  12 
  13 DOMAIN_FILE_URL = "https://raw.githubusercontent.com/cisagov/dotgov-data/main/current-full.csv"
  14 
  15 
  16 DOMAIN_API_MESSAGES = {
  17     "required": "Enter the .gov domain you want. Don’t include “www” or “.gov.”"
  18     " For example, if you want www.city.gov, you would enter “city”"
  19     " (without the quotes).",
  20     "extra_dots": "Enter the .gov domain you want without any periods.",
  21     "unavailable": "That domain isn’t available. Try entering another one."
  22     " Contact us if you need help coming up with a domain.",
  23     "invalid": "Enter a domain using only letters, numbers, or hyphens (though we don't recommend using hyphens).",
  24     "success": "That domain is available!",
  25     "error": "Error finding domain availability.",
  26 }
  27 
  28 
  29 # this file doesn't change that often, nor is it that big, so cache the result
  30 # in memory for ten minutes
  31 @ttl_cache(ttl=600)
  32 def _domains():
  33     """Return a list of the current .gov domains.
  34 
  35     Fetch a file from DOMAIN_FILE_URL, parse the CSV for the domain,
  36     lowercase everything and return the list.
  37     """
  38     DraftDomain = apps.get_model("registrar.DraftDomain")
  39     # 5 second timeout
  40     file_contents = requests.get(DOMAIN_FILE_URL, timeout=5).text
  41     domains = set()
  42     # skip the first line
  43     for line in file_contents.splitlines()[1:]:
  44         # get the domain before the first comma
  45         domain = line.split(",", 1)[0]
  46         # sanity-check the string we got from the file here
  47         if DraftDomain.string_could_be_domain(domain):
  48             # lowercase everything when we put it in domains
  49             domains.add(domain.lower())
  50     return domains
  51 
  52 
  53 def check_domain_available(domain):
  54     """Return true if the given domain is available.
  55 
  56     The given domain is lowercased to match against the domains list. If the
  57     given domain doesn't end with .gov, ".gov" is added when looking for
  58     a match.
  59     """
  60     Domain = apps.get_model("registrar.Domain")
  61     try:
  62         if domain.endswith(".gov"):
  63             return Domain.available(domain)
  64         else:
  65             # domain search string doesn't end with .gov, add it on here
  66             return Domain.available(domain + ".gov")
  67     except Exception:
  68         return False
  69 
  70 
  71 @require_http_methods(["GET"])
  72 @login_not_required
  73 def available(request, domain=""):
  74     """Is a given domain available or not.
  75 
  76     Response is a JSON dictionary with the key "available" and value true or
  77     false.
  78     """
  79     DraftDomain = apps.get_model("registrar.DraftDomain")
  80     # validate that the given domain could be a domain name and fail early if
  81     # not.
  82     if not (DraftDomain.string_could_be_domain(domain) or DraftDomain.string_could_be_domain(domain + ".gov")):
  83         return JsonResponse({"available": False, "message": DOMAIN_API_MESSAGES["invalid"]})
  84     # a domain is available if it is NOT in the list of current domains
  85     try:
  86         if check_domain_available(domain):
  87             return JsonResponse({"available": True, "message": DOMAIN_API_MESSAGES["success"]})
  88         else:
  89             return JsonResponse({"available": False, "message": DOMAIN_API_MESSAGES["unavailable"]})
  90     except Exception:
  91         return JsonResponse({"available": False, "message": DOMAIN_API_MESSAGES["error"]})
  92
  [end of src/api/views.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/src/api/views.py b/src/api/views.py
  --- a/src/api/views.py
  +++ b/src/api/views.py
  @@ -2,6 +2,9 @@
   from django.apps import apps
   from django.views.decorators.http import require_http_methods
   from django.http import JsonResponse
  +from django.utils.safestring import mark_safe
  +
  +from registrar.templatetags.url_helpers import public_site_url
   
   import requests
   
  @@ -18,8 +21,13 @@
       " For example, if you want www.city.gov, you would enter “city”"
       " (without the quotes).",
       "extra_dots": "Enter the .gov domain you want without any periods.",
  -    "unavailable": "That domain isn’t available. Try entering another one."
  -    " Contact us if you need help coming up with a domain.",
  +    # message below is considered safe; no user input can be inserted into the message
  +    # body; public_site_url() function reads from local app settings and therefore safe
  +    "unavailable": mark_safe(  # nosec
  +        "That domain isn’t available. "
  +        "<a class='usa-link' href='{}' target='_blank'>"
  +        "Read more about choosing your .gov domain.</a>".format(public_site_url("domains/choosing"))
  +    ),
       "invalid": "Enter a domain using only letters, numbers, or hyphens (though we don't recommend using hyphens).",
       "success": "That domain is available!",
       "error": "Error finding domain availability.",
  
verification_info: {"golden_diff": "diff --git a/src/api/views.py b/src/api/views.py\n--- a/src/api/views.py\n+++ b/src/api/views.py\n@@ -2,6 +2,9 @@\n from django.apps import apps\n from django.views.decorators.http import require_http_methods\n from django.http import JsonResponse\n+from django.utils.safestring import mark_safe\n+\n+from registrar.templatetags.url_helpers import public_site_url\n \n import requests\n \n@@ -18,8 +21,13 @@\n     \" For example, if you want www.city.gov, you would enter \u201ccity\u201d\"\n     \" (without the quotes).\",\n     \"extra_dots\": \"Enter the .gov domain you want without any periods.\",\n-    \"unavailable\": \"That domain isn\u2019t available. Try entering another one.\"\n-    \" Contact us if you need help coming up with a domain.\",\n+    # message below is considered safe; no user input can be inserted into the message\n+    # body; public_site_url() function reads from local app settings and therefore safe\n+    \"unavailable\": mark_safe(  # nosec\n+        \"That domain isn\u2019t available. \"\n+        \"<a class='usa-link' href='{}' target='_blank'>\"\n+        \"Read more about choosing your .gov domain.</a>\".format(public_site_url(\"domains/choosing\"))\n+    ),\n     \"invalid\": \"Enter a domain using only letters, numbers, or hyphens (though we don't recommend using hyphens).\",\n     \"success\": \"That domain is available!\",\n     \"error\": \"Error finding domain availability.\",\n", "issue": "Update error message on check availability section in the request form\n### Issue description\n\nTo keep language consistent, we should update the error message in the check availability section in the request form from:\r\n\r\nThis\r\n\r\n> That domain isn't available. Try entering another one. Contact us if you need help coming up with a domain. \r\n\r\n\r\nTo this\r\n\r\n> That domain isn\u2019t available. [Read more about choosing your .gov domain.](https://beta.get.gov/domains/choosing/) \r\n\r\n\r\nNote that the hyperlink in the new message should open in a new tab so as to not take the user our of the request flow\n\n### Acceptance criteria\n\n- [ ] error message is updated\r\n- [ ] link opens in new tab\n\n### Additional context\n\n_No response_\n\n### Links to other issues\n\n_No response_\n", "before_files": [{"content": "\"\"\"Internal API views\"\"\"\nfrom django.apps import apps\nfrom django.views.decorators.http import require_http_methods\nfrom django.http import JsonResponse\n\nimport requests\n\nfrom login_required import login_not_required\n\nfrom cachetools.func import ttl_cache\n\n\nDOMAIN_FILE_URL = \"https://raw.githubusercontent.com/cisagov/dotgov-data/main/current-full.csv\"\n\n\nDOMAIN_API_MESSAGES = {\n    \"required\": \"Enter the .gov domain you want. Don\u2019t include \u201cwww\u201d or \u201c.gov.\u201d\"\n    \" For example, if you want www.city.gov, you would enter \u201ccity\u201d\"\n    \" (without the quotes).\",\n    \"extra_dots\": \"Enter the .gov domain you want without any periods.\",\n    \"unavailable\": \"That domain isn\u2019t available. Try entering another one.\"\n    \" Contact us if you need help coming up with a domain.\",\n    \"invalid\": \"Enter a domain using only letters, numbers, or hyphens (though we don't recommend using hyphens).\",\n    \"success\": \"That domain is available!\",\n    \"error\": \"Error finding domain availability.\",\n}\n\n\n# this file doesn't change that often, nor is it that big, so cache the result\n# in memory for ten minutes\n@ttl_cache(ttl=600)\ndef _domains():\n    \"\"\"Return a list of the current .gov domains.\n\n    Fetch a file from DOMAIN_FILE_URL, parse the CSV for the domain,\n    lowercase everything and return the list.\n    \"\"\"\n    DraftDomain = apps.get_model(\"registrar.DraftDomain\")\n    # 5 second timeout\n    file_contents = requests.get(DOMAIN_FILE_URL, timeout=5).text\n    domains = set()\n    # skip the first line\n    for line in file_contents.splitlines()[1:]:\n        # get the domain before the first comma\n        domain = line.split(\",\", 1)[0]\n        # sanity-check the string we got from the file here\n        if DraftDomain.string_could_be_domain(domain):\n            # lowercase everything when we put it in domains\n            domains.add(domain.lower())\n    return domains\n\n\ndef check_domain_available(domain):\n    \"\"\"Return true if the given domain is available.\n\n    The given domain is lowercased to match against the domains list. If the\n    given domain doesn't end with .gov, \".gov\" is added when looking for\n    a match.\n    \"\"\"\n    Domain = apps.get_model(\"registrar.Domain\")\n    try:\n        if domain.endswith(\".gov\"):\n            return Domain.available(domain)\n        else:\n            # domain search string doesn't end with .gov, add it on here\n            return Domain.available(domain + \".gov\")\n    except Exception:\n        return False\n\n\n@require_http_methods([\"GET\"])\n@login_not_required\ndef available(request, domain=\"\"):\n    \"\"\"Is a given domain available or not.\n\n    Response is a JSON dictionary with the key \"available\" and value true or\n    false.\n    \"\"\"\n    DraftDomain = apps.get_model(\"registrar.DraftDomain\")\n    # validate that the given domain could be a domain name and fail early if\n    # not.\n    if not (DraftDomain.string_could_be_domain(domain) or DraftDomain.string_could_be_domain(domain + \".gov\")):\n        return JsonResponse({\"available\": False, \"message\": DOMAIN_API_MESSAGES[\"invalid\"]})\n    # a domain is available if it is NOT in the list of current domains\n    try:\n        if check_domain_available(domain):\n            return JsonResponse({\"available\": True, \"message\": DOMAIN_API_MESSAGES[\"success\"]})\n        else:\n            return JsonResponse({\"available\": False, \"message\": DOMAIN_API_MESSAGES[\"unavailable\"]})\n    except Exception:\n        return JsonResponse({\"available\": False, \"message\": DOMAIN_API_MESSAGES[\"error\"]})\n", "path": "src/api/views.py"}]}