[Release Notes] ERPNext Version 13 has been released

@armin_azimi

Welcome!

May be you must enable JavaScript in your browser.

Hope it helps.

From my experience, it appears there are still a number of compatibility issues with ERPNext and Python3.8 which comes as default with Ubuntu 20.xx

I simply installed Python3.7 and made sure to specify the Python environment while installing… no issues ever since!

Cheers

I am also facing the same issue, when I upgraded from 12-13

I have tried to upgrade from v12 to v13 and end up in the following error. Any clue you can help me with?

File “/home/frappe/frappe-bench/apps/frappe/frappe/model/document.py”, line 852, in
fn = lambda self, *args, **kwargs: getattr(self, method)(*args, **kwargs)
File “/home/frappe/frappe-bench/apps/frappe/frappe/custom/doctype/custom_field/custom_field.py”, line 76, in on_update
validate_fields_for_doctype(self.dt)
File “/home/frappe/frappe-bench/apps/frappe/frappe/core/doctype/doctype/doctype.py”, line 739, in validate_fields_for_doctype
validate_fields(meta)
File “/home/frappe/frappe-bench/apps/frappe/frappe/core/doctype/doctype/doctype.py”, line 1050, in validate_fields
validate_data_field_type(d)
File “/home/frappe/frappe-bench/apps/frappe/frappe/core/doctype/doctype/doctype.py”, line 1004, in validate_data_field_type
frappe.msgprint(text_str + df_options_str, title=“Invalid Data Field”, raise_exception=True)
File “/home/frappe/frappe-bench/apps/frappe/frappe/ init .py”, line 406, in msgprint
_raise_exception()
File “/home/frappe/frappe-bench/apps/frappe/frappe/ init .py”, line 362, in _raise_exception
raise ValidationError(msg)
> frappe.exceptions.ValidationError: Project Title is an invalid Data field.

Only Options allowed for Data field are:

* Email

  • Name
  • Phone

You’ve custom field with type Data and it has invalid options.

Yes, I have a custom field project_title in Quotation, Sales Invoice and Sales Order docs.

The type is VARCHAR

and now I am not able to access the web

image

Can you help to resolve it please?

Should I worry of loosing data if I change the type? This is a production server.

What is “Issue-legacy_customer_id”?

f = frappe.get_doc(“Custom Field”, “Issue-legacy_customer_id”)
Set the options to None, current option Customer is invalid
f.options = None
f.save()
frappe.db.commit()

get into bench console

bench --site <site-name> console

Enter following in console:

for field in frappe.get_all(
    "Custom Field",
    fields=["*"],
    filters={
        "fieldtype": "Data",
        "options": ["not in", ["Email", "Name", "Phone", "URL"]],
    },
):
    options = field.get("options")
    if options:
        name = field.get("name")
        fieldtype = field.get("fieldtype")
        print(f"field: {name}\nfieldtype: {fieldtype}\nInvalid options: {options}")
        f = frappe.get_doc("Custom Field", name)
        f.options = None
        f.save()
        frappe.db.commit()

Here is the out put

field: Sales Order-project_title
fieldtype: Data
Invalid options: Quotation
/home/frappe/frappe-bench/apps/frappe/frappe/www/printview.py:412: DeprecationWarning: invalid escape sequence \(
  for at_import in list(set(re.findall("(@import url\([^\)]+\)[;]?)", css))):
---------------------------------------------------------------------------
OperationalError                          Traceback (most recent call last)
~/frappe-bench/apps/frappe/frappe/commands/utils.py in <module>
     14         f = frappe.get_doc("Custom Field", name)
     15         f.options = None
---> 16         f.save()
     17         frappe.db.commit()
     18 

~/frappe-bench/apps/frappe/frappe/model/document.py in save(self, *args, **kwargs)
    282         def save(self, *args, **kwargs):
    283                 """Wrapper for _save"""
--> 284                 return self._save(*args, **kwargs)
    285 
    286         def _save(self, ignore_permissions=None, ignore_version=None):

~/frappe-bench/apps/frappe/frappe/model/document.py in _save(self, ignore_permissions, ignore_version)
    317                 self.validate_higher_perm_levels()
    318                 self._validate_links()
--> 319                 self.run_before_save_methods()
    320 
    321                 if self._action != "cancel":

~/frappe-bench/apps/frappe/frappe/model/document.py in run_before_save_methods(self)
    952                 # before_validate method should be executed before ignoring validations
    953                 if self._action in ("save", "submit"):
--> 954                         self.run_method("before_validate")
    955 
    956                 if self.flags.ignore_validate:

~/frappe-bench/apps/frappe/frappe/model/document.py in run_method(self, method, *args, **kwargs)
    859 
    860                 self.run_notifications(method)
--> 861                 run_webhooks(self, method)
    862                 run_server_script_for_doc_event(self, method)
    863 

~/frappe-bench/apps/frappe/frappe/integrations/doctype/webhook/__init__.py in run_webhooks(doc, method)
     23                         webhooks_list = frappe.get_all('Webhook',
     24                                                 fields=["name", "`condition`", "webhook_docevent", "webhook_doctype"],
---> 25                                                 filters={"enabled": True}
     26                                         )
     27 

~/frappe-bench/apps/frappe/frappe/__init__.py in get_all(doctype, *args, **kwargs)
   1431         if not "limit_page_length" in kwargs:
   1432                 kwargs["limit_page_length"] = 0
-> 1433         return get_list(doctype, *args, **kwargs)
   1434 
   1435 def get_value(*args, **kwargs):

~/frappe-bench/apps/frappe/frappe/__init__.py in get_list(doctype, *args, **kwargs)
   1404         """
   1405         import frappe.model.db_query
-> 1406         return frappe.model.db_query.DatabaseQuery(doctype).execute(*args, **kwargs)
   1407 
   1408 def get_all(doctype, *args, **kwargs):

~/frappe-bench/apps/frappe/frappe/model/db_query.py in execute(self, fields, filters, or_filters, docstatus, group_by, order_by, limit_start, limit_page_length, as_list, with_childnames, debug, ignore_permissions, user, with_comment_count, join, distinct, start, page_length, limit, ignore_ifnull, save_user_settings, save_user_settings_fields, update, add_total_row, user_settings, reference_doctype, return_query, strict, pluck, ignore_ddl)
    104                 if not self.columns: return []
    105 
--> 106                 result = self.build_and_run()
    107                 if return_query:
    108                         return result

~/frappe-bench/apps/frappe/frappe/model/db_query.py in build_and_run(self)
    142                 else:
    143                         return frappe.db.sql(query, as_dict=not self.as_list, debug=self.debug,
--> 144                                 update=self.update, ignore_ddl=self.ignore_ddl)
    145 
    146         def prepare_args(self):

~/frappe-bench/apps/frappe/frappe/database/database.py in sql(self, query, values, as_dict, as_list, formatted, debug, ignore_ddl, as_utf8, auto_commit, update, explain)
    150 
    151                         else:
--> 152                                 self._cursor.execute(query)
    153 
    154                                 if frappe.flags.in_migrate:

~/frappe-bench/env/lib/python3.6/site-packages/pymysql/cursors.py in execute(self, query, args)
    146         query = self.mogrify(query, args)
    147 
--> 148         result = self._query(query)
    149         self._executed = query
    150         return result

~/frappe-bench/env/lib/python3.6/site-packages/pymysql/cursors.py in _query(self, q)
    308         self._last_executed = q
    309         self._clear_result()
--> 310         conn.query(q)
    311         self._do_get_result()
    312         return self.rowcount

~/frappe-bench/env/lib/python3.6/site-packages/pymysql/connections.py in query(self, sql, unbuffered)
    546             sql = sql.encode(self.encoding, "surrogateescape")
    547         self._execute_command(COMMAND.COM_QUERY, sql)
--> 548         self._affected_rows = self._read_query_result(unbuffered=unbuffered)
    549         return self._affected_rows
    550 

~/frappe-bench/env/lib/python3.6/site-packages/pymysql/connections.py in _read_query_result(self, unbuffered)
    773         else:
    774             result = MySQLResult(self)
--> 775             result.read()
    776         self._result = result
    777         if result.server_status is not None:

~/frappe-bench/env/lib/python3.6/site-packages/pymysql/connections.py in read(self)
   1154     def read(self):
   1155         try:
-> 1156             first_packet = self.connection._read_packet()
   1157 
   1158             if first_packet.is_ok_packet():

~/frappe-bench/env/lib/python3.6/site-packages/pymysql/connections.py in _read_packet(self, packet_type)
    723             if self._result is not None and self._result.unbuffered_active is True:
    724                 self._result.unbuffered_active = False
--> 725             packet.raise_for_error()
    726         return packet
    727 

~/frappe-bench/env/lib/python3.6/site-packages/pymysql/protocol.py in raise_for_error(self)
    219         if DEBUG:
    220             print("errno =", errno)
--> 221         err.raise_mysql_exception(self._data)
    222 
    223     def dump(self):

~/frappe-bench/env/lib/python3.6/site-packages/pymysql/err.py in raise_mysql_exception(data)
    141     if errorclass is None:
    142         errorclass = InternalError if errno < 1000 else OperationalError
--> 143     raise errorclass(errno, errval)

OperationalError: (1054, "Unknown column 'tabWebhook.enabled' in 'where clause'")

Let me highlight the errors

Hi,

Is the search bar a user permission? If then what is the role permission for this?

Thank you

I faced the same issue and fixed it by altering the field ‘custom’ in ‘tabModule Def’ to be nullable
alter table tabModule Def modify custom int(1) null;

After Adding Role Employee Self Service User able to see search bar

@revant_one i have an error in bench migrate

Traceback (most recent call last):
File "/usr/lib/python3.6/runpy.py", line 193, in _run_module_as_main
"__main__", mod_spec)
File "/usr/lib/python3.6/runpy.py", line 85, in _run_code
exec(code, run_globals)
File "/home/frappe/frappe-bench/apps/frappe/frappe/utils/bench_helper.py", line 104, in <module>
main()
File "/home/frappe/frappe-bench/apps/frappe/frappe/utils/bench_helper.py", line 19, in main
click.Group(commands=commands)(prog_name='bench')
File "/home/frappe/frappe-bench/env/lib/python3.6/site-packages/click/core.py", line 829, in __call__
return self.main(*args, **kwargs)
File "/home/frappe/frappe-bench/env/lib/python3.6/site-packages/click/core.py", line 782, in main
rv = self.invoke(ctx)
File "/home/frappe/frappe-bench/env/lib/python3.6/site-packages/click/core.py", line 1259, in invoke
return _process_result(sub_ctx.command.invoke(sub_ctx))
File "/home/frappe/frappe-bench/env/lib/python3.6/site-packages/click/core.py", line 1259, in invoke
return _process_result(sub_ctx.command.invoke(sub_ctx))
File "/home/frappe/frappe-bench/env/lib/python3.6/site-packages/click/core.py", line 1066, in invoke
return ctx.invoke(self.callback, **ctx.params)
File "/home/frappe/frappe-bench/env/lib/python3.6/site-packages/click/core.py", line 610, in invoke
return callback(*args, **kwargs)
File "/home/frappe/frappe-bench/env/lib/python3.6/site-packages/click/decorators.py", line 21, in new_func
return f(get_current_context(), *args, **kwargs)
File "/home/frappe/frappe-bench/apps/frappe/frappe/commands/__init__.py", line 27, in _func
ret = f(frappe._dict(ctx.obj), *args, **kwargs)
File "/home/frappe/frappe-bench/apps/frappe/frappe/commands/site.py", line 309, in migrate
skip_search_index=skip_search_index
File "/home/frappe/frappe-bench/apps/frappe/frappe/migrate.py", line 73, in migrate
sync_fixtures()
  File "/home/frappe/frappe-bench/apps/frappe/frappe/utils/fixtures.py", line 24, in sync_fixtures
import_doc(frappe.get_app_path(app, "fixtures", fname))
   File "/home/frappe/frappe-bench/apps/frappe/frappe/core/doctype/data_import/data_import.py", line 191, in import_doc
reset_permissions=True
File "/home/frappe/frappe-bench/apps/frappe/frappe/modules/import_file.py", line 70, in import_file_by_path
ignore_version=ignore_version, reset_permissions=reset_permissions)
File "/home/frappe/frappe-bench/apps/frappe/frappe/modules/import_file.py", line 152, in import_doc
doc.insert()
File "/home/frappe/frappe-bench/apps/frappe/frappe/model/document.py", line 267, in insert
self.run_post_save_methods()
File "/home/frappe/frappe-bench/apps/frappe/frappe/model/document.py", line 993, in run_post_save_methods
self.run_method("on_update")
File "/home/frappe/frappe-bench/apps/frappe/frappe/model/document.py", line 858, in run_method
out = Document.hook(fn)(self, *args, **kwargs)
 File "/home/frappe/frappe-bench/apps/frappe/frappe/model/document.py", line 1147, in composer
return composed(self, method, *args, **kwargs)
File "/home/frappe/frappe-bench/apps/frappe/frappe/model/document.py", line 1130, in runner
add_to_return_value(self, fn(self, *args, **kwargs))
File "/home/frappe/frappe-bench/apps/frappe/frappe/model/document.py", line 852, in <lambda>
fn = lambda self, *args, **kwargs: getattr(self, method)(*args, **kwargs)
  File "/home/frappe/frappe-bench/apps/frappe/frappe/custom/doctype/custom_field/custom_field.py", line 76, in on_update
validate_fields_for_doctype(self.dt)
 File "/home/frappe/frappe-bench/apps/frappe/frappe/core/doctype/doctype/doctype.py", line 741, in validate_fields_for_doctype
validate_fields(meta)
    File "/home/frappe/frappe- bench/apps/frappe/frappe/core/doctype/doctype/doctype.py", line 1052, in validate_fields
validate_data_field_type(d)
File "/home/frappe/frappe-bench/apps/frappe/frappe/core/doctype/doctype/doctype.py", line 1006, in validate_data_field_type
frappe.msgprint(text_str + df_options_str, title="Invalid Data Field", raise_exception=True)
   File "/home/frappe/frappe-bench/apps/frappe/frappe/__init__.py", line 411, in msgprint
_raise_exception()
 File "/home/frappe/frappe-bench/apps/frappe/frappe/__init__.py", line 367, in _raise_exception
raise ValidationError(msg)
frappe.exceptions.ValidationError: <b>None</b> is an invalid Data field.<br><br>Only 
Options allowed for Data field are:<br><ul><li>Email</li><li>Name</li><li>Phone</ul>

i tried below code in console . nothing displayed. but still facing this error

for field in frappe.get_all(
"Custom Field",
fields=["*"],
filters={
    "fieldtype": "Data",
    "options": ["not in", ["Email", "Name", "Phone", "URL"]],
},
):
options = field.get("options")
if options:
    name = field.get("name")
    fieldtype = field.get("fieldtype")
    print(f"field: {name}\nfieldtype: {fieldtype}\nInvalid options: {options}")
    f = frappe.get_doc("Custom Field", name)
    f.options = None
    f.save()
    frappe.db.commit()

backported on 6th June 2021 feat: URL option for Data fieldtype (backport #12898) by mergify[bot] · Pull Request #13138 · frappe/frappe · GitHub

Remove “URL” from list and try

This error is coming from my custom app. found some data field in a doctype which are not added correctly

Hi,

have you found some workaround ?

pzdr,
Krzysiek

Here is the solution. Not sure why it wasn’t merged.

1 Like

Hello. do you have the one?
I downloaded the link, but it is still 12. And upgrade process has a lot of problems…

It requires quite some digging to find this Topic.

It would be really cool and a sign of a certain level of professionalism whether the those release messages could come along in the exact same form with regards to (Title wording, tags, Category, …) each and every time.

Let me know whether you want me to go ahead with this in implement best practices on this matter.