summaryrefslogtreecommitdiff
path: root/addons/website_sale_wishlist/models
diff options
context:
space:
mode:
Diffstat (limited to 'addons/website_sale_wishlist/models')
-rw-r--r--addons/website_sale_wishlist/models/__init__.py3
-rw-r--r--addons/website_sale_wishlist/models/product_wishlist.py92
-rw-r--r--addons/website_sale_wishlist/models/res_users.py13
3 files changed, 108 insertions, 0 deletions
diff --git a/addons/website_sale_wishlist/models/__init__.py b/addons/website_sale_wishlist/models/__init__.py
new file mode 100644
index 00000000..474c0ade
--- /dev/null
+++ b/addons/website_sale_wishlist/models/__init__.py
@@ -0,0 +1,3 @@
+# -*- coding: utf-8 -*-
+from . import product_wishlist
+from . import res_users
diff --git a/addons/website_sale_wishlist/models/product_wishlist.py b/addons/website_sale_wishlist/models/product_wishlist.py
new file mode 100644
index 00000000..8c34a703
--- /dev/null
+++ b/addons/website_sale_wishlist/models/product_wishlist.py
@@ -0,0 +1,92 @@
+# -*- coding: utf-8 -*-
+from datetime import datetime, timedelta
+from odoo import api, fields, models
+from odoo.http import request
+
+
+class ProductWishlist(models.Model):
+ _name = 'product.wishlist'
+ _description = 'Product Wishlist'
+ _sql_constraints = [
+ ("product_unique_partner_id",
+ "UNIQUE(product_id, partner_id)",
+ "Duplicated wishlisted product for this partner."),
+ ]
+
+ partner_id = fields.Many2one('res.partner', string='Owner')
+ product_id = fields.Many2one('product.product', string='Product', required=True)
+ currency_id = fields.Many2one('res.currency', related='pricelist_id.currency_id', readonly=True)
+ pricelist_id = fields.Many2one('product.pricelist', string='Pricelist', help='Pricelist when added')
+ price = fields.Monetary(currency_field='currency_id', string='Price', help='Price of the product when it has been added in the wishlist')
+ website_id = fields.Many2one('website', ondelete='cascade', required=True)
+ active = fields.Boolean(default=True, required=True)
+
+ @api.model
+ def current(self):
+ """Get all wishlist items that belong to current user or session,
+ filter products that are unpublished."""
+ if not request:
+ return self
+
+ if request.website.is_public_user():
+ wish = self.sudo().search([('id', 'in', request.session.get('wishlist_ids', []))])
+ else:
+ wish = self.search([("partner_id", "=", self.env.user.partner_id.id), ('website_id', '=', request.website.id)])
+
+ return wish.filtered(lambda x: x.sudo().product_id.product_tmpl_id.website_published and x.sudo().product_id.product_tmpl_id.sale_ok)
+
+ @api.model
+ def _add_to_wishlist(self, pricelist_id, currency_id, website_id, price, product_id, partner_id=False):
+ wish = self.env['product.wishlist'].create({
+ 'partner_id': partner_id,
+ 'product_id': product_id,
+ 'currency_id': currency_id,
+ 'pricelist_id': pricelist_id,
+ 'price': price,
+ 'website_id': website_id,
+ })
+ return wish
+
+ @api.model
+ def _check_wishlist_from_session(self):
+ """Assign all wishlist withtout partner from this the current session"""
+ session_wishes = self.sudo().search([('id', 'in', request.session.get('wishlist_ids', []))])
+ partner_wishes = self.sudo().search([("partner_id", "=", self.env.user.partner_id.id)])
+ partner_products = partner_wishes.mapped("product_id")
+ # Remove session products already present for the user
+ duplicated_wishes = session_wishes.filtered(lambda wish: wish.product_id <= partner_products)
+ session_wishes -= duplicated_wishes
+ duplicated_wishes.unlink()
+ # Assign the rest to the user
+ session_wishes.write({"partner_id": self.env.user.partner_id.id})
+ request.session.pop('wishlist_ids')
+
+ @api.autovacuum
+ def _gc_sessions(self, *args, **kwargs):
+ """Remove wishlists for unexisting sessions."""
+ self.with_context(active_test=False).search([
+ ("create_date", "<", fields.Datetime.to_string(datetime.now() - timedelta(weeks=kwargs.get('wishlist_week', 5)))),
+ ("partner_id", "=", False),
+ ]).unlink()
+
+
+class ResPartner(models.Model):
+ _inherit = 'res.partner'
+
+ wishlist_ids = fields.One2many('product.wishlist', 'partner_id', string='Wishlist', domain=[('active', '=', True)])
+
+
+class ProductTemplate(models.Model):
+ _inherit = 'product.template'
+
+ def _is_in_wishlist(self):
+ self.ensure_one()
+ return self in self.env['product.wishlist'].current().mapped('product_id.product_tmpl_id')
+
+
+class ProductProduct(models.Model):
+ _inherit = 'product.product'
+
+ def _is_in_wishlist(self):
+ self.ensure_one()
+ return self in self.env['product.wishlist'].current().mapped('product_id')
diff --git a/addons/website_sale_wishlist/models/res_users.py b/addons/website_sale_wishlist/models/res_users.py
new file mode 100644
index 00000000..d1887d17
--- /dev/null
+++ b/addons/website_sale_wishlist/models/res_users.py
@@ -0,0 +1,13 @@
+from odoo import api, fields, models
+from odoo.http import request
+
+
+class ResUsers(models.Model):
+ _inherit = "res.users"
+
+ def _check_credentials(self, password, env):
+ """Make all wishlists from session belong to its owner user."""
+ result = super(ResUsers, self)._check_credentials(password, env)
+ if request and request.session.get('wishlist_ids'):
+ self.env["product.wishlist"]._check_wishlist_from_session()
+ return result