diff --git a/README.md b/README.md index d2010dd1bd..1de665c5c6 100644 --- a/README.md +++ b/README.md @@ -1,4 +1,6 @@ -## frappe [![Build Status](https://travis-ci.org/frappe/frappe.png)](https://travis-ci.org/frappe/frappe) +## Frappe Framework + +[![Build Status](https://travis-ci.org/frappe/frappe.png)](https://travis-ci.org/frappe/frappe) Full-stack web application framework that uses Python and MariaDB on the server side and a tightly integrated client side library. [Built for ERPNext](https://erpnext.com) diff --git a/frappe/commands.py b/frappe/commands.py index 9f3d1f3ea7..71d0149a01 100644 --- a/frappe/commands.py +++ b/frappe/commands.py @@ -350,9 +350,28 @@ def build_website(context): finally: frappe.destroy() -@click.command('setup-docs') +@click.command('build-dev-docs') @pass_context -def setup_docs(context): +@click.argument('app') +@click.argument('docs_version') +def make_dev_docs(context, app, docs_version): + "Setup docs in target folder of target app" + from frappe.utils.setup_docs import setup_docs + from frappe.website import statics + for site in context.sites: + try: + frappe.init(site=site) + frappe.connect() + make = setup_docs(app) + make.build(docs_version) + finally: + frappe.destroy() + +@click.command('make-docs') +@pass_context +@click.argument('app') +@click.argument('target') +def setup_docs(context, app, target): "Setup docs in target folder of target app" from frappe.utils.setup_docs import setup_docs from frappe.website import statics @@ -360,7 +379,8 @@ def setup_docs(context): try: frappe.init(site=site) frappe.connect() - setup_docs() + make = setup_docs(app) + make.make_docs(target) statics.sync_statics(rebuild=True) finally: frappe.destroy() diff --git a/frappe/hooks.py b/frappe/hooks.py index 878d942380..207fa0505c 100644 --- a/frappe/hooks.py +++ b/frappe/hooks.py @@ -2,6 +2,7 @@ from __future__ import unicode_literals app_name = "frappe" app_title = "Frappe Framework" app_publisher = "Frappe Technologies Pvt. Ltd." +app_short_description = "Full stack web framework with Python, Javascript, MariaDB, Redis, Node" app_description = """## Frappe Framework Frappe is a full stack web application framework written in Python, diff --git a/frappe/templates/autodoc/base_template.html b/frappe/templates/autodoc/base_template.html new file mode 100644 index 0000000000..a072527393 --- /dev/null +++ b/frappe/templates/autodoc/base_template.html @@ -0,0 +1,105 @@ + + + + + + + {{ title }} + + + + + + {% block favicon %} + + + {% endblock %} + + {%- block head -%} + {% if meta_block is defined -%} + {{ meta_block }} + {%- endif %} + + {% if head_html is defined -%} + {{ head_html or "" }} + {%- endif %} + + {%- block head_include %}{{ head_include or "" }}{% endblock -%} + + {%- block style %} + + {%- endblock -%} + {%- endblock -%} + {%- if js_globals is defined %} + + {% endif -%} + + +
+
+
+
+ {%- block banner -%} + {% include "templates/includes/banner_extension.html" ignore missing %} + {% if banner_html -%} +
{{ banner_html or "" }}
+ {%- endif %} + {%- endblock -%} + + {%- block navbar -%} + {% include "templates/includes/navbar/navbar.html" %} + {%- endblock -%} +
+ {%- block hero -%} +
+ {{ hero or "" }} +
+ {%- endblock -%} + {% block content %} +
+ {{ content }} +
+ {% endblock %} +
+
+
+ {%- if footer is defined -%}{{ footer }}{%- endif -%} +
+
+
+
+ {%- block footer -%}{% include "templates/includes/footer/footer.html" %}{%- endblock -%} +
+
+ + +
+
+ + + {%- block script %} + + {%- endblock %} + + + {%- block body_include %}{{ body_include or "" }}{% endblock -%} + + diff --git a/frappe/utils/autodoc.py b/frappe/utils/autodoc.py index 70f6ee588d..e919614955 100644 --- a/frappe/utils/autodoc.py +++ b/frappe/utils/autodoc.py @@ -53,7 +53,7 @@ def get_version(name): installed = frappe.get_installed_apps() def _for_module(m): - return importlib.import_module(m.split(".")[0]).__version__ + return getattr(importlib.import_module(m.split(".")[0]), "__version__", "0.0.0") if "." in name or name in installed: return _for_module(name) diff --git a/frappe/utils/setup_docs.py b/frappe/utils/setup_docs.py index 5fac5c28e6..a53ec8c8a3 100644 --- a/frappe/utils/setup_docs.py +++ b/frappe/utils/setup_docs.py @@ -2,29 +2,41 @@ Call from command line: - bench setup-docs app docs_app path + bench setup-docs app path """ import os, json, frappe, markdown2, shutil +import frappe.website.statics +from frappe.website.context import get_context class setup_docs(object): - def __init__(self): + def __init__(self, app, docs_version, target): """Generate source templates for models reference and module API and templates at `templates/autodoc` """ - self.app = frappe.get_hooks("autodoc").get("for_app")[0] - docs_app = frappe.get_hooks("autodoc").get("docs_app")[0] + self.app = app + self.path = frappe.get_app_path(app, "docs", docs_version) + self.target = target + # build apis + # self.build() + + # sync docs + sync = frappe.website.statics.sync() + sync.start(path="docs", rebuild=True) + + # write in target path + self.write_files() + + def build(self): hooks = frappe.get_hooks(app_name = self.app) self.app_title = hooks.get("app_title")[0] - self.app_path = frappe.get_app_path(self.app) - path = frappe.get_app_path(docs_app, "www", "current") print "Deleting current..." - shutil.rmtree(path, ignore_errors = True) - os.makedirs(path) + shutil.rmtree(self.path, ignore_errors = True) + os.makedirs(self.path) self.app_context = { "app": { @@ -38,16 +50,16 @@ class setup_docs(object): } # make home page - with open(os.path.join(path, "index.html"), "w") as home: + with open(os.path.join(self.path, "index.html"), "w") as home: home.write(frappe.render_template("templates/autodoc/docs_home.html", self.app_context)) # make folders - self.models_base_path = os.path.join(path, "models") + self.models_base_path = os.path.join(self.path, "models") self.make_folder(self.models_base_path, template = "templates/autodoc/models_home.html") - self.api_base_path = os.path.join(path, "api") + self.api_base_path = os.path.join(self.path, "api") self.make_folder(self.api_base_path, template = "templates/autodoc/api_home.html") @@ -164,3 +176,29 @@ class setup_docs(object): context.update(self.app_context) f.write(frappe.render_template("templates/autodoc/doctype.html", context).encode("utf-8")) + + def write_files(self): + frappe.local.flags.home_page = "index" + + for page in frappe.db.sql("""select parent_website_route, + page_name from `tabWeb Page`""", as_dict=True): + + if page.parent_website_route: + path = page.parent_website_route + "/" + page.page_name + else: + path = page.page_name + + frappe.local.path = path + + context = get_context(path) + html = frappe.get_template(context.base_template_path).render(context) + + target_filename = os.path.join(self.target, context.template_path.split('/docs/')[1]) + + if not os.path.exists(os.path.dirname(target_filename)): + os.makedirs(os.path.dirname(target_filename)) + + with open(target_filename, "w") as htmlfile: + htmlfile.write(html.encode("utf-8")) + + print "wrote {0}".format(target_filename) diff --git a/frappe/website/render.py b/frappe/website/render.py index 2dedba7004..925309491e 100644 --- a/frappe/website/render.py +++ b/frappe/website/render.py @@ -136,7 +136,6 @@ def build_page(path): frappe.local.path = path context = get_context(path) - html = frappe.get_template(context.base_template_path).render(context) if can_cache(context.no_cache): diff --git a/frappe/website/statics.py b/frappe/website/statics.py index 7482d21517..ba98242045 100644 --- a/frappe/website/statics.py +++ b/frappe/website/statics.py @@ -17,10 +17,11 @@ def sync_statics(rebuild=False): # rebuild = False class sync(object): - def __init__(self, verbose=False): + def __init__(self, verbose=False, path=None): self.verbose = verbose - def start(self, rebuild=False): + def start(self, rebuild=False, path="www"): + self.path = path self.synced = [] self.synced_paths = [] self.updated = 0 @@ -33,7 +34,7 @@ class sync(object): self.cleanup() def sync_for_app(self, app): - self.statics_path = frappe.get_app_path(app, "www") + self.statics_path = frappe.get_app_path(app, self.path) if os.path.exists(self.statics_path): for basepath, folders, files in os.walk(self.statics_path): self.sync_folder(basepath, folders, files, app) diff --git a/frappe/website/utils.py b/frappe/website/utils.py index 03298372e7..64b712cd41 100644 --- a/frappe/website/utils.py +++ b/frappe/website/utils.py @@ -3,7 +3,6 @@ from __future__ import unicode_literals import frappe, re, os -from werkzeug.urls import url_parse, url_unparse def delete_page_cache(path): cache = frappe.cache() @@ -33,14 +32,18 @@ def get_comment_list(doctype, name): and comment_docname=%s order by creation""", (doctype, name), as_dict=1) or [] def get_home_page(): + if frappe.local.flags.home_page: + return frappe.local.flags.home_page + def _get_home_page(): role_home_page = frappe.get_hooks("role_home_page") home_page = None - for role in frappe.get_roles(): - if role in role_home_page: - home_page = role_home_page[role][-1] - break + if role_home_page: + for role in frappe.get_roles(): + if role in role_home_page: + home_page = role_home_page[role][-1] + break if not home_page: home_page = frappe.get_hooks("home_page")