Fixtures...don't know what it is

  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?

the app in the apps.txt?

Need help in fixtures. Whats is property setter ? Can anyone provide example

1 Like

Using fixtures you can export doctype settings, custom fields, custom scripts etc that you made in one site then put it in a custom app. If you install this app to another site then you can apply those fixtures

To export fixtures bench --site site1 export-fixtures

thanks @jof2jc.
The problem i am being facing is in customize form.
So “bench export-fixtures” works for custom-field and custom-script. But there is a field in customize form “Default Print Format”. I have set the value to ‘foo-bar’. So export-fixtures should keep the track of this field right ?
If Yes, then how ?
If No then how can i maintain it.

Thank you very much for support, I just want to ask if I have the ability to exclude a couple of fields from the fixtures.

e.g. ["Web Page-main_content", "Web Page-javascript", "Web Page-css"]

What I want to achieve is to version control the website module.