drf-to-mkdoc 0.2.1__tar.gz → 0.2.2__tar.gz
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Potentially problematic release.
This version of drf-to-mkdoc might be problematic. Click here for more details.
- {drf_to_mkdoc-0.2.1 → drf_to_mkdoc-0.2.2}/PKG-INFO +1 -1
- {drf_to_mkdoc-0.2.1 → drf_to_mkdoc-0.2.2}/drf_to_mkdoc/conf/settings.py +0 -2
- drf_to_mkdoc-0.2.2/drf_to_mkdoc/templates/endpoints/detail/base.html +33 -0
- drf_to_mkdoc-0.2.2/drf_to_mkdoc/templates/endpoints/detail/path_parameters.html +8 -0
- drf_to_mkdoc-0.2.2/drf_to_mkdoc/templates/endpoints/detail/query_parameters.html +43 -0
- drf_to_mkdoc-0.2.2/drf_to_mkdoc/templates/endpoints/detail/request_body.html +10 -0
- drf_to_mkdoc-0.2.2/drf_to_mkdoc/templates/endpoints/detail/responses.html +18 -0
- drf_to_mkdoc-0.2.2/drf_to_mkdoc/templates/endpoints/list/base.html +23 -0
- drf_to_mkdoc-0.2.2/drf_to_mkdoc/templates/endpoints/list/endpoint_card.html +18 -0
- drf_to_mkdoc-0.2.2/drf_to_mkdoc/templates/endpoints/list/filter_section.html +16 -0
- drf_to_mkdoc-0.2.2/drf_to_mkdoc/templates/endpoints/list/filters/app.html +8 -0
- drf_to_mkdoc-0.2.2/drf_to_mkdoc/templates/endpoints/list/filters/method.html +12 -0
- drf_to_mkdoc-0.2.2/drf_to_mkdoc/templates/endpoints/list/filters/path.html +5 -0
- drf_to_mkdoc-0.2.2/drf_to_mkdoc/templates/endpoints/list/filters/search.html +9 -0
- drf_to_mkdoc-0.2.2/drf_to_mkdoc/templates/model_detail/base.html +34 -0
- drf_to_mkdoc-0.2.2/drf_to_mkdoc/templates/model_detail/choices.html +12 -0
- drf_to_mkdoc-0.2.2/drf_to_mkdoc/templates/model_detail/fields.html +11 -0
- drf_to_mkdoc-0.2.2/drf_to_mkdoc/templates/model_detail/meta.html +6 -0
- drf_to_mkdoc-0.2.2/drf_to_mkdoc/templates/model_detail/methods.html +9 -0
- drf_to_mkdoc-0.2.2/drf_to_mkdoc/templates/model_detail/relationships.html +8 -0
- drf_to_mkdoc-0.2.2/drf_to_mkdoc/templates/models_index.html +24 -0
- drf_to_mkdoc-0.2.2/drf_to_mkdoc/templatetags/custom_filters.py +116 -0
- {drf_to_mkdoc-0.2.1 → drf_to_mkdoc-0.2.2}/drf_to_mkdoc/utils/endpoint_detail_generator.py +79 -168
- drf_to_mkdoc-0.2.2/drf_to_mkdoc/utils/endpoint_list_generator.py +99 -0
- drf_to_mkdoc-0.2.2/drf_to_mkdoc/utils/model_detail_generator.py +62 -0
- drf_to_mkdoc-0.2.2/drf_to_mkdoc/utils/model_list_generator.py +59 -0
- {drf_to_mkdoc-0.2.1 → drf_to_mkdoc-0.2.2}/drf_to_mkdoc/utils/schema.py +1 -1
- {drf_to_mkdoc-0.2.1 → drf_to_mkdoc-0.2.2}/drf_to_mkdoc.egg-info/PKG-INFO +1 -1
- {drf_to_mkdoc-0.2.1 → drf_to_mkdoc-0.2.2}/drf_to_mkdoc.egg-info/SOURCES.txt +21 -3
- drf_to_mkdoc-0.2.1/drf_to_mkdoc/utils/endpoint_list_generator.py +0 -234
- drf_to_mkdoc-0.2.1/drf_to_mkdoc/utils/md_generators/__init__.py +0 -0
- drf_to_mkdoc-0.2.1/drf_to_mkdoc/utils/md_generators/query_parameters_generators.py +0 -72
- drf_to_mkdoc-0.2.1/drf_to_mkdoc/utils/model_detail_generator.py +0 -242
- drf_to_mkdoc-0.2.1/drf_to_mkdoc/utils/model_list_generator.py +0 -77
- {drf_to_mkdoc-0.2.1 → drf_to_mkdoc-0.2.2}/.github/workflows/publish.yaml +0 -0
- {drf_to_mkdoc-0.2.1 → drf_to_mkdoc-0.2.2}/.pre-commit-config.yaml +0 -0
- {drf_to_mkdoc-0.2.1 → drf_to_mkdoc-0.2.2}/CONTRIBUTING.md +0 -0
- {drf_to_mkdoc-0.2.1 → drf_to_mkdoc-0.2.2}/LICENSE +0 -0
- {drf_to_mkdoc-0.2.1 → drf_to_mkdoc-0.2.2}/MANIFEST.in +0 -0
- {drf_to_mkdoc-0.2.1 → drf_to_mkdoc-0.2.2}/README.md +0 -0
- {drf_to_mkdoc-0.2.1 → drf_to_mkdoc-0.2.2}/conf/__init__.py +0 -0
- {drf_to_mkdoc-0.2.1 → drf_to_mkdoc-0.2.2}/conf/defaults.py +0 -0
- {drf_to_mkdoc-0.2.1 → drf_to_mkdoc-0.2.2}/conf/settings.py +0 -0
- {drf_to_mkdoc-0.2.1 → drf_to_mkdoc-0.2.2}/docs/customizing_endpoints.md +0 -0
- {drf_to_mkdoc-0.2.1 → drf_to_mkdoc-0.2.2}/docs/mkdocs.yml +0 -0
- {drf_to_mkdoc-0.2.1 → drf_to_mkdoc-0.2.2}/docs/serving_mkdocs_with_django.md +0 -0
- {drf_to_mkdoc-0.2.1 → drf_to_mkdoc-0.2.2}/drf_to_mkdoc/__init__.py +0 -0
- {drf_to_mkdoc-0.2.1 → drf_to_mkdoc-0.2.2}/drf_to_mkdoc/apps.py +0 -0
- {drf_to_mkdoc-0.2.1 → drf_to_mkdoc-0.2.2}/drf_to_mkdoc/conf/__init__.py +0 -0
- {drf_to_mkdoc-0.2.1 → drf_to_mkdoc-0.2.2}/drf_to_mkdoc/conf/defaults.py +0 -0
- {drf_to_mkdoc-0.2.1 → drf_to_mkdoc-0.2.2}/drf_to_mkdoc/management/__init__.py +0 -0
- {drf_to_mkdoc-0.2.1 → drf_to_mkdoc-0.2.2}/drf_to_mkdoc/management/commands/__init__.py +0 -0
- {drf_to_mkdoc-0.2.1 → drf_to_mkdoc-0.2.2}/drf_to_mkdoc/management/commands/build_docs.py +0 -0
- {drf_to_mkdoc-0.2.1 → drf_to_mkdoc-0.2.2}/drf_to_mkdoc/management/commands/build_endpoint_docs.py +0 -0
- {drf_to_mkdoc-0.2.1 → drf_to_mkdoc-0.2.2}/drf_to_mkdoc/management/commands/build_model_docs.py +0 -0
- {drf_to_mkdoc-0.2.1 → drf_to_mkdoc-0.2.2}/drf_to_mkdoc/management/commands/extract_model_data.py +0 -0
- {drf_to_mkdoc-0.2.1 → drf_to_mkdoc-0.2.2}/drf_to_mkdoc/management/commands/generate_doc_json.py +0 -0
- {drf_to_mkdoc-0.2.1 → drf_to_mkdoc-0.2.2}/drf_to_mkdoc/management/commands/update_doc_schema.py +0 -0
- {drf_to_mkdoc-0.2.1 → drf_to_mkdoc-0.2.2}/drf_to_mkdoc/static/drf-to-mkdoc/javascripts/endpoints-filter.js +0 -0
- {drf_to_mkdoc-0.2.1 → drf_to_mkdoc-0.2.2}/drf_to_mkdoc/static/drf-to-mkdoc/javascripts/try-out-sidebar.js +0 -0
- {drf_to_mkdoc-0.2.1 → drf_to_mkdoc-0.2.2}/drf_to_mkdoc/static/drf-to-mkdoc/stylesheets/endpoints/accessibility.css +0 -0
- {drf_to_mkdoc-0.2.1 → drf_to_mkdoc-0.2.2}/drf_to_mkdoc/static/drf-to-mkdoc/stylesheets/endpoints/animations.css +0 -0
- {drf_to_mkdoc-0.2.1 → drf_to_mkdoc-0.2.2}/drf_to_mkdoc/static/drf-to-mkdoc/stylesheets/endpoints/badges.css +0 -0
- {drf_to_mkdoc-0.2.1 → drf_to_mkdoc-0.2.2}/drf_to_mkdoc/static/drf-to-mkdoc/stylesheets/endpoints/base.css +0 -0
- {drf_to_mkdoc-0.2.1 → drf_to_mkdoc-0.2.2}/drf_to_mkdoc/static/drf-to-mkdoc/stylesheets/endpoints/endpoint-content.css +0 -0
- {drf_to_mkdoc-0.2.1 → drf_to_mkdoc-0.2.2}/drf_to_mkdoc/static/drf-to-mkdoc/stylesheets/endpoints/endpoints-grid.css +0 -0
- {drf_to_mkdoc-0.2.1 → drf_to_mkdoc-0.2.2}/drf_to_mkdoc/static/drf-to-mkdoc/stylesheets/endpoints/filter-section.css +0 -0
- {drf_to_mkdoc-0.2.1 → drf_to_mkdoc-0.2.2}/drf_to_mkdoc/static/drf-to-mkdoc/stylesheets/endpoints/fixes.css +0 -0
- {drf_to_mkdoc-0.2.1 → drf_to_mkdoc-0.2.2}/drf_to_mkdoc/static/drf-to-mkdoc/stylesheets/endpoints/layout.css +0 -0
- {drf_to_mkdoc-0.2.1 → drf_to_mkdoc-0.2.2}/drf_to_mkdoc/static/drf-to-mkdoc/stylesheets/endpoints/loading.css +0 -0
- {drf_to_mkdoc-0.2.1 → drf_to_mkdoc-0.2.2}/drf_to_mkdoc/static/drf-to-mkdoc/stylesheets/endpoints/responsive.css +0 -0
- {drf_to_mkdoc-0.2.1 → drf_to_mkdoc-0.2.2}/drf_to_mkdoc/static/drf-to-mkdoc/stylesheets/endpoints/sections.css +0 -0
- {drf_to_mkdoc-0.2.1 → drf_to_mkdoc-0.2.2}/drf_to_mkdoc/static/drf-to-mkdoc/stylesheets/endpoints/stats.css +0 -0
- {drf_to_mkdoc-0.2.1 → drf_to_mkdoc-0.2.2}/drf_to_mkdoc/static/drf-to-mkdoc/stylesheets/endpoints/tags.css +0 -0
- {drf_to_mkdoc-0.2.1 → drf_to_mkdoc-0.2.2}/drf_to_mkdoc/static/drf-to-mkdoc/stylesheets/endpoints/theme-toggle.css +0 -0
- {drf_to_mkdoc-0.2.1 → drf_to_mkdoc-0.2.2}/drf_to_mkdoc/static/drf-to-mkdoc/stylesheets/endpoints/try-out-sidebar.css +0 -0
- {drf_to_mkdoc-0.2.1 → drf_to_mkdoc-0.2.2}/drf_to_mkdoc/static/drf-to-mkdoc/stylesheets/endpoints/variables.css +0 -0
- {drf_to_mkdoc-0.2.1 → drf_to_mkdoc-0.2.2}/drf_to_mkdoc/static/drf-to-mkdoc/stylesheets/models/animations.css +0 -0
- {drf_to_mkdoc-0.2.1 → drf_to_mkdoc-0.2.2}/drf_to_mkdoc/static/drf-to-mkdoc/stylesheets/models/base.css +0 -0
- {drf_to_mkdoc-0.2.1 → drf_to_mkdoc-0.2.2}/drf_to_mkdoc/static/drf-to-mkdoc/stylesheets/models/model-cards.css +0 -0
- {drf_to_mkdoc-0.2.1 → drf_to_mkdoc-0.2.2}/drf_to_mkdoc/static/drf-to-mkdoc/stylesheets/models/model-tables.css +0 -0
- {drf_to_mkdoc-0.2.1 → drf_to_mkdoc-0.2.2}/drf_to_mkdoc/static/drf-to-mkdoc/stylesheets/models/responsive.css +0 -0
- {drf_to_mkdoc-0.2.1 → drf_to_mkdoc-0.2.2}/drf_to_mkdoc/static/drf-to-mkdoc/stylesheets/models/variables.css +0 -0
- {drf_to_mkdoc-0.2.1 → drf_to_mkdoc-0.2.2}/drf_to_mkdoc/utils/__init__.py +0 -0
- {drf_to_mkdoc-0.2.1 → drf_to_mkdoc-0.2.2}/drf_to_mkdoc/utils/ai_tools/__init__.py +0 -0
- {drf_to_mkdoc-0.2.1 → drf_to_mkdoc-0.2.2}/drf_to_mkdoc/utils/ai_tools/enums.py +0 -0
- {drf_to_mkdoc-0.2.1 → drf_to_mkdoc-0.2.2}/drf_to_mkdoc/utils/ai_tools/exceptions.py +0 -0
- {drf_to_mkdoc-0.2.1 → drf_to_mkdoc-0.2.2}/drf_to_mkdoc/utils/ai_tools/providers/__init__.py +0 -0
- {drf_to_mkdoc-0.2.1 → drf_to_mkdoc-0.2.2}/drf_to_mkdoc/utils/ai_tools/providers/base_provider.py +0 -0
- {drf_to_mkdoc-0.2.1 → drf_to_mkdoc-0.2.2}/drf_to_mkdoc/utils/ai_tools/providers/gemini_provider.py +0 -0
- {drf_to_mkdoc-0.2.1 → drf_to_mkdoc-0.2.2}/drf_to_mkdoc/utils/ai_tools/types.py +0 -0
- {drf_to_mkdoc-0.2.1 → drf_to_mkdoc-0.2.2}/drf_to_mkdoc/utils/commons/__init__.py +0 -0
- {drf_to_mkdoc-0.2.1 → drf_to_mkdoc-0.2.2}/drf_to_mkdoc/utils/commons/code_extractor.py +0 -0
- {drf_to_mkdoc-0.2.1 → drf_to_mkdoc-0.2.2}/drf_to_mkdoc/utils/commons/file_utils.py +0 -0
- {drf_to_mkdoc-0.2.1 → drf_to_mkdoc-0.2.2}/drf_to_mkdoc/utils/commons/model_utils.py +0 -0
- {drf_to_mkdoc-0.2.1 → drf_to_mkdoc-0.2.2}/drf_to_mkdoc/utils/commons/operation_utils.py +0 -0
- {drf_to_mkdoc-0.2.1 → drf_to_mkdoc-0.2.2}/drf_to_mkdoc/utils/commons/path_utils.py +0 -0
- {drf_to_mkdoc-0.2.1 → drf_to_mkdoc-0.2.2}/drf_to_mkdoc/utils/commons/schema_utils.py +0 -0
- {drf_to_mkdoc-0.2.1 → drf_to_mkdoc-0.2.2}/drf_to_mkdoc/utils/extractors/__init__.py +0 -0
- {drf_to_mkdoc-0.2.1 → drf_to_mkdoc-0.2.2}/drf_to_mkdoc/utils/extractors/query_parameter_extractors.py +0 -0
- {drf_to_mkdoc-0.2.1 → drf_to_mkdoc-0.2.2}/drf_to_mkdoc.egg-info/dependency_links.txt +0 -0
- {drf_to_mkdoc-0.2.1 → drf_to_mkdoc-0.2.2}/drf_to_mkdoc.egg-info/requires.txt +0 -0
- {drf_to_mkdoc-0.2.1 → drf_to_mkdoc-0.2.2}/drf_to_mkdoc.egg-info/top_level.txt +0 -0
- {drf_to_mkdoc-0.2.1 → drf_to_mkdoc-0.2.2}/pyproject.toml +0 -0
- {drf_to_mkdoc-0.2.1 → drf_to_mkdoc-0.2.2}/setup.cfg +0 -0
- {drf_to_mkdoc-0.2.1 → drf_to_mkdoc-0.2.2}/setup.py +0 -0
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: drf-to-mkdoc
|
|
3
|
-
Version: 0.2.
|
|
3
|
+
Version: 0.2.2
|
|
4
4
|
Summary: Generate Markdown API docs from Django/DRF OpenAPI schema for MkDocs
|
|
5
5
|
Author-email: Hossein Shayesteh <shayestehhs1@gmail.com>
|
|
6
6
|
Maintainer-email: Hossein Shayesteh <shayestehhs1@gmail.com>
|
|
@@ -0,0 +1,33 @@
|
|
|
1
|
+
<!-- inject CSS and JS directly -->
|
|
2
|
+
{% load custom_filters %}
|
|
3
|
+
{% for stylesheet in stylesheets %}
|
|
4
|
+
<link rel="stylesheet" href="{% static_with_prefix stylesheet prefix_path %}">
|
|
5
|
+
{% endfor %}
|
|
6
|
+
{% for script in scripts %}
|
|
7
|
+
<script src="{% static_with_prefix script prefix_path %}" defer></script>
|
|
8
|
+
{% endfor %}
|
|
9
|
+
|
|
10
|
+
# {{ method|upper }} {{ path }}
|
|
11
|
+
|
|
12
|
+
{{ method|format_method_badge|safe }} `{{ path }}`
|
|
13
|
+
|
|
14
|
+
**View class:** {{ viewset_name }}
|
|
15
|
+
|
|
16
|
+
{% if summary %}
|
|
17
|
+
## Overview
|
|
18
|
+
|
|
19
|
+
{{ summary }}
|
|
20
|
+
{% endif %}
|
|
21
|
+
|
|
22
|
+
{% if operation_id %}
|
|
23
|
+
**Operation ID:** `{{ operation_id }}`
|
|
24
|
+
{% endif %}
|
|
25
|
+
|
|
26
|
+
{% if description %}
|
|
27
|
+
{{ description|safe }}
|
|
28
|
+
{% endif %}
|
|
29
|
+
|
|
30
|
+
{% include "endpoints/detail/path_parameters.html" %}
|
|
31
|
+
{% include "endpoints/detail/query_parameters.html" %}
|
|
32
|
+
{% include "endpoints/detail/request_body.html" %}
|
|
33
|
+
{% include "endpoints/detail/responses.html" %}
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
{% if path_params %}
|
|
2
|
+
## Path Parameters
|
|
3
|
+
|
|
4
|
+
| Name | Type | Required | Description |
|
|
5
|
+
|------|------|----------|-------------|
|
|
6
|
+
{% for param in path_params %}| `{{ param.name }}` | `{{ param.schema.type|default:"string" }}` | {{ param.required|yesno:"Yes,No" }} | {{ param.description }} |{% endfor %}
|
|
7
|
+
{% endif %}
|
|
8
|
+
|
|
@@ -0,0 +1,43 @@
|
|
|
1
|
+
{% comment %}
|
|
2
|
+
Check if any query parameter fields have content
|
|
3
|
+
{% endcomment %}
|
|
4
|
+
|
|
5
|
+
{% if query_parameters.filter_fields or query_parameters.search_fields or query_parameters.ordering_fields or query_parameters.filter_backends or query_parameters.pagination_fields %}
|
|
6
|
+
## Query Parameters
|
|
7
|
+
|
|
8
|
+
{% if query_parameters.filter_fields %}
|
|
9
|
+
### Filter Fields
|
|
10
|
+
{% for field in query_parameters.filter_fields %}
|
|
11
|
+
- `{{ field }}`
|
|
12
|
+
{% endfor %}
|
|
13
|
+
{% endif %}
|
|
14
|
+
|
|
15
|
+
{% if query_parameters.search_fields %}
|
|
16
|
+
### Search Fields
|
|
17
|
+
{% for field in query_parameters.search_fields %}
|
|
18
|
+
- `{{ field }}`
|
|
19
|
+
{% endfor %}
|
|
20
|
+
{% endif %}
|
|
21
|
+
|
|
22
|
+
{% if query_parameters.ordering_fields %}
|
|
23
|
+
### Ordering Fields
|
|
24
|
+
{% for field in query_parameters.ordering_fields %}
|
|
25
|
+
- `{{ field }}`
|
|
26
|
+
{% endfor %}
|
|
27
|
+
{% endif %}
|
|
28
|
+
|
|
29
|
+
{% if query_parameters.filter_backends %}
|
|
30
|
+
### Filter Backends
|
|
31
|
+
{% for backend in query_parameters.filter_backends %}
|
|
32
|
+
- `{{ backend }}`
|
|
33
|
+
{% endfor %}
|
|
34
|
+
{% endif %}
|
|
35
|
+
|
|
36
|
+
{% if query_parameters.pagination_fields %}
|
|
37
|
+
### Pagination Fields
|
|
38
|
+
{% for field in query_parameters.pagination_fields %}
|
|
39
|
+
- `{{ field }}`
|
|
40
|
+
{% endfor %}
|
|
41
|
+
{% endif %}
|
|
42
|
+
|
|
43
|
+
{% endif %}
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
{% load custom_filters %}
|
|
2
|
+
|
|
3
|
+
{% if responses %}
|
|
4
|
+
## Responses
|
|
5
|
+
|
|
6
|
+
{% for response in responses %}
|
|
7
|
+
### {{ response.status_code }}
|
|
8
|
+
|
|
9
|
+
{% if response.description %}
|
|
10
|
+
{{ response.description }}
|
|
11
|
+
{% endif %}
|
|
12
|
+
|
|
13
|
+
{% if response.example %}
|
|
14
|
+
{{ response.example|format_json }}
|
|
15
|
+
{% endif %}
|
|
16
|
+
|
|
17
|
+
{% endfor %}
|
|
18
|
+
{% endif %}
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
# API Endpoints
|
|
2
|
+
|
|
3
|
+
<style>
|
|
4
|
+
{% for stylesheet in stylesheets %}
|
|
5
|
+
@import url("{{ stylesheet|safe }}");
|
|
6
|
+
{% endfor %}
|
|
7
|
+
</style>
|
|
8
|
+
|
|
9
|
+
{% for script in scripts %}
|
|
10
|
+
<script src="{{ script|safe }}" defer></script>
|
|
11
|
+
{% endfor %}
|
|
12
|
+
|
|
13
|
+
<div class="main-content">
|
|
14
|
+
{% include "endpoints/list/filter_section.html" %}
|
|
15
|
+
{% for app_name, endpoints in endpoints_by_app.items %}
|
|
16
|
+
<h2>{{ app_name|title }}</h2>
|
|
17
|
+
<div class="endpoints-grid">
|
|
18
|
+
{% for endpoint in endpoints %}
|
|
19
|
+
{% include "endpoints/list/endpoint_card.html" %}
|
|
20
|
+
{% endfor %}
|
|
21
|
+
</div>
|
|
22
|
+
{% endfor %}
|
|
23
|
+
</div>
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
{% load custom_filters %}
|
|
2
|
+
<a href="{{ endpoint.link_url }}" class="endpoint-card"
|
|
3
|
+
data-method="{{ endpoint.method|lower }}"
|
|
4
|
+
data-path="{{ endpoint.path|lower }}"
|
|
5
|
+
data-app="{{ app_name|lower }}"
|
|
6
|
+
data-auth="{{ endpoint.auth_required|default:'false'|lower }}"
|
|
7
|
+
data-pagination="{{ endpoint.pagination_support|default:'false'|lower }}"
|
|
8
|
+
data-search="{{ endpoint.view_class.search_fields|default:''|length|yesno:'true,false'|lower }}"
|
|
9
|
+
data-ordering="{{ endpoint.ordering_support|default:'false'|lower }}"
|
|
10
|
+
data-models="{{ endpoint.related_models|default:''|join:' '|lower }}"
|
|
11
|
+
data-roles="{{ endpoint.permission_roles|default:''|join:' '|lower }}"
|
|
12
|
+
data-content-type="{{ endpoint.content_type|default:''|lower }}"
|
|
13
|
+
data-tags="{{ endpoint.tags|default:''|join:' '|lower }}"
|
|
14
|
+
data-schema="{{ endpoint.schema_fields|default:''|join:' '|lower }}"
|
|
15
|
+
data-params="{{ endpoint.query_parameters|default:''|join:' '|lower }}">
|
|
16
|
+
<span class="method-badge method-{{ endpoint.method|lower }}">{{ endpoint.method }}</span>
|
|
17
|
+
<span class="endpoint-path">{{ endpoint.path }}</span>
|
|
18
|
+
</a>
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
<div class="filter-sidebar collapsed" id="filterSidebar">
|
|
2
|
+
<h3 class="filter-title">🔍 Filters</h3>
|
|
3
|
+
<div class="filter-grid">
|
|
4
|
+
{% for filter_key in active_filters %}
|
|
5
|
+
{% include "endpoints/list/filters/"|add:filter_key|add:".html" %}
|
|
6
|
+
{% endfor %}
|
|
7
|
+
</div>
|
|
8
|
+
|
|
9
|
+
<div class="filter-actions">
|
|
10
|
+
<button class="filter-apply" onclick="applyFilters()">Apply</button>
|
|
11
|
+
<button class="filter-clear" onclick="clearFilters()">Clear</button>
|
|
12
|
+
</div>
|
|
13
|
+
|
|
14
|
+
<div class="filter-results">Showing 0 endpoints</div>
|
|
15
|
+
</div>
|
|
16
|
+
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
<div class="filter-group">
|
|
2
|
+
<label class="filter-label">HTTP Method</label>
|
|
3
|
+
<select id="filter-method" class="filter-select">
|
|
4
|
+
<option value="">All</option>
|
|
5
|
+
<option value="get">GET</option>
|
|
6
|
+
<option value="post">POST</option>
|
|
7
|
+
<option value="put">PUT</option>
|
|
8
|
+
<option value="patch">PATCH</option>
|
|
9
|
+
<option value="delete">DELETE</option>
|
|
10
|
+
</select>
|
|
11
|
+
</div>
|
|
12
|
+
|
|
@@ -0,0 +1,34 @@
|
|
|
1
|
+
# {{ name }}
|
|
2
|
+
|
|
3
|
+
<!-- inject CSS directly -->
|
|
4
|
+
{% for stylesheet in stylesheets %}
|
|
5
|
+
<link rel="stylesheet" href="{{ stylesheet }}">
|
|
6
|
+
{% endfor %}
|
|
7
|
+
|
|
8
|
+
**App:** {{ app_label }}
|
|
9
|
+
|
|
10
|
+
**Table:** `{{ table_name }}`
|
|
11
|
+
|
|
12
|
+
## Description
|
|
13
|
+
|
|
14
|
+
{{ description }}
|
|
15
|
+
|
|
16
|
+
{% if fields %}
|
|
17
|
+
{% include "model_detail/fields.html" with fields=fields %}
|
|
18
|
+
{% endif %}
|
|
19
|
+
|
|
20
|
+
{% if has_choices %}
|
|
21
|
+
{% include "model_detail/choices.html" with fields=fields %}
|
|
22
|
+
{% endif %}
|
|
23
|
+
|
|
24
|
+
{% if relationships %}
|
|
25
|
+
{% include "model_detail/relationships.html" with relationships=relationships %}
|
|
26
|
+
{% endif %}
|
|
27
|
+
|
|
28
|
+
{% if methods %}
|
|
29
|
+
{% include "model_detail/methods.html" with methods=methods %}
|
|
30
|
+
{% endif %}
|
|
31
|
+
|
|
32
|
+
{% if meta_options %}
|
|
33
|
+
{% include "model_detail/meta.html" with meta_options=meta_options %}
|
|
34
|
+
{% endif %}
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
{% load custom_filters %}
|
|
2
|
+
## Choices
|
|
3
|
+
|
|
4
|
+
{% for field_name, field_info in fields.items %}{% if field_info.choices %}
|
|
5
|
+
### {{ field_name }} Choices
|
|
6
|
+
|
|
7
|
+
| Label | Value |
|
|
8
|
+
|-------|-------|
|
|
9
|
+
{% for choice in field_info.choices %}| {{ choice.display }} | `{{ choice.value }}` |
|
|
10
|
+
{% endfor %}
|
|
11
|
+
|
|
12
|
+
{% endif %}{% endfor %}
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
{% load custom_filters %}
|
|
2
|
+
## Fields
|
|
3
|
+
|
|
4
|
+
| Field | Type | Description | Extra |
|
|
5
|
+
|-------|------|-------------|-------|
|
|
6
|
+
{% for field_name, field_info in fields.items %}{% with field_type=field_info.type|default:"Unknown" %}{% if field_type == "TextField" %}| `{{ field_name }}` | TextField | {{ field_name }} | {% if field_info.max_length %}max_length={{ field_info.max_length }}{% endif %} |
|
|
7
|
+
{% elif field_type == "BigAutoField" %}| `{{ field_name }}` | BigAutoField | ID | {% if field_info.blank %}blank=True{% endif %}{% if field_info.unique %}, unique=True{% endif %}{% if field_info.primary_key %}, primary_key=True{% endif %} |
|
|
8
|
+
{% elif field_type == "CharField" %}| `{{ field_name }}` | CharField | {{ field_name }} | {% if field_info.max_length %}max_length={{ field_info.max_length }}{% endif %}{% if field_info.null %}, null=True{% endif %}{% if field_info.blank %}, blank=True{% endif %} |
|
|
9
|
+
{% elif field_type == "ForeignKey" %}| `{{ field_name }}` | ForeignKey | {{ field_info.field_specific.to|default:"" }} | |
|
|
10
|
+
{% else %}| `{{ field_name }}` | {{ field_type }} | {{ field_name }} | {{ field_info|format_field_extra }} |
|
|
11
|
+
{% endif %}{% endwith %}{% endfor %}
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
{% load custom_filters %}
|
|
2
|
+
## Relationships
|
|
3
|
+
|
|
4
|
+
| Field | Type | Related Model |
|
|
5
|
+
|-------|------|---------------|
|
|
6
|
+
{% for field_name, field_info in relationships.items %}{% with field_type=field_info.type|default:"Unknown" %}{% if field_info.field_specific.to %}| `{{ field_name }}` | {{ field_type }} | {% if "." in field_info.field_specific.to %}[{{ field_info.field_specific.to|cut:"." }}](../{{ field_info.field_specific.to|cut:"." }}/{% else %}[{{ field_info.field_specific.to }}]({{ field_info.field_specific.to|lower }}/{% endif %} |
|
|
7
|
+
{% endif %}{% endwith %}{% endfor %}{% for rel_name, rel_info in relationships.items %}| `{{ rel_name }}` | {{ rel_info.type|default:"Unknown" }} | [{{ rel_info.verbose_name|capfirst }}](../../{{ rel_info.app_label }}/{{ rel_info.table_name }}/) |
|
|
8
|
+
{% endfor %}
|
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
{% load custom_filters %}
|
|
2
|
+
# Django Models
|
|
3
|
+
|
|
4
|
+
This section contains documentation for all Django models in the system, organized by Django application.
|
|
5
|
+
|
|
6
|
+
<!-- inject CSS directly -->
|
|
7
|
+
{% for css in stylesheets %}
|
|
8
|
+
<link rel="stylesheet" href="{{ css }}">
|
|
9
|
+
{% endfor %}
|
|
10
|
+
|
|
11
|
+
<div class="models-container">
|
|
12
|
+
{% for app_name, models in sorted_models %}
|
|
13
|
+
<div class="app-header">{{ app_name|title|cut:"_"|safe }}</div>
|
|
14
|
+
<div class="app-description">{{ app_descriptions|get_item:app_name }}</div>
|
|
15
|
+
|
|
16
|
+
<div class="model-cards">
|
|
17
|
+
{% for verbose_name, table_name in models %}
|
|
18
|
+
<a href="{{ app_name|urlencode }}/{{ table_name|urlencode }}/" class="model-card">{{ verbose_name }}</a>
|
|
19
|
+
{% endfor %}
|
|
20
|
+
</div>
|
|
21
|
+
{% endfor %}
|
|
22
|
+
</div>
|
|
23
|
+
|
|
24
|
+
Each model page contains detailed field documentation, method signatures, and relationships to other models.
|
|
@@ -0,0 +1,116 @@
|
|
|
1
|
+
import html
|
|
2
|
+
import json
|
|
3
|
+
|
|
4
|
+
from django import template
|
|
5
|
+
from django.templatetags.static import static as django_static
|
|
6
|
+
from django.utils.safestring import mark_safe
|
|
7
|
+
|
|
8
|
+
from drf_to_mkdoc.utils.commons.operation_utils import (
|
|
9
|
+
format_method_badge as format_method_badge_util,
|
|
10
|
+
)
|
|
11
|
+
|
|
12
|
+
register = template.Library()
|
|
13
|
+
|
|
14
|
+
|
|
15
|
+
@register.filter
|
|
16
|
+
def is_foreign_key(field_type):
|
|
17
|
+
return field_type in ["ForeignKey", "OneToOneField"]
|
|
18
|
+
|
|
19
|
+
|
|
20
|
+
@register.simple_tag
|
|
21
|
+
def static_with_prefix(path, prefix=""):
|
|
22
|
+
"""Add prefix to static path"""
|
|
23
|
+
return django_static(prefix + path)
|
|
24
|
+
|
|
25
|
+
|
|
26
|
+
@register.filter
|
|
27
|
+
def format_method_badge(method):
|
|
28
|
+
"""Format HTTP method as badge"""
|
|
29
|
+
return format_method_badge_util(method)
|
|
30
|
+
|
|
31
|
+
|
|
32
|
+
@register.filter
|
|
33
|
+
def get_display_name(field_name, field_type):
|
|
34
|
+
if field_type in ["ForeignKey", "OneToOneField"]:
|
|
35
|
+
return f"{field_name}_id"
|
|
36
|
+
return field_name
|
|
37
|
+
|
|
38
|
+
|
|
39
|
+
@register.filter
|
|
40
|
+
def split(value, delimiter=","):
|
|
41
|
+
return value.split(delimiter)
|
|
42
|
+
|
|
43
|
+
|
|
44
|
+
@register.filter
|
|
45
|
+
def cut(value, arg):
|
|
46
|
+
return value.split(arg)[1] if "." in value else value
|
|
47
|
+
|
|
48
|
+
|
|
49
|
+
@register.filter
|
|
50
|
+
def get_item(dictionary, key):
|
|
51
|
+
return dictionary.get(key, "")
|
|
52
|
+
|
|
53
|
+
|
|
54
|
+
@register.filter
|
|
55
|
+
def format_field_type(field_info):
|
|
56
|
+
field_type = field_info.get("type", "")
|
|
57
|
+
if field_type == "ForeignKey":
|
|
58
|
+
return f"ForeignKey | {field_info.get('field_specific', {}).get('to', '')}"
|
|
59
|
+
if field_type == "CharField":
|
|
60
|
+
max_length = field_info.get("max_length", "")
|
|
61
|
+
return f"CharField | {field_info.get('verbose_name', '')} | max_length={max_length}"
|
|
62
|
+
return field_type
|
|
63
|
+
|
|
64
|
+
|
|
65
|
+
@register.filter
|
|
66
|
+
def format_field_extra(field_info):
|
|
67
|
+
extras = []
|
|
68
|
+
if field_info.get("null"):
|
|
69
|
+
extras.append("null=True")
|
|
70
|
+
if field_info.get("blank"):
|
|
71
|
+
extras.append("blank=True")
|
|
72
|
+
if field_info.get("unique"):
|
|
73
|
+
extras.append("unique=True")
|
|
74
|
+
if field_info.get("primary_key"):
|
|
75
|
+
extras.append("primary_key=True")
|
|
76
|
+
if field_info.get("max_length"):
|
|
77
|
+
extras.append(f"max_length={field_info['max_length']}")
|
|
78
|
+
return ", ".join(extras)
|
|
79
|
+
|
|
80
|
+
|
|
81
|
+
@register.filter
|
|
82
|
+
def yesno(value, arg=None):
|
|
83
|
+
"""
|
|
84
|
+
Given a string mapping values for true, false and (optionally) None,
|
|
85
|
+
return one of those strings according to the value.
|
|
86
|
+
"""
|
|
87
|
+
if arg is None:
|
|
88
|
+
arg = "yes,no,maybe"
|
|
89
|
+
bits = arg.split(",")
|
|
90
|
+
if len(bits) < 2:
|
|
91
|
+
return value # Invalid arg.
|
|
92
|
+
try:
|
|
93
|
+
yes, no, maybe = bits
|
|
94
|
+
except ValueError:
|
|
95
|
+
yes, no, maybe = bits[0], bits[1], bits[1]
|
|
96
|
+
|
|
97
|
+
if value is None:
|
|
98
|
+
return maybe
|
|
99
|
+
if value:
|
|
100
|
+
return yes
|
|
101
|
+
return no
|
|
102
|
+
|
|
103
|
+
|
|
104
|
+
@register.filter
|
|
105
|
+
def format_json(value):
|
|
106
|
+
if isinstance(value, str):
|
|
107
|
+
value = html.unescape(value)
|
|
108
|
+
try:
|
|
109
|
+
parsed = json.loads(value)
|
|
110
|
+
value = json.dumps(parsed, indent=2)
|
|
111
|
+
except (json.JSONDecodeError, TypeError):
|
|
112
|
+
pass
|
|
113
|
+
elif isinstance(value, dict | list):
|
|
114
|
+
value = json.dumps(value, indent=2)
|
|
115
|
+
|
|
116
|
+
return mark_safe(value) # noqa: S308
|