def discussion_as_graph(self, discussion_id): from assembl.models import Discussion, AgentProfile local_uri = self.local_uri() discussion = Discussion.get(discussion_id) d_storage_name = self.discussion_storage_name() d_graph_iri = URIRef(self.discussion_graph_iri()) v = get_virtuoso(self.session, d_storage_name) discussion_uri = URIRef( Discussion.uri_generic(discussion_id, local_uri)) subjects = [s for (s,) in v.query( """SELECT DISTINCT ?s WHERE { ?s assembl:in_conversation %s }""" % (discussion_uri.n3()))] subjects.append(discussion_uri) participant_ids = list(discussion.get_participants(True)) profiles = {URIRef(AgentProfile.uri_generic(id, local_uri)) for id in participant_ids} subjects.extend(profiles) # add pseudo-accounts subjects.extend((URIRef("%sAgentAccount/%d" % (local_uri, id)) for id in participant_ids)) # print len(subjects) cg = ConjunctiveGraph(identifier=d_graph_iri) self.add_subject_data(v, cg, subjects) # add relationships of non-pseudo accounts for ((account, p, profile), g) in v.triples((None, SIOC.account_of, None)): if profile in profiles: cg.add((account, SIOC.account_of, profile, g)) # Tempting: simplify with this. # cg.add((profile, FOAF.account, account, g)) for (s, o, g) in v.query( '''SELECT ?s ?o ?g WHERE { GRAPH ?g {?s catalyst:expressesIdea ?o } . ?o assembl:in_conversation %s }''' % (discussion_uri.n3())): cg.add((s, CATALYST.expressesIdea, o, g)) return cg
def discussion_as_graph(self, discussion_id): from assembl.models import Discussion, AgentProfile local_uri = self.local_uri() discussion = Discussion.get(discussion_id) d_storage_name = self.discussion_storage_name() d_graph_iri = URIRef(self.discussion_graph_iri()) v = get_virtuoso(self.session, d_storage_name) discussion_uri = URIRef( Discussion.uri_generic(discussion_id, local_uri)) subjects = [s for (s,) in v.query( """SELECT DISTINCT ?s WHERE { ?s assembl:in_conversation %s }""" % (discussion_uri.n3()))] subjects.append(discussion_uri) participant_ids = list(discussion.get_participants(True)) profiles = {URIRef(AgentProfile.uri_generic(id, local_uri)) for id in participant_ids} subjects.extend(profiles) # add pseudo-accounts subjects.extend((URIRef("%sAgentAccount/%d" % (local_uri, id)) for id in participant_ids)) # print len(subjects) cg = ConjunctiveGraph(identifier=d_graph_iri) self.add_subject_data(v, cg, subjects) # add relationships of non-pseudo accounts for ((account, p, profile), g) in v.triples((None, SIOC.account_of, None)): if profile in profiles: cg.add((account, SIOC.account_of, profile, g)) # Tempting: simplify with this. # cg.add((profile, FOAF.account, account, g)) for (s, o, g) in v.query( '''SELECT ?s ?o ?g WHERE { GRAPH ?g {?s catalyst:expressesIdea ?o } . ?o assembl:in_conversation %s }''' % (discussion_uri.n3())): cg.add((s, CATALYST.expressesIdea, o, g)) return cg
def participants_private_as_graph(self, discussion_id): from assembl.models import Discussion, AgentProfile local_uri = self.local_uri() discussion = Discussion.get(discussion_id) d_storage_name = self.private_user_storage.name d_graph_iri = self.private_user_storage.sections[0].graph_iri cg = ConjunctiveGraph(identifier=d_graph_iri) v = get_virtuoso(self.session, d_storage_name) v_main = get_virtuoso(self.session, self.discussion_storage_name()) participant_ids = discussion.get_participants(True) profiles={URIRef(AgentProfile.uri_generic(id, local_uri)) for id in participant_ids} self.add_subject_data(v, cg, profiles) accounts = [account for ((account, p, profile), g) in v_main.triples((None, SIOC.account_of, None)) if profile in profiles] self.add_subject_data(v, cg, accounts) return cg
def participants_private_as_graph(self, discussion_id): from assembl.models import Discussion, AgentProfile local_uri = self.local_uri() discussion = Discussion.get(discussion_id) d_storage_name = self.private_user_storage.name d_graph_iri = self.private_user_storage.sections[0].graph_iri cg = ConjunctiveGraph(identifier=d_graph_iri) v = get_virtuoso(self.session, d_storage_name) v_main = get_virtuoso(self.session, self.discussion_storage_name()) participant_ids = discussion.get_participants(True) profiles={URIRef(AgentProfile.uri_generic(id, local_uri)) for id in participant_ids} self.add_subject_data(v, cg, profiles) accounts = [account for ((account, p, profile), g) in v_main.triples((None, SIOC.account_of, None)) if profile in profiles] self.add_subject_data(v, cg, accounts) return cg
def autocomplete(request): keywords = request.GET.get('q') if not keywords: raise HTTPBadRequest("please specify search terms (q)") discussion = request.context.get_instance_of_class(Discussion) query = Discussion.default_db.query(AgentProfile.id, AgentProfile.name) if discussion: query = query.filter(AgentProfile.id.in_( discussion.get_participants_query( True, True, request.authenticated_userid ).subquery())) limit = int(request.GET.get('limit') or 20) query, rank = add_simple_text_search( query, [AgentProfile.name], keywords.split()) query = query.order_by(rank.desc()).limit(limit).all() print(query) return {'results': [{ 'id': AgentProfile.uri_generic(id), 'text': name} for (id, name, rank) in query]}
def participant_autocomplete(request): ctx = request.context keyword = request.GET.get('q') if not keyword: raise HTTPBadRequest("please specify search terms (q)") limit = request.GET.get('limit', 20) try: limit = int(limit) except: raise HTTPBadRequest("limit must be an integer") if limit > 100: raise HTTPBadRequest("be reasonable") query = AgentProfile.default_db.query( AgentProfile.id, AgentProfile.name, User.username ).outerjoin(User).filter((User.verified == True) | (User.id == None)) discussion = ctx.get_instance_of_class(Discussion) if discussion: query = query.filter(AgentProfile.id.in_( discussion.get_participants_query(True, True).subquery())) if len(keyword) < 6: query = query.add_column(literal(0)) matchstr = '%'.join(keyword) matchstr = '%'.join(('', matchstr, '')) agents = query.filter(AgentProfile.name.ilike(matchstr) | User.username.ilike(matchstr) ).limit(limit * 5).all() agents.sort(key=lambda u: max( jaro_winkler(u[1], keyword), jaro_winkler(u[2], keyword) if u[2] else 0 ), reverse=True) num = min(len(agents), limit) agents = agents[:num] else: matchstr = keyword query, rank = add_simple_text_search( query, [AgentProfile.name], keyword.split()) agents = query.order_by(rank.desc()).limit(limit).all() return {'results': [{ 'id': AgentProfile.uri_generic(id), 'text': name} for (id, name, username, rank) in agents]}