seitime-frappe/frappe/tests/test_naming.py
Daniel Gerhardt 16dca0b1c1 feat: add consecutive calendar week (WW) for naming series
The calendar week is based on ISO 8601 but behaves slightly different
for the first and last days of a year to ensure consecutiveness:

* If the first days of a year would be in week 53 then 00 is used
  instead.
* if the last days of a year would be in week 01 then 53 is used
  instead.

Closes #14413
2021-11-18 17:52:36 +01:00

210 lines
6.3 KiB
Python

# Copyright (c) 2018, Frappe Technologies Pvt. Ltd. and Contributors
# License: MIT. See LICENSE
import unittest
import frappe
from frappe.utils import now_datetime
from frappe.model.naming import getseries
from frappe.model.naming import append_number_if_name_exists, revert_series_if_last
from frappe.model.naming import determine_consecutive_week_number, parse_naming_series
class TestNaming(unittest.TestCase):
def tearDown(self):
# Reset ToDo autoname to hash
todo_doctype = frappe.get_doc('DocType', 'ToDo')
todo_doctype.autoname = 'hash'
todo_doctype.save()
def test_append_number_if_name_exists(self):
'''
Append number to name based on existing values
if Bottle exists
Bottle -> Bottle-1
if Bottle-1 exists
Bottle -> Bottle-2
'''
note = frappe.new_doc('Note')
note.title = 'Test'
note.insert()
title2 = append_number_if_name_exists('Note', 'Test')
self.assertEqual(title2, 'Test-1')
title2 = append_number_if_name_exists('Note', 'Test', 'title', '_')
self.assertEqual(title2, 'Test_1')
def test_format_autoname(self):
'''
Test if braced params are replaced in format autoname
'''
doctype = 'ToDo'
todo_doctype = frappe.get_doc('DocType', doctype)
todo_doctype.autoname = 'format:TODO-{MM}-{status}-{##}'
todo_doctype.save()
description = 'Format'
todo = frappe.new_doc(doctype)
todo.description = description
todo.insert()
series = getseries('', 2)
series = str(int(series)-1)
if len(series) < 2:
series = '0' + series
self.assertEqual(todo.name, 'TODO-{month}-{status}-{series}'.format(
month=now_datetime().strftime('%m'), status=todo.status, series=series))
def test_format_autoname_for_consecutive_week_number(self):
'''
Test if braced params are replaced for consecutive week number in format autoname
'''
doctype = 'ToDo'
todo_doctype = frappe.get_doc('DocType', doctype)
todo_doctype.autoname = 'format:TODO-{WW}-{##}'
todo_doctype.save()
description = 'Format'
todo = frappe.new_doc(doctype)
todo.description = description
todo.insert()
series = getseries('', 2)
series = str(int(series)-1)
if len(series) < 2:
series = '0' + series
week = determine_consecutive_week_number(now_datetime())
self.assertEqual(todo.name, 'TODO-{week}-{series}'.format(
week=week, series=series))
def test_revert_series(self):
from datetime import datetime
year = datetime.now().year
series = 'TEST-{}-'.format(year)
key = 'TEST-.YYYY.-'
name = 'TEST-{}-00001'.format(year)
frappe.db.sql("""INSERT INTO `tabSeries` (name, current) values (%s, 1)""", (series,))
revert_series_if_last(key, name)
current_index = frappe.db.sql("""SELECT current from `tabSeries` where name = %s""", series, as_dict=True)[0]
self.assertEqual(current_index.get('current'), 0)
frappe.db.delete("Series", {"name": series})
series = 'TEST-{}-'.format(year)
key = 'TEST-.YYYY.-.#####'
name = 'TEST-{}-00002'.format(year)
frappe.db.sql("""INSERT INTO `tabSeries` (name, current) values (%s, 2)""", (series,))
revert_series_if_last(key, name)
current_index = frappe.db.sql("""SELECT current from `tabSeries` where name = %s""", series, as_dict=True)[0]
self.assertEqual(current_index.get('current'), 1)
frappe.db.delete("Series", {"name": series})
series = 'TEST-'
key = 'TEST-'
name = 'TEST-00003'
frappe.db.delete("Series", {"name": series})
frappe.db.sql("""INSERT INTO `tabSeries` (name, current) values (%s, 3)""", (series,))
revert_series_if_last(key, name)
current_index = frappe.db.sql("""SELECT current from `tabSeries` where name = %s""", series, as_dict=True)[0]
self.assertEqual(current_index.get('current'), 2)
frappe.db.delete("Series", {"name": series})
series = 'TEST1-'
key = 'TEST1-.#####.-2021-22'
name = 'TEST1-00003-2021-22'
frappe.db.delete("Series", {"name": series})
frappe.db.sql("""INSERT INTO `tabSeries` (name, current) values (%s, 3)""", (series,))
revert_series_if_last(key, name)
current_index = frappe.db.sql("""SELECT current from `tabSeries` where name = %s""", series, as_dict=True)[0]
self.assertEqual(current_index.get('current'), 2)
frappe.db.delete("Series", {"name": series})
series = ''
key = '.#####.-2021-22'
name = '00003-2021-22'
frappe.db.delete("Series", {"name": series})
frappe.db.sql("""INSERT INTO `tabSeries` (name, current) values (%s, 3)""", (series,))
revert_series_if_last(key, name)
current_index = frappe.db.sql("""SELECT current from `tabSeries` where name = %s""", series, as_dict=True)[0]
self.assertEqual(current_index.get('current'), 2)
frappe.db.delete("Series", {"name": series})
def test_naming_for_cancelled_and_amended_doc(self):
submittable_doctype = frappe.get_doc({
"doctype": "DocType",
"module": "Core",
"custom": 1,
"is_submittable": 1,
"permissions": [{
"role": "System Manager",
"read": 1
}],
"name": 'Submittable Doctype'
}).insert(ignore_if_duplicate=True)
doc = frappe.new_doc('Submittable Doctype')
doc.save()
original_name = doc.name
doc.submit()
doc.cancel()
cancelled_name = doc.name
self.assertEqual(cancelled_name, "{}-CANC-0".format(original_name))
amended_doc = frappe.copy_doc(doc)
amended_doc.docstatus = 0
amended_doc.amended_from = doc.name
amended_doc.save()
self.assertEqual(amended_doc.name, original_name)
amended_doc.submit()
amended_doc.cancel()
self.assertEqual(amended_doc.name, "{}-CANC-1".format(original_name))
submittable_doctype.delete()
def test_parse_naming_series_for_consecutive_week_number(self):
week = determine_consecutive_week_number(now_datetime())
name = parse_naming_series('PREFIX-.WW.-SUFFIX')
expected_name = 'PREFIX-{}-SUFFIX'.format(week)
self.assertEqual(name, expected_name)
def test_determine_consecutive_week_number(self):
from datetime import datetime
dt = datetime.fromisoformat("2019-12-31")
w = determine_consecutive_week_number(dt)
self.assertEqual(w, "53")
dt = datetime.fromisoformat("2020-01-01")
w = determine_consecutive_week_number(dt)
self.assertEqual(w, "01")
dt = datetime.fromisoformat("2020-01-15")
w = determine_consecutive_week_number(dt)
self.assertEqual(w, "03")
dt = datetime.fromisoformat("2021-01-01")
w = determine_consecutive_week_number(dt)
self.assertEqual(w, "00")
dt = datetime.fromisoformat("2021-12-31")
w = determine_consecutive_week_number(dt)
self.assertEqual(w, "52")