mirror of
https://github.com/djohnlewis/stackdump
synced 2025-04-07 10:13:27 +00:00
User details are now retrieved and shown on the results page.
This commit is contained in:
parent
68e5e17f74
commit
5078e7369f
python/src/stackdump
@ -14,7 +14,7 @@ except ImportError:
|
|||||||
|
|
||||||
from bottle import route, run, static_file, debug, abort, request, redirect
|
from bottle import route, run, static_file, debug, abort, request, redirect
|
||||||
from jinja2 import Environment, PackageLoader
|
from jinja2 import Environment, PackageLoader
|
||||||
from sqlobject import sqlhub, connectionForURI, AND, OR, SQLObjectNotFound
|
from sqlobject import sqlhub, connectionForURI, AND, OR, IN, SQLObjectNotFound
|
||||||
from pysolr import Solr
|
from pysolr import Solr
|
||||||
import iso8601
|
import iso8601
|
||||||
|
|
||||||
@ -246,6 +246,7 @@ def search():
|
|||||||
rows=rows_per_page,
|
rows=rows_per_page,
|
||||||
sort=sort_args[sort_by])
|
sort=sort_args[sort_by])
|
||||||
decode_json_fields(results)
|
decode_json_fields(results)
|
||||||
|
retrieve_users(results, question_only=True, ignore_comments=True)
|
||||||
|
|
||||||
context = { }
|
context = { }
|
||||||
context['site_root_path'] = ''
|
context['site_root_path'] = ''
|
||||||
@ -285,6 +286,7 @@ def site_search(site_key):
|
|||||||
# perform search
|
# perform search
|
||||||
results = solr_conn().search(query, start=page*rows_per_page, rows=rows_per_page)
|
results = solr_conn().search(query, start=page*rows_per_page, rows=rows_per_page)
|
||||||
decode_json_fields(results)
|
decode_json_fields(results)
|
||||||
|
retrieve_users(results)
|
||||||
|
|
||||||
# TODO: scrub this first to avoid HTML injection attacks?
|
# TODO: scrub this first to avoid HTML injection attacks?
|
||||||
context['query'] = query
|
context['query'] = query
|
||||||
@ -365,6 +367,109 @@ def decode_json_fields(obj):
|
|||||||
# remove the JSON string from the dict-object
|
# remove the JSON string from the dict-object
|
||||||
del o[k]
|
del o[k]
|
||||||
|
|
||||||
|
def retrieve_users(results, question_only=False, ignore_comments=False):
|
||||||
|
'''\
|
||||||
|
Retrieves the user objects associated with the question objects.
|
||||||
|
'''
|
||||||
|
# get a list of all the user IDs
|
||||||
|
user_ids_by_site = { }
|
||||||
|
for r in results:
|
||||||
|
site_name = r['siteName']
|
||||||
|
if site_name not in user_ids_by_site.keys():
|
||||||
|
user_ids_by_site[site_name] = set()
|
||||||
|
|
||||||
|
# the search result object itself
|
||||||
|
for k in r.keys():
|
||||||
|
if k.lower().endswith('userid'):
|
||||||
|
user_ids_by_site[site_name].add(r[k])
|
||||||
|
|
||||||
|
# the question object
|
||||||
|
question = r['question']
|
||||||
|
for k in question.keys():
|
||||||
|
if k.lower().endswith('userid'):
|
||||||
|
user_ids_by_site[site_name].add(question[k])
|
||||||
|
|
||||||
|
comments = question.get('comments')
|
||||||
|
if not ignore_comments and comments:
|
||||||
|
for c in comments:
|
||||||
|
for ck in c.keys():
|
||||||
|
if ck.lower().endswith('userid'):
|
||||||
|
user_ids_by_site[site_name].add(c[ck])
|
||||||
|
|
||||||
|
# the answers
|
||||||
|
answers = r.get('answers')
|
||||||
|
if not question_only and answers:
|
||||||
|
for a in answers:
|
||||||
|
for k in a.keys():
|
||||||
|
if k.lower().endswith('userid'):
|
||||||
|
user_ids_by_site[site_name].add(a[k])
|
||||||
|
|
||||||
|
comments = a.get('comments')
|
||||||
|
if not ignore_comments and comments:
|
||||||
|
for c in comments:
|
||||||
|
for ck in c.keys():
|
||||||
|
if ck.lower().endswith('userid'):
|
||||||
|
user_ids_by_site[site_name].add(c[ck])
|
||||||
|
|
||||||
|
# retrieve the user objects from the database by site
|
||||||
|
users_by_site = { }
|
||||||
|
for site_name in user_ids_by_site.keys():
|
||||||
|
site = Site.select(Site.q.name == site_name).getOne()
|
||||||
|
user_objects = User.select(AND(User.q.site == site,
|
||||||
|
IN(User.q.sourceId, list(user_ids_by_site[site_name]))
|
||||||
|
))
|
||||||
|
|
||||||
|
# convert results into a dict with user id as the key
|
||||||
|
users = { }
|
||||||
|
for u in user_objects:
|
||||||
|
users[u.sourceId] = u
|
||||||
|
|
||||||
|
users_by_site[site_name] = users
|
||||||
|
|
||||||
|
# place user objects into the dict
|
||||||
|
for r in results:
|
||||||
|
site_name = r['siteName']
|
||||||
|
|
||||||
|
# the search result object itself
|
||||||
|
for k in r.keys():
|
||||||
|
if k.lower().endswith('userid'):
|
||||||
|
# use the same field name, minus the 'Id' on the end.
|
||||||
|
r[k[:-2]] = users_by_site[site_name].get(r[k])
|
||||||
|
|
||||||
|
# the question object
|
||||||
|
question = r['question']
|
||||||
|
for k in question.keys():
|
||||||
|
if k.lower().endswith('userid'):
|
||||||
|
# use the same field name, minus the 'Id' on the end.
|
||||||
|
question[k[:-2]] = users_by_site[site_name].get(question[k])
|
||||||
|
|
||||||
|
comments = question.get('comments')
|
||||||
|
if not ignore_comments and comments:
|
||||||
|
for c in comments:
|
||||||
|
for ck in c.keys():
|
||||||
|
if ck.lower().endswith('userid'):
|
||||||
|
# use the same field name, minus the 'Id' on the end.
|
||||||
|
c[ck[:-2]] = users_by_site[site_name].get(c[ck])
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
# the answers
|
||||||
|
answers = r.get('answers')
|
||||||
|
if not question_only and answers:
|
||||||
|
for a in answers:
|
||||||
|
for k in a.keys():
|
||||||
|
if k.lower().endswith('userid'):
|
||||||
|
# use the same field name, minus the 'Id' on the end.
|
||||||
|
a[k[:-2]] = users_by_site[site_name].get(a[k])
|
||||||
|
|
||||||
|
comments = a.get('comments')
|
||||||
|
if not ignore_comments and comments:
|
||||||
|
for c in comments:
|
||||||
|
for ck in c.keys():
|
||||||
|
if ck.lower().endswith('userid'):
|
||||||
|
# use the same field name, minus the 'Id' on the end.
|
||||||
|
c[ck[:-2]] = users_by_site[site_name].get(c[ck])
|
||||||
|
|
||||||
# END VIEW HELPERS
|
# END VIEW HELPERS
|
||||||
|
|
||||||
# INITIALISATION
|
# INITIALISATION
|
||||||
|
@ -41,7 +41,7 @@
|
|||||||
<h3><a href="#">{{ r.question.title }}</a></h3>
|
<h3><a href="#">{{ r.question.title }}</a></h3>
|
||||||
<p>{{ r.question.body|striptags|truncate(256) }}</p>
|
<p>{{ r.question.body|striptags|truncate(256) }}</p>
|
||||||
<p class="post-details">
|
<p class="post-details">
|
||||||
Asked by <strong>{{ r.question.ownerUserId }}</strong> on
|
Asked by <strong>{{ r.question.ownerUser.displayName }}</strong> on
|
||||||
<strong>{{ r.question.creationDate|format_datetime }}</strong>.
|
<strong>{{ r.question.creationDate|format_datetime }}</strong>.
|
||||||
</p>
|
</p>
|
||||||
<div class="post-tags">
|
<div class="post-tags">
|
||||||
|
Loading…
x
Reference in New Issue
Block a user