Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
40 commits
Select commit Hold shift + click to select a range
6acd4f6
Enhance REST API controller: GET params support and safe serialization
broigm Sep 2, 2025
6dd0156
Merge branch 'CybroOdoo:18.0' into api_rest
broigm Sep 10, 2025
933bd34
API configuration improvements
broigm Sep 10, 2025
ff60d65
Improvements in API key management
broigm Sep 10, 2025
92d2823
Improvements in authentication and structure
broigm Sep 10, 2025
fc5a0ad
restapi changes
Sep 12, 2025
3a8a56a
jwt token
Sep 16, 2025
f486252
Sep 18 : [UPDT] Updated
AjmalCybro Sep 18, 2025
4b46df1
Merge commit 'refs/pull/401/head' of https://github.com/CybroOdoo/Cyb…
Sep 18, 2025
0f11b7f
change username and pass
Sep 19, 2025
53d2f1b
Sep 20: [FIX] Bug Fixed 'payment_status_in_sale'
RisvanaCybrosys Sep 20, 2025
784ceba
Sep 20: [FIX] Bug Fixed 'ecommerce_barcode_search'
RisvanaCybrosys Sep 20, 2025
740f185
Sep 20: [FIX] Bug Fixed 'sale_product_image'
RisvanaCybrosys Sep 20, 2025
abda79f
Sep 20: [FIX] Bug Fixed 'openai_product_images'
RisvanaCybrosys Sep 20, 2025
32ff122
Sep 20: [ADD] Initial Commit 'odoo_icalendar'
RisvanaCybrosys Sep 20, 2025
e3d09ed
Sep 20: [ADD] Initial Commit 'theme_eco_refine'
RisvanaCybrosys Sep 20, 2025
a0341af
Sep 20: [ADD] Initial Commit 'theme_lego'
RisvanaCybrosys Sep 20, 2025
d2af021
Sep 20: [ADD] Initial Commit 'website_multi_product_return_management'
RisvanaCybrosys Sep 20, 2025
84def31
Sep 20: [ADD] Initial Commit 'website_tawk_to'
RisvanaCybrosys Sep 20, 2025
e25e722
Sep 20: [ADD] Initial Commit 'odoo_icecat_connector'
RisvanaCybrosys Sep 20, 2025
5bdaede
Sep 20: [ADD] Initial Commit 'all_in_one_schedule_activity_management'
RisvanaCybrosys Sep 20, 2025
4c4155b
Sep 20: [ADD] Initial Commit 'chat_favourites_in_systray'
RisvanaCybrosys Sep 20, 2025
131667d
Sep 20: [ADD] Initial Commit 'thermal_invoice_report'
RisvanaCybrosys Sep 20, 2025
442b300
Sep 20: [ADD] Initial Commit 'pivot_conditional_formatting'
RisvanaCybrosys Sep 20, 2025
b9e3500
Sep 20: [ADD] Initial Commit 'user_warehouse_restriction'
RisvanaCybrosys Sep 20, 2025
2aae2f1
Sep 20: [ADD] Initial Commit 'work_report_from_timesheet'
RisvanaCybrosys Sep 20, 2025
6308299
Sep 20: [ADD] Initial Commit 'pos_paid_order_delete'
RisvanaCybrosys Sep 20, 2025
7016e07
Sep 20: [ADD] Initial Commit 'all_in_one_multi_followers'
RisvanaCybrosys Sep 20, 2025
5e04341
Sep 20: [ADD] Initial Commit 'odoo_chatter_pin'
RisvanaCybrosys Sep 20, 2025
7b53e2a
Sep 20: [ADD] Initial Commit 'theme_levelup'
RisvanaCybrosys Sep 20, 2025
cc56278
Merge commit 'refs/pull/401/head' of https://github.com/CybroOdoo/Cyb…
Sep 22, 2025
4021d1a
changes on view for fix bug in view connection
Sep 22, 2025
d7518ba
Sep 1 : [UPDT] Updated 'theme_eco_refine'
AjmalCybro Sep 24, 2025
5d9c59b
Sep 24: [FIX] Bug Fixed 'ecommerce_barcode_search'
RisvanaCybrosys Sep 24, 2025
0274a4c
Sep 24: [FIX] Bug Fixed 'invoice_stock_move'
RisvanaCybrosys Sep 24, 2025
d0c5fb0
Sep 24: [FIX] Bug Fixed 'pos_delete_orderline'
RisvanaCybrosys Sep 24, 2025
ee93645
Sep 24: [FIX] Bug Fixed 'ecommerce_barcode_search'
RisvanaCybrosys Sep 24, 2025
d014ee1
Merge commit 'refs/pull/401/head' of https://github.com/CybroOdoo/Cyb…
Sep 26, 2025
184d457
resolv CORS
Sep 29, 2025
4b7fd2e
add tests
Sep 29, 2025
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
The table of contents is too big for display.
Diff view
Diff view
  •  
  •  
  •  
53 changes: 53 additions & 0 deletions all_in_one_multi_followers/README.rst
Original file line number Diff line number Diff line change
@@ -0,0 +1,53 @@
.. image:: https://img.shields.io/badge/license-AGPL--3-blue.svg
:target: https://www.gnu.org/licenses/agpl-3.0-standalone.html
:alt: License: AGPL-3

All in One Multi Followers
==========================
The module is used to add or remove the multi followers in the whole odoo model
by dynamic actions. If you want to set multiple followers in your model,
it is helpful to select multiple followers when clicking the action.
After adding or removing the followers, it will affect the model.
So in this way, you can add or remove multiple followers
from the whole odoo quickly.

Configuration
=============
* No additional configurations needed

Company
-------
* `Cybrosys Techno Solutions <https://cybrosys.com/>`__

License
-------
Affero General Public License v3.0 (AGPL v3)
(https://www.gnu.org/licenses/agpl-3.0-standalone.html)

Credits
-------
* Developer : (V18) Nivedhya T,
(V17) Ajith V ,
(V16) Junaidul Ansar M ,
Contact: odoo@cybrosys.com

Contacts
--------
* Mail Contact : odoo@cybrosys.com
* Website : https://cybrosys.com

Bug Tracker
-----------
Bugs are tracked on GitHub Issues. In case of trouble, please check there if your issue has already been reported.

Maintainer
==========
.. image:: https://cybrosys.com/images/logo.png
:target: https://cybrosys.com

This module is maintained by Cybrosys Technologies.
For support and more information, please visit `Our Website <https://cybrosys.com/>`__

Further information
===================
HTML Description: `<static/description/index.html>`__
23 changes: 23 additions & 0 deletions all_in_one_multi_followers/__init__.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,23 @@
# -*- coding: utf-8 -*-
###############################################################################
#
# Cybrosys Technologies Pvt. Ltd.
#
# Copyright (C) 2025-TODAY Cybrosys Technologies(<https://www.cybrosys.com>)
# Author: Cybrosys Techno Solutions(<https://www.cybrosys.com>)
#
# You can modify it under the terms of the GNU AFFERO
# GENERAL PUBLIC LICENSE (AGPL v3), Version 3.
#
# This program is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
# GNU AFFERO GENERAL PUBLIC LICENSE (AGPL v3) for more details.
#
# You should have received a copy of the GNU AFFERO GENERAL PUBLIC LICENSE
# (AGPL v3) along with this program.
# If not, see <http://www.gnu.org/licenses/>.
#
###############################################################################
from . import models
from . import wizard
51 changes: 51 additions & 0 deletions all_in_one_multi_followers/__manifest__.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,51 @@
# -*- coding: utf-8 -*-
###############################################################################
#
# Cybrosys Technologies Pvt. Ltd.
#
# Copyright (C) 2025-TODAY Cybrosys Technologies(<https://www.cybrosys.com>)
# Author: Cybrosys Techno Solutions(<https://www.cybrosys.com>)
#
# You can modify it under the terms of the GNU AFFERO
# GENERAL PUBLIC LICENSE (AGPL v3), Version 3.
#
# This program is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
# GNU AFFERO GENERAL PUBLIC LICENSE (AGPL v3) for more details.
#
# You should have received a copy of the GNU AFFERO GENERAL PUBLIC LICENSE
# (AGPL v3) along with this program.
# If not, see <http://www.gnu.org/licenses/>.
#
###############################################################################
{
'name': 'All in One Multi Followers',
'version': '18.0.1.0.0',
'category': 'Extra Tools',
'summary': 'The module used to add or remove the multi followers in the '
'whole odoo models by dynamic actions.',
'description': ' The module used to add or remove the multi followers in '
'the whole odoo models by dynamic actions.If you want to set'
' a multi followers in your model this is helpful you to '
'select the multi followers when clicking the action. '
'After adding or removing the followers it will affect'
' the model. So in this way you can add or remove multiple'
' followers in the whole odoo quickly.',
'author': 'Cybrosys Techno Solutions',
'company': 'Cybrosys Techno Solutions',
'maintainer': 'Cybrosys Techno Solutions',
'website': 'https://www.cybrosys.com',
'depends': ['base'],
'data': [
'security/ir.model.access.csv',
'views/multi_follower_views.xml',
'views/res_config_settings_views.xml',
'wizard/follower_adding_removing_views.xml',
],
'images': ['static/description/banner.jpg'],
'license': 'AGPL-3',
'installable': True,
'application': False,
'auto_install': False
}
7 changes: 7 additions & 0 deletions all_in_one_multi_followers/doc/RELEASE_NOTES.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,7 @@
## Module <all_in_one_multi_followers>

#### 23.06.2025
#### Version 18.0.1.0.0
#### ADD

- Initial Commit All in One Multi Followers.
22 changes: 22 additions & 0 deletions all_in_one_multi_followers/models/__init__.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,22 @@
# -*- coding: utf-8 -*-
###############################################################################
#
# Cybrosys Technologies Pvt. Ltd.
#
# Copyright (C) 2025-TODAY Cybrosys Technologies(<https://www.cybrosys.com>)
# Author: Cybrosys Techno Solutions(<https://www.cybrosys.com>)
#
# You can modify it under the terms of the GNU AFFERO
# GENERAL PUBLIC LICENSE (AGPL v3), Version 3.
#
# This program is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
# GNU AFFERO GENERAL PUBLIC LICENSE (AGPL v3) for more details.
#
# You should have received a copy of the GNU AFFERO GENERAL PUBLIC LICENSE
# (AGPL v3) along with this program.
# If not, see <http://www.gnu.org/licenses/>.
#
###############################################################################
from . import multi_follower
205 changes: 205 additions & 0 deletions all_in_one_multi_followers/models/multi_follower.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,205 @@
# -*- coding: utf-8 -*-
###############################################################################
#
# Cybrosys Technologies Pvt. Ltd.
#
# Copyright (C) 2025-TODAY Cybrosys Technologies(<https://www.cybrosys.com>)
# Author: Cybrosys Techno Solutions(<https://www.cybrosys.com>)
#
# You can modify it under the terms of the GNU AFFERO
# GENERAL PUBLIC LICENSE (AGPL v3), Version 3.
#
# This program is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
# GNU AFFERO GENERAL PUBLIC LICENSE (AGPL v3) for more details.
#
# You should have received a copy of the GNU AFFERO GENERAL PUBLIC LICENSE
# (AGPL v3) along with this program.
# If not, see <http://www.gnu.org/licenses/>.
#
###############################################################################
from odoo import api, fields, models


class MultiFollower(models.Model):
"""Creating multi follower creation model"""
_name = 'multi.follower'
_description = 'Multi Follower'
_rec_name = 'action_name'

action_name = fields.Char(string="Action Name",
help='This is the action name. So this name is '
'visible under the the appropriate'
' model action.',
required=True)
applied_to_ids = fields.Many2many('ir.model',
string='Applied To',
help='Select the model in which you '
'want to apply this action.',
required=True)
enabled_value = fields.Boolean(string="Create Action",
help="Enabling and hiding the "
"create action button.",
default=True,
copy=False)
created_action_names = fields.Char(string="Created Action Names",
compute="_compute_created_action_names",
help='If the name is visible to the line'
' its created the action. If its '
'not its deleted the action.')
states = fields.Selection([('draft', 'Draft'),
('running', 'Running'), ('cancel', 'Cancelled')],
string='State', help='State of the action',
default="draft", copy=False)
window_action_ids = fields.Many2many('ir.actions.act_window',
string="Window Actions",
helps="Related Window Actions")

@api.depends('action_name')
def _compute_created_action_names(self):
"""
Computes and updates the `created_action_names` field with the names
of the actions that have been created for the current follower.

This method depends on the `action_name` field and is triggered when
the `action_name` is modified. It retrieves the window actions associated
with the current follower and stores their names as a comma-separated
string in the `created_action_names` field.

Key Steps:
1. For each follower record, it searches for window actions (`ir.actions.act_window`)
that match the action IDs in `follower.window_action_ids`.
2. The names of the found actions are extracted using `mapped('name')`
and joined into a single string, separated by commas.
3. The resulting string is stored in the `created_action_names` field
for display purposes.

Returns:
None
"""
for follower in self:
actions = self.env['ir.actions.act_window'].search(
[('id', 'in', follower.window_action_ids.ids)])
follower.created_action_names = ', '.join(actions.mapped('name'))

def action_create(self):
"""
Creates a new action in the selected model when the 'Add Action' button
is clicked.

This method performs the following tasks:
1. Disables the `enabled_value` field and sets the `states` field to 'running'.
2. Loops through the `applied_to_ids` (the models to which the action will
be applied) and creates a new window action (`ir.actions.act_window`)
for each model.
3. The newly created window action is associated with the
'follower.adding.removing' model and its corresponding form view.
4. The created window action is linked to the current record by adding it
to the `window_action_ids` field.
5. Once the actions are created, it reloads the client interface to reflect
the changes.

Returns:
dict: A dictionary to trigger a client action that reloads the current view
to reflect the newly created actions.

Key Fields:
- `enabled_value`: Set to `False` to indicate the action creation process is
ongoing.
- `states`: Updated to 'running' to show the action is in progress.
- `action_name`: The name used for the new actions.
- `applied_to_ids`: The models to which the new actions are applied.
- `window_action_ids`: Updated to include the newly created window actions.

Returns:
A reload action to refresh the view.
"""
self.enabled_value = False
self.states = 'running'
# Check if action_name has changed and update existing actions
for model_id in self.applied_to_ids:
res = self.env['ir.actions.act_window'].create({
'name': self.action_name,
'res_model': 'follower.adding.removing',
'type': 'ir.actions.act_window',
'view_mode': 'form',
'binding_model_id': model_id.id,
'target': 'new',
'view_id': self.env.ref(
'all_in_one_multi_followers.'
'follower_adding_removing_view_form').id,
'binding_view_types': 'list'
})
self.window_action_ids += res
return {
'type': 'ir.actions.client',
'tag': 'reload',
}

def action_unlink(self):
"""
Removes the contextual actions created for server actions.

This method performs the following tasks:
1. Sets the `states` field to 'cancel', indicating that the action removal
process is in progress or has been completed.
2. Deletes all window actions associated with the current record by unlinking
them through the `window_action_ids` field.
3. Clears the `window_action_ids` field by setting it to `False`.
4. Resets the `enabled_value` field to `True`, enabling the functionality for
future use.
5. Returns an action to reload the client interface to reflect the removal of
the actions.

Returns:
dict: A dictionary to trigger a client action that reloads the current view
to reflect the removal of the actions.

Key Fields:
- `states`: Updated to 'cancel' to indicate that the action removal is
completed or in progress.
- `window_action_ids`: Unlinked (deleted) to remove the associated actions.
- `enabled_value`: Set to `True` to re-enable the functionality for adding
actions in the future.

Returns:
A reload action to refresh the view.
"""
self.states = 'cancel'
self.window_action_ids.unlink()
self.window_action_ids = False
self.enabled_value = True
return {
'type': 'ir.actions.client',
'tag': 'reload',
}

def unlink(self):
"""
Overrides the unlink method to remove associated active actions before
deleting the record.

This method performs the following tasks:
1. Iterates over each record in the current recordset (`self`).
2. For each record, it calls the `action_unlink` method to remove any
active actions associated with that record.
3. After removing the active actions, it proceeds to call the original
`unlink` method from the parent class to delete the record itself.

Key Steps:
- Ensures that all associated active actions are properly cleaned up
before the record is deleted.
- Maintains the integrity of related actions by explicitly handling their
removal.

Returns:
None

Note:
- This method should be used when you want to ensure that any associated
actions are removed before the record is deleted from the database.
"""
for rec in self:
rec.action_unlink()
super().unlink()
3 changes: 3 additions & 0 deletions all_in_one_multi_followers/security/ir.model.access.csv
Original file line number Diff line number Diff line change
@@ -0,0 +1,3 @@
id,name,model_id/id,group_id/id,perm_read,perm_write,perm_create,perm_unlink
access_multi_follower_user,access.multi.follower.user,model_multi_follower,base.group_user,1,1,1,1
access_follower_adding_removing_user,access.follower.adding.removing.user,model_follower_adding_removing,base.group_user,1,1,1,1
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Loading