aboutsummaryrefslogtreecommitdiff
path: root/dev_status/views.py
blob: 97a3890c24e610d039e23e79131ee16c55decd72 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
import math
import os

import requests
from django.shortcuts import render
from dotenv import load_dotenv
from github import Github

load_dotenv()
g = Github(os.getenv("GH_TOKEN"))


# Create your views here.
def home(request):
    page = request.GET.get("page") or 1
    items = request.GET.get("items") or 10
    sort = request.GET.get("sort") or "pushed"
    direction = request.GET.get("direction") or "desc"
    search = request.GET.get("search") or ""
    context = {}
    sort_map = {
        "updated": "UPDATED_AT",
        "stars": "STARGAZERS",
        "pushed": "PUSHED_AT",
        "created": "CREATED_AT",
        "name": "NAME",
    }
    direction_map = {"desc": "DESC", "asc": "ASC"}

    # make request to github api to get page of repos and total count of repos
    url = "https://api.github.com/graphql"
    headers = {"Authorization": "token " + os.getenv("GH_TOKEN")}
    user = "luciferreeves"

    query = """
    query {{
        user(login: "{user}") {{
            repositories(
                first: 100
                orderBy: {{field: {sort}, direction: {direction}}}
                ownerAffiliations: OWNER
                privacy: PUBLIC
            ) {{
                totalCount
                edges {{
                    node {{
                        name
                        description
                        forkCount
                        homepageUrl
                        isArchived
                        isFork
                        licenseInfo {{
                            name
                        }}
                        pushedAt
                        stargazerCount
                    }}
                }}
            }}
        }}
    }}
    """.format(
        user=user, sort=sort_map[sort], direction=direction_map[direction]
    )
    data = requests.post(url, json={"query": query}, headers=headers).json()
    repos = [
        {"name": repo["node"]["name"], "description": repo["node"]["description"], "forkCount": repo["node"]["forkCount"], "homepageUrl": repo["node"]["homepageUrl"], "isArchived": repo["node"]["isArchived"], "isFork": repo["node"]["isFork"], "licenseInfo": repo["node"]["licenseInfo"], "pushedAt": repo["node"]["pushedAt"], "stargazerCount": repo["node"]["stargazerCount"]}
        for repo in data["data"]["user"]["repositories"]["edges"]
    ]
    total_count = data["data"]["user"]["repositories"]["totalCount"]

    # convert pushedAt to date
    for repo in repos:
        repo["pushedAt"] = repo["pushedAt"].split("T")[0]


    context["search"] = search
    if search:
        context["repos"] = [
            repo
            for repo in repos
            if search.lower() in repo["name"].lower()
            or search.lower() in repo["description"].lower()
        ]
        context["total_count"] = len(context["repos"])
    else:
        context["repos"] = repos
        context["total_count"] = total_count

    # calculate pagination
    context["page"] = int(page)
    context["items"] = int(items)
    context["sort"] = sort
    context["direction"] = direction
    context["num_pages"] = math.ceil(context["total_count"] / context["items"])
    context["repos"] = context["repos"][
        (context["page"] - 1) * context["items"] : context["page"] * context["items"]
    ]

    return render(request, "dev_status/home.html", context)


def get_repo(request, r="thatcomputerscientist", p=None):
    repository = "luciferreeves/{}".format(r)
    parent = None
    if p and not len(p.split("/")) == 0:
        parent = "/".join(p.split("/")[:-1])
    contents = g.get_repo(repository).get_contents(p or "")
    context = {}
    try:
        files = []
        while contents:
            file_content = contents.pop(0)
            files.append(file_content)
        context["title"] = "Tree - {}".format(p)
        context["files"] = files
        context["parent"] = parent
        context["repo"] = r
    except:
        context["title"] = "File - {}".format(p)
        context["file"] = contents.html_url
        context["parent"] = parent
        context["repo"] = r
    finally:
        return render(request, "dev_status/repo.html", context)