def handle(self, *args, **options): num_days_back_to_warn = 3 num_days_back_to_delete_interest = 7 days = [i * 3 for i in range(1, 15)] if settings.DEBUG: days = range(1, 1000) for day in days: interests = Interest.objects.filter( created__gte=(timezone.now() - timezone.timedelta(days=(day+1))), created__lt=(timezone.now() - timezone.timedelta(days=day)), ).all() print('day {} got {} interests'.format(day, interests.count())) for interest in interests: for bounty in Bounty.objects.filter(interested=interest, current_bounty=True, idx_status__in=['open', 'started', 'submitted']): print("{} is interested in {}".format(interest, bounty)) try: owner = org_name(bounty.github_url) repo = repo_name(bounty.github_url) issue_num = issue_number(bounty.github_url) comments = get_issue_comments(owner, repo, issue_num) comments_by_interested_party = [comment for comment in comments if comment['user']['login'] == interest.profile.handle] should_warn_user = False should_delete_interest = False last_heard_from_user_days = None if len(comments_by_interested_party) == 0: should_warn_user = True should_delete_interest = False else: # example format: 2018-01-26T17:56:31Z' time_format = '%Y-%m-%dT%H:%M:%SZ' last_comment_by_user = datetime.strptime(comments_by_interested_party[0]['created_at'], time_format) delta_now_vs_last_comment = datetime.now() - last_comment_by_user last_heard_from_user_days = delta_now_vs_last_comment.days should_warn_user = last_heard_from_user_days >= num_days_back_to_warn should_delete_interest = last_heard_from_user_days >= num_days_back_to_delete_interest if should_delete_interest: print('executing should_delete_interest for {}'.format(interest.pk)) bounty_startwork_expired(interest.profile.email, bounty, interest, last_heard_from_user_days) interest.delete() elif should_warn_user: print('executing should_warn_user for {}'.format(interest.pk)) bounty_startwork_expire_warning(interest.profile.email, bounty, interest, last_heard_from_user_days) except Exception as e: print(e)
def handle(self, *args, **options): if settings.DEBUG: print('not running start work expiration because DEBUG is on') return num_days_back_to_warn = 3 num_days_back_to_delete_interest = 10 days = [i * 3 for i in range(1, 15)] if settings.DEBUG: days = range(1, 1000) for day in days: interests = Interest.objects.filter( created__gte=(timezone.now() - timezone.timedelta(days=(day+1))), created__lt=(timezone.now() - timezone.timedelta(days=day)), ) print(f'day {day} got {interests.count()} interests') for interest in interests: bounties = Bounty.objects.filter( interested=interest, current_bounty=True, network='mainnet', idx_status__in=['open', 'started'] ) for bounty in bounties: print("===========================================") print(f"{interest} is interested in {bounty.pk} / {bounty.github_url}") try: actions = get_interested_actions( bounty.github_url, interest.profile.handle, interest.profile.email) should_warn_user = False should_delete_interest = False last_heard_from_user_days = None if not actions: should_warn_user = True should_delete_interest = False print(" - no actions") else: # example format: 2018-01-26T17:56:31Z' action_times = [datetime.strptime(action['created_at'], '%Y-%m-%dT%H:%M:%SZ') for action in actions if action.get('created_at')] last_action_by_user = max(action_times) # if user hasn't commented since they expressed interest, handled this condition # per https://github.com/gitcoinco/web/issues/462#issuecomment-368384384 if last_action_by_user < interest.created.replace(tzinfo=None): last_action_by_user = interest.created.replace(tzinfo=None) # some small calcs delta_now_vs_last_action = datetime.now() - last_action_by_user last_heard_from_user_days = delta_now_vs_last_action.days # decide action params should_warn_user = last_heard_from_user_days >= num_days_back_to_warn should_delete_interest = last_heard_from_user_days >= num_days_back_to_delete_interest print(f"- its been {last_heard_from_user_days} days since we heard from the user") if should_delete_interest: print(f'executing should_delete_interest for {interest.profile} / {bounty.github_url} ') # commenting on the GH issue maybe_notify_user_removed_github(bounty, interest.profile.handle, last_heard_from_user_days) # commenting in slack maybe_notify_bounty_user_removed_to_slack(bounty, interest.profile.handle) # send email bounty_startwork_expired(interest.profile.email, bounty, interest, last_heard_from_user_days) interest.delete() elif should_warn_user: print(f'executing should_warn_user for {interest.profile} / {bounty.github_url} ') # commenting on the GH issue maybe_warn_user_removed_github(bounty, interest.profile.handle) # commenting in slack maybe_notify_bounty_user_warned_removed_to_slack(bounty, interest.profile.handle, last_heard_from_user_days) # send email bounty_startwork_expire_warning(interest.profile.email, bounty, interest, last_heard_from_user_days) except Exception as e: print(f'Exception in expiration_start_work.handle(): {e}')
def handle(self, *args, **options): if settings.DEBUG: print('not running start work expiration because DEBUG is on') return # TODO: DRY with dashboard/notifications.py num_days_back_to_warn = 3 num_days_back_to_delete_interest = 6 num_days_back_to_ignore_bc_mods_got_it = 9 days = [i * 3 for i in range(1, 15)] days.reverse() if settings.DEBUG: days = range(1, 1000) for day in days: start_date = (timezone.now() - timezone.timedelta(days=(day + 1))) end_date = (timezone.now() - timezone.timedelta(days=day)) interests = Interest.objects.select_related("profile").filter( Q(created__gte=start_date, created__lt=end_date) | Q(acceptance_date__gte=start_date, acceptance_date__lt=end_date), pending=False).distinct('pk') print(f'day {day} got {interests.count()} interests') for interest in interests: if interest.acceptance_date: interest_day_0 = interest.acceptance_date bounties = Bounty.objects.current().filter( interested=interest, project_type='traditional', network='mainnet', idx_status__in=['open', 'started'], permission_type='approval', ) else: interest_day_0 = interest.created bounties = Bounty.objects.current().filter( interested=interest, project_type='traditional', network='mainnet', idx_status__in=['open', 'started'], permission_type='permissionless', ) for bounty in bounties: print("===========================================") print( f"{interest} is interested in {bounty.pk} / {bounty.github_url}" ) try: actions = get_interested_actions( bounty.github_url, interest.profile.handle, interest.profile.email) should_warn_user = False should_delete_interest = False should_ignore = False last_heard_from_user_days = None if not actions: should_warn_user = True should_delete_interest = False last_heard_from_user_days = (timezone.now() - interest_day_0).days print(" - no actions") else: # example format: 2018-01-26T17:56:31Z' action_times = [ datetime.strptime(action['created_at'], '%Y-%m-%dT%H:%M:%SZ') for action in actions if action.get('created_at') ] last_action_by_user = max(action_times).replace( tzinfo=pytz.UTC) # if user hasn't commented since they expressed interest, handled this condition # per https://github.com/gitcoinco/web/issues/462#issuecomment-368384384 if last_action_by_user.replace() < interest_day_0: last_action_by_user = interest_day_0 # some small calcs snooze_time = timezone.timedelta( days=bounty.snooze_warnings_for_days) delta_now_vs_last_action = timezone.now( ) - snooze_time - last_action_by_user last_heard_from_user_days = delta_now_vs_last_action.days # decide action params should_warn_user = last_heard_from_user_days >= num_days_back_to_warn should_delete_interest = last_heard_from_user_days >= num_days_back_to_delete_interest should_ignore = last_heard_from_user_days >= num_days_back_to_ignore_bc_mods_got_it print( f"- its been {last_heard_from_user_days} days since we heard from the user" ) if should_ignore: print( f'executing should_ignore for {interest.profile} / {bounty.github_url} ' ) elif should_delete_interest: print( f'executing should_delete_interest for {interest.profile} / {bounty.github_url} ' ) interest = interest.mark_for_review() record_user_action_on_interest( interest, 'bounty_abandonment_escalation_to_mods', last_heard_from_user_days) # commenting on the GH issue maybe_notify_user_escalated_github( bounty, interest.profile.handle, last_heard_from_user_days) # commenting in slack maybe_notify_bounty_user_escalated_to_slack( bounty, interest.profile.handle, last_heard_from_user_days) # send email bounty_startwork_expired( interest.profile.email, bounty, interest, last_heard_from_user_days) elif should_warn_user: record_user_action_on_interest( interest, 'bounty_abandonment_warning', last_heard_from_user_days) print( f'executing should_warn_user for {interest.profile} / {bounty.github_url} ' ) # commenting on the GH issue maybe_warn_user_removed_github( bounty, interest.profile.handle, last_heard_from_user_days) # commenting in slack maybe_notify_bounty_user_warned_removed_to_slack( bounty, interest.profile.handle, last_heard_from_user_days) # send email bounty_startwork_expire_warning( interest.profile.email, bounty, interest, last_heard_from_user_days) except Exception as e: print( f'Exception in expiration_start_work.handle(): {e}' )
def handle(self, *args, **options): num_days_back_to_warn = 3 num_days_back_to_delete_interest = 7 days = [i * 3 for i in range(1, 15)] if settings.DEBUG: days = range(1, 1000) for day in days: interests = Interest.objects.filter( created__gte=(timezone.now() - timezone.timedelta(days=(day + 1))), created__lt=(timezone.now() - timezone.timedelta(days=day)), ).all() print('day {} got {} interests'.format(day, interests.count())) for interest in interests: for bounty in Bounty.objects.filter( interested=interest, current_bounty=True, idx_status__in=['open', 'started']): print("{} is interested in {}".format(interest, bounty)) try: owner = org_name(bounty.github_url) repo = repo_name(bounty.github_url) issue_num = issue_number(bounty.github_url) comments = get_issue_comments(owner, repo, issue_num) comments_by_interested_party = [ comment for comment in comments if comment['user'] ['login'] == interest.profile.handle ] should_warn_user = False should_delete_interest = False last_heard_from_user_days = None if len(comments_by_interested_party) == 0: should_warn_user = True should_delete_interest = False else: # example format: 2018-01-26T17:56:31Z' comment_times = [ datetime.strptime(comment['created_at'], '%Y-%m-%dT%H:%M:%SZ') for comment in comments_by_interested_party ] last_comment_by_user = max(comment_times) # if user hasn't commented since they expressed interest, handled this condition # per https://github.com/gitcoinco/web/issues/462#issuecomment-368384384 if last_comment_by_user < interest.created_at.replace( tzinfo=None): last_comment_by_user = interest.created_at.replace( tzinfo=None) # some small calcs delta_now_vs_last_comment = datetime.now( ) - last_comment_by_user last_heard_from_user_days = delta_now_vs_last_comment.days # decide action params should_warn_user = last_heard_from_user_days >= num_days_back_to_warn should_delete_interest = last_heard_from_user_days >= num_days_back_to_delete_interest print( f"- its been {last_heard_from_user_days} days since we heard from the user" ) if should_delete_interest: print('executing should_delete_interest for {}'. format(interest.pk)) bounty_startwork_expired( interest.profile.email, bounty, interest, last_heard_from_user_days) interest.delete() elif should_warn_user: print('executing should_warn_user for {}'.format( interest.pk)) bounty_startwork_expire_warning( interest.profile.email, bounty, interest, last_heard_from_user_days) except Exception as e: print(e)