@@ -84,5 +84,19 @@ def get_data(): | |||
"label": _("Portal Settings"), | |||
} | |||
] | |||
} | |||
}, | |||
{ | |||
"label": _("Knowledge Base"), | |||
"items": [ | |||
{ | |||
"type": "doctype", | |||
"name": "Help Category", | |||
}, | |||
{ | |||
"type": "doctype", | |||
"name": "Help Article", | |||
}, | |||
] | |||
}, | |||
] |
@@ -48,7 +48,8 @@ web_include_css = [ | |||
] | |||
website_route_rules = [ | |||
{"from_route": "/blog", "to_route": "Blog Post"}, | |||
{"from_route": "/blog/<category>", "to_route": "Blog Post"} | |||
{"from_route": "/blog/<category>", "to_route": "Blog Post"}, | |||
{"from_route": "/kb/<category>", "to_route": "Help Article"} | |||
] | |||
write_file_keys = ["file_url", "file_name"] | |||
@@ -57,7 +58,8 @@ notification_config = "frappe.core.notifications.get_notification_config" | |||
before_tests = "frappe.utils.install.before_tests" | |||
website_generators = ["Web Page", "Blog Post", "Blog Category", "Web Form"] | |||
website_generators = ["Web Page", "Blog Post", "Blog Category", "Web Form", | |||
"Help Article"] | |||
email_append_to = ["Event", "ToDo", "Communication"] | |||
@@ -147,3 +147,4 @@ frappe.patches.v7_1.refactor_integration_broker | |||
frappe.patches.v7_1.set_backup_limit | |||
frappe.patches.v7_1.disabled_print_settings_for_custom_print_format | |||
frappe.patches.v7_2.set_doctype_engine | |||
frappe.patches.v7_2.merge_knowledge_base |
@@ -0,0 +1,19 @@ | |||
import frappe | |||
from frappe.patches.v7_0.re_route import update_routes | |||
from frappe.installer import remove_from_installed_apps | |||
def execute(): | |||
if 'knowledge_base' in frappe.get_installed_apps(): | |||
frappe.reload_doc('website', 'doctype', 'help_category') | |||
frappe.reload_doc('website', 'doctype', 'help_article') | |||
update_routes(['Help Category', 'Help Article']) | |||
remove_from_installed_apps('knowledge_base') | |||
# set missing routes | |||
for doctype in ('Help Category', 'Help Article'): | |||
for d in frappe.get_all(doctype, fields=['name', 'route']): | |||
if not d.route: | |||
doc = frappe.get_doc(doctype, d.name) | |||
doc.set_route() | |||
doc.db_update() |
@@ -0,0 +1,32 @@ | |||
{% extends "templates/web.html" %} | |||
{% block header %} | |||
<h1>{{ title }}</h1> | |||
{% endblock %} | |||
{% block page_content %} | |||
<article class="help-content" itemscope itemtype="http://schema.org/BlogPost"> | |||
<div class="help-article-info"> | |||
<p> | |||
<span class="indicator {{ level_class }}">{{ level }}</span> | |||
</p> | |||
<h6 class='text-muted'>By {{ author }} on {{ frappe.format_date(creation) }}</h6> | |||
</div> | |||
<div class="longform" itemprop="articleBody" style='margin: 30px 0px;'> | |||
{{ content }} | |||
</div> | |||
<p><br><a href="/{{ category.route }}" class='text-muted small'> | |||
{{ _("More articles on {0}").format(category.name) }}</a></p> | |||
</article> | |||
<div class="help-article-comments"> | |||
<hr> | |||
<h4>Comments</h4> | |||
{% include 'templates/includes/comments/comments.html' %} | |||
</div> | |||
<script> | |||
frappe.ready(function() { | |||
frappe.set_search_path("/kb"); | |||
}); | |||
</script> | |||
{% endblock %} |
@@ -2,8 +2,7 @@ | |||
<div class="comment-header">{{ comment_text or "" }}</div> | |||
{% if not comment_list %} | |||
<div class="no-comment"> | |||
<p class="text-muted">{{ _("Start a new discussion.") }}</p> | |||
<br> | |||
<p class="text-muted small">{{ _("No comments yet. Start a new discussion.") }}</p> | |||
</div> | |||
{% endif %} | |||
@@ -20,7 +19,7 @@ | |||
</div> | |||
<div class="comment-form-wrapper"> | |||
<a class="add-comment btn btn-default btn-sm">{{ _("Add Comment") }}</a> | |||
<a class="add-comment btn btn-default btn-xs">{{ _("Add Comment") }}</a> | |||
<div style="display: none;" id="comment-form"> | |||
<p>{{ _("Leave a Comment") }}</p> | |||
<div class="alert" style="display:none;"></div> | |||
@@ -0,0 +1,15 @@ | |||
{% set article = doc %} | |||
<div class="row"> | |||
<div class="col-sm-9"> | |||
<p> | |||
<a class="no-decoration" href="/{{ article.route }}"> | |||
{{ article.title }} | |||
</a><br> | |||
</p> | |||
</div> | |||
<div class="col-sm-3 indicator-column text-right"> | |||
<span class="help-category-label indicator-right {{ get_level_class(article.level) }}"> | |||
{{ article.level }} | |||
</span> | |||
</div> | |||
</div> |
@@ -0,0 +1,8 @@ | |||
// Copyright (c) 2016, Frappe Technologies and contributors | |||
// For license information, please see license.txt | |||
frappe.ui.form.on('Help Article', { | |||
refresh: function(frm) { | |||
} | |||
}); |
@@ -0,0 +1,414 @@ | |||
{ | |||
"allow_copy": 0, | |||
"allow_import": 1, | |||
"allow_rename": 0, | |||
"beta": 0, | |||
"creation": "2014-10-30 14:25:53.780105", | |||
"custom": 0, | |||
"docstatus": 0, | |||
"doctype": "DocType", | |||
"document_type": "", | |||
"editable_grid": 0, | |||
"fields": [ | |||
{ | |||
"allow_on_submit": 0, | |||
"bold": 0, | |||
"collapsible": 0, | |||
"columns": 0, | |||
"fieldname": "title", | |||
"fieldtype": "Data", | |||
"hidden": 0, | |||
"ignore_user_permissions": 0, | |||
"ignore_xss_filter": 0, | |||
"in_filter": 0, | |||
"in_list_view": 0, | |||
"in_standard_filter": 0, | |||
"label": "Title", | |||
"length": 0, | |||
"no_copy": 0, | |||
"permlevel": 0, | |||
"precision": "", | |||
"print_hide": 0, | |||
"print_hide_if_no_value": 0, | |||
"read_only": 0, | |||
"remember_last_selected_value": 0, | |||
"report_hide": 0, | |||
"reqd": 1, | |||
"search_index": 0, | |||
"set_only_once": 0, | |||
"unique": 0 | |||
}, | |||
{ | |||
"allow_on_submit": 0, | |||
"bold": 0, | |||
"collapsible": 0, | |||
"columns": 0, | |||
"fieldname": "category", | |||
"fieldtype": "Link", | |||
"hidden": 0, | |||
"ignore_user_permissions": 0, | |||
"ignore_xss_filter": 0, | |||
"in_filter": 0, | |||
"in_list_view": 1, | |||
"in_standard_filter": 0, | |||
"label": "Category", | |||
"length": 0, | |||
"no_copy": 0, | |||
"options": "Help Category", | |||
"permlevel": 0, | |||
"precision": "", | |||
"print_hide": 0, | |||
"print_hide_if_no_value": 0, | |||
"read_only": 0, | |||
"remember_last_selected_value": 0, | |||
"report_hide": 0, | |||
"reqd": 1, | |||
"search_index": 0, | |||
"set_only_once": 0, | |||
"unique": 0 | |||
}, | |||
{ | |||
"allow_on_submit": 0, | |||
"bold": 0, | |||
"collapsible": 0, | |||
"columns": 0, | |||
"fieldname": "published", | |||
"fieldtype": "Check", | |||
"hidden": 0, | |||
"ignore_user_permissions": 0, | |||
"ignore_xss_filter": 0, | |||
"in_filter": 0, | |||
"in_list_view": 0, | |||
"in_standard_filter": 0, | |||
"label": "Published", | |||
"length": 0, | |||
"no_copy": 0, | |||
"permlevel": 0, | |||
"precision": "", | |||
"print_hide": 0, | |||
"print_hide_if_no_value": 0, | |||
"read_only": 0, | |||
"remember_last_selected_value": 0, | |||
"report_hide": 0, | |||
"reqd": 0, | |||
"search_index": 0, | |||
"set_only_once": 0, | |||
"unique": 0 | |||
}, | |||
{ | |||
"allow_on_submit": 0, | |||
"bold": 0, | |||
"collapsible": 0, | |||
"columns": 0, | |||
"fieldname": "column_break_4", | |||
"fieldtype": "Column Break", | |||
"hidden": 0, | |||
"ignore_user_permissions": 0, | |||
"ignore_xss_filter": 0, | |||
"in_filter": 0, | |||
"in_list_view": 0, | |||
"in_standard_filter": 0, | |||
"length": 0, | |||
"no_copy": 0, | |||
"permlevel": 0, | |||
"precision": "", | |||
"print_hide": 0, | |||
"print_hide_if_no_value": 0, | |||
"read_only": 0, | |||
"remember_last_selected_value": 0, | |||
"report_hide": 0, | |||
"reqd": 0, | |||
"search_index": 0, | |||
"set_only_once": 0, | |||
"unique": 0 | |||
}, | |||
{ | |||
"allow_on_submit": 0, | |||
"bold": 0, | |||
"collapsible": 0, | |||
"columns": 0, | |||
"default": "user_fullname", | |||
"fieldname": "author", | |||
"fieldtype": "Data", | |||
"hidden": 0, | |||
"ignore_user_permissions": 0, | |||
"ignore_xss_filter": 0, | |||
"in_filter": 0, | |||
"in_list_view": 0, | |||
"in_standard_filter": 0, | |||
"label": "Author", | |||
"length": 0, | |||
"no_copy": 0, | |||
"permlevel": 0, | |||
"precision": "", | |||
"print_hide": 0, | |||
"print_hide_if_no_value": 0, | |||
"read_only": 0, | |||
"remember_last_selected_value": 0, | |||
"report_hide": 0, | |||
"reqd": 0, | |||
"search_index": 0, | |||
"set_only_once": 0, | |||
"unique": 0 | |||
}, | |||
{ | |||
"allow_on_submit": 0, | |||
"bold": 0, | |||
"collapsible": 0, | |||
"columns": 0, | |||
"fieldname": "level", | |||
"fieldtype": "Select", | |||
"hidden": 0, | |||
"ignore_user_permissions": 0, | |||
"ignore_xss_filter": 0, | |||
"in_filter": 0, | |||
"in_list_view": 0, | |||
"in_standard_filter": 0, | |||
"label": "Level", | |||
"length": 0, | |||
"no_copy": 0, | |||
"options": "Beginner\nIntermediate\nExpert", | |||
"permlevel": 0, | |||
"precision": "", | |||
"print_hide": 0, | |||
"print_hide_if_no_value": 0, | |||
"read_only": 0, | |||
"remember_last_selected_value": 0, | |||
"report_hide": 0, | |||
"reqd": 0, | |||
"search_index": 0, | |||
"set_only_once": 0, | |||
"unique": 0 | |||
}, | |||
{ | |||
"allow_on_submit": 0, | |||
"bold": 0, | |||
"collapsible": 0, | |||
"columns": 0, | |||
"fieldname": "section_break_7", | |||
"fieldtype": "Section Break", | |||
"hidden": 0, | |||
"ignore_user_permissions": 0, | |||
"ignore_xss_filter": 0, | |||
"in_filter": 0, | |||
"in_list_view": 0, | |||
"in_standard_filter": 0, | |||
"length": 0, | |||
"no_copy": 0, | |||
"permlevel": 0, | |||
"precision": "", | |||
"print_hide": 0, | |||
"print_hide_if_no_value": 0, | |||
"read_only": 0, | |||
"remember_last_selected_value": 0, | |||
"report_hide": 0, | |||
"reqd": 0, | |||
"search_index": 0, | |||
"set_only_once": 0, | |||
"unique": 0 | |||
}, | |||
{ | |||
"allow_on_submit": 0, | |||
"bold": 0, | |||
"collapsible": 0, | |||
"columns": 0, | |||
"fieldname": "content", | |||
"fieldtype": "Text Editor", | |||
"hidden": 0, | |||
"ignore_user_permissions": 0, | |||
"ignore_xss_filter": 0, | |||
"in_filter": 0, | |||
"in_list_view": 0, | |||
"in_standard_filter": 0, | |||
"label": "Content", | |||
"length": 0, | |||
"no_copy": 0, | |||
"permlevel": 0, | |||
"precision": "", | |||
"print_hide": 0, | |||
"print_hide_if_no_value": 0, | |||
"read_only": 0, | |||
"remember_last_selected_value": 0, | |||
"report_hide": 0, | |||
"reqd": 1, | |||
"search_index": 0, | |||
"set_only_once": 0, | |||
"unique": 0 | |||
}, | |||
{ | |||
"allow_on_submit": 0, | |||
"bold": 0, | |||
"collapsible": 0, | |||
"columns": 0, | |||
"fieldname": "likes", | |||
"fieldtype": "Int", | |||
"hidden": 0, | |||
"ignore_user_permissions": 0, | |||
"ignore_xss_filter": 0, | |||
"in_filter": 0, | |||
"in_list_view": 0, | |||
"in_standard_filter": 0, | |||
"label": "Likes", | |||
"length": 0, | |||
"no_copy": 0, | |||
"permlevel": 0, | |||
"precision": "", | |||
"print_hide": 0, | |||
"print_hide_if_no_value": 0, | |||
"read_only": 1, | |||
"remember_last_selected_value": 0, | |||
"report_hide": 0, | |||
"reqd": 0, | |||
"search_index": 0, | |||
"set_only_once": 0, | |||
"unique": 0 | |||
}, | |||
{ | |||
"allow_on_submit": 0, | |||
"bold": 0, | |||
"collapsible": 0, | |||
"columns": 0, | |||
"fieldname": "route", | |||
"fieldtype": "Data", | |||
"hidden": 0, | |||
"ignore_user_permissions": 0, | |||
"ignore_xss_filter": 0, | |||
"in_filter": 0, | |||
"in_list_view": 0, | |||
"in_standard_filter": 0, | |||
"label": "Route", | |||
"length": 0, | |||
"no_copy": 0, | |||
"permlevel": 0, | |||
"precision": "", | |||
"print_hide": 0, | |||
"print_hide_if_no_value": 0, | |||
"read_only": 0, | |||
"remember_last_selected_value": 0, | |||
"report_hide": 0, | |||
"reqd": 0, | |||
"search_index": 0, | |||
"set_only_once": 0, | |||
"unique": 0 | |||
}, | |||
{ | |||
"allow_on_submit": 0, | |||
"bold": 0, | |||
"collapsible": 0, | |||
"columns": 0, | |||
"default": "user", | |||
"fieldname": "owner", | |||
"fieldtype": "Link", | |||
"hidden": 0, | |||
"ignore_user_permissions": 0, | |||
"ignore_xss_filter": 0, | |||
"in_filter": 0, | |||
"in_list_view": 0, | |||
"in_standard_filter": 0, | |||
"label": "Owner", | |||
"length": 0, | |||
"no_copy": 0, | |||
"options": "User", | |||
"permlevel": 0, | |||
"precision": "", | |||
"print_hide": 0, | |||
"print_hide_if_no_value": 0, | |||
"read_only": 0, | |||
"remember_last_selected_value": 0, | |||
"report_hide": 0, | |||
"reqd": 0, | |||
"search_index": 0, | |||
"set_only_once": 0, | |||
"unique": 0 | |||
} | |||
], | |||
"hide_heading": 0, | |||
"hide_toolbar": 0, | |||
"icon": "icon-file-alt", | |||
"idx": 0, | |||
"image_view": 0, | |||
"in_create": 0, | |||
"in_dialog": 0, | |||
"is_submittable": 0, | |||
"issingle": 0, | |||
"istable": 0, | |||
"max_attachments": 0, | |||
"modified": "2016-11-28 06:52:49.173892", | |||
"modified_by": "Administrator", | |||
"module": "Website", | |||
"name": "Help Article", | |||
"name_case": "", | |||
"owner": "Administrator", | |||
"permissions": [ | |||
{ | |||
"amend": 0, | |||
"apply_user_permissions": 0, | |||
"cancel": 0, | |||
"create": 1, | |||
"delete": 1, | |||
"email": 1, | |||
"export": 1, | |||
"if_owner": 0, | |||
"import": 1, | |||
"is_custom": 0, | |||
"permlevel": 0, | |||
"print": 1, | |||
"read": 1, | |||
"report": 1, | |||
"role": "Knowledge Base Editor", | |||
"set_user_permissions": 0, | |||
"share": 0, | |||
"submit": 0, | |||
"write": 1 | |||
}, | |||
{ | |||
"amend": 0, | |||
"apply_user_permissions": 1, | |||
"cancel": 0, | |||
"create": 1, | |||
"delete": 0, | |||
"email": 0, | |||
"export": 0, | |||
"if_owner": 0, | |||
"import": 0, | |||
"is_custom": 0, | |||
"permlevel": 0, | |||
"print": 0, | |||
"read": 1, | |||
"report": 0, | |||
"role": "Knowledge Base Contributor", | |||
"set_user_permissions": 0, | |||
"share": 0, | |||
"submit": 0, | |||
"write": 1 | |||
}, | |||
{ | |||
"amend": 0, | |||
"apply_user_permissions": 0, | |||
"cancel": 0, | |||
"create": 0, | |||
"delete": 0, | |||
"email": 0, | |||
"export": 0, | |||
"if_owner": 0, | |||
"import": 0, | |||
"is_custom": 0, | |||
"permlevel": 0, | |||
"print": 0, | |||
"read": 1, | |||
"report": 0, | |||
"role": "Guest", | |||
"set_user_permissions": 0, | |||
"share": 0, | |||
"submit": 0, | |||
"write": 0 | |||
} | |||
], | |||
"quick_entry": 0, | |||
"read_only": 0, | |||
"read_only_onload": 0, | |||
"sort_field": "modified", | |||
"sort_order": "DESC", | |||
"title_field": "title", | |||
"track_seen": 0 | |||
} |
@@ -0,0 +1,109 @@ | |||
# Copyright (c) 2013, Frappe and contributors | |||
# For license information, please see license.txt | |||
from __future__ import unicode_literals | |||
import frappe | |||
from frappe.website.website_generator import WebsiteGenerator | |||
from frappe.utils import is_markdown, markdown | |||
from frappe.website.utils import get_comment_list | |||
from frappe import _ | |||
class HelpArticle(WebsiteGenerator): | |||
website = frappe._dict( | |||
condition_field = "published", | |||
template = "templates/generators/help_article.html", | |||
) | |||
def validate(self): | |||
self.set_route() | |||
def set_route(self): | |||
'''Set route from category and title if missing''' | |||
if not self.route: | |||
self.route = '/'.join([frappe.get_value('Help Category', self.category, 'route'), | |||
self.scrub(self.title)]) | |||
def on_update(self): | |||
self.update_category() | |||
clear_cache() | |||
super(HelpArticle, self).on_update() | |||
def update_category(self): | |||
cnt = frappe.db.sql("""select count(*) from `tabHelp Article` | |||
where category=%s and ifnull(published,0)=1""", self.category)[0][0] | |||
cat = frappe.get_doc("Help Category", self.category) | |||
cat.help_articles = cnt | |||
cat.save() | |||
def get_context(self, context): | |||
if is_markdown(context.content): | |||
context.content = markdown(context.content) | |||
context.login_required = True | |||
context.category = frappe.get_doc('Help Category', self.category) | |||
context.level_class = get_level_class(self.level) | |||
context.comment_list = get_comment_list(self.doctype, self.name) | |||
context.show_sidebar = True | |||
context.sidebar_items = get_sidebar_items() | |||
context.parents = self.get_parents(context) | |||
def get_parents(self, context): | |||
return [{"title": context.category.category_name, "name":context.category.route}] | |||
def get_list_context(context=None): | |||
filters = dict(published=1) | |||
category = frappe.db.get_value("Help Category", { "route": frappe.local.path }) | |||
if category: | |||
filters['category'] = category | |||
list_context = frappe._dict( | |||
title = category or _("Knowledge Base"), | |||
row_template = "templates/includes/kb_row.html", | |||
get_level_class = get_level_class, | |||
show_sidebar = True, | |||
sidebar_items = get_sidebar_items(), | |||
hide_filters = True, | |||
filters = filters, | |||
category = frappe.local.form_dict.category, | |||
no_breadcrumbs = True | |||
) | |||
if frappe.local.form_dict.txt: | |||
list_context.blog_subtitle = _('Filtered by "{0}"').format(frappe.local.form_dict.txt) | |||
# | |||
# list_context.update(frappe.get_doc("Blog Settings", "Blog Settings").as_dict()) | |||
return list_context | |||
def get_level_class(level): | |||
return { | |||
"Beginner": "green", | |||
"Intermediate": "orange", | |||
"Expert": "red" | |||
}[level] | |||
def get_sidebar_items(): | |||
def _get(): | |||
return frappe.db.sql("""select | |||
concat(category_name, " (", help_articles, ")") as title, | |||
concat('/', route) as route | |||
from | |||
`tabHelp Category` | |||
where | |||
ifnull(published,0)=1 and help_articles > 0 | |||
order by | |||
help_articles desc""", as_dict=True) | |||
return frappe.cache().get_value("knowledge_base:category_sidebar", _get) | |||
def clear_cache(): | |||
clear_website_cache() | |||
from frappe.website.render import clear_cache | |||
clear_cache() | |||
def clear_website_cache(path=None): | |||
frappe.cache().delete_value("knowledge_base:category_sidebar") | |||
frappe.cache().delete_value("knowledge_base:faq") | |||
@@ -0,0 +1,12 @@ | |||
# -*- coding: utf-8 -*- | |||
# Copyright (c) 2015, Frappe Technologies and Contributors | |||
# See license.txt | |||
from __future__ import unicode_literals | |||
import frappe | |||
import unittest | |||
# test_records = frappe.get_test_records('Help Article') | |||
class TestHelpArticle(unittest.TestCase): | |||
pass |
@@ -0,0 +1,8 @@ | |||
// Copyright (c) 2016, Frappe Technologies and contributors | |||
// For license information, please see license.txt | |||
frappe.ui.form.on('Help Category', { | |||
refresh: function(frm) { | |||
} | |||
}); |
@@ -0,0 +1,222 @@ | |||
{ | |||
"allow_copy": 0, | |||
"allow_import": 1, | |||
"allow_rename": 0, | |||
"autoname": "", | |||
"beta": 0, | |||
"creation": "2014-10-30 14:23:30.958074", | |||
"custom": 0, | |||
"docstatus": 0, | |||
"doctype": "DocType", | |||
"document_type": "", | |||
"editable_grid": 0, | |||
"fields": [ | |||
{ | |||
"allow_on_submit": 0, | |||
"bold": 0, | |||
"collapsible": 0, | |||
"columns": 0, | |||
"fieldname": "category_name", | |||
"fieldtype": "Data", | |||
"hidden": 0, | |||
"ignore_user_permissions": 0, | |||
"ignore_xss_filter": 0, | |||
"in_filter": 0, | |||
"in_list_view": 1, | |||
"in_standard_filter": 0, | |||
"label": "Category Name", | |||
"length": 0, | |||
"no_copy": 0, | |||
"permlevel": 0, | |||
"precision": "", | |||
"print_hide": 0, | |||
"print_hide_if_no_value": 0, | |||
"read_only": 0, | |||
"remember_last_selected_value": 0, | |||
"report_hide": 0, | |||
"reqd": 1, | |||
"search_index": 0, | |||
"set_only_once": 0, | |||
"unique": 0 | |||
}, | |||
{ | |||
"allow_on_submit": 0, | |||
"bold": 0, | |||
"collapsible": 0, | |||
"columns": 0, | |||
"fieldname": "category_description", | |||
"fieldtype": "Text", | |||
"hidden": 0, | |||
"ignore_user_permissions": 0, | |||
"ignore_xss_filter": 0, | |||
"in_filter": 0, | |||
"in_list_view": 1, | |||
"in_standard_filter": 0, | |||
"label": "Category Description", | |||
"length": 0, | |||
"no_copy": 0, | |||
"permlevel": 0, | |||
"precision": "", | |||
"print_hide": 0, | |||
"print_hide_if_no_value": 0, | |||
"read_only": 0, | |||
"remember_last_selected_value": 0, | |||
"report_hide": 0, | |||
"reqd": 0, | |||
"search_index": 0, | |||
"set_only_once": 0, | |||
"unique": 0 | |||
}, | |||
{ | |||
"allow_on_submit": 0, | |||
"bold": 0, | |||
"collapsible": 0, | |||
"columns": 0, | |||
"fieldname": "published", | |||
"fieldtype": "Check", | |||
"hidden": 0, | |||
"ignore_user_permissions": 0, | |||
"ignore_xss_filter": 0, | |||
"in_filter": 0, | |||
"in_list_view": 0, | |||
"in_standard_filter": 0, | |||
"label": "Published", | |||
"length": 0, | |||
"no_copy": 0, | |||
"permlevel": 0, | |||
"precision": "", | |||
"print_hide": 0, | |||
"print_hide_if_no_value": 0, | |||
"read_only": 0, | |||
"remember_last_selected_value": 0, | |||
"report_hide": 0, | |||
"reqd": 0, | |||
"search_index": 0, | |||
"set_only_once": 0, | |||
"unique": 0 | |||
}, | |||
{ | |||
"allow_on_submit": 0, | |||
"bold": 0, | |||
"collapsible": 0, | |||
"columns": 0, | |||
"fieldname": "help_articles", | |||
"fieldtype": "Int", | |||
"hidden": 0, | |||
"ignore_user_permissions": 0, | |||
"ignore_xss_filter": 0, | |||
"in_filter": 0, | |||
"in_list_view": 1, | |||
"in_standard_filter": 0, | |||
"label": "Help Articles", | |||
"length": 0, | |||
"no_copy": 0, | |||
"permlevel": 0, | |||
"precision": "", | |||
"print_hide": 0, | |||
"print_hide_if_no_value": 0, | |||
"read_only": 1, | |||
"remember_last_selected_value": 0, | |||
"report_hide": 0, | |||
"reqd": 0, | |||
"search_index": 0, | |||
"set_only_once": 0, | |||
"unique": 0 | |||
}, | |||
{ | |||
"allow_on_submit": 0, | |||
"bold": 0, | |||
"collapsible": 0, | |||
"columns": 0, | |||
"fieldname": "route", | |||
"fieldtype": "Data", | |||
"hidden": 0, | |||
"ignore_user_permissions": 0, | |||
"ignore_xss_filter": 0, | |||
"in_filter": 0, | |||
"in_list_view": 0, | |||
"in_standard_filter": 0, | |||
"label": "Route", | |||
"length": 0, | |||
"no_copy": 0, | |||
"permlevel": 0, | |||
"precision": "", | |||
"print_hide": 0, | |||
"print_hide_if_no_value": 0, | |||
"read_only": 0, | |||
"remember_last_selected_value": 0, | |||
"report_hide": 0, | |||
"reqd": 0, | |||
"search_index": 0, | |||
"set_only_once": 0, | |||
"unique": 0 | |||
} | |||
], | |||
"hide_heading": 0, | |||
"hide_toolbar": 0, | |||
"icon": "icon-list", | |||
"idx": 0, | |||
"image_view": 0, | |||
"in_create": 0, | |||
"in_dialog": 0, | |||
"is_submittable": 0, | |||
"issingle": 0, | |||
"istable": 0, | |||
"max_attachments": 0, | |||
"modified": "2016-11-28 02:39:47.111785", | |||
"modified_by": "Administrator", | |||
"module": "Website", | |||
"name": "Help Category", | |||
"name_case": "Title Case", | |||
"owner": "Administrator", | |||
"permissions": [ | |||
{ | |||
"amend": 0, | |||
"apply_user_permissions": 0, | |||
"cancel": 0, | |||
"create": 1, | |||
"delete": 1, | |||
"email": 1, | |||
"export": 1, | |||
"if_owner": 0, | |||
"import": 1, | |||
"is_custom": 0, | |||
"permlevel": 0, | |||
"print": 1, | |||
"read": 1, | |||
"report": 1, | |||
"role": "Knowledge Base Editor", | |||
"set_user_permissions": 0, | |||
"share": 0, | |||
"submit": 0, | |||
"write": 1 | |||
}, | |||
{ | |||
"amend": 0, | |||
"apply_user_permissions": 0, | |||
"cancel": 0, | |||
"create": 0, | |||
"delete": 0, | |||
"email": 0, | |||
"export": 0, | |||
"if_owner": 0, | |||
"import": 0, | |||
"is_custom": 0, | |||
"permlevel": 0, | |||
"print": 0, | |||
"read": 1, | |||
"report": 0, | |||
"role": "Knowledge Base Contributor", | |||
"set_user_permissions": 0, | |||
"share": 0, | |||
"submit": 0, | |||
"write": 0 | |||
} | |||
], | |||
"quick_entry": 0, | |||
"read_only": 0, | |||
"read_only_onload": 0, | |||
"sort_field": "modified", | |||
"sort_order": "DESC", | |||
"track_seen": 0 | |||
} |
@@ -0,0 +1,30 @@ | |||
# Copyright (c) 2013, Frappe and contributors | |||
# For license information, please see license.txt | |||
from __future__ import unicode_literals | |||
import frappe | |||
from frappe.website.website_generator import WebsiteGenerator | |||
from frappe.website.doctype.help_article.help_article import clear_cache | |||
class HelpCategory(WebsiteGenerator): | |||
website = frappe._dict( | |||
condition_field = "published", | |||
page_title_field = "category_name" | |||
) | |||
def before_insert(self): | |||
self.published=1 | |||
def autoname(self): | |||
self.name = self.category_name | |||
def validate(self): | |||
self.set_route() | |||
def set_route(self): | |||
if not self.route: | |||
self.route = 'kb/' + self.scrub(self.category_name) | |||
def on_update(self): | |||
clear_cache() | |||
super(HelpCategory, self).on_update() |
@@ -0,0 +1,12 @@ | |||
# -*- coding: utf-8 -*- | |||
# Copyright (c) 2015, Frappe Technologies and Contributors | |||
# See license.txt | |||
from __future__ import unicode_literals | |||
import frappe | |||
import unittest | |||
# test_records = frappe.get_test_records('Help Category') | |||
class TestHelpCategory(unittest.TestCase): | |||
pass |