diff --git a/erpnext_github_integration/github_api.py b/erpnext_github_integration/github_api.py index b7bdc5f..63ad3c6 100644 --- a/erpnext_github_integration/github_api.py +++ b/erpnext_github_integration/github_api.py @@ -654,7 +654,7 @@ def create_issue(repository, title, body=None, assignees=None, labels=None): frappe.throw(_('GitHub Personal Access Token not configured in GitHub Settings')) payload = {'title': title} - if body: + if body: payload['body'] = body if assignees: if isinstance(assignees, str): @@ -672,36 +672,38 @@ def create_issue(repository, title, body=None, assignees=None, labels=None): payload['labels'] = labels resp = github_request('POST', f'/repos/{repository}/issues', token, data=payload) - if resp: - try: - doc = frappe.get_doc({ - 'doctype': 'Repository Issue', - 'repository': repository, - 'issue_number': resp.get('number'), - 'title': resp.get('title'), - 'body': resp.get('body') or '', - 'state': resp.get('state'), - 'labels': ','.join([l.get('name') if isinstance(l, dict) else str(l) for l in resp.get('labels', [])]), - 'url': resp.get('html_url'), - 'github_id': str(resp.get('id', '')), - 'created_at': convert_github_datetime(resp.get('created_at')), - 'updated_at': convert_github_datetime(resp.get('updated_at')) + if not resp: + frappe.throw(_('Failed to create GitHub issue')) + + try: + doc = frappe.get_doc({ + 'doctype': 'Repository Issue', + 'repository': repository, + 'issue_number': resp.get('number'), + 'title': resp.get('title'), + 'body': resp.get('body') or '', + 'state': resp.get('state'), + 'labels': ','.join([l.get('name') if isinstance(l, dict) else str(l) for l in resp.get('labels', [])]), + 'url': resp.get('html_url'), + 'github_id': str(resp.get('id', '')), + 'created_at': convert_github_datetime(resp.get('created_at')), + 'updated_at': convert_github_datetime(resp.get('updated_at')) + }) + doc.insert(ignore_permissions=True) + + for assignee in resp.get('assignees', []): + gh_login = assignee.get('login') + erp_user = frappe.db.get_value("User", {"github_username": gh_login}, "name") or gh_login + doc.append('assignees_table', { + 'user': erp_user, + 'issue': doc.name }) - doc.insert(ignore_permissions=True) - - # Add assignees after insert - for assignee in resp.get('assignees', []): - gh_login = assignee.get('login') - erp_user = frappe.db.get_value("User", {"github_username": gh_login}, "name") or gh_login - doc.append('assignees_table', { - 'user': erp_user, - 'issue': doc.name - }) - doc.save(ignore_permissions=True) - return {'issue': resp, 'local_doc': doc.name} - except Exception: - pass - return resp + doc.save(ignore_permissions=True) + return {'issue': resp, 'local_doc': doc.name} + + except Exception as e: + frappe.log_error(frappe.get_traceback(), "GitHub Issue Create Error") + frappe.throw(_('Error while creating local Repository Issue record')) @frappe.whitelist() def bulk_create_issues(repository, issues): @@ -747,33 +749,37 @@ def create_pull_request(repository, title, head, base, body=None): frappe.throw(_('GitHub Personal Access Token not configured in GitHub Settings')) payload = {'title': title, 'head': head, 'base': base} - if body: + if body: payload['body'] = body - + resp = github_request('POST', f'/repos/{repository}/pulls', token, data=payload) - if resp: - try: - doc = frappe.get_doc({ - 'doctype': 'Repository Pull Request', - 'repository': repository, - 'pr_number': resp.get('number'), - 'title': resp.get('title'), - 'body': resp.get('body') or '', - 'state': resp.get('state'), - 'head_branch': resp.get('head', {}).get('ref'), - 'base_branch': resp.get('base', {}).get('ref'), - 'author': resp.get('user', {}).get('login'), - 'mergeable_state': resp.get('mergeable_state'), - 'github_id': str(resp.get('id', '')), - 'url': resp.get('html_url'), - 'created_at': convert_github_datetime(resp.get('created_at')), - 'updated_at': convert_github_datetime(resp.get('updated_at')) - }) - doc.insert(ignore_permissions=True) - return {'pull_request': resp, 'local_doc': doc.name} - except Exception: - pass - return resp + if not resp: + frappe.throw(_('Failed to create Pull Request on GitHub')) + + try: + doc = frappe.get_doc({ + 'doctype': 'Repository Pull Request', + 'repository': repository, + 'pr_number': resp.get('number'), + 'title': resp.get('title'), + 'body': resp.get('body') or '', + 'state': resp.get('state'), + 'head_branch': resp.get('head', {}).get('ref'), + 'base_branch': resp.get('base', {}).get('ref'), + 'author': resp.get('user', {}).get('login'), + 'mergeable_state': resp.get('mergeable_state'), + 'github_id': str(resp.get('id', '')), + 'url': resp.get('html_url'), + 'created_at': convert_github_datetime(resp.get('created_at')), + 'updated_at': convert_github_datetime(resp.get('updated_at')) + }) + doc.insert(ignore_permissions=True) + + return {'pull_request': resp, 'local_doc': doc.name} + + except Exception as e: + frappe.log_error(frappe.get_traceback(), "GitHub Pull Request Create Error") + frappe.throw(_('Error while creating local Repository Pull Request record')) @frappe.whitelist() def sync_repo_members(repo_full_name): diff --git a/erpnext_github_integration/public/js/project_client.js b/erpnext_github_integration/public/js/project_client.js index efea798..9463048 100644 --- a/erpnext_github_integration/public/js/project_client.js +++ b/erpnext_github_integration/public/js/project_client.js @@ -14,7 +14,7 @@ frappe.ui.form.on('Project', { frm.reload_doc(); } }); - }); + }, __('GitHub')); frm.add_custom_button(__('Sync Repository Data'), function() { let repo = frm.doc.repository; @@ -33,7 +33,7 @@ frappe.ui.form.on('Project', { frappe.msgprint(__('Error during sync: {0}').format(err.responseText || JSON.stringify(err))); } }); - }); + }, __('GitHub')); }, after_save: function(frm) { diff --git a/erpnext_github_integration/public/js/task_client.js b/erpnext_github_integration/public/js/task_client.js index afeba4d..3a3156f 100644 --- a/erpnext_github_integration/public/js/task_client.js +++ b/erpnext_github_integration/public/js/task_client.js @@ -24,9 +24,11 @@ frappe.ui.form.on('Task', { // Save both: local doc link & GitHub issue number frm.set_value('github_issue_doc', r.message.local_doc); - frm.set_value('github_issue_number', issue.number); - frm.save(); - frappe.msgprint(__('Github Issue Successfully Created')); + frappe.db.set_value(frm.doctype, frm.docname, 'github_issue_number', issue.number) + .then(() => { + frappe.msgprint(__('Github Issue Successfully Created')); + frm.reload_doc(); + }); } } }); @@ -55,9 +57,11 @@ frappe.ui.form.on('Task', { callback: function(r) { if (r.message) { let pr = r.message.pull_request; - frappe.msgprint(__('Pull Request Created Successfully')); - frm.set_value('github_pr_number', pr.number); - frm.save(); + frappe.db.set_value(frm.doctype, frm.docname, 'github_pr_number', pr.number) + .then(() => { + frappe.msgprint(__('Pull Request Created Successfully')); + frm.reload_doc(); + }); } } });