diff --git a/all_in_one_multi_followers/README.rst b/all_in_one_multi_followers/README.rst new file mode 100644 index 0000000000..4b8fc041ed --- /dev/null +++ b/all_in_one_multi_followers/README.rst @@ -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 `__ + +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 `__ + +Further information +=================== +HTML Description: ``__ diff --git a/all_in_one_multi_followers/__init__.py b/all_in_one_multi_followers/__init__.py new file mode 100644 index 0000000000..7cd9406dfc --- /dev/null +++ b/all_in_one_multi_followers/__init__.py @@ -0,0 +1,23 @@ +# -*- coding: utf-8 -*- +############################################################################### +# +# Cybrosys Technologies Pvt. Ltd. +# +# Copyright (C) 2025-TODAY Cybrosys Technologies() +# Author: Cybrosys Techno Solutions() +# +# 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 . +# +############################################################################### +from . import models +from . import wizard diff --git a/all_in_one_multi_followers/__manifest__.py b/all_in_one_multi_followers/__manifest__.py new file mode 100644 index 0000000000..2cc7d1804e --- /dev/null +++ b/all_in_one_multi_followers/__manifest__.py @@ -0,0 +1,51 @@ +# -*- coding: utf-8 -*- +############################################################################### +# +# Cybrosys Technologies Pvt. Ltd. +# +# Copyright (C) 2025-TODAY Cybrosys Technologies() +# Author: Cybrosys Techno Solutions() +# +# 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 . +# +############################################################################### +{ + '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 +} diff --git a/all_in_one_multi_followers/doc/RELEASE_NOTES.md b/all_in_one_multi_followers/doc/RELEASE_NOTES.md new file mode 100644 index 0000000000..4ef6566815 --- /dev/null +++ b/all_in_one_multi_followers/doc/RELEASE_NOTES.md @@ -0,0 +1,7 @@ +## Module + +#### 23.06.2025 +#### Version 18.0.1.0.0 +#### ADD + +- Initial Commit All in One Multi Followers. diff --git a/all_in_one_multi_followers/models/__init__.py b/all_in_one_multi_followers/models/__init__.py new file mode 100644 index 0000000000..6d010e040e --- /dev/null +++ b/all_in_one_multi_followers/models/__init__.py @@ -0,0 +1,22 @@ +# -*- coding: utf-8 -*- +############################################################################### +# +# Cybrosys Technologies Pvt. Ltd. +# +# Copyright (C) 2025-TODAY Cybrosys Technologies() +# Author: Cybrosys Techno Solutions() +# +# 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 . +# +############################################################################### +from . import multi_follower diff --git a/all_in_one_multi_followers/models/multi_follower.py b/all_in_one_multi_followers/models/multi_follower.py new file mode 100644 index 0000000000..cf0eccb585 --- /dev/null +++ b/all_in_one_multi_followers/models/multi_follower.py @@ -0,0 +1,205 @@ +# -*- coding: utf-8 -*- +############################################################################### +# +# Cybrosys Technologies Pvt. Ltd. +# +# Copyright (C) 2025-TODAY Cybrosys Technologies() +# Author: Cybrosys Techno Solutions() +# +# 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 . +# +############################################################################### +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() diff --git a/all_in_one_multi_followers/security/ir.model.access.csv b/all_in_one_multi_followers/security/ir.model.access.csv new file mode 100644 index 0000000000..c9a535714d --- /dev/null +++ b/all_in_one_multi_followers/security/ir.model.access.csv @@ -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 diff --git a/all_in_one_multi_followers/static/description/assets/icons/arrows-repeat.svg b/all_in_one_multi_followers/static/description/assets/icons/arrows-repeat.svg new file mode 100644 index 0000000000..1d7efabc52 --- /dev/null +++ b/all_in_one_multi_followers/static/description/assets/icons/arrows-repeat.svg @@ -0,0 +1,10 @@ + + + + + + + + + + diff --git a/all_in_one_multi_followers/static/description/assets/icons/banner-1.png b/all_in_one_multi_followers/static/description/assets/icons/banner-1.png new file mode 100644 index 0000000000..c180db1729 Binary files /dev/null and b/all_in_one_multi_followers/static/description/assets/icons/banner-1.png differ diff --git a/all_in_one_multi_followers/static/description/assets/icons/banner-2.svg b/all_in_one_multi_followers/static/description/assets/icons/banner-2.svg new file mode 100644 index 0000000000..e606d97d98 --- /dev/null +++ b/all_in_one_multi_followers/static/description/assets/icons/banner-2.svg @@ -0,0 +1,73 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/all_in_one_multi_followers/static/description/assets/icons/banner-bg.png b/all_in_one_multi_followers/static/description/assets/icons/banner-bg.png new file mode 100644 index 0000000000..a8238d3c09 Binary files /dev/null and b/all_in_one_multi_followers/static/description/assets/icons/banner-bg.png differ diff --git a/all_in_one_multi_followers/static/description/assets/icons/banner-bg.svg b/all_in_one_multi_followers/static/description/assets/icons/banner-bg.svg new file mode 100644 index 0000000000..b1378103e2 --- /dev/null +++ b/all_in_one_multi_followers/static/description/assets/icons/banner-bg.svg @@ -0,0 +1,9 @@ + + + + + + + + + diff --git a/all_in_one_multi_followers/static/description/assets/icons/banner-call.svg b/all_in_one_multi_followers/static/description/assets/icons/banner-call.svg new file mode 100644 index 0000000000..96c687e81f --- /dev/null +++ b/all_in_one_multi_followers/static/description/assets/icons/banner-call.svg @@ -0,0 +1,5 @@ + + + + + diff --git a/all_in_one_multi_followers/static/description/assets/icons/banner-mail.svg b/all_in_one_multi_followers/static/description/assets/icons/banner-mail.svg new file mode 100644 index 0000000000..cbf0d158d2 --- /dev/null +++ b/all_in_one_multi_followers/static/description/assets/icons/banner-mail.svg @@ -0,0 +1,5 @@ + + + + + diff --git a/all_in_one_multi_followers/static/description/assets/icons/banner-pattern.svg b/all_in_one_multi_followers/static/description/assets/icons/banner-pattern.svg new file mode 100644 index 0000000000..9c1c7e101c --- /dev/null +++ b/all_in_one_multi_followers/static/description/assets/icons/banner-pattern.svg @@ -0,0 +1,343 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/all_in_one_multi_followers/static/description/assets/icons/banner-promo.svg b/all_in_one_multi_followers/static/description/assets/icons/banner-promo.svg new file mode 100644 index 0000000000..d52791b11e --- /dev/null +++ b/all_in_one_multi_followers/static/description/assets/icons/banner-promo.svg @@ -0,0 +1,147 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/all_in_one_multi_followers/static/description/assets/icons/brand-pair.svg b/all_in_one_multi_followers/static/description/assets/icons/brand-pair.svg new file mode 100644 index 0000000000..d8db7fc1e7 --- /dev/null +++ b/all_in_one_multi_followers/static/description/assets/icons/brand-pair.svg @@ -0,0 +1,41 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/all_in_one_multi_followers/static/description/assets/icons/check.png b/all_in_one_multi_followers/static/description/assets/icons/check.png new file mode 100644 index 0000000000..c8e85f51d6 Binary files /dev/null and b/all_in_one_multi_followers/static/description/assets/icons/check.png differ diff --git a/all_in_one_multi_followers/static/description/assets/icons/chevron.png b/all_in_one_multi_followers/static/description/assets/icons/chevron.png new file mode 100644 index 0000000000..2089293d6a Binary files /dev/null and b/all_in_one_multi_followers/static/description/assets/icons/chevron.png differ diff --git a/all_in_one_multi_followers/static/description/assets/icons/close-icon.svg b/all_in_one_multi_followers/static/description/assets/icons/close-icon.svg new file mode 100644 index 0000000000..df8cce37a5 --- /dev/null +++ b/all_in_one_multi_followers/static/description/assets/icons/close-icon.svg @@ -0,0 +1,5 @@ + + + + + diff --git a/all_in_one_multi_followers/static/description/assets/icons/cogs.png b/all_in_one_multi_followers/static/description/assets/icons/cogs.png new file mode 100644 index 0000000000..95d0bad62c Binary files /dev/null and b/all_in_one_multi_followers/static/description/assets/icons/cogs.png differ diff --git a/all_in_one_multi_followers/static/description/assets/icons/collabarate-icon.svg b/all_in_one_multi_followers/static/description/assets/icons/collabarate-icon.svg new file mode 100644 index 0000000000..dd4e105183 --- /dev/null +++ b/all_in_one_multi_followers/static/description/assets/icons/collabarate-icon.svg @@ -0,0 +1,3 @@ + + + diff --git a/all_in_one_multi_followers/static/description/assets/icons/consultation.png b/all_in_one_multi_followers/static/description/assets/icons/consultation.png new file mode 100644 index 0000000000..8319d4baa0 Binary files /dev/null and b/all_in_one_multi_followers/static/description/assets/icons/consultation.png differ diff --git a/all_in_one_multi_followers/static/description/assets/icons/cybro-logo.png b/all_in_one_multi_followers/static/description/assets/icons/cybro-logo.png new file mode 100644 index 0000000000..ff4b782205 Binary files /dev/null and b/all_in_one_multi_followers/static/description/assets/icons/cybro-logo.png differ diff --git a/all_in_one_multi_followers/static/description/assets/icons/down.svg b/all_in_one_multi_followers/static/description/assets/icons/down.svg new file mode 100644 index 0000000000..f21c36271b --- /dev/null +++ b/all_in_one_multi_followers/static/description/assets/icons/down.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/all_in_one_multi_followers/static/description/assets/icons/ecom-black.png b/all_in_one_multi_followers/static/description/assets/icons/ecom-black.png new file mode 100644 index 0000000000..a9385ff13f Binary files /dev/null and b/all_in_one_multi_followers/static/description/assets/icons/ecom-black.png differ diff --git a/all_in_one_multi_followers/static/description/assets/icons/education-black.png b/all_in_one_multi_followers/static/description/assets/icons/education-black.png new file mode 100644 index 0000000000..3eb09b27b4 Binary files /dev/null and b/all_in_one_multi_followers/static/description/assets/icons/education-black.png differ diff --git a/all_in_one_multi_followers/static/description/assets/icons/faq.png b/all_in_one_multi_followers/static/description/assets/icons/faq.png new file mode 100644 index 0000000000..4250b5b817 Binary files /dev/null and b/all_in_one_multi_followers/static/description/assets/icons/faq.png differ diff --git a/all_in_one_multi_followers/static/description/assets/icons/feature-icon.svg b/all_in_one_multi_followers/static/description/assets/icons/feature-icon.svg new file mode 100644 index 0000000000..fa0ea6850a --- /dev/null +++ b/all_in_one_multi_followers/static/description/assets/icons/feature-icon.svg @@ -0,0 +1,10 @@ + + + + + + + + + + diff --git a/all_in_one_multi_followers/static/description/assets/icons/feature.png b/all_in_one_multi_followers/static/description/assets/icons/feature.png new file mode 100644 index 0000000000..ac7a785c09 Binary files /dev/null and b/all_in_one_multi_followers/static/description/assets/icons/feature.png differ diff --git a/all_in_one_multi_followers/static/description/assets/icons/gear.svg b/all_in_one_multi_followers/static/description/assets/icons/gear.svg new file mode 100644 index 0000000000..0cc66b6ea7 --- /dev/null +++ b/all_in_one_multi_followers/static/description/assets/icons/gear.svg @@ -0,0 +1,10 @@ + + + + + + + + + + diff --git a/all_in_one_multi_followers/static/description/assets/icons/hire-odoo.svg b/all_in_one_multi_followers/static/description/assets/icons/hire-odoo.svg new file mode 100644 index 0000000000..e1ac089b04 --- /dev/null +++ b/all_in_one_multi_followers/static/description/assets/icons/hire-odoo.svg @@ -0,0 +1,12 @@ + + + + + + + + + + + + diff --git a/all_in_one_multi_followers/static/description/assets/icons/hotel-black.png b/all_in_one_multi_followers/static/description/assets/icons/hotel-black.png new file mode 100644 index 0000000000..130f613be0 Binary files /dev/null and b/all_in_one_multi_followers/static/description/assets/icons/hotel-black.png differ diff --git a/all_in_one_multi_followers/static/description/assets/icons/license.png b/all_in_one_multi_followers/static/description/assets/icons/license.png new file mode 100644 index 0000000000..a5869797ec Binary files /dev/null and b/all_in_one_multi_followers/static/description/assets/icons/license.png differ diff --git a/all_in_one_multi_followers/static/description/assets/icons/life-ring-icon.svg b/all_in_one_multi_followers/static/description/assets/icons/life-ring-icon.svg new file mode 100644 index 0000000000..3ae6e1d896 --- /dev/null +++ b/all_in_one_multi_followers/static/description/assets/icons/life-ring-icon.svg @@ -0,0 +1,13 @@ + + + + + + + + + + + + + diff --git a/all_in_one_multi_followers/static/description/assets/icons/lifebuoy.png b/all_in_one_multi_followers/static/description/assets/icons/lifebuoy.png new file mode 100644 index 0000000000..658d56cccf Binary files /dev/null and b/all_in_one_multi_followers/static/description/assets/icons/lifebuoy.png differ diff --git a/all_in_one_multi_followers/static/description/assets/icons/mail.svg b/all_in_one_multi_followers/static/description/assets/icons/mail.svg new file mode 100644 index 0000000000..1eedde695b --- /dev/null +++ b/all_in_one_multi_followers/static/description/assets/icons/mail.svg @@ -0,0 +1,3 @@ + + + diff --git a/all_in_one_multi_followers/static/description/assets/icons/manufacturing-black.png b/all_in_one_multi_followers/static/description/assets/icons/manufacturing-black.png new file mode 100644 index 0000000000..697eb0e9f2 Binary files /dev/null and b/all_in_one_multi_followers/static/description/assets/icons/manufacturing-black.png differ diff --git a/all_in_one_multi_followers/static/description/assets/icons/notes.png b/all_in_one_multi_followers/static/description/assets/icons/notes.png new file mode 100644 index 0000000000..ee5e954047 Binary files /dev/null and b/all_in_one_multi_followers/static/description/assets/icons/notes.png differ diff --git a/all_in_one_multi_followers/static/description/assets/icons/notification icon.svg b/all_in_one_multi_followers/static/description/assets/icons/notification icon.svg new file mode 100644 index 0000000000..0531899736 --- /dev/null +++ b/all_in_one_multi_followers/static/description/assets/icons/notification icon.svg @@ -0,0 +1,10 @@ + + + + + + + + + + diff --git a/all_in_one_multi_followers/static/description/assets/icons/odoo-consultancy.svg b/all_in_one_multi_followers/static/description/assets/icons/odoo-consultancy.svg new file mode 100644 index 0000000000..e05f65bde4 --- /dev/null +++ b/all_in_one_multi_followers/static/description/assets/icons/odoo-consultancy.svg @@ -0,0 +1,4 @@ + + + + diff --git a/all_in_one_multi_followers/static/description/assets/icons/odoo-licencing.svg b/all_in_one_multi_followers/static/description/assets/icons/odoo-licencing.svg new file mode 100644 index 0000000000..2606c88b04 --- /dev/null +++ b/all_in_one_multi_followers/static/description/assets/icons/odoo-licencing.svg @@ -0,0 +1,3 @@ + + + diff --git a/all_in_one_multi_followers/static/description/assets/icons/odoo-logo.png b/all_in_one_multi_followers/static/description/assets/icons/odoo-logo.png new file mode 100644 index 0000000000..0e4d0eb5a4 Binary files /dev/null and b/all_in_one_multi_followers/static/description/assets/icons/odoo-logo.png differ diff --git a/all_in_one_multi_followers/static/description/assets/icons/patter.svg b/all_in_one_multi_followers/static/description/assets/icons/patter.svg new file mode 100644 index 0000000000..25c9c0a8f1 --- /dev/null +++ b/all_in_one_multi_followers/static/description/assets/icons/patter.svg @@ -0,0 +1,9 @@ + + + + + + + + + diff --git a/all_in_one_multi_followers/static/description/assets/icons/pattern1.png b/all_in_one_multi_followers/static/description/assets/icons/pattern1.png new file mode 100644 index 0000000000..09ab0fb2d9 Binary files /dev/null and b/all_in_one_multi_followers/static/description/assets/icons/pattern1.png differ diff --git a/all_in_one_multi_followers/static/description/assets/icons/pos-black.png b/all_in_one_multi_followers/static/description/assets/icons/pos-black.png new file mode 100644 index 0000000000..97c0f90c10 Binary files /dev/null and b/all_in_one_multi_followers/static/description/assets/icons/pos-black.png differ diff --git a/all_in_one_multi_followers/static/description/assets/icons/puzzle-piece-icon.svg b/all_in_one_multi_followers/static/description/assets/icons/puzzle-piece-icon.svg new file mode 100644 index 0000000000..3e9ad93738 --- /dev/null +++ b/all_in_one_multi_followers/static/description/assets/icons/puzzle-piece-icon.svg @@ -0,0 +1,10 @@ + + + + + + + + + + diff --git a/all_in_one_multi_followers/static/description/assets/icons/puzzle.png b/all_in_one_multi_followers/static/description/assets/icons/puzzle.png new file mode 100644 index 0000000000..65cf854e7e Binary files /dev/null and b/all_in_one_multi_followers/static/description/assets/icons/puzzle.png differ diff --git a/all_in_one_multi_followers/static/description/assets/icons/replace-icon.svg b/all_in_one_multi_followers/static/description/assets/icons/replace-icon.svg new file mode 100644 index 0000000000..d0e3a7af1a --- /dev/null +++ b/all_in_one_multi_followers/static/description/assets/icons/replace-icon.svg @@ -0,0 +1,10 @@ + + + + + + + + + + diff --git a/all_in_one_multi_followers/static/description/assets/icons/restaurant-black.png b/all_in_one_multi_followers/static/description/assets/icons/restaurant-black.png new file mode 100644 index 0000000000..4a35eb939c Binary files /dev/null and b/all_in_one_multi_followers/static/description/assets/icons/restaurant-black.png differ diff --git a/all_in_one_multi_followers/static/description/assets/icons/screenshot-main.png b/all_in_one_multi_followers/static/description/assets/icons/screenshot-main.png new file mode 100644 index 0000000000..575f8e676b Binary files /dev/null and b/all_in_one_multi_followers/static/description/assets/icons/screenshot-main.png differ diff --git a/all_in_one_multi_followers/static/description/assets/icons/screenshot.png b/all_in_one_multi_followers/static/description/assets/icons/screenshot.png new file mode 100644 index 0000000000..cef272529d Binary files /dev/null and b/all_in_one_multi_followers/static/description/assets/icons/screenshot.png differ diff --git a/all_in_one_multi_followers/static/description/assets/icons/service-black.png b/all_in_one_multi_followers/static/description/assets/icons/service-black.png new file mode 100644 index 0000000000..301ab51cb1 Binary files /dev/null and b/all_in_one_multi_followers/static/description/assets/icons/service-black.png differ diff --git a/all_in_one_multi_followers/static/description/assets/icons/skype-fill.svg b/all_in_one_multi_followers/static/description/assets/icons/skype-fill.svg new file mode 100644 index 0000000000..c174236393 --- /dev/null +++ b/all_in_one_multi_followers/static/description/assets/icons/skype-fill.svg @@ -0,0 +1,10 @@ + + + + + + + + + + diff --git a/all_in_one_multi_followers/static/description/assets/icons/skype.png b/all_in_one_multi_followers/static/description/assets/icons/skype.png new file mode 100644 index 0000000000..51b409fb3f Binary files /dev/null and b/all_in_one_multi_followers/static/description/assets/icons/skype.png differ diff --git a/all_in_one_multi_followers/static/description/assets/icons/skype.svg b/all_in_one_multi_followers/static/description/assets/icons/skype.svg new file mode 100644 index 0000000000..df3dad39b5 --- /dev/null +++ b/all_in_one_multi_followers/static/description/assets/icons/skype.svg @@ -0,0 +1,3 @@ + + + diff --git a/all_in_one_multi_followers/static/description/assets/icons/star-1.svg b/all_in_one_multi_followers/static/description/assets/icons/star-1.svg new file mode 100644 index 0000000000..7e55ab162e --- /dev/null +++ b/all_in_one_multi_followers/static/description/assets/icons/star-1.svg @@ -0,0 +1,53 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/all_in_one_multi_followers/static/description/assets/icons/star-2.svg b/all_in_one_multi_followers/static/description/assets/icons/star-2.svg new file mode 100644 index 0000000000..5ae9f507a1 --- /dev/null +++ b/all_in_one_multi_followers/static/description/assets/icons/star-2.svg @@ -0,0 +1,9 @@ + + + + + + + + + diff --git a/all_in_one_multi_followers/static/description/assets/icons/support.png b/all_in_one_multi_followers/static/description/assets/icons/support.png new file mode 100644 index 0000000000..4f18b8b820 Binary files /dev/null and b/all_in_one_multi_followers/static/description/assets/icons/support.png differ diff --git a/all_in_one_multi_followers/static/description/assets/icons/test-1 - Copy.png b/all_in_one_multi_followers/static/description/assets/icons/test-1 - Copy.png new file mode 100644 index 0000000000..f6a9026637 Binary files /dev/null and b/all_in_one_multi_followers/static/description/assets/icons/test-1 - Copy.png differ diff --git a/all_in_one_multi_followers/static/description/assets/icons/test-1.png b/all_in_one_multi_followers/static/description/assets/icons/test-1.png new file mode 100644 index 0000000000..0908add2b0 Binary files /dev/null and b/all_in_one_multi_followers/static/description/assets/icons/test-1.png differ diff --git a/all_in_one_multi_followers/static/description/assets/icons/test-2.png b/all_in_one_multi_followers/static/description/assets/icons/test-2.png new file mode 100644 index 0000000000..4671fe91e9 Binary files /dev/null and b/all_in_one_multi_followers/static/description/assets/icons/test-2.png differ diff --git a/all_in_one_multi_followers/static/description/assets/icons/trading-black.png b/all_in_one_multi_followers/static/description/assets/icons/trading-black.png new file mode 100644 index 0000000000..9398ba2f1a Binary files /dev/null and b/all_in_one_multi_followers/static/description/assets/icons/trading-black.png differ diff --git a/all_in_one_multi_followers/static/description/assets/icons/training.png b/all_in_one_multi_followers/static/description/assets/icons/training.png new file mode 100644 index 0000000000..884ca024d7 Binary files /dev/null and b/all_in_one_multi_followers/static/description/assets/icons/training.png differ diff --git a/all_in_one_multi_followers/static/description/assets/icons/translate.svg b/all_in_one_multi_followers/static/description/assets/icons/translate.svg new file mode 100644 index 0000000000..af9c8a1aa8 --- /dev/null +++ b/all_in_one_multi_followers/static/description/assets/icons/translate.svg @@ -0,0 +1,10 @@ + + + + + + + + + + diff --git a/all_in_one_multi_followers/static/description/assets/icons/update.png b/all_in_one_multi_followers/static/description/assets/icons/update.png new file mode 100644 index 0000000000..ecbc5a01a2 Binary files /dev/null and b/all_in_one_multi_followers/static/description/assets/icons/update.png differ diff --git a/all_in_one_multi_followers/static/description/assets/icons/user.png b/all_in_one_multi_followers/static/description/assets/icons/user.png new file mode 100644 index 0000000000..6ffb23d9f0 Binary files /dev/null and b/all_in_one_multi_followers/static/description/assets/icons/user.png differ diff --git a/all_in_one_multi_followers/static/description/assets/icons/video.png b/all_in_one_multi_followers/static/description/assets/icons/video.png new file mode 100644 index 0000000000..576705b172 Binary files /dev/null and b/all_in_one_multi_followers/static/description/assets/icons/video.png differ diff --git a/all_in_one_multi_followers/static/description/assets/icons/whatsapp.png b/all_in_one_multi_followers/static/description/assets/icons/whatsapp.png new file mode 100644 index 0000000000..d513a5356b Binary files /dev/null and b/all_in_one_multi_followers/static/description/assets/icons/whatsapp.png differ diff --git a/all_in_one_multi_followers/static/description/assets/icons/wrench-icon.svg b/all_in_one_multi_followers/static/description/assets/icons/wrench-icon.svg new file mode 100644 index 0000000000..174b5a465e --- /dev/null +++ b/all_in_one_multi_followers/static/description/assets/icons/wrench-icon.svg @@ -0,0 +1,10 @@ + + + + + + + + + + diff --git a/all_in_one_multi_followers/static/description/assets/icons/wrench.png b/all_in_one_multi_followers/static/description/assets/icons/wrench.png new file mode 100644 index 0000000000..6c04dea0f4 Binary files /dev/null and b/all_in_one_multi_followers/static/description/assets/icons/wrench.png differ diff --git a/all_in_one_multi_followers/static/description/assets/misc/Cybrosys R.png b/all_in_one_multi_followers/static/description/assets/misc/Cybrosys R.png new file mode 100644 index 0000000000..da40580870 Binary files /dev/null and b/all_in_one_multi_followers/static/description/assets/misc/Cybrosys R.png differ diff --git a/all_in_one_multi_followers/static/description/assets/misc/categories.png b/all_in_one_multi_followers/static/description/assets/misc/categories.png new file mode 100644 index 0000000000..bedf1e0b18 Binary files /dev/null and b/all_in_one_multi_followers/static/description/assets/misc/categories.png differ diff --git a/all_in_one_multi_followers/static/description/assets/misc/check-box.png b/all_in_one_multi_followers/static/description/assets/misc/check-box.png new file mode 100644 index 0000000000..42caf24b98 Binary files /dev/null and b/all_in_one_multi_followers/static/description/assets/misc/check-box.png differ diff --git a/all_in_one_multi_followers/static/description/assets/misc/compass.png b/all_in_one_multi_followers/static/description/assets/misc/compass.png new file mode 100644 index 0000000000..d5fed8faa6 Binary files /dev/null and b/all_in_one_multi_followers/static/description/assets/misc/compass.png differ diff --git a/all_in_one_multi_followers/static/description/assets/misc/corporate.png b/all_in_one_multi_followers/static/description/assets/misc/corporate.png new file mode 100644 index 0000000000..2eb13edbfa Binary files /dev/null and b/all_in_one_multi_followers/static/description/assets/misc/corporate.png differ diff --git a/all_in_one_multi_followers/static/description/assets/misc/customer-support.png b/all_in_one_multi_followers/static/description/assets/misc/customer-support.png new file mode 100644 index 0000000000..79efc72edc Binary files /dev/null and b/all_in_one_multi_followers/static/description/assets/misc/customer-support.png differ diff --git a/all_in_one_multi_followers/static/description/assets/misc/cybrosys-logo.png b/all_in_one_multi_followers/static/description/assets/misc/cybrosys-logo.png new file mode 100644 index 0000000000..cc3cc0ccfd Binary files /dev/null and b/all_in_one_multi_followers/static/description/assets/misc/cybrosys-logo.png differ diff --git a/all_in_one_multi_followers/static/description/assets/misc/email.svg b/all_in_one_multi_followers/static/description/assets/misc/email.svg new file mode 100644 index 0000000000..15291cdc3a --- /dev/null +++ b/all_in_one_multi_followers/static/description/assets/misc/email.svg @@ -0,0 +1,33 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/all_in_one_multi_followers/static/description/assets/misc/features.png b/all_in_one_multi_followers/static/description/assets/misc/features.png new file mode 100644 index 0000000000..b41769f774 Binary files /dev/null and b/all_in_one_multi_followers/static/description/assets/misc/features.png differ diff --git a/all_in_one_multi_followers/static/description/assets/misc/logo.png b/all_in_one_multi_followers/static/description/assets/misc/logo.png new file mode 100644 index 0000000000..478462d3e7 Binary files /dev/null and b/all_in_one_multi_followers/static/description/assets/misc/logo.png differ diff --git a/all_in_one_multi_followers/static/description/assets/misc/phone.svg b/all_in_one_multi_followers/static/description/assets/misc/phone.svg new file mode 100644 index 0000000000..b7bd7f251f --- /dev/null +++ b/all_in_one_multi_followers/static/description/assets/misc/phone.svg @@ -0,0 +1,3 @@ + + + diff --git a/all_in_one_multi_followers/static/description/assets/misc/pictures.png b/all_in_one_multi_followers/static/description/assets/misc/pictures.png new file mode 100644 index 0000000000..56d255fe96 Binary files /dev/null and b/all_in_one_multi_followers/static/description/assets/misc/pictures.png differ diff --git a/all_in_one_multi_followers/static/description/assets/misc/pie-chart.png b/all_in_one_multi_followers/static/description/assets/misc/pie-chart.png new file mode 100644 index 0000000000..426e05244b Binary files /dev/null and b/all_in_one_multi_followers/static/description/assets/misc/pie-chart.png differ diff --git a/all_in_one_multi_followers/static/description/assets/misc/right-arrow.png b/all_in_one_multi_followers/static/description/assets/misc/right-arrow.png new file mode 100644 index 0000000000..730984a063 Binary files /dev/null and b/all_in_one_multi_followers/static/description/assets/misc/right-arrow.png differ diff --git a/all_in_one_multi_followers/static/description/assets/misc/star (1) 2.svg b/all_in_one_multi_followers/static/description/assets/misc/star (1) 2.svg new file mode 100644 index 0000000000..5ae9f507a1 --- /dev/null +++ b/all_in_one_multi_followers/static/description/assets/misc/star (1) 2.svg @@ -0,0 +1,9 @@ + + + + + + + + + diff --git a/all_in_one_multi_followers/static/description/assets/misc/star.png b/all_in_one_multi_followers/static/description/assets/misc/star.png new file mode 100644 index 0000000000..2eb9ab29f7 Binary files /dev/null and b/all_in_one_multi_followers/static/description/assets/misc/star.png differ diff --git a/all_in_one_multi_followers/static/description/assets/misc/support (1) 1.svg b/all_in_one_multi_followers/static/description/assets/misc/support (1) 1.svg new file mode 100644 index 0000000000..7d37a8f308 --- /dev/null +++ b/all_in_one_multi_followers/static/description/assets/misc/support (1) 1.svg @@ -0,0 +1,9 @@ + + + + + + + + + diff --git a/all_in_one_multi_followers/static/description/assets/misc/support-email.svg b/all_in_one_multi_followers/static/description/assets/misc/support-email.svg new file mode 100644 index 0000000000..eb70370d60 --- /dev/null +++ b/all_in_one_multi_followers/static/description/assets/misc/support-email.svg @@ -0,0 +1,6 @@ + + + + + + diff --git a/all_in_one_multi_followers/static/description/assets/misc/support.png b/all_in_one_multi_followers/static/description/assets/misc/support.png new file mode 100644 index 0000000000..4f18b8b820 Binary files /dev/null and b/all_in_one_multi_followers/static/description/assets/misc/support.png differ diff --git a/all_in_one_multi_followers/static/description/assets/misc/tick-mark.svg b/all_in_one_multi_followers/static/description/assets/misc/tick-mark.svg new file mode 100644 index 0000000000..2dbb401871 --- /dev/null +++ b/all_in_one_multi_followers/static/description/assets/misc/tick-mark.svg @@ -0,0 +1,17 @@ + + + + + + + + + + + + + + + + + diff --git a/all_in_one_multi_followers/static/description/assets/misc/whatsapp 1.svg b/all_in_one_multi_followers/static/description/assets/misc/whatsapp 1.svg new file mode 100644 index 0000000000..0bfaf8fc65 --- /dev/null +++ b/all_in_one_multi_followers/static/description/assets/misc/whatsapp 1.svg @@ -0,0 +1,9 @@ + + + + + + + + + diff --git a/all_in_one_multi_followers/static/description/assets/misc/whatsapp.png b/all_in_one_multi_followers/static/description/assets/misc/whatsapp.png new file mode 100644 index 0000000000..d513a5356b Binary files /dev/null and b/all_in_one_multi_followers/static/description/assets/misc/whatsapp.png differ diff --git a/all_in_one_multi_followers/static/description/assets/misc/whatsapp.svg b/all_in_one_multi_followers/static/description/assets/misc/whatsapp.svg new file mode 100644 index 0000000000..b618aea1da --- /dev/null +++ b/all_in_one_multi_followers/static/description/assets/misc/whatsapp.svg @@ -0,0 +1,33 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/all_in_one_multi_followers/static/description/assets/modules/banner1.jpg b/all_in_one_multi_followers/static/description/assets/modules/banner1.jpg new file mode 100644 index 0000000000..6e617f3d37 Binary files /dev/null and b/all_in_one_multi_followers/static/description/assets/modules/banner1.jpg differ diff --git a/all_in_one_multi_followers/static/description/assets/modules/banner2.jpg b/all_in_one_multi_followers/static/description/assets/modules/banner2.jpg new file mode 100644 index 0000000000..580ea075dc Binary files /dev/null and b/all_in_one_multi_followers/static/description/assets/modules/banner2.jpg differ diff --git a/all_in_one_multi_followers/static/description/assets/modules/banner3.jpg b/all_in_one_multi_followers/static/description/assets/modules/banner3.jpg new file mode 100644 index 0000000000..a68ae5a1b6 Binary files /dev/null and b/all_in_one_multi_followers/static/description/assets/modules/banner3.jpg differ diff --git a/all_in_one_multi_followers/static/description/assets/modules/banner4.jpg b/all_in_one_multi_followers/static/description/assets/modules/banner4.jpg new file mode 100644 index 0000000000..19319906e7 Binary files /dev/null and b/all_in_one_multi_followers/static/description/assets/modules/banner4.jpg differ diff --git a/all_in_one_multi_followers/static/description/assets/modules/banner5.jpg b/all_in_one_multi_followers/static/description/assets/modules/banner5.jpg new file mode 100644 index 0000000000..e0b09a5a0b Binary files /dev/null and b/all_in_one_multi_followers/static/description/assets/modules/banner5.jpg differ diff --git a/all_in_one_multi_followers/static/description/assets/modules/banner6.jpg b/all_in_one_multi_followers/static/description/assets/modules/banner6.jpg new file mode 100644 index 0000000000..696582fa86 Binary files /dev/null and b/all_in_one_multi_followers/static/description/assets/modules/banner6.jpg differ diff --git a/all_in_one_multi_followers/static/description/assets/screenshots/hero.gif b/all_in_one_multi_followers/static/description/assets/screenshots/hero.gif new file mode 100644 index 0000000000..0b36118222 Binary files /dev/null and b/all_in_one_multi_followers/static/description/assets/screenshots/hero.gif differ diff --git a/all_in_one_multi_followers/static/description/assets/screenshots/img_1.png b/all_in_one_multi_followers/static/description/assets/screenshots/img_1.png new file mode 100644 index 0000000000..e1dbec6168 Binary files /dev/null and b/all_in_one_multi_followers/static/description/assets/screenshots/img_1.png differ diff --git a/all_in_one_multi_followers/static/description/assets/screenshots/screenshot1.png b/all_in_one_multi_followers/static/description/assets/screenshots/screenshot1.png new file mode 100644 index 0000000000..f2e21548ad Binary files /dev/null and b/all_in_one_multi_followers/static/description/assets/screenshots/screenshot1.png differ diff --git a/all_in_one_multi_followers/static/description/assets/screenshots/screenshot2.png b/all_in_one_multi_followers/static/description/assets/screenshots/screenshot2.png new file mode 100644 index 0000000000..8091b4ef22 Binary files /dev/null and b/all_in_one_multi_followers/static/description/assets/screenshots/screenshot2.png differ diff --git a/all_in_one_multi_followers/static/description/assets/screenshots/screenshot3.png b/all_in_one_multi_followers/static/description/assets/screenshots/screenshot3.png new file mode 100644 index 0000000000..a7504862c4 Binary files /dev/null and b/all_in_one_multi_followers/static/description/assets/screenshots/screenshot3.png differ diff --git a/all_in_one_multi_followers/static/description/assets/screenshots/screenshot4.png b/all_in_one_multi_followers/static/description/assets/screenshots/screenshot4.png new file mode 100644 index 0000000000..eb510965e6 Binary files /dev/null and b/all_in_one_multi_followers/static/description/assets/screenshots/screenshot4.png differ diff --git a/all_in_one_multi_followers/static/description/assets/screenshots/screenshot5.png b/all_in_one_multi_followers/static/description/assets/screenshots/screenshot5.png new file mode 100644 index 0000000000..976b78517f Binary files /dev/null and b/all_in_one_multi_followers/static/description/assets/screenshots/screenshot5.png differ diff --git a/all_in_one_multi_followers/static/description/assets/screenshots/screenshot6.png b/all_in_one_multi_followers/static/description/assets/screenshots/screenshot6.png new file mode 100644 index 0000000000..496ec2800f Binary files /dev/null and b/all_in_one_multi_followers/static/description/assets/screenshots/screenshot6.png differ diff --git a/all_in_one_multi_followers/static/description/assets/screenshots/screenshot7.png b/all_in_one_multi_followers/static/description/assets/screenshots/screenshot7.png new file mode 100644 index 0000000000..0b2aecde0d Binary files /dev/null and b/all_in_one_multi_followers/static/description/assets/screenshots/screenshot7.png differ diff --git a/all_in_one_multi_followers/static/description/assets/screenshots/screenshot8.png b/all_in_one_multi_followers/static/description/assets/screenshots/screenshot8.png new file mode 100644 index 0000000000..3ad5d5949b Binary files /dev/null and b/all_in_one_multi_followers/static/description/assets/screenshots/screenshot8.png differ diff --git a/all_in_one_multi_followers/static/description/assets/screenshots/screenshot9.png b/all_in_one_multi_followers/static/description/assets/screenshots/screenshot9.png new file mode 100644 index 0000000000..be3aa84c90 Binary files /dev/null and b/all_in_one_multi_followers/static/description/assets/screenshots/screenshot9.png differ diff --git a/all_in_one_multi_followers/static/description/banner.jpg b/all_in_one_multi_followers/static/description/banner.jpg new file mode 100644 index 0000000000..4a8e890dae Binary files /dev/null and b/all_in_one_multi_followers/static/description/banner.jpg differ diff --git a/all_in_one_multi_followers/static/description/icon.png b/all_in_one_multi_followers/static/description/icon.png new file mode 100644 index 0000000000..da841d5801 Binary files /dev/null and b/all_in_one_multi_followers/static/description/icon.png differ diff --git a/all_in_one_multi_followers/static/description/index.html b/all_in_one_multi_followers/static/description/index.html new file mode 100644 index 0000000000..9e0791c03a --- /dev/null +++ b/all_in_one_multi_followers/static/description/index.html @@ -0,0 +1,1198 @@ + + + + + + All in One Multi Followers + + + + + + + + + + +
+
+ + + +
+
+ Community +
+
+ Enterprise +
+ + + + +
+
+ +
+
+
+
+

+ Setting Multi-Followers in the Whole Odoo Model by Using + Dynamic Actions + +

+

All in One Multi Followers +

+
+
+ +
+ +
+ +
+
+
+ +
+
+ +
+
+ +
+
+
+

Key + Highlights

+
+
+
+
+ +
+
+ Community & Enterprise Support. +
+

+

+
+
+
+
+
+ +
+
+ You can Add/Remove Multiple Followers using + Dynamic Action. +
+

+

+
+
+
+
+
+ +
+
+ You can Add/Remove Multiple Followers in any + odoo model. +
+

+

+
+
+
+
+
+ +
+
+ You can apply Dynamic Action in the particular + models. +
+

+

+
+
+
+
+ +
+
+
+ All in One Multi Followers +

+ Are you ready to make your business more + organized? +
Improve now! +

+ +
+
+ +
+
+
+ + + + +
+
+ +
+
+
+
+ acc_bg +
+ +
+
+
+
+

+ Configure the + + Dynamic Action +

+
+
+

+ Navigate to Settings → General Settings → Dynamic Followers to create a Dynamic + Action. +

+
+
+
+ +
+
+
+
+
+
+
+
+
+

+ Action + + Creation. +

+
+
+

+ Enter an Action Name and select the model in + which you want to apply. After that, click + 'CREATE ACTION' to add this Action to the + model. +

+
+
+
+ +
+
+
+
+
+
+
+
+
+

+ After + + Creation. +

+
+
+

+ The action is applied to the selected model. To add or remove multiple followers, + select the desired records, go to the “Action” menu, and click on the corresponding + action. +

+
+
+
+ +
+
+
+
+
+
+
+
+
+

+ Action + + +

+
+
+

+ Action applied in the selected model. Select + the order line in which you want to + Add/Remove Multiple Followers, then go to + Action and click on that Action. +

+
+
+
+ +
+
+
+
+
+
+
+
+
+

+ Before Adding + + Followers. +

+
+
+

+ +

+
+
+
+ +
+
+
+
+
+
+
+
+
+

+ Wizard to Add or Remove + + the Followers. +

+
+
+

+ A wizard will open where you can select the action type and choose the partner(s) or + follower(s) you want to add or remove. Then, click the 'Submit' button. +

+
+
+
+ +
+
+
+
+
+
+
+
+
+

+ Followers are + + Added. +

+
+
+

+ +

+
+
+
+ +
+
+
+
+
+
+
+
+
+

+ Followers + + Removing Popup. +

+
+
+

+ +

+
+
+
+ +
+
+
+
+
+
+
+
+
+

+ Removed the + + followers. +

+
+
+

+ +

+
+
+
+ +
+
+
+
+
+
+
+
+ +
+
+
+
+ +
+

+ You can Add/Remove Multiple Followers in any + odoo model. +

+
+
+

+ +

+
+
+
+
+
+
+
+ +
+

+ You can Add/Remove Multiple Followers using + Dynamic Action.

+
+
+

+ +

+
+
+
+
+
+
+
+ +
+

+ You can apply Dynamic Action in the particular + models.

+
+
+

+ +

+
+
+
+
+
+
+
+
+
+
+ +
+ +
+ +
+

+ Go to the "Dynamic Followers" + menu or action associated with your record. +

+
+
+ +
+ +
+

+ Yes. You can select + multiple users/partners + and perform the action in bulk. +

+
+
+ +
+ +
+

+ No.This module extends + the functionality without + changing core behavior. +

+
+
+
+
+
+
+
+
+
+ +
+
+

+ Latest Release 18.0.1.0.0 +

+ + 18th June, 2025 + +
+
+
+
+
+ Add +
+
+
+
    +
  • + Initial Commit +
  • + +
+
+
+
+
+
+
+
+
+
+ + + +
+

+ Related Products +

+ +
+ + +
+

+ Our Services

+ +
+ +
+
+ .... +
+
+ +
+ + +
+
+ + + + + + diff --git a/all_in_one_multi_followers/views/multi_follower_views.xml b/all_in_one_multi_followers/views/multi_follower_views.xml new file mode 100644 index 0000000000..cfd11f46e2 --- /dev/null +++ b/all_in_one_multi_followers/views/multi_follower_views.xml @@ -0,0 +1,65 @@ + + + + + Multi Follower + ir.actions.act_window + multi.follower + list,form + +

+ Click to add the followers dynamic action +

+
+
+ + + multi.follower.view.form + multi.follower + +
+
+ +
+ + + + + + + +
+
+
+
\ No newline at end of file diff --git a/all_in_one_multi_followers/views/res_config_settings_views.xml b/all_in_one_multi_followers/views/res_config_settings_views.xml new file mode 100644 index 0000000000..4da31f29b0 --- /dev/null +++ b/all_in_one_multi_followers/views/res_config_settings_views.xml @@ -0,0 +1,76 @@ + + + + + res.config.settings.view.form.inherit.all.in.one.multi.followers + res.config.settings + + + + + + +
+ Create a Dynamic + Action + +
+
+
+
+
+
+
+
+
+ + + Settings + res.config.settings + form + inline + {'module' : 'all_in_one_multi_followers', + 'bin_size': False} + + +
diff --git a/all_in_one_multi_followers/wizard/__init__.py b/all_in_one_multi_followers/wizard/__init__.py new file mode 100644 index 0000000000..9f4ffc3691 --- /dev/null +++ b/all_in_one_multi_followers/wizard/__init__.py @@ -0,0 +1,22 @@ +# -*- coding: utf-8 -*- +############################################################################### +# +# Cybrosys Technologies Pvt. Ltd. +# +# Copyright (C) 2025-TODAY Cybrosys Technologies() +# Author: Cybrosys Techno Solutions() +# +# 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 . +# +############################################################################### +from . import follower_adding_removing diff --git a/all_in_one_multi_followers/wizard/follower_adding_removing.py b/all_in_one_multi_followers/wizard/follower_adding_removing.py new file mode 100644 index 0000000000..c815a30f6a --- /dev/null +++ b/all_in_one_multi_followers/wizard/follower_adding_removing.py @@ -0,0 +1,199 @@ +# -*- coding: utf-8 -*- +############################################################################### +# +# Cybrosys Technologies Pvt. Ltd. +# +# Copyright (C) 2025-TODAY Cybrosys Technologies() +# Author: Cybrosys Techno Solutions() +# +# 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 . +# +############################################################################### +from lxml import etree +from lxml.html import builder as html +from odoo import api, fields, models, _ + + +class FollowerAddingRemoving(models.TransientModel): + """Creating a popup wizard to adding or removing the followers in to + the model""" + _name = 'follower.adding.removing' + _description = 'Follower Adding Removing' + + res_id = fields.Integer('Related Document ID', + help='Id of the followed resource') + type = fields.Selection( + [('add', 'Add Followers'), ('remove', 'Remove Followers')], + string="Action Type", help='Select the action type', + default='add') + partner_ids = fields.Many2many('res.partner', string='Partners', + help='Select the partners to add or' + ' remove to the followers') + send_mail = fields.Boolean(string='Send Email', default=True, + help="If checked, the partners will receive an " + "email warning they have been added in " + "the document's followers.") + message = fields.Html(string='Message', help='Invite/ Remove mailing ' + 'message.') + + def action_submit(self): + """ + Adds or removes followers from records based on user input when the + submit button is clicked. + + - Retrieves the model information for the current active model (the one + from which the action is triggered). + - Based on the action type (`add` or `remove`), it either subscribes or + unsubscribes the selected followers (partners) to/from the records. + - If the `send_mail` flag is enabled and a message is provided, an email + notification is sent to the new followers. + + Key Steps: + 1. Retrieve the active model and its records using the context's + `active_model` and `active_ids`. + 2. If the action type is 'add', the selected partners (followers) are + subscribed to the record via `message_subscribe`. + 3. If the action type is 'remove', the selected partners are unsubscribed + via `message_unsubscribe`. + 4. If email notifications are enabled (`send_mail` is True) and a message + is provided, an email is composed and sent to the new followers. + + Returns: + None + """ + model_info = self.env['ir.model'].search( + [('model', '=', self.env.context.get('active_model'))], + limit=1) + email_from = self.env.user.email_formatted + title = [active_model.display_name for active_model in + self.env[self.env.context.get('active_model')].browse( + self.env.context.get('active_ids'))] + for record_id in self.env.context.get('active_ids'): + record = self.env[self.env.context.get('active_model')].browse( + record_id) + if self.type == 'add': + record.message_subscribe(partner_ids=self.partner_ids.ids) + elif self.type == 'remove': + record.message_unsubscribe(partner_ids=self.partner_ids.ids) + new_partners = self.partner_ids + model_name = model_info.display_name + if self.send_mail and self.message and not self.message == '
': + self.env['mail.mail'].create( + self._prepare_message_values(title, model_name, email_from, + new_partners) + ).send() + + @api.onchange('type') + def _onchange_type(self): + """ + Updates the 'message' field based on the selected type (add or remove) when + the 'type' field is changed. + + This method is triggered automatically when the 'type' field is updated + by the user. It generates a message to reflect whether the user is adding + or removing followers from a document, and then updates the 'message' + field of the current record with this information. + + Key Steps: + 1. Retrieves the name of the current user (`user_name`) and the active + document's model (`active_model`) from the context. + 2. Fetches the display name of the document (record) and creates a message + informing the user whether they are being invited to follow or are being + removed from following the document. + 3. The message is formatted as HTML using the `html.DIV` and `html.P` elements, + and is then serialized to a string and stored in the 'message' field. + + Example: + - If the 'type' is 'add': + "John Doe has invited you to follow the Sales Order document: SO001". + - If the 'type' is 'remove': + "John Doe has removed you from following the Sales Order document: SO001". + + Returns: + None + """ + user_name = self.env.user.display_name + model = self.env.context.get('active_model') + document = self.env['ir.model']._get(model).display_name + title = [active_model.display_name for active_model in + self.env[model].browse(self.env.context.get('active_ids'))] + if self.type == 'add': + msg_fmt = _( + f'{user_name} has invited you to follow the {document} ' + f'document: {title}') + else: + msg_fmt = _( + f'{user_name} has removed you from following the {document} ' + f'document: {title}') + text = msg_fmt % locals() + message = html.DIV( + html.P(_('Hello,')), + html.P(text) + ) + self.message = etree.tostring(message, encoding='unicode', method='html') + + def _prepare_message_values(self, title, model_name, email_from, + new_partners): + """ + Prepares the necessary email values for sending a notification about + following or unfollowing a document. + + This method is responsible for generating the content of the email that + will be sent when followers are added or removed from a document. The email + contains details such as the document's model and title, the sender's email + address, and the recipients' email addresses. + + Parameters: + - title (str): The display name or title of the document being followed + or unfollowed. + - model_name (str): The display name of the model (e.g., "Sales Order", + "Purchase Order"). + - email_from (str): The formatted email address of the current user (the sender). + - new_partners (recordset): A recordset of partners (followers) to whom + the email will be sent. + + Returns: + dict: A dictionary of email values containing the following keys: + - `subject`: The subject line of the email, including the document model + and title. + - `body_html`: The HTML content of the email, using the message field + defined in the current record. + - `record_name`: The name of the document being followed/unfollowed. + - `email_from`: The sender's email address. + - `email_to`: A comma-separated list of email addresses of the new partners. + - `reply_to`: The sender's email address for reply purposes. + - `reply_to_force_new`: A flag to force new email threads for replies. + - `email_add_signature`: A flag to include the user's email signature in + the message. + + This method is designed to format and structure the email data so that it + can be sent out to notify partners of changes in document followers. + """ + email_values = { + 'subject': _( + 'The Document follow %(document_model)s: %(document_name)s', + document_model=model_name, + document_name=title), + 'body_html': self.message, + 'record_name': title, + 'email_from': email_from, + 'email_to': ','.join(new_partners.mapped('email')), + 'reply_to': email_from, + 'reply_to_force_new': True, + 'email_add_signature': True, + } + return email_values + + + + diff --git a/all_in_one_multi_followers/wizard/follower_adding_removing_views.xml b/all_in_one_multi_followers/wizard/follower_adding_removing_views.xml new file mode 100644 index 0000000000..66106a379b --- /dev/null +++ b/all_in_one_multi_followers/wizard/follower_adding_removing_views.xml @@ -0,0 +1,44 @@ + + + + + follower.adding.removing.view.form + follower.adding.removing + +
+ + + + + + +
+
+
+
+
+
diff --git a/all_in_one_schedule_activity_management/README.rst b/all_in_one_schedule_activity_management/README.rst new file mode 100644 index 0000000000..e6ce6d6e66 --- /dev/null +++ b/all_in_one_schedule_activity_management/README.rst @@ -0,0 +1,51 @@ +.. image:: https://img.shields.io/badge/license-LGPL--3-green.svg + :target: https://www.gnu.org/licenses/lgpl-3.0-standalone.html + :alt: License: LGPL-3 + +All in one Schedule Activity Management +======================================= +* Schedule Activity Management for Odoo 18 + +Configuration +============= +* Set Schedule Management user inside the user + +Company +------- +* `Cybrosys Techno Solutions `__ + +License +------- +General Public License, Version 3 (LGPL v3). +(https://www.gnu.org/licenses/lgpl-3.0-standalone.html) + +Credits +------- +* Developer: + (v16) Rosmy , + (V17) Anjhana A K, + (V18) Adarsh K, + +* 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 `__ + +Further information +=================== +HTML Description: ``__ diff --git a/all_in_one_schedule_activity_management/__init__.py b/all_in_one_schedule_activity_management/__init__.py new file mode 100644 index 0000000000..b4ab001488 --- /dev/null +++ b/all_in_one_schedule_activity_management/__init__.py @@ -0,0 +1,22 @@ +# -*- coding: utf-8 -*- +################################################################################### +# +# Cybrosys Technologies Pvt. Ltd. +# +# Copyright (C) 2024-TODAY Cybrosys Technologies() +# Author:Adarsh K() +# +# You can modify it under the terms of the GNU LESSER +# GENERAL PUBLIC LICENSE (LGPL 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 LESSER GENERAL PUBLIC LICENSE (LGPL v3) for more details. +# +# You should have received a copy of the GNU LESSER GENERAL PUBLIC LICENSE +# (LGPL v3) along with this program. +# If not, see . +# +############################################################################# +from . import models diff --git a/all_in_one_schedule_activity_management/__manifest__.py b/all_in_one_schedule_activity_management/__manifest__.py new file mode 100644 index 0000000000..f5355e891b --- /dev/null +++ b/all_in_one_schedule_activity_management/__manifest__.py @@ -0,0 +1,63 @@ +# -*- coding: utf-8 -*- +################################################################################### +# +# Cybrosys Technologies Pvt. Ltd. +# +# Copyright (C) 2024-TODAY Cybrosys Technologies() +# Author:Adarsh K() +# +# You can modify it under the terms of the GNU LESSER +# GENERAL PUBLIC LICENSE (LGPL 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 LESSER GENERAL PUBLIC LICENSE (LGPL v3) for more details. +# +# You should have received a copy of the GNU LESSER GENERAL PUBLIC LICENSE +# (LGPL v3) along with this program. +# If not, see . +# +############################################################################# +{ + 'name': 'All in one Schedule Activity Management', + 'version': '18.0.1.0.0', + 'category': 'Tools', + 'summary': """The module allows the manage all scheduled activities.""", + 'description': """The module is a robust tool for organizing and overseeing + all scheduled tasks and events, and Activity manager could manage scheduled + activities. """, + 'author': 'Cybrosys Techno Solutions', + 'company': 'Cybrosys Techno Solutions', + 'maintainer': 'Cybrosys Techno Solutions', + 'website': "https://www.cybrosys.com", + 'depends': ['base_setup', 'mail', 'sale_management'], + 'data': [ + 'security/all_in_one_schedule_activity_management_groups.xml', + 'security/ir.model.access.csv', + 'data/ir_cron_data.xml', + 'views/mail_activity_views.xml', + 'views/activity_tag_views.xml', + 'views/my_activity_views.xml', + 'views/activity_dashbord_views.xml', + 'views/reporting_activity_views.xml', + 'views/activity_history_views.xml', + 'views/res_config_setting_views.xml', + 'views/menu_views.xml', + ], + 'assets': { + 'web.assets_backend': [ + 'https://cdnjs.cloudflare.com/ajax/libs/jquery/3.7.1/jquery.min.js', + 'all_in_one_schedule_activity_management/static/src/xml/activity_dashboard_view.xml', + 'all_in_one_schedule_activity_management/static/src/js/activity_dashboard.js', + 'all_in_one_schedule_activity_management/static/src/css/dashboard.css', + 'all_in_one_schedule_activity_management/static/src/css/style.scss', + 'all_in_one_schedule_activity_management/static/src/css/material-gauge.css', + ], + }, + 'license': 'LGPL-3', + 'images': ['static/description/banner.jpg'], + 'installable': True, + 'auto_install': False, + 'application': True, +} diff --git a/all_in_one_schedule_activity_management/data/ir_cron_data.xml b/all_in_one_schedule_activity_management/data/ir_cron_data.xml new file mode 100644 index 0000000000..6aaa6cd428 --- /dev/null +++ b/all_in_one_schedule_activity_management/data/ir_cron_data.xml @@ -0,0 +1,14 @@ + + + + + Recurring Todo Activity + + code + model.action_mail_on_due_date() + + 1 + days + + + \ No newline at end of file diff --git a/all_in_one_schedule_activity_management/doc/RELEASE_NOTES.md b/all_in_one_schedule_activity_management/doc/RELEASE_NOTES.md new file mode 100644 index 0000000000..ba97c960b9 --- /dev/null +++ b/all_in_one_schedule_activity_management/doc/RELEASE_NOTES.md @@ -0,0 +1,6 @@ +## Module + +#### 06.05.2025 +#### Version 18.0.1.0.0 +##### ADD +- Initial commit for All in one Schedule Activity Management diff --git a/all_in_one_schedule_activity_management/models/__init__.py b/all_in_one_schedule_activity_management/models/__init__.py new file mode 100644 index 0000000000..469fa523a8 --- /dev/null +++ b/all_in_one_schedule_activity_management/models/__init__.py @@ -0,0 +1,25 @@ +# -*- coding: utf-8 -*- +############################################################################## +# +# Cybrosys Technologies Pvt. Ltd. +# +# Copyright (C) 2024-TODAY Cybrosys Technologies() +# Author:Adarsh K() +# +# You can modify it under the terms of the GNU LESSER +# GENERAL PUBLIC LICENSE (LGPL 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 LESSER GENERAL PUBLIC LICENSE (LGPL v3) for more details. +# +# You should have received a copy of the GNU LESSER GENERAL PUBLIC LICENSE +# (LGPL v3) along with this program. +# If not, see . +# +############################################################################# +from . import mail_activity +from . import activity_tag +from . import res_config_settings +from . import res_users diff --git a/all_in_one_schedule_activity_management/models/activity_tag.py b/all_in_one_schedule_activity_management/models/activity_tag.py new file mode 100644 index 0000000000..0b172baf0f --- /dev/null +++ b/all_in_one_schedule_activity_management/models/activity_tag.py @@ -0,0 +1,42 @@ +# -*- coding: utf-8 -*- +################################################################################### +# +# Cybrosys Technologies Pvt. Ltd. +# +# Copyright (C) 2024-TODAY Cybrosys Technologies() +# Author:Adarsh K() +# +# You can modify it under the terms of the GNU LESSER +# GENERAL PUBLIC LICENSE (LGPL 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 LESSER GENERAL PUBLIC LICENSE (LGPL v3) for more details. +# +# You should have received a copy of the GNU LESSER GENERAL PUBLIC LICENSE +# (LGPL v3) along with this program. +# If not, see . +# +############################################################################# +from odoo import fields, models +from random import randint + + +class ActivityTag(models.Model): + """This class is used to create tags for activity""" + _name = "activity.tag" + _description = "Activity Tag" + + def _get_default_color(self): + """to get colors for the tag""" + return randint(1, 11) + + name = fields.Char('Tag Name', required=True, translate=True, + help="Tag name") + color = fields.Integer('Color', default=_get_default_color, + help="Tag color") + + _sql_constraints = [ + ('name_uniq', 'unique (name)', "Tag name already exists !"), + ] diff --git a/all_in_one_schedule_activity_management/models/mail_activity.py b/all_in_one_schedule_activity_management/models/mail_activity.py new file mode 100644 index 0000000000..f70b6f6000 --- /dev/null +++ b/all_in_one_schedule_activity_management/models/mail_activity.py @@ -0,0 +1,172 @@ +# -*- coding: utf-8 -*- +################################################################################### +# +# Cybrosys Technologies Pvt. Ltd. +# +# Copyright (C) 2024-TODAY Cybrosys Technologies() +# Author:Adarsh K() +# +# You can modify it under the terms of the GNU LESSER +# GENERAL PUBLIC LICENSE (LGPL 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 LESSER GENERAL PUBLIC LICENSE (LGPL v3) for more details. +# +# You should have received a copy of the GNU LESSER GENERAL PUBLIC LICENSE +# (LGPL v3) along with this program. +# If not, see . +# +############################################################################# +from collections import defaultdict +from odoo import fields, models, _ +from odoo.exceptions import UserError + + +class MailActivity(models.Model): + """This class is used to inherit the mail.activity model""" + _inherit = "mail.activity" + + state = fields.Selection( + [ + ("overdue", "Overdue"), ("today", "Today"), ("planned", "Planned"), + ("done", "Done"), ("cancel", "Cancelled"),], + "State", compute="_compute_state", store=True, + help="state for the activity",) + active = fields.Boolean("Active", default=True, + help="The record make Active") + activity_tag_ids = fields.Many2many( + "activity.tag", string="Activity Tags", + help="Activity Tags") + + def action_mail_on_due_date(self): + """This function is used to send mails on due date""" + activity_email = self.env["mail.activity"].search([]) + notification_on_date = ( + self.env["ir.config_parameter"].sudo().get_param("notify_on_due_date") + ) + notification_on_expiry = ( + self.env["ir.config_parameter"].sudo().get_param("notify_on_expiry") + ) + for rec in activity_email: + if notification_on_expiry and rec.date_deadline < fields.date.today(): + self.env["mail.mail"].sudo().create( + { + "email_from": self.env.company.email, + "author_id": self.env.user.partner_id.id, + "body_html": "Hello
You missed the %s activity for the document %s
" + % (rec.activity_type_id.name, rec.res_name), + "subject": "%s Activity missed" % rec.activity_type_id.name, + "email_to": rec.user_id.email, + } + ).send(auto_commit=False) + if notification_on_date and rec.date_deadline == fields.date.today(): + self.env["mail.mail"].sudo().create( + { + "email_from": self.env.company.email, + "author_id": self.env.user.partner_id.id, + "body_html": "Hello
Today is your %s activity for the document %s
" + % (rec.activity_type_id.name, rec.res_name), + "subject": "Today %s Activity" % rec.activity_type_id.name, + "email_to": rec.user_id.email, + } + ).send(auto_commit=False) + + def action_activity_cancel(self): + """cancel activity""" + for rec in self: + if rec.state == "cancel": + raise UserError(_("You Cant Cancelled this activity %s") % rec.res_name) + else: + rec.action_cancel() + + def action_activity_done(self): + """done activity""" + for rec in self: + if rec.state == "done": + raise UserError(_("You Cant Cancelled this activity %s") % rec.res_name) + else: + rec._action_done() + + def get_activity_count(self): + """get the activity count details""" + activity = self.env["mail.activity"] + return { + "len_all": len(activity.search([])), + "len_overdue": len(activity.search([("state", "=", "overdue")])), + "len_planned": len(activity.search([("state", "=", "planned")])), + "len_today": len(activity.search([("state", "=", "today")])), + "len_done": len(activity.search([("state", "=", "done"), ("active", "=", False)])), + "len_cancel": len(activity.search([("state", "=", "cancel")])), + } + + def get_activity(self, id): + """Function for to get the activity""" + return {"model": self.env["mail.activity"].search([("id", "=", id)]).res_model, + "res_id": self.env["mail.activity"].search([("id", "=", id)]).res_id} + + def _action_done(self, feedback=False, attachment_ids=None): + """action done function: rewrite the function""" + messages = self.env["mail.message"] + next_activities_values = [] + attachments = self.env["ir.attachment"].search_read( + [("res_model", "=", self._name), ("res_id", "in", self.ids)], + ["id", "res_id"]) + activity_attachments = defaultdict(list) + for attachment in attachments: + activity_id = attachment["res_id"] + activity_attachments[activity_id].append(attachment["id"]) + for activity in self: + if activity.chaining_type == "trigger": + vals = activity.with_context( + activity_previous_deadline=activity.date_deadline + )._prepare_next_activity_values() + next_activities_values.append(vals) + records_sudo = self.env[activity.res_model].browse(activity.res_id) + records_sudo.message_post_with_source( + "mail.message_activity_done", + attachment_ids=attachment_ids, + author_id=self.env.user.partner_id.id, + render_values={ + "activity": activity, + "feedback": feedback, + "display_assignee": activity.user_id != self.env.user, + }, + mail_activity_type_id=activity.activity_type_id.id, + subtype_xmlid='mail.mt_activities', + ) + if activity.activity_type_id.keep_done: + attachment_ids = ( + attachment_ids or []) + activity_attachments.get( + activity.id, []) + if attachment_ids: + activity.attachment_ids = attachment_ids + activity_message = records_sudo.message_ids[0] + message_attachments = self.env["ir.attachment"].browse( + activity_attachments[activity.id] + ) + if message_attachments: + message_attachments.write( + { + "res_id": activity_message.id, + "res_model": activity_message._name, + } + ) + activity_message.attachment_ids = message_attachments + messages += activity_message + + next_activities = self.env['mail.activity'] + if next_activities_values: + next_activities = self.env['mail.activity'].create( + next_activities_values) + for rec in self: + rec.state = "done" + rec.active = False + return messages, next_activities + + def action_cancel(self): + self.state = "cancel" + """cancel activities""" + self.unlink() + diff --git a/all_in_one_schedule_activity_management/models/res_config_settings.py b/all_in_one_schedule_activity_management/models/res_config_settings.py new file mode 100644 index 0000000000..bfdca712d1 --- /dev/null +++ b/all_in_one_schedule_activity_management/models/res_config_settings.py @@ -0,0 +1,43 @@ +# -*- coding: utf-8 -*- +################################################################################### +# +# Cybrosys Technologies Pvt. Ltd. +# +# Copyright (C) 2024-TODAY Cybrosys Technologies() +# Author:Adarsh K() +# +# You can modify it under the terms of the GNU LESSER +# GENERAL PUBLIC LICENSE (LGPL 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 LESSER GENERAL PUBLIC LICENSE (LGPL v3) for more details. +# +# You should have received a copy of the GNU LESSER GENERAL PUBLIC LICENSE +# (LGPL v3) along with this program. +# If not, see . +# +############################################################################# +from odoo import api, fields, models + + +class ResConfigSettings(models.TransientModel): + _inherit = 'res.config.settings' + + notify_on_due_date = fields.Boolean('Notify on Due Date', + help="Notify the due date", + config_parameter="notify_on_due_date") + notify_on_expiry = fields.Boolean('Notify on Expiry', + help="Notify the Expiry date", + config_parameter="notify_on_expiry") + + @api.model + def get_values(self): + """Returns a list of values for the given configuration fields""" + res = super(ResConfigSettings, self).get_values() + res['notify_on_due_date'] = self.env[ + 'ir.config_parameter'].sudo().get_param('notify_on_due_date') + res['notify_on_expiry'] = self.env[ + 'ir.config_parameter'].sudo().get_param('notify_on_expiry') + return res diff --git a/all_in_one_schedule_activity_management/models/res_users.py b/all_in_one_schedule_activity_management/models/res_users.py new file mode 100644 index 0000000000..683489b33f --- /dev/null +++ b/all_in_one_schedule_activity_management/models/res_users.py @@ -0,0 +1,87 @@ +# -*- coding: utf-8 -*- +################################################################################### +# +# Cybrosys Technologies Pvt. Ltd. +# +# Copyright (C) 2024-TODAY Cybrosys Technologies() +# Author:Adarsh K() +# +# You can modify it under the terms of the GNU LESSER +# GENERAL PUBLIC LICENSE (LGPL 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 LESSER GENERAL PUBLIC LICENSE (LGPL v3) for more details. +# +# You should have received a copy of the GNU LESSER GENERAL PUBLIC LICENSE +# (LGPL v3) along with this program. +# If not, see . +# +############################################################################# +from odoo import _, api, models, modules +from collections import defaultdict + + +class Users(models.Model): + """This class is used to create tags for activity""" + _inherit = 'res.users' + + @api.model + def _get_activity_groups(self): + search_limit = int(self.env['ir.config_parameter'].sudo().get_param('mail.activity.systray.limit', 1000)) + activities = self.env["mail.activity"].search( + [("user_id", "=", self.env.uid)], order='id desc', limit=search_limit) + activities_by_record_by_model_name = defaultdict(lambda: defaultdict(lambda: self.env["mail.activity"])) + for activity in activities: + record = self.env[activity.res_model].browse(activity.res_id) + activities_by_record_by_model_name[activity.res_model][record] += activity + activities_by_model_name = defaultdict(lambda: self.env["mail.activity"]) + user_company_ids = self.env.user.company_ids.ids + is_all_user_companies_allowed = set(user_company_ids) == set(self.env.context.get('allowed_company_ids') or []) + for model_name, activities_by_record in activities_by_record_by_model_name.items(): + res_ids = [r.id for r in activities_by_record] + Model = self.env[model_name].with_context(**self.env.context) + has_model_access_right = self.env[model_name].check_access_rights('read', raise_exception=False) + if has_model_access_right: + allowed_records = Model.browse(res_ids)._filter_access_rules('read') + else: + allowed_records = self.env[model_name] + unallowed_records = Model.browse(res_ids) - allowed_records + if has_model_access_right and unallowed_records and not is_all_user_companies_allowed: + unallowed_records -= unallowed_records.with_context( + allowed_company_ids=user_company_ids)._filter_access_rules('read') + for record, activities in activities_by_record.items(): + if record in unallowed_records: + activities_by_model_name['mail.activity'] += activities + elif record in allowed_records: + activities_by_model_name[model_name] += activities + model_ids = [self.env["ir.model"]._get_id(name) for name in activities_by_model_name] + user_activities = {} + for model_name, activities in activities_by_model_name.items(): + Model = self.env[model_name] + module = Model._original_module + icon = module and modules.module.get_module_icon(module) + model = self.env["ir.model"]._get(model_name).with_prefetch(model_ids) + user_activities[model_name] = { + "id": model.id, + "name": model.name, + "model": model_name, + "type": "activity", + "icon": icon, + "total_count": 0, + "today_count": 0, + "overdue_count": 0, + "planned_count": 0, + "view_type": getattr(Model, '_systray_view', 'list'), + } + if model_name == 'mail.activity': + user_activities[model_name]['activity_ids'] = activities.ids + for activity in activities: + if activity.state != "cancel": + user_activities[model_name]["%s_count" % activity.state] += 1 + if activity.state in ("today", "overdue"): + user_activities[model_name]["total_count"] += 1 + if "mail.activity" in user_activities: + user_activities["mail.activity"]["name"] = _("Other activities") + return list(user_activities.values()) diff --git a/all_in_one_schedule_activity_management/security/all_in_one_schedule_activity_management_groups.xml b/all_in_one_schedule_activity_management/security/all_in_one_schedule_activity_management_groups.xml new file mode 100644 index 0000000000..c987c09004 --- /dev/null +++ b/all_in_one_schedule_activity_management/security/all_in_one_schedule_activity_management_groups.xml @@ -0,0 +1,7 @@ + + + + + Schedule Management User + + diff --git a/all_in_one_schedule_activity_management/security/ir.model.access.csv b/all_in_one_schedule_activity_management/security/ir.model.access.csv new file mode 100644 index 0000000000..2a23677d23 --- /dev/null +++ b/all_in_one_schedule_activity_management/security/ir.model.access.csv @@ -0,0 +1,4 @@ +id,name,model_id:id,group_id:id,perm_read,perm_write,perm_create,perm_unlink +access_activity_tag,activity.tag,model_activity_tag,base.group_user,1,1,1,1 +access_mail_access_mail_activity_all,access.mail.activity.all,model_mail_activity,,1,1,1,1 +access_mail_access_mail_activity_user,access.mail.activity.user,model_mail_activity,all_in_one_schedule_activity_management.group_schedule_management_user,1,1,1,1 diff --git a/all_in_one_schedule_activity_management/static/description/assets/cybro-icon.png b/all_in_one_schedule_activity_management/static/description/assets/cybro-icon.png new file mode 100644 index 0000000000..06e73e11de Binary files /dev/null and b/all_in_one_schedule_activity_management/static/description/assets/cybro-icon.png differ diff --git a/all_in_one_schedule_activity_management/static/description/assets/cybro-odoo.png b/all_in_one_schedule_activity_management/static/description/assets/cybro-odoo.png new file mode 100644 index 0000000000..ed02e07a48 Binary files /dev/null and b/all_in_one_schedule_activity_management/static/description/assets/cybro-odoo.png differ diff --git a/all_in_one_schedule_activity_management/static/description/assets/h2.png b/all_in_one_schedule_activity_management/static/description/assets/h2.png new file mode 100644 index 0000000000..0bfc4707d8 Binary files /dev/null and b/all_in_one_schedule_activity_management/static/description/assets/h2.png differ diff --git a/all_in_one_schedule_activity_management/static/description/assets/icons/arrows-repeat.svg b/all_in_one_schedule_activity_management/static/description/assets/icons/arrows-repeat.svg new file mode 100644 index 0000000000..1d7efabc52 --- /dev/null +++ b/all_in_one_schedule_activity_management/static/description/assets/icons/arrows-repeat.svg @@ -0,0 +1,10 @@ + + + + + + + + + + diff --git a/all_in_one_schedule_activity_management/static/description/assets/icons/banner-1.png b/all_in_one_schedule_activity_management/static/description/assets/icons/banner-1.png new file mode 100644 index 0000000000..c180db1729 Binary files /dev/null and b/all_in_one_schedule_activity_management/static/description/assets/icons/banner-1.png differ diff --git a/all_in_one_schedule_activity_management/static/description/assets/icons/banner-2.svg b/all_in_one_schedule_activity_management/static/description/assets/icons/banner-2.svg new file mode 100644 index 0000000000..e606d97d98 --- /dev/null +++ b/all_in_one_schedule_activity_management/static/description/assets/icons/banner-2.svg @@ -0,0 +1,73 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/all_in_one_schedule_activity_management/static/description/assets/icons/banner-bg.png b/all_in_one_schedule_activity_management/static/description/assets/icons/banner-bg.png new file mode 100644 index 0000000000..a8238d3c09 Binary files /dev/null and b/all_in_one_schedule_activity_management/static/description/assets/icons/banner-bg.png differ diff --git a/all_in_one_schedule_activity_management/static/description/assets/icons/banner-bg.svg b/all_in_one_schedule_activity_management/static/description/assets/icons/banner-bg.svg new file mode 100644 index 0000000000..b1378103e2 --- /dev/null +++ b/all_in_one_schedule_activity_management/static/description/assets/icons/banner-bg.svg @@ -0,0 +1,9 @@ + + + + + + + + + diff --git a/all_in_one_schedule_activity_management/static/description/assets/icons/banner-call.svg b/all_in_one_schedule_activity_management/static/description/assets/icons/banner-call.svg new file mode 100644 index 0000000000..96c687e81f --- /dev/null +++ b/all_in_one_schedule_activity_management/static/description/assets/icons/banner-call.svg @@ -0,0 +1,5 @@ + + + + + diff --git a/all_in_one_schedule_activity_management/static/description/assets/icons/banner-mail.svg b/all_in_one_schedule_activity_management/static/description/assets/icons/banner-mail.svg new file mode 100644 index 0000000000..cbf0d158d2 --- /dev/null +++ b/all_in_one_schedule_activity_management/static/description/assets/icons/banner-mail.svg @@ -0,0 +1,5 @@ + + + + + diff --git a/all_in_one_schedule_activity_management/static/description/assets/icons/banner-pattern.svg b/all_in_one_schedule_activity_management/static/description/assets/icons/banner-pattern.svg new file mode 100644 index 0000000000..9c1c7e101c --- /dev/null +++ b/all_in_one_schedule_activity_management/static/description/assets/icons/banner-pattern.svg @@ -0,0 +1,343 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/all_in_one_schedule_activity_management/static/description/assets/icons/banner-promo.svg b/all_in_one_schedule_activity_management/static/description/assets/icons/banner-promo.svg new file mode 100644 index 0000000000..d52791b11e --- /dev/null +++ b/all_in_one_schedule_activity_management/static/description/assets/icons/banner-promo.svg @@ -0,0 +1,147 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/all_in_one_schedule_activity_management/static/description/assets/icons/brand-pair.svg b/all_in_one_schedule_activity_management/static/description/assets/icons/brand-pair.svg new file mode 100644 index 0000000000..d8db7fc1e7 --- /dev/null +++ b/all_in_one_schedule_activity_management/static/description/assets/icons/brand-pair.svg @@ -0,0 +1,41 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/all_in_one_schedule_activity_management/static/description/assets/icons/check.png b/all_in_one_schedule_activity_management/static/description/assets/icons/check.png new file mode 100644 index 0000000000..c8e85f51d6 Binary files /dev/null and b/all_in_one_schedule_activity_management/static/description/assets/icons/check.png differ diff --git a/all_in_one_schedule_activity_management/static/description/assets/icons/chevron.png b/all_in_one_schedule_activity_management/static/description/assets/icons/chevron.png new file mode 100644 index 0000000000..2089293d6a Binary files /dev/null and b/all_in_one_schedule_activity_management/static/description/assets/icons/chevron.png differ diff --git a/all_in_one_schedule_activity_management/static/description/assets/icons/close-icon.svg b/all_in_one_schedule_activity_management/static/description/assets/icons/close-icon.svg new file mode 100644 index 0000000000..df8cce37a5 --- /dev/null +++ b/all_in_one_schedule_activity_management/static/description/assets/icons/close-icon.svg @@ -0,0 +1,5 @@ + + + + + diff --git a/all_in_one_schedule_activity_management/static/description/assets/icons/cogs.png b/all_in_one_schedule_activity_management/static/description/assets/icons/cogs.png new file mode 100644 index 0000000000..95d0bad62c Binary files /dev/null and b/all_in_one_schedule_activity_management/static/description/assets/icons/cogs.png differ diff --git a/all_in_one_schedule_activity_management/static/description/assets/icons/collabarate-icon.svg b/all_in_one_schedule_activity_management/static/description/assets/icons/collabarate-icon.svg new file mode 100644 index 0000000000..dd4e105183 --- /dev/null +++ b/all_in_one_schedule_activity_management/static/description/assets/icons/collabarate-icon.svg @@ -0,0 +1,3 @@ + + + diff --git a/all_in_one_schedule_activity_management/static/description/assets/icons/consultation.png b/all_in_one_schedule_activity_management/static/description/assets/icons/consultation.png new file mode 100644 index 0000000000..8319d4baa0 Binary files /dev/null and b/all_in_one_schedule_activity_management/static/description/assets/icons/consultation.png differ diff --git a/all_in_one_schedule_activity_management/static/description/assets/icons/cybro-logo.png b/all_in_one_schedule_activity_management/static/description/assets/icons/cybro-logo.png new file mode 100644 index 0000000000..ff4b782205 Binary files /dev/null and b/all_in_one_schedule_activity_management/static/description/assets/icons/cybro-logo.png differ diff --git a/all_in_one_schedule_activity_management/static/description/assets/icons/down.svg b/all_in_one_schedule_activity_management/static/description/assets/icons/down.svg new file mode 100644 index 0000000000..f21c36271b --- /dev/null +++ b/all_in_one_schedule_activity_management/static/description/assets/icons/down.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/all_in_one_schedule_activity_management/static/description/assets/icons/ecom-black.png b/all_in_one_schedule_activity_management/static/description/assets/icons/ecom-black.png new file mode 100644 index 0000000000..a9385ff13f Binary files /dev/null and b/all_in_one_schedule_activity_management/static/description/assets/icons/ecom-black.png differ diff --git a/all_in_one_schedule_activity_management/static/description/assets/icons/education-black.png b/all_in_one_schedule_activity_management/static/description/assets/icons/education-black.png new file mode 100644 index 0000000000..3eb09b27b4 Binary files /dev/null and b/all_in_one_schedule_activity_management/static/description/assets/icons/education-black.png differ diff --git a/all_in_one_schedule_activity_management/static/description/assets/icons/faq.png b/all_in_one_schedule_activity_management/static/description/assets/icons/faq.png new file mode 100644 index 0000000000..4250b5b817 Binary files /dev/null and b/all_in_one_schedule_activity_management/static/description/assets/icons/faq.png differ diff --git a/all_in_one_schedule_activity_management/static/description/assets/icons/feature-icon.svg b/all_in_one_schedule_activity_management/static/description/assets/icons/feature-icon.svg new file mode 100644 index 0000000000..fa0ea6850a --- /dev/null +++ b/all_in_one_schedule_activity_management/static/description/assets/icons/feature-icon.svg @@ -0,0 +1,10 @@ + + + + + + + + + + diff --git a/all_in_one_schedule_activity_management/static/description/assets/icons/feature.png b/all_in_one_schedule_activity_management/static/description/assets/icons/feature.png new file mode 100644 index 0000000000..ac7a785c09 Binary files /dev/null and b/all_in_one_schedule_activity_management/static/description/assets/icons/feature.png differ diff --git a/all_in_one_schedule_activity_management/static/description/assets/icons/gear.svg b/all_in_one_schedule_activity_management/static/description/assets/icons/gear.svg new file mode 100644 index 0000000000..0cc66b6ea7 --- /dev/null +++ b/all_in_one_schedule_activity_management/static/description/assets/icons/gear.svg @@ -0,0 +1,10 @@ + + + + + + + + + + diff --git a/all_in_one_schedule_activity_management/static/description/assets/icons/hero.gif b/all_in_one_schedule_activity_management/static/description/assets/icons/hero.gif new file mode 100644 index 0000000000..b161c8ed3a Binary files /dev/null and b/all_in_one_schedule_activity_management/static/description/assets/icons/hero.gif differ diff --git a/all_in_one_schedule_activity_management/static/description/assets/icons/hire-odoo.svg b/all_in_one_schedule_activity_management/static/description/assets/icons/hire-odoo.svg new file mode 100644 index 0000000000..e1ac089b04 --- /dev/null +++ b/all_in_one_schedule_activity_management/static/description/assets/icons/hire-odoo.svg @@ -0,0 +1,12 @@ + + + + + + + + + + + + diff --git a/all_in_one_schedule_activity_management/static/description/assets/icons/hotel-black.png b/all_in_one_schedule_activity_management/static/description/assets/icons/hotel-black.png new file mode 100644 index 0000000000..130f613be0 Binary files /dev/null and b/all_in_one_schedule_activity_management/static/description/assets/icons/hotel-black.png differ diff --git a/all_in_one_schedule_activity_management/static/description/assets/icons/license.png b/all_in_one_schedule_activity_management/static/description/assets/icons/license.png new file mode 100644 index 0000000000..a5869797ec Binary files /dev/null and b/all_in_one_schedule_activity_management/static/description/assets/icons/license.png differ diff --git a/all_in_one_schedule_activity_management/static/description/assets/icons/life-ring-icon.svg b/all_in_one_schedule_activity_management/static/description/assets/icons/life-ring-icon.svg new file mode 100644 index 0000000000..3ae6e1d896 --- /dev/null +++ b/all_in_one_schedule_activity_management/static/description/assets/icons/life-ring-icon.svg @@ -0,0 +1,13 @@ + + + + + + + + + + + + + diff --git a/all_in_one_schedule_activity_management/static/description/assets/icons/lifebuoy.png b/all_in_one_schedule_activity_management/static/description/assets/icons/lifebuoy.png new file mode 100644 index 0000000000..658d56cccf Binary files /dev/null and b/all_in_one_schedule_activity_management/static/description/assets/icons/lifebuoy.png differ diff --git a/all_in_one_schedule_activity_management/static/description/assets/icons/mail.svg b/all_in_one_schedule_activity_management/static/description/assets/icons/mail.svg new file mode 100644 index 0000000000..1eedde695b --- /dev/null +++ b/all_in_one_schedule_activity_management/static/description/assets/icons/mail.svg @@ -0,0 +1,3 @@ + + + diff --git a/all_in_one_schedule_activity_management/static/description/assets/icons/manufacturing-black.png b/all_in_one_schedule_activity_management/static/description/assets/icons/manufacturing-black.png new file mode 100644 index 0000000000..697eb0e9f2 Binary files /dev/null and b/all_in_one_schedule_activity_management/static/description/assets/icons/manufacturing-black.png differ diff --git a/all_in_one_schedule_activity_management/static/description/assets/icons/notes.png b/all_in_one_schedule_activity_management/static/description/assets/icons/notes.png new file mode 100644 index 0000000000..ee5e954047 Binary files /dev/null and b/all_in_one_schedule_activity_management/static/description/assets/icons/notes.png differ diff --git a/all_in_one_schedule_activity_management/static/description/assets/icons/notification icon.svg b/all_in_one_schedule_activity_management/static/description/assets/icons/notification icon.svg new file mode 100644 index 0000000000..0531899736 --- /dev/null +++ b/all_in_one_schedule_activity_management/static/description/assets/icons/notification icon.svg @@ -0,0 +1,10 @@ + + + + + + + + + + diff --git a/all_in_one_schedule_activity_management/static/description/assets/icons/odoo-consultancy.svg b/all_in_one_schedule_activity_management/static/description/assets/icons/odoo-consultancy.svg new file mode 100644 index 0000000000..e05f65bde4 --- /dev/null +++ b/all_in_one_schedule_activity_management/static/description/assets/icons/odoo-consultancy.svg @@ -0,0 +1,4 @@ + + + + diff --git a/all_in_one_schedule_activity_management/static/description/assets/icons/odoo-licencing.svg b/all_in_one_schedule_activity_management/static/description/assets/icons/odoo-licencing.svg new file mode 100644 index 0000000000..2606c88b04 --- /dev/null +++ b/all_in_one_schedule_activity_management/static/description/assets/icons/odoo-licencing.svg @@ -0,0 +1,3 @@ + + + diff --git a/all_in_one_schedule_activity_management/static/description/assets/icons/odoo-logo.png b/all_in_one_schedule_activity_management/static/description/assets/icons/odoo-logo.png new file mode 100644 index 0000000000..0e4d0eb5a4 Binary files /dev/null and b/all_in_one_schedule_activity_management/static/description/assets/icons/odoo-logo.png differ diff --git a/all_in_one_schedule_activity_management/static/description/assets/icons/patter.svg b/all_in_one_schedule_activity_management/static/description/assets/icons/patter.svg new file mode 100644 index 0000000000..25c9c0a8f1 --- /dev/null +++ b/all_in_one_schedule_activity_management/static/description/assets/icons/patter.svg @@ -0,0 +1,9 @@ + + + + + + + + + diff --git a/all_in_one_schedule_activity_management/static/description/assets/icons/pattern1.png b/all_in_one_schedule_activity_management/static/description/assets/icons/pattern1.png new file mode 100644 index 0000000000..09ab0fb2d9 Binary files /dev/null and b/all_in_one_schedule_activity_management/static/description/assets/icons/pattern1.png differ diff --git a/all_in_one_schedule_activity_management/static/description/assets/icons/pos-black.png b/all_in_one_schedule_activity_management/static/description/assets/icons/pos-black.png new file mode 100644 index 0000000000..97c0f90c10 Binary files /dev/null and b/all_in_one_schedule_activity_management/static/description/assets/icons/pos-black.png differ diff --git a/all_in_one_schedule_activity_management/static/description/assets/icons/puzzle-piece-icon.svg b/all_in_one_schedule_activity_management/static/description/assets/icons/puzzle-piece-icon.svg new file mode 100644 index 0000000000..3e9ad93738 --- /dev/null +++ b/all_in_one_schedule_activity_management/static/description/assets/icons/puzzle-piece-icon.svg @@ -0,0 +1,10 @@ + + + + + + + + + + diff --git a/all_in_one_schedule_activity_management/static/description/assets/icons/puzzle.png b/all_in_one_schedule_activity_management/static/description/assets/icons/puzzle.png new file mode 100644 index 0000000000..65cf854e7e Binary files /dev/null and b/all_in_one_schedule_activity_management/static/description/assets/icons/puzzle.png differ diff --git a/all_in_one_schedule_activity_management/static/description/assets/icons/replace-icon.svg b/all_in_one_schedule_activity_management/static/description/assets/icons/replace-icon.svg new file mode 100644 index 0000000000..d0e3a7af1a --- /dev/null +++ b/all_in_one_schedule_activity_management/static/description/assets/icons/replace-icon.svg @@ -0,0 +1,10 @@ + + + + + + + + + + diff --git a/all_in_one_schedule_activity_management/static/description/assets/icons/restaurant-black.png b/all_in_one_schedule_activity_management/static/description/assets/icons/restaurant-black.png new file mode 100644 index 0000000000..4a35eb939c Binary files /dev/null and b/all_in_one_schedule_activity_management/static/description/assets/icons/restaurant-black.png differ diff --git a/all_in_one_schedule_activity_management/static/description/assets/icons/screenshot-main.png b/all_in_one_schedule_activity_management/static/description/assets/icons/screenshot-main.png new file mode 100644 index 0000000000..575f8e676b Binary files /dev/null and b/all_in_one_schedule_activity_management/static/description/assets/icons/screenshot-main.png differ diff --git a/all_in_one_schedule_activity_management/static/description/assets/icons/screenshot.png b/all_in_one_schedule_activity_management/static/description/assets/icons/screenshot.png new file mode 100644 index 0000000000..cef272529d Binary files /dev/null and b/all_in_one_schedule_activity_management/static/description/assets/icons/screenshot.png differ diff --git a/all_in_one_schedule_activity_management/static/description/assets/icons/service-black.png b/all_in_one_schedule_activity_management/static/description/assets/icons/service-black.png new file mode 100644 index 0000000000..301ab51cb1 Binary files /dev/null and b/all_in_one_schedule_activity_management/static/description/assets/icons/service-black.png differ diff --git a/all_in_one_schedule_activity_management/static/description/assets/icons/skype-fill.svg b/all_in_one_schedule_activity_management/static/description/assets/icons/skype-fill.svg new file mode 100644 index 0000000000..c174236393 --- /dev/null +++ b/all_in_one_schedule_activity_management/static/description/assets/icons/skype-fill.svg @@ -0,0 +1,10 @@ + + + + + + + + + + diff --git a/all_in_one_schedule_activity_management/static/description/assets/icons/skype.png b/all_in_one_schedule_activity_management/static/description/assets/icons/skype.png new file mode 100644 index 0000000000..51b409fb3f Binary files /dev/null and b/all_in_one_schedule_activity_management/static/description/assets/icons/skype.png differ diff --git a/all_in_one_schedule_activity_management/static/description/assets/icons/skype.svg b/all_in_one_schedule_activity_management/static/description/assets/icons/skype.svg new file mode 100644 index 0000000000..df3dad39b5 --- /dev/null +++ b/all_in_one_schedule_activity_management/static/description/assets/icons/skype.svg @@ -0,0 +1,3 @@ + + + diff --git a/all_in_one_schedule_activity_management/static/description/assets/icons/star-1.svg b/all_in_one_schedule_activity_management/static/description/assets/icons/star-1.svg new file mode 100644 index 0000000000..7e55ab162e --- /dev/null +++ b/all_in_one_schedule_activity_management/static/description/assets/icons/star-1.svg @@ -0,0 +1,53 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/all_in_one_schedule_activity_management/static/description/assets/icons/star-2.svg b/all_in_one_schedule_activity_management/static/description/assets/icons/star-2.svg new file mode 100644 index 0000000000..5ae9f507a1 --- /dev/null +++ b/all_in_one_schedule_activity_management/static/description/assets/icons/star-2.svg @@ -0,0 +1,9 @@ + + + + + + + + + diff --git a/all_in_one_schedule_activity_management/static/description/assets/icons/support.png b/all_in_one_schedule_activity_management/static/description/assets/icons/support.png new file mode 100644 index 0000000000..4f18b8b820 Binary files /dev/null and b/all_in_one_schedule_activity_management/static/description/assets/icons/support.png differ diff --git a/all_in_one_schedule_activity_management/static/description/assets/icons/test-1 - Copy.png b/all_in_one_schedule_activity_management/static/description/assets/icons/test-1 - Copy.png new file mode 100644 index 0000000000..f6a9026637 Binary files /dev/null and b/all_in_one_schedule_activity_management/static/description/assets/icons/test-1 - Copy.png differ diff --git a/all_in_one_schedule_activity_management/static/description/assets/icons/test-1.png b/all_in_one_schedule_activity_management/static/description/assets/icons/test-1.png new file mode 100644 index 0000000000..0908add2b0 Binary files /dev/null and b/all_in_one_schedule_activity_management/static/description/assets/icons/test-1.png differ diff --git a/all_in_one_schedule_activity_management/static/description/assets/icons/test-2.png b/all_in_one_schedule_activity_management/static/description/assets/icons/test-2.png new file mode 100644 index 0000000000..4671fe91e9 Binary files /dev/null and b/all_in_one_schedule_activity_management/static/description/assets/icons/test-2.png differ diff --git a/all_in_one_schedule_activity_management/static/description/assets/icons/trading-black.png b/all_in_one_schedule_activity_management/static/description/assets/icons/trading-black.png new file mode 100644 index 0000000000..9398ba2f1a Binary files /dev/null and b/all_in_one_schedule_activity_management/static/description/assets/icons/trading-black.png differ diff --git a/all_in_one_schedule_activity_management/static/description/assets/icons/training.png b/all_in_one_schedule_activity_management/static/description/assets/icons/training.png new file mode 100644 index 0000000000..884ca024d7 Binary files /dev/null and b/all_in_one_schedule_activity_management/static/description/assets/icons/training.png differ diff --git a/all_in_one_schedule_activity_management/static/description/assets/icons/translate.svg b/all_in_one_schedule_activity_management/static/description/assets/icons/translate.svg new file mode 100644 index 0000000000..af9c8a1aa8 --- /dev/null +++ b/all_in_one_schedule_activity_management/static/description/assets/icons/translate.svg @@ -0,0 +1,10 @@ + + + + + + + + + + diff --git a/all_in_one_schedule_activity_management/static/description/assets/icons/update.png b/all_in_one_schedule_activity_management/static/description/assets/icons/update.png new file mode 100644 index 0000000000..ecbc5a01a2 Binary files /dev/null and b/all_in_one_schedule_activity_management/static/description/assets/icons/update.png differ diff --git a/all_in_one_schedule_activity_management/static/description/assets/icons/user.png b/all_in_one_schedule_activity_management/static/description/assets/icons/user.png new file mode 100644 index 0000000000..6ffb23d9f0 Binary files /dev/null and b/all_in_one_schedule_activity_management/static/description/assets/icons/user.png differ diff --git a/all_in_one_schedule_activity_management/static/description/assets/icons/video.png b/all_in_one_schedule_activity_management/static/description/assets/icons/video.png new file mode 100644 index 0000000000..576705b172 Binary files /dev/null and b/all_in_one_schedule_activity_management/static/description/assets/icons/video.png differ diff --git a/all_in_one_schedule_activity_management/static/description/assets/icons/whatsapp.png b/all_in_one_schedule_activity_management/static/description/assets/icons/whatsapp.png new file mode 100644 index 0000000000..d513a5356b Binary files /dev/null and b/all_in_one_schedule_activity_management/static/description/assets/icons/whatsapp.png differ diff --git a/all_in_one_schedule_activity_management/static/description/assets/icons/wrench-icon.svg b/all_in_one_schedule_activity_management/static/description/assets/icons/wrench-icon.svg new file mode 100644 index 0000000000..174b5a465e --- /dev/null +++ b/all_in_one_schedule_activity_management/static/description/assets/icons/wrench-icon.svg @@ -0,0 +1,10 @@ + + + + + + + + + + diff --git a/all_in_one_schedule_activity_management/static/description/assets/icons/wrench.png b/all_in_one_schedule_activity_management/static/description/assets/icons/wrench.png new file mode 100644 index 0000000000..6c04dea0f4 Binary files /dev/null and b/all_in_one_schedule_activity_management/static/description/assets/icons/wrench.png differ diff --git a/all_in_one_schedule_activity_management/static/description/assets/modules/1.jpg b/all_in_one_schedule_activity_management/static/description/assets/modules/1.jpg new file mode 100644 index 0000000000..3cb15fe019 Binary files /dev/null and b/all_in_one_schedule_activity_management/static/description/assets/modules/1.jpg differ diff --git a/all_in_one_schedule_activity_management/static/description/assets/modules/2.jpg b/all_in_one_schedule_activity_management/static/description/assets/modules/2.jpg new file mode 100644 index 0000000000..662cadcc3a Binary files /dev/null and b/all_in_one_schedule_activity_management/static/description/assets/modules/2.jpg differ diff --git a/all_in_one_schedule_activity_management/static/description/assets/modules/3.jpg b/all_in_one_schedule_activity_management/static/description/assets/modules/3.jpg new file mode 100644 index 0000000000..717a004430 Binary files /dev/null and b/all_in_one_schedule_activity_management/static/description/assets/modules/3.jpg differ diff --git a/all_in_one_schedule_activity_management/static/description/assets/modules/4.png b/all_in_one_schedule_activity_management/static/description/assets/modules/4.png new file mode 100644 index 0000000000..00ebf54ad7 Binary files /dev/null and b/all_in_one_schedule_activity_management/static/description/assets/modules/4.png differ diff --git a/all_in_one_schedule_activity_management/static/description/assets/modules/5.jpg b/all_in_one_schedule_activity_management/static/description/assets/modules/5.jpg new file mode 100644 index 0000000000..7c67e2eec0 Binary files /dev/null and b/all_in_one_schedule_activity_management/static/description/assets/modules/5.jpg differ diff --git a/all_in_one_schedule_activity_management/static/description/assets/modules/6.gif b/all_in_one_schedule_activity_management/static/description/assets/modules/6.gif new file mode 100644 index 0000000000..a35ece8dff Binary files /dev/null and b/all_in_one_schedule_activity_management/static/description/assets/modules/6.gif differ diff --git a/all_in_one_schedule_activity_management/static/description/assets/screenshots/ss1.png b/all_in_one_schedule_activity_management/static/description/assets/screenshots/ss1.png new file mode 100644 index 0000000000..55d5e48a6d Binary files /dev/null and b/all_in_one_schedule_activity_management/static/description/assets/screenshots/ss1.png differ diff --git a/all_in_one_schedule_activity_management/static/description/assets/screenshots/ss10.png b/all_in_one_schedule_activity_management/static/description/assets/screenshots/ss10.png new file mode 100644 index 0000000000..2990c137fc Binary files /dev/null and b/all_in_one_schedule_activity_management/static/description/assets/screenshots/ss10.png differ diff --git a/all_in_one_schedule_activity_management/static/description/assets/screenshots/ss11.png b/all_in_one_schedule_activity_management/static/description/assets/screenshots/ss11.png new file mode 100644 index 0000000000..c28635405f Binary files /dev/null and b/all_in_one_schedule_activity_management/static/description/assets/screenshots/ss11.png differ diff --git a/all_in_one_schedule_activity_management/static/description/assets/screenshots/ss12.png b/all_in_one_schedule_activity_management/static/description/assets/screenshots/ss12.png new file mode 100644 index 0000000000..8af8009aae Binary files /dev/null and b/all_in_one_schedule_activity_management/static/description/assets/screenshots/ss12.png differ diff --git a/all_in_one_schedule_activity_management/static/description/assets/screenshots/ss13.png b/all_in_one_schedule_activity_management/static/description/assets/screenshots/ss13.png new file mode 100644 index 0000000000..6a76e555b4 Binary files /dev/null and b/all_in_one_schedule_activity_management/static/description/assets/screenshots/ss13.png differ diff --git a/all_in_one_schedule_activity_management/static/description/assets/screenshots/ss14.png b/all_in_one_schedule_activity_management/static/description/assets/screenshots/ss14.png new file mode 100644 index 0000000000..62623e7828 Binary files /dev/null and b/all_in_one_schedule_activity_management/static/description/assets/screenshots/ss14.png differ diff --git a/all_in_one_schedule_activity_management/static/description/assets/screenshots/ss15.png b/all_in_one_schedule_activity_management/static/description/assets/screenshots/ss15.png new file mode 100644 index 0000000000..f32f48b9f2 Binary files /dev/null and b/all_in_one_schedule_activity_management/static/description/assets/screenshots/ss15.png differ diff --git a/all_in_one_schedule_activity_management/static/description/assets/screenshots/ss16.png b/all_in_one_schedule_activity_management/static/description/assets/screenshots/ss16.png new file mode 100644 index 0000000000..494a64b073 Binary files /dev/null and b/all_in_one_schedule_activity_management/static/description/assets/screenshots/ss16.png differ diff --git a/all_in_one_schedule_activity_management/static/description/assets/screenshots/ss17.png b/all_in_one_schedule_activity_management/static/description/assets/screenshots/ss17.png new file mode 100644 index 0000000000..4f7c38ec3d Binary files /dev/null and b/all_in_one_schedule_activity_management/static/description/assets/screenshots/ss17.png differ diff --git a/all_in_one_schedule_activity_management/static/description/assets/screenshots/ss18.png b/all_in_one_schedule_activity_management/static/description/assets/screenshots/ss18.png new file mode 100644 index 0000000000..a6c0b3e56f Binary files /dev/null and b/all_in_one_schedule_activity_management/static/description/assets/screenshots/ss18.png differ diff --git a/all_in_one_schedule_activity_management/static/description/assets/screenshots/ss19.png b/all_in_one_schedule_activity_management/static/description/assets/screenshots/ss19.png new file mode 100644 index 0000000000..dc0ad55ef8 Binary files /dev/null and b/all_in_one_schedule_activity_management/static/description/assets/screenshots/ss19.png differ diff --git a/all_in_one_schedule_activity_management/static/description/assets/screenshots/ss2.png b/all_in_one_schedule_activity_management/static/description/assets/screenshots/ss2.png new file mode 100644 index 0000000000..562101872f Binary files /dev/null and b/all_in_one_schedule_activity_management/static/description/assets/screenshots/ss2.png differ diff --git a/all_in_one_schedule_activity_management/static/description/assets/screenshots/ss20.png b/all_in_one_schedule_activity_management/static/description/assets/screenshots/ss20.png new file mode 100644 index 0000000000..c452c7e284 Binary files /dev/null and b/all_in_one_schedule_activity_management/static/description/assets/screenshots/ss20.png differ diff --git a/all_in_one_schedule_activity_management/static/description/assets/screenshots/ss21.png b/all_in_one_schedule_activity_management/static/description/assets/screenshots/ss21.png new file mode 100644 index 0000000000..b7293659d0 Binary files /dev/null and b/all_in_one_schedule_activity_management/static/description/assets/screenshots/ss21.png differ diff --git a/all_in_one_schedule_activity_management/static/description/assets/screenshots/ss22.png b/all_in_one_schedule_activity_management/static/description/assets/screenshots/ss22.png new file mode 100644 index 0000000000..739f6f1366 Binary files /dev/null and b/all_in_one_schedule_activity_management/static/description/assets/screenshots/ss22.png differ diff --git a/all_in_one_schedule_activity_management/static/description/assets/screenshots/ss23.png b/all_in_one_schedule_activity_management/static/description/assets/screenshots/ss23.png new file mode 100644 index 0000000000..95815f8d78 Binary files /dev/null and b/all_in_one_schedule_activity_management/static/description/assets/screenshots/ss23.png differ diff --git a/all_in_one_schedule_activity_management/static/description/assets/screenshots/ss3.png b/all_in_one_schedule_activity_management/static/description/assets/screenshots/ss3.png new file mode 100644 index 0000000000..c95e891f15 Binary files /dev/null and b/all_in_one_schedule_activity_management/static/description/assets/screenshots/ss3.png differ diff --git a/all_in_one_schedule_activity_management/static/description/assets/screenshots/ss4.png b/all_in_one_schedule_activity_management/static/description/assets/screenshots/ss4.png new file mode 100644 index 0000000000..a4d81ace74 Binary files /dev/null and b/all_in_one_schedule_activity_management/static/description/assets/screenshots/ss4.png differ diff --git a/all_in_one_schedule_activity_management/static/description/assets/screenshots/ss5.png b/all_in_one_schedule_activity_management/static/description/assets/screenshots/ss5.png new file mode 100644 index 0000000000..d8ba6bc108 Binary files /dev/null and b/all_in_one_schedule_activity_management/static/description/assets/screenshots/ss5.png differ diff --git a/all_in_one_schedule_activity_management/static/description/assets/screenshots/ss6.png b/all_in_one_schedule_activity_management/static/description/assets/screenshots/ss6.png new file mode 100644 index 0000000000..c0cea87939 Binary files /dev/null and b/all_in_one_schedule_activity_management/static/description/assets/screenshots/ss6.png differ diff --git a/all_in_one_schedule_activity_management/static/description/assets/screenshots/ss7.png b/all_in_one_schedule_activity_management/static/description/assets/screenshots/ss7.png new file mode 100644 index 0000000000..6e0cf2727c Binary files /dev/null and b/all_in_one_schedule_activity_management/static/description/assets/screenshots/ss7.png differ diff --git a/all_in_one_schedule_activity_management/static/description/assets/screenshots/ss8.png b/all_in_one_schedule_activity_management/static/description/assets/screenshots/ss8.png new file mode 100644 index 0000000000..91bc816d2d Binary files /dev/null and b/all_in_one_schedule_activity_management/static/description/assets/screenshots/ss8.png differ diff --git a/all_in_one_schedule_activity_management/static/description/assets/screenshots/ss9.png b/all_in_one_schedule_activity_management/static/description/assets/screenshots/ss9.png new file mode 100644 index 0000000000..0b8593dbd2 Binary files /dev/null and b/all_in_one_schedule_activity_management/static/description/assets/screenshots/ss9.png differ diff --git a/all_in_one_schedule_activity_management/static/description/assets/y18.jpg b/all_in_one_schedule_activity_management/static/description/assets/y18.jpg new file mode 100644 index 0000000000..eea1714f25 Binary files /dev/null and b/all_in_one_schedule_activity_management/static/description/assets/y18.jpg differ diff --git a/all_in_one_schedule_activity_management/static/description/banner.jpg b/all_in_one_schedule_activity_management/static/description/banner.jpg new file mode 100644 index 0000000000..23a54fe6b2 Binary files /dev/null and b/all_in_one_schedule_activity_management/static/description/banner.jpg differ diff --git a/all_in_one_schedule_activity_management/static/description/icon.png b/all_in_one_schedule_activity_management/static/description/icon.png new file mode 100644 index 0000000000..95a1d425fb Binary files /dev/null and b/all_in_one_schedule_activity_management/static/description/icon.png differ diff --git a/all_in_one_schedule_activity_management/static/description/index.html b/all_in_one_schedule_activity_management/static/description/index.html new file mode 100644 index 0000000000..0ed31af40e --- /dev/null +++ b/all_in_one_schedule_activity_management/static/description/index.html @@ -0,0 +1,1359 @@ + + + + + + All in one schedule Activity Management + + + + + + + + + + +
+
+ + + +
+
+ Community +
+
+ Enterprise +
+ + + + +
+
+ +
+
+
+
+

+ Manage all the scheduled activities. +

+

All in one schedule Activity Management +

+
+
+ +
+ +
+ +
+
+
+ +
+
+ +
+
+ +
+
+
+

Key + Highlights

+
+
+
+
+ +
+
+ Schedule Management User +
+

+ Set Schedule management users .

+
+
+
+
+
+ +
+
+ All in one schedule Activity Management +
+

+ This module helps to handle all the activities. +

+
+
+
+
+ +
+
+
+ All in one schedule Activity Management +

+ Are you ready to make your business more + organized? +
Improve now! +

+ +
+
+ +
+
+
+ + + + +
+
+ +
+
+
+
+ acc_bg +
+ +
+
+
+
+

+ Set + + Schedule Management User. +

+
+
+

+ "In the settings menu, under 'User,' you'll find the option 'Schedule Management User.' Enabling it grants the user the role of schedule manager, allowing them to view and manage all activities". +

+
+
+
+ +
+
+
+
+
+
+
+
+
+

+ If the user is a schedule manager, they can view and access the activity management module. +

+
+
+
+ +
+
+
+
+
+
+
+
+
+
+ +
+
+
+
+
+
+
+
+
+

+ On clicking the button "Activities", a popup appears where we can create and schedule activities. +

+
+
+
+ +
+
+
+
+
+
+
+
+
+

+ Created activities visible on the corresponding record. +

+
+
+
+ +
+
+
+
+
+
+
+
+
+

+ all activity + card. + +

+
+
+

+ "Activity dashboard displays count of the total activities.". +

+
+
+
+ +
+
+
+
+
+
+
+
+
+

+ All activity list.While clicking on the dashboard all activity card it will redirect to all activity window. +

+
+
+
+ +
+
+
+
+
+
+
+
+
+

+ Planned Activity + card. + +

+
+
+

+ Activity dashboard displays count of the planned activities. +

+
+
+
+ +
+
+
+
+
+
+
+
+
+

+ While clicking on the dashboard planned activity card it will redirect to planned activity window. +

+
+
+
+ +
+
+
+
+
+
+
+
+
+

+ Planned activity and their details. +

+
+
+
+ +
+
+
+
+
+
+
+
+
+

+ Menu for + + All Activity +

+
+
+
+ +
+
+
+
+
+
+
+
+
+

+ Menu for + + My Activity +

+
+
+
+ +
+
+
+
+
+
+
+
+
+

+ Menu for + + Activity Tags. +

+
+
+
+ +
+
+
+
+
+
+
+
+
+

+ Menu for + + Activity Reporting +

+
+
+
+ +
+
+
+
+
+
+
+
+
+

+ Menu for + + Activity History +

+
+
+
+ +
+
+
+
+
+
+
+
+
+

+ Filter for + + Late activities +

+
+
+
+ +
+
+
+
+
+
+
+
+
+

+ Filter for + + Today activities +

+
+
+
+ +
+
+
+
+
+
+
+
+
+

+ Filter for + + Future activities +

+
+
+
+ +
+
+
+
+
+
+
+
+
+

+ Filter for + + My activities +

+
+
+
+ +
+
+
+
+
+
+
+
+
+

+ Filter for next 7 days, next 30 days, next 365 days, last 7 days, last 30 days and last 365 days. +

+
+
+
+ +
+
+
+
+
+
+
+
+
+

+ We can cancel the activity. +

+
+
+
+ +
+
+
+
+
+
+
+
+
+

+ Notify on + + Due date +

+
+
+

+ From the settings enable Notify on due date , once the due date is reached, the customer will receive an email. +

+
+
+
+ +
+
+
+
+
+
+
+
+
+

+ Notify on + + Expiry date. +

+
+
+

+ From the settings enable Notify on expiry, once the due date is expired, the customer will receive an email. +

+
+
+
+ +
+
+
+
+
+
+
+
+ +
+
+
+
+ +
+

+ Manage all the activities.

+
+
+
+
+
+
+
+ +
+

+ Available in Odoo 18.0 Community and Enterprise. +

+
+
+
+
+
+
+
+
+
+
+ +
+ +
+ +
+

+ In the settings menu, under the 'User' section, you will find the option 'Schedule Management User.' Enabling this option grants the user the role of schedule manager, allowing them to view and manage all activities across the system. +

+
+
+ +
+ +
+

+ Yes, you can use the Late Activities filter to view all activities that are past their due date. This helps in identifying tasks that require immediate attention. +

+
+
+
+ +
+
+
+
+
+
+ +
+
+

+ Latest Release 18.0.1.0.0 +

+ + 6th May, 2025 + +
+
+
+
+
+ Add +
+
+
+
    +
  • + Initial Commit +
  • + +
+
+
+
+
+
+
+
+
+
+ + +
+

+ Related Products +

+ +
+ + + +
+

+ Our Services

+ +
+ +
+
+ .... +
+
+ +
+ + +
+
+ + + + + + diff --git a/all_in_one_schedule_activity_management/static/src/css/dashboard.css b/all_in_one_schedule_activity_management/static/src/css/dashboard.css new file mode 100644 index 0000000000..335e5831e9 --- /dev/null +++ b/all_in_one_schedule_activity_management/static/src/css/dashboard.css @@ -0,0 +1,34 @@ +p, span, a, ul, li, button { + font-size: inherit; + font-weight: inherit; + line-height: inherit; +} + +strong { + font-weight: 600; +} + +h1, h2, h3, h4, h5, h6 { + line-height: 1.5em; + font-weight: 300; +} + +strong { + font-weight: 400; +} + +.sub_title { + font-size: 14px; +} + +.sub_title div span { + font-weight: 600; +} + +.chart #canvas_graph { + height: 400px !important; +} + +.highcharts-background { + fill: none; +} \ No newline at end of file diff --git a/all_in_one_schedule_activity_management/static/src/css/material-gauge.css b/all_in_one_schedule_activity_management/static/src/css/material-gauge.css new file mode 100644 index 0000000000..7f553df9a4 --- /dev/null +++ b/all_in_one_schedule_activity_management/static/src/css/material-gauge.css @@ -0,0 +1,194 @@ +/* + * #### Gauge Component + * + * The standard markup for the component is: + * + *
+ *
+ *
+ *
+ *
+ *
+ *
+ *
+ *
+ * No + * + * Yes + *
+ *
+ */ + +/* + * First define all of the relevant rules that aren't dependent + * on the size of the gauge. We want to collect the size-depenent + * rules in one place to make it easier to adjust the size. + */ + +.gauge { + position: relative; +} + +.gauge__container { + margin: 0; + padding: 0; + position: absolute; + left: 50%; + overflow: hidden; + text-align: center; + -webkit-transform: translateX(-50%); + -moz-transform: translateX(-50%); + -ms-transform: translateX(-50%); + -o-transform: translateX(-50%); + transform: translateX(-50%); +} + +.gauge__background { + z-index: 0; + position: absolute; + background-color: #d8f0de; + top: 0; + border-radius: 300px 300px 0 0; +} + +.gauge__data { + z-index: 1; + position: absolute; + background-color: #00c29d; + margin-left: auto; + margin-right: auto; + border-radius: 300px 300px 0 0; + -webkit-transform-origin: center bottom; + -moz-transform-origin: center bottom; + -ms-transform-origin: center bottom; + -o-transform-origin: center bottom; + transform-origin: center bottom; +} + +.gauge__center { + z-index: 2; + position: absolute; + background-color: #f9f9f9; + margin-right: auto; + border-radius: 300px 300px 0 0; +} + +.gauge__marker { + z-index: 3; + background-color: #fff; + position: absolute; + width: 1px; +} + +.gauge__needle { + z-index: 4; + background-color: #21242c; + height: 3px; + position: absolute; + -webkit-transform-origin: left center; + -moz-transform-origin: left center; + -ms-transform-origin: left center; + -o-transform-origin: left center; + transform-origin: left center; +} + +.gauge__labels { + display: table; + margin: 0 auto; + position: relative; +} + +.gauge__label--low { + display: table-cell; + text-align: center; + color: #00c29d; +} + +.gauge__label--spacer { + display: table-cell; +} + +.gauge__label--high { + display: table-cell; + text-align: center; + color: #979f99; +} + +/* + * Now define the rules that depend on the size of + * the gauge. We start with sizing for a small mobile + * device. + */ + +.gauge { height: calc(120px + 3em); } +.gauge__container { width: 240px; height: 120px; } +.gauge__marker { height: 120px; left: 119.5px; } +.gauge__background { width: 240px; height: 120px; } +.gauge__center { width: 144px; height: 72px; top: 48px; margin-left: 48px; } +.gauge__data { width: 240px; height: 120px; } +.gauge__needle { left: 120px; top: 117px; width: 120px; } +.gauge__labels { top: 120px; width: 240px; } +.gauge__label--low { width: 48px; } +.gauge__label--spacer { width: 144px; } +.gauge__label--high { width: 48px; } + +/* + * Increase the gauge size slightly on larger viewports. + */ + + @media only screen and (min-width: 400px) { + .gauge { height: calc(150px + 3em); } + .gauge__container { width: 300px; height: 150px; } + .gauge__marker { height: 150px; left: 149.5px; } + .gauge__background { width: 300px; height: 150px; } + .gauge__center { width: 180px; height: 90px; top: 60px; margin-left: 60px; } + .gauge__data { width: 300px; height: 150px; } + .gauge__needle { left: 150px; top: 147px; width: 150px; } + .gauge__labels { top: 160px; width: 300px; font-size: 20px;} + .gauge__label--low { width: 60px; } + .gauge__label--spacer { width: 180px; } + .gauge__label--high { width: 60px; } +} + +/* + * As an option, the `gauge--liveupdate` class can be added + * to the main gauge element. When this class is present, + * we add a transition that animates any changes to the gauge + * value. Currently, the app does not use this option because + * all the inputs that can change gauge values are present + * on tab panels that are different from the gauge itself. + * Therefore, users won't be able to see any gauge changes + * when they make input changes. The code is available, though, + * should this change. + */ + +.gauge--liveupdate .gauge__data, +.gauge--liveupdate .gauge__needle { + -webkit-transition: all 1s ease-in-out; + -moz-transition: all 1s ease-in-out; + -ms-transition: all 1s ease-in-out; + -o-transition: all 1s ease-in-out; + transition: all 1s ease-in-out; +} + +/* + * For a given gauge value, x, ranging from 0.0 to 1.0, set + * the `transform: rotate()` property according to the + * following equation: `-0.5 + 0.5x turns` The default + * properties below represent an x value of 0. + */ + +.gauge__data { + -webkit-transform: rotate(-.50turn); + -moz-transform: rotate(-.50turn); + -ms-transform: rotate(-.50turn); + -o-transform: rotate(-.50turn); + transform: rotate(-.50turn); +} +.gauge__needle { + -webkit-transform: rotate(-.50turn); + -moz-transform: rotate(-.50turn); + -ms-transform: rotate(-.50turn); + -o-transform: rotate(-.50turn); + transform: rotate(-.50turn); +} diff --git a/all_in_one_schedule_activity_management/static/src/css/style.scss b/all_in_one_schedule_activity_management/static/src/css/style.scss new file mode 100644 index 0000000000..d861d3e661 --- /dev/null +++ b/all_in_one_schedule_activity_management/static/src/css/style.scss @@ -0,0 +1,64 @@ +.o_action_manager { + direction: ltr; + webkit-box-flex: 1; + webkit-flex: 1 1 auto; + flex: 1 1 auto; + overflow: scroll !important; +} +.activity-dashboard-card { + border-radius: 0.3rem; + display: flex; + justify-content: center; + padding: 1.7rem 1.5rem 1.5rem 1.5rem; + margin: 1rem auto; + height: 100px; +} +.activity-dashboard-card__icon-container { + height: 50px; + width: 50px; + border-radius: 50%; +} +.my_activity { + background-color: #229db9; + border-radius: 10px; + font-size: 35px; +} +.all_activity{ + background: #88dfdf; + border-radius: 10px; + font-size: 35px; +} +.planned_activity { + background-color: #e8c5ac; + border-radius: 10px; + font-size: 35px; +} +.completed_activity{ + background: #a7a1f4;; + border-radius: 10px; + font-size: 35px; +} + +.today_activity{ + background: #f3bdf4; + border-radius: 10px; + font-size: 35px; +} +.overdue_activity { + background-color: #a2d2fb; + border-radius: 10px; + font-size: 35px; +} +.cancelled_activity{ + background: #beeecc; + border-radius: 10px; + font-size: 35px; +} +.activity_type { + background-color: #ecb9b9;; + border-radius: 10px; + font-size: 35px; +} +.dashboard_main_section { + margin: 20px; +} \ No newline at end of file diff --git a/all_in_one_schedule_activity_management/static/src/images/web_icon.jpg b/all_in_one_schedule_activity_management/static/src/images/web_icon.jpg new file mode 100644 index 0000000000..da46edae57 Binary files /dev/null and b/all_in_one_schedule_activity_management/static/src/images/web_icon.jpg differ diff --git a/all_in_one_schedule_activity_management/static/src/js/activity_dashboard.js b/all_in_one_schedule_activity_management/static/src/js/activity_dashboard.js new file mode 100644 index 0000000000..6a6315af65 --- /dev/null +++ b/all_in_one_schedule_activity_management/static/src/js/activity_dashboard.js @@ -0,0 +1,164 @@ +/** @odoo-module **/ +/** + * @module all_in_one_schedule_activity_management.activity_dashboard + * @description This module handles the scheduled activity management. + */ +import { Component, onWillStart} from "@odoo/owl"; +import { session } from "@web/session"; +import { registry } from "@web/core/registry"; +import { useService } from "@web/core/utils/hooks"; +import { rpc } from "@web/core/network/rpc"; + +class ActivityDashboard extends Component { + static template = 'all_in_one_schedule_activity_management.ActivityDashboard'; + setup() { + super.setup(); + this.orm = useService("orm"); + this.action = useService("action"); + this.manage_activities = {} + this.dashboards_templates = ['LoginUser', 'ManageActivity', 'ActivityTable']; + onWillStart(this.willStart); + } + async willStart() { + this.title = 'Dashboard'; + await this.render_dashboards(); + } + async render_dashboards() { + this.manage_activities = await rpc('/web/dataset/call_kw', { + model: 'mail.activity', + method : 'get_activity_count', + args: [[]], + kwargs: {}, + }); + this.manage_activities.done_activity = await this.orm.searchRead("mail.activity", [["state", "=", 'done'], ["active", "=", false]],); + this.manage_activities.planned_activity = await this.orm.searchRead("mail.activity",[["state", "=", 'planned']],) + this.manage_activities.today_activity = await this.orm.searchRead("mail.activity", [["state", "=", 'today']],) + this.manage_activities.overdue_activity = await this.orm.searchRead("mail.activity",[["state", "=", 'overdue']],) + } + + async click_view(lineId) { + this.action.doAction({ + type: 'ir.actions.act_window', + name: 'All Activity', + res_model: 'mail.activity', + domain: ['|',['active', '=', false], ['active', '=', true],['id', '=', lineId]], + views: [[false, 'list'], [false, 'form']], + view_mode: 'list,form', + target: 'current' + }); + } + + async click_origin_view(e) { + const id_ = e.target.value; + const result = await rpc('/web/dataset/call_kw', { + model: 'mail.activity', + method : 'get_activity', + args: [[],parseInt(id_)], + kwargs: {}, + }); + this.env.services.action.doAction({ + type: 'ir.actions.act_window', + name: 'Activity Origin', + res_model: result.model, + domain: [['id', '=', result.res_id]], + views: [[false, 'list'], [false, 'form']], + view_mode: 'list,form', + target: 'current' + }); + } + + all_activity(e) { + e.stopPropagation(); + e.preventDefault(); + this.env.services.action.doAction({ + type: 'ir.actions.act_window', + name: 'All Activity', + res_model: 'mail.activity', + domain: [], + views: [[false, 'list'], [false, 'form']], + view_mode: 'list', + target: 'current' + }); + } + + planned_activity(e) { + e.stopPropagation(); + e.preventDefault(); + this.env.services.action.doAction({ + type: 'ir.actions.act_window', + name: 'Planned Activity', + res_model: 'mail.activity', + domain: [['state', '=', 'planned']], + views: [[false, 'list'], [false, 'form']], + view_mode: 'list', + target: 'current' + }); + } + + completed_activity(e) { + e.stopPropagation(); + e.preventDefault(); + this.env.services.action.doAction({ + type: 'ir.actions.act_window', + name: 'Completed Activity', + res_model: 'mail.activity', + domain: [['state', '=', 'done'], ['active', '=', false]], + views: [[false, 'list'], [false, 'form']], + view_mode: 'list', + target: 'current' + }); + } + today_activity(e) { + e.stopPropagation(); + e.preventDefault(); + this.env.services.action.doAction({ + type: 'ir.actions.act_window', + name: "Today's Activities", + res_model: 'mail.activity', + domain: [['state', '=', 'today']], + views: [[false, 'list'], [false, 'form']], + view_mode: 'list', + target: 'current' + }); + } + overdue_activity(e) { + e.stopPropagation(); + e.preventDefault(); + this.env.services.action.doAction({ + type: 'ir.actions.act_window', + name: 'Overdue Activity', + res_model: 'mail.activity', + domain: [['state', '=', 'overdue']], + views: [[false, 'list'], [false, 'form']], + view_mode: 'list', + target: 'current' + }); + } + cancelled_activity(e) { + e.stopPropagation(); + e.preventDefault(); + this.env.services.action.doAction({ + type: 'ir.actions.act_window', + name: "Today's Activity", + res_model: 'mail.activity', + domain: [['state', '=', 'cancel']], + views: [[false, 'list'], [false, 'form']], + view_mode: 'list', + target: 'current' + }); + } + activity_type(e) { + e.stopPropagation(); + e.preventDefault(); + this.env.services.action.doAction({ + type: 'ir.actions.act_window', + name: "Today's Activity", + res_model: 'mail.activity.type', + views: [[false, 'list'], [false, 'form']], + view_mode: 'list', + target: 'current' + }); + } +} +registry.category("actions").add("activity_dashboard", ActivityDashboard); +export default ActivityDashboard; diff --git a/all_in_one_schedule_activity_management/static/src/xml/activity_dashboard_view.xml b/all_in_one_schedule_activity_management/static/src/xml/activity_dashboard_view.xml new file mode 100644 index 0000000000..ae737273fb --- /dev/null +++ b/all_in_one_schedule_activity_management/static/src/xml/activity_dashboard_view.xml @@ -0,0 +1,420 @@ + + + + +
+
+

+ Activity Dashboard +

+
+
+
+
+
+
+
+ +
+
+ +
+
+
+ +
+
+
+ + +
+
+
+
+
+ +
+
+ +
+
+

+

All Activity

+

+
+
+
+
+
+
+ +
+ +
+ +
+
+

+ +
+
+
+
+ +

+

Planned Activity

+
+
+
+
+
+
+ +
+ +
+ +
+
+

+ +
+
+
+
+ +

+

+

Completed Activities

+

+
+
+
+ +
+
+
+ +
+
+ +
+
+

+ +
+
+
+
+ +

+

+

Today's Activities

+

+
+
+
+ +
+
+
+ +
+
+ +
+
+

+ +
+
+
+
+ +

+

+

Overdue Activities

+

+
+
+
+ +
+
+
+ +
+
+ +
+
+

+ +
+
+
+
+ +

+

+

Cancelled Activities

+

+
+
+
+ +
+
+
+ +
+
+

+

Activity Type

+

+
+
+
+
+
+
+ +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Planned Activities
No Data Available
NameActivity TypeAssigned toDead Line DateViewOrigin
+ + + + + + + + + + + +
+
+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Today's Activities
No Data Available
NameActivity TypeAssigned toDead Line DateViewOrigin
+ + + + + + + + + + + +
+
+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Completed Activities
No Data Available
NameActivity TypeAssigned toDead Line DateView
+ + + + + + + + + +
+
+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Overdue Activities
No Data Available
NameActivity TypeAssigned toDead Line DateView
+ + + + + + + + + +
+
+
+
+ diff --git a/all_in_one_schedule_activity_management/views/activity_dashbord_views.xml b/all_in_one_schedule_activity_management/views/activity_dashbord_views.xml new file mode 100644 index 0000000000..aea9ca2bf9 --- /dev/null +++ b/all_in_one_schedule_activity_management/views/activity_dashbord_views.xml @@ -0,0 +1,24 @@ + + + + + Cancel + + + code + + if records: + action = records.action_activity_cancel() + + + + Mark As Done + + + code + + if records: + action = records.action_activity_done() + + + diff --git a/all_in_one_schedule_activity_management/views/activity_history_views.xml b/all_in_one_schedule_activity_management/views/activity_history_views.xml new file mode 100644 index 0000000000..1bd41c7d12 --- /dev/null +++ b/all_in_one_schedule_activity_management/views/activity_history_views.xml @@ -0,0 +1,11 @@ + + + + + Activity History + ir.actions.act_window + mail.activity + list,form + [('date_deadline','<',context_today().strftime('%Y-%m-%d'))] + + diff --git a/all_in_one_schedule_activity_management/views/activity_tag_views.xml b/all_in_one_schedule_activity_management/views/activity_tag_views.xml new file mode 100644 index 0000000000..6e2c1c7e7b --- /dev/null +++ b/all_in_one_schedule_activity_management/views/activity_tag_views.xml @@ -0,0 +1,43 @@ + + + + + Tags + ir.actions.act_window + activity.tag + list,form + + + activity.tag.view.form + activity.tag + +
+ +
+
+ + + + + +
+
+
+
+ + + activity.tag.view.tree + activity.tag + + + + + + + +
+ diff --git a/all_in_one_schedule_activity_management/views/mail_activity_views.xml b/all_in_one_schedule_activity_management/views/mail_activity_views.xml new file mode 100644 index 0000000000..fa0bdd286b --- /dev/null +++ b/all_in_one_schedule_activity_management/views/mail_activity_views.xml @@ -0,0 +1,198 @@ + + + + + mail.activity.view.form + mail.activity + +
+
+
+ + + + + + + + + + + + +
+ Recommended Activities + +
+
+ + + + + + + + + + + + + +
+
+
+
+ + + mail.activity.view.tree + mail.activity + + + + + + + + + + + + + + mail.activity.view.search + mail.activity + + + + + + + + + + + + + + + + + + + mail.activity.view.kanban + mail.activity + + + + + + + + +
+
+ Avatar +
+
+ + + +
+ +
+
+ +
+
+
+
+
+
+
+
+ + + mail.activity.view.pivot + mail.activity + + + + + + + + + mail.activity.view.graph + mail.activity + + + + + + + + + + All Activity + ir.actions.act_window + mail.activity + list,form,calendar,kanban,pivot,graph + +
diff --git a/all_in_one_schedule_activity_management/views/menu_views.xml b/all_in_one_schedule_activity_management/views/menu_views.xml new file mode 100644 index 0000000000..3eb19d7bcf --- /dev/null +++ b/all_in_one_schedule_activity_management/views/menu_views.xml @@ -0,0 +1,46 @@ + + + + + Dashboard + activity_dashboard + current + + + + + + + + + + + diff --git a/all_in_one_schedule_activity_management/views/my_activity_views.xml b/all_in_one_schedule_activity_management/views/my_activity_views.xml new file mode 100644 index 0000000000..30126fad2d --- /dev/null +++ b/all_in_one_schedule_activity_management/views/my_activity_views.xml @@ -0,0 +1,13 @@ + + + + + + My Activity + ir.actions.act_window + mail.activity + list,form,calendar,kanban,pivot,graph + [('user_id','=',uid)] + + diff --git a/all_in_one_schedule_activity_management/views/reporting_activity_views.xml b/all_in_one_schedule_activity_management/views/reporting_activity_views.xml new file mode 100644 index 0000000000..984b66ea25 --- /dev/null +++ b/all_in_one_schedule_activity_management/views/reporting_activity_views.xml @@ -0,0 +1,31 @@ + + + + + Activities + ir.actions.act_window + mail.activity + graph,pivot + + + mail.activity.pivot.report + mail.activity + + + + + + + + + mail.activity.graph.report + mail.activity + + + + + + + + diff --git a/all_in_one_schedule_activity_management/views/res_config_setting_views.xml b/all_in_one_schedule_activity_management/views/res_config_setting_views.xml new file mode 100644 index 0000000000..f671deb9f0 --- /dev/null +++ b/all_in_one_schedule_activity_management/views/res_config_setting_views.xml @@ -0,0 +1,37 @@ + + + + + res.config.settings.view.form.inherited.all.in.one.schedule.activity.management + res.config.settings + + + + +

Due Activity Notification

+
+
+
+ +
+
+
+
+
+
+ +
+
+
+
+
+
+
+
+
diff --git a/chat_favourites_in_systray/README.rst b/chat_favourites_in_systray/README.rst new file mode 100755 index 0000000000..af1a3dfc51 --- /dev/null +++ b/chat_favourites_in_systray/README.rst @@ -0,0 +1,48 @@ +.. 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 + +Chat Favourites In Systray +========================== +This module helps you to enable desired chat's as favourite and view them from a shortcut added in systray + +Configuration +============= +* No additional configurations needed + +Company +------- +* `Cybrosys Techno Solutions `__ + +Credits +------- +Developer : (V18) Nivedhya T, + (V16) Abhin K, +Contact: odoo@cybrosys.com + +Contacts +-------- +* Mail Contact : odoo@cybrosys.com +* Website : https://cybrosys.com + +License +------- +Affero General Public License , Version 3 (AGPL v3). +(https://www.gnu.org/licenses/agpl-3.0-standalone.html) + +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 `__ + +Further information +=================== +HTML Description: ``__ diff --git a/chat_favourites_in_systray/__init__.py b/chat_favourites_in_systray/__init__.py new file mode 100644 index 0000000000..f2720e9e68 --- /dev/null +++ b/chat_favourites_in_systray/__init__.py @@ -0,0 +1,23 @@ +# -*- coding: utf-8 -*- +############################################################################### +# +# Cybrosys Technologies Pvt. Ltd. +# +# Copyright (C) 2025-TODAY Cybrosys Technologies() +# Author: Cybrosys Techno Solutions() +# +# 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 . +# +############################################################################### +from . import controllers +from . import models diff --git a/chat_favourites_in_systray/__manifest__.py b/chat_favourites_in_systray/__manifest__.py new file mode 100644 index 0000000000..200ba74c85 --- /dev/null +++ b/chat_favourites_in_systray/__manifest__.py @@ -0,0 +1,52 @@ +# -*- coding: utf-8 -*- +############################################################################### +# +# Cybrosys Technologies Pvt. Ltd. +# +# Copyright (C) 2025-TODAY Cybrosys Technologies() +# Author: Cybrosys Techno Solutions() +# +# 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 . +# +############################################################################### +{ + 'name': "Chat Favourites In Systray", + 'version': '18.0.1.0.0', + 'category': 'Productivity', + 'summary': """Shortcut for viewing favourite chats from systray""", + 'description': "This module showcases favorite chat conversations " + "in the system tray, providing users with quick access " + "to favourite chats without navigating through the " + "full application interface.", + 'author': "Cybrosys Techno Solutions", + 'company': "Cybrosys Techno Solutions", + 'maintainer': 'Cybrosys Techno Solutions', + 'website': "https://www.cybrosys.com", + 'depends': ['mail'], + 'data': [ + 'views/res_users_views.xml', + ], + 'assets': { + 'web.assets_backend': [ + 'chat_favourites_in_systray/static/src/js/messaging_menu.js', + 'chat_favourites_in_systray/static/src/js/notification_item.js', + 'chat_favourites_in_systray/static/src/xml/systray.xml', + 'chat_favourites_in_systray/static/src/css/systray.css', + ], + }, + 'images': ['static/description/banner.jpg'], + 'license': 'AGPL-3', + 'installable': True, + 'auto_install': False, + 'application': False, +} diff --git a/chat_favourites_in_systray/controllers/__init__.py b/chat_favourites_in_systray/controllers/__init__.py new file mode 100644 index 0000000000..861cb10152 --- /dev/null +++ b/chat_favourites_in_systray/controllers/__init__.py @@ -0,0 +1,22 @@ +# -*- coding: utf-8 -*- +############################################################################### +# +# Cybrosys Technologies Pvt. Ltd. +# +# Copyright (C) 2025-TODAY Cybrosys Technologies() +# Author: Cybrosys Techno Solutions() +# +# 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 . +# +############################################################################### +from . import chat_favourites_in_systray diff --git a/chat_favourites_in_systray/controllers/chat_favourites_in_systray.py b/chat_favourites_in_systray/controllers/chat_favourites_in_systray.py new file mode 100644 index 0000000000..ad269c58ba --- /dev/null +++ b/chat_favourites_in_systray/controllers/chat_favourites_in_systray.py @@ -0,0 +1,45 @@ +# -*- coding: utf-8 -*- +############################################################################### +# +# Cybrosys Technologies Pvt. Ltd. +# +# Copyright (C) 2025-TODAY Cybrosys Technologies() +# Author: Cybrosys Techno Solutions() +# +# 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 . +# +############################################################################### +from odoo import Command, http +from odoo.http import request + + +class ChatFavourite(http.Controller): + """Controller Class is created to handle the favourite chat functions""" + + @http.route('/enable_favourite', type='json', auth='user') + def enable_favourite(self, **kwargs): + """Enable the favourite button if selected""" + active_id = kwargs.get('active_id') + user_id = kwargs.get('user_id') # Directly from the JS + user = request.env['res.users'].sudo().browse(int(user_id)) + user.mail_channel_ids = [Command.link(int(active_id))] + return active_id + + @http.route('/disable_favourite', type='json', auth='user') + def disable_favourite(self, **kwargs): + """Disable the favourite button if deselected""" + active_id = kwargs.get('active_id') + user_id = kwargs.get('user_id') + user = request.env['res.users'].sudo().browse(int(user_id)) + user.mail_channel_ids = [Command.unlink(int(active_id))] + return active_id diff --git a/chat_favourites_in_systray/doc/RELEASE_NOTES.md b/chat_favourites_in_systray/doc/RELEASE_NOTES.md new file mode 100644 index 0000000000..c64036c807 --- /dev/null +++ b/chat_favourites_in_systray/doc/RELEASE_NOTES.md @@ -0,0 +1,6 @@ +## Module + +#### 27.06.2025 +#### Version 18.0.1.0.0 +##### ADD +- Initial commit for Chat Favourites In Systray diff --git a/chat_favourites_in_systray/models/__init__.py b/chat_favourites_in_systray/models/__init__.py new file mode 100644 index 0000000000..32f6931b61 --- /dev/null +++ b/chat_favourites_in_systray/models/__init__.py @@ -0,0 +1,22 @@ +# -*- coding: utf-8 -*- +############################################################################### +# +# Cybrosys Technologies Pvt. Ltd. +# +# Copyright (C) 2025-TODAY Cybrosys Technologies() +# Author: Cybrosys Techno Solutions() +# +# 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 . +# +############################################################################### +from . import res_users diff --git a/chat_favourites_in_systray/models/res_users.py b/chat_favourites_in_systray/models/res_users.py new file mode 100644 index 0000000000..f60ada09fb --- /dev/null +++ b/chat_favourites_in_systray/models/res_users.py @@ -0,0 +1,32 @@ +# -*- coding: utf-8 -*- +############################################################################### +# +# Cybrosys Technologies Pvt. Ltd. +# +# Copyright (C) 2025-TODAY Cybrosys Technologies() +# Author: Cybrosys Techno Solutions() +# +# 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 . +# +############################################################################### +from odoo import fields, models + + +class ResUsers(models.Model): + """Model is Inherited to add a Many2many to add favourite chats""" + _inherit = 'res.users' + + mail_channel_ids = fields.Many2many('discuss.channel', + string='Favourite Channel', + help='Favourite chats are added ' + 'to this field') diff --git a/chat_favourites_in_systray/static/description/assets/icons/arrows-repeat.svg b/chat_favourites_in_systray/static/description/assets/icons/arrows-repeat.svg new file mode 100644 index 0000000000..1d7efabc52 --- /dev/null +++ b/chat_favourites_in_systray/static/description/assets/icons/arrows-repeat.svg @@ -0,0 +1,10 @@ + + + + + + + + + + diff --git a/chat_favourites_in_systray/static/description/assets/icons/banner-1.png b/chat_favourites_in_systray/static/description/assets/icons/banner-1.png new file mode 100644 index 0000000000..c180db1729 Binary files /dev/null and b/chat_favourites_in_systray/static/description/assets/icons/banner-1.png differ diff --git a/chat_favourites_in_systray/static/description/assets/icons/banner-2.svg b/chat_favourites_in_systray/static/description/assets/icons/banner-2.svg new file mode 100644 index 0000000000..e606d97d98 --- /dev/null +++ b/chat_favourites_in_systray/static/description/assets/icons/banner-2.svg @@ -0,0 +1,73 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/chat_favourites_in_systray/static/description/assets/icons/banner-bg.png b/chat_favourites_in_systray/static/description/assets/icons/banner-bg.png new file mode 100644 index 0000000000..a8238d3c09 Binary files /dev/null and b/chat_favourites_in_systray/static/description/assets/icons/banner-bg.png differ diff --git a/chat_favourites_in_systray/static/description/assets/icons/banner-bg.svg b/chat_favourites_in_systray/static/description/assets/icons/banner-bg.svg new file mode 100644 index 0000000000..b1378103e2 --- /dev/null +++ b/chat_favourites_in_systray/static/description/assets/icons/banner-bg.svg @@ -0,0 +1,9 @@ + + + + + + + + + diff --git a/chat_favourites_in_systray/static/description/assets/icons/banner-call.svg b/chat_favourites_in_systray/static/description/assets/icons/banner-call.svg new file mode 100644 index 0000000000..96c687e81f --- /dev/null +++ b/chat_favourites_in_systray/static/description/assets/icons/banner-call.svg @@ -0,0 +1,5 @@ + + + + + diff --git a/chat_favourites_in_systray/static/description/assets/icons/banner-mail.svg b/chat_favourites_in_systray/static/description/assets/icons/banner-mail.svg new file mode 100644 index 0000000000..cbf0d158d2 --- /dev/null +++ b/chat_favourites_in_systray/static/description/assets/icons/banner-mail.svg @@ -0,0 +1,5 @@ + + + + + diff --git a/chat_favourites_in_systray/static/description/assets/icons/banner-pattern.svg b/chat_favourites_in_systray/static/description/assets/icons/banner-pattern.svg new file mode 100644 index 0000000000..9c1c7e101c --- /dev/null +++ b/chat_favourites_in_systray/static/description/assets/icons/banner-pattern.svg @@ -0,0 +1,343 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/chat_favourites_in_systray/static/description/assets/icons/banner-promo.svg b/chat_favourites_in_systray/static/description/assets/icons/banner-promo.svg new file mode 100644 index 0000000000..d52791b11e --- /dev/null +++ b/chat_favourites_in_systray/static/description/assets/icons/banner-promo.svg @@ -0,0 +1,147 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/chat_favourites_in_systray/static/description/assets/icons/brand-pair.svg b/chat_favourites_in_systray/static/description/assets/icons/brand-pair.svg new file mode 100644 index 0000000000..d8db7fc1e7 --- /dev/null +++ b/chat_favourites_in_systray/static/description/assets/icons/brand-pair.svg @@ -0,0 +1,41 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/chat_favourites_in_systray/static/description/assets/icons/check.png b/chat_favourites_in_systray/static/description/assets/icons/check.png new file mode 100644 index 0000000000..c8e85f51d6 Binary files /dev/null and b/chat_favourites_in_systray/static/description/assets/icons/check.png differ diff --git a/chat_favourites_in_systray/static/description/assets/icons/chevron.png b/chat_favourites_in_systray/static/description/assets/icons/chevron.png new file mode 100644 index 0000000000..2089293d6a Binary files /dev/null and b/chat_favourites_in_systray/static/description/assets/icons/chevron.png differ diff --git a/chat_favourites_in_systray/static/description/assets/icons/close-icon.svg b/chat_favourites_in_systray/static/description/assets/icons/close-icon.svg new file mode 100644 index 0000000000..df8cce37a5 --- /dev/null +++ b/chat_favourites_in_systray/static/description/assets/icons/close-icon.svg @@ -0,0 +1,5 @@ + + + + + diff --git a/chat_favourites_in_systray/static/description/assets/icons/cogs.png b/chat_favourites_in_systray/static/description/assets/icons/cogs.png new file mode 100644 index 0000000000..95d0bad62c Binary files /dev/null and b/chat_favourites_in_systray/static/description/assets/icons/cogs.png differ diff --git a/chat_favourites_in_systray/static/description/assets/icons/collabarate-icon.svg b/chat_favourites_in_systray/static/description/assets/icons/collabarate-icon.svg new file mode 100644 index 0000000000..dd4e105183 --- /dev/null +++ b/chat_favourites_in_systray/static/description/assets/icons/collabarate-icon.svg @@ -0,0 +1,3 @@ + + + diff --git a/chat_favourites_in_systray/static/description/assets/icons/consultation.png b/chat_favourites_in_systray/static/description/assets/icons/consultation.png new file mode 100644 index 0000000000..8319d4baa0 Binary files /dev/null and b/chat_favourites_in_systray/static/description/assets/icons/consultation.png differ diff --git a/chat_favourites_in_systray/static/description/assets/icons/cybro-logo.png b/chat_favourites_in_systray/static/description/assets/icons/cybro-logo.png new file mode 100644 index 0000000000..ff4b782205 Binary files /dev/null and b/chat_favourites_in_systray/static/description/assets/icons/cybro-logo.png differ diff --git a/chat_favourites_in_systray/static/description/assets/icons/down.svg b/chat_favourites_in_systray/static/description/assets/icons/down.svg new file mode 100644 index 0000000000..f21c36271b --- /dev/null +++ b/chat_favourites_in_systray/static/description/assets/icons/down.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/chat_favourites_in_systray/static/description/assets/icons/ecom-black.png b/chat_favourites_in_systray/static/description/assets/icons/ecom-black.png new file mode 100644 index 0000000000..a9385ff13f Binary files /dev/null and b/chat_favourites_in_systray/static/description/assets/icons/ecom-black.png differ diff --git a/chat_favourites_in_systray/static/description/assets/icons/education-black.png b/chat_favourites_in_systray/static/description/assets/icons/education-black.png new file mode 100644 index 0000000000..3eb09b27b4 Binary files /dev/null and b/chat_favourites_in_systray/static/description/assets/icons/education-black.png differ diff --git a/chat_favourites_in_systray/static/description/assets/icons/faq.png b/chat_favourites_in_systray/static/description/assets/icons/faq.png new file mode 100644 index 0000000000..4250b5b817 Binary files /dev/null and b/chat_favourites_in_systray/static/description/assets/icons/faq.png differ diff --git a/chat_favourites_in_systray/static/description/assets/icons/feature-icon.svg b/chat_favourites_in_systray/static/description/assets/icons/feature-icon.svg new file mode 100644 index 0000000000..fa0ea6850a --- /dev/null +++ b/chat_favourites_in_systray/static/description/assets/icons/feature-icon.svg @@ -0,0 +1,10 @@ + + + + + + + + + + diff --git a/chat_favourites_in_systray/static/description/assets/icons/feature.png b/chat_favourites_in_systray/static/description/assets/icons/feature.png new file mode 100644 index 0000000000..ac7a785c09 Binary files /dev/null and b/chat_favourites_in_systray/static/description/assets/icons/feature.png differ diff --git a/chat_favourites_in_systray/static/description/assets/icons/gear.svg b/chat_favourites_in_systray/static/description/assets/icons/gear.svg new file mode 100644 index 0000000000..0cc66b6ea7 --- /dev/null +++ b/chat_favourites_in_systray/static/description/assets/icons/gear.svg @@ -0,0 +1,10 @@ + + + + + + + + + + diff --git a/chat_favourites_in_systray/static/description/assets/icons/hire-odoo.svg b/chat_favourites_in_systray/static/description/assets/icons/hire-odoo.svg new file mode 100644 index 0000000000..e1ac089b04 --- /dev/null +++ b/chat_favourites_in_systray/static/description/assets/icons/hire-odoo.svg @@ -0,0 +1,12 @@ + + + + + + + + + + + + diff --git a/chat_favourites_in_systray/static/description/assets/icons/hotel-black.png b/chat_favourites_in_systray/static/description/assets/icons/hotel-black.png new file mode 100644 index 0000000000..130f613be0 Binary files /dev/null and b/chat_favourites_in_systray/static/description/assets/icons/hotel-black.png differ diff --git a/chat_favourites_in_systray/static/description/assets/icons/license.png b/chat_favourites_in_systray/static/description/assets/icons/license.png new file mode 100644 index 0000000000..a5869797ec Binary files /dev/null and b/chat_favourites_in_systray/static/description/assets/icons/license.png differ diff --git a/chat_favourites_in_systray/static/description/assets/icons/life-ring-icon.svg b/chat_favourites_in_systray/static/description/assets/icons/life-ring-icon.svg new file mode 100644 index 0000000000..3ae6e1d896 --- /dev/null +++ b/chat_favourites_in_systray/static/description/assets/icons/life-ring-icon.svg @@ -0,0 +1,13 @@ + + + + + + + + + + + + + diff --git a/chat_favourites_in_systray/static/description/assets/icons/lifebuoy.png b/chat_favourites_in_systray/static/description/assets/icons/lifebuoy.png new file mode 100644 index 0000000000..658d56cccf Binary files /dev/null and b/chat_favourites_in_systray/static/description/assets/icons/lifebuoy.png differ diff --git a/chat_favourites_in_systray/static/description/assets/icons/mail.svg b/chat_favourites_in_systray/static/description/assets/icons/mail.svg new file mode 100644 index 0000000000..1eedde695b --- /dev/null +++ b/chat_favourites_in_systray/static/description/assets/icons/mail.svg @@ -0,0 +1,3 @@ + + + diff --git a/chat_favourites_in_systray/static/description/assets/icons/manufacturing-black.png b/chat_favourites_in_systray/static/description/assets/icons/manufacturing-black.png new file mode 100644 index 0000000000..697eb0e9f2 Binary files /dev/null and b/chat_favourites_in_systray/static/description/assets/icons/manufacturing-black.png differ diff --git a/chat_favourites_in_systray/static/description/assets/icons/notes.png b/chat_favourites_in_systray/static/description/assets/icons/notes.png new file mode 100644 index 0000000000..ee5e954047 Binary files /dev/null and b/chat_favourites_in_systray/static/description/assets/icons/notes.png differ diff --git a/chat_favourites_in_systray/static/description/assets/icons/notification icon.svg b/chat_favourites_in_systray/static/description/assets/icons/notification icon.svg new file mode 100644 index 0000000000..0531899736 --- /dev/null +++ b/chat_favourites_in_systray/static/description/assets/icons/notification icon.svg @@ -0,0 +1,10 @@ + + + + + + + + + + diff --git a/chat_favourites_in_systray/static/description/assets/icons/odoo-consultancy.svg b/chat_favourites_in_systray/static/description/assets/icons/odoo-consultancy.svg new file mode 100644 index 0000000000..e05f65bde4 --- /dev/null +++ b/chat_favourites_in_systray/static/description/assets/icons/odoo-consultancy.svg @@ -0,0 +1,4 @@ + + + + diff --git a/chat_favourites_in_systray/static/description/assets/icons/odoo-licencing.svg b/chat_favourites_in_systray/static/description/assets/icons/odoo-licencing.svg new file mode 100644 index 0000000000..2606c88b04 --- /dev/null +++ b/chat_favourites_in_systray/static/description/assets/icons/odoo-licencing.svg @@ -0,0 +1,3 @@ + + + diff --git a/chat_favourites_in_systray/static/description/assets/icons/odoo-logo.png b/chat_favourites_in_systray/static/description/assets/icons/odoo-logo.png new file mode 100644 index 0000000000..0e4d0eb5a4 Binary files /dev/null and b/chat_favourites_in_systray/static/description/assets/icons/odoo-logo.png differ diff --git a/chat_favourites_in_systray/static/description/assets/icons/patter.svg b/chat_favourites_in_systray/static/description/assets/icons/patter.svg new file mode 100644 index 0000000000..25c9c0a8f1 --- /dev/null +++ b/chat_favourites_in_systray/static/description/assets/icons/patter.svg @@ -0,0 +1,9 @@ + + + + + + + + + diff --git a/chat_favourites_in_systray/static/description/assets/icons/pattern1.png b/chat_favourites_in_systray/static/description/assets/icons/pattern1.png new file mode 100644 index 0000000000..09ab0fb2d9 Binary files /dev/null and b/chat_favourites_in_systray/static/description/assets/icons/pattern1.png differ diff --git a/chat_favourites_in_systray/static/description/assets/icons/pos-black.png b/chat_favourites_in_systray/static/description/assets/icons/pos-black.png new file mode 100644 index 0000000000..97c0f90c10 Binary files /dev/null and b/chat_favourites_in_systray/static/description/assets/icons/pos-black.png differ diff --git a/chat_favourites_in_systray/static/description/assets/icons/puzzle-piece-icon.svg b/chat_favourites_in_systray/static/description/assets/icons/puzzle-piece-icon.svg new file mode 100644 index 0000000000..3e9ad93738 --- /dev/null +++ b/chat_favourites_in_systray/static/description/assets/icons/puzzle-piece-icon.svg @@ -0,0 +1,10 @@ + + + + + + + + + + diff --git a/chat_favourites_in_systray/static/description/assets/icons/puzzle.png b/chat_favourites_in_systray/static/description/assets/icons/puzzle.png new file mode 100644 index 0000000000..65cf854e7e Binary files /dev/null and b/chat_favourites_in_systray/static/description/assets/icons/puzzle.png differ diff --git a/chat_favourites_in_systray/static/description/assets/icons/replace-icon.svg b/chat_favourites_in_systray/static/description/assets/icons/replace-icon.svg new file mode 100644 index 0000000000..d0e3a7af1a --- /dev/null +++ b/chat_favourites_in_systray/static/description/assets/icons/replace-icon.svg @@ -0,0 +1,10 @@ + + + + + + + + + + diff --git a/chat_favourites_in_systray/static/description/assets/icons/restaurant-black.png b/chat_favourites_in_systray/static/description/assets/icons/restaurant-black.png new file mode 100644 index 0000000000..4a35eb939c Binary files /dev/null and b/chat_favourites_in_systray/static/description/assets/icons/restaurant-black.png differ diff --git a/chat_favourites_in_systray/static/description/assets/icons/screenshot-main.png b/chat_favourites_in_systray/static/description/assets/icons/screenshot-main.png new file mode 100644 index 0000000000..575f8e676b Binary files /dev/null and b/chat_favourites_in_systray/static/description/assets/icons/screenshot-main.png differ diff --git a/chat_favourites_in_systray/static/description/assets/icons/screenshot.png b/chat_favourites_in_systray/static/description/assets/icons/screenshot.png new file mode 100644 index 0000000000..cef272529d Binary files /dev/null and b/chat_favourites_in_systray/static/description/assets/icons/screenshot.png differ diff --git a/chat_favourites_in_systray/static/description/assets/icons/service-black.png b/chat_favourites_in_systray/static/description/assets/icons/service-black.png new file mode 100644 index 0000000000..301ab51cb1 Binary files /dev/null and b/chat_favourites_in_systray/static/description/assets/icons/service-black.png differ diff --git a/chat_favourites_in_systray/static/description/assets/icons/skype-fill.svg b/chat_favourites_in_systray/static/description/assets/icons/skype-fill.svg new file mode 100644 index 0000000000..c174236393 --- /dev/null +++ b/chat_favourites_in_systray/static/description/assets/icons/skype-fill.svg @@ -0,0 +1,10 @@ + + + + + + + + + + diff --git a/chat_favourites_in_systray/static/description/assets/icons/skype.png b/chat_favourites_in_systray/static/description/assets/icons/skype.png new file mode 100644 index 0000000000..51b409fb3f Binary files /dev/null and b/chat_favourites_in_systray/static/description/assets/icons/skype.png differ diff --git a/chat_favourites_in_systray/static/description/assets/icons/skype.svg b/chat_favourites_in_systray/static/description/assets/icons/skype.svg new file mode 100644 index 0000000000..df3dad39b5 --- /dev/null +++ b/chat_favourites_in_systray/static/description/assets/icons/skype.svg @@ -0,0 +1,3 @@ + + + diff --git a/chat_favourites_in_systray/static/description/assets/icons/star-1.svg b/chat_favourites_in_systray/static/description/assets/icons/star-1.svg new file mode 100644 index 0000000000..7e55ab162e --- /dev/null +++ b/chat_favourites_in_systray/static/description/assets/icons/star-1.svg @@ -0,0 +1,53 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/chat_favourites_in_systray/static/description/assets/icons/star-2.svg b/chat_favourites_in_systray/static/description/assets/icons/star-2.svg new file mode 100644 index 0000000000..5ae9f507a1 --- /dev/null +++ b/chat_favourites_in_systray/static/description/assets/icons/star-2.svg @@ -0,0 +1,9 @@ + + + + + + + + + diff --git a/chat_favourites_in_systray/static/description/assets/icons/support.png b/chat_favourites_in_systray/static/description/assets/icons/support.png new file mode 100644 index 0000000000..4f18b8b820 Binary files /dev/null and b/chat_favourites_in_systray/static/description/assets/icons/support.png differ diff --git a/chat_favourites_in_systray/static/description/assets/icons/test-1 - Copy.png b/chat_favourites_in_systray/static/description/assets/icons/test-1 - Copy.png new file mode 100644 index 0000000000..f6a9026637 Binary files /dev/null and b/chat_favourites_in_systray/static/description/assets/icons/test-1 - Copy.png differ diff --git a/chat_favourites_in_systray/static/description/assets/icons/test-1.png b/chat_favourites_in_systray/static/description/assets/icons/test-1.png new file mode 100644 index 0000000000..0908add2b0 Binary files /dev/null and b/chat_favourites_in_systray/static/description/assets/icons/test-1.png differ diff --git a/chat_favourites_in_systray/static/description/assets/icons/test-2.png b/chat_favourites_in_systray/static/description/assets/icons/test-2.png new file mode 100644 index 0000000000..4671fe91e9 Binary files /dev/null and b/chat_favourites_in_systray/static/description/assets/icons/test-2.png differ diff --git a/chat_favourites_in_systray/static/description/assets/icons/trading-black.png b/chat_favourites_in_systray/static/description/assets/icons/trading-black.png new file mode 100644 index 0000000000..9398ba2f1a Binary files /dev/null and b/chat_favourites_in_systray/static/description/assets/icons/trading-black.png differ diff --git a/chat_favourites_in_systray/static/description/assets/icons/training.png b/chat_favourites_in_systray/static/description/assets/icons/training.png new file mode 100644 index 0000000000..884ca024d7 Binary files /dev/null and b/chat_favourites_in_systray/static/description/assets/icons/training.png differ diff --git a/chat_favourites_in_systray/static/description/assets/icons/translate.svg b/chat_favourites_in_systray/static/description/assets/icons/translate.svg new file mode 100644 index 0000000000..af9c8a1aa8 --- /dev/null +++ b/chat_favourites_in_systray/static/description/assets/icons/translate.svg @@ -0,0 +1,10 @@ + + + + + + + + + + diff --git a/chat_favourites_in_systray/static/description/assets/icons/update.png b/chat_favourites_in_systray/static/description/assets/icons/update.png new file mode 100644 index 0000000000..ecbc5a01a2 Binary files /dev/null and b/chat_favourites_in_systray/static/description/assets/icons/update.png differ diff --git a/chat_favourites_in_systray/static/description/assets/icons/user.png b/chat_favourites_in_systray/static/description/assets/icons/user.png new file mode 100644 index 0000000000..6ffb23d9f0 Binary files /dev/null and b/chat_favourites_in_systray/static/description/assets/icons/user.png differ diff --git a/chat_favourites_in_systray/static/description/assets/icons/video.png b/chat_favourites_in_systray/static/description/assets/icons/video.png new file mode 100644 index 0000000000..576705b172 Binary files /dev/null and b/chat_favourites_in_systray/static/description/assets/icons/video.png differ diff --git a/chat_favourites_in_systray/static/description/assets/icons/whatsapp.png b/chat_favourites_in_systray/static/description/assets/icons/whatsapp.png new file mode 100644 index 0000000000..d513a5356b Binary files /dev/null and b/chat_favourites_in_systray/static/description/assets/icons/whatsapp.png differ diff --git a/chat_favourites_in_systray/static/description/assets/icons/wrench-icon.svg b/chat_favourites_in_systray/static/description/assets/icons/wrench-icon.svg new file mode 100644 index 0000000000..174b5a465e --- /dev/null +++ b/chat_favourites_in_systray/static/description/assets/icons/wrench-icon.svg @@ -0,0 +1,10 @@ + + + + + + + + + + diff --git a/chat_favourites_in_systray/static/description/assets/icons/wrench.png b/chat_favourites_in_systray/static/description/assets/icons/wrench.png new file mode 100644 index 0000000000..6c04dea0f4 Binary files /dev/null and b/chat_favourites_in_systray/static/description/assets/icons/wrench.png differ diff --git a/chat_favourites_in_systray/static/description/assets/misc/Cybrosys R.png b/chat_favourites_in_systray/static/description/assets/misc/Cybrosys R.png new file mode 100644 index 0000000000..da40580870 Binary files /dev/null and b/chat_favourites_in_systray/static/description/assets/misc/Cybrosys R.png differ diff --git a/chat_favourites_in_systray/static/description/assets/misc/categories.png b/chat_favourites_in_systray/static/description/assets/misc/categories.png new file mode 100644 index 0000000000..bedf1e0b18 Binary files /dev/null and b/chat_favourites_in_systray/static/description/assets/misc/categories.png differ diff --git a/chat_favourites_in_systray/static/description/assets/misc/check-box.png b/chat_favourites_in_systray/static/description/assets/misc/check-box.png new file mode 100644 index 0000000000..42caf24b98 Binary files /dev/null and b/chat_favourites_in_systray/static/description/assets/misc/check-box.png differ diff --git a/chat_favourites_in_systray/static/description/assets/misc/compass.png b/chat_favourites_in_systray/static/description/assets/misc/compass.png new file mode 100644 index 0000000000..d5fed8faa6 Binary files /dev/null and b/chat_favourites_in_systray/static/description/assets/misc/compass.png differ diff --git a/chat_favourites_in_systray/static/description/assets/misc/corporate.png b/chat_favourites_in_systray/static/description/assets/misc/corporate.png new file mode 100644 index 0000000000..2eb13edbfa Binary files /dev/null and b/chat_favourites_in_systray/static/description/assets/misc/corporate.png differ diff --git a/chat_favourites_in_systray/static/description/assets/misc/customer-support.png b/chat_favourites_in_systray/static/description/assets/misc/customer-support.png new file mode 100644 index 0000000000..79efc72edc Binary files /dev/null and b/chat_favourites_in_systray/static/description/assets/misc/customer-support.png differ diff --git a/chat_favourites_in_systray/static/description/assets/misc/cybrosys-logo.png b/chat_favourites_in_systray/static/description/assets/misc/cybrosys-logo.png new file mode 100644 index 0000000000..cc3cc0ccfd Binary files /dev/null and b/chat_favourites_in_systray/static/description/assets/misc/cybrosys-logo.png differ diff --git a/chat_favourites_in_systray/static/description/assets/misc/email.svg b/chat_favourites_in_systray/static/description/assets/misc/email.svg new file mode 100644 index 0000000000..15291cdc3a --- /dev/null +++ b/chat_favourites_in_systray/static/description/assets/misc/email.svg @@ -0,0 +1,33 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/chat_favourites_in_systray/static/description/assets/misc/features.png b/chat_favourites_in_systray/static/description/assets/misc/features.png new file mode 100644 index 0000000000..b41769f774 Binary files /dev/null and b/chat_favourites_in_systray/static/description/assets/misc/features.png differ diff --git a/chat_favourites_in_systray/static/description/assets/misc/logo.png b/chat_favourites_in_systray/static/description/assets/misc/logo.png new file mode 100644 index 0000000000..478462d3e7 Binary files /dev/null and b/chat_favourites_in_systray/static/description/assets/misc/logo.png differ diff --git a/chat_favourites_in_systray/static/description/assets/misc/phone.svg b/chat_favourites_in_systray/static/description/assets/misc/phone.svg new file mode 100644 index 0000000000..b7bd7f251f --- /dev/null +++ b/chat_favourites_in_systray/static/description/assets/misc/phone.svg @@ -0,0 +1,3 @@ + + + diff --git a/chat_favourites_in_systray/static/description/assets/misc/pictures.png b/chat_favourites_in_systray/static/description/assets/misc/pictures.png new file mode 100644 index 0000000000..56d255fe96 Binary files /dev/null and b/chat_favourites_in_systray/static/description/assets/misc/pictures.png differ diff --git a/chat_favourites_in_systray/static/description/assets/misc/pie-chart.png b/chat_favourites_in_systray/static/description/assets/misc/pie-chart.png new file mode 100644 index 0000000000..426e05244b Binary files /dev/null and b/chat_favourites_in_systray/static/description/assets/misc/pie-chart.png differ diff --git a/chat_favourites_in_systray/static/description/assets/misc/right-arrow.png b/chat_favourites_in_systray/static/description/assets/misc/right-arrow.png new file mode 100644 index 0000000000..730984a063 Binary files /dev/null and b/chat_favourites_in_systray/static/description/assets/misc/right-arrow.png differ diff --git a/chat_favourites_in_systray/static/description/assets/misc/star (1) 2.svg b/chat_favourites_in_systray/static/description/assets/misc/star (1) 2.svg new file mode 100644 index 0000000000..5ae9f507a1 --- /dev/null +++ b/chat_favourites_in_systray/static/description/assets/misc/star (1) 2.svg @@ -0,0 +1,9 @@ + + + + + + + + + diff --git a/chat_favourites_in_systray/static/description/assets/misc/star.png b/chat_favourites_in_systray/static/description/assets/misc/star.png new file mode 100644 index 0000000000..2eb9ab29f7 Binary files /dev/null and b/chat_favourites_in_systray/static/description/assets/misc/star.png differ diff --git a/chat_favourites_in_systray/static/description/assets/misc/support (1) 1.svg b/chat_favourites_in_systray/static/description/assets/misc/support (1) 1.svg new file mode 100644 index 0000000000..7d37a8f308 --- /dev/null +++ b/chat_favourites_in_systray/static/description/assets/misc/support (1) 1.svg @@ -0,0 +1,9 @@ + + + + + + + + + diff --git a/chat_favourites_in_systray/static/description/assets/misc/support-email.svg b/chat_favourites_in_systray/static/description/assets/misc/support-email.svg new file mode 100644 index 0000000000..eb70370d60 --- /dev/null +++ b/chat_favourites_in_systray/static/description/assets/misc/support-email.svg @@ -0,0 +1,6 @@ + + + + + + diff --git a/chat_favourites_in_systray/static/description/assets/misc/support.png b/chat_favourites_in_systray/static/description/assets/misc/support.png new file mode 100644 index 0000000000..4f18b8b820 Binary files /dev/null and b/chat_favourites_in_systray/static/description/assets/misc/support.png differ diff --git a/chat_favourites_in_systray/static/description/assets/misc/tick-mark.svg b/chat_favourites_in_systray/static/description/assets/misc/tick-mark.svg new file mode 100644 index 0000000000..2dbb401871 --- /dev/null +++ b/chat_favourites_in_systray/static/description/assets/misc/tick-mark.svg @@ -0,0 +1,17 @@ + + + + + + + + + + + + + + + + + diff --git a/chat_favourites_in_systray/static/description/assets/misc/whatsapp 1.svg b/chat_favourites_in_systray/static/description/assets/misc/whatsapp 1.svg new file mode 100644 index 0000000000..0bfaf8fc65 --- /dev/null +++ b/chat_favourites_in_systray/static/description/assets/misc/whatsapp 1.svg @@ -0,0 +1,9 @@ + + + + + + + + + diff --git a/chat_favourites_in_systray/static/description/assets/misc/whatsapp.png b/chat_favourites_in_systray/static/description/assets/misc/whatsapp.png new file mode 100644 index 0000000000..d513a5356b Binary files /dev/null and b/chat_favourites_in_systray/static/description/assets/misc/whatsapp.png differ diff --git a/chat_favourites_in_systray/static/description/assets/misc/whatsapp.svg b/chat_favourites_in_systray/static/description/assets/misc/whatsapp.svg new file mode 100644 index 0000000000..b618aea1da --- /dev/null +++ b/chat_favourites_in_systray/static/description/assets/misc/whatsapp.svg @@ -0,0 +1,33 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/chat_favourites_in_systray/static/description/assets/modules/banner1.jpg b/chat_favourites_in_systray/static/description/assets/modules/banner1.jpg new file mode 100644 index 0000000000..6e617f3d37 Binary files /dev/null and b/chat_favourites_in_systray/static/description/assets/modules/banner1.jpg differ diff --git a/chat_favourites_in_systray/static/description/assets/modules/banner2.jpg b/chat_favourites_in_systray/static/description/assets/modules/banner2.jpg new file mode 100644 index 0000000000..580ea075dc Binary files /dev/null and b/chat_favourites_in_systray/static/description/assets/modules/banner2.jpg differ diff --git a/chat_favourites_in_systray/static/description/assets/modules/banner3.jpg b/chat_favourites_in_systray/static/description/assets/modules/banner3.jpg new file mode 100644 index 0000000000..a68ae5a1b6 Binary files /dev/null and b/chat_favourites_in_systray/static/description/assets/modules/banner3.jpg differ diff --git a/chat_favourites_in_systray/static/description/assets/modules/banner4.jpg b/chat_favourites_in_systray/static/description/assets/modules/banner4.jpg new file mode 100644 index 0000000000..19319906e7 Binary files /dev/null and b/chat_favourites_in_systray/static/description/assets/modules/banner4.jpg differ diff --git a/chat_favourites_in_systray/static/description/assets/modules/banner5.jpg b/chat_favourites_in_systray/static/description/assets/modules/banner5.jpg new file mode 100644 index 0000000000..e0b09a5a0b Binary files /dev/null and b/chat_favourites_in_systray/static/description/assets/modules/banner5.jpg differ diff --git a/chat_favourites_in_systray/static/description/assets/modules/banner6.jpg b/chat_favourites_in_systray/static/description/assets/modules/banner6.jpg new file mode 100644 index 0000000000..696582fa86 Binary files /dev/null and b/chat_favourites_in_systray/static/description/assets/modules/banner6.jpg differ diff --git a/chat_favourites_in_systray/static/description/assets/screenshots/hero.gif b/chat_favourites_in_systray/static/description/assets/screenshots/hero.gif new file mode 100644 index 0000000000..fb58c8d24c Binary files /dev/null and b/chat_favourites_in_systray/static/description/assets/screenshots/hero.gif differ diff --git a/chat_favourites_in_systray/static/description/assets/screenshots/screenshot1.png b/chat_favourites_in_systray/static/description/assets/screenshots/screenshot1.png new file mode 100644 index 0000000000..e72890ad99 Binary files /dev/null and b/chat_favourites_in_systray/static/description/assets/screenshots/screenshot1.png differ diff --git a/chat_favourites_in_systray/static/description/assets/screenshots/screenshot2.png b/chat_favourites_in_systray/static/description/assets/screenshots/screenshot2.png new file mode 100644 index 0000000000..d1310e5a8c Binary files /dev/null and b/chat_favourites_in_systray/static/description/assets/screenshots/screenshot2.png differ diff --git a/chat_favourites_in_systray/static/description/banner.jpg b/chat_favourites_in_systray/static/description/banner.jpg new file mode 100644 index 0000000000..9e268bd691 Binary files /dev/null and b/chat_favourites_in_systray/static/description/banner.jpg differ diff --git a/chat_favourites_in_systray/static/description/icon.png b/chat_favourites_in_systray/static/description/icon.png new file mode 100644 index 0000000000..92b69ef233 Binary files /dev/null and b/chat_favourites_in_systray/static/description/icon.png differ diff --git a/chat_favourites_in_systray/static/description/index.html b/chat_favourites_in_systray/static/description/index.html new file mode 100644 index 0000000000..18ab9a7b1d --- /dev/null +++ b/chat_favourites_in_systray/static/description/index.html @@ -0,0 +1,884 @@ + + + + + + Chat Favourites In Systray + + + + + + + + + + +
+
+ + + +
+
+ Community +
+
+ Enterprise +
+
+ Odoo.sh +
+
+
+ +
+
+
+
+

+ Shortcut For Viewing Favourite Chats From Systray. +

+

Chat Favourites In Systray +

+
+
+ +
+ +
+ +
+
+
+ +
+
+ +
+
+ +
+
+
+

Key + Highlights

+
+
+
+
+ +
+
+ Shortcut For Favourite Chats. +
+

+ Able to view favourite chats from shortcut added in systray. +

+
+
+
+
+ +
+
+
+ Chat Favourites In Systray +

+ Are you ready to make your business more + organized? +
Improve now! +

+ +
+
+ +
+
+
+ + + + +
+
+ +
+
+
+
+ acc_bg +
+ +
+
+
+
+

+ Mark Chat As + + Favourite +

+
+
+

+ Able to mark each chat as favourite by clicking on the star icon. + Also, able to remove the chat as favourite +

+
+
+
+ +
+
+
+
+
+
+
+
+
+

+ Display + + Favourite Chats +

+
+
+

+ By clicking on the star icon in the systray and refresh the page, all the favourite chats can be viewed from the dropdown. +

+
+
+
+ +
+
+
+
+
+
+
+
+ +
+
+
+
+ +
+

+ Shortcut For Favourite Chats. +

+
+
+

+ +

+
+
+
+
+
+
+
+
+
+
+ +
+ +
+ +
+

+ The "Favourite Chats" feature + allows users to quickly access + their most important or frequently + used chats directly from the Messaging + Menu in the top-right systray. +

+
+
+ +
+ +
+

+ Open the Messaging Menu (chat icon) + in the systray, and click the "Favourite" tab. + This section lists all channels or direct + messages you've marked as favourites. +

+
+
+ +
+ +
+

+ In the Messaging Menu, + click the star icon + next to a chat or channel. + The star turns red when marked as a favourite. +

+
+
+
+
+
+
+
+
+
+ +
+
+

+ Latest Release 18.0.1.0.0 +

+ + 27th June, 2025 + +
+
+
+
+
+ Add +
+
+
+
    +
  • + Initial Commit +
  • + +
+
+
+
+
+
+
+
+
+
+ + + +
+

+ Related Products +

+ +
+ + +
+

+ Our Services

+ +
+ +
+
+ .... +
+
+ +
+ + +
+
+ + + + + + diff --git a/chat_favourites_in_systray/static/src/css/systray.css b/chat_favourites_in_systray/static/src/css/systray.css new file mode 100644 index 0000000000..8c03465dc3 --- /dev/null +++ b/chat_favourites_in_systray/static/src/css/systray.css @@ -0,0 +1,7 @@ +.MessagingMenuContainer div:first-child { + display: flex; +} +.o-mail-MessagingMenu-list { + margin-top: 0 !important; + padding-top: 0 !important; +} diff --git a/chat_favourites_in_systray/static/src/js/messaging_menu.js b/chat_favourites_in_systray/static/src/js/messaging_menu.js new file mode 100644 index 0000000000..f4caab1d77 --- /dev/null +++ b/chat_favourites_in_systray/static/src/js/messaging_menu.js @@ -0,0 +1,76 @@ +/** @odoo-module **/ + +import { MessagingMenu } from "@mail/core/public_web/messaging_menu"; +import { patch } from "@web/core/utils/patch"; +import { rpc } from "@web/core/network/rpc"; +import { session } from "@web/session"; +import { useState } from "@odoo/owl"; + +patch(MessagingMenu.prototype, { + async setup() { + super.setup(); + this.state = useState({ + favoriteChannels: [], + matchedFavouriteChats: [], + }); + + // Fetch favorite channels for the current user + await this._loadFavoriteChannels(); + }, + + async _loadFavoriteChannels() { + const userDomain = [['id', '=', session.storeData.Store.settings.user_id.id]]; + const userFields = ['mail_channel_ids']; + + const userData = await rpc('/web/dataset/call_kw/res.users/search_read', { + model: 'res.users', + method: 'search_read', + args: [userDomain, userFields], + kwargs: {}, + }); + + if (userData?.[0]?.mail_channel_ids?.length) { + const channelIds = userData[0].mail_channel_ids; + const channelDomain = [['id', 'in', channelIds]]; + + const allFields = await rpc('/web/dataset/call_kw/discuss.channel/fields_get', { + model: 'discuss.channel', + method: 'fields_get', + args: [], + kwargs: {}, + }); + + const channelFields = Object.keys(allFields); + + const channelData = await rpc('/web/dataset/call_kw/discuss.channel/search_read', { + model: 'discuss.channel', + method: 'search_read', + args: [channelDomain, channelFields], + kwargs: {}, + }); + + this.state.favoriteChannels = channelData.map(channel => ({ + ...channel, + body: JSON.stringify(channel), + })); + } + }, + + onClickFavouriteTab() { + this.store.discuss.activeTab = 'favourite'; + this.store.channels.status = 'fetching'; + + const records = this.store.Thread.records; + const favouriteChats = Object.values(records).filter(thread => + thread.model === "discuss.channel" && + ["chat", "channel"].includes(thread.channel_type) && + thread.favourite + ); + + const favouriteChannelIds = this.state.favoriteChannels.map(channel => channel.id); + + this.state.matchedFavouriteChats = favouriteChats.filter(chat => + favouriteChannelIds.includes(chat.id) + ); + }, +}); diff --git a/chat_favourites_in_systray/static/src/js/notification_item.js b/chat_favourites_in_systray/static/src/js/notification_item.js new file mode 100644 index 0000000000..bf4789b687 --- /dev/null +++ b/chat_favourites_in_systray/static/src/js/notification_item.js @@ -0,0 +1,68 @@ +/** @odoo-module **/ + +import { NotificationItem } from "@mail/core/public_web/notification_item"; +import { patch } from "@web/core/utils/patch"; +import { rpc } from "@web/core/network/rpc"; +import { session } from "@web/session"; +import { useState } from "@odoo/owl"; + +patch(NotificationItem.prototype, { + async setup() { + super.setup(); + this.state = useState({ + thread: null, + channels: [], + }); + + const thread = this.props?.slots?.icon?.__ctx?.thread; + if (thread) { + this.state.thread = thread; + } + + // Fetch user's channel IDs + const domain = [['id', '=', session.storeData.Store.settings.user_id.id]]; + const fields = ['mail_channel_ids']; + + const data = await rpc('/web/dataset/call_kw/res.users/search_read', { + model: 'res.users', + method: 'search_read', + args: [domain, fields], + kwargs: {}, + }); + + this.state.channels = data[0]?.mail_channel_ids || []; + // Set thread as favourite if it's in user's channels + if (this.state.thread) { + this.state.thread.favourite = this.state.channels.includes(this.state.thread.id); + } + }, + + async _onClickMarkFavourite(ev) { + const thread = this.props.slots.icon.__ctx.thread; + const starClassList = ev.target.classList; + + if (starClassList.contains('text-danger')) { + // Unmark as favourite + starClassList.remove('text-danger'); + starClassList.add('text-muted'); + + await rpc('/disable_favourite', { + active_id: thread.id, + user_id: session.storeData.Store.settings.user_id.id, + }); + + thread.favourite = false; + } else { + // Mark as favourite + starClassList.add('text-danger'); + starClassList.remove('text-muted'); + + await rpc('/enable_favourite', { + active_id: thread.id, + user_id: session.storeData.Store.settings.user_id.id, + }); + + thread.favourite = true; + } + }, +}); diff --git a/chat_favourites_in_systray/static/src/xml/systray.xml b/chat_favourites_in_systray/static/src/xml/systray.xml new file mode 100644 index 0000000000..fde9b71781 --- /dev/null +++ b/chat_favourites_in_systray/static/src/xml/systray.xml @@ -0,0 +1,82 @@ + + diff --git a/chat_favourites_in_systray/views/res_users_views.xml b/chat_favourites_in_systray/views/res_users_views.xml new file mode 100644 index 0000000000..1527816519 --- /dev/null +++ b/chat_favourites_in_systray/views/res_users_views.xml @@ -0,0 +1,14 @@ + + + + + res.users.view.form.inherit.chat.favourites.in.systray + res.users + + + + + + + + diff --git a/ecommerce_barcode_search/__init__.py b/ecommerce_barcode_search/__init__.py index f98d0b623a..9226d4c024 100644 --- a/ecommerce_barcode_search/__init__.py +++ b/ecommerce_barcode_search/__init__.py @@ -20,4 +20,6 @@ # along with this program. If not, see . # ################################################################################### +from . import models from . import controllers + diff --git a/ecommerce_barcode_search/__manifest__.py b/ecommerce_barcode_search/__manifest__.py index 0c041ee67d..4e4ab88ae4 100644 --- a/ecommerce_barcode_search/__manifest__.py +++ b/ecommerce_barcode_search/__manifest__.py @@ -22,7 +22,7 @@ ################################################################################### { 'name': 'Ecommerce Barcode Search', - 'version': '18.0.1.0.0', + 'version': '18.0.1.2.0', 'category': 'Website', 'summary': 'Ecommerce Barcode Search', 'description': 'This module enables users to search for products on the website using barcodes.' @@ -39,7 +39,10 @@ 'images': ['static/description/banner.jpg'], 'website': 'https://www.cybrosys.com', 'depends': ['website_sale'], - 'data': ['views/website_sale_template.xml'], + 'data': [ + 'views/website_sale_template.xml', + 'views/templates.xml', + ], 'assets': { 'web.assets_frontend': [ 'ecommerce_barcode_search/static/src/js/WebsiteSaleBarcode.js', diff --git a/ecommerce_barcode_search/controllers/web_product_qr_scan.py b/ecommerce_barcode_search/controllers/web_product_qr_scan.py index cab7a67035..934f9f9578 100644 --- a/ecommerce_barcode_search/controllers/web_product_qr_scan.py +++ b/ecommerce_barcode_search/controllers/web_product_qr_scan.py @@ -35,10 +35,23 @@ def product_barcode(self,**kwargs): input_data = kwargs.get('last_code') slug = request.env['ir.http']._slug barcode_product = request.env['product.product'].search([('barcode', '=', input_data)]) + request.session['barcode'] = input_data + request.session['barcode_product'] = barcode_product.id if barcode_product: return { 'type': 'ir.actions.act_url', - 'url': '/shop/%s' % slug(barcode_product.product_tmpl_id) + 'url': '/shop/%s?extra_param=true' % slug(barcode_product.product_tmpl_id) } else: return False + + @http.route() + def product(self, product, category='', search='', **kwargs): + is_barcode_scanned = kwargs.get('extra_param', 'false') + is_barcode_scanned = is_barcode_scanned.lower() == 'true' + res = super().product(product=product, category=category, search=search) + res.qcontext.update({ + 'is_barcode_scanned': is_barcode_scanned, + }) + + return res diff --git a/ecommerce_barcode_search/doc/RELEASE_NOTES.md b/ecommerce_barcode_search/doc/RELEASE_NOTES.md index 32bf8c9caf..9164548430 100644 --- a/ecommerce_barcode_search/doc/RELEASE_NOTES.md +++ b/ecommerce_barcode_search/doc/RELEASE_NOTES.md @@ -4,3 +4,13 @@ #### Version 18.0.1.0.0 #### ADD - Initial Commit for Ecommerce Barcode Search + +#### 18.09.2025 +#### Version 18.0.1.1.0 +#### BUG_FIX +- Enabled variant selection on the product page via barcode scanning + +#### 23.09.2025 +#### Version 18.0.1.2.0 +#### BUG_FIX +- Enabled multiple variant selection on the product page via barcode scanning \ No newline at end of file diff --git a/ecommerce_barcode_search/models/__init__.py b/ecommerce_barcode_search/models/__init__.py new file mode 100644 index 0000000000..2757b3ab65 --- /dev/null +++ b/ecommerce_barcode_search/models/__init__.py @@ -0,0 +1,2 @@ +# -*- coding: utf-8 -*- +from . import product_template diff --git a/ecommerce_barcode_search/models/product_template.py b/ecommerce_barcode_search/models/product_template.py new file mode 100644 index 0000000000..067cc80f0a --- /dev/null +++ b/ecommerce_barcode_search/models/product_template.py @@ -0,0 +1,23 @@ +# -*- coding: utf-8 -*- +from odoo import models +from odoo.http import request + + +class ProductTemplate(models.Model): + _inherit = "product.template" + + def _get_combination_info( + self, combination=False, product_id=False, add_qty=1.0, + parent_combination=False, only_template=False, is_barcode=False + ): + + res = super()._get_combination_info(combination=combination, product_id=product_id, add_qty=add_qty, + parent_combination=parent_combination, only_template=only_template) + if is_barcode: + if request.session.get('barcode'): + product = self.env['product.product'].search([('barcode', '=', request.session.get('barcode'))]) + if product: + res.update({ + 'combination': [each for each in product.product_template_attribute_value_ids], + }) + return res diff --git a/ecommerce_barcode_search/views/templates.xml b/ecommerce_barcode_search/views/templates.xml new file mode 100644 index 0000000000..780224bcea --- /dev/null +++ b/ecommerce_barcode_search/views/templates.xml @@ -0,0 +1,9 @@ + + + + diff --git a/invoice_stock_move/models/account_move.py b/invoice_stock_move/models/account_move.py index 54ba11ecfd..497cabdfaa 100755 --- a/invoice_stock_move/models/account_move.py +++ b/invoice_stock_move/models/account_move.py @@ -53,43 +53,104 @@ def _compute_picking_type_id(self): rec.picking_type_id = type def action_stock_move(self): - """Function to create transfer from invoice""" - if not self.picking_type_id: - raise UserError(_( - " Please select a picking type")) - for order in self: - if not self.invoice_picking_id: - pick = {} - if self.picking_type_id.code == 'outgoing': - pick = { - 'picking_type_id': self.picking_type_id.id, - 'partner_id': self.partner_id.id, - 'origin': self.name, - 'location_dest_id': self.partner_id. - property_stock_customer.id, - 'location_id': self.picking_type_id. - default_location_src_id.id, - 'move_type': 'direct' - } - if self.picking_type_id.code == 'incoming': - pick = { - 'picking_type_id': self.picking_type_id.id, - 'partner_id': self.partner_id.id, - 'origin': self.name, - 'location_dest_id': self.picking_type_id. - default_location_dest_id.id, - 'location_id': self.partner_id. - property_stock_supplier.id, - 'move_type': 'direct' - } - picking = self.env['stock.picking'].create(pick) - self.invoice_picking_id = picking.id - self.picking_count = len(picking) - order = order.invoice_line_ids.filtered(lambda item: - item.product_id.type in - ['product', 'consu']) - (order._create_stock_moves(picking)._action_confirm(). - _action_assign()) + """Create or link a stock picking from the invoice for deliveries or credit note returns.""" + for invoice in self: + # Determine picking type + if invoice.move_type == 'out_refund': + # Credit note → use incoming picking type + picking_type = self.env['stock.picking.type'].search( + [('code', '=', 'incoming')], limit=1) + if not picking_type: + raise UserError( + _("No incoming picking type configured. Please configure one.")) + else: + # Customer invoice → use outgoing picking type + picking_type = self.env['stock.picking.type'].search( + [('code', '=', 'outgoing')], limit=1) + if not picking_type: + raise UserError( + _("No outgoing picking type configured. Please configure one.")) + + invoice.picking_type_id = picking_type + + # Create picking if it does not exist + if not invoice.invoice_picking_id: + picking_vals = { + 'picking_type_id': picking_type.id, + 'partner_id': invoice.partner_id.id, + 'origin': invoice.name, + 'move_type': 'direct', + } + + # Set locations based on picking type + if picking_type.code == 'outgoing': + picking_vals.update({ + 'location_id': picking_type.default_location_src_id.id, + 'location_dest_id': invoice.partner_id.property_stock_customer.id, + }) + else: # incoming + picking_vals.update({ + 'location_id': invoice.partner_id.property_stock_customer.id, + 'location_dest_id': picking_type.default_location_dest_id.id, + }) + + picking = self.env['stock.picking'].create(picking_vals) + invoice.invoice_picking_id = picking.id + invoice.picking_count = 1 + + # Create stock moves for stockable and consumable products + stock_lines = invoice.invoice_line_ids.filtered( + lambda l: l.product_id.type in ['product', 'consu']) + for line in stock_lines: + self.env['stock.move'].create({ + 'name': line.name, + 'product_id': line.product_id.id, + 'product_uom_qty': line.quantity, + 'product_uom': line.product_id.uom_id.id, + 'picking_id': picking.id, + 'location_id': picking_vals['location_id'], + 'location_dest_id': picking_vals['location_dest_id'], + }) + + # Confirm and assign the picking + picking.action_confirm() + picking.action_assign() + + # For credit notes, create a separate return picking + if invoice.move_type == 'out_refund': + original_picking = invoice.invoice_picking_id + + # Create a new incoming picking for the return + return_picking = self.env['stock.picking'].create({ + 'origin': invoice.name, + 'picking_type_id': picking_type.id, + 'location_id': invoice.partner_id.property_stock_customer.id, + # source = customer + 'location_dest_id': picking_type.default_location_dest_id.id, + # dest = stock + 'partner_id': invoice.partner_id.id, + 'move_type': 'direct', + }) + + # Create stock moves for returned products + for line in invoice.invoice_line_ids.filtered( + lambda l: l.product_id.type in ['product', 'consu']): + self.env['stock.move'].create({ + 'name': line.name, + 'product_id': line.product_id.id, + 'product_uom_qty': line.quantity, + 'product_uom': line.product_id.uom_id.id, + 'picking_id': return_picking.id, + 'location_id': invoice.partner_id.property_stock_customer.id, + 'location_dest_id': picking_type.default_location_dest_id.id, + }) + + # Confirm and assign the return picking + return_picking.action_confirm() + return_picking.action_assign() + + # Link the return picking to the credit note + invoice.invoice_picking_id = return_picking.id def action_view_picking(self): """Function to view moves while clicking shipment smart button""" diff --git a/invoice_stock_move/static/description/assets/screenshots/Gif.gif b/invoice_stock_move/static/description/assets/screenshots/Gif.gif index 67c323cee0..b73349b9ae 100644 Binary files a/invoice_stock_move/static/description/assets/screenshots/Gif.gif and b/invoice_stock_move/static/description/assets/screenshots/Gif.gif differ diff --git a/invoice_stock_move/static/description/assets/screenshots/Screenshot5.png b/invoice_stock_move/static/description/assets/screenshots/Screenshot5.png new file mode 100644 index 0000000000..2ca2d17fdd Binary files /dev/null and b/invoice_stock_move/static/description/assets/screenshots/Screenshot5.png differ diff --git a/invoice_stock_move/static/description/assets/screenshots/Screenshot6.png b/invoice_stock_move/static/description/assets/screenshots/Screenshot6.png new file mode 100644 index 0000000000..1b2ed30c55 Binary files /dev/null and b/invoice_stock_move/static/description/assets/screenshots/Screenshot6.png differ diff --git a/invoice_stock_move/static/description/assets/screenshots/Screenshot7.png b/invoice_stock_move/static/description/assets/screenshots/Screenshot7.png new file mode 100644 index 0000000000..dc200c38e3 Binary files /dev/null and b/invoice_stock_move/static/description/assets/screenshots/Screenshot7.png differ diff --git a/invoice_stock_move/static/description/index.html b/invoice_stock_move/static/description/index.html index d7580f34e7..6e764fc95f 100644 --- a/invoice_stock_move/static/description/index.html +++ b/invoice_stock_move/static/description/index.html @@ -132,7 +132,8 @@ line-height: 15.96px; text-transform: uppercase; "> - This Module Enables To Stock Pickings From Customer/Supplier Invoice. + This Module Enables To Stock Pickings From + Customer/Supplier Invoice.

- Automatically creates stock picking from customer invoice. + Automatically creates stock picking from + customer invoice.

@@ -259,6 +261,23 @@ +
+
+
+ +
+
+ Creates incoming stock (WH/IN) from credit + note using the shipment button. +
+
+
@@ -403,7 +422,8 @@

- Transfer button to transfer the product. + Transfer button to transfer the + product.

@@ -431,7 +451,8 @@

- Shipment smart button to view the transfer in inventory. + Shipment smart button to view + the transfer in inventory.

@@ -469,6 +490,85 @@
+
+
+
+
+

+ Transfer Button in + Credit Note +

+
+
+

+ Transfer button shows the + Shipment smart button which + creates a WH/IN for returned + products. +

+
+
+
+ +
+
+
+
+
+
+
+
+

+ Shipment + Smart Button +

+
+
+
+ +
+
+
+
+
+
+
+

+ Corresponding + Transfer +

+
+
+
+ +
+
+
+
+

- Stock Picking from Customer Invoice.

+ Stock Picking from Customer + Invoice.

@@ -499,7 +600,8 @@ style="color:#fff; font-size:14px">

- Stock Picking from Supplier bill.

+ Stock Picking from Supplier + bill.

@@ -529,8 +631,10 @@ style="cursor: pointer; background-color:#f8f8f8; border:none; border-top-right-radius:10px; border-top-left-radius:10px; padding: 12px 24px;"> - Can stock pickings be created - from invoices with this module? + Can stock pickings + be created + from invoices with + this module?

- Yes, it allows stock pickings to - be generated from customer and + Yes, it allows stock + pickings to + be generated from + customer and supplier invoices. @@ -558,8 +664,10 @@ style="cursor: pointer; background-color:#f8f8f8; border:1px solid #f8f8f8; border-top-right-radius:10px; border-top-left-radius:10px; padding: 12px 24px"> - Does this module connect - invoices to inventory movements? + Does this module + connect + invoices to + inventory movements?

- Yes, it links invoices with - the corresponding stock - operations automatically. + Yes, it links + invoices with + the corresponding + stock + operations + automatically.

@@ -629,16 +740,20 @@

Related Products

-