* Remove six for PY2 compatability since our dependencies are not, PY2
is legacy.
* Removed usages of utils from future/past libraries since they are
deprecated. This includes 'from __future__ ...' and 'from past...'
statements.
* Removed compatibility imports for PY2, switched from six imports to
standard library imports.
* Removed utils code blocks that handle operations depending on PY2/3
versions.
* Removed 'from __future__ ...' lines from templates/code generators
* Used PY3 syntaxes in place of PY2 compatible blocks. eg: metaclass
- remove several unnecessary comprehensions from functions that accept a generator.
- Using `[x for x in iter]` causes a list to be built first then passed to the outer function.
- `any` and `all` can take generator instead. This makes memory usage O(1) and actually makes these functions short-circuiting. E.g. if the first condition fails then `all` will immediately return false instead of evaluating all the entries.
- `sum`, `min`, `max` => memory usage become O(1)
- `list`, `set`, `.join()` => roughly halves memory usage, as list is not required to be built.
- lastly, it's two fewer characters to read/think about.
`frappe.get_attr(hook)(data=data)` return dict. But function `get_open_count` will access `fieldname` attribute in notifications.py.
I will cause error `'dict' object has no attribute 'fieldname'`.
* perf: Cache db columns to avoid redundant database calls
* fix: Move cache clearing code from doctype to schema.py
* fix: self.table_name instead of self.name
* fix: Cache columns in "table_columns" key
`table_columns` was cached in meta but columns were also getting accessed
directly using frappe.db.get_table_columns. Now, it is cached at
`frappe.db` layer
Co-authored-by: Suraj Shetty <surajshetty3416@gmail.com>
* feat: allow overriding dasboards via hooks
* fix: allow extending dashboard data in hooks
* fix: move logic to generic function
* format: added description to hook