1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586 |
- # -*- coding: utf-8 -*-
- # Part of Odoo. See LICENSE file for full copyright and licensing details.
- from base64 import b64decode
- import json
- import logging
- import os
- import subprocess
- import time
- from odoo import http, tools
- from odoo.modules.module import get_resource_path
- from odoo.addons.hw_drivers.event_manager import event_manager
- from odoo.addons.hw_drivers.main import iot_devices, manager
- from odoo.addons.hw_drivers.tools import helpers
- _logger = logging.getLogger(__name__)
- class DriverController(http.Controller):
- @http.route('/hw_drivers/action', type='json', auth='none', cors='*', csrf=False, save_session=False)
- def action(self, session_id, device_identifier, data):
- """
- This route is called when we want to make a action with device (take picture, printing,...)
- We specify in data from which session_id that action is called
- And call the action of specific device
- """
- iot_device = iot_devices.get(device_identifier)
- if iot_device:
- iot_device.data['owner'] = session_id
- data = json.loads(data)
- # Skip the request if it was already executed (duplicated action calls)
- iot_idempotent_id = data.get("iot_idempotent_id")
- if iot_idempotent_id:
- idempotent_session = iot_device._check_idempotency(iot_idempotent_id, session_id)
- if idempotent_session:
- _logger.info("Ignored request from %s as iot_idempotent_id %s already received from session %s",
- session_id, iot_idempotent_id, idempotent_session)
- return False
- iot_device.action(data)
- return True
- return False
- @http.route('/hw_drivers/check_certificate', type='http', auth='none', cors='*', csrf=False, save_session=False)
- def check_certificate(self):
- """
- This route is called when we want to check if certificate is up-to-date
- Used in cron.daily
- """
- helpers.get_certificate_status()
- @http.route('/hw_drivers/event', type='json', auth='none', cors='*', csrf=False, save_session=False)
- def event(self, listener):
- """
- listener is a dict in witch there are a sessions_id and a dict of device_identifier to listen
- """
- req = event_manager.add_request(listener)
- # Search for previous events and remove events older than 5 seconds
- oldest_time = time.time() - 5
- for event in list(event_manager.events):
- if event['time'] < oldest_time:
- del event_manager.events[0]
- continue
- if event['device_identifier'] in listener['devices'] and event['time'] > listener['last_event']:
- event['session_id'] = req['session_id']
- return event
- # Wait for new event
- if req['event'].wait(50):
- req['event'].clear()
- req['result']['session_id'] = req['session_id']
- return req['result']
- @http.route('/hw_drivers/download_logs', type='http', auth='none', cors='*', csrf=False, save_session=False)
- def download_logs(self):
- """
- Downloads the log file
- """
- if tools.config['logfile']:
- res = http.send_file(tools.config['logfile'], mimetype="text/plain", as_attachment=True)
- res.headers['Cache-Control'] = 'no-cache'
- return res
|