-
Notifications
You must be signed in to change notification settings - Fork 0
/
views.py
112 lines (80 loc) · 3.72 KB
/
views.py
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
# Create your views here.
from django.template import Context, loader
from profiles.models import *
from profiles.forms import SearchForm
from django.http import HttpResponse
from django.shortcuts import render_to_response, get_object_or_404
from django.core.cache import cache
from django.template import RequestContext
from django.utils.html import strip_tags
from django.db.models import Q
from django.core import serializers
import datetime
import json
import search
def render_json(request, data):
return render_to_response('json.html', {'json': json.dumps(data)}, context_instance=RequestContext(request), mimetype='application/json')
def prepare_resource_json(resource):
return json.loads(serializers.serialize("json", [resource]))[0]
#return {'id': resource.id, 'name': resource.name, 'uri': resource.uri}
def rest_profile(request, profile_id):
profile = get_object_or_404(Person, pk=profile_id)
connections = Relation.objects.filter(Q(source=profile)|Q(target=profile)).select_related()
following = []
followers = []
for relation in connections:
if relation.source == profile:
following.append(relation.target)
else:
followers.append(relation.source)
groups = profile.groups.exclude(name='')
meta = PersonMeta.objects.filter(person=profile)
abstract = ''
for m in meta:
if m.meta_name == 'abstract':
abstract = json.loads(m.meta_value)
c = prepare_resource_json(profile)
c['following'] = [prepare_resource_json(f) for f in following]
c['followers'] = [prepare_resource_json(f) for f in followers]
c['groups'] = [prepare_resource_json(g) for g in groups]
c['meta'] = [{'key': m.meta_name, 'value': json.loads(m.meta_value)} for m in meta]
c['abstract'] = abstract
# TODO: here we should add a decorator mechanism or something similar for applications to add their information
c['works'] = [prepare_resource_json(w) for w in profile.work_set.exclude(name='')]
c['quotes'] = [prepare_resource_json(w) for w in profile.quote_set.all()]
return render_json(request, c)
def rest_category(request, category_id):
group = get_object_or_404(Category, pk=category_id)
members = group.person_set.exclude(name='')
json_serializer = serializers.get_serializer("json")
c = prepare_resource_json(group)
c['members'] = json.loads(serializers.serialize("json", members))
return render_json(request, c)
def rest_search(request):
results = {'query': '', 'results': []}
if request.method == 'GET':
form = SearchForm(request.GET)
if form.is_valid():
query = form.cleaned_data['query'].strip() + '*'
hits = search.perform_search(query)
results['query'] = form.cleaned_data['query']
if hits:
results['results'].extend(hits)
return render_json(request, results['results'])
def rest_explore(request):
results = {
'query': '',
'users': []
}
if request.method == 'GET':
form = SearchForm(request.GET)
if form.is_valid():
query = form.cleaned_data['query'].strip() + '*'
hits = search.perform_search(query + ' type:profile', limit=100, include_surrogates=True)
results['query'] = form.cleaned_data['query']
if hits:
results['users'].extend(hits)
for user in results['users']:
user['categories'] = [c.name for c in Category.objects.filter(person__pk=user['id'])]
user['connections'] = Relation.objects.filter(Q(source=user['id'])|Q(target=user['id'])).count()
return render_json(request, results)