first push message

This commit is contained in:
2026-07-01 14:41:49 +07:00
parent 6667dec2bf
commit 58b5f46cc4
2951 changed files with 316619 additions and 0 deletions
+5
View File
@@ -0,0 +1,5 @@
# -*- coding: utf-8 -*-
from . import models
from . import controllers
from . import wizard
+66
View File
@@ -0,0 +1,66 @@
# -*- coding: utf-8 -*-
{
'name': 'Odoo Gantt View Base',
'summary': """
Unleash the robust features of the Odoo Gantt View Project with the base model.
Bridge the gap between the smooth planning and Gantt View Project with the Odoo Gantt View Base module.
""",
'description': """
odoo gantt view
base for odoo gantt view
odoo 19 gantt view base
odoo gantt view base in 19
Odoo Gantt Base
""",
'author': 'Ksolves India Ltd.',
'license': 'OPL-1',
'currency': 'EUR',
'price': '183',
'website': 'https://store.ksolves.com',
'maintainer': 'Ksolves India Ltd.',
'category': 'Tools',
# Upgraded from 17.0.1.0.2 to 19.0.1.0.0
'version': '19.0.1.0.0',
'support': 'sales@ksolves.com',
'depends': ['base', 'base_setup'],
'images': ['static/description/icon.png'],
'data': [
'views/ks_res_config_settings_view.xml',
'data/week_days_data.xml',
'security/ir.model.access.csv',
],
'assets': {
'web.assets_backend': [
'ks_gantt_view_base/static/src/scss/ks_mixins.scss',
'ks_gantt_view_base/static/src/scss/ks_control_panel.scss',
'ks_gantt_view_base/static/src/scss/ks_web_gantt.scss',
'ks_gantt_view_base/static/src/scss/ks_control_panel_slider.scss',
'ks_gantt_view_base/static/src/js/ks_gantt_view_new.js',
'ks_gantt_view_base/static/src/js/ks_gantt_controller_new.js',
'ks_gantt_view_base/static/src/js/Gantt_arch_parser.js',
'ks_gantt_view_base/static/src/js/ks_gantt_model_new.js',
'ks_gantt_view_base/static/src/js/ks_gantt_renderer_new.js',
'ks_gantt_view_base/static/src/js/ks_recommend_colorpicker.js',
'ks_gantt_view_base/static/lib/gantt_7.0.11_commercial/codebase/sources/dhtmlxgantt.js',
'ks_gantt_view_base/static/lib/gantt_export.js',
'ks_gantt_view_base/static/lib/gantt_fullscreen.js',
'ks_gantt_view_base/static/lib/chart.min.js',
'ks_gantt_view_base/static/src/xml/**/*',
],
},
}
@@ -0,0 +1,3 @@
# -*- coding: utf-8 -*-
from . import ks_base_export_gantt
@@ -0,0 +1,76 @@
# -*- coding: utf-8 -*-
import json
from odoo import http, _
from odoo.http import request, content_disposition
# Odoo 19: ExcelExport moved — try the 17+ path first, fall back to older path.
try:
from odoo.addons.web.controllers.export import ExcelExport
except ImportError:
try:
from odoo.addons.web.controllers.main import ExcelExport
except ImportError:
ExcelExport = object # graceful degradation; export simply won't work
class KsBaseGanttExportBase(ExcelExport):
@http.route('/web/ksganttbase/export/xlsx', type='http', auth="user")
def ks_gantt_base_export_excel(self, ks_fields, ks_model_name, ks_domain, ks_context):
"""Export Gantt data as an XLSX file."""
file_name = self.ks_get_export_file_name()
ks_domain = self.ks_validate_domain(ks_domain)
ks_fields = json.loads(ks_fields)
ks_context = json.loads(ks_context)
ks_export_data = []
ks_model_data = request.env[ks_model_name].with_context(ks_context).search(ks_domain)
for ks_data in ks_model_data:
ks_row_list = []
for ks_export_field in ks_fields:
if ks_data._fields[ks_export_field].type == 'many2one':
ks_column_data = False
if ks_data[ks_export_field].id:
ks_column_data = (
str(ks_data[ks_export_field].id)
+ ','
+ ks_data[ks_export_field].display_name
)
ks_row_list.append(ks_column_data)
else:
ks_row_list.append(ks_data[ks_export_field])
ks_export_data.append(ks_row_list)
response_data = self.from_data(ks_fields, ks_export_data)
return request.make_response(
response_data,
headers=[
(
'Content-Disposition',
content_disposition(self.filename(file_name.get(ks_model_name))),
),
('Content-Type', self.content_type),
],
)
def ks_get_export_file_name(self):
"""Return a mapping of model name → export file label."""
return {
'hr.leave': _('Time Off'),
'mrp.production': _('Manufacturing Orders'),
'mrp.workorder': _('Work Orders'),
}
def ks_validate_domain(self, ks_domain):
"""Convert JSON domain string to a proper list of tuples."""
if not ks_domain:
return []
ks_domain_list = json.loads(ks_domain)
ks_return_list = []
for ks_list in ks_domain_list:
if isinstance(ks_list, list):
ks_return_list.append(tuple(ks_list))
else:
ks_return_list.append(ks_list)
return ks_return_list
@@ -0,0 +1,39 @@
<?xml version="1.0" encoding="UTF-8" ?>
<odoo>
<data>
<record id="ks_week_day_0" model="ks.week.days">
<field name="ks_day_name">Sunday</field>
<field name="ks_day_no">0</field>
</record>
<record id="ks_week_day_1" model="ks.week.days">
<field name="ks_day_name">Monday</field>
<field name="ks_day_no">1</field>
</record>
<record id="ks_week_day_2" model="ks.week.days">
<field name="ks_day_name">Tuesday</field>
<field name="ks_day_no">2</field>
</record>
<record id="ks_week_day_3" model="ks.week.days">
<field name="ks_day_name">Wednesday</field>
<field name="ks_day_no">3</field>
</record>
<record id="ks_week_day_4" model="ks.week.days">
<field name="ks_day_name">Thursday</field>
<field name="ks_day_no">4</field>
</record>
<record id="ks_week_day_5" model="ks.week.days">
<field name="ks_day_name">Friday</field>
<field name="ks_day_no">5</field>
</record>
<record id="ks_week_day_6" model="ks.week.days">
<field name="ks_day_name">Saturday</field>
<field name="ks_day_no">6</field>
</record>
</data>
</odoo>
+30
View File
@@ -0,0 +1,30 @@
<odoo>
<data>
<!--
<record id="object0" model="ks_gantt_view_base.ks_gantt_view_base">
<field name="name">Object 0</field>
<field name="value">0</field>
</record>
<record id="object1" model="ks_gantt_view_base.ks_gantt_view_base">
<field name="name">Object 1</field>
<field name="value">10</field>
</record>
<record id="object2" model="ks_gantt_view_base.ks_gantt_view_base">
<field name="name">Object 2</field>
<field name="value">20</field>
</record>
<record id="object3" model="ks_gantt_view_base.ks_gantt_view_base">
<field name="name">Object 3</field>
<field name="value">30</field>
</record>
<record id="object4" model="ks_gantt_view_base.ks_gantt_view_base">
<field name="name">Object 4</field>
<field name="value">40</field>
</record>
-->
</data>
</odoo>
+602
View File
@@ -0,0 +1,602 @@
# Translation of Odoo Server.
# This file contains the translation of the following modules:
# * ks_gantt_view_base
#
msgid ""
msgstr ""
"Project-Id-Version: Odoo Server 14.0\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2021-04-23 04:51+0000\n"
"PO-Revision-Date: 2021-04-23 04:51+0000\n"
"Last-Translator: \n"
"Language-Team: \n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: \n"
"Plural-Forms: \n"
#. module: ks_gantt_view_base
#. openerp-web
#: code:addons/ks_gantt_view_base/static/src/xml/ks_gantt_view.xml:0
#, python-format
msgid "15 Min"
msgstr ""
#. module: ks_gantt_view_base
#. openerp-web
#: code:addons/ks_gantt_view_base/static/src/xml/ks_gantt_view.xml:0
#, python-format
msgid "2 Hr"
msgstr ""
#. module: ks_gantt_view_base
#. openerp-web
#: code:addons/ks_gantt_view_base/static/src/xml/ks_gantt_view.xml:0
#, python-format
msgid "30 Min"
msgstr ""
#. module: ks_gantt_view_base
#. openerp-web
#: code:addons/ks_gantt_view_base/static/src/xml/ks_gantt_view.xml:0
#, python-format
msgid "4 Hr"
msgstr ""
#. module: ks_gantt_view_base
#. openerp-web
#: code:addons/ks_gantt_view_base/static/src/xml/ks_gantt_view.xml:0
#, python-format
msgid "8 Hr"
msgstr ""
#. module: ks_gantt_view_base
#: model:ir.model,name:ks_gantt_view_base.model_ir_actions_act_window_view
msgid "Action Window View"
msgstr ""
#. module: ks_gantt_view_base
#. openerp-web
#: code:addons/ks_gantt_view_base/static/src/js/ks_gantt_controller.js:0
#, python-format
msgid "Are you sure to delete this record?"
msgstr ""
#. module: ks_gantt_view_base
#: model:ir.model.fields.selection,name:ks_gantt_view_base.selection__res_config_settings__ks_gantt_theme__dhtmlxgantt_broadway_css
msgid "Broadway"
msgstr ""
#. module: ks_gantt_view_base
#: model:ir.model,name:ks_gantt_view_base.model_res_config_settings
msgid "Config Settings"
msgstr ""
#. module: ks_gantt_view_base
#. openerp-web
#: code:addons/ks_gantt_view_base/static/src/js/ks_gantt_renderer.js:0
#: code:addons/ks_gantt_view_base/static/src/js/ks_gantt_renderer.js:0
#, python-format
msgid "Constraint Date : "
msgstr ""
#. module: ks_gantt_view_base
#. openerp-web
#: code:addons/ks_gantt_view_base/static/src/js/ks_gantt_renderer.js:0
#: code:addons/ks_gantt_view_base/static/src/js/ks_gantt_renderer.js:0
#, python-format
msgid "Constraint Type : "
msgstr ""
#. module: ks_gantt_view_base
#: model:ir.model.fields.selection,name:ks_gantt_view_base.selection__res_config_settings__ks_gantt_theme__dhtmlxgantt_contrast_black_css
msgid "Contrast Black"
msgstr ""
#. module: ks_gantt_view_base
#: model:ir.model.fields.selection,name:ks_gantt_view_base.selection__res_config_settings__ks_gantt_theme__dhtmlxgantt_contrast_white_css
msgid "Contrast White"
msgstr ""
#. module: ks_gantt_view_base
#. openerp-web
#: code:addons/ks_gantt_view_base/static/src/js/ks_gantt_controller.js:0
#: code:addons/ks_gantt_view_base/static/src/xml/ks_gantt_view.xml:0
#, python-format
msgid "Create"
msgstr ""
#. module: ks_gantt_view_base
#: model:ir.model.fields,field_description:ks_gantt_view_base.field_ks_task_link__create_uid
#: model:ir.model.fields,field_description:ks_gantt_view_base.field_ks_week_days__create_uid
msgid "Created by"
msgstr ""
#. module: ks_gantt_view_base
#: model:ir.model.fields,field_description:ks_gantt_view_base.field_ks_task_link__create_date
#: model:ir.model.fields,field_description:ks_gantt_view_base.field_ks_week_days__create_date
msgid "Created on"
msgstr ""
#. module: ks_gantt_view_base
#. openerp-web
#: code:addons/ks_gantt_view_base/static/src/xml/ks_gantt_view.xml:0
#: code:addons/ks_gantt_view_base/static/src/xml/ks_gantt_view.xml:0
#, python-format
msgid "Critical Path"
msgstr ""
#. module: ks_gantt_view_base
#. openerp-web
#: code:addons/ks_gantt_view_base/static/src/xml/ks_gantt_view.xml:0
#: model:ir.model.fields,field_description:ks_gantt_view_base.field_ks_week_days__ks_day_name
#, python-format
msgid "Day"
msgstr ""
#. module: ks_gantt_view_base
#. openerp-web
#: code:addons/ks_gantt_view_base/static/src/xml/ks_gantt_view.xml:0
#: code:addons/ks_gantt_view_base/static/src/xml/ks_gantt_view.xml:0
#, python-format
msgid "Days Off"
msgstr ""
#. module: ks_gantt_view_base
#. openerp-web
#: code:addons/ks_gantt_view_base/static/src/xml/ks_gantt_view.xml:0
#: code:addons/ks_gantt_view_base/static/src/xml/ks_gantt_view.xml:0
#, python-format
msgid "Deadline"
msgstr ""
#. module: ks_gantt_view_base
#. openerp-web
#: code:addons/ks_gantt_view_base/static/src/js/ks_gantt_renderer.js:0
#: code:addons/ks_gantt_view_base/static/src/js/ks_gantt_renderer.js:0
#, python-format
msgid "Deadline : "
msgstr ""
#. module: ks_gantt_view_base
#. openerp-web
#: code:addons/ks_gantt_view_base/static/src/xml/ks_gantt_view.xml:0
#: model:ir.model.fields.selection,name:ks_gantt_view_base.selection__res_config_settings__ks_gantt_theme__dhtmlxgantt_terrace_css
#, python-format
msgid "Default"
msgstr ""
#. module: ks_gantt_view_base
#: model:ir.model.fields,field_description:ks_gantt_view_base.field_ir_actions_act_window_view__display_name
#: model:ir.model.fields,field_description:ks_gantt_view_base.field_ir_ui_view__display_name
#: model:ir.model.fields,field_description:ks_gantt_view_base.field_ks_task_link__display_name
#: model:ir.model.fields,field_description:ks_gantt_view_base.field_ks_week_days__display_name
#: model:ir.model.fields,field_description:ks_gantt_view_base.field_res_config_settings__display_name
msgid "Display Name"
msgstr ""
#. module: ks_gantt_view_base
#. openerp-web
#: code:addons/ks_gantt_view_base/static/src/xml/ks_gantt_view.xml:0
#: code:addons/ks_gantt_view_base/static/src/xml/ks_gantt_view.xml:0
#, python-format
msgid "Duration"
msgstr ""
#. module: ks_gantt_view_base
#. openerp-web
#: code:addons/ks_gantt_view_base/static/src/js/ks_gantt_renderer.js:0
#: code:addons/ks_gantt_view_base/static/src/js/ks_gantt_renderer.js:0
#, python-format
msgid "Duration :"
msgstr ""
#. module: ks_gantt_view_base
#. openerp-web
#: code:addons/ks_gantt_view_base/static/src/xml/ks_gantt_view.xml:0
#, python-format
msgid "Duration Asc"
msgstr ""
#. module: ks_gantt_view_base
#. openerp-web
#: code:addons/ks_gantt_view_base/static/src/xml/ks_gantt_view.xml:0
#, python-format
msgid "Duration Desc"
msgstr ""
#. module: ks_gantt_view_base
#. openerp-web
#: code:addons/ks_gantt_view_base/static/src/js/ks_gantt_controller.js:0
#, python-format
msgid "Edit"
msgstr ""
#. module: ks_gantt_view_base
#: model:ir.model.fields,field_description:ks_gantt_view_base.field_res_config_settings__ks_gantt_rtl
msgid "Enable RTL"
msgstr ""
#. module: ks_gantt_view_base
#. openerp-web
#: code:addons/ks_gantt_view_base/static/src/js/ks_gantt_renderer.js:0
#: code:addons/ks_gantt_view_base/static/src/js/ks_gantt_renderer.js:0
#, python-format
msgid "End Date : "
msgstr ""
#. module: ks_gantt_view_base
#. openerp-web
#: code:addons/ks_gantt_view_base/static/src/xml/ks_gantt_view.xml:0
#, python-format
msgid "Excel"
msgstr ""
#. module: ks_gantt_view_base
#. openerp-web
#: code:addons/ks_gantt_view_base/static/src/xml/ks_gantt_view.xml:0
#, python-format
msgid "Export"
msgstr ""
#. module: ks_gantt_view_base
#: model:ir.model.fields.selection,name:ks_gantt_view_base.selection__ks_task_link__ks_task_link_type__2
msgid "Finish to finish"
msgstr ""
#. module: ks_gantt_view_base
#: model:ir.model.fields.selection,name:ks_gantt_view_base.selection__ks_task_link__ks_task_link_type__0
msgid "Finish to start"
msgstr ""
#. module: ks_gantt_view_base
#. openerp-web
#: code:addons/ks_gantt_view_base/static/src/js/ks_gantt_controller.js:0
#, python-format
msgid "Format not available"
msgstr ""
#. module: ks_gantt_view_base
#: model:ir.model.fields.selection,name:ks_gantt_view_base.selection__ir_actions_act_window_view__view_mode__ks_gantt
#: model:ir.model.fields.selection,name:ks_gantt_view_base.selection__ir_ui_view__type__ks_gantt
msgid "Gantt"
msgstr ""
#. module: ks_gantt_view_base
#. openerp-web
#: code:addons/ks_gantt_view_base/static/src/js/ks_gantt_view.js:0
#: code:addons/ks_gantt_view_base/static/src/js/ks_gantt_view.js:0
#, python-format
msgid "Gantt View"
msgstr ""
#. module: ks_gantt_view_base
#: model:ir.model.fields,field_description:ks_gantt_view_base.field_res_config_settings__ks_gantt_theme
#: model_terms:ir.ui.view,arch_db:ks_gantt_view_base.ks_res_config_settings_view_form
msgid "Gantt View Theme"
msgstr ""
#. module: ks_gantt_view_base
#. openerp-web
#: code:addons/ks_gantt_view_base/static/src/xml/ks_gantt_view.xml:0
#, python-format
msgid "Graph Overlay"
msgstr ""
#. module: ks_gantt_view_base
#. openerp-web
#: code:addons/ks_gantt_view_base/static/src/xml/ks_gantt_view.xml:0
#, python-format
msgid "Graph overlay"
msgstr ""
#. module: ks_gantt_view_base
#. openerp-web
#: code:addons/ks_gantt_view_base/static/src/xml/ks_gantt_view.xml:0
#: code:addons/ks_gantt_view_base/static/src/xml/ks_gantt_view.xml:0
#, python-format
msgid "Grid"
msgstr ""
#. module: ks_gantt_view_base
#: model:ir.model.fields,field_description:ks_gantt_view_base.field_ir_actions_act_window_view__id
#: model:ir.model.fields,field_description:ks_gantt_view_base.field_ir_ui_view__id
#: model:ir.model.fields,field_description:ks_gantt_view_base.field_ks_task_link__id
#: model:ir.model.fields,field_description:ks_gantt_view_base.field_ks_week_days__id
#: model:ir.model.fields,field_description:ks_gantt_view_base.field_res_config_settings__id
msgid "ID"
msgstr ""
#. module: ks_gantt_view_base
#. openerp-web
#: code:addons/ks_gantt_view_base/static/src/xml/ks_gantt_view.xml:0
#, python-format
msgid "JSON"
msgstr ""
#. module: ks_gantt_view_base
#: model:ir.model.fields,field_description:ks_gantt_view_base.field_ks_week_days__ks_day_no
msgid "Ks Day No"
msgstr ""
#. module: ks_gantt_view_base
#: model:ir.model,name:ks_gantt_view_base.model_ks_task_link
msgid "Ks Gantt Task Linking"
msgstr ""
#. module: ks_gantt_view_base
#: model_terms:ir.ui.view,arch_db:ks_gantt_view_base.ks_res_config_settings_view_form
msgid "Ksolves Gantt View Settings"
msgstr ""
#. module: ks_gantt_view_base
#: model:ir.model.fields,field_description:ks_gantt_view_base.field_ir_actions_act_window_view____last_update
#: model:ir.model.fields,field_description:ks_gantt_view_base.field_ir_ui_view____last_update
#: model:ir.model.fields,field_description:ks_gantt_view_base.field_ks_task_link____last_update
#: model:ir.model.fields,field_description:ks_gantt_view_base.field_ks_week_days____last_update
#: model:ir.model.fields,field_description:ks_gantt_view_base.field_res_config_settings____last_update
msgid "Last Modified on"
msgstr ""
#. module: ks_gantt_view_base
#: model:ir.model.fields,field_description:ks_gantt_view_base.field_ks_task_link__write_uid
#: model:ir.model.fields,field_description:ks_gantt_view_base.field_ks_week_days__write_uid
msgid "Last Updated by"
msgstr ""
#. module: ks_gantt_view_base
#: model:ir.model.fields,field_description:ks_gantt_view_base.field_ks_task_link__write_date
#: model:ir.model.fields,field_description:ks_gantt_view_base.field_ks_week_days__write_date
msgid "Last Updated on"
msgstr ""
#. module: ks_gantt_view_base
#. openerp-web
#: code:addons/ks_gantt_view_base/static/src/xml/ks_gantt_view.xml:0
#, python-format
msgid ""
"MS\n"
" Project (XML)"
msgstr ""
#. module: ks_gantt_view_base
#. openerp-web
#: code:addons/ks_gantt_view_base/static/src/xml/ks_gantt_view.xml:0
#, python-format
msgid "Main actions"
msgstr ""
#. module: ks_gantt_view_base
#: model:ir.model.fields.selection,name:ks_gantt_view_base.selection__res_config_settings__ks_gantt_theme__dhtmlxgantt_material_css
msgid "Material"
msgstr ""
#. module: ks_gantt_view_base
#: model:ir.model.fields.selection,name:ks_gantt_view_base.selection__res_config_settings__ks_gantt_theme__dhtmlxgantt_meadow_css
msgid "Meadow"
msgstr ""
#. module: ks_gantt_view_base
#. openerp-web
#: code:addons/ks_gantt_view_base/static/src/xml/ks_gantt_view.xml:0
#, python-format
msgid "Month"
msgstr ""
#. module: ks_gantt_view_base
#. openerp-web
#: code:addons/ks_gantt_view_base/static/src/xml/ks_gantt_view.xml:0
#, python-format
msgid "Name Asc"
msgstr ""
#. module: ks_gantt_view_base
#. openerp-web
#: code:addons/ks_gantt_view_base/static/src/xml/ks_gantt_view.xml:0
#, python-format
msgid "Name Desc"
msgstr ""
#. module: ks_gantt_view_base
#. openerp-web
#: code:addons/ks_gantt_view_base/static/src/xml/ks_gantt_view.xml:0
#, python-format
msgid "New To Old"
msgstr ""
#. module: ks_gantt_view_base
#. openerp-web
#: code:addons/ks_gantt_view_base/static/src/xml/ks_gantt_view.xml:0
#, python-format
msgid "Old To New"
msgstr ""
#. module: ks_gantt_view_base
#. openerp-web
#: code:addons/ks_gantt_view_base/static/src/xml/ks_gantt_view.xml:0
#, python-format
msgid "PDF"
msgstr ""
#. module: ks_gantt_view_base
#. openerp-web
#: code:addons/ks_gantt_view_base/static/src/xml/ks_gantt_view.xml:0
#, python-format
msgid "PNG"
msgstr ""
#. module: ks_gantt_view_base
#. openerp-web
#: code:addons/ks_gantt_view_base/static/src/xml/ks_gantt_view.xml:0
#, python-format
msgid "PrimaveraP6"
msgstr ""
#. module: ks_gantt_view_base
#. openerp-web
#: code:addons/ks_gantt_view_base/static/src/js/ks_gantt_renderer.js:0
#: code:addons/ks_gantt_view_base/static/src/js/ks_gantt_renderer.js:0
#, python-format
msgid "Progress : "
msgstr ""
#. module: ks_gantt_view_base
#. openerp-web
#: code:addons/ks_gantt_view_base/static/src/xml/ks_gantt_view.xml:0
#, python-format
msgid "Quarter"
msgstr ""
#. module: ks_gantt_view_base
#. openerp-web
#: code:addons/ks_gantt_view_base/static/src/xml/ks_recommend_color_picker.xml:0
#, python-format
msgid "Recommended Colors"
msgstr ""
#. module: ks_gantt_view_base
#. openerp-web
#: code:addons/ks_gantt_view_base/static/src/xml/ks_gantt_view.xml:0
#: code:addons/ks_gantt_view_base/static/src/xml/ks_gantt_view.xml:0
#, python-format
msgid "Resource Panel"
msgstr ""
#. module: ks_gantt_view_base
#: model:ir.model.fields.selection,name:ks_gantt_view_base.selection__res_config_settings__ks_gantt_theme__dhtmlxgantt_skyblue_css
msgid "Sky Blue"
msgstr ""
#. module: ks_gantt_view_base
#. openerp-web
#: code:addons/ks_gantt_view_base/static/src/xml/ks_gantt_view.xml:0
#, python-format
msgid "Sort:"
msgstr ""
#. module: ks_gantt_view_base
#. openerp-web
#: code:addons/ks_gantt_view_base/static/src/js/ks_gantt_renderer.js:0
#: code:addons/ks_gantt_view_base/static/src/js/ks_gantt_renderer.js:0
#, python-format
msgid "Stage : "
msgstr ""
#. module: ks_gantt_view_base
#. openerp-web
#: code:addons/ks_gantt_view_base/static/src/js/ks_gantt_renderer.js:0
#: code:addons/ks_gantt_view_base/static/src/js/ks_gantt_renderer.js:0
#, python-format
msgid "Start Date : "
msgstr ""
#. module: ks_gantt_view_base
#: model:ir.model.fields.selection,name:ks_gantt_view_base.selection__ks_task_link__ks_task_link_type__3
msgid "Start to finish"
msgstr ""
#. module: ks_gantt_view_base
#: model:ir.model.fields.selection,name:ks_gantt_view_base.selection__ks_task_link__ks_task_link_type__1
msgid "Start to start"
msgstr ""
#. module: ks_gantt_view_base
#. openerp-web
#: code:addons/ks_gantt_view_base/static/src/js/ks_gantt_renderer.js:0
#: code:addons/ks_gantt_view_base/static/src/js/ks_gantt_renderer.js:0
#, python-format
msgid "Task : "
msgstr ""
#. module: ks_gantt_view_base
#: model:ir.model.fields,field_description:ks_gantt_view_base.field_ks_task_link__ks_task_link_type
msgid "Task Link Type"
msgstr ""
#. module: ks_gantt_view_base
#. openerp-web
#: code:addons/ks_gantt_view_base/static/src/xml/ks_gantt_view.xml:0
#, python-format
msgid "Today"
msgstr ""
#. module: ks_gantt_view_base
#: model:ir.model,name:ks_gantt_view_base.model_ir_ui_view
msgid "View"
msgstr ""
#. module: ks_gantt_view_base
#: model:ir.model.fields,field_description:ks_gantt_view_base.field_ir_actions_act_window_view__view_mode
#: model:ir.model.fields,field_description:ks_gantt_view_base.field_ir_ui_view__type
msgid "View Type"
msgstr ""
#. module: ks_gantt_view_base
#. openerp-web
#: code:addons/ks_gantt_view_base/static/src/js/ks_gantt_renderer.js:0
#, python-format
msgid ""
"We are not able to show graph for large duration, please change the view "
"scale"
msgstr ""
#. module: ks_gantt_view_base
#. openerp-web
#: code:addons/ks_gantt_view_base/static/src/xml/ks_gantt_view.xml:0
#, python-format
msgid "Week"
msgstr ""
#. module: ks_gantt_view_base
#: model:ir.model,name:ks_gantt_view_base.model_ks_week_days
msgid "Week Days"
msgstr ""
#. module: ks_gantt_view_base
#. openerp-web
#: code:addons/ks_gantt_view_base/static/src/xml/ks_gantt_view.xml:0
#, python-format
msgid "Year"
msgstr ""
#. module: ks_gantt_view_base
#. openerp-web
#: code:addons/ks_gantt_view_base/static/src/js/ks_gantt_controller.js:0
#, python-format
msgid "You can't create link task with group"
msgstr ""
#. module: ks_gantt_view_base
#. openerp-web
#: code:addons/ks_gantt_view_base/static/src/js/ks_gantt_controller.js:0
#, python-format
msgid "You can't create link with other project"
msgstr ""
#. module: ks_gantt_view_base
#. openerp-web
#: code:addons/ks_gantt_view_base/static/src/js/ks_gantt_controller.js:0
#, python-format
msgid "You can't create link with project and group"
msgstr ""
#. module: ks_gantt_view_base
#. openerp-web
#: code:addons/ks_gantt_view_base/static/src/xml/ks_gantt_view.xml:0
#, python-format
msgid "Zoom To Fit"
msgstr ""
#. module: ks_gantt_view_base
#. openerp-web
#: code:addons/ks_gantt_view_base/static/src/xml/ks_gantt_view.xml:0
#, python-format
msgid "Zoom to fit"
msgstr ""
#. module: ks_gantt_view_base
#. openerp-web
#: code:addons/ks_gantt_view_base/static/src/xml/ks_gantt_view.xml:0
#, python-format
msgid "iCal"
msgstr ""
+7
View File
@@ -0,0 +1,7 @@
# -*- coding: utf-8 -*-
from . import ks_ir_ui_view_inherit
from . import ks_ir_actions_act_window_view_inherit
from . import ks_task_link
from . import ks_week_days
from . import ks_res_config_settings
@@ -0,0 +1,7 @@
from odoo import fields, models
class KsActWindowView(models.Model):
_inherit = 'ir.actions.act_window.view'
view_mode = fields.Selection(selection_add=[('ks_gantt', "Gantt")], ondelete={'ks_gantt': 'cascade'})
@@ -0,0 +1,91 @@
# -*- coding: utf-8 -*-
from odoo import fields, models, api
# Inheriting view and adding Gantt view to View.
class KsGanttView(models.Model):
_inherit = "ir.ui.view"
type = fields.Selection(
selection_add=[('ks_gantt', "Gantt")],
ondelete={'ks_gantt': 'cascade'},
)
def _postprocess_access_rights(self, tree):
"""
Override to handle access rights for the custom ks_gantt view type.
Odoo 19 Note: _postprocess_access_rights signature is unchanged from 17→19.
The only functional change is that the 'ks_gantt' tag check uses the same
pattern as Odoo core kanban/list views — we inherit the base implementation
for all standard tags and only add our own handling for <ks_gantt> nodes.
"""
# Guard: skip extra processing when called in form view context
if self._context.get('view_type', False) == 'form':
return super()._postprocess_access_rights(tree)
# Strip nodes the user cannot access based on @groups attribute
for node in tree.xpath('//*[@groups]'):
if not self.user_has_groups(node.attrib.pop('groups')):
node.getparent().remove(node)
elif node.tag == 't' and not node.attrib:
for child in reversed(node):
node.addnext(child)
node.getparent().remove(node)
# Apply model-level create/write/delete access flags to view nodes
base_model = tree.get('model_access_rights')
for node in tree.xpath('//*[@model_access_rights]'):
model = self.env[node.attrib.pop('model_access_rights')]
if node.tag == 'field':
can_create = model.check_access_rights('create', raise_exception=False)
can_write = model.check_access_rights('write', raise_exception=False)
node.set('can_create', 'true' if can_create else 'false')
node.set('can_write', 'true' if can_write else 'false')
else:
is_base_model = base_model == model._name
for action, operation in (
('create', 'create'),
('delete', 'unlink'),
('edit', 'write'),
):
if (
not node.get(action)
and not model.check_access_rights(operation, raise_exception=False)
or not self._context.get(action, True)
and is_base_model
):
node.set(action, 'false')
# Extra group_by model access check specific to ks_gantt nodes
if node.tag == 'ks_gantt':
group_by_name = node.get('default_group_by')
group_by_field = model._fields.get(group_by_name)
if group_by_field and group_by_field.type == 'many2one':
group_by_model = model.env[group_by_field.comodel_name]
for action, operation in (
('group_create', 'create'),
('group_delete', 'unlink'),
('group_edit', 'write'),
):
if (
not node.get(action)
and not group_by_model.check_access_rights(
operation, raise_exception=False
)
or not self._context.get(action, True)
and is_base_model
):
node.set(action, 'false')
return super()._postprocess_access_rights(tree)
class KsBase(models.AbstractModel):
_inherit = "base"
@api.model
def get_view(self, view_id=None, view_type='form', **options):
"""Pass view_type into context so _postprocess_access_rights can inspect it."""
self = self.with_context(view_type=view_type)
return super().get_view(view_id=view_id, view_type=view_type, **options)
@@ -0,0 +1,48 @@
# -*- coding: utf-8 -*-
from odoo import api, fields, models
class KsResConfigSettings(models.TransientModel):
_inherit = 'res.config.settings'
ks_gantt_theme = fields.Selection(
selection=[
('dhtmlxgantt_terrace.css', 'Default'),
('dhtmlxgantt_skyblue.css', 'Sky Blue'),
('dhtmlxgantt_meadow.css', 'Meadow'),
('dhtmlxgantt_broadway.css', 'Broadway'),
('dhtmlxgantt_material.css', 'Material'),
('dhtmlxgantt_contrast_white.css', 'Contrast White'),
('dhtmlxgantt_contrast_black.css', 'Contrast Black'),
],
default='dhtmlxgantt_terrace.css',
string='Gantt View Theme',
required=True,
config_parameter='ks_gantt_view_base.selected_theme',
)
ks_gantt_rtl = fields.Boolean(
string='Enable RTL',
config_parameter='ks_gantt_view_base.ks_gantt_rtl',
default=False,
)
@api.model
def ks_gantt_view_theme(self):
"""
Return current Gantt theme and RTL settings as a dict.
Odoo 19: Use sudo().get_param() directly — searching ir.config_parameter
manually is still supported but get_param() is the recommended API.
"""
ICP = self.env['ir.config_parameter'].sudo()
return {
'ks_gantt_view_theme': ICP.get_param(
'ks_gantt_view_base.selected_theme',
default='dhtmlxgantt_terrace.css',
),
'ks_gantt_rtl': ICP.get_param(
'ks_gantt_view_base.ks_gantt_rtl',
default='False',
),
}
+33
View File
@@ -0,0 +1,33 @@
from odoo import fields, models
class KsTaskLink(models.Model):
_name = 'ks.task.link'
_description = 'Ks Gantt Task Linking'
ks_task_link_type = fields.Selection(
string='Task Link Type',
selection=[('0', 'Finish to start'),
('1', 'Start to start'),
('2', 'Finish to finish'),
('3', 'Start to finish'),
],
required=True, )
def unlink(self):
"""
Override unlink function to avoid error 'could not serialize access due to concurrent update',
this error occur when user tries to delete the record that is already deleted or not exist,
problem with this - when this issue occurs then CRUD operations are also stopped working.
"""
# Check if request id is already deleted or doesn't exist.
for rec in self:
try:
if not len(self.env['ks.task.link'].search([('id', '=', rec.id)])):
return True
except Exception as e:
# If id is out of range.
return True
return super(KsTaskLink, self).unlink()
+10
View File
@@ -0,0 +1,10 @@
from odoo import fields, models
class KsWeekDays(models.Model):
_name = 'ks.week.days'
_description = 'Week Days'
_rec_name = 'ks_day_name'
ks_day_no = fields.Integer()
ks_day_name = fields.Char(string='Day')
+3
View File
@@ -0,0 +1,3 @@
# Odoo 19 compatible versions
pandas>=2.2.0
openpyxl>=3.1.2
@@ -0,0 +1,4 @@
id,name,model_id:id,group_id:id,perm_read,perm_write,perm_create,perm_unlink
access_ks_task_link,ks.task.link,ks_gantt_view_base.model_ks_task_link,base.group_user,1,1,1,1
access_ks_week_days,ks.week.days,ks_gantt_view_base.model_ks_week_days,base.group_user,1,1,1,1
access_ks_gantt_base_import_wizard,ks.gantt.base.import.wizard,ks_gantt_view_base.model_ks_gantt_base_import_wizard,base.group_user,1,1,1,1
1 id name model_id:id group_id:id perm_read perm_write perm_create perm_unlink
2 access_ks_task_link ks.task.link ks_gantt_view_base.model_ks_task_link base.group_user 1 1 1 1
3 access_ks_week_days ks.week.days ks_gantt_view_base.model_ks_week_days base.group_user 1 1 1 1
4 access_ks_gantt_base_import_wizard ks.gantt.base.import.wizard ks_gantt_view_base.model_ks_gantt_base_import_wizard base.group_user 1 1 1 1
Binary file not shown.

After

Width:  |  Height:  |  Size: 580 KiB

File diff suppressed because one or more lines are too long
Binary file not shown.

After

Width:  |  Height:  |  Size: 24 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.9 MiB

@@ -0,0 +1,3 @@
<svg width="14" height="8" viewBox="0 0 14 8" fill="none" xmlns="http://www.w3.org/2000/svg">
<path d="M1 1L7 7L13 1" stroke="#4B4B4B" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"/>
</svg>

After

Width:  |  Height:  |  Size: 208 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 807 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 8.5 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 5.2 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 3.7 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 6.2 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 3.4 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 7.5 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 4.3 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 4.8 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 7.1 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 8.3 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 9.5 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 6.7 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 8.6 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 6.6 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 5.2 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 5.2 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 3.5 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 3.8 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 4.1 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 4.6 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 5.0 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 3.8 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 3.6 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 5.0 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 528 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 79 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 8.0 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 5.3 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 4.3 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 640 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 805 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 177 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 787 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 210 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 220 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 215 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 234 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 220 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.8 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 20 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 552 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 172 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 5.5 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 8.7 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 8.1 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 6.9 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 7.2 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 4.9 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 20 MiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 6.1 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 13 MiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 13 MiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 20 MiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 5.2 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 79 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 4.7 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 8.3 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.4 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 5.2 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.4 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.8 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.3 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.7 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.6 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.0 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.2 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.5 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.4 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.7 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.8 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.9 KiB

Some files were not shown because too many files have changed in this diff Show More