Completed
Push — master ( f067d1...61dc9d )
by Fox
01:24
created

ServicePocket.save_data()   B

Complexity

Conditions 4

Size

Total Lines 33

Duplication

Lines 33
Ratio 100 %

Importance

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