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 IDNameModelTypeStatus
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)HandlerAuthTypeMethodsFlags
/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_ids One2many → jira.account.analytic.line
    comodel_name='jira.account.analytic.line' context={'active_test': False} copy=False inverse_name='odoo_id' string='Worklog Bindings'
  • jira_epic_issue_key Char
    compute='_compute_jira_references' store=True string='Original JIRA Epic Key'
  • jira_epic_issue_url Char
    compute='_compute_jira_references' compute_sudo=True store=True string='Original JIRA Epic Link'
  • jira_issue_key Char
    compute='_compute_jira_references' store=True string='Original JIRA Issue Key'
  • jira_issue_type_id Many2one → jira.issue.type
    comodel_name='jira.issue.type' compute='_compute_jira_references' store=True string='Original JIRA Issue Type'
  • jira_issue_url Char
    compute='_compute_jira_references' compute_sudo=True store=True string='Original JIRA issue Link'
Public methods (3)
  • 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_key Char
    string='Original Epic Key'
  • jira_epic_issue_url Char
    compute='_compute_jira_issue_url' store=True string='Original JIRA Epic Link'
  • jira_issue_id Char
  • jira_issue_key Char
    string='Original Task Key'
  • jira_issue_type_id Many2one → jira.issue.type
    comodel_name='jira.issue.type' string='Original Issue Type'
  • jira_issue_url Char
    compute='_compute_jira_issue_url' store=True string='Original JIRA issue Link'
  • jira_project_bind_id Many2one → jira.project.project
    comodel_name='jira.project.project' ondelete='restrict'
  • odoo_id Many2one → account.analytic.line
    comodel_name='account.analytic.line' index=True ondelete='restrict' required=True string='Timesheet'
Public methods (2)
  • force_reimport(self)
  • import_record(self, backend, issue_id, worklog_id, force=False)
    @api.model
    Import a worklog from JIRA

New fields (2)
  • analytic_binding_ids Many2many → jira.account.analytic.line
    relation='import_wiz_2_analytic_bindings' args: 'jira.account.analytic.line'
  • analytic_line_ids Many2many → account.analytic.line
    relation='import_wiz_2_analytic_lines' args: 'account.analytic.line'
Public methods (1)
  • confirm(self)

New fields (25)
  • app_descriptor_url Char
    compute='_compute_app_descriptor_url' help='URL to use when registering the backend as an app on the marketplace' string='App Descriptor URL'
  • application_key Char
    compute='_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_id Many2one → res.company
    comodel_name='res.company' default=<expr> required=True string='Company'
  • delete_analytic_line_from_date Datetime
    compute='_compute_last_import_date' inverse='_inverse_delete_analytic_line_from_date' string='Delete Extra Worklogs from date'
  • display_url Char
    help='Url used for the Jira app in messages'
  • epic_link_field_name Char
    help="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_epic Boolean
    help='Epics on JIRA cannot be linked to another epic. Check this boxto fill the epic field with itself on Odoo.'
  • epic_name_field_name Char
    help="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_force Boolean
  • import_analytic_line_from_date Datetime
    compute='_compute_last_import_date' inverse='_inverse_import_analytic_line_from_date' string='Import Worklogs from date'
  • import_project_task_force Boolean
  • import_project_task_from_date Datetime
    compute='_compute_last_import_date' inverse='_inverse_import_project_task_from_date' string='Import Project Tasks from date'
  • issue_type_ids One2many → jira.issue.type
    comodel_name='jira.issue.type' inverse_name='backend_id' string='Issue Types'
  • name Char
    help='Display name of the app on the Atlassian Marketplace. Max 60 chars.' size=60
  • private_key Char
    groups='connector.group_connector_manager' help='The shared secret for JWT, provided at app installation'
  • project_template Selection
    default='Scrum software development' required=True selection='_selection_project_template' string='Default Project Template'
  • project_template_shared Char
    string='Default Shared Template Key'
  • public_key Text
    help='The Client Key for JWT, provided at app installation'
  • report_user_sync Html
  • state Selection
    default='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=True selection=[('setup', 'Setup'), ('running', 'Running')]
  • uri Char
    help='the value is provided when the app is installed on Jira Cloud.' string='Jira URI'
  • verify_ssl Boolean
    default=True string='Verify SSL?'
  • worklog_date_timezone Selection
    default=<expr> selection=<expr>
  • worklog_date_timezone_mode Selection
    default='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_id Many2one → project.project
    comodel_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'
Public methods (14)
  • 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_id Many2one → jira.backend
    comodel_name='jira.backend' required=True string='Jira Backend'
  • component_usage Char
    help='Used by the connector to find which component execute the batch import (technical).' required=True
  • from_date_field Char
    required=True
Public methods (0)

No public methods.

New fields (2)
  • backend_id Many2one → jira.backend
    comodel_name='jira.backend' ondelete='restrict' required=True string='Jira Backend'
  • external_id Char
    index='trigram' string='ID on Jira'
Public methods (5)
  • delete_record(self, backend, external_id, only_binding=False, set_inactive=False)
    @api.model
    Delete a record on Odoo
  • export_record(self, fields=None)
  • import_batch(self, backend)
    @api.model
    Prepare import of a batch of record
  • import_record(self, backend, external_id, force=False, record=None)
    @api.model
    Import a record
  • run_batch_timestamp(self, backend, timestamp, force=False)
    @api.model
    Prepare batch of records

New fields (3)
  • backend_id Many2one
    ondelete='cascade'
  • description Char
  • name Char
    required=True
Public methods (2)
  • 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_key Char
    required=True size=10 string='JIRA Key'
  • project_template Selection
    default='Scrum software development' selection='_selection_project_template' string='Default Project Template'
  • project_template_shared Char
    string='Default Shared Template'
  • sync_action Selection
    default='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=True selection=[('link', 'Link with JIRA'), ('export', 'Export to JIRA')]
  • sync_issue_type_ids Many2many → jira.issue.type
    comodel_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'
Public methods (0)

No public methods.

New fields (2)
  • odoo_id Many2one → project.project
    comodel_name='project.project' index=True ondelete='restrict' required=True string='Project'
  • project_type Selection
    selection='_selection_project_type'
Public methods (3)
  • 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_id Many2one → jira.project.task
    comodel_name='jira.project.task' string='Epic'
  • jira_issue_type_id Many2one → jira.issue.type
    comodel_name='jira.issue.type' string='Issue Type'
  • jira_issue_url Char
    compute='_compute_jira_issue_url' string='JIRA issue'
  • jira_key Char
    string='Key'
  • jira_parent_id Many2one → jira.project.task
    comodel_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_id Many2one → jira.project.project
    comodel_name='jira.project.project' ondelete='restrict'
  • odoo_id Many2one → project.task
    comodel_name='project.task' index=True ondelete='restrict' required=True string='Task'
Public methods (0)

No public methods.

New fields (1)
  • odoo_id Many2one → res.users
    comodel_name='res.users' index=True ondelete='restrict' required=True string='User'
Public methods (0)

No public methods.

New fields (4)
  • backend_id Many2one → jira.backend
    comodel_name='jira.backend' default=<expr> ondelete='cascade' required=True string='Jira Backend'
  • jira_key Char
    default=<expr>
  • jira_project_id Many2one → jira.project.project
    comodel_name='jira.project.project' ondelete='cascade'
  • project_id Many2one → project.project
    comodel_name='project.project' default=<expr> name='Project' ondelete='cascade' required=True
Public methods (4)
  • add_all_issue_types(self)
  • state_exit_export_config(self)
  • state_exit_issue_types(self)
  • state_exit_start(self)

New fields (2)
  • jira_bind_ids One2many → jira.project.project
    comodel_name='jira.project.project' context={'active_test': False} copy=False inverse_name='odoo_id' string='Project Bindings'
  • jira_key Char
    compute='_compute_jira_key' store=True string='JIRA Key'
Public methods (1)
  • create_and_link_jira(self)

New fields (6)
  • jira_bind_ids One2many → jira.project.task
    comodel_name='jira.project.task' context={'active_test': False} copy=False inverse_name='odoo_id' string='Task Bindings'
  • jira_compound_key Char
    compute='_compute_jira_compound_key' store=True string='JIRA Key'
  • jira_epic_link_task_id Many2one → project.task
    comodel_name='project.task' compute='_compute_jira_epic_link_task_id' store=True string='JIRA Epic'
  • jira_issue_type Char
    compute='_compute_jira_issue_type' store=True string='JIRA Issue Type'
  • jira_issue_url Char
    compute='_compute_jira_issue_url' string='JIRA issue'
  • jira_parent_task_id Many2one → project.task
    comodel_name='project.task' compute='_compute_jira_parent_task_id' store=True string='JIRA Parent'
Public methods (3)
  • 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) -> dict
    Open a jira url for an issue

New fields (1)
  • jira_bind_ids One2many → jira.res.users
    comodel_name='jira.res.users' context={'active_test': False} copy=False inverse_name='odoo_id' string='User Bindings'
Public methods (2)
  • button_link_with_jira(self)
  • link_with_jira(self, backends=None, raise_if_mismatch=False)

New fields (5)
  • backend_id Many2one → jira.backend
    comodel_name='jira.backend' domain="[('id', 'in', linked_backend_ids)]" ondelete='cascade' required=True string='Jira Backend'
  • jira_key Char
    required=True string='JIRA Key'
  • jira_task_id Many2one → jira.project.task
    comodel_name='jira.project.task' ondelete='cascade'
  • linked_backend_ids Many2many → jira.backend
    comodel_name='jira.backend'
  • task_id Many2one → project.task
    comodel_name='project.task' name='Task' ondelete='cascade' required=True
Public methods (1)
  • state_exit_start(self)

New fields (3)
  • jira_epic_issue_key Char
    readonly=True
  • jira_issue_key Char
    readonly=True
  • jira_issue_type_id Many2one → jira.issue.type
    readonly=True args: 'jira.issue.type'
Public methods (0)

No public methods.

Loading…

Loading…

Loading…

Loading…