summaryrefslogtreecommitdiff
path: root/service/pixelated/adapter/pixelated_mail.py
blob: 49a045f23675dcc0763277ed5617d18392599d6d (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
from pixelated.tags import Tag
from pixelated.tags import Tags
import dateutil.parser as dateparser


class PixelatedMail:

    LEAP_FLAGS = ['\\Seen',
                  '\\Answered',
                  '\\Flagged',
                  '\\Deleted',
                  '\\Draft',
                  '\\Recent',
                  'List']

    LEAP_FLAGS_STATUSES = {
        '\\Seen': 'read',
        '\\Answered': 'replied'
    }

    LEAP_FLAGS_TAGS = {
        '\\Deleted': 'trash',
        '\\Draft': 'drafts',
        '\\Recent': 'inbox'
    }

    def __init__(self, leap_mail):
        self.leap_mail = leap_mail
        self.body = leap_mail.bdoc.content['raw']
        self.headers = self.extract_headers()
        self.date = dateparser.parse(self.headers['date'])
        self.ident = leap_mail.getUID()
        self.status = self.extract_status()
        self.security_casing = {}
        self.tags = self.extract_tags()

    def extract_status(self):
        flags = self.leap_mail.getFlags()
        return [converted for flag, converted in self.LEAP_FLAGS_STATUSES.items() if flag in flags]

    def extract_headers(self):
        temporary_headers = {}
        for header, value in self.leap_mail.hdoc.content['headers'].items():
            temporary_headers[header.lower()] = value
        if(temporary_headers.get('to') is not None):
            temporary_headers['to'] = [temporary_headers['to']]
        return temporary_headers

    def extract_tags(self):
        flags = self.leap_mail.getFlags()
        tag_names = self._converted_tags(flags) + self._custom_tags(flags)
        tags = []
        for tag in tag_names:
            tags.append(Tag(tag))
        return tags

    def _converted_tags(self, flags):
        return [converted for flag, converted in self.LEAP_FLAGS_TAGS.items() if flag in flags]

    def _custom_tags(self, flags):
        return [self._remove_prefix(flag) for flag in self.leap_mail.getFlags() if flag.startswith('tag_')]

    def _remove_prefix(self, flag_name):
        return flag_name.replace('tag_', '', 1)

    def update_tags(self, tags):
        self.tags = [Tag(tag) for tag in tags]
        return self.tags

    def has_tag(self, tag):
        return Tag(tag) in self.tags

    def as_dict(self):
        tags = [tag.name for tag in self.tags]
        return {
            'header': self.headers,
            'ident': self.ident,
            'tags': tags,
            'status': self.status,
            'security_casing': self.security_casing,
            'body': self.body
        }