### BREAKING CHANGE
#### Datetime, Date and Time fields will always be cast to respective objects in `setattr`, this will ensure uniformity while accessing the values, no more `getdate`, `get_datetime`, `to_timedelta` wrapper.
- While importing data, the framework does check for `set_only_once`.
- In normal case scenarios, this will work flawlessly since most date fields might not be set_only_once.
- But in Subscription, the date field is set to `set_only_once` and in `after_insert`, `document.save` is called, and while doing so, `set_only_once` is checked [here](1944a547f9/frappe/model/document.py (L566)).
-This works fine if the data imported is in the correct format.
- If the date's data is not in the correct format, the framework throws an error.
- for eg `06-02-2022 00:00:00 != 06-02-2022`
- fixes [Issue/#15370](https://github.com/frappe/frappe/issues/15370)
> no-docs
* chore: warn about missing scheduler / doc events
* fix: pass list instead of filter
filter can only be iterated upon once
* refactor: many typehints in __init__.py
refactor: clean up code to py39+ supported syntax
- f-strings instead of format
- latest typing support instead of pre 3.9 TitleCase
- remove UTF-8 declarations.
- many more changes
Powered by https://github.com/asottile/pyupgrade/ + manual cleanups
When you create a Virtual DocType as a Child Table (which is possible without any warning), then it will lead to several errors when updating or deleting of the parent document.
This is because the following files just execute a SQL Statement for the doctype (which doesnt have a DB Table, as this is the nature of a virtual doctype ;-)
**apps/frappe/frappe/model/document.py**
```py
frappe.db.sql("""delete from `tab{0}` where parent=%s and parenttype=%s and parentfield=%s""".format(df.options), (self.name, self.doctype, fieldname))
```
**apps/frappe/frappe/model/delete_doc.py**
```py
frappe.db.sql(
"delete from `tab%s` where parenttype=%s and parent = %s" % (t, "%s", "%s"), (doctype, name)
)
```
So at these points, I added a check to not perform any sql command for virtual doctypes. With these changes, my affected situation is solved. Perhaps there are other situations, I didn't encounter yet.
As an additional feature, those virtual doctype models should also get an information about the parent is deleted, to propagate the deletion to the remote data pools; but for now I hope this bugfix can be approved.
A field like 'count(`tabBOM Update Log`.name) as total_count' split by
whitespace loses it's meaning. Tried splitting it meaningfully but
didn't get the point of this tbh and stopped. I'm not sure what the code
before was trying to do and with what set of inputs.
Imagine the following fields: [count(`tabBOM Update Log`.name) as
total_count, `tabBOM Update Log`.name as update_name, `tabBOM Update
Log`.name, `tabBOM Update as Log`.name, tabBOM.name, name], I couldn't
see what the previous check was trying to protect - hence, didn't add
any equivalent functionality.
Each new doc inserts a version, this contains nothing but creator and
creation time.. which is already immutable information on the original
document.
This was added for cases like data import to track from where document
got created, ref: b7dfe7969d
Fix: only add a version on creation IF creation info is present on flags
* fix(model)!: Match labels in meta & model
Labels for fields have been inconsistent. In standard filters, doc.name
would be labelled as "Name" while it's "ID" in the edit filters option.
Similarly for other fields, the same view will address the same fields
differently. This PR aims to get rid of such inconsistencies.
Changes:
* [model] Change label ID for name to 'Name'
* [meta] Match labels of owner, modified, modified_by
* [meta] Add labels for more fields - from model.js
* fix!: get_label to fetch labels as Desk does
* fix!(label): Refer to name field as 'ID' over 'Name'
* test: Use 'ID' label instead of 'Name'
Converted all possible usages of re.* that weren't compiling the regex
separately and re-using it. Separated out the compiled patterns as
global variables. Repetitive patterns could be made DRY-er.
Would be nicer to have all regexes in a single module so that we could
re-use better, keep track of outdated, and keep checks for possible
reDos' etc
refactor: fetching transaction list
refactor: get default naming series
refactor: simplify naming series option scrubbing
fix: remove dead code related to insert series
This code is dead in many ways
- Creates map but it's never evaluated, so it doesn't actually run :D
- Just randomly splits naming series parts to create prefix... makes no
sense.
fix: deduplicate prefix list
If someone deletes doctype and restores it back all customization are
lost, there's no "real" reason to delete all these customization. They
are only ever active if the doctype is being used.
Explanations:
- Custom field: is used by meta when doctype meta is requested, if meta
isn't requested then custom field is effectively inactive.
- Client script: loaded by meta when doctype is requested by desk. So
inactive in deleted state.
- Property setter: loaded by meta, so inactive when doctype isn't
present.
- Report: will break doctype isn't present, but user should delete them
manually to avoid loss of "scripts" or anything special they might
have done. Also report's doctype don't 100% indicate that it's based
solely on that doctype.