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

✨[#64] add setup configuration documentation generation #97

Closed
wants to merge 1 commit into from
Closed
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
Original file line number Diff line number Diff line change
@@ -0,0 +1,51 @@
from django.conf import settings
from django.core.management.base import BaseCommand
from django.template import loader

from open_api_framework.utils import get_configuraton_step_context


def render_step_info(step_name: str) -> str:
template = loader.get_template(
"open_api_framework/components/setup_config_step.rst"
)

context = get_configuraton_step_context(step_name)
return template.render(context)


def convert_setup_configuration_steps_to_rst(
project_name: str, config_steps: list[str]
) -> str:
template = loader.get_template("open_api_framework/setup_configuration.rst")
return template.render(
{"project_name": project_name, "setup_configuraiton_steps": config_steps}
)


class Command(BaseCommand):
help = "Generate documentation for all used envvars"

def add_arguments(self, parser):
super().add_arguments(parser)

parser.add_argument(
"--file",
help="Name and path of the file to which the documentation will be written.",
nargs="?",
default="docs/setup_configuration.rst",
)

def handle(self, *args, **options):
file_path = options["file"]

configuration_steps = getattr(settings, "SETUP_CONFIGURATION_STEPS", [])

project_name = getattr(settings, "PROJECT_NAME", settings.PROJECT_DIRNAME)

with open(file_path, "w") as f:
f.write(
convert_setup_configuration_steps_to_rst(
project_name, configuration_steps
)
)
Original file line number Diff line number Diff line change
@@ -0,0 +1,9 @@
{% load doc_tags %}
{% spaceless %}
{{ step_title }}
{{ step_title|repeat_char:"-"}}

{{ step_description }}

.. setup-config-example:: {{ step_path }}
{% endspaceless %}
Original file line number Diff line number Diff line change
@@ -0,0 +1,47 @@
{% load doc_tags %}.. _installation_configuration_cli:

===================={{ project_name|repeat_char:"="}}
{{ project_name }} configuration (CLI)
===================={{ project_name|repeat_char:"="}}

After deploying {{ project_name }}, it needs to be configured to be fully functional.
The django management command ``setup_configuration`` assist with this configuration.
You can get the full command documentation with:

.. code-block:: bash

python ./src/manage.py setup_configuration --help

.. warning:: This command is declarative - if configuration is manually changed after
running the command and you then run the exact same command again, the manual
changes will be reverted.

Preparation
===========

The command executes the list of pluggable configuration steps, and each step
requires specific configuration information, that should be prepared.
Here is the description of all available configuration steps and the configuration
format, used by each step.

{% for step_path in setup_configuraiton_steps %}
{% render_setup_configuraiton_step step_path %}
{% endfor %}


Execution
=========

{{ project_name }} configuration
{{ project_name|repeat_char:"-"}}--------------

With the full command invocation, everything is configured at once. Each configuration step
is idempotent, so any manual changes made via the admin interface will be updated if the command
is run afterwards.

.. code-block:: bash

python ./src/manage.py setup_configuration --yaml-file /path/to/config.yaml

.. note:: Due to a cache-bug in the underlying framework, you need to restart all
replicas for part of this change to take effect everywhere.
7 changes: 7 additions & 0 deletions open_api_framework/templatetags/doc_tags.py
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,8 @@

from decouple import Undefined

from open_api_framework.utils import get_configuraton_step_context

register = template.Library()


Expand Down Expand Up @@ -33,3 +35,8 @@ def ensure_endswith(value, char):
if not value.endswith(char):
value += char
return value


@register.inclusion_tag("open_api_framework/components/setup_config_step.rst")
def render_setup_configuraiton_step(step_path):
return get_configuraton_step_context(step_path)
12 changes: 12 additions & 0 deletions open_api_framework/utils.py
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,19 @@

from django.conf import settings
from django.contrib.sessions.backends.base import SessionBase
from django.utils.module_loading import import_string


def get_session_store() -> SessionBase:
return import_module(settings.SESSION_ENGINE).SessionStore


def get_configuraton_step_context(step_path: str) -> dict:
step = import_string(step_path)

context = {
"step_title": step_path.split(".")[-1],
"step_description": step.verbose_name,
"step_path": step_path,
Comment on lines +16 to +18
Copy link
Contributor Author

@Coperh Coperh Jan 27, 2025

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I think config steps should have a description/summary variable and verbose_name should be a name that is verbose rather than a summary as it currently seems to be used.

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

As in use the current verbose name value as a description and change the verbose_name to a more readable format of the step name: TokenAuthConfigurationStep ==> "Token Authentication Configuration"

}
return context
2 changes: 1 addition & 1 deletion pyproject.toml
Original file line number Diff line number Diff line change
Expand Up @@ -55,7 +55,7 @@ dependencies = [
"celery>=5.4.0",
"flower>=2.0.1",
"maykin-2fa>=1.0.1",
"django-setup-configuration>=0.1.0",
"django-setup-configuration>=0.6.0",
"django-sessionprofile>=3.0.0",
]

Expand Down
Loading