Implement [[agora go links integration]].
This commit is contained in:
parent
d55f7dcdd9
commit
7aeed0c52d
2 changed files with 53 additions and 1 deletions
29
app/agora.py
29
app/agora.py
|
@ -56,6 +56,35 @@ def today():
|
|||
today = datetime.datetime.now().date()
|
||||
return redirect("https://anagora.org/node/%s" % today.strftime("%Y-%m-%d"))
|
||||
|
||||
@bp.route('/go/<node>')
|
||||
def go(node):
|
||||
"""Redirects to the URL in the given node in a block that starts with [[go]], if there is one."""
|
||||
# TODO(flancian): all node-scoped stuff should move to actually use node objects.
|
||||
try:
|
||||
n = db.nodes_by_wikilink(node)
|
||||
except KeyError:
|
||||
return redirect("https://anagora.org/node/%s" % node)
|
||||
|
||||
if len(n) > 1:
|
||||
current_app.logger.warning('nodes_by_wikilink returned more than one node, should not happen.')
|
||||
|
||||
if len(n) == 0:
|
||||
# No nodes with this name -- redirect to node 404.
|
||||
return redirect("https://anagora.org/node/%s" % node)
|
||||
|
||||
links = n[0].go()
|
||||
if len(links) == 0:
|
||||
# No go links detected in this node -- just redirect to the node.
|
||||
# TODO(flancian): flash an explanation :)
|
||||
return redirect("https://anagora.org/node/%s" % node)
|
||||
|
||||
if len(links) > 1:
|
||||
# TODO(flancian): to be implemented.
|
||||
# Likely default to one of the links, show all of them but redirect to default within n seconds.
|
||||
current_app.logger.warning('Code to manage nodes with more than one go link is not Not implemented.')
|
||||
|
||||
return redirect(links[0])
|
||||
|
||||
@bp.route('/u/<user>')
|
||||
@bp.route('/user/<user>')
|
||||
@bp.route('/@<user>')
|
||||
|
|
23
app/db.py
23
app/db.py
|
@ -63,6 +63,14 @@ class Node:
|
|||
def size(self):
|
||||
return len(self.subnodes)
|
||||
|
||||
def go(self):
|
||||
# There's surely a much better way to do this. Alas :)
|
||||
go = []
|
||||
for subnode in self.subnodes:
|
||||
go.extend(subnode.go())
|
||||
return go
|
||||
|
||||
|
||||
class Subnode:
|
||||
"""A subnode is a note or media resource volunteered by a user of the Agora.
|
||||
It maps to a particular file in the Agora repository, stored (relative to
|
||||
|
@ -98,6 +106,21 @@ class Subnode:
|
|||
# hack hack
|
||||
return 100-fuzz.ratio(self.wikilink, other.wikilink)
|
||||
|
||||
def go(self):
|
||||
# returns a set of go links contained in this node
|
||||
return subnode_to_actions(self, 'go')
|
||||
|
||||
|
||||
def subnode_to_actions(subnode, action):
|
||||
# hack hack.
|
||||
action_regex ='\[\[' + action + '\]\] (.*?)$'
|
||||
content = subnode.content
|
||||
actions = []
|
||||
for line in content.splitlines():
|
||||
m = re.search(action_regex, line)
|
||||
if m:
|
||||
actions.append(m.group(1))
|
||||
return actions
|
||||
|
||||
class User:
|
||||
def __init__(self, user):
|
||||
|
|
Loading…
Reference in a new issue