# -*- coding: utf-8 -*-
# Copyright © Cloud Linux GmbH & Cloud Linux Software, Inc 2010-2021 All Rights Reserved
#
# Licensed under CLOUD LINUX LICENSE AGREEMENT
# http://cloudlinux.com/docs/LICENSE.TXT
import json
import logging
import dataclasses
from typing import Any, Optional
from xray.apiclient import get_client
from .models.analytics_data import AnalyticsData
def report_analytics(data: str, advice_id: int, source: str, event: Optional[str] = None) -> Any:
"""
Receives analytics data as a JSON string
"""
if data is None:
return
logger = logging.getLogger('analytics')
data = _parse(data, logger)
if data is not None:
if source == 'WORDPRESS_PLUGIN':
data['source'] = 'wp_smartadvice'
data['advice_id'] = advice_id
if event is not None:
data['event'] = event
validated_data = _validate(data, logger)
if validated_data is not None and validated_data is not None:
api_client_object = get_client('adviser')
client = api_client_object()
return client.report(validated_data)
def _parse(data: str, logger: logging.Logger) -> Optional[dict]:
"""
Trying to parse receiving JSON
"""
try:
v = json.loads(data)
except ValueError as e:
logger.error('[Analytics] Decoding analytics JSON has failed',
extra={'err': str(e)})
else:
return v
def _validate(data: dict, logger: logging.Logger) -> Optional[dict]:
"""
validate data.
"""
try:
validated_data = AnalyticsData(**data)
except TypeError as e:
logger.error('[Analytics] Not supported field detected',
extra={'err': str(e)})
else:
return dataclasses.asdict(validated_data) |