diff options
| author | stephanchrst <stephanchrst@gmail.com> | 2022-05-10 21:51:50 +0700 |
|---|---|---|
| committer | stephanchrst <stephanchrst@gmail.com> | 2022-05-10 21:51:50 +0700 |
| commit | 3751379f1e9a4c215fb6eb898b4ccc67659b9ace (patch) | |
| tree | a44932296ef4a9b71d5f010906253d8c53727726 /addons/website_sale_wishlist/models | |
| parent | 0a15094050bfde69a06d6eff798e9a8ddf2b8c21 (diff) | |
initial commit 2
Diffstat (limited to 'addons/website_sale_wishlist/models')
| -rw-r--r-- | addons/website_sale_wishlist/models/__init__.py | 3 | ||||
| -rw-r--r-- | addons/website_sale_wishlist/models/product_wishlist.py | 92 | ||||
| -rw-r--r-- | addons/website_sale_wishlist/models/res_users.py | 13 |
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 |
