From d4f4ffeb2d400235921768cea054b32ed186f70c Mon Sep 17 00:00:00 2001 From: Jack Reilly Date: Fri, 20 Jul 2012 02:03:48 -0700 Subject: [PATCH 1/4] index --- sprint/sprint/endorsenet/search_indexes.py | 15 +++++++++++++++ 1 file changed, 15 insertions(+) create mode 100644 sprint/sprint/endorsenet/search_indexes.py diff --git a/sprint/sprint/endorsenet/search_indexes.py b/sprint/sprint/endorsenet/search_indexes.py new file mode 100644 index 0000000..f52a622 --- /dev/null +++ b/sprint/sprint/endorsenet/search_indexes.py @@ -0,0 +1,15 @@ +import datetime +from haystack.indexes import * +from haystack import site +from myapp.models import Note + + +class PersonIndex(SearchIndex): + name = CharField(model_attr='name') + + def index_queryset(self): + """Used when the entire index for model is updated.""" + return Person.objects.all() + + +site.register(Note, NoteIndex) \ No newline at end of file From 48be52837599a208adc825b92f66c8de0fb139ed Mon Sep 17 00:00:00 2001 From: Jack Reilly Date: Wed, 25 Jul 2012 20:25:26 -0700 Subject: [PATCH 2/4] checking in --- sprint/sprint/endorsenet/models.py | 79 ++++++++-------------- sprint/sprint/endorsenet/search_indexes.py | 15 ---- sprint/sprint/settings.py | 7 +- sprint/sprint/urls.py | 1 + 4 files changed, 36 insertions(+), 66 deletions(-) delete mode 100644 sprint/sprint/endorsenet/search_indexes.py diff --git a/sprint/sprint/endorsenet/models.py b/sprint/sprint/endorsenet/models.py index 2bd03aa..3bb27d8 100644 --- a/sprint/sprint/endorsenet/models.py +++ b/sprint/sprint/endorsenet/models.py @@ -13,59 +13,25 @@ def __str__(self): def __unicode__(self): return self.to_string() - -class Owner(User, AutoPrint): - - def new_context(self, space, action_name, person_name): - context = Context( - space=space, - owner=self, - action_name=action_name, - person_name=person_name - ) - context.save() - return context - - def space(self): - try: - space = self.space_set.all()[0] - except Exception as e: - print e - space = self.create_space() - finally: - return space - - def create_space(self): - space = Space(owner=self) - space.save() - return space - - - def private_context(self, action_name, person_name): - return self.new_context(self.space(), action_name, person_name) - - def to_string(self): - return str(self.pk) +# created_x = new model, not saved +# saved_x = new model, saved class Space(models.Model, AutoPrint): - owner = models.ForeignKey(Owner, related_name='space_owner') - members = models.ManyToManyField(Owner) + creator = models.ForeignKey(User, related_name='space_creator') + members = models.ManyToManyField(User) def to_string(self): - return 'owner: {0}'.format(self.owner) + return 'creator: {0}'.format(self.creator) class Context(models.Model, AutoPrint): - owner = models.ForeignKey(Owner) + creator = models.ForeignKey(User) space = models.ForeignKey(Space) action_name = models.CharField(max_length=100) - person_name = models.CharField(max_length=100) + actor_name = models.CharField(max_length=100) def to_string(self): - return '{0} doing {1}'.format(self.person_name, self.action_name) - - def new_action(self, person): - return Action(context=self, person=person) + return '{0} doing {1}'.format(self.actor_name, self.action_name) def subjects(self): return self.subject_set.all() @@ -87,8 +53,9 @@ def endorsers_to_depth(self, subject, max_depth = 5): class Subject(models.Model, AutoPrint): - + creator = models.ForeignKey(User) context = models.ForeignKey(Context) + external_id models.CharField(max_length=100) def endorsers(self): return [endorsement.endorser for endorsement in self.received_endorsements()] @@ -99,11 +66,11 @@ def received_endorsements(self): def to_string(self): return str(self.pk) -class Person(models.Model, AutoPrint): - owner = models.ForeignKey(Owner) +class Actor(Subject, AutoPrint): + name = models.CharField(max_length = 100, default = 'Anonymous') def to_string(self): - return '{2} - cxt: {0}, owner: {1}'.format(self.context, self.owner, self.pk) + return '{2} - cxt: {0}, creator: {1}'.format(self.context, self.creator, self.name) def give_endorsement(self, subject, score=0): return Endorsement(endorser=self, subject=subject, score=score) @@ -115,15 +82,27 @@ def given_endorsements(self): return self.given_endorsement.all() class Endorsement(models.Model, AutoPrint): - endorser = models.ForeignKey(Person, related_name='given_endorsement') + endorser = models.ForeignKey(Actor, related_name='given_endorsement') subject = models.ForeignKey(Subject, related_name='received_endorsement') score = models.FloatField() def to_string(self): return '{0} -> {1}'.format(self.endorser, self.subject) - + class Action(Subject): - person = models.ForeignKey(Person) + actor = models.ForeignKey(Actor) + weight = models.FloatField() + status = models.BooleanField() + + def to_string(self): + return 'actor: {0}'.format(self.actor) + +class CommitEvent(models.Model): + action = models.ForeignKey(Action) def to_string(self): - return 'person: {0}'.format(self.person) + return str(self.action) + +class ActionUpdateEvent(models.Model): + action = models.ForeignKey(Action) + weight = models.FloatField() \ No newline at end of file diff --git a/sprint/sprint/endorsenet/search_indexes.py b/sprint/sprint/endorsenet/search_indexes.py deleted file mode 100644 index f52a622..0000000 --- a/sprint/sprint/endorsenet/search_indexes.py +++ /dev/null @@ -1,15 +0,0 @@ -import datetime -from haystack.indexes import * -from haystack import site -from myapp.models import Note - - -class PersonIndex(SearchIndex): - name = CharField(model_attr='name') - - def index_queryset(self): - """Used when the entire index for model is updated.""" - return Person.objects.all() - - -site.register(Note, NoteIndex) \ No newline at end of file diff --git a/sprint/sprint/settings.py b/sprint/sprint/settings.py index 6627f45..3e83d7b 100644 --- a/sprint/sprint/settings.py +++ b/sprint/sprint/settings.py @@ -114,6 +114,7 @@ WSGI_APPLICATION = 'sprint.wsgi.application' TEMPLATE_DIRS = ( + 'templates', # Put strings here, like "/home/html/django_templates" or "C:/www/django/templates". # Always use forward slashes, even on Windows. # Don't forget to use absolute paths, not relative paths. @@ -130,8 +131,8 @@ 'django.contrib.admin', # Uncomment the next line to enable admin documentation: 'django.contrib.admindocs', - 'tastypie', 'bootstrap_toolkit', + 'haystack', 'dajax', 'dajaxice', 'endorsenet', @@ -168,3 +169,7 @@ }, } } + + +HAYSTACK_SITECONF = 'sprint.search_sites' +HAYSTACK_SEARCH_ENGINE = 'simple' \ No newline at end of file diff --git a/sprint/sprint/urls.py b/sprint/sprint/urls.py index d8adefa..8a285a1 100644 --- a/sprint/sprint/urls.py +++ b/sprint/sprint/urls.py @@ -16,6 +16,7 @@ # Uncomment the admin/doc line below to enable admin documentation: url(r'^admin/doc/', include('django.contrib.admindocs.urls')), + (r'^search/', include('haystack.urls')), # Uncomment the next line to enable the admin: url(r'^admin/', include(admin.site.urls)), From b9d2e60dde0cedbfdde41333b522bd032d4f3f55 Mon Sep 17 00:00:00 2001 From: Jack Reilly Date: Wed, 25 Jul 2012 20:29:32 -0700 Subject: [PATCH 3/4] fixed bugs --- sprint/sprint/endorsenet/admin.py | 4 ++-- sprint/sprint/endorsenet/models.py | 2 +- sprint/sprint/settings.py | 7 +------ sprint/sprint/urls.py | 1 - 4 files changed, 4 insertions(+), 10 deletions(-) diff --git a/sprint/sprint/endorsenet/admin.py b/sprint/sprint/endorsenet/admin.py index bd99815..3c0c82e 100644 --- a/sprint/sprint/endorsenet/admin.py +++ b/sprint/sprint/endorsenet/admin.py @@ -1,8 +1,8 @@ from django.contrib import admin -from models import Person, Endorsement, Context, Space, Action, Owner +from models import Endorsement, Context, Space, Action, Actor, CommitEvent, ActionUpdateEvent [ admin.site.register(klass) for klass in -[Person, Endorsement, Context, Space, Action, Owner] +[Endorsement, Context, Space, Action, Actor, CommitEvent, ActionUpdateEvent] ] diff --git a/sprint/sprint/endorsenet/models.py b/sprint/sprint/endorsenet/models.py index 3bb27d8..49fa35f 100644 --- a/sprint/sprint/endorsenet/models.py +++ b/sprint/sprint/endorsenet/models.py @@ -55,7 +55,7 @@ def endorsers_to_depth(self, subject, max_depth = 5): class Subject(models.Model, AutoPrint): creator = models.ForeignKey(User) context = models.ForeignKey(Context) - external_id models.CharField(max_length=100) + external_id = models.CharField(max_length=100) def endorsers(self): return [endorsement.endorser for endorsement in self.received_endorsements()] diff --git a/sprint/sprint/settings.py b/sprint/sprint/settings.py index 3e83d7b..eecdb63 100644 --- a/sprint/sprint/settings.py +++ b/sprint/sprint/settings.py @@ -132,7 +132,6 @@ # Uncomment the next line to enable admin documentation: 'django.contrib.admindocs', 'bootstrap_toolkit', - 'haystack', 'dajax', 'dajaxice', 'endorsenet', @@ -168,8 +167,4 @@ 'propagate': True, }, } -} - - -HAYSTACK_SITECONF = 'sprint.search_sites' -HAYSTACK_SEARCH_ENGINE = 'simple' \ No newline at end of file +} \ No newline at end of file diff --git a/sprint/sprint/urls.py b/sprint/sprint/urls.py index 8a285a1..d8adefa 100644 --- a/sprint/sprint/urls.py +++ b/sprint/sprint/urls.py @@ -16,7 +16,6 @@ # Uncomment the admin/doc line below to enable admin documentation: url(r'^admin/doc/', include('django.contrib.admindocs.urls')), - (r'^search/', include('haystack.urls')), # Uncomment the next line to enable the admin: url(r'^admin/', include(admin.site.urls)), From 327115b94ccaedffd0b6847c85ea597479522be1 Mon Sep 17 00:00:00 2001 From: st3v Date: Wed, 25 Jul 2012 21:45:56 -0700 Subject: [PATCH 4/4] initial commit for Endorsenet REST API --- sprint/requirements.txt | 6 --- sprint/sprint/endorsenet/resources.py | 66 +++++++++++++++++++++++++++ sprint/sprint/endorsenet/urls.py | 23 ++++++++++ sprint/sprint/settings.py | 1 + sprint/sprint/urls.py | 5 +- 5 files changed, 94 insertions(+), 7 deletions(-) create mode 100644 sprint/sprint/endorsenet/resources.py create mode 100644 sprint/sprint/endorsenet/urls.py diff --git a/sprint/requirements.txt b/sprint/requirements.txt index b452ec4..7f39f1f 100644 --- a/sprint/requirements.txt +++ b/sprint/requirements.txt @@ -2,10 +2,4 @@ Django==1.4 -e git+https://github.com/dyve/django-bootstrap-toolkit.git@669bae64e748dee031a4db081518fecfbf5a1ed1#egg=django_bootstrap_toolkit-dev django-dajax==0.8.4 django-dajaxice==0.2 -<<<<<<< Updated upstream djangorestframework==0.3.3 -======= -django-tastypie==0.9.11 --e git+https://github.com/scholrly/neo4django@03b247d7911753a7e7bf5771a72a41137919f85e#egg=neo4django-dev ->>>>>>> Stashed changes -networkx==1.6 diff --git a/sprint/sprint/endorsenet/resources.py b/sprint/sprint/endorsenet/resources.py new file mode 100644 index 0000000..1f28992 --- /dev/null +++ b/sprint/sprint/endorsenet/resources.py @@ -0,0 +1,66 @@ +from django.core.urlresolvers import reverse +from djangorestframework.resources import ModelResource +from endorsenet.models import Space, Context, Actor, Action, Endorsement, CommitEvent, ActionUpdateEvent + +class SpaceResource(ModelResource): + """ + A Space is a container that can hold one or multiple Contexts. + """ + model = Space + + def contexts(self, instance): + return reverse('contexts', kwargs={'space': instance.key}) + + +class ContextResource(ModelResource): + """ + A Context holds one instance of an endorsenet and defines meta informations about the nodes of that network. + """ + model = Context + fields = ('action_name', 'actor_name') + + def space(self, instance): + return reverse('space', kwargs={'key': instance.space.key}) + + def actors(self, instance): + return reverse('actors', kwargs={'context': instance.key}) + + def actions(self, instance): + return reverse('actions', kwargs={'context': instance.key}) + + def endorsements(self, instance): + return reverse('endorsements', kwargs={'context': instance.key}) + + +class ActorResource(ModelResource): + """ + An Actor can be either an endorser (e.g. trustee) or an endorsee (e.g. borrower), or both. + """ + model = Actor + fields = ('external_id') + + def context(self, instance): + return reverse('context', kwargs={'key': instance.context.key}) + +class ActionResource(ModelResource): + """ + An Action belongs to an Actor (and endorsee to be more specific) and can be endorsed by other Actors (i.e. endorsees). + Actions will usually end up with outcomes that then influence the scores in the graph. + """ + model = Action + fields = ('external_id', 'context', 'actor') + + def context(self, instance): + return reverse('context', kwargs={'key': instance.context.key}) + +class EndorsementResource(ModelResource): + """ + An Endorsement is made by an Actor (endorser) to rate a particular subject. + A subject can be either another Actor (endorsee) or a particular Action. + """ + model = Endorsement + fields = ('external_id', 'subject', 'endorser', 'score') + + def context(self, instance): + return reverse('context', kwargs={'key': instance.context.key}) + diff --git a/sprint/sprint/endorsenet/urls.py b/sprint/sprint/endorsenet/urls.py new file mode 100644 index 0000000..da90ffd --- /dev/null +++ b/sprint/sprint/endorsenet/urls.py @@ -0,0 +1,23 @@ +from django.conf.urls import patterns, include, url +from django.conf import settings +from djangorestframework.views import ListOrCreateModelView, InstanceModelView +from endorsenet.resources import SpaceResource, ContextResource, ActorResource, ActionResource, EndorsementResource + +urlpatterns = patterns('', + + url(r'^spaces$', ListOrCreateModelView.as_view(resource=SpaceResource), name='space-resource-root'), + url(r'^spaces/(?P[^/]+)/$', InstanceModelView.as_view(resource=SpaceResource)), + + url(r'^spaces/(?P[^/]+)/contexts$', ListOrCreateModelView.as_view(resource=ContextResource), name='context-resource-root'), + url(r'^spaces/(?P[^/]+)/contexts/(?P[^/]+)/$', InstanceModelView.as_view(resource=ContextResource)), + + url(r'^spaces/(?P[^/]+)/contexts/(?P[^/]+)/actors$', ListOrCreateModelView.as_view(resource=ActorResource), name='actor-resource-root'), + url(r'^spaces/(?P[^/]+)/contexts/(?P[^/]+)/actors/(?P[0-9]+)/$', InstanceModelView.as_view(resource=ActorResource)), + + url(r'^spaces/(?P[^/]+)/contexts/(?P[^/]+)/actions$', ListOrCreateModelView.as_view(resource=ActionResource), name='action-resource-root'), + url(r'^spaces/(?P[^/]+)/contexts/(?P[^/]+)/actions/(?P[0-9]+)/$', InstanceModelView.as_view(resource=ActionResource)), + + url(r'^spaces/(?P[^/]+)/contexts/(?P[^/]+)/endorsements$', ListOrCreateModelView.as_view(resource=EndorsementResource), name='endorsement-resource-root'), + url(r'^spaces/(?P[^/]+)/contexts/(?P[^/]+)/endorsements/(?P[0-9]+)/$', InstanceModelView.as_view(resource=EndorsementResource)), + +) \ No newline at end of file diff --git a/sprint/sprint/settings.py b/sprint/sprint/settings.py index eecdb63..e5adfd0 100644 --- a/sprint/sprint/settings.py +++ b/sprint/sprint/settings.py @@ -136,6 +136,7 @@ 'dajaxice', 'endorsenet', 'demo', + 'djangorestframework', ) DAJAXICE_MEDIA_PREFIX="dajaxice" diff --git a/sprint/sprint/urls.py b/sprint/sprint/urls.py index d8adefa..f52fc5a 100644 --- a/sprint/sprint/urls.py +++ b/sprint/sprint/urls.py @@ -10,7 +10,6 @@ from django.views.generic.simple import redirect_to - urlpatterns = patterns('', (r'^%s/' % settings.DAJAXICE_MEDIA_PREFIX, include('dajaxice.urls')), @@ -20,4 +19,8 @@ # Uncomment the next line to enable the admin: url(r'^admin/', include(admin.site.urls)), (r'^$', redirect_to, {'url': '/demo/'}), + + url(r'^api/', include("endorsenet.urls")), + + )