controllers.py 2.7 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485
  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(
  18. "restricted_page: slug=%s | user=%s (%s)",
  19. slug,
  20. request.env.user.login,
  21. request.env.user.id,
  22. )
  23. page = (
  24. request.env["website.page"]
  25. .sudo()
  26. .search([("url", "=", "/restricted-content/%s" % slug)], limit=1)
  27. )
  28. if not page:
  29. return request.not_found()
  30. # Load the product_page_access mapping for this page
  31. mapping = (
  32. request.env["product_page_access.page_product_mapping"]
  33. .sudo()
  34. .search([("page", "=", page.id)], limit=1)
  35. )
  36. if not mapping:
  37. # no allowlist defined → redirect to shop
  38. _logger.debug(
  39. "restricted_page: no mapping for page_id=%s, redirecting", page.id
  40. )
  41. return request.redirect("/")
  42. _logger.debug("restricted_page: allowed_product=%s", mapping.products.ids)
  43. if not mapping.products:
  44. # empty list → redirect
  45. _logger.debug(
  46. "restricted_page: empty product for page_id=%s, redirecting", page.id
  47. )
  48. return request.redirect("/")
  49. # Check if the user ever bought at least one of them
  50. user = request.env.user
  51. has_access = (
  52. request.env["sale.order.line"]
  53. .sudo()
  54. .search_count(
  55. [
  56. ("order_id.partner_id", "child_of", user.partner_id.id),
  57. ("order_id.state", "in", ("sale", "done")),
  58. '|',
  59. ("product_id", "in", mapping.products.ids),
  60. ("product_id", "=", mapping.link_out_product.id)
  61. ],
  62. limit=1,
  63. )
  64. )
  65. _logger.debug("restricted_page: user_id=%s has_access=%s", user.id, has_access)
  66. if not has_access:
  67. # Redirect to the shop so the user can buy
  68. _logger.debug(
  69. "restricted_page: user_id=%s has_access=%s", user.id, has_access
  70. )
  71. return request.redirect(mapping.link_out_product.website_url)
  72. # 5. Everything fine – render the page
  73. _logger.debug("restricted_page: rendering page.key=%s", page.key)
  74. return request.render(page.key, {})