TIP: You can type at any time to perform a new search.
JIRA Connector
connector_jira · OCA/connector-jira
- Repository
- OCA/connector-jira · module folder · Try on Runboat
- Module version
- 1.0.0
- Category
- Connector
- Folder size
- 0.56 MB
- License
- AGPL-3
- Application
- No
- Auto-installable
- No
- Website
- https://github.com/OCA/connector-jira
- Last tracking update
- 2026-08-07 08:23:14
- Authors
- Camptocamp, Odoo Community Association (OCA)
- Maintainers
- Camptocamp, Odoo Community Association (OCA)
- Committers
- SilvioC2C, Vincent Van Rossem, Weblate, OCA-git-bot, oca-ci
- Odoo dependencies
- Python dependencies
- PyJWT>=1.7.1,<2.9.0, atlassian_jwt>=3.0.0, cryptography>=38,<39, jira==3.10.5, oauthlib>=2.1.0, requests-jwt>=0.6.0, requests-oauthlib>=1.1.0, requests-toolbelt>=0.9.1, requests>=2.21.0, requests, cachetools
- System dependencies
- None
- Required by
- connector_jira_servicedesk
- Description
This module adds Jira synchronization feature. It works with Jira Cloud by behaving as an Atlassian Connect App.
Code Analysis ⓘ
Views touched (26)
| XML ID | Name | Model | Type | Status |
|---|---|---|---|---|
backend_report_user_sync |
JIRA backend report_user_sync | ir.ui.view | qweb | New |
edit_project |
project.project.form | project.project | form | Inherits project.edit_project |
hr_timesheet_line_form |
account.analytic.line.form | account.analytic.line | form | Inherits hr_timesheet.hr_timesheet_line_form |
hr_timesheet_line_search |
account.analytic.line.search | account.analytic.line | search | Inherits hr_timesheet.hr_timesheet_line_search |
hr_timesheet_line_tree |
account.analytic.line.tree | account.analytic.line | tree | Inherits hr_timesheet.hr_timesheet_line_tree |
project_link_jira_form |
project.link.jira.form | project.link.jira | form | Inherits multi_step_wizard.multi_step_wizard_form |
project_project_view_form_simplified |
project.project.view.form.simplified.jira | project.project | form | Inherits project.project_project_view_form_simplified_footer |
task_link_jira_form |
task.link.jira.form | task.link.jira | form | Inherits multi_step_wizard.multi_step_wizard_form |
view_jira_aa_line_import |
Refresh Worklogs from Jira | jira.account.analytic.line.import | form | New |
view_jira_backend_form |
jira.backend.form | jira.backend | form | New |
view_jira_backend_tree |
jira.backend.tree | jira.backend | tree | New |
view_jira_issue_type_form |
jira.issue.type.form | jira.issue.type | form | New |
view_jira_issue_type_tree |
jira.issue.type.tree | jira.issue.type | tree | New |
view_jira_project_project_form |
jira.project.project.form | jira.project.project | form | New |
view_jira_project_project_tree |
jira.project.project.tree | jira.project.project | tree | New |
view_jira_project_task_form |
jira.project.task.form | jira.project.task | form | New |
view_jira_project_task_tree |
jira.project.task.tree | jira.project.task | tree | New |
view_jira_res_users_form |
jira.res.users.form | jira.res.users | form | New |
view_jira_res_users_tree |
jira.res.users.tree | jira.res.users | tree | New |
view_project |
project.project.tree | project.project | tree | Inherits project.view_project |
view_project_kanban_jira |
project.project.kanban.jira | project.project | kanban | Inherits project.view_project_kanban |
view_task_form2 |
project.task.form | project.task | form | Inherits project.view_task_form2 |
view_task_kanban |
project.task.kanban | project.task | kanban | Inherits project.view_task_kanban |
view_task_search_form |
project.task.search.form | project.task | form | Inherits project.view_task_search_form |
view_task_tree2 |
project.task.tree | project.task | tree | Inherits project.view_task_tree2 |
view_users_form |
res.users.form | res.users | form | Inherits base.view_users_form |
HTTP endpoints (7)
| Route(s) | Handler | Auth | Type | Methods | Flags |
|---|---|---|---|---|---|
/jira/<int:backend_id>/app-descriptor.json |
JiraConnectAppController.app_descriptor |
public | http | GET | csrf off |
/jira/<int:backend_id>/disabled |
JiraConnectAppController.disable_app |
public | json | POST | csrf off |
/jira/<int:backend_id>/enabled |
JiraConnectAppController.enable_app |
public | json | POST | csrf off |
/jira/<int:backend_id>/installed |
JiraConnectAppController.install_app |
public | json | POST | csrf off |
/jira/<int:backend_id>/uninstalled |
JiraConnectAppController.uninstall_app |
public | json | POST | csrf off |
/connector_jira/<int:backend_id>/webhooks/issue |
JiraWebhookController.webhook_issue |
none | json | ALL | csrf off |
/connector_jira/<int:backend_id>/webhooks/worklog |
JiraWebhookController.webhook_worklog |
none | json | ALL | csrf off |
Models touched (18)
New fields (6)
-
jira_bind_idsOne2many → jira.account.analytic.linecomodel_name='jira.account.analytic.line'context={'active_test': False}copy=Falseinverse_name='odoo_id'string='Worklog Bindings' -
jira_epic_issue_keyCharcompute='_compute_jira_references'store=Truestring='Original JIRA Epic Key' -
jira_epic_issue_urlCharcompute='_compute_jira_references'compute_sudo=Truestore=Truestring='Original JIRA Epic Link' -
jira_issue_keyCharcompute='_compute_jira_references'store=Truestring='Original JIRA Issue Key' -
jira_issue_type_idMany2one → jira.issue.typecomodel_name='jira.issue.type'compute='_compute_jira_references'store=Truestring='Original JIRA Issue Type' -
jira_issue_urlCharcompute='_compute_jira_references'compute_sudo=Truestore=Truestring='Original JIRA issue Link'
-
action_open_refresh_worklogs_from_jira_wizard(self) -
create(self, vals_list)@api.model_create_multi -
write(self, vals)
New fields (8)
-
jira_epic_issue_keyCharstring='Original Epic Key' -
jira_epic_issue_urlCharcompute='_compute_jira_issue_url'store=Truestring='Original JIRA Epic Link' -
jira_issue_idChar -
jira_issue_keyCharstring='Original Task Key' -
jira_issue_type_idMany2one → jira.issue.typecomodel_name='jira.issue.type'string='Original Issue Type' -
jira_issue_urlCharcompute='_compute_jira_issue_url'store=Truestring='Original JIRA issue Link' -
jira_project_bind_idMany2one → jira.project.projectcomodel_name='jira.project.project'ondelete='restrict' -
odoo_idMany2one → account.analytic.linecomodel_name='account.analytic.line'index=Trueondelete='restrict'required=Truestring='Timesheet'
-
force_reimport(self) -
import_record(self, backend, issue_id, worklog_id, force=False)@api.modelImport a worklog from JIRA
New fields (2)
-
analytic_binding_idsMany2many → jira.account.analytic.linerelation='import_wiz_2_analytic_bindings' args: 'jira.account.analytic.line' -
analytic_line_idsMany2many → account.analytic.linerelation='import_wiz_2_analytic_lines' args: 'account.analytic.line'
-
confirm(self)
New fields (25)
-
app_descriptor_urlCharcompute='_compute_app_descriptor_url'help='URL to use when registering the backend as an app on the marketplace'string='App Descriptor URL' -
application_keyCharcompute='_compute_application_key'help='The name that will be used as application key to register the app on the Atlassian marketplace website.\nIt has to be unique among all apps on the marketplace.'store=True -
company_idMany2one → res.companycomodel_name='res.company'default=<expr>required=Truestring='Company' -
delete_analytic_line_from_dateDatetimecompute='_compute_last_import_date'inverse='_inverse_delete_analytic_line_from_date'string='Delete Extra Worklogs from date' -
display_urlCharhelp='Url used for the Jira app in messages' -
epic_link_field_nameCharhelp="The 'Epic Link' field on JIRA is a custom field. The name of the field is something like 'customfield_10002'. "string='Epic Link Field' -
epic_link_on_epicBooleanhelp='Epics on JIRA cannot be linked to another epic. Check this boxto fill the epic field with itself on Odoo.' -
epic_name_field_nameCharhelp="The 'Epic Name' field on JIRA is a custom field. The name of the field is something like 'customfield_10003'. "string='Epic Name Field' -
import_analytic_line_forceBoolean -
import_analytic_line_from_dateDatetimecompute='_compute_last_import_date'inverse='_inverse_import_analytic_line_from_date'string='Import Worklogs from date' -
import_project_task_forceBoolean -
import_project_task_from_dateDatetimecompute='_compute_last_import_date'inverse='_inverse_import_project_task_from_date'string='Import Project Tasks from date' -
issue_type_idsOne2many → jira.issue.typecomodel_name='jira.issue.type'inverse_name='backend_id'string='Issue Types' -
nameCharhelp='Display name of the app on the Atlassian Marketplace. Max 60 chars.'size=60 -
private_keyChargroups='connector.group_connector_manager'help='The shared secret for JWT, provided at app installation' -
project_templateSelectiondefault='Scrum software development'required=Trueselection='_selection_project_template'string='Default Project Template' -
project_template_sharedCharstring='Default Shared Template Key' -
public_keyTexthelp='The Client Key for JWT, provided at app installation' -
report_user_syncHtml -
stateSelectiondefault='setup'help='State of the Backend.\nSetup: in this state you can register the backend on https://marketplace.atlassian.com/ as an app, using the app descriptor url.\nRunning: when you have installed the backend on a Jira cloud instance (transition is automatic).'required=Trueselection=[('setup', 'Setup'), ('running', 'Running')] -
uriCharhelp='the value is provided when the app is installed on Jira Cloud.'string='Jira URI' -
verify_sslBooleandefault=Truestring='Verify SSL?' -
worklog_date_timezoneSelectiondefault=<expr>selection=<expr> -
worklog_date_timezone_modeSelectiondefault='naive'help="Worklog/Timesheet date timezone modes:\n - As-is (naive): ignore timezone information\n - Jira User: use author's timezone\n - Specific: use pre-configured timezone\n"selection=[('naive', 'As-is (naive)'), ('user', 'Jira User'), ('specific', 'Specific')] -
worklog_fallback_project_idMany2one → project.projectcomodel_name='project.project'help="Worklogs which could not be linked to any project will be created in this project. Worklogs landing in the fallback project can be reassigned to the correct project by: 1. linking the expected project with the Jira one, 2. using 'Refresh Worklogs from Jira' on the timesheet lines."string='Fallback for Worklogs'
-
activate_epic_link(self) -
button_setup(self) -
check_connection(self) -
create(self, vals_list)@api.model_create_multi -
delete_analytic_line(self) -
get_api_client(self) -
get_user_resolution_order(self) -
import_analytic_line(self) -
import_issue_type(self) -
import_project_task(self) -
import_res_users(self) -
make_issue_url(self, jira_issue_id) -
state_running(self) -
state_setup(self)
New fields (3)
-
backend_idMany2one → jira.backendcomodel_name='jira.backend'required=Truestring='Jira Backend' -
component_usageCharhelp='Used by the connector to find which component execute the batch import (technical).'required=True -
from_date_fieldCharrequired=True
No public methods.
New fields (2)
-
backend_idMany2one → jira.backendcomodel_name='jira.backend'ondelete='restrict'required=Truestring='Jira Backend' -
external_idCharindex='trigram'string='ID on Jira'
-
delete_record(self, backend, external_id, only_binding=False, set_inactive=False)@api.modelDelete a record on Odoo -
export_record(self, fields=None) -
import_batch(self, backend)@api.modelPrepare import of a batch of record -
import_record(self, backend, external_id, force=False, record=None)@api.modelImport a record -
run_batch_timestamp(self, backend, timestamp, force=False)@api.modelPrepare batch of records
New fields (3)
-
backend_idMany2oneondelete='cascade' -
descriptionChar -
nameCharrequired=True
-
import_batch(self, backend, from_date=None, to_date=None)Prepare a batch import of issue types from Jira from_date and to_date are ignored for issue types -
is_sync_for_project(self, project_binding)
New fields (5)
-
jira_keyCharrequired=Truesize=10string='JIRA Key' -
project_templateSelectiondefault='Scrum software development'selection='_selection_project_template'string='Default Project Template' -
project_template_sharedCharstring='Default Shared Template' -
sync_actionSelectiondefault='link'help='Defines if the information of the project (name and key) are exported to JIRA when changed. Link meansthe project already exists on JIRA, no sync of the project details once the link is established. Tasks are always imported from JIRA, not pushed.'required=Trueselection=[('link', 'Link with JIRA'), ('export', 'Export to JIRA')] -
sync_issue_type_idsMany2many → jira.issue.typecomodel_name='jira.issue.type'domain="[('backend_id', '=', backend_id)]"help="Only issues of these levels are imported. When a worklog is imported no a level which is not sync'ed, it is attached to the nearest sync'ed parent level. If no parent can be found, it is attached to a special 'Unassigned' task."string='Issue Levels to Synchronize'
No public methods.
New fields (2)
-
odoo_idMany2one → project.projectcomodel_name='project.project'index=Trueondelete='restrict'required=Truestring='Project' -
project_typeSelectionselection='_selection_project_type'
-
create(self, vals_list)@api.model_create_multi -
onchange_project_backend_id(self)@api.onchange('backend_id') -
write(self, values)
New fields (7)
-
jira_epic_link_idMany2one → jira.project.taskcomodel_name='jira.project.task'string='Epic' -
jira_issue_type_idMany2one → jira.issue.typecomodel_name='jira.issue.type'string='Issue Type' -
jira_issue_urlCharcompute='_compute_jira_issue_url'string='JIRA issue' -
jira_keyCharstring='Key' -
jira_parent_idMany2one → jira.project.taskcomodel_name='jira.project.task'help='Parent issue when the issue is a subtask. Empty if the type of parent is filtered out of the synchronizations.'string='Parent Issue' -
jira_project_bind_idMany2one → jira.project.projectcomodel_name='jira.project.project'ondelete='restrict' -
odoo_idMany2one → project.taskcomodel_name='project.task'index=Trueondelete='restrict'required=Truestring='Task'
No public methods.
New fields (1)
-
odoo_idMany2one → res.userscomodel_name='res.users'index=Trueondelete='restrict'required=Truestring='User'
No public methods.
New fields (4)
-
backend_idMany2one → jira.backendcomodel_name='jira.backend'default=<expr>ondelete='cascade'required=Truestring='Jira Backend' -
jira_keyChardefault=<expr> -
jira_project_idMany2one → jira.project.projectcomodel_name='jira.project.project'ondelete='cascade' -
project_idMany2one → project.projectcomodel_name='project.project'default=<expr>name='Project'ondelete='cascade'required=True
-
add_all_issue_types(self) -
state_exit_export_config(self) -
state_exit_issue_types(self) -
state_exit_start(self)
New fields (2)
-
jira_bind_idsOne2many → jira.project.projectcomodel_name='jira.project.project'context={'active_test': False}copy=Falseinverse_name='odoo_id'string='Project Bindings' -
jira_keyCharcompute='_compute_jira_key'store=Truestring='JIRA Key'
-
create_and_link_jira(self)
New fields (6)
-
jira_bind_idsOne2many → jira.project.taskcomodel_name='jira.project.task'context={'active_test': False}copy=Falseinverse_name='odoo_id'string='Task Bindings' -
jira_compound_keyCharcompute='_compute_jira_compound_key'store=Truestring='JIRA Key' -
jira_epic_link_task_idMany2one → project.taskcomodel_name='project.task'compute='_compute_jira_epic_link_task_id'store=Truestring='JIRA Epic' -
jira_issue_typeCharcompute='_compute_jira_issue_type'store=Truestring='JIRA Issue Type' -
jira_issue_urlCharcompute='_compute_jira_issue_url'string='JIRA issue' -
jira_parent_task_idMany2one → project.taskcomodel_name='project.task'compute='_compute_jira_parent_task_id'store=Truestring='JIRA Parent'
-
create(self, vals_list)@api.model_create_multi -
create_and_link_jira(self) -
write(self, vals)
New fields (0)
No new fields.
Public methods (1)-
related_action_jira_link(self) -> dictOpen a jira url for an issue
New fields (1)
-
jira_bind_idsOne2many → jira.res.userscomodel_name='jira.res.users'context={'active_test': False}copy=Falseinverse_name='odoo_id'string='User Bindings'
-
button_link_with_jira(self) -
link_with_jira(self, backends=None, raise_if_mismatch=False)
New fields (5)
-
backend_idMany2one → jira.backendcomodel_name='jira.backend'domain="[('id', 'in', linked_backend_ids)]"ondelete='cascade'required=Truestring='Jira Backend' -
jira_keyCharrequired=Truestring='JIRA Key' -
jira_task_idMany2one → jira.project.taskcomodel_name='jira.project.task'ondelete='cascade' -
linked_backend_idsMany2many → jira.backendcomodel_name='jira.backend' -
task_idMany2one → project.taskcomodel_name='project.task'name='Task'ondelete='cascade'required=True
-
state_exit_start(self)
New fields (3)
-
jira_epic_issue_keyCharreadonly=True -
jira_issue_keyCharreadonly=True -
jira_issue_type_idMany2one → jira.issue.typereadonly=True args: 'jira.issue.type'
No public methods.
Loading…
Loading…
Loading…
Loading…