forked from certsocietegenerale/FIR
-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathlinks.py
More file actions
67 lines (56 loc) · 2.34 KB
/
links.py
File metadata and controls
67 lines (56 loc) · 2.34 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
from django.core.urlresolvers import reverse
from django.db import models
from django.utils import six
import re
class LinkUrl(object):
def __init__(self, url, request=None):
self.url = url
self.request = request
def __call__(self, match):
path = reverse(self.url, args=match.groups())
if self.request is not None:
return self.request.build_absolute_uri(path)
return path
class Links(object):
def __init__(self):
self.reverse_links = []
self.regex_links = []
self.model_links = {}
def register_reverse_link(self, parser_regex, url_name, model=None, reverse=None):
"""
Registers a new parser for links using Django urlconf
:param parser_regex: string or regex object
:param url_name: urlconf name
:param model: model label (app_label.model_name) or model class (used by fir_relations)
:param reverse: string template to render object id to text (used by fir_relations)
"""
if not isinstance(parser_regex, re._pattern_type):
parser_regex = re.compile(parser_regex)
self.reverse_links.append((parser_regex, url_name))
if model is not None:
if not isinstance(model, six.string_types) and issubclass(models.Model, model):
model = model._meta.label
self.model_links[model] = (parser_regex, url_name, reverse)
def register_regex_link(self, parser_regex, template):
"""
Registers a new parser for links using regex replacement
:param parser_regex: string or regex object
:param template: template to pass to regex expand
"""
if not isinstance(parser_regex, re._pattern_type):
parser_regex = re.compile(parser_regex)
self.regex_links.append((parser_regex, template))
def _reverse(self, request=None):
patterns = []
for regex, url in self.reverse_links:
patterns.append((regex, LinkUrl(url, request)))
return patterns
def link_patterns(self, request=None):
links = list(self.regex_links)
links.extend(self._reverse(request=request))
return links
def parser_for_model(self, model):
if isinstance(model, models.Model):
model = model._meta.label
return self.model_links.get(model, None)
registry = Links()