* fix: pointless conditions about systemd/supervisor
What does this have to do with hostname?
* fix!: Overriden doctypes must inherit same base class
There is almost never a real need to completely override a class. After
this change we'll only allow extending and not overriding completely.
- Hash one time reset tokens instead of storing them as is
- Up the perm level
- Use better source of randomness for generating token
- minor code cleanup here and there
* feat: comply trackers with utm and add utm_content for a/b testing
* fix: make all other than source optional
this is plausible.io best practice
* fix: medium is not specified to be lowercase
* fix: ensure proper parameter quoting
It's unlikely that a translation for the results of num2words exists, because it should return a string that is already translated in the target language. If there are some numbers that have a specific translation, then it should already be handled in the num2words library. A domain-specific library is surely better at this hypothetical task than Frappe's generic translation system.
In French, 100 is called Cent. But in English, Cent is 1/100th of a dollar, which is called Centime in French.
Expected: num2words(200).title() == "Cent"
Actual: _(num2words(200).title()) == _("Cent") == "Centime"
```
AttributeError: 'NoneType' object has no attribute 'startswith'
File "frappe/app.py", line 110, in application
response = frappe.api.handle(request)
File "frappe/api/__init__.py", line 49, in handle
data = endpoint(**arguments)
File "frappe/api/v1.py", line 36, in handle_rpc_call
return frappe.handler.handle()
File "frappe/handler.py", line 49, in handle
data = execute_cmd(cmd)
File "frappe/handler.py", line 85, in execute_cmd
return frappe.call(method, **frappe.form_dict)
File "__init__.py", line 1680, in call
return fn(*args, **newargs)
File "frappe/utils/typing_validations.py", line 31, in wrapper
return func(*args, **kwargs)
File "frappe/website/doctype/web_page_view/web_page_view.py", line 58, in make_view_log
if not frappe.utils.is_site_link(path):
File "frappe/utils/data.py", line 2488, in is_site_link
if link.startswith("/"):
```