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)