Completed
Branch master (5db784)
by Fox
01:52 queued 20s
created

ServicePocket.process_data()   A

Complexity

Conditions 1

Size

Total Lines 9

Duplication

Lines 0
Ratio 0 %

Importance

Changes 2
Bugs 0 Features 0
Metric Value
cc 1
c 2
b 0
f 0
dl 0
loc 9
rs 9.6666
1
# coding: utf-8
2
import datetime
3
import time
4
import arrow
5
6
# pocket API
7
from pocket import Pocket
8
9
# django classes
10
from django.conf import settings
11
from django.utils.log import getLogger
12
from django.core.cache import caches
13
14
# django_th classes
15
from django_th.services.services import ServicesMgr
16
from django_th.html_entities import HtmlEntities
17
18
"""
19
    handle process with pocket
20
    put the following in settings.py
21
22
    TH_POCKET = {
23
        'consumer_key': 'abcdefghijklmnopqrstuvwxyz',
24
    }
25
26
    TH_SERVICES = (
27
        ...
28
        'th_pocket.my_pocket.ServicePocket',
29
        ...
30
    )
31
32
"""
33
34
logger = getLogger('django_th.trigger_happy')
35
36
cache = caches['th_pocket']
37
38
39
class ServicePocket(ServicesMgr):
40
41
    def __init__(self, token=None):
42
        super(ServicePocket, self).__init__(token)
43
        self.consumer_key = settings.TH_POCKET['consumer_key']
44
        self.token = token
45
        if token:
46
            self.pocket = Pocket(self.consumer_key, token)
47
48
    def read_data(self, **kwargs):
49
        """
50
            get the data from the service
51
            as the pocket service does not have any date
52
            in its API linked to the note,
53
            add the triggered date to the dict data
54
            thus the service will be triggered when data will be found
55
56
            :param kwargs: contain keyword args : trigger_id at least
57
            :type kwargs: dict
58
59
            :rtype: list
60
        """
61
        trigger_id = kwargs['trigger_id']
62
        date_triggered = kwargs['date_triggered']
63
64
        data = list()
65
        # pocket uses a timestamp date format
66
        since = int(
67
            time.mktime(datetime.datetime.timetuple(date_triggered)))
68
69
        if self.token is not None:
70
71
            # get the data from the last time the trigger have been started
72
            # timestamp form
73
            pockets = self.pocket.get(since=since, state="unread")
74
            content = ''
75
            if pockets is not None and len(pockets[0]['list']) > 0:
76
                for my_pocket in pockets[0]['list'].values():
77
                    if my_pocket['excerpt']:
78
                        content = my_pocket['excerpt']
79
                    elif my_pocket['given_title']:
80
                        content = my_pocket['given_title']
81
                    my_date = arrow.get(str(date_triggered),
82
                                        'YYYY-MM-DD HH:mm:ss')\
83
                                   .to(settings.TIME_ZONE)
84
                    data.append({'my_date': str(my_date),
85
                                 'tag': '',
86
                                 'link': my_pocket['given_url'],
87
                                 'title': my_pocket['given_title'],
88
                                 'content': content,
89
                                 'tweet_id': 0})
90
                cache.set('th_pocket_' + str(trigger_id), data)
91
92
        return data
93
94
    def save_data(self, trigger_id, **data):
95
        """
96
            let's save the data
97
98
            :param trigger_id: trigger ID from which to save data
99
            :param data: the data to check to be used and save
100
            :type trigger_id: int
101
            :type data:  dict
102
            :return: the status of the save statement
103
            :rtype: boolean
104
        """
105
        from th_pocket.models import Pocket as PocketModel
106
107
        status = False
108
109
        if self.token and 'link' in data and data['link'] is not None\
110
                and len(data['link']) > 0:
111
            # get the pocket data of this trigger
112
            trigger = PocketModel.objects.get(trigger_id=trigger_id)
113
114
            title = self.set_title(data)
115
            # convert htmlentities
116
            title = HtmlEntities(title).html_entity_decode
117
118
            try:
119 View Code Duplication
                self.pocket.add(
0 ignored issues
show
Duplication introduced by
This code seems to be duplicated in your project.
Loading history...
120
                    url=data['link'], title=title, tags=(trigger.tag.lower()))
121
122
                sentence = str('pocket {} created').format(data['link'])
123
                logger.debug(sentence)
124
                status = True
125
            except Exception as e:
126
                logger.critical(e)
127
                status = False
128
129
        elif self.token and 'link' in data and data['link'] is not None\
130
                and len(data['link']) == 0:
131
            logger.warning(
132
                "no link provided for trigger ID {}, so we ignore it".format(trigger_id))
133
            status = True
134
        else: 
135
            logger.critical(
136
                "no token provided for trigger ID {}".format(trigger_id))
137
            status = False
138
        return status
139
140
    def auth(self, request):
141
        """
142
            let's auth the user to the Service
143
            :param request: request object
144
            :return: callback url
145
            :rtype: string that contains the url to redirect after auth
146
        """
147
        callback_url = self.callback_url(request, 'pocket')
148
149
        request_token = Pocket.get_request_token(
150
            consumer_key=self.consumer_key,
151
            redirect_uri=callback_url)
152
153
        # Save the request token information for later
154
        request.session['request_token'] = request_token
155
156
        # URL to redirect user to, to authorize your app
157
        auth_url = Pocket.get_auth_url(
158
            code=request_token, redirect_uri=callback_url)
159
160
        return auth_url
161
162
    def callback(self, request, **kwargs):
163
        """
164
            Called from the Service when the user accept to activate it
165
            :param request: request object
166
            :return: callback url
167
            :rtype: string , path to the template
168
        """
169
        access_token = Pocket.get_access_token(
170
            consumer_key=self.consumer_key,
171
            code=request.session['request_token'])
172
173
        kwargs = {'access_token': access_token, 'service': 'ServicePocket',
174
                  'return': 'pocket'}
175
176
        return super(ServicePocket, self).callback(request, **kwargs)
177