mirror of
https://github.com/jrnl-org/jrnl.git
synced 2025-05-10 08:38:32 +02:00
172 lines
4.8 KiB
Python
172 lines
4.8 KiB
Python
# Copyright © 2012-2023 jrnl contributors
|
|
# License: https://www.gnu.org/licenses/gpl-3.0.html
|
|
|
|
"""
|
|
Functions in this file are standalone commands. All standalone commands are split into
|
|
two categories depending on whether they require the config to be loaded to be able to
|
|
run.
|
|
|
|
1. "preconfig" commands don't require the config at all, and can be run before the
|
|
config has been loaded.
|
|
2. "postconfig" commands require to config to have already been loaded, parsed, and
|
|
scoped before they can be run.
|
|
|
|
Also, please note that all (non-builtin) imports should be scoped to each function to
|
|
avoid any possible overhead for these standalone commands.
|
|
"""
|
|
|
|
import argparse
|
|
import logging
|
|
import platform
|
|
import sys
|
|
|
|
from jrnl.config import cmd_requires_valid_journal_name
|
|
from jrnl.exception import JrnlException
|
|
from jrnl.messages import Message
|
|
from jrnl.messages import MsgStyle
|
|
from jrnl.messages import MsgText
|
|
from jrnl.output import print_msg
|
|
|
|
|
|
def preconfig_diagnostic(_) -> None:
|
|
from jrnl import __title__
|
|
from jrnl import __version__
|
|
|
|
print(
|
|
f"{__title__}: {__version__}\n"
|
|
f"Python: {sys.version}\n"
|
|
f"OS: {platform.system()} {platform.release()}"
|
|
)
|
|
|
|
|
|
def preconfig_version(_) -> None:
|
|
import textwrap
|
|
|
|
from jrnl import __title__
|
|
from jrnl import __version__
|
|
|
|
output = f"""
|
|
{__title__} {__version__}
|
|
|
|
Copyright © 2012-2023 jrnl contributors
|
|
|
|
This is free software, and you are welcome to redistribute it under certain
|
|
conditions; for details, see: https://www.gnu.org/licenses/gpl-3.0.html
|
|
"""
|
|
|
|
output = textwrap.dedent(output).strip()
|
|
|
|
print(output)
|
|
|
|
|
|
def postconfig_list(args: argparse.Namespace, config: dict, **_) -> int:
|
|
from jrnl.output import list_journals
|
|
|
|
print(list_journals(config, args.export))
|
|
|
|
return 0
|
|
|
|
|
|
@cmd_requires_valid_journal_name
|
|
def postconfig_import(args: argparse.Namespace, config: dict, **_) -> int:
|
|
from jrnl.Journal import open_journal
|
|
from jrnl.plugins import get_importer
|
|
|
|
# Requires opening the journal
|
|
journal = open_journal(args.journal_name, config)
|
|
|
|
format = args.export if args.export else "jrnl"
|
|
get_importer(format).import_(journal, args.filename)
|
|
|
|
return 0
|
|
|
|
|
|
@cmd_requires_valid_journal_name
|
|
def postconfig_encrypt(
|
|
args: argparse.Namespace, config: dict, original_config: dict
|
|
) -> int:
|
|
"""
|
|
Encrypt a journal in place, or optionally to a new file
|
|
"""
|
|
from jrnl.config import update_config
|
|
from jrnl.install import save_config
|
|
from jrnl.Journal import open_journal
|
|
|
|
# Open the journal
|
|
journal = open_journal(args.journal_name, config)
|
|
|
|
if hasattr(journal, "can_be_encrypted") and not journal.can_be_encrypted:
|
|
raise JrnlException(
|
|
Message(
|
|
MsgText.CannotEncryptJournalType,
|
|
MsgStyle.ERROR,
|
|
{
|
|
"journal_name": args.journal_name,
|
|
"journal_type": journal.__class__.__name__,
|
|
},
|
|
)
|
|
)
|
|
|
|
# If journal is encrypted, create new password
|
|
logging.debug("Clearing encryption method...")
|
|
|
|
if journal.config["encrypt"] is True:
|
|
logging.debug("Journal already encrypted. Re-encrypting...")
|
|
print(f"Journal {journal.name} is already encrypted. Create a new password.")
|
|
journal.encryption_method.clear()
|
|
else:
|
|
journal.config["encrypt"] = True
|
|
journal.encryption_method = None
|
|
|
|
journal.write(args.filename)
|
|
|
|
print_msg(
|
|
Message(
|
|
MsgText.JournalEncryptedTo,
|
|
MsgStyle.NORMAL,
|
|
{"path": args.filename or journal.config["journal"]},
|
|
)
|
|
)
|
|
|
|
# Update the config, if we encrypted in place
|
|
if not args.filename:
|
|
update_config(
|
|
original_config, {"encrypt": True}, args.journal_name, force_local=True
|
|
)
|
|
save_config(original_config)
|
|
|
|
return 0
|
|
|
|
|
|
@cmd_requires_valid_journal_name
|
|
def postconfig_decrypt(
|
|
args: argparse.Namespace, config: dict, original_config: dict
|
|
) -> int:
|
|
"""Decrypts into new file. If filename is not set, we encrypt the journal file itself."""
|
|
from jrnl.config import update_config
|
|
from jrnl.install import save_config
|
|
from jrnl.Journal import open_journal
|
|
|
|
journal = open_journal(args.journal_name, config)
|
|
|
|
logging.debug("Clearing encryption method...")
|
|
journal.config["encrypt"] = False
|
|
journal.encryption_method = None
|
|
|
|
journal.write(args.filename)
|
|
print_msg(
|
|
Message(
|
|
MsgText.JournalDecryptedTo,
|
|
MsgStyle.NORMAL,
|
|
{"path": args.filename or journal.config["journal"]},
|
|
)
|
|
)
|
|
|
|
# Update the config, if we decrypted in place
|
|
if not args.filename:
|
|
update_config(
|
|
original_config, {"encrypt": False}, args.journal_name, force_local=True
|
|
)
|
|
save_config(original_config)
|
|
|
|
return 0
|