controllers.py 2.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263
  1. # -*- coding: utf-8 -*-
  2. import logging
  3. from odoo import exceptions, http, models
  4. from odoo.http import request
  5. _logger = logging.getLogger(__name__)
  6. class RestrictedPageController(http.Controller):
  7. @http.route(
  8. '/restricted-content/<string:slug>',
  9. type='http',
  10. auth='user',
  11. website=True,
  12. sitemap=False,
  13. priority=99
  14. )
  15. def restricted_page(self, slug, **kw):
  16. # Find the website.page that matches the slug
  17. _logger.debug("restricted_page: slug=%s | user=%s (%s)",
  18. slug, request.env.user.login, request.env.user.id)
  19. page = request.env['website.page'].sudo().search([
  20. ('url', '=', '/restricted-content/%s' % slug)
  21. ], limit=1)
  22. if not page:
  23. return request.not_found()
  24. # Load the product_page_access mapping for this page
  25. mapping = request.env['product_page_access.page_product_mapping'].sudo().search([
  26. ('page', '=', page.id)
  27. ], limit=1)
  28. if not mapping:
  29. # no allowlist defined → redirect to shop
  30. _logger.debug("restricted_page: no mapping for page_id=%s, redirecting", page.id)
  31. return request.redirect('/')
  32. _logger.debug("restricted_page: allowed_product=%s", mapping.products.ids)
  33. if not mapping.products:
  34. # empty list → redirect
  35. _logger.debug("restricted_page: empty product for page_id=%s, redirecting",
  36. page.id)
  37. return request.redirect('/')
  38. # Check if the user ever bought at least one of them
  39. user = request.env.user
  40. has_access = request.env['sale.order.line'].sudo().search_count([
  41. ('order_id.partner_id', 'child_of', user.partner_id.id),
  42. ('order_id.state', 'in', ('sale', 'done')),
  43. ('product_id', 'in', mapping.products.ids),
  44. ], limit=1)
  45. _logger.debug("restricted_page: user_id=%s has_access=%s", user.id, has_access)
  46. if not has_access:
  47. # Redirect to the shop so the user can buy
  48. _logger.debug("restricted_page: user_id=%s has_access=%s", user.id, has_access)
  49. return request.redirect(mapping.link_out_product.website_url)
  50. # 5. Everything fine – render the page
  51. _logger.debug("restricted_page: rendering page.key=%s", page.key)
  52. return request.render(page.key, {})