BLT icon indicating copy to clipboard operation
BLT copied to clipboard

not all bounties are showing on the /bounties/payouts/ page, there should be 34, only 28 are showing

Open DonnieBLT opened this issue 9 months ago • 15 comments

https://owaspblt.org/bounties/payouts/

DonnieBLT avatar Mar 21 '25 21:03 DonnieBLT

@coderabbitai code the solution please

DonnieBLT avatar Mar 21 '25 21:03 DonnieBLT

[!TIP] For best results, initiate chat on the files or code changes.

🧩 Analysis chain

🏁 Script executed:

#!/bin/bash
# Find the main Django URL configuration to identify how routes are structured
find . -name urls.py | grep -v "__pycache__"

Length of output: 58


🏁 Script executed:

#!/bin/bash
# Check the main URL configuration to find the bounties/payouts route
cat ./blt/urls.py

Length of output: 42415


🏁 Script executed:

#!/bin/bash
# Find the BountyPayoutsView implementation
find . -type f -name "*.py" -exec grep -l "class BountyPayoutsView" {} \;

Length of output: 110


🏁 Script executed:

#!/bin/bash
# Examine the BountyPayoutsView implementation
cat ./website/views/organization.py | grep -A 50 "class BountyPayoutsView"

Length of output: 2275


🏁 Script executed:

#!/bin/bash
# Check the bounty payouts template implementation
cat ./website/templates/bounty_payouts.html

Length of output: 50581


🏁 Script executed:

#!/bin/bash
# Check the GitHubIssue model definition
grep -r "class GitHubIssue" --include="*.py" .

Length of output: 341


🏁 Script executed:

#!/bin/bash
# Let's check GitHubIssue model in more detail
cat ./website/models.py | grep -A 50 "class GitHubIssue"

Length of output: 1896


🏁 Script executed:

#!/bin/bash
# Let's search for the bch_tx_id field in the model
grep -r "bch_tx_id" --include="*.py" ./website/models.py

Length of output: 128


🏁 Script executed:

#!/bin/bash
# Let's check if there are linked pull requests related code in the model
cat ./website/models.py | grep -A 20 "linked_pull_requests"

Length of output: 765


🏁 Script executed:

#!/bin/bash
# Look at the full BountyPayoutsView implementation including any post handler for refresh_issues
cat ./website/views/organization.py | grep -A 200 "class BountyPayoutsView"

Length of output: 9092


@DonnieBLT Based on my analysis, I've identified the issue - the current code only fetches the first page of GitHub issues (max 100) when refreshing bounties, but there are likely more than 100 total issues in the repository. Here's the solution:

def github_issues_with_bounties(self, label="$5", issue_state="closed", page=1, per_page=100):
    """
    Fetch GitHub issues with a specific bounty label directly from GitHub API
    Default to closed issues instead of open, and fetch 100 per page without date limitations
    """
    cache_key = f"github_issues_{label}_{issue_state}_page_{page}"
    cached_issues = cache.get(cache_key)

    if cached_issues:
        return cached_issues, None  # Return cached issues and None for total_count

    # GitHub API endpoint - use q parameter to construct a search query for all closed issues with $5 label
    encoded_label = label.replace("$", "%24")
    query_params = f"repo:OWASP-BLT/BLT+is:issue+state:{issue_state}+label:{encoded_label}"
    url = f"https://api.github.com/search/issues?q={query_params}&page={page}&per_page={per_page}"

    headers = {}
    if settings.GITHUB_TOKEN:
        headers["Authorization"] = f"token {settings.GITHUB_TOKEN}"

    try:
        response = requests.get(url, headers=headers, timeout=10)
        if response.status_code == 200:
            data = response.json()
            issues = data.get("items", [])
            total_count = data.get("total_count", 0)

            # Cache the results for 30 minutes
            cache.set(cache_key, issues, 60 * 30)

            return issues, total_count
        else:
            # Log the error response from GitHub
            logger.error(f"GitHub API error: {response.status_code} - {response.text[:200]}")
            return [], 0
    except Exception as e:
        logger.error(f"Error fetching GitHub issues: {str(e)}")
        return [], 0

def post(self, request, *args, **kwargs):
    """Handle POST requests for refreshing issues or processing payments"""
    # Import timezone here to make it available to all actions in the method
    from django.utils import timezone

    action = request.POST.get("action")

    if action == "refresh_issues":
        # Staff permission check for refreshing issues
        if not request.user.is_authenticated or not request.user.is_staff:
            messages.error(request, "You don't have permission to perform this action.")
            return redirect("bounty_payouts")

        # Fetch closed issues with $5 tag from GitHub by default
        try:
            # Import required models
            from website.models import GitHubIssue, Repo

            page = 1
            per_page = 100
            all_issues = []
            total_count = None
            count = 0
            
            # Fetch all pages of issues
            while True:
                issues, api_total_count = self.github_issues_with_bounties("$5", "closed", page=page, per_page=per_page)
                
                if total_count is None and api_total_count is not None:
                    total_count = api_total_count
                    
                if not issues:
                    break
                    
                all_issues.extend(issues)
                
                # Check if we've fetched all issues
                if len(all_issues) >= total_count or len(issues) < per_page:
                    break
                    
                page += 1

            for issue_data in all_issues:
                # Rest of the processing code remains the same
                # ... (keep all the existing issue processing code)

This updated code:

  1. Modifies github_issues_with_bounties() to return both issues and total count
  2. Updates the post() method to fetch all pages of issues by:
    • Starting with page 1
    • Continuing to fetch additional pages until either:
      • All issues (based on total_count) have been fetched
      • A page returns fewer items than requested (indicating it's the last page)

The pagination mechanism ensures all GitHub issues with $5 bounties are fetched and properly synchronized to your database, fixing the issue where only 28 out of 34 expected bounties are showing.

coderabbitai[bot] avatar Mar 21 '25 21:03 coderabbitai[bot]

/assign

vidipsingh avatar Mar 22 '25 09:03 vidipsingh

Hello @vidipsingh! You've been assigned to OWASP-BLT/BLT issue #4031. You have 24 hours to complete a pull request.

github-actions[bot] avatar Mar 22 '25 09:03 github-actions[bot]

⏰ This issue has been automatically unassigned due to 24 hours of inactivity. The issue is now available for anyone to work on again.

github-actions[bot] avatar Mar 23 '25 12:03 github-actions[bot]

the fix has to be done with the code that pulls the issues in - also add a way to add an issue one by one this will help in the time being - but this task is to fix the root cause.

DonnieBLT avatar Mar 25 '25 03:03 DonnieBLT

/assign

nitinawari avatar Mar 25 '25 03:03 nitinawari

Hello @nitinawari! You've been assigned to OWASP-BLT/BLT issue #4031. You have 24 hours to complete a pull request.

github-actions[bot] avatar Mar 25 '25 03:03 github-actions[bot]

@coderabbitai tell me what is already fixed and what has to be done

nitinawari avatar Mar 25 '25 06:03 nitinawari

[!TIP] For best results, initiate chat on the files or code changes.

🧩 Analysis chain

@nitinawari Based on my analysis of the code, here's the current status:

What needs to be fixed:

  1. Root cause issue: The current github_issues_with_bounties method only fetches the first page of GitHub issues (maximum 100 per page) without any pagination, which means if there are more than 100 issues with bounties, they won't all be displayed.

  2. No functionality exists to add GitHub issues one by one to the bounty payout system.

What has already been fixed:

  • Nothing has been fixed yet. There are no merged pull requests addressing these issues.

What needs to be done:

  1. Update the github_issues_with_bounties method to support pagination and fetch all pages of issues, not just the first 100. This was outlined in CodeRabbit's previous suggestion with the implementation of a while loop to fetch all pages.

  2. Add a new feature to allow adding individual GitHub issues to the bounty system one by one (as requested by @DonnieBLT as a temporary solution).

Are you working on implementing these changes? Would you like me to suggest specific code implementations for either of these requirements?


🏁 Script executed:

#!/bin/bash
# Check the current implementation of the BountyPayoutsView that handles fetching GitHub issues
cat ./website/views/organization.py | grep -A 150 "class BountyPayoutsView"

Length of output: 6398


🏁 Script executed:

#!/bin/bash
# Look for the github_issues_with_bounties method
cat ./website/views/organization.py | grep -A 50 "def github_issues_with_bounties"

Length of output: 4418


🏁 Script executed:

#!/bin/bash
# Check for any recent pull requests related to GitHub issue fetching or bounty payouts
gh pr list --state all --search "github issues bounty" -L 5
gh pr list --state all --search "bounty payouts" -L 5

Length of output: 896


@nitinawari Based on my analysis of the code and pull request history, here's what I found:

What's already fixed:

  • Nothing has been fixed yet related to this specific issue. There was a PR (#4033 "Add pagination to fetch all bounties") that appears to have attempted to fix this, but it was closed without being merged.

What needs to be done:

  1. Fix the root cause - Modify the GitHub issue fetching code to support pagination:

    • Update github_issues_with_bounties() to return both the issues and the total count
    • Modify the post() method with the refresh_issues action to fetch all pages of issues in a loop until all issues are retrieved
    • The current implementation only fetches a maximum of 100 issues (first page only)
  2. Add functionality for one-by-one issue addition:

    • Implement a new feature that allows adding individual GitHub issues to the bounty system
    • This would be helpful as a temporary solution while the pagination issue is fixed

Would you like me to provide specific code changes to implement these fixes?

coderabbitai[bot] avatar Mar 25 '25 06:03 coderabbitai[bot]

@coderabbitai code the solution

nitinawari avatar Mar 25 '25 17:03 nitinawari

[!TIP] For best results, initiate chat on the files or code changes.

[!TIP] The multi-step agents feature is in experimental mode.

A summary of the edits CodeRabbit can apply:

  • We are updating the refresh_issues branch in BountyPayoutsView.post to support pagination (fetching all pages of GitHub issues) and adding a new branch for handling one-by-one issue addition.

  • We are inserting a new helper method "process_single_issue" into BountyPayoutsView to support one-by-one issue addition.

  • [ ] 📋 Get copyable edits

  • [ ] 📌 Create commit in current branch

  • [ ] 🔄 Try planning different edits

coderabbitai[bot] avatar Mar 25 '25 17:03 coderabbitai[bot]

@CodeRabbit code the solution please. most probably problem with old issues not fetching

nitinawari avatar Mar 26 '25 07:03 nitinawari

[!TIP] For best results, initiate chat on the files or code changes.

[!TIP] The multi-step agents feature is in experimental mode.

A summary of the edits CodeRabbit can apply:

  • We will update the BountyPayoutsView.post method in website/views/organization.py to fix the pagination issue (so that all pages with GitHub issues are fetched) and add a new branch for the "add_issue" action to allow adding an individual GitHub issue manually.
  • We are going to add a class method fetch_github_issues to enable paginated fetching of GitHub issues and a class method add_single_github_issue to allow one-by-one issue addition in the GitHubIssue model in website/models.py.
  • We are inserting two new admin action functions (refresh_github_issues and add_single_github_issue) into website/admin.py before the GitHubIssueAdmin class definition. These functions implement the pagination fix (by looping through pages to fetch all GitHub issues with a "$5" bounty and closed state) and provide a stub for individual issue addition.
  • We are modifying the GitHubIssueAdmin class in website/admin.py to include the new admin actions for refreshing GitHub issues.
  • We will update the GitHub issue fetching logic in website/views/issue.py to fix the pagination problem—ensuring that all issues (not only the first 100) are fetched—and add functionality to add a single issue manually. In this update, we will modify the github_issues_with_bounties method to support pagination, update the post method’s "refresh_issues" action to iterate through all pages, add a new "add_issue" action to allow individual issue addition, and implement helper methods (process_single_issue and fetch_single_issue) to handle single-issue processing.
  • We will update website/forms.py to add two new forms: RefreshGitHubIssuesForm for fetching all GitHub issues (with proper pagination to fix the old issues not being fetched) and SingleGitHubIssueForm for manual one-by-one addition of GitHub issues.

A summary of the context that CodeRabbit is considering across the codebase:

  • This change addresses the root cause where only one page of GitHub issues was being fetched by implementing a loop to aggregate up to 100 issues per page, and it adds a temporary mechanism to add individual issues if needed. We verified the location of the code by searching for the “if action == "refresh_issues"” block in website/views/organization.py.

  • We noticed that the current implementation in the view layer only retrieves the first page of GitHub issues. Adding these class methods to the GitHubIssue model provides a reusable and testable way to fetch all issues via pagination and also allows a manual, one-by-one issue addition.

  • The helper functions were added based on our investigation that the current GitHub issue fetching logic only retrieves the first 100 issues. The refresh_github_issues function implements pagination by looping through pages until all available issues are fetched. The add_single_github_issue function provides a temporary one‑by‑one update mechanism for individual GitHub issues. This ensures that administrators can either refresh all issues at once or selectively update issues as needed.

  • We executed a grep search to verify the repository contains a definition for the github_issues_with_bounties function. This confirms our changes are scoped to the existing functionality already in place.

  • [ ] ✅ Create PR with these edits

  • [ ] 📋 Get copyable edits

  • [ ] 🔄 Try planning different edits

coderabbitai[bot] avatar Mar 26 '25 07:03 coderabbitai[bot]

⏰ This issue has been automatically unassigned due to 24 hours of inactivity. The issue is now available for anyone to work on again.

github-actions[bot] avatar Mar 27 '25 07:03 github-actions[bot]

/attempt

Nitish-Naik avatar Apr 24 '25 15:04 Nitish-Naik

/assign

Nitish-Naik avatar Apr 24 '25 15:04 Nitish-Naik

You cannot be assigned to this issue because you are already assigned to the following issues without an open pull request: #3822. Please submit a pull request for these issues before getting assigned to a new one.

github-actions[bot] avatar Apr 24 '25 15:04 github-actions[bot]

@DonnieBLT how can i get those $5

Nitish-Naik avatar May 05 '25 00:05 Nitish-Naik

Add GitHub sponsors to your profile or send a bch address

DonnieBLT avatar May 05 '25 00:05 DonnieBLT

@DonnieBLT added github sponsors to my profile

Nitish-Naik avatar May 05 '25 08:05 Nitish-Naik

@DonnieBLT can you pls repsond

Nitish-Naik avatar May 06 '25 09:05 Nitish-Naik

Sure, this fix didn’t work but I’ll pay it anyway. It’s currently crashing the page because it takes too long.

DonnieBLT avatar May 06 '25 14:05 DonnieBLT

Sure, this fix didn’t work but I’ll pay it anyway. It’s currently crashing the page because it takes too long.

what happenend??

Nitish-Naik avatar May 08 '25 09:05 Nitish-Naik

I believe it’s taking too long because it’s doing too many things in one operation. I think if we take out the linked pull requests it would work.

DonnieBLT avatar May 08 '25 09:05 DonnieBLT

@DonnieBLT payment

Nitish-Naik avatar May 08 '25 09:05 Nitish-Naik

Payments will be sent on the 15th, we are looking into automating the payments so they are paid as soon as the pr is merged.

DonnieBLT avatar May 10 '25 01:05 DonnieBLT

Transaction ID: ch_3RPEXVEQsq43iHhX0JBIu7JW

DonnieBLT avatar May 16 '25 03:05 DonnieBLT