Skip to content

Commit

Permalink
Add OOPSpam and Akismet metrics to spam report
Browse files Browse the repository at this point in the history
  • Loading branch information
Uditi Mehta authored and Uditi Mehta committed Oct 21, 2024
1 parent 0fc98f4 commit 0095797
Show file tree
Hide file tree
Showing 7 changed files with 195 additions and 0 deletions.
24 changes: 24 additions & 0 deletions osf/external/askismet/client.py
Original file line number Diff line number Diff line change
Expand Up @@ -133,3 +133,27 @@ def submit_ham(self, user_ip, user_agent, **kwargs):
)
if res.status_code != requests.codes.ok:
raise AkismetClientError(reason=res.text)

def get_flagged_count(self, start_date, end_date):
from osf.models import NodeLog

flagged_count = NodeLog.objects.filter(
action=NodeLog.FLAG_SPAM,
created__gt=start_date,
created__lt=end_date,
spam_data__who_flagged='akismet'
).count()

return flagged_count

def get_hammed_count(self, start_date, end_date):
from osf.models import NodeLog

hammed_count = NodeLog.objects.filter(
action=NodeLog.CONFIRM_HAM,
created__gt=start_date,
created__lt=end_date,
spam_data__who_flagged='akismet'
).count()

return hammed_count
24 changes: 24 additions & 0 deletions osf/external/oopspam/client.py
Original file line number Diff line number Diff line change
Expand Up @@ -45,3 +45,27 @@ def check_content(self, user_ip, content, **kwargs):

# OOPSpam returns a spam score out of 6. 3 or higher indicates spam
return spam_score >= settings.OOPSPAM_SPAM_LEVEL, resp_json

def get_flagged_count(self, start_date, end_date):
from osf.models import NodeLog

flagged_count = NodeLog.objects.filter(
action=NodeLog.FLAG_SPAM,
created__gt=start_date,
created__lt=end_date,
spam_data__who_flagged='oopspam'
).count()

return flagged_count

def get_hammed_count(self, start_date, end_date):
from osf.models import NodeLog

hammed_count = NodeLog.objects.filter(
action=NodeLog.CONFIRM_HAM,
created__gt=start_date,
created__lt=end_date,
spam_data__who_flagged='oopspam'
).count()

return hammed_count
15 changes: 15 additions & 0 deletions osf/metrics/reporters/spam_count.py
Original file line number Diff line number Diff line change
Expand Up @@ -4,6 +4,8 @@
from ._base import MonthlyReporter
from osf.models import PreprintLog, NodeLog
from osf.models.spam import SpamStatus
from osf.external.oopspam.client import OOPSpamClient
from osf.external.askismet.client import AkismetClient


class SpamCountReporter(MonthlyReporter):
Expand All @@ -12,6 +14,15 @@ def report(self, report_yearmonth):
target_month = report_yearmonth.target_month()
next_month = report_yearmonth.next_month()

oopspam_client = OOPSpamClient()
akismet_client = AkismetClient()

oopspam_flagged = oopspam_client.get_flagged_count(target_month, next_month)
oopspam_hammed = oopspam_client.get_hammed_count(target_month, next_month)

akismet_flagged = akismet_client.get_flagged_count(target_month, next_month)
akismet_hammed = akismet_client.get_hammed_count(target_month, next_month)

report = SpamSummaryReport(
report_yearmonth=str(report_yearmonth),
# Node Log entries
Expand All @@ -33,6 +44,10 @@ def report(self, report_yearmonth):
created__lt=next_month,
node__type='osf.node',
).count(),
oopspam_flagged=oopspam_flagged,
oopspam_hammed=oopspam_hammed,
akismet_flagged=akismet_flagged,
akismet_hammed=akismet_hammed,
# Registration Log entries
registration_confirmed_spam=NodeLog.objects.filter(
action=NodeLog.CONFIRM_SPAM,
Expand Down
4 changes: 4 additions & 0 deletions osf/metrics/reports.py
Original file line number Diff line number Diff line change
Expand Up @@ -214,3 +214,7 @@ class SpamSummaryReport(MonthlyReport):
preprint_flagged = metrics.Integer()
user_marked_as_spam = metrics.Integer()
user_marked_as_ham = metrics.Integer()
oopspam_flagged = metrics.Integer()
oopspam_hammed = metrics.Integer()
akismet_flagged = metrics.Integer()
akismet_hammed = metrics.Integer()
43 changes: 43 additions & 0 deletions osf_tests/external/akismet/test_akismet.py
Original file line number Diff line number Diff line change
Expand Up @@ -237,3 +237,46 @@ def test_meetings_skip_spam_check(self, mock_akismet, user, node_in_conference,
node.check_spam(user, {'title'}, request_headers)
node.refresh_from_db()
assert node.spam_status == SpamStatus.FLAGGED

@mock.patch('osf.models.NodeLog.objects.filter')
def test_get_flagged_count(self, mock_filter, user):
from osf.external.askismet.client import AkismetClient
from datetime import datetime

mock_filter.return_value.count.return_value = 7

client = AkismetClient()
start_date = datetime(2024, 10, 1)
end_date = datetime(2024, 10, 31)

flagged_count = client.get_flagged_count(start_date, end_date)

mock_filter.assert_called_with(
action='flag_spam',
created__gt=start_date,
created__lt=end_date,
spam_data__who_flagged='akismet'
)
assert flagged_count == 7

@mock.patch('osf.models.NodeLog.objects.filter')
def test_get_hammed_count(self, mock_filter, user):
from osf.external.askismet.client import AkismetClient
from datetime import datetime

mock_filter.return_value.count.return_value = 4

client = AkismetClient()
start_date = datetime(2024, 10, 1)
end_date = datetime(2024, 10, 31)

hammed_count = client.get_hammed_count(start_date, end_date)

mock_filter.assert_called_with(
action='confirm_ham',
created__gt=start_date,
created__lt=end_date,
spam_data__who_flagged='akismet'
)
assert hammed_count == 4

42 changes: 42 additions & 0 deletions osf_tests/external/oopspam/test_oopspam.py
Original file line number Diff line number Diff line change
Expand Up @@ -125,3 +125,45 @@ def test_do_spam_check_false(self, mock_oopspam, user, request_headers):
)

assert user.spam_status == SpamStatus.UNKNOWN

@mock.patch('osf.models.NodeLog.objects.filter')
def test_get_flagged_count(self, mock_filter, user):
from osf.external.oopspam.client import OOPSpamClient
from datetime import datetime

mock_filter.return_value.count.return_value = 5

client = OOPSpamClient()
start_date = datetime(2024, 10, 1)
end_date = datetime(2024, 10, 31)

flagged_count = client.get_flagged_count(start_date, end_date)

mock_filter.assert_called_with(
action='flag_spam',
created__gt=start_date,
created__lt=end_date,
spam_data__who_flagged='oopspam'
)
assert flagged_count == 5

@mock.patch('osf.models.NodeLog.objects.filter')
def test_get_hammed_count(self, mock_filter, user):
from osf.external.oopspam.client import OOPSpamClient
from datetime import datetime

mock_filter.return_value.count.return_value = 3

client = OOPSpamClient()
start_date = datetime(2024, 10, 1)
end_date = datetime(2024, 10, 31)

hammed_count = client.get_hammed_count(start_date, end_date)

mock_filter.assert_called_with(
action='confirm_ham',
created__gt=start_date,
created__lt=end_date,
spam_data__who_flagged='oopspam'
)
assert hammed_count == 3
43 changes: 43 additions & 0 deletions osf_tests/metrics/test_spam_count_reporter.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,43 @@
import datetime
import pytest
from osf.metrics.reporters.spam_count import SpamCountReporter
from osf.external.oopspam.client import OOPSpamClient
from osf.external.askismet.client import AkismetClient

@pytest.fixture
def mock_oopspam_client(mocker):
mock = mocker.patch('osf.external.oopspam.client.OOPSpamClient')
mock.get_flagged_count.return_value = 10
mock.get_hammed_count.return_value = 5
return mock

@pytest.fixture
def mock_akismet_client(mocker):
mock = mocker.patch('osf.external.askismet.client.AkismetClient')
mock.get_flagged_count.return_value = 20
mock.get_hammed_count.return_value = 10
return mock

@pytest.fixture
def mock_nodelog_model(mocker):
mock = mocker.patch('osf.models.NodeLog')
mock.filter.return_value.count.return_value = 100
return mock

@pytest.fixture
def mock_preprintlog_model(mocker):
mock = mocker.patch('osf.models.PreprintLog')
mock.filter.return_value.count.return_value = 50
return mock

def test_spam_count_reporter(mock_oopspam_client, mock_akismet_client, mock_nodelog_model, mock_preprintlog_model):
report_month = datetime.datetime(2024, 10, 1)
reporter = SpamCountReporter()
report = reporter.report(report_month)

assert report[0].oopspam_flagged == 10
assert report[0].oopspam_hammed == 5
assert report[0].akismet_flagged == 20
assert report[0].akismet_hammed == 10
assert report[0].node_confirmed_spam == 100
assert report[0].preprint_confirmed_spam == 50

0 comments on commit 0095797

Please sign in to comment.