def load_from_db(self):
"""Fetch a single Form 470 record from the USAC API using the application number."""
url = f"{Form470.BASE_URL}?application_number={self.name}"
try:
response = requests.get(url)
response.raise_for_status()
data = response.json()
if not data:
frappe.throw(f"Document {self.name} not found", frappe.DoesNotExistError)
# The API returns a list, so we extract the first item
record = data[0]
# Map API response fields to Frappe fields
data = {
"name": record.get("application_number"),
"form_nickname": record.get("form_nickname"),
"form_pdf": record.get("form_pdf", {}).get("url") if record.get("form_pdf") else None,
"service_request_id": record.get("service_request_id"),
"rfp_upload_date": record.get("rfp_upload_date"),
"fcc_form_470_status": record.get("fcc_form_470_status"),
"funding_year": record.get("funding_year"),
"billed_entity_name": record.get("billed_entity_name"),
"billed_entity_number": record.get("billed_entity_number"),
"billed_entity_city": record.get("billed_entity_city"),
"billed_entity_state": record.get("billed_entity_state"),
"billed_entity_zip": record.get("billed_entity_zip"),
"billed_entity_phone": record.get("billed_entity_phone"),
"contact_name": record.get("contact_name"),
"contact_email": record.get("contact_email"),
"authorized_person_name": record.get("authorized_person_name"),
"authorized_person_email": record.get("authorized_person_email"),
"service_category": record.get("service_category"),
"service_type": record.get("service_type"),
"function": record.get("function"),
}
self._record = record
super(Document, self).__init__(frappe._dict(data))
except requests.RequestException as e:
frappe.logger().error(f"Error fetching Form 470 data: {e}")
frappe.throw("Failed to fetch data from USAC API", frappe.ValidationError)
Gives me `### App Versions
{
"erpnext": "16.0.0-dev",
"erpnextcrmkit": "0.0.1",
"frappe": "16.0.0-dev",
"mspkit": "0.0.1",
"rangeldigital": "0.0.1"
}
Route
Form/Form 470/240022562
Traceback
Traceback (most recent call last):
File "apps/frappe/frappe/app.py", line 115, in application
response = frappe.api.handle(request)
File "apps/frappe/frappe/api/__init__.py", line 49, in handle
data = endpoint(**arguments)
File "apps/frappe/frappe/api/v1.py", line 36, in handle_rpc_call
return frappe.handler.handle()
~~~~~~~~~~~~~~~~~~~~~^^
File "apps/frappe/frappe/handler.py", line 50, in handle
data = execute_cmd(cmd)
File "apps/frappe/frappe/handler.py", line 86, in execute_cmd
return frappe.call(method, **frappe.form_dict)
~~~~~~~~~~~^^^^^^^^^^^^^^^^^^^^^^^^^^^^
File "apps/frappe/frappe/__init__.py", line 1700, in call
return fn(*args, **newargs)
File "apps/frappe/frappe/utils/typing_validations.py", line 32, in wrapper
return func(*args, **kwargs)
File "apps/frappe/frappe/desk/form/load.py", line 54, in getdoc
doc.add_seen()
~~~~~~~~~~~~^^
File "apps/frappe/frappe/model/document.py", line 1596, in add_seen
frappe.db.set_value(
~~~~~~~~~~~~~~~~~~~^
self.doctype, self.name, "_seen", json.dumps(_seen), update_modified=False
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
)
^
File "apps/frappe/frappe/database/database.py", line 959, in set_value
query.run(debug=debug)
~~~~~~~~~^^^^^^^^^^^^^
File "apps/frappe/frappe/query_builder/utils.py", line 84, in execute_query
result = frappe.db.sql(query, params, *args, **kwargs) # nosemgrep
File "apps/frappe/frappe/database/database.py", line 238, in sql
self._cursor.execute(query, values)
~~~~~~~~~~~~~~~~~~~~^^^^^^^^^^^^^^^
File "env/lib/python3.13/site-packages/pymysql/cursors.py", line 153, in execute
result = self._query(query)
File "env/lib/python3.13/site-packages/pymysql/cursors.py", line 322, in _query
conn.query(q)
~~~~~~~~~~^^^
File "env/lib/python3.13/site-packages/pymysql/connections.py", line 563, in query
self._affected_rows = self._read_query_result(unbuffered=unbuffered)
~~~~~~~~~~~~~~~~~~~~~~~^^^^^^^^^^^^^^^^^^^^^^^
File "env/lib/python3.13/site-packages/pymysql/connections.py", line 825, in _read_query_result
result.read()
~~~~~~~~~~~^^
File "env/lib/python3.13/site-packages/pymysql/connections.py", line 1199, in read
first_packet = self.connection._read_packet()
File "env/lib/python3.13/site-packages/pymysql/connections.py", line 775, in _read_packet
packet.raise_for_error()
~~~~~~~~~~~~~~~~~~~~~~^^
File "env/lib/python3.13/site-packages/pymysql/protocol.py", line 219, in raise_for_error
err.raise_mysql_exception(self._data)
~~~~~~~~~~~~~~~~~~~~~~~~~^^^^^^^^^^^^
File "env/lib/python3.13/site-packages/pymysql/err.py", line 150, in raise_mysql_exception
raise errorclass(errno, errval)
pymysql.err.ProgrammingError: (1146, "Table '_7384140f3b03905f.tabform 470' doesn't exist")
Request Data
{
"type": "GET",
"args": {
"doctype": "Form 470",
"name": "160002125"
},
"headers": {},
"error_handlers": {},
"url": "/api/method/frappe.desk.form.load.getdoc",
"request_id": null
}
Response Data
{
"docinfo": {
"user_info": {},
"comments": [],
"shared": [],
"assignment_logs": [],
"attachment_logs": [],
"info_logs": [],
"like_logs": [],
"workflow_logs": [],
"doctype": "Form 470",
"name": "160002125",
"attachments": [],
"communications": [],
"automated_messages": [],
"versions": [],
"assignments": [],
"permissions": {
"select": 1,
"read": 1,
"write": 1,
"create": 1,
"delete": 1,
"submit": 0,
"cancel": 1,
"amend": 1,
"print": 1,
"email": 1,
"report": 1,
"import": 0,
"export": 1,
"share": 1
},
"views": [],
"energy_point_logs": [],
"additional_timeline_content": [],
"milestones": [],
"is_document_followed": null,
"tags": "",
"document_email": null,
"error_log_exists": null,
"webhook_request_log_log_exists": null
},
"exception": "pymysql.err.ProgrammingError: (1146, \"Table '_7384140f3b03905f.tabform 470' doesn't exist\")",
"exc_type": "ProgrammingError",
"_debug_messages": "[\"Error in query:\\n('UPDATE `tabForm 470` SET `_seen`=%(param1)s WHERE `name`=%(param2)s', {'param1': '[\\\"Administrator\\\"]', 'param2': '160002125'})\"]"
}