Example #1
0
def generate_sources_list():
    db = DatabaseAdapter()
    unread_items = db.find_unread_news().fetchall()
    db.close_connection()

    sources_list = urwid.SimpleListWalker([])
    for source in state.sources:
        button = SourceButton(state.sources[source]['title'])
        urwid.connect_signal(button, 'click', SourceButton.show_all, user_args=[source])
        urwid.connect_signal(button, 'click_unread', SourceButton.show_unread, user_args=[source])
        urwid.connect_signal(button, 'read', SourceButton.mark_as_read, user_args=[source])
        urwid.connect_signal(button, 'add', add.display, user_args=[source])
        urwid.connect_signal(button, 'delete', delete.display, user_args=[source])
        urwid.connect_signal(button, 'edit', edit.display, user_args=[source])
        sources_list.append(urwid.AttrMap(button, None, focus_map='reversed'))

        for subsource in state.sources[source]['sources']:
            title_prefix = '  '
            for unread_item in unread_items:
                if unread_item['source_id'] == subsource and unread_item['read'] == 0:
                    title_prefix = 'ยท '
                    break

            button = SourceButton(title_prefix + state.sources[source]['sources'][subsource]['title'])
            urwid.connect_signal(button, 'click', SourceButton.show_all, user_args=[subsource])
            urwid.connect_signal(button, 'click_unread', SourceButton.show_unread, user_args=[subsource])
            urwid.connect_signal(button, 'read', SourceButton.mark_as_read, user_args=[subsource])
            urwid.connect_signal(button, 'add', add.display, user_args=[subsource])
            urwid.connect_signal(button, 'delete', delete.display, user_args=[subsource])
            urwid.connect_signal(button, 'edit', edit.display, user_args=[subsource])
            sources_list.append(urwid.AttrMap(button, None, focus_map='reversed'))

    return sources_list
Example #2
0
def generate_node_id():
    db = DatabaseAdapter()

    node = ''
    while node is not None:
        new_node_id = ''.join(random.choices(string.ascii_lowercase, k=7))
        node = db.get_node(new_node_id).fetchone()

    db.close_connection()

    return new_node_id
Example #3
0
    def show_unread(node_id):
        db = DatabaseAdapter()

        state.selected_filter = 'unread'
        state.selected_node_id = node_id

        main.set_focused_item()

        rows = db.get_source_items(node_id, state.node_id_unreads,
                                   state.selected_filter)

        main.display(state.loop, rows)
Example #4
0
    def mark_as_read(item_id):
        db = DatabaseAdapter()

        main.set_focused_item()

        db.set_item_read(item_id)

        rows = db.get_source_items(state.selected_node_id,
                                   state.node_id_unreads,
                                   state.selected_filter)

        main.display(state.loop, rows)
Example #5
0
    def select(row):
        db = DatabaseAdapter()

        main.set_focused_item()

        db.set_item_read(row['item_id'])

        rows = db.get_source_items(state.selected_node_id,
                                   state.node_id_unreads,
                                   state.selected_filter)

        main.display(state.loop, rows)

        webbrowser.open_new_tab(row['url'])
Example #6
0
def save(sibling_node_id, name_edit, url_edit, update_interval_edit,
         mark_as_read_checkbox, button):
    url = url_edit.get_edit_text()
    feed_type = sourceservice.detect_feed_type(url)
    link = sourceservice.get_link(url, feed_type)

    config_adapter = ConfigAdapter()
    db = DatabaseAdapter()

    sibling_node = next(db.get_node(sibling_node_id))
    config_node = config_adapter.get_source(sibling_node_id)
    new_node_id = sourceservice.generate_node_id()
    parent_node_id = sibling_node['parent_id']

    new_node = db.add_source(new_node_id, parent_node_id,
                             name_edit.get_edit_text(), feed_type, url,
                             update_interval_edit.get_edit_text())
    db.close_connection()

    config_adapter.add_source(sibling_node_id, new_node_id,
                              name_edit.get_edit_text(), feed_type, url, link,
                              update_interval_edit.get_edit_text(),
                              mark_as_read_checkbox.get_state())
    state.sources = config_adapter.get_sources()

    main.set_focused_item()
    rows = db.get_source_items(state.selected_node_id, state.node_id_unreads,
                               state.selected_filter)
    main.display(state.loop, rows)
Example #7
0
    def mark_as_read(node_id):
        main.set_focused_item()

        db = DatabaseAdapter()

        if node_id == state.node_id_unreads:
            db.set_unreads_read()
        else:
            db.set_source_read(node_id)

        db.close_connection()

        rows = db.get_source_items(state.selected_node_id,
                                   state.node_id_unreads,
                                   state.selected_filter)

        main.display(state.loop, rows)
Example #8
0
def display(node_id):
    if node_id == state.node_id_unreads:
        return

    db = DatabaseAdapter()
    node = next(db.get_node(node_id))
    db.close_connection()

    # body
    body_pile = urwid.Pile([
        urwid.Divider(),
        urwid.Text('Are you sure you want to delete source "{}"?'.format(
            node['title']),
                   align='center')
    ])
    body_filler = urwid.Filler(body_pile, valign='top')
    body_padding = urwid.Padding(body_filler, left=1, right=1)
    state.body = urwid.LineBox(body_padding)

    # footer
    button_yes = urwid.Button('Yes')
    urwid.connect_signal(button_yes, 'click', delete, user_args=[node])
    button_no = urwid.Button('No', close)
    footer = urwid.GridFlow([button_yes, button_no], 7, 1, 1, 'center')

    # layout
    layout = urwid.Frame(state.body, footer=footer, focus_part='footer')

    state.body = state.loop.widget
    pile = urwid.Pile([layout])
    over = urwid.Overlay(pile,
                         state.body,
                         align='center',
                         valign='middle',
                         width=41,
                         height=7)

    state.loop.widget = over
Example #9
0
def get_node_unread_count(node_id):
    db = DatabaseAdapter()

    if node_id and node_id == state.node_id_unreads:
        rows = db.get_unread_count().fetchall()
    else:
        rows = db.get_node_unread_count(node_id).fetchall()

    db.close_connection()

    return rows[0]['unread_count']
Example #10
0
def delete(node, button):
    config_adapter = ConfigAdapter()
    db = DatabaseAdapter()

    node_ids = []
    if node['type'] == 'folder':
        folder_nodes = db.get_nodes_by_parent(node['node_id'])
        for folder_node in folder_nodes:
            node_ids.append(folder_node['node_id'])
    node_ids.append(node['node_id'])

    for node_id in node_ids:
        db.delete_node(node_id)
        config_adapter.delete_source(node_id)

    db.close_connection()

    state.sources = config_adapter.get_sources()
    main.set_focused_item()
    rows = db.get_source_items(state.selected_node_id, state.node_id_unreads,
                               state.selected_filter)
    main.display(state.loop, rows)
Example #11
0
def display(node_id):
    if node_id == state.node_id_unreads:
        return

    config_adapter = ConfigAdapter()
    db = DatabaseAdapter()

    node = next(db.get_node_subscriptions(node_id))
    config_node = config_adapter.get_source(node_id)
    mark_as_read = False if config_node['mark_as_read'] == 'false' else True

    name_txt = urwid.Text(u'Name', align='right')
    name_edit = urwid.Edit(u'', edit_text=node['title'], wrap='clip')
    name_column = urwid.Columns([(18, name_txt), (2, urwid.Divider()), name_edit])

    url_txt = urwid.Text(u'URL', align='right')
    url_edit = urwid.Edit(u'', edit_text=node['source'], wrap='clip')
    url_column = urwid.Columns([(18, url_txt), (2, urwid.Divider()), url_edit])

    update_interval_txt = urwid.Text(u'Update interval', align='right')
    update_interval_edit = urwid.Edit(u'', edit_text=str(node['update_interval']))
    update_interval_column = urwid.Columns([(18, update_interval_txt), (2, urwid.Divider()), update_interval_edit])

    mark_as_read_txt = urwid.Text(u'Mark as read', align='right')
    mark_as_read_checkbox = urwid.CheckBox(u'', mark_as_read)
    mark_as_read_column = urwid.Columns([(18, mark_as_read_txt), (2, urwid.Divider()), mark_as_read_checkbox])

    body_pile = urwid.Pile([
        urwid.Divider(),
        name_column,
        url_column,
        update_interval_column,
        mark_as_read_column,
        urwid.Divider()
    ])

    # body
    body_filler = urwid.Filler(body_pile, valign='top')
    body_padding = urwid.Padding(
        body_filler,
        left=1,
        right=1
    )
    state.body = urwid.LineBox(body_padding)

    # footer
    submit_button = urwid.Button('Submit')
    urwid.connect_signal(submit_button, 'click', save, user_args=[node_id, name_edit, url_edit, update_interval_edit, mark_as_read_checkbox])
    cancel_button = urwid.Button('Cancel')
    urwid.connect_signal(cancel_button, 'click', close)
    footer = urwid.GridFlow([submit_button, cancel_button], 10, 1, 1, 'center')

    # layout
    layout = urwid.Frame(
        state.body,
        footer=footer,
        focus_part='footer'
    )

    state.body = state.loop.widget
    pile = urwid.Pile([layout])
    over = urwid.Overlay(
        pile,
        state.body,
        align='center',
        valign='middle',
        width=60,
        height=12
    )

    state.loop.widget = over

    db.close_connection()