From 8f53f6847b6fd15fab16cc54d9e04cf7b9d7c552 Mon Sep 17 00:00:00 2001 From: Lynn Root Date: Sat, 18 Aug 2012 09:54:19 -0700 Subject: [PATCH 1/4] minor changes --- githubnetwork/models.py | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/githubnetwork/models.py b/githubnetwork/models.py index 8a71213..3ad076f 100644 --- a/githubnetwork/models.py +++ b/githubnetwork/models.py @@ -1,8 +1,9 @@ +# -*- coding: utf-8 -*- from django.db import models from django.contrib.auth.models import User class GHUser(models.Model): - user = models.ForeignKey(User, unique=True) + user = models.ForeignKey(User, unique=True, verbose_name='ghuser') following = models.ManyToMany(self, related_name='followers') created_at = models.DateTimeField('date account created') acct_type = models.CharField(max_length=255) @@ -28,7 +29,7 @@ class GHUser(models.Model): return self.login class Repo(models.Model): - 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') From df1fdd2643d35318c73c029ea3fbbda72f9d0515 Mon Sep 17 00:00:00 2001 From: Lynn Root Date: Sat, 18 Aug 2012 09:54:43 -0700 Subject: [PATCH 2/4] scaffolding for views --- githubnetwork/views.py | 50 ++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 50 insertions(+) diff --git a/githubnetwork/views.py b/githubnetwork/views.py index e69de29..722c298 100644 --- a/githubnetwork/views.py +++ b/githubnetwork/views.py @@ -0,0 +1,50 @@ +# -*- coding: utf-8 -*- +from collections import defaultdict + +from django.contrib.auth.decorators import login_required +from django.http import HttpResponse, Http404, HttpResponseForbidden +from django.shortcuts import render_to_response, redirect +from django.template.context import RequestContext +from django.utils.decorators import method_decorator +from django.views.generic.base import TemplateView, TemplateResponseMixin +from django.views.generic.detail import DetailView +from django.views.generic.edit import CreateView, ModelFormMixin, FormView +from django.views.generic.list import ListView + +from django.contrib.auth.models import User +from models import GHUser, Repo + + +class Graph(object): + def __init__(self): + self.nodes = set() + self.edges = defaultdict(list) + self.distances = {} + + def add_node(self, value): + self.nodes.add(value) + + def add_edge(self, from_node, to_node, distance): + self.edges[from_node].append(to_node) + self.edges[to_node].append(from_node) + self.distances[(from_node, to_node)] = distance + + +class UserNetworkView(DetailView): + context_object_name = 'ghuser' + model = GHUser + + def get_user(self): + self.user = User.objects.get(username=self.kwargs.get('username')) + self.person = self.user.get_profile() + return self.person + + def get(self): + self.object_list = self.get_queryset() + context = self.get_context_data(object_list=self.object_list) + context.update({'user': self.user}) + return self.render_to_response(context) + + @method_decorator(login_required) + def dispatch(self, *args. **kwargs): + return super(ProtectedView, self).dispatch(*args, **kwargs) \ No newline at end of file From 5d370e36d0c07cb722b3b688ff99c6ffcdaa4d7e Mon Sep 17 00:00:00 2001 From: Lynn Root Date: Sat, 18 Aug 2012 10:08:27 -0700 Subject: [PATCH 3/4] updated scaffolding --- githubnetwork/views.py | 51 ++++++++++++++++++++++++++++++++++-------- 1 file changed, 42 insertions(+), 9 deletions(-) diff --git a/githubnetwork/views.py b/githubnetwork/views.py index 722c298..af02d18 100644 --- a/githubnetwork/views.py +++ b/githubnetwork/views.py @@ -18,31 +18,64 @@ from models import GHUser, Repo class Graph(object): def __init__(self): self.nodes = set() - self.edges = defaultdict(list) + 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.edges[to_node].append(from_node) self.distances[(from_node, to_node)] = distance -class UserNetworkView(DetailView): - context_object_name = 'ghuser' - model = GHUser +class NetworkView(DetailView): + #example list of edges + # nodes just in a list +[ + {'from': 'node1', + 'to' : 'node2', + 'distance' : 'weight'}, +] + + def create_graph(self, nodes, edges): + graph = Graph() + graph.nodes = set(nodes) + for edge in edges: + graph.add_edge(edge['from'], edge['to'], edge['distance']) + return graph + def get_user(self): self.user = User.objects.get(username=self.kwargs.get('username')) self.person = self.user.get_profile() - return self.person + return + + def get_repos(self): + self.repos = Repo.objects.get(user=self.get_user()) + return repos + + def get_queryset(self): + self.get_user() + if self.get_repos: + + + + def get_context_data(self, **kwargs): + queryset = kwargs.pop('object_list') + page_size = self.get_paginate_by(queryset) + 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) - context.update({'user': self.user}) + context.update({'xxx': 'what should go here'}) return self.render_to_response(context) @method_decorator(login_required) From 221b3d637b627181aa34eb5e2d331d4b1838e7e2 Mon Sep 17 00:00:00 2001 From: Lynn Root Date: Sat, 18 Aug 2012 11:56:39 -0700 Subject: [PATCH 4/4] parsing of repo graph --- githubnetwork/views.py | 63 +++++++++++++++++++++++------------------- 1 file changed, 34 insertions(+), 29 deletions(-) diff --git a/githubnetwork/views.py b/githubnetwork/views.py index af02d18..f2a5acb 100644 --- a/githubnetwork/views.py +++ b/githubnetwork/views.py @@ -12,6 +12,7 @@ from django.views.generic.edit import CreateView, ModelFormMixin, FormView from django.views.generic.list import ListView from django.contrib.auth.models import User +from ghapi import api from models import GHUser, Repo @@ -35,47 +36,51 @@ class Graph(object): class NetworkView(DetailView): - #example list of edges - # nodes just in a list -[ - {'from': 'node1', - 'to' : 'node2', - 'distance' : 'weight'}, -] - - def create_graph(self, nodes, edges): - graph = Graph() - graph.nodes = set(nodes) - for edge in edges: - graph.add_edge(edge['from'], edge['to'], edge['distance']) - return graph - - def get_user(self): - self.user = User.objects.get(username=self.kwargs.get('username')) - self.person = self.user.get_profile() - return + self.user = GHUser.objects.get(username=self.kwargs.get('username')) + return self.user - def get_repos(self): - self.repos = Repo.objects.get(user=self.get_user()) - return repos + 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 self.get_repos: - - + 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): - queryset = kwargs.pop('object_list') - page_size = self.get_paginate_by(queryset) + # 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) - context.update({'xxx': 'what should go here'}) return self.render_to_response(context) @method_decorator(login_required)