Fixtures...don't know what it is

Link broken again!

@aakvatech For your Reference:

https://frappe.io/docs/user/en/guides/app-development/how-to-create-custom-fields-during-app-installation

3 Likes

Have gone through the link posted, and I see a need to have a more step by step document for a newbie. Should I post what I experienced as a user right here or is there a more appropriate place to share steps as per my experience?

Hi @aakvatech, it should be okay to post it here, I’ve found this thread through a simple search. And I think many others will find your experience useful if you’d be able to post it here. :slight_smile:

Probably the most canonical way would be to fork the frappe repo and submit a pull request :building_construction:

https://github.com/frappe/frappe/blob/develop/frappe/docs/user/en/guides/app-development/how-to-create-custom-fields-during-app-installation.md

2 Likes
  1. Create new app e.g. - bench get-app library_management
  2. Install new app into your site e.g. - bench --site erpnext.vm install-app library_management
  3. Customize your form and ensure that the module name is changed to your app name e.g. - library_management
  4. Open file hooks.py using a text editor, such as “vi” from the location e.g. - ~/frappe-bench/apps/library_management/library_management/hooks.py
  5. At the end of the hooks.py file you can add line
    fixtures = [“Custom Field”]
    I would also add other usual customizations such as “DocType”, “Custom Script”, “Property Setter”, “Print Format”.
    I can also use the same technique to add all setups that are done so that migrating setups from test to production and vice versa is easy.
  6. Run command “bench --site mysite export-fixtures” to export all mysite customizations where you have selected Module name as your app name e.g. - library_management. The *.json files will be stored in the location ~/frappe-bench/apps/library_management/library_management/fixtures.

I haven’t tried using github yet but have read that one could upload the changes on github, or as I did, you can download those json files and put it into another system that has the same app created, into the same fixtures folder and use bench --migrate to apply the customization onto those sites that has the application installed.

hth

15 Likes

Hello @avinash_upadhya28

This should be bench new-app library_management

This is not clear, can you please explain?
For example, I need to customize the Task doctype which is existed in erpnext application, so how to change the module name to be same as the created application name which is in your example is library_management?

You need to add DocType to be part of the fixtures that need to be exported because you need to include the changes that was made directly to the DocType and not through the Customize Form?

Regards
Bilal

Yes, this could be required depending, whether you are getting ready app or making a new one.

Customizing a doctype form is recommended. Changing base doctype will break the updates and will require you to do bench update --reset that will undo all your work directly done on base doctypes. I have done this mistake too many a times already. Export the customized form to your “library_management” app.

Like above, better customize the form, and export form to your cutom app.

Doctype of customized apps automatically get stored in the custom app/custom module/doctype directory and you have to git push it to your repository thereafter.

Hello @aakvatech

Thanks a lot for your kindly reply and help.

How? Can u explain the steps?
Do you mean export the fixtures or something else?
Where to be exported at the “library_management” app? At which directory?

Regards
Bilal

  1. Set the developer_mode to 1 on server

  2. Customize the form for the doctype:

  3. Select your custom app you created, in this example it’s called Recharge
    image

If you don’t have a custom export then you need to make a new one like you indicated earlier.

  1. You then run the command to export-fixtures:

if you have single site

bench export-fixtures

if you are multi-tenant

bench --site <> export-fixtures

  1. The file will be stored in the apps/recharge/recharge/recharge/custom/
    frappe@:~/frappe-bench$ ls apps/recharge/recharge/recharge/custom/
    journal_entry.json purchase_receipt_item.json sales_taxes_and_charges.json
    payment_entry.json purchase_receipt.json stock_entry_detail.json
    purchase_invoice_item.json sales_invoice_item.json
    purchase_invoice.json sales_invoice.json

hth

2 Likes

Further to this, I have realized that having filters defined helps to maintain only specific fixtures to be exported e.g.:

fixtures = [“Custom Field”, “Custom Script”, “Property Setter”, {“doctype”:“Naming Series”, “filters”: [{“doctype”:“Daily Checklist”}]}, {“doctype”:“Notification”, “filters”: [{“is_standard”:0}]}, ‘Auto Email Report’, “Translation”, {“doctype”:“Print Format”, “filters”: [{“module”:“Oil Management Solution”}]}, {“doctype”:“Report”, “filters”: [{“module”:“Oil Management Solution”}]} ]

4 Likes

The data structure for fixtures is loosely defined by me as follows:
fixtures is a list of dictionary_objects:

fixtures = [object1, object2, objectN]

Each dictionary_object with filters contains:

*dictionary_object* = { "doctype":"*doctype_name*", "filters":"*list_of_filters*" }

doctype is self-explanatory, it is the DocType name you wish to export.

Each list_of_filters contains itself, a list_of_filter_criteria
The list_or_filter_criteria itself is a list containing:

*fieldname*, *operator*, (*value*)

Note that value is a Tuple!

*list_of_filter_criteria* = ["fieldname", "operator", ("Value1","Value2","ValueN", )]

So that:
“filters”: [list_of_filter_criteria]

For your convenience, these are the allowed operators:

Side note: I stumbled upon the operators during a traceback while running bench export-fixtures by using “not” and this was the message returned:

Operator must be one of =, !=, >, <, >=, <=, like, not like, in, not in, between, descendants of, ancestors of, not descendants of, not ancestors of, is```
21 Likes

This is a much needed explanation for filters. If anybody is using with filters, please bookmark this reply by @Tropicalrambler, it will be very helpful.

Thanks! I’m glad this helped you!

Good followup reading unless there is another technique

1 Like

Hi I’m trying to export custom field, custom script, server script regarding my custom doctype

In my hooks.py in the custom app folder, I tried using
fixtures = ["Sample Doctype"]
I also tried using
fixtures = ["Custom Script","Custom Field"]
only data, custom script get exported. No custom field and server script get exported.

I’m using erpnext 12.3.1, frappe 12.1.0

Did you also run bench export-fixtures?

Hi @auliabismar
Try this format in hooks.py

fixtures = [“Workflow”,“Workflow State”,“Print Format”,“Notification”,“Workflow Action Master”,
{“dt”: “Custom Field”,
“filters”: [
[
“name”, “in”, [“Purchase Order-registration_type”,
“Purchase Order-mode_of_transport”,
“Purchase Order-supplier_gstin”,
“Purchase Order-place_of_supply”,
“Purchase Order-company_gstin”,
“Purchase Order-remarks”,
“Purchase Order-authorised_signatory”,
“Sales Order-remarks”,
“Sales Invoice-authorised_signatory”,
“Sales Invoice-remarks”,
“Address-cin_no”,
“Purchase Receipt-authorised_signatory”,
“Purchase Receipt-mode_of_transport”,
“Delivery Note-authorised_signatory”,
]
]
]},
{“dt”: “Notification”,
“filters”: [
“is_standard != 1”
]}
]

after that use this command
bench --site [sitename] export-fixtures

You can check it out this links

1 Like

How is fixture priority handled.
If two apps were to modify the same DocType and the same field (for instance Address type, modifiy the options list), which fixture from which app would be migrated/have priority?