Giter VIP home page Giter VIP logo

odoo-shopinvader's Introduction

Pre-commit Status Build Status codecov

Shopinvader

Odoo REST APIs for e-commerce.

Available addons

addon version maintainers summary
sale_cart 16.0.1.0.0 Uee Sale Orders as cart.
sale_cart_step 16.0.1.0.0 Track checkout steps on sale cart.
shopinvader_address 16.0.1.1.0 Shopinvader Address: Delivery,Invoicing
shopinvader_anonymous_partner 16.0.1.1.0 Manage anonymous partners with a cookie.
shopinvader_api_address 16.0.1.3.0 Adds a service to manage shopinvader invoicing and delivery address
shopinvader_api_cart 16.0.1.4.0 Cart FastAPI designed to work with the shopinvader-js-cart library see (https://github.com/shopinvader/shopinvader-js-cart)
shopinvader_api_cart_step 16.0.1.0.0 Track checkout steps on sale cart.
shopinvader_api_customer 16.0.1.0.0 Adds service to manage shopinvader customer
shopinvader_api_lead 16.0.1.0.1 Lead FastAPI adding a service for creating CRM leads.
shopinvader_api_sale 16.0.1.1.4 Sale FastApi for exposing sale order
shopinvader_api_sale_loyalty 16.0.1.1.0 FastAPI services to add coupons and loyalties to carts.
shopinvader_api_security_sale 16.0.1.1.1 Add security rule to expose sale order
shopinvader_api_settings 16.0.1.0.1 Adds a service to get commont settings
shopinvader_api_signin_jwt 16.0.1.1.1 This module adds a signin service with jwt token.
shopinvader_api_wishlist 16.0.1.0.2 Handle shop wishlist
shopinvader_base_url 16.0.1.0.3 keep history of url for products & categories
shopinvader_delivery_state 16.0.1.0.1 Shopinvader delivery state
shopinvader_es_product_categ 16.0.1.0.0 Add the hierarchicalCategories field in the product index required for faceting
shopinvader_fastapi_auth_jwt 16.0.1.0.2 Provide JWT and Anonymous Partner authentication to FastAPI routes.
shopinvader_filtered_model 16.0.1.1.1 Helper for exposing model easily
shopinvader_multi_category 16.0.1.0.1 Shopinvader Many Categories
shopinvader_product 16.0.1.0.4 Adds shopinvader product fields and schemas
shopinvader_product_attribute_set 16.0.1.0.2 Expose all PIM' Attribute sets with Shopinvader
shopinvader_product_brand 16.0.1.0.1 Shopinvader product Brand
shopinvader_product_brand_tag 16.0.1.0.1 Index Product Brand Tags in Shopinvader
shopinvader_product_description 16.0.1.0.0 Description fields for Shopinvader
shopinvader_product_sale_packaging 16.0.1.0.2 Shopinvader Product Sale Packaging
shopinvader_product_seo 16.0.1.0.0 SEO fields for Shopinvader
shopinvader_product_url 16.0.1.0.1 Generate url for product and category
shopinvader_restapi 16.0.1.1.3 Shopinvader
shopinvader_restapi_auth_jwt 16.0.1.2.0 Find shopinvader backend and partner from JWT token
shopinvader_restapi_invoice 16.0.1.0.0 Shopinvader Restapi Invoice module
shopinvader_restapi_sale_packaging 16.0.1.1.0 Shopinvader Restapi Sale Packaging
shopinvader_sale_cart 16.0.1.1.0 ShopInvader logic for sale carts.
shopinvader_sale_state 16.0.1.0.1 Basic module to implement state for sale order
shopinvader_schema_address 16.0.1.3.0 Adds shchema address: address invoicing_address delivery_address
shopinvader_schema_sale 16.0.1.1.3 Add schema sale
shopinvader_schema_sale_state 16.0.1.0.1 Shopinvader Schema Sale State
shopinvader_search_engine 16.0.1.0.6 Shopinvader Catalog Search Engine Connector
shopinvader_search_engine_assortment 16.0.1.0.1 Shopinvader Search Engine Assortment
shopinvader_search_engine_image 16.0.1.0.3 Add the export of Image for Shopinvader
shopinvader_search_engine_product_brand 16.0.1.0.1 Shopinvader Search Engine Product Brand
shopinvader_search_engine_product_brand_image 16.0.1.0.0 Shopinvader Search Engine product Brand Image
shopinvader_search_engine_product_media 16.0.1.0.4 Index storage media data into search engine
shopinvader_search_engine_product_multi_price 16.0.1.0.0 Add the export of multiple prices for Shopinvader
shopinvader_search_engine_product_price 16.0.1.0.0 Add the export of product prices for Shopinvader
shopinvader_search_engine_product_seo 16.0.1.0.1 This module allows to configure a seo title suffix on se backends
shopinvader_search_engine_product_stock 16.0.1.0.4 This module is used to export stock data to search engine
shopinvader_search_engine_product_stock_state 16.0.1.0.0 This module is used to choose a stock state during theexport t search engine
shopinvader_search_engine_product_template_multi_link 16.0.1.0.0 Shopinvader Product Link
shopinvader_search_engine_update 16.0.1.0.2 Shopinvader: Mark product binding to export on product update
shopinvader_search_engine_update_image 16.0.1.0.0 Shopinvader: Mark products linked to an image to be updated when the image change
shopinvader_search_engine_update_pricelist 16.0.1.0.0 Shopinvader: Mark product binding to export on Product Pricelist update
shopinvader_search_engine_update_product_brand 16.0.1.0.0 Shopinvader: Mark brand and product bindings to export on product brand update
shopinvader_search_engine_update_product_brand_image 16.0.1.0.0 Mark brand and product bindings to export on product image brand update
shopinvader_search_engine_update_product_brand_tag 16.0.1.0.0 Mark brand and product bindings to export on product image tag update
shopinvader_search_engine_update_product_media 16.0.1.0.0 Shopinvader: Mark products linked to a media to be updated when the media change
shopinvader_search_engine_update_product_template_multi_link 16.0.1.0.0 Mark bindings to recompute when a link is added, deleted or modified

Unported addons

addon version maintainers summary
partner_contact_company 10.0.1.0.0 (unported) Partner Company
product_online_category 10.0.1.0.0 (unported) Product categories dedicated to online shop
shopinvader 14.0.5.24.2 (unported) Shopinvader
shopinvader_algolia 14.0.2.0.0 (unported) Shopinvader Algolia Connector
shopinvader_auth_api_key 14.0.1.1.1 (unported) Shopinvader API_KEY Authentication
shopinvader_backend_image_proxy 14.0.1.0.2 (unported) Add possibility to replace the image URL by the proxy url set on the SE backend
shopinvader_cart_expiry 14.0.1.0.0 (unported) Shopinvader module to manage an expiry delay on cart
shopinvader_category_image_for_product 14.0.1.0.1 (unported) Shopinvader Display category image for product
shopinvader_contact_address_default 14.0.1.0.0 (unported) ivantodorovich Integrates partner_contact_address_default with Shopinvader
shopinvader_contact_company 10.0.1.0.0 (unported) Make available the field company in the address form
shopinvader_customer_activity 14.0.1.0.1 (unported) ivantodorovich Log the customer's shop activity
shopinvader_customer_invoicing_mode 14.0.1.0.0 (unported) Glue module to expose the invoicing_mode field to shopinvader
shopinvader_customer_multi_user 14.0.1.5.0 (unported) Enable registration of multiple users per each company customer.
shopinvader_customer_multi_user_company_group 14.0.1.0.0 (unported) Share shopinvader records within the Company Group
shopinvader_customer_multi_user_validate 14.0.1.1.0 (unported) Glue module for shopinvader_customer_validate and shopinvader_customer_multi_user.
shopinvader_customer_multi_user_wishlist 14.0.1.1.0 (unported) Integrate customer multi user and wishlist.
shopinvader_customer_price 14.0.1.0.2 (unported) Expose customer's specific prices.
shopinvader_customer_price_wishlist 14.0.1.1.0 (unported) Expose customer's specific prices.
shopinvader_customer_validate 14.0.1.3.0 (unported) Provide configuration and machinery to validate customers.
shopinvader_delivery_instruction 14.0.1.0.2 (unported) Shopinvader addons to let user define delivery instructions
shopinvader_demo_app 12.0.2.0.4 (unported) Shopinvader Demo App
shopinvader_easy_binding 14.0.1.0.1 (unported) ivantodorovich Easily manage Shopinvader bindings for your company backend.
shopinvader_elasticsearch 14.0.3.0.1 (unported) Shopinvader Elasticsearch Connector
shopinvader_guest_mode 14.0.1.1.0 (unported) Guest mode for Shopinvader
shopinvader_import_image 14.0.1.1.1 (unported) Import product images
shopinvader_lead 14.0.1.1.0 (unported) Shopinvader Lead Management
shopinvader_locomotive 14.0.2.1.1 (unported) Manage communications between Shopinvader and Locomotive CMS
shopinvader_locomotive_algolia 14.0.1.0.0 (unported) This addons is used to push the initial algolia configuration to locomotive
shopinvader_locomotive_contact_company 10.0.1.0.0 (unported) Synchronize the contact_name with customer name
shopinvader_locomotive_elasticsearch 12.0.1.1.0 (unported) This addons is used to push the initial elasticsearch configuration to locomotive
shopinvader_locomotive_guest_mode 14.0.1.0.3 (unported) Shopinvader guest mode for locomotive
shopinvader_locomotive_reset_password 14.0.1.3.0 (unported) Give the possibility to send a email to reset thepassword from odoo
shopinvader_locomotive_sale_profile 14.0.1.0.1 (unported) Synchronize the sale profile info to customer record on Locomotive
shopinvader_locomotive_wishlist 14.0.1.0.2 (unported) Synchronize wishlist details to Locomotive users record.
shopinvader_membership 14.0.1.0.1 (unported) Shopinvader Membership module
shopinvader_multi_cart 14.0.1.1.1 (unported) Manage multiple carts in Shopinvader
shopinvader_notification_default 14.0.1.0.1 (unported) Provide default notification templates for Shopinvader suite.
shopinvader_partner_firstname 14.0.1.0.0 (unported) Shopinvader Customer firstname/lastname
shopinvader_partner_vat 14.0.1.0.2 (unported) Shopinvader Check VAT with invader environnement
shopinvader_pending_cart_reminder 14.0.1.0.0 (unported) Shopinvader module to relaunch the customer when the cart/sale is not confirmed yet. Configure the delay and the email template on the backend.
shopinvader_portal_mode 14.0.1.1.0 (unported) Shopinvader portal mode
shopinvader_pos 14.0.2.2.0 (unported) Shopinvader for PoS
shopinvader_price_per_qty 14.0.1.0.1 (unported) Shopinvader price per quantity
shopinvader_product_manufactured_for 14.0.1.0.0 (unported) Manage Product Made Specially For Some Customers
shopinvader_product_new 14.0.1.0.1 (unported) Shopinvader product new
shopinvader_product_order 14.0.1.1.0 (unported) Manage product display order on Shopinvader
shopinvader_product_price_tax 14.0.1.2.0 (unported) Exposes product prices with and without taxes
shopinvader_product_stock_assortment 14.0.1.0.2 (unported) This module is used to let the Shopinvader product assortment use the stock context in Shopinvader product stock.
shopinvader_product_stock_forecast 14.0.1.0.0 (unported) ivantodorovich Export Stock Forecast data along with product stocks.
shopinvader_product_stock_forecast_expiry 14.0.1.0.0 (unported) ivantodorovich Integrates product lot expiration into the forecast
shopinvader_product_template_multi_link_date_span 14.0.1.0.0 (unported) Integrate product_template_multi_link_date_span in Shopinvader
shopinvader_product_template_tags 14.0.1.0.0 (unported) Index Product Template Tags in Shopinvader
shopinvader_product_variant_multi_link 14.0.1.0.0 (unported) Integrate product_variant_multi_link with Shopinvader
shopinvader_product_variant_selector 14.0.1.0.0 (unported) Ease creation of variants selector on shopinvader sites
shopinvader_product_video_link 14.0.1.0.2 (unported) Add video on your Shopinvader website
shopinvader_promotion_rule 10.0.1.0.0 (unported) Module to manage Promotion Rule with shopinvader
shopinvader_quotation 14.0.2.3.1 (unported) Shopinvader Quotation
shopinvader_sale_amount_by_group 14.0.1.0.0 (unported) Expose the amount by tax to shopinvader
shopinvader_sale_automatic_workflow 14.0.1.1.0 (unported) ivantodorovich Use sale automatic workflows for Shopinvader orders
shopinvader_sale_communication 10.0.1.0.0 (unported) This module adds information fields for customers and vendors.
shopinvader_sale_coupon 14.0.1.2.0 (unported) Manage Promotion and Coupon programs in Shopinvader
shopinvader_sale_packaging_wishlist 14.0.1.0.0 (unported) Add packaging information to wishlists
shopinvader_sale_profile 14.0.1.3.0 (unported) ShopInvader - Sale profile
shopinvader_sale_report 10.0.1.0.0 (unported) Shopinvader addons to extend sale report with backend
shopinvader_wishlist 14.0.1.1.0 (unported) Handle shop wishlist

Licenses

This repository is licensed under AGPL-3.0.

However, each module can have a totally different license, as long as they adhere to Shopinvader policy. Consult each module's __manifest__.py file, which contains a license key that explains its license.


odoo-shopinvader's People

Contributors

acsonefho avatar alexis-via avatar baimont avatar bansari-serpentcs avatar bealdav avatar benwillig avatar bguillot avatar chafique-delli avatar david-popa avatar florian-dacosta avatar hparfr avatar hviorforgeflow avatar ivantodorovich avatar kevinkhao avatar laurent-corron avatar lmignon avatar marielejeune avatar mmequignon avatar mourad-ehm avatar paradoxxxzero avatar qgroulard avatar robinetdenisacsone avatar rousseldenis avatar rvalyi avatar sbejaoui avatar sbidoul avatar sebastienbeau avatar simahawk avatar sylvainc avatar thomasbinsfeld avatar

Stargazers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

Watchers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

odoo-shopinvader's Issues

Better Json Field

Odoo implement Serialized field but only allow "dict".
it will be better to

  • call the field "Json" instead of serialized
  • be able to store a list or a dict
  • have a real "Json" field stored in json in postresql

This can be done in a separated module for now and them we should do a PR to Odoo

[10.0] shopinvader partner creation

Actual behaviour:
module: shopinvader + shopinvader_locomotive
When we create a shopinvader.partner manually (by form view for example), the record (Odoo side) is created.
Then a job is created to add the new partner on Locomotive side and generate the external_id.
Then this external_id is saved on the shopinvader.partner.

But if we install shopinvader_sale_profile, it doesn't work anymore.
The traceback says that the key sale_profile (into generated json sent to locomotive) is a unknown attribute.

So I don't know what's the real issue:

  • shopinvader_sale_profile shouldn't add this key?
  • Locomotive should accept this key?
  • Maybe it was working on the previous version of Locomotive and it's a missing feature in this new version?

Thank you for your help

Generic concept of sale.shop or sale.channel

The more I think about e-commerce and the fact that we can sale on several channel (amazon, c-discount, own site...), the more I think we should introduce a concept of "sale.channel" or "sale.shop" that can be "_inherits" by shopinvader.backend and same for backend in lengow connector.

base_rest: RFC: Improve request/response Schema description

Current context

In base_Rest, information exchanged by services is validated according to a Cerberus schema defined as dict.

    address_request_schema = {
        'name': {'type': 'string', 'required': True, 'empty': False},
        'street': {'type': 'string'},
    }

Defining such schemas could become boring and lead to a hard to read/maintain result when the schema is complex. This kind of definition is also hard to extend, reuse etc...

Proposal

Odoo already provides a clean api to define models. This API provides a pythonic way to define fields and relation between models. It also provides a clean way to override and extend models across modules. The Idea is to define a new base class based on BaseModel to define the messages exchanged by the services.

class RestModel(models.BaseModel):
    _name='rest.model'
    
    def from_json(self, json_data):
        return self.new(....)

    def to_json(self):
        return {}      
    
    def validate(self):
        return True

    def to_json_schema(self):
        """ Return the definition of the model as json schema
        see http://json-schema.org/
        """
        retrun {}


class AddressRequest(RestModel):
    _name = 'address.request'

    name = fields.Char(required=True)
    street = fields.Char()

    ....

Expected benefits:

  • More modular
  • Easier to extend / reuse / redefine
  • Easier to manipulate into the services implementation. my_address['name'] vs my_address.name
  • Easier to document (thanks to string and helpattributes of the fields we'll be able to provide a description into the json schema)
  • ....

Forward-port / Back-port TODO

Forward port from 10.0 to 12.0/13.0

  • [10.0][ADD] Add a 'clear' on cart service + backend config #357 and [10.0][FIX] shopinvader: Don't override common test class #424
  • [10.0][ADD] Add delivery service #325 by by @lmignon #479
  • [10.0][ADD] add module shopinvader_delivery_instruction #313 depends of OCA/sale-workflow#757 -> done in #446
  • [10.0][ADD] Add shopinvader_invoice #327 by @lmignon #481
  • [10.0][FIX] shopinvader_promotion_rule: avoid to call the auto_apply rule twice after applying a coupon code #426 by @sebastienbeau #752 #753
  • [10.0][FIX] shopinvader: prevent any creation of empty cart by search service #425
  • [10.0][ADD] shopinvader_cart_expiry: add new feature to manage cart expiry delay #448 by @lmignon #482
  • [10.0][IMP] shopinvader: Allows to download paid invoices for confirmed salโ€ฆ #366 by @lmignon #483
  • [10.0][FIX] shopinvader guest mode export #465 by lmignon #484
  • [10.0][FIX] shopinvader: change url_key of all bindings in case of product renaming #470 by @lmignon #485
  • [10.0]FIX/Improve view of product.category/shopinvader.category #472 by @lmignon #486
  • [10.0] Merge shopinvader invoice + invoice download #407 by @lmignon #487
  • [10.0][ADD] add delivery price simulation for cart #352 by @lmignon #488
  • [10.0][FIX] shopinvader_promotion_rule fix promotions applied #562 by @sebastienbeau #756 #757
  • [10.0][ADD] Add module shopinvader_product_stock_assortment. #567 by @sebastienbeau #754 #755
  • [10.0][ADD] shopinvader_delivery_carrier add sale info related to returned pickings #526 - By @sebastienbeau #685 #686
  • [10.0][UPD] shopinvader cart expiry: apply only on draft cart #535 - By @sebastienbeau #687 #688
  • [10.0][IMP][ADD] shopinvader - Document generate/download (pdf) #570 - By @sebastienbeau / @i-vyshnevska #769 #707
  • [10.0] add new addon to allow to display the category image if the product does not have one - #572 - by @sebastienbeau #699 #700
  • [10.0][UPD] Add the invoice/get service - #512 - by @sebastienbeau #701 #702
  • [10.0][FIX] Fix missing parameters into some search validator - #577 - By @HviorForgeFlow - #639 #644
  • [10.0][FIX] shopinvader: Shopinvader Manager inherits from queue manager #560 - By @HviorForgeFlow - #666 #673
  • [10.0] shopinvader.partner: switch to ondelete=restrict #563 - By @HviorForgeFlow - #649
  • [10.0][ADD] Return also state label (not only technical value) - #404 - By @rousseldenis #638
  • [10.0][FIX] fix database transaction error on multi-languages anonymous carts #595 - #694 #650
  • [10.0][FIX] Fix shopinvader - Variants/Product active/inactive #568 - By @HviorForgeFlow - #656 #657
  • [10.0][IMP] shopinvader_locomotive_reset_password: Add password expiration management #556 - By sebastienbeau #758 #759
  • [10.0][UPD] shopinvader: force update pricelist and prices #449 - By @rousseldenis - #661 #679
  • [13.0 ok] [10.0][UPD] update with shopinvader invoice payment #467 - By @sebastienbeau #770
  • [10.0][FIX] shopinvader_sale_profile: Export default role if no profile #553 by @PierrickBrun #633 #760
  • [13.0 ok] [10.0][CHG]shopinvader_invoice: add signed amount in response #584 - By @sebastienbeau #810
  • [10.0][CHG] being able to make the difference between an update done by the customer and update done internally in Odoo #596 - By @HviorForgeFlow #667
  • [10.0][IMP] shopinvader: Allow to copy a previous sale #558 - By @HviorForgeFlow - #655 #654
  • [10.0][IMP] shopinvader/guest_mode: Allows to update profile in guest mode #598 - By @sebastienbeau #819
  • [10.0] shopinvader: improve shopinvader.partner views #564 - By @rousseldenis - #691 #692
  • [FIX] shopinvader: unique constrains on email should only apply to active records #620 - By @HviorForgeFlow #675 #674
  • [10.0][FIX] fix issue when creating binding from the main record #607 NEEDS #340 - By @HviorForgeFlow #668 #669
  • 10.0 force technical user recompute export #622 - By @HviorForgeFlow - #677 #676
  • [10.0][FIX] Fix delete synchronisation #360 - By @rousseldenis #643 #646
  • [10.0][FIX] action server in tree view must play on all selected records #458 - By @sebastienbeau #761 @rousseldenis #694
  • [10.0][IMP] shopinvader_locomotive: Improve metadata #627 - By @sebastienbeau #762 #766
  • [10.0][FIX] - shopinvader_delivery_carrier - flake8 fix #636 (not needed)
  • [10.0][FIX] shopinvader: sale service should return so linked to child partners #621 - #763 #707
  • [10.0][REF] refactor url generator #340 - By @HviorForgeFlow - #668 #669
  • [13.0 ok] [10.0][ADD] Allow quotation download #653 #707 by @i-vyshnevska
  • [10.0][ADD] Add shopinvader_sale_communication #647 - By @sebastien #820
  • [FIX] shopinvader_sale_profile: support profile without fiscal positions #651 - By @sebastienbeau #764 #765
  • [IMP] add carrier code into api response #417 - By sebastienbeau #739 #821
  • [10.0][FIX] fix incorrect api return #606 - By sebastienbeau #767 #771
  • [FIX] API convention #634 - By sebastienbeau #822
  • [13.0 ok] [IMP] add code in api for state and country in address #680 - By sebastienbeau #813 #814
  • [10.0][IMP] shopinvader: Add validator for contact types #561 - By sebastienbeau #772 #773
  • [ADD][10.0] add total without shipping and without discount in cart service response #793
  • [10.0][IMP] shopinvader: Improve add item service #571 (perf improvement maybe not needed on V13+)
  • [10.0][FIX] shopinvader: Recompute also sale order lines #599 (perf improvement maybe not needed on V13+)
  • [10.0][FIX]shopinvader_sale_profile: fix wrong company for determining pricelists on partner #851
  • [10.0][IMP] shopinvader_promotion_rule: let possibility to disable promotion rule by backend #724
  • [10.0][FIX] shopinvader_membership: missing ID in search - #905
  • [10.0][IMP] add a wizard for redirecting the product or the category manually - #682
  • [12.0][MIG][FW] shopinvader delivery instruction #446

Backport from 12.0 to 10.0

  • [12.0] [IMP]shopinvader_backend_view Improvements #411 AND [12.0][FIX] shopinvader_assortment backend_view #431
  • [12.0] [IMP] Shopinvader_demo_app dependencies #410 + [12.0][IMP] shopinvader_demo_app: Add stripe #441
  • [12.0] [IMP] locomotive easy config #428 + [12.0][FIX] shopinvader_locomotive: Provides the right url entrypoint for REST services #438 + [12.0][IMP] shopinvader_demo_app: uses localtest.me for elastic address #442
  • [12.0] [IMP]shopinvader_locomotive: Exports new locales mapping to locomotive #434
  • [12.0] [FIX] shopinvader: Fix binding not created when a new lang is added #435
  • [12.0] [IMP] Compatible with new auth-api-key #420
  • [12.0][FIX] shopinvader_demo_ap: Storage backend forced to public #436
  • [12.0][FIX] shopinvader_elasticsearch: hierarchicalCategories into index must be nested #437
  • [12.0][IMP] add currencies to shopinvader's demo data #450
  • [12.0][REF] clean shopinvader_quotation #397
  • [12.0] [IMP] Shopinvader: allow the write on sale orders from partner without access #359
  • [12.0] Customer language + company_name handling #474
  • [12.0][REF] Make search engine locomotive export settings generic #477
  • [13.0][ENH] shopinvader: Easier product configuration access
  • [13.0] Fix call to ir.config_parameter using sudo #704

Backport from 14.0

  • [14.0][FIX] shopinvader: make the base_pricelist and base_pricelist.currency_id fields defined in the tests usable globally - #897
  • [ADD] 14.0 cancel and redraft sale endpoint #907

Generating automatic API documentation for Shopinvader

Context

For a better security I have introduced the concept of validator for the services exposed to the controller.
See an example here : https://github.com/akretion/shopinvader/blob/8.0/shopinvader/services/cart.py#L79

This validator are based on cerberus doc here : http://docs.python-cerberus.org/en/stable
It will be great to generate an automatic documentation based on this validator as they specify explicitly the value possible for each api.

Proposal

The idea will be to create a specific page (an odoo controler) accessible by a logged user that will generate for a specific backend the documentation for all the shopinvader api by looking in the service and calling the validator method to get the schema

active_shipping client

wrap https://github.com/Shopify/active_shipping in a microservice much like https://github.com/akretion/boleto_cnab_api
and have a client for it (much like https://github.com/akretion/odoo-boleto-cnab ) to consume it from ShopInvader. May be useful for places where we didn't built python shipping libraries when great ones by Shopify may exist. Possibly useful for the USA and Brazil.

Would give us support for:

USPS
USPS Returns
FedEx
Canada Post
New Zealand Post
Shipwire
Stamps
Kunaki
Australia Post

active_shipping gives us rates and tracking but unlike https://github.com/OCA/delivery-carrier it doesn't print labels.

As for Brazilian Correios, it was just broken and this link may be interesting (possibly we fix ActiveShipping):
Shopify/active_shipping#556

better error management when Odoo raises a UserError

so for instance, when trying to pay a shopping cart, I have this Odoo error log:

2018-07-11 17:00:05,398 30248 ERROR shopinvader odoo.addons.sale_automatic_workflow.models.automatic_workflow_job: Error during an automatic workflow action.
Traceback (most recent call last):
  File "/home/rvalyi/DEV/shopinvader-voodoo/external-src/sale-workflow/sale_automatic_workflow/models/automatic_workflow_job.py", line 23, in savepoint
    yield
  File "/home/rvalyi/DEV/shopinvader-voodoo/external-src/sale-workflow/sale_automatic_workflow/models/automatic_workflow_job.py", line 64, in _create_invoices
    payment.with_context(active_ids=sale.ids).create_invoices()
  File "/home/rvalyi/DEV/shopinvader-voodoo/external-src/odoo/addons/sale/wizard/sale_make_invoice_advance.py", line 134, in create_invoices
    sale_orders.action_invoice_create(final=True)
  File "/home/rvalyi/DEV/shopinvader-voodoo/external-src/sale-workflow/sale_automatic_workflow/models/sale_order.py", line 73, in action_invoice_create
    final=final)
  File "/home/rvalyi/DEV/shopinvader-voodoo/external-src/odoo/addons/sale/models/sale.py", line 346, in action_invoice_create
    inv_data = order._prepare_invoice()
  File "/home/rvalyi/DEV/shopinvader-voodoo/external-src/sale-workflow/sale_automatic_workflow/models/sale_order.py", line 39, in _prepare_invoice
    invoice_vals = super(SaleOrder, self)._prepare_invoice()
  File "/home/rvalyi/DEV/shopinvader-voodoo/external-src/odoo/addons/sale_stock/models/sale_order.py", line 71, in _prepare_invoice
    invoice_vals = super(SaleOrder, self)._prepare_invoice()
  File "/home/rvalyi/DEV/shopinvader-voodoo/external-src/bank-payment/account_payment_sale/models/sale_order.py", line 27, in _prepare_invoice
    vals = super(SaleOrder, self)._prepare_invoice()
  File "/home/rvalyi/DEV/shopinvader-voodoo/external-src/odoo-shopinvader/shopinvader/models/sale.py", line 66, in _prepare_invoice
    res = super(SaleOrder, self)._prepare_invoice()
  File "/home/rvalyi/DEV/shopinvader-voodoo/external-src/odoo/addons/sale/models/sale.py", line 287, in _prepare_invoice
    raise UserError(_('Please define an accounting sale journal for this company.'))
UserError: (u'Please define an accounting sale journal for this company.', '')

Such error may happen if Odoo is unable to deal with the request, that is fine. What is not user/developper friendly however is what happens then in the Rails part of ShopInvader with this stack trace:

#<NoMethodError: undefined method `include?' for nil:NilClass>
  Error: undefined method `include?' for nil:NilClass
  /home/rvalyi/.rvm/gems/ruby-2.5.1/bundler/gems/shopinvader-bb5ae0b118e2/lib/shop_invader/middlewares/erp_proxy.rb:32:in `_render_html'
/home/rvalyi/.rvm/gems/ruby-2.5.1/bundler/gems/shopinvader-bb5ae0b118e2/lib/shop_invader/middlewares/erp_proxy.rb:15:in `_call'
/home/rvalyi/.rvm/gems/ruby-2.5.1/bundler/gems/steam-0da298978835/lib/locomotive/steam/middlewares/thread_safe.rb:12:in `call'
/home/rvalyi/.rvm/gems/ruby-2.5.1/bundler/gems/steam-0da298978835/lib/locomotive/steam/middlewares/path.rb:13:in `call'

So the problem is that data is null and we don't re-catch the Odoo error in a decent way.

[10.0] [12.0] Add to cart must check that the SO is in state 'draft'

With locomotive, sometimes the session on the e-commerce website is no more valid. As result, when the client add a product to a cart we must be sure that the provided cart is still in draft (not done or cancelled or ...). If it's not the case, we must create a new cart and add the product to this new cart.

Migration to version 12.0

Todo

https://github.com/OCA/maintainer-tools/wiki/Migration-to-version-12.0

Modules to migrate

  • base_url - By @rousseldenis - #318
  • connector_generic
  • connector_locomotivecms
  • partner_contact_company
  • product_media
  • product_online_category
  • product_rating
  • product_stock_state
  • product_tag
  • shopinvader - By @rousseldenis - #320
  • shopinvader_algolia
  • shopinvader_assortment - By @rousseldenis - #335
  • shopinvader_backend_image_proxy
  • shopinvader_contact_company
  • shopinvader_custom_attribute
  • shopinvader_delivery_carrier
  • shopinvader_elasticsearch - By @rousseldenis - #331
  • shopinvader_guest_mode - By @rousseldenis
  • shopinvader_image - By @rousseldenis - #334
  • shopinvader_import_image
  • shopinvader_lead - By @rousseldenis
  • shopinvader_locomotive - By @rousseldenis - #337
  • shopinvader_locomotive_contact_company
  • shopinvader_locomotive_guest_mode - By @rousseldenis - #338
  • shopinvader_locomotive_rest_password
  • shopinvader_multi_categories
  • shopinvader_partner_vat - By @rousseldenis - #339 l
  • shopinvader_product_media
  • shopinvader_product_new
  • shopinvader_product_stock - By @rousseldenis - #332
  • shopinvader_product_stock_state
  • shopinvader_product_template_multi_link
  • shopinvader_promotion_rule
  • shopinvader_quotation - By @rousseldenis - #321
  • shopinvader_sale_profile
  • shopinvader_search_engine - By @rousseldenis - #329
  • shopinvader_stripe
  • shopinvader_visible_discount

[10.0] import_image magic missing

it seems pip can not find dependencies magic
can not find what to install to get magic works for install module shopinvader_import_image

magic 0.1
python-magic 0.4.5
libmagic
python-libmagic

@sylvainc
regards

odoo-shopinvader-client repo request

@sebastienbeau as you know we are working on a frontend client based on odoo.
I'd like to have a specific repo for it will full access rights (eg: odoo-shopinvader-client)
Work has already started, see #375 so I need to push modules for the client side somewhere.
I could create a repo under our org but I think is nicer if we keep it here.
Would it be fine for you?

/cc @lmignon @sbidoul

[EBS/Future] Shopinvader EBS support hooks

Some companies use an Enterprise Service Bus decoupled from the Odoo ecosystem.
Reasons might be:

  • Observability
  • Decoupling / scaling
  • Monitoring
  • API Monetization
  • etc.

There must be a way to provide such hook in shopinvader so that an EBS can hook in and synchronize data to such external system (as algolia, external content stores, etc).

Such hook would be somewhere before calling a job and rather deviate to trigger a webhook for the purpose of triggering the desired synchronization in the ESB.

I would wish this can be kept in the back of the mind as a use case possibly worth supporting. Also I would be grateful for conceptual hints on where to find the right place for changing this behavior in custom modules.

Some screenshot for the dear reader who is not so familiar with en EBS system.

Rename shopinvader_algolia

I suggest to rename the module shopinvader_algolia to shopinvader_search_engine_algolia
It will be more consistent with other modules in this repository like shopinvader_payment_*

[10.0] Login create a new empty cart

Current behavior
When you login, a new empty cart is created. (Only if this user doesn't have one already in draft).

Issue
I think it's an issue (or undesired behavior) because as the user doesn't add anything into the basket, it shouldn't create a cart for nothing.

How to reproduce

  • Check into backend how many existing carts you have;
  • Go on the shopinvader website (don't browse any product);
  • Create a new user account;
  • Refresh your carts into the backend;
  • You should have one more (related to the new user);
  • Now you can delete this empty cart;
  • Logout from the website;
  • Login again;
  • Check carts into backend => The empty cart is again created!
    => Each time a user login (without existing cart), a new one is created.

Technically
I already investigate a little bit about the origin of this behavior:
The _get_and_assign_cart() is called after each sign_in() (customer service). And this first function call the _get() on the cart service. This one create an empty cart if no current cart.
https://github.com/shopinvader/odoo-shopinvader/blob/10.0/shopinvader/services/customer.py#L76

customer service => sign_in() => _assign_cart_and_get_store_cache() => _get_and_assign_cart()

Secure params decorator => move on send to service

After thinking twice, instead of using a decorator for securing the params the best will to implement that check in the send_to_service method https://github.com/akretion/odoo-shopinvader/blob/10-shopinvader-migration/shopinvader/controllers/main.py#L25

This will be more secure because we can forget a decorator, and also avoid issue when you want to inherit a function that have been already decorated.

I will do it here during the migration https://github.com/akretion/odoo-shopinvader/pull/64

Url key computation raise Error on product modification (multicompany context)

Since the merge of https://github.com/akretion/odoo-shopinvader/pull/167, products modification raise access errors on shopinvader.product read on backend_id during url_key computation.

The product is shared between multiple companies, the user belongs to company A, but shopinvader links are on company B.

As I don't know so much the project, I need some advice here.

My instinct would have lead me to change url_key compute_sudo to True. Having done this, no more error on product modification.

@sebastienbeau @lmignon @Cedric-Pigeon

Check connexion and give better feedback

If the locomotive server is unavailable you get a stack trace.

  1. a test connection button can be added
  2. a better formatted error message should be displayed to the user

[10.0] [12.0] session robustness

It can happen that the session has known by the frontend is desynchronized with the state of the backend.

For instance, if the backend confirms the cart, and for some reason the frontend does not receive the information (for instance if the cart confirmation occured through a webhook from the payment provider), the frontend may continue to think it has a cart.

I think we should

  • increase protection of the cart entry points: if trying to manipulate a cart that is not current anymore, ignore it, create a new cart; do not fail if removing an item that is not in cart anymore; create a new cart if adding an item when the current cart is closed
  • consider updating the session (eg returning the current cart id) in all calls to the backend

Company validation + multi-users per company

Context

A company can register: we must it is a company, we must be able to validate it and salesman must be notified.
A company can have several users at several levels / areas (eg: departments).
It should be possible to register a company and then attach as many users as they want to it.

Solution

Add a flag to enable/disable companies, add a unique auto-generated token to each company and allow main users to use the token to create new users attached to the company. Users will be created as company's contacts with a specific type.

TODO

1. Company validation

Module: shopinvader

WIP: #469

Odoo side

  1. add a flag to shopinvader.backend to enable the feature site wide
  2. add a flag to res.partner "shopinvader_enabled"
  3. override partner lookup in REST API to:
  • raise specific error if found but not validated
  1. override create customer endpoint to us is_company to set the partner type (new registration form flag, see below)
  2. notify users:
  • on create: account created but not validated -> not usable
  • on validation: send std welcome notification
  1. notify salesman via activity record

Locomotive side

  1. Hack sign-in of users: if the user partner is not enabled -> raise a specific error [TODO: @sebastienbeau you know where to do this]
  2. Add "is_company" flag to tell Odoo which kind of customer is this
  3. Hide/show fields based on company flag

2. Multi-user

Module: shopinvader_company_multi_user

WIP: #471

Odoo side

  1. add a flag to shopinvader.backend to enable the feature site wide
  2. add a token field (unique auto-generated) to partner binding (generated only if global flag is enabled, visible in form if valued)
  3. add a new contact type "invader_client_user" [TODO: not sure about this key @sebastienbeau ?]
  4. override customer creation: create a contact if token is given and matches existing company
  5. override partner lookup in REST API to:
  • if the feature is enabled -> search for main partner contact
  • if main partner is not found -> look for contacts w/ specific type

Locomotive side

  1. Registration form: add token field
  2. Hide/show fields based on company flag

Drawbacks

  • in multi-website environments a user enabled on 1 website is enabled on all the others.
    This could be mitigated by moving the "enabling" flag at binding level but then it would become troublesome to handle the UI and to make sure Odoo managing users are aware of the state of a given customer.

Aggregator issue: #452
@sebastienbeau @lmignon review/feedback is appreciated :)

Refactoring export

For now we use locomotive as a database and also for storing the static file (image, pdf..)
We have to change it and export everything in algolia or in a cdn. For the algolia part we will depend of https://github.com/akretion/connector-nosql and for file we will depend of https://github.com/akretion/storage
So we will need to adapt shopinvader to :

  • export image url instead of exporting image
  • remove export of product and instead export variant using algolia connector

Export Attribute / filter

  • export the attribute of odoo like a field into algolia
  • refactor filter on category in order to create a filter from an attribute or a field

Migration to version 10.0

Todo

https://github.com/OCA/maintainer-tools/wiki/Migration-to-version-10.0

Modules to migrate

  • base_url
  • connector_generic
  • connector_locomotivecms
  • partner_contact_company
  • product_media
  • product_online_category
  • product_rating
  • product_stock_state
  • product_tag
  • shopinvader
  • shopinvader_algolia
  • shopinvader_claim
  • shopinvader_google_shopping
  • shopinvader_lead
  • shopinvader_m2mcategories
  • shopinvader_mailjet
  • shopinvader_paypal
  • shopinvader_price_per_qty
  • shopinvader_product_link
  • shopinvader_product_media
  • shopinvader_product_rating
  • shopinvader_product_tag
  • shopinvader_search_engine
  • shopinvader_stripe
  • shopinvader_visible_discount

Migration version 10

Migration Shopinvader

Trello board : https://trello.com/b/oWwLLHkZ/shopinvader-code-sprint-oca-2017
Gitter chat : https://gitter.im/akretion/odoo-shopinvader

Round 1

Odoo Shopinvader

  • base_url
  • connector_generic
  • product_stock_state
  • product_multi_link

Payment Gateway https://github.com/akretion/payment-gateway

  • payment_gateway

Ak Incubator https://github.com/akretion/ak-odoo-incubator

Connector Search Engine https://github.com/akretion/connector-search-engine

  • connector_search_engine
  • connector_algolia (depend on connector_search_engine)

Storage Backend https://github.com/akretion/storage-backend

  • storage_backend
  • storage_file
  • storage_image

Round 2

Odoo Shopinvader

  • connector_locomotivecms => todo merge with shopinvader
  • shopinvader

Payment Gateway

  • payment_gateway_paypal
  • payment_gateway_stripe
  • sale_quick_payment_gateway

Round 3

Odoo Shopinvader

  • shopinvader_stripe
  • shopinvader_paypal
  • shopinvader_search_engine
  • shopinvader_algolia
  • shopinvader_visible_discount
  • shopinvader_claim
  • shopinvader_lead

Round 4

  • product_media
  • shopinvader_product_media
  • product_tag
  • shopinvader_product_tag
  • product_rating
  • shopinvader_product_rating
  • shopinvader_price_per_qty
  • shopinvader_product_link
  • product_online_category
  • shopinvader_m2mcategories
  • partner_contact_company
  • shopinvader_google_shopping

Maybe Deprecated

  • shopinvader_mailjet

Ak Incubator

  • delivery_carrier_url

Step in cart

Step in the cart should be just a data that should be used by the front in order to know which step have been fill and also in the backend to know where the customer have abandoned the cart

For now for storing the "cart" state we use a mix of sale_sub_state and cart_state. But this is not the right way to do it. We need to add a based module that just add the concept of order "typology" that can be a "cart", "requested_quotation", "order".... (this module will replace the current sale_subs_state module)

Then we will add in the module sale_cart an object to store the cart state (sale.cart.state) and we will also add a m2m on the sale order to know which step have been done (state_cart_ids).

Then in the cart service we should be able to fill the state that have been fill.

OSError: [Errno 13] Permission denied: '/var/lib/odoo/sessions'

hiii,
I am running docker odoo in my ubuntu 18 my following commands are below.
docker run -d -v /data/postgres/giriraj:/var/lib/postgresql/data -e POSTGRES_USER=odoo -e POSTGRES_PASSWORD=odoo -e POSTGRES_DB=postgres --name db postgres:10
i cloned odoo-shopinvader repository in my ubuntu machine at /docker/addons/odoo-shopinvader. and then ran

docker run -v /data/odoo/giriraj:/var/lib/odoo -v /docker/addons:/mnt/extra-addons -p 8069:8069 -d --name odoo --link db:db -t odoo:10.0
and my odoo-container logs are below

2019-03-31 07:27:52,284 1 INFO ? odoo: Odoo version 10.0-20190128

2019-03-31 07:27:52,284 1 INFO ? odoo: Using configuration file at /etc/odoo/odoo.conf

2019-03-31 07:27:52,285 1 INFO ? odoo: addons paths: [u'/mnt/extra-addons', u'/usr/lib/python2.7/dist-packages/odoo/addons']

2019-03-31 07:27:52,285 1 INFO ? odoo: database: [email protected]:5432

2019-03-31 07:27:52,308 1 INFO ? odoo.service.server: HTTP service (werkzeug) running on ce829d1adfb6:8069

2019-03-31 07:28:02,117 1 INFO ? odoo.addons.report.models.report: Will use the Wkhtmltopdf binary at /usr/local/bin/wkhtmltopdf

2019-03-31 07:28:02,583 1 INFO ? odoo.http: HTTP Configuring static files

2019-03-31 07:28:02,590 1 INFO ? werkzeug: 47.247.222.34 - - [31/Mar/2019 07:28:02] "GET / HTTP/1.1" 500 -

2019-03-31 07:28:02,599 1 ERROR ? werkzeug: Error on request:

Traceback (most recent call last):

  File "/usr/lib/python2.7/dist-packages/werkzeug/serving.py", line 177, in run_wsgi

    execute(self.server.app)

  File "/usr/lib/python2.7/dist-packages/werkzeug/serving.py", line 165, in execute

    application_iter = app(environ, start_response)

  File "/usr/lib/python2.7/dist-packages/odoo/service/server.py", line 247, in app

    return self.app(e, s)

  File "/usr/lib/python2.7/dist-packages/odoo/service/wsgi_server.py", line 186, in application

    return application_unproxied(environ, start_response)

  File "/usr/lib/python2.7/dist-packages/odoo/service/wsgi_server.py", line 172, in application_unproxied

    result = handler(environ, start_response)

  File "/usr/lib/python2.7/dist-packages/odoo/http.py", line 1326, in __call__

    return self.dispatch(environ, start_response)

  File "/usr/lib/python2.7/dist-packages/odoo/http.py", line 1300, in __call__

    return self.app(environ, start_wrapped)

  File "/usr/lib/python2.7/dist-packages/werkzeug/wsgi.py", line 588, in __call__

    return self.app(environ, start_response)

  File "/usr/lib/python2.7/dist-packages/odoo/http.py", line 1463, in dispatch

    explicit_session = self.setup_session(httprequest)

  File "/usr/lib/python2.7/dist-packages/odoo/http.py", line 1360, in setup_session

    session_gc(self.session_store)

  File "/usr/lib/python2.7/dist-packages/odoo/tools/func.py", line 23, in __get__

    value = self.fget(obj)

  File "/usr/lib/python2.7/dist-packages/odoo/http.py", line 1311, in session_store

    path = odoo.tools.config.session_dir

  File "/usr/lib/python2.7/dist-packages/odoo/tools/config.py", line 604, in session_dir

    os.makedirs(d, 0700)

  File "/usr/lib/python2.7/os.py", line 157, in makedirs

    mkdir(name, mode)

OSError: [Errno 13] Permission denied: '/var/lib/odoo/sessions'

2019-03-31 07:28:03,055 1 INFO ? werkzeug: 47.247.222.34 - - [31/Mar/2019 07:28:03] "GET /favicon.ico HTTP/1.1" 500 -

2019-03-31 07:28:03,063 1 ERROR ? werkzeug: Error on request:

Traceback (most recent call last):

  File "/usr/lib/python2.7/dist-packages/werkzeug/serving.py", line 177, in run_wsgi

    execute(self.server.app)

  File "/usr/lib/python2.7/dist-packages/werkzeug/serving.py", line 165, in execute

    application_iter = app(environ, start_response)

  File "/usr/lib/python2.7/dist-packages/odoo/service/server.py", line 247, in app

    return self.app(e, s)

  File "/usr/lib/python2.7/dist-packages/odoo/service/wsgi_server.py", line 186, in application

    return application_unproxied(environ, start_response)

  File "/usr/lib/python2.7/dist-packages/odoo/service/wsgi_server.py", line 172, in application_unproxied

    result = handler(environ, start_response)

  File "/usr/lib/python2.7/dist-packages/odoo/http.py", line 1326, in __call__

    return self.dispatch(environ, start_response)

  File "/usr/lib/python2.7/dist-packages/odoo/http.py", line 1300, in __call__

    return self.app(environ, start_wrapped)

  File "/usr/lib/python2.7/dist-packages/werkzeug/wsgi.py", line 588, in __call__

    return self.app(environ, start_response)

  File "/usr/lib/python2.7/dist-packages/odoo/http.py", line 1463, in dispatch

    explicit_session = self.setup_session(httprequest)

  File "/usr/lib/python2.7/dist-packages/odoo/http.py", line 1360, in setup_session

    session_gc(self.session_store)

  File "/usr/lib/python2.7/dist-packages/odoo/tools/func.py", line 23, in __get__

    value = self.fget(obj)

  File "/usr/lib/python2.7/dist-packages/odoo/http.py", line 1311, in session_store

    path = odoo.tools.config.session_dir

  File "/usr/lib/python2.7/dist-packages/odoo/tools/config.py", line 604, in session_dir

    os.makedirs(d, 0700)

  File "/usr/lib/python2.7/os.py", line 157, in makedirs

    mkdir(name, mode)

OSError: [Errno 13] Permission denied: '/var/lib/odoo/sessions'


Misc improvements (aggregator)

Aggregator of all the features we discussed at OCA days. I'll create one issue with the specs we wrote together per each of the following items:

  • Company validation #454
  • Multiple users per same partner / company #454
  • Protect "add to cart" from non-bound records #455
  • Sale wishlist #457
  • Filter products by role / group [ref issue TODO]
  • Filter products by customer / user #709
  • Products' visibility [ref issue TODO]

[IMP] shopinvader_session auto-update

Context
Into the main Controller (controllers.main:InvaderController), we have a function named _get_shopinvader_session_from_headers(...) who is used to load some parameters from headers into the current shopinvader_session.
If a sub-module want to add another value into the shopinvader_session, we have to inherit this function and add customs keys.

My question
As we always/most of the time have to load header's keys who start with "HTTP_SESS_", it is possible to load every headers keys who start with this "HTTP_SESS_".
So if one day the locomotive part (for example) is updated and session values doesn't start anymore by "HTTP_SESS_", we have to update every modules to match with the new key.
If we have this automatic load, we can just update the basic shopinvader module and we don't have to inherit this function (_get_shopinvader_session_from_headers(...)) into each modules.

Related questions

  • Is it safe to do it (code injection etc)?
  • Is it safe to load every session values (even if not needed)?
  • Others consequences that I forget?

Product URL

The module product_url is useless and most of the code have been duplicated in shopinvader. (url must depend of a backend, and so must be store on the binding)
Not sure we can share a lot a code with other project, so maybe the best is to remove it

Extract the used of odoo image

After think twice using odoo image is not that simple (image are not public by default, there is not image on categ)
For having a basic dev/demo behaviour I think I will simply create a module that have this 2 features

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    ๐Ÿ–– Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. ๐Ÿ“Š๐Ÿ“ˆ๐ŸŽ‰

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google โค๏ธ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.