Skip to content

Commit 685285a

Browse files
committed
Enable multiple URLs in extension views
1 parent 4c7cef4 commit 685285a

File tree

3 files changed

+21
-18
lines changed

3 files changed

+21
-18
lines changed

src/labthings/server/extensions.py

Lines changed: 10 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -52,37 +52,35 @@ def __init__(
5252

5353
self.static_view_class = static_from(static_folder)
5454
self.add_view(
55-
self.static_view_class, f"{static_url_path}/<path:path>", endpoint="static"
56-
)
57-
self.add_view(
58-
self.static_view_class, f"{static_url_path}", endpoint="static_root"
55+
self.static_view_class, f"{static_url_path}", f"{static_url_path}/<path:path>", endpoint="static"
5956
)
6057

6158
@property
6259
def views(self):
6360
return self._views
6461

65-
def add_view(self, view_class, rule, endpoint=None, **kwargs):
62+
def add_view(self, view_class, *urls, endpoint=None, **kwargs):
6663
# Remove all leading slashes from view route
67-
cleaned_rule = rule
68-
while cleaned_rule and cleaned_rule[0] == "/":
69-
cleaned_rule = cleaned_rule[1:]
64+
cleaned_urls = list(urls)
65+
for i, cleaned_url in enumerate(cleaned_urls):
66+
while cleaned_url and cleaned_urls[i][0] == "/":
67+
cleaned_urls[i] = cleaned_urls[i][1:]
7068

7169
# Expand the rule to include extension name
72-
full_rule = "/{}/{}".format(self._name_uri_safe, cleaned_rule)
70+
full_urls = ["/{}/{}".format(self._name_uri_safe, cleaned_url) for cleaned_url in cleaned_urls]
7371

7472
# Build endpoint if none given
7573
if not endpoint:
7674
endpoint = camel_to_snake(view_class.__name__)
7775

7876
# Store route information in a dictionary
79-
d = {"rule": full_rule, "view": view_class, "kwargs": kwargs}
77+
d = {"urls": full_urls, "view": view_class, "kwargs": kwargs}
8078

8179
# Add view to private views dictionary
8280
self._views[endpoint] = d
83-
print(self._views)
8481
# Store the rule expansion information
85-
self._rules[rule] = self._views[endpoint]
82+
for url in urls:
83+
self._rules[url] = self._views[endpoint]
8684

8785
def on_register(self, function, args=None, kwargs=None):
8886
if not callable(function):

src/labthings/server/labthing.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -226,7 +226,7 @@ def register_extension(self, extension_object):
226226
# Add route to the extensions blueprint
227227
self.add_view(
228228
tag("extensions")(extension_view["view"]),
229-
"/extensions" + extension_view["rule"],
229+
*("/extensions" + url for url in extension_view["urls"]),
230230
endpoint=endpoint,
231231
**extension_view["kwargs"],
232232
)

src/labthings/server/schema.py

Lines changed: 10 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -147,15 +147,20 @@ class ExtensionSchema(Schema):
147147
def generate_links(self, data, **kwargs):
148148
d = {}
149149
for view_id, view_data in data.views.items():
150-
view_cls = view_data["view"]
151-
view_rule = view_data["rule"]
150+
view_cls = view_data.get("view")
151+
view_urls = view_data.get("urls")
152152
# Try to build a URL
153153
try:
154-
url = url_for(EXTENSION_LIST_ENDPOINT, _external=True) + view_rule
154+
urls = [url_for(EXTENSION_LIST_ENDPOINT, _external=True) + url for url in view_urls]
155155
except BuildError:
156-
url = None
156+
urls = []
157+
# TODO: Tidy up this nasty jazz
158+
if len(urls) == 0:
159+
urls = None
160+
elif len(urls) == 1:
161+
urls = urls[0]
157162
# Make links dictionary if it doesn't yet exist
158-
d[view_id] = {"href": url, **description_from_view(view_cls)}
163+
d[view_id] = {"href": urls, **description_from_view(view_cls)}
159164

160165
data.links = d
161166

0 commit comments

Comments
 (0)