3 from forum.models import User, Question, Answer, Comment
5 def find_best_match_in_name(content, uname, fullname, start_index):
6 end_index = start_index + len(fullname)
8 while end_index > start_index:
9 if content[start_index : end_index].lower() == fullname.lower():
10 return content[start_index : end_index]
12 while len(fullname) and fullname[-1] != ' ':
13 fullname = fullname[:-1]
15 fullname = fullname.rstrip()
16 end_index = start_index + len(fullname)
20 APPEAL_PATTERN = re.compile(r'(?<!\w)@\w+')
22 def auto_user_link(node, content):
24 # We should find the root of the node tree (question) the current node belongs to.
25 if isinstance(node, Question):
27 elif isinstance(node, Answer):
28 question = node.question
29 elif isinstance(node, Comment):
31 question = node.question
33 question = node.answer.question
35 # Now we've got the root question. Let's get the list of active users.
36 active_users = question.get_active_users()
38 appeals = APPEAL_PATTERN.finditer(content)
42 for appeal in appeals:
43 # Try to find the profile URL
44 username = appeal.group(0)[1:]
48 for user in active_users:
49 if user.username.lower().startswith(username.lower()):
54 (find_best_match_in_name(content, username, matches[0].username, appeal.start(0) + 1), matches[0])
56 elif len(matches) == 0:
57 matches = User.objects.filter(username__istartswith=username)
59 if (len(matches) == 0):
62 best_user_match = None
66 user_match = find_best_match_in_name(content, username, user.username, appeal.start(0) + 1)
68 if (len(user_match) < len(final_match)):
71 if (len(user_match) == len(final_match)):
72 if not (user.username.lower() == user_match.lower()):
75 if (best_user_match and (best_user_match.username == final_match)):
78 best_user_match = user
79 final_match = user_match
81 replacements.append((final_match, best_user_match))
83 for replacement in replacements:
84 to_replace = "@" + replacement[0]
85 profile_url = replacement[1].get_absolute_url()
87 auto_link = '<a href="%s">%s</a>' % (profile_url, to_replace)
88 content = content.replace(to_replace, auto_link)