Merge branch 'website' into 'develop'

Website

See merge request !1
develop
Andreas Wabro 2018-08-20 08:59:38 +02:00
commit 90291a1f42
237 changed files with 32025 additions and 979 deletions

View File

@ -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

View File

@ -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

View File

@ -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

View File

@ -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

View File

@ -0,0 +1 @@
from . import models

View File

@ -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,
}

View File

@ -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

View File

@ -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>

View File

@ -0,0 +1 @@
from . import ir_rule

View File

@ -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)])

Binary file not shown.

After

Width:  |  Height:  |  Size: 3.0 KiB

View File

@ -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>

View File

@ -0,0 +1 @@
from . import test_compute_domain

View File

@ -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)

View File

@ -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>

1
ext/3rd-party-addons/mobikul/.gitignore vendored Executable file
View File

@ -0,0 +1 @@
*.pyc

View File

@ -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 Licensors 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.

View File

@ -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

View File

@ -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",
}

View File

@ -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
}
},
}

View File

@ -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

View File

@ -0,0 +1,7 @@
# -*- coding: utf-8 -*-
#################################################################################
#
# Copyright (c) 2015-Present Webkul Software Pvt. Ltd. (<https://webkul.com/>)
#
#################################################################################
from . import main

File diff suppressed because it is too large Load Diff

View File

@ -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>

View File

@ -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>

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

View File

@ -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

View File

@ -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)

View File

@ -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]))

View File

@ -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)

File diff suppressed because it is too large Load Diff

View File

@ -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.")

View File

@ -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))

View File

@ -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")

View File

@ -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
1 id name model_id:id group_id:id perm_read perm_write perm_create perm_unlink
2 access_mobikul_banners_public mobikul.mobikul_banners.public model_mobikul_banners 1 0 0 0
3 access_mobikul_category_public mobikul.mobikul_category.public model_mobikul_category 1 0 0 0
4 access_res_partner_public base.res_partner.public base.model_res_partner 1 0 0 0
5 access_mobikul_push_notification_public mobikul.mobikul_push_notification.public model_mobikul_push_notification 1 0 0 0
6 access_mobikul_push_notification_template_public mobikul.mobikul_push_notification_template.public model_mobikul_push_notification_template 1 0 0 0
7 access_mobikul_notification_messages_template_public mobikul.mobikul_notification_messages.public model_mobikul_notification_messages 1 0 0 0
8 access_mobikul_category Mobikul Category Access model_mobikul_category mobikul.group_mobikul_user 1 1 1 1
9 access_mobikul_banners Mobikul Banners Access model_mobikul_banners mobikul.group_mobikul_user 1 1 1 1
10 access_mobikul_product_slider Mobikul Product Slider Access model_mobikul_product_slider mobikul.group_mobikul_user 1 1 1 1
11 access_mobikul_push_notification Mobikul Push Notification Access model_mobikul_push_notification mobikul.group_mobikul_user 1 1 1 1
12 access_mobikul_notification_messages Mobikul Notification Messages Access model_mobikul_notification_messages mobikul.group_mobikul_user 1 0 0 0
13 access_mobikul_push_notification_template Mobikul Push Notification Template Access model_mobikul_push_notification_template mobikul.group_mobikul_user 1 0 0 0
14 access_manager_mobikul_mobikul Mobikul Access model_mobikul mobikul.group_mobikul_manager 1 1 1 1
15 access_manager_mobikul_push_notification Mobikul Push Notification Access model_mobikul_push_notification mobikul.group_mobikul_manager 1 1 1 1
16 access_manager_mobikul_push_notification_template Mobikul Push Notification Template Access model_mobikul_push_notification_template mobikul.group_mobikul_manager 1 1 1 1
17 access_manager_mobikul_notification_messages Mobikul Push Notification Messages Access model_mobikul_notification_messages mobikul.group_mobikul_manager 1 1 1 1

View File

@ -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>

Binary file not shown.

After

Width:  |  Height:  |  Size: 208 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 184 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 209 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 163 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 406 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 347 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 341 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 469 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 315 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 6.1 KiB

View File

@ -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>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
<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&amp;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 &amp; 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>

Binary file not shown.

After

Width:  |  Height:  |  Size: 98 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 504 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 169 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 146 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 3.4 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 3.4 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 52 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 50 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 6.1 KiB

View File

@ -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)

View File

@ -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> -->

View File

@ -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>

View File

@ -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': ['&amp;', ('product_selection', '=', 'automatic'),('product_based_on', '=', 'mCategory')]}"/>
<field name="wcategory_id" attrs="{'invisible': ['|', ('product_selection', '=','manual'),('product_based_on', 'not in', ['wCategory'])],'required': ['&amp;', ('product_selection', '=', 'automatic'),('product_based_on', '=', 'wCategory')]}"/>
<field name="icategory_id" attrs="{'invisible': ['|', ('product_selection', '=','manual'),('product_based_on', 'not in', ['iCategory'])],'required': ['&amp;', ('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>

View File

@ -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>

View File

@ -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>

View File

@ -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>

View File

@ -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>

View File

@ -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

View File

@ -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",

View File

@ -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

View File

@ -1,3 +1,8 @@
`1.2.4`
-------
- **ADD:** Product with no company defined is allowed for all websites
`1.2.3`
-------

View File

@ -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

View File

@ -1,4 +1,3 @@
# -*- coding: utf-8 -*-
import logging
from odoo import models, api

View File

@ -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)])

View File

@ -1,4 +1,3 @@
# -*- coding: utf-8 -*-
from odoo import models, api

View File

@ -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()

View File

@ -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

View File

@ -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)
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,
})
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)],
}
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,
})
# 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()
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())

View File

@ -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 &amp; Update all websites</attribute>
<attribute name="context">{'skip_converting_assets': True}</attribute>
</xpath>
</field>
</record>

View File

@ -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>

View File

@ -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"/>

View File

@ -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

View File

@ -0,0 +1,2 @@
from . import models
from . import controllers

View File

@ -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,
}

View File

@ -0,0 +1 @@
from . import main

View File

@ -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

View File

@ -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

View File

@ -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

Binary file not shown.

After

Width:  |  Height:  |  Size: 298 KiB

View File

@ -0,0 +1,4 @@
from . import product_public_category
from . import sale_order
from . import product_template
from . import payment_acquirer

View File

@ -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"))

View File

@ -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"
)

View File

@ -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"))

View File

@ -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)

View File

@ -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>

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.2 KiB

View File

@ -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>

View File

@ -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>

View File

@ -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>

View File

@ -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>

View File

@ -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>

View File

@ -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
----------

Some files were not shown because too many files have changed in this diff Show More