devpi-web 5.0.2__tar.gz → 5.1.0__tar.gz

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (80) hide show
  1. {devpi_web-5.0.2 → devpi_web-5.1.0}/CHANGELOG +20 -0
  2. {devpi_web-5.0.2 → devpi_web-5.1.0}/CHANGELOG.short.rst +20 -15
  3. {devpi_web-5.0.2 → devpi_web-5.1.0}/PKG-INFO +21 -16
  4. devpi_web-5.1.0/devpi_web/__init__.py +1 -0
  5. {devpi_web-5.0.2 → devpi_web-5.1.0}/devpi_web/config.py +7 -3
  6. {devpi_web-5.0.2 → devpi_web-5.1.0}/devpi_web/description.py +7 -2
  7. {devpi_web-5.0.2 → devpi_web-5.1.0}/devpi_web/hookspecs.py +3 -3
  8. {devpi_web-5.0.2 → devpi_web-5.1.0}/devpi_web/indexing.py +9 -9
  9. {devpi_web-5.0.2 → devpi_web-5.1.0}/devpi_web/macros.py +15 -0
  10. {devpi_web-5.0.2 → devpi_web-5.1.0}/devpi_web/main.py +8 -3
  11. {devpi_web-5.0.2 → devpi_web-5.1.0}/devpi_web/templates/index.pt +1 -14
  12. devpi_web-5.1.0/devpi_web/templates/index_bases.pt +32 -0
  13. devpi_web-5.1.0/devpi_web/templates/merge_info.pt +10 -0
  14. {devpi_web-5.0.2 → devpi_web-5.1.0}/devpi_web/templates/project.pt +2 -5
  15. devpi_web-5.1.0/devpi_web/templates/project_refresh.pt +1 -0
  16. {devpi_web-5.0.2 → devpi_web-5.1.0}/devpi_web/templates/version.pt +1 -4
  17. {devpi_web-5.0.2 → devpi_web-5.1.0}/devpi_web/views.py +118 -38
  18. {devpi_web-5.0.2 → devpi_web-5.1.0}/devpi_web.egg-info/PKG-INFO +21 -16
  19. {devpi_web-5.0.2 → devpi_web-5.1.0}/devpi_web.egg-info/SOURCES.txt +3 -0
  20. {devpi_web-5.0.2 → devpi_web-5.1.0}/pyproject.toml +0 -9
  21. {devpi_web-5.0.2 → devpi_web-5.1.0}/tests/test_indexing.py +0 -6
  22. {devpi_web-5.0.2 → devpi_web-5.1.0}/tests/test_theme.py +3 -3
  23. {devpi_web-5.0.2 → devpi_web-5.1.0}/tests/test_views.py +120 -23
  24. {devpi_web-5.0.2 → devpi_web-5.1.0}/tests/test_whoosh_index.py +33 -4
  25. {devpi_web-5.0.2 → devpi_web-5.1.0}/tox.ini +1 -1
  26. devpi_web-5.0.2/devpi_web/__init__.py +0 -1
  27. {devpi_web-5.0.2 → devpi_web-5.1.0}/.flake8 +0 -0
  28. {devpi_web-5.0.2 → devpi_web-5.1.0}/LICENSE +0 -0
  29. {devpi_web-5.0.2 → devpi_web-5.1.0}/MANIFEST.in +0 -0
  30. {devpi_web-5.0.2 → devpi_web-5.1.0}/README.rst +0 -0
  31. {devpi_web-5.0.2 → devpi_web-5.1.0}/devpi_web/clear_index.py +0 -0
  32. {devpi_web-5.0.2 → devpi_web-5.1.0}/devpi_web/compat.py +0 -0
  33. {devpi_web-5.0.2 → devpi_web-5.1.0}/devpi_web/doczip.py +0 -0
  34. {devpi_web-5.0.2 → devpi_web-5.1.0}/devpi_web/macroregistry.py +0 -0
  35. {devpi_web-5.0.2 → devpi_web-5.1.0}/devpi_web/null_index.py +0 -0
  36. {devpi_web-5.0.2 → devpi_web-5.1.0}/devpi_web/static/common.js +0 -0
  37. {devpi_web-5.0.2 → devpi_web-5.1.0}/devpi_web/static/docview.js +0 -0
  38. {devpi_web-5.0.2 → devpi_web-5.1.0}/devpi_web/static/favicon.ico +0 -0
  39. {devpi_web-5.0.2 → devpi_web-5.1.0}/devpi_web/static/jquery-3.6.0.min.js +0 -0
  40. {devpi_web-5.0.2 → devpi_web-5.1.0}/devpi_web/static/search.js +0 -0
  41. {devpi_web-5.0.2 → devpi_web-5.1.0}/devpi_web/static/style.css +0 -0
  42. {devpi_web-5.0.2 → devpi_web-5.1.0}/devpi_web/templates/doc.pt +0 -0
  43. {devpi_web-5.0.2 → devpi_web-5.1.0}/devpi_web/templates/error.pt +0 -0
  44. {devpi_web-5.0.2 → devpi_web-5.1.0}/devpi_web/templates/favicon.pt +0 -0
  45. {devpi_web-5.0.2 → devpi_web-5.1.0}/devpi_web/templates/footer.pt +0 -0
  46. {devpi_web-5.0.2 → devpi_web-5.1.0}/devpi_web/templates/footer_versions.pt +0 -0
  47. {devpi_web-5.0.2 → devpi_web-5.1.0}/devpi_web/templates/head.pt +0 -0
  48. {devpi_web-5.0.2 → devpi_web-5.1.0}/devpi_web/templates/header.pt +0 -0
  49. {devpi_web-5.0.2 → devpi_web-5.1.0}/devpi_web/templates/header_breadcrumbs.pt +0 -0
  50. {devpi_web-5.0.2 → devpi_web-5.1.0}/devpi_web/templates/header_search.pt +0 -0
  51. {devpi_web-5.0.2 → devpi_web-5.1.0}/devpi_web/templates/header_status.pt +0 -0
  52. {devpi_web-5.0.2 → devpi_web-5.1.0}/devpi_web/templates/html_head_css.pt +0 -0
  53. {devpi_web-5.0.2 → devpi_web-5.1.0}/devpi_web/templates/html_head_scripts.pt +0 -0
  54. {devpi_web-5.0.2 → devpi_web-5.1.0}/devpi_web/templates/logo.pt +0 -0
  55. {devpi_web-5.0.2 → devpi_web-5.1.0}/devpi_web/templates/notfound.pt +0 -0
  56. {devpi_web-5.0.2 → devpi_web-5.1.0}/devpi_web/templates/query_docs.pt +0 -0
  57. {devpi_web-5.0.2 → devpi_web-5.1.0}/devpi_web/templates/root.pt +0 -0
  58. {devpi_web-5.0.2 → devpi_web-5.1.0}/devpi_web/templates/root_above_user_index_list.pt +0 -0
  59. {devpi_web-5.0.2 → devpi_web-5.1.0}/devpi_web/templates/root_below_user_index_list.pt +0 -0
  60. {devpi_web-5.0.2 → devpi_web-5.1.0}/devpi_web/templates/search.pt +0 -0
  61. {devpi_web-5.0.2 → devpi_web-5.1.0}/devpi_web/templates/search_help.pt +0 -0
  62. {devpi_web-5.0.2 → devpi_web-5.1.0}/devpi_web/templates/status.pt +0 -0
  63. {devpi_web-5.0.2 → devpi_web-5.1.0}/devpi_web/templates/status_badge.pt +0 -0
  64. {devpi_web-5.0.2 → devpi_web-5.1.0}/devpi_web/templates/toxresult.pt +0 -0
  65. {devpi_web-5.0.2 → devpi_web-5.1.0}/devpi_web/templates/toxresults.pt +0 -0
  66. {devpi_web-5.0.2 → devpi_web-5.1.0}/devpi_web/templates/user.pt +0 -0
  67. {devpi_web-5.0.2 → devpi_web-5.1.0}/devpi_web/whoosh_index.py +0 -0
  68. {devpi_web-5.0.2 → devpi_web-5.1.0}/devpi_web.egg-info/dependency_links.txt +0 -0
  69. {devpi_web-5.0.2 → devpi_web-5.1.0}/devpi_web.egg-info/entry_points.txt +0 -0
  70. {devpi_web-5.0.2 → devpi_web-5.1.0}/devpi_web.egg-info/requires.txt +0 -0
  71. {devpi_web-5.0.2 → devpi_web-5.1.0}/devpi_web.egg-info/top_level.txt +0 -0
  72. {devpi_web-5.0.2 → devpi_web-5.1.0}/mypy.ini +0 -0
  73. {devpi_web-5.0.2 → devpi_web-5.1.0}/setup.cfg +0 -0
  74. {devpi_web-5.0.2 → devpi_web-5.1.0}/tests/conftest.py +0 -0
  75. {devpi_web-5.0.2 → devpi_web-5.1.0}/tests/test_macro_registry.py +0 -0
  76. {devpi_web-5.0.2 → devpi_web-5.1.0}/tests/test_main.py +0 -0
  77. {devpi_web-5.0.2 → devpi_web-5.1.0}/tests/test_views_docs.py +0 -0
  78. {devpi_web-5.0.2 → devpi_web-5.1.0}/tests/test_views_misc.py +0 -0
  79. {devpi_web-5.0.2 → devpi_web-5.1.0}/tests/test_views_search.py +0 -0
  80. {devpi_web-5.0.2 → devpi_web-5.1.0}/tests/test_views_toxresults.py +0 -0
@@ -2,6 +2,26 @@
2
2
 
3
3
  .. towncrier release notes start
4
4
 
5
+ 5.1.0 (2026-04-30)
6
+ ==================
7
+
8
+ Features
9
+ --------
10
+
11
+ - With devpi-server 7.x information and warnings about inheritance from bases of an index are reported. This includes inheritance cycles, missing bases and how rules for merging project releases from bases are applied.
12
+
13
+ - Support upcoming devpi-server 7.0.0 release.
14
+
15
+ Other Changes
16
+ -------------
17
+
18
+ - index.pt: Moved bases and whitelist info to ``index_bases.pt`` macro.
19
+
20
+ - project.pt, version.pt: Moved whitelist info to ``merge_info.pt`` macro in preparation for changes in devpi-server 7.x.
21
+
22
+ - project.pt: Moved refresh button to ``project_refresh.pt`` macro.
23
+
24
+
5
25
  5.0.2 (2026-03-17)
6
26
  ==================
7
27
 
@@ -9,6 +9,26 @@ Changelog
9
9
 
10
10
  .. towncrier release notes start
11
11
 
12
+ 5.1.0 (2026-04-30)
13
+ ==================
14
+
15
+ Features
16
+ --------
17
+
18
+ - With devpi-server 7.x information and warnings about inheritance from bases of an index are reported. This includes inheritance cycles, missing bases and how rules for merging project releases from bases are applied.
19
+
20
+ - Support upcoming devpi-server 7.0.0 release.
21
+
22
+ Other Changes
23
+ -------------
24
+
25
+ - index.pt: Moved bases and whitelist info to ``index_bases.pt`` macro.
26
+
27
+ - project.pt, version.pt: Moved whitelist info to ``merge_info.pt`` macro in preparation for changes in devpi-server 7.x.
28
+
29
+ - project.pt: Moved refresh button to ``project_refresh.pt`` macro.
30
+
31
+
12
32
  5.0.2 (2026-03-17)
13
33
  ==================
14
34
 
@@ -99,18 +119,3 @@ Features
99
119
 
100
120
  - index.pt, project.pt, version.pt: Fix #1062: Added a link to download the documentation as zip-file to the index, project and version view.
101
121
 
102
-
103
- 4.2.3 (2024-09-19)
104
- ==================
105
-
106
- Bug Fixes
107
- ---------
108
-
109
- - Fix deprecation warnings from devpi-server 6.13.0.
110
-
111
- - Lazily evaluate file information. Especially with devpi-postgresql this safes many database accesses on most pages.
112
-
113
- - Guard against missing doczip files, which can happen on replicas during replication.
114
-
115
- - Increase threshold for index status from 60 s to 300 s for warnings and from 300 s to 3600 s for fatal.
116
-
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: devpi-web
3
- Version: 5.0.2
3
+ Version: 5.1.0
4
4
  Summary: devpi-web: a web view for devpi-server
5
5
  Maintainer-email: Florian Schulze <mail@pyfidelity.com>
6
6
  License-Expression: MIT
@@ -88,6 +88,26 @@ Changelog
88
88
 
89
89
  .. towncrier release notes start
90
90
 
91
+ 5.1.0 (2026-04-30)
92
+ ==================
93
+
94
+ Features
95
+ --------
96
+
97
+ - With devpi-server 7.x information and warnings about inheritance from bases of an index are reported. This includes inheritance cycles, missing bases and how rules for merging project releases from bases are applied.
98
+
99
+ - Support upcoming devpi-server 7.0.0 release.
100
+
101
+ Other Changes
102
+ -------------
103
+
104
+ - index.pt: Moved bases and whitelist info to ``index_bases.pt`` macro.
105
+
106
+ - project.pt, version.pt: Moved whitelist info to ``merge_info.pt`` macro in preparation for changes in devpi-server 7.x.
107
+
108
+ - project.pt: Moved refresh button to ``project_refresh.pt`` macro.
109
+
110
+
91
111
  5.0.2 (2026-03-17)
92
112
  ==================
93
113
 
@@ -178,18 +198,3 @@ Features
178
198
 
179
199
  - index.pt, project.pt, version.pt: Fix #1062: Added a link to download the documentation as zip-file to the index, project and version view.
180
200
 
181
-
182
- 4.2.3 (2024-09-19)
183
- ==================
184
-
185
- Bug Fixes
186
- ---------
187
-
188
- - Fix deprecation warnings from devpi-server 6.13.0.
189
-
190
- - Lazily evaluate file information. Especially with devpi-postgresql this safes many database accesses on most pages.
191
-
192
- - Guard against missing doczip files, which can happen on replicas during replication.
193
-
194
- - Increase threshold for index status from 60 s to 300 s for warnings and from 300 s to 3600 s for fatal.
195
-
@@ -0,0 +1 @@
1
+ __version__ = "5.1.0"
@@ -4,7 +4,7 @@ from pluggy import PluginManager
4
4
 
5
5
  def get_pluginmanager(config, load_entry_points=True):
6
6
  # lookup cached value
7
- pm = getattr(config, 'devpiweb_pluginmanager', None)
7
+ pm = getattr(config, "devpiweb_pluginmanager", None)
8
8
  if pm is not None:
9
9
  return pm
10
10
  pm = PluginManager("devpiweb")
@@ -19,6 +19,10 @@ def get_pluginmanager(config, load_entry_points=True):
19
19
 
20
20
  def add_indexer_backend_option(parser, pluginmanager=None):
21
21
  parser.addoption(
22
- "--indexer-backend", type=str, metavar="NAME", default="whoosh",
22
+ "--indexer-backend",
23
+ type=str,
24
+ metavar="NAME",
25
+ default="whoosh",
23
26
  action="store",
24
- help="the indexer backend to use")
27
+ help="the indexer backend to use",
28
+ )
@@ -95,12 +95,17 @@ class DescriptionRenderer:
95
95
 
96
96
  :return: boolean
97
97
  """
98
- return self.stage.ixconfig['type'] == 'mirror' \
98
+ return (
99
+ self.stage.ixconfig["type"] in {"mirror", "remote"}
99
100
  and self._get_mirror_web_url_fmt() is not None
101
+ )
100
102
 
101
103
  def _get_mirror_web_url_fmt(self):
102
104
  """ Fetch the remote's source url.
103
105
 
104
106
  :return: string
105
107
  """
106
- return self.stage.ixconfig.get('mirror_web_url_fmt')
108
+ ixconfig = self.stage.ixconfig
109
+ if "remote_web_url_fmt" in ixconfig:
110
+ return ixconfig["remote_web_url_fmt"]
111
+ return ixconfig.get("mirror_web_url_fmt")
@@ -1,5 +1,6 @@
1
1
  from pluggy import HookspecMarker
2
2
 
3
+
3
4
  hookspec = HookspecMarker("devpiweb")
4
5
 
5
6
 
@@ -14,7 +15,7 @@ def devpiweb_get_status_info(request):
14
15
 
15
16
  @hookspec
16
17
  def devpiweb_indexer_backend():
17
- """ return dict containing indexer backend info.
18
+ """return dict containing indexer backend info.
18
19
 
19
20
  The following keys are defined:
20
21
 
@@ -26,5 +27,4 @@ def devpiweb_indexer_backend():
26
27
 
27
28
  @hookspec
28
29
  def devpiweb_modify_preprocess_project_result(project, result):
29
- """ allows to modify the ``result`` dictionary used for indexing.
30
- """
30
+ """allows to modify the ``result`` dictionary used for indexing."""
@@ -15,10 +15,10 @@ if TYPE_CHECKING:
15
15
 
16
16
 
17
17
  def is_project_cached(stage, project):
18
- if stage.ixconfig['type'] == 'mirror':
19
- if not stage.is_project_cached(project):
20
- return False
21
- return True
18
+ return not (
19
+ stage.ixconfig["type"] in {"mirror", "remote"}
20
+ and not stage.is_project_cached(project)
21
+ )
22
22
 
23
23
 
24
24
  def preprocess_project(project: ProjectIndexingInfo) -> dict | None:
@@ -33,7 +33,7 @@ def preprocess_project(project: ProjectIndexingInfo) -> dict | None:
33
33
  user = ensure_unicode(user)
34
34
  index = ensure_unicode(index)
35
35
  result: dict[str, object]
36
- if stage.ixconfig["type"] == "mirror":
36
+ if stage.ixconfig["type"] in {"mirror", "remote"}:
37
37
  stage.offline = True
38
38
  if not stage.is_project_cached(name):
39
39
  # only index basic info for projects with no downloads
@@ -86,17 +86,17 @@ class ProjectIndexingInfo:
86
86
 
87
87
  @property
88
88
  def is_from_mirror(self) -> bool:
89
- return self.stage.ixconfig['type'] == 'mirror'
89
+ return self.stage.ixconfig["type"] in {"mirror", "remote"}
90
90
 
91
91
 
92
92
  def iter_indexes(xom):
93
93
  mirrors = []
94
94
  for user in xom.model.get_userlist():
95
95
  username = ensure_unicode(user.name)
96
- user_info = user.get(user)
96
+ user_info = user.get()
97
97
  for index, index_info in user_info.get('indexes', {}).items():
98
98
  index = ensure_unicode(index)
99
- if index_info['type'] == 'mirror':
99
+ if index_info["type"] in {"mirror", "remote"}:
100
100
  mirrors.append((username, index))
101
101
  else:
102
102
  yield (username, index)
@@ -110,7 +110,7 @@ def iter_projects(xom, *, offline=True):
110
110
  continue
111
111
  names = stage.list_projects_perstage()
112
112
  # only go offline after we got the projects list
113
- if stage.ixconfig["type"] == "mirror":
113
+ if stage.ixconfig["type"] in {"mirror", "remote"}:
114
114
  stage.offline = offline
115
115
  if isinstance(names, Mapping):
116
116
  # since devpi-server 6.6.0 mirrors return a mapping where
@@ -80,11 +80,26 @@ def html_head_scripts(request):
80
80
  return dict(scripts=scripts)
81
81
 
82
82
 
83
+ @macro_config(template="templates/index_bases.pt")
84
+ def index_bases(request): # noqa: ARG001
85
+ return dict()
86
+
87
+
83
88
  @macro_config(template="templates/logo.pt", groups="main_header_top")
84
89
  def logo(request): # noqa: ARG001
85
90
  return dict()
86
91
 
87
92
 
93
+ @macro_config(template="templates/merge_info.pt")
94
+ def merge_info(request): # noqa: ARG001
95
+ return dict()
96
+
97
+
98
+ @macro_config(template="templates/project_refresh.pt")
99
+ def project_refresh(request): # noqa: ARG001
100
+ return dict()
101
+
102
+
88
103
  @macro_config(template="templates/query_docs.pt")
89
104
  def query_doc(request):
90
105
  query_docs_html = None
@@ -272,8 +272,13 @@ def devpiserver_add_parser_options(parser):
272
272
  add_indexer_backend_option(indexing)
273
273
 
274
274
 
275
- @devpiserver_hookimpl
275
+ @devpiserver_hookimpl(optionalhook=True)
276
276
  def devpiserver_mirror_initialnames(stage, projectnames):
277
+ devpiserver_remote_initialnames(stage, projectnames)
278
+
279
+
280
+ @devpiserver_hookimpl(optionalhook=True)
281
+ def devpiserver_remote_initialnames(stage, projectnames):
277
282
  ix = get_indexer(stage.xom)
278
283
  threadlog.info(
279
284
  "indexing '%s' mirror with %s projects",
@@ -299,7 +304,7 @@ def devpiserver_stage_created(stage):
299
304
  if stage is None:
300
305
  # the stage was deleted
301
306
  return
302
- if stage.ixconfig["type"] == "mirror":
307
+ if stage.ixconfig["type"] in {"mirror", "remote"}:
303
308
  threadlog.info("triggering load of initial projectnames for %s", stage.name)
304
309
  stage.list_projects_perstage()
305
310
 
@@ -341,7 +346,7 @@ def devpiserver_on_changed_versiondata(stage, project, version, metadata):
341
346
  if stage is None:
342
347
  return
343
348
  if not metadata:
344
- if stage.ixconfig["type"] == "mirror":
349
+ if stage.ixconfig["type"] in {"mirror", "remote"}:
345
350
  stage.offline = True
346
351
  if is_project_cached(stage, project) and not stage.has_project_perstage(project):
347
352
  delete_project(stage, project)
@@ -76,20 +76,7 @@
76
76
  </dl>
77
77
  </tal:permissions>
78
78
 
79
- <tal:bases condition="bases">
80
- <h2>inherited bases</h2>
81
- <ul>
82
- <li tal:repeat="base bases">
83
- <a href="${base.url}">${base.title}</a> (<a href="${base.simple_url}">simple</a>)
84
- </li>
85
- </ul>
86
- </tal:bases>
87
-
88
- <h2>whitelisted packages</h2>
89
- <ul class="whitelist" tal:condition="whitelist">
90
- <li tal:repeat="name whitelist">${name}</li>
91
- </ul>
92
- <p tal:condition="not whitelist">No packages whitelisted.</p>
79
+ <metal:indexbases use-macro="request.macros['index_bases']" />
93
80
  </div>
94
81
  <metal:footer use-macro="request.macros['footer']" />
95
82
  </body>
@@ -0,0 +1,32 @@
1
+ <tal:bases condition="bases">
2
+ <h2>inherited bases</h2>
3
+ <ul>
4
+ <li tal:repeat="base bases">
5
+ <a href="${base.url}">${base.title}</a> (<a href="${base.simple_url}">simple</a>)
6
+ </li>
7
+ </ul>
8
+ </tal:bases>
9
+
10
+ <tal:noinheritanceinfo condition="inheritance_info is None">
11
+ <h2>whitelisted packages</h2>
12
+ <ul class="whitelist" tal:condition="whitelist">
13
+ <li tal:repeat="name whitelist">${name}</li>
14
+ </ul>
15
+ <p tal:condition="not whitelist">No packages whitelisted.</p>
16
+ </tal:noinheritanceinfo>
17
+
18
+ <tal:inheritanceinfo condition="inheritance_info is not None">
19
+ <script id="inheritance-info" type="application/json">${inheritance_info}</script>
20
+ <h2>inheritance information</h2>
21
+ <div class="infonote" tal:condition="inheritance_info.reasons">
22
+ <ul>
23
+ <li tal:repeat="reason inheritance_info.reasons">${reason}</li>
24
+ </ul>
25
+ </div>
26
+ <dl tal:condition="project_inheritance_rules is not None">
27
+ <dt><code>project_inheritance_rules</code></dt>
28
+ <dd><ul>
29
+ <li tal:repeat="rule project_inheritance_rules"><code>${rule}</code></li>
30
+ </ul></dd>
31
+ </dl>
32
+ </tal:inheritanceinfo>
@@ -0,0 +1,10 @@
1
+ <p class="infonote" tal:condition="merge_info.blocked_remote_name and merge_info.reasons is None">
2
+ Because this project isn't in the <code>mirror_whitelist</code>,
3
+ no releases from <strong>${merge_info.blocked_remote_name}</strong> are included.
4
+ </p>
5
+ <script id="merge-info" type="application/json">${merge_info}</script>
6
+ <div class="infonote" tal:condition="merge_info.reasons">
7
+ <ul>
8
+ <li tal:repeat="reason merge_info.reasons">${reason}</li>
9
+ </ul>
10
+ </div>
@@ -12,11 +12,8 @@
12
12
  <p class="projectnavigation" tal:condition="nav_links">
13
13
  <span tal:repeat="link nav_links"><a tal:attributes="class link.get('css_class')" href="${link.url}">${link.title}</a></span>
14
14
  </p>
15
- <p class="infonote" tal:condition="blocked_by_mirror_whitelist">
16
- Because this project isn't in the <code>mirror_whitelist</code>,
17
- no releases from <strong>${blocked_by_mirror_whitelist}</strong> are included.
18
- </p>
19
- <p tal:condition="not blocked_by_mirror_whitelist" tal:content="structure refresh_form"></p>
15
+ <metal:mergeinfo use-macro="request.macros['merge_info']" />
16
+ <metal:projectrefresh use-macro="request.macros['project_refresh']" />
20
17
 
21
18
  <p tal:condition="latest_version">Latest version on stage is: <a href="${latest_url}">${latest_version}</a></p>
22
19
 
@@ -0,0 +1 @@
1
+ <p tal:condition="not blocked_by_mirror_whitelist" tal:content="structure refresh_form"></p>
@@ -21,10 +21,7 @@
21
21
  </tr>
22
22
  </table>
23
23
 
24
- <p class="infonote" tal:condition="blocked_by_mirror_whitelist">
25
- Because this project isn't in the <code>mirror_whitelist</code>,
26
- no releases from <strong>${blocked_by_mirror_whitelist}</strong> are included.
27
- </p>
24
+ <metal:mergeinfo use-macro="request.macros['merge_info']" />
28
25
 
29
26
  <table class="files">
30
27
  <thead>