summaryrefslogtreecommitdiff
path: root/py-fake-service/app/adapter/mail_service.py
blob: c6bd3ab45125c0fcd57968b8e90be0038165ea73 (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
import os
import mailbox

from tagsset import TagsSet
from mailset import MailSet
from contacts import Contacts

class MailService:
    MAILSET_PATH = os.path.join(os.environ['HOME'], 'mailsets', 'mediumtagged')

    def __init__(self):
        self.mailset = MailSet()
        self.tagsset = TagsSet()
        self.contacts = Contacts()

    def load_mailset(self):
        mbox_filenames = [filename for filename in os.listdir(self.MAILSET_PATH) if filename.startswith('mbox')]
        boxes = (mailbox.mbox(os.path.join(self.MAILSET_PATH, mbox)) for mbox in mbox_filenames) 

        for box in boxes:
            message = box.popitem()[1]
            if message.is_multipart():
                continue
            self.mailset.add(message)
            self.tagsset.add(message)
            self.contacts.add(message)

    def mails(self, query, page, window_size):
        mails = self.mailset.values()
        mails = [mail for mail in mails if query.test(mail)]
        return mails

    def mail(self, mail_id):
        return self.mailset.get(mail_id)

    def search_contacts(self, query):
        return self.contacts.search(query)

    def mark_as_read(self, mail_id):
        self.mailset.mark_as_read(mail_id)
        self.tagsset.mark_as_read(self.mail(mail_id).tags)

    def delete_mail(self, mail_id):
        purged = self.mailset.delete(mail_id)
        if not purged:
            self.tagsset.increment_tag_total_count('trash')


    def update_tags_for(self, mail_id, new_tags):
        mail = self.mail(mail_id)
        
        new_tags_set = set(new_tags)
        old_tags_set = set(mail.tags)

        increment_set = new_tags_set - old_tags_set 
        decrement_set = old_tags_set - new_tags_set
        
        map(lambda x : self.tagsset.increment_tag_total_count(x), increment_set)
        map(lambda x : self.tagsset.decrement_tag_total_count(x), decrement_set)

        mail.tags = new_tags