Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
- Loading branch information
1 parent
5b76aaf
commit 599fec5
Showing
19 changed files
with
366 additions
and
14 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
20 changes: 20 additions & 0 deletions
20
djangoproject/gh_frespo_integration/migrations/0001_initial.py
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,20 @@ | ||
# -*- coding: utf-8 -*- | ||
import datetime | ||
from south.db import db | ||
from south.v2 import SchemaMigration | ||
from django.db import models | ||
|
||
|
||
class Migration(SchemaMigration): | ||
|
||
def forwards(self, orm): | ||
pass | ||
|
||
def backwards(self, orm): | ||
pass | ||
|
||
models = { | ||
|
||
} | ||
|
||
complete_apps = ['gh_frespo_integration'] |
118 changes: 118 additions & 0 deletions
118
...egration/migrations/0002_auto__add_issuealreadycommented__add_repo__add_userrepoconfig.py
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,118 @@ | ||
# -*- coding: utf-8 -*- | ||
import datetime | ||
from south.db import db | ||
from south.v2 import SchemaMigration | ||
from django.db import models | ||
|
||
|
||
class Migration(SchemaMigration): | ||
|
||
def forwards(self, orm): | ||
# Adding model 'IssueAlreadyCommented' | ||
db.create_table('gh_frespo_integration_issuealreadycommented', ( | ||
('id', self.gf('django.db.models.fields.AutoField')(primary_key=True)), | ||
('repo', self.gf('django.db.models.fields.related.ForeignKey')(to=orm['gh_frespo_integration.Repo'])), | ||
('number', self.gf('django.db.models.fields.IntegerField')()), | ||
)) | ||
db.send_create_signal('gh_frespo_integration', ['IssueAlreadyCommented']) | ||
|
||
# Adding model 'Repo' | ||
db.create_table('gh_frespo_integration_repo', ( | ||
('id', self.gf('django.db.models.fields.AutoField')(primary_key=True)), | ||
('owner', self.gf('django.db.models.fields.CharField')(max_length=256)), | ||
('owner_type', self.gf('django.db.models.fields.CharField')(max_length=32)), | ||
('name', self.gf('django.db.models.fields.CharField')(max_length=256)), | ||
('gh_id', self.gf('django.db.models.fields.CharField')(max_length=32)), | ||
('createdByUser', self.gf('django.db.models.fields.related.ForeignKey')(to=orm['auth.User'])), | ||
('creationDate', self.gf('django.db.models.fields.DateTimeField')()), | ||
)) | ||
db.send_create_signal('gh_frespo_integration', ['Repo']) | ||
|
||
# Adding model 'UserRepoConfig' | ||
db.create_table('gh_frespo_integration_userrepoconfig', ( | ||
('id', self.gf('django.db.models.fields.AutoField')(primary_key=True)), | ||
('user', self.gf('django.db.models.fields.related.ForeignKey')(to=orm['auth.User'])), | ||
('repo', self.gf('django.db.models.fields.related.ForeignKey')(to=orm['gh_frespo_integration.Repo'])), | ||
('add_links', self.gf('django.db.models.fields.BooleanField')(default=False)), | ||
('new_only', self.gf('django.db.models.fields.BooleanField')(default=False)), | ||
('creationDate', self.gf('django.db.models.fields.DateTimeField')()), | ||
)) | ||
db.send_create_signal('gh_frespo_integration', ['UserRepoConfig']) | ||
|
||
|
||
def backwards(self, orm): | ||
# Deleting model 'IssueAlreadyCommented' | ||
db.delete_table('gh_frespo_integration_issuealreadycommented') | ||
|
||
# Deleting model 'Repo' | ||
db.delete_table('gh_frespo_integration_repo') | ||
|
||
# Deleting model 'UserRepoConfig' | ||
db.delete_table('gh_frespo_integration_userrepoconfig') | ||
|
||
|
||
models = { | ||
'auth.group': { | ||
'Meta': {'object_name': 'Group'}, | ||
'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), | ||
'name': ('django.db.models.fields.CharField', [], {'unique': 'True', 'max_length': '80'}), | ||
'permissions': ('django.db.models.fields.related.ManyToManyField', [], {'to': "orm['auth.Permission']", 'symmetrical': 'False', 'blank': 'True'}) | ||
}, | ||
'auth.permission': { | ||
'Meta': {'ordering': "('content_type__app_label', 'content_type__model', 'codename')", 'unique_together': "(('content_type', 'codename'),)", 'object_name': 'Permission'}, | ||
'codename': ('django.db.models.fields.CharField', [], {'max_length': '100'}), | ||
'content_type': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['contenttypes.ContentType']"}), | ||
'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), | ||
'name': ('django.db.models.fields.CharField', [], {'max_length': '50'}) | ||
}, | ||
'auth.user': { | ||
'Meta': {'object_name': 'User'}, | ||
'date_joined': ('django.db.models.fields.DateTimeField', [], {'default': 'datetime.datetime.now'}), | ||
'email': ('django.db.models.fields.EmailField', [], {'max_length': '75', 'blank': 'True'}), | ||
'first_name': ('django.db.models.fields.CharField', [], {'max_length': '30', 'blank': 'True'}), | ||
'groups': ('django.db.models.fields.related.ManyToManyField', [], {'to': "orm['auth.Group']", 'symmetrical': 'False', 'blank': 'True'}), | ||
'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), | ||
'is_active': ('django.db.models.fields.BooleanField', [], {'default': 'True'}), | ||
'is_staff': ('django.db.models.fields.BooleanField', [], {'default': 'False'}), | ||
'is_superuser': ('django.db.models.fields.BooleanField', [], {'default': 'False'}), | ||
'last_login': ('django.db.models.fields.DateTimeField', [], {'default': 'datetime.datetime.now'}), | ||
'last_name': ('django.db.models.fields.CharField', [], {'max_length': '30', 'blank': 'True'}), | ||
'password': ('django.db.models.fields.CharField', [], {'max_length': '128'}), | ||
'user_permissions': ('django.db.models.fields.related.ManyToManyField', [], {'to': "orm['auth.Permission']", 'symmetrical': 'False', 'blank': 'True'}), | ||
'username': ('django.db.models.fields.CharField', [], {'unique': 'True', 'max_length': '30'}) | ||
}, | ||
'contenttypes.contenttype': { | ||
'Meta': {'ordering': "('name',)", 'unique_together': "(('app_label', 'model'),)", 'object_name': 'ContentType', 'db_table': "'django_content_type'"}, | ||
'app_label': ('django.db.models.fields.CharField', [], {'max_length': '100'}), | ||
'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), | ||
'model': ('django.db.models.fields.CharField', [], {'max_length': '100'}), | ||
'name': ('django.db.models.fields.CharField', [], {'max_length': '100'}) | ||
}, | ||
'gh_frespo_integration.issuealreadycommented': { | ||
'Meta': {'object_name': 'IssueAlreadyCommented'}, | ||
'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), | ||
'number': ('django.db.models.fields.IntegerField', [], {}), | ||
'repo': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['gh_frespo_integration.Repo']"}) | ||
}, | ||
'gh_frespo_integration.repo': { | ||
'Meta': {'object_name': 'Repo'}, | ||
'createdByUser': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['auth.User']"}), | ||
'creationDate': ('django.db.models.fields.DateTimeField', [], {}), | ||
'gh_id': ('django.db.models.fields.CharField', [], {'max_length': '32'}), | ||
'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), | ||
'name': ('django.db.models.fields.CharField', [], {'max_length': '256'}), | ||
'owner': ('django.db.models.fields.CharField', [], {'max_length': '256'}), | ||
'owner_type': ('django.db.models.fields.CharField', [], {'max_length': '32'}) | ||
}, | ||
'gh_frespo_integration.userrepoconfig': { | ||
'Meta': {'object_name': 'UserRepoConfig'}, | ||
'add_links': ('django.db.models.fields.BooleanField', [], {'default': 'False'}), | ||
'creationDate': ('django.db.models.fields.DateTimeField', [], {}), | ||
'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), | ||
'new_only': ('django.db.models.fields.BooleanField', [], {'default': 'False'}), | ||
'repo': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['gh_frespo_integration.Repo']"}), | ||
'user': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['auth.User']"}) | ||
} | ||
} | ||
|
||
complete_apps = ['gh_frespo_integration'] |
Empty file.
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,46 @@ | ||
from django.db import models | ||
from django.contrib.auth.models import User | ||
from django.utils import timezone | ||
|
||
class Repo(models.Model): | ||
owner = models.CharField(max_length=256) | ||
owner_type = models.CharField(max_length=32) | ||
name = models.CharField(max_length=256) | ||
gh_id = models.CharField(max_length=32) | ||
createdByUser = models.ForeignKey(User) | ||
creationDate = models.DateTimeField() | ||
|
||
USER = "USER" | ||
ORG = "ORG" | ||
|
||
@classmethod | ||
def newRepo(cls, owner, owner_type, name, gh_id, createdByUser): | ||
repo = cls() | ||
repo.owner = owner | ||
repo.owner_type = owner_type | ||
repo.name = name | ||
repo.gh_id = gh_id | ||
repo.createdByUser = createdByUser | ||
repo.creationDate = timezone.now() | ||
return repo | ||
|
||
class UserRepoConfig(models.Model): | ||
user = models.ForeignKey(User) | ||
repo = models.ForeignKey(Repo) | ||
add_links = models.BooleanField() | ||
new_only = models.BooleanField() | ||
creationDate = models.DateTimeField() | ||
|
||
@classmethod | ||
def newConfig(cls, user, repo): | ||
config = cls() | ||
config.user = user | ||
config.repo = repo | ||
config.add_links = False | ||
config.new_only = False | ||
config.creationDate = timezone.now() | ||
return config | ||
|
||
class IssueAlreadyCommented(models.Model): | ||
repo = models.ForeignKey(Repo) | ||
number = models.IntegerField() |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1 @@ | ||
__author__ = 'tony' |
63 changes: 63 additions & 0 deletions
63
djangoproject/gh_frespo_integration/services/github_services.py
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,63 @@ | ||
from gh_frespo_integration.utils import github_adapter | ||
from gh_frespo_integration.models import * | ||
import logging | ||
|
||
__author__ = 'tony' | ||
|
||
logger = logging.getLogger(__name__) | ||
|
||
def get_repos_and_configs(user): | ||
repos = [] | ||
github_username = user.github_username() | ||
if github_username: | ||
repos = github_adapter.fetch_repos(github_username) | ||
for repo_dict in repos: | ||
gh_id = repo_dict['id'] | ||
repodb = get_repodb_by_githubid(gh_id) | ||
if repodb: | ||
user_repo_config = get_repo_config_by_repo_and_user(repodb, user) | ||
if user_repo_config: | ||
repo_dict['add_links'] = user_repo_config.add_links | ||
repo_dict['new_only'] = user_repo_config.new_only | ||
return repos | ||
|
||
def get_repodb_by_githubid(gh_id): | ||
repos = Repo.objects.filter(gh_id = gh_id) | ||
if repos.count() > 1: | ||
logger.error('Database inconsistency: multiple repos found with gh_id:%s'%gh_id) | ||
elif repos.count() == 1: | ||
return repos[0] | ||
else: | ||
return None | ||
|
||
def get_repo_config_by_repo_and_user(repo, user): | ||
configs = UserRepoConfig.objects.filter(repo__id = repo.id, user__id = user.id) | ||
if configs.count() > 1: | ||
logger.error('Database inconsistency: multiple configs found for repo:%s / user:%s'%(repo.id, user.id)) | ||
elif configs.count() == 1: | ||
return configs[0] | ||
else: | ||
return None | ||
|
||
def update_user_configs(user, dict): | ||
github_username = user.github_username() | ||
if github_username: | ||
repos = github_adapter.fetch_repos(github_username) | ||
my_repo_ids = [] | ||
for repo_dict in repos: | ||
gh_id = repo_dict['id'] | ||
repodb = get_repodb_by_githubid(gh_id) | ||
if not repodb: | ||
owner = repo_dict['owner']['login'] | ||
owner_type = repo_dict['owner']['type'] | ||
name = repo_dict['name'] | ||
repodb = Repo.newRepo(owner, owner_type, name, gh_id, user) | ||
repodb.save() | ||
config = get_repo_config_by_repo_and_user(repodb, user) | ||
if not config: | ||
config = UserRepoConfig.newConfig(user, repodb) | ||
config.add_links = dict.has_key('check_addlink_%s' % gh_id) | ||
config.new_only = dict.has_key('check_newonly_%s' % gh_id) | ||
config.save() | ||
my_repo_ids.append(gh_id) | ||
UserRepoConfig.objects.filter(user__id = user.id).exclude(repo__gh_id__in = my_repo_ids).delete() |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -1 +1 @@ | ||
from test_github_adapter import * | ||
from test_github_adapter import * |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,9 @@ | ||
from django.conf.urls import patterns, include, url | ||
from django.views.generic import TemplateView | ||
from django.conf import settings | ||
|
||
urlpatterns = patterns('gh_frespo_integration.views.main_views', | ||
url(r'^configure/$', 'configure'), | ||
url(r'^configure/submit/$', 'configure_submit'), | ||
) | ||
|
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Empty file.
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,18 @@ | ||
from django.template import RequestContext | ||
from django.shortcuts import render_to_response, redirect | ||
from gh_frespo_integration.services import github_services | ||
from django.contrib.auth.decorators import login_required | ||
|
||
@login_required | ||
def configure(request): | ||
repos = github_services.get_repos_and_configs(request.user) | ||
return render_to_response('github/configure.html', | ||
{"repos" : repos}, | ||
context_instance = RequestContext(request)) | ||
|
||
@login_required | ||
def configure_submit(request): | ||
github_services.update_user_configs(request.user, request.POST) | ||
return redirect('/github/configure') | ||
|
||
|
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -1,2 +1,4 @@ | ||
./manage.py migrate core | ||
./manage.py migrate emailmgr | ||
./manage.py migrate gh_frespo_integration | ||
|
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Oops, something went wrong.