예제 #1
0
    def __init__(self, label_id, request_callback_delay, data=None):
        super().__init__(data)

        self.page_length = options.emails_per_page
        self.label_id = label_id
        self.delay_request = request_callback_delay

        EmailEventChannel.subscribe('email_list_response', self.add_new_page)
        EmailEventChannel.subscribe('email_trashed', self.handle_email_trashed)
        EmailEventChannel.subscribe('email_restored',
                                    self.handle_email_restored)
        EmailEventChannel.subscribe('email_deleted', self.handle_email_deleted)
        EmailEventChannel.subscribe('email_sent', self.handle_email_sent)
        OptionEventChannel.subscribe('emails_per_page',
                                     self.change_page_length)

        self.sync_helper = SyncHelper()
        # Register this model to synchronizer in order to be able to receive short sync updates.
        EmailSynchronizer.get_instance().register(self, label_id)

        limit = self.page_length
        offset = len(self)
        self.sync_helper.push_event(EmailEventChannel, 'email_list_request', {
            'label_id': self.label_id,
            'limit': limit,
            'offset': offset
        }, None)

        self._backoff = 1
        # fully_loaded just means that database is done with full syncing.
        self.fully_loaded = False
        # _load_next_page indicates whether or not we should load the next page, mostly
        # used by add_new_page method when processing new data.
        self._load_next_page = False
예제 #2
0
    def __init__(self, parent=None):
        super().__init__(parent=parent)

        self.displayed_email_label = None
        font = QFont(QApplication.font())
        font.setPixelSize(14)
        self.label_title = QLabel('')
        self.label_title.setFont(font)

        mlayout = QVBoxLayout()
        mlayout.setContentsMargins(0, 0, 0, 0)
        mlayout.addWidget(self.label_title)
        self.setLayout(mlayout)

        generic = EmailLabel()
        sent = SentEmailLabel()
        trash = TrashEmailLabel()
        self.email_label_map = {
            EmailLabel: generic,
            SentEmailLabel: sent,
            TrashEmailLabel: trash
        }
        # Any label id that is not in the special_label_map should use generic EmailLabel
        self.special_label_map = {
            GMAIL_LABEL_SENT: SentEmailLabel,
            GMAIL_LABEL_TRASH: TrashEmailLabel
        }
        self.labels = {}

        EmailEventChannel.subscribe('show_label', self.show_label)
        EmailEventChannel.subscribe('labels_sync', self.process_labels)
예제 #3
0
    def send_email(self, to, subject, message):
        mime_msg = MIMEText(message)
        mime_msg['to'] = to
        mime_msg['subject'] = subject

        email_msg = {
            'raw': urlsafe_b64encode(mime_msg.as_bytes()).decode('utf-8')
        }

        EmailEventChannel.publish('send_email', email_msg=email_msg)
예제 #4
0
 def view_email(self, idx):
     email = self._displayed_data[idx]
     # Should we check labelIds here ?
     # In my opinion, there is no reason to do this, eventually we can even drop the use of labelIds.
     if email.get('unread') is True:
         email['unread'] = False
         EmailEventChannel.publish('modify_labels',
                                   message_id=email.get('message_id'),
                                   all_labels=email.get('label_ids'),
                                   to_add=(),
                                   to_remove=(GMAIL_LABEL_UNREAD, ))
     EmailEventChannel.publish('email_request',
                               message_id=email.get('message_id'))
예제 #5
0
 def item_pressed_handler(widget_id, switch, item_id_to_label_id):
     if widget_id > settings_wid:
         # User defined label
         switch.setCurrentIndex(label_view_page)
         EmailEventChannel.publish(
             'show_label', label_id=item_id_to_label_id[widget_id])
     elif personal_wid <= widget_id <= forums_wid:
         switch.setCurrentIndex(label_view_page)
         EmailEventChannel.publish('show_label', label_id=categories_label_ids[widget_id])
     elif sent_wid <= widget_id <= spam_wid:
         switch.setCurrentIndex(label_view_page)
         EmailEventChannel.publish(
             'show_label', label_id=other_labels_label_ids[widget_id - group_id - 1])
     elif widget_id == send_email_wid:
         switch.setCurrentIndex(send_email_page)
     elif widget_id == contacts_wid:
         switch.setCurrentIndex(contacts_page)
     elif widget_id == settings_wid:
         switch.setCurrentIndex(settings_page)
예제 #6
0
파일: sync.py 프로젝트: aleksaa01/qgmailer
 def send_sync_request(self):
     LOG.debug("Sending a short_sync event.")
     EmailEventChannel.publish('short_sync')
예제 #7
0
파일: sync.py 프로젝트: aleksaa01/qgmailer
 def __init__(self):
     self.registered_models = {}
     self.last_history_id = None
     EmailEventChannel.subscribe('synced', self.dispatch_updates)
예제 #8
0
파일: app.py 프로젝트: aleksaa01/qgmailer
    def __init__(self):
        super().__init__()

        self.c = AppController()
        self.c.on_themechanged.connect(self.set_theme)
        self.c.on_fontsizechanged.connect(self.set_font_size)

        # TODO: Put shortcuts in page manager ???
        self.shortcuts = Shortcuts(self)

        self.api_service = APIService()

        EmailEventChannel.subscribe(
            'labels_request',
            lambda **kwargs: self.handle_request(EmailEventChannel, 'labels_request', 'labels_sync', **kwargs)
        )

        EmailEventChannel.subscribe(
            'email_request',
            lambda **kwargs: self.handle_request(EmailEventChannel, 'email_request', 'email_response', **kwargs)
        )
        EmailEventChannel.subscribe(
            'email_list_request',
            lambda **kwargs: self.handle_request(EmailEventChannel, 'email_list_request', 'email_list_response', **kwargs)
        )
        EmailEventChannel.subscribe(
            'send_email',
            lambda **kwargs: self.handle_request(EmailEventChannel, 'send_email', 'email_sent', **kwargs)
        )
        EmailEventChannel.subscribe(
            'trash_email',
            lambda **kwargs: self.handle_request(EmailEventChannel, 'trash_email', 'email_trashed', **kwargs)
        )
        EmailEventChannel.subscribe(
            'restore_email',
            lambda **kwargs: self.handle_request(EmailEventChannel, 'restore_email', 'email_restored', **kwargs)
        )
        EmailEventChannel.subscribe(
            'delete_email',
            lambda **kwargs: self.handle_request(EmailEventChannel, 'delete_email', 'email_deleted', **kwargs)
        )
        EmailEventChannel.subscribe(
            'short_sync',
            lambda **kwargs: self.handle_request(EmailEventChannel, 'short_sync', 'synced', **kwargs)
        )
        EmailEventChannel.subscribe(
            'modify_labels',
            lambda **kwargs: self.handle_request(EmailEventChannel, 'modify_labels', 'labels_modified', **kwargs)
        )
        ContactEventChannel.subscribe(
            'page_request',
            lambda **kwargs: self.handle_request(ContactEventChannel, 'page_request', 'page_response', **kwargs)
        )
        ContactEventChannel.subscribe(
            'remove_contact',
            lambda **kwargs: self.handle_request(ContactEventChannel, 'remove_contact', 'contact_removed', **kwargs)
        )
        ContactEventChannel.subscribe(
            'add_contact',
            lambda **kwargs: self.handle_request(ContactEventChannel, 'add_contact', 'contact_added', **kwargs)
        )
        ContactEventChannel.subscribe(
            'edit_contact',
            lambda **kwargs: self.handle_request(ContactEventChannel, 'edit_contact', 'contact_edited', **kwargs)
        )

        self.setWindowTitle('QGmailer')
        icon = QIcon(QPixmap(':/images/qgmailer_logo.png'))
        self.setWindowIcon(icon)
        win_width, win_height = options.resolution.split('x')
        self.resize(int(win_width), int(win_height))
        # This allows main window to be resized to the smallest possible size.
        # Instead of being limited(in minimum size) by layouts.
        self.setMinimumSize(1, 1)

        # cw - central widget
        self.cw = QWidget(self)

        self.page_manager = PageManagerView(parent=self.cw)

        mlayout = QHBoxLayout()
        mlayout.setContentsMargins(0, 0, 0, 0)
        mlayout.addWidget(self.page_manager)
        self.cw.setLayout(mlayout)
        self.set_theme(options.theme)
        self.set_font_size(options.font_size)
        self.setCentralWidget(self.cw)

        self.syncer = EmailSynchronizer.get_instance()
        self.timer = QTimer()
        self.timer.singleShot(1000 * 8, lambda: self.syncer.send_sync_request())
        self.timer.timeout.connect(lambda: self.syncer.send_sync_request())
        self.timer.start(1000 * 60)
예제 #9
0
    def __init__(self, parent=None):
        super().__init__(parent)

        self.switch = QStackedWidget(self)
        label_view_page = self.add_page(LabelView())
        send_email_page = self.add_page(SendEmailPageView())
        contacts_page = self.add_page(ContactsPageView())
        settings_page = self.add_page(OptionsPageView())
        email_viewer_page = self.add_page(EmailViewerPageView())

        self.sidebar = Sidebar(self)

        personal_wid = self.sidebar.add_item('Personal', ':images/personal_image.png')
        social_wid = self.sidebar.add_item('Social', ':images/social_image.png')
        updates_wid = self.sidebar.add_item('Updates', ':images/updates_image.png')
        promotions_wid = self.sidebar.add_item('Promotions', ':images/promotions_image.png')
        forums_wid = self.sidebar.add_item('Forums', ':images/forums_image.png')
        categories_label_ids = [
            GMAIL_LABEL_PERSONAL, GMAIL_LABEL_SOCIAL, GMAIL_LABEL_UPDATES,
            GMAIL_LABEL_PROMOTIONS, GMAIL_LABEL_FORUMS
        ]

        group_id = self.sidebar.add_group('Other Labels')
        sent_wid = self.sidebar.add_item_to_group(group_id, 'Sent', ':images/sent_image.png')
        unread_wid = self.sidebar.add_item_to_group(group_id, 'Unread', ':images/unread_image.png')
        important_wid = self.sidebar.add_item_to_group(group_id, 'Important', ':images/important_image.png')
        starred_wid = self.sidebar.add_item_to_group(group_id, 'Starred', ':images/starred_image.png')
        trash_wid = self.sidebar.add_item_to_group(group_id, 'Trash', ':images/trash_image.png')
        spam_wid = self.sidebar.add_item_to_group(group_id, 'Spam', ':images/spam_image.png')
        other_labels_label_ids = [
            GMAIL_LABEL_SENT, GMAIL_LABEL_UNREAD, GMAIL_LABEL_IMPORTANT,
            GMAIL_LABEL_STARRED, GMAIL_LABEL_TRASH, GMAIL_LABEL_SPAM
        ]
        self.item_id_to_label_id = {}
        self.label_id_to_item_id = {}

        send_email_wid = self.sidebar.add_item('Send Email', ':images/send_email_image.png')
        contacts_wid = self.sidebar.add_item('Contacts', ':images/contacts_image.png')
        self.sidebar.add_stretch()
        settings_wid = self.sidebar.add_item('Settings', ':images/options_button.png')

        def item_pressed_handler(widget_id, switch, item_id_to_label_id):
            if widget_id > settings_wid:
                # User defined label
                switch.setCurrentIndex(label_view_page)
                EmailEventChannel.publish(
                    'show_label', label_id=item_id_to_label_id[widget_id])
            elif personal_wid <= widget_id <= forums_wid:
                switch.setCurrentIndex(label_view_page)
                EmailEventChannel.publish('show_label', label_id=categories_label_ids[widget_id])
            elif sent_wid <= widget_id <= spam_wid:
                switch.setCurrentIndex(label_view_page)
                EmailEventChannel.publish(
                    'show_label', label_id=other_labels_label_ids[widget_id - group_id - 1])
            elif widget_id == send_email_wid:
                switch.setCurrentIndex(send_email_page)
            elif widget_id == contacts_wid:
                switch.setCurrentIndex(contacts_page)
            elif widget_id == settings_wid:
                switch.setCurrentIndex(settings_page)

        self.item_pressed_handler = item_pressed_handler
        self.sidebar.on_item_pressed.connect(self.handle_item_pressed)

        def index_changed_handler(page_index, sidebar):
            if page_index == send_email_page:
                sidebar.select_item(send_email_wid)
            elif page_index == contacts_page:
                sidebar.select_item(contacts_wid)
            elif page_index == settings_page:
                sidebar.select_item(settings_wid)
            elif page_index == email_viewer_page:
                sidebar.select_item(None)
            else:
                assert False

        self.index_changed_handler = index_changed_handler

        main_layout = QHBoxLayout()
        main_layout.addWidget(self.sidebar)
        main_layout.addWidget(self.switch)
        main_layout.setContentsMargins(0, 0, 0, 0)
        self.setLayout(main_layout)

        EmailEventChannel.subscribe(
            'email_response', lambda **kwargs: self.change_to_index(email_viewer_page))

        ContactEventChannel.subscribe(
            'contact_picked', lambda **kwargs: self.change_to_index(send_email_page))
        ContactEventChannel.subscribe(
            'pick_contact', lambda **kwargs: self.change_to_index(contacts_page))

        ShortcutEventChannel.subscribe('personal', lambda **kwargs: self.show_label(personal_wid))
        ShortcutEventChannel.subscribe('social', lambda **kwargs: self.show_label(social_wid))
        ShortcutEventChannel.subscribe('updates', lambda **kwargs: self.show_label(updates_wid))
        ShortcutEventChannel.subscribe('promotions', lambda **kwargs: self.show_label(promotions_wid))
        ShortcutEventChannel.subscribe('forums', lambda **kwargs: self.show_label(forums_wid))
        ShortcutEventChannel.subscribe('sent', lambda **kwargs: self.show_label(sent_wid))
        ShortcutEventChannel.subscribe('unread', lambda **kwargs: self.show_label(unread_wid))
        ShortcutEventChannel.subscribe('important', lambda **kwargs: self.show_label(important_wid))
        ShortcutEventChannel.subscribe('starred', lambda **kwargs: self.show_label(starred_wid))
        ShortcutEventChannel.subscribe('trash', lambda **kwargs: self.show_label(trash_wid))
        ShortcutEventChannel.subscribe( 'spam', lambda **kwargs: self.show_label(spam_wid))
        ShortcutEventChannel.subscribe('send_email', lambda **kwargs: self.show_label(send_email_wid))
        ShortcutEventChannel.subscribe('contacts', lambda **kwargs: self.show_label(contacts_wid))
        ShortcutEventChannel.subscribe('settings', lambda **kwargs: self.show_label(settings_wid))

        self.other_labels_group_id = group_id
        EmailEventChannel.subscribe('labels_sync', self.handle_labels_sync)

        EmailEventChannel.publish('labels_request')
예제 #10
0
 def __init__(self):
     EmailEventChannel.subscribe('email_response',
                                 self.handle_email_response)
     EmailEventChannel.subscribe('email_request', self.handle_email_request)
예제 #11
0
 def __init__(self):
     EmailEventChannel.subscribe('email_sent', self.handle_email_sent)
     ContactEventChannel.subscribe('contact_picked',
                                   self.handle_contact_picked)