aboutsummaryrefslogtreecommitdiff
path: root/mu4web/main.py
diff options
context:
space:
mode:
Diffstat (limited to 'mu4web/main.py')
-rw-r--r--mu4web/main.py80
1 files changed, 1 insertions, 79 deletions
diff --git a/mu4web/main.py b/mu4web/main.py
index 4d39c1a..d57cc64 100644
--- a/mu4web/main.py
+++ b/mu4web/main.py
@@ -23,9 +23,8 @@ import mu
from html_render import HTML, render_document
from user.local import LocalUser
from user.pam import PamUser
+from maildir import find_maildirs, serialize_maildir
-import subprocess
-from dataclasses import dataclass
import flask
from flask import (
@@ -38,10 +37,6 @@ from flask import (
get_flashed_messages
)
-try:
- from natsort import natsorted
-except ModuleNotFoundError:
- natsorted = sorted
#
# A few operations depend on the index of attachements. These index
@@ -333,79 +328,6 @@ def search_page(q: str, by: Optional[mu.Sortfield],
body=main_body))
-@dataclass
-class Leaf:
- name: str
-
-@dataclass
-class Node:
- name: str
- children: list[Union[Leaf, 'Node']]
-
-
-def build_tree(items: list[list[str]]) -> Node:
- groups: dict[str, list[list[str]]] = {}
- direct: list[Leaf] = []
- for key, *rest in items:
- if rest:
- groups.setdefault(key, []).append(rest)
- else:
- direct.append(Leaf(key))
-
- node = Node('root', [])
- for key, values in groups.items():
- next = build_tree(values)
- next.name = key
- node.children.append(next)
- node.children.extend(direct)
- return node
-
-
-def find(basedir, **flags) -> list[bytes]:
- cmdline = ['find', basedir]
- for key, value in flags.items():
- cmdline += [f'-{key}', value]
- cmdline.append('-print0')
-
- cmd = subprocess.run(cmdline, capture_output=True)
- return cmd.stdout.split(b'\0')[:-1]
-
-
-def find_maildirs(basedir) -> Node:
- """
- Find all maildirs located under basedir.
-
- A maildir is defined as any directory which contains a `cur`
- directory.
- """
- basedir = basedir.rstrip('/')
- files = find(basedir, type='d', name='cur')
- # + 1 removes leading slash
- # - 4 removes '/cur'
- dirs = [entry[len(basedir)+1:-4].decode('UTF-8').split(os.path.sep)
- for entry in files]
-
- return build_tree(dirs)
-
-
-def serialize_maildir(maildir: Node, path: list[str] = []) -> HTML:
- """Build a (recursive) list from a maildir node."""
- entries: list[HTML] = []
- for node in natsorted(maildir.children, key=lambda n: n.name):
- if isinstance(node, Leaf):
- parts = '/'.join(path + [node.name])
- url = 'search?' + urlencode({'q': f'maildir:"/{parts}"'})
- entry = ('li', ('a', {'href': url},
- node.name or ('i', 'root')))
- else:
- entry = ('li',
- ('details',
- ('summary', node.name),
- serialize_maildir(node, path + [node.name])))
- entries.append(entry)
-
- return ('ul', *entries)
-
def index_page():
data = mu.info()
maildirs = find_maildirs(data['maildir'] + '/')