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 20:33 +0000

1import logging 

2 

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 

8 

9_logger = logging.getLogger(__name__) 

10 

11 

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() 

21 

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 ] 

32 

33 # Caso '/my/tickets' 

34 if upgrade_ticket_id: 

35 return super_domain + [("parent_id", "=", int(upgrade_ticket_id))] 

36 

37 # Caso Default 

38 return super_domain + ["|", ("team_id", "=", False), ("upgrade_team", "=", False)] 

39 

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) 

56 

57 values = self._prepare_my_tickets_values( 

58 page, date_begin, date_end, sortby, filterby, search, groupby, search_in 

59 ) 

60 

61 if all_tickets: 

62 # "See previous updates" view - show all upgraded tickets 

63 return request.render("helpdesk.portal_helpdesk_ticket", values) 

64 

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 

71 

72 if ticket and not request.env.user.has_group("base.group_user"): 

73 return request.redirect("/my/upgrade_ticket/%s" % (ticket.id)) 

74 

75 partner = request.env.user.partner_id 

76 portal_info = request.env["helpdesk.ticket"].get_portal_upgrade_info(partner) 

77 

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 ) 

88 

89 return request.render("saas_provider_upgrade.portal_helpdesk_ticket_inherit_no_tickets", values) 

90 

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") 

100 

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) 

119 

120 def _get_portal_default_domain(self): 

121 return super()._get_portal_default_domain() + [("appointment_type_id.upgrade_create", "=", False)] 

122 

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. 

126 

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 ) 

158 

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 ) 

201 

202 return request.render( 

203 "saas_provider_upgrade.portal_upgrade_request_sent", 

204 {"message": success_message}, 

205 ) 

206 

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"] 

213 

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 ) 

230 

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"] 

236 

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 ) 

251 

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 ) 

267 

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 )