Skip to content

Commit f8cabaa

Browse files
committed
Updated to use id vs counter, fixed cancel btn and form validation popup, removed contextvar and refactored post() for flake8 fix, removed silencer
Apply suggestion from @kimallen Co-authored-by: Kim Allen <kim@truss.works> cleanup more cleanup
1 parent 4a06285 commit f8cabaa

11 files changed

Lines changed: 138 additions & 163 deletions

src/registrar/models/dns/dns_record.py

Lines changed: 0 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -88,21 +88,6 @@ def get_ordered_for_zone(cls, dns_zone: "DnsZone"):
8888
"""Return all records for a zone ordered by pk (matches counter assignment order)."""
8989
return cls.objects.filter(dns_zone=dns_zone).order_by("pk")
9090

91-
@classmethod
92-
def get_for_domain_by_counter(cls, domain: Domain, counter: int) -> "DnsRecord | None":
93-
"""Return the DnsRecord at the given 1st position for the domain's zone.
94-
95-
Uses the same ordering as the DNS records table so the counter matches
96-
what was rendered on the GET request.
97-
"""
98-
dns_zone = DnsZone.objects.filter(domain=domain).first()
99-
if not dns_zone:
100-
return None
101-
try:
102-
return cls.get_ordered_for_zone(dns_zone)[counter - 1]
103-
except (IndexError, AssertionError):
104-
return None
105-
10691
@classmethod
10792
def zone_has_records(cls, domain: Domain) -> bool:
10893
"""Return whether a domain's DNS zone has any existing records."""

src/registrar/services/dns_host_service.py

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -199,13 +199,13 @@ def update_dns_record(self, x_zone_id: str, record_id: int, form_record_data: di
199199

200200
x_record_id = dns_record.get_active_x_record_id()
201201
if not x_record_id:
202-
raise ValueError("This DNS record is missing a vendor id and cannot be updated.")
202+
raise ValueError("This DNS record is missing an external record id and cannot be updated.")
203203

204-
self.update_and_save_record(x_zone_id, x_record_id, form_record_data)
204+
self.update_and_save_dns_record(x_zone_id, x_record_id, form_record_data)
205205
return dns_record
206206

207-
def update_and_save_record(self, x_zone_id, x_record_id, form_record_data) -> dict:
208-
"""Calls update method of vendor service to update a DNS record"""
207+
def update_and_save_dns_record(self, x_zone_id, x_record_id, form_record_data) -> dict:
208+
"""Push updated record data to the vendor and persist the changes in the local database."""
209209
# Update record in vendor service
210210
try:
211211
vendor_record_data = self.dns_vendor_service.update_dns_record(x_zone_id, x_record_id, form_record_data)

src/registrar/templates/domain_dns_record_edit_form.html

Lines changed: 10 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1,20 +1,21 @@
11
{% load static field_helpers url_helpers %}
22

3-
{# Inline edit form row for a DNS record. `counter` is a sequential index, not the DB pk. #}
4-
<tr id="dnsrecord-edit-row-{{ counter }}" x-show="showFormId == {{ counter }}" class="hide-td-borders" {% if oob_swap %}hx-swap-oob="outerHTML"{% endif %}>
3+
{# Inline edit form row for a DNS record. `record_id` is the record pk used for DOM targeting. #}
4+
<tr id="dnsrecord-edit-row-{{ record_id }}" x-show="showFormId == {{ record_id }}" class="hide-td-borders" {% if oob_swap %}hx-swap-oob="outerHTML"{% endif %}>
55
<td colspan="5" class="no-padding">
66
<div class="border radius-lg border-base-lighter padding-3">
77
<form
8+
id="dnsrecord-edit-form-{{ record_id }}"
89
method="post"
910
class="usa-form usa-form--extra-large"
11+
novalidate
1012
hx-post="{% url 'domain-dns-records' domain.pk %}"
1113
hx-swap="none"
1214
>
1315
<h2 class="margin-top-0">Edit record</h2>
1416
{% csrf_token %}
1517

16-
{# The counter identifies the row for both DOM targeting and DB lookup (positional index). #}
17-
<input type="hidden" name="counter" value="{{ counter }}" />
18+
<input type="hidden" name="id" value="{{ record_id }}" />
1819
<input type="hidden" name="type" value="{{ dns_record.type }}" />
1920

2021
{% with add_group_class="usa-form-group--unstyled-error" %}
@@ -33,8 +34,12 @@ <h2 class="margin-top-0">Edit record</h2>
3334
</div>
3435
{% input_with_errors dns_record.form.comment %}
3536
<button
36-
type="reset"
37+
type="button"
3738
class="usa-button usa-button--outline"
39+
hx-get="{% url 'domain-dns-records' domain.pk %}"
40+
hx-select="#dnsrecord-edit-form-{{ record_id }}"
41+
hx-target="#dnsrecord-edit-form-{{ record_id }}"
42+
hx-swap="outerHTML"
3843
x-on:click="showFormId = null"
3944
>
4045
Cancel

src/registrar/templates/domain_dns_record_form_content.html

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,7 @@ <h2>Add record</h2>
55

66
<div
77
class="grid-row grid-gap"
8-
x-init="recordType = $el.querySelector('#id_type')?.value || recordType"
8+
x-init="recordType = ($el.querySelector('#id_type') || {}).value || recordType"
99
x-on:change="if ($event.target && $event.target.id === 'id_type') { recordType = $event.target.value }"
1010
>
1111
<div class="grid-col-3">

src/registrar/templates/domain_dns_record_form_response.html

Lines changed: 7 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -3,13 +3,13 @@
33
{# OOB-swap individual cells to preserve the action column (Edit button) DOM for ANDI #}
44
<template>
55
{% if update_cells %}
6-
<td id="dns-type-{{ counter }}" data-label="Type" hx-swap-oob="outerHTML">{{ dns_record.type }}</td>
7-
<td id="dns-name-{{ counter }}" data-label="Name" hx-swap-oob="outerHTML">{{ dns_record.name }}</td>
8-
<td id="dns-content-{{ counter }}" data-label="TTL" hx-swap-oob="outerHTML">{{ dns_record.content }}</td>
9-
<td id="dns-ttl-{{ counter }}" data-label="Type" hx-swap-oob="outerHTML">{{ dns_record.ttl }}</td>
6+
<td id="dns-type-{{ record_id }}" data-label="Type" hx-swap-oob="outerHTML">{{ dns_record.type }}</td>
7+
<td id="dns-name-{{ record_id }}" data-label="Name" hx-swap-oob="outerHTML">{{ dns_record.name }}</td>
8+
<td id="dns-content-{{ record_id }}" data-label="TTL" hx-swap-oob="outerHTML">{{ dns_record.content }}</td>
9+
<td id="dns-ttl-{{ record_id }}" data-label="Type" hx-swap-oob="outerHTML">{{ dns_record.ttl }}</td>
1010
{% endif %}
1111
{# Always OOB swap the edit form row so errors are shown/cleared #}
12-
{% include "domain_dns_record_edit_form.html" with counter=counter dns_record=dns_record oob_swap=True %}
12+
{% include "domain_dns_record_edit_form.html" with record_id=record_id dns_record=dns_record oob_swap=True %}
1313
</template>
1414
{% else %}
1515
<template>
@@ -26,8 +26,8 @@
2626
{% endif %}
2727

2828
<tbody id="dnsrecords-table-body" hx-swap-oob="afterbegin:#dnsrecords-table-body">
29-
{% include "domain_dns_record_row.html" with counter=counter dns_record=dns_record %}
30-
{% include "domain_dns_record_edit_form.html" with counter=counter dns_record=dns_record %}
29+
{% include "domain_dns_record_row.html" with record_id=record_id dns_record=dns_record %}
30+
{% include "domain_dns_record_edit_form.html" with record_id=record_id dns_record=dns_record %}
3131
</tbody>
3232
</template>
3333

src/registrar/templates/domain_dns_record_row.html

Lines changed: 13 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -1,24 +1,24 @@
1-
<tr id="dnsrecord-row-{{counter}}" :class="showFormId == {{ counter }} ? 'hide-td-borders' : ''">
2-
<td id="dns-type-{{ counter }}" data-label="Type">
1+
<tr id="dnsrecord-row-{{record_id}}" :class="showFormId == {{ record_id }} ? 'hide-td-borders' : ''">
2+
<td id="dns-type-{{ record_id }}" data-label="Type">
33
{{dns_record.type}}
44
</td>
5-
<td id="dns-name-{{ counter }}" data-label="Name">
5+
<td id="dns-name-{{ record_id }}" data-label="Name">
66
{{dns_record.name}}
77
</td>
8-
<td id="dns-content-{{ counter }}" data-label="TTL">
8+
<td id="dns-content-{{ record_id }}" data-label="TTL">
99
{{dns_record.content}}
1010
</td>
11-
<td id="dns-ttl-{{ counter }}" data-label="Type">
11+
<td id="dns-ttl-{{ record_id }}" data-label="Type">
1212
{{dns_record.ttl}}
1313
</td>
1414
<td class="padding-right-0" data-label="Action">
1515
<div class="tablet:display-flex tablet:flex-row">
1616
<button type="button"
1717
class="usa-button usa-button--unstyled margin-right-2 margin-top-0"
18-
x-on:click="showFormId = (showFormId === {{ counter }} ? null : {{ counter }})"
18+
x-on:click="showFormId = (showFormId === {{ record_id }} ? null : {{ record_id }})"
1919
aria-expanded="false"
20-
:aria-expanded="showFormId == {{ counter }} ? 'true' : 'false'"
21-
aria-controls="dnsrecord-edit-row-{{ counter }}"
20+
:aria-expanded="showFormId == {{ record_id }} ? 'true' : 'false'"
21+
aria-controls="dnsrecord-edit-row-{{ record_id }}"
2222
aria-label="Edit {{ dns_record.name }}"
2323
>
2424
<svg class="usa-icon" aria-hidden="true" focusable="false" role="img" width="24">
@@ -33,14 +33,14 @@
3333
focusable="false"
3434
role="img"
3535
width="8">
36-
<use x-show="showFormId != {{ counter }}" xlink:href="/public/img/sprite.svg#expand_more" ></use>
37-
<use x-show="showFormId == {{ counter }}" xlink:href="/public/img/sprite.svg#expand_less" ></use>
36+
<use x-show="showFormId != {{ record_id }}" xlink:href="/public/img/sprite.svg#expand_more" ></use>
37+
<use x-show="showFormId == {{ record_id }}" xlink:href="/public/img/sprite.svg#expand_less" ></use>
3838
</svg>
3939

4040
</button>
4141
<a
4242
role="button"
43-
id="button-trigger-delete-dnsrecord-{{ counter }}"
43+
id="button-trigger-delete-dnsrecord-{{ record_id }}"
4444
class="usa-button usa-button--unstyled text-underline margin-top-2 line-height-sans-5 text-secondary visible-mobile-flex"
4545
>
4646
<svg class="usa-icon" aria-hidden="true" focusable="false" role="img" width="24">
@@ -55,15 +55,15 @@
5555
type="button"
5656
class="usa-button usa-button--unstyled usa-button--with-icon usa-accordion__button usa-button--more-actions margin-top-2px"
5757
aria-expanded="false"
58-
aria-controls="more-actions-dnsrecord-{{ counter }}"
58+
aria-controls="more-actions-dnsrecord-{{ record_id }}"
5959
aria-label="More Actions for DNS record"
6060
>
6161
<svg class="usa-icon" aria-hidden="true" focusable="false" role="img" width="24">
6262
<use xlink:href="/public/img/sprite.svg#more_vert"></use>
6363
</svg>
6464
</button>
6565
</div>
66-
<div id="more-actions-dnsrecord-{{ counter }}" class="usa-accordion__content usa-prose shadow-1 left-auto right-neg-1" hidden>
66+
<div id="more-actions-dnsrecord-{{ record_id }}" class="usa-accordion__content usa-prose shadow-1 left-auto right-neg-1" hidden>
6767
<h2>More options</h2>
6868
<button
6969
type="button"

src/registrar/templates/domain_dns_records_table.html

Lines changed: 4 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -17,11 +17,9 @@
1717
</thead>
1818

1919
<tbody id="dnsrecords-table-body">
20-
{% if dns_records %}
21-
{% for dns_record in dns_records %}
22-
{% include "domain_dns_record_row.html" with counter=dns_record.counter dns_record=dns_record %}
23-
{% include "domain_dns_record_edit_form.html" with counter=dns_record.counter dns_record=dns_record %}
24-
{% endfor %}
25-
{% endif %}
20+
{% for dns_record in dns_records %}
21+
{% include "domain_dns_record_row.html" with record_id=dns_record.id dns_record=dns_record %}
22+
{% include "domain_dns_record_edit_form.html" with record_id=dns_record.id dns_record=dns_record %}
23+
{% endfor %}
2624
</tbody>
2725
</table>

src/registrar/tests/services/test_dns_host_service.py

Lines changed: 9 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -232,9 +232,10 @@ def test_dns_setup_failure_from_create_cf_zone(self, mock_create_cf_account, moc
232232
# mock_create_cf_zone.assert_called_once_with(zone_name, account_id) not sure why this fails: 0 calls
233233
self.assertIn("DNS setup failed to create zone", str(context.exception))
234234

235+
@patch("registrar.models.dns.dns_record.DnsRecord.get_by_x_record_id")
235236
@patch("registrar.models.dns.dns_record.DnsRecord.create_from_vendor_data")
236237
@patch("registrar.services.dns_host_service.CloudflareService.create_dns_record")
237-
def test_create_cf_record_success(self, mock_create_dns_record, _):
238+
def test_create_cf_record_success(self, mock_create_dns_record, _, mock_get_by_x_record_id):
238239
zone_id = "1234"
239240
record_data = {
240241
"type": "A",
@@ -245,11 +246,14 @@ def test_create_cf_record_success(self, mock_create_dns_record, _):
245246
"created_on": "2024-01-02T03:04:05Z",
246247
}
247248

249+
mock_dns_record = Mock()
250+
mock_dns_record.name = "test.gov"
248251
mock_create_dns_record.return_value = {"result": {"id": zone_id, **record_data}}
252+
mock_get_by_x_record_id.return_value = mock_dns_record
249253

250-
response = self.service.create_and_save_record(zone_id, record_data)
251-
self.assertEqual(response["result"]["id"], zone_id)
252-
self.assertEqual(response["result"]["name"], "test.gov")
254+
response = self.service.create_dns_record(zone_id, record_data)
255+
self.assertEqual(response.name, "test.gov")
256+
mock_get_by_x_record_id.assert_called_once_with(zone_id)
253257

254258
@patch("registrar.services.dns_host_service.CloudflareService.create_dns_record")
255259
def test_create_cf_record_failure(self, mock_create_dns_record):
@@ -260,7 +264,7 @@ def test_create_cf_record_failure(self, mock_create_dns_record):
260264
mock_create_dns_record.side_effect = APIError("Bad request: missing name")
261265

262266
with self.assertRaises(APIError) as context:
263-
self.service.create_and_save_record(zone_id, record_data)
267+
self.service.create_dns_record(zone_id, record_data)
264268
self.assertIn("Bad request: missing name", str(context.exception))
265269

266270
def test_update_account_dns_settings_success(self):

src/registrar/tests/test_views_domain.py

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -3555,7 +3555,7 @@ def test_edit_dns_record_save_updates_record(self):
35553555
response = self.client.post(
35563556
reverse("domain-dns-records", kwargs={"domain_pk": self.domain.id}),
35573557
data={
3558-
"id": dns_record.pk,
3558+
"id": dns_record.id,
35593559
"type": dns_record.type,
35603560
"name": "api",
35613561
"content": "203.0.113.15",
@@ -3625,7 +3625,7 @@ def test_edit_dns_record_save_returns_400_without_active_vendor_id(self):
36253625
response = self.client.post(
36263626
reverse("domain-dns-records", kwargs={"domain_pk": self.domain.id}),
36273627
data={
3628-
"id": dns_record.pk,
3628+
"id": dns_record.id,
36293629
"type": dns_record.type,
36303630
"name": "api",
36313631
"content": "203.0.113.25",

src/registrar/tests/views/test_domain_dns_record_and_form.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -73,7 +73,7 @@ def test_get_renders_page_and_form_fields_success(self):
7373

7474
@override_flag("dns_hosting", active=True)
7575
@less_console_noise_decorator
76-
def test_post_valid_forms_create_records_success(self):
76+
def test_post_valid_forms_create_dns_records_success(self):
7777
for data in self.RECORD_TEST_CASES:
7878
with self.subTest(record_type=data["type"]):
7979
mock_record = {

0 commit comments

Comments
 (0)