diff --git a/image_capture_upload_widget/README.rst b/image_capture_upload_widget/README.rst new file mode 100644 index 000000000..567cc1e29 --- /dev/null +++ b/image_capture_upload_widget/README.rst @@ -0,0 +1,49 @@ +.. image:: https://img.shields.io/badge/licenses-AGPL--3-blue.svg + :target: https://www.gnu.org/licenses/agpl-3.0-standalone.html + :alt: License: AGPL-3 + +Image Capture Widget +======================= +This module allow to Capture images from the webcam . + +Configuration +============= +* No additional configurations needed. + +Company +------- +* `Cybrosys Techno Solutions `__ + +License +------- +Affero General Public License, Version 3 (AGPL v3). +(https://www.gnu.org/licenses/agpl-3.0-standalone.html) + +Credits +------- +* Developers: (V16) Megha K, + (V17) Anjhana A K, + (V18) Ammu Raj + 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/image_capture_upload_widget/__init__.py b/image_capture_upload_widget/__init__.py new file mode 100644 index 000000000..5836105c5 --- /dev/null +++ b/image_capture_upload_widget/__init__.py @@ -0,0 +1,22 @@ +# -*- coding: utf-8 -*- +############################################################################### +# +# Cybrosys Technologies Pvt. Ltd. +# +# Copyright (C) 2025-TODAY Cybrosys Technologies() +# Author: Ammu Raj (odoo@cybrosys.com) +# +# You can modify it under the terms of the GNU AFFERO +# GENERAL PUBLIC LICENSE (AGPL v3), Version 3. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU AFFERO GENERAL PUBLIC LICENSE (AGPL v3) for more details. +# +# You should have received a copy of the GNU AFFERO GENERAL PUBLIC LICENSE +# (AGPL v3) along with this program. +# If not, see . +# +############################################################################### +from . import wizard diff --git a/image_capture_upload_widget/__manifest__.py b/image_capture_upload_widget/__manifest__.py new file mode 100644 index 000000000..e11d2fbb6 --- /dev/null +++ b/image_capture_upload_widget/__manifest__.py @@ -0,0 +1,49 @@ +# -*- coding: utf-8 -*- +############################################################################### +# +# Cybrosys Technologies Pvt. Ltd. +# +# Copyright (C) 2025-TODAY Cybrosys Technologies() +# Author: Ammu Raj (odoo@cybrosys.com) +# +# You can modify it under the terms of the GNU AFFERO +# GENERAL PUBLIC LICENSE (AGPL v3), Version 3. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU AFFERO GENERAL PUBLIC LICENSE (AGPL v3) for more details. +# +# You should have received a copy of the GNU AFFERO GENERAL PUBLIC LICENSE +# (AGPL v3) along with this program. +# If not, see . +# +############################################################################### +{ + 'name': 'Image Capture Widget', + 'version': '18.0.1.0.0', + 'category': 'Extra Tools', + 'summary': """This module allows to capture the users image from the + webcam.""", + 'description': """This module is used to add Image Capture Widget for Image + Field. We can capture the image from the webcam and upload into the binary + field.""", + 'author': 'Cybrosys Techno Solutions', + 'company': 'Cybrosys Techno Solutions', + 'maintainer': 'Cybrosys Techno Solutions', + 'website': 'https://www.cybrosys.com', + 'depends': ['sale_management', 'contacts'], + 'data': ['security/ir.model.access.csv'], + 'assets': { + 'web.assets_backend': [ + '/image_capture_upload_widget/static/src/scss/image_capture.scss', + '/image_capture_upload_widget/static/src/js/image_capture.js', + '/image_capture_upload_widget/static/src/xml/image_capture_templates.xml', + ], + }, + 'images': ['static/description/banner.jpg'], + 'license': 'AGPL-3', + 'installable': True, + 'auto_install': False, + 'application': False, +} diff --git a/image_capture_upload_widget/doc/RELEASE_NOTES.md b/image_capture_upload_widget/doc/RELEASE_NOTES.md new file mode 100644 index 000000000..e13505510 --- /dev/null +++ b/image_capture_upload_widget/doc/RELEASE_NOTES.md @@ -0,0 +1,6 @@ +## Module + +#### 19.03.2025 +#### Version 18.0.1.0.0 +##### ADD +- Initial commit for Image Capture Widget diff --git a/image_capture_upload_widget/security/ir.model.access.csv b/image_capture_upload_widget/security/ir.model.access.csv new file mode 100644 index 000000000..d71a7ca78 --- /dev/null +++ b/image_capture_upload_widget/security/ir.model.access.csv @@ -0,0 +1,2 @@ +id,name,model_id:id,group_id:id,perm_read,perm_write,perm_create,perm_unlink +access_image_capture_user,access.image.capture.user,model_image_capture,base.group_user,1,1,1,1 diff --git a/image_capture_upload_widget/static/description/assets/cybro-icon.png b/image_capture_upload_widget/static/description/assets/cybro-icon.png new file mode 100644 index 000000000..06e73e11d Binary files /dev/null and b/image_capture_upload_widget/static/description/assets/cybro-icon.png differ diff --git a/image_capture_upload_widget/static/description/assets/cybro-odoo.png b/image_capture_upload_widget/static/description/assets/cybro-odoo.png new file mode 100644 index 000000000..ed02e07a4 Binary files /dev/null and b/image_capture_upload_widget/static/description/assets/cybro-odoo.png differ diff --git a/image_capture_upload_widget/static/description/assets/h2.png b/image_capture_upload_widget/static/description/assets/h2.png new file mode 100644 index 000000000..0bfc4707d Binary files /dev/null and b/image_capture_upload_widget/static/description/assets/h2.png differ diff --git a/image_capture_upload_widget/static/description/assets/icons/arrows-repeat.svg b/image_capture_upload_widget/static/description/assets/icons/arrows-repeat.svg new file mode 100644 index 000000000..1d7efabc5 --- /dev/null +++ b/image_capture_upload_widget/static/description/assets/icons/arrows-repeat.svg @@ -0,0 +1,10 @@ + + + + + + + + + + diff --git a/image_capture_upload_widget/static/description/assets/icons/banner-1.png b/image_capture_upload_widget/static/description/assets/icons/banner-1.png new file mode 100644 index 000000000..c180db172 Binary files /dev/null and b/image_capture_upload_widget/static/description/assets/icons/banner-1.png differ diff --git a/image_capture_upload_widget/static/description/assets/icons/banner-2.svg b/image_capture_upload_widget/static/description/assets/icons/banner-2.svg new file mode 100644 index 000000000..e606d97d9 --- /dev/null +++ b/image_capture_upload_widget/static/description/assets/icons/banner-2.svg @@ -0,0 +1,73 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/image_capture_upload_widget/static/description/assets/icons/banner-bg.png b/image_capture_upload_widget/static/description/assets/icons/banner-bg.png new file mode 100644 index 000000000..a8238d3c0 Binary files /dev/null and b/image_capture_upload_widget/static/description/assets/icons/banner-bg.png differ diff --git a/image_capture_upload_widget/static/description/assets/icons/banner-bg.svg b/image_capture_upload_widget/static/description/assets/icons/banner-bg.svg new file mode 100644 index 000000000..b1378103e --- /dev/null +++ b/image_capture_upload_widget/static/description/assets/icons/banner-bg.svg @@ -0,0 +1,9 @@ + + + + + + + + + diff --git a/image_capture_upload_widget/static/description/assets/icons/banner-call.svg b/image_capture_upload_widget/static/description/assets/icons/banner-call.svg new file mode 100644 index 000000000..96c687e81 --- /dev/null +++ b/image_capture_upload_widget/static/description/assets/icons/banner-call.svg @@ -0,0 +1,5 @@ + + + + + diff --git a/image_capture_upload_widget/static/description/assets/icons/banner-mail.svg b/image_capture_upload_widget/static/description/assets/icons/banner-mail.svg new file mode 100644 index 000000000..cbf0d158d --- /dev/null +++ b/image_capture_upload_widget/static/description/assets/icons/banner-mail.svg @@ -0,0 +1,5 @@ + + + + + diff --git a/image_capture_upload_widget/static/description/assets/icons/banner-pattern.svg b/image_capture_upload_widget/static/description/assets/icons/banner-pattern.svg new file mode 100644 index 000000000..9c1c7e101 --- /dev/null +++ b/image_capture_upload_widget/static/description/assets/icons/banner-pattern.svg @@ -0,0 +1,343 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/image_capture_upload_widget/static/description/assets/icons/banner-promo.svg b/image_capture_upload_widget/static/description/assets/icons/banner-promo.svg new file mode 100644 index 000000000..d52791b11 --- /dev/null +++ b/image_capture_upload_widget/static/description/assets/icons/banner-promo.svg @@ -0,0 +1,147 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/image_capture_upload_widget/static/description/assets/icons/brand-pair.svg b/image_capture_upload_widget/static/description/assets/icons/brand-pair.svg new file mode 100644 index 000000000..d8db7fc1e --- /dev/null +++ b/image_capture_upload_widget/static/description/assets/icons/brand-pair.svg @@ -0,0 +1,41 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/image_capture_upload_widget/static/description/assets/icons/check.png b/image_capture_upload_widget/static/description/assets/icons/check.png new file mode 100644 index 000000000..c8e85f51d Binary files /dev/null and b/image_capture_upload_widget/static/description/assets/icons/check.png differ diff --git a/image_capture_upload_widget/static/description/assets/icons/chevron.png b/image_capture_upload_widget/static/description/assets/icons/chevron.png new file mode 100644 index 000000000..2089293d6 Binary files /dev/null and b/image_capture_upload_widget/static/description/assets/icons/chevron.png differ diff --git a/image_capture_upload_widget/static/description/assets/icons/close-icon.svg b/image_capture_upload_widget/static/description/assets/icons/close-icon.svg new file mode 100644 index 000000000..df8cce37a --- /dev/null +++ b/image_capture_upload_widget/static/description/assets/icons/close-icon.svg @@ -0,0 +1,5 @@ + + + + + diff --git a/image_capture_upload_widget/static/description/assets/icons/cogs.png b/image_capture_upload_widget/static/description/assets/icons/cogs.png new file mode 100644 index 000000000..95d0bad62 Binary files /dev/null and b/image_capture_upload_widget/static/description/assets/icons/cogs.png differ diff --git a/image_capture_upload_widget/static/description/assets/icons/collabarate-icon.svg b/image_capture_upload_widget/static/description/assets/icons/collabarate-icon.svg new file mode 100644 index 000000000..dd4e10518 --- /dev/null +++ b/image_capture_upload_widget/static/description/assets/icons/collabarate-icon.svg @@ -0,0 +1,3 @@ + + + diff --git a/image_capture_upload_widget/static/description/assets/icons/consultation.png b/image_capture_upload_widget/static/description/assets/icons/consultation.png new file mode 100644 index 000000000..8319d4baa Binary files /dev/null and b/image_capture_upload_widget/static/description/assets/icons/consultation.png differ diff --git a/image_capture_upload_widget/static/description/assets/icons/cybro-logo.png b/image_capture_upload_widget/static/description/assets/icons/cybro-logo.png new file mode 100644 index 000000000..ff4b78220 Binary files /dev/null and b/image_capture_upload_widget/static/description/assets/icons/cybro-logo.png differ diff --git a/image_capture_upload_widget/static/description/assets/icons/down.svg b/image_capture_upload_widget/static/description/assets/icons/down.svg new file mode 100644 index 000000000..f21c36271 --- /dev/null +++ b/image_capture_upload_widget/static/description/assets/icons/down.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/image_capture_upload_widget/static/description/assets/icons/ecom-black.png b/image_capture_upload_widget/static/description/assets/icons/ecom-black.png new file mode 100644 index 000000000..a9385ff13 Binary files /dev/null and b/image_capture_upload_widget/static/description/assets/icons/ecom-black.png differ diff --git a/image_capture_upload_widget/static/description/assets/icons/education-black.png b/image_capture_upload_widget/static/description/assets/icons/education-black.png new file mode 100644 index 000000000..3eb09b27b Binary files /dev/null and b/image_capture_upload_widget/static/description/assets/icons/education-black.png differ diff --git a/image_capture_upload_widget/static/description/assets/icons/faq.png b/image_capture_upload_widget/static/description/assets/icons/faq.png new file mode 100644 index 000000000..4250b5b81 Binary files /dev/null and b/image_capture_upload_widget/static/description/assets/icons/faq.png differ diff --git a/image_capture_upload_widget/static/description/assets/icons/feature-icon.svg b/image_capture_upload_widget/static/description/assets/icons/feature-icon.svg new file mode 100644 index 000000000..fa0ea6850 --- /dev/null +++ b/image_capture_upload_widget/static/description/assets/icons/feature-icon.svg @@ -0,0 +1,10 @@ + + + + + + + + + + diff --git a/image_capture_upload_widget/static/description/assets/icons/feature.png b/image_capture_upload_widget/static/description/assets/icons/feature.png new file mode 100644 index 000000000..ac7a785c0 Binary files /dev/null and b/image_capture_upload_widget/static/description/assets/icons/feature.png differ diff --git a/image_capture_upload_widget/static/description/assets/icons/gear.svg b/image_capture_upload_widget/static/description/assets/icons/gear.svg new file mode 100644 index 000000000..0cc66b6ea --- /dev/null +++ b/image_capture_upload_widget/static/description/assets/icons/gear.svg @@ -0,0 +1,10 @@ + + + + + + + + + + diff --git a/image_capture_upload_widget/static/description/assets/icons/hero.gif b/image_capture_upload_widget/static/description/assets/icons/hero.gif new file mode 100644 index 000000000..380654dfe Binary files /dev/null and b/image_capture_upload_widget/static/description/assets/icons/hero.gif differ diff --git a/image_capture_upload_widget/static/description/assets/icons/hire-odoo.svg b/image_capture_upload_widget/static/description/assets/icons/hire-odoo.svg new file mode 100644 index 000000000..e1ac089b0 --- /dev/null +++ b/image_capture_upload_widget/static/description/assets/icons/hire-odoo.svg @@ -0,0 +1,12 @@ + + + + + + + + + + + + diff --git a/image_capture_upload_widget/static/description/assets/icons/hotel-black.png b/image_capture_upload_widget/static/description/assets/icons/hotel-black.png new file mode 100644 index 000000000..130f613be Binary files /dev/null and b/image_capture_upload_widget/static/description/assets/icons/hotel-black.png differ diff --git a/image_capture_upload_widget/static/description/assets/icons/license.png b/image_capture_upload_widget/static/description/assets/icons/license.png new file mode 100644 index 000000000..a5869797e Binary files /dev/null and b/image_capture_upload_widget/static/description/assets/icons/license.png differ diff --git a/image_capture_upload_widget/static/description/assets/icons/life-ring-icon.svg b/image_capture_upload_widget/static/description/assets/icons/life-ring-icon.svg new file mode 100644 index 000000000..3ae6e1d89 --- /dev/null +++ b/image_capture_upload_widget/static/description/assets/icons/life-ring-icon.svg @@ -0,0 +1,13 @@ + + + + + + + + + + + + + diff --git a/image_capture_upload_widget/static/description/assets/icons/lifebuoy.png b/image_capture_upload_widget/static/description/assets/icons/lifebuoy.png new file mode 100644 index 000000000..658d56ccc Binary files /dev/null and b/image_capture_upload_widget/static/description/assets/icons/lifebuoy.png differ diff --git a/image_capture_upload_widget/static/description/assets/icons/mail.svg b/image_capture_upload_widget/static/description/assets/icons/mail.svg new file mode 100644 index 000000000..1eedde695 --- /dev/null +++ b/image_capture_upload_widget/static/description/assets/icons/mail.svg @@ -0,0 +1,3 @@ + + + diff --git a/image_capture_upload_widget/static/description/assets/icons/manufacturing-black.png b/image_capture_upload_widget/static/description/assets/icons/manufacturing-black.png new file mode 100644 index 000000000..697eb0e9f Binary files /dev/null and b/image_capture_upload_widget/static/description/assets/icons/manufacturing-black.png differ diff --git a/image_capture_upload_widget/static/description/assets/icons/notes.png b/image_capture_upload_widget/static/description/assets/icons/notes.png new file mode 100644 index 000000000..ee5e95404 Binary files /dev/null and b/image_capture_upload_widget/static/description/assets/icons/notes.png differ diff --git a/image_capture_upload_widget/static/description/assets/icons/notification icon.svg b/image_capture_upload_widget/static/description/assets/icons/notification icon.svg new file mode 100644 index 000000000..053189973 --- /dev/null +++ b/image_capture_upload_widget/static/description/assets/icons/notification icon.svg @@ -0,0 +1,10 @@ + + + + + + + + + + diff --git a/image_capture_upload_widget/static/description/assets/icons/odoo-consultancy.svg b/image_capture_upload_widget/static/description/assets/icons/odoo-consultancy.svg new file mode 100644 index 000000000..e05f65bde --- /dev/null +++ b/image_capture_upload_widget/static/description/assets/icons/odoo-consultancy.svg @@ -0,0 +1,4 @@ + + + + diff --git a/image_capture_upload_widget/static/description/assets/icons/odoo-licencing.svg b/image_capture_upload_widget/static/description/assets/icons/odoo-licencing.svg new file mode 100644 index 000000000..2606c88b0 --- /dev/null +++ b/image_capture_upload_widget/static/description/assets/icons/odoo-licencing.svg @@ -0,0 +1,3 @@ + + + diff --git a/image_capture_upload_widget/static/description/assets/icons/odoo-logo.png b/image_capture_upload_widget/static/description/assets/icons/odoo-logo.png new file mode 100644 index 000000000..0e4d0eb5a Binary files /dev/null and b/image_capture_upload_widget/static/description/assets/icons/odoo-logo.png differ diff --git a/image_capture_upload_widget/static/description/assets/icons/patter.svg b/image_capture_upload_widget/static/description/assets/icons/patter.svg new file mode 100644 index 000000000..25c9c0a8f --- /dev/null +++ b/image_capture_upload_widget/static/description/assets/icons/patter.svg @@ -0,0 +1,9 @@ + + + + + + + + + diff --git a/image_capture_upload_widget/static/description/assets/icons/pattern1.png b/image_capture_upload_widget/static/description/assets/icons/pattern1.png new file mode 100644 index 000000000..09ab0fb2d Binary files /dev/null and b/image_capture_upload_widget/static/description/assets/icons/pattern1.png differ diff --git a/image_capture_upload_widget/static/description/assets/icons/pos-black.png b/image_capture_upload_widget/static/description/assets/icons/pos-black.png new file mode 100644 index 000000000..97c0f90c1 Binary files /dev/null and b/image_capture_upload_widget/static/description/assets/icons/pos-black.png differ diff --git a/image_capture_upload_widget/static/description/assets/icons/puzzle-piece-icon.svg b/image_capture_upload_widget/static/description/assets/icons/puzzle-piece-icon.svg new file mode 100644 index 000000000..3e9ad9373 --- /dev/null +++ b/image_capture_upload_widget/static/description/assets/icons/puzzle-piece-icon.svg @@ -0,0 +1,10 @@ + + + + + + + + + + diff --git a/image_capture_upload_widget/static/description/assets/icons/puzzle.png b/image_capture_upload_widget/static/description/assets/icons/puzzle.png new file mode 100644 index 000000000..65cf854e7 Binary files /dev/null and b/image_capture_upload_widget/static/description/assets/icons/puzzle.png differ diff --git a/image_capture_upload_widget/static/description/assets/icons/replace-icon.svg b/image_capture_upload_widget/static/description/assets/icons/replace-icon.svg new file mode 100644 index 000000000..d0e3a7af1 --- /dev/null +++ b/image_capture_upload_widget/static/description/assets/icons/replace-icon.svg @@ -0,0 +1,10 @@ + + + + + + + + + + diff --git a/image_capture_upload_widget/static/description/assets/icons/restaurant-black.png b/image_capture_upload_widget/static/description/assets/icons/restaurant-black.png new file mode 100644 index 000000000..4a35eb939 Binary files /dev/null and b/image_capture_upload_widget/static/description/assets/icons/restaurant-black.png differ diff --git a/image_capture_upload_widget/static/description/assets/icons/screenshot-main.png b/image_capture_upload_widget/static/description/assets/icons/screenshot-main.png new file mode 100644 index 000000000..575f8e676 Binary files /dev/null and b/image_capture_upload_widget/static/description/assets/icons/screenshot-main.png differ diff --git a/image_capture_upload_widget/static/description/assets/icons/screenshot.png b/image_capture_upload_widget/static/description/assets/icons/screenshot.png new file mode 100644 index 000000000..cef272529 Binary files /dev/null and b/image_capture_upload_widget/static/description/assets/icons/screenshot.png differ diff --git a/image_capture_upload_widget/static/description/assets/icons/service-black.png b/image_capture_upload_widget/static/description/assets/icons/service-black.png new file mode 100644 index 000000000..301ab51cb Binary files /dev/null and b/image_capture_upload_widget/static/description/assets/icons/service-black.png differ diff --git a/image_capture_upload_widget/static/description/assets/icons/skype-fill.svg b/image_capture_upload_widget/static/description/assets/icons/skype-fill.svg new file mode 100644 index 000000000..c17423639 --- /dev/null +++ b/image_capture_upload_widget/static/description/assets/icons/skype-fill.svg @@ -0,0 +1,10 @@ + + + + + + + + + + diff --git a/image_capture_upload_widget/static/description/assets/icons/skype.png b/image_capture_upload_widget/static/description/assets/icons/skype.png new file mode 100644 index 000000000..51b409fb3 Binary files /dev/null and b/image_capture_upload_widget/static/description/assets/icons/skype.png differ diff --git a/image_capture_upload_widget/static/description/assets/icons/skype.svg b/image_capture_upload_widget/static/description/assets/icons/skype.svg new file mode 100644 index 000000000..df3dad39b --- /dev/null +++ b/image_capture_upload_widget/static/description/assets/icons/skype.svg @@ -0,0 +1,3 @@ + + + diff --git a/image_capture_upload_widget/static/description/assets/icons/star-1.svg b/image_capture_upload_widget/static/description/assets/icons/star-1.svg new file mode 100644 index 000000000..7e55ab162 --- /dev/null +++ b/image_capture_upload_widget/static/description/assets/icons/star-1.svg @@ -0,0 +1,53 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/image_capture_upload_widget/static/description/assets/icons/star-2.svg b/image_capture_upload_widget/static/description/assets/icons/star-2.svg new file mode 100644 index 000000000..5ae9f507a --- /dev/null +++ b/image_capture_upload_widget/static/description/assets/icons/star-2.svg @@ -0,0 +1,9 @@ + + + + + + + + + diff --git a/image_capture_upload_widget/static/description/assets/icons/support.png b/image_capture_upload_widget/static/description/assets/icons/support.png new file mode 100644 index 000000000..4f18b8b82 Binary files /dev/null and b/image_capture_upload_widget/static/description/assets/icons/support.png differ diff --git a/image_capture_upload_widget/static/description/assets/icons/test-1 - Copy.png b/image_capture_upload_widget/static/description/assets/icons/test-1 - Copy.png new file mode 100644 index 000000000..f6a902663 Binary files /dev/null and b/image_capture_upload_widget/static/description/assets/icons/test-1 - Copy.png differ diff --git a/image_capture_upload_widget/static/description/assets/icons/test-1.png b/image_capture_upload_widget/static/description/assets/icons/test-1.png new file mode 100644 index 000000000..0908add2b Binary files /dev/null and b/image_capture_upload_widget/static/description/assets/icons/test-1.png differ diff --git a/image_capture_upload_widget/static/description/assets/icons/test-2.png b/image_capture_upload_widget/static/description/assets/icons/test-2.png new file mode 100644 index 000000000..4671fe91e Binary files /dev/null and b/image_capture_upload_widget/static/description/assets/icons/test-2.png differ diff --git a/image_capture_upload_widget/static/description/assets/icons/trading-black.png b/image_capture_upload_widget/static/description/assets/icons/trading-black.png new file mode 100644 index 000000000..9398ba2f1 Binary files /dev/null and b/image_capture_upload_widget/static/description/assets/icons/trading-black.png differ diff --git a/image_capture_upload_widget/static/description/assets/icons/training.png b/image_capture_upload_widget/static/description/assets/icons/training.png new file mode 100644 index 000000000..884ca024d Binary files /dev/null and b/image_capture_upload_widget/static/description/assets/icons/training.png differ diff --git a/image_capture_upload_widget/static/description/assets/icons/translate.svg b/image_capture_upload_widget/static/description/assets/icons/translate.svg new file mode 100644 index 000000000..af9c8a1aa --- /dev/null +++ b/image_capture_upload_widget/static/description/assets/icons/translate.svg @@ -0,0 +1,10 @@ + + + + + + + + + + diff --git a/image_capture_upload_widget/static/description/assets/icons/update.png b/image_capture_upload_widget/static/description/assets/icons/update.png new file mode 100644 index 000000000..ecbc5a01a Binary files /dev/null and b/image_capture_upload_widget/static/description/assets/icons/update.png differ diff --git a/image_capture_upload_widget/static/description/assets/icons/user.png b/image_capture_upload_widget/static/description/assets/icons/user.png new file mode 100644 index 000000000..6ffb23d9f Binary files /dev/null and b/image_capture_upload_widget/static/description/assets/icons/user.png differ diff --git a/image_capture_upload_widget/static/description/assets/icons/video.png b/image_capture_upload_widget/static/description/assets/icons/video.png new file mode 100644 index 000000000..576705b17 Binary files /dev/null and b/image_capture_upload_widget/static/description/assets/icons/video.png differ diff --git a/image_capture_upload_widget/static/description/assets/icons/whatsapp.png b/image_capture_upload_widget/static/description/assets/icons/whatsapp.png new file mode 100644 index 000000000..d513a5356 Binary files /dev/null and b/image_capture_upload_widget/static/description/assets/icons/whatsapp.png differ diff --git a/image_capture_upload_widget/static/description/assets/icons/wrench-icon.svg b/image_capture_upload_widget/static/description/assets/icons/wrench-icon.svg new file mode 100644 index 000000000..174b5a465 --- /dev/null +++ b/image_capture_upload_widget/static/description/assets/icons/wrench-icon.svg @@ -0,0 +1,10 @@ + + + + + + + + + + diff --git a/image_capture_upload_widget/static/description/assets/icons/wrench.png b/image_capture_upload_widget/static/description/assets/icons/wrench.png new file mode 100644 index 000000000..6c04dea0f Binary files /dev/null and b/image_capture_upload_widget/static/description/assets/icons/wrench.png differ diff --git a/image_capture_upload_widget/static/description/assets/modules/1.gif b/image_capture_upload_widget/static/description/assets/modules/1.gif new file mode 100644 index 000000000..dc180280d Binary files /dev/null and b/image_capture_upload_widget/static/description/assets/modules/1.gif differ diff --git a/image_capture_upload_widget/static/description/assets/modules/2.png b/image_capture_upload_widget/static/description/assets/modules/2.png new file mode 100644 index 000000000..ecea68d98 Binary files /dev/null and b/image_capture_upload_widget/static/description/assets/modules/2.png differ diff --git a/image_capture_upload_widget/static/description/assets/modules/3.png b/image_capture_upload_widget/static/description/assets/modules/3.png new file mode 100644 index 000000000..e0b09a5a0 Binary files /dev/null and b/image_capture_upload_widget/static/description/assets/modules/3.png differ diff --git a/image_capture_upload_widget/static/description/assets/modules/4.jpg b/image_capture_upload_widget/static/description/assets/modules/4.jpg new file mode 100644 index 000000000..4bd9278e3 Binary files /dev/null and b/image_capture_upload_widget/static/description/assets/modules/4.jpg differ diff --git a/image_capture_upload_widget/static/description/assets/modules/5.jpg b/image_capture_upload_widget/static/description/assets/modules/5.jpg new file mode 100644 index 000000000..31a56b08c Binary files /dev/null and b/image_capture_upload_widget/static/description/assets/modules/5.jpg differ diff --git a/image_capture_upload_widget/static/description/assets/modules/6.png b/image_capture_upload_widget/static/description/assets/modules/6.png new file mode 100644 index 000000000..17089cab4 Binary files /dev/null and b/image_capture_upload_widget/static/description/assets/modules/6.png differ diff --git a/image_capture_upload_widget/static/description/assets/screenshots/1.png b/image_capture_upload_widget/static/description/assets/screenshots/1.png new file mode 100644 index 000000000..cce95fcf5 Binary files /dev/null and b/image_capture_upload_widget/static/description/assets/screenshots/1.png differ diff --git a/image_capture_upload_widget/static/description/assets/screenshots/2.png b/image_capture_upload_widget/static/description/assets/screenshots/2.png new file mode 100644 index 000000000..15f388861 Binary files /dev/null and b/image_capture_upload_widget/static/description/assets/screenshots/2.png differ diff --git a/image_capture_upload_widget/static/description/assets/screenshots/3.png b/image_capture_upload_widget/static/description/assets/screenshots/3.png new file mode 100644 index 000000000..f6de2ab8c Binary files /dev/null and b/image_capture_upload_widget/static/description/assets/screenshots/3.png differ diff --git a/image_capture_upload_widget/static/description/assets/screenshots/4.png b/image_capture_upload_widget/static/description/assets/screenshots/4.png new file mode 100644 index 000000000..9607a97c6 Binary files /dev/null and b/image_capture_upload_widget/static/description/assets/screenshots/4.png differ diff --git a/image_capture_upload_widget/static/description/assets/screenshots/hero.gif b/image_capture_upload_widget/static/description/assets/screenshots/hero.gif new file mode 100644 index 000000000..b63faff0e Binary files /dev/null and b/image_capture_upload_widget/static/description/assets/screenshots/hero.gif differ diff --git a/image_capture_upload_widget/static/description/assets/y18.jpg b/image_capture_upload_widget/static/description/assets/y18.jpg new file mode 100644 index 000000000..eea1714f2 Binary files /dev/null and b/image_capture_upload_widget/static/description/assets/y18.jpg differ diff --git a/image_capture_upload_widget/static/description/banner.jpg b/image_capture_upload_widget/static/description/banner.jpg new file mode 100644 index 000000000..b74b05f3d Binary files /dev/null and b/image_capture_upload_widget/static/description/banner.jpg differ diff --git a/image_capture_upload_widget/static/description/icon.png b/image_capture_upload_widget/static/description/icon.png new file mode 100644 index 000000000..13c273efa Binary files /dev/null and b/image_capture_upload_widget/static/description/icon.png differ diff --git a/image_capture_upload_widget/static/description/index.html b/image_capture_upload_widget/static/description/index.html new file mode 100644 index 000000000..46b9930ff --- /dev/null +++ b/image_capture_upload_widget/static/description/index.html @@ -0,0 +1,1039 @@ + + + + + + Image Capture Widget + + + + + + + + + + +
+
+ + + +
+
+ Community +
+
+ Enterprise +
+
+ Odoo.sh +
+
+
+ +
+
+
+
+

+ Image Capture Widget for Image Field +

+

Image Capture Widget +

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

Key + Heighlights

+
+
+
+
+ +
+
+ Image Capture Widget +
+
+
+
+
+
+ +
+
+ Capture Image from your Webcam +
+
+
+
+
+
+ +
+
+ Widget for Image Fields to Capture the + Images Directly from Webcam +
+
+
+
+
+ +
+
+
+ Image Capture Widget +

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

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

+ Add the + + Widget +

+
+
+

+ Add the 'capture_image' as the widget of an Image + field and also make sure to give camera permission + in the browser, site settings. +

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

+ Open the + + Camera +

+
+
+

+ Click the Camera button to Open the Camera. +

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

+ Capture the + Images +

+
+
+

+ Click the 'Capture' Button to Capture Images and + click the 'Save Image' Button to Save the Image. +

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

+ Image is + Updated +

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

+ Capturing Image from webcam

+
+
+
+
+
+
+
+ +
+

+ Image Capturing Widget for Image Fields

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

+ While configuring a + backup, selecting + the Zip option will + include the + filestore in the + backup, while + choosing the Dump + option will create a + backup without the + filestore. +

+
+
+ +
+ +
+

+ Enable the "Remove + Old Backups" option + in the backup + creation view to + automatically delete + previous backups + based on the number + of days specified. +

+
+
+ +
+ +
+

+ Enable the "Notify + User" option and + specify a contact to + receive an email + containing a + detailed report with + the failure reason + and backup details. + This option will + also send an email + upon successful + backup. +

+
+
+ +
+ +
+

+ Select the backup + destination as local + storage and specify + a backup path to a + location on the + system to create + backups on your own + system. +

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

+ Latest Release 18.0.1.0.0 +

+ + 20th February, 2025 + +
+
+
+
+
+ Add +
+
+
+
    +
  • + Initial Commit +
  • +
+
+
+
+
+
+
+
+
+
+ + + +
+

+ Related Products +

+ +
+ + +
+

+ Our Services

+ +
+ +
+
+ .... +
+
+ +
+ + +
+
+ + + + + + diff --git a/image_capture_upload_widget/static/src/js/image_capture.js b/image_capture_upload_widget/static/src/js/image_capture.js new file mode 100644 index 000000000..61e528120 --- /dev/null +++ b/image_capture_upload_widget/static/src/js/image_capture.js @@ -0,0 +1,277 @@ +/** @odoo-module **/ + +import { isMobileOS } from "@web/core/browser/feature_detection"; +import { _t } from "@web/core/l10n/translation"; +import { registry } from "@web/core/registry"; +import { useService } from "@web/core/utils/hooks"; +import { url } from "@web/core/utils/urls"; +import { isBinarySize } from "@web/core/utils/binary"; +import { rpc } from "@web/core/network/rpc"; +import { FileUploader } from "@web/views/fields/file_handler"; +import { standardFieldProps } from "@web/views/fields/standard_field_props"; +import { Component, useState, onWillUpdateProps,useRef} from "@odoo/owl"; +const { DateTime } = luxon; +export const fileTypeMagicWordMap = { + "/": "jpg", + R: "gif", + i: "png", + P: "svg+xml", +}; + +const placeholder = "/web/static/img/placeholder.png"; +export function imageCacheKey(value) { + if (value instanceof DateTime) { + return value.ts; + } + return ""; +} +class imageCapture extends Component { + static template = "CaptureImage"; + static components = { + FileUploader,}; + static props = { + ...standardFieldProps, + enableZoom: { type: Boolean, optional: true }, + zoomDelay: { type: Number, optional: true }, + previewImage: { type: String, optional: true }, + acceptedFileExtensions: { type: String, optional: true }, + width: { type: Number, optional: true }, + height: { type: Number, optional: true }, + reload: { type: Boolean, optional: true }, + }; + static defaultProps = { + acceptedFileExtensions: "image/*", + reload: true, + }; + setup() { + this.notification = useService("notification"); + this.orm = useService("orm") + this.isMobile = isMobileOS(); + this.state = useState({ + isValid: true, + stream: null, + }); + this.player = useRef("player"); + this.capture = useRef("capture"); + this.camera = useRef("camera"); + this.save_image = useRef("save_image"); + this.rawCacheKey = this.props.record.data.write_date; + onWillUpdateProps((nextProps) => { + const { record } = this.props; + const { record: nextRecord } = nextProps; + if (record.resId !== nextRecord.resId || nextRecord.mode === "readonly") { + this.rawCacheKey = nextRecord.data.write_date; + } + }); + } + + get sizeStyle() { + // For getting image style details + let style = ""; + if (this.props.width) { + style += `max-width: ${this.props.width}px;`; + } + if (this.props.height) { + style += `max-height: ${this.props.height}px;`; + } + return style; + } + get hasTooltip() { + return ( + this.props.enableZoom && this.props.readonly && this.props.record.data[this.props.name] + ); + } + getUrl(previewFieldName) { + // getting the details and url of the image + if (!this.props.reload && this.lastURL) { + return this.lastURL; + } + if (this.state.isValid && this.props.record.data[this.props.name]) { + if (isBinarySize(this.props.record.data[this.props.name])) { + if (!this.rawCacheKey) { + this.rawCacheKey = this.props.record.data.write_date; + } + this.lastURL = url("/web/image", { + model: this.props.record.resModel, + id: this.props.record.resId, + field: previewFieldName, + unique: imageCacheKey(this.rawCacheKey), + }); + } else { + // Use magic-word technique for detecting image type + const magic = + fileTypeMagicWordMap[this.props.record.data[this.props.name][0]] || "png"; + this.lastURL = `data:image/${magic};base64,${ + this.props.record.data[this.props.name] + }`; + } + return this.lastURL; + } + return placeholder; + } + onFileRemove() { + // removing the images + this.state.isValid = true; + this.props.record.update({ [this.props.name]: false }); + } + async onFileUploaded(info) { + // Upload the images + this.state.isValid = true; + this.rawCacheKey = null; + this.props.record.update({ [this.props.name]: info.data }); + } + onFileCaptureImage() { + // Open a window for open the image and capture it + var field = this.props.name; + var id = this.props.record.data.id; + var model = this.props.record.resModel; + } + + async checkCameraPermission() { + try { + const permissionStatus = await navigator.permissions.query({ name: 'camera' }); + console.log("Camera permission state:", permissionStatus.state); + if (permissionStatus.state === "granted") { + return true; // Permission is granted + } else if (permissionStatus.state === "prompt") { + console.warn("Camera permission needs to be granted by the user."); + } else if (permissionStatus.state === "denied") { + console.error("Camera access denied. Please enable it in browser settings."); + } + return false; + } catch (error) { + console.error("Error checking camera permission:", error); + return false; + } + } + + async OnClickOpenCamera() { + // opening the camera for capture the image + try { + const hasPermission = await this.checkCameraPermission(); + if (!hasPermission) { + alert("Camera access denied. Please enable it in browser settings."); + return; + } + this.player.el.classList.remove('d-none'); + this.capture.el.classList.remove('d-none'); + this.camera.el.classList.add('d-none'); + this.state.stream = await navigator.mediaDevices.getUserMedia({ video: true, audio: false }); + this.player.el.srcObject = this.state.stream; + } catch (error) { + console.error("Error accessing camera:", error); + alert("Error accessing camera: " + error.message); + } + } + stopTracksOnMediaStream(mediaStream) { + for (const track of mediaStream.getTracks()) { + track.stop(); + } + } + async OnClickCaptureImage() { + // Capture the image from webcam and close the webcam + var context = snapshot.getContext('2d'); + var canvas = document.getElementById('snapshot') + var image = document.getElementById('image'); + this.save_image.el.classList.remove('d-none'); + context.drawImage(player, 0, 0, 320, 240); + image.value = context.canvas.toDataURL(); + canvas.classList.remove('d-none'); + this.url = context.canvas.toDataURL(); + } + async OnClickSaveImage(){ + // Saving the image to that field + var self = this + await rpc('/web/dataset/call_kw', { + model: 'image.capture', + method: 'action_save_image', + args: [[], this.url], + kwargs: {} + }).then(function(results){ + self.props.value = results + var data = { + data: results, + name : "ImageFile.png", + objectUrl: null, + size : 106252, + type: "image/png" + } + self.onFileUploaded(data) + }) + this.player.el.classList.add('d-none'); + var snapshot = document.getElementById('snapshot') + snapshot.classList.add('d-none'); + this.capture.el.classList.add('d-none'); + this.save_image.el.classList.add('d-none'); + this.camera.el.classList.remove('d-none'); + this.player.el.srcObject = null; + if (!this.state.stream) { + return; + } + this.stopTracksOnMediaStream(this.state.stream); + this.state.stream = null; + } + onLoadFailed() { + this.state.isValid = false; + this.notification.add(this.env._t("Could not display the selected image"), { + type: "danger", + }); + } +} +export const ImageCapture = { + component: imageCapture, + displayName: _t("Image"), + supportedOptions: [ + { + label: _t("Reload"), + name: "reload", + type: "boolean", + default: true, + }, + { + label: _t("Enable zoom"), + name: "zoom", + type: "boolean", + }, + { + label: _t("Zoom delay"), + name: "zoom_delay", + type: "number", + help: _t("Delay the apparition of the zoomed image with a value in milliseconds"), + }, + { + label: _t("Accepted file extensions"), + name: "accepted_file_extensions", + type: "string", + }, + { + label: _t("Size"), + name: "size", + type: "selection", + choices: [ + { label: _t("Small"), value: "[0,90]" }, + { label: _t("Medium"), value: "[0,180]" }, + { label: _t("Large"), value: "[0,270]" }, + ], + }, + { + label: _t("Preview image"), + name: "preview_image", + type: "field", + availableTypes: ["binary"], + }, + ], +supportedTypes: ["binary"], + fieldDependencies: [{ name: "write_date", type: "datetime" }], + isEmpty: () => false, + extractProps: ({ attrs, options }) => ({ + enableZoom: options.zoom, + zoomDelay: options.zoom_delay, + previewImage: options.preview_image, + acceptedFileExtensions: options.accepted_file_extensions, + width: options.size && Boolean(options.size[0]) ? options.size[0] : attrs.width, + height: options.size && Boolean(options.size[1]) ? options.size[1] : attrs.height, + reload: "reload" in options ? Boolean(options.reload) : true, + }), +}; +registry.category("fields").add("capture_image", ImageCapture); diff --git a/image_capture_upload_widget/static/src/scss/image_capture.scss b/image_capture_upload_widget/static/src/scss/image_capture.scss new file mode 100644 index 000000000..100f5ecbe --- /dev/null +++ b/image_capture_upload_widget/static/src/scss/image_capture.scss @@ -0,0 +1,17 @@ +.o_field_image { + background-color: var(--ImageField-background-color, transparent); + + button { + transition: opacity ease 400ms; + width: 26px; + height: 26px; + } + + .o_mobile_controls { + button { + width: 30px; + height: 30px; + padding: 6px !important; + } + } +} diff --git a/image_capture_upload_widget/static/src/xml/image_capture_templates.xml b/image_capture_upload_widget/static/src/xml/image_capture_templates.xml new file mode 100644 index 000000000..ab4a7f25e --- /dev/null +++ b/image_capture_upload_widget/static/src/xml/image_capture_templates.xml @@ -0,0 +1,65 @@ + + + + +
+
+ + + + + + + + +
Capture +
+
Save Image +
+
+
+ + Binary file + +
+
+
diff --git a/image_capture_upload_widget/wizard/__init__.py b/image_capture_upload_widget/wizard/__init__.py new file mode 100644 index 000000000..77cbf0846 --- /dev/null +++ b/image_capture_upload_widget/wizard/__init__.py @@ -0,0 +1,22 @@ +# -*- coding: utf-8 -*- +############################################################################### +# +# Cybrosys Technologies Pvt. Ltd. +# +# Copyright (C) 2025-TODAY Cybrosys Technologies() +# Author: Ammu Raj (odoo@cybrosys.com) +# +# You can modify it under the terms of the GNU AFFERO +# GENERAL PUBLIC LICENSE (AGPL v3), Version 3. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU AFFERO GENERAL PUBLIC LICENSE (AGPL v3) for more details. +# +# You should have received a copy of the GNU AFFERO GENERAL PUBLIC LICENSE +# (AGPL v3) along with this program. +# If not, see . +# +############################################################################### +from . import image_capture diff --git a/image_capture_upload_widget/wizard/image_capture.py b/image_capture_upload_widget/wizard/image_capture.py new file mode 100644 index 000000000..edac0cf3d --- /dev/null +++ b/image_capture_upload_widget/wizard/image_capture.py @@ -0,0 +1,36 @@ +# -*- coding: utf-8 -*- +############################################################################### +# +# Cybrosys Technologies Pvt. Ltd. +# +# Copyright (C) 2025-TODAY Cybrosys Technologies() +# Author: Ammu Raj (odoo@cybrosys.com) +# +# You can modify it under the terms of the GNU AFFERO +# GENERAL PUBLIC LICENSE (AGPL v3), Version 3. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU AFFERO GENERAL PUBLIC LICENSE (AGPL v3) for more details. +# +# You should have received a copy of the GNU AFFERO GENERAL PUBLIC LICENSE +# (AGPL v3) along with this program. +# If not, see . +# +############################################################################### +from odoo import models + + +class ImageCapture(models.TransientModel): + """ A model for capturing images """ + _name = 'image.capture' + _description = 'Image Capture' + + def action_save_image(self, url): + """ + Saving the images to corresponding models + :param url: Image details. + """ + image = url.split(',') + return image[1]