Coverage for ingadhoc-odoo-saas-adhoc / saas_provider_upgrade / controllers / appointment.py: 23%

50 statements  

« prev     ^ index     » next       coverage.py v7.13.4, created at 2026-03-09 18:15 +0000

1import math 

2from datetime import datetime 

3from typing import TYPE_CHECKING 

4 

5from odoo import http 

6from odoo.addons.appointment.controllers.appointment import AppointmentController 

7from odoo.http import request 

8from odoo.tools import str2bool 

9 

10if TYPE_CHECKING: 

11 from ..models.appointment_type import AppointmentType 

12 from ..models.helpdesk_ticket import HelpdeskTicket 

13 

14 

15class AppointmentControllerUpgrade(AppointmentController): 

16 @http.route() 

17 def appointment_form_submit( 

18 self, 

19 appointment_type_id, 

20 datetime_str, 

21 duration_str, 

22 name, 

23 email, 

24 staff_user_id=None, 

25 available_resource_ids=None, 

26 asked_capacity=1, 

27 guest_emails_str=None, 

28 **kwargs, 

29 ): 

30 """ 

31 Inherit this method to add the upgrade ticket to the context before creating the event. 

32 """ 

33 # Verificar si el enlace ha caducado 

34 expiration_date = kwargs.get("expiration_date") 

35 if expiration_date: 

36 expiration_date = datetime.fromisoformat(expiration_date) 

37 if datetime.now() > expiration_date: 

38 return request.render("saas_provider_upgrade.link_expired_template") 

39 

40 # Agregar el ticket_id al contexto si está presente 

41 new_context = dict(request.env.context) 

42 if kwargs.get("ticket_id"): 

43 ticket_id = int(kwargs.get("ticket_id")) 

44 new_context.update({"upgrade_ticket_id": ticket_id}) 

45 new_context.update({"confirm_now": str2bool(kwargs.get("confirm_now", False))}) 

46 request.env = request.env(context=new_context) 

47 ticket: HelpdeskTicket = request.env["helpdesk.ticket"].sudo().browse(ticket_id) 

48 duration = ticket._get_estimated_production_upgrade_duration() 

49 duration_str = f"{duration:.2f}" 

50 

51 # Continuar con la lógica normal del formulario 

52 return super().appointment_form_submit( 

53 appointment_type_id, 

54 datetime_str, 

55 duration_str, 

56 name, 

57 email, 

58 staff_user_id, 

59 available_resource_ids, 

60 asked_capacity, 

61 guest_emails_str, 

62 **kwargs, 

63 ) 

64 

65 @http.route() 

66 def appointment_type_id_form( 

67 self, 

68 appointment_type_id, 

69 date_time, 

70 duration, 

71 staff_user_id=None, 

72 resource_selected_id=None, 

73 available_resource_ids=None, 

74 asked_capacity=1, 

75 **kwargs, 

76 ): 

77 """ 

78 Inherit this method to add the upgrade ticket to the context before creating the event. 

79 This method is used to render "appointment_form" template. 

80 """ 

81 res = super().appointment_type_id_form( 

82 appointment_type_id, 

83 date_time, 

84 duration, 

85 staff_user_id=staff_user_id, 

86 resource_selected_id=resource_selected_id, 

87 available_resource_ids=available_resource_ids, 

88 asked_capacity=asked_capacity, 

89 **kwargs, 

90 ) 

91 if not hasattr(res, "qcontext"): 

92 return res 

93 

94 ticket_id = kwargs.get("ticket_id") 

95 if not ticket_id: 

96 return res 

97 

98 ticket_id = int(ticket_id) 

99 ticket: HelpdeskTicket = request.env["helpdesk.ticket"].sudo().browse(ticket_id) 

100 total_time = ticket._get_estimated_production_upgrade_duration() 

101 res.qcontext["duration"] = total_time 

102 res.qcontext["duration_str"] = f"{total_time:.2f}" 

103 return res 

104 

105 def _prepare_appointment_type_page_values(self, appointment_type: "AppointmentType", *args, **kwargs): 

106 """ 

107 Inherit to set duration based on ticket's last test request line total time if ticket_id is provided. 

108 This method is used to render "appointment_info" template. 

109 """ 

110 page_values = super()._prepare_appointment_type_page_values(appointment_type, *args, **kwargs) 

111 if ticket_id := int(kwargs.get("ticket_id", 0)): 

112 ticket: HelpdeskTicket = request.env["helpdesk.ticket"].sudo().browse(ticket_id) 

113 duration = ticket._get_estimated_production_upgrade_duration() 

114 else: 

115 duration = math.ceil(appointment_type.appointment_duration) 

116 page_values["duration"] = duration 

117 return page_values 

118 

119 def _appointment_website_domain(self): 

120 """ 

121 Override to exclude appointment types meant for upgrade creation from general listing. 

122 """ 

123 domain = super()._appointment_website_domain() 

124 return domain + [("upgrade_create", "=", False)]