rogueojiiofwales/githubnetwork/views.py
2012-08-19 03:36:09 +02:00

99 lines
3.5 KiB
Python

# -*- coding: utf-8 -*-
from django.contrib.auth.decorators import login_required
from django.http import HttpResponse, HttpResponseBadRequest
from django.shortcuts import render_to_response
from django.template.context import RequestContext
from django.utils import simplejson
from django.utils.decorators import method_decorator
from django.views.generic.detail import DetailView
from ghapi import api
from models import GHUser
class Graph(object):
def __init__(self):
self.nodes = set()
self.edges = {}
self.distances = {}
def add_node(self, value):
self.nodes.add(value)
def add_edge(self, from_node, to_node, distance):
self._add_edge(from_node, to_node, distance)
self._add_edge(to_node, from_node, distance)
def _add_edge(self, from_node, to_node, distance):
self.edges.setdefault(from_node, [])
self.edges[from_node].append(to_node)
self.distances[(from_node, to_node)] = distance
class NetworkView(DetailView):
def get_user(self):
self.user = GHUser.objects.get(username=self.kwargs.get('username'))
return self.user
def get_user_network(self):
user = self.get_user()
graph = []
def get_repo_network(self):
user = self.get_user()
graph = []
for repo in api.get_iter('user/%s/repos' % user):
# TODO: (Lynn) this is messy - clean up
links = {}
repo_info = api.get('repos/%s/%s' % (user, repo))
parent = repo_info['parent']['owner']['login']
child = repo_info['owner']['login']
watchers = repo_info['parent']['watchers']
network = repo_info['network_count']
date_updated_parent = repo_info['parent']['updated_at']
date_updated_child = repo_info['updated_at']
links['source'] = parent
links['target'] = child
links['weight'] = {'watchers': watchers, 'network': network,
'date_updated_parent': date_updated_parent,
'date_updated_child': date_updated_child}
graph.append(links)
return graph
def get_queryset(self):
self.get_user()
if repos:
# do repo-y things
self.get_repo_network()
else:
# do user-y things
self.get_user_network()
def get_context_data(self, **kwargs):
# TODO: (Lynn) figure out what's needed for context data
context_object_name = self.get_context_object_name(queryset)
def get(self):
self.object_list = self.get_queryset()
context = self.get_context_data(object_list=self.object_list)
return self.render_to_response(context)
@method_decorator(login_required)
def dispatch(self, *args, ** kwargs):
return super(ProtectedView, self).dispatch(*args, **kwargs)
@login_required
def me(request):
context = RequestContext(request)
context['followers'] = simplejson.dumps(
[{'name': unicode(follower), 'avatar': follower.avatar_url} for follower in GHUser.objects.filter(following=request.gh_user)])
return render_to_response('me.html', context)
@login_required
def get_user_followers(request):
name = request.GET.get('user', None)
if not name:
raise HttpResponseBadRequest()
names = simplejson.dumps([user['login'] for user in request.github.get_iter('users/%s/followers' % name)])
return HttpResponse(names, content_type='application/json')