Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Add forward to legal option in reviewer tools #22886

Merged
merged 10 commits into from
Dec 11, 2024
27 changes: 25 additions & 2 deletions src/olympia/abuse/actions.py
Original file line number Diff line number Diff line change
Expand Up @@ -322,13 +322,36 @@ class ContentActionRejectVersionDelayed(ContentActionRejectVersion):
reporter_appeal_template_path = 'abuse/emails/reporter_appeal_takedown_delayed.txt'


class ContentActionEscalateAddon(ContentAction):
class ContentActionForwardToReviewers(ContentAction):
valid_targets = (Addon,)

def process_action(self):
from olympia.abuse.tasks import handle_escalate_action

handle_escalate_action.delay(job_pk=self.decision.cinder_job.pk)
handle_escalate_action.delay(job_pk=self.decision.originating_job.pk)


class ContentActionForwardToLegal(ContentAction):
valid_targets = (Addon,)

def process_action(self):
from olympia.abuse.cinder import CinderAddonHandledByLegal
from olympia.abuse.models import CinderJob

old_job = getattr(self.decision, 'cinder_job', None)
entity_helper = CinderAddonHandledByLegal(self.decision.addon)
job_id = entity_helper.workflow_recreate(notes=self.decision.notes, job=old_job)

if old_job:
old_job.handle_job_recreated(new_job_id=job_id)
else:
CinderJob.objects.update_or_create(
job_id=job_id,
defaults={
'resolvable_in_reviewer_tools': False,
'target_addon': self.decision.addon,
},
)


class ContentActionDeleteCollection(ContentAction):
Expand Down
31 changes: 22 additions & 9 deletions src/olympia/abuse/cinder.py
Original file line number Diff line number Diff line change
Expand Up @@ -210,12 +210,13 @@ def post_report(self, *, job):
a keyword argument."""
pass

def workflow_recreate(self, *, job):
def workflow_recreate(self, *, notes, job=None):
"""Recreate a job in a queue."""
raise NotImplementedError

def workflow_move(self, *, job):
"""Move job to a different queue."""
def post_queue_move(self, *, job):
"""Callback triggered after a job has moved to, or been created in, a different
queue."""
raise NotImplementedError


Expand Down Expand Up @@ -410,6 +411,17 @@ def get_context_generator(self):
],
}

def workflow_recreate(self, *, notes, job=None):
"""Recreate a job in a queue."""
job_id = self.report(report=None, reporter=None, message=notes)
if job:
self.post_queue_move(job=job)
return job_id

def post_queue_move(self, *, job):
# We don't need to do anything for, or after, the move, by default
pass


class CinderRating(CinderEntity):
type = 'amo_rating'
Expand Down Expand Up @@ -594,18 +606,19 @@ def appeal(self, *args, **kwargs):
self.flag_for_human_review(related_versions=related_versions, appeal=True)
return super().appeal(*args, **kwargs)

def workflow_recreate(self, *, job):
self.workflow_move(job=job)
notes = job.decision.notes if job.decision else ''
return self.report(report=None, reporter=None, message=notes)

def workflow_move(self, *, job):
def post_queue_move(self, *, job):
# When the move is to AMO reviewers we need to flag versions for review
reported_versions = set(
job.abusereport_set.values_list('addon_version', flat=True)
)
self.flag_for_human_review(related_versions=reported_versions, forwarded=True)


class CinderAddonHandledByLegal(CinderAddon):
queue = 'legal-escalations'
queue_appeal = 'legal-escalations'


class CinderReport(CinderEntity):
type = 'amo_report'

Expand Down
19 changes: 19 additions & 0 deletions src/olympia/abuse/migrations/0046_contentdecision_override_of.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,19 @@
# Generated by Django 4.2.16 on 2024-12-03 12:47

from django.db import migrations, models
import django.db.models.deletion


class Migration(migrations.Migration):

dependencies = [
('abuse', '0045_auto_20241120_1503'),
]

operations = [
migrations.AddField(
model_name='contentdecision',
name='override_of',
field=models.OneToOneField(null=True, on_delete=django.db.models.deletion.SET_NULL, related_name='overridden_by', to='abuse.contentdecision'),
),
]
Loading
Loading