Completed
Push — master ( 40ddbb...150e6d )
by Fox
01:22
created

ServiceRss   A

Complexity

Total Complexity 13

Size/Duplication

Total Lines 62
Duplicated Lines 0 %

Importance

Changes 6
Bugs 0 Features 2
Metric Value
c 6
b 0
f 2
dl 0
loc 62
rs 10
wmc 13

2 Methods

Rating   Name   Duplication   Size   Complexity  
A __init__() 0 2 1
F read_data() 0 57 12
1
# coding: utf-8
2
import datetime
3
import time
4
import arrow
5
6
# django classes
7
from django.conf import settings
8
from django.utils.log import getLogger
9
from django.core.cache import caches
10
11
# django_th classes
12
from django_th.services.services import ServicesMgr
13
# th_rss classes
14
from th_rss.lib.feedsservice import Feeds
15
16
logger = getLogger('django_th.trigger_happy')
17
18
cache = caches['th_rss']
19
20
21
class ServiceRss(ServicesMgr):
22
23
    def __init__(self, token=None, **kwargs):
24
        super(ServiceRss, self).__init__(token, **kwargs)
25
26
    def read_data(self, **kwargs):
27
        """
28
            get the data from the service
29
30
            :param kwargs: contain keyword args : trigger_id and model name
31
            :type kwargs: dict
32
            :rtype: dict
33
        """
34
        date_triggered = kwargs.get('date_triggered')
35
        trigger_id = kwargs.get('trigger_id')
36
        kwargs['model_name'] = 'Rss'
37
38
        # get the URL from the trigger id
39
        rss = super(ServiceRss, self).read_data(**kwargs)
40
41
        logger.debug("RSS Feeds from %s : url %s", rss.name, rss.url)
42
43
        now = arrow.utcnow().to(settings.TIME_ZONE)
44
        published = ''
45
        my_feeds = []
46
47
        # retrieve the data
48
        feeds = Feeds(**{'url_to_parse': rss.url}).datas()
49
50
        for entry in feeds.entries:
51
            # entry.*_parsed may be None when the date in a RSS Feed is invalid
52
            # so will have the "now" date as default
53
            if hasattr(entry, 'published_parsed'):
54
                if entry.published_parsed is not None:
55
                    published = datetime.datetime.utcfromtimestamp(
56
                        time.mktime(entry.published_parsed))
57
            elif hasattr(entry, 'created_parsed'):
58
                if entry.created_parsed is not None:
59
                    published = datetime.datetime.utcfromtimestamp(
60
                        time.mktime(entry.created_parsed))
61
            elif hasattr(entry, 'updated_parsed'):
62
                if entry.updated_parsed is not None:
63
                    published = datetime.datetime.utcfromtimestamp(
64
                        time.mktime(entry.updated_parsed))
65
66
            if published == '':
67
                published = now
68
            else:
69
                published = arrow.get(str(published)).to(settings.TIME_ZONE)
70
71
            date_triggered = arrow.get(
72
                str(date_triggered)).to(settings.TIME_ZONE)
73
74
            if date_triggered is not None and\
75
               published is not None and\
76
               now >= published >= date_triggered:
77
                my_feeds.append(entry)
78
79
        cache.set('th_rss_' + str(trigger_id), my_feeds)
80
        cache.set('th_rss_uuid_{}'.format(rss.uuid), my_feeds)
81
        # return the data
82
        return my_feeds
83