Skip to content

Commit

Permalink
Merge pull request #3219 from oddballbutler/emailForLowBounty
Browse files Browse the repository at this point in the history
Send an email if a bounty is funded below a threshold
  • Loading branch information
thelostone-mc authored Nov 6, 2019
2 parents 1118690 + 534e797 commit 61bbb8d
Show file tree
Hide file tree
Showing 4 changed files with 56 additions and 2 deletions.
2 changes: 2 additions & 0 deletions app/app/settings.py
Original file line number Diff line number Diff line change
Expand Up @@ -702,6 +702,8 @@
}]
SILKY_MAX_RECORDED_REQUESTS_CHECK_PERCENT = env.int('SILKY_MAX_RECORDED_REQUESTS_CHECK_PERCENT', default=10)

# Sending an email when a bounty is funded below a threshold
LOWBALL_BOUNTY_THRESHOLD = env.float('LOWBALL_BOUNTY_THRESHOLD', default=10.00)

# Gitcoin Bounty Funding Fee settings
FEE_ADDRESS = env('FEE_ADDRESS', default='')
Expand Down
23 changes: 22 additions & 1 deletion app/dashboard/helpers.py
Original file line number Diff line number Diff line change
Expand Up @@ -38,7 +38,7 @@
)
from dashboard.notifications import (
maybe_market_to_email, maybe_market_to_github, maybe_market_to_slack, maybe_market_to_user_discord,
maybe_market_to_user_slack,
maybe_market_to_user_slack, notify_of_lowball_bounty,
)
from dashboard.tokens import addr_to_token
from economy.utils import ConversionRateNotFoundError, convert_amount
Expand Down Expand Up @@ -832,6 +832,19 @@ def record_user_action(event_name, old_bounty, new_bounty):
})


def is_lowball_bounty(bounty_value_usdt):
"""Determine if a bounty value is less than a threshold
Args:
bounty_value_usdt (Decimal): The value of the bounty
Returns:
bool: True if bounty value is less than the threshold
"""
return bounty_value_usdt < settings.LOWBALL_BOUNTY_THRESHOLD


def process_bounty_changes(old_bounty, new_bounty):
"""Process Bounty changes.
Expand Down Expand Up @@ -884,6 +897,14 @@ def process_bounty_changes(old_bounty, new_bounty):
if new_bounty.fulfillments.exists():
profile_pairs = build_profile_pairs(new_bounty)

# Send an Email if this is a LowBall bounty
try:
if(not old_bounty or old_bounty.value_in_usdt != new_bounty.value_in_usdt):
if is_lowball_bounty(new_bounty.value_in_usdt):
notify_of_lowball_bounty(new_bounty)
except Exception as e:
logger.error(f'{e} during check for Lowball Bounty')

# marketing
if event_name != 'unknown_event':
print("============ posting ==============")
Expand Down
26 changes: 26 additions & 0 deletions app/dashboard/notifications.py
Original file line number Diff line number Diff line change
Expand Up @@ -27,6 +27,7 @@
from django.templatetags.static import static
from django.utils import timezone, translation
from django.utils.translation import gettext
from django.utils.translation import gettext_lazy as _

import requests
import twitter
Expand All @@ -42,6 +43,31 @@
logger = logging.getLogger(__name__)


def notify_of_lowball_bounty(bounty):
"""Send an email to [email protected] with the lowball bounty info
Args:
bounty (dashboard.models.Bounty): The lowball bounty object
"""
to_email = '[email protected]'
from_email = settings.CONTACT_EMAIL
cur_language = translation.get_language()
try:
setup_lang(to_email)
subject = _("Low Bounty Notification")
body = \
f"Bounty: {bounty}\n\n" \
f"url: {bounty.url}\n\n" \
f"Owner Name: {bounty.bounty_owner_name}\n\n" \
f"Owner Email: {bounty.bounty_owner_email}\n\n" \
f"Owner Address: {bounty.bounty_owner_address}\n\n" \
f"Owner Profile: {bounty.bounty_owner_profile}"
send_mail(from_email, to_email, subject, body, from_name=_("No Reply from Gitcoin.co"), categories=['admin'], )
finally:
translation.activate(cur_language)


def github_org_to_twitter_tags(github_org):
"""Build a string of github organization twitter tags.
Expand Down
7 changes: 6 additions & 1 deletion app/dashboard/tests/test_dashboard_helpers.py
Original file line number Diff line number Diff line change
Expand Up @@ -21,11 +21,12 @@
from datetime import date, datetime, timedelta
from unittest.mock import patch

from django.conf import settings
from django.test.client import RequestFactory

import pytz
import requests_mock
from dashboard.helpers import amount, issue_details, normalize_url, process_bounty_details
from dashboard.helpers import amount, is_lowball_bounty, issue_details, normalize_url, process_bounty_details
from dashboard.models import Bounty
from economy.models import ConversionRate
from marketing.mails import featured_funded_bounty
Expand All @@ -52,6 +53,10 @@ def test_amount(self):
request = self.factory.get('/sync/get_amount', params)
assert amount(request).content == b'{"eth": 5.0, "usdt": 10.0}'

def test_lowball_bounty(self):
assert is_lowball_bounty(settings.LOWBALL_BOUNTY_THRESHOLD - 1.0)
assert not is_lowball_bounty(settings.LOWBALL_BOUNTY_THRESHOLD)

def test_normalize_url(self):
"""Test the dashboard helper normalize_url method."""
assert normalize_url('https://gitcoin.co/') == 'https://gitcoin.co'

0 comments on commit 61bbb8d

Please sign in to comment.