aboutsummaryrefslogtreecommitdiff
path: root/dev_status/views.py
blob: c656d2b276ea538b8544c7745f57b6fc555ad304 (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
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 "updated"
    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
                    }}
                }}
            }}
        }}
    }}
    """.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"]}
        for repo in data["data"]["user"]["repositories"]["edges"]
    ]
    total_count = data["data"]["user"]["repositories"]["totalCount"]

    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)