Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Feature: add subcommand to convert an existing QGIS profile into a QDT config #269

Draft
wants to merge 3 commits into
base: main
Choose a base branch
from
Draft
Show file tree
Hide file tree
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
14 changes: 14 additions & 0 deletions qgis_deployment_toolbelt/cli.py
Original file line number Diff line number Diff line change
Expand Up @@ -29,6 +29,7 @@
parser_rules_context_export,
)
from qgis_deployment_toolbelt.commands.deployment import parser_main_deployment
from qgis_deployment_toolbelt.commands.extract import parser_extract_from_profile
from qgis_deployment_toolbelt.commands.upgrade import parser_upgrade
from qgis_deployment_toolbelt.utils.journalizer import configure_logger

Expand Down Expand Up @@ -181,6 +182,19 @@ def main(in_args: list[str] = None):
add_common_arguments(subcmd_rules_context)
parser_rules_context_export(subcmd_rules_context)

# Extractor
subcmd_extract = subparsers.add_parser(
"extract",
aliases=[
"qgis2qdt",
],
help="Generate profile ready for QDT from an existing QGIS profile.",
formatter_class=main_parser.formatter_class,
prog="upgrade",
)
add_common_arguments(subcmd_extract)
parser_extract_from_profile(subcmd_extract)

# Upgrader
subcmd_upgrade = subparsers.add_parser(
"upgrade",
Expand Down
99 changes: 99 additions & 0 deletions qgis_deployment_toolbelt/commands/extract.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,99 @@
#! python3 # noqa: E265

"""
Sub-command in charge of running the main logic.

Author: Julien M. (https://github.com/guts)
"""

# #############################################################################
# ########## Libraries #############
# ##################################

# Standard library
import argparse
import logging
from pathlib import Path

# submodules
from qgis_deployment_toolbelt.profiles.qdt_profile import QdtProfile
from qgis_deployment_toolbelt.utils.check_path import check_path

# #############################################################################
# ########## Globals ###############
# ##################################

logger = logging.getLogger(__name__)


# ############################################################################
# ########## CLI #################
# ################################


def parser_extract_from_profile(
subparser: argparse.ArgumentParser,
) -> argparse.ArgumentParser:
"""Set the argument parser for deployment subcommand.

Args:
subparser (argparse.ArgumentParser): parser to set up

Returns:
argparse.ArgumentParser: parser ready to use
"""
subparser.add_argument(
"-f",
"--from",
"--from-profile-path",
dest="input_profile_path",
help="Path to the QGIS profile to extract.",
type=str,
)

subparser.add_argument(
"-t",
"--to",
"--to-profile-path",
dest="output_profile_path",
help="Path where to store the QDT profile.",
type=str,
)

subparser.set_defaults(func=run)

return subparser


# ############################################################################
# ########## MAIN ################
# ################################


def run(args: argparse.Namespace):
"""Run the main logic.

Args:
args (argparse.Namespace): arguments passed to the subcommand
"""
logger.debug(f"Running {args.command} with {args}")

# check input profile exists
check_path(
input_path=args.input_profile_path,
must_be_a_file=False,
must_be_a_folder=True,
must_be_readable=True,
raise_error=True,
)
input_qgis_profile_path = Path(args.input_profile_path)

# make sure output profile folder exists
output_qdt_profile_path = Path(args.output_profile_path)
output_qdt_profile_path.mkdir(parents=True, exist_ok=True)

src_profile: QdtProfile = QdtProfile.from_profile_folder(
input_profile_folder=input_qgis_profile_path
)

print(src_profile)
33 changes: 33 additions & 0 deletions qgis_deployment_toolbelt/profiles/qdt_profile.py
Original file line number Diff line number Diff line change
Expand Up @@ -188,6 +188,39 @@ def from_json(
**profile_data,
)

@classmethod
def from_profile_folder(cls, input_profile_folder: Path) -> Self:
"""Create object from a QGIS profile folder. Must contain a QGIS/QGIS3.ini file.

Args:
input_profile_folder (Path): path to the folder containgin a QGIS plugin

Returns:
Self: instanciated object
"""
# check that input path is a folder
check_path(
input_path=input_profile_folder,
must_exists=True,
must_be_a_folder=True,
must_be_a_file=False,
must_be_readable=True,
)
# check if the folder contains a QGIS3.ini file
profile_qgis_ini = input_profile_folder / "QGIS/QGIS3.ini"
check_path(
input_path=profile_qgis_ini,
must_be_a_file=True,
must_be_readable=True,
must_exists=True,
)

# return new instance with loaded object
return cls(
folder=input_profile_folder.name,
loaded_from_json=False,
)

@property
def alias(self) -> str:
"""Returns the profile's alias.
Expand Down
Loading