Coverage for ingadhoc-odoo-saas-adhoc / saas_provider_upgrade / controllers / portal.py: 18%
94 statements
« prev ^ index » next coverage.py v7.13.4, created at 2026-03-09 18:15 +0000
« prev ^ index » next coverage.py v7.13.4, created at 2026-03-09 18:15 +0000
1import logging
3from markupsafe import Markup
4from odoo import _, http
5from odoo.addons.portal.controllers import portal
6from odoo.exceptions import AccessError, MissingError
7from odoo.http import request
9_logger = logging.getLogger(__name__)
12class CustomerPortal(portal.CustomerPortal):
13 def _prepare_helpdesk_tickets_domain(self):
14 """
15 Método utilizado por '_prepare_my_tickets_values' para setear el dominio sobre 'helpdesk.ticket'
16 """
17 upgrade_ticket = request.env.context.get("upgrade_ticket")
18 upgrade_ticket_id = request.env.context.get("upgrade_ticket_id")
19 all_tickets = request.env.context.get("all_tickets")
20 super_domain = super()._prepare_helpdesk_tickets_domain()
22 # Caso '/my/upgrade_ticket/<int:ticket_id>'
23 if upgrade_ticket:
24 if all_tickets:
25 return super_domain + [
26 ("upgrade_team", "=", True),
27 ("ticket_upgrade_status", "=", "upgraded"),
28 ]
29 return super_domain + [
30 ("upgrade_team", "=", True),
31 ]
33 # Caso '/my/tickets'
34 if upgrade_ticket_id:
35 return super_domain + [("parent_id", "=", int(upgrade_ticket_id))]
37 # Caso Default
38 return super_domain + ["|", ("team_id", "=", False), ("upgrade_team", "=", False)]
40 @http.route(["/my/upgrade_ticket/"], type="http", auth="user", website=True)
41 def upgrade_landing_page(
42 self,
43 page=1,
44 date_begin=None,
45 date_end=None,
46 sortby=None,
47 filterby="all",
48 search=None,
49 groupby="none",
50 search_in="content",
51 **kw,
52 ):
53 request.update_context(upgrade_ticket=True)
54 all_tickets = request.params.get("all_tickets")
55 request.update_context(all_tickets=all_tickets or False)
57 values = self._prepare_my_tickets_values(
58 page, date_begin, date_end, sortby, filterby, search, groupby, search_in
59 )
61 if all_tickets:
62 # "See previous updates" view - show all upgraded tickets
63 return request.render("helpdesk.portal_helpdesk_ticket", values)
65 # Main view - show ticket in progress or view with buttons
66 ticket = False
67 if values["grouped_tickets"]:
68 all_tickets_list = [t for group in values["grouped_tickets"] for t in group]
69 in_progress_tickets = [t for t in all_tickets_list if t.stage_id.show_in_upgrade_portal]
70 ticket = max(in_progress_tickets, key=lambda t: t.id) if in_progress_tickets else False
72 if ticket and not request.env.user.has_group("base.group_user"):
73 return request.redirect("/my/upgrade_ticket/%s" % (ticket.id))
75 partner = request.env.user.partner_id
76 portal_info = request.env["helpdesk.ticket"].get_portal_upgrade_info(partner)
78 values.update(
79 {
80 "grouped_tickets": [],
81 "no_current_upgrade_ticket": True,
82 "show_beta_tester": portal_info["show_beta_tester"],
83 "show_beta_tester_message": portal_info["show_beta_tester_message"],
84 "next_upgrade_version": portal_info["next_upgrade_version"],
85 "is_last_upgrade_ticket_available": portal_info["is_on_stable_version"],
86 }
87 )
89 return request.render("saas_provider_upgrade.portal_helpdesk_ticket_inherit_no_tickets", values)
91 @http.route(["/my/upgrade_ticket/<int:ticket_id>"], type="http", auth="user", website=True)
92 def portal_upgrade_ticket(self, ticket_id=None, access_token=None, **kw):
93 try:
94 self._document_check_access("helpdesk.ticket", ticket_id, access_token)
95 return request.render(
96 "saas_provider_upgrade.upgrade_ticket_template", {"ticket_id": ticket_id, "access_token": access_token}
97 )
98 except (AccessError, MissingError):
99 return request.redirect("/my")
101 @http.route()
102 def my_helpdesk_tickets(
103 self,
104 page=1,
105 date_begin=None,
106 date_end=None,
107 sortby=None,
108 filterby="all",
109 search=None,
110 groupby="none",
111 search_in="name",
112 **kw,
113 ):
114 upgrade_ticket_id = kw.get("upgrade_ticket_id")
115 if upgrade_ticket_id:
116 request.update_context(upgrade_ticket_id=upgrade_ticket_id)
117 filterby = "open"
118 return super().my_helpdesk_tickets(page, date_begin, date_end, sortby, filterby, search, groupby, search_in)
120 def _get_portal_default_domain(self):
121 return super()._get_portal_default_domain() + [("appointment_type_id.upgrade_create", "=", False)]
123 def _create_upgrade_request(self, upgrade_type, partner, notify_message, success_message, existing_ticket_message):
124 """
125 Helper method to create upgrade ticket and send notifications.
127 :param upgrade_type: Upgrade type recordset for the new ticket
128 :param partner: Partner recordset requesting the upgrade
129 :param notify_message: Message template to notify assigned user (supports {database_name}, {upgrade_name})
130 :param success_message: Message to show user when ticket is created successfully
131 :param existing_ticket_message: Message to show user when ticket already exists
132 :return: Rendered template with success or existing ticket message
133 """
134 existing_active_ticket = (
135 request.env["helpdesk.ticket"]
136 .sudo()
137 .search(
138 [
139 ("partner_id", "=", partner.id),
140 ("upgrade_team", "=", True),
141 ("upgrade_type_id", "=", upgrade_type.id),
142 ("ticket_upgrade_status", "=", "no_upgraded"),
143 ],
144 limit=1,
145 )
146 )
147 if existing_active_ticket:
148 if existing_active_ticket.user_id:
149 database_name = partner.name
150 existing_active_ticket.message_post(
151 body=notify_message.format(database_name=database_name, upgrade_name=upgrade_type.name),
152 partner_ids=[existing_active_ticket.user_id.partner_id.id],
153 )
154 return request.render(
155 "saas_provider_upgrade.portal_upgrade_request_sent",
156 {"message": existing_ticket_message},
157 )
159 main_database = (
160 request.env["saas.database"]
161 .sudo()
162 .search(
163 [
164 ("analytic_account_id.partner_id", "=", partner.commercial_partner_id.id),
165 ("is_production", "=", True),
166 ("state", "=", "active"),
167 ],
168 limit=1,
169 order="id desc",
170 )
171 )
172 wizard = (
173 request.env["adhoc.module.ready_to_upgrade.wizard"]
174 .sudo()
175 .with_context(active_ids=main_database.ids, return_recordset=True)
176 .create(
177 {
178 "upgrade_type_id": upgrade_type.id,
179 }
180 )
181 )
182 new_ticket = wizard.create_upgrades()
183 if new_ticket:
184 channel_id = request.env["ir.config_parameter"].sudo().get_param("saas_provider_upgrade.discuss_channel_id")
185 if channel_id:
186 channel = request.env["discuss.channel"].sudo().browse(int(channel_id))
187 database_name = partner.name
188 ticket_link = new_ticket._get_html_link(title="Ticket")
189 project_name = new_ticket.project_id.name or "-"
190 message = (
191 f"El cliente {database_name} solicitó actualizar a {upgrade_type.name} "
192 f"(Proyecto: {project_name}).\n"
193 f"Ver: {ticket_link}\n"
194 f" y por favor contactarse."
195 )
196 channel.message_post(
197 body=Markup(message),
198 message_type="comment",
199 subtype_id=request.env.ref("mail.mt_comment").id,
200 )
202 return request.render(
203 "saas_provider_upgrade.portal_upgrade_request_sent",
204 {"message": success_message},
205 )
207 @http.route("/my/request_beta_tester", type="http", auth="user", website=True)
208 def request_beta_tester(self, **kw):
209 partner = request.env.user.partner_id
210 portal_info = request.env["helpdesk.ticket"].get_portal_upgrade_info(partner)
211 next_upgrade_type = portal_info["next_upgrade_type"]
212 next_version = portal_info["next_upgrade_version"]
214 return self._create_upgrade_request(
215 upgrade_type=next_upgrade_type,
216 partner=partner,
217 notify_message=_(
218 "El cliente {database_name} solicitó ser beta tester para {upgrade_name}. Por favor contactarse"
219 ),
220 success_message=_(
221 "¡Excelente! Vas a ser una de las primeras personas en probar la versión %s. "
222 "Nos comunicamos cuando estemos listos para entregarte una base de pruebas."
223 )
224 % next_version,
225 existing_ticket_message=_(
226 "Ya existe una solicitud de actualización beta tester activa. "
227 "Nos pondremos en contacto lo más pronto posible para empezar."
228 ),
229 )
231 @http.route("/my/request_upgrade", type="http", auth="user", website=True)
232 def request_upgrade(self, **kw):
233 partner = request.env.user.partner_id
234 portal_info = request.env["helpdesk.ticket"].get_portal_upgrade_info(partner)
235 latest_upgrade_type = portal_info["stable_upgrade_type"]
237 # Special check: ticket with is_last_upgrade_ticket_available for notification purposes
238 existing_ticket_with_available = (
239 request.env["helpdesk.ticket"]
240 .sudo()
241 .search(
242 [
243 ("partner_id", "=", partner.id),
244 ("upgrade_team", "=", True),
245 ("ticket_upgrade_status", "=", "no_upgraded"),
246 ("is_last_upgrade_ticket_available", "=", True),
247 ],
248 limit=1,
249 )
250 )
252 if existing_ticket_with_available:
253 database_name = partner.name
254 if existing_ticket_with_available.user_id:
255 existing_ticket_with_available.message_post(
256 body=f"El cliente {database_name} solicitó una actualización para {latest_upgrade_type.name}. Por favor contactarse",
257 partner_ids=[existing_ticket_with_available.user_id.partner_id.id],
258 )
259 return request.render(
260 "saas_provider_upgrade.portal_upgrade_request_sent",
261 {
262 "message": _(
263 "Ya existe una solicitud de actualización activa. Nos pondremos en contacto enseguida para empezar."
264 )
265 },
266 )
268 return self._create_upgrade_request(
269 upgrade_type=latest_upgrade_type,
270 partner=partner,
271 notify_message=_(
272 "El cliente {database_name} solicitó una actualización para {upgrade_name}. Por favor contactarse"
273 ),
274 success_message=_("Tu solicitud de %s fue enviada. Nos comunicamos por correo en breve para empezar.")
275 % latest_upgrade_type.name,
276 existing_ticket_message=_(
277 "Ya existe una solicitud de actualización activa. Nos pondremos en contacto enseguida para empezar."
278 ),
279 )