Completed
Push — master ( 67628d...df2d16 )
by Fox
01:28
created

Read.is_ceil_reached()   A

Complexity

Conditions 2

Size

Total Lines 15

Duplication

Lines 0
Ratio 0 %

Importance

Changes 1
Bugs 0 Features 0
Metric Value
cc 2
c 1
b 0
f 0
dl 0
loc 15
rs 9.4285
1
# coding: utf-8
2
from __future__ import unicode_literals
3
from __future__ import absolute_import
4
5
import arrow
6
# django
7
from django.utils.log import getLogger
8
from django.conf import settings
9
from django.utils.timezone import now
10
11
# trigger happy
12
from django_th.services import default_provider
13
from django_th.models import TriggerService
14
from django_th.tools import warn_user_and_admin
15
16
logger = getLogger('django_th.trigger_happy')
17
18
19
class Read(object):
20
    """
21
        Extracting the data from any service
22
    """
23
    def provider(self, service_provider, **kwargs):
24
        """
25
            get the data of the provider service
26
            :param service_provider:
27
            :param kwargs:
28
            :return:
29
        """
30
        getattr(service_provider, '__init__')(kwargs.get('token'))
31
        return getattr(service_provider, 'read_data')(**kwargs)
32
33
    def is_ceil_reached(self, service):
34
        """
35
            check if the ceil of nb of tries is reached
36
        :param service:
37
        :return:
38
        """
39
        failed = service.provider_failed + 1
40
        if failed > settings.DJANGO_TH.get('failed_tries', 10):
41
            TriggerService.objects.filter(id=service.id).\
42
                update(date_result=now(), status=False)
43
        else:
44
            TriggerService.objects.filter(id=service.id).\
45
                update(date_result=now(), provider_failed=failed)
46
47
        warn_user_and_admin('provider', service)
48
49
    def reading(self, service):
50
        """
51
           get the data from the service and put theme in cache
52
           :param service: service object to read
53
           :type service: object
54
        """
55
        now = arrow.utcnow().to(settings.TIME_ZONE).format(
56
            'YYYY-MM-DD HH:mm:ssZZ')
57
        # counting the new data to store to display them in the log
58
        # provider - the service that offer data
59
        provider_token = service.provider.token
60
        default_provider.load_services()
61
        service_provider = default_provider.get_service(
62
            str(service.provider.name.name))
63
        # check if the service has already been triggered
64
        # if date_triggered is None, then it's the first run
65
        # so it will be set to "now"
66
        date_triggered = service.date_triggered if service.date_triggered \
67
            else now
68
        # 1) get the data from the provider service
69
        # get a timestamp of the last triggered of the service
70
        kwargs = {'token': provider_token,
71
                  'trigger_id': service.id,
72
                  'date_triggered': date_triggered}
73
        data = self.provider(service_provider, **kwargs)
74
75
        if data:
76
            if len(data) > 0:
77
                logger.info("{} - {} new data".format(service, len(data)))
78
        else:
79
            # if data is False, something went wrong
80
            self.is_ceil_reached(service)
81