Add command to delete erroneously added overgrowth NeedsHumanReview & reset due dates (#22832)

* Add command to delete erroneously added overgrowth NeedsHumanReview & reset due dates

* Add route
This commit is contained in:
Mathieu Pillard 2024-11-07 14:45:57 +01:00 коммит произвёл GitHub
Родитель 2dedcbc1a7
Коммит be5a368fe6
Не найден ключ, соответствующий данной подписи
Идентификатор ключа GPG: B5690EEEBB952194
4 изменённых файлов: 154 добавлений и 2 удалений

Просмотреть файл

@ -6,7 +6,9 @@ from olympia import amo
from olympia.abuse.models import AbuseReport from olympia.abuse.models import AbuseReport
from olympia.addons.models import Addon from olympia.addons.models import Addon
from olympia.addons.tasks import ( from olympia.addons.tasks import (
ERRONEOUSLY_ADDED_OVERGROWTH_DATE_RANGE,
delete_addons, delete_addons,
delete_erroneously_added_overgrowth_needshumanreview,
extract_colors_from_static_themes, extract_colors_from_static_themes,
find_inconsistencies_between_es_and_db, find_inconsistencies_between_es_and_db,
recreate_theme_previews, recreate_theme_previews,
@ -22,6 +24,7 @@ from olympia.constants.base import (
from olympia.devhub.tasks import get_preview_sizes, recreate_previews from olympia.devhub.tasks import get_preview_sizes, recreate_previews
from olympia.lib.crypto.tasks import bump_and_resign_addons from olympia.lib.crypto.tasks import bump_and_resign_addons
from olympia.ratings.tasks import addon_rating_aggregates from olympia.ratings.tasks import addon_rating_aggregates
from olympia.reviewers.models import NeedsHumanReview
from olympia.reviewers.tasks import recalculate_post_review_weight from olympia.reviewers.tasks import recalculate_post_review_weight
from olympia.versions.tasks import delete_list_theme_previews from olympia.versions.tasks import delete_list_theme_previews
@ -144,6 +147,21 @@ class Command(ProcessObjectsCommand):
'task': addon_rating_aggregates, 'task': addon_rating_aggregates,
'queryset_filters': [Q(status=amo.STATUS_APPROVED)], 'queryset_filters': [Q(status=amo.STATUS_APPROVED)],
}, },
# https://github.com/mozilla/addons/issues/15141
'delete_erroneously_added_overgrowth_needshumanreview': {
'task': delete_erroneously_added_overgrowth_needshumanreview,
'queryset_filters': [
Q(
versions__needshumanreview__reason=(
NeedsHumanReview.REASONS.HOTNESS_THRESHOLD
),
versions__needshumanreview__created__range=(
ERRONEOUSLY_ADDED_OVERGROWTH_DATE_RANGE
),
versions__needshumanreview__is_active=True,
)
],
},
} }
def add_arguments(self, parser): def add_arguments(self, parser):

Просмотреть файл

@ -1,6 +1,7 @@
import hashlib import hashlib
import mimetypes import mimetypes
import os import os
from datetime import date
from django.core.files.storage import default_storage as storage from django.core.files.storage import default_storage as storage
from django.db import transaction from django.db import transaction
@ -563,3 +564,26 @@ def flag_high_hotness_according_to_review_tier():
NeedsHumanReview.set_on_addons_latest_signed_versions( NeedsHumanReview.set_on_addons_latest_signed_versions(
qs, NeedsHumanReview.REASONS.HOTNESS_THRESHOLD qs, NeedsHumanReview.REASONS.HOTNESS_THRESHOLD
) )
ERRONEOUSLY_ADDED_OVERGROWTH_DATE_RANGE = (
date(2024, 11, 5),
date(2024, 11, 7),
)
@task
@use_primary_db
def delete_erroneously_added_overgrowth_needshumanreview(addon_ids, **kw):
addons = Addon.unfiltered.filter(pk__in=addon_ids).no_transforms()
for addon in addons:
log.info(
'Deleting erroneously added NHR and updating due dates for %s', addon.pk
)
NeedsHumanReview.objects.filter(
version__addon=addon,
reason=NeedsHumanReview.REASONS.HOTNESS_THRESHOLD,
created__range=ERRONEOUSLY_ADDED_OVERGROWTH_DATE_RANGE,
is_active=True,
).delete()
addon.update_all_due_dates()

Просмотреть файл

@ -1,6 +1,6 @@
import random import random
from contextlib import contextmanager from contextlib import contextmanager
from datetime import timedelta from datetime import datetime, timedelta
from unittest import mock from unittest import mock
from django.conf import settings from django.conf import settings
@ -27,7 +27,7 @@ from olympia.amo.tests import (
from olympia.applications.models import AppVersion from olympia.applications.models import AppVersion
from olympia.files.models import FileValidation from olympia.files.models import FileValidation
from olympia.ratings.models import Rating, RatingAggregate from olympia.ratings.models import Rating, RatingAggregate
from olympia.reviewers.models import AutoApprovalSummary from olympia.reviewers.models import AutoApprovalSummary, NeedsHumanReview
from olympia.versions.models import ApplicationsVersions, Version, VersionPreview from olympia.versions.models import ApplicationsVersions, Version, VersionPreview
@ -573,3 +573,110 @@ def test_delete_list_theme_previews():
assert VersionPreview.objects.filter(id=other_firefox_preview.id).exists() assert VersionPreview.objects.filter(id=other_firefox_preview.id).exists()
assert VersionPreview.objects.filter(id=other_amo_preview.id).exists() assert VersionPreview.objects.filter(id=other_amo_preview.id).exists()
assert not VersionPreview.objects.filter(id=other_old_list_preview.id).exists() assert not VersionPreview.objects.filter(id=other_old_list_preview.id).exists()
@pytest.mark.django_db
def test_delete_erroneously_added_overgrowth_needshumanreview():
user_factory(pk=settings.TASK_USER_ID, display_name='Mozilla')
should_no_longer_have_nhr_or_due_date = [
# Basic case
addon_factory()
.current_version.needshumanreview_set.create(
reason=NeedsHumanReview.REASONS.HOTNESS_THRESHOLD,
created=datetime(2024, 11, 7),
)
.version.addon,
# Somehow has 2 bogus NHR, one active one not
NeedsHumanReview.objects.create(
reason=NeedsHumanReview.REASONS.HOTNESS_THRESHOLD,
created=datetime(2024, 11, 7),
is_active=False,
version=addon_factory()
.current_version.needshumanreview_set.create(
reason=NeedsHumanReview.REASONS.HOTNESS_THRESHOLD,
created=datetime(2024, 11, 7),
)
.version,
).version.addon,
# Has 2 versions both with the bogus NHR
NeedsHumanReview.objects.create(
version=version_factory(
addon=addon_factory()
.current_version.needshumanreview_set.create(
reason=NeedsHumanReview.REASONS.HOTNESS_THRESHOLD,
created=datetime(2024, 11, 7),
)
.version.addon,
channel=amo.CHANNEL_UNLISTED,
),
reason=NeedsHumanReview.REASONS.HOTNESS_THRESHOLD,
created=datetime(2024, 11, 7),
).version.addon,
]
should_still_have_nhr_and_due_date = [
# Outside the range
addon_factory()
.current_version.needshumanreview_set.create(
reason=NeedsHumanReview.REASONS.HOTNESS_THRESHOLD,
created=datetime(2024, 11, 3),
)
.version.addon,
# In the range but wrong reason
addon_factory()
.current_version.needshumanreview_set.create(
reason=NeedsHumanReview.REASONS.UNKNOWN,
created=datetime(2024, 11, 6),
)
.version.addon,
]
should_no_longer_have_hotness_nhr_but_still_other_nhr_and_due_date = [
# Has both a bogus NHR (inside the range, reason we care about) and
# another valid one.
NeedsHumanReview.objects.create(
reason=NeedsHumanReview.REASONS.HOTNESS_THRESHOLD,
created=datetime(2024, 1, 1),
version=addon_factory()
.current_version.needshumanreview_set.create(
reason=NeedsHumanReview.REASONS.HOTNESS_THRESHOLD,
created=datetime(2024, 11, 7),
)
.version,
).version.addon,
# Has 2 versions, one with bogus NHR but other version has a different,
# valid (because date outside the range) NHR for that same reason.
NeedsHumanReview.objects.create(
version=version_factory(
addon=addon_factory()
.current_version.needshumanreview_set.create(
reason=NeedsHumanReview.REASONS.HOTNESS_THRESHOLD,
created=datetime(2024, 11, 7),
)
.version.addon,
channel=amo.CHANNEL_UNLISTED,
),
reason=NeedsHumanReview.REASONS.HOTNESS_THRESHOLD,
).version.addon,
]
call_command(
'process_addons', task='delete_erroneously_added_overgrowth_needshumanreview'
)
for addon in should_no_longer_have_nhr_or_due_date:
assert not addon.versions.filter(due_date__isnull=False).exists()
assert not NeedsHumanReview.objects.filter(
version__addon=addon, is_active=True
).exists()
for addon in should_still_have_nhr_and_due_date:
assert addon.versions.filter(due_date__isnull=False).exists()
assert NeedsHumanReview.objects.filter(
version__addon=addon, is_active=True
).exists()
for addon in should_no_longer_have_hotness_nhr_but_still_other_nhr_and_due_date:
assert addon.versions.filter(due_date__isnull=False).exists()
assert NeedsHumanReview.objects.filter(
version__addon=addon, is_active=True
).exists()
assert NeedsHumanReview.objects.filter(
version__addon=addon,
is_active=True,
reason=NeedsHumanReview.REASONS.HOTNESS_THRESHOLD,
).exists()

Просмотреть файл

@ -850,6 +850,9 @@ CELERY_TASK_ROUTES = {
# Adhoc # Adhoc
# A queue to be used for one-off tasks that could be resource intensive or # A queue to be used for one-off tasks that could be resource intensive or
# tasks we want completely separate from the rest. # tasks we want completely separate from the rest.
'olympia.addons.tasks.delete_erroneously_added_overgrowth_needshumanreview': {
'queue': 'adhoc'
},
'olympia.addons.tasks.find_inconsistencies_between_es_and_db': {'queue': 'adhoc'}, 'olympia.addons.tasks.find_inconsistencies_between_es_and_db': {'queue': 'adhoc'},
'olympia.search.management.commands.reindex.create_new_index': {'queue': 'adhoc'}, 'olympia.search.management.commands.reindex.create_new_index': {'queue': 'adhoc'},
'olympia.search.management.commands.reindex.delete_indexes': {'queue': 'adhoc'}, 'olympia.search.management.commands.reindex.delete_indexes': {'queue': 'adhoc'},