@@ -26,8 +26,7 @@ class TestUserPermission(unittest.TestCase): | |||
user = create_user('test_user_perm1@example.com', 'Website Manager') | |||
for category in ['general', 'public']: | |||
if not frappe.db.exists('Blog Category', category): | |||
frappe.get_doc({'doctype': 'Blog Category', | |||
'category_name': category, 'title': category}).insert() | |||
frappe.get_doc({'doctype': 'Blog Category', 'title': category}).insert() | |||
param = get_params(user, 'Blog Category', 'general', is_default=1) | |||
add_user_permissions(param) | |||
@@ -305,6 +305,7 @@ frappe.patches.v12_0.fix_email_id_formatting | |||
frappe.patches.v13_0.add_toggle_width_in_navbar_settings | |||
frappe.patches.v13_0.rename_notification_fields | |||
frappe.patches.v13_0.remove_duplicate_navbar_items | |||
frappe.patches.v13_0.set_route_for_blog_category | |||
frappe.patches.v13_0.enable_custom_script | |||
frappe.patches.v13_0.update_newsletter_content_type | |||
frappe.patches.v13_0.delete_event_producer_and_consumer_keys |
@@ -0,0 +1,8 @@ | |||
import frappe | |||
def execute(): | |||
categories = frappe.get_list("Blog Category") | |||
for category in categories: | |||
doc = frappe.get_doc("Blog Category", category["name"]) | |||
doc.set_route() | |||
doc.save() |
@@ -46,7 +46,8 @@ class FullTextSearch: | |||
doc_name (str): name of the document to be updated | |||
""" | |||
document = self.get_document_to_index(doc_name) | |||
self.update_index(document) | |||
if document: | |||
self.update_index(document) | |||
def remove_document_from_index(self, doc_name): | |||
"""Remove document from search index | |||
@@ -24,7 +24,7 @@ class TestFormLoad(unittest.TestCase): | |||
def test_fieldlevel_permissions_in_load(self): | |||
blog = frappe.get_doc({ | |||
"doctype": "Blog Post", | |||
"blog_category": "_Test Blog Category 1", | |||
"blog_category": "-test-blog-category-1", | |||
"blog_intro": "Test Blog Intro", | |||
"blogger": "_Test Blogger 1", | |||
"content": "Test Blog Content", | |||
@@ -40,7 +40,7 @@ class TestFormLoad(unittest.TestCase): | |||
user.remove_roles(*user_roles) | |||
user.add_roles('Blogger') | |||
make_property_setter('Blog Post', 'published', 'permlevel', 1, 'Int') | |||
blog_post_property_setter = make_property_setter('Blog Post', 'published', 'permlevel', 1, 'Int') | |||
reset('Blog Post') | |||
add('Blog Post', 'Website Manager', 1) | |||
update('Blog Post', 'Website Manager', 1, 'write', 1) | |||
@@ -80,6 +80,7 @@ class TestFormLoad(unittest.TestCase): | |||
user.add_roles(*user_roles) | |||
blog_doc.delete() | |||
frappe.delete_doc(blog_post_property_setter.doctype, blog_post_property_setter.name) | |||
def test_fieldlevel_permissions_in_load_for_child_table(self): | |||
contact = frappe.new_doc('Contact') | |||
@@ -59,7 +59,7 @@ class TestPermissions(unittest.TestCase): | |||
self.assertTrue(post.has_permission("read")) | |||
def test_user_permissions_in_doc(self): | |||
add_user_permission("Blog Category", "_Test Blog Category 1", | |||
add_user_permission("Blog Category", "-test-blog-category-1", | |||
"test2@example.com") | |||
frappe.set_user("test2@example.com") | |||
@@ -73,7 +73,7 @@ class TestPermissions(unittest.TestCase): | |||
self.assertTrue(get_doc_permissions(post1).get("read")) | |||
def test_user_permissions_in_report(self): | |||
add_user_permission("Blog Category", "_Test Blog Category 1", "test2@example.com") | |||
add_user_permission("Blog Category", "-test-blog-category-1", "test2@example.com") | |||
frappe.set_user("test2@example.com") | |||
names = [d.name for d in frappe.get_list("Blog Post", fields=["name", "blog_category"])] | |||
@@ -86,23 +86,23 @@ class TestPermissions(unittest.TestCase): | |||
self.assertFalse(doc.get("blog_category")) | |||
# Fetch default based on single user permission | |||
add_user_permission("Blog Category", "_Test Blog Category 1", "test2@example.com") | |||
add_user_permission("Blog Category", "-test-blog-category-1", "test2@example.com") | |||
frappe.set_user("test2@example.com") | |||
doc = frappe.new_doc("Blog Post") | |||
self.assertEqual(doc.get("blog_category"), "_Test Blog Category 1") | |||
self.assertEqual(doc.get("blog_category"), "-test-blog-category-1") | |||
# Don't fetch default if user permissions is more than 1 | |||
add_user_permission("Blog Category", "_Test Blog Category", "test2@example.com", ignore_permissions=True) | |||
add_user_permission("Blog Category", "-test-blog-category", "test2@example.com", ignore_permissions=True) | |||
frappe.clear_cache() | |||
doc = frappe.new_doc("Blog Post") | |||
self.assertFalse(doc.get("blog_category")) | |||
# Fetch user permission set as default from multiple user permission | |||
add_user_permission("Blog Category", "_Test Blog Category 2", "test2@example.com", ignore_permissions=True, is_default=1) | |||
add_user_permission("Blog Category", "-test-blog-category-2", "test2@example.com", ignore_permissions=True, is_default=1) | |||
frappe.clear_cache() | |||
doc = frappe.new_doc("Blog Post") | |||
self.assertEqual(doc.get("blog_category"), "_Test Blog Category 2") | |||
self.assertEqual(doc.get("blog_category"), "-test-blog-category-2") | |||
def test_user_link_match_doc(self): | |||
blogger = frappe.get_doc("Blogger", "_Test Blogger 1") | |||
@@ -215,7 +215,7 @@ class TestPermissions(unittest.TestCase): | |||
frappe.clear_cache(doctype='DocType') | |||
def test_user_permission_doctypes(self): | |||
add_user_permission("Blog Category", "_Test Blog Category 1", | |||
add_user_permission("Blog Category", "-test-blog-category-1", | |||
"test2@example.com") | |||
add_user_permission("Blogger", "_Test Blogger 1", | |||
"test2@example.com") | |||
@@ -235,7 +235,7 @@ class TestPermissions(unittest.TestCase): | |||
def if_owner_setup(self): | |||
update('Blog Post', 'Blogger', 0, 'if_owner', 1) | |||
add_user_permission("Blog Category", "_Test Blog Category 1", | |||
add_user_permission("Blog Category", "-test-blog-category-1", | |||
"test2@example.com") | |||
add_user_permission("Blogger", "_Test Blogger 1", | |||
"test2@example.com") | |||
@@ -254,7 +254,7 @@ class TestPermissions(unittest.TestCase): | |||
doc = frappe.get_doc({ | |||
"doctype": "Blog Post", | |||
"blog_category": "_Test Blog Category", | |||
"blog_category": "-test-blog-category", | |||
"blogger": "_Test Blogger 1", | |||
"title": "_Test Blog Post Title", | |||
"content": "_Test Blog Post Content" | |||
@@ -263,14 +263,14 @@ class TestPermissions(unittest.TestCase): | |||
self.assertRaises(frappe.PermissionError, doc.insert) | |||
frappe.set_user('test1@example.com') | |||
add_user_permission("Blog Category", "_Test Blog Category", | |||
add_user_permission("Blog Category", "-test-blog-category", | |||
"test2@example.com") | |||
frappe.set_user("test2@example.com") | |||
doc.insert() | |||
frappe.set_user("Administrator") | |||
remove_user_permission("Blog Category", "_Test Blog Category", | |||
remove_user_permission("Blog Category", "-test-blog-category", | |||
"test2@example.com") | |||
frappe.set_user("test2@example.com") | |||
@@ -286,13 +286,13 @@ class TestPermissions(unittest.TestCase): | |||
def test_ignore_user_permissions_if_missing(self): | |||
"""If there are no user permissions, then allow as per role""" | |||
add_user_permission("Blog Category", "_Test Blog Category", | |||
add_user_permission("Blog Category", "-test-blog-category", | |||
"test2@example.com") | |||
frappe.set_user("test2@example.com") | |||
doc = frappe.get_doc({ | |||
"doctype": "Blog Post", | |||
"blog_category": "_Test Blog Category 2", | |||
"blog_category": "-test-blog-category-2", | |||
"blogger": "_Test Blogger 1", | |||
"title": "_Test Blog Post Title", | |||
"content": "_Test Blog Post Content" | |||
@@ -301,7 +301,7 @@ class TestPermissions(unittest.TestCase): | |||
self.assertFalse(doc.has_permission("write")) | |||
frappe.set_user("Administrator") | |||
remove_user_permission("Blog Category", "_Test Blog Category", | |||
remove_user_permission("Blog Category", "-test-blog-category", | |||
"test2@example.com") | |||
frappe.set_user("test2@example.com") | |||
@@ -420,7 +420,7 @@ class TestPermissions(unittest.TestCase): | |||
doc = frappe.get_doc({ | |||
"doctype": "Blog Post", | |||
"blog_category": "_Test Blog Category", | |||
"blog_category": "-test-blog-category", | |||
"blogger": "_Test Blogger 1", | |||
"title": "_Test Blog Post Title", | |||
"content": "_Test Blog Post Content" | |||
@@ -454,7 +454,7 @@ class TestPermissions(unittest.TestCase): | |||
add_user_permission('Blog Post', '-test-blog-post-1', 'test2@example.com') | |||
add_user_permission('Blog Post', '-test-blog-post-2', 'test2@example.com') | |||
add_user_permission("Blog Category", '_Test Blog Category 1', 'test2@example.com') | |||
add_user_permission("Blog Category", '-test-blog-category-1', 'test2@example.com') | |||
deleted_user_permission_count = clear_user_permissions('test2@example.com', 'Blog Post') | |||
@@ -2,26 +2,17 @@ | |||
"actions": [], | |||
"allow_guest_to_view": 1, | |||
"allow_import": 1, | |||
"autoname": "field:category_name", | |||
"allow_rename": 1, | |||
"creation": "2013-03-08 09:41:11", | |||
"doctype": "DocType", | |||
"document_type": "Setup", | |||
"engine": "InnoDB", | |||
"field_order": [ | |||
"category_name", | |||
"title", | |||
"published", | |||
"route" | |||
], | |||
"fields": [ | |||
{ | |||
"fieldname": "category_name", | |||
"fieldtype": "Data", | |||
"in_list_view": 1, | |||
"label": "Category Name", | |||
"reqd": 1, | |||
"unique": 1 | |||
}, | |||
{ | |||
"fieldname": "title", | |||
"fieldtype": "Data", | |||
@@ -31,7 +22,7 @@ | |||
"reqd": 1 | |||
}, | |||
{ | |||
"default": "0", | |||
"default": "1", | |||
"fieldname": "published", | |||
"fieldtype": "Check", | |||
"in_list_view": 1, | |||
@@ -42,15 +33,17 @@ | |||
"fieldname": "route", | |||
"fieldtype": "Data", | |||
"label": "Route", | |||
"read_only": 1, | |||
"unique": 1 | |||
} | |||
], | |||
"has_web_view": 1, | |||
"icon": "fa fa-tag", | |||
"idx": 1, | |||
"index_web_pages_for_search": 1, | |||
"is_published_field": "published", | |||
"links": [], | |||
"modified": "2020-07-29 21:14:47.210446", | |||
"modified": "2020-08-21 11:40:36.919321", | |||
"modified_by": "Administrator", | |||
"module": "Website", | |||
"name": "Blog Category", | |||
@@ -78,5 +71,6 @@ | |||
"quick_entry": 1, | |||
"sort_field": "modified", | |||
"sort_order": "DESC", | |||
"title_field": "title", | |||
"track_changes": 1 | |||
} |
@@ -8,12 +8,11 @@ from frappe.website.render import clear_cache | |||
class BlogCategory(WebsiteGenerator): | |||
def autoname(self): | |||
# to override autoname of WebsiteGenerator | |||
self.name = self.category_name | |||
self.name = self.scrub(self.title) | |||
def on_update(self): | |||
clear_cache() | |||
def validate(self): | |||
if not self.route: | |||
self.route = 'blog/' + self.scrub(self.name) | |||
super(BlogCategory, self).validate() | |||
def set_route(self): | |||
# Override blog route since it has to been templated | |||
self.route = 'blog/' + self.name |
@@ -3,5 +3,7 @@ | |||
from __future__ import unicode_literals | |||
import frappe | |||
import unittest | |||
test_records = frappe.get_test_records('Blog Category') | |||
class TestBlogCategory(unittest.TestCase): | |||
pass |
@@ -1,18 +1,15 @@ | |||
[ | |||
{ | |||
"category_name": "_Test Blog Category", | |||
"doctype": "Blog Category", | |||
"parent_website_route": "blog", | |||
"title": "_Test Blog Category" | |||
}, | |||
{ | |||
"category_name": "_Test Blog Category 1", | |||
"doctype": "Blog Category", | |||
"parent_website_route": "blog", | |||
"title": "_Test Blog Category 1" | |||
}, | |||
{ | |||
"category_name": "_Test Blog Category 2", | |||
"doctype": "Blog Category", | |||
"parent_website_route": "blog", | |||
"title": "_Test Blog Category 2" | |||
@@ -12,7 +12,7 @@ | |||
<div> | |||
<a class="mr-2" href="/blog">{{ _('Blog') }}</a> | |||
<span class="text-muted">/</span> | |||
<a class="ml-2" href="/blog/{{ category.title }}">{{ category.title }}</a> | |||
<a class="ml-2" href="/{{ category.route }}">{{ category.title }}</a> | |||
</div> | |||
<h1 itemprop="headline" class="blog-title">{{ title }}</h1> | |||
<p class="blog-intro"> | |||
@@ -3,6 +3,8 @@ | |||
from __future__ import unicode_literals | |||
import frappe | |||
import unittest | |||
from bs4 import BeautifulSoup | |||
import re | |||
from frappe.utils import set_request | |||
from frappe.website.render import render | |||
@@ -32,11 +34,37 @@ class TestBlogPost(unittest.TestCase): | |||
self.assertTrue(response.status_code, 404) | |||
def test_category_link(self): | |||
# Make a temporary Blog Post (and a Blog Category) | |||
blog = make_test_blog() | |||
# Visit the blog post page | |||
set_request(path=blog.route) | |||
blog_page_response = render() | |||
blog_page_html = frappe.safe_decode(blog_page_response.get_data()) | |||
# On blog post page find link to the category page | |||
soup = BeautifulSoup(blog_page_html, "lxml") | |||
category_page_link = list(soup.find_all('a', href=re.compile(blog.blog_category)))[0] | |||
category_page_url = category_page_link["href"] | |||
# Visit the category page (by following the link found in above stage) | |||
set_request(path=category_page_url) | |||
category_page_response = render() | |||
category_page_html = frappe.safe_decode(category_page_response.get_data()) | |||
# Category page should contain the blog post title | |||
self.assertIn(blog.title, category_page_html) | |||
# Cleanup afterwords | |||
frappe.delete_doc("Blog Post", blog.name) | |||
frappe.delete_doc("Blog Category", blog.blog_category) | |||
def make_test_blog(): | |||
if not frappe.db.exists('Blog Category', 'Test Blog Category'): | |||
if not frappe.db.exists('Blog Category', 'test-blog-category'): | |||
# Set different title and name for the category | |||
frappe.get_doc(dict( | |||
doctype = 'Blog Category', | |||
category_name = 'Test Blog Category', | |||
title='Test Blog Category')).insert() | |||
if not frappe.db.exists('Blogger', 'test-blogger'): | |||
frappe.get_doc(dict( | |||
@@ -45,7 +73,7 @@ def make_test_blog(): | |||
full_name='Test Blogger')).insert() | |||
test_blog = frappe.get_doc(dict( | |||
doctype = 'Blog Post', | |||
blog_category = 'Test Blog Category', | |||
blog_category = 'test-blog-category', | |||
blogger = 'test-blogger', | |||
title = random_string(20), | |||
route = random_string(20), | |||
@@ -1,6 +1,6 @@ | |||
[ | |||
{ | |||
"blog_category": "_Test Blog Category", | |||
"blog_category": "-test-blog-category", | |||
"blog_intro": "Test Blog Intro", | |||
"blogger": "_Test Blogger", | |||
"content": "Test Blog Content", | |||
@@ -9,7 +9,7 @@ | |||
"published": 1 | |||
}, | |||
{ | |||
"blog_category": "_Test Blog Category 1", | |||
"blog_category": "-test-blog-category-1", | |||
"blog_intro": "Test Blog Intro", | |||
"blogger": "_Test Blogger", | |||
"content": "Test Blog Content", | |||
@@ -18,7 +18,7 @@ | |||
"published": 1 | |||
}, | |||
{ | |||
"blog_category": "_Test Blog Category 1", | |||
"blog_category": "-test-blog-category-1", | |||
"blog_intro": "Test Blog Intro", | |||
"blogger": "_Test Blogger 1", | |||
"content": "Test Blog Content", | |||
@@ -27,7 +27,7 @@ | |||
"published": 0 | |||
}, | |||
{ | |||
"blog_category": "_Test Blog Category 1", | |||
"blog_category": "-test-blog-category-1", | |||
"blog_intro": "Test Blog Intro", | |||
"blogger": "_Test Blogger 2", | |||
"content": "Test Blog Content", | |||
@@ -35,4 +35,4 @@ | |||
"title": "_Test Blog Post 3", | |||
"published": 0 | |||
} | |||
] | |||
] |