From 8405c2b8135d8cbc428000b7b3f8c573e07740e3 Mon Sep 17 00:00:00 2001 From: UlrichB22 <97119703+UlrichB22@users.noreply.github.com> Date: Mon, 21 Oct 2024 11:14:38 +0200 Subject: [PATCH] Performance: add aliases to trail and remove exists check --- src/moin/_tests/test_user.py | 4 ++-- src/moin/apps/frontend/views.py | 4 ++-- src/moin/templates/utils.html | 18 +++++++++--------- src/moin/themes/__init__.py | 20 ++++---------------- src/moin/themes/_tests/test_navi_bar.py | 12 ++++++------ src/moin/user.py | 24 ++++++++++++++++++------ 6 files changed, 41 insertions(+), 41 deletions(-) diff --git a/src/moin/_tests/test_user.py b/src/moin/_tests/test_user.py index a35f55c59..854ea3d6c 100644 --- a/src/moin/_tests/test_user.py +++ b/src/moin/_tests/test_user.py @@ -217,10 +217,10 @@ def test_trail(self): assert result == expected # item name added to trail - theUser.add_trail("item_added") + theUser.add_trail("item_added", []) theUser = user.User(name=name, password=password) result = theUser.get_trail() - expected = ["MoinTest/item_added"] + expected = [("MoinTest/item_added", [])] assert result == expected # Sessions ------------------------------------------------------- diff --git a/src/moin/apps/frontend/views.py b/src/moin/apps/frontend/views.py index 7b8b817f4..bdebf23ff 100644 --- a/src/moin/apps/frontend/views.py +++ b/src/moin/apps/frontend/views.py @@ -531,7 +531,7 @@ def wrapper(item_name, rev): if abort404 and isinstance(item, NonExistent): abort(404, item_name) if add_trail: - flaskg.user.add_trail(item_name) + flaskg.user.add_trail(item_name, aliases=item.meta.revision.fqnames) return wrapped(item) return wrapper @@ -589,7 +589,7 @@ def show_item(item_name, rev): try: item = Item.create(item_name, rev_id=rev) if item.itemtype != ITEMTYPE_NONEXISTENT: - flaskg.user.add_trail(item_name) + flaskg.user.add_trail(item_name, aliases=item.meta.revision.fqnames) item_is_deleted = flash_if_item_deleted(item_name, rev, item) item_may = get_item_permissions(fqname, item) result = item.do_show(rev, item_is_deleted=item_is_deleted, item_may=item_may) diff --git a/src/moin/templates/utils.html b/src/moin/templates/utils.html index 28e854a62..24dd94eb3 100644 --- a/src/moin/templates/utils.html +++ b/src/moin/templates/utils.html @@ -233,13 +233,13 @@ {%- endif %} {%- endmacro -%} -{% macro page_trail_link(wiki_name, fqname, exists) %} +{% macro page_trail_link(wiki_name, fqname) %} {%- if wiki_name -%} {{ fqname|shorten_fqname }} {%- else -%} - + {{ fqname|shorten_fqname }} {%- endif %} @@ -257,30 +257,30 @@
  • {{ _('Page Trail') }}
  • {%- set trail_items = breadcrumbs() %} {%- if trail_items %} - {%- for wiki_name, fqname, item_href, exists, err in trail_items %} + {%- for wiki_name, fqname, item_href, aliases, err in trail_items %} {%- if not loop.last %}
  • - {{ page_trail_link(wiki_name, fqname, exists) }} - {{ alias_list(theme_supp.get_fqnames(fqname)) }} + {{ page_trail_link(wiki_name, fqname) }} + {{ alias_list(aliases) }}
  • {%- endif %} {%- if loop.last %}
  • - {%- for segment_name, segment_path, exists in theme_supp.location_breadcrumbs(fqname) -%} + {%- for segment_name, segment_path in theme_supp.location_breadcrumbs(fqname) -%} {%- if not loop.last %} - + {{ segment_name|shorten_fqname }} {%- else %} - + {{ segment_name|shorten_fqname }} {%- endif %} {%- endfor %} - {{ alias_list(theme_supp.get_fqnames(fqname)) }} + {{ alias_list(aliases) }}
  • {%- if title_name %}
  • diff --git a/src/moin/themes/__init__.py b/src/moin/themes/__init__.py index 91cb7d0d7..574f1cbba 100644 --- a/src/moin/themes/__init__.py +++ b/src/moin/themes/__init__.py @@ -332,14 +332,13 @@ def location_breadcrumbs(self, fqname): namespace as a prefix. :rtype: list - :returns: location breadcrumbs items in tuple (segment_name, fq_name, exists) + :returns: location breadcrumbs items in tuple (segment_name, fq_name) """ breadcrumbs = [] current_item = "" if not isinstance(fqname, CompositeName): fqname = split_fqname(fqname) if fqname.field != NAME_EXACT: - # flaskg.unprotected_storage.get_item(**fqname.query) return [(fqname, fqname, bool(self.storage.get_item(**fqname.query)))] namespace = segment1_namespace = fqname.namespace item_name = fqname.value @@ -349,7 +348,7 @@ def location_breadcrumbs(self, fqname): current_item += segment fq_current = CompositeName(namespace, NAME_EXACT, current_item) fq_segment = CompositeName(segment1_namespace, NAME_EXACT, segment) - breadcrumbs.append((fq_segment, fq_current, True)) + breadcrumbs.append((fq_segment, fq_current)) current_item += "/" segment1_namespace = "" return breadcrumbs @@ -364,7 +363,7 @@ def path_breadcrumbs(self): user = self.user breadcrumbs = [] trail = user.get_trail() - for interwiki_item_name in trail: + for interwiki_item_name, aliases in trail: wiki_name, namespace, field, item_name = split_interwiki(interwiki_item_name) fqname = CompositeName(namespace, field, item_name) err = not is_known_wiki(wiki_name) @@ -372,7 +371,7 @@ def path_breadcrumbs(self): if is_local_wiki(wiki_name): wiki_name = "" # means "this wiki" for the theme code if item_name: - breadcrumbs.append((wiki_name, fqname, href, True, err)) + breadcrumbs.append((wiki_name, fqname, href, aliases, err)) return breadcrumbs def userhome(self): @@ -558,17 +557,6 @@ def login_url(self): url = url or url_for("frontend.login") return url - def get_fqnames(self, fqname): - """ - Return the list of other fqnames associated with the item. - """ - if fqname.field != NAME_EXACT: - return [] - item = self.storage.get_item(**fqname.query) - fqnames = item.fqnames - fqnames.remove(fqname) - return fqnames or [] - def get_namespaces(self, ns=None): """ Return the list of tuples (composite name, namespace) referring to namespaces other diff --git a/src/moin/themes/_tests/test_navi_bar.py b/src/moin/themes/_tests/test_navi_bar.py index 94e22a506..ae2db611b 100644 --- a/src/moin/themes/_tests/test_navi_bar.py +++ b/src/moin/themes/_tests/test_navi_bar.py @@ -45,9 +45,9 @@ def test_split_navilink(self, theme): def test_location_breadcrumbs(self, theme): test_result = ThemeSupport.location_breadcrumbs(theme, "some/place/test_item") - test_segment_name_1, test_item_name_1, test_item_exists_1 = test_result[0] - test_segment_name_2, test_item_name_2, test_item_exists_2 = test_result[1] - test_segment_name_3, test_item_name_3, test_item_exists_3 = test_result[2] + test_segment_name_1, test_item_name_1 = test_result[0] + test_segment_name_2, test_item_name_2 = test_result[1] + test_segment_name_3, test_item_name_3 = test_result[2] assert test_segment_name_1.namespace == "" assert test_item_name_1.namespace == "" @@ -59,9 +59,9 @@ def test_location_breadcrumbs(self, theme): assert test_item_name_3.value == "some/place/test_item" test_result = ThemeSupport.location_breadcrumbs(theme, "users/some/place/test_item") - test_segment_name_1, test_item_name_1, test_item_exists_1 = test_result[0] - test_segment_name_2, test_item_name_2, test_item_exists_2 = test_result[1] - test_segment_name_3, test_item_name_3, test_item_exists_3 = test_result[2] + test_segment_name_1, test_item_name_1 = test_result[0] + test_segment_name_2, test_item_name_2 = test_result[1] + test_segment_name_3, test_item_name_3 = test_result[2] assert test_segment_name_1.namespace == "users" assert test_item_name_1.namespace == "users" diff --git a/src/moin/user.py b/src/moin/user.py index 95de95df8..f146b4f4d 100644 --- a/src/moin/user.py +++ b/src/moin/user.py @@ -58,7 +58,7 @@ from moin.constants.misc import ANON from moin.i18n import _ from moin.mail import sendmail -from moin.utils.interwiki import getInterwikiHome, getInterwikiName +from moin.utils.interwiki import getInterwikiHome, getInterwikiName, CompositeName from moin.utils.crypto import generate_token, valid_token, make_uuid from moin.utils.subscriptions import get_matched_subscription_patterns from moin.storage.error import NoSuchItemError, NoSuchRevisionError @@ -732,27 +732,39 @@ def quickunlink(self, pagename): # Trail ------------------------------------------------------------------ - def add_trail(self, item_name): + def add_trail(self, item_name, aliases=None): """Add item name to trail. + Store aliases as tuple :param item_name: the item name (unicode) to add to the trail + :param aliases: a list of aliases for this item """ + full_name = item_name item_name = getInterwikiName(item_name) trail_in_session = session.get("trail", []) trail = trail_in_session[:] - trail = [i for i in trail if i != item_name] # avoid dupes - trail.append(item_name) # append current item name at end + aliases_trail = [] + for alias in aliases: + if alias.fullname != full_name: + aliases_trail.append((alias.namespace, alias.field, alias.value)) + trail = [i for i in trail if i != (item_name, aliases_trail)] # avoid dupes + trail.append((item_name, aliases_trail)) # append current item name and aliases at end trail = trail[-self._cfg.trail_size :] # limit trail length if trail != trail_in_session: session["trail"] = trail def get_trail(self): """Return list of recently visited item names. - + convert aliases to CompositeName :rtype: list :returns: item names (unicode) in trail """ - return session.get("trail", []) + trail_session = session.get("trail", []) + trail = [] + for entry in trail_session: + aliases = [CompositeName(*alias) for alias in entry[1]] + trail.append((entry[0], aliases)) + return trail # Other ------------------------------------------------------------------