@ -0,0 +1,21 @@ |
|||
================================ |
|||
Automatic Developer Mode v12 |
|||
================================ |
|||
|
|||
Odoo Developers, Keep smiling for the below reasons: |
|||
|
|||
* Automatically Trigger Developer Mode. |
|||
* Separate Group for 'Odoo Developers'. |
|||
* Upgrade Modules Easily. |
|||
* Recently Upgraded Filter. |
|||
|
|||
Credits |
|||
------- |
|||
* `Nilmar Shereef < odoo@cybsosys.in >`__ |
|||
* `Saritha < odoo@cybsosys.in >`__ |
|||
|
|||
|
|||
Further information |
|||
=================== |
|||
HTML Description: `<static/description/index.html>`__ |
|||
|
@ -0,0 +1,23 @@ |
|||
# -*- coding: utf-8 -*- |
|||
################################################################################### |
|||
# |
|||
# Cybrosys Technologies Pvt. Ltd. |
|||
# Copyright (C) 2018-TODAY Cybrosys Technologies(<https://www.cybrosys.com>). |
|||
# Author: Cybrosys Techno Solutions (<https://www.cybrosys.com>) |
|||
# |
|||
# This program is free software: you can modify |
|||
# it under the terms of the GNU Affero General Public License (AGPL) as |
|||
# published by the Free Software Foundation, either version 3 of the |
|||
# License, or (at your option) any later version. |
|||
# |
|||
# 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 for more details. |
|||
# |
|||
# You should have received a copy of the GNU Affero General Public License |
|||
# along with this program. If not, see <https://www.gnu.org/licenses/>. |
|||
# |
|||
################################################################################### |
|||
|
|||
from . import controllers |
@ -0,0 +1,41 @@ |
|||
# -*- coding: utf-8 -*- |
|||
################################################################################### |
|||
# |
|||
# Cybrosys Technologies Pvt. Ltd. |
|||
# Copyright (C) 2019-TODAY Cybrosys Technologies(<https://www.cybrosys.com>). |
|||
# Author: Cybrosys Techno Solutions (<https://www.cybrosys.com>) |
|||
# |
|||
# This program is free software: you can modify |
|||
# it under the terms of the GNU Affero General Public License (AGPL) as |
|||
# published by the Free Software Foundation, either version 3 of the |
|||
# License, or (at your option) any later version. |
|||
# |
|||
# 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 for more details. |
|||
# |
|||
# You should have received a copy of the GNU Affero General Public License |
|||
# along with this program. If not, see <https://www.gnu.org/licenses/>. |
|||
# |
|||
################################################################################### |
|||
|
|||
{ |
|||
'name': "Automatic Developer Mode", |
|||
'summary': """Automatically Activate Developer Mode & Running DB Name on Left Top""", |
|||
'version': '12.0.1.0.0', |
|||
'author': 'Cybrosys Techno Solutions', |
|||
'website': "https://www.cybrosys.com", |
|||
'company': 'Cybrosys Techno Solutions', |
|||
'category': 'Extra Tools', |
|||
'depends': ['base', 'web', 'base_setup'], |
|||
'data': [ |
|||
'security/security_data.xml', |
|||
'views/developer_mode_view.xml', |
|||
# 'data/cybro_developer_data.xml', |
|||
], |
|||
'images': ['static/description/banner.jpg'], |
|||
'license': 'AGPL-3', |
|||
'installable': True, |
|||
'auto_install': False, |
|||
} |
@ -0,0 +1,23 @@ |
|||
# -*- coding: utf-8 -*- |
|||
################################################################################### |
|||
# |
|||
# Cybrosys Technologies Pvt. Ltd. |
|||
# Copyright (C) 2018-TODAY Cybrosys Technologies(<https://www.cybrosys.com>). |
|||
# Author: Cybrosys Techno Solutions (<https://www.cybrosys.com>) |
|||
# |
|||
# This program is free software: you can modify |
|||
# it under the terms of the GNU Affero General Public License (AGPL) as |
|||
# published by the Free Software Foundation, either version 3 of the |
|||
# License, or (at your option) any later version. |
|||
# |
|||
# 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 for more details. |
|||
# |
|||
# You should have received a copy of the GNU Affero General Public License |
|||
# along with this program. If not, see <https://www.gnu.org/licenses/>. |
|||
# |
|||
################################################################################### |
|||
|
|||
from . import main |
@ -0,0 +1,64 @@ |
|||
# -*- coding: utf-8 -*- |
|||
################################################################################### |
|||
# |
|||
# Cybrosys Technologies Pvt. Ltd. |
|||
# Copyright (C) 2018-TODAY Cybrosys Technologies(<https://www.cybrosys.com>). |
|||
# Author: Cybrosys Techno Solutions (<https://www.cybrosys.com>) |
|||
# |
|||
# This program is free software: you can modify |
|||
# it under the terms of the GNU Affero General Public License (AGPL) as |
|||
# published by the Free Software Foundation, either version 3 of the |
|||
# License, or (at your option) any later version. |
|||
# |
|||
# 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 for more details. |
|||
# |
|||
# You should have received a copy of the GNU Affero General Public License |
|||
# along with this program. If not, see <https://www.gnu.org/licenses/>. |
|||
# |
|||
################################################################################### |
|||
|
|||
import odoo |
|||
from odoo import http, _ |
|||
from odoo.http import request |
|||
from odoo.addons.web.controllers.main import Home, ensure_db |
|||
|
|||
|
|||
class AutoDeveloperMode(Home): |
|||
|
|||
@http.route('/web/login', type='http', auth="none") |
|||
def web_login(self, redirect=None, **kw): |
|||
""" Controller functions overrides for redirecting to developer mode if the logging user is admin or |
|||
'Odoo Developer' group member """ |
|||
ensure_db() |
|||
request.params['login_success'] = False |
|||
if request.httprequest.method == 'GET' and redirect and request.session.uid: |
|||
return http.redirect_with_hash(redirect) |
|||
|
|||
if not request.uid: |
|||
request.uid = odoo.SUPERUSER_ID |
|||
|
|||
values = request.params.copy() |
|||
try: |
|||
values['databases'] = http.db_list() |
|||
except odoo.exceptions.AccessDenied: |
|||
values['databases'] = None |
|||
if request.httprequest.method == 'POST': |
|||
old_uid = request.uid |
|||
uid = request.session.authenticate(request.session.db, request.params['login'], request.params['password']) |
|||
print("uid",uid) |
|||
if uid is not False: |
|||
request.params['login_success'] = True |
|||
if not redirect: |
|||
odoo_technician = request.env.user.has_group('developer_mode.odoo_developer_group') |
|||
|
|||
if odoo_technician or request.uid == True: |
|||
redirect = '/web?debug' |
|||
else: |
|||
redirect = '/web' |
|||
return http.redirect_with_hash(redirect) |
|||
request.uid = old_uid |
|||
values['error'] = _("Wrong login/password") |
|||
return request.render('web.login', values) |
@ -0,0 +1,47 @@ |
|||
<?xml version="1.0" encoding="utf-8"?> |
|||
<odoo> |
|||
|
|||
<data noupdate="1"> |
|||
<record id="odooveloper_model" model="ir.model.data"> |
|||
<field name="res_id" search="[('model','=','res.partner'),('name','=','Cybrodeveloper')]" model="ir.model.data"/> |
|||
<field name="model">res.partner</field> |
|||
<field name="name">cybro_partner_developer_mode</field> |
|||
<field name="noupdate">True</field> |
|||
</record> |
|||
|
|||
<record model="res.partner" id="cybro_partner_developer_mode"> |
|||
<field name="name">Cybro Developer</field> |
|||
<field name="comment"> |
|||
****************************************************** |
|||
|
|||
Your Odoo ERP Consultant! |
|||
|
|||
****************************************************** |
|||
|
|||
Cybrosys provides tremendous scope of Odoo customization where all kinds of business needs can be satisfied and could further enhance later if required with ease. Talk to us! |
|||
</field> |
|||
<field name="country_id" ref="base.in"/> |
|||
<field name="supplier" eval="True"/> |
|||
<field name="customer" eval="True"/> |
|||
<field name="street">Kinfra Techno Park </field> |
|||
<field name="street2">Neospace</field> |
|||
<field name="city">Kakkancherry</field> |
|||
<field name="zip">673635</field> |
|||
<field name="is_company">1</field> |
|||
<field name="phone">+91 (0) 4943015006</field> |
|||
<field name="mobile">+91 (0) 4943015007</field> |
|||
<field name="email">info@cybrsys.com</field> |
|||
<field name="website">https://www.cybrosys.com</field> |
|||
<field name="image" type="base64" file="developer_mode/static/description/cybro.jpg"/> |
|||
</record> |
|||
</data> |
|||
|
|||
</odoo> |
|||
|
|||
|
|||
|
|||
|
|||
|
|||
|
|||
|
|||
|
@ -0,0 +1,6 @@ |
|||
## Module <access_restriction_by_ip> |
|||
|
|||
#### 27.02.2019 |
|||
#### Version 12.0.1.0.0 |
|||
#### ADD |
|||
- Initial Commit |
@ -0,0 +1,12 @@ |
|||
<?xml version="1.0" encoding="utf-8"?> |
|||
<odoo> |
|||
|
|||
<data noupdate="1"> |
|||
<record id="odoo_developer_group" model="res.groups"> |
|||
<field name="name">Odoo Developer</field> |
|||
<field name="implied_ids" eval="[(4, ref('base.group_system')),(4, ref('base.group_no_one'))]"/> |
|||
<field name="users" eval="[(4, ref('base.user_root'))]"/> |
|||
</record> |
|||
</data> |
|||
|
|||
</odoo> |
After Width: | Height: | Size: 68 KiB |
After Width: | Height: | Size: 45 KiB |
After Width: | Height: | Size: 50 KiB |
After Width: | Height: | Size: 6.9 KiB |
After Width: | Height: | Size: 86 KiB |
After Width: | Height: | Size: 263 KiB |
After Width: | Height: | Size: 265 KiB |
After Width: | Height: | Size: 150 KiB |
After Width: | Height: | Size: 19 KiB |
After Width: | Height: | Size: 11 KiB |
@ -0,0 +1,362 @@ |
|||
<section class="oe_container" style="background-image:url(https://www.cybrosys.com/images/odoo-index-header-banner.png);background-repeat:no-repeat;background-size:100%;padding: 4% 0% 2% 15%;background-position-y: -107px;"> |
|||
<div class="oe_row oe_spaced"> |
|||
<h2 class="oe_slogan" style="font-size: 35px;color: #fff;font-weight: 900;text-transform: uppercase;text-align: left;margin: 0;margin-bottom: 16px;"> |
|||
Automatic Developer Mode |
|||
</h2> |
|||
<h3 class="oe_slogan" style="font-size: 25px;color: #fff;font-weight: 600;text-align: left;opacity: 1;margin: 0 !important;"> |
|||
Developers, Keep up your smile! |
|||
</h3> |
|||
<h5 class="oe_slogan" style="text-align: left;background: #fff;width: 293px;padding: 10px;color: #080808 !important;opacity: 1 !important;font-weight: 600;font-size: 20px;"> |
|||
<a style="color: #080808 !important;" href="https://www.cybrosys.com" target="_blank">Cybrosys Technologies</a> |
|||
</h5> |
|||
<a style="color: #080808 !important;" href="https://www.cybrosys.com" target="_blank"> |
|||
<div style="width: 215px;margin-left: 57%;text-align: center;background: #ffffff;height: 215px;border-radius: 100%;display: flex;justify-content: center;align-items: center;box-shadow: 0 0 12px 4px #00000059;"> |
|||
<img src="https://www.cybrosys.com/images/cybro-logo-oca.png" alt="cybrosys technologies" style="width: 180px;"/> |
|||
</div> |
|||
</a> |
|||
</div> |
|||
</section> |
|||
<section class="oe_container" style="padding: 1% 0% 3% 15%;"> |
|||
<div class="oe_row oe_spaced"> |
|||
<h2 class="oe_slogan" style="text-align: left;font-size: 28px;font-weight: 600;margin: 0px !important;"> |
|||
Overview |
|||
</h2> |
|||
<h3 class="oe_slogan" style="text-align: left;font-size: 16px;width: 90%;margin: 0;margin-top: 14px;color: #000 !important;opacity: 1 !important;line-height: 24px;"> |
|||
This module makes you free from activating developer mode operations repeatedly. |
|||
When you login, It will trigger the DEVELOPER MODE automatically. |
|||
It also helps in identification of running DB and make upgradation of modules easier. |
|||
</h3> |
|||
<h3 class="oe_slogan" style="text-align: left;font-size: 28px;font-weight: 600;margin: 0px !important;padding: 2% 0% 0% 0%;"> |
|||
Configuration |
|||
</h3> |
|||
<h3 class="oe_slogan" style="text-align: left;font-size: 16px;width: 90%;margin: 0;margin-top: 14px;color: #000 !important;opacity: 1 !important;line-height: 24px;"> |
|||
You have to enable 'Odoo Developer' group for respective users (Except Admin)in settings & |
|||
YOU HAVE TO RE-LOGIN AFTER THE MODULE INSTALLATION. |
|||
</h3> |
|||
</div> |
|||
</section> |
|||
<section class="oe_container" style="background-image:url(https://www.cybrosys.com/images/odoo-index-banner.png); background-repeat:no-repeat; background-size:cover;padding: 19% 0% 30% 15%;"> |
|||
<div class="oe_row oe_spaced"> |
|||
<h2 class="oe_slogan" style="text-align: left;font-size: 28px;font-weight: 600;margin: 0px !important;"> |
|||
Features |
|||
</h2> |
|||
<h3 class="oe_slogan" style="text-align: left;font-size: 16px;width: 90%;margin: 0;margin-top: 14px;color: #000 !important;opacity: 1 !important;line-height: 18px;"> |
|||
<i class="fa fa-check" aria-hidden="true" style="color: #cd2d47;font-size: 15px;"></i> |
|||
Automatically Trigger Developer Mode. |
|||
</h3> |
|||
<h3 class="oe_slogan" style="text-align: left;font-size: 16px;width: 90%;margin: 0;margin-top: 14px;color: #000 !important;opacity: 1 !important;line-height: 18px;"> |
|||
<i class="fa fa-check" aria-hidden="true" style="color: #cd2d47;font-size: 15px;"></i> |
|||
Separate Group for 'Odoo Developers'. |
|||
</h3> |
|||
<h3 class="oe_slogan" style="text-align: left;font-size: 16px;width: 90%;margin: 0;margin-top: 14px;color: #000 !important;opacity: 1 !important;line-height: 18px;"> |
|||
<i class="fa fa-check" aria-hidden="true" style="color: #cd2d47;font-size: 15px;"></i> |
|||
Showing Running DB On Left Top. |
|||
</h3> |
|||
<h3 class="oe_slogan" style="text-align: left;font-size: 16px;width: 90%;margin: 0;margin-top: 14px;color: #000 !important;opacity: 1 !important;line-height: 18px;"> |
|||
<i class="fa fa-check" aria-hidden="true" style="color: #cd2d47;font-size: 15px;"></i> |
|||
Upgrade Modules Easily. |
|||
</h3> |
|||
</div> |
|||
</section> |
|||
|
|||
<section class="oe_container" style="padding: 3% 0% 0% 15%;"> |
|||
<div class="oe_row oe_spaced"> |
|||
<h2 class="oe_slogan" style="text-align: left;font-size: 28px;font-weight: 600;margin: 0px !important;"> |
|||
Screenshots |
|||
</h2> |
|||
<h3 class="oe_slogan" style="text-align: left;padding: 5% 0% 0% 0%;font-size: 16px;width: 90%;margin: 0;margin-top: 14px;color: #000 !important;opacity: 1 !important;line-height: 24px;"> |
|||
<i class="fa fa-check" aria-hidden="true" style="color: #cd2d47;font-size: 15px;"></i> |
|||
As shown here, Simply automate the developer mode. It helps developer in several perspective. |
|||
</h3> |
|||
<div class="oe_row oe_spaced"> |
|||
<img src="cybrosys-developer-mode-2.jpg" alt="" style="width: 95%;"/> |
|||
</div> |
|||
<h3 class="oe_slogan" style="text-align: left;padding: 5% 0% 0% 0%;font-size: 16px;width: 90%;margin: 0;margin-top: 14px;color: #000 !important;opacity: 1 !important;line-height: 24px;"> |
|||
<i class="fa fa-check" aria-hidden="true" style="color: #cd2d47;font-size: 15px;"></i> |
|||
Shows the running DB on the left top. |
|||
</h3> |
|||
<div class="oe_row oe_spaced"> |
|||
<img src="cybrosys-developer-mode-3.png" alt="" style="width: 95%;"/> |
|||
</div> |
|||
<h3 class="oe_slogan" style="text-align: left;padding: 5% 0% 0% 0%;font-size: 16px;width: 90%;margin: 0;margin-top: 14px;color: #000 !important;opacity: 1 !important;line-height: 24px;"> |
|||
<i class="fa fa-check" aria-hidden="true" style="color: #cd2d47;font-size: 15px;"></i> |
|||
Easily upgrade any module without going the module form. |
|||
</h3> |
|||
<div class="oe_row oe_spaced"> |
|||
<img src="cybrosys-developer-mode-4.png" alt="" style="width: 95%;"/> |
|||
</div> |
|||
<h3 class="oe_slogan" style="text-align: left;padding: 5% 0% 0% 0%;font-size: 16px;width: 90%;margin: 0;margin-top: 14px;color: #000 !important;opacity: 1 !important;line-height: 24px;"> |
|||
<i class="fa fa-check" aria-hidden="true" style="color: #cd2d47;font-size: 15px;"></i> |
|||
Recent upgraded filter view in Apps. |
|||
</h3> |
|||
<div class="oe_row oe_spaced"> |
|||
<img src="cybrosys-developer-mode-5.png" alt="" style="width: 95%;"/> |
|||
</div> |
|||
</div> |
|||
</section> |
|||
|
|||
<section class="oe_container" style="padding: 7px 0% 0% 3%;"> |
|||
<div class="oe_row oe_spaced"> |
|||
<a style="color: #080808 !important;" href="https://apps.odoo.com/apps/modules/browse?search=cybrosys" target="_blank"><img src="https://www.cybrosys.com/images/view-more-apps.jpg" alt="cybrosys technologies" style="width: 100%;margin-bottom: 50px;"/></a> |
|||
</div> |
|||
</section> |
|||
<section class="oe_container" style="padding: 1% 0% 0% 3%;"> |
|||
<div class="oe_row oe_spaced"> |
|||
<h2 class="oe_slogan" style="text-align: left;font-size: 28px;font-weight: 600;margin: 0px !important;"> |
|||
Our Services |
|||
</h2> |
|||
<div style="display:flex;padding-top: 20px;justify-content: space-between;"> |
|||
<div style="flex-basis: 18%;"> |
|||
|
|||
<div style="width:75px;height:75px;background:#fff; border-radius:100%;margin: auto;"> |
|||
<a href="https://www.cybrosys.com/odoo-customization-and-installation/" target="_blank"> |
|||
<img src="https://www.cybrosys.com/images/odoo-customization.png" style="width: 100%;border-radius: 100%;"/> |
|||
</a> |
|||
</div> |
|||
<h3 class="oe_slogan" style="font-weight: 800;text-align: center;font-size: 14px;width: 100%;margin: 0;margin-top: 14px;color: #000 !important;margin-top: 5px;opacity: 1 !important;line-height: 17px;"> |
|||
<a href="https://www.cybrosys.com/odoo-customization-and-installation/" target="_blank"> |
|||
Odoo Customization |
|||
</a> |
|||
</h3> |
|||
|
|||
</div> |
|||
<div style="flex-basis: 18%;"> |
|||
|
|||
<div style="width:75px;height:75px;background:#fff; border-radius:100%;margin: auto;"> |
|||
<a href="https://www.cybrosys.com/odoo-erp-implementation/" target="_blank"> |
|||
<img src="https://www.cybrosys.com/images/odoo-erp-implementation.png" style="width: 100%;border-radius: 100%;"/> |
|||
</a> |
|||
</div> |
|||
<h3 class="oe_slogan" style="font-weight: 800;text-align: center;font-size: 14px;width: 100%;margin: 0;margin-top: 14px;color: #000 !important;margin-top: 5px;opacity: 1 !important;line-height: 17px;"> |
|||
<a href="https://www.cybrosys.com/odoo-erp-implementation/" target="_blank"> |
|||
Odoo Implementation </a> |
|||
</h3> |
|||
|
|||
</div> |
|||
<div style="flex-basis: 18%;"> |
|||
|
|||
<div style="width:75px;height:75px;background:#fff; border-radius:100%;margin: auto;"> |
|||
<a href="https://www.cybrosys.com/odoo-erp-integration/" target="_blank"> |
|||
<img src="https://www.cybrosys.com/images/odoo-erp-integration.png" style="width: 100%;border-radius: 100%;"/> |
|||
</a> |
|||
</div> |
|||
<h3 class="oe_slogan" style="font-weight: 800;text-align: center;font-size: 14px;width: 100%;margin: 0;margin-top: 14px;color: #000 !important;margin-top: 5px;opacity: 1 !important;line-height: 17px;"> |
|||
<a href="https://www.cybrosys.com/odoo-erp-integration/" target="_blank"> |
|||
Odoo Integration |
|||
</a> |
|||
</h3> |
|||
|
|||
</div> |
|||
<div style="flex-basis: 18%;"> |
|||
|
|||
<div style="width:75px;height:75px;background:#fff; border-radius:100%;margin: auto;"> |
|||
<a href="https://www.cybrosys.com/odoo-erp-support/" target="_blank"> |
|||
<img src="https://www.cybrosys.com/images/odoo-erp-support.png" style="width: 100%;border-radius: 100%;"/> |
|||
</a> |
|||
</div> |
|||
<h3 class="oe_slogan" style="font-weight: 800;text-align: center;font-size: 14px;width: 100%;margin: 0;margin-top: 14px;color: #000 !important;margin-top: 5px;opacity: 1 !important;line-height: 17px;"> |
|||
<a href="https://www.cybrosys.com/odoo-erp-support/" target="_blank"> |
|||
Odoo Support</a> |
|||
</h3> |
|||
|
|||
</div> |
|||
<div style="flex-basis: 18%;"> |
|||
|
|||
<div style="width:75px;height:75px;background:#fff; border-radius:100%;margin: auto;"> |
|||
<a href="https://www.cybrosys.com/hire-odoo-developer/" target="_blank"> |
|||
<img src="https://www.cybrosys.com/images/hire-odoo-developer.png" style="width: 100%;border-radius: 100%;"/> |
|||
</a> |
|||
</div> |
|||
<h3 class="oe_slogan" style="font-weight: 800;text-align: center;font-size: 14px;width: 100%;margin: 0;margin-top: 14px;color: #000 !important;margin-top: 5px;opacity: 1 !important;line-height: 17px;"> |
|||
<a href="https://www.cybrosys.com/hire-odoo-developer/" target="_blank"> |
|||
Hire Odoo Developers</a> |
|||
</h3> |
|||
</a> |
|||
</div> |
|||
</div> |
|||
</div> |
|||
</section> |
|||
<section class="oe_container" style="padding: 1% 0% 0% 3%;"> |
|||
<div class="oe_row oe_spaced"> |
|||
<h2 class="oe_slogan" style="text-align: left;font-size: 28px;font-weight: 600;margin: 0px !important;"> |
|||
Our Industries |
|||
</h2> |
|||
<div style="display:flex;justify-content: space-between;flex-wrap:wrap;"> |
|||
<div style="flex-basis: 32%;padding-top: 20px;"> |
|||
|
|||
<div style="width:30%; float:left;"> |
|||
<div style="width:75px;height:75px;background:#CE2D48; border-radius:100%;float: left;text-align: left;"> |
|||
<a href="https://www.cybrosys.com/odoo/industries/best-trading-erp/" target="_blank"> |
|||
<img src="https://www.cybrosys.com/images/odoo-index-industry-1.png" alt="Odoo Industry" style=" border-radius: 100%;width:100%;"/> |
|||
</a> |
|||
</div> |
|||
</div> |
|||
<div style="width:70%;float:left;"> |
|||
<h3 class="oe_slogan" style=" text-align: left;font-size: 14px;font-weight:800;width: auto;margin: 0;margin-top: 14px;color: #000 !important;margin-top: 5px;opacity: 1 !important;line-height: 17px;float: left;margin-top: 4px;margin-left: 16px;"> |
|||
<a href="https://www.cybrosys.com/odoo/industries/best-trading-erp/" target="_blank"> |
|||
Trading |
|||
</a> |
|||
</h3> |
|||
<h3 class="oe_slogan" style=" text-align: left;font-size: 13px;width: auto;margin: 0;margin-top:5px;color: #000 !important;margin-top: 5px;opacity: 1 !important;line-height: 17px;float: left;margin-top: 5px;margin-left: 16px;"> |
|||
Easily procure and sell your products. |
|||
</h3> |
|||
</div> |
|||
|
|||
</div> |
|||
<div style="flex-basis: 32%;padding-top: 20px;"> |
|||
|
|||
<div style="width:30%; float:left;"> |
|||
<div style="width:75px;height:75px;background:#CE2D48; border-radius:100%;float: left;text-align: left;"> |
|||
<a href="https://www.cybrosys.com/odoo/industries/manufacturing-erp-software/" target="_blank"> |
|||
<img src="https://www.cybrosys.com/images/odoo-index-industry-2.png" alt="Odoo Industry" style=" border-radius: 100%;width:100%;"/> |
|||
</a> |
|||
</div> |
|||
</div> |
|||
<div style="width:70%;float:left;"> |
|||
<h3 class="oe_slogan" style=" text-align: left;font-size: 14px;font-weight:800;width: auto;margin: 0;margin-top: 14px;color: #000 !important;margin-top: 5px;opacity: 1 !important;line-height: 17px;float: left;margin-top: 4px;margin-left: 16px;"> |
|||
<a href="https://www.cybrosys.com/odoo/industries/manufacturing-erp-software/" target="_blank"> |
|||
Manufacturing</a> |
|||
</h3> |
|||
<h3 class="oe_slogan" style=" text-align: left;font-size: 13px;width: auto;margin: 0;margin-top:5px;color: #000 !important;margin-top: 5px;opacity: 1 !important;line-height: 17px;float: left;margin-top: 5px;margin-left: 16px;"> |
|||
Plan, track and schedule your operations. |
|||
</h3> |
|||
</div> |
|||
|
|||
</div> |
|||
<div style="flex-basis: 32%;padding-top: 20px;"> |
|||
|
|||
<div style="width:30%; float:left;"> |
|||
<div style="width:75px;height:75px;background:#CE2D48; border-radius:100%;float: left;text-align: left;"> |
|||
<a href="https://www.cybrosys.com/odoo/industries/restaurant-management/" target="_blank"> |
|||
<img src="https://www.cybrosys.com/images/odoo-index-industry-3.png" alt="Odoo Industry" style=" border-radius: 100%;width:100%;"/> |
|||
</a> |
|||
</div> |
|||
</div> |
|||
<div style="width:70%;float:left;"> |
|||
<h3 class="oe_slogan" style=" text-align: left;font-size: 14px;font-weight:800;width: auto;margin: 0;margin-top: 14px;color: #000 !important;margin-top: 5px;opacity: 1 !important;line-height: 17px;float: left;margin-top: 4px;margin-left: 16px;"> |
|||
<a href="https://www.cybrosys.com/odoo/industries/restaurant-management/" target="_blank"> |
|||
Restaurant</a> |
|||
</h3> |
|||
<h3 class="oe_slogan" style=" text-align: left;font-size: 13px;width: auto;margin: 0;margin-top:5px;color: #000 !important;margin-top: 5px;opacity: 1 !important;line-height: 17px;float: left;margin-top: 5px;margin-left: 16px;"> |
|||
Run your bar or restaurant methodical. |
|||
</h3> |
|||
</div> |
|||
|
|||
</div> |
|||
<div style="flex-basis: 32%;padding-top: 20px;"> |
|||
|
|||
<div style="width:30%; float:left;"> |
|||
<div style="width:75px;height:75px;background:#CE2D48; border-radius:100%;float: left;text-align: left;"> |
|||
<a href="https://www.cybrosys.com/odoo/industries/pos/" target="_blank"> |
|||
<img src="https://www.cybrosys.com/images/odoo-index-industry-4.png" alt="Odoo Industry" style=" border-radius: 100%;width:100%;"/> |
|||
</a> |
|||
</div> |
|||
</div> |
|||
<div style="width:70%;float:left;"> |
|||
<h3 class="oe_slogan" style=" text-align: left;font-size: 14px;font-weight:800;width: auto;margin: 0;margin-top: 14px;color: #000 !important;margin-top: 5px;opacity: 1 !important;line-height: 17px;float: left;margin-top: 4px;margin-left: 16px;"> |
|||
<a href="https://www.cybrosys.com/odoo/industries/pos/" target="_blank"> |
|||
POS</a> |
|||
</h3> |
|||
<h3 class="oe_slogan" style=" text-align: left;font-size: 13px;width: auto;margin: 0;margin-top:5px;color: #000 !important;margin-top: 5px;opacity: 1 !important;line-height: 17px;float: left;margin-top: 5px;margin-left: 16px;"> |
|||
Easy configuring and convivial selling. |
|||
</h3> |
|||
</div> |
|||
|
|||
</div> |
|||
<div style="flex-basis: 32%;padding-top: 20px;"> |
|||
|
|||
<div style="width:30%; float:left;"> |
|||
<div style="width:75px;height:75px;background:#CE2D48; border-radius:100%;float: left;text-align: left;"> |
|||
<a href="https://www.cybrosys.com/odoo/industries/ecommerce-website/" target="_blank"> |
|||
<img src="https://www.cybrosys.com/images/odoo-index-industry-5.png" alt="Odoo Industry" style=" border-radius: 100%;width:100%;"/> |
|||
</a> |
|||
</div> |
|||
</div> |
|||
<div style="width:70%;float:left;"> |
|||
<h3 class="oe_slogan" style=" text-align: left;font-size: 14px;font-weight:800;width: auto;margin: 0;margin-top: 14px;color: #000 !important;margin-top: 5px;opacity: 1 !important;line-height: 17px;float: left;margin-top: 0px;margin-left: 16px;"> |
|||
<a href="https://www.cybrosys.com/odoo/industries/ecommerce-website/" target="_blank"> |
|||
E-commerce & Website</a> |
|||
</h3> |
|||
<h3 class="oe_slogan" style=" text-align: left;font-size: 13px;width: auto;margin: 0;margin-top:5px;color: #000 !important;margin-top: 5px;opacity: 1 !important;line-height: 17px;float: left;margin-top: 5px;margin-left: 16px;"> |
|||
Mobile friendly, awe-inspiring product pages. |
|||
</h3> |
|||
</div> |
|||
</div> |
|||
<div style="flex-basis: 32%;padding-top: 20px;"> |
|||
|
|||
<div style="width:30%; float:left;"> |
|||
<div style="width:75px;height:75px;background:#CE2D48; border-radius:100%;float: left;text-align: left;"> |
|||
<a href="https://www.cybrosys.com/odoo/industries/hotel-management-erp/" target="_blank"> |
|||
<img src="https://www.cybrosys.com/images/odoo-index-industry-6.png" alt="Odoo Industry" style=" border-radius: 100%;width:100%;"/> |
|||
</a> |
|||
</div> |
|||
</div> |
|||
<div style="width:70%;float:left;"> |
|||
<h3 class="oe_slogan" style=" text-align: left;font-size: 14px;font-weight:800;width: auto;margin: 0;margin-top: 14px;color: #000 !important;margin-top: 5px;opacity: 1 !important;line-height: 17px;float: left;margin-top: 4px;margin-left: 16px;"> |
|||
<a href="https://www.cybrosys.com/odoo/industries/hotel-management-erp/" target="_blank"> |
|||
Hotel Management</a> |
|||
</h3> |
|||
<h3 class="oe_slogan" style=" text-align: left;font-size: 13px;width: auto;margin: 0;margin-top:5px;color: #000 !important;margin-top: 5px;opacity: 1 !important;line-height: 17px;float: left;margin-top: 5px;margin-left: 16px;"> |
|||
An all-inclusive hotel management application. |
|||
</h3> |
|||
</div> |
|||
</div> |
|||
<div style="flex-basis: 32%;padding-top: 20px;"> |
|||
|
|||
<div style="width:30%; float:left;"> |
|||
<div style="width:75px;height:75px;background:#CE2D48; border-radius:100%;float: left;text-align: left;"> |
|||
<a href="https://www.cybrosys.com/odoo/industries/education-erp-software/" target="_blank"> |
|||
<img src="https://www.cybrosys.com/images/odoo-index-industry-7.png" alt="Odoo Industry" style=" border-radius: 100%;width:100%;"/> |
|||
</a> |
|||
</div> |
|||
</div> |
|||
<div style="width:70%;float:left;"> |
|||
<h3 class="oe_slogan" style=" text-align: left;font-size: 14px;font-weight:800;width: auto;margin: 0;margin-top: 14px;color: #000 !important;margin-top: 5px;opacity: 1 !important;line-height: 17px;float: left;margin-top: 4px;margin-left: 16px;"> |
|||
<a href="https://www.cybrosys.com/odoo/industries/education-erp-software/" target="_blank"> |
|||
Education</a> |
|||
</h3> |
|||
<h3 class="oe_slogan" style=" text-align: left;font-size: 13px;width: auto;margin: 0;margin-top:5px;color: #000 !important;margin-top: 5px;opacity: 1 !important;line-height: 17px;float: left;margin-top: 5px;margin-left: 16px;"> |
|||
A Collaborative platform for educational management. |
|||
</h3> |
|||
</div> |
|||
</div> |
|||
<div style="flex-basis: 32%;padding-top: 20px;"> |
|||
|
|||
<div style="width:30%; float:left;"> |
|||
<div style="width:75px;height:75px;background:#CE2D48; border-radius:100%;float: left;text-align: left;"> |
|||
<a href="https://www.cybrosys.com/odoo/industries/service-management/" target="_blank"> |
|||
<img src="https://www.cybrosys.com/images/odoo-index-industry-8.png" alt="Odoo Industry" style=" border-radius: 100%;width:100%;"/> |
|||
</a> |
|||
</div> |
|||
</div> |
|||
<div style="width:70%;float:left;"> |
|||
<h3 class="oe_slogan" style=" text-align: left;font-size: 14px;font-weight:800;width: auto;margin: 0;margin-top: 14px;color: #000 !important;margin-top: 5px;opacity: 1 !important;line-height: 17px;float: left;margin-top: 4px;margin-left: 16px;"> |
|||
<a href="https://www.cybrosys.com/odoo/industries/service-management/" target="_blank"> |
|||
Service Management</a> |
|||
</h3> |
|||
<h3 class="oe_slogan" style=" text-align: left;font-size: 13px;width: auto;margin: 0;margin-top:5px;color: #000 !important;margin-top: 5px;opacity: 1 !important;line-height: 17px;float: left;margin-top: 5px;margin-left: 16px;"> |
|||
Keep track of services and invoice accordingly. |
|||
</h3> |
|||
</div> |
|||
</div> |
|||
</div> |
|||
</div> |
|||
</section> |
|||
<section class="oe_container" style="background-image:url(https://www.cybrosys.com/images/odoo-index-footer-bg.png); background-repeat:no-repeat; background-size:100%;padding: 13% 0% 6% 0%;"> |
|||
<div class="oe_slogan" style="margin-top:10px !important;margin-bottom: 0px;"> |
|||
<div> |
|||
<a style="color: #5c5c5c !important;border-radius: 0;background: none;border: none;background: #fff;box-shadow: 0 10px 40px 0 rgba(62,57,107,0.07), 0 2px 9px 0 rgba(62, 57, 107, 0.05);border-radius: 30px;font-size: 12px;padding: 9px 26px;margin-right: 9px;width: 200px;text-transform: capitalize;" class="btn btn-primary btn-lg mt8" style="color: #FFFFFF !important;border-radius: 0;" href="mailto:odoo@cybrosys.com"><i class="fa fa-envelope"></i> Email us </a> |
|||
<a style="color: #5c5c5c !important;border-radius: 0;background: none;border: none;background: #fff;box-shadow: 0 10px 40px 0 rgba(62,57,107,0.07), 0 2px 9px 0 rgba(62, 57, 107, 0.05);border-radius: 30px;font-size: 12px;padding: 9px 26px;margin-right: 9px;width: 200px;text-transform: capitalize;" class="btn btn-primary btn-lg mt8" style="color: #FFFFFF !important;border-radius: 0;" href="https://www.cybrosys.com/contact/"><i class="fa fa-phone"></i> Contact Us </a> |
|||
<a style="color: #5c5c5c !important;border-radius: 0;background: none;border: none;background: #fff;box-shadow: 0 10px 40px 0 rgba(62,57,107,0.07), 0 2px 9px 0 rgba(62, 57, 107, 0.05);border-radius: 30px;font-size: 12px;padding: 9px 26px;margin-right: 9px;width: 200px;text-transform: capitalize;" class="btn btn-primary btn-lg mt8" style="color: #FFFFFF !important;border-radius: 0;" href="https://www.cybrosys.com/contact/"><i class="fa fa-check-square"></i> Request Customization </a> |
|||
</div> |
|||
<br> |
|||
<img src="https://www.cybrosys.com/images/logo.png" style="width: 190px; margin-bottom: 25px;margin-top: 30px;" class="center-block"> |
|||
<div> |
|||
<a href="https://twitter.com/cybrosys" target="_blank"><i class="fa fa-2x fa-twitter" style="color:white;background: #00a0d1;width:35px;height: 35px;padding-top: 7px;font-size: 21px;margin-right: 6px;border-radius: 100%;"></i></a></td> |
|||
<a href="https://www.linkedin.com/company/cybrosys-technologies-pvt-ltd" target="_blank"><i class="fa fa-2x fa-linkedin" style="color:white;background: #31a3d6;width:35px;padding-left: 3px;height: 35px;padding-top: 7px;font-size: 21px;margin-right: 6px;border-radius: 100%;"></i></a></td> |
|||
<a href="https://www.facebook.com/cybrosystechnologies" target="_blank"><i class="fa fa-2x fa-facebook" style="color:white;background: #3b5998;width:35px; ;height: 35px;padding-top: 7px;font-size: 21px;margin-right: 6px;border-radius: 100%;"></i></a></td> |
|||
<a href="https://plus.google.com/106641282743045431892/about" target="_blank"><i class="fa fa-2x fa-google-plus" style="color:white;background: #c53c2c;width:35px;padding-left: 3px;height: 35px;padding-top: 7px;font-size: 21px;margin-right: 6px;border-radius: 100%;"></i></a></td> |
|||
<a href="https://in.pinterest.com/cybrosys" target="_blank"><i class="fa fa-2x fa-pinterest" style="color:white;background: #ac0f18;width:35px;padding-left: 3px;height: 35px;padding-top: 7px;font-size: 21px;margin-right: 6px;border-radius: 100%;"></i></a></td> |
|||
</div> |
|||
</div> |
|||
</section> |
@ -0,0 +1,49 @@ |
|||
<?xml version="1.0" encoding="utf-8"?> |
|||
<odoo> |
|||
<data> |
|||
|
|||
<record id="view_module_filter" model="ir.ui.view"> |
|||
<field name="name">ir.module.module.list.select</field> |
|||
<field name="inherit_id" ref="base.view_module_filter"/> |
|||
<field name="model">ir.module.module</field> |
|||
<field name="arch" type="xml"> |
|||
<xpath expr="//filter[@name='installed']" position="before"> |
|||
<filter string="Recently updated" |
|||
name="Recently updated" |
|||
domain="[('state','=','installed')]" |
|||
groups="developer_mode.odoo_developer_group"/> |
|||
</xpath> |
|||
|
|||
<xpath expr="//filter[last()]" position="after"> |
|||
<filter string="Latest update" |
|||
name="Latest update" |
|||
groups="developer_mode.odoo_developer_group"/> |
|||
</xpath> |
|||
</field> |
|||
</record> |
|||
|
|||
<record model="ir.ui.view" id="developer_mode_module_view_kanban"> |
|||
<field name="name">Modules Kanban</field> |
|||
<field name="inherit_id" ref="base.module_view_kanban"/> |
|||
<field name="model">ir.module.module</field> |
|||
<field name="arch" type="xml"> |
|||
<xpath expr="//div[hasclass('oe_module_action')]/div" position="replace"> |
|||
</xpath> |
|||
<xpath expr="//button[@name='button_immediate_install']" position="after"> |
|||
<button type="object" class="btn btn-primary pull-right btn-sm" name="button_immediate_upgrade" states="installed" |
|||
groups="developer_mode.odoo_developer_group">Updater</button> |
|||
</xpath> |
|||
</field> |
|||
</record> |
|||
|
|||
<!--<template id="contact" inherit_id="web.login_layout">--> |
|||
<!--<xpath expr="//div[@class='container mb-5 pb-5']" position="before">--> |
|||
<!--<t t-if="True" groups="developer_mode.odoo_developer_group">--> |
|||
<!--<div style="height:20px;text-align:center;background-color:#800070b3;color:#ffffff;">--> |
|||
<!--<t t-esc="request.session.db"/>--> |
|||
<!--</div>--> |
|||
<!--</t>--> |
|||
<!--</xpath>--> |
|||
<!--</template>--> |
|||
</data> |
|||
</odoo> |
@ -0,0 +1,16 @@ |
|||
<?xml version="1.0" encoding="utf-8"?> |
|||
<odoo> |
|||
<data> |
|||
|
|||
<record id="view_rule_tree" model="ir.ui.view"> |
|||
<field name="model">ir.rule</field> |
|||
<field name="inherit_id" ref="base.view_rule_tree"/> |
|||
<field name="arch" type="xml"> |
|||
<xpath expr="//field[@name='model_id']" position="after"> |
|||
<field name="group"/> |
|||
</xpath> |
|||
</field> |
|||
</record> |
|||
|
|||
</data> |
|||
</odoo> |
@ -0,0 +1,55 @@ |
|||
============================ |
|||
Product Image Suggestion V12 |
|||
============================ |
|||
|
|||
This module shortlists you with the most relevant product images on Google Images that you are precisely looking for. |
|||
|
|||
Installation |
|||
============ |
|||
|
|||
- www.odoo.com/documentation/12.0/setup/install.html |
|||
- Install our custom addon |
|||
|
|||
|
|||
Configuration |
|||
============= |
|||
|
|||
* Before going to install, make sure "PIL" and "python-resize-image" python packages are installed on your server |
|||
* After installing the module, go to product form. Search product image from page "Image suggestion". |
|||
* Use image number limit for searching. |
|||
* Resize image if necessary.for install Resizeimage :pip3 install --user python-resize-image |
|||
|
|||
|
|||
Features |
|||
======== |
|||
|
|||
* A seamless and accurate search of product images from Google. |
|||
* Prioritizing the image suggestions via setting the desired search limit. |
|||
* Lock screen using keyboard shortcut 'CTRL+L'. |
|||
* Easy image editing; Can automatically resize the image to 1024x1204 px |
|||
|
|||
|
|||
License |
|||
======= |
|||
GNU LESSER GENERAL PUBLIC LICENSE, Version 3 (LGPLv3) |
|||
(http://www.gnu.org/licenses/agpl.html) |
|||
|
|||
Bug Tracker |
|||
=========== |
|||
Bugs are tracked on GitHub Issues. In case of trouble, please check there if your issue has already been reported. |
|||
|
|||
Credits |
|||
======= |
|||
* Cybrosys Techno Solutions<https://www.cybrosys.com> |
|||
|
|||
Author |
|||
------ |
|||
|
|||
Developer: Akhilesh N S @ cybrosys, odoo@cybrosys.com |
|||
|
|||
Maintainer |
|||
---------- |
|||
|
|||
This module is maintained by Cybrosys Technologies. |
|||
|
|||
For support and more information, please visit https://www.cybrosys.com. |
@ -0,0 +1,2 @@ |
|||
# -*- coding: utf-8 -*- |
|||
from . import models |
@ -0,0 +1,43 @@ |
|||
# -*- coding: utf-8 -*- |
|||
|
|||
############################################################################## |
|||
# |
|||
# Cybrosys Technologies Pvt. Ltd. |
|||
# Copyright (C) 2019-TODAY Cybrosys Technologies(<https://www.cybrosys.com>). |
|||
# Author: Akhilesh N S |
|||
# you can modify it under the terms of the GNU LESSER |
|||
# GENERAL PUBLIC LICENSE (LGPL v3), Version 3. |
|||
# |
|||
# It is forbidden to publish, distribute, sublicense, or sell copies |
|||
# of the Software or modified copies of the Software. |
|||
# |
|||
# 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 |
|||
# GENERAL PUBLIC LICENSE (LGPL v3) along with this program. |
|||
# If not, see <http://www.gnu.org/licenses/>. |
|||
# |
|||
############################################################################## |
|||
{ |
|||
'name': 'Product Image Suggestion', |
|||
'version': '12.0.1.0.0', |
|||
'summary': 'Suggest product images from google search', |
|||
'category': 'Tools', |
|||
'author': 'Cybrosys Techno Solutions', |
|||
'company': 'Cybrosys Techno Solutions', |
|||
'maintainer': 'Cybrosys Techno Solutions', |
|||
'depends': ['base', 'product'], |
|||
'external_dependencies': {'python': ['base64', 'PIL','resizeimage']}, |
|||
'website': 'https://www.cybrosys.com', |
|||
'data': [ |
|||
'views/product_template.xml', |
|||
], |
|||
'images': ['static/description/banner.gif'], |
|||
'license': 'LGPL-3', |
|||
'installable': True, |
|||
'auto_install': False, |
|||
'application': False, |
|||
} |
@ -0,0 +1,8 @@ |
|||
## Module <product_image_suggestion> |
|||
|
|||
#### 27.02.2019 |
|||
#### Version 12.0.1.0.0 |
|||
#### ADD |
|||
|
|||
- Initial commit |
|||
|
@ -0,0 +1,3 @@ |
|||
# -*- coding: utf-8 -*- |
|||
from . import product_image_suggestion |
|||
from . import google_images_download |
@ -0,0 +1,622 @@ |
|||
#!/usr/bin/env python |
|||
# In[ ]: |
|||
# coding: utf-8 |
|||
|
|||
###### Searching and Downloading Google Images to the local disk ###### |
|||
|
|||
# Import Libraries |
|||
import sys |
|||
import logging |
|||
_logger = logging.getLogger(__name__) |
|||
|
|||
version = (3, 0) |
|||
cur_version = sys.version_info |
|||
if cur_version >= version: # If the Current Version of Python is 3.0 or above |
|||
import urllib.request |
|||
from urllib.request import Request, urlopen |
|||
from urllib.request import URLError, HTTPError |
|||
from urllib.parse import quote |
|||
import http.client |
|||
from http.client import IncompleteRead |
|||
http.client._MAXHEADERS = 1000 |
|||
else: # If the Current Version of Python is 2.x |
|||
import urllib2 |
|||
from urllib2 import Request, urlopen |
|||
from urllib2 import URLError, HTTPError |
|||
from urllib import quote |
|||
import httplib |
|||
from httplib import IncompleteRead |
|||
httplib._MAXHEADERS = 1000 |
|||
import time # Importing the time library to check the time of code execution |
|||
import os |
|||
import argparse |
|||
import ssl |
|||
import datetime |
|||
import json |
|||
import re |
|||
import codecs |
|||
import socket |
|||
|
|||
args_list = ["keywords", "keywords_from_file", "prefix_keywords", "suffix_keywords", |
|||
"limit", "format", "color", "color_type", "usage_rights", "size", |
|||
"exact_size", "aspect_ratio", "type", "time", "time_range", "delay", "url", "single_image", |
|||
"output_directory", "image_directory", "no_directory", "proxy", "similar_images", "specific_site", |
|||
"print_urls", "print_size", "print_paths", "metadata", "extract_metadata", "socket_timeout", |
|||
"thumbnail", "language", "prefix", "chromedriver", "related_images", "safe_search", "no_numbering", |
|||
"offset", "no_download"] |
|||
|
|||
|
|||
def user_input(): |
|||
config = argparse.ArgumentParser() |
|||
config.add_argument('-cf', '--config_file', help='config file name', default='', type=str, required=False) |
|||
config_file_check = config.parse_known_args() |
|||
object_check = vars(config_file_check[0]) |
|||
|
|||
if object_check['config_file'] != '': |
|||
records = [] |
|||
json_file = json.load(open(config_file_check[0].config_file)) |
|||
for record in range(0,len(json_file['Records'])): |
|||
arguments = {} |
|||
for i in args_list: |
|||
arguments[i] = None |
|||
for key, value in json_file['Records'][record].items(): |
|||
arguments[key] = value |
|||
records.append(arguments) |
|||
records_count = len(records) |
|||
else: |
|||
# Taking command line arguments from users |
|||
parser = argparse.ArgumentParser() |
|||
parser.add_argument('-k', '--keywords', help='delimited list input', type=str, required=False) |
|||
parser.add_argument('-kf', '--keywords_from_file', help='extract list of keywords from a text file', type=str, required=False) |
|||
parser.add_argument('-sk', '--suffix_keywords', help='comma separated additional words added after to main keyword', type=str, required=False) |
|||
parser.add_argument('-pk', '--prefix_keywords', help='comma separated additional words added before main keyword', type=str, required=False) |
|||
parser.add_argument('-l', '--limit', help='delimited list input', type=str, required=False) |
|||
parser.add_argument('-f', '--format', help='download images with specific format', type=str, required=False, |
|||
choices=['jpg', 'gif', 'png', 'bmp', 'svg', 'webp', 'ico']) |
|||
parser.add_argument('-u', '--url', help='search with google image URL', type=str, required=False) |
|||
parser.add_argument('-x', '--single_image', help='downloading a single image from URL', type=str, required=False) |
|||
parser.add_argument('-o', '--output_directory', help='download images in a specific main directory', type=str, required=False) |
|||
parser.add_argument('-i', '--image_directory', help='download images in a specific sub-directory', type=str, required=False) |
|||
parser.add_argument('-n', '--no_directory', default=False, help='download images in the main directory but no sub-directory', action="store_true") |
|||
parser.add_argument('-d', '--delay', help='delay in seconds to wait between downloading two images', type=int, required=False) |
|||
parser.add_argument('-co', '--color', help='filter on color', type=str, required=False, |
|||
choices=['red', 'orange', 'yellow', 'green', 'teal', 'blue', 'purple', 'pink', 'white', 'gray', 'black', 'brown']) |
|||
parser.add_argument('-ct', '--color_type', help='filter on color', type=str, required=False, |
|||
choices=['full-color', 'black-and-white', 'transparent']) |
|||
parser.add_argument('-r', '--usage_rights', help='usage rights', type=str, required=False, |
|||
choices=['labeled-for-reuse-with-modifications','labeled-for-reuse','labeled-for-noncommercial-reuse-with-modification','labeled-for-nocommercial-reuse']) |
|||
parser.add_argument('-s', '--size', help='image size', type=str, required=False, |
|||
choices=['large','medium','icon','>400*300','>640*480','>800*600','>1024*768','>2MP','>4MP','>6MP','>8MP','>10MP','>12MP','>15MP','>20MP','>40MP','>70MP']) |
|||
parser.add_argument('-es', '--exact_size', help='exact image resolution "WIDTH,HEIGHT"', type=str, required=False) |
|||
parser.add_argument('-t', '--type', help='image type', type=str, required=False, |
|||
choices=['face','photo','clipart','line-drawing','animated']) |
|||
parser.add_argument('-w', '--time', help='image age', type=str, required=False, |
|||
choices=['past-24-hours','past-7-days']) |
|||
parser.add_argument('-wr', '--time_range', help='time range for the age of the image. should be in the format {"time_min":"MM/DD/YYYY","time_max":"MM/DD/YYYY"}', type=str, required=False) |
|||
parser.add_argument('-a', '--aspect_ratio', help='comma separated additional words added to keywords', type=str, required=False, |
|||
choices=['tall', 'square', 'wide', 'panoramic']) |
|||
parser.add_argument('-si', '--similar_images', help='downloads images very similar to the image URL you provide', type=str, required=False) |
|||
parser.add_argument('-ss', '--specific_site', help='downloads images that are indexed from a specific website', type=str, required=False) |
|||
parser.add_argument('-p', '--print_urls', default=False, help="Print the URLs of the images", action="store_true") |
|||
parser.add_argument('-ps', '--print_size', default=False, help="Print the size of the images on disk", action="store_true") |
|||
parser.add_argument('-pp', '--print_paths', default=False, help="Prints the list of absolute paths of the images",action="store_true") |
|||
parser.add_argument('-m', '--metadata', default=False, help="Print the metadata of the image", action="store_true") |
|||
parser.add_argument('-e', '--extract_metadata', default=False, help="Dumps all the logs into a text file", action="store_true") |
|||
parser.add_argument('-st', '--socket_timeout', default=False, help="Connection timeout waiting for the image to download", type=float) |
|||
parser.add_argument('-th', '--thumbnail', default=False, help="Downloads image thumbnail along with the actual image", action="store_true") |
|||
parser.add_argument('-la', '--language', default=False, help="Defines the language filter. The search results are authomatically returned in that language", type=str, required=False, |
|||
choices=['Arabic','Chinese (Simplified)','Chinese (Traditional)','Czech','Danish','Dutch','English','Estonian','Finnish','French','German','Greek','Hebrew','Hungarian','Icelandic','Italian','Japanese','Korean','Latvian','Lithuanian','Norwegian','Portuguese','Polish','Romanian','Russian','Spanish','Swedish','Turkish']) |
|||
parser.add_argument('-pr', '--prefix', default=False, help="A word that you would want to prefix in front of each image name", type=str, required=False) |
|||
parser.add_argument('-px', '--proxy', help='specify a proxy address and port', type=str, required=False) |
|||
parser.add_argument('-cd', '--chromedriver', help='specify the path to chromedriver executable in your local machine', type=str, required=False) |
|||
parser.add_argument('-ri', '--related_images', default=False, help="Downloads images that are similar to the keyword provided", action="store_true") |
|||
parser.add_argument('-sa', '--safe_search', default=False, help="Turns on the safe search filter while searching for images", action="store_true") |
|||
parser.add_argument('-nn', '--no_numbering', default=False, help="Allows you to exclude the default numbering of images", action="store_true") |
|||
parser.add_argument('-of', '--offset', help="Where to start in the fetched links", type=str, required=False) |
|||
parser.add_argument('-nd', '--no_download', default=False, help="Prints the URLs of the images and/or thumbnails without downloading them", action="store_true") |
|||
|
|||
args = parser.parse_args() |
|||
arguments = vars(args) |
|||
records = [] |
|||
records.append(arguments) |
|||
return records |
|||
|
|||
|
|||
class googleimagesdownload: |
|||
def __init__(self): |
|||
pass |
|||
|
|||
# Downloading entire Web Document (Raw Page Content) |
|||
def download_page(self,url): |
|||
version = (3, 0) |
|||
cur_version = sys.version_info |
|||
if cur_version >= version: # If the Current Version of Python is 3.0 or above |
|||
try: |
|||
headers = {} |
|||
headers['User-Agent'] = "Mozilla/5.0 (Windows NT 6.1) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/41.0.2228.0 Safari/537.36" |
|||
req = urllib.request.Request(url, headers=headers) |
|||
resp = urllib.request.urlopen(req) |
|||
respData = str(resp.read()) |
|||
return respData |
|||
except Exception as e: |
|||
_logger.exception("Could not open URL. Please check your internet connection and/or ssl settings") |
|||
else: # If the Current Version of Python is 2.x |
|||
try: |
|||
headers = {} |
|||
headers['User-Agent'] = "Mozilla/5.0 (X11; Linux i686) AppleWebKit/537.17 (KHTML, like Gecko) Chrome/24.0.1312.27 Safari/537.17" |
|||
req = urllib2.Request(url, headers=headers) |
|||
try: |
|||
response = urllib2.urlopen(req) |
|||
except URLError: # Handling SSL certificate failed |
|||
context = ssl._create_unverified_context() |
|||
response = urlopen(req, context=context) |
|||
page = response.read() |
|||
return page |
|||
except: |
|||
_logger.exception("Could not open URL. Please check your internet connection and/or ssl settings") |
|||
return "Page Not found" |
|||
|
|||
|
|||
# Download Page for more than 100 images |
|||
def download_extended_page(self,url,chromedriver): |
|||
from selenium import webdriver |
|||
from selenium.webdriver.common.keys import Keys |
|||
if sys.version_info[0] < 3: |
|||
reload(sys) |
|||
sys.setdefaultencoding('utf8') |
|||
options = webdriver.ChromeOptions() |
|||
options.add_argument('--no-sandbox') |
|||
options.add_argument("--headless") |
|||
|
|||
try: |
|||
browser = webdriver.Chrome(chromedriver, chrome_options=options) |
|||
except Exception as e: |
|||
_logger.exception("Looks like we cannot locate the path the 'chromedriver' (use the '--chromedriver' " |
|||
"argument to specify the path to the executable.) or google chrome browser is not " |
|||
"installed on your machine (exception: %s)" % e) |
|||
|
|||
sys.exit() |
|||
browser.set_window_size(1024, 768) |
|||
|
|||
# Open the link |
|||
browser.get(url) |
|||
time.sleep(1) |
|||
_logger.warning("Getting you a lot of images. This may take a few moments...") |
|||
|
|||
element = browser.find_element_by_tag_name("body") |
|||
# Scroll down |
|||
for i in range(30): |
|||
element.send_keys(Keys.PAGE_DOWN) |
|||
time.sleep(0.3) |
|||
|
|||
try: |
|||
browser.find_element_by_id("smb").click() |
|||
for i in range(50): |
|||
element.send_keys(Keys.PAGE_DOWN) |
|||
time.sleep(0.3) # bot id protection |
|||
except: |
|||
for i in range(10): |
|||
element.send_keys(Keys.PAGE_DOWN) |
|||
time.sleep(0.3) # bot id protection |
|||
|
|||
_logger.warning("Reached end of Page.") |
|||
|
|||
time.sleep(0.5) |
|||
|
|||
source = browser.page_source #page source |
|||
#close the browser |
|||
browser.close() |
|||
|
|||
return source |
|||
|
|||
|
|||
#Correcting the escape characters for python2 |
|||
def replace_with_byte(self,match): |
|||
return chr(int(match.group(0)[1:], 8)) |
|||
|
|||
def repair(self,brokenjson): |
|||
invalid_escape = re.compile(r'\\[0-7]{1,3}') # up to 3 digits for byte values up to FF |
|||
return invalid_escape.sub(self.replace_with_byte, brokenjson) |
|||
|
|||
|
|||
# Finding 'Next Image' from the given raw page |
|||
def get_next_tab(self,s): |
|||
start_line = s.find('class="dtviD"') |
|||
if start_line == -1: # If no links are found then give an error! |
|||
end_quote = 0 |
|||
link = "no_tabs" |
|||
return link,'',end_quote |
|||
else: |
|||
start_line = s.find('class="dtviD"') |
|||
start_content = s.find('href="', start_line + 1) |
|||
end_content = s.find('">', start_content + 1) |
|||
url_item = "https://www.google.com" + str(s[start_content+6:end_content]) |
|||
url_item = url_item.replace('&', '&') |
|||
|
|||
start_line_2 = s.find('class="dtviD"') |
|||
start_content_2 = s.find(':', start_line_2 + 1) |
|||
end_content_2 = s.find('"', start_content_2 + 1) |
|||
url_item_name = str(s[start_content_2 + 1:end_content_2]) |
|||
|
|||
return url_item,url_item_name,end_content |
|||
|
|||
|
|||
# Getting all links with the help of '_images_get_next_image' |
|||
def get_all_tabs(self,page): |
|||
tabs = {} |
|||
while True: |
|||
item,item_name,end_content = self.get_next_tab(page) |
|||
if item == "no_tabs": |
|||
break |
|||
else: |
|||
tabs[item_name] = item # Append all the links in the list named 'Links' |
|||
time.sleep(0.1) # Timer could be used to slow down the request for image downloads |
|||
page = page[end_content:] |
|||
return tabs |
|||
|
|||
|
|||
#Format the object in readable format |
|||
def format_object(self,object): |
|||
formatted_object = {} |
|||
formatted_object['image_format'] = object['ity'] |
|||
formatted_object['image_height'] = object['oh'] |
|||
formatted_object['image_width'] = object['ow'] |
|||
formatted_object['image_link'] = object['ou'] |
|||
formatted_object['image_description'] = object['pt'] |
|||
formatted_object['image_host'] = object['rh'] |
|||
formatted_object['image_source'] = object['ru'] |
|||
formatted_object['image_thumbnail_url'] = object['tu'] |
|||
return formatted_object |
|||
|
|||
|
|||
def similar_images(self,similar_images): |
|||
version = (3, 0) |
|||
cur_version = sys.version_info |
|||
if cur_version >= version: # If the Current Version of Python is 3.0 or above |
|||
try: |
|||
searchUrl = 'https://www.google.com/searchbyimage?site=search&sa=X&image_url=' + similar_images |
|||
headers = {} |
|||
headers['User-Agent'] = "Mozilla/5.0 (Windows NT 6.1) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/41.0.2228.0 Safari/537.36" |
|||
|
|||
req1 = urllib.request.Request(searchUrl, headers=headers) |
|||
resp1 = urllib.request.urlopen(req1) |
|||
content = str(resp1.read()) |
|||
l1 = content.find('AMhZZ') |
|||
l2 = content.find('&', l1) |
|||
urll = content[l1:l2] |
|||
|
|||
newurl = "https://www.google.com/search?tbs=sbi:" + urll + "&site=search&sa=X" |
|||
req2 = urllib.request.Request(newurl, headers=headers) |
|||
resp2 = urllib.request.urlopen(req2) |
|||
|
|||
l3 = content.find('/search?sa=X&q=') |
|||
l4 = content.find(';', l3 + 19) |
|||
urll2 = content[l3 + 19:l4] |
|||
return urll2 |
|||
except: |
|||
return "Cloud not connect to Google Images endpoint" |
|||
else: # If the Current Version of Python is 2.x |
|||
try: |
|||
searchUrl = 'https://www.google.com/searchbyimage?site=search&sa=X&image_url=' + similar_images |
|||
headers = {} |
|||
headers['User-Agent'] = "Mozilla/5.0 (X11; Linux i686) AppleWebKit/537.17 (KHTML, like Gecko) Chrome/24.0.1312.27 Safari/537.17" |
|||
|
|||
req1 = urllib2.Request(searchUrl, headers=headers) |
|||
resp1 = urllib2.urlopen(req1) |
|||
content = str(resp1.read()) |
|||
l1 = content.find('AMhZZ') |
|||
l2 = content.find('&', l1) |
|||
urll = content[l1:l2] |
|||
|
|||
newurl = "https://www.google.com/search?tbs=sbi:" + urll + "&site=search&sa=X" |
|||
|
|||
req2 = urllib2.Request(newurl, headers=headers) |
|||
resp2 = urllib2.urlopen(req2) |
|||
|
|||
l3 = content.find('/search?sa=X&q=') |
|||
l4 = content.find(';', l3 + 19) |
|||
urll2 = content[l3 + 19:l4] |
|||
return(urll2) |
|||
except: |
|||
return "Cloud not connect to Google Images endpoint" |
|||
|
|||
#Building URL parameters |
|||
def build_url_parameters(self,arguments): |
|||
if arguments['language']: |
|||
lang = "&lr=" |
|||
lang_param = {"Arabic":"lang_ar","Chinese (Simplified)":"lang_zh-CN","Chinese (Traditional)":"lang_zh-TW","Czech":"lang_cs","Danish":"lang_da","Dutch":"lang_nl","English":"lang_en","Estonian":"lang_et","Finnish":"lang_fi","French":"lang_fr","German":"lang_de","Greek":"lang_el","Hebrew":"lang_iw ","Hungarian":"lang_hu","Icelandic":"lang_is","Italian":"lang_it","Japanese":"lang_ja","Korean":"lang_ko","Latvian":"lang_lv","Lithuanian":"lang_lt","Norwegian":"lang_no","Portuguese":"lang_pt","Polish":"lang_pl","Romanian":"lang_ro","Russian":"lang_ru","Spanish":"lang_es","Swedish":"lang_sv","Turkish":"lang_tr"} |
|||
lang_url = lang+lang_param[arguments['language']] |
|||
else: |
|||
lang_url = '' |
|||
|
|||
if arguments['time_range']: |
|||
json_acceptable_string = arguments['time_range'].replace("'", "\"") |
|||
d = json.loads(json_acceptable_string) |
|||
time_range = ',cdr:1,cd_min:' + d['time_min'] + ',cd_max:' + d['time_max'] |
|||
else: |
|||
time_range = '' |
|||
|
|||
if arguments['exact_size']: |
|||
size_array = [x.strip() for x in arguments['exact_size'].split(',')] |
|||
exact_size = ",isz:ex,iszw:" + str(size_array[0]) + ",iszh:" + str(size_array[1]) |
|||
else: |
|||
exact_size = '' |
|||
|
|||
built_url = "&tbs=" |
|||
counter = 0 |
|||
params = {'color':[arguments['color'],{'red':'ic:specific,isc:red', 'orange':'ic:specific,isc:orange', 'yellow':'ic:specific,isc:yellow', 'green':'ic:specific,isc:green', 'teal':'ic:specific,isc:teel', 'blue':'ic:specific,isc:blue', 'purple':'ic:specific,isc:purple', 'pink':'ic:specific,isc:pink', 'white':'ic:specific,isc:white', 'gray':'ic:specific,isc:gray', 'black':'ic:specific,isc:black', 'brown':'ic:specific,isc:brown'}], |
|||
'color_type':[arguments['color_type'],{'full-color':'ic:color', 'black-and-white':'ic:gray','transparent':'ic:trans'}], |
|||
'usage_rights':[arguments['usage_rights'],{'labeled-for-reuse-with-modifications':'sur:fmc','labeled-for-reuse':'sur:fc','labeled-for-noncommercial-reuse-with-modification':'sur:fm','labeled-for-nocommercial-reuse':'sur:f'}], |
|||
'size':[arguments['size'],{'large':'isz:l','medium':'isz:m','icon':'isz:i','>400*300':'isz:lt,islt:qsvga','>640*480':'isz:lt,islt:vga','>800*600':'isz:lt,islt:svga','>1024*768':'visz:lt,islt:xga','>2MP':'isz:lt,islt:2mp','>4MP':'isz:lt,islt:4mp','>6MP':'isz:lt,islt:6mp','>8MP':'isz:lt,islt:8mp','>10MP':'isz:lt,islt:10mp','>12MP':'isz:lt,islt:12mp','>15MP':'isz:lt,islt:15mp','>20MP':'isz:lt,islt:20mp','>40MP':'isz:lt,islt:40mp','>70MP':'isz:lt,islt:70mp'}], |
|||
'type':[arguments['type'],{'face':'itp:face','photo':'itp:photo','clipart':'itp:clipart','line-drawing':'itp:lineart','animated':'itp:animated'}], |
|||
'time':[arguments['time'],{'past-24-hours':'qdr:d','past-7-days':'qdr:w'}], |
|||
'aspect_ratio':[arguments['aspect_ratio'],{'tall':'iar:t','square':'iar:s','wide':'iar:w','panoramic':'iar:xw'}], |
|||
'format':[arguments['format'],{'jpg':'ift:jpg','gif':'ift:gif','png':'ift:png','bmp':'ift:bmp','svg':'ift:svg','webp':'webp','ico':'ift:ico'}]} |
|||
for key, value in params.items(): |
|||
if value[0] is not None: |
|||
ext_param = value[1][value[0]] |
|||
# counter will tell if it is first param added or not |
|||
if counter == 0: |
|||
# add it to the built url |
|||
built_url = built_url + ext_param |
|||
counter += 1 |
|||
else: |
|||
built_url = built_url + ',' + ext_param |
|||
counter += 1 |
|||
built_url = lang_url+built_url+exact_size+time_range |
|||
return built_url |
|||
|
|||
|
|||
#building main search URL |
|||
def build_search_url(self,search_term,params,url,similar_images,specific_site,safe_search): |
|||
#check safe_search |
|||
safe_search_string = "&safe=active" |
|||
# check the args and choose the URL |
|||
if url: |
|||
url = url |
|||
elif similar_images: |
|||
_logger.exception(similar_images) |
|||
keywordem = self.similar_images(similar_images) |
|||
url = 'https://www.google.com/search?q=' + keywordem + '&espv=2&biw=1366&bih=667&site=webhp&source=lnms&tbm=isch&sa=X&ei=XosDVaCXD8TasATItgE&ved=0CAcQ_AUoAg' |
|||
elif specific_site: |
|||
url = 'https://www.google.com/search?q=' + quote( |
|||
search_term) + '&as_sitesearch=' + specific_site + '&espv=2&biw=1366&bih=667&site=webhp&source=lnms&tbm=isch' + params + '&sa=X&ei=XosDVaCXD8TasATItgE&ved=0CAcQ_AUoAg' |
|||
else: |
|||
url = 'https://www.google.com/search?q=' + quote( |
|||
search_term) + '&espv=2&biw=1366&bih=667&site=webhp&source=lnms&tbm=isch' + params + '&sa=X&ei=XosDVaCXD8TasATItgE&ved=0CAcQ_AUoAg' |
|||
|
|||
#safe search check |
|||
if safe_search: |
|||
url = url + safe_search_string |
|||
|
|||
|
|||
return url |
|||
|
|||
|
|||
#measures the file size |
|||
def file_size(self,file_path): |
|||
if os.path.isfile(file_path): |
|||
file_info = os.stat(file_path) |
|||
size = file_info.st_size |
|||
for x in ['bytes', 'KB', 'MB', 'GB', 'TB']: |
|||
if size < 1024.0: |
|||
return "%3.1f %s" % (size, x) |
|||
size /= 1024.0 |
|||
return size |
|||
|
|||
#keywords from file |
|||
def keywords_from_file(self,file_name): |
|||
search_keyword = [] |
|||
with codecs.open(file_name, 'r', encoding='utf-8-sig') as f: |
|||
if '.csv' in file_name: |
|||
for line in f: |
|||
if line in ['\n', '\r\n']: |
|||
pass |
|||
else: |
|||
search_keyword.append(line.replace('\n', '').replace('\r', '')) |
|||
elif '.txt' in file_name: |
|||
for line in f: |
|||
if line in ['\n', '\r\n']: |
|||
pass |
|||
else: |
|||
search_keyword.append(line.replace('\n', '').replace('\r', '')) |
|||
else: |
|||
_logger.warning("Invalid file type: Valid file types are either .txt or .csv \n" |
|||
"exiting...") |
|||
sys.exit() |
|||
return search_keyword |
|||
|
|||
|
|||
# Download Images |
|||
def download_image(self,image_url,image_format,count,print_urls,socket_timeout,prefix,print_size,no_numbering,no_download): |
|||
if not prefix: |
|||
prefix = '' |
|||
if print_urls or no_download: |
|||
_logger.info("Image URL: " + image_url) |
|||
if no_download: |
|||
return "success","Printed url without downloading",None,None |
|||
image_data = None |
|||
try: |
|||
req = Request(image_url, headers={ |
|||
"User-Agent": "Mozilla/5.0 (X11; Linux i686) AppleWebKit/537.17 (KHTML, like Gecko) Chrome/24.0.1312.27 Safari/537.17"}) |
|||
try: |
|||
# timeout time to download an image |
|||
if socket_timeout: |
|||
timeout = float(socket_timeout) |
|||
else: |
|||
timeout = 10 |
|||
|
|||
response = urlopen(req, None, timeout) |
|||
image_data = response.read() |
|||
response.close() |
|||
download_status = 'success' |
|||
download_message = "Completed Image ====> " + prefix + str(count) |
|||
|
|||
except UnicodeEncodeError as e: |
|||
download_status = 'fail' |
|||
download_message = "UnicodeEncodeError on an image...trying next one..." + " Error: " + str(e) |
|||
|
|||
except URLError as e: |
|||
download_status = 'fail' |
|||
download_message = "URLError on an image...trying next one..." + " Error: " + str(e) |
|||
|
|||
except HTTPError as e: # If there is any HTTPError |
|||
download_status = 'fail' |
|||
download_message = "HTTPError on an image...trying next one..." + " Error: " + str(e) |
|||
|
|||
except URLError as e: |
|||
download_status = 'fail' |
|||
download_message = "URLError on an image...trying next one..." + " Error: " + str(e) |
|||
|
|||
except ssl.CertificateError as e: |
|||
download_status = 'fail' |
|||
download_message = "CertificateError on an image...trying next one..." + " Error: " + str(e) |
|||
|
|||
except IOError as e: # If there is any IOError |
|||
download_status = 'fail' |
|||
download_message = "IOError on an image...trying next one..." + " Error: " + str(e) |
|||
|
|||
except IncompleteRead as e: |
|||
download_status = 'fail' |
|||
download_message = "IncompleteReadError on an image...trying next one..." + " Error: " + str(e) |
|||
|
|||
return download_status,download_message, image_data |
|||
|
|||
|
|||
# Finding 'Next Image' from the given raw page |
|||
def _get_next_item(self,s): |
|||
start_line = s.find('rg_meta notranslate') |
|||
if start_line == -1: # If no links are found then give an error! |
|||
end_quote = 0 |
|||
link = "no_links" |
|||
return link, end_quote |
|||
else: |
|||
start_line = s.find('class="rg_meta notranslate">') |
|||
start_object = s.find('{', start_line + 1) |
|||
end_object = s.find('</div>', start_object + 1) |
|||
object_raw = str(s[start_object:end_object]) |
|||
#remove escape characters based on python version |
|||
version = (3, 0) |
|||
cur_version = sys.version_info |
|||
if cur_version >= version: #python3 |
|||
try: |
|||
object_decode = bytes(object_raw, "utf-8").decode("unicode_escape") |
|||
final_object = json.loads(object_decode) |
|||
except: |
|||
final_object = "" |
|||
else: #python2 |
|||
try: |
|||
final_object = (json.loads(self.repair(object_raw))) |
|||
except: |
|||
final_object = "" |
|||
return final_object, end_object |
|||
|
|||
|
|||
# Getting all links with the help of '_images_get_next_image' |
|||
# def _get_all_items(self,page,main_directory,dir_name,limit,arguments): |
|||
def _get_all_items(self,page,limit,arguments): |
|||
image_dic = [] |
|||
errorCount = 0 |
|||
i = 0 |
|||
count = 1 |
|||
while count < limit+1: |
|||
object, end_content = self._get_next_item(page) |
|||
if object == "no_links": |
|||
break |
|||
elif object == "": |
|||
page = page[end_content:] |
|||
elif arguments['offset'] and count < int(arguments['offset']): |
|||
count += 1 |
|||
page = page[end_content:] |
|||
else: |
|||
#format the item for readability |
|||
object = self.format_object(object) |
|||
# if arguments['metadata']: |
|||
# _logger.info("\nImage Metadata: " + str(object)) |
|||
#download the images |
|||
download_status,download_message,image_data = self.download_image(object['image_link'],object['image_format'],count,arguments['print_urls'],arguments['socket_timeout'],arguments['prefix'],arguments['print_size'],arguments['no_numbering'],arguments['no_download']) |
|||
_logger.warning(download_message) |
|||
if download_status == "success": |
|||
count += 1 |
|||
image_dic.append(image_data) |
|||
else: |
|||
errorCount += 1 |
|||
page = page[end_content:] |
|||
i += 1 |
|||
if count < limit: |
|||
_logger.warning("\n\nUnfortunately all " + str( |
|||
limit) + " could not be downloaded because some images were not downloadable. " + str( |
|||
count-1) + " is all we got for this search filter!") |
|||
return errorCount,image_dic |
|||
|
|||
# Bulk Download |
|||
def download(self,arguments): |
|||
|
|||
#for input coming from other python files |
|||
if __name__ != "__main__": |
|||
for arg in args_list: |
|||
if arg not in arguments: |
|||
arguments[arg] = None |
|||
|
|||
######Initialization and Validation of user arguments |
|||
if arguments['keywords']: |
|||
search_keyword = [str(item) for item in arguments['keywords'].split(',')] |
|||
|
|||
if arguments['keywords_from_file']: |
|||
search_keyword = self.keywords_from_file(arguments['keywords_from_file']) |
|||
|
|||
# both time and time range should not be allowed in the same query |
|||
if arguments['time'] and arguments['time_range']: |
|||
raise ValueError('Either time or time range should be used in a query. Both cannot be used at the same time.') |
|||
|
|||
# both time and time range should not be allowed in the same query |
|||
if arguments['size'] and arguments['exact_size']: |
|||
raise ValueError('Either "size" or "exact_size" should be used in a query. Both cannot be used at the same time.') |
|||
|
|||
# both image directory and no image directory should not be allowed in the same query |
|||
if arguments['image_directory'] and arguments['no_directory']: |
|||
raise ValueError('You can either specify image directory or specify no image directory, not both!') |
|||
|
|||
# Additional words added to keywords |
|||
if arguments['suffix_keywords']: |
|||
suffix_keywords = [" " + str(sk) for sk in arguments['suffix_keywords'].split(',')] |
|||
else: |
|||
suffix_keywords = [''] |
|||
|
|||
# Additional words added to keywords |
|||
if arguments['prefix_keywords']: |
|||
prefix_keywords = [str(sk) + " " for sk in arguments['prefix_keywords'].split(',')] |
|||
else: |
|||
prefix_keywords = [''] |
|||
|
|||
# Setting limit on number of images to be downloaded |
|||
if arguments['limit']: |
|||
limit = int(arguments['limit']) |
|||
else: |
|||
limit = 100 |
|||
image_dic = [] |
|||
for pky in prefix_keywords: |
|||
for sky in suffix_keywords: # 1.for every suffix keywords |
|||
i = 0 |
|||
while i < len(search_keyword): # 2.for every main keyword |
|||
iteration = "\n" + "Item no.: " + str(i + 1) + " -->" + " Item name = " + str(pky) + str(search_keyword[i] + str(sky)) |
|||
_logger.info(iteration) |
|||
_logger.info("Evaluating...") |
|||
|
|||
search_term = pky + search_keyword[i] + sky |
|||
params = self.build_url_parameters(arguments) #building URL with params |
|||
url = self.build_search_url(search_term,params,arguments['url'],arguments['similar_images'],arguments['specific_site'],arguments['safe_search']) #building main search url |
|||
if limit < 101: |
|||
raw_html = self.download_page(url) # download page |
|||
else: |
|||
raw_html = self.download_extended_page(url,arguments['chromedriver']) |
|||
if arguments['no_download']: |
|||
_logger.info("Starting to Print Image URLS") |
|||
else: |
|||
_logger.info("Starting Download...") |
|||
errorCount,image_dic = self._get_all_items(raw_html,limit,arguments) #get all image items and download images |
|||
i += 1 |
|||
_logger.warning("\nErrors: " + str(errorCount) + "\n") |
|||
|
|||
return image_dic |
|||
|
@ -0,0 +1,86 @@ |
|||
# -*- coding: utf-8 -*- |
|||
import base64 |
|||
import logging |
|||
import os |
|||
from PIL import Image |
|||
import tempfile |
|||
from resizeimage import resizeimage |
|||
from . import google_images_download |
|||
from odoo import models, fields, api, _ |
|||
from odoo.exceptions import UserError, Warning |
|||
|
|||
|
|||
_logger = logging.getLogger(__name__) |
|||
|
|||
|
|||
class ProductImageSelection(models.TransientModel): |
|||
_name = "product.image.suggestion" |
|||
|
|||
image = fields.Binary('Image', attachment=True) |
|||
product_tmpl_id = fields.Many2one('product.template', 'Related Product', copy=True) |
|||
|
|||
@api.multi |
|||
def action_set_image(self): |
|||
"""Set product images from suggested images""" |
|||
self_image = self.image |
|||
if self_image: |
|||
self.product_tmpl_id.image = self_image |
|||
|
|||
|
|||
class ProductTemplate(models.Model): |
|||
_inherit = 'product.template' |
|||
|
|||
def get_search_string(self): |
|||
for prod in self: |
|||
prod.search_field = prod.name |
|||
|
|||
search_image_ids = fields.One2many('product.image.suggestion', 'product_tmpl_id', string='Images', readonly=True) |
|||
search_field = fields.Char('Search Text', compute=get_search_string, readonly=False, store=True) |
|||
image_limit = fields.Integer('Limit', default=5) |
|||
resize_image = fields.Boolean('Resize Image', default=True) |
|||
|
|||
@api.onchange('image_limit') |
|||
def war_image_limit(self): |
|||
if self.image_limit > 10: |
|||
raise Warning(_('This may slow down image search..!! !')) |
|||
|
|||
@api.multi |
|||
def search_images_button(self): |
|||
"""Clear search images and add new search""" |
|||
self.search_image_ids = [[5,0,0,]] |
|||
if self.image_limit > 10: |
|||
_logger.warning("High limit number slow down the image searches") |
|||
try: |
|||
response = google_images_download.googleimagesdownload() |
|||
query_string = self.search_field.replace(" ", "_").replace(",", "_") |
|||
arguments = {"keywords": query_string, "limit": self.image_limit, "print_urls": False, 'safe_search': True} |
|||
image_datas = response.download(arguments) # passing the arguments to the function |
|||
except AttributeError: |
|||
raise UserError(_('No internet connection available or Something wrong !')) |
|||
if image_datas: |
|||
for im in image_datas: |
|||
temp_name = '' |
|||
try: |
|||
if self.resize_image: |
|||
temp_file, temp_name = tempfile.mkstemp(suffix='.png') |
|||
file = open(temp_name, "wb") |
|||
file.write(im) |
|||
file.close() |
|||
img = Image.open(temp_name) |
|||
img = resizeimage.resize_contain(img, [1024, 1024]) |
|||
img.save(temp_name, img.format) |
|||
with open(temp_name, "rb") as image_file: |
|||
binary_image = base64.b64encode(image_file.read()) |
|||
else: |
|||
b = bytearray(im) |
|||
binary_image = base64.b64encode(b) |
|||
vals = dict(image=binary_image, product_tmpl_id=self.id) |
|||
self.env['product.image.suggestion'].create(vals) |
|||
|
|||
if self.resize_image: |
|||
os.remove(temp_name) |
|||
except: |
|||
_logger.exception(_("failed to display in page")) |
|||
continue |
|||
else: |
|||
raise UserError(_('No image suggestions for this image')) |
After Width: | Height: | Size: 235 KiB |
After Width: | Height: | Size: 50 KiB |
After Width: | Height: | Size: 17 KiB |
@ -0,0 +1,336 @@ |
|||
|
|||
<section class="oe_container" style="background-image:url(https://www.cybrosys.com/images/odoo-index-header-banner.png);background-repeat:no-repeat;background-size:100%;padding: 4% 0% 2% 15%;background-position-y: -107px;"> |
|||
<div class="oe_row oe_spaced"> |
|||
<h2 class="oe_slogan" style="font-size: 35px;color: #fff;font-weight: 900;text-transform: uppercase;text-align: left;margin: 0;margin-bottom: 16px;"> |
|||
Product Image Suggestion |
|||
</h2> |
|||
<h3 class="oe_slogan" style="font-size: 25px;color: #fff;font-weight: 600;text-align: left;opacity: 1;margin: 0 !important;"> |
|||
Set Product Image by Google Search |
|||
</h3> |
|||
<h5 class="oe_slogan" style="text-align: left;background: #fff;width: 293px;padding: 10px;color: #080808 !important;opacity: 1 !important;font-weight: 600;font-size: 20px;"> |
|||
<a style="color: #080808 !important;" href="https://www.cybrosys.com" target="_blank">Cybrosys Technologies</a> |
|||
</h5> |
|||
<a style="color: #080808 !important;" href="https://www.cybrosys.com" target="_blank"> |
|||
<div style="width: 215px;margin-left: 57%;text-align: center;background: #ffffff;height: 215px;border-radius: 100%;display: flex;justify-content: center;align-items: center;box-shadow: 0 0 12px 4px #00000059;"> |
|||
<img src="https://www.cybrosys.com/images/cybro-logo-oca.png" alt="cybrosys technologies" style="width: 180px;"/> </div> |
|||
</a> |
|||
</div> |
|||
</section> |
|||
|
|||
<section class="oe_container" style="padding: 1% 0% 3% 15%;"> |
|||
<div class="oe_row oe_spaced"> |
|||
<h2 class="oe_slogan" style="text-align: left;font-size: 28px;font-weight: 600;margin: 0px !important;"> |
|||
Overview |
|||
</h2> |
|||
<h3 class="oe_slogan" style="text-align: left;font-size: 16px;width: 90%;margin: 0;margin-top: 14px;color: #000 !important;opacity: 1 !important;line-height: 24px;"> |
|||
The Product Image Suggestion shortlists you with the most relevant product images on Google Images that you are precisely looking for. The Product Image Suggestion can help you get the best possible images via setting the desired limit to search, making the decisions faster and flawless. |
|||
</h3> |
|||
<h3 class="oe_slogan" style="text-align: left;font-size: 28px;font-weight: 600;margin: 0px !important;padding: 2% 0% 0% 0%;"> |
|||
Configuration |
|||
</h3> |
|||
<h3 class="oe_slogan" style="text-align: left;font-size: 16px;width: 90%;margin: 0;margin-top: 14px;color: #000 !important;opacity: 1 !important;line-height: 24px;"> |
|||
Before going to install, make sure "PIL" and "python-resize-image" python packages are installed on your server. After installing the module, go to product form. Search product image from page "Image suggestion". Use image number limit for searching. Resize image if necessary. |
|||
</h3> |
|||
</div> |
|||
</section> |
|||
|
|||
<section class="oe_container" style="background-image:url(https://www.cybrosys.com/images/odoo-index-banner.png); background-repeat:no-repeat; background-size:cover;padding: 10% 0% 15% 15%;"> |
|||
<div class="oe_row oe_spaced"> |
|||
<h2 class="oe_slogan" style="text-align: left;font-size: 28px;font-weight: 600;margin: 0px !important;"> |
|||
Features |
|||
</h2> |
|||
<h3 class="oe_slogan" style="text-align: left;font-size: 16px;width: 90%;margin: 0;margin-top: 14px;color: #000 !important;opacity: 1 !important;line-height: 18px;"> |
|||
<i class="fa fa-check" aria-hidden="true" style="color: #cd2d47;font-size: 15px;"></i> |
|||
A seamless and accurate search of product images from Google |
|||
</h3> |
|||
<h3 class="oe_slogan" style="text-align: left;font-size: 16px;width: 90%;margin: 0;margin-top: 14px;color: #000 !important;opacity: 1 !important;line-height: 18px;"> |
|||
<i class="fa fa-check" aria-hidden="true" style="color: #cd2d47;font-size: 15px;"></i> |
|||
Prioritizing the image suggestions via setting the desired search limit |
|||
</h3> |
|||
<h3 class="oe_slogan" style="text-align: left;font-size: 16px;width: 90%;margin: 0;margin-top: 14px;color: #000 !important;opacity: 1 !important;line-height: 18px;"> |
|||
<i class="fa fa-check" aria-hidden="true" style="color: #cd2d47;font-size: 15px;"></i> |
|||
Easy image editing; Can automatically resize the image to 1024x1204 px |
|||
</h3> |
|||
</div> |
|||
</section> |
|||
|
|||
<section class="oe_container"> |
|||
<div class="oe_row oe_spaced"> |
|||
<h2 class="oe_slogan" style="text-align: left;font-size: 28px;font-weight: 600;margin: 0px !important;"> |
|||
Screenshots |
|||
</h2> |
|||
<h3 class="oe_slogan" style="text-align: left;padding: 5% 0% 0% 0%;font-size: 16px;width: 90%;margin: 0;margin-top: 14px;color: #000 !important;opacity: 1 !important;line-height: 24px;"> |
|||
<div><i class="fa fa-check" aria-hidden="true" style="color: #cd2d47;font-size: 15px;"></i> |
|||
Product Form.</div> |
|||
</h3> |
|||
<div class="oe_row oe_spaced"> |
|||
<img src="product_form.jpg" alt="" style="width: 95%;"/> |
|||
</div> |
|||
</div> |
|||
</section> |
|||
<section class="oe_container" style="padding: 7px 0% 0% 3%;"> |
|||
<div class="oe_row oe_spaced"> |
|||
<a style="color: #080808 !important;" href="https://apps.odoo.com/apps/modules/browse?search=cybrosys" target="_blank"><img src="https://www.cybrosys.com/images/view-more-apps.jpg" alt="cybrosys technologies" style="width: 100%;margin-bottom: 50px;"/></a> |
|||
</div> |
|||
</section> |
|||
|
|||
<section class="oe_container" style="padding: 1% 0% 0% 3%;"> |
|||
<div class="oe_row oe_spaced"> |
|||
<h2 class="oe_slogan" style="text-align: left;font-size: 28px;font-weight: 600;margin: 0px !important;"> |
|||
Our Services |
|||
</h2> |
|||
<div style="display:flex;padding-top: 20px;justify-content: space-between;"> |
|||
<div style="flex-basis: 18%;"> |
|||
|
|||
<div style="width:75px;height:75px;background:#fff; border-radius:100%;margin: auto;"> |
|||
<a href="https://www.cybrosys.com/odoo-customization-and-installation/" target="_blank"> |
|||
<img src="https://www.cybrosys.com/images/odoo-customization.png" style="width: 100%;border-radius: 100%;"/> |
|||
</a> |
|||
</div> |
|||
<h3 class="oe_slogan" style="font-weight: 800;text-align: center;font-size: 14px;width: 100%;margin: 0;margin-top: 14px;color: #000 !important;margin-top: 5px;opacity: 1 !important;line-height: 17px;"> |
|||
<a href="https://www.cybrosys.com/odoo-customization-and-installation/" target="_blank"> |
|||
Odoo Customization |
|||
</a> |
|||
</h3> |
|||
|
|||
</div> |
|||
<div style="flex-basis: 18%;"> |
|||
|
|||
<div style="width:75px;height:75px;background:#fff; border-radius:100%;margin: auto;"> |
|||
<a href="https://www.cybrosys.com/odoo-erp-implementation/" target="_blank"> |
|||
<img src="https://www.cybrosys.com/images/odoo-erp-implementation.png" style="width: 100%;border-radius: 100%;"/> |
|||
</a> |
|||
</div> |
|||
<h3 class="oe_slogan" style="font-weight: 800;text-align: center;font-size: 14px;width: 100%;margin: 0;margin-top: 14px;color: #000 !important;margin-top: 5px;opacity: 1 !important;line-height: 17px;"> |
|||
<a href="https://www.cybrosys.com/odoo-erp-implementation/" target="_blank"> |
|||
Odoo Implementation </a> |
|||
</h3> |
|||
|
|||
</div> |
|||
<div style="flex-basis: 18%;"> |
|||
|
|||
<div style="width:75px;height:75px;background:#fff; border-radius:100%;margin: auto;"> |
|||
<a href="https://www.cybrosys.com/odoo-erp-integration/" target="_blank"> |
|||
<img src="https://www.cybrosys.com/images/odoo-erp-integration.png" style="width: 100%;border-radius: 100%;"/> |
|||
</a> |
|||
</div> |
|||
<h3 class="oe_slogan" style="font-weight: 800;text-align: center;font-size: 14px;width: 100%;margin: 0;margin-top: 14px;color: #000 !important;margin-top: 5px;opacity: 1 !important;line-height: 17px;"> |
|||
<a href="https://www.cybrosys.com/odoo-erp-integration/" target="_blank"> |
|||
Odoo Integration |
|||
</a> |
|||
</h3> |
|||
|
|||
</div> |
|||
<div style="flex-basis: 18%;"> |
|||
|
|||
<div style="width:75px;height:75px;background:#fff; border-radius:100%;margin: auto;"> |
|||
<a href="https://www.cybrosys.com/odoo-erp-support/" target="_blank"> |
|||
<img src="https://www.cybrosys.com/images/odoo-erp-support.png" style="width: 100%;border-radius: 100%;"/> |
|||
</a> |
|||
</div> |
|||
<h3 class="oe_slogan" style="font-weight: 800;text-align: center;font-size: 14px;width: 100%;margin: 0;margin-top: 14px;color: #000 !important;margin-top: 5px;opacity: 1 !important;line-height: 17px;"> |
|||
<a href="https://www.cybrosys.com/odoo-erp-support/" target="_blank"> |
|||
Odoo Support</a> |
|||
</h3> |
|||
|
|||
</div> |
|||
<div style="flex-basis: 18%;"> |
|||
|
|||
<div style="width:75px;height:75px;background:#fff; border-radius:100%;margin: auto;"> |
|||
<a href="https://www.cybrosys.com/hire-odoo-developer/" target="_blank"> |
|||
<img src="https://www.cybrosys.com/images/hire-odoo-developer.png" style="width: 100%;border-radius: 100%;"/> |
|||
</a> |
|||
</div> |
|||
<h3 class="oe_slogan" style="font-weight: 800;text-align: center;font-size: 14px;width: 100%;margin: 0;margin-top: 14px;color: #000 !important;margin-top: 5px;opacity: 1 !important;line-height: 17px;"> |
|||
<a href="https://www.cybrosys.com/hire-odoo-developer/" target="_blank"> |
|||
Hire Odoo Developers</a> |
|||
</h3> |
|||
</a> |
|||
</div> |
|||
</div> |
|||
</div> |
|||
</section> |
|||
<section class="oe_container" style="padding: 1% 0% 0% 3%;"> |
|||
<div class="oe_row oe_spaced"> |
|||
<h2 class="oe_slogan" style="text-align: left;font-size: 28px;font-weight: 600;margin: 0px !important;"> |
|||
Our Industries |
|||
</h2> |
|||
<div style="display:flex;justify-content: space-between;flex-wrap:wrap;"> |
|||
<div style="flex-basis: 32%;padding-top: 20px;"> |
|||
|
|||
<div style="width:30%; float:left;"> |
|||
<div style="width:75px;height:75px;background:#CE2D48; border-radius:100%;float: left;text-align: left;"> |
|||
<a href="https://www.cybrosys.com/odoo/industries/best-trading-erp/" target="_blank"> |
|||
<img src="https://www.cybrosys.com/images/odoo-index-industry-1.png" alt="Odoo Industry" style=" border-radius: 100%;width:100%;"/> |
|||
</a> |
|||
</div> |
|||
</div> |
|||
<div style="width:70%;float:left;"> |
|||
<h3 class="oe_slogan" style=" text-align: left;font-size: 14px;font-weight:800;width: auto;margin: 0;margin-top: 14px;color: #000 !important;margin-top: 5px;opacity: 1 !important;line-height: 17px;float: left;margin-top: 4px;margin-left: 16px;"> |
|||
<a href="https://www.cybrosys.com/odoo/industries/best-trading-erp/" target="_blank"> |
|||
Trading |
|||
</a> |
|||
</h3> |
|||
<h3 class="oe_slogan" style=" text-align: left;font-size: 13px;width: auto;margin: 0;margin-top:5px;color: #000 !important;margin-top: 5px;opacity: 1 !important;line-height: 17px;float: left;margin-top: 5px;margin-left: 16px;"> |
|||
Easily procure and sell your products. |
|||
</h3> |
|||
</div> |
|||
|
|||
</div> |
|||
<div style="flex-basis: 32%;padding-top: 20px;"> |
|||
|
|||
<div style="width:30%; float:left;"> |
|||
<div style="width:75px;height:75px;background:#CE2D48; border-radius:100%;float: left;text-align: left;"> |
|||
<a href="https://www.cybrosys.com/odoo/industries/manufacturing-erp-software/" target="_blank"> |
|||
<img src="https://www.cybrosys.com/images/odoo-index-industry-2.png" alt="Odoo Industry" style=" border-radius: 100%;width:100%;"/> |
|||
</a> |
|||
</div> |
|||
</div> |
|||
<div style="width:70%;float:left;"> |
|||
<h3 class="oe_slogan" style=" text-align: left;font-size: 14px;font-weight:800;width: auto;margin: 0;margin-top: 14px;color: #000 !important;margin-top: 5px;opacity: 1 !important;line-height: 17px;float: left;margin-top: 4px;margin-left: 16px;"> |
|||
<a href="https://www.cybrosys.com/odoo/industries/manufacturing-erp-software/" target="_blank"> |
|||
Manufacturing</a> |
|||
</h3> |
|||
<h3 class="oe_slogan" style=" text-align: left;font-size: 13px;width: auto;margin: 0;margin-top:5px;color: #000 !important;margin-top: 5px;opacity: 1 !important;line-height: 17px;float: left;margin-top: 5px;margin-left: 16px;"> |
|||
Plan, track and schedule your operations. |
|||
</h3> |
|||
</div> |
|||
|
|||
</div> |
|||
<div style="flex-basis: 32%;padding-top: 20px;"> |
|||
|
|||
<div style="width:30%; float:left;"> |
|||
<div style="width:75px;height:75px;background:#CE2D48; border-radius:100%;float: left;text-align: left;"> |
|||
<a href="https://www.cybrosys.com/odoo/industries/restaurant-management/" target="_blank"> |
|||
<img src="https://www.cybrosys.com/images/odoo-index-industry-3.png" alt="Odoo Industry" style=" border-radius: 100%;width:100%;"/> |
|||
</a> |
|||
</div> |
|||
</div> |
|||
<div style="width:70%;float:left;"> |
|||
<h3 class="oe_slogan" style=" text-align: left;font-size: 14px;font-weight:800;width: auto;margin: 0;margin-top: 14px;color: #000 !important;margin-top: 5px;opacity: 1 !important;line-height: 17px;float: left;margin-top: 4px;margin-left: 16px;"> |
|||
<a href="https://www.cybrosys.com/odoo/industries/restaurant-management/" target="_blank"> |
|||
Restaurant</a> |
|||
</h3> |
|||
<h3 class="oe_slogan" style=" text-align: left;font-size: 13px;width: auto;margin: 0;margin-top:5px;color: #000 !important;margin-top: 5px;opacity: 1 !important;line-height: 17px;float: left;margin-top: 5px;margin-left: 16px;"> |
|||
Run your bar or restaurant methodical. |
|||
</h3> |
|||
</div> |
|||
|
|||
</div> |
|||
<div style="flex-basis: 32%;padding-top: 20px;"> |
|||
|
|||
<div style="width:30%; float:left;"> |
|||
<div style="width:75px;height:75px;background:#CE2D48; border-radius:100%;float: left;text-align: left;"> |
|||
<a href="https://www.cybrosys.com/odoo/industries/pos/" target="_blank"> |
|||
<img src="https://www.cybrosys.com/images/odoo-index-industry-4.png" alt="Odoo Industry" style=" border-radius: 100%;width:100%;"/> |
|||
</a> |
|||
</div> |
|||
</div> |
|||
<div style="width:70%;float:left;"> |
|||
<h3 class="oe_slogan" style=" text-align: left;font-size: 14px;font-weight:800;width: auto;margin: 0;margin-top: 14px;color: #000 !important;margin-top: 5px;opacity: 1 !important;line-height: 17px;float: left;margin-top: 4px;margin-left: 16px;"> |
|||
<a href="https://www.cybrosys.com/odoo/industries/pos/" target="_blank"> |
|||
POS</a> |
|||
</h3> |
|||
<h3 class="oe_slogan" style=" text-align: left;font-size: 13px;width: auto;margin: 0;margin-top:5px;color: #000 !important;margin-top: 5px;opacity: 1 !important;line-height: 17px;float: left;margin-top: 5px;margin-left: 16px;"> |
|||
Easy configuring and convivial selling. |
|||
</h3> |
|||
</div> |
|||
|
|||
</div> |
|||
<div style="flex-basis: 32%;padding-top: 20px;"> |
|||
|
|||
<div style="width:30%; float:left;"> |
|||
<div style="width:75px;height:75px;background:#CE2D48; border-radius:100%;float: left;text-align: left;"> |
|||
<a href="https://www.cybrosys.com/odoo/industries/ecommerce-website/" target="_blank"> |
|||
<img src="https://www.cybrosys.com/images/odoo-index-industry-5.png" alt="Odoo Industry" style=" border-radius: 100%;width:100%;"/> |
|||
</a> |
|||
</div> |
|||
</div> |
|||
<div style="width:70%;float:left;"> |
|||
<h3 class="oe_slogan" style=" text-align: left;font-size: 14px;font-weight:800;width: auto;margin: 0;margin-top: 14px;color: #000 !important;margin-top: 5px;opacity: 1 !important;line-height: 17px;float: left;margin-top: 0px;margin-left: 16px;"> |
|||
<a href="https://www.cybrosys.com/odoo/industries/ecommerce-website/" target="_blank"> |
|||
E-commerce & Website</a> |
|||
</h3> |
|||
<h3 class="oe_slogan" style=" text-align: left;font-size: 13px;width: auto;margin: 0;margin-top:5px;color: #000 !important;margin-top: 5px;opacity: 1 !important;line-height: 17px;float: left;margin-top: 5px;margin-left: 16px;"> |
|||
Mobile friendly, awe-inspiring product pages. |
|||
</h3> |
|||
</div> |
|||
</div> |
|||
<div style="flex-basis: 32%;padding-top: 20px;"> |
|||
|
|||
<div style="width:30%; float:left;"> |
|||
<div style="width:75px;height:75px;background:#CE2D48; border-radius:100%;float: left;text-align: left;"> |
|||
<a href="https://www.cybrosys.com/odoo/industries/hotel-management-erp/" target="_blank"> |
|||
<img src="https://www.cybrosys.com/images/odoo-index-industry-6.png" alt="Odoo Industry" style=" border-radius: 100%;width:100%;"/> |
|||
</a> |
|||
</div> |
|||
</div> |
|||
<div style="width:70%;float:left;"> |
|||
<h3 class="oe_slogan" style=" text-align: left;font-size: 14px;font-weight:800;width: auto;margin: 0;margin-top: 14px;color: #000 !important;margin-top: 5px;opacity: 1 !important;line-height: 17px;float: left;margin-top: 4px;margin-left: 16px;"> |
|||
<a href="https://www.cybrosys.com/odoo/industries/hotel-management-erp/" target="_blank"> |
|||
Hotel Management</a> |
|||
</h3> |
|||
<h3 class="oe_slogan" style=" text-align: left;font-size: 13px;width: auto;margin: 0;margin-top:5px;color: #000 !important;margin-top: 5px;opacity: 1 !important;line-height: 17px;float: left;margin-top: 5px;margin-left: 16px;"> |
|||
An all-inclusive hotel management application. |
|||
</h3> |
|||
</div> |
|||
</div> |
|||
<div style="flex-basis: 32%;padding-top: 20px;"> |
|||
|
|||
<div style="width:30%; float:left;"> |
|||
<div style="width:75px;height:75px;background:#CE2D48; border-radius:100%;float: left;text-align: left;"> |
|||
<a href="https://www.cybrosys.com/odoo/industries/education-erp-software/" target="_blank"> |
|||
<img src="https://www.cybrosys.com/images/odoo-index-industry-7.png" alt="Odoo Industry" style=" border-radius: 100%;width:100%;"/> |
|||
</a> |
|||
</div> |
|||
</div> |
|||
<div style="width:70%;float:left;"> |
|||
<h3 class="oe_slogan" style=" text-align: left;font-size: 14px;font-weight:800;width: auto;margin: 0;margin-top: 14px;color: #000 !important;margin-top: 5px;opacity: 1 !important;line-height: 17px;float: left;margin-top: 4px;margin-left: 16px;"> |
|||
<a href="https://www.cybrosys.com/odoo/industries/education-erp-software/" target="_blank"> |
|||
Education</a> |
|||
</h3> |
|||
<h3 class="oe_slogan" style=" text-align: left;font-size: 13px;width: auto;margin: 0;margin-top:5px;color: #000 !important;margin-top: 5px;opacity: 1 !important;line-height: 17px;float: left;margin-top: 5px;margin-left: 16px;"> |
|||
A Collaborative platform for educational management. |
|||
</h3> |
|||
</div> |
|||
</div> |
|||
<div style="flex-basis: 32%;padding-top: 20px;"> |
|||
|
|||
<div style="width:30%; float:left;"> |
|||
<div style="width:75px;height:75px;background:#CE2D48; border-radius:100%;float: left;text-align: left;"> |
|||
<a href="https://www.cybrosys.com/odoo/industries/service-management/" target="_blank"> |
|||
<img src="https://www.cybrosys.com/images/odoo-index-industry-8.png" alt="Odoo Industry" style=" border-radius: 100%;width:100%;"/> |
|||
</a> |
|||
</div> |
|||
</div> |
|||
<div style="width:70%;float:left;"> |
|||
<h3 class="oe_slogan" style=" text-align: left;font-size: 14px;font-weight:800;width: auto;margin: 0;margin-top: 14px;color: #000 !important;margin-top: 5px;opacity: 1 !important;line-height: 17px;float: left;margin-top: 4px;margin-left: 16px;"> |
|||
<a href="https://www.cybrosys.com/odoo/industries/service-management/" target="_blank"> |
|||
Service Management</a> |
|||
</h3> |
|||
<h3 class="oe_slogan" style=" text-align: left;font-size: 13px;width: auto;margin: 0;margin-top:5px;color: #000 !important;margin-top: 5px;opacity: 1 !important;line-height: 17px;float: left;margin-top: 5px;margin-left: 16px;"> |
|||
Keep track of services and invoice accordingly. |
|||
</h3> |
|||
</div> |
|||
</div> |
|||
</div> |
|||
</div> |
|||
</section> |
|||
<section class="oe_container" style="background-image:url(https://www.cybrosys.com/images/odoo-index-footer-bg.png); background-repeat:no-repeat; background-size:100%;padding: 13% 0% 6% 0%;"> |
|||
<div class="oe_slogan" style="margin-top:10px !important;margin-bottom: 0px;"> |
|||
<div> |
|||
<a style="color: #5c5c5c !important;border-radius: 0;background: none;border: none;background: #fff;box-shadow: 0 10px 40px 0 rgba(62,57,107,0.07), 0 2px 9px 0 rgba(62, 57, 107, 0.05);border-radius: 30px;font-size: 12px;padding: 9px 26px;margin-right: 9px;width: 200px;text-transform: capitalize;" class="btn btn-primary btn-lg mt8" style="color: #FFFFFF !important;border-radius: 0;" href="mailto:odoo@cybrosys.com"><i class="fa fa-envelope"></i> Email us </a> |
|||
<a style="color: #5c5c5c !important;border-radius: 0;background: none;border: none;background: #fff;box-shadow: 0 10px 40px 0 rgba(62,57,107,0.07), 0 2px 9px 0 rgba(62, 57, 107, 0.05);border-radius: 30px;font-size: 12px;padding: 9px 26px;margin-right: 9px;width: 200px;text-transform: capitalize;" class="btn btn-primary btn-lg mt8" style="color: #FFFFFF !important;border-radius: 0;" href="https://www.cybrosys.com/contact/"><i class="fa fa-phone"></i> Contact Us </a> |
|||
<a style="color: #5c5c5c !important;border-radius: 0;background: none;border: none;background: #fff;box-shadow: 0 10px 40px 0 rgba(62,57,107,0.07), 0 2px 9px 0 rgba(62, 57, 107, 0.05);border-radius: 30px;font-size: 12px;padding: 9px 26px;margin-right: 9px;width: 200px;text-transform: capitalize;" class="btn btn-primary btn-lg mt8" style="color: #FFFFFF !important;border-radius: 0;" href="https://www.cybrosys.com/contact/"><i class="fa fa-check-square"></i> Request Customization </a> |
|||
</div> |
|||
<br> |
|||
<img src="https://www.cybrosys.com/images/logo.png" style="width: 190px; margin-bottom: 25px;margin-top: 30px;" class="center-block"> |
|||
<div> |
|||
<a href="https://twitter.com/cybrosys" target="_blank"><i class="fa fa-2x fa-twitter" style="color:white;background: #00a0d1;width:35px;height: 35px;padding-top: 7px;font-size: 21px;margin-right: 6px;border-radius: 100%;"></i></a></td> |
|||
<a href="https://www.linkedin.com/company/cybrosys-technologies-pvt-ltd" target="_blank"><i class="fa fa-2x fa-linkedin" style="color:white;background: #31a3d6;width:35px;padding-left: 3px;height: 35px;padding-top: 7px;font-size: 21px;margin-right: 6px;border-radius: 100%;"></i></a></td> |
|||
<a href="https://www.facebook.com/cybrosystechnologies" target="_blank"><i class="fa fa-2x fa-facebook" style="color:white;background: #3b5998;width:35px; ;height: 35px;padding-top: 7px;font-size: 21px;margin-right: 6px;border-radius: 100%;"></i></a></td> |
|||
<a href="https://plus.google.com/106641282743045431892/about" target="_blank"><i class="fa fa-2x fa-google-plus" style="color:white;background: #c53c2c;width:35px;padding-left: 3px;height: 35px;padding-top: 7px;font-size: 21px;margin-right: 6px;border-radius: 100%;"></i></a></td> |
|||
<a href="https://in.pinterest.com/cybrosys" target="_blank"><i class="fa fa-2x fa-pinterest" style="color:white;background: #ac0f18;width:35px;padding-left: 3px;height: 35px;padding-top: 7px;font-size: 21px;margin-right: 6px;border-radius: 100%;"></i></a></td> |
|||
</div> |
|||
</div> |
|||
</section> |
After Width: | Height: | Size: 94 KiB |
@ -0,0 +1,50 @@ |
|||
<?xml version="1.0" encoding="utf-8"?> |
|||
<odoo> |
|||
<data> |
|||
<record model="ir.ui.view" id="product_template_image_suggestion_form_view"> |
|||
<field name="name">product.template.product.website.form</field> |
|||
<field name="model">product.template</field> |
|||
<field name="inherit_id" ref="product.product_template_form_view"/> |
|||
<field name="arch" type="xml"> |
|||
<xpath expr="//notebook[last()]" position="inside"> |
|||
<page string="Image Suggestion"> |
|||
<group> |
|||
<group> |
|||
<group> |
|||
<field name="image_limit"/> |
|||
<field name="resize_image"/> |
|||
</group> |
|||
</group> |
|||
<group> |
|||
<field name="search_field" placeholder="Search Here.." nolabel="1"/> |
|||
<button class="oe_stat_button" name="search_images_button" |
|||
type="object" icon="fa-search"> |
|||
</button> |
|||
</group> |
|||
</group> |
|||
|
|||
<field name="search_image_ids" mode="kanban" context="{'default_name': name, 'default_product_tmpl_id': active_id}"> |
|||
<kanban string="Suggested Images"> |
|||
<field name="image" /> |
|||
<templates> |
|||
<t t-name="kanban-box"> |
|||
<div class="oe_kanban_global_click"> |
|||
<a t-if="!read_only_mode" type="delete" class="fa fa-times pull-right"/> |
|||
<div class="o_kanban_image"> |
|||
<img t-if="record.image.raw_value" t-att-src="'data:image/png;base64,'+record.image.raw_value"/> |
|||
</div> |
|||
<button name="action_set_image" |
|||
class="btn btn-primary oe_stat_button pull-right" string="Set Image" icon="Set Image" style="height:15px;width:25px" |
|||
type="object"/> |
|||
|
|||
</div> |
|||
</t> |
|||
</templates> |
|||
</kanban> |
|||
</field> |
|||
</page> |
|||
</xpath> |
|||
</field> |
|||
</record> |
|||
</data> |
|||
</odoo> |