|
|
@ -8,7 +8,7 @@ db_port = 5432
|
|||
db_user = False
|
||||
db_password = False
|
||||
|
||||
addons_path = ext/odoo/addons,ext/3rd-party-addons,ext/custom-addons
|
||||
addons_path = ext/odoo/addons,ext/3rd-party-addons,ext/clarico-addons,ext/custom-addons
|
||||
; For enterprise use the addons path bellow
|
||||
; addons_path = ext/enterprise-addons,ext/odoo/addons,ext/3rd-party-addons,ext/custom-addons,dmi/run1
|
||||
timezone = Europe/Vienna
|
||||
|
|
|
|||
|
|
@ -0,0 +1,26 @@
|
|||
[options]
|
||||
|
||||
xmlrpc_port = 8080
|
||||
; This is the password that allows database operations:
|
||||
; admin_passwd = admin
|
||||
db_host = False
|
||||
db_port = 5432
|
||||
db_user = False
|
||||
db_password = False
|
||||
|
||||
addons_path = ext/odoo/addons,ext/custom-addons,ext/3rd-party-addons,ext/clarico-addons
|
||||
; For enterprise use the addons path bellow
|
||||
; addons_path = ext/enterprise-addons,ext/odoo/addons,ext/3rd-party-addons,ext/custom-addons,dmi/run1
|
||||
timezone = Europe/Vienna
|
||||
|
||||
#dbfilter_test = ['.*',]
|
||||
show_debug = 1
|
||||
|
||||
workers = 0
|
||||
server_wide_modules = web,base_sparse_field,queue_job
|
||||
|
||||
portal_url = https://erp.tzaustria.info
|
||||
portal_secret = secret
|
||||
|
||||
[queue_job]
|
||||
channels = root:4
|
||||
|
|
@ -1,2 +1,2 @@
|
|||
#!/usr/bin/env bash
|
||||
git-pylint-commit-hook --suppress-report --ignore=^dev --ignore=^setup --ignore=^config --ignore=^dmi --ignore=^ext/odoo --ignore=^ext/enterprise-addons --ignore=^ext/3rd-party-addons --ignore=/tests/ --always-show-violations
|
||||
git-pylint-commit-hook --suppress-report --ignore=^ext/clarico-addons --ignore=^dev --ignore=^setup --ignore=^config --ignore=^dmi --ignore=^ext/odoo --ignore=^ext/enterprise-addons --ignore=^ext/3rd-party-addons --ignore=/tests/ --always-show-violations
|
||||
|
|
|
|||
|
|
@ -0,0 +1,60 @@
|
|||
=========================================
|
||||
Multi-website support in Security Rules
|
||||
=========================================
|
||||
|
||||
Allows to use ``website_id`` (current website) in ``domain_force`` field of Record Rules (``ir.rule``), e.g.:
|
||||
|
||||
* ``[('website_ids', 'in', [website_id])]``
|
||||
* ``[('website_id', '=', website_id)]``
|
||||
|
||||
|
||||
Example of usage:
|
||||
|
||||
* Show a blog on specific websites only (TODO: add link to the module)
|
||||
* Show an event on specific websites only (TODO: add link to the module)
|
||||
* Show a product on specific websites only (TODO: add link to the module)
|
||||
|
||||
Known issues
|
||||
============
|
||||
|
||||
* This module redefines ``ir.rule`` ``_compute_domain`` base method and may be not compatible with others that redefine the method too.
|
||||
|
||||
Odoo 12.0+
|
||||
==========
|
||||
|
||||
We hope this feature will be built-in since Odoo 12.0 at least: https://github.com/odoo/odoo/pull/22743
|
||||
|
||||
Credits
|
||||
=======
|
||||
|
||||
Contributors
|
||||
------------
|
||||
* `Ivan Yelizariev <https://www.it-projects.info/team/yelizariev>`__
|
||||
* `Ildar Nasyrov <https://www.it-projects.info/team/iledarn>`__
|
||||
|
||||
Sponsors
|
||||
--------
|
||||
* `IT-Projects LLC <https://it-projects.info>`__
|
||||
|
||||
Maintainers
|
||||
-----------
|
||||
* `IT-Projects LLC <https://it-projects.info>`__
|
||||
|
||||
To get a guaranteed support you are kindly requested to purchase the module at `odoo apps store <https://apps.odoo.com/apps/modules/11.0/ir_rule_website/>`__.
|
||||
|
||||
Thank you for understanding!
|
||||
|
||||
`IT-Projects Team <https://www.it-projects.info/team>`__
|
||||
|
||||
Further information
|
||||
===================
|
||||
|
||||
Demo: http://runbot.it-projects.info/demo/access-addons/11.0
|
||||
|
||||
HTML Description: https://apps.odoo.com/apps/modules/11.0/ir_rule_website
|
||||
|
||||
Usage instructions: `<doc/index.rst>`_
|
||||
|
||||
Changelog: `<doc/changelog.rst>`_
|
||||
|
||||
Tested on Odoo 11.0 dc61861f90d15797b19f8ebddfb0c8a66d0afa88
|
||||
|
|
@ -0,0 +1 @@
|
|||
from . import models
|
||||
|
|
@ -0,0 +1,37 @@
|
|||
{
|
||||
"name": """Multi-website support in Security Rules""",
|
||||
"summary": """Provide access depending on current website""",
|
||||
"category": "Access",
|
||||
# "live_test_url": "",
|
||||
"images": [],
|
||||
"version": "11.0.1.1.0",
|
||||
"application": False,
|
||||
|
||||
"author": "IT-Projects LLC, Ildar Nasyrov",
|
||||
"support": "apps@it-projects.info",
|
||||
"website": "https://it-projects.info/team/iledarn",
|
||||
"license": "LGPL-3",
|
||||
"price": 20.00,
|
||||
"currency": "EUR",
|
||||
|
||||
""
|
||||
"depends": [
|
||||
"base",
|
||||
],
|
||||
"external_dependencies": {"python": [], "bin": []},
|
||||
"data": [
|
||||
"views/ir_rule_views.xml",
|
||||
],
|
||||
"qweb": [
|
||||
],
|
||||
"demo": [
|
||||
],
|
||||
|
||||
"post_load": None,
|
||||
"pre_init_hook": None,
|
||||
"post_init_hook": None,
|
||||
"uninstall_hook": None,
|
||||
|
||||
"auto_install": False,
|
||||
"installable": True,
|
||||
}
|
||||
|
|
@ -0,0 +1,9 @@
|
|||
`1.1.0`
|
||||
-------
|
||||
|
||||
[ADD] - New setting in ``ir.rule`` model - to bypass website rules when working from backend
|
||||
|
||||
`1.0.0`
|
||||
-------
|
||||
|
||||
- Init version
|
||||
|
|
@ -0,0 +1,54 @@
|
|||
=========================================
|
||||
Multi-website support in Security Rules
|
||||
=========================================
|
||||
|
||||
Installation
|
||||
============
|
||||
|
||||
* `Install <https://odoo-development.readthedocs.io/en/latest/odoo/usage/install-module.html>`__ this module in a usual way
|
||||
|
||||
Configuration
|
||||
=============
|
||||
|
||||
* There is a new setting in each rule now - it is relevant only for website rules with special ``website_id`` parameter in them
|
||||
* As usual open ``[[ Settings ]] >> Technical >> Security >> Record Rules`` to create a new rule or edit existing one
|
||||
* You should see on rule form a new group named ``Multi-website extension`` with the ``Backend behaviour`` setting in it
|
||||
* Leave this field empty if your rule has nothing to do with websites
|
||||
* Select ``Grant access`` if you want to give access to model from backend, or ``Deny access`` - if you want to restrict
|
||||
* Note: if you leave this fields empty for a rule that is using ``website_id`` parameter - you may have this kind of error when trying to configure your product's **website_ids** field from odoo backend:
|
||||
|
||||
::
|
||||
|
||||
The requested operation cannot be completed due to security restrictions. Please contact your system administrator.
|
||||
|
||||
(Document type: product.template, Operation: read)
|
||||
|
||||
from web-interface, or
|
||||
|
||||
::
|
||||
|
||||
INFO rw odoo.models: The requested operation cannot be completed due to record rules: Document type: product.template, Operation: read, Records: 47, User: 5
|
||||
|
||||
in odoo logs
|
||||
|
||||
This is so because in backend rules work in non-website context.
|
||||
In other words the setting is mandatory for website rules.
|
||||
|
||||
|
||||
Usage
|
||||
=====
|
||||
|
||||
* If you have a model accessible through a website (by means of controller methods) - specify this module into the "depends" section of your manifest file
|
||||
* Now you can create security rules using `website_id` in `domain_force` fields. For example,
|
||||
|
||||
::
|
||||
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<odoo>
|
||||
<record id="blog_rule_all" model="ir.rule">
|
||||
<field name="name">Blogs available only for specifed websites</field>
|
||||
<field name="model_id" ref="model_blog_blog"/>
|
||||
<field name="domain_force">[('website_ids', 'in', [website_id])]</field>
|
||||
<field name="backend_behaviour">true</field>
|
||||
</record>
|
||||
</odoo>
|
||||
|
|
@ -0,0 +1 @@
|
|||
from . import ir_rule
|
||||
|
|
@ -0,0 +1,67 @@
|
|||
|
||||
from odoo import api, fields, models, tools, SUPERUSER_ID
|
||||
from odoo.osv import expression
|
||||
from odoo.tools.safe_eval import safe_eval
|
||||
|
||||
|
||||
class IrRule(models.Model):
|
||||
_inherit = 'ir.rule'
|
||||
|
||||
backend_behaviour = fields.Selection([
|
||||
("true", "Grant access"),
|
||||
("false", "Deny access"),
|
||||
], string='Backend behaviour',
|
||||
help="""This is bypass for main rule definition.
|
||||
When working from backend there is usually no 'website_id' value in the rule evaluation context
|
||||
and rules that using 'website_id' evaluated as False which is not always desirable""")
|
||||
|
||||
@api.model
|
||||
def _eval_context(self):
|
||||
context = super(IrRule, self)._eval_context()
|
||||
context['website_id'] = self._context.get('website_id')
|
||||
return context
|
||||
|
||||
@api.model
|
||||
@tools.ormcache_context('self._uid', 'model_name', 'mode', keys=["website_id"])
|
||||
def _compute_domain(self, model_name, mode="read"):
|
||||
if mode not in self._MODES:
|
||||
raise ValueError('Invalid mode: %r' % (mode,))
|
||||
|
||||
if self._uid == SUPERUSER_ID:
|
||||
return None
|
||||
|
||||
query = """ SELECT r.id FROM ir_rule r JOIN ir_model m ON (r.model_id=m.id)
|
||||
WHERE m.model=%s AND r.active AND r.perm_{mode}
|
||||
AND (r.id IN (SELECT rule_group_id FROM rule_group_rel rg
|
||||
JOIN res_groups_users_rel gu ON (rg.group_id=gu.gid)
|
||||
WHERE gu.uid=%s)
|
||||
OR r.global)
|
||||
""".format(mode=mode)
|
||||
self._cr.execute(query, (model_name, self._uid))
|
||||
rule_ids = [row[0] for row in self._cr.fetchall()]
|
||||
if not rule_ids:
|
||||
return []
|
||||
|
||||
# browse user and rules as SUPERUSER_ID to avoid access errors!
|
||||
eval_context = self._eval_context()
|
||||
user_groups = self.env.user.groups_id
|
||||
global_domains = [] # list of domains
|
||||
group_domains = [] # list of domains
|
||||
for rule in self.browse(rule_ids).sudo():
|
||||
# BEGIN redefined part of original _compute_domain of odoo/base/addons/ir/ir_rule.
|
||||
# have to redefine all method to take in account new ir.rule ``backend_behaviour`` setting
|
||||
dom = []
|
||||
if not eval_context.get('website_id') and rule.backend_behaviour:
|
||||
dom = [(1, '=', 1)] if rule.backend_behaviour == 'true' else [(0, '=', 1)]
|
||||
else:
|
||||
# evaluate the domain for the current user
|
||||
dom = safe_eval(rule.domain_force, eval_context) if rule.domain_force else []
|
||||
dom = expression.normalize_domain(dom)
|
||||
# END redefined part of original _compute_domain
|
||||
if not rule.groups:
|
||||
global_domains.append(dom)
|
||||
elif rule.groups & user_groups:
|
||||
group_domains.append(dom)
|
||||
|
||||
# combine global domains and group domains
|
||||
return expression.AND(global_domains + [expression.OR(group_domains)])
|
||||
|
After Width: | Height: | Size: 3.0 KiB |
|
|
@ -0,0 +1,89 @@
|
|||
<section class="oe_container">
|
||||
<div class="oe_row oe_spaced">
|
||||
<div class="oe_span12">
|
||||
<h2 class="oe_slogan" style="color:#875A7B;">Multi-website support in Security Rules</h2>
|
||||
<h3 class="oe_slogan">Make website-dependent access to pages, products, etc.</h3>
|
||||
</div>
|
||||
</div>
|
||||
</section>
|
||||
|
||||
<section class="oe_container">
|
||||
<div class="oe_row oe_spaced">
|
||||
<div class="oe_span12">
|
||||
|
||||
<div class="alert alert-info oe_mt32" style="padding:0.3em 0.6em; font-size: 150%;">
|
||||
<i class="fa fa-hand-o-right"></i><b> Technical module that allows implementing different features. For example: </b>
|
||||
<ul class="list-unstyled">
|
||||
|
||||
<li>
|
||||
<i class="fa fa-check-square-o text-primary"></i>
|
||||
Show a blog on specific websites only
|
||||
</li>
|
||||
|
||||
<li>
|
||||
<i class="fa fa-check-square-o text-primary"></i>
|
||||
Show an event on specific websites only
|
||||
</li>
|
||||
|
||||
<li>
|
||||
<i class="fa fa-check-square-o text-primary"></i>
|
||||
Show a product on specific websites only
|
||||
</li>
|
||||
|
||||
</ul>
|
||||
</div>
|
||||
|
||||
</div>
|
||||
</div>
|
||||
</section>
|
||||
|
||||
<section class="oe_container">
|
||||
<div class="oe_row oe_spaced">
|
||||
<div class="oe_span8">
|
||||
<h2>Need our service?</h2>
|
||||
<p class="oe_mt32">Contact us by <a href="mailto:apps@it-projects.info">email</a> or fill out <a href="https://www.it-projects.info/page/website.contactus " target="_blank">request form</a></p>
|
||||
<ul>
|
||||
<li><a href="mailto:apps@it-projects.info">apps@it-projects.info <i class="fa fa-envelope-o"></i></a></li>
|
||||
<li><a href="https://www.it-projects.info/page/website.contactus " target="_blank">https://www.it-projects.info/page/website.contactus <i class="fa fa-list-alt"></i></a></li>
|
||||
</ul>
|
||||
</div>
|
||||
<div class="oe_span4">
|
||||
<div class="stamp" style="width:200px;">
|
||||
<div style="margin-top: 15px;
|
||||
position: relative;
|
||||
font-family:'Vollkorn', serif;
|
||||
font-size: 16px;
|
||||
line-height: 25px;
|
||||
text-transform: uppercase;
|
||||
font-weight: bold;
|
||||
color: #75526b;
|
||||
border: 3px dashed #75526b;
|
||||
float: left;
|
||||
padding: 4px 12px;
|
||||
-webkit-transform: rotate(-1deg);
|
||||
-o-transform: rotate(-1deg);
|
||||
-moz-transform: rotate(-1deg);
|
||||
-ms-transform: rotate(-1deg);">
|
||||
Tested on Odoo<br/>11.0 community
|
||||
</div>
|
||||
<!--<div style="margin-top: 15px;
|
||||
position: relative;
|
||||
font-family:'Vollkorn', serif;
|
||||
font-size: 16px;
|
||||
line-height: 25px;
|
||||
text-transform: uppercase;
|
||||
font-weight: bold;
|
||||
color: #75526b;
|
||||
border: 3px dashed #75526b;
|
||||
float: left;
|
||||
padding: 4px 12px;
|
||||
-webkit-transform: rotate(6deg);
|
||||
-o-transform: rotate(6deg);
|
||||
-moz-transform: rotate(6deg);
|
||||
-ms-transform: rotate(6deg);">
|
||||
Tested on Odoo<br/>11.0 enterprise
|
||||
</div>-->
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</section>
|
||||
|
|
@ -0,0 +1 @@
|
|||
from . import test_compute_domain
|
||||
|
|
@ -0,0 +1,22 @@
|
|||
from openerp.tests.common import TransactionCase
|
||||
|
||||
|
||||
class TestComputeDomain(TransactionCase):
|
||||
at_install = True
|
||||
post_install = True
|
||||
|
||||
def setUp(self):
|
||||
super(TestComputeDomain, self).setUp()
|
||||
self.demo_user = self.env.ref('base.user_demo')
|
||||
self.env['ir.rule'].create({'name': 'test ir_rule_website',
|
||||
'model_id': self.env.ref('base.model_res_partner').id,
|
||||
'domain_force': "[('parent_id', 'in', [website_id])]"})
|
||||
|
||||
def _cached_compute_domain(self, website_id):
|
||||
test_domain = ('parent_id', 'in', [website_id])
|
||||
domain = self.env['ir.rule'].sudo(user=self.demo_user.id).with_context(website_id=website_id)._compute_domain('res.partner')
|
||||
self.assertTrue(test_domain in domain)
|
||||
|
||||
def test_cache(self):
|
||||
self._cached_compute_domain(1)
|
||||
self._cached_compute_domain(2)
|
||||
|
|
@ -0,0 +1,15 @@
|
|||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<odoo>
|
||||
<record id="view_rule_form_inherit_ir_rule_website" model="ir.ui.view">
|
||||
<field name="name">ir.rule.form.inherit.ir_rule_website</field>
|
||||
<field name="model">ir.rule</field>
|
||||
<field name="inherit_id" ref="base.view_rule_form"/>
|
||||
<field name="arch" type="xml">
|
||||
<xpath expr="//field[@name='domain_force']" position="after">
|
||||
<group string="Multi-website extension">
|
||||
<field name="backend_behaviour"/>
|
||||
</group>
|
||||
</xpath>
|
||||
</field>
|
||||
</record>
|
||||
</odoo>
|
||||
|
|
@ -0,0 +1 @@
|
|||
*.pyc
|
||||
|
|
@ -0,0 +1,398 @@
|
|||
SOFTWARE LICENCE AGREEMENT
|
||||
==========================
|
||||
|
||||
This AGREEMENT is made effective on the date of the purchase of the software
|
||||
between Webkul Software Pvt. Ltd.,Company incorporated under the Companies
|
||||
Act, 1956 (hereinafter referred to as “Licensor"), and the purchaser of the
|
||||
software/ product (hereinafter referred to as "Licensee").
|
||||
|
||||
|
||||
Preamble
|
||||
--------
|
||||
|
||||
Licensor is a web and mobile product based organization engaged in the
|
||||
business of developing and marketing software for enterprise level e-commerce
|
||||
businesses. It is an ISO and NSR (NASSCOM) certified organization having a
|
||||
team of more than 150 creative engineers which come from different
|
||||
backgrounds. It has developed more than 700 web extensions and apps in the
|
||||
past few years for open source platforms which are used and trusted globally.
|
||||
Licensee now wishes to obtain license, and Licensor wishes to grant a license,
|
||||
to allow use of the software so purchased in developing the e-commerce
|
||||
business website/ mobile app of the Licensee, subject to the terms and
|
||||
conditions set forth herein.
|
||||
|
||||
THEREFORE, with the intent to be legally bound, the parties hereby agree as
|
||||
follows:
|
||||
|
||||
|
||||
Agreement
|
||||
---------
|
||||
|
||||
1.DEFINITIONS.
|
||||
As used in this Agreement, the following capitalized terms
|
||||
shall have the definitions set forth below:
|
||||
|
||||
"Derivative Works" are works developed by Licensee, its officers, agents,
|
||||
contractors or employees, which are based upon, in whole or in part, the
|
||||
Source Code and/or the Documentation and may also be based upon and/or
|
||||
incorporate one or more other preexisting works of the Licensor. Derivative
|
||||
Works may be any improvement, revision, modification, translation (including
|
||||
compilation or recapitulation by computer), abridgment, condensation,
|
||||
expansion, or any other form in which such a preexisting work may be recast,
|
||||
transformed, or adapted. For purposes hereof, a Derivative Work shall also
|
||||
include any compilation that incorporates such a preexisting work.
|
||||
|
||||
"Documentation" is written, printed or otherwise recorded or stored (digital
|
||||
or paper) material relating to the Software and/or Source Code, including
|
||||
technical specifications and instructions for its use including Software/
|
||||
Source Code annotations and other descriptions of the principles of its
|
||||
operation and instructions for its use.
|
||||
|
||||
"Improvements" shall mean, with respect to the Software, all modifications and
|
||||
changes made, developed, acquired or conceived after the date hereof and
|
||||
during the entire term of this Agreement.
|
||||
|
||||
"Source Code" is the computer programming source code form of the Software in
|
||||
the form maintained by the Licensor, and includes all non-third-party
|
||||
executables, libraries, components, and Documentation created or used in the
|
||||
creation, development, maintenance, and support of the Software as well as all
|
||||
updates, error corrections and revisions thereto provided by Licensor, in
|
||||
whole or in part.
|
||||
|
||||
|
||||
2.SOFTWARE LICENSE.
|
||||
|
||||
(a)Grant of License. For the consideration set forth below, Licensor hereby
|
||||
grants to Licensee, and Licensee hereby accepts the worldwide, non-exclusive,
|
||||
perpetual, royalty-free rights and licenses set forth below:
|
||||
|
||||
(i)The right and license to use and incorporate the software, in whole or in
|
||||
part, to develop its website/ mobile app (including the integration of all or
|
||||
part of the Licensor’s software into Licensee's own software) on one domain (
|
||||
Except Joomla modules , listed on store are entitled to be used on unlimited
|
||||
domain as per the standard guidelines ) only, solely for the own personal or
|
||||
business use of the Licensee. However, the License does not authorize the
|
||||
Licensee to compile, copy or distribute the said Software or its Derivative
|
||||
Works.
|
||||
|
||||
(ii)The right and license does not authorize the Licensee to share any backup
|
||||
or archival copies of the Software and / or the Source Code and Documentation
|
||||
on any public internet space including github , stackoverflow etc . The
|
||||
Licensee must ensure that the backup are not accessible to any other person
|
||||
and the Licensee must prevent copying / use of source code by any unauthorized
|
||||
persons.
|
||||
|
||||
(iii)The right and license does not authorize the Licensee to migrate the
|
||||
domain license to another domain.
|
||||
|
||||
(iv)Our Joomla extensions are published under the GNU/GPL.
|
||||
|
||||
|
||||
(b)Scope; Rights and Responsibilities.
|
||||
|
||||
(i)Licensor shall enable the Licensee to download one complete copy of the
|
||||
Software.
|
||||
|
||||
(ii)The Software is intended for the sole use of the Licensee in development
|
||||
of its own website/ mobile app.
|
||||
|
||||
(iii)Licensee does not have the right to hand over, sell, distribute,
|
||||
sub-license, rent, lease or lend any portion of the Software or Documentation,
|
||||
whether modified or unmodified, to anyone. Licensee should not place the
|
||||
Software on a server so that it becomes accessible via a public network such
|
||||
as the Internet for distribution purposes. In case the Licensee is using any
|
||||
source code management system like github, it can use the code there only when
|
||||
it has paid subscription from such management system.
|
||||
|
||||
(iv) In case the Licensee purchases the module and allow the third party
|
||||
development agency to customize as per its need, it is at liberty to do so
|
||||
subject to the condition that the Licensee as well as the Agency are not
|
||||
authorized to sell the modified version of the extension. Except for the
|
||||
required customization purposes, Licensee is not authorized to release the
|
||||
Source Code, Derivative Work source code and/or Documentation to any third
|
||||
party, which shall be considered as violation of the Agreement, inter-alia
|
||||
entailing forthwith termination and legal action.
|
||||
|
||||
|
||||
(c)Ownership.
|
||||
|
||||
(i)Software and Source Code. All right, title, copyright, and interest in the
|
||||
Software, Source Code, Software Modifications and Error corrections will be
|
||||
and remain the property of Licensor.
|
||||
|
||||
(ii)Derivative Works. As creation of Derivative Works by the Licensee is
|
||||
prohibited, thus, all right, title, copyright, and interest in any and/or all
|
||||
Derivative Works and Improvements created by, or on behalf of, Licensee will
|
||||
also be deemed to the property of Licensor. Licensor shall be entitled to
|
||||
protect copyright / intellectual property in all such Derivative Works and
|
||||
Improvements also in any country as it may deem fit including without
|
||||
limitation seeking copyright and/or patent protection.
|
||||
|
||||
|
||||
3.CONSIDERATION.
|
||||
|
||||
(a)Licensee shall pay to Licensor the amount as mentioned on the website from
|
||||
where the order is placed, as one-time, upfront fees in consideration for the
|
||||
licenses and rights granted hereunder (hereinafter referred to as the "License
|
||||
Fee"). The License Fee to be paid by Licensee shall be paid upfront at the
|
||||
time of placing the order, and no credit will be allowed under any
|
||||
circumstances.
|
||||
|
||||
(b)Once paid, the License Fees shall be non-refundable. The Licensee has fully
|
||||
satisfied itself about the Software and has seen the demonstration, and only
|
||||
thereafter has placed the order. Thus, the License Fees or any part thereof is
|
||||
non-refundable. No claim for refund of the Licence Fees shall be entertained
|
||||
under any circumstances.
|
||||
|
||||
|
||||
4.REPRESENTATIONS AND WARRANTIES.
|
||||
|
||||
(a)Mutual. Each of the parties represents and warrants to the other as
|
||||
follows.
|
||||
|
||||
(i)such party is a legal entity duly organized, validly existing and in good
|
||||
standing;
|
||||
|
||||
(ii)such party has the power and authority to conduct its business as
|
||||
presently conducted and to enter into, execute, deliver and perform this
|
||||
Agreement.
|
||||
|
||||
(iii)This Agreement has been duly and validly accepted by such party and
|
||||
constitutes the legal, valid and binding obligations of such party
|
||||
respectively, enforceable against such party in accordance with their
|
||||
respective terms;
|
||||
|
||||
(iv)the acceptance, execution, delivery and performance of this Agreement does
|
||||
not and will not violate such party's charter or by-laws; nor require any
|
||||
consent, authorization, approval, exemption or other action by any third party
|
||||
or governmental entity.
|
||||
|
||||
|
||||
(b)Licensor warrants that, at the time of purchase of the Software:
|
||||
|
||||
the Software will function materially as set forth in the website or published
|
||||
functionality provided by Licensor to customers and potential customers
|
||||
describing the Software; and
|
||||
|
||||
Software add-ons, if purchased by the Licensee from the Licensor, will not
|
||||
materially diminish the features or functions of or the specifications of the
|
||||
Software as they existed as of the execution of this Agreement.
|
||||
|
||||
|
||||
(c)Title. Licensor represents and warrants that it is the exclusive owner of
|
||||
all copyright/ intellectual property in the Software (including the Source
|
||||
Code) and has good and marketable title to the Software (including the Source
|
||||
Code) free and clear of all liens, claims and encumbrances of any nature
|
||||
whatsoever (collectively, "Liens"). Licensor's grant of license and rights to
|
||||
Licensee hereunder does not, and will not infringe any third party's property,
|
||||
intellectual property or personal rights.
|
||||
|
||||
|
||||
5.TERM.
|
||||
|
||||
(a)Subject to Licensee's payment obligations, this Agreement shall commence as
|
||||
on the date of making payment of the Software by the Licensee to the Licensor,
|
||||
and shall continue until terminated by either party.
|
||||
|
||||
(b)The Licensor retains the right to terminate the license at any time, if the
|
||||
Licensee is not abiding by any of the terms of the Agreement. The Licensee may
|
||||
terminate the Agreement at any time at its own discretion by uninstalling the
|
||||
Software and /or by destroying the said Software (or any copies thereof).
|
||||
However, the Licensee shall not be entitled to seek any refund of the amount
|
||||
paid by it to the Licensor, under any circumstances.
|
||||
|
||||
(c)Survival. In the event this Agreement is terminated for any reason, the
|
||||
provisions set forth in Sections 2(a), 2(b), and 2(c) shall survive.
|
||||
|
||||
|
||||
6.INDEMNIFICATION.
|
||||
|
||||
The Licensee release the Licensor from, and agree to indemnify, defend and
|
||||
hold harmless the Licensor (and its officers, directors, employees, agents and
|
||||
Affiliates) against, any claim, loss, damage, settlement, cost, taxes, expense
|
||||
or other liability (including, without limitation, attorneys' fees) (each, a
|
||||
"Claim") arising from or related to: (a) any actual or alleged breach of any
|
||||
obligations in this Agreement; (b) any refund, adjustment, or return of
|
||||
Software,(c) any claim for actual or alleged infringement of any Intellectual
|
||||
Property Rights made by any third party or damages related thereto; or (d)
|
||||
Taxes.
|
||||
|
||||
|
||||
7.LIMITATION OF LIABILITY.
|
||||
|
||||
The Licensor will not be liable for any direct, indirect, incidental, special,
|
||||
consequential or exemplary damages, including but not limited to, damages for
|
||||
loss of profits, goodwill, use, data or other intangible losses arising out of
|
||||
or in connection with the Software, whether in contract, warranty, tort etc. (
|
||||
including negligence, software liability, any type of civil responsibility or
|
||||
other theory or otherwise) to the Licensee or any other person for cost of
|
||||
software, cover, recovery or recoupment of any investment made by the Licensee
|
||||
or its affiliates in connection with this Agreement, or for any other loss of
|
||||
profit, revenue, business, or data or punitive or consequential damages
|
||||
arising out of or relating to this Agreement. Further, the aggregate liability
|
||||
of the Licensor, arising out of or in connection with this Agreement or the
|
||||
transactions contemplated hereby will not exceed at any time, or under any
|
||||
circumstances, the total amounts received by the Licensor from the Licensee in
|
||||
connection with the particular software giving rise to the claim.
|
||||
|
||||
|
||||
8.FORCE MAJEURE.
|
||||
|
||||
The Licensor will not be liable for any delay or failure to perform any of its
|
||||
obligations under this Agreement by reasons, events or other matters beyond
|
||||
its reasonable control.
|
||||
|
||||
|
||||
9.RELATIONSHIP OF PARTIES.
|
||||
|
||||
The Licensor and Licensee are independent legal entities, and nothing in this
|
||||
Agreement will be construed to create a partnership, joint venture,
|
||||
association of persons, agency, franchise, sales representative, or employment
|
||||
relationship between the parties. The Licensee will have no authority to make
|
||||
or accept any offers or representations on behalf of the Licensor. The
|
||||
relationship between the parties is that of Licensor and Licensee only, and
|
||||
the rights, duties, liabilities of each party shall be governed by this
|
||||
Agreement.
|
||||
|
||||
|
||||
10.MODIFICATION.
|
||||
|
||||
The Licensor may amend any of the terms and conditions contained in this
|
||||
Agreement at any time and solely at its discretion. Any changes will be
|
||||
effective upon the posting of such changes on the Portal/ website, and the
|
||||
Licensee is responsible for reviewing these changes and informing itself of
|
||||
all applicable changes or notices. The continued use of a software by the
|
||||
Licensee after posting of any changes by the Licensor, will constitute the
|
||||
acceptance of such changes or modifications by the Licensee.
|
||||
|
||||
|
||||
11.MISCELLANEOUS.
|
||||
|
||||
(a)General Provisions. This Agreement: (i) may be amended only by a writing
|
||||
signed by each of the parties; (ii) may be executed in several counterparts,
|
||||
each of which shall be deemed an original but all of which shall constitute
|
||||
one and the same instrument; (iii) contains the entire agreement of the
|
||||
parties with respect to the transactions contemplated hereby and supersedes
|
||||
all prior written and oral agreements, and all contemporaneous oral
|
||||
agreements, relating to such transactions; (iv) shall be governed by, and
|
||||
construed and enforced in accordance with, the laws of India; and (v) shall be
|
||||
binding upon, and inure to the benefit of, the parties and their respective
|
||||
successors and permitted assigns. Each of the parties hereby irrevocably
|
||||
submits to the jurisdiction of the Courts at Delhi, India, for the purposes of
|
||||
any action or proceeding arising out of or relating to this Agreement or the
|
||||
subject matter hereof and brought by any other party.
|
||||
|
||||
(b)Assignment. Except for the purpose of customization as mentioned in clause
|
||||
2(b)(iv) above, Licensee cannot assign, pledge or otherwise transfer, whether
|
||||
by operation of law or otherwise, this Agreement, or any of its obligations
|
||||
hereunder, without the prior written consent of Licensor, which consent shall
|
||||
not be unreasonably withheld.
|
||||
|
||||
(c)Notices. Unless otherwise specifically provided herein, all notices,
|
||||
consents, requests, demands and other communications required or permitted
|
||||
hereunder:
|
||||
|
||||
(i)shall be in writing;
|
||||
|
||||
(ii)shall be sent by messenger, certified or registered mail/email, or
|
||||
reliable express delivery service, to the appropriate address(es) set forth
|
||||
below; and
|
||||
|
||||
(iii)shall be deemed to have been given on the date of receipt by the
|
||||
addressee, as evidenced by a receipt executed by the addressee (or a
|
||||
responsible person in his or her office), the records of the Party delivering
|
||||
such communication or a notice to the effect that such addressee refused to
|
||||
claim or accept such communication, if sent by messenger, mail or express
|
||||
delivery service.
|
||||
|
||||
All such communications shall be sent to the following addresses or numbers,
|
||||
or to such other addresses or numbers as any party may inform the others by
|
||||
giving five days' prior notice:
|
||||
|
||||
If to Webkul Software Pvt. Ltd.:
|
||||
|
||||
Webkul Software Pvt. Ltd.
|
||||
A-67, Sector 63, NOIDA – 201301,
|
||||
Uttar Pradesh, India
|
||||
|
||||
If to Licensee:
|
||||
At the address mentioned by the Licensee
|
||||
(at the time of placing order of generating Invoice)
|
||||
|
||||
(d)Severability. It is the intent of the parties that the provisions of this
|
||||
Agreement be enforced to the fullest extent permissible under the laws and
|
||||
public policies of India in which enforcement hereof is sought. In
|
||||
furtherance of the foregoing, each provision hereof shall be severable from
|
||||
each other provision, and any provision hereof which is/ becomes unenforceable
|
||||
shall be subject to the following: (i) if such provision is contrary to or
|
||||
conflicts with any requirement of any statute, rule or regulation in effect,
|
||||
then such requirement shall be incorporated into, or substituted for, such
|
||||
unenforceable provision to the minimum extent necessary to make such provision
|
||||
enforceable; (ii) the court, agency or arbitrator considering the matter is
|
||||
hereby authorized to (or, if such court, agency or arbitrator is unwilling or
|
||||
fails to do so, then the parties shall) amend such provision to the minimum
|
||||
extent necessary to make such provision enforceable, and the parties hereby
|
||||
consent to the entry of an order so amending such provision; and (iii) if
|
||||
any such provision cannot be or is not reformed and made enforceable pursuant
|
||||
to clause (i) or (ii) above, then such provision shall be ineffective to the
|
||||
minimum extent necessary to make the remainder of this Agreement enforceable.
|
||||
Any application of the foregoing provisions to any provision hereof shall not
|
||||
effect the validity or enforceability of any other provision hereof.
|
||||
|
||||
(e)By purchasing the Software, the Licensee acknowledge that it has read this
|
||||
Agreement, and that it agrees to the content of the Agreement, its terms and
|
||||
agree to use the Software in compliance with this Agreement.
|
||||
|
||||
(f)The Licensor holds the sole copyright of the Software. The Software or any
|
||||
portion thereof is a copyrightable matter and is liable to be protected by the
|
||||
applicable laws. Copyright infringement in any manner can lead to prosecution
|
||||
according to the current law. The Licensor reserves the right to revoke the
|
||||
license of any user who is not holding any license or is holding an invalid
|
||||
license.
|
||||
|
||||
(g)This Agreement gives the right to use only one copy of the Software on one
|
||||
domain solely for the own personal or business use of the Licensee, subject to
|
||||
all the terms and conditions of this Agreement. A separate License has to be
|
||||
purchased for each new Software installation. Any distribution of the Software
|
||||
without the written consent of the Licensor (including non-commercial
|
||||
distribution) is regarded as violation of this Agreement, and will entail
|
||||
immediate termination of the Agreement and may invite liability, both civil
|
||||
and criminal, as per applicable laws.
|
||||
|
||||
(h)The Licensor reserves the rights to publish a selected list of users/
|
||||
Licensees of its Software, and no permission of any Licensee is needed in this
|
||||
regard. The Licensee agrees that the Licensor may, in its sole discretion,
|
||||
disclose or make available any information provided or submitted by the
|
||||
Licensee or related to it under this Agreement to any judicial,
|
||||
quasi-judicial, governmental, regulatory or any other authority as may be
|
||||
required by the Licensor to co-operate and / or comply with any of their
|
||||
orders, instructions or directions or to fulfill any requirements under
|
||||
applicable Laws.
|
||||
|
||||
(i)If the Licensee continues to use the Software even after the sending of the
|
||||
notice by the Licensor for termination, the Licensee agree to accept an
|
||||
injunction to restrain itself from its further use, and to pay all costs (
|
||||
including but not limited to reasonable attorney fees) to enforce injunction
|
||||
or to revoke the License, and any damages suffered by the Licensor because of
|
||||
the misuse of the Software by the Licensee.
|
||||
|
||||
|
||||
12.ARBITRATION.
|
||||
|
||||
If any dispute arises between the Licensor and the Licensee at any time, in
|
||||
connection with the validity, interpretation, implementation or alleged breach
|
||||
of any provision of this Agreement, the same shall be referred to a sole
|
||||
Arbitrator who shall be an independent and neutral third party appointed
|
||||
exclusively by the Licensor. The Licensee shall not object to the appointment
|
||||
of the Arbitrator so appointed by the Licensor. The place of arbitration shall
|
||||
be Delhi, India. The Arbitration & Conciliation Act, 1996 as amended by The
|
||||
Arbitration & Conciliation (Amendment) Act, 2015, shall govern the
|
||||
arbitration proceedings. The arbitration proceedings shall be held in the
|
||||
English language.
|
||||
|
||||
|
||||
This document is an electronic record in terms of Information Technology Act,
|
||||
2000 and the amended provisions pertaining to electronic records in various
|
||||
statutes as amended by the Information Technology Act, 2000. This electronic
|
||||
record is generated by a computer system and does not require any physical or
|
||||
digital signatures.
|
||||
|
|
@ -0,0 +1,16 @@
|
|||
# -*- coding: utf-8 -*-
|
||||
#################################################################################
|
||||
#
|
||||
# Copyright (c) 2015-Present Webkul Software Pvt. Ltd. (<https://webkul.com/>)
|
||||
#
|
||||
#################################################################################
|
||||
from . import models
|
||||
from . import controllers
|
||||
|
||||
def pre_init_check(cr):
|
||||
from odoo.service import common
|
||||
from odoo.exceptions import Warning
|
||||
version_info = common.exp_version()
|
||||
server_serie =version_info.get('server_serie')
|
||||
if server_serie!='11.0':raise Warning('Module support Odoo series 11.0 found {}.'.format(server_serie))
|
||||
return True
|
||||
|
|
@ -0,0 +1,51 @@
|
|||
# -*- coding: utf-8 -*-
|
||||
#################################################################################
|
||||
# Author : Webkul Software Pvt. Ltd. (<https://webkul.com/>)
|
||||
# Copyright(c): 2015-Present Webkul Software Pvt. Ltd.
|
||||
# All Rights Reserved.
|
||||
#
|
||||
#
|
||||
#
|
||||
# This program is copyright property of the author mentioned above.
|
||||
# You can`t redistribute it and/or modify it.
|
||||
#
|
||||
#
|
||||
# You should have received a copy of the License along with this program.
|
||||
# If not, see <https://store.webkul.com/license.html/>
|
||||
#################################################################################
|
||||
{
|
||||
"name" : "Mobikul: Mobile App Builder",
|
||||
"summary" : "This module allows you to convert your shop sales very easily with a native mobile application.",
|
||||
"category" : "Sales",
|
||||
"version" : "1.2.0",
|
||||
"sequence" : 1,
|
||||
"author" : "Webkul Software Pvt. Ltd.",
|
||||
"license" : "Other proprietary",
|
||||
"website" : "",
|
||||
"description" : """""",
|
||||
"live_test_url" : "http://demo.webkul.com/web/login",
|
||||
"depends" : [
|
||||
'website_sale'],
|
||||
"data" : [
|
||||
'security/mobikul_security.xml',
|
||||
'security/ir.model.access.csv',
|
||||
'data/mobikul_data.xml',
|
||||
'views/product_view.xml',
|
||||
'views/order_view.xml',
|
||||
'views/mobikul_views.xml',
|
||||
'views/res_config_view.xml',
|
||||
'views/menus.xml',
|
||||
'views/sync_cat_view.xml',
|
||||
|
||||
],
|
||||
"demo" : ['data/demo_data_view.xml'],
|
||||
"css" : [],
|
||||
"js" : [],
|
||||
"images" : ['static/description/Banner.png'],
|
||||
"application" : True,
|
||||
"installable" : True,
|
||||
"auto_install" : False,
|
||||
"price" : 599,
|
||||
"currency" : "EUR",
|
||||
"pre_init_hook" : "pre_init_check",
|
||||
}
|
||||
|
|
@ -0,0 +1,211 @@
|
|||
apis={
|
||||
'homepage':{
|
||||
'description':'HomePage API',
|
||||
'uri':'/mobikul/homepage',
|
||||
'request':['POST']
|
||||
},
|
||||
|
||||
'splashPageData':{
|
||||
'description':'Default data to saved at app end.',
|
||||
'uri':'/mobikul/splashPageData',
|
||||
'request':['POST']
|
||||
},
|
||||
|
||||
'sliderProducts':{
|
||||
'description':'Product(s) of given Product Slider Record',
|
||||
'uri':'/mobikul/sliderProducts/<int:product_slider_id>;',
|
||||
'request':['POST']
|
||||
},
|
||||
|
||||
'sliderProducts':{
|
||||
'description':'Product(s) of given Product Slider Record',
|
||||
'uri':'/mobikul/search',
|
||||
'request':['POST'],
|
||||
'body':{
|
||||
"search":"l",
|
||||
"offset":25
|
||||
}
|
||||
},
|
||||
|
||||
'MyOrders':{
|
||||
'description':'',
|
||||
'uri':'/mobikul/my/orders',
|
||||
'request':['POST'],
|
||||
|
||||
},
|
||||
|
||||
'MyOrderDetail':{
|
||||
'description':'',
|
||||
'uri':'/mobikul/my/order/<int:order_id>',
|
||||
'request':['POST'],
|
||||
},
|
||||
|
||||
|
||||
'MyAddress':{
|
||||
'description':'',
|
||||
'uri':'/mobikul/my/addresses',
|
||||
'request':['POST'],
|
||||
},
|
||||
|
||||
'setMyDefaultAddress':{
|
||||
'description':'',
|
||||
'uri':'/mobikul/my/address/default/<int:addressId>',
|
||||
'request':['PUT'],
|
||||
},
|
||||
|
||||
'addMyNewAddress':{
|
||||
'description':'',
|
||||
'uri':'/mobikul/my/address/new',
|
||||
'request':['POST'],
|
||||
'body':{
|
||||
"name":"acdef",
|
||||
"city":"xyz",
|
||||
"zip":"0987456",
|
||||
"street":"lmno",
|
||||
"phone":"1236547890",
|
||||
"county_id":"3",
|
||||
"state_id" :"5"
|
||||
}
|
||||
},
|
||||
|
||||
'editAddressDetail':{
|
||||
'description':'',
|
||||
'uri':'/mobikul/my/address/<int:address_id>',
|
||||
'request':['POST','PUT','DELETE'],
|
||||
'body':{
|
||||
"name":"acdef",
|
||||
"city":"xyz",
|
||||
"zip":"0987456",
|
||||
"street":"lmno",
|
||||
"phone":"1236547890",
|
||||
"county_id":"3",
|
||||
"state_id" :"5"
|
||||
}
|
||||
},
|
||||
|
||||
'myAccount':{
|
||||
'description':'',
|
||||
'uri':'/mobikul/my/account',
|
||||
'request':['POST'],
|
||||
},
|
||||
|
||||
|
||||
'localizationData':{
|
||||
'description':'',
|
||||
'uri':'/mobikul/localizationData',
|
||||
'request':['POST'],
|
||||
},
|
||||
|
||||
'myCartDetails':{
|
||||
'description':'',
|
||||
'uri':'/mobikul/mycart',
|
||||
'request':['POST'],
|
||||
},
|
||||
|
||||
'editCartDetail':{
|
||||
'description':'',
|
||||
'uri':'/mobikul/mycart/<int:line_id>',
|
||||
'request':['POST','PUT','DELETE'],
|
||||
'body':{
|
||||
'set_qty':"3",
|
||||
'add_qty':"3"
|
||||
}
|
||||
},
|
||||
|
||||
'emptyCart':{
|
||||
'description':'',
|
||||
'uri':'/mobikul/mycart/setToEmpty',
|
||||
'request':['DELETE'],
|
||||
'body':{
|
||||
'set_qty':"3",
|
||||
'add_qty':"3"
|
||||
}
|
||||
},
|
||||
|
||||
'addToCart':{
|
||||
'description':'',
|
||||
'uri':'/mobikul/mycart/addToCart',
|
||||
'request':['POST'],
|
||||
'body':{
|
||||
'productId':"16",
|
||||
'set_qty':"3",
|
||||
'add_qty':"3"
|
||||
}
|
||||
},
|
||||
|
||||
'paymentAcquirers':{
|
||||
'description':'',
|
||||
'uri':'/mobikul/paymentAcquirers',
|
||||
'request':['POST'],
|
||||
|
||||
},
|
||||
|
||||
'orderReviewData':{
|
||||
'description':'',
|
||||
'uri':'/mobikul/orderReviewData',
|
||||
'request':['POST'],
|
||||
'body':{
|
||||
"acquirerId":"1",
|
||||
"shippingAddressId":"5"
|
||||
}
|
||||
},
|
||||
|
||||
'placeMyOrders':{
|
||||
'description':'',
|
||||
'uri':'/mobikul/placeMyOrder',
|
||||
'request':['POST'],
|
||||
|
||||
},
|
||||
|
||||
|
||||
'signUp':{
|
||||
'description':'',
|
||||
'uri':'/mobikul/customer/signUp',
|
||||
'request':['POST'],
|
||||
'body':{
|
||||
"name":"Saurabh Gupta",
|
||||
"login":"saurabh.gupta781@webkul.com",
|
||||
"password":"123"
|
||||
}
|
||||
|
||||
},
|
||||
|
||||
'login':{
|
||||
'description':'',
|
||||
'uri':'/mobikul/customer/login',
|
||||
'request':['POST'],
|
||||
},
|
||||
|
||||
'signOut':{
|
||||
'description':'',
|
||||
'uri':'/mobikul/customer/signOut',
|
||||
'request':['POST'],
|
||||
},
|
||||
|
||||
|
||||
'resetPassword':{
|
||||
'description':'',
|
||||
'uri':'/mobikul/customer/resetPassword',
|
||||
'request':['POST'],
|
||||
'body':{
|
||||
"name":"Saurabh Gupta",
|
||||
"login":"saurabh.gupta781@webkul.com",
|
||||
"password":123
|
||||
}
|
||||
},
|
||||
|
||||
'signUp':{
|
||||
'description':'',
|
||||
'uri':'/mobikul/customer/signUp',
|
||||
'request':['POST'],
|
||||
'body':{
|
||||
"name":"Saurabh Gupta",
|
||||
"login":"saurabh.gupta781@webkul.com",
|
||||
"password":123
|
||||
}
|
||||
},
|
||||
|
||||
|
||||
}
|
||||
|
||||
|
||||
|
|
@ -0,0 +1,41 @@
|
|||
module name : Mobikul: Mobile App Builder
|
||||
technical name : mobikul
|
||||
|
||||
## v[1.0.0] - 2017-10-26
|
||||
### Added
|
||||
-
|
||||
### Changed
|
||||
- migrate version mobikul v1.0.5 from oddo v10.0 to odoo v11.0
|
||||
### Removed
|
||||
-
|
||||
### Fix
|
||||
-
|
||||
|
||||
|
||||
|
||||
## v[1.0.1] - 2017-11-21
|
||||
### Added
|
||||
- Add email_verification api in mobikul app compatible to odoo v11.0
|
||||
- Add marketplace api in mobikul app compatible to odoo v11.0
|
||||
- Add wk_review api in mobikul app compatible to odoo v11.0
|
||||
|
||||
### Changed
|
||||
- migrate version mobikul v1.0.0 to v1.0.1
|
||||
### Removed
|
||||
-
|
||||
### Fix
|
||||
-
|
||||
|
||||
## v[1.2.0] - 2018-3-28
|
||||
### Added
|
||||
migrate changes that done in mobikul v 10.0 to mobikul 11.0 like:
|
||||
-shipping methods
|
||||
-payment methods
|
||||
-some issues like translation etc.
|
||||
### Changed
|
||||
- migrate version mobikul v1.0.1 to v1.2.0
|
||||
### Removed
|
||||
-
|
||||
### Fix
|
||||
-
|
||||
[NOTE] supported wishlist module is website_sale_wishlist
|
||||
|
|
@ -0,0 +1,7 @@
|
|||
# -*- coding: utf-8 -*-
|
||||
#################################################################################
|
||||
#
|
||||
# Copyright (c) 2015-Present Webkul Software Pvt. Ltd. (<https://webkul.com/>)
|
||||
#
|
||||
#################################################################################
|
||||
from . import main
|
||||
|
|
@ -0,0 +1,70 @@
|
|||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<odoo>
|
||||
<data noupdate="1">
|
||||
<record id="mobikul_banner_image_1" model="mobikul.banners">
|
||||
<field name="image" type="base64" file="mobikul/static/src/img/Demo-Banner-1.png"/>
|
||||
<field name="name">Banner1</field>
|
||||
<field name="banner_action">product</field>
|
||||
<field name="product_id">16</field>
|
||||
</record>
|
||||
|
||||
<record id="mobikul_banner_image_2" model="mobikul.banners">
|
||||
<field name="image" type="base64" file="mobikul/static/src/img/Demo-Banner-2.png"/>
|
||||
<field name="name">Banner2</field>
|
||||
<field name="banner_action">none</field>
|
||||
</record>
|
||||
|
||||
|
||||
<record id="mobikul_push_notification_1" model="mobikul.push.notification.template">
|
||||
<field name="name">signupNotify</field>
|
||||
<field name="image" type="base64" file="mobikul/static/src/img/Sign-up.png"/>
|
||||
<field name="condition">signup</field>
|
||||
<field name="notification_title">Congrats...you have successfully created your account.</field>
|
||||
<field name="notification_body">Feel free to contact us in case of any doubts.</field>
|
||||
<field name="banner_action">none</field>
|
||||
</record>
|
||||
|
||||
<record id="mobikul_push_notification_2" model="mobikul.push.notification.template">
|
||||
<field name="name">OrderNotify</field>
|
||||
<field name="image" type="base64" file="mobikul/static/src/img/Order-Placed.png"/>
|
||||
<field name="condition">orderplaced</field>
|
||||
<field name="notification_title">Thank you for your purchase !</field>
|
||||
<field name="notification_body">Your Order has been placed, successfully.</field>
|
||||
<field name="banner_action">none</field>
|
||||
</record>
|
||||
|
||||
<record id="mobikul_product_slider_1" model="mobikul.product.slider">
|
||||
<field name="name">Discount for You</field>
|
||||
<field name="product_selection">automatic</field>
|
||||
<field name="product_based_on">new</field>
|
||||
<field name="slider_mode">default</field>
|
||||
<field name="item_limit">5</field>
|
||||
<field name="item_display_limit">5</field>
|
||||
<field name="product_image_position">center</field>
|
||||
</record>
|
||||
<record id="mobikul_product_slider_2" model="mobikul.product.slider">
|
||||
<field name="name">Deal of the day</field>
|
||||
<field name="product_selection">manual</field>
|
||||
<field name="product_ids" eval="[(6,0,[ref('product.product_product_4_product_template')])]"/>
|
||||
<!--eval="[(6,0,[ref('product.product_product_4_product_template')])]"/>-->
|
||||
<!--eval="[(4,ref('product.product_product_4_product_template'))]"/>-->
|
||||
|
||||
<!--product_product_4c-->
|
||||
|
||||
<field name="slider_mode">fixed</field>
|
||||
<field name="item_limit">5</field>
|
||||
<field name="item_display_limit">5</field>
|
||||
<field name="product_image_position">center</field>
|
||||
</record>
|
||||
<record id="mobikul_product_slider_3" model="mobikul.product.slider">
|
||||
<field name="name">New </field>
|
||||
<field name="product_selection">automatic</field>
|
||||
<field name="product_based_on">wCategory</field>
|
||||
<field name="wcategory_id">13</field>
|
||||
<field name="slider_mode">fixed</field>
|
||||
<field name="item_limit">5</field>
|
||||
<field name="item_display_limit">5</field>
|
||||
<field name="product_image_position">center</field>
|
||||
</record>
|
||||
</data>
|
||||
</odoo>
|
||||
|
|
@ -0,0 +1,45 @@
|
|||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<odoo>
|
||||
<data noupdate="1">
|
||||
|
||||
<record model="crm.team" id="mobikul.salesteam_mobikul_sales">
|
||||
<field name="name">Mobikul Sales</field>
|
||||
</record>
|
||||
<record model="fcm.registered.topics" id="mobikul.fcm_default_topic">
|
||||
<field name="name">DEFAULT</field>
|
||||
</record>
|
||||
|
||||
<record id="d_mobikul_setting" model="mobikul">
|
||||
<field name="name">Mobikul App</field>
|
||||
<field name="salesteam_id" ref="mobikul.salesteam_mobikul_sales"/>
|
||||
</record>
|
||||
|
||||
|
||||
<record model="ir.cron" id="mobikul_banner_cron_call">
|
||||
<field name="name">Automated mobikul banner Scheduler</field>
|
||||
<field name="active" eval="True"/>
|
||||
<field name="interval_number">1</field>
|
||||
<field name="interval_type">days</field>
|
||||
<field name="numbercall">-1</field>
|
||||
<field name="doall" eval="False"/>
|
||||
<field name="model_id" ref="model_mobikul_banners"/>
|
||||
<field name="code">model.process_inactive_mobikul_banner()</field>
|
||||
</record>
|
||||
|
||||
<record model="ir.actions.server" id="sync_cat_server_action">
|
||||
<field name="name">Sync Category</field>
|
||||
<field name="model_id" ref="model_mobikul_category"/>
|
||||
<field name="code">
|
||||
action=model.sync_category()
|
||||
</field>
|
||||
</record>
|
||||
|
||||
<!-- <record id="test_more_item_1" model="ir.values">
|
||||
<field eval="'client_action_multi'" name="key2"/>
|
||||
<field eval="'mobikul.category'" name="model"/>
|
||||
<field name="name">Test Item</field>
|
||||
<field eval="'ir.actions.server,%d'%sync_cat_server_action" name="value"/>
|
||||
</record> -->
|
||||
|
||||
</data>
|
||||
</odoo>
|
||||
|
|
@ -0,0 +1,11 @@
|
|||
# -*- coding: utf-8 -*-
|
||||
##########################################################################
|
||||
#
|
||||
# Copyright (c) 2015-Present Webkul Software Pvt. Ltd. (<https://webkul.com/>)
|
||||
#
|
||||
##########################################################################
|
||||
from . import mobikul
|
||||
from . import product
|
||||
from . import sale_order
|
||||
from . import res_config
|
||||
from . import ir_http
|
||||
|
|
@ -0,0 +1,13 @@
|
|||
# from odoo import fields,api, models
|
||||
#
|
||||
#
|
||||
# class DeliveryCarrier(models.Model):
|
||||
# _inherit = 'delivery.carrier'
|
||||
#
|
||||
# @api.multi
|
||||
# def mobikul_publish_button(self):
|
||||
# self.ensure_one()
|
||||
# self.is_mobikul_available = not self.is_mobikul_available
|
||||
# return True
|
||||
#
|
||||
# is_mobikul_available = fields.Boolean(default=False)
|
||||
|
|
@ -0,0 +1,93 @@
|
|||
import requests
|
||||
import json
|
||||
|
||||
FCM_URL = "https://fcm.googleapis.com/fcm/send"
|
||||
|
||||
class FCMAPI(object):
|
||||
|
||||
def __init__(self, api_key):
|
||||
self._API_KEY = api_key
|
||||
|
||||
def _headers(self):
|
||||
return {
|
||||
"Content-Type": "application/json",
|
||||
"Authorization": "Key=" + self._API_KEY
|
||||
}
|
||||
|
||||
def jsonDumps(self, data):
|
||||
return json.dumps(data).encode('utf8')
|
||||
|
||||
def _push(self, payload):
|
||||
response = requests.post(FCM_URL, headers=self._headers(), data=payload)
|
||||
print (response)
|
||||
if response.status_code == 200:
|
||||
if int(response.headers.get('content-length',0)) <= 0:
|
||||
return {}
|
||||
return response.json()
|
||||
elif response.status_code == 401:
|
||||
raise Exception("There was an error authenticating the sender account")
|
||||
elif response.status_code == 400:
|
||||
raise Exception(response.text)
|
||||
else:
|
||||
raise Exception("FCM server is temporarily unavailable")
|
||||
|
||||
def send(self, payloads=None):
|
||||
self.all_responses = []
|
||||
for payload in payloads:
|
||||
response = self._push(payload)
|
||||
self.all_responses.append(response)
|
||||
return self.all_responses
|
||||
|
||||
def parse_payload(self, registration_ids=None, topic_name=None, message_body=None, message_title=None,
|
||||
message_icon=None, priority=False, data_message=None, badge=None, color=None, tag=None,
|
||||
**extra_kwargs):
|
||||
fcm_payload = dict()
|
||||
if registration_ids:
|
||||
if len(registration_ids) > 1:
|
||||
fcm_payload['registration_ids'] = registration_ids
|
||||
else:
|
||||
fcm_payload['to'] = registration_ids[0]
|
||||
if topic_name:
|
||||
fcm_payload['to'] = '/topics/%s' % topic_name
|
||||
if priority:
|
||||
fcm_payload['priority'] = 'normal'
|
||||
else:
|
||||
fcm_payload['priority'] = 'high'
|
||||
|
||||
if data_message:
|
||||
if isinstance(data_message, dict):
|
||||
fcm_payload['data'] = data_message
|
||||
else:
|
||||
raise Exception("Provided data_message is in the wrong format")
|
||||
|
||||
fcm_payload['notification'] = {}
|
||||
if message_icon:
|
||||
fcm_payload['notification']['icon'] = message_icon
|
||||
if message_body:
|
||||
fcm_payload['notification']['body'] = message_body
|
||||
if message_title:
|
||||
fcm_payload['notification']['title'] = message_title
|
||||
|
||||
if badge:
|
||||
fcm_payload['notification']['badge'] = badge
|
||||
if color:
|
||||
fcm_payload['notification']['color'] = color
|
||||
if tag:
|
||||
fcm_payload['notification']['tag'] = tag
|
||||
|
||||
if extra_kwargs:
|
||||
fcm_payload['notification'].update(extra_kwargs)
|
||||
|
||||
return self.jsonDumps(fcm_payload)
|
||||
|
||||
if __name__== "__main__":
|
||||
key = "AAAAkdP3f44:APA91bEyls0NapnpJi9IZvMe7jEpkYYx99bdCcFUYtIy4ZDEsEaKaZd1DRhodK6yIXiiWvRfwCE_17HU2uz04s--1qYSw635BgB_ilMxwlQEbBPOqoJkFTPpWnERbbJ2401Eyh27Szyv"
|
||||
push_service = FCMAPI(api_key=key)
|
||||
|
||||
registration_id = ["eSUQAef0S2Y:APA91bHm_Q2YJnzBJI77g7mTAW1teFd3i0t8gOM8HqJuv2RgO3_FFSI03ffShGCXus6jNNyILZ3Xng2jNKQdMCJ5FBPneJifkhQ9RJsC52reHfoXOxeEQvLFRbXZw1mKccUIGjf7P7_l"]
|
||||
message_title = "Test"
|
||||
message_body = "Hi Mohit, your customized news for today is ready"
|
||||
payload = push_service.parse_payload(registration_ids=registration_id, message_title=message_title, message_body=message_body)
|
||||
print (payload)
|
||||
print (push_service.send([payload]))
|
||||
|
||||
|
|
@ -0,0 +1,37 @@
|
|||
# -*- coding: utf-8 -*-
|
||||
##########################################################################
|
||||
#
|
||||
# Copyright (c) 2015-Present Webkul Software Pvt. Ltd. (<https://webkul.com/>)
|
||||
#
|
||||
##########################################################################
|
||||
|
||||
from odoo import api, models
|
||||
from odoo import SUPERUSER_ID
|
||||
from odoo.http import request
|
||||
|
||||
class Http(models.AbstractModel):
|
||||
_inherit = 'ir.http'
|
||||
|
||||
rerouting_limit = 10
|
||||
_geoip_resolver = None
|
||||
|
||||
@classmethod
|
||||
def binary_content(cls, xmlid=None, model='ir.attachment', id=None, field='datas',
|
||||
unique=False, filename=None,filename_field='datas_fname', download=False,
|
||||
mimetype=None, default_mimetype='application/octet-stream',
|
||||
access_token=None,env=None):
|
||||
env = env or request.env
|
||||
obj = None
|
||||
if xmlid:
|
||||
obj = env.ref(xmlid, False)
|
||||
elif id and model in env:
|
||||
obj = env[model].browse(int(id))
|
||||
if obj and 'is_mobikul_available' in obj._fields:
|
||||
if env[obj._name].sudo().search([('id', '=', obj.id), ('is_mobikul_available', '=', True)]):
|
||||
env = env(user=SUPERUSER_ID)
|
||||
if obj._name == "res.partner" and field in ("image","profile_banner","profile_image"):
|
||||
env = env(user=SUPERUSER_ID)
|
||||
return super(Http, cls).binary_content(
|
||||
xmlid=xmlid, model=model, id=id, field=field, unique=unique, filename=filename,
|
||||
filename_field=filename_field, download=download, mimetype=mimetype,
|
||||
default_mimetype=default_mimetype,access_token=access_token, env=env)
|
||||
|
|
@ -0,0 +1,41 @@
|
|||
# -*- coding: utf-8 -*-
|
||||
##########################################################################
|
||||
#
|
||||
# Copyright (c) 2015-Present Webkul Software Pvt. Ltd. (<https://webkul.com/>)
|
||||
#
|
||||
##########################################################################
|
||||
from odoo import api, fields, models, _
|
||||
import logging
|
||||
_logger = logging.getLogger(__name__)
|
||||
|
||||
|
||||
class ProductTemplate(models.Model):
|
||||
_inherit = "product.template"
|
||||
|
||||
@api.multi
|
||||
def mobikul_publish_button(self):
|
||||
self.ensure_one()
|
||||
self.is_mobikul_available = not self.is_mobikul_available
|
||||
return True
|
||||
|
||||
|
||||
mobikul_categ_ids = fields.Many2many('mobikul.category', string='Mobikul Product Category')
|
||||
mobikul_status = fields.Selection([
|
||||
('empty', 'Display Nothing'),
|
||||
('in_stock', 'In-Stock'),
|
||||
('out_stock', 'Out-of-Stock'),
|
||||
], "Product Availability", default='empty', help="Adds an availability status on the mobikul product page.")
|
||||
is_mobikul_available = fields.Boolean("Published on App", default=1, help="Allow the end user to choose this price list")
|
||||
|
||||
|
||||
class ProductPublicCategory(models.Model):
|
||||
_inherit = 'product.public.category'
|
||||
# this field is added for mobikul category merge
|
||||
mobikul_cat_id = fields.Many2one('mobikul.category', 'Mobikul Category')
|
||||
|
||||
|
||||
|
||||
class CrmTeam(models.Model):
|
||||
_inherit = "crm.team"
|
||||
|
||||
mobikul_ids = fields.One2many('mobikul', 'salesteam_id', string='Mobikul', help="Mobikul is using these sales team.")
|
||||
|
|
@ -0,0 +1,98 @@
|
|||
# -*- coding: utf-8 -*-
|
||||
##########################################################################
|
||||
#
|
||||
# Copyright (c) 2015-Present Webkul Software Pvt. Ltd. (<https://webkul.com/>)
|
||||
#
|
||||
##########################################################################
|
||||
from odoo import api, fields, models
|
||||
from odoo.tools.safe_eval import safe_eval
|
||||
import logging
|
||||
_logger = logging.getLogger(__name__)
|
||||
|
||||
|
||||
class MobikulConfigSettings(models.TransientModel):
|
||||
_name = 'mobikul.config.settings'
|
||||
_inherit = 'res.config.settings'
|
||||
|
||||
def _default_mobikul(self):
|
||||
return self.env['mobikul'].search([], limit=1).id
|
||||
|
||||
def _default_order_mail_template(self):
|
||||
return self.env.ref('sale.email_template_edi_sale').id
|
||||
|
||||
def open_mobikul_conf(self):
|
||||
return {
|
||||
'type': 'ir.actions.act_window',
|
||||
'name': 'Mobikul-App Configuration',
|
||||
'view_type': 'form',
|
||||
'view_mode': 'form',
|
||||
'res_model': 'mobikul',
|
||||
'res_id': self.mobikul_app.id,
|
||||
'target': 'current',
|
||||
}
|
||||
|
||||
# @api.multi
|
||||
def open_default_user(self):
|
||||
action = self.env.ref('base.action_res_users').read()[0]
|
||||
action['context'] = self.env.context
|
||||
action['res_id'] = self.env.ref('base.default_user').id
|
||||
action['views'] = [[self.env.ref('base.view_users_form').id, 'form']]
|
||||
return action
|
||||
|
||||
mobikul_app = fields.Many2one('mobikul', string="Mobikul APP", default=_default_mobikul, required=True)
|
||||
app_name = fields.Char('App Name', related='mobikul_app.name')
|
||||
product_limit = fields.Integer('Limit Products per page', related='mobikul_app.product_limit')
|
||||
module_email_verification = fields.Boolean(related='mobikul_app.email_verify', string='Verify Email on signUp')
|
||||
salesperson_id = fields.Many2one('res.users', related='mobikul_app.salesperson_id', string='Salesperson')
|
||||
salesteam_id = fields.Many2one('crm.team', related='mobikul_app.salesteam_id', string='Sales Team')
|
||||
default_lang = fields.Many2one('res.lang', related='mobikul_app.default_lang', string='Default Language')
|
||||
currency_id = fields.Many2one('res.currency', related='mobikul_app.currency_id', string='Default Currency')
|
||||
pricelist_id = fields.Many2one('product.pricelist', related='mobikul_app.pricelist_id', string='Default Pricelist')
|
||||
mobikul_reset_password = fields.Boolean(string='Enable password reset', help="This allows users to trigger a password reset from App")
|
||||
mobikul_signup = fields.Boolean(string='Enable customer sign up')
|
||||
mobikul_allow_guest = fields.Boolean(string='Allow Guests to view products on App.')
|
||||
mobikul_signup_template_user_id = fields.Many2one('res.users', string='Template user for new users created through App')
|
||||
module_auth_oauth = fields.Boolean(string='Allow social login (Gmail,Facebook,etc)', help="Use external authentication providers (OAuth)")
|
||||
mobikul_gmail_signin = fields.Boolean(string='Gmail SignIn')
|
||||
mobikul_facebook_signin = fields.Boolean(string='Facebook SignIn')
|
||||
mobikul_twitter_signin = fields.Boolean(string='Twitter SignIn')
|
||||
# module_website_wishlist = fields.Boolean(string='Allow Wishlist feature on App.', help="Use external Addon to add wishlist feature in website")
|
||||
module_wk_review = fields.Boolean(string='Allow Product Review feature on App.', help="Use external Addon to add review feature in website")
|
||||
module_odoo_marketplace = fields.Boolean(string='Allow Odoo Marketplace on App.', help="Use external Addon to add Multi Vendor Marketplace in website")
|
||||
module_website_sale_wishlist = fields.Boolean(string='Allow Website Sale Wishlist on App.',
|
||||
help="Use default Addon to add Wishlist in website")
|
||||
|
||||
@api.onchange('pricelist_id')
|
||||
def onchange_currency_id_set(self):
|
||||
self.currency_id = self.pricelist_id.currency_id
|
||||
|
||||
|
||||
@api.model
|
||||
def get_values(self):
|
||||
res = super(MobikulConfigSettings, self).get_values()
|
||||
IrConfigParam = self.env['ir.config_parameter']
|
||||
# we use safe_eval on the result, since the value of the parameter is a nonempty string
|
||||
res.update(
|
||||
mobikul_reset_password=safe_eval(IrConfigParam.get_param('auth_signup.reset_password', 'False')),
|
||||
mobikul_signup = safe_eval(IrConfigParam.get_param('auth_signup.allow_uninvited', 'False')),
|
||||
mobikul_signup_template_user_id= safe_eval(IrConfigParam.get_param('auth_signup.template_user_id', 'False')),
|
||||
mobikul_allow_guest= safe_eval(IrConfigParam.get_param('mobikul.allow_guest', 'False')),
|
||||
mobikul_gmail_signin= safe_eval(IrConfigParam.get_param('mobikul.gmail_signin', 'False')),
|
||||
mobikul_facebook_signin= safe_eval(IrConfigParam.get_param('mobikul.facebook_signin', 'False')),
|
||||
mobikul_twitter_signin= safe_eval(IrConfigParam.get_param('mobikul.twitter_signin', 'False')),
|
||||
)
|
||||
return res
|
||||
|
||||
@api.multi
|
||||
def set_values(self):
|
||||
self.ensure_one()
|
||||
super(MobikulConfigSettings, self).set_values()
|
||||
IrConfigParam = self.env['ir.config_parameter']
|
||||
# we store the repr of the values, since the value of the parameter is a required string
|
||||
IrConfigParam.set_param('auth_signup.reset_password', repr(self.mobikul_reset_password))
|
||||
IrConfigParam.set_param('auth_signup.allow_uninvited', repr(self.mobikul_signup))
|
||||
IrConfigParam.set_param('auth_signup.template_user_id', repr(self.mobikul_signup_template_user_id.id))
|
||||
IrConfigParam.set_param('mobikul.allow_guest', repr(self.mobikul_allow_guest))
|
||||
IrConfigParam.set_param('mobikul.gmail_signin', repr(self.mobikul_gmail_signin))
|
||||
IrConfigParam.set_param('mobikul.facebook_signin', repr(self.mobikul_facebook_signin))
|
||||
IrConfigParam.set_param('mobikul.twitter_signin', repr(self.mobikul_twitter_signin))
|
||||
|
|
@ -0,0 +1,46 @@
|
|||
# -*- coding: utf-8 -*-
|
||||
##########################################################################
|
||||
#
|
||||
# Copyright (c) 2015-Present Webkul Software Pvt. Ltd. (<https://webkul.com/>)
|
||||
#
|
||||
##########################################################################
|
||||
import logging
|
||||
from odoo import api, fields, models, _
|
||||
from odoo.exceptions import ValidationError
|
||||
_logger = logging.getLogger(__name__)
|
||||
|
||||
class ResPartner(models.Model):
|
||||
_inherit = 'res.partner'
|
||||
|
||||
last_mobikul_so_id = fields.Many2one('sale.order', string='Last Order from Mobikul App')
|
||||
banner_image = fields.Binary('Banner Image', attachment=True)
|
||||
token_ids = fields.One2many('fcm.registered.devices', 'customer_id', string='Registered Devices',readonly=True)
|
||||
|
||||
|
||||
class SaleOrder(models.Model):
|
||||
_inherit = "sale.order"
|
||||
|
||||
cart_count = fields.Integer(compute='_compute_cart_count', string='Cart Quantity')
|
||||
|
||||
@api.multi
|
||||
@api.depends('order_line.product_uom_qty', 'order_line.product_id')
|
||||
def _compute_cart_count(self):
|
||||
is_wesiteSaleDelivery = self.env['mobikul'].sudo().check_mobikul_addons().get('website_sale_delivery')
|
||||
for order in self:
|
||||
if is_wesiteSaleDelivery:
|
||||
order.cart_count = int(sum([line.product_uom_qty for line in order.order_line if not line.is_delivery]))
|
||||
else:
|
||||
order.cart_count = int(sum(order.mapped('order_line.product_uom_qty')))
|
||||
|
||||
|
||||
|
||||
class PaymentAcquirer(models.Model):
|
||||
_inherit = 'payment.acquirer'
|
||||
|
||||
is_mobikul_available = fields.Boolean(
|
||||
'Visible in Portal / Website', copy=False,
|
||||
help="Make this payment acquirer available on App")
|
||||
mobikul_reference_code = fields.Char(
|
||||
'Mobikul Reference Code', copy=False,
|
||||
help="Unique Code in order to integrate it with Mobikul App.")
|
||||
mobikul_pre_msg = fields.Text('Message to Display', copy=False, translate=True,help="this field is depricated from mobikul")
|
||||
|
|
@ -0,0 +1,20 @@
|
|||
id,name,model_id:id,group_id:id,perm_read,perm_write,perm_create,perm_unlink
|
||||
access_mobikul_banners_public,mobikul.mobikul_banners.public,model_mobikul_banners,,1,0,0,0
|
||||
access_mobikul_category_public,mobikul.mobikul_category.public,model_mobikul_category,,1,0,0,0
|
||||
access_res_partner_public,base.res_partner.public,base.model_res_partner,,1,0,0,0
|
||||
access_mobikul_push_notification_public,mobikul.mobikul_push_notification.public,model_mobikul_push_notification,,1,0,0,0
|
||||
access_mobikul_push_notification_template_public,mobikul.mobikul_push_notification_template.public,model_mobikul_push_notification_template,,1,0,0,0
|
||||
access_mobikul_notification_messages_template_public,mobikul.mobikul_notification_messages.public,model_mobikul_notification_messages,,1,0,0,0
|
||||
|
||||
access_mobikul_category,Mobikul Category Access,model_mobikul_category,mobikul.group_mobikul_user,1,1,1,1
|
||||
access_mobikul_banners,Mobikul Banners Access,model_mobikul_banners,mobikul.group_mobikul_user,1,1,1,1
|
||||
access_mobikul_product_slider,Mobikul Product Slider Access,model_mobikul_product_slider,mobikul.group_mobikul_user,1,1,1,1
|
||||
access_mobikul_push_notification,Mobikul Push Notification Access,model_mobikul_push_notification,mobikul.group_mobikul_user,1,1,1,1
|
||||
access_mobikul_notification_messages,Mobikul Notification Messages Access,model_mobikul_notification_messages,mobikul.group_mobikul_user,1,0,0,0
|
||||
|
||||
access_mobikul_push_notification_template,Mobikul Push Notification Template Access,model_mobikul_push_notification_template,mobikul.group_mobikul_user,1,0,0,0
|
||||
|
||||
access_manager_mobikul_mobikul,Mobikul Access,model_mobikul,mobikul.group_mobikul_manager,1,1,1,1
|
||||
access_manager_mobikul_push_notification,Mobikul Push Notification Access,model_mobikul_push_notification,mobikul.group_mobikul_manager,1,1,1,1
|
||||
access_manager_mobikul_push_notification_template,Mobikul Push Notification Template Access,model_mobikul_push_notification_template,mobikul.group_mobikul_manager,1,1,1,1
|
||||
access_manager_mobikul_notification_messages,Mobikul Push Notification Messages Access,model_mobikul_notification_messages,mobikul.group_mobikul_manager,1,1,1,1
|
||||
|
|
|
@ -0,0 +1,24 @@
|
|||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<odoo>
|
||||
<data noupdate="1">
|
||||
<record model="ir.module.category" id="module_mobikul">
|
||||
<field name="name">Mobikul App</field>
|
||||
<field name="description">Mobikul-App Group</field>
|
||||
<field name="sequence">10</field>
|
||||
</record>
|
||||
|
||||
<record id="group_mobikul_user" model="res.groups">
|
||||
<field name="name">User</field>
|
||||
<field name="comment">All access except Mobikul Configuration.</field>
|
||||
<field name="category_id" ref="module_mobikul"/>
|
||||
</record>
|
||||
|
||||
<record id="group_mobikul_manager" model="res.groups">
|
||||
<field name="name">Manager</field>
|
||||
<field name="comment">Full Access</field>
|
||||
<field name="category_id" ref="module_mobikul"/>
|
||||
<field name="users" eval="[(4, ref('base.user_root'))]"/>
|
||||
<field name="implied_ids" eval="[(4, ref('group_mobikul_user'))]"/>
|
||||
</record>
|
||||
</data>
|
||||
</odoo>
|
||||
|
After Width: | Height: | Size: 208 KiB |
|
After Width: | Height: | Size: 184 KiB |
|
After Width: | Height: | Size: 209 KiB |
|
After Width: | Height: | Size: 163 KiB |
|
After Width: | Height: | Size: 406 KiB |
|
After Width: | Height: | Size: 347 KiB |
|
After Width: | Height: | Size: 341 B |
|
After Width: | Height: | Size: 469 B |
|
After Width: | Height: | Size: 315 B |
|
After Width: | Height: | Size: 6.1 KiB |
|
|
@ -0,0 +1,496 @@
|
|||
<section class="oe_container">
|
||||
<div class="oe_row oe_spaced">
|
||||
<h2 class="oe_slogan" style="color:#875A7B;">Mobikul Mobile App Builder for Odoo eCommerce(website)</h2>
|
||||
<h3 class="oe_slogan" style="margin-top: -25px;">Convert your Odoo eCommerce(website) store in the native mobile application.</h3>
|
||||
|
||||
<div class="oe_span12" style="margin-top: -40px;">
|
||||
<img class="oe_picture" src="main.png">
|
||||
</div>
|
||||
</div>
|
||||
</section>
|
||||
|
||||
<!-- <section class="oe_container oe_dark lead">
|
||||
<div class="oe_row">
|
||||
<div id="myCarousel" class="carousel slide" data-ride="carousel" >
|
||||
<ol class="carousel-indicators">
|
||||
<li data-target="#myCarousel" data-slide-to="0" class=""></li>
|
||||
<li data-target="#myCarousel" data-slide-to="1" class=""></li>
|
||||
<li data-target="#myCarousel" data-slide-to="2" class="active"></li>
|
||||
<li data-target="#myCarousel" data-slide-to="3" class=""></li>
|
||||
</ol>
|
||||
<div class="carousel-inner" role="listbox">
|
||||
<div class="item active">
|
||||
<img src="carousel/img4.png">
|
||||
</div>
|
||||
<div class="item ">
|
||||
<img src="carousel/img6.png">
|
||||
</div>
|
||||
<div class="item ">
|
||||
<img src="carousel/img11.png">
|
||||
</div>
|
||||
<div class="item ">
|
||||
<img src="img4.png">
|
||||
</div>
|
||||
<div class="item ">
|
||||
<img src="carousel/img14.png">
|
||||
</div>
|
||||
</div>
|
||||
<a class="left carousel-control" href="#myCarousel" role="button" data-slide="prev">
|
||||
<i class="fa fa-hand-o-left text-info"></i>
|
||||
<span class="sr-only">Previous</span>
|
||||
</a>
|
||||
<a class="right carousel-control text-danger" href="#myCarousel" role="button" data-slide="next">
|
||||
<i class="fa fa-hand-o-right text-info"></i>
|
||||
<span class="sr-only">Next</span>
|
||||
</a>
|
||||
</div>
|
||||
</div>
|
||||
</section> -->
|
||||
|
||||
<!-- <section class="oe_container ">
|
||||
<h3 class="text-center">
|
||||
<a data-toggle="tooltip" data-placement="bottom" title="Manage it from Odoo" target="_blank"
|
||||
href="https://play.google.com/store/apps/details?id=com.webkul.mobikul.odoo&hl=en">
|
||||
<i class="fa fa-download"></i> Install App on your Phone(Google PlayStore Link)</a>
|
||||
|
||||
<a data-toggle="tooltip" data-placement="bottom" title="Manage it from Odoo" target="_blank"
|
||||
href="http://demo.webkul.com">
|
||||
<i class="fa fa-download"></i> Manage App from Backend(Odoo Link)</a>
|
||||
</h3>
|
||||
<p class="text-center"><i>( Please don`t forget to share your reviews on playstore & here as well. Your opinions, comments and suggestions are <b>VERY</b> Important to keep this app updated and more usefull !!! )</i></p>
|
||||
</section> -->
|
||||
|
||||
<section class="oe_container oe_dark">
|
||||
<div class="oe_row oe_spaced">
|
||||
<h2 class="oe_slogan" >About Mobikul: Mobile App Builder</h2>
|
||||
<div class="oe_span4">
|
||||
<img class="oe_picture" src="mobikul.gif">
|
||||
</div>
|
||||
<div class="oe_span8 text-justify">
|
||||
<p class="oe_mt32">
|
||||
If you are running your eCommerce(website) on Odoo, and looking for the native mobile application then you are at right place.
|
||||
</p>
|
||||
<p class="oe_mt8">
|
||||
Mobikul Mobile App Builder for Odoo will convert your Odoo store in the native mobile applications. It is not necessary to have desktops/laptops to shop from your store. The Mobile App is fully compatible with default Odoo store.
|
||||
</p>
|
||||
<p class="oe_mt8">
|
||||
The mobile application provides a user-friendly experience and enhances the customer`s engagement over the mobile platform.
|
||||
</p>
|
||||
<p class="oe_mt8">
|
||||
Now the customers can visit your store by using their mobile only and can shop on the Go.
|
||||
</p>
|
||||
<p class="oe_mt8">
|
||||
So what you waiting for, you must have a mobile app with great features & functionalities for your Odoo store.
|
||||
</p>
|
||||
</br>
|
||||
<p class="oe_mt8">
|
||||
<b> Need Demo ??</b> Check following links...
|
||||
</p>
|
||||
</div>
|
||||
</div>
|
||||
</section>
|
||||
|
||||
<section class="oe_container oe_dark" style="margin-top: -40px;">
|
||||
<div class="oe_row oe_spaced">
|
||||
<h3 class="text-center">
|
||||
<a data-toggle="tooltip" data-placement="bottom" title="Manage it from Odoo" target="_blank" href="https://play.google.com/store/apps/details?id=com.webkul.mobikul.odoo&hl=en">
|
||||
<i class="fa fa-android fa-2x"></i> Install App on your Phone(Google PlayStore Link)</a>
|
||||
<br>
|
||||
<br>
|
||||
<a data-toggle="tooltip" data-placement="bottom" title="Manage it from Odoo" target="_blank" href="http://demo.webkul.com/web/login">
|
||||
<i class="fa fa-cogs fa-2x"></i> Manage App from Odoo(Backend Odoo Link)</a>
|
||||
</h3>
|
||||
<p class="text-center"><i>( Please don`t forget to share your reviews on playstore & here as well. Your opinions, comments and suggestions are <b>VERY</b> Important to keep this app updated and more usefull !!! )</i></p>
|
||||
</div>
|
||||
</section>
|
||||
|
||||
<section class="oe_container oe_dark">
|
||||
<div class="oe_row oe_spaced">
|
||||
<h2 class="oe_slogan" style="color:#875A7B;">Default Features</h2>
|
||||
<h3 class="oe_slogan oe_mb32" style="margin-top: -25px;"> Packed with many default features which a mobile app must have like:</h3>
|
||||
</div>
|
||||
</section>
|
||||
|
||||
<section class="oe_container oe_dark" style="margin-top: -40px;">
|
||||
<div class="oe_row oe_spaced">
|
||||
<div class="oe_span4 text-center">
|
||||
<span class="fa fa-rocket fa-6x"/>
|
||||
<h4 class="oe_mt16 oe_mb8">
|
||||
<b>One Time Setup</b>
|
||||
</h4>
|
||||
<p>
|
||||
Just set up this app once in your odoo back-end and you are ready to go
|
||||
</p>
|
||||
</div>
|
||||
<div class="oe_span4 text-center">
|
||||
<span class="fa fa-cogs fa-6x"/>
|
||||
<h4 class="oe_mt16 oe_mb8">
|
||||
<b>Fully Configurable</b>
|
||||
</h4>
|
||||
<p>
|
||||
Configure this App from Odoo back-end.
|
||||
</p>
|
||||
</div>
|
||||
<div class="oe_span4 text-center">
|
||||
<span class="fa fa-sign-in fa-6x"/>
|
||||
<h4 class="oe_mt16 oe_mb8">
|
||||
<b>Allow signup</b>
|
||||
</h4>
|
||||
<p>
|
||||
Admin can disable signup/reset-password from App.
|
||||
</p>
|
||||
</div>
|
||||
</div>
|
||||
</section>
|
||||
|
||||
<section class="oe_container oe_dark" style="margin-top: -40px;">
|
||||
<div class="oe_row oe_spaced">
|
||||
<div class="oe_span4 text-center">
|
||||
<span class="fa fa-thumbs-o-up fa-6x"/>
|
||||
<h4 class="oe_mt16 oe_mb8">
|
||||
<b>Supports all types of Products</b>
|
||||
</h4>
|
||||
<p>
|
||||
All types of products are supported i.e with or without attributes like color,size, etc
|
||||
</p>
|
||||
</div>
|
||||
<div class="oe_span4 text-center">
|
||||
<span class="fa fa-plus-square fa-6x"/>
|
||||
<h4 class="oe_mt16 oe_mb8">
|
||||
<b>Publish products seperately from Website</b>
|
||||
</h4>
|
||||
<p>
|
||||
Option to published/un-published products/categories on App separately from Website.
|
||||
</p>
|
||||
</div>
|
||||
<div class="oe_span4 text-center">
|
||||
<span class="fa fa-picture-o fa-6x"/>
|
||||
<h4 class="oe_mt16 oe_mb8">
|
||||
<b>Product Multi-images</b>
|
||||
</h4>
|
||||
<p>
|
||||
Product can have more than one images, with Zoom-in,Zoom-out feature.Optimized images for faster loading.
|
||||
</p>
|
||||
</div>
|
||||
</div>
|
||||
</section>
|
||||
<section class="oe_container oe_dark" style="margin-top: -40px;">
|
||||
<div class="oe_row oe_spaced">
|
||||
<div class="oe_span4 text-center">
|
||||
<span class="fa fa-bullhorn fa-6x"/>
|
||||
<h4 class="oe_mt16 oe_mb8">
|
||||
<b>Offer Discounts</b>
|
||||
</h4>
|
||||
<p>
|
||||
Via Odoo pricelist, you may have special discount on your product(s) if purchased from App only or vice-versa.
|
||||
</p>
|
||||
</div>
|
||||
<div class="oe_span4 text-center">
|
||||
<span class="fa fa-line-chart fa-6x"/>
|
||||
<h4 class="oe_mt16 oe_mb8">
|
||||
<b>Distinguish b/w orders placed from App & Website</b>
|
||||
</h4>
|
||||
<p>
|
||||
you can keep tracking from which plateform(Website/App) your customers bought your products more.
|
||||
</p>
|
||||
</div>
|
||||
<div class="oe_span4 text-center">
|
||||
<span class="fa fa-language fa-6x"/>
|
||||
|
||||
<h4 class="oe_mt16 oe_mb8">
|
||||
<span style="color:#BE33FF;"> (new)</span>
|
||||
<b>Supports Multilingual</b>
|
||||
</h4>
|
||||
<p>
|
||||
Manage the translations for the components in your app from backend
|
||||
</p>
|
||||
|
||||
</div>
|
||||
</div>
|
||||
</section>
|
||||
|
||||
<section class="oe_container oe_dark" style="margin-top: -40px;">
|
||||
<div class="oe_row oe_spaced">
|
||||
<!-- <div class="oe_span4 text-center">
|
||||
<span class="fa fa-bullhorn fa-6x"/>
|
||||
<h4 class="oe_mt16 oe_mb8">
|
||||
<b>Offer Discounts</b>
|
||||
</h4>
|
||||
<p>
|
||||
Via Odoo pricelist, you may have special discount on your product(s) if purchased from App only or vice-versa.
|
||||
</p>
|
||||
</div> -->
|
||||
<div class="oe_span4 text-center">
|
||||
<span class="fa fa-support fa-6x"/>
|
||||
<h4 class="oe_mt16 oe_mb8">
|
||||
<b>Fast Support</b>
|
||||
</h4>
|
||||
<p>
|
||||
We offer extremely convenient and quick support service to all your technical help & support requests.
|
||||
</p>
|
||||
</div>
|
||||
|
||||
</div>
|
||||
</section>
|
||||
|
||||
<section class="oe_container oe_dark lead">
|
||||
<div class="oe_row oe_spaced">
|
||||
<h2 class="oe_slogan" style="color:#875A7B;">Bonus: Extra Added Features</h2>
|
||||
<h3 class="oe_slogan" style="margin-top: -25px;">To give an extra spark we have bundled some more features like:</h3>
|
||||
</div>
|
||||
</section>
|
||||
|
||||
<!-- <section class="oe_container oe_dark" style="margin-top: -50px;">
|
||||
<div class="oe_row">
|
||||
<div class="oe_span4 text-justify">
|
||||
<h2 class="oe_mt32 oe_mb8 ">
|
||||
<b>Social Login</b>
|
||||
<span>
|
||||
<a href="https://mobikul.com/features/sign-in-via-social-accounts/" >(A paid feature)</a>
|
||||
</span>
|
||||
</h2>
|
||||
<p class="oe_mt32 text-justify"><i class="fa fa-2x fa-hand-o-right"></i>
|
||||
Manage Social Login (Gmail, Facebook, Twitter).
|
||||
</p>
|
||||
<p class="oe_mt32 text-justify"><i class="fa fa-2x fa-hand-o-right"></i>
|
||||
Make signup process more easier & faster by integrating social login from App.
|
||||
</p>
|
||||
<p class="oe_mt32 text-justify"><i class="fa fa-2x fa-hand-o-right"></i>
|
||||
Fully compatible with Odoo eCommerce(website).
|
||||
</p>
|
||||
</div>
|
||||
<div class="oe_span8">
|
||||
<img class="oe_picture" src="5.png">
|
||||
</div>
|
||||
</div>
|
||||
</section> -->
|
||||
|
||||
<section class="oe_container oe_dark">
|
||||
<div class="oe_row oe_spaced">
|
||||
<div>
|
||||
<div class="oe_span8">
|
||||
<a href='1.png'><img class="oe_picture" src="1.png"></a>
|
||||
</div>
|
||||
<div class="oe_span4">
|
||||
<h2 class="oe_mt32 oe_mb8">
|
||||
<b>Banners</b>
|
||||
</h2>
|
||||
<p class="oe_mt32 text-justify"><i class="fa fa-2x fa-hand-o-right"></i>
|
||||
Manage Unlimited Banners from Odoo.
|
||||
</p>
|
||||
<p class="oe_mt32 text-justify"><i class="fa fa-2x fa-hand-o-right"></i>
|
||||
Configure what to trigger when customer click on it - a product or a category or a custom collection page.
|
||||
</p>
|
||||
<p class="oe_mt32 text-justify"><i class="fa fa-2x fa-hand-o-right"></i>
|
||||
Manage Publish/Expiration date for every banner seperately.
|
||||
</p>
|
||||
</ul>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</section>
|
||||
|
||||
<section class="oe_container oe_dark">
|
||||
<div class="oe_row">
|
||||
<div class="oe_span4 text-justify">
|
||||
<h2 class="oe_mt32 oe_mb8 ">
|
||||
<b>Product Sliders</b>
|
||||
</h2>
|
||||
<p class="oe_mt32 text-justify"><i class="fa fa-2x fa-hand-o-right"></i>
|
||||
Manage Unlimited Product Sliders like New Products, Hot Deals, etc.
|
||||
</p>
|
||||
<p class="oe_mt32 text-justify"><i class="fa fa-2x fa-hand-o-right"></i>
|
||||
Configure the selection criteria of products - automatic(new products, etc) or manual.
|
||||
</p>
|
||||
<p class="oe_mt32 text-justify"><i class="fa fa-2x fa-hand-o-right"></i>
|
||||
Manage slider mode i.e fixed or sliding
|
||||
</p>
|
||||
</div>
|
||||
<div class="oe_span8">
|
||||
<img class="oe_picture" src="3.png">
|
||||
</div>
|
||||
</div>
|
||||
</section>
|
||||
|
||||
<section class="oe_container oe_dark" >
|
||||
<div class="oe_row oe_spaced">
|
||||
<div>
|
||||
<div class="oe_span8">
|
||||
<a href='4.png'><img class="oe_picture" src="4.png"></a>
|
||||
</div>
|
||||
<div class="oe_span4">
|
||||
<h2 class="oe_mt32 oe_mb8">
|
||||
<b>Push Notifications</b>
|
||||
</h2>
|
||||
<p class="oe_mt32 text-justify"><i class="fa fa-2x fa-hand-o-right"></i>
|
||||
Manage Unlimited Push Notifications from Odoo, both token/topic based.
|
||||
</p>
|
||||
<p class="oe_mt32 text-justify"><i class="fa fa-2x fa-hand-o-right"></i>
|
||||
Pushed automatically to all/specific connected devices.
|
||||
</p>
|
||||
<p class="oe_mt32 text-justify"><i class="fa fa-2x fa-hand-o-right"></i>
|
||||
Configure what to trigger when customer click on it - a product or a category or a custom collection page.
|
||||
</p>
|
||||
</ul>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</section>
|
||||
|
||||
<section class="oe_container oe_dark">
|
||||
<div class="oe_row">
|
||||
<div class="oe_span4 text-justify">
|
||||
<h2 class="oe_mt32 oe_mb8 ">
|
||||
<b>Featured Category</b>
|
||||
</h2>
|
||||
<p class="oe_mt32 text-justify"><i class="fa fa-2x fa-hand-o-right"></i>
|
||||
Manage Unlimited Featured Category.
|
||||
</p>
|
||||
<p class="oe_mt32 text-justify"><i class="fa fa-2x fa-hand-o-right"></i>
|
||||
Highlight popular category on homepage, by making them Featured from Odoo.
|
||||
</p>
|
||||
<p class="oe_mt32 text-justify"><i class="fa fa-2x fa-hand-o-right"></i>
|
||||
Convert any category to featured or vice-versa from Odoo.
|
||||
</p>
|
||||
</div>
|
||||
<div class="oe_span8">
|
||||
<img class="oe_picture" src="2.png">
|
||||
</div>
|
||||
</div>
|
||||
</section>
|
||||
|
||||
<section class="oe_container">
|
||||
<div class="oe_row">
|
||||
<h2 class="oe_slogan" style="color:#875A7B;">Fully compatible with many other addons like:</h2>
|
||||
<div class='oe_dark' style="margin-top: -25px;">
|
||||
<div class="col-md-6" class="text-center">
|
||||
<h4 class="oe_mt16 oe_mb8">
|
||||
By <a class="loempia_link" href="/apps/modules/browse?author=Odoo S.A."><span>Odoo S.A.</span></a>
|
||||
</h4>
|
||||
</br>
|
||||
<p><i class="fa fa-users fa-2x"/>
|
||||
<a href='https://www.odoo.com/apps/modules/10.0/auth_oauth' alt='OAuth2 Authentication' target="new">
|
||||
OAuth2 Authentication
|
||||
</a><i class="fa fa-facebook-square fa-2x"/>
|
||||
<i class="fa fa-twitter-square fa-2x"/>
|
||||
<i class="fa fa-google-plus-square fa-2x"/>
|
||||
<a href='https://mobikul.com/features/sign-in-via-social-accounts/'>
|
||||
(read more)
|
||||
</a>
|
||||
</p>
|
||||
<p><i class="fa fa-desktop fa-2x"/>
|
||||
<a href='https://www.odoo.com/apps/modules/10.0/website_sale' alt='eCommerce' target="new">
|
||||
eCommerce
|
||||
</a></p>
|
||||
<p>
|
||||
<i class="fa fa-heart fa-2x"/>
|
||||
<a target="current">
|
||||
Website Wishlist
|
||||
</a>
|
||||
</p>
|
||||
<p><i class="fa fa-cc-stripe fa-2x"/>
|
||||
<a href='https://www.odoo.com/apps/modules/10.0/payment_stripe' alt='Stripe Payment Acquirer' target="new">
|
||||
Stripe Payment Acquirer
|
||||
</a></p>
|
||||
<p><i class="fa fa-bank fa-2x"/>
|
||||
<a target="current">
|
||||
Wire Transfer
|
||||
</a></p>
|
||||
|
||||
</div>
|
||||
<div class="col-md-6" class="text-center">
|
||||
<h4 class="oe_mt16 oe_mb8">
|
||||
By <a class="loempia_link" href="/apps/modules/browse?author=Webkul Software Pvt. Ltd."><span>Webkul Software Pvt. Ltd.</span></a>
|
||||
</h4>
|
||||
</br>
|
||||
<p><i class="fa fa-users fa-2x"/>
|
||||
<a href='https://www.odoo.com/apps/modules/11.0/website_ajax_login' alt='Website Ajax Login/Sign-Up' target="new">
|
||||
Website Ajax Login/Sign-Up
|
||||
</a><i class="fa fa-facebook-square fa-2x"/>
|
||||
<i class="fa fa-twitter-square fa-2x"/>
|
||||
<i class="fa fa-google-plus-square fa-2x"/></p>
|
||||
<p><i class="fa fa-cc-stripe fa-2x"/>
|
||||
<a href='https://www.odoo.com/apps/modules/11.0/payment_stripe_checkout' alt='Stripe Payment Acquirer' target="new">
|
||||
Stripe Payment Acquirer
|
||||
</a></p>
|
||||
<p><i class="fa fa-money fa-2x"/>
|
||||
<a href='https://www.odoo.com/apps/modules/11.0/payment_cash_on_delivery' alt='Cash On Delivery' target="new">
|
||||
Cash On Delivery
|
||||
</a></p>
|
||||
|
||||
<p><i class="fa fa-comments fa-2x"/>
|
||||
<a href='https://www.odoo.com/apps/modules/11.0/wk_review' target="new">
|
||||
Website Review
|
||||
</a></p>
|
||||
<p><i class="fa fa-exclamation-circle fa-2x"/>
|
||||
<a href='https://www.odoo.com/apps/modules/11.0/email_verification' target="new">
|
||||
Email Verification
|
||||
</a></p>
|
||||
|
||||
<p>
|
||||
<i class="fa fa-shopping-cart fa-2x"></i>
|
||||
<a href='https://www.odoo.com/apps/modules/11.0/odoo_marketplace' target="new">
|
||||
Odoo Multi Vendor Marketplace
|
||||
</a></p>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</section>
|
||||
|
||||
<section class="oe_container oe_dark">
|
||||
<div class="oe_row">
|
||||
<h2 class="oe_slogan" style="color:#875A7B;">Extra Information</h2>
|
||||
<div class="oe_span12" style="margin-top: -35px;">
|
||||
<p><i class="fa fa-check-square-o fa-2x"></i>
|
||||
On purchasing this module, you`ll get .apk without Source Code(Need to create a Ticket).
|
||||
</p>
|
||||
<ul><li>Free Installation/Setup for first 50 customers.</li>
|
||||
<li>Create a Ticket with all your Store Details: <a data-toggle="tooltip" data-placement="bottom" title="Get Instant Help !" target="_blank"
|
||||
href="https://webkul.uvdesk.com/en/customer/create-ticket/">Click me</a></li>
|
||||
<li>If you want Source Code as well, you need to pay +$599.00 extra</li></ul>
|
||||
<p><i class="fa fa-check-square-o fa-2x"></i>
|
||||
You can publish this App through Webkul Google Play Store Account.
|
||||
</p>
|
||||
<ul><li>If you want to publish App with your Google Play Store Account, you need to pay +$50.00 extra</li></ul>
|
||||
<p><i class="fa fa-check-square-o fa-2x"></i>
|
||||
You will get 90 days FREE support for any doubt, queries, and bug fixing (excluding data recovery) or any type of issue related to this module.
|
||||
<ul><li>You may extend support later(PAID).</li></ul>
|
||||
</p>
|
||||
</div>
|
||||
</div>
|
||||
</section>
|
||||
|
||||
<!-- <section class="oe_container oe_dark">
|
||||
<div class='oe_row'>
|
||||
<div class="oe_span12">
|
||||
<h2 class='oe_slogan'>Complimentary Support</h2>
|
||||
<p style="margin-top: -25px;">
|
||||
You will get 90 days free support for any doubt, queries, and bug fixing (not including data recovery) or any type of issue related to this module.
|
||||
</p>
|
||||
</div>
|
||||
</div>
|
||||
</section> -->
|
||||
|
||||
<section class="oe_container lead">
|
||||
<div class="oe_row oe_spaced">
|
||||
<div class="oe_span12">
|
||||
<h2 class="oe_slogan">Help and Support</h2>
|
||||
</div>
|
||||
<br>
|
||||
<div class="oe_slogan oe_spaced text-center">
|
||||
<b>
|
||||
<a title="Get Instant Help !" href="https://webkul.uvdesk.com/en/customer/create-ticket/"><span class="o_ripple" style="height: 98px; width: 98px; top: -23.9688px; left: 14.7812px;"></span><i class="fa fa-life-ring"></i> Help </a>
|
||||
<a title="Get Instant Support!" href="https://webkul.uvdesk.com/en/customer/create-ticket/"><i class="fa fa-ticket"></i> Support </a>
|
||||
<a title="Request Features now !" href="https://webkul.uvdesk.com/en/customer/create-ticket/"><i class="fa fa-check-circle"></i> Request new Features </a>
|
||||
</b>
|
||||
</div>
|
||||
</div>
|
||||
</section>
|
||||
|
||||
<section class="oe_container">
|
||||
<div class="oe_span12">
|
||||
<!-- Piwik Image Tracker-->
|
||||
<img src="http://odooimg.webkul.com/analytics/piwik/piwik.php?idsite=3&rec=1&action_name=mobikul&url=https://apps.openerp.com/apps/modules/10.0/mobikul&uid=mobikul" style="border:0" alt="" />
|
||||
<!-- End Piwik -->
|
||||
</div>
|
||||
</section>
|
||||
|
After Width: | Height: | Size: 98 KiB |
|
After Width: | Height: | Size: 504 KiB |
|
After Width: | Height: | Size: 169 KiB |
|
After Width: | Height: | Size: 146 KiB |
|
After Width: | Height: | Size: 3.4 KiB |
|
After Width: | Height: | Size: 3.4 KiB |
|
After Width: | Height: | Size: 52 KiB |
|
After Width: | Height: | Size: 50 KiB |
|
After Width: | Height: | Size: 6.1 KiB |
|
|
@ -0,0 +1,72 @@
|
|||
# import xmlrpclib
|
||||
# import sys
|
||||
|
||||
# url = "http://mohitg:8010/";
|
||||
# dbname = "mobikul";
|
||||
# username = "admin";
|
||||
# pwd = "webkul";
|
||||
|
||||
# sock_common = xmlrpclib.ServerProxy(url+'xmlrpc/common')
|
||||
# sock = xmlrpclib.ServerProxy(url+'xmlrpc/object')
|
||||
# try:
|
||||
# uid = sock_common.login(dbname, username, pwd)
|
||||
# print uid
|
||||
# except Exception as e:
|
||||
# print "Error in Connection %r"%e
|
||||
# sys.exit()
|
||||
|
||||
# def sync_w2m():
|
||||
# wc_ids = sock.execute(dbname, uid, pwd, 'product.public.category', 'search_read', [],['name','image','parent_id'])
|
||||
# mapping = {}
|
||||
# #creating categories without child/parent
|
||||
# for wc in wc_ids:
|
||||
# try:
|
||||
# mc = sock.execute(dbname, uid, pwd, 'mobikul.category', 'create',{'name':wc['name'],'image':wc['image']})
|
||||
# mapping[wc['id']]=mc
|
||||
# except Exception,e:
|
||||
# print "1) Error in WC-ID:%r"%wc['id']
|
||||
# print "Detail:%r"%e
|
||||
# #updating categories with child/parent
|
||||
# for wc in wc_ids:
|
||||
# if wc.get('parent_id'):
|
||||
# try:
|
||||
# sock.execute(dbname, uid, pwd, 'mobikul.category', 'write',mapping.get(wc['id']), {'parent_id':mapping.get(wc['parent_id'][0])})
|
||||
# except Exception,e:
|
||||
# print "2) Error in WC-ID:%r"%wc['parent_id']
|
||||
# print "Detail:%r"%e
|
||||
# #linking products with categories
|
||||
# p_ids = sock.execute(dbname, uid, pwd, 'product.template', 'search_read', [],['public_categ_ids'])
|
||||
# for p in p_ids:
|
||||
# mcids = [mapping.get(a) for a in p['public_categ_ids']]
|
||||
# if mcids:
|
||||
# try:
|
||||
# sock.execute(dbname, uid, pwd, 'product.template', 'write',p['id'],{'mobikul_categ_ids':[[6,0,mcids]]})
|
||||
# except Exception,e:
|
||||
# print "3) Error in P-ID:%r"%p['id']
|
||||
# print "Detail:%r"%e
|
||||
# # break
|
||||
|
||||
# def getBase64(key,pwd):
|
||||
# cred = {'login' : key, 'pwd' : pwd}
|
||||
# encoded_cred = str(cred).encode('base64','strict')
|
||||
# print encoded_cred
|
||||
# from base64 import b64decode
|
||||
# decoded_cred = b64decode(encoded_cred)
|
||||
# print decoded_cred
|
||||
|
||||
# if __name__=='__main__':
|
||||
# print "Start"
|
||||
# print sock.execute(dbname, uid, pwd, 'res.users', 'search_read', [('id','=',36)],['name','password','new_password'])
|
||||
# print sock.execute(dbname, uid, pwd, 'res.users', 'write', 36,{'password':'webkul'})
|
||||
# print sock.execute(dbname, uid, pwd, 'res.users', 'search_read', [('id','=',36)],['name','password','new_password'])
|
||||
# # print sync_w2m()
|
||||
# # getBase64('admin','webkul')
|
||||
|
||||
to_data = {
|
||||
"to":"False"
|
||||
}
|
||||
|
||||
if not to_data.get("to",False) and not to_data.get("registration_ids",False):
|
||||
print (True)
|
||||
else:
|
||||
print (False)
|
||||
|
|
@ -0,0 +1,26 @@
|
|||
<!-- <?xml version="1.0" encoding="utf-8"?>
|
||||
<odoo>
|
||||
|
||||
<record id="view_delivery_carrier_form_mobikul_delivery" model="ir.ui.view">
|
||||
<field name="name">delivery.carrier.mobikul.form</field>
|
||||
<field name="model">delivery.carrier</field>
|
||||
<field name="inherit_id" ref="website_sale_delivery.view_delivery_carrier_form_website_delivery"/>
|
||||
<field name="arch" type="xml">
|
||||
<div name="title" position="after">
|
||||
<field name="is_mobikul_available" invisible="1"/>
|
||||
</div>
|
||||
|
||||
<div name="button_box" position="inside">
|
||||
<button class="oe_stat_button" name="mobikul_publish_button"
|
||||
type="object" icon="fa-globe">
|
||||
<div class="o_stat_info published o_form_field">
|
||||
<span class="o_stat_text o_value text-success" attrs="{'invisible': [('is_mobikul_available', '=', False)]}">Published</span>
|
||||
<span class="o_stat_text o_value text-danger" attrs="{'invisible': [('is_mobikul_available', '=', True)]}">Unpublished</span>
|
||||
<span class="o_stat_text">On App</span>
|
||||
</div>
|
||||
</button>
|
||||
</div>
|
||||
|
||||
</field>
|
||||
</record>
|
||||
</odoo> -->
|
||||
|
|
@ -0,0 +1,37 @@
|
|||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<odoo>
|
||||
|
||||
<!-- Menu items hierachy -->
|
||||
<menuitem id="menu_mobikul_title" name="Mobikul" web_icon="mobikul,static/description/icon.png" sequence="99" groups="mobikul.group_mobikul_user,mobikul.group_mobikul_manager"/>
|
||||
|
||||
<menuitem id="menu_mobikul_dash" name="Dashboard" parent="menu_mobikul_title" sequence="0" groups="mobikul.group_mobikul_user,mobikul.group_mobikul_manager"/>
|
||||
<menuitem id="menu_mobikul_orders" name="App Orders" parent="menu_mobikul_title" sequence="1" groups="mobikul.group_mobikul_user,mobikul.group_mobikul_manager"/>
|
||||
<menuitem id="menu_mobikul_catalog" name="Catalogs" parent="menu_mobikul_title" sequence="2" groups="mobikul.group_mobikul_user,mobikul.group_mobikul_manager"/>
|
||||
<menuitem id="menu_mobikul_extras" name="Extra Added Features" parent="menu_mobikul_title" sequence="3" groups= "mobikul.group_mobikul_user,mobikul.group_mobikul_manager"/>
|
||||
<menuitem id="menu_mobikul_config" name="Configuration" parent="menu_mobikul_title" sequence="4" groups="mobikul.group_mobikul_manager"/>
|
||||
|
||||
<menuitem id="mobilkul_banners" name="Banners" parent="menu_mobikul_extras" action="mobikul_banners_action" sequence="1"/>
|
||||
<menuitem id="mobilkul_fcategory" name="Featured Category" parent="menu_mobikul_extras" action="mobikul_featured_category_action" sequence="2"/>
|
||||
<menuitem id="mobikul_pslider" name="Product Sliders" parent="menu_mobikul_extras" action="mobikul_product_slider_action" sequence="3"/>
|
||||
<menuitem id="mobilkul_push_notifications" name="Push Notifications" parent="menu_mobikul_extras" sequence="4"/>
|
||||
<menuitem id="mobilkul_push_notification_one_time" name="One-Time Notifications" parent="mobilkul_push_notifications" action="mobikul_push_notification_action" sequence="1"/>
|
||||
<menuitem id="mobilkul_push_notification_templates" name="Notification Templates" parent="mobilkul_push_notifications" action="mobikul_push_notification_templates_action" sequence="2"/>
|
||||
<menuitem id="menu_mobilkul_notification_messages" name="Notification Messages" parent="mobilkul_push_notifications" action="mobikul_notification_massages_templates_action" sequence="3"/>
|
||||
|
||||
<!-- Orders sub-menus -->
|
||||
<menuitem id="mobikul_orders_orders" name="Orders" parent="menu_mobikul_orders" action="mobikul_orders_action" sequence="1"/>
|
||||
<menuitem id="mobikul_orders_unpaid_orders" name="Unpaid Orders" parent="menu_mobikul_orders" action="mobikul_unpaid_orders_action" sequence="2"/>
|
||||
<menuitem id="mobikul_orders_abandonned_orders" name="Cancelled Orders" parent="menu_mobikul_orders" action="mobikul_abandonned_orders_action" sequence="3"/>
|
||||
<menuitem id="mobikul_orders_invoices" name="Invoices" parent="menu_mobikul_orders" action="mobikul_action_invoices" sequence="4"/>
|
||||
|
||||
<!-- Catalog sub-menus -->
|
||||
<menuitem id="mobikul_catalog_products" name="Products" parent="menu_mobikul_catalog" action="mobikul_product_template_action" sequence="1"/>
|
||||
<menuitem id="mobikul_config_category" name="Mobikul Category" parent="menu_mobikul_catalog" action="mobikul_category_action" sequence="1"/>
|
||||
|
||||
<!-- Config sub-menus -->
|
||||
<menuitem id="mobikul_config_settings" name="Settings" parent="menu_mobikul_config" action="mobikul_config_setting_action" sequence="1"/>
|
||||
|
||||
<menuitem id="mobikul_reg_devices_fcm" name="FCM Reg. Devices" parent="menu_mobikul_config" action="fcm_registered_devices_action" sequence="2"/>
|
||||
<menuitem id="mobikul_reg_topics_fcm" name="FCM Topics" parent="menu_mobikul_config" action="fcm_registered_topics_action" sequence="3"/>
|
||||
|
||||
</odoo>
|
||||
|
|
@ -0,0 +1,802 @@
|
|||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<odoo>
|
||||
<record id="fcm_registered_devices_view_form" model="ir.ui.view">
|
||||
<field name="name">fcm_registered_devices.form</field>
|
||||
<field name="model">fcm.registered.devices</field>
|
||||
<field name="arch" type="xml">
|
||||
<form string="Registered Devices">
|
||||
<sheet>
|
||||
<div class="oe_button_box" name="button_box">
|
||||
<button name="toggle_active" type="object" class="oe_stat_button" icon="fa-archive">
|
||||
<field name="active" widget="boolean_button" options='{"terminology": "archive"}'/>
|
||||
</button>
|
||||
</div>
|
||||
<group>
|
||||
<group>
|
||||
<field name="customer_id"/>
|
||||
<field name="device_id"/>
|
||||
</group>
|
||||
<group>
|
||||
<field name="create_date"/>
|
||||
<field name="write_date"/>
|
||||
</group>
|
||||
<field name="token"/>
|
||||
<field name="description"/>
|
||||
</group>
|
||||
</sheet>
|
||||
</form>
|
||||
</field>
|
||||
</record>
|
||||
|
||||
<record id="fcm_registered_devices_view_tree" model="ir.ui.view">
|
||||
<field name="name">fcm_registered_devices.tree</field>
|
||||
<field name="model">fcm.registered.devices</field>
|
||||
<field name="arch" type="xml">
|
||||
<tree string="Registered Devices">
|
||||
<field name="customer_id"/>
|
||||
<field name="device_id"/>
|
||||
<field name="create_date"/>
|
||||
<field name="write_date"/>
|
||||
</tree>
|
||||
</field>
|
||||
</record>
|
||||
|
||||
<record id="fcm_registered_devices_action" model="ir.actions.act_window">
|
||||
<field name="name">FCM Registered Devices</field>
|
||||
<field name="res_model">fcm.registered.devices</field>
|
||||
<field name="view_mode">tree,form</field>
|
||||
<field name="view_type">form</field>
|
||||
<field name="view_id" ref="fcm_registered_devices_view_tree"/>
|
||||
</record>
|
||||
|
||||
<record id="fcm_registered_topics_view_tree" model="ir.ui.view">
|
||||
<field name="name">fcm_registered_topics.tree</field>
|
||||
<field name="model">fcm.registered.topics</field>
|
||||
<field name="arch" type="xml">
|
||||
<tree string="All FCM Topics" editable="top">
|
||||
<field name="name"/>
|
||||
</tree>
|
||||
</field>
|
||||
</record>
|
||||
|
||||
<record id="fcm_registered_topics_action" model="ir.actions.act_window">
|
||||
<field name="name">FCM Registered Topics</field>
|
||||
<field name="res_model">fcm.registered.topics</field>
|
||||
<field name="view_mode">tree</field>
|
||||
<field name="view_type">form</field>
|
||||
<field name="view_id" ref="fcm_registered_topics_view_tree"/>
|
||||
</record>
|
||||
|
||||
<record id="mobikul_push_notification_view_form" model="ir.ui.view">
|
||||
<field name="name">mobikul.push.notification.form</field>
|
||||
<field name="model">mobikul.push.notification</field>
|
||||
<field name="arch" type="xml">
|
||||
<form string="Push Notification">
|
||||
<header>
|
||||
<button name="action_confirm" states="draft" type="object" string="Confirm" class="oe_highlight"/>
|
||||
<button name="action_draft" states="cancel,hold" type="object" string="Set to Draft"/>
|
||||
<button name="action_hold" states="confirm" type="object" string="Set to Hold"/>
|
||||
<button name="action_confirm" states="hold" type="object" string="Release Hold" class="oe_highlight"/>
|
||||
<button name="action_cancel" states="draft,hold" type="object" string="Cancel"/>
|
||||
<button name="push_now" states="confirm" type="object" string="Push now" class="oe_highlight"/>
|
||||
<button name="duplicate_me" states="done" type="object" string="Duplicate" />
|
||||
<button name="push_now" states="error" type="object" string="Retry" class="oe_highlight"/>
|
||||
<field name="state" widget="statusbar" statusbar_visible="draft,confirm,done"/>
|
||||
</header>
|
||||
<sheet>
|
||||
<div class="oe_button_box" name="button_box">
|
||||
<button name="toggle_active" type="object" class="oe_stat_button" icon="fa-archive">
|
||||
<field name="active" widget="boolean_button" options='{"terminology": "archive"}'/>
|
||||
</button>
|
||||
</div>
|
||||
<field name="image" widget="image" class="oe_avatar"/>
|
||||
<div class="oe_title">
|
||||
<div class="oe_edit_only">
|
||||
<label for="name" string="Name"/>
|
||||
</div>
|
||||
<h1>
|
||||
<field name="name" default_focus="1" placeholder="Record name"/>
|
||||
</h1>
|
||||
</div>
|
||||
<br/>
|
||||
<br/>
|
||||
<separator string="Result" colspan="4" attrs="{'invisible': [('state', 'not in', ['done','error'])]}"/>
|
||||
<field name="summary" colspan="4" attrs="{'invisible': [('state', 'not in', ['done','error'])]}"/>
|
||||
<notebook>
|
||||
<page string="Information">
|
||||
<separator string="Content to be displayed in Push Notification" colspan="4"/>
|
||||
<field name="notification_title" colspan="4" placeholder="Title"/>
|
||||
<field name="notification_body" colspan="4" placeholder="Body"/>
|
||||
<separator string="Action to be triggered on click/touch" colspan="4"/>
|
||||
<group>
|
||||
<group>
|
||||
<field name="banner_action"/>
|
||||
</group>
|
||||
<group>
|
||||
<field name="product_id" attrs="{'invisible': [('banner_action', 'in', ['category','none',False,'custom'])], 'required': [('banner_action', '=', 'product')]}"/>
|
||||
<field name="category_id" attrs="{'invisible': [('banner_action', 'in', ['product','none',False,'custom'])], 'required': [('banner_action', '=', 'category')]}"/>
|
||||
<field name="product_ids" attrs="{'invisible': [('banner_action', 'in', ['product','none',False,'category'])], 'required': [('banner_action', '=', 'custom')]}" widget="many2many_tags"/>
|
||||
</group>
|
||||
</group>
|
||||
</page>
|
||||
<page string="Advanced">
|
||||
<separator string="Notification Type" colspan="4"/>
|
||||
<group>
|
||||
<group>
|
||||
<field name="notification_type"/>
|
||||
</group>
|
||||
<group>
|
||||
<field name="topic_id" attrs="{'invisible': [('notification_type', 'in', ['token-auto','token-manual'])], 'required': [('notification_type', '=', 'topic')]}" widget="selection"/>
|
||||
<field name="device_ids" attrs="{'invisible': [('notification_type', 'in', ['topic','token-auto'])], 'required': [('notification_type', '=', 'token-manual')]}" widget="many2many_tags" quick_create="false"/>
|
||||
</group>
|
||||
</group>
|
||||
<separator string="Others" colspan="4"/>
|
||||
<group>
|
||||
<group>
|
||||
<field name="activation_date"/>
|
||||
<field name="notification_color"/>
|
||||
<field name="notification_tag"/>
|
||||
</group>
|
||||
<group>
|
||||
<field name="total_views"/>
|
||||
</group>
|
||||
</group>
|
||||
</page>
|
||||
</notebook>
|
||||
</sheet>
|
||||
</form>
|
||||
</field>
|
||||
</record>
|
||||
|
||||
<record id="mobikul_push_notification_view_tree" model="ir.ui.view">
|
||||
<field name="name">mobikul.push.notification.tree</field>
|
||||
<field name="model">mobikul.push.notification</field>
|
||||
<field name="arch" type="xml">
|
||||
<tree string="Push Notifications" colors="grey:state == 'done';green:state == 'confirm';red:state == 'hold';blue:state == 'draft';">
|
||||
<field name="name"/>
|
||||
<field name="banner_action"/>
|
||||
<field name="activation_date"/>
|
||||
<field name="state"/>
|
||||
</tree>
|
||||
</field>
|
||||
</record>
|
||||
|
||||
<record id="mobikul_push_notification_filter_view" model="ir.ui.view">
|
||||
<field name="name">mobikul_push_notification.search.mobikul</field>
|
||||
<field name="model">mobikul.push.notification</field>
|
||||
<field name="arch" type="xml">
|
||||
<search string="Mobikul Push Notification">
|
||||
<field name="name" string="Push Notification" filter_domain="[('name','ilike',self)]"/>
|
||||
<separator/>
|
||||
<filter string="Archived" name="inactive" domain="[('active','=',False)]"/>
|
||||
</search>
|
||||
</field>
|
||||
</record>
|
||||
|
||||
|
||||
<!-- mobikul.push.notification : actions -->
|
||||
<record id="mobikul_push_notification_action" model="ir.actions.act_window">
|
||||
<field name="name">Mobikul Push Notifications</field>
|
||||
<field name="res_model">mobikul.push.notification</field>
|
||||
<field name="view_mode">tree,form</field>
|
||||
<field name="view_type">form</field>
|
||||
<field name="view_id" ref="mobikul_push_notification_view_tree"/>
|
||||
<field name="search_view_id" ref="mobikul_push_notification_filter_view"/>
|
||||
<field name="help" type="html">
|
||||
<p class="oe_view_nocontent_create">
|
||||
Click to add a new Push Notification for your Mobikul App.
|
||||
</p>
|
||||
</field>
|
||||
</record>
|
||||
|
||||
<record id="mobikul_push_notification_template_view_form" model="ir.ui.view">
|
||||
<field name="name">mobikul.push.notification.template.form</field>
|
||||
<field name="model">mobikul.push.notification.template</field>
|
||||
<field name="arch" type="xml">
|
||||
<form string="Push Notification Template">
|
||||
<sheet>
|
||||
<div class="oe_button_box" name="button_box">
|
||||
<button name="toggle_active" type="object" class="oe_stat_button" icon="fa-archive">
|
||||
<field name="active" widget="boolean_button" options='{"terminology": "archive"}'/>
|
||||
</button>
|
||||
</div>
|
||||
<field name="image" widget="image" class="oe_avatar"/>
|
||||
<div class="oe_title">
|
||||
<div class="oe_edit_only">
|
||||
<label for="name" string="Name"/>
|
||||
</div>
|
||||
<h1>
|
||||
<field name="name" default_focus="1" placeholder="Record name"/>
|
||||
</h1>
|
||||
</div>
|
||||
<notebook>
|
||||
<page string="Information">
|
||||
<separator string="Notification will be triggered automatically when" colspan="4"/>
|
||||
<group>
|
||||
<field name="condition" required="1"/>
|
||||
</group>
|
||||
<separator string="Content to be displayed in Push Notification" colspan="4"/>
|
||||
<field name="notification_title" colspan="4" placeholder="Title"/>
|
||||
<field name="notification_body" colspan="4" placeholder="Body"/>
|
||||
<separator string="Action to be triggered on click/touch" colspan="4"/>
|
||||
<group>
|
||||
<group>
|
||||
<field name="banner_action"/>
|
||||
</group>
|
||||
<group>
|
||||
<field name="product_id" attrs="{'invisible': [('banner_action', 'in', ['category','none',False,'custom'])], 'required': [('banner_action', '=', 'product')]}"/>
|
||||
<field name="category_id" attrs="{'invisible': [('banner_action', 'in', ['product','none',False,'custom'])], 'required': [('banner_action', '=', 'category')]}"/>
|
||||
<field name="product_ids" attrs="{'invisible': [('banner_action', 'in', ['product','none',False,'category'])], 'required': [('banner_action', '=', 'custom')]}" widget="many2many_tags"/>
|
||||
</group>
|
||||
</group>
|
||||
</page>
|
||||
<page string="Advanced">
|
||||
<group>
|
||||
<group>
|
||||
<field name="notification_color"/>
|
||||
<field name="notification_tag"/>
|
||||
</group>
|
||||
<group>
|
||||
<field name="total_views"/>
|
||||
</group>
|
||||
<group>
|
||||
<field name="device_id" widget="selection"/>
|
||||
|
||||
</group>
|
||||
<button name="dry_run" type="object" string="Dry run on" class="oe_highlight" style="width: 83px;position: relative;top: 8px;"/>
|
||||
</group>
|
||||
|
||||
</page>
|
||||
</notebook>
|
||||
</sheet>
|
||||
</form>
|
||||
</field>
|
||||
</record>
|
||||
|
||||
<record id="mobikul_push_notification_template_view_tree" model="ir.ui.view">
|
||||
<field name="name">mobikul.push.notification.template.tree</field>
|
||||
<field name="model">mobikul.push.notification.template</field>
|
||||
<field name="arch" type="xml">
|
||||
<tree string="Push Notification Templates">
|
||||
<field name="name"/>
|
||||
<field name="banner_action"/>
|
||||
</tree>
|
||||
</field>
|
||||
</record>
|
||||
|
||||
|
||||
<record id="mobikul_push_notification_templates_action" model="ir.actions.act_window">
|
||||
<field name="name">Push Notifications Templates</field>
|
||||
<field name="res_model">mobikul.push.notification.template</field>
|
||||
<field name="view_mode">tree,form</field>
|
||||
<field name="view_type">form</field>
|
||||
<field name="help" type="html">
|
||||
<p class="oe_view_nocontent_create">
|
||||
Click to add a new Push Notification Templates for your Mobikul App.
|
||||
</p>
|
||||
</field>
|
||||
</record>
|
||||
|
||||
<!-- mobikul.banners: views -->
|
||||
<record id="mobikul_banners_view_form" model="ir.ui.view">
|
||||
<field name="name">mobikul.banners.form</field>
|
||||
<field name="model">mobikul.banners</field>
|
||||
<field name="arch" type="xml">
|
||||
<form string="Banner">
|
||||
<sheet>
|
||||
<div class="oe_button_box" name="button_box">
|
||||
<button name="toggle_active" type="object" class="oe_stat_button" icon="fa-archive">
|
||||
<field name="active" widget="boolean_button" options='{"terminology": "archive"}'/>
|
||||
</button>
|
||||
</div>
|
||||
<div class="oe_title">
|
||||
<div class="oe_edit_only">
|
||||
<label for="name" string="Title"/>
|
||||
</div>
|
||||
<h1>
|
||||
<field name="name" default_focus="1" placeholder="Name"/>
|
||||
</h1>
|
||||
</div>
|
||||
<notebook>
|
||||
<page string="Information">
|
||||
<group>
|
||||
<group>
|
||||
<field name="banner_action"/>
|
||||
</group>
|
||||
<group>
|
||||
<field name="product_id" attrs="{'invisible': [('banner_action', 'in', ['category','none',False,'custom'])], 'required': [('banner_action', '=', 'product')]}"/>
|
||||
<field name="category_id" attrs="{'invisible': [('banner_action', 'in', ['product','none',False,'custom'])], 'required': [('banner_action', '=', 'category')]}"/>
|
||||
</group>
|
||||
</group>
|
||||
<group string="Custom Collection" attrs="{'invisible': [('banner_action', 'in', ['product','none',False,'category'])]}">
|
||||
<field name="product_ids" attrs="{'invisible': [('banner_action', 'in', ['product','none',False,'category'])], 'required': [('banner_action', '=', 'custom')]}" nolabel="1">
|
||||
<tree>
|
||||
<field name="name"/>
|
||||
<field name="mobikul_categ_ids"/>
|
||||
</tree>
|
||||
</field>
|
||||
</group>
|
||||
<separator string="Description" colspan="4"/>
|
||||
<field name="description" colspan="4" placeholder="Description for Banner for Internal use only."/>
|
||||
</page>
|
||||
<page string="Advanced">
|
||||
<div>
|
||||
<label for="name" string="Banner`s Image Url (Optional)"/>
|
||||
<field name="url"/>
|
||||
</div>
|
||||
<group>
|
||||
<group>
|
||||
<field name="date_published"/>
|
||||
<field name="date_expired"/>
|
||||
</group>
|
||||
<group>
|
||||
<field name="sequence"/>
|
||||
<field name="total_views"/>
|
||||
</group>
|
||||
</group>
|
||||
</page>
|
||||
</notebook>
|
||||
</sheet>
|
||||
<div>
|
||||
<div class="oe_edit_only" attrs="{'invisible': [('image', '=', False)]}">
|
||||
<h1>Change Banner Image</h1>
|
||||
</div>
|
||||
<div class="oe_edit_only" attrs="{'invisible': [('image', '!=', False)]}">
|
||||
<h1>Upload Banner Image</h1>
|
||||
</div>
|
||||
<field name="image" widget="image" colspan="4"/>
|
||||
</div>
|
||||
</form>
|
||||
</field>
|
||||
</record>
|
||||
|
||||
<record id="mobikul_banners_view_tree" model="ir.ui.view">
|
||||
<field name="name">mobikul.banners.tree</field>
|
||||
<field name="model">mobikul.banners</field>
|
||||
<field name="arch" type="xml">
|
||||
<tree string="Banner Images">
|
||||
<field name="sequence" widget="handle"/>
|
||||
<field name="name"/>
|
||||
<field name="banner_action"/>
|
||||
<field name="date_published"/>
|
||||
<field name="date_expired"/>
|
||||
</tree>
|
||||
</field>
|
||||
</record>
|
||||
|
||||
<record id="mobikul_banners_filter_view" model="ir.ui.view">
|
||||
<field name="name">mobikul_banners.search.mobikul</field>
|
||||
<field name="model">mobikul.banners</field>
|
||||
<field name="arch" type="xml">
|
||||
<search string="Mobikul Banner">
|
||||
<field name="name" string="Banner" filter_domain="[('name','ilike',self)]"/>
|
||||
<separator/>
|
||||
<filter string="Archived" name="inactive" domain="[('active','=',False)]"/>
|
||||
</search>
|
||||
</field>
|
||||
</record>
|
||||
|
||||
<!-- mobikul.banner.images : actions -->
|
||||
<record id="mobikul_banners_action" model="ir.actions.act_window">
|
||||
<field name="name">Mobikul Banners</field>
|
||||
<field name="res_model">mobikul.banners</field>
|
||||
<field name="view_mode">tree,form</field>
|
||||
<field name="view_type">form</field>
|
||||
<field name="view_id" ref="mobikul_banners_view_tree"/>
|
||||
<field name="search_view_id" ref="mobikul_banners_filter_view"/>
|
||||
<field name="help" type="html">
|
||||
<p class="oe_view_nocontent_create">
|
||||
Click to add a new Banner for your Mobikul App.
|
||||
</p>
|
||||
</field>
|
||||
</record>
|
||||
|
||||
<record id="mobikul_category_form_view" model="ir.ui.view">
|
||||
<field name="name">mobikul.category.form</field>
|
||||
<field name="model">mobikul.category</field>
|
||||
<field name="arch" type="xml">
|
||||
<form class="oe_form_configuration">
|
||||
<sheet>
|
||||
<div class="oe_button_box" name="button_box">
|
||||
<button class="oe_stat_button"
|
||||
name="%(mobikul_product_template_action)d"
|
||||
icon="fa-th-list"
|
||||
type="action"
|
||||
context="{'search_default_mobikul_categ_ids': active_id}">
|
||||
<div class="o_form_field o_stat_info">
|
||||
<span class="o_stat_text"> Products</span>
|
||||
</div>
|
||||
</button>
|
||||
<button name="toggle_active" type="object" class="oe_stat_button" icon="fa-archive">
|
||||
<field name="active" widget="boolean_button" options='{"terminology": "archive"}'/>
|
||||
</button>
|
||||
</div>
|
||||
<field name="icon" widget="image" class="oe_avatar"/>
|
||||
<div class="oe_title">
|
||||
<div class="oe_edit_only">
|
||||
<label for="name" string="Name"/>
|
||||
</div>
|
||||
<h1>
|
||||
<field name="name" default_focus="1" placeholder="Name"/>
|
||||
</h1>
|
||||
</div>
|
||||
<group name="charac" col="4" string="Category Type">
|
||||
<field name="parent_id"/>
|
||||
<field name="type" widget="radio"/>
|
||||
<field name="sequence"/>
|
||||
</group>
|
||||
<!-- <group string="Upload Banner/Icon for this Category">
|
||||
<field name="banner" widget="image" colspan="6"/>
|
||||
<field name="icon" widget="image" colspan="6"/>
|
||||
</group> -->
|
||||
</sheet>
|
||||
</form>
|
||||
</field>
|
||||
</record>
|
||||
|
||||
<record id="mobikul_category_view_tree" model="ir.ui.view">
|
||||
<field name="name">mobikul.category.tree</field>
|
||||
<field name="model">mobikul.category</field>
|
||||
<field name="arch" type="xml">
|
||||
<tree string="Mobikul Category">
|
||||
<field name="sequence" />
|
||||
<field name="complete_name"/>
|
||||
<!--<field name="name"/>-->
|
||||
</tree>
|
||||
</field>
|
||||
</record>
|
||||
|
||||
<record id="mobikul_category_view_tree2" model="ir.ui.view">
|
||||
<field name="name">mobikul.category.tree2</field>
|
||||
<field name="model">mobikul.category</field>
|
||||
<field name="arch" type="xml">
|
||||
<tree string="Mobikul Category">
|
||||
<field name="sequence" />
|
||||
<field name="complete_name" />
|
||||
<field name="name" invisible="1"/>
|
||||
</tree>
|
||||
</field>
|
||||
</record>
|
||||
|
||||
<record id="mobikul_category_filter_view" model="ir.ui.view">
|
||||
<field name="name">mobikul.category.search.mobikul</field>
|
||||
<field name="model">mobikul.category</field>
|
||||
<field name="arch" type="xml">
|
||||
<search string="Mobikul Category">
|
||||
<field name="name" string="Category" filter_domain="[('name','ilike',self)]"/>
|
||||
<separator/>
|
||||
<filter string="Featured" name="is_featured" domain="[('type','=','featured')]"/>
|
||||
<filter string="Archived" name="inactive" domain="[('active','=',False)]"/>
|
||||
</search>
|
||||
</field>
|
||||
</record>
|
||||
|
||||
<!-- mobikul.category : actions -->
|
||||
<record id="mobikul_category_action" model="ir.actions.act_window">
|
||||
<field name="name">Mobikul Category</field>
|
||||
<field name="res_model">mobikul.category</field>
|
||||
<field name="view_mode">tree,form</field>
|
||||
<field name="view_type">form</field>
|
||||
<field name="view_id" ref="mobikul_category_view_tree"/>
|
||||
<field name="search_view_id" ref="mobikul_category_filter_view"/>
|
||||
<field name="help" type="html">
|
||||
<p class="oe_view_nocontent_create">
|
||||
Click to add a new Category for your Mobikul App.
|
||||
</p>
|
||||
</field>
|
||||
</record>
|
||||
|
||||
<!-- Featured Category : actions -->
|
||||
<record id="mobikul_featured_category_action" model="ir.actions.act_window">
|
||||
<field name="name">Mobikul Featured Category</field>
|
||||
<field name="res_model">mobikul.category</field>
|
||||
<field name="view_mode">tree,form</field>
|
||||
<field name="view_type">form</field>
|
||||
<field name="view_id" ref="mobikul_category_view_tree2"/>
|
||||
<field name="context">{'search_default_is_featured': 1, 'default_type': 'featured'}</field>
|
||||
<field name="help" type="html">
|
||||
<p class="oe_view_nocontent_create">
|
||||
Click to add a new Featured Category for your Mobikul App.
|
||||
</p>
|
||||
</field>
|
||||
</record>
|
||||
|
||||
<record id="mobikul_mobikul_view_form" model="ir.ui.view">
|
||||
<field name="name">mobikul.form</field>
|
||||
<field name="model">mobikul</field>
|
||||
<field name="arch" type="xml">
|
||||
<form string="Mobikul-App Configuration">
|
||||
<sheet>
|
||||
<div class="oe_title">
|
||||
<div class="oe_edit_only">
|
||||
<label for="name" string="Title"/>
|
||||
</div>
|
||||
<h1>
|
||||
<field name="name" default_focus="1" placeholder="Name"/>
|
||||
</h1>
|
||||
</div>
|
||||
<notebook>
|
||||
<page string="Credentials">
|
||||
<group string="Mobikul API Configuration">
|
||||
<field name="api_key"/>
|
||||
</group>
|
||||
<group string="Android Push Notification Credentials">
|
||||
<field name="fcm_api_key"/>
|
||||
</group>
|
||||
</page>
|
||||
<page string="Advanced">
|
||||
<group>
|
||||
<group string="Pricelist/Currency">
|
||||
<field name="pricelist_id"/>
|
||||
<field name="currency_id"/>
|
||||
</group>
|
||||
<group string="Language">
|
||||
<label for="language_ids"/>
|
||||
<div name="language_ids">
|
||||
<div>
|
||||
<div name="language_ids" class="oe_inline">
|
||||
<field name="language_ids" widget="many2many_checkboxes"/>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<field name="default_lang" widget="selection"/>
|
||||
<field name="website_id" widget="selection"/>
|
||||
</group>
|
||||
</group>
|
||||
<group string="Orders">
|
||||
<group >
|
||||
<field name="salesperson_id"/>
|
||||
<field name="salesteam_id"/>
|
||||
</group>
|
||||
<group >
|
||||
<field name="order_mail_template"/>
|
||||
</group>
|
||||
</group>
|
||||
<group string="Mobikul Extra Features">
|
||||
<group >
|
||||
<field name="product_limit"/>
|
||||
</group>
|
||||
<group >
|
||||
<field name="color_scheme" string="Choose Combination"/>
|
||||
</group>
|
||||
</group>
|
||||
</page>
|
||||
</notebook>
|
||||
</sheet>
|
||||
</form>
|
||||
</field>
|
||||
</record>
|
||||
|
||||
|
||||
<record id="mobikul_mobikul_view_tree" model="ir.ui.view">
|
||||
<field name="name">mobikul.tree</field>
|
||||
<field name="model">mobikul</field>
|
||||
<field name="arch" type="xml">
|
||||
<tree string="Mobikul-App Configuration">
|
||||
<field name="name"/>
|
||||
</tree>
|
||||
</field>
|
||||
</record>
|
||||
|
||||
<!-- mobikul.category : actions -->
|
||||
<record id="mobikul_mobikul_action" model="ir.actions.act_window">
|
||||
<field name="name">Mobikul-App Configuration</field>
|
||||
<field name="res_model">mobikul</field>
|
||||
<field name="view_mode">tree,form</field>
|
||||
<field name="view_type">form</field>
|
||||
<field name="view_id" ref="mobikul_mobikul_view_tree"/>
|
||||
</record>
|
||||
|
||||
|
||||
|
||||
<record id="mobikul_product_slider_form_view" model="ir.ui.view">
|
||||
<field name="name">mobikul_product_slider.form</field>
|
||||
<field name="model">mobikul.product.slider</field>
|
||||
<field name="arch" type="xml">
|
||||
<form class="oe_form_configuration">
|
||||
<sheet>
|
||||
<div class="oe_button_box" name="button_box">
|
||||
<button class="oe_stat_button" name="action_view_products"
|
||||
type="object" icon="fa-th-list" >
|
||||
<field string="Products" name="product_count" widget="statinfo" />
|
||||
</button>
|
||||
<button name="toggle_active" type="object" class="oe_stat_button" icon="fa-archive">
|
||||
<field name="active" widget="boolean_button" options='{"terminology": "archive"}'/>
|
||||
</button>
|
||||
</div>
|
||||
<div class="oe_title">
|
||||
<div class="oe_edit_only">
|
||||
<label for="name" string="Name"/>
|
||||
</div>
|
||||
<h1>
|
||||
<field name="name" default_focus="1" placeholder="Name"/>
|
||||
</h1>
|
||||
</div>
|
||||
<group string="Product Selection">
|
||||
<group>
|
||||
<field name="product_selection"/>
|
||||
<field name="product_based_on" attrs="{'invisible': [('product_selection', '=', 'manual')],'required': [('product_selection', '=', 'automatic')]}"/>
|
||||
</group>
|
||||
<group>
|
||||
<field name="mcategory_id" attrs="{'invisible': ['|', ('product_selection', '=','manual'),('product_based_on', 'not in', ['mCategory'])],'required': ['&', ('product_selection', '=', 'automatic'),('product_based_on', '=', 'mCategory')]}"/>
|
||||
<field name="wcategory_id" attrs="{'invisible': ['|', ('product_selection', '=','manual'),('product_based_on', 'not in', ['wCategory'])],'required': ['&', ('product_selection', '=', 'automatic'),('product_based_on', '=', 'wCategory')]}"/>
|
||||
<field name="icategory_id" attrs="{'invisible': ['|', ('product_selection', '=','manual'),('product_based_on', 'not in', ['iCategory'])],'required': ['&', ('product_selection', '=', 'automatic'),('product_based_on', '=', 'iCategory')]}"/>
|
||||
<field name="product_ids" string="Products" widget="many2many_tags" attrs="{'invisible': [('product_selection', '=', 'automatic')],'required': [('product_selection', '=', 'manual')]}"/>
|
||||
</group>
|
||||
</group>
|
||||
<group string="General Settings">
|
||||
<group>
|
||||
<field name="sequence"/>
|
||||
<field name="slider_mode"/>
|
||||
<field name="product_img_position" readonly="1"/>
|
||||
</group>
|
||||
<group>
|
||||
<field name="item_limit"/>
|
||||
<field name="item_display_limit" readonly="1"/>
|
||||
<field name="total_views" invisible="1"/>
|
||||
</group>
|
||||
</group>
|
||||
<!-- <group string="Background/Banner Image for your Slider">
|
||||
<group>
|
||||
<field name="display_banner" string="Enable ?"/>
|
||||
</group>
|
||||
<group>
|
||||
<field name="banner" attrs="{'invisible': [('display_banner', '=', False)]}"/>
|
||||
<field name="url" attrs="{'invisible': [('display_banner', '=', False)]}"/>
|
||||
</group>
|
||||
</group> -->
|
||||
<separator string="Description" colspan="4"/>
|
||||
<field name="description" colspan="4" placeholder="For Internal purpose Only"/>
|
||||
</sheet>
|
||||
</form>
|
||||
</field>
|
||||
</record>
|
||||
|
||||
<record id="mobikul_product_slider_view_tree" model="ir.ui.view">
|
||||
<field name="name">mobikul_product_slider.tree</field>
|
||||
<field name="model">mobikul.product.slider</field>
|
||||
<field name="arch" type="xml">
|
||||
<tree string="Mobikul Product Slider">
|
||||
<field name="sequence" widget="handle"/>
|
||||
<field name="name"/>
|
||||
<field name="slider_mode"/>
|
||||
<field name="total_views"/>
|
||||
</tree>
|
||||
</field>
|
||||
</record>
|
||||
|
||||
<record id="mobikul_product_slider_filter_view" model="ir.ui.view">
|
||||
<field name="name">mobikul_product_slider.search.mobikul</field>
|
||||
<field name="model">mobikul.product.slider</field>
|
||||
<field name="arch" type="xml">
|
||||
<search string="Mobikul Product Slider">
|
||||
<field name="name" string="Slider" filter_domain="[('name','ilike',self)]"/>
|
||||
<separator/>
|
||||
<filter string="Archived" name="inactive" domain="[('active','=',False)]"/>
|
||||
<group expand="0" string="Group By">
|
||||
<filter string="Slider Mode" domain="[]" context="{'group_by':'slider_mode'}"/>
|
||||
</group>
|
||||
</search>
|
||||
</field>
|
||||
</record>
|
||||
|
||||
<!-- mobikul.category : actions -->
|
||||
<record id="mobikul_product_slider_action" model="ir.actions.act_window">
|
||||
<field name="name">Product Slider</field>
|
||||
<field name="res_model">mobikul.product.slider</field>
|
||||
<field name="view_mode">tree,form</field>
|
||||
<field name="view_type">form</field>
|
||||
<field name="view_id" ref="mobikul_product_slider_view_tree"/>
|
||||
<field name="search_view_id" ref="mobikul_product_slider_filter_view"/>
|
||||
<field name="help" type="html">
|
||||
<p class="oe_view_nocontent_create">
|
||||
Click to add a new Product Slider for your Mobikul App.
|
||||
</p>
|
||||
</field>
|
||||
</record>
|
||||
|
||||
|
||||
<!-- mobikul.notification.messages tree view -->
|
||||
<record id="mobikul_notification_massages_view_tree" model="ir.ui.view">
|
||||
<field name="name">mobikul_notification_massages.tree</field>
|
||||
<field name="model">mobikul.notification.messages</field>
|
||||
<field name="arch" type="xml">
|
||||
<tree string="Notification Messages">
|
||||
<field name="name"/>
|
||||
<field name="is_read"/>
|
||||
<field name="customer_id"/>
|
||||
<field name="create_date"/>
|
||||
</tree>
|
||||
</field>
|
||||
</record>
|
||||
|
||||
<!-- mobikul.notification.messages FORM -->
|
||||
<record id="mobikul_notification_massages_view_form" model="ir.ui.view">
|
||||
<field name="name">mobikul_notification_massages.form</field>
|
||||
<field name="model">mobikul.notification.messages</field>
|
||||
<field name="arch" type="xml">
|
||||
<form string="Notification Messages">
|
||||
<sheet>
|
||||
<div class="oe_button_box" name="button_box">
|
||||
<button name="toggle_active" type="object" class="oe_stat_button" icon="fa-archive">
|
||||
<field name="active" widget="boolean_button" options='{"terminology": "archive"}'/>
|
||||
</button>
|
||||
</div>
|
||||
<div class="oe_title">
|
||||
<div class="oe_edit_only">
|
||||
<label for="name" string="Name"/>
|
||||
</div>
|
||||
<h1>
|
||||
<field name="name" default_focus="1" placeholder="Record name"/>
|
||||
</h1>
|
||||
</div>
|
||||
<br/>
|
||||
<br/>
|
||||
|
||||
<notebook>
|
||||
<page string="Information">
|
||||
<separator string="Content to be displayed in Notification Message" colspan="4"/>
|
||||
<field name="title" colspan="4" placeholder="Title"/>
|
||||
<separator/>
|
||||
<field name="subtitle" colspan="4" placeholder="Subtitle"/>
|
||||
<field name="body" colspan="4" placeholder="Body"/>
|
||||
<group>
|
||||
<group>
|
||||
<field name="icon" widget="image" class="oe_avatar"/>
|
||||
</group>
|
||||
<group>
|
||||
<field name="datatype"/>
|
||||
<field name="is_read" />
|
||||
<field name="customer_id"/>
|
||||
<field name="period" />
|
||||
</group>
|
||||
|
||||
</group>
|
||||
</page>
|
||||
</notebook>
|
||||
</sheet>
|
||||
<div>
|
||||
<div class="oe_edit_only" attrs="{'invisible': [('banner', '=', False)]}">
|
||||
<h1>Change Banner Image</h1>
|
||||
</div>
|
||||
<div class="oe_edit_only" attrs="{'invisible': [('banner', '!=', False)]}">
|
||||
<h1>Upload Banner Image</h1>
|
||||
</div>
|
||||
<field name="banner" widget="image" colspan="4"/>
|
||||
</div>
|
||||
</form>
|
||||
</field>
|
||||
</record>
|
||||
|
||||
<record id="mobikul_notification_massages_filter_view" model="ir.ui.view">
|
||||
<field name="name">Mobikul Notification Messages Search</field>
|
||||
<field name="model">mobikul.notification.messages</field>
|
||||
<field name="arch" type="xml">
|
||||
<search string="Mobikul Notification Messages">
|
||||
<group expand="0" string="Group By">
|
||||
<filter string="Customer" domain="[]" context="{'group_by':'customer_id'}"/>
|
||||
</group>
|
||||
</search>
|
||||
</field>
|
||||
</record>
|
||||
|
||||
<!-- mobikul.notification.messages action -->
|
||||
<record id="mobikul_notification_massages_templates_action" model="ir.actions.act_window">
|
||||
<field name="name">Mobikul Notification Messages Action</field>
|
||||
<field name="res_model">mobikul.notification.messages</field>
|
||||
<field name="view_mode">tree,form</field>
|
||||
<field name="view_type">form</field>
|
||||
<field name="view_id" ref="mobikul_notification_massages_view_tree"/>
|
||||
<field name="context">{'search_default_group_customer_id': 1}</field>
|
||||
|
||||
<field name="search_view_id" ref="mobikul_notification_massages_filter_view"/>
|
||||
<field name="help" type="html">
|
||||
<p class="oe_view_nocontent_create">
|
||||
Click to add a new Notification Messages for your Mobikul App.
|
||||
</p>
|
||||
</field>
|
||||
</record>
|
||||
|
||||
|
||||
</odoo>
|
||||
|
|
@ -0,0 +1,71 @@
|
|||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<odoo>
|
||||
<record id="mobikul_acquirer_form" model="ir.ui.view">
|
||||
<field name="name">mobikul.acquirer_form</field>
|
||||
<field name="model">payment.acquirer</field>
|
||||
<field name="inherit_id" ref="payment.acquirer_form"/>
|
||||
<field name="arch" type="xml">
|
||||
<xpath expr="//notebook" position="inside">
|
||||
<page name='mobikul' string="Mobikul">
|
||||
<group name="mobikul">
|
||||
<field name="is_mobikul_available"/>
|
||||
<field name="mobikul_reference_code" attrs="{'invisible': [('is_mobikul_available', '=', False)], 'required': [('is_mobikul_available', '=', True)]}" password="True"/>
|
||||
<!-- <field name="mobikul_pre_msg" attrs="{'invisible': [('is_mobikul_available', '=', False)]}"/> -->
|
||||
</group>
|
||||
</page>
|
||||
</xpath>
|
||||
</field>
|
||||
</record>
|
||||
|
||||
<record id="mobikul_orders_filter_view" model="ir.ui.view">
|
||||
<field name="name">sale.order.mobikul.search.view</field>
|
||||
<field name="model">sale.order</field>
|
||||
<field name="inherit_id" ref="sale.view_sales_order_filter"/>
|
||||
<field name="arch" type="xml">
|
||||
<search>
|
||||
<filter string="From Mobikul-App" name="from_mobikul" domain="[('team_id.mobikul_ids', '!=', False)]"/>
|
||||
</search>
|
||||
</field>
|
||||
</record>
|
||||
|
||||
<record id="mobikul_orders_action" model="ir.actions.act_window">
|
||||
<field name="name">Mobikul Orders</field>
|
||||
<field name="res_model">sale.order</field>
|
||||
<field name="view_mode">tree,form</field>
|
||||
<field name="domain">[('state', 'in', ('sale', 'done'))]</field>
|
||||
<field name="context">{'show_sale': True, 'search_default_from_mobikul': 1}</field>
|
||||
<field name="search_view_id" ref="mobikul_orders_filter_view"/>
|
||||
<field name="help">You don't have any confirmed order from the Mobikul App.</field>
|
||||
</record>
|
||||
|
||||
<record id="mobikul_unpaid_orders_action" model="ir.actions.act_window">
|
||||
<field name="name">Unpaid Mobikul Orders</field>
|
||||
<field name="res_model">sale.order</field>
|
||||
<field name="view_mode">tree,form</field>
|
||||
<field name="domain">[('state', '=', 'sent')]</field>
|
||||
<field name="context">{'show_sale': True, 'search_default_from_mobikul': 1}</field>
|
||||
<field name="search_view_id" ref="mobikul_orders_filter_view"/>
|
||||
<field name="help">You don't have any unpaid order from the Mobikul App.</field>
|
||||
</record>
|
||||
|
||||
<record id="mobikul_abandonned_orders_action" model="ir.actions.act_window">
|
||||
<field name="name">Cancelled Orders</field>
|
||||
<field name="res_model">sale.order</field>
|
||||
<field name="view_mode">tree,form</field>
|
||||
<field name="domain">[('state', '=', 'cancel')]</field>
|
||||
<field name="context">{'show_sale': True, 'search_default_from_mobikul': 1}</field>
|
||||
<field name="search_view_id" ref="mobikul_orders_filter_view"/>
|
||||
<field name="help">You don't have any cancelled order from the Mobikul App.</field>
|
||||
</record>
|
||||
|
||||
<record id="mobikul_action_invoices" model="ir.actions.act_window">
|
||||
<field name="name">Invoices</field>
|
||||
<field name="res_model">account.invoice</field>
|
||||
<field name="view_type">form</field>
|
||||
<field name="view_mode">tree,form</field>
|
||||
<field name="domain">[('team_id.mobikul_ids', '!=', False)]</field>
|
||||
<field name="view_id" ref="account.invoice_tree"/>
|
||||
<field name="context">{'type':'out_invoice'}</field>
|
||||
<field name="search_view_id" ref="account.view_account_invoice_filter"/>
|
||||
</record>
|
||||
</odoo>
|
||||
|
|
@ -0,0 +1,69 @@
|
|||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<odoo>
|
||||
<record id="mobikul_view_partner_form" model="ir.ui.view">
|
||||
<field name="name">res.partner.form.mobikul</field>
|
||||
<field name="model">res.partner</field>
|
||||
<field name="inherit_id" ref="base.view_partner_form"/>
|
||||
<field name="arch" type="xml">
|
||||
<xpath expr="//notebook" position="inside">
|
||||
<page name='mobikul' string="Mobikul">
|
||||
<group name="mobikul">
|
||||
<field name="last_mobikul_so_id"/>
|
||||
<field name="banner_image"/>
|
||||
</group>
|
||||
<!--group string="Registered Devices">
|
||||
<field name="token_ids" nolabel="1"/>
|
||||
</group-->
|
||||
</page>
|
||||
</xpath>
|
||||
</field>
|
||||
</record>
|
||||
|
||||
|
||||
<record id="mobikul_product_template_filter_view" model="ir.ui.view">
|
||||
<field name="name">product.template.search.mobikul</field>
|
||||
<field name="model">product.template</field>
|
||||
<field name="inherit_id" ref="product.product_template_search_view"/>
|
||||
<field name="arch" type="xml">
|
||||
<xpath expr="//field[@name='categ_id']" position="after">
|
||||
<field name="mobikul_categ_ids" domain="[('mobikul_categ_ids', 'child_of', self)]"/>
|
||||
</xpath>
|
||||
<xpath expr="//filter[@name='consumable']" position="after">
|
||||
<separator/>
|
||||
<filter string="Published on App" name="mobikul_published" domain="[('is_mobikul_available', '=', True)]"/>
|
||||
</xpath>
|
||||
</field>
|
||||
</record>
|
||||
<record model="ir.ui.view" id="mobikul_product_template_form_view">
|
||||
<field name="name">product.template.product.mobikul.form</field>
|
||||
<field name="model">product.template</field>
|
||||
<field name="inherit_id" ref="product.product_template_form_view"/>
|
||||
<field name="arch" type="xml">
|
||||
|
||||
<group name="email_template_and_project" position="before">
|
||||
<group name="mobikul" string="Mobikul" >
|
||||
<field name="mobikul_categ_ids" widget="many2many_tags" string="Mobikul Categories"/>
|
||||
<field name="mobikul_status" widget="selection"/>
|
||||
<field name="is_mobikul_available" />
|
||||
</group>
|
||||
</group>
|
||||
<div name="button_box" position="inside">
|
||||
<button class="oe_stat_button" name="mobikul_publish_button"
|
||||
type="object" icon="fa-globe">
|
||||
<div class="o_stat_info published o_form_field">
|
||||
<span class="o_stat_text o_value text-success" attrs="{'invisible': [('is_mobikul_available', '=', False)]}">Published</span>
|
||||
<span class="o_stat_text o_value text-danger" attrs="{'invisible': [('is_mobikul_available', '=', True)]}">Unpublished</span>
|
||||
<span class="o_stat_text">On App</span>
|
||||
</div>
|
||||
</button>
|
||||
</div>
|
||||
</field>
|
||||
</record>
|
||||
<record id="mobikul_product_template_action" model="ir.actions.act_window">
|
||||
<field name="name">Products</field>
|
||||
<field name="res_model">product.template</field>
|
||||
<field name="view_type">form</field>
|
||||
<field name="view_mode">kanban,tree,form</field>
|
||||
<field name="context">{'search_default_mobikul_published': 1}</field>
|
||||
</record>
|
||||
</odoo>
|
||||
|
|
@ -0,0 +1,140 @@
|
|||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<odoo>
|
||||
<record id="mobikul_app_config_settings" model="ir.ui.view">
|
||||
<field name="name">Mobikul Settings</field>
|
||||
<field name="model">mobikul.config.settings</field>
|
||||
<field name="arch" type="xml">
|
||||
<form string="Configure Mobikul-App" class="oe_form_configuration">
|
||||
<header>
|
||||
<button string="Apply" type="object" name="execute" class="oe_highlight"/>
|
||||
<button string="Cancel" type="object" name="cancel" class="oe_link"/>
|
||||
</header>
|
||||
<div>
|
||||
<field name="mobikul_app" invisible="1"/>
|
||||
<div name="mobikul">
|
||||
<b><field name="app_name" readonly="1"/></b>
|
||||
<button type="object" name="open_mobikul_conf" string="Configuration" class="oe_inline oe_link" icon="fa-cogs"/>
|
||||
</div>
|
||||
</div>
|
||||
<group name="order" string="Order">
|
||||
<label string="Default Sales Team" for="salesteam_id" />
|
||||
<div class="oe_inline">
|
||||
<field name="salesteam_id" required="1"/>
|
||||
</div>
|
||||
<label string="Default Salesperson" for="salesperson_id" />
|
||||
<div class="oe_inline">
|
||||
<field name="salesperson_id"/>
|
||||
</div>
|
||||
</group>
|
||||
<group name="pricelist" string="Pricelist/Currency">
|
||||
<label string="Default Pricelist" for="pricelist_id" />
|
||||
<div class="oe_inline">
|
||||
<field name="pricelist_id" required="1"/>
|
||||
</div>
|
||||
<label string="Default Currency" for="currency_id" />
|
||||
<div class="oe_inline">
|
||||
<field name="currency_id" readonly="1"/>
|
||||
</div>
|
||||
</group>
|
||||
<group name="language" string="Language">
|
||||
<label string="Default Language" for="default_lang" />
|
||||
<div class="oe_inline">
|
||||
<field name="default_lang" required="1"/>
|
||||
</div>
|
||||
</group>
|
||||
<group name="extra" string="Mobikul Extra Features">
|
||||
<label string="Limit Products per page" for="product_limit" />
|
||||
<div class="oe_inline">
|
||||
<field name="product_limit" required="1"/>
|
||||
</div>
|
||||
<label for="id" string="App access"/>
|
||||
<div>
|
||||
<div >
|
||||
<field name="mobikul_allow_guest" class="oe_inline"/>
|
||||
<label for="mobikul_allow_guest"/>
|
||||
</div>
|
||||
<div >
|
||||
<field name="mobikul_reset_password" class="oe_inline"/>
|
||||
<label for="mobikul_reset_password"/>
|
||||
</div>
|
||||
<div>
|
||||
<field name="mobikul_signup" class="oe_inline"/>
|
||||
<label for="mobikul_signup"/>
|
||||
</div>
|
||||
<div attrs="{'invisible':[('mobikul_signup','=',False)]}">
|
||||
<label for="mobikul_signup_template_user_id"/>
|
||||
<field name="mobikul_signup_template_user_id" class="oe_inline"
|
||||
attrs="{'required': [('mobikul_signup', '=', True)]}"
|
||||
domain="['|',('active','=',0),('active','=',1)]"/>
|
||||
</div>
|
||||
<div attrs="{'invisible':[('mobikul_signup','=',False)]}">
|
||||
<label for="module_email_verification"/>
|
||||
<field name="module_email_verification" class="oe_inline"/>
|
||||
</div>
|
||||
</div>
|
||||
<label for="id" string="Social Login"/>
|
||||
<div>
|
||||
<div>
|
||||
<field name="module_auth_oauth" readonly="1"/>
|
||||
<label for="module_auth_oauth" />
|
||||
<a href="https://mobikul.com/features/sign-in-via-social-accounts/" >(Paid Feature)</a>
|
||||
</div>
|
||||
<div attrs="{'invisible':[('module_auth_oauth','=',False)]}">
|
||||
<field name="mobikul_gmail_signin" class="oe_inline" readonly="1"/>
|
||||
<label for="mobikul_gmail_signin"/>
|
||||
</div>
|
||||
<div attrs="{'invisible':[('module_auth_oauth','=',False)]}">
|
||||
<field name="mobikul_facebook_signin" class="oe_inline" readonly="1"/>
|
||||
<label for="mobikul_facebook_signin"/>
|
||||
</div>
|
||||
<div attrs="{'invisible':[('module_auth_oauth','=',False)]}">
|
||||
<field name="mobikul_twitter_signin" class="oe_inline" readonly="1"/>
|
||||
<label for="mobikul_twitter_signin"/>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
</group>
|
||||
<group name="addon" string="Other Addons">
|
||||
<!--<label for="id" string="Allow Website Wishlist"/>-->
|
||||
<!--<div>-->
|
||||
<!--<div >-->
|
||||
<!--<field name="module_website_wishlist"/>-->
|
||||
<!--<label for="module_website_wishlist"/>-->
|
||||
<!--</div>-->
|
||||
<!--</div>-->
|
||||
|
||||
<label for="id" string="Allow Website Review"/>
|
||||
<div>
|
||||
<div >
|
||||
<field name="module_wk_review"/>
|
||||
<label for="module_wk_review"/>
|
||||
</div>
|
||||
</div>
|
||||
<label for="id" string="Allow Marketplace"/>
|
||||
<div>
|
||||
<div >
|
||||
<field name="module_odoo_marketplace"/>
|
||||
<label for="module_odoo_marketplace"/>
|
||||
</div>
|
||||
</div>
|
||||
<label for="id" string="Allow Website Wishlist"/>
|
||||
<div>
|
||||
<div >
|
||||
<field name="module_website_sale_wishlist"/>
|
||||
<label for="module_website_sale_wishlist"/>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
|
||||
</group>
|
||||
</form>
|
||||
</field>
|
||||
</record>
|
||||
|
||||
<record id="mobikul_config_setting_action" model="ir.actions.act_window">
|
||||
<field name="name">Mobikul Settings</field>
|
||||
<field name="res_model">mobikul.config.settings</field>
|
||||
<field name="view_mode">form</field>
|
||||
<field name="target">inline</field>
|
||||
</record>
|
||||
</odoo>
|
||||
|
|
@ -0,0 +1,36 @@
|
|||
<odoo>
|
||||
|
||||
<record id="mobikul_sync_cat_form" model="ir.ui.view">
|
||||
<field name="name">mobikul_cat_sync_form</field>
|
||||
<field name="model">mobikul.sync.category</field>
|
||||
<field name="type">form</field>
|
||||
<field name="arch" type="xml">
|
||||
<form string="Sync Category" version="7.0" create="false" edit="false">
|
||||
<separator string="Select an Operation you want to do:-"/>
|
||||
<div>
|
||||
<h2><b>Sync category with Website category</b></h2>
|
||||
<group>
|
||||
<field name="sync_type" />
|
||||
</group>
|
||||
|
||||
|
||||
</div>
|
||||
|
||||
|
||||
<footer>
|
||||
<button name="sync_mobikul_cat_with_web_cat" string=" Do it Now.. " type="object" class="oe_highlight oe_inline"/>
|
||||
</footer>
|
||||
</form>
|
||||
</field>
|
||||
</record>
|
||||
|
||||
|
||||
|
||||
<record id="mobikul_sync_cat_action" model="ir.actions.act_window">
|
||||
<field name="name">Mobikul Sync Category</field>
|
||||
<field name="res_model">mobikul.sync.category</field>
|
||||
<field name="view_type">form</field>
|
||||
<field name="view_mode">form</field>
|
||||
<field name="target">new</field>
|
||||
</record>
|
||||
</odoo>
|
||||
|
|
@ -39,10 +39,6 @@ Multi-Theme
|
|||
Roadmap
|
||||
=======
|
||||
|
||||
* Currently, all websites share the same footer. Posible solution: add field to ``res.company`` or ``website`` model and use that in template, e.g.::
|
||||
|
||||
<div t-field="website.website_footer" class="oe_structure mt16"/>
|
||||
|
||||
* TODO: Create website.theme record automatically after theme installation (probably via inheriting ``button_install`` method)
|
||||
|
||||
Credits
|
||||
|
|
|
|||
|
|
@ -1,11 +1,12 @@
|
|||
# -*- coding: utf-8 -*-
|
||||
# Copyright 2017-2018 Ivan Yelizariev <https://it-projects.info/team/yelizariev>
|
||||
# License LGPL-3.0 or later (http://www.gnu.org/licenses/lgpl.html).
|
||||
{
|
||||
"name": """Real Multi Website""",
|
||||
"summary": """Yes, you can set up multi-company, multi-website, multi-theme, multi-eCommerce on a single database!""",
|
||||
"category": "eCommerce",
|
||||
"live_test_url": "http://apps.it-projects.info/shop/product/website-multi-company?version=11.0",
|
||||
"images": ['images/website_multi_company_main.png'],
|
||||
"version": "1.2.3",
|
||||
"version": "11.0.1.2.4",
|
||||
"application": False,
|
||||
|
||||
"author": "IT-Projects LLC, Ivan Yelizariev, Nicolas JEUDY",
|
||||
|
|
|
|||
|
|
@ -1,4 +1,6 @@
|
|||
# -*- coding: utf-8 -*-
|
||||
# Copyright 2018 Ivan Yelizariev <https://it-projects.info/team/yelizariev>
|
||||
# Copyright 2018 Ildar Nasyrov <https://it-projects.info/team/iledarn>
|
||||
# License LGPL-3.0 or later (https://www.gnu.org/licenses/lgpl.html).
|
||||
from odoo.http import request
|
||||
from odoo.addons.website_sale.controllers.main import WebsiteSale
|
||||
|
||||
|
|
@ -10,4 +12,4 @@ class WebsiteSaleExtended(WebsiteSale):
|
|||
company = request.website.company_id
|
||||
if not company:
|
||||
return domain
|
||||
return [('company_id', '=', company.id)] + domain
|
||||
return ['|', ('company_id', '=', company.id), ('company_id', '=', False)] + domain
|
||||
|
|
|
|||
|
|
@ -1,3 +1,8 @@
|
|||
`1.2.4`
|
||||
-------
|
||||
|
||||
- **ADD:** Product with no company defined is allowed for all websites
|
||||
|
||||
`1.2.3`
|
||||
-------
|
||||
|
||||
|
|
|
|||
|
|
@ -2,6 +2,9 @@
|
|||
Real Multi Website
|
||||
====================
|
||||
|
||||
.. contents::
|
||||
:local:
|
||||
|
||||
Installation
|
||||
============
|
||||
|
||||
|
|
@ -64,7 +67,7 @@ session information. There are two ways to do it:
|
|||
|
||||
In the latter case ``dbfilter`` is usually used, though it's not flexible enough.
|
||||
|
||||
using dbfilter parameter
|
||||
Using dbfilter parameter
|
||||
~~~~~~~~~~~~~~~~~~~~~~~~
|
||||
For TESTING purpose you can use the following configuration:
|
||||
|
||||
|
|
@ -77,7 +80,7 @@ For TESTING purpose you can use the following configuration:
|
|||
* example.shop2.local
|
||||
* example.shop3.local
|
||||
|
||||
patching http.py
|
||||
Patching http.py
|
||||
~~~~~~~~~~~~~~~~
|
||||
|
||||
For PRODUCTION deployment with websites on subdomains you can use following patch. You need to update odoo/http.py file as following::
|
||||
|
|
@ -112,7 +115,7 @@ Then you can use following configuration
|
|||
* shop2.example.org
|
||||
* shop3.example.org
|
||||
|
||||
using dbfilter_from_header module
|
||||
Using dbfilter_from_header module
|
||||
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
||||
Most flexible way to deploy multi-database system is using `dbfilter_from_header <https://www.odoo.com/apps/modules/10.0/dbfilter_from_header/>`__ (check module description for installation instruction).
|
||||
|
||||
|
|
@ -181,6 +184,16 @@ Example (we use top level domain ``.example`` due to copyright issues, but it co
|
|||
}
|
||||
}
|
||||
|
||||
Odoo.sh deployment
|
||||
------------------
|
||||
|
||||
In the manager of your domain name registrar you need to add CNAME records for your domains (subdomains), for example:
|
||||
|
||||
* Create a CNAME record ``shop1.example.org`` pointing to <yourdatabase>.odoo.com
|
||||
* Create a CNAME record ``shop2.example.org`` pointing to <yourdatabase>.odoo.com
|
||||
* Create a CNAME record ``example.com`` pointing to <yourdatabase>.odoo.com
|
||||
|
||||
Similar for dev and staging database, but use corresponding domain in odoo.com, e.g. ``mywebsite-master-staging-12345689.dev.odoo.com``
|
||||
|
||||
Apache::
|
||||
|
||||
|
|
@ -214,7 +227,6 @@ Apache::
|
|||
|
||||
</VirtualHost>
|
||||
|
||||
|
||||
Configuration
|
||||
=============
|
||||
|
||||
|
|
@ -246,6 +258,13 @@ After installing theme, navigate to ``[[ Website ]] >> Configuration >> Multi-Th
|
|||
|
||||
If you get error *The style compilation failed*, add modules to **Dependencies** field. It allows to attach theme-like dependencies to corresponding theme and prevent themes compatibility problems.
|
||||
|
||||
Note: themes that depend on ``theme_common`` don't work in demo installation. To avoid this, you have to create database without demo data or comment out demo files in ``__manifest__.py`` file of ``theme_common`` module like this::
|
||||
|
||||
'demo': [
|
||||
# 'demo/demo.xml',
|
||||
],
|
||||
|
||||
|
||||
Usage
|
||||
=====
|
||||
|
||||
|
|
@ -275,7 +294,7 @@ Steps for eCommerce
|
|||
* use ``[Action] -> Duplicate`` button
|
||||
* don't forget to click ``[Unpublished On Website]`` button to activate it
|
||||
|
||||
* open ``[[ Sales ]] >> Products`` and create product per each company if they don't exist
|
||||
* open ``[[ Sales ]] >> Products`` and create product per each company if they don't exist. If a product doesn't belong to any company (i.e. "Company" field is empty), this product will be available on each website you created.
|
||||
* open HOST1/shop, make order, open backend -- created order belongs to COMPANY1
|
||||
* open HOST2/shop, make order, open backend -- created order belongs to COMPANY2
|
||||
|
||||
|
|
|
|||
|
|
@ -1,4 +1,3 @@
|
|||
# -*- coding: utf-8 -*-
|
||||
import logging
|
||||
|
||||
from odoo import models, api
|
||||
|
|
|
|||
|
|
@ -1,5 +1,9 @@
|
|||
# Copyright 2018 Ivan Yelizariev <https://it-projects.info/team/yelizariev>
|
||||
# License LGPL-3.0 or later (https://www.gnu.org/licenses/lgpl.html).
|
||||
|
||||
from odoo import models, api
|
||||
|
||||
|
||||
BASE_MODULES = ['website_blog', 'website_sale_comparison', 'website_sale_wishlist', 'web_settings_dashboard', 'website_crm', 'website_animate', 'website_mass_mailing', 'contacts', 'fetchmail', 'resource', 'calendar', 'snippet_google_map']
|
||||
|
||||
|
||||
|
|
@ -14,16 +18,16 @@ class Module(models.Model):
|
|||
return super(Module, self)._search(args, offset, limit, order, count, access_rights_uid)
|
||||
|
||||
@api.model
|
||||
def _theme_dependencies_domain(self, theme_name):
|
||||
"""Computes domain for dependencies of the theme, but without built-in dependencies"""
|
||||
def _search_theme_dependencies(self, theme_name):
|
||||
"""Search dependencies of the theme, but without built-in dependencies"""
|
||||
if not theme_name:
|
||||
return []
|
||||
return self
|
||||
|
||||
self = self.with_context(search_theme_dependencies=False)
|
||||
|
||||
theme = self.search([('name', '=', theme_name)])
|
||||
if not theme:
|
||||
return []
|
||||
return self
|
||||
|
||||
deps = theme.upstream_dependencies(exclude_states=('to remove'))
|
||||
base_modules = self.search([('name', 'in', BASE_MODULES)])
|
||||
|
|
@ -31,4 +35,4 @@ class Module(models.Model):
|
|||
deps -= base_modules
|
||||
deps -= base_deps
|
||||
|
||||
return [('id', 'in', deps.ids)]
|
||||
return self.search([('id', 'in', deps.ids)])
|
||||
|
|
|
|||
|
|
@ -1,4 +1,3 @@
|
|||
# -*- coding: utf-8 -*-
|
||||
from odoo import models, api
|
||||
|
||||
|
||||
|
|
|
|||
|
|
@ -1,7 +1,9 @@
|
|||
# -*- coding: utf-8 -*-
|
||||
# Copyright 2017 Ivan Yelizariev <https://it-projects.info/team/yelizariev>
|
||||
# License LGPL-3.0 or later (https://www.gnu.org/licenses/lgpl.html).
|
||||
|
||||
import logging
|
||||
|
||||
from odoo import models
|
||||
from odoo import models, api
|
||||
|
||||
_logger = logging.getLogger(__name__)
|
||||
|
||||
|
|
@ -9,5 +11,23 @@ _logger = logging.getLogger(__name__)
|
|||
class Website(models.Model):
|
||||
_inherit = "website"
|
||||
|
||||
@api.multi
|
||||
def multi_theme_reload(self):
|
||||
self.env['res.config.settings'].multi_theme_reload()
|
||||
self.ensure_one()
|
||||
|
||||
# convert_assets and copy views for current website
|
||||
self._multi_theme_activate()
|
||||
|
||||
@api.multi
|
||||
def multi_theme_reload_list(self):
|
||||
# only reloads list
|
||||
self.env["website.theme"].search([])._convert_assets()
|
||||
|
||||
@api.multi
|
||||
def _multi_theme_activate(self):
|
||||
if not self.env.context.get('skip_converting_assets'):
|
||||
# reload dependencies before activating
|
||||
self.mapped('multi_theme_id')\
|
||||
.upstream_dependencies()\
|
||||
._convert_assets()
|
||||
return super(Website, self)._multi_theme_activate()
|
||||
|
|
|
|||
|
|
@ -1,4 +1,5 @@
|
|||
# -*- coding: utf-8 -*-
|
||||
# Copyright 2017 Ivan Yelizariev <https://it-projects.info/team/yelizariev>
|
||||
# License LGPL-3.0 or later (https://www.gnu.org/licenses/lgpl.html).
|
||||
from odoo import models, api
|
||||
|
||||
|
||||
|
|
|
|||
|
|
@ -1,5 +1,9 @@
|
|||
# Copyright 2018 Ivan Yelizariev <https://it-projects.info/team/yelizariev>
|
||||
# Copyright 2018 Ildar Nasyrov <https://it-projects.info/team/iledarn>
|
||||
# License LGPL-3.0 or later (https://www.gnu.org/licenses/lgpl.html).
|
||||
|
||||
import logging
|
||||
from odoo import models, fields
|
||||
from odoo import models, fields, api
|
||||
|
||||
_logger = logging.getLogger(__name__)
|
||||
|
||||
|
|
@ -12,59 +16,44 @@ class WebsiteTheme(models.Model):
|
|||
string="Theme's technical name",
|
||||
help="")
|
||||
|
||||
dependency_ids = fields.Many2many(
|
||||
'ir.module.module',
|
||||
string="Dependencies",
|
||||
help='Theme-like dependencies. Add modules here if you got error "The style compilation failed".')
|
||||
|
||||
@api.multi
|
||||
def _convert_assets(self):
|
||||
"""Generate assets for converted themes"""
|
||||
Asset = self.env["website.theme.asset"]
|
||||
for one in self.filtered("converted_theme_addon"):
|
||||
# Get all views owned by the converted theme addon
|
||||
refs = self.env["ir.model.data"].search([
|
||||
("module", "in", [one.converted_theme_addon] + one.dependency_ids.mapped('name')),
|
||||
("model", "=", "ir.ui.view"),
|
||||
])
|
||||
existing = frozenset(one.mapped("asset_ids.name"))
|
||||
expected = frozenset(refs.mapped("complete_name"))
|
||||
dangling = tuple(existing - expected)
|
||||
# Create a new asset for each theme view
|
||||
for ref in expected - existing:
|
||||
view = self.env.ref(ref, raise_if_not_found=False)
|
||||
if view and (view.type != 'qweb' or not view.inherit_id):
|
||||
# Skip non-qweb (backend) views
|
||||
for one in self:
|
||||
assets_before = one.asset_ids
|
||||
super(WebsiteTheme, one)._convert_assets()
|
||||
assets_after = one.asset_ids
|
||||
if not assets_before and assets_after:
|
||||
# new theme: update dependencies
|
||||
one.write(one._autofill_deps())
|
||||
|
||||
# Skip views without inherit_id, because those have new
|
||||
# template definition only and after appliying multi-theme
|
||||
# for several websites it will be copied and then it leads
|
||||
# to error on compilation when any template with <t
|
||||
# t-call="..."/> -- expected singleton
|
||||
continue
|
||||
@api.multi
|
||||
def _autofill_deps(self):
|
||||
self.ensure_one()
|
||||
modules = self\
|
||||
.env['ir.module.module']\
|
||||
._search_theme_dependencies(
|
||||
self.converted_theme_addon
|
||||
).mapped('name')
|
||||
|
||||
_logger.debug("Creating asset %s for theme %s", ref, one.name)
|
||||
|
||||
priority = 10
|
||||
if view.model_data_id.module == one.converted_theme_addon:
|
||||
# make less priority to apply views after all deps
|
||||
priority = 100
|
||||
|
||||
one.asset_ids |= Asset.new({
|
||||
"name": ref,
|
||||
'priority': priority,
|
||||
existing_themes = self.search([
|
||||
('converted_theme_addon', 'in', modules)
|
||||
]).mapped('converted_theme_addon')
|
||||
new_themes = set(modules) - set(existing_themes)
|
||||
for converted_theme_addon in new_themes:
|
||||
self.create({
|
||||
'name': converted_theme_addon,
|
||||
'converted_theme_addon': converted_theme_addon,
|
||||
})
|
||||
# Delete all dangling assets
|
||||
if dangling:
|
||||
_logger.debug(
|
||||
"Removing dangling assets for theme %s: %s",
|
||||
one.name, dangling)
|
||||
Asset.search([("name", "in", dangling)]).unlink()
|
||||
# Turn all assets multiwebsite-only
|
||||
Asset._find_and_deactivate_views()
|
||||
themes = self.search([('converted_theme_addon', 'in', modules)])
|
||||
try:
|
||||
themes |= self.env.ref('website_multi_theme.theme_default')
|
||||
except:
|
||||
pass
|
||||
return {
|
||||
'dependency_ids': [(6, 0, themes.ids)],
|
||||
}
|
||||
|
||||
|
||||
class WebsiteThemeAsset(models.Model):
|
||||
_inherit = "website.theme.asset"
|
||||
_order = 'priority,id'
|
||||
|
||||
priority = fields.Integer()
|
||||
@api.onchange('converted_theme_addon')
|
||||
def onchange_converted_theme_addon(self):
|
||||
self.update(self._autofill_deps())
|
||||
|
|
|
|||
|
|
@ -6,10 +6,11 @@
|
|||
<field name="inherit_id" ref="website.res_config_settings_view_form"/>
|
||||
<field name="arch" type="xml">
|
||||
<xpath expr="//field[@name='website_id']" position="attributes">
|
||||
<attribute name="readonly">1</attribute>
|
||||
<attribute name="invisible"></attribute>
|
||||
</xpath>
|
||||
<xpath expr="//field[@name='website_id']/../label" position="attributes">
|
||||
<attribute name="string">Default Website</attribute>
|
||||
<xpath expr="//button[@name='multi_theme_reload']" position="attributes">
|
||||
<attribute name="string">Reload Theme List & Update all websites</attribute>
|
||||
<attribute name="context">{'skip_converting_assets': True}</attribute>
|
||||
</xpath>
|
||||
</field>
|
||||
</record>
|
||||
|
|
|
|||
|
|
@ -9,8 +9,14 @@
|
|||
<sheet>
|
||||
<group>
|
||||
<field name="name"/>
|
||||
<field name="converted_theme_addon" required="1"/>
|
||||
<field name="dependency_ids" widget="many2many_tags" context="{'search_theme_dependencies': converted_theme_addon}" attrs="{'invisible': [('converted_theme_addon', '=', False)]}"/>
|
||||
<field name="converted_theme_addon"/>
|
||||
<field name="dependency_ids"
|
||||
widget="many2many_tags"
|
||||
/>
|
||||
<field name="asset_ids"
|
||||
string="Views"
|
||||
widget="many2many_tags"
|
||||
domain="[('auto', '=', False)]"/>
|
||||
</group>
|
||||
</sheet>
|
||||
</form>
|
||||
|
|
@ -21,7 +27,7 @@
|
|||
<field name="name">website.theme.tree</field>
|
||||
<field name="model">website.theme</field>
|
||||
<field name="arch" type="xml">
|
||||
<tree string="Multi-theme">
|
||||
<tree>
|
||||
<field name="name"/>
|
||||
<field name="converted_theme_addon"/>
|
||||
</tree>
|
||||
|
|
|
|||
|
|
@ -10,12 +10,21 @@
|
|||
<group name="domain">
|
||||
<label for="multi_theme_id"/>
|
||||
<div>
|
||||
<field name="multi_theme_id" string="Multi Theme"/>
|
||||
<field name="multi_theme_id" string="Multi Theme" required="True"/>
|
||||
<!--Edit mode-->
|
||||
<button icon="fa-refresh"
|
||||
string="Reload Themes"
|
||||
help="Use it if you installed theme, but cannot find it in the list"
|
||||
type="object"
|
||||
class="oe_inline oe_edit_only"
|
||||
name="multi_theme_reload_list"/>
|
||||
<!--Read mode (non-edit) AND debug mode-->
|
||||
<button icon="fa-refresh"
|
||||
string="Update Website Theme"
|
||||
help="Update Theme for current website. Normally used when theme is changed"
|
||||
type="object"
|
||||
groups="base.group_no_one"
|
||||
class="oe_inline oe_read_only ml8"
|
||||
name="multi_theme_reload"/>
|
||||
</div>
|
||||
<field name="favicon" widget="image" class="oe_avatar oe_left"/>
|
||||
|
|
|
|||
|
|
@ -0,0 +1,45 @@
|
|||
==========================================
|
||||
Real Multi Website (eCommerce extension)
|
||||
==========================================
|
||||
|
||||
Multi Website support in eCommerce:
|
||||
|
||||
* adds field ``website_ids`` to payment.acquirer
|
||||
* adds field ``website_ids`` to product.template
|
||||
* adds field ``website_ids`` to product.public.category
|
||||
* use separate sale order (cart) for different companies -- works by adding ``company_dependent`` attribute to ``last_website_so_id`` field
|
||||
|
||||
|
||||
Credits
|
||||
=======
|
||||
|
||||
Contributors
|
||||
------------
|
||||
* `Ivan Yelizariev <https://it-projects.info/team/yelizariev>`__
|
||||
|
||||
Sponsors
|
||||
--------
|
||||
* `IT-Projects LLC <https://it-projects.info>`__
|
||||
|
||||
Maintainers
|
||||
-----------
|
||||
* `IT-Projects LLC <https://it-projects.info>`__
|
||||
|
||||
To get a guaranteed support you are kindly requested to purchase the module at `odoo apps store <https://apps.odoo.com/apps/modules/11.0/website_multi_company_sale/>`__.
|
||||
|
||||
Thank you for understanding!
|
||||
|
||||
`IT-Projects Team <https://www.it-projects.info/team>`__
|
||||
|
||||
Further information
|
||||
===================
|
||||
|
||||
Demo: http://runbot.it-projects.info/demo/website-addons/11.0
|
||||
|
||||
HTML Description: https://apps.odoo.com/apps/modules/11.0/website_multi_company_sale/
|
||||
|
||||
Usage instructions: `<doc/index.rst>`_
|
||||
|
||||
Changelog: `<doc/changelog.rst>`_
|
||||
|
||||
Tested on Odoo 11.0 f34d4d33a09d33a12e427c2490b6526546114486
|
||||
|
|
@ -0,0 +1,2 @@
|
|||
from . import models
|
||||
from . import controllers
|
||||
|
|
@ -0,0 +1,42 @@
|
|||
{
|
||||
"name": """Real Multi Website (eCommerce extension)""",
|
||||
"summary": """Multi Website support in eCommerce""",
|
||||
"category": "eCommerce",
|
||||
"live_test_url": "http://apps.it-projects.info/shop/product/website-multi-company?version=11.0",
|
||||
"images": ["images/website_multi_company_sale_main.png"],
|
||||
"version": "11.0.1.2.0",
|
||||
"application": False,
|
||||
|
||||
"author": "IT-Projects LLC, Ivan Yelizariev",
|
||||
"support": "apps@it-projects.info",
|
||||
"website": "https://it-projects.info/team/yelizariev",
|
||||
"license": "LGPL-3",
|
||||
"price": 9.00,
|
||||
"currency": "EUR",
|
||||
|
||||
"depends": [
|
||||
"website_multi_company",
|
||||
"website_sale",
|
||||
"ir_rule_website",
|
||||
],
|
||||
"external_dependencies": {"python": [], "bin": []},
|
||||
"data": [
|
||||
"views/product_public_category_views.xml",
|
||||
"views/website_views.xml",
|
||||
"views/product_template_views.xml",
|
||||
"views/payment_views.xml",
|
||||
"security/website_multi_company_sale_security.xml",
|
||||
],
|
||||
"qweb": [
|
||||
],
|
||||
"demo": [
|
||||
],
|
||||
|
||||
"post_load": None,
|
||||
"pre_init_hook": None,
|
||||
"post_init_hook": None,
|
||||
"uninstall_hook": None,
|
||||
|
||||
"auto_install": False,
|
||||
"installable": True,
|
||||
}
|
||||
|
|
@ -0,0 +1 @@
|
|||
from . import main
|
||||
|
|
@ -0,0 +1,19 @@
|
|||
from odoo import http
|
||||
from odoo.http import request
|
||||
from odoo.addons.website_sale.controllers.main import WebsiteSale
|
||||
|
||||
|
||||
class WebsiteMultiCompanySale(WebsiteSale):
|
||||
@http.route()
|
||||
def shop(self, page=0, category=None, search='', ppg=False, **post):
|
||||
response = super(WebsiteMultiCompanySale, self).shop(page=page, category=category, search=search, ppg=ppg, **post)
|
||||
categs = request.env['product.public.category'].search([
|
||||
('parent_id', '=', False),
|
||||
'|',
|
||||
('website_ids', '=', False),
|
||||
('website_ids', 'in', [request.website.id]),
|
||||
])
|
||||
response.qcontext.update({
|
||||
'categories': categs,
|
||||
})
|
||||
return response
|
||||
|
|
@ -0,0 +1,24 @@
|
|||
`1.2.0`
|
||||
-------
|
||||
|
||||
- **ADD:** you can now specify allowed websites for your payment acquirers
|
||||
|
||||
`1.1.0`
|
||||
-------
|
||||
|
||||
- **ADD:** you can now specify allowed websites for your products
|
||||
|
||||
`1.0.2`
|
||||
-------
|
||||
|
||||
- **ADD:** possibility to specify Salesperson, Sales Channel per each website
|
||||
|
||||
`1.0.1`
|
||||
-------
|
||||
|
||||
- **FIX:** add multi-company support for carts
|
||||
|
||||
`1.0.0`
|
||||
-------
|
||||
|
||||
- Init version
|
||||
|
|
@ -0,0 +1,72 @@
|
|||
==========================================
|
||||
Real Multi Website (eCommerce extension)
|
||||
==========================================
|
||||
|
||||
Installation
|
||||
============
|
||||
|
||||
* `Install <https://odoo-development.readthedocs.io/en/latest/odoo/usage/install-module.html>`__ this module in a usual way
|
||||
|
||||
Configuration
|
||||
=============
|
||||
|
||||
Follow instruction of the base module `Real Multi Website <https://www.odoo.com/apps/modules/11.0/website_multi_company/>`__.
|
||||
|
||||
Website Orders
|
||||
--------------
|
||||
|
||||
* Open menu ``[[ Website ]] >> Configuration >> Websites``
|
||||
* For each website configure **Salesperson** and **Sales Channel** fields
|
||||
* RESULT: new orders made via website will be assigned to proper Salesperson and Sales Channel
|
||||
|
||||
Multi-categories
|
||||
----------------
|
||||
|
||||
* Open menu ``[[ Website ]] >> Configuration >> Products >> eCommerce Categories``
|
||||
* Only for top-level (i.e. without ``parent_id``) categories: specify **Websites** field
|
||||
|
||||
Multi-products
|
||||
--------------
|
||||
* Open menu ``[[ Sales ]] >> Sales >> Products``
|
||||
* Specify **Allowed websites** for your products
|
||||
* Websites company and product company should be equal. But if you want different company websites then leave the **Company** field empty in your product - in such case you can specify any websites
|
||||
|
||||
Multi-payment-acquirers
|
||||
-----------------------
|
||||
* Open menu ``[[ Website ]] >> Configuration >> eCommerce >> Payment Acquirers``
|
||||
* Specify **Allowed websites** for your payment acquirer. If no website is specified then the acquirer will be available on any website with the same company
|
||||
* Choosen websites companies and acquirer's company should be equal
|
||||
|
||||
|
||||
Usage
|
||||
=====
|
||||
|
||||
Multi-categories
|
||||
----------------
|
||||
|
||||
* Open shop at some of your websites
|
||||
* Login as Administrator
|
||||
* In ``Customize`` section activate ``[x] eCommerce Categories``
|
||||
* RESULT: parent categories for current website and categories without value at **Websites** fields are shown only. **Websites** value of child categories are ignored.
|
||||
|
||||
Multi-cart
|
||||
----------
|
||||
|
||||
* Login as portal or internal user at some of your websites
|
||||
* Add some products to the cart
|
||||
* Open another website that belongs to another company
|
||||
* Login as the same user
|
||||
* RESULT: you have empty cart, rather than one from previous website
|
||||
|
||||
Multi-products
|
||||
--------------
|
||||
|
||||
* Open website shop
|
||||
* RESULT: you should only see products allowed for this website or products with no websites specified
|
||||
|
||||
Multi-payment-acquirers
|
||||
-----------------------
|
||||
|
||||
* Open website shop
|
||||
* Buy a product
|
||||
* On Payment step of checkout there should be available only specified acquirers
|
||||
|
After Width: | Height: | Size: 298 KiB |
|
|
@ -0,0 +1,4 @@
|
|||
from . import product_public_category
|
||||
from . import sale_order
|
||||
from . import product_template
|
||||
from . import payment_acquirer
|
||||
|
|
@ -0,0 +1,20 @@
|
|||
from odoo import api, fields, models, _
|
||||
from odoo.exceptions import ValidationError
|
||||
|
||||
|
||||
class PaymentAcquirer(models.Model):
|
||||
_inherit = 'payment.acquirer'
|
||||
|
||||
website_ids = fields.Many2many('website', string='Allowed websites',
|
||||
help='Set the websites this payment acquirer should be available on. Leave empty to allow all.')
|
||||
|
||||
@api.onchange('company_id')
|
||||
def _onchange_company_id(self):
|
||||
return self.company_id and {'domain': {'website_ids': [('company_id', '=', self.company_id.id)]}} or {'domain': {'website_ids': []}}
|
||||
|
||||
@api.constrains('company_id', 'website_ids')
|
||||
def _check_websites_in_company(self):
|
||||
for record in self:
|
||||
website_company = record.website_ids.mapped('company_id')
|
||||
if record.company_id and record.website_ids and (len(website_company) > 1 or website_company[0] != record.company_id):
|
||||
raise ValidationError(_("Error! Only the company's websites are allowed"))
|
||||
|
|
@ -0,0 +1,11 @@
|
|||
from odoo import models, fields
|
||||
|
||||
|
||||
class ProductPublicCategory(models.Model):
|
||||
_inherit = "product.public.category"
|
||||
|
||||
website_ids = fields.Many2many(
|
||||
'website',
|
||||
string="Websites",
|
||||
help="On which websites show category. Keep empty to show at all websites. The value is ignored if there is Parent Category"
|
||||
)
|
||||
|
|
@ -0,0 +1,22 @@
|
|||
|
||||
from odoo import api, fields, models, _
|
||||
from odoo.exceptions import ValidationError
|
||||
|
||||
|
||||
class ProductTemplate(models.Model):
|
||||
_inherit = "product.template"
|
||||
|
||||
website_ids = fields.Many2many('website', string='Allowed websites',
|
||||
help='Set the websites this product should be available on. Leave empty to allow all.')
|
||||
|
||||
@api.onchange('company_id')
|
||||
def _onchange_company_id(self):
|
||||
return self.company_id and {'domain': {'website_ids': [('company_id', '=', self.company_id.id)]}} or {'domain': {'website_ids': []}}
|
||||
|
||||
@api.constrains('company_id', 'website_ids')
|
||||
def _check_websites_in_company(self):
|
||||
for record in self:
|
||||
website_company = record.website_ids.mapped('company_id')
|
||||
if record.company_id and record.website_ids and (len(website_company) > 1 or website_company[0] != record.company_id):
|
||||
raise ValidationError(_("Error! Only the company's websites are allowed. \
|
||||
Leave the Company field empty if you want websites from different companies"))
|
||||
|
|
@ -0,0 +1,24 @@
|
|||
from odoo import models, api, fields
|
||||
from odoo.http import request
|
||||
|
||||
|
||||
class Website(models.Model):
|
||||
_inherit = 'website'
|
||||
|
||||
@api.multi
|
||||
def sale_get_order(self, force_create=False, code=None, update_pricelist=False, force_pricelist=False):
|
||||
company = request.website.company_id
|
||||
if not request.session.get('sale_order_id'):
|
||||
# original sale_get_order uses last_website_so_id only when there is
|
||||
# sale_order_id in the session
|
||||
|
||||
# company.id seems to be the same as self.id, but let's use variant
|
||||
# from original sale_get_order
|
||||
self = self.with_context(force_company=company.id)
|
||||
return super(Website, self).sale_get_order(force_create, code, update_pricelist, force_pricelist)
|
||||
|
||||
|
||||
class ResPartner(models.Model):
|
||||
_inherit = 'res.partner'
|
||||
|
||||
last_website_so_id = fields.Many2one(company_dependent=True)
|
||||
|
|
@ -0,0 +1,13 @@
|
|||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<odoo>
|
||||
<record id="website_multi_company_sale_rule_all" model="ir.rule">
|
||||
<field name="name">Products available only for specifed websites (shops)</field>
|
||||
<field name="model_id" ref="model_product_template"/>
|
||||
<field name="domain_force">['|', ('website_ids', 'in', [website_id]), ('website_ids', '=', False)]</field>
|
||||
</record>
|
||||
<record id="website_multi_company_payment_rule_all" model="ir.rule">
|
||||
<field name="name">Payment acquirers available only for specifed websites (shops)</field>
|
||||
<field name="model_id" ref="model_payment_acquirer"/>
|
||||
<field name="domain_force">['|', ('website_ids', 'in', [website_id]), ('website_ids', '=', False)]</field>
|
||||
</record>
|
||||
</odoo>
|
||||
|
After Width: | Height: | Size: 2.2 KiB |
|
|
@ -0,0 +1,92 @@
|
|||
<section class="oe_container">
|
||||
<div class="oe_row oe_spaced">
|
||||
<div class="oe_span12">
|
||||
<h2 class="oe_slogan" style="color:#875A7B;">Real Multi Website (eCommerce extension)</h2>
|
||||
</div>
|
||||
</div>
|
||||
</section>
|
||||
|
||||
<section class="oe_container">
|
||||
<div class="oe_row oe_spaced">
|
||||
<div class="oe_span12">
|
||||
|
||||
<div class="alert alert-info oe_mt32" style="padding:0.3em 0.6em; font-size: 150%;">
|
||||
<i class="fa fa-hand-o-right"></i><b> Key features: </b>
|
||||
<ul class="list-unstyled">
|
||||
|
||||
<li>
|
||||
<i class="fa fa-check-square-o text-primary"></i>
|
||||
All features of <a href="https://apps.odoo.com/apps/modules/11.0/website_multi_company">Real Multi Website</a> module
|
||||
</li>
|
||||
|
||||
<li>
|
||||
<i class="fa fa-check-square-o text-primary"></i>
|
||||
Each eCommerce has configurable list of product categories
|
||||
</li>
|
||||
<li>
|
||||
<i class="fa fa-check-square-o text-primary"></i>
|
||||
eCommerce carts are separate per each company to avoid accounting problems
|
||||
</li>
|
||||
<li>
|
||||
<i class="fa fa-check-square-o text-primary"></i>
|
||||
The same product can be available on several websites (shops)
|
||||
</li>
|
||||
|
||||
</ul>
|
||||
</div>
|
||||
|
||||
</div>
|
||||
</div>
|
||||
</section>
|
||||
|
||||
<section class="oe_container">
|
||||
<div class="oe_row oe_spaced">
|
||||
<div class="oe_span8">
|
||||
<h2>Need our service?</h2>
|
||||
<p class="oe_mt32">Contact us by <a href="mailto:apps@it-projects.info">email</a> or fill out <a href="https://www.it-projects.info/page/website.contactus " target="_blank">request form</a></p>
|
||||
<ul>
|
||||
<li><a href="mailto:apps@it-projects.info">apps@it-projects.info <i class="fa fa-envelope-o"></i></a></li>
|
||||
<li><a href="https://www.it-projects.info/page/website.contactus " target="_blank">https://www.it-projects.info/page/website.contactus <i class="fa fa-list-alt"></i></a></li>
|
||||
</ul>
|
||||
</div>
|
||||
<div class="oe_span4">
|
||||
<div class="stamp" style="width:200px;">
|
||||
<div style="margin-top: 15px;
|
||||
position: relative;
|
||||
font-family:'Vollkorn', serif;
|
||||
font-size: 16px;
|
||||
line-height: 25px;
|
||||
text-transform: uppercase;
|
||||
font-weight: bold;
|
||||
color: #75526b;
|
||||
border: 3px dashed #75526b;
|
||||
float: left;
|
||||
padding: 4px 12px;
|
||||
-webkit-transform: rotate(7deg);
|
||||
-o-transform: rotate(7deg);
|
||||
-moz-transform: rotate(7deg);
|
||||
-ms-transform: rotate(7deg);">
|
||||
Tested on Odoo<br/>11.0 community
|
||||
</div>
|
||||
<div style="margin-top: 15px;
|
||||
position: relative;
|
||||
font-family:'Vollkorn', serif;
|
||||
font-size: 16px;
|
||||
line-height: 25px;
|
||||
text-transform: uppercase;
|
||||
font-weight: bold;
|
||||
color: #75526b;
|
||||
border: 3px dashed #75526b;
|
||||
float: left;
|
||||
padding: 4px 12px;
|
||||
-webkit-transform: rotate(-3deg);
|
||||
-o-transform: rotate(-3deg);
|
||||
-moz-transform: rotate(-3deg);
|
||||
-ms-transform: rotate(-3deg);">
|
||||
Tested on Odoo<br/>11.0 enterprise
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</section>
|
||||
|
||||
|
|
@ -0,0 +1,14 @@
|
|||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<odoo>
|
||||
<record id="acquirer_form_view_inherit_website_multi_company_sale" model="ir.ui.view">
|
||||
<field name="name">payment.acquirer.form.inherit.website_multi_company_sale</field>
|
||||
<field name="model">payment.acquirer</field>
|
||||
<field name="inherit_id" ref="payment.acquirer_form"/>
|
||||
<field name="arch" type="xml">
|
||||
<xpath expr="//field[@name='company_id']" position="after">
|
||||
<field name="website_ids" widget="many2many_tags" domain="company_id and [('company_id', '=', company_id)] or []"/>
|
||||
</xpath>
|
||||
</field>
|
||||
</record>
|
||||
</odoo>
|
||||
|
||||
|
|
@ -0,0 +1,26 @@
|
|||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<odoo>
|
||||
|
||||
<record id="product_public_category_form_view" model="ir.ui.view">
|
||||
<field name="name">product.public.category.form</field>
|
||||
<field name="model">product.public.category</field>
|
||||
<field name="inherit_id" ref="website_sale.product_public_category_form_view"/>
|
||||
<field name="arch" type="xml">
|
||||
<xpath expr="//field[@name='sequence']" position="after">
|
||||
<field name="website_ids" widget="many2many_tags" attrs="{'readonly': [('parent_id', '!=', False)]}"/>
|
||||
</xpath>
|
||||
</field>
|
||||
</record>
|
||||
|
||||
<record id="product_public_category_tree_view" model="ir.ui.view">
|
||||
<field name="name">product.public.category.tree</field>
|
||||
<field name="model">product.public.category</field>
|
||||
<field name="inherit_id" ref="website_sale.product_public_category_tree_view"/>
|
||||
<field name="arch" type="xml">
|
||||
<xpath expr="//field[@name='display_name']" position="after">
|
||||
<field name="website_ids" widget="many2many_tags"/>
|
||||
</xpath>
|
||||
</field>
|
||||
</record>
|
||||
|
||||
</odoo>
|
||||
|
|
@ -0,0 +1,13 @@
|
|||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<odoo>
|
||||
<record id="product_template_form_view_inherit_website_multi_comapny_sale" model="ir.ui.view">
|
||||
<field name="name">product.template.form.inherit.website_multi_company_sale</field>
|
||||
<field name="model">product.template</field>
|
||||
<field name="inherit_id" ref="product.product_template_form_view"/>
|
||||
<field name="arch" type="xml">
|
||||
<xpath expr="//field[@name='company_id']" position="after">
|
||||
<field name="website_ids" widget="many2many_tags" domain="company_id and [('company_id', '=', company_id)] or []"/>
|
||||
</xpath>
|
||||
</field>
|
||||
</record>
|
||||
</odoo>
|
||||
|
|
@ -0,0 +1,17 @@
|
|||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<odoo>
|
||||
|
||||
<record id="view_website_multi_company_form" model="ir.ui.view">
|
||||
<field name="model">website</field>
|
||||
<field name="inherit_id" ref="website_multi_company.view_website_multi_company_form"/>
|
||||
<field name="arch" type="xml">
|
||||
<xpath expr="//div[@name='shop']" position="inside">
|
||||
<group string="Assignation of online orders">
|
||||
<field name="salesperson_id"/>
|
||||
<field name="salesteam_id"/>
|
||||
</group>
|
||||
</xpath>
|
||||
</field>
|
||||
</record>
|
||||
|
||||
</odoo>
|
||||
|
|
@ -8,6 +8,37 @@ Website Multi Theme
|
|||
|
||||
Allow the website admin to set a different theme for each website.
|
||||
|
||||
The *theme* might be not just a theme-module, but any set of themes and even
|
||||
particular views from any module (e.g. view ``website.custom_footer`` from
|
||||
``website`` module). It also means, that *theme* is not just a styling, but
|
||||
a content as well.
|
||||
|
||||
How it works
|
||||
============
|
||||
|
||||
Core idea is as following
|
||||
|
||||
* Find views created by *theme-module* and mark them as *multi-views* (``website.theme.asset``) additionally to one specified manually via XML (see `demo/themes.xml <demo/themes.xml>`_ as an example). The method `_convert_assets <models/website_theme.py>`_ is responsible for it.
|
||||
|
||||
* Set ``active`` to ``False`` for *multi-views*. See method `_find_and_deactivate_views <models/website_theme.py>`_.
|
||||
|
||||
* Apply *Multi-theme* (record in new model ``website.theme``) to the specific
|
||||
website. See method `_multi_theme_activate <models/website.py>`_
|
||||
|
||||
* Make some magic with technical views ``website.assets_frontend`` and ``website.layout``.
|
||||
|
||||
* Duplicate *patterns* from `templates/patterns.xml <templates/patterns.xml>`_
|
||||
* In ``layout_pattern`` replace ``{theme_view}`` placeholder to a duplicate
|
||||
of ``assets_pattern``
|
||||
* Corresponding duplicated *pattern* will be used as a new value for
|
||||
``inherit_id`` field in duplicated *multi-views* that originally extend
|
||||
``web.assets_frontend``, ``website.assets_frontend`` or
|
||||
``website.layout``.
|
||||
|
||||
* Duplicate *multi-views* of the *multi-theme* and its *dependencies* (other
|
||||
*multi-themes*). In duplicates, the field ``inherit_id`` is changed to other
|
||||
duplicated views or duplicated *patterns* when possible
|
||||
|
||||
Installation
|
||||
============
|
||||
|
||||
|
|
@ -54,6 +85,8 @@ To configure this module, you need to:
|
|||
a *Website*.
|
||||
#. Press *Advanced > Multiwebsite theme > Reload*.
|
||||
#. In *Advanced > Multiwebsite theme*, pick one of the available themes.
|
||||
#. Via Edit button (``fa-external-link``) add *Default Theme* to *Sub-themes* of
|
||||
the selected theme to make multi-footer work.
|
||||
|
||||
Once you save, any website that has no *Multiwebsite theme* selected will have,
|
||||
the default plain Bootstrap theme, and those that do have one will get it.
|
||||
|
|
@ -62,7 +95,7 @@ Of course, your Odoo instance must be reachable by all of the provided host
|
|||
names, or nobody will ever see the effect. But that is most likely configured
|
||||
through your DNS provider and/or proxy, so it is not a matter of this addon.
|
||||
|
||||
If you want to test this behavior, think that ``localhost`` and ``127.0.0.1``
|
||||
If you want to test this behavior, think that ``localhost`` and ``0.0.0.0``
|
||||
are different host names.
|
||||
|
||||
Usage
|
||||
|
|
@ -145,7 +178,7 @@ Contributors
|
|||
* Rafael Blasco <rafael.blasco@tecnativa.com>
|
||||
* Antonio Espinosa <antonio.espinosa@tecnativa.com>
|
||||
* Jairo Llopis <jairo.llopis@tecnativa.com>
|
||||
* `Ivan Yelizariev <https://it-projects.info/team/yelizariev>`__
|
||||
* Ivan Yelizariev <https://it-projects.info/team/yelizariev>
|
||||
|
||||
Maintainer
|
||||
----------
|
||||
|
|
|
|||