@ -1,46 +0,0 @@ |
|||||
.. image:: https://img.shields.io/badge/licence-AGPL--3-blue.svg |
|
||||
:target: https://www.gnu.org/licenses/agpl-3.0-standalone.html |
|
||||
:alt: License: AGPL-3 |
|
||||
|
|
||||
Product Data Feed Generation |
|
||||
============================ |
|
||||
Generating a Product Catalog Feeds Sharing Link |
|
||||
|
|
||||
Configuration |
|
||||
============= |
|
||||
* No additional configurations needed |
|
||||
|
|
||||
License |
|
||||
------- |
|
||||
Affero General Public License v3.0 (AGPL v3) |
|
||||
(https://www.gnu.org/licenses/agpl-3.0-standalone.html) |
|
||||
|
|
||||
Company |
|
||||
------- |
|
||||
* `Cybrosys Techno Solutions <https://cybrosys.com/>`__ |
|
||||
|
|
||||
Credits |
|
||||
------- |
|
||||
* Developer: (V16) Junaidul Ansar M, Contact : odoo@cybrosys.com |
|
||||
|
|
||||
Contacts |
|
||||
-------- |
|
||||
* Mail Contact : odoo@cybrosys.com |
|
||||
* Website : https://cybrosys.com |
|
||||
|
|
||||
Bug Tracker |
|
||||
----------- |
|
||||
Bugs are tracked on GitHub Issues. In case of trouble, please check there if your issue has already been reported. |
|
||||
|
|
||||
Maintainer |
|
||||
========== |
|
||||
.. image:: https://cybrosys.com/images/logo.png |
|
||||
:target: https://cybrosys.com |
|
||||
|
|
||||
This module is maintained by Cybrosys Technologies. |
|
||||
|
|
||||
For support and more information, please visit `Our Website <https://cybrosys.com/>`__ |
|
||||
|
|
||||
Further information |
|
||||
=================== |
|
||||
HTML Description: `<static/description/index.html>`__ |
|
@ -1,22 +0,0 @@ |
|||||
# -*- coding: utf-8 -*- |
|
||||
############################################################################### |
|
||||
# |
|
||||
# Cybrosys Technologies Pvt. Ltd. |
|
||||
# |
|
||||
# Copyright (C) 2024-TODAY Cybrosys Technologies(<https://www.cybrosys.com>) |
|
||||
# Author: Junaidul Ansar M (odoo@cybrosys.com) |
|
||||
# |
|
||||
# You can modify it under the terms of the GNU AFFERO |
|
||||
# GENERAL PUBLIC LICENSE (AGPL v3), Version 3. |
|
||||
# |
|
||||
# This program is distributed in the hope that it will be useful, |
|
||||
# but WITHOUT ANY WARRANTY; without even the implied warranty of |
|
||||
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the |
|
||||
# GNU AFFERO GENERAL PUBLIC LICENSE (AGPL v3) for more details. |
|
||||
# |
|
||||
# You should have received a copy of the GNU AFFERO GENERAL PUBLIC LICENSE |
|
||||
# (AGPL v3) along with this program. |
|
||||
# If not, see <http://www.gnu.org/licenses/>. |
|
||||
# |
|
||||
############################################################################### |
|
||||
from . import controllers, models |
|
@ -1,54 +0,0 @@ |
|||||
# -*- coding: utf-8 -*- |
|
||||
############################################################################### |
|
||||
# |
|
||||
# Cybrosys Technologies Pvt. Ltd. |
|
||||
# |
|
||||
# Copyright (C) 2024-TODAY Cybrosys Technologies(<https://www.cybrosys.com>) |
|
||||
# Author: Junaidul Ansar M (odoo@cybrosys.com) |
|
||||
# |
|
||||
# You can modify it under the terms of the GNU AFFERO |
|
||||
# GENERAL PUBLIC LICENSE (AGPL v3), Version 3. |
|
||||
# |
|
||||
# This program is distributed in the hope that it will be useful, |
|
||||
# but WITHOUT ANY WARRANTY; without even the implied warranty of |
|
||||
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the |
|
||||
# GNU AFFERO GENERAL PUBLIC LICENSE (AGPL v3) for more details. |
|
||||
# |
|
||||
# You should have received a copy of the GNU AFFERO GENERAL PUBLIC LICENSE |
|
||||
# (AGPL v3) along with this program. |
|
||||
# If not, see <http://www.gnu.org/licenses/>. |
|
||||
# |
|
||||
############################################################################### |
|
||||
{ |
|
||||
'name': 'Product Data Feed Generation', |
|
||||
'version': '16.0.1.0.0', |
|
||||
'category': 'eCommerce', |
|
||||
'summary': 'Help to create the catalog for promoting your sale', |
|
||||
'description': 'Using this module we have to promote and market our sales' |
|
||||
' through facebook and instagram for using the catalog of ' |
|
||||
'our product. Many of the businesses sell or advertise ' |
|
||||
'their product through facebook and instagram. So they' |
|
||||
' need a catalog that contains the information about your ' |
|
||||
'products. In this module generate the product data feed ' |
|
||||
'file for the facebook commerce manager in automatic ' |
|
||||
'mode(by URL). After adding the data feed URL on facebook ' |
|
||||
'you will be able to promote your product in sale channels ,' |
|
||||
' on facebook shops, instagram shopping, with dynamic ads,' |
|
||||
' and more.', |
|
||||
'author': 'Cybrosys Techno Solutions', |
|
||||
'company': 'Cybrosys Techno Solutions', |
|
||||
'maintainer': 'Cybrosys Techno Solutions', |
|
||||
'website': 'https://www.cybrosys.com', |
|
||||
'depends': ['website_sale', 'product', 'mail', 'stock'], |
|
||||
'data': [ |
|
||||
'security/ir.model.access.csv', |
|
||||
'views/product_data_feed_views.xml', |
|
||||
'views/product_data_feed_columns_views.xml', |
|
||||
'views/field_column_value_views.xml', |
|
||||
], |
|
||||
'images': ['static/description/banner.png'], |
|
||||
'license': 'AGPL-3', |
|
||||
'installable': True, |
|
||||
'application': False, |
|
||||
'auto_install': False |
|
||||
} |
|
@ -1,22 +0,0 @@ |
|||||
# -*- coding: utf-8 -*- |
|
||||
############################################################################### |
|
||||
# |
|
||||
# Cybrosys Technologies Pvt. Ltd. |
|
||||
# |
|
||||
# Copyright (C) 2024-TODAY Cybrosys Technologies(<https://www.cybrosys.com>) |
|
||||
# Author: Junaidul Ansar M (odoo@cybrosys.com) |
|
||||
# |
|
||||
# You can modify it under the terms of the GNU AFFERO |
|
||||
# GENERAL PUBLIC LICENSE (AGPL v3), Version 3. |
|
||||
# |
|
||||
# This program is distributed in the hope that it will be useful, |
|
||||
# but WITHOUT ANY WARRANTY; without even the implied warranty of |
|
||||
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the |
|
||||
# GNU AFFERO GENERAL PUBLIC LICENSE (AGPL v3) for more details. |
|
||||
# |
|
||||
# You should have received a copy of the GNU AFFERO GENERAL PUBLIC LICENSE |
|
||||
# (AGPL v3) along with this program. |
|
||||
# If not, see <http://www.gnu.org/licenses/>. |
|
||||
# |
|
||||
############################################################################### |
|
||||
from . import odoo_fb_insta_product_data_feed |
|
@ -1,95 +0,0 @@ |
|||||
# -*- coding: utf-8 -*- |
|
||||
############################################################################### |
|
||||
# |
|
||||
# Cybrosys Technologies Pvt. Ltd. |
|
||||
# |
|
||||
# Copyright (C) 2024-TODAY Cybrosys Technologies(<https://www.cybrosys.com>) |
|
||||
# Author: Junaidul Ansar M (odoo@cybrosys.com) |
|
||||
# |
|
||||
# You can modify it under the terms of the GNU AFFERO |
|
||||
# GENERAL PUBLIC LICENSE (AGPL v3), Version 3. |
|
||||
# |
|
||||
# This program is distributed in the hope that it will be useful, |
|
||||
# but WITHOUT ANY WARRANTY; without even the implied warranty of |
|
||||
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the |
|
||||
# GNU AFFERO GENERAL PUBLIC LICENSE (AGPL v3) for more details. |
|
||||
# |
|
||||
# You should have received a copy of the GNU AFFERO GENERAL PUBLIC LICENSE |
|
||||
# (AGPL v3) along with this program. |
|
||||
# If not, see <http://www.gnu.org/licenses/>. |
|
||||
# |
|
||||
############################################################################### |
|
||||
import csv |
|
||||
from six import StringIO |
|
||||
from odoo import http |
|
||||
from odoo.http import request |
|
||||
|
|
||||
|
|
||||
class ProductData(http.Controller): |
|
||||
"""This controller handle for downloading the catalog csv file""" |
|
||||
def generate_formatted_file_content(self, columns, item_filter, record): |
|
||||
"""Generating the file content""" |
|
||||
# Apply the filter criteria and fetch the relevant items |
|
||||
filtered_items = request.env[record.used_model].search(item_filter) |
|
||||
formatted_rows = [] |
|
||||
# Iterate over each item and generate a row of values |
|
||||
for item in filtered_items: |
|
||||
row = [] |
|
||||
for column in columns: |
|
||||
if column.type == 'Model Field': |
|
||||
# Access the field value directly |
|
||||
value = getattr(item, column.value_id.name, '') |
|
||||
elif column.type == 'Special': |
|
||||
if column.special_type == 'product_availability': |
|
||||
# Access the product's on-hand quantity |
|
||||
on_hand_qty = item.qty_available |
|
||||
# Set value based on on-hand quantity |
|
||||
if on_hand_qty == 0: |
|
||||
value = 'out of stock' |
|
||||
else: |
|
||||
value = 'in stock' |
|
||||
elif column.special_type == 'qty': |
|
||||
value = item.qty_available |
|
||||
elif column.special_type == 'product_price': |
|
||||
value = item.standard_price |
|
||||
elif column.special_type == 'disc_price': |
|
||||
value = item.list_price |
|
||||
elif column.special_type == 'price_without_tax': |
|
||||
value = item.list_price |
|
||||
elif column.special_type == 'price_currency': |
|
||||
value = self.currency_id.name |
|
||||
elif column.type == 'Text': |
|
||||
value = column.value |
|
||||
elif column.type == 'Value': |
|
||||
value = column.field_value_id.column_name |
|
||||
else: |
|
||||
value = column.value |
|
||||
row.append(value) |
|
||||
formatted_rows.append(row) |
|
||||
return formatted_rows |
|
||||
|
|
||||
@http.route(['/product_data/<int:id>/<name>', |
|
||||
'/product_data/<name>' |
|
||||
], type="http", |
|
||||
auth='public') |
|
||||
def product_data(self, id, name): |
|
||||
"""Making the product data into a CSV formate.""" |
|
||||
record = request.env['product.data.feed'].sudo().browse(id) |
|
||||
column_ids = record.feed_columns_line_ids |
|
||||
item_filter = eval(record.item_filter) if record.item_filter else [] |
|
||||
formatted_file_content = self.generate_formatted_file_content( |
|
||||
column_ids, item_filter, record) |
|
||||
csv_content = StringIO() |
|
||||
csv_writer = csv.writer(csv_content) |
|
||||
column_header = [column.name for column in column_ids] |
|
||||
csv_writer.writerow(column_header) |
|
||||
for row in formatted_file_content: |
|
||||
csv_writer.writerow(row) |
|
||||
# Get CSV content as a string |
|
||||
csv_string = csv_content.getvalue() |
|
||||
csv_content.close() |
|
||||
headers = [ |
|
||||
('Content-Type', 'text/csv'), |
|
||||
('Content-Disposition', http.content_disposition(name + '.csv')), |
|
||||
] |
|
||||
return request.make_response(csv_string, headers=headers) |
|
@ -1,6 +0,0 @@ |
|||||
## Module <odoo_fb_insta_product_data_feed> |
|
||||
|
|
||||
#### 22.03.2024 |
|
||||
#### Version 16.0.1.0.0 |
|
||||
#### ADD |
|
||||
- Initial Commit for Product Data Feed Generation |
|
@ -1,24 +0,0 @@ |
|||||
# -*- coding: utf-8 -*- |
|
||||
############################################################################### |
|
||||
# |
|
||||
# Cybrosys Technologies Pvt. Ltd. |
|
||||
# |
|
||||
# Copyright (C) 2024-TODAY Cybrosys Technologies(<https://www.cybrosys.com>) |
|
||||
# Author: Junaidul Ansar M (odoo@cybrosys.com) |
|
||||
# |
|
||||
# You can modify it under the terms of the GNU AFFERO |
|
||||
# GENERAL PUBLIC LICENSE (AGPL v3), Version 3. |
|
||||
# |
|
||||
# This program is distributed in the hope that it will be useful, |
|
||||
# but WITHOUT ANY WARRANTY; without even the implied warranty of |
|
||||
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the |
|
||||
# GNU AFFERO GENERAL PUBLIC LICENSE (AGPL v3) for more details. |
|
||||
# |
|
||||
# You should have received a copy of the GNU AFFERO GENERAL PUBLIC LICENSE |
|
||||
# (AGPL v3) along with this program. |
|
||||
# If not, see <http://www.gnu.org/licenses/>. |
|
||||
# |
|
||||
############################################################################### |
|
||||
from . import field_column_value |
|
||||
from . import product_data_feed |
|
||||
from . import product_data_feed_columns |
|
@ -1,40 +0,0 @@ |
|||||
# -*- coding: utf-8 -*- |
|
||||
############################################################################### |
|
||||
# |
|
||||
# Cybrosys Technologies Pvt. Ltd. |
|
||||
# |
|
||||
# Copyright (C) 2024-TODAY Cybrosys Technologies(<https://www.cybrosys.com>) |
|
||||
# Author: Junaidul Ansar M (odoo@cybrosys.com) |
|
||||
# |
|
||||
# You can modify it under the terms of the GNU AFFERO |
|
||||
# GENERAL PUBLIC LICENSE (AGPL v3), Version 3. |
|
||||
# |
|
||||
# This program is distributed in the hope that it will be useful, |
|
||||
# but WITHOUT ANY WARRANTY; without even the implied warranty of |
|
||||
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the |
|
||||
# GNU AFFERO GENERAL PUBLIC LICENSE (AGPL v3) for more details. |
|
||||
# |
|
||||
# You should have received a copy of the GNU AFFERO GENERAL PUBLIC LICENSE |
|
||||
# (AGPL v3) along with this program. |
|
||||
# If not, see <http://www.gnu.org/licenses/>. |
|
||||
# |
|
||||
############################################################################### |
|
||||
from odoo import fields, models |
|
||||
|
|
||||
|
|
||||
class FieldColumnValue(models.Model): |
|
||||
"""Model for storing field column values. |
|
||||
|
|
||||
This class represents field column values used in a product data feed. |
|
||||
It is used to define the mapping of column names to their corresponding |
|
||||
values. |
|
||||
""" |
|
||||
_name = 'field.column.value' |
|
||||
_description = 'Field Column Value' |
|
||||
_rec_name = 'value' |
|
||||
|
|
||||
feed_id = fields.Many2one('product.data.feed', |
|
||||
string='Feed Name', help='Feed Name') |
|
||||
column_name = fields.Char(string='Column Name', |
|
||||
help='Enter the column name.') |
|
||||
value = fields.Char(string='Value', help='Value of the column name.') |
|
@ -1,242 +0,0 @@ |
|||||
# -*- coding: utf-8 -*- |
|
||||
############################################################################### |
|
||||
# |
|
||||
# Cybrosys Technologies Pvt. Ltd. |
|
||||
# |
|
||||
# Copyright (C) 2024-TODAY Cybrosys Technologies(<https://www.cybrosys.com>) |
|
||||
# Author: Junaidul Ansar M (odoo@cybrosys.com) |
|
||||
# |
|
||||
# You can modify it under the terms of the GNU AFFERO |
|
||||
# GENERAL PUBLIC LICENSE (AGPL v3), Version 3. |
|
||||
# |
|
||||
# This program is distributed in the hope that it will be useful, |
|
||||
# but WITHOUT ANY WARRANTY; without even the implied warranty of |
|
||||
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the |
|
||||
# GNU AFFERO GENERAL PUBLIC LICENSE (AGPL v3) for more details. |
|
||||
# |
|
||||
# You should have received a copy of the GNU AFFERO GENERAL PUBLIC LICENSE |
|
||||
# (AGPL v3) along with this program. |
|
||||
# If not, see <http://www.gnu.org/licenses/>. |
|
||||
# |
|
||||
############################################################################### |
|
||||
import base64 |
|
||||
import secrets |
|
||||
import string |
|
||||
import csv |
|
||||
from io import StringIO |
|
||||
from odoo import api, fields, models |
|
||||
|
|
||||
|
|
||||
class ProductDataFeed(models.Model): |
|
||||
"""Data feed model for managing and generating product data feeds. |
|
||||
This class represents a product data feed, which can be used to export |
|
||||
product information in a specific format. It inherits from 'mail.thread' |
|
||||
and 'mail.activity.mixin' to provide messaging and activity tracking |
|
||||
capabilities.""" |
|
||||
_name = 'product.data.feed' |
|
||||
_description = 'Product Data Feed' |
|
||||
_inherit = ['mail.thread', 'mail.activity.mixin'] |
|
||||
|
|
||||
name = fields.Char(string='Name', help='Name of the feed', copy=False, |
|
||||
required=True) |
|
||||
url_link = fields.Char(string='Link', help='Data feed download link', |
|
||||
compute='_compute_url_link' |
|
||||
) |
|
||||
is_token = fields.Boolean(string='Use Token', |
|
||||
help='Use token or Not for the ' |
|
||||
'security') |
|
||||
access_token = fields.Char(string='Access Token', |
|
||||
help='Access Token of the feed', |
|
||||
compute='_compute_access_token') |
|
||||
website_id = fields.Many2one('website', string='Websites', |
|
||||
help='Allow this data feed for the selected ' |
|
||||
'websites.Allow for all if not set ') |
|
||||
format = fields.Char(string='File Formate', |
|
||||
help='The file formate of the data feed.', |
|
||||
default='CSV', readonly=True) |
|
||||
is_file_name = fields.Boolean(string='File Name', |
|
||||
help='Enabled the file name', |
|
||||
) |
|
||||
name_show = fields.Char(string='File Name', help='Show the file name') |
|
||||
use_model = fields.Selection( |
|
||||
[('Product', 'Product'), ('Product Variant', 'Product Variant')], |
|
||||
string='Use Model', help='Used model of the product feed', |
|
||||
default='Product', required=True) |
|
||||
used_model = fields.Char(string='Used Model', help='Model') |
|
||||
item_filter = fields.Char(string='Item Filter', help='The model domain to' |
|
||||
' filter for the feed') |
|
||||
feed_columns_line_ids = fields.One2many('product.data.feed.columns', |
|
||||
'data_feed_columns_id', |
|
||||
string='Columns', |
|
||||
help='Feed column line', |
|
||||
readonly=True, |
|
||||
) |
|
||||
columns_count = fields.Integer(string='Columns Count', |
|
||||
help='Total number of columns used this ' |
|
||||
'feed', |
|
||||
compute='_compute_columns_count') |
|
||||
|
|
||||
def generate_formatted_file_content(self, columns, item_filter): |
|
||||
"""Generate formatted content for a file based on specified columns |
|
||||
and an item filter.This method applies the provided filter criteria to |
|
||||
fetch relevant items from the environment, and then generates formatted |
|
||||
rows of values for the specified columns for each item.""" |
|
||||
# Apply the filter criteria and fetch the relevant items |
|
||||
filtered_items = self.env[self.used_model].search(item_filter) |
|
||||
formatted_rows = [] |
|
||||
# Iterate over each item and generate a row of values |
|
||||
for item in filtered_items: |
|
||||
row = [] |
|
||||
for column in columns: |
|
||||
if column.type == 'Model Field': |
|
||||
# Access the field value directly |
|
||||
value = getattr(item, column.value_id.name, '') |
|
||||
elif column.type == 'Special': |
|
||||
if column.special_type == 'product_availability': |
|
||||
# Access the product's on-hand quantity |
|
||||
on_hand_qty = item.qty_available |
|
||||
# Set value based on on-hand quantity |
|
||||
if on_hand_qty == 0: |
|
||||
value = 'out of stock' |
|
||||
else: |
|
||||
value = 'in stock' |
|
||||
elif column.special_type == 'qty': |
|
||||
value = item.qty_available |
|
||||
elif column.special_type == 'product_price': |
|
||||
value = item.standard_price |
|
||||
elif column.special_type == 'disc_price': |
|
||||
value = item.list_price |
|
||||
elif column.special_type == 'price_without_tax': |
|
||||
value = item.list_price |
|
||||
elif column.special_type == 'price_currency': |
|
||||
value = self.currency_id.name |
|
||||
elif column.special_type == 'image_link': |
|
||||
value = item.image_1920 |
|
||||
elif column.special_type == 'price_tax': |
|
||||
if item.taxes_id: |
|
||||
value = (item.list_price * ( |
|
||||
item.taxes_id.amount / 100) + |
|
||||
item.list_price) |
|
||||
else: |
|
||||
value = 0.0 |
|
||||
elif column.type == 'Text': |
|
||||
value = column.value |
|
||||
elif column.type == 'Value': |
|
||||
value = column.field_value_id.column_name |
|
||||
else: |
|
||||
value = column.value |
|
||||
row.append(value) |
|
||||
formatted_rows.append(row) |
|
||||
return formatted_rows |
|
||||
|
|
||||
def action_download_doc(self): |
|
||||
"""Download the catalog""" |
|
||||
columns = self.feed_columns_line_ids |
|
||||
item_filter = eval(self.item_filter) if self.item_filter else [] |
|
||||
formatted_file_content = self.generate_formatted_file_content( |
|
||||
columns, item_filter) |
|
||||
# Create a CSV content string |
|
||||
csv_content = StringIO() |
|
||||
csv_writer = csv.writer(csv_content) |
|
||||
column_header = [column.name for column in columns] |
|
||||
csv_writer.writerow(column_header) |
|
||||
for row in formatted_file_content: |
|
||||
csv_writer.writerow(row) |
|
||||
encoded_content = csv_content.getvalue().encode('utf-8') |
|
||||
# Close the StringIO buffer |
|
||||
csv_content.close() |
|
||||
attachment = self.env['ir.attachment'].create({ |
|
||||
'name': self.name_show if self.name_show else 'feed', |
|
||||
'type': 'binary', |
|
||||
'datas': base64.b64encode(encoded_content), |
|
||||
'res_model': self.used_model, |
|
||||
'res_id': self.id, |
|
||||
'mimetype': 'text/csv' |
|
||||
}) |
|
||||
return { |
|
||||
'type': 'ir.actions.act_url', |
|
||||
'target': 'new', |
|
||||
'url': f"/web/content/{attachment.id}?download=true" |
|
||||
} |
|
||||
|
|
||||
def action_product_items(self): |
|
||||
"""Open the product item list""" |
|
||||
return { |
|
||||
'type': 'ir.actions.act_window', |
|
||||
'name': 'Feed Items', |
|
||||
'view_mode': 'tree,form', |
|
||||
'res_model': self.used_model, |
|
||||
'domain': self.item_filter, |
|
||||
'context': self.env.context, |
|
||||
} |
|
||||
|
|
||||
def action_columns_creation(self): |
|
||||
"""Create the columns for feed.""" |
|
||||
return { |
|
||||
'type': 'ir.actions.act_window', |
|
||||
'name': 'Columns', |
|
||||
'view_mode': 'tree,form', |
|
||||
'res_model': 'product.data.feed.columns', |
|
||||
'context': { |
|
||||
'default_feed_id': self.id, |
|
||||
'default_data_feed_columns_id': self.id, |
|
||||
}, |
|
||||
'domain': [('feed_id', '=', self.id)] |
|
||||
} |
|
||||
|
|
||||
@api.depends('access_token') |
|
||||
def _compute_access_token(self): |
|
||||
"""Update the access token when enabling the token boolean field""" |
|
||||
access_tokens = secrets.token_urlsafe(27) |
|
||||
self.write({'access_token': access_tokens}) |
|
||||
|
|
||||
def action_refresh_token(self): |
|
||||
"""Refresh and generate new token""" |
|
||||
access_tokens = secrets.token_urlsafe( |
|
||||
27) # 27 bytes gives you 36 characters |
|
||||
self.write({'access_token': access_tokens}) |
|
||||
|
|
||||
@api.onchange('is_file_name') |
|
||||
def _onchange_is_file_name(self): |
|
||||
"""Generate the random name when enabling the file_name""" |
|
||||
if self.is_file_name: |
|
||||
prefix = "feed-" |
|
||||
random_length = 4 |
|
||||
random_chars = ''.join( |
|
||||
secrets.choice(string.ascii_letters + string.digits) for _ in |
|
||||
range(random_length)) |
|
||||
random_name = prefix + random_chars |
|
||||
self.write({'name_show': random_name}) |
|
||||
|
|
||||
@api.onchange('use_model') |
|
||||
def _onchange_use_model(self): |
|
||||
"""When changing the use_model it update the model into used_model""" |
|
||||
if self.use_model == 'Product': |
|
||||
self.write({'used_model': 'product.template'}) |
|
||||
else: |
|
||||
self.write({'used_model': 'product.product'}) |
|
||||
|
|
||||
@api.depends('format', 'name_show', 'is_token') |
|
||||
def _compute_url_link(self): |
|
||||
"""Compute the downloading link""" |
|
||||
for feed in self: |
|
||||
base_url = self.env['ir.config_parameter'].get_param( |
|
||||
'web.base.url') + '/product_data' |
|
||||
if feed.is_token and feed.is_file_name: |
|
||||
feed.url_link = f'{base_url}/{self.id}/{feed.name_show}.{feed.format}?access_token={feed.access_token}' |
|
||||
elif feed.is_file_name: |
|
||||
feed.url_link = f'{base_url}/{self.id}/{feed.name_show}.{feed.format}' |
|
||||
elif feed.is_token: |
|
||||
feed.url_link = f'{base_url}/{self.id}/feed.{feed.format}?access_token={feed.access_token}' |
|
||||
else: |
|
||||
feed.url_link = f'{base_url}/{self.id}/feed.{feed.format}' |
|
||||
|
|
||||
def _compute_columns_count(self): |
|
||||
"""Calculate the total number of column count of the current feed""" |
|
||||
for rec in self: |
|
||||
if rec.ids: |
|
||||
rec.columns_count = self.env[ |
|
||||
'product.data.feed.columns'].search_count( |
|
||||
[('feed_id', '=', rec.id)]) |
|
||||
else: |
|
||||
rec.columns_count = 0 |
|
@ -1,60 +0,0 @@ |
|||||
# -*- coding: utf-8 -*- |
|
||||
############################################################################### |
|
||||
# |
|
||||
# Cybrosys Technologies Pvt. Ltd. |
|
||||
# |
|
||||
# Copyright (C) 2024-TODAY Cybrosys Technologies(<https://www.cybrosys.com>) |
|
||||
# Author: Junaidul Ansar M (odoo@cybrosys.com) |
|
||||
# |
|
||||
# You can modify it under the terms of the GNU AFFERO |
|
||||
# GENERAL PUBLIC LICENSE (AGPL v3), Version 3. |
|
||||
# |
|
||||
# This program is distributed in the hope that it will be useful, |
|
||||
# but WITHOUT ANY WARRANTY; without even the implied warranty of |
|
||||
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the |
|
||||
# GNU AFFERO GENERAL PUBLIC LICENSE (AGPL v3) for more details. |
|
||||
# |
|
||||
# You should have received a copy of the GNU AFFERO GENERAL PUBLIC LICENSE |
|
||||
# (AGPL v3) along with this program. |
|
||||
# If not, see <http://www.gnu.org/licenses/>. |
|
||||
# |
|
||||
############################################################################### |
|
||||
from odoo import fields, models |
|
||||
|
|
||||
|
|
||||
class ProductDataFeedColumns(models.Model): |
|
||||
"""Model for defining columns in a product data feed. |
|
||||
|
|
||||
This class represents the columns used in a product data feed. These columns |
|
||||
define the structure of the data to be included in the feed, including |
|
||||
various types such as text, model fields, values, and special types.""" |
|
||||
_name = 'product.data.feed.columns' |
|
||||
_description = 'Product Data Feed Columns' |
|
||||
_inherit = ['mail.thread', 'mail.activity.mixin'] |
|
||||
|
|
||||
name = fields.Char(string='Name', help='Columns name') |
|
||||
feed_id = fields.Many2one('product.data.feed', |
|
||||
string='Feed', help='Feed Name') |
|
||||
type = fields.Selection( |
|
||||
[('Text', 'Text'), ('Model Field', 'Model Field'), |
|
||||
('Value', 'Value'), ('Special', 'Special')], |
|
||||
string='Type', help='Choose the type of the columns') |
|
||||
value = fields.Char(string="Value", help='Enter the column value') |
|
||||
value_id = fields.Many2one('ir.model.fields', |
|
||||
string="Value", help='Choose the column value', |
|
||||
) |
|
||||
field_value_id = fields.Many2one('field.column.value', |
|
||||
string="Value", |
|
||||
help='Choose the column value') |
|
||||
data_feed_columns_id = fields.Many2one('product.data.feed', |
|
||||
string='Data Columns', |
|
||||
help='Data columns inverse field') |
|
||||
special_type = fields.Selection( |
|
||||
[('product_price', 'Product Price'), |
|
||||
('disc_price', 'Discounted Price'), |
|
||||
('price_currency', 'Price Currency'), |
|
||||
('product_availability', 'Product Availability'), |
|
||||
('qty', 'Qty in Stock'), |
|
||||
('price_tax', 'Product Price(with Taxes)'), |
|
||||
('price_without_tax', 'Product Price(without Taxes)')], |
|
||||
string='Special Type', help='Choose the special type') |
|
|
Before Width: | Height: | Size: 3.6 KiB |
Before Width: | Height: | Size: 310 B |
Before Width: | Height: | Size: 1.3 KiB |
Before Width: | Height: | Size: 1.4 KiB |
Before Width: | Height: | Size: 576 B |
Before Width: | Height: | Size: 733 B |
Before Width: | Height: | Size: 911 B |
Before Width: | Height: | Size: 1.1 KiB |
Before Width: | Height: | Size: 1.2 KiB |
Before Width: | Height: | Size: 673 B |
Before Width: | Height: | Size: 878 B |
Before Width: | Height: | Size: 653 B |
Before Width: | Height: | Size: 905 B |
Before Width: | Height: | Size: 839 B |
Before Width: | Height: | Size: 427 B |
Before Width: | Height: | Size: 627 B |
Before Width: | Height: | Size: 1.2 KiB |
Before Width: | Height: | Size: 988 B |
Before Width: | Height: | Size: 1.2 KiB |
Before Width: | Height: | Size: 1.5 KiB |
Before Width: | Height: | Size: 1.1 KiB |
Before Width: | Height: | Size: 1.9 KiB |
Before Width: | Height: | Size: 1.1 KiB |
Before Width: | Height: | Size: 2.1 KiB |
Before Width: | Height: | Size: 4.4 KiB |
Before Width: | Height: | Size: 589 B |
Before Width: | Height: | Size: 3.4 KiB |
Before Width: | Height: | Size: 1.7 KiB |
Before Width: | Height: | Size: 2.3 KiB |
Before Width: | Height: | Size: 967 B |
Before Width: | Height: | Size: 1.6 KiB |
Before Width: | Height: | Size: 3.8 KiB |
Before Width: | Height: | Size: 5.0 KiB |
Before Width: | Height: | Size: 89 KiB |
Before Width: | Height: | Size: 93 KiB |
Before Width: | Height: | Size: 70 KiB |
Before Width: | Height: | Size: 128 KiB |
Before Width: | Height: | Size: 101 KiB |
Before Width: | Height: | Size: 92 KiB |
Before Width: | Height: | Size: 89 KiB |
Before Width: | Height: | Size: 70 KiB |
Before Width: | Height: | Size: 71 KiB |
Before Width: | Height: | Size: 21 KiB |
Before Width: | Height: | Size: 76 KiB |
Before Width: | Height: | Size: 180 KiB |
Before Width: | Height: | Size: 77 KiB |
Before Width: | Height: | Size: 85 KiB |
Before Width: | Height: | Size: 116 KiB |
Before Width: | Height: | Size: 91 KiB |
Before Width: | Height: | Size: 44 KiB |
Before Width: | Height: | Size: 146 KiB |
Before Width: | Height: | Size: 125 KiB |
Before Width: | Height: | Size: 139 KiB |
Before Width: | Height: | Size: 57 KiB |
Before Width: | Height: | Size: 387 KiB |
Before Width: | Height: | Size: 81 KiB |
Before Width: | Height: | Size: 28 KiB |
Before Width: | Height: | Size: 50 KiB |
Before Width: | Height: | Size: 173 KiB |
Before Width: | Height: | Size: 76 KiB |
Before Width: | Height: | Size: 19 KiB |
@ -1,695 +0,0 @@ |
|||||
<div style="background-color: #714B67; height: 810px; width: 100%; padding: 15px; position: relative;" |
|
||||
xmlns="http://www.w3.org/1999/html"> |
|
||||
<!-- TITLE BAR --> |
|
||||
<div class="d-flex align-items-center justify-content-between" |
|
||||
style="border-bottom: 1px solid #875A7B; padding: 15px; display: flex; justify-content: space-between; align-items: center;"> |
|
||||
<img src="assets/misc/cybrosys-logo.png" width="42" height="42" |
|
||||
style="width: 42px; height: 42px;"/> |
|
||||
<div> |
|
||||
<div |
|
||||
style="color: #7C7BAD; font-size: 14px; font-family: 'Montserrat', sans-serif; font-weight: bold; background-color: white; display: inline-block; padding: 3px 10px; border-radius: 50px;" |
|
||||
class="mr-2"> |
|
||||
<i class="fa fa-check mr-1"></i>Community |
|
||||
</div> |
|
||||
<div |
|
||||
style="color: #875A7B; font-size: 14px; font-family: 'Montserrat', sans-serif; font-weight: bold; background-color: white; display: inline-block; padding: 3px 10px; border-radius: 50px;" |
|
||||
class="mr-2"> |
|
||||
<i class="fa fa-check mr-1"></i>Enterprise |
|
||||
</div> |
|
||||
<div |
|
||||
style="color: #017E84; font-size: 14px; font-family: 'Montserrat', sans-serif; font-weight: bold; background-color: white; display: inline-block; padding: 3px 10px; border-radius: 50px;" |
|
||||
class="mr-2"> |
|
||||
<i class="fa fa-check mr-1"></i>Odoo.sh |
|
||||
</div> |
|
||||
</div> |
|
||||
</div> |
|
||||
<!-- END OF TITLE BAR --> |
|
||||
<div class="container"> |
|
||||
<div class="row"> |
|
||||
<div class="col-sm-12 col-md-12 col-lg-12"> |
|
||||
<!-- APP HERO --> |
|
||||
<h1 style="color: #FFFFFF; font-weight: bolder; font-size: 50px; text-align: center; margin-top: 50px;"> |
|
||||
Product Data Feed Generation</h1> |
|
||||
<p style="color:#FFFFFF; padding: 8px 15px; text-align: center; font-size: 24px;"> |
|
||||
Generate Product Catalog Feeds Link</p> |
|
||||
<!-- END OF APP HERO --> |
|
||||
<img src="assets/screenshots/hero.gif" class="img-responsive" |
|
||||
style="width: 100%; margin-left: auto; margin-right: auto;"/> |
|
||||
</div> |
|
||||
</div> |
|
||||
</div> |
|
||||
</div> |
|
||||
<!-- NAVIGATION SECTION --> |
|
||||
<div class="d-flex align-items-center" |
|
||||
style="border-bottom: 2px solid #714B67; padding: 15px 0px; margin-top: 300px;"> |
|
||||
<div class="d-flex justify-content-center align-items-center mr-2" |
|
||||
style="background-color: #F5F5F5; border-radius: 0px; width: 40px; height: 40px;"> |
|
||||
<img src="assets/misc/compass.png"/> |
|
||||
</div> |
|
||||
<h2 class="mt-2" |
|
||||
style="font-family: 'Montserrat', sans-serif; font-size: 24px; font-weight: bold;"> |
|
||||
Explore This |
|
||||
Module</h2> |
|
||||
</div> |
|
||||
<div class="row my-4" style="font-family: 'Montserrat', sans-serif;"> |
|
||||
<div class="col-sm-12 col-md-6 my-3"> |
|
||||
<a href="#overview"> |
|
||||
<div class="d-flex justify-content-between align-items-center" |
|
||||
style="background-color: #f5f5f5; padding: 30px; width: 100%;"> |
|
||||
<div> |
|
||||
<span style="color: #714B67; font-size: 24px; font-weight: 500; display: block;">Overview</span> |
|
||||
<span style="color: #714B67; font-size: 16px; font-weight: 400; color:#282F33; display: block;">Learn |
|
||||
more about this |
|
||||
module</span> |
|
||||
</div> |
|
||||
<img src="assets/misc/right-arrow.png" width="36" height="36"/> |
|
||||
</div> |
|
||||
</a> |
|
||||
</div> |
|
||||
<div class="col-sm-12 col-md-6 my-3"> |
|
||||
<a href="#features"> |
|
||||
<div class="d-flex justify-content-between align-items-center" |
|
||||
style="background-color: #f5f5f5; padding: 30px; width: 100%;"> |
|
||||
<div> |
|
||||
<span style="color: #714B67; font-size: 24px; font-weight: 500; display: block;">Features</span> |
|
||||
<span style="color: #714B67; font-size: 16px; font-weight: 400; color:#282F33; display: block;">View |
|
||||
features of this |
|
||||
module</span> |
|
||||
</div> |
|
||||
<img src="assets/misc/right-arrow.png" width="36" height="36"/> |
|
||||
</div> |
|
||||
</a> |
|
||||
</div> |
|
||||
<div class="col-sm-12 col-md-6 my-3"> |
|
||||
<a href="#screenshots"> |
|
||||
<div class="d-flex justify-content-between align-items-center" |
|
||||
style="background-color: #f5f5f5; padding: 30px; width: 100%;"> |
|
||||
<div> |
|
||||
<span style="color: #714B67; font-size: 24px; font-weight: 500; display: block;">Screenshots</span> |
|
||||
<span style="color: #714B67; font-size: 16px; font-weight: 400; color:#282F33; display: block;">View |
|
||||
screenshots for this |
|
||||
module</span> |
|
||||
</div> |
|
||||
<img src="assets/misc/right-arrow.png" width="36" height="36"/> |
|
||||
</div> |
|
||||
</a> |
|
||||
</div> |
|
||||
</div> |
|
||||
<!-- END OF NAVIGATION SECTION --> |
|
||||
|
|
||||
<!-- OVERVIEW SECTION --> |
|
||||
<div class="d-flex align-items-center" |
|
||||
style="border-bottom: 2px solid #714B67; padding: 15px 0px;" id="overview"> |
|
||||
<div class="d-flex justify-content-center align-items-center mr-2" |
|
||||
style="background-color: #F5F5F5; border-radius: 0px; width: 40px; height: 40px;"> |
|
||||
<img src="assets/misc/pie-chart.png"/> |
|
||||
</div> |
|
||||
<h2 class="mt-2" |
|
||||
style="font-family: 'Montserrat', sans-serif; font-size: 24px; font-weight: bold;"> |
|
||||
Overview |
|
||||
</h2> |
|
||||
</div> |
|
||||
<div class="row" |
|
||||
style="font-family: 'Montserrat', sans-serif; font-weight: 400; font-size: 14px; line-height: 200%;"> |
|
||||
<div class="col-sm-12 py-4"> |
|
||||
Using this module we have to promote and market our sales through |
|
||||
facebook and |
|
||||
instagram for using the catalog of our product. Many of the businesses |
|
||||
sell |
|
||||
or advertise their product through facebook and instagram. So they need |
|
||||
a catalog that contains the information about your products. In this |
|
||||
module |
|
||||
generate the product data feed file for the facebook commerce manager in |
|
||||
automatic mode(by URL). After adding the data feed URL on facebook you |
|
||||
will be able to promote your product in sale channels , on facebook |
|
||||
shops, |
|
||||
instagram shopping, with dynamic ads, and more. |
|
||||
</div> |
|
||||
</div> |
|
||||
<!-- END OF OVERVIEW SECTION --> |
|
||||
<!-- FEATURES SECTION --> |
|
||||
<div class="d-flex align-items-center" |
|
||||
style="border-bottom: 2px solid #714B67; padding: 15px 0px;" id="features"> |
|
||||
<div class="d-flex justify-content-center align-items-center mr-2" |
|
||||
style="background-color: #F5F5F5; border-radius: 0px; width: 40px; height: 40px;"> |
|
||||
<img src="assets/misc/features.png"/> |
|
||||
</div> |
|
||||
<h2 class="mt-2" |
|
||||
style="font-family: 'Montserrat', sans-serif; font-size: 24px; font-weight: bold;"> |
|
||||
Features |
|
||||
</h2> |
|
||||
</div> |
|
||||
<div class="row" |
|
||||
style="font-family: 'Montserrat', sans-serif; font-weight: 400; font-size: 14px; line-height: 200%;"> |
|
||||
<div class="col-sm-12 col-md-6"> |
|
||||
<div class="d-flex align-items-center" |
|
||||
style="margin-top: 40px; margin-bottom: 40px"> |
|
||||
<img src="assets/misc/check-box.png" class="mr-2"/> |
|
||||
<span style="font-family: 'Montserrat', sans-serif; font-size: 18px; font-weight: bold;">Community & |
|
||||
Enterprise Support.</span> |
|
||||
</div> |
|
||||
<div class="d-flex align-items-center" |
|
||||
style="margin-top: 30px; margin-bottom: 30px"> |
|
||||
<img src="assets/misc/check-box.png" class="mr-2"/> |
|
||||
<span style="font-family: 'Montserrat', sans-serif; font-size: 18px; font-weight: bold;">You can create the catalog of the product easily(Feed creation)</span> |
|
||||
</div> |
|
||||
<div class="d-flex align-items-center" |
|
||||
style="margin-top: 30px; margin-bottom: 30px"> |
|
||||
<img src="assets/misc/check-box.png" class="mr-2"/> |
|
||||
<span style="font-family: 'Montserrat', sans-serif; font-size: 18px; font-weight: bold;">You can also add multiple feeds.</span> |
|
||||
</div> |
|
||||
<div class="d-flex align-items-center" |
|
||||
style="margin-top: 30px; margin-bottom: 30px"> |
|
||||
<img src="assets/misc/check-box.png" class="mr-2"/> |
|
||||
<span style="font-family: 'Montserrat', sans-serif; font-size: 18px; font-weight: bold;">The data feed formate is CSV file.</span> |
|
||||
</div> |
|
||||
<div class="d-flex align-items-center" |
|
||||
style="margin-top: 30px; margin-bottom: 30px"> |
|
||||
<img src="assets/misc/check-box.png" class="mr-2"/> |
|
||||
<span style="font-family: 'Montserrat', sans-serif; font-size: 18px; font-weight: bold;">You can filter the records based on the domain.</span> |
|
||||
</div> |
|
||||
<div class="d-flex align-items-center" |
|
||||
style="margin-top: 30px; margin-bottom: 30px"> |
|
||||
<img src="assets/misc/check-box.png" class="mr-2"/> |
|
||||
<span style="font-family: 'Montserrat', sans-serif; font-size: 18px; font-weight: bold;">You can enable the auto generated file name.</span> |
|
||||
</div> |
|
||||
<div class="d-flex align-items-center" |
|
||||
style="margin-top: 30px; margin-bottom: 30px"> |
|
||||
<img src="assets/misc/check-box.png" class="mr-2"/> |
|
||||
<span style="font-family: 'Montserrat', sans-serif; font-size: 18px; font-weight: bold;">You can share the Feed Link to anyone and post the link Facebook or Instagram.</span> |
|
||||
</div> |
|
||||
|
|
||||
</div> |
|
||||
</div> |
|
||||
<!-- END OF FEATURES SECTION --> |
|
||||
<!-- SCREENSHOTS SECTION --> |
|
||||
<div class="d-flex align-items-center" |
|
||||
style="border-bottom: 2px solid #714B67; padding: 15px 0px;" |
|
||||
id="screenshots"> |
|
||||
<div class="d-flex justify-content-center align-items-center mr-2" |
|
||||
style="background-color: #F5F5F5; border-radius: 0px; width: 40px; height: 40px;"> |
|
||||
<img src="assets/misc/pictures.png"/> |
|
||||
</div> |
|
||||
<h2 class="mt-2" |
|
||||
style="font-family: 'Montserrat', sans-serif; font-size: 24px; font-weight: bold;"> |
|
||||
Screenshots |
|
||||
</h2> |
|
||||
</div> |
|
||||
<div class="row"> |
|
||||
<div class="col-sm-12"> |
|
||||
<div style="display: block; margin: 30px auto;"> |
|
||||
<h3 style="font-family: 'Montserrat', sans-serif; font-size: 18px; font-weight: bold;"> |
|
||||
Product Data Feed. |
|
||||
</h3> |
|
||||
<p style="font-weight: 400; font-family: 'Montserrat', sans-serif; font-size: 14px;"> |
|
||||
Go to Website -> eCommerce Menu -> Product Data Feed |
|
||||
-> |
|
||||
Under the eCommerce Menu you can see the Product Data Feed submenu |
|
||||
clicking the menu its open the Product data Feed creation model. |
|
||||
</p> |
|
||||
<img src="assets/screenshots/website.png" |
|
||||
class="img-thumbnail"> |
|
||||
</div> |
|
||||
<div style="display: block; margin: 30px auto;"> |
|
||||
<h3 style="font-family: 'Montserrat', sans-serif; font-size: 18px; font-weight: bold;"> |
|
||||
Product Data Feed Tree View. |
|
||||
</h3> |
|
||||
<p style="font-weight: 400; font-family: 'Montserrat', sans-serif; font-size: 14px;">Here you could see the list view of the Data Feed</p> |
|
||||
<img src="assets/screenshots/feed_tree_view.png" class="img-thumbnail"> |
|
||||
</div> |
|
||||
<div style="display: block; margin: 30px auto;"> |
|
||||
<h3 style="font-family: 'Montserrat', sans-serif; font-size: 18px; font-weight: bold;"> |
|
||||
Product Data Feed Model. |
|
||||
</h3> |
|
||||
<p style="font-weight: 400; font-family: 'Montserrat', sans-serif; font-size: 14px;">Inside the form view, you can configure the data feed security and format options.</p> |
|
||||
<img src="assets/screenshots/feed_model.png" class="img-thumbnail"> |
|
||||
</div> |
|
||||
<div style="display: block; margin: 30px auto;"> |
|
||||
<p style="font-weight: 400; font-family: 'Montserrat', sans-serif; font-size: 14px;"> |
|
||||
*You could make the data feed token protected by enabling Use Token option.<br> |
|
||||
*You can regenerate the access token if needed.<br> |
|
||||
*If you use multi websites, you can specify which ones will allow this data feed.<br> |
|
||||
*Enable the file name to edit the file name.<br> |
|
||||
*You can filter the products.<br> |
|
||||
*The file format is CSV by default |
|
||||
</p> |
|
||||
<img src="assets/screenshots/img22.png" class="img-thumbnail"> |
|
||||
</div> |
|
||||
<div style="display: block; margin: 30px auto;"> |
|
||||
<h3 style="font-family: 'Montserrat', sans-serif; font-size: 18px; font-weight: bold;"> |
|
||||
Product Data Feed Column Smart Button View . |
|
||||
</h3> |
|
||||
<p style="font-weight: 400; font-family: 'Montserrat', sans-serif; font-size: 14px;">Inside 'Columns', you could create the columns to show for the data feed.</p> |
|
||||
<img src="assets/screenshots/column_view.png" class="img-thumbnail"> |
|
||||
</div> |
|
||||
<div style="display: block; margin: 30px auto;"> |
|
||||
<h3 style="font-family: 'Montserrat', sans-serif; font-size: 18px; font-weight: bold;"> |
|
||||
Product Data Feed Column Model Creation. |
|
||||
</h3> |
|
||||
<p style="font-weight: 400; font-family: 'Montserrat', sans-serif; font-size: 14px;">There are different options available.</p> |
|
||||
<img src="assets/screenshots/column_models.png" class="img-thumbnail"> |
|
||||
</div> |
|
||||
<div style="display: block; margin: 30px auto;"> |
|
||||
<h3 style="font-family: 'Montserrat', sans-serif; font-size: 18px; font-weight: bold;"> |
|
||||
Product Data Feed Item Smart Button View. |
|
||||
</h3> |
|
||||
<p style="font-weight: 400; font-family: 'Montserrat', sans-serif; font-size: 14px;">All the filtered products can be seen inside the smart button 'Items'</p> |
|
||||
<img src="assets/screenshots/feed_item.png" class="img-thumbnail"> |
|
||||
</div> |
|
||||
<div style="display: block; margin: 30px auto;"> |
|
||||
<h3 style="font-family: 'Montserrat', sans-serif; font-size: 18px; font-weight: bold;"> |
|
||||
Copying the Product Data Feed Link. |
|
||||
</h3> |
|
||||
<p style="font-weight: 400; font-family: 'Montserrat', sans-serif; font-size: 14px;"> |
|
||||
Copy the link to the product data feed file to share it with anyone, or you can paste the link on Facebook. By doing this, you will be able to promote your product on various sales channels. </p> |
|
||||
<img src="assets/screenshots/feed_model1.png" class="img-thumbnail"> |
|
||||
</div><div style="display: block; margin: 30px auto;"> |
|
||||
<h3 style="font-family: 'Montserrat', sans-serif; font-size: 18px; font-weight: bold;"> |
|
||||
Add the Catalogue. |
|
||||
</h3> |
|
||||
<img src="assets/screenshots/fb_cat1.png" class="img-thumbnail"> |
|
||||
</div><div style="display: block; margin: 30px auto;"> |
|
||||
<h3 style="font-family: 'Montserrat', sans-serif; font-size: 18px; font-weight: bold;"> |
|
||||
Select the E-commerce Catalogue Type. |
|
||||
</h3> |
|
||||
<img src="assets/screenshots/fb_cat2.png" class="img-thumbnail"> |
|
||||
</div><div style="display: block; margin: 30px auto;"> |
|
||||
<h3 style="font-family: 'Montserrat', sans-serif; font-size: 18px; font-weight: bold;"> |
|
||||
Select the Owner and Enter the Catalogue Name. |
|
||||
</h3> |
|
||||
<img src="assets/screenshots/fb3.png" class="img-thumbnail"> |
|
||||
</div><div style="display: block; margin: 30px auto;"> |
|
||||
<h3 style="font-family: 'Montserrat', sans-serif; font-size: 18px; font-weight: bold;"> |
|
||||
Click View Catalogue, to View the Catalogue. |
|
||||
</h3> |
|
||||
<img src="assets/screenshots/fb4.png" class="img-thumbnail"> |
|
||||
</div><div style="display: block; margin: 30px auto;"> |
|
||||
<h3 style="font-family: 'Montserrat', sans-serif; font-size: 18px; font-weight: bold;"> |
|
||||
Open Data Sources. |
|
||||
</h3> |
|
||||
<img src="assets/screenshots/fb5.png" class="img-thumbnail"> |
|
||||
</div><div style="display: block; margin: 30px auto;"> |
|
||||
<h3 style="font-family: 'Montserrat', sans-serif; font-size: 18px; font-weight: bold;"> |
|
||||
Select Data Feed then Next. |
|
||||
</h3> |
|
||||
<img src="assets/screenshots/fb6.png" class="img-thumbnail"> |
|
||||
</div><div style="display: block; margin: 30px auto;"> |
|
||||
<h3 style="font-family: 'Montserrat', sans-serif; font-size: 18px; font-weight: bold;"> |
|
||||
Paste Product Data Feed Link here. |
|
||||
</h3> |
|
||||
<img src="assets/screenshots/fb7.png" class="img-thumbnail"> |
|
||||
</div> |
|
||||
</div><div style="display: block; margin: 30px auto;"> |
|
||||
<h3 style="font-family: 'Montserrat', sans-serif; font-size: 18px; font-weight: bold;"> |
|
||||
Add more Details about the Product. |
|
||||
</h3> |
|
||||
<img src="assets/screenshots/fb8.png" class="img-thumbnail"> |
|
||||
</div></div><div style="display: block; margin: 30px auto;"> |
|
||||
<h3 style="font-family: 'Montserrat', sans-serif; font-size: 18px; font-weight: bold;"> |
|
||||
View of Product Data Feed. |
|
||||
</h3> |
|
||||
<img src="assets/screenshots/fb9.png" class="img-thumbnail"> |
|
||||
</div> |
|
||||
<div style="display: block; margin: 30px auto;"> |
|
||||
<img src="assets/screenshots/img101.png" class="img-thumbnail"> |
|
||||
</div> |
|
||||
<div style="display: block; margin: 30px auto;"> |
|
||||
<h3 style="font-family: 'Montserrat', sans-serif; font-size: 18px; font-weight: bold;"> |
|
||||
Downloaded File |
|
||||
</h3> |
|
||||
<p style="font-weight: 400; font-family: 'Montserrat', sans-serif; font-size: 14px;">The downloaded file will look like this</p> |
|
||||
<img src="assets/screenshots/img102.png" class="img-thumbnail"> |
|
||||
</div> |
|
||||
</div> |
|
||||
</div> |
|
||||
<!-- END OF SCREENSHOTS SECTION --> |
|
||||
<!-- RELATED PRODUCTS --> |
|
||||
<div class="d-flex align-items-center" |
|
||||
style="border-bottom: 2px solid #714B67; padding: 15px 0px;"> |
|
||||
<div class="d-flex justify-content-center align-items-center mr-2" |
|
||||
style="background-color: #F5F5F5; border-radius: 0px; width: 40px; height: 40px;"> |
|
||||
<img src="assets/misc/categories.png"/> |
|
||||
</div> |
|
||||
<h2 class="mt-2" |
|
||||
style="font-family: 'Montserrat', sans-serif; font-size: 24px; font-weight: bold;"> |
|
||||
Related Products</h2> |
|
||||
</div> |
|
||||
<div class="row"> |
|
||||
<div class="col-sm-12"> |
|
||||
<div id="demo1" class="row carousel slide" data-ride="carousel"> |
|
||||
<!-- The slideshow --> |
|
||||
<div class="carousel-inner" style="padding: 30px;"> |
|
||||
<div class="carousel-item" style="min-height: 198.656px;"> |
|
||||
<div class="col-xs-12 col-sm-4 col-md-4 mb16 mt16" |
|
||||
style="float:left"> |
|
||||
<a href="https://apps.odoo.com/apps/modules/16.0/website_hide_button/" |
|
||||
target="_blank"> |
|
||||
<div style="border-radius:10px"> |
|
||||
<img class="img img-responsive center-block" |
|
||||
style="border-radius: 0px;" |
|
||||
src="assets/modules/1.jpg"> |
|
||||
</div> |
|
||||
</a> |
|
||||
</div> |
|
||||
<div class="col-xs-12 col-sm-4 col-md-4 mb16 mt16" |
|
||||
style="float:left"> |
|
||||
<a href="https://apps.odoo.com/apps/modules/16.0/website_portal_events/#" |
|
||||
target="_blank"> |
|
||||
<div style="border-radius:10px"> |
|
||||
<img class="img img-responsive center-block" |
|
||||
style="border-radius: 0px;" |
|
||||
src="assets/modules/2.jpg"> |
|
||||
</div> |
|
||||
</a> |
|
||||
</div> |
|
||||
<div class="col-xs-12 col-sm-4 col-md-4 mb16 mt16" |
|
||||
style="float:left"> |
|
||||
<a href="https://apps.odoo.com/apps/modules/16.0/website_seo_kit/" |
|
||||
target="_blank"> |
|
||||
<div style="border-radius:10px"> |
|
||||
<img class="img img-responsive center-block" |
|
||||
style="border-radius: 0px;" |
|
||||
src="assets/modules/3.png"> |
|
||||
</div> |
|
||||
</a> |
|
||||
</div> |
|
||||
</div> |
|
||||
<div class="carousel-item active" |
|
||||
style="min-height: 198.656px;"> |
|
||||
<div class="col-xs-12 col-sm-4 col-md-4 mb16 mt16" |
|
||||
style="float:left"> |
|
||||
<a href="https://apps.odoo.com/apps/modules/16.0/call_for_price_website/" |
|
||||
target="_blank"> |
|
||||
<div style="border-radius:10px"> |
|
||||
<img class="img img-responsive center-block" |
|
||||
style="border-radius: 0px;" |
|
||||
src="assets/modules/4.png"> |
|
||||
</div> |
|
||||
</a> |
|
||||
</div> |
|
||||
<div class="col-xs-12 col-sm-4 col-md-4 mb16 mt16" |
|
||||
style="float:left"> |
|
||||
<a href="https://apps.odoo.com/apps/modules/16.0/special_product_snippet/" |
|
||||
target="_blank"> |
|
||||
<div style="border-radius:10px"> |
|
||||
<img class="img img-responsive center-block" |
|
||||
style="border-radius: 0px;" |
|
||||
src="assets/modules/5.jpg"> |
|
||||
</div> |
|
||||
</a> |
|
||||
</div> |
|
||||
<div class="col-xs-12 col-sm-4 col-md-4 mb16 mt16" |
|
||||
style="float:left"> |
|
||||
<a href="https://apps.odoo.com/apps/modules/16.0/website_favourites_grid/" |
|
||||
target="_blank"> |
|
||||
<div style="border-radius:10px"> |
|
||||
<img class="img img-responsive center-block" |
|
||||
style="border-radius: 0px;" |
|
||||
src="assets/modules/7.jpg"> |
|
||||
</div> |
|
||||
</a> |
|
||||
</div> |
|
||||
</div> |
|
||||
</div> |
|
||||
<!-- Left and right controls --> |
|
||||
<a class="carousel-control-prev" href="#demo1" data-slide="prev" |
|
||||
style="width:35px; color:#000"> <span |
|
||||
class="carousel-control-prev-icon"><i |
|
||||
class="fa fa-chevron-left" |
|
||||
style="font-size:24px"></i></span> |
|
||||
</a> <a class="carousel-control-next" href="#demo1" |
|
||||
data-slide="next" style="width:35px; color:#000"> |
|
||||
<span class="carousel-control-next-icon"><i |
|
||||
class="fa fa-chevron-right" |
|
||||
style="font-size:24px"></i></span></a> |
|
||||
</div> |
|
||||
</div> |
|
||||
</div> |
|
||||
<!-- END OF RELATED PRODUCTS --> |
|
||||
<!-- OUR SERVICES --> |
|
||||
<div class="d-flex align-items-center" |
|
||||
style="border-bottom: 2px solid #714B67; padding: 15px 0px;"> |
|
||||
<div class="d-flex justify-content-center align-items-center mr-2" |
|
||||
style="background-color: #F5F5F5; border-radius: 0px; width: 40px; height: 40px;"> |
|
||||
<img src="assets/misc/star.png"/> |
|
||||
</div> |
|
||||
<h2 class="mt-2" |
|
||||
style="font-family: 'Montserrat', sans-serif; font-size: 24px; font-weight: bold;"> |
|
||||
Our Services</h2> |
|
||||
</div> |
|
||||
<div class="container my-5"> |
|
||||
<div class="row"> |
|
||||
<div class="col-lg-4 d-flex flex-column justify-content-center align-items-center my-4"> |
|
||||
<div class="d-flex justify-content-center align-items-center mx-3 my-3" |
|
||||
style="background-color: #1dd1a1 !important; border-radius: 15px !important; height: 80px; width: 80px;"> |
|
||||
<img src="assets/icons/cogs.png" class="img-responsive" |
|
||||
height="48px" width="48px"> |
|
||||
</div> |
|
||||
<h6 class="text-center" |
|
||||
style="font-family: Montserrat, 'sans-serif' !important; font-weight: bold;"> |
|
||||
Odoo Customization</h6> |
|
||||
</div> |
|
||||
<div class="col-lg-4 d-flex flex-column justify-content-center align-items-center my-4"> |
|
||||
<div class="d-flex justify-content-center align-items-center mx-3 my-3" |
|
||||
style="background-color: #ff6b6b !important; border-radius: 15px !important; height: 80px; width: 80px;"> |
|
||||
<img src="assets/icons/wrench.png" class="img-responsive" |
|
||||
height="48px" width="48px"> |
|
||||
</div> |
|
||||
<h6 class="text-center" |
|
||||
style="font-family: Montserrat, 'sans-serif' !important; font-weight: bold;"> |
|
||||
Odoo Implementation</h6> |
|
||||
</div> |
|
||||
<div class="col-lg-4 d-flex flex-column justify-content-center align-items-center my-4"> |
|
||||
<div class="d-flex justify-content-center align-items-center mx-3 my-3" |
|
||||
style="background-color: #6462CD !important; border-radius: 15px !important; height: 80px; width: 80px;"> |
|
||||
<img src="assets/icons/lifebuoy.png" class="img-responsive" |
|
||||
height="48px" width="48px"> |
|
||||
</div> |
|
||||
<h6 class="text-center" |
|
||||
style="font-family: Montserrat, 'sans-serif' !important; font-weight: bold;"> |
|
||||
Odoo Support</h6> |
|
||||
</div> |
|
||||
<div class="col-lg-4 d-flex flex-column justify-content-center align-items-center my-4"> |
|
||||
<div class="d-flex justify-content-center align-items-center mx-3 my-3" |
|
||||
style="background-color: #ffa801 !important; border-radius: 15px !important; height: 80px; width: 80px;"> |
|
||||
<img src="assets/icons/user.png" class="img-responsive" |
|
||||
height="48px" width="48px"> |
|
||||
</div> |
|
||||
<h6 class="text-center" |
|
||||
style="font-family: Montserrat, 'sans-serif' !important; font-weight: bold;"> |
|
||||
Hire Odoo Developer</h6> |
|
||||
</div> |
|
||||
<div class="col-lg-4 d-flex flex-column justify-content-center align-items-center my-4"> |
|
||||
<div class="d-flex justify-content-center align-items-center mx-3 my-3" |
|
||||
style="background-color: #54a0ff !important; border-radius: 15px !important; height: 80px; width: 80px;"> |
|
||||
<img src="assets/icons/puzzle.png" class="img-responsive" |
|
||||
height="48px" width="48px"> |
|
||||
</div> |
|
||||
<h6 class="text-center" |
|
||||
style="font-family: Montserrat, 'sans-serif' !important; font-weight: bold;"> |
|
||||
Odoo Integration</h6> |
|
||||
</div> |
|
||||
<div class="col-lg-4 d-flex flex-column justify-content-center align-items-center my-4"> |
|
||||
<div class="d-flex justify-content-center align-items-center mx-3 my-3" |
|
||||
style="background-color: #6d7680 !important; border-radius: 15px !important; height: 80px; width: 80px;"> |
|
||||
<img src="assets/icons/update.png" class="img-responsive" |
|
||||
height="48px" width="48px"> |
|
||||
</div> |
|
||||
<h6 class="text-center" |
|
||||
style="font-family: Montserrat, 'sans-serif' !important; font-weight: bold;"> |
|
||||
Odoo Migration</h6> |
|
||||
</div> |
|
||||
<div class="col-lg-4 d-flex flex-column justify-content-center align-items-center my-4"> |
|
||||
<div class="d-flex justify-content-center align-items-center mx-3 my-3" |
|
||||
style="background-color: #786fa6 !important; border-radius: 15px !important; height: 80px; width: 80px;"> |
|
||||
<img src="assets/icons/consultation.png" class="img-responsive" |
|
||||
height="48px" width="48px"> |
|
||||
</div> |
|
||||
<h6 class="text-center" |
|
||||
style="font-family: Montserrat, 'sans-serif' !important; font-weight: bold;"> |
|
||||
Odoo Consultancy</h6> |
|
||||
</div> |
|
||||
<div class="col-lg-4 d-flex flex-column justify-content-center align-items-center my-4"> |
|
||||
<div class="d-flex justify-content-center align-items-center mx-3 my-3" |
|
||||
style="background-color: #f8a5c2 !important; border-radius: 15px !important; height: 80px; width: 80px;"> |
|
||||
<img src="assets/icons/training.png" class="img-responsive" |
|
||||
height="48px" width="48px"> |
|
||||
</div> |
|
||||
<h6 class="text-center" |
|
||||
style="font-family: Montserrat, 'sans-serif' !important; font-weight: bold;"> |
|
||||
Odoo Implementation</h6> |
|
||||
</div> |
|
||||
<div class="col-lg-4 d-flex flex-column justify-content-center align-items-center my-4"> |
|
||||
<div class="d-flex justify-content-center align-items-center mx-3 my-3" |
|
||||
style="background-color: #e6be26 !important; border-radius: 15px !important; height: 80px; width: 80px;"> |
|
||||
<img src="assets/icons/license.png" class="img-responsive" |
|
||||
height="48px" width="48px"> |
|
||||
</div> |
|
||||
<h6 class="text-center" |
|
||||
style="font-family: Montserrat, 'sans-serif' !important; font-weight: bold;"> |
|
||||
Odoo Licensing Consultancy</h6> |
|
||||
</div> |
|
||||
</div> |
|
||||
</div> |
|
||||
<!-- END OF OUR SERVICES --> |
|
||||
<!-- OUR INDUSTRIES --> |
|
||||
<div class="d-flex align-items-center" |
|
||||
style="border-bottom: 2px solid #714B67; padding: 15px 0px;"> |
|
||||
<div class="d-flex justify-content-center align-items-center mr-2" |
|
||||
style="background-color: #F5F5F5; border-radius: 0px; width: 40px; height: 40px;"> |
|
||||
<img src="assets/misc/corporate.png"/> |
|
||||
</div> |
|
||||
<h2 class="mt-2" |
|
||||
style="font-family: 'Montserrat', sans-serif; font-size: 24px; font-weight: bold;"> |
|
||||
Our Industries</h2> |
|
||||
</div> |
|
||||
<div class="container my-5"> |
|
||||
<div class="row"> |
|
||||
<div class="col-lg-3"> |
|
||||
<div class="my-4 d-flex flex-column justify-content-center" |
|
||||
style="background-color: #f6f8f9 !important; border-radius: 0px; padding: 2rem !important; height: 250px !important;"> |
|
||||
<img src="assets/icons/trading-black.png" |
|
||||
class="img-responsive mb-3" height="48px" width="48px"> |
|
||||
<h5 style="font-family: Montserrat, sans-serif !important; color: #000 !important; font-weight: bold;"> |
|
||||
Trading</h5> |
|
||||
<p style="font-family: Montserrat, sans-serif !important; font-size: 0.9rem !important;"> |
|
||||
Easily procure and sell your products</p> |
|
||||
</div> |
|
||||
</div> |
|
||||
<div class="col-lg-3"> |
|
||||
<div class="my-4 d-flex flex-column justify-content-center" |
|
||||
style="background-color: #f6f8f9 !important; border-radius: 0px; padding: 2rem !important; height: 250px !important;"> |
|
||||
<img src="assets/icons/pos-black.png" |
|
||||
class="img-responsive mb-3" height="48px" width="48px"> |
|
||||
<h5 style="font-family: Montserrat, sans-serif !important; color: #000 !important; font-weight: bold;"> |
|
||||
POS</h5> |
|
||||
<p style="font-family: Montserrat, sans-serif !important; font-size: 0.9rem !important;"> |
|
||||
Easy configuration and convivial experience</p> |
|
||||
</div> |
|
||||
</div> |
|
||||
<div class="col-lg-3"> |
|
||||
<div class="my-4 d-flex flex-column justify-content-center" |
|
||||
style="background-color: #f6f8f9 !important; border-radius: 0px; padding: 2rem !important; height: 250px !important;"> |
|
||||
<img src="assets/icons/education-black.png" |
|
||||
class="img-responsive mb-3" height="48px" width="48px"> |
|
||||
<h5 style="font-family: Montserrat, sans-serif !important; color: #000 !important; font-weight: bold;"> |
|
||||
Education</h5> |
|
||||
<p style="font-family: Montserrat, sans-serif !important; font-size: 0.9rem !important;"> |
|
||||
A platform for educational management</p> |
|
||||
</div> |
|
||||
</div> |
|
||||
<div class="col-lg-3"> |
|
||||
<div class="my-4 d-flex flex-column justify-content-center" |
|
||||
style="background-color: #f6f8f9 !important; border-radius: 0px; padding: 2rem !important; height: 250px !important;"> |
|
||||
<img src="assets/icons/manufacturing-black.png" |
|
||||
class="img-responsive mb-3" height="48px" width="48px"> |
|
||||
<h5 style="font-family: Montserrat, sans-serif !important; color: #000 !important; font-weight: bold;"> |
|
||||
Manufacturing</h5> |
|
||||
<p style="font-family: Montserrat, sans-serif !important; font-size: 0.9rem !important;"> |
|
||||
Plan, track and schedule your operations</p> |
|
||||
</div> |
|
||||
</div> |
|
||||
<div class="col-lg-3"> |
|
||||
<div class="my-4 d-flex flex-column justify-content-center" |
|
||||
style="background-color: #f6f8f9 !important; border-radius: 0px; padding: 2rem !important; height: 250px !important;"> |
|
||||
<img src="assets/icons/ecom-black.png" |
|
||||
class="img-responsive mb-3" height="48px" width="48px"> |
|
||||
<h5 style="font-family: Montserrat, sans-serif !important; color: #000 !important; font-weight: bold;"> |
|
||||
E-commerce & Website</h5> |
|
||||
<p style="font-family: Montserrat, sans-serif !important; font-size: 0.9rem !important;"> |
|
||||
Mobile friendly, awe-inspiring product pages</p> |
|
||||
</div> |
|
||||
</div> |
|
||||
<div class="col-lg-3"> |
|
||||
<div class="my-4 d-flex flex-column justify-content-center" |
|
||||
style="background-color: #f6f8f9 !important; border-radius: 0px; padding: 2rem !important; height: 250px !important;"> |
|
||||
<img src="assets/icons/service-black.png" |
|
||||
class="img-responsive mb-3" height="48px" width="48px"> |
|
||||
<h5 style="font-family: Montserrat, sans-serif !important; color: #000 !important; font-weight: bold;"> |
|
||||
Service Management</h5> |
|
||||
<p style="font-family: Montserrat, sans-serif !important; font-size: 0.9rem !important;"> |
|
||||
Keep track of services and invoice</p> |
|
||||
</div> |
|
||||
</div> |
|
||||
<div class="col-lg-3"> |
|
||||
<div class="my-4 d-flex flex-column justify-content-center" |
|
||||
style="background-color: #f6f8f9 !important; border-radius: 0px; padding: 2rem !important; height: 250px !important;"> |
|
||||
<img src="assets/icons/restaurant-black.png" |
|
||||
class="img-responsive mb-3" height="48px" width="48px"> |
|
||||
<h5 style="font-family: Montserrat, sans-serif !important; color: #000 !important; font-weight: bold;"> |
|
||||
Restaurant</h5> |
|
||||
<p style="font-family: Montserrat, sans-serif !important; font-size: 0.9rem !important;"> |
|
||||
Run your bar or restaurant methodically</p> |
|
||||
</div> |
|
||||
</div> |
|
||||
<div class="col-lg-3"> |
|
||||
<div class="my-4 d-flex flex-column justify-content-center" |
|
||||
style="background-color: #f6f8f9 !important; border-radius: 0px; padding: 2rem !important; height: 250px !important;"> |
|
||||
<img src="assets/icons/hotel-black.png" |
|
||||
class="img-responsive mb-3" height="48px" width="48px"> |
|
||||
<h5 style="font-family: Montserrat, sans-serif !important; color: #000 !important; font-weight: bold;"> |
|
||||
Hotel Management</h5> |
|
||||
<p style="font-family: Montserrat, sans-serif !important; font-size: 0.9rem !important;"> |
|
||||
An all-inclusive hotel management application</p> |
|
||||
</div> |
|
||||
</div> |
|
||||
</div> |
|
||||
</div> |
|
||||
<!-- END OF OUR INDUSTRIES --> |
|
||||
<!-- SUPPORT --> |
|
||||
<div class="d-flex align-items-center" |
|
||||
style="border-bottom: 2px solid #714B67; padding: 15px 0px;"> |
|
||||
<div class="d-flex justify-content-center align-items-center mr-2" |
|
||||
style="background-color: #F5F5F5; border-radius: 0px; width: 40px; height: 40px;"> |
|
||||
<img src="assets/misc/customer-support.png"/> |
|
||||
</div> |
|
||||
<h2 class="mt-2" |
|
||||
style="font-family: 'Montserrat', sans-serif; font-size: 24px; font-weight: bold;"> |
|
||||
Support</h2> |
|
||||
</div> |
|
||||
<div class="container mt-5"> |
|
||||
<div class="row"> |
|
||||
<div class="col-sm-12 col-md-6"> |
|
||||
<div style="background-color: #F6F8F9; padding: 30px; display: flex; align-items: center;"> |
|
||||
<div class="mr-4 d-flex justify-content-center align-items-center" |
|
||||
style="background-color: #714B67; display: inline-block; height: 70px; width: 70px; display: flex; align-items: center; justify-content: center;"> |
|
||||
<img src="assets/misc/support.png" height="48" width="48" |
|
||||
style="width: 42px; height: 42px;"/> |
|
||||
</div> |
|
||||
<div> |
|
||||
<h4>Need Help?</h4> |
|
||||
<p style="line-height: 100%;">Got questions or need help? |
|
||||
Get in touch.</p> |
|
||||
<a href="mailto:odoo@cybrosys.com"> |
|
||||
<p style="font-weight: 400; font-size: 28px; line-height: 80%; color: #714B67;"> |
|
||||
odoo@cybrosys.com</p> |
|
||||
</a> |
|
||||
</div> |
|
||||
</div> |
|
||||
</div> |
|
||||
<div class="col-sm-12 col-md-6"> |
|
||||
<div style="background-color: #F6F8F9; padding: 30px; display: flex; align-items: center;"> |
|
||||
<div class="mr-4 d-flex justify-content-center align-items-center" |
|
||||
style="background-color: #2AC44D; display: inline-block; height: 70px; width: 70px; display: flex; align-items: center; justify-content: center;"> |
|
||||
<img src="assets/misc/whatsapp.png" height="52" width="52" |
|
||||
style="width: 52px; height: 52px;"/> |
|
||||
</div> |
|
||||
<div> |
|
||||
<h4>WhatsApp</h4> |
|
||||
<p style="line-height: 100%;">Say hi to us on WhatsApp!</p> |
|
||||
<a href="https://api.whatsapp.com/send?phone=918606827707"> |
|
||||
<p style="font-weight: 400; font-size: 28px; line-height: 80%; color: #714B67;"> |
|
||||
+91 86068 27707</p> |
|
||||
</a> |
|
||||
</div> |
|
||||
</div> |
|
||||
</div> |
|
||||
</div> |
|
||||
<div class="row"> |
|
||||
<div class="col-sm-12 my-5 d-flex justify-content-center align-items-center"> |
|
||||
<img src="assets/misc/logo.png" width="144" height="31" |
|
||||
style="width:144px; height: 31px; margin-top: 40px;"/> |
|
||||
</div> |
|
||||
</div> |
|
||||
</div> |
|
||||
<!-- END OF SUPPORT --> |
|
@ -1,19 +0,0 @@ |
|||||
<?xml version="1.0" encoding="UTF-8" ?> |
|
||||
<odoo> |
|
||||
<!-- Values creation form--> |
|
||||
<record id="field_column_value_view_form" model="ir.ui.view"> |
|
||||
<field name="name">field.column.value.view.form</field> |
|
||||
<field name="model">field.column.value</field> |
|
||||
<field name="arch" type="xml"> |
|
||||
<form> |
|
||||
<sheet> |
|
||||
<group> |
|
||||
<field name="feed_id"/> |
|
||||
<field name="column_name"/> |
|
||||
<field name="value"/> |
|
||||
</group> |
|
||||
</sheet> |
|
||||
</form> |
|
||||
</field> |
|
||||
</record> |
|
||||
</odoo> |
|
@ -1,49 +0,0 @@ |
|||||
<?xml version="1.0" encoding="UTF-8" ?> |
|
||||
<odoo> |
|
||||
<!-- Product data feed columns form view--> |
|
||||
<record id="product_data_feed_columns_view_form" model="ir.ui.view"> |
|
||||
<field name="name">product.data.feed.columns.view.form</field> |
|
||||
<field name="model">product.data.feed.columns</field> |
|
||||
<field name="arch" type="xml"> |
|
||||
<form name="product_data_feed_columns"> |
|
||||
<sheet> |
|
||||
<label for="name"/> |
|
||||
<div class="oe_title"> |
|
||||
<h3> |
|
||||
<field name="name" required="1"/> |
|
||||
</h3> |
|
||||
</div> |
|
||||
<group name="main"> |
|
||||
<group> |
|
||||
<field name="feed_id" default="context.get('default_feed_id')"/> |
|
||||
<field name="type"/> |
|
||||
<field name="value" attrs="{'invisible':[('type', '!=', 'Text')]}"/> |
|
||||
<field name="value_id" attrs="{'invisible':[('type', '!=', 'Model Field')]}"/> |
|
||||
<field name="field_value_id" attrs="{'invisible':[('type', '!=', 'Value')]}" context="{'default_feed_id': feed_id, 'default_column_name': name, 'default_value': field_value_id}"/> |
|
||||
<field name="special_type" attrs="{'invisible':[('type', '!=', 'Special')]}"/> |
|
||||
<field name="data_feed_columns_id" invisible="1" default="context.get('default_data_feed_columns_id')"/> |
|
||||
</group> |
|
||||
</group> |
|
||||
</sheet> |
|
||||
<div class="oe_chatter"> |
|
||||
<field name="message_follower_ids"/> |
|
||||
<field name="activity_ids"/> |
|
||||
<field name="message_ids"/> |
|
||||
</div> |
|
||||
</form> |
|
||||
</field> |
|
||||
</record> |
|
||||
<!-- Product data feed column tree view--> |
|
||||
<record id="product_data_feed_columns_view_tree" model="ir.ui.view"> |
|
||||
<field name="name">product.data.feed.columns.view.tree</field> |
|
||||
<field name="model">product.data.feed.columns</field> |
|
||||
<field name="arch" type="xml"> |
|
||||
<tree> |
|
||||
<field name="name"/> |
|
||||
<field name="type"/> |
|
||||
<field name="value" string="Text Value"/> |
|
||||
<field name="field_value_id"/> |
|
||||
</tree> |
|
||||
</field> |
|
||||
</record> |
|
||||
</odoo> |
|
@ -1,111 +0,0 @@ |
|||||
<?xml version="1.0" encoding="UTF-8" ?> |
|
||||
<odoo> |
|
||||
<!-- product data feed action--> |
|
||||
<record id="product_data_feed_action" model="ir.actions.act_window"> |
|
||||
<field name="name">Data Feed</field> |
|
||||
<field name="type">ir.actions.act_window</field> |
|
||||
<field name="res_model">product.data.feed</field> |
|
||||
<field name="view_mode">tree,form</field> |
|
||||
<field name="help" type="html"> |
|
||||
<p class="oe_view_nocontent_create"> |
|
||||
Click to add the data feed details. |
|
||||
</p> |
|
||||
</field> |
|
||||
</record> |
|
||||
<!-- Product data feed form view--> |
|
||||
<record id="product_data_feed_view_form" model="ir.ui.view"> |
|
||||
<field name="name">product.data.feed.view.form</field> |
|
||||
<field name="model">product.data.feed</field> |
|
||||
<field name="arch" type="xml"> |
|
||||
<form name="product_data_feed"> |
|
||||
<header> |
|
||||
<button name="action_download_doc" type="object" |
|
||||
string="Download" class="btn-secondary" |
|
||||
attrs="{'invisible':[('feed_columns_line_ids', '=', [])]}" |
|
||||
widget="statusbar"/> |
|
||||
</header> |
|
||||
<sheet name="product_data_feed"> |
|
||||
<!--smart button action--> |
|
||||
<div name="button_box" class="oe_button_box"> |
|
||||
<button name="action_product_items" string="Items" |
|
||||
class="oe_stat_button" |
|
||||
icon="fa-cubes" type="object"/> |
|
||||
<button name="action_columns_creation" type="object" |
|
||||
class="oe_stat_button" string="Columns" |
|
||||
icon="fa-list"> |
|
||||
<field name="columns_count" readonly="True"/> |
|
||||
<span class="o_stat_text">Columns</span> |
|
||||
</button> |
|
||||
</div> |
|
||||
<div class="oe_title"> |
|
||||
<h1> |
|
||||
<field name="name" required="1" |
|
||||
placeholder="Feed Name...."/> |
|
||||
</h1> |
|
||||
</div> |
|
||||
<field name="url_link" |
|
||||
widget="CopyClipboardChar" |
|
||||
class="w-100 pb-2"/> |
|
||||
<group> |
|
||||
<group> |
|
||||
<field name="is_token" widget="boolean_toggle"/> |
|
||||
<label for="access_token" attrs="{'invisible':[('is_token', '=', False)]}"/> |
|
||||
<div class="o_row" attrs="{'invisible':[('is_token', '=', False)]}"> |
|
||||
<field name="access_token"/> |
|
||||
<button class="btn-secondary" name="action_refresh_token" icon="fa-refresh" type="object"/> |
|
||||
</div> |
|
||||
<field name="website_id"/> |
|
||||
<label for="name_show"/> |
|
||||
<div class="o_row"> |
|
||||
<field name="is_file_name" widget="boolean_toggle"/> |
|
||||
<field name="name_show" attrs="{'invisible':[('is_file_name', '=', False)]}" nolabel="1"/> |
|
||||
</div> |
|
||||
</group> |
|
||||
<group> |
|
||||
<field name="use_model" widget="radio"/> |
|
||||
<field name="used_model" invisible="1"/> |
|
||||
<field name="item_filter" widget="domain" options="{'model': 'product.template', 'in_dialog': true}" |
|
||||
attrs="{'invisible': [('use_model', '!=', 'Product')]}"/> |
|
||||
<field name="item_filter" widget="domain" options="{'model': 'product.product', 'in_dialog': true}" |
|
||||
attrs="{'invisible': [('use_model', '!=', 'Product Variant')]}"/> |
|
||||
<field name="format"/> |
|
||||
</group> |
|
||||
<notebook> |
|
||||
<page string="Columns" name="Columns"> |
|
||||
<field name="feed_columns_line_ids" readonly="1"> |
|
||||
<tree> |
|
||||
<field name="name"/> |
|
||||
</tree> |
|
||||
</field> |
|
||||
</page> |
|
||||
</notebook> |
|
||||
</group> |
|
||||
</sheet> |
|
||||
<div class="oe_chatter"> |
|
||||
<field name="message_follower_ids"/> |
|
||||
<field name="activity_ids"/> |
|
||||
<field name="message_ids"/> |
|
||||
</div> |
|
||||
</form> |
|
||||
</field> |
|
||||
</record> |
|
||||
<!-- Product data feed tree view--> |
|
||||
<record id="product_data_feed_view_tree" model="ir.ui.view"> |
|
||||
<field name="name">product.data.feed.view.tree</field> |
|
||||
<field name="model">product.data.feed</field> |
|
||||
<field name="arch" type="xml"> |
|
||||
<tree> |
|
||||
<field name="name"/> |
|
||||
<field name="used_model"/> |
|
||||
<field name="is_token"/> |
|
||||
<field name="columns_count"/> |
|
||||
</tree> |
|
||||
</field> |
|
||||
</record> |
|
||||
<!-- product data feed menu--> |
|
||||
<menuitem id="product_data_feed_menu" |
|
||||
name="Product Data Feed" |
|
||||
parent="website_sale.menu_catalog" |
|
||||
action="product_data_feed_action" |
|
||||
sequence="6"/> |
|
||||
</odoo> |
|