Skip to content
Merged
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
34 changes: 22 additions & 12 deletions src/moin/apps/misc/views.py
Original file line number Diff line number Diff line change
@@ -1,4 +1,5 @@
# Copyright: 2010 MoinMoin:ThomasWaldmann
# Copyright: 2025 MoinMoin:UlrichB
# License: GNU GPL v2 (or any later version), see LICENSE.txt for details.

"""
Expand All @@ -17,37 +18,46 @@

from moin.apps.misc import misc

from moin.constants.keys import MTIME, NAME_EXACT, NAMESPACE
from moin.constants.keys import MTIME, NAME_EXACT, NAMESPACE, NAME
from moin.themes import render_template
from moin.utils.interwiki import CompositeName


@misc.route("/sitemap")
def sitemap():
"""
Google (and others) XML sitemap
XML sitemap for search engines
see https://www.sitemaps.org for usage details
"""

def format_timestamp(t):
tm = time.gmtime(t)
return time.strftime("%Y-%m-%dT%H:%M:%S+00:00", tm)

sitemap = []
for rev in flaskg.storage.documents(wikiname=app.cfg.interwikiname):
fqnames = rev.fqnames
mtime = rev.meta[MTIME]
# these are the content items:
changefreq = "daily"
priority = "0.5"
sitemap += [(fqname, format_timestamp(mtime), changefreq, priority) for fqname in fqnames]
# add entries for root urls
# get names for root urls
root_fqnames = []
root_mapping = [
(namespace, app.cfg.root_mapping.get(namespace, app.cfg.default_root))
for namespace, _ in app.cfg.namespace_mapping
]
query = Or([And([Term(NAME_EXACT, root), Term(NAMESPACE, namespace)]) for namespace, root in root_mapping])
for rev in flaskg.storage.search(q=query):
root_fqnames.append(CompositeName(rev.meta[NAMESPACE], NAME_EXACT, rev.meta[NAME][0]))

sitemap = []
for rev in flaskg.storage.documents(wikiname=app.cfg.interwikiname):
fqnames = rev.fqnames
mtime = rev.meta[MTIME]
sitemap.append((rev.meta[NAMESPACE], format_timestamp(mtime), "hourly", "1.0"))
# default for content items:
changefreq = "daily"
priority = "0.5"
for fqname in fqnames:
if fqname in root_fqnames:
# values for root items
changefreq = "hourly"
priority = "1.0"
sitemap.append((fqname, format_timestamp(mtime), changefreq, priority))

sitemap.sort()
content = render_template("misc/sitemap.xml", sitemap=sitemap)
return Response(content, mimetype="text/xml")
Expand Down