import logging from datetime import datetime from odoo import models, fields, api try: import requests except ImportError: requests = None _logger = logging.getLogger(__name__) HTTP_CHECK_TIMEOUT = 10 # seconds class ServiceInstance(models.Model): _inherit = 'service.instance' last_http_status_code = fields.Integer( string="Last HTTP Status Code", readonly=True, default=0, ) last_http_check_date = fields.Datetime( string="Last HTTP Check Date", readonly=True, ) http_status_ok = fields.Boolean( string="HTTP Status OK", readonly=True, default=True, ) def check_http_status(self): for rec in self: if not rec.service_url or not rec.equipment_id: continue equipment = rec.equipment_id if getattr(equipment, 'maintenance_mode', False): continue status_ok = False status_code = -1 now = fields.Datetime.now() url = rec.service_url if not url.lower().startswith("https://"): url = "https://" + url.lstrip("http://") try: response = requests.get(url, timeout=HTTP_CHECK_TIMEOUT) status_code = response.status_code status_ok = (status_code == 200) except requests.exceptions.RequestException as e: _logger.warning(f"HTTP check failed for %s: %s", rec.service_url, e) rec.write({ 'last_http_status_code': status_code, 'last_http_check_date': now, 'http_status_ok': status_ok, }) if not status_ok: # Delegate maintenance.request creation to equipment if hasattr(equipment, 'create_http_maintenance_request'): equipment.create_http_maintenance_request([rec]) @api.model def cron_check_http_services(self): domain = [('active', '=', True), ('service_url', '!=', False), ('equipment_id', '!=', False)] services = self.search(domain) for service in services: equipment = service.equipment_id if getattr(equipment, 'maintenance_mode', False): continue service.check_http_status()