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
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
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)
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)
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'])
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)
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)
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
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']
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)
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()