41 # |
41 # |
42 LINK_ID_PATTERN_CORE = r'[0-9a-z](?:[0-9a-z]|_[0-9a-z])*' |
42 LINK_ID_PATTERN_CORE = r'[0-9a-z](?:[0-9a-z]|_[0-9a-z])*' |
43 LINK_ID_ARG_PATTERN = r'(?P<link_id>%s)' % LINK_ID_PATTERN_CORE |
43 LINK_ID_ARG_PATTERN = r'(?P<link_id>%s)' % LINK_ID_PATTERN_CORE |
44 LINK_ID_PATTERN = r'^%s$' % LINK_ID_PATTERN_CORE |
44 LINK_ID_PATTERN = r'^%s$' % LINK_ID_PATTERN_CORE |
45 LINK_ID_REGEX = re.compile(LINK_ID_PATTERN) |
45 LINK_ID_REGEX = re.compile(LINK_ID_PATTERN) |
|
46 |
|
47 # scope path is multiple link_id chunks, |
|
48 # each separated by a trailing / |
|
49 # (at least 1) |
|
50 SCOPE_PATH_ARG_PATTERN = (r'(?P<scope_path>%(link_id)s' |
|
51 '(?:/%(link_id)s)*)' % { |
|
52 'link_id': LINK_ID_PATTERN_CORE}) |
|
53 SCOPE_PATH_PATTERN = r'^%s$' % SCOPE_PATH_ARG_PATTERN |
|
54 SCOPE_PATH_REGEX = re.compile(SCOPE_PATH_PATTERN) |
|
55 |
|
56 # path is multiple link_id chunks, |
|
57 # each separated by a trailing / |
|
58 # (at least 1) |
|
59 # followed by a single link_id with no trailing / |
|
60 PATH_LINK_ID_ARGS_PATTERN = ( |
|
61 r'%(scope_path)s/' |
|
62 '(?P<link_id>%(link_id)s)' % { |
|
63 'scope_path' : SCOPE_PATH_ARG_PATTERN, |
|
64 'link_id': LINK_ID_PATTERN_CORE}) |
|
65 PATH_LINK_ID_PATTERN = r'^%s$' % PATH_LINK_ID_ARGS_PATTERN |
|
66 PATH_LINK_ID_REGEX = re.compile(PATH_LINK_ID_PATTERN) |
46 |
67 |
47 |
68 |
48 class Linkable(polymodel.PolyModel): |
69 class Linkable(polymodel.PolyModel): |
49 """A base class for Model classes that are "linkable". |
70 """A base class for Model classes that are "linkable". |
50 |
71 |