Completed
Push — master ( cbc1c4...075762 )
by Fox
01:49
created

get_note()   B

Complexity

Conditions 4

Size

Total Lines 24

Duplication

Lines 0
Ratio 0 %

Importance

Changes 1
Bugs 0 Features 0
Metric Value
cc 4
c 1
b 0
f 0
dl 0
loc 24
rs 8.6845

1 Method

Rating   Name   Duplication   Size   Complexity  
A get_notebook() 0 12 3
1
# coding: utf-8
2
import evernote.edam.type.ttypes as Types
3
from evernote.edam.error.ttypes import EDAMSystemException, EDAMUserException
4
from evernote.edam.error.ttypes import EDAMErrorCode
5
6
from django.utils.translation import ugettext as _
7
from django.utils.log import getLogger
8
from django.core.cache import caches
9
10
logger = getLogger('django_th.trigger_happy')
11
cache = caches['th_evernote']
12
13
14
def get_notebook(note_store, my_notebook):
15
    """
16
        get the notebook from its name
17
    """
18
    notebook_id = 0
19
    notebooks = note_store.listNotebooks()
20
    # get the notebookGUID ...
21
    for notebook in notebooks:
22
        if notebook.name.lower() == my_notebook.lower():
23
            notebook_id = notebook.guid
24
            break
25
    return notebook_id
26
27
28
def set_notebook(note_store, my_notebook, notebook_id):
29
    """
30
        create a notebook
31
    """
32
    if notebook_id == 0:
33
        new_notebook = Types.Notebook()
34
        new_notebook.name = my_notebook
35
        new_notebook.defaultNotebook = False
36
        notebook_id = note_store.createNotebook(new_notebook).guid
37
    return notebook_id
38
39
40
def get_tag(note_store, my_tags):
41
    """
42
        get the tags from his Evernote account
43
        :param note_store Evernote Instance
44
        :param my_tags string
45
        :return: array of the tag to create
46
    """
47
    tag_id = []
48
    listtags = note_store.listTags()
49
    # cut the string by piece of tag with comma
50
    if ',' in my_tags:
51
        for my_tag in my_tags.split(','):
52
            for tag in listtags:
53
                # remove space before and after
54
                # thus we keep "foo bar"
55
                # but not " foo bar" nor "foo bar "
56
                if tag.name.lower() == my_tag.lower().lstrip().rstrip():
57
                    tag_id.append(tag.guid)
58
                    break
59
    else:
60
        for tag in listtags:
61
            if tag.name.lower() == my_tags.lower():
62
                tag_id.append(tag.guid)
63
                break
64
65
    return tag_id
66
67
68
def set_tag(note_store, my_tags, tag_id):
69
    """
70
        create a tag if not exists
71
        :param note_store evernote instance
72
        :param my_tags string
73
        :param tag_id id of the tag(s) to create
74
        :return: array of the tag to create
75
    """
76
    new_tag = Types.Tag()
77
    if ',' in my_tags:
78
        for my_tag in my_tags.split(','):
79
            new_tag.name = my_tag
80
            tag_id.append(create_tag(note_store, new_tag))
81
    elif my_tags:
82
        new_tag.name = my_tags
83
        tag_id.append(create_tag(note_store, new_tag))
84
85
    return tag_id
86
87
88
def create_note(note_store, note, trigger_id, data):
89
    """
90
        create a note
91
        :param note_store Evernote instance
92
        :param note
93
        :param trigger_id id of the trigger
94
        :param data to save or to put in cache
95
        :type note_store: Evernote Instance
96
        :type note: Note instance
97
        :type trigger_id: int
98
        :type data: dict
99
        :return boolean
100
        :rtype boolean
101
    """
102
    # create the note !
103
    try:
104
        created_note = note_store.createNote(note)
105
        sentence = str('note %s created') % created_note.guid
106
        logger.debug(sentence)
107
        return True
108
    except EDAMSystemException as e:
109
        if e.errorCode == EDAMErrorCode.RATE_LIMIT_REACHED:
110
            sentence = "Rate limit reached {code} " \
111
                       "Retry your request in {msg} seconds"
112
            logger.warn(sentence.format(
113
                code=e.errorCode,
114
                msg=e.rateLimitDuration))
115
            # put again in cache the data that could not be
116
            # published in Evernote yet
117
            cache.set('th_evernote_' + str(trigger_id), data, version=2)
118
            return True
119
        else:
120
            logger.critical(e)
121
            return False
122
    except EDAMUserException as e:
123
        if e.errorCode == EDAMErrorCode.ENML_VALIDATION:
124
            sentence = "Data ignored due to validation" \
125
                       " error : err {code} {msg}"
126
            logger.warn(sentence.format(
127
                code=e.errorCode,
128
                msg=e.parameter))
129
            return True
130
    except Exception as e:
131
        logger.critical(e)
132
        return False
133
134
135
def create_tag(note_store, new_tag):
136
    """
137
        :param note_store Evernote instance
138
        :param new_tag: create this new tag
139
        :return: new tag id
140
    """
141
    try:
142
        return note_store.createTag(new_tag).guid
143
    except EDAMUserException as e:
144
        if e.errorCode == EDAMErrorCode.DATA_CONFLICT:
145
            logger.info("Evernote Data Conflict Err {0}".format(e))
146
        elif e.errorCode == EDAMErrorCode.BAD_DATA_FORMAT:
147
            logger.critical("Evernote Err {0}".format(e))
148
149
150
def set_header():
151
    """
152
        preparing the hearder of Evernote
153
    """
154
    return '<?xml version="1.0" encoding="UTF-8"?>' \
155
           '<!DOCTYPE en-note SYSTEM ' \
156
           '"http://xml.evernote.com/pub/enml2.dtd">\n'
157
158
159
def set_note_attribute(data):
160
    """
161
       add the link of the 'source' in the note
162
    """
163
    na = False
164
    if data.get('link'):
165
        na = Types.NoteAttributes()
166
        # add the url
167
        na.sourceURL = data.get('link')
168
        # add the object to the note
169
    return na
170
171
172
def set_note_footer(data, trigger):
173
    """
174
        handle the footer of the note
175
    """
176
    footer = ''
177
    if data.get('link'):
178
        provided_by = _('Provided by')
179
        provided_from = _('from')
180
        footer_from = "<br/><br/>{} <em>{}</em> {} <a href='{}'>{}</a>"
181
182
        footer = footer_from.format(
183
            provided_by, trigger.trigger.description, provided_from,
184
            data.get('link'), data.get('link'))
185
186
    return footer
187