-
Notifications
You must be signed in to change notification settings - Fork 156
/
wiki_space.py
145 lines (121 loc) · 3.71 KB
/
wiki_space.py
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
# Copyright (c) 2023, Frappe and contributors
# For license information, please see license.txt
import json
from random import random
import frappe
import pymysql
from frappe.model.document import Document
from frappe.website.utils import cleanup_page_name
from wiki.wiki.doctype.wiki_page.search import drop_index, rebuild_index_in_background
class WikiSpace(Document):
def before_insert(self):
# insert a new wiki page when sidebar is empty
if not self.wiki_sidebars:
wiki_page = frappe.get_doc(
{
"doctype": "Wiki Page",
"title": "New Wiki Page",
"route": f"{self.route}/new-wiki-page",
"published": 1,
"content": f"Welcome to Wiki Space {self.route}",
}
)
wiki_page.insert()
self.append(
"wiki_sidebars",
{
"wiki_page": wiki_page.name,
"parent_label": "New Group",
},
)
def before_save(self):
# prepend space route to the route of wiki page
old_route = frappe.db.get_value("Wiki Space", self.name, "route")
if not old_route or self.route == old_route:
return
for wiki_sidebar in self.wiki_sidebars:
wiki_page = frappe.get_doc("Wiki Page", wiki_sidebar.wiki_page)
prepend_string = f"{self.route}/" if self.route else ""
try:
frappe.db.set_value(
"Wiki Page",
wiki_page.name,
{"route": f"{prepend_string}{wiki_page.route.split('/')[-1]}"},
)
except pymysql.err.IntegrityError:
try:
# prepending group name
frappe.db.set_value(
"Wiki Page",
wiki_page.name,
{
"route": f"{prepend_string}{cleanup_page_name(wiki_sidebar.parent_label)}-{wiki_page.route.split('/')[-1]}"
},
)
except pymysql.err.IntegrityError:
# prepending group name and appending random number
frappe.db.set_value(
"Wiki Page",
wiki_page.name,
{
"route": f"{prepend_string}{cleanup_page_name(wiki_sidebar.parent_label)}-{wiki_page.route.split('/')[-1]}-{random() * 10000}"
},
)
def on_update(self):
rebuild_index_in_background()
# clear sidebar cache
frappe.cache().hdel("wiki_sidebar", self.name)
def on_trash(self):
drop_index(self.route)
# clear sidebar cache
frappe.cache().hdel("wiki_sidebar", self.name)
@frappe.whitelist()
def clone_wiki_space_in_background(self, new_space_route):
frappe.enqueue(
clone_wiki_space,
name=self.name,
route=self.route,
new_space_route=new_space_route,
queue="long",
)
def clone_wiki_space(name, route, new_space_route):
if frappe.db.exists("Wiki Space", new_space_route):
frappe.throw(f"Wiki Space <b>{new_space_route}</b> already exists.")
items = frappe.get_all(
"Wiki Group Item",
filters={"parent": name},
fields=["wiki_page", "parent_label"],
order_by="idx asc",
)
cloned_wiki_space = frappe.new_doc("Wiki Space")
cloned_wiki_space.route = new_space_route
for idx, item in enumerate(items, 1):
frappe.publish_progress(
idx * 100 / len(items),
title=f"Cloning into new Wiki Space <b>{new_space_route}</b>",
description=f"{idx}/{len(items)}",
)
cloned_doc = frappe.get_doc("Wiki Page", item.wiki_page).clone(route, new_space_route)
cloned_wiki_space.append(
"wiki_sidebars",
{
"wiki_page": cloned_doc.name,
"parent_label": item.parent_label,
},
)
cloned_wiki_space.insert()
return cloned_wiki_space
@frappe.whitelist()
def update_sidebar(sidebar_items):
sidebars = json.loads(sidebar_items)
sidebar_items = sidebars.items()
if sidebar_items:
idx = 0
for sidebar, items in sidebar_items:
for item in items:
idx += 1
frappe.db.set_value(
"Wiki Group Item", {"wiki_page": str(item["name"])}, {"parent_label": sidebar, "idx": idx}
)
for key in frappe.cache().hgetall("wiki_sidebar").keys():
frappe.cache().hdel("wiki_sidebar", key)