diff --git a/githubnetwork/models.py b/githubnetwork/models.py index b0ba2e0..0a2571e 100644 --- a/githubnetwork/models.py +++ b/githubnetwork/models.py @@ -93,7 +93,7 @@ class GHUser(BaseAPIModel): class Repo(BaseAPIModel): - owner = models.ForeignKey(GHUser, unique=True) + owner = models.ForeignKey(GHUser, unique=True, verbose_name='ghuser') forks = models.IntegerField() language = models.CharField(max_length=255) created_at = models.DateTimeField('date repo created') diff --git a/githubnetwork/views.py b/githubnetwork/views.py index 909fe89..385146b 100644 --- a/githubnetwork/views.py +++ b/githubnetwork/views.py @@ -1,15 +1,94 @@ +# -*- coding: utf-8 -*- from django.contrib.auth.decorators import login_required -from django.http import HttpResponseBadRequest, HttpResponse +from django.http import HttpResponse 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), 'group': 2} for follower in request.gh_user.following.all()]) + context['followers'] = simplejson.dumps( + [{'name': unicode(follower), 'group': 2} for follower in request.gh_user.following.all()]) return render_to_response('graph.html', context) + @login_required def get_user_followers(request): name = request.GET.get('user', None)