Non puoi selezionare più di 25 argomenti Gli argomenti devono iniziare con una lettera o un numero, possono includere trattini ('-') e possono essere lunghi fino a 35 caratteri.
 
 
 
 
 
 

581 righe
14 KiB

  1. import frappe
  2. from frappe import _
  3. from frappe.utils import add_to_date, now
  4. UI_TEST_USER = "frappe@example.com"
  5. @frappe.whitelist()
  6. def create_if_not_exists(doc):
  7. """Create records if they dont exist.
  8. Will check for uniqueness by checking if a record exists with these field value pairs
  9. :param doc: dict of field value pairs. can be a list of dict for multiple records.
  10. """
  11. if not frappe.local.dev_server:
  12. frappe.throw(_("This method can only be accessed in development"), frappe.PermissionError)
  13. doc = frappe.parse_json(doc)
  14. if not isinstance(doc, list):
  15. docs = [doc]
  16. else:
  17. docs = doc
  18. names = []
  19. for doc in docs:
  20. doc = frappe._dict(doc)
  21. filters = doc.copy()
  22. filters.pop("doctype")
  23. name = frappe.db.exists(doc.doctype, filters)
  24. if not name:
  25. d = frappe.get_doc(doc)
  26. d.insert(ignore_permissions=True)
  27. name = d.name
  28. names.append(name)
  29. return names
  30. @frappe.whitelist()
  31. def create_todo_records():
  32. frappe.db.truncate("ToDo")
  33. frappe.get_doc(
  34. {
  35. "doctype": "ToDo",
  36. "date": add_to_date(now(), days=7),
  37. "description": "this is first todo",
  38. }
  39. ).insert()
  40. frappe.get_doc(
  41. {
  42. "doctype": "ToDo",
  43. "date": add_to_date(now(), days=-7),
  44. "description": "this is second todo",
  45. }
  46. ).insert()
  47. frappe.get_doc(
  48. {
  49. "doctype": "ToDo",
  50. "date": add_to_date(now(), months=2),
  51. "description": "this is third todo",
  52. }
  53. ).insert()
  54. frappe.get_doc(
  55. {
  56. "doctype": "ToDo",
  57. "date": add_to_date(now(), months=-2),
  58. "description": "this is fourth todo",
  59. }
  60. ).insert()
  61. @frappe.whitelist()
  62. def clear_notes():
  63. if not frappe.local.dev_server:
  64. frappe.throw(_("Not allowed"), frappe.PermissionError)
  65. for note in frappe.get_all("Note", pluck="name"):
  66. frappe.delete_doc("Note", note, force=True)
  67. @frappe.whitelist()
  68. def create_communication_record():
  69. doc = frappe.get_doc(
  70. {
  71. "doctype": "Communication",
  72. "recipients": "test@gmail.com",
  73. "subject": "Test Form Communication 1",
  74. "communication_date": frappe.utils.now_datetime(),
  75. }
  76. )
  77. doc.insert()
  78. return doc
  79. @frappe.whitelist()
  80. def setup_workflow():
  81. from frappe.workflow.doctype.workflow.test_workflow import create_todo_workflow
  82. create_todo_workflow()
  83. create_todo_records()
  84. frappe.clear_cache()
  85. @frappe.whitelist()
  86. def create_contact_phone_nos_records():
  87. if frappe.get_all("Contact", {"first_name": "Test Contact"}):
  88. return
  89. doc = frappe.new_doc("Contact")
  90. doc.first_name = "Test Contact"
  91. for index in range(1000):
  92. doc.append("phone_nos", {"phone": f"123456{index}"})
  93. doc.insert()
  94. @frappe.whitelist()
  95. def create_doctype(name, fields):
  96. fields = frappe.parse_json(fields)
  97. if frappe.db.exists("DocType", name):
  98. return
  99. frappe.get_doc(
  100. {
  101. "doctype": "DocType",
  102. "module": "Core",
  103. "custom": 1,
  104. "fields": fields,
  105. "permissions": [{"role": "System Manager", "read": 1}],
  106. "name": name,
  107. }
  108. ).insert()
  109. @frappe.whitelist()
  110. def create_child_doctype(name, fields):
  111. fields = frappe.parse_json(fields)
  112. if frappe.db.exists("DocType", name):
  113. return
  114. frappe.get_doc(
  115. {
  116. "doctype": "DocType",
  117. "module": "Core",
  118. "istable": 1,
  119. "custom": 1,
  120. "fields": fields,
  121. "permissions": [{"role": "System Manager", "read": 1}],
  122. "name": name,
  123. }
  124. ).insert()
  125. @frappe.whitelist()
  126. def create_contact_records():
  127. if frappe.get_all("Contact", {"first_name": "Test Form Contact 1"}):
  128. return
  129. insert_contact("Test Form Contact 1", "12345")
  130. insert_contact("Test Form Contact 2", "54321")
  131. insert_contact("Test Form Contact 3", "12345")
  132. @frappe.whitelist()
  133. def create_multiple_todo_records():
  134. if frappe.get_all("ToDo", {"description": "Multiple ToDo 1"}):
  135. return
  136. values = [(f"100{i}", f"Multiple ToDo {i}") for i in range(1, 1002)]
  137. frappe.db.bulk_insert("ToDo", fields=["name", "description"], values=set(values))
  138. def insert_contact(first_name, phone_number):
  139. doc = frappe.get_doc({"doctype": "Contact", "first_name": first_name})
  140. doc.append("phone_nos", {"phone": phone_number})
  141. doc.insert()
  142. @frappe.whitelist()
  143. def create_form_tour():
  144. if frappe.db.exists("Form Tour", {"name": "Test Form Tour"}):
  145. return
  146. tour = frappe.get_doc(
  147. {
  148. "doctype": "Form Tour",
  149. "title": "Test Form Tour",
  150. "reference_doctype": "Contact",
  151. "save_on_complete": 1,
  152. "steps": [
  153. {
  154. "title": "Test Title 1",
  155. "description": "Test Description 1",
  156. "has_next_condition": 1,
  157. "next_step_condition": "eval: doc.first_name",
  158. "fieldname": "first_name",
  159. "fieldtype": "Data",
  160. },
  161. {
  162. "title": "Test Title 2",
  163. "description": "Test Description 2",
  164. "has_next_condition": 1,
  165. "next_step_condition": "eval: doc.last_name",
  166. "fieldname": "last_name",
  167. "fieldtype": "Data",
  168. },
  169. {
  170. "title": "Test Title 3",
  171. "description": "Test Description 3",
  172. "fieldname": "phone_nos",
  173. "fieldtype": "Table",
  174. },
  175. {
  176. "title": "Test Title 4",
  177. "description": "Test Description 4",
  178. "is_table_field": 1,
  179. "parent_fieldname": "phone_nos",
  180. "next_step_condition": "eval: doc.phone",
  181. "has_next_condition": 1,
  182. "fieldname": "phone",
  183. "fieldtype": "Data",
  184. },
  185. ],
  186. }
  187. )
  188. tour.insert()
  189. @frappe.whitelist()
  190. def create_data_for_discussions():
  191. web_page = create_web_page("Test page for discussions", "test-page-discussions", False)
  192. create_topic_and_reply(web_page)
  193. create_web_page("Test single thread discussion", "test-single-thread", True)
  194. def create_web_page(title, route, single_thread):
  195. web_page = frappe.db.exists("Web Page", {"route": route})
  196. if web_page:
  197. return web_page
  198. web_page = frappe.get_doc(
  199. {"doctype": "Web Page", "title": title, "route": route, "published": True}
  200. )
  201. web_page.save()
  202. web_page.append(
  203. "page_blocks",
  204. {
  205. "web_template": "Discussions",
  206. "web_template_values": frappe.as_json(
  207. {
  208. "title": "Discussions",
  209. "cta_title": "New Discussion",
  210. "docname": web_page.name,
  211. "single_thread": single_thread,
  212. }
  213. ),
  214. },
  215. )
  216. web_page.save()
  217. return web_page.name
  218. def create_topic_and_reply(web_page):
  219. topic = frappe.db.exists(
  220. "Discussion Topic", {"reference_doctype": "Web Page", "reference_docname": web_page}
  221. )
  222. if not topic:
  223. topic = frappe.get_doc(
  224. {
  225. "doctype": "Discussion Topic",
  226. "reference_doctype": "Web Page",
  227. "reference_docname": web_page,
  228. "title": "Test Topic",
  229. }
  230. )
  231. topic.save()
  232. reply = frappe.get_doc(
  233. {"doctype": "Discussion Reply", "topic": topic.name, "reply": "This is a test reply"}
  234. )
  235. reply.save()
  236. @frappe.whitelist()
  237. def update_webform_to_multistep():
  238. if not frappe.db.exists("Web Form", "update-profile-duplicate"):
  239. doc = frappe.get_doc("Web Form", "edit-profile")
  240. _doc = frappe.copy_doc(doc)
  241. _doc.title = "update-profile-duplicate"
  242. _doc.route = "update-profile-duplicate"
  243. _doc.web_form_fields[5].fieldtype = "Page Break"
  244. _doc.is_standard = False
  245. _doc.save()
  246. @frappe.whitelist()
  247. def update_child_table(name):
  248. doc = frappe.get_doc("DocType", name)
  249. if len(doc.fields) == 1:
  250. doc.append(
  251. "fields",
  252. {
  253. "fieldname": "doctype_to_link",
  254. "fieldtype": "Link",
  255. "in_list_view": 1,
  256. "label": "Doctype to Link",
  257. "options": "Doctype to Link",
  258. },
  259. )
  260. doc.save()
  261. @frappe.whitelist()
  262. def insert_doctype_with_child_table_record(name):
  263. if frappe.get_all(name, {"title": "Test Grid Search"}):
  264. return
  265. def insert_child(doc, data, barcode, check, rating, duration, date):
  266. doc.append(
  267. "child_table_1",
  268. {
  269. "data": data,
  270. "barcode": barcode,
  271. "check": check,
  272. "rating": rating,
  273. "duration": duration,
  274. "date": date,
  275. },
  276. )
  277. doc = frappe.new_doc(name)
  278. doc.title = "Test Grid Search"
  279. doc.append("child_table", {"title": "Test Grid Search"})
  280. insert_child(doc, "Data", "09709KJKKH2432", 1, 0.5, 266851, "2022-02-21")
  281. insert_child(doc, "Test", "09209KJHKH2432", 1, 0.8, 547877, "2021-05-27")
  282. insert_child(doc, "New", "09709KJHYH1132", 0, 0.1, 3, "2019-03-02")
  283. insert_child(doc, "Old", "09701KJHKH8750", 0, 0, 127455, "2022-01-11")
  284. insert_child(doc, "Alpha", "09204KJHKH2432", 0, 0.6, 364, "2019-12-31")
  285. insert_child(doc, "Delta", "09709KSPIO2432", 1, 0.9, 1242000, "2020-04-21")
  286. insert_child(doc, "Update", "76989KJLVA2432", 0, 1, 183845, "2022-02-10")
  287. insert_child(doc, "Delete", "29189KLHVA1432", 0, 0, 365647, "2021-05-07")
  288. insert_child(doc, "Make", "09689KJHAA2431", 0, 0.3, 24, "2020-11-11")
  289. insert_child(doc, "Create", "09709KLKKH2432", 1, 0.3, 264851, "2021-02-21")
  290. insert_child(doc, "Group", "09209KJLKH2432", 1, 0.8, 537877, "2020-03-15")
  291. insert_child(doc, "Slide", "01909KJHYH1132", 0, 0.5, 9, "2018-03-02")
  292. insert_child(doc, "Drop", "09701KJHKH8750", 1, 0, 127255, "2018-01-01")
  293. insert_child(doc, "Beta", "09204QJHKN2432", 0, 0.6, 354, "2017-12-30")
  294. insert_child(doc, "Flag", "09709KXPIP2432", 1, 0, 1241000, "2021-04-21")
  295. insert_child(doc, "Upgrade", "75989ZJLVA2432", 0.8, 1, 183645, "2020-08-13")
  296. insert_child(doc, "Down", "28189KLHRA1432", 1, 0, 362647, "2020-06-17")
  297. insert_child(doc, "Note", "09689DJHAA2431", 0, 0.1, 29, "2021-09-11")
  298. insert_child(doc, "Click", "08189DJHAA2431", 1, 0.3, 209, "2020-07-04")
  299. insert_child(doc, "Drag", "08189DIHAA2981", 0, 0.7, 342628, "2022-05-04")
  300. doc.insert()
  301. @frappe.whitelist()
  302. def insert_translations():
  303. translation = [
  304. {
  305. "doctype": "Translation",
  306. "language": "de",
  307. "source_text": "Other",
  308. "translated_text": "Sonstiges",
  309. },
  310. {
  311. "doctype": "Translation",
  312. "language": "de",
  313. "source_text": "Genderqueer",
  314. "translated_text": "Nichtbinär",
  315. },
  316. {
  317. "doctype": "Translation",
  318. "language": "de",
  319. "source_text": "Non-Conforming",
  320. "translated_text": "Nicht konform",
  321. },
  322. {
  323. "doctype": "Translation",
  324. "language": "de",
  325. "source_text": "Prefer not to say",
  326. "translated_text": "Keine Angabe",
  327. },
  328. ]
  329. for doc in translation:
  330. if not frappe.db.exists("doc"):
  331. frappe.get_doc(doc).insert()
  332. @frappe.whitelist()
  333. def create_blog_post():
  334. blog_category = frappe.get_doc(
  335. {"name": "general", "doctype": "Blog Category", "title": "general"}
  336. ).insert(ignore_if_duplicate=True)
  337. blogger = frappe.get_doc(
  338. {
  339. "name": "attachment blogger",
  340. "doctype": "Blogger",
  341. "full_name": "attachment blogger",
  342. "short_name": "attachment blogger",
  343. }
  344. ).insert(ignore_if_duplicate=True)
  345. doc = frappe.get_doc(
  346. {
  347. "name": "test-blog-attachment-post",
  348. "doctype": "Blog Post",
  349. "title": "test-blog-attachment-post",
  350. "blog_category": blog_category.name,
  351. "blogger": blogger.name,
  352. "content_type": "Rich Text",
  353. },
  354. ).insert(ignore_if_duplicate=True)
  355. return doc
  356. def create_test_user():
  357. if frappe.db.exists("User", UI_TEST_USER):
  358. return
  359. user = frappe.new_doc("User")
  360. user.email = UI_TEST_USER
  361. user.first_name = "Frappe"
  362. user.new_password = frappe.local.conf.admin_password
  363. user.send_welcome_email = 0
  364. user.time_zone = "Asia/Kolkata"
  365. user.flags.ignore_password_policy = True
  366. user.insert(ignore_if_duplicate=True)
  367. user.reload()
  368. blocked_roles = {"Administrator", "Guest", "All"}
  369. all_roles = set(frappe.get_all("Role", pluck="name"))
  370. for role in all_roles - blocked_roles:
  371. user.append("roles", {"role": role})
  372. user.save()
  373. @frappe.whitelist()
  374. def setup_tree_doctype():
  375. frappe.delete_doc_if_exists("DocType", "Custom Tree")
  376. frappe.get_doc(
  377. {
  378. "doctype": "DocType",
  379. "module": "Core",
  380. "custom": 1,
  381. "fields": [
  382. {"fieldname": "tree", "fieldtype": "Data", "label": "Tree"},
  383. ],
  384. "permissions": [{"role": "System Manager", "read": 1}],
  385. "name": "Custom Tree",
  386. "is_tree": True,
  387. "naming_rule": "By fieldname",
  388. "autoname": "field:tree",
  389. }
  390. ).insert()
  391. if not frappe.db.exists("Custom Tree", "All Trees"):
  392. frappe.get_doc({"doctype": "Custom Tree", "tree": "All Trees"}).insert()
  393. @frappe.whitelist()
  394. def setup_image_doctype():
  395. frappe.delete_doc_if_exists("DocType", "Custom Image")
  396. frappe.get_doc(
  397. {
  398. "doctype": "DocType",
  399. "module": "Core",
  400. "custom": 1,
  401. "fields": [
  402. {"fieldname": "image", "fieldtype": "Attach Image", "label": "Image"},
  403. ],
  404. "permissions": [{"role": "System Manager", "read": 1}],
  405. "name": "Custom Image",
  406. "image_field": "image",
  407. }
  408. ).insert()
  409. @frappe.whitelist()
  410. def setup_inbox():
  411. frappe.db.sql("DELETE FROM `tabUser Email`")
  412. user = frappe.get_doc("User", frappe.session.user)
  413. user.append("user_emails", {"email_account": "Email Linking"})
  414. user.save()
  415. @frappe.whitelist()
  416. def setup_default_view(view, force_reroute=None):
  417. frappe.delete_doc_if_exists("Property Setter", "Event-main-default_view")
  418. frappe.delete_doc_if_exists("Property Setter", "Event-main-force_re_route_to_default_view")
  419. frappe.get_doc(
  420. {
  421. "is_system_generated": 0,
  422. "doctype_or_field": "DocType",
  423. "doc_type": "Event",
  424. "property": "default_view",
  425. "property_type": "Select",
  426. "value": view,
  427. "doctype": "Property Setter",
  428. }
  429. ).insert()
  430. if force_reroute:
  431. frappe.get_doc(
  432. {
  433. "is_system_generated": 0,
  434. "doctype_or_field": "DocType",
  435. "doc_type": "Event",
  436. "property": "force_re_route_to_default_view",
  437. "property_type": "Check",
  438. "value": "1",
  439. "doctype": "Property Setter",
  440. }
  441. ).insert()
  442. @frappe.whitelist()
  443. def create_note():
  444. if not frappe.db.exists("Note", "Routing Test"):
  445. frappe.get_doc({"doctype": "Note", "title": "Routing Test"}).insert()
  446. @frappe.whitelist()
  447. def create_kanban():
  448. if not frappe.db.exists("Custom Field", "Note-kanban"):
  449. frappe.get_doc(
  450. {
  451. "is_system_generated": 0,
  452. "dt": "Note",
  453. "label": "Kanban",
  454. "fieldname": "kanban",
  455. "insert_after": "seen_by",
  456. "fieldtype": "Select",
  457. "options": "Open\nClosed",
  458. "doctype": "Custom Field",
  459. }
  460. ).insert()
  461. if not frappe.db.exists("Kanban Board", "_Note _Kanban"):
  462. frappe.get_doc(
  463. {
  464. "doctype": "Kanban Board",
  465. "name": "_Note _Kanban",
  466. "kanban_board_name": "_Note _Kanban",
  467. "reference_doctype": "Note",
  468. "field_name": "kanban",
  469. "private": 1,
  470. "show_labels": 0,
  471. "columns": [
  472. {
  473. "column_name": "Open",
  474. "status": "Active",
  475. "indicator": "Gray",
  476. },
  477. {
  478. "column_name": "Closed",
  479. "status": "Active",
  480. "indicator": "Gray",
  481. },
  482. ],
  483. }
  484. ).insert()