Merge branch 'develop' into quality_procedure_fix

This commit is contained in:
Marica 2020-06-17 18:27:04 +05:30 committed by GitHub
commit 5f3cdce353
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
8 changed files with 180 additions and 6 deletions

View File

@ -146,7 +146,7 @@
"idx": 1, "idx": 1,
"is_tree": 1, "is_tree": 1,
"links": [], "links": [],
"modified": "2020-04-29 16:09:30.025214", "modified": "2020-06-17 16:09:30.025214",
"modified_by": "Administrator", "modified_by": "Administrator",
"module": "Accounts", "module": "Accounts",
"name": "Cost Center", "name": "Cost Center",

View File

@ -227,7 +227,9 @@ class StockController(AccountsController):
def check_expense_account(self, item): def check_expense_account(self, item):
if not item.get("expense_account"): if not item.get("expense_account"):
frappe.throw(_("Expense Account not set for Item {0}. Please set an Expense Account for the item in the Items table").format(item.item_code)) frappe.throw(_("Row #{0}: Expense Account not set for Item {1}. Please set an Expense \
Account in the Items table").format(item.idx, frappe.bold(item.item_code)),
title=_("Expense Account Missing"))
else: else:
is_expense_account = frappe.db.get_value("Account", is_expense_account = frappe.db.get_value("Account",

View File

@ -9,6 +9,14 @@ frappe.ui.form.on('Fee Structure', {
}, },
onload: function(frm) { onload: function(frm) {
frm.set_query("academic_term", function() {
return {
"filters": {
"academic_year": frm.doc.academic_year
}
};
});
frm.set_query("receivable_account", function(doc) { frm.set_query("receivable_account", function(doc) {
return { return {
filters: { filters: {

View File

@ -1,4 +1,5 @@
{ {
"actions": [],
"allow_import": 1, "allow_import": 1,
"allow_rename": 1, "allow_rename": 1,
"autoname": "naming_series:", "autoname": "naming_series:",
@ -11,8 +12,8 @@
"program", "program",
"student_category", "student_category",
"column_break_2", "column_break_2",
"academic_term",
"academic_year", "academic_year",
"academic_term",
"section_break_4", "section_break_4",
"components", "components",
"section_break_6", "section_break_6",
@ -157,7 +158,8 @@
], ],
"icon": "fa fa-flag", "icon": "fa fa-flag",
"is_submittable": 1, "is_submittable": 1,
"modified": "2019-05-26 09:04:17.765758", "links": [],
"modified": "2020-06-16 15:34:57.295010",
"modified_by": "Administrator", "modified_by": "Administrator",
"module": "Education", "module": "Education",
"name": "Fee Structure", "name": "Fee Structure",

View File

@ -1,5 +1,5 @@
{ {
"actions": [], "actions": "",
"creation": "2017-02-17 13:07:35.686409", "creation": "2017-02-17 13:07:35.686409",
"doctype": "DocType", "doctype": "DocType",
"editable_grid": 1, "editable_grid": 1,
@ -22,6 +22,10 @@
"post_description_key", "post_description_key",
"post_route_key", "post_route_key",
"post_route_string", "post_route_string",
"greetings_section_section",
"greeting_title",
"column_break_19",
"greeting_subtitle",
"search_apis_sb", "search_apis_sb",
"search_apis" "search_apis"
], ],
@ -127,11 +131,40 @@
"fieldname": "allow_resetting_service_level_agreement", "fieldname": "allow_resetting_service_level_agreement",
"fieldtype": "Check", "fieldtype": "Check",
"label": "Allow Resetting Service Level Agreement" "label": "Allow Resetting Service Level Agreement"
},
{
"default": "We're here to help",
"fieldname": "greeting_title",
"fieldtype": "Data",
"label": "Greeting Title",
"show_days": 1,
"show_seconds": 1
},
{
"fieldname": "column_break_19",
"fieldtype": "Column Break",
"show_days": 1,
"show_seconds": 1
},
{
"default": "Browse help topics",
"fieldname": "greeting_subtitle",
"fieldtype": "Data",
"label": "Greeting Subtitle",
"show_days": 1,
"show_seconds": 1
},
{
"fieldname": "greetings_section_section",
"fieldtype": "Section Break",
"label": "Greetings Section",
"show_days": 1,
"show_seconds": 1
} }
], ],
"issingle": 1, "issingle": 1,
"links": [], "links": [],
"modified": "2020-06-05 17:56:17.491684", "modified": "2020-06-11 13:08:38.473616",
"modified_by": "Administrator", "modified_by": "Administrator",
"module": "Support", "module": "Support",
"name": "Support Settings", "name": "Support Settings",

View File

View File

@ -0,0 +1,55 @@
{% extends "templates/web.html" %}
{% block content %}
<section class="section section-padding-top section-padding-bottom">
<div class='container'>
<div class="hero-content">
<h1 class="h1">{{ _(greeting_title) or _("We're here to help") }}</h1>
<p class="hero-subtitle">{{ greeting_subtitle or _("Browse help topics.") }}</p>
</div>
</div>
</section>
{% if favorite_article_list %}
<section class="section section-padding-top section-padding-bottom">
<div class='container'>
<h3>{{ _("Frequently Read Articles") }}</h3>
<div class="row">
{% for favorite_article in favorite_article_list %}
<div class="mt-4 col-12 col-sm-6 col-lg-4">
<div class="card card-md h-100">
<div class="card-body">
<h6 class="card-subtitle mb-2 text-uppercase small text-muted">{{ favorite_article['category'] }}</h6>
<h3 class="card-title">{{ favorite_article['title'] }}</h3>
<p class="card-text">{{ favorite_article['description'] }}</p>
</div>
<a href="{{ favorite_article['route'] }}" class="stretched-link"></a>
</div>
</div>
{% endfor %}
</div>
</div>
</section>
{% endif %}
{% if help_article_list %}
<section class="section section-padding-top section-padding-bottom bg-light">
<div class='container'>
<h3>{{ _("Help Articles") }}</h3>
<div class="row">
{% for item in help_article_list %}
<div class="mt-5 col-12 col-sm-6 col-lg-4">
<h5>{{ item['category'].name }}</h5>
<div>
{% for article in item['articles'] %}
<a href="{{ article.route }}" class="mt-2 d-block">{{ article.title }}</a>
{% endfor %}
</div>
</div>
{% endfor %}
</div>
</div>
</section>
{% endif %}
{% endblock %}

View File

@ -0,0 +1,74 @@
from __future__ import unicode_literals
import frappe
def get_context(context):
context.no_cache = 1
context.align_greeting = ''
setting = frappe.get_doc("Support Settings")
context.greeting_title = setting.greeting_title
context.greeting_subtitle = setting.greeting_subtitle
# Support content
favorite_articles = get_favorite_articles_by_page_view()
if len(favorite_articles) < 6:
name_list = []
if favorite_articles:
for article in favorite_articles:
name_list.append(article.name)
for record in (frappe.get_all("Help Article",
fields=["title", "content", "route", "category"],
filters={"name": ['not in', tuple(name_list)], "published": 1},
order_by="creation desc", limit=(6-len(favorite_articles)))):
favorite_articles.append(record)
context.favorite_article_list = get_favorite_articles(favorite_articles)
context.help_article_list = get_help_article_list()
def get_favorite_articles_by_page_view():
return frappe.db.sql(
"""
SELECT
t1.name as name,
t1.title as title,
t1.content as content,
t1.route as route,
t1.category as category,
count(t1.route) as count
FROM `tabHelp Article` AS t1
INNER JOIN
`tabWeb Page View` AS t2
ON t1.route = t2.path
WHERE t1.published = 1
GROUP BY route
ORDER BY count DESC
LIMIT 6;
""", as_dict=True)
def get_favorite_articles(favorite_articles):
favorite_article_list=[]
for article in favorite_articles:
description = frappe.utils.strip_html(article.content)
if len(description) > 175:
description = description[:172] + '...'
favorite_article_dict = {
'title': article.title,
'description': description,
'route': article.route,
'category': article.category,
}
favorite_article_list.append(favorite_article_dict)
return favorite_article_list
def get_help_article_list():
help_article_list=[]
category_list = frappe.get_all("Help Category", fields="name")
for category in category_list:
help_articles = frappe.get_all("Help Article", fields="*", filters={"category": category.name, "published": 1}, order_by="modified desc", limit=5)
if help_articles:
help_aricles_per_caetgory = {
'category': category,
'articles': help_articles,
}
help_article_list.append(help_aricles_per_caetgory)
return help_article_list