Merge pull request #2364 from cisagov/bob/2274-renewal

Issue #2274: removed data calculation from renew_domain DJA function
This commit is contained in:
dave-kennedy-ecs 2024-06-29 07:10:26 -04:00 committed by GitHub
commit 694cfa543b
No known key found for this signature in database
GPG key ID: B5690EEEBB952194
5 changed files with 10 additions and 121 deletions

View file

@ -14,7 +14,6 @@ from django.contrib.auth.admin import UserAdmin as BaseUserAdmin
from django.contrib.auth.models import Group from django.contrib.auth.models import Group
from django.contrib.contenttypes.models import ContentType from django.contrib.contenttypes.models import ContentType
from django.urls import reverse from django.urls import reverse
from dateutil.relativedelta import relativedelta # type: ignore
from epplibwrapper.errors import ErrorCode, RegistryError from epplibwrapper.errors import ErrorCode, RegistryError
from registrar.models.user_domain_role import UserDomainRole from registrar.models.user_domain_role import UserDomainRole
from waffle.admin import FlagAdmin from waffle.admin import FlagAdmin
@ -2238,25 +2237,12 @@ class DomainAdmin(ListHeaderAdmin, ImportExportModelAdmin):
extra_context["state_help_message"] = Domain.State.get_admin_help_text(domain.state) extra_context["state_help_message"] = Domain.State.get_admin_help_text(domain.state)
extra_context["domain_state"] = domain.get_state_display() extra_context["domain_state"] = domain.get_state_display()
extra_context["curr_exp_date"] = (
# Pass in what the an extended expiration date would be for the expiration date modal domain.expiration_date if domain.expiration_date is not None else self._get_current_date()
self._set_expiration_date_context(domain, extra_context) )
return super().changeform_view(request, object_id, form_url, extra_context) return super().changeform_view(request, object_id, form_url, extra_context)
def _set_expiration_date_context(self, domain, extra_context):
"""Given a domain, calculate the an extended expiration date
from the current registry expiration date."""
years_to_extend_by = self._get_calculated_years_for_exp_date(domain)
try:
curr_exp_date = domain.registry_expiration_date
except KeyError:
# No expiration date was found. Return none.
extra_context["extended_expiration_date"] = None
else:
new_date = curr_exp_date + relativedelta(years=years_to_extend_by)
extra_context["extended_expiration_date"] = new_date
def response_change(self, request, obj): def response_change(self, request, obj):
# Create dictionary of action functions # Create dictionary of action functions
ACTION_FUNCTIONS = { ACTION_FUNCTIONS = {
@ -2284,11 +2270,9 @@ class DomainAdmin(ListHeaderAdmin, ImportExportModelAdmin):
self.message_user(request, "Object is not of type Domain.", messages.ERROR) self.message_user(request, "Object is not of type Domain.", messages.ERROR)
return None return None
years = self._get_calculated_years_for_exp_date(obj)
# Renew the domain. # Renew the domain.
try: try:
obj.renew_domain(length=years) obj.renew_domain()
self.message_user( self.message_user(
request, request,
"Successfully extended the expiration date.", "Successfully extended the expiration date.",
@ -2313,37 +2297,6 @@ class DomainAdmin(ListHeaderAdmin, ImportExportModelAdmin):
return HttpResponseRedirect(".") return HttpResponseRedirect(".")
def _get_calculated_years_for_exp_date(self, obj, extension_period: int = 1):
"""Given the current date, an extension period, and a registry_expiration_date
on the domain object, calculate the number of years needed to extend the
current expiration date by the extension period.
"""
# Get the date we want to update to
desired_date = self._get_current_date() + relativedelta(years=extension_period)
# Grab the current expiration date
try:
exp_date = obj.registry_expiration_date
except KeyError:
# if no expiration date from registry, set it to today
logger.warning("current expiration date not set; setting to today")
exp_date = self._get_current_date()
# If the expiration date is super old (2020, for example), we need to
# "catch up" to the current year, so we add the difference.
# If both years match, then lets just proceed as normal.
calculated_exp_date = exp_date + relativedelta(years=extension_period)
year_difference = desired_date.year - exp_date.year
years = extension_period
if desired_date > calculated_exp_date:
# Max probably isn't needed here (no code flow), but it guards against negative and 0.
# In both of those cases, we just want to extend by the extension_period.
years = max(extension_period, year_difference)
return years
# Workaround for unit tests, as we cannot mock date directly. # Workaround for unit tests, as we cannot mock date directly.
# it is immutable. Rather than dealing with a convoluted workaround, # it is immutable. Rather than dealing with a convoluted workaround,
# lets wrap this in a function. # lets wrap this in a function.

View file

@ -69,7 +69,7 @@
</h2> </h2>
<div class="usa-prose"> <div class="usa-prose">
<p> <p>
This will extend the expiration date by one year. This will extend the expiration date by one year from today.
{# Acts as a <br> #} {# Acts as a <br> #}
<div class="display-inline"></div> <div class="display-inline"></div>
This action cannot be undone. This action cannot be undone.
@ -78,7 +78,7 @@
Domain: <b>{{ original.name }}</b> Domain: <b>{{ original.name }}</b>
{# Acts as a <br> #} {# Acts as a <br> #}
<div class="display-inline"></div> <div class="display-inline"></div>
New expiration date: <b>{{ extended_expiration_date }}</b> Current expiration date: <b>{{ curr_exp_date }}</b>
{{test}} {{test}}
</p> </p>
</div> </div>

View file

@ -1551,8 +1551,6 @@ class MockEppLib(TestCase):
def mockInfoDomainCommands(self, _request, cleaned): def mockInfoDomainCommands(self, _request, cleaned):
request_name = getattr(_request, "name", None).lower() request_name = getattr(_request, "name", None).lower()
print(request_name)
# Define a dictionary to map request names to data and extension values # Define a dictionary to map request names to data and extension values
request_mappings = { request_mappings = {
"security.gov": (self.infoDomainNoContact, None), "security.gov": (self.infoDomainNoContact, None),

View file

@ -374,9 +374,9 @@ class TestDomainAdmin(MockEppLib, WebTest):
# Create a ready domain with a preset expiration date # Create a ready domain with a preset expiration date
domain, _ = Domain.objects.get_or_create(name="fake.gov", state=Domain.State.READY) domain, _ = Domain.objects.get_or_create(name="fake.gov", state=Domain.State.READY)
response = self.app.get(reverse("admin:registrar_domain_change", args=[domain.pk])) response = self.app.get(reverse("admin:registrar_domain_change", args=[domain.pk]))
# load expiration date into cache and registrar with below command
domain.registry_expiration_date
# Make sure the ex date is what we expect it to be # Make sure the ex date is what we expect it to be
domain_ex_date = Domain.objects.get(id=domain.id).expiration_date domain_ex_date = Domain.objects.get(id=domain.id).expiration_date
self.assertEqual(domain_ex_date, date(2023, 5, 25)) self.assertEqual(domain_ex_date, date(2023, 5, 25))
@ -400,7 +400,6 @@ class TestDomainAdmin(MockEppLib, WebTest):
self.assertEqual(response.status_code, 200) self.assertEqual(response.status_code, 200)
self.assertContains(response, domain.name) self.assertContains(response, domain.name)
self.assertContains(response, "Extend expiration date") self.assertContains(response, "Extend expiration date")
self.assertContains(response, "New expiration date: <b>May 25, 2025</b>")
# Ensure the message we recieve is in line with what we expect # Ensure the message we recieve is in line with what we expect
expected_message = "Successfully extended the expiration date." expected_message = "Successfully extended the expiration date."
@ -519,70 +518,10 @@ class TestDomainAdmin(MockEppLib, WebTest):
# Follow the response # Follow the response
response = response.follow() response = response.follow()
# This value is based off of the current year - the expiration date. # Assert that it is calling the function with the default extension length.
# We "freeze" time to 2024, so 2024 - 2023 will always result in an
# "extension" of 2, as that will be one year of extension from that date.
extension_length = 2
# Assert that it is calling the function with the right extension length.
# We only need to test the value that EPP sends, as we can assume the other # We only need to test the value that EPP sends, as we can assume the other
# test cases cover the "renew" function. # test cases cover the "renew" function.
renew_mock.assert_has_calls([call(length=extension_length)], any_order=False) renew_mock.assert_has_calls([call()], any_order=False)
# We should not make duplicate calls
self.assertEqual(renew_mock.call_count, 1)
# Assert that everything on the page looks correct
self.assertEqual(response.status_code, 200)
self.assertContains(response, domain.name)
self.assertContains(response, "Extend expiration date")
# Ensure the message we recieve is in line with what we expect
expected_message = "Successfully extended the expiration date."
expected_call = call(
# The WGSI request doesn't need to be tested
ANY,
messages.INFO,
expected_message,
extra_tags="",
fail_silently=False,
)
mock_add_message.assert_has_calls([expected_call], 1)
@patch("registrar.admin.DomainAdmin._get_current_date", return_value=date(2023, 1, 1))
def test_extend_expiration_date_button_date_matches_epp(self, mock_date_today):
"""
Tests if extend_expiration_date button sends the right epp command
when the current year matches the expiration date
"""
# Create a ready domain with a preset expiration date
domain, _ = Domain.objects.get_or_create(name="fake.gov", state=Domain.State.READY)
response = self.app.get(reverse("admin:registrar_domain_change", args=[domain.pk]))
# Make sure that the page is loading as expected
self.assertEqual(response.status_code, 200)
self.assertContains(response, domain.name)
self.assertContains(response, "Extend expiration date")
# Grab the form to submit
form = response.forms["domain_form"]
with patch("django.contrib.messages.add_message") as mock_add_message:
with patch("registrar.models.Domain.renew_domain") as renew_mock:
# Submit the form
response = form.submit("_extend_expiration_date")
# Follow the response
response = response.follow()
extension_length = 1
# Assert that it is calling the function with the right extension length.
# We only need to test the value that EPP sends, as we can assume the other
# test cases cover the "renew" function.
renew_mock.assert_has_calls([call(length=extension_length)], any_order=False)
# We should not make duplicate calls # We should not make duplicate calls
self.assertEqual(renew_mock.call_count, 1) self.assertEqual(renew_mock.call_count, 1)

View file

@ -735,7 +735,6 @@ class ExportDataTest(MockDb, MockEppLib):
csv_file.seek(0) csv_file.seek(0)
# Read the content into a variable # Read the content into a variable
csv_content = csv_file.read() csv_content = csv_file.read()
print(csv_content)
self.maxDiff = None self.maxDiff = None
expected_content = ( expected_content = (
# Header # Header