mirror of
https://github.com/Eugeny/tabby-web.git
synced 2025-06-08 05:29:52 +00:00
88 lines
2.4 KiB
Python
88 lines
2.4 KiB
Python
from django.conf import settings
|
|
from django.core.cache import cache
|
|
from gql import Client, gql
|
|
from gql.transport.requests import RequestsHTTPTransport
|
|
from social_django.models import UserSocialAuth
|
|
|
|
from .models import User
|
|
|
|
|
|
GQL_ENDPOINT = "https://api.github.com/graphql"
|
|
CACHE_KEY = "cached-sponsors:%s"
|
|
|
|
|
|
def check_is_sponsor(user: User) -> bool:
|
|
try:
|
|
token = user.social_auth.get(provider="github").extra_data.get("access_token")
|
|
except UserSocialAuth.DoesNotExist:
|
|
return False
|
|
|
|
if not token:
|
|
return False
|
|
|
|
client = Client(
|
|
transport=RequestsHTTPTransport(
|
|
url=GQL_ENDPOINT,
|
|
use_json=True,
|
|
headers={
|
|
"Authorization": f"Bearer {token}",
|
|
},
|
|
)
|
|
)
|
|
|
|
after = None
|
|
|
|
while True:
|
|
params = "first: 1"
|
|
if after:
|
|
params += f', after:"{after}"'
|
|
|
|
query = """
|
|
query {
|
|
viewer {
|
|
sponsorshipsAsSponsor(%s) {
|
|
pageInfo {
|
|
startCursor
|
|
hasNextPage
|
|
endCursor
|
|
}
|
|
totalRecurringMonthlyPriceInDollars
|
|
nodes {
|
|
sponsorable {
|
|
... on Organization { login }
|
|
... on User { login }
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
""" % (
|
|
params,
|
|
)
|
|
|
|
response = client.execute(gql(query))
|
|
info = response["viewer"]["sponsorshipsAsSponsor"]
|
|
after = info["pageInfo"]["endCursor"]
|
|
nodes = info["nodes"]
|
|
if not len(nodes):
|
|
break
|
|
for node in nodes:
|
|
if (
|
|
node["sponsorable"]["login"].lower()
|
|
not in settings.GITHUB_ELIGIBLE_SPONSORSHIPS
|
|
):
|
|
continue
|
|
if (
|
|
info["totalRecurringMonthlyPriceInDollars"] >= settings.GITHUB_SPONSORS_MIN_PAYMENT
|
|
):
|
|
return True
|
|
|
|
return False
|
|
|
|
|
|
def check_is_sponsor_cached(user: User) -> bool:
|
|
cache_key = CACHE_KEY % user.id
|
|
if not cache.get(cache_key):
|
|
cache.set(cache_key, check_is_sponsor(user), timeout=30)
|
|
return cache.get(cache_key)
|