Group by tags feature and improve appearance of sub list items
This commit is contained in:
parent
f1cd3eb751
commit
d637f5b29c
@ -151,6 +151,21 @@ def _get_channel_names(channel_ids):
|
|||||||
return result
|
return result
|
||||||
|
|
||||||
|
|
||||||
|
def _channels_with_tag(cursor, tag, order=False):
|
||||||
|
''' returns list of (channel_id, channel_name) '''
|
||||||
|
|
||||||
|
statement = '''SELECT yt_channel_id, channel_name
|
||||||
|
FROM subscribed_channels
|
||||||
|
WHERE subscribed_channels.id IN (
|
||||||
|
SELECT tag_associations.sql_channel_id FROM tag_associations WHERE tag=?
|
||||||
|
)
|
||||||
|
'''
|
||||||
|
if order:
|
||||||
|
statement += '''ORDER BY channel_name'''
|
||||||
|
|
||||||
|
return cursor.execute(statement, [tag]).fetchall()
|
||||||
|
|
||||||
|
|
||||||
units = {
|
units = {
|
||||||
'year': 31536000, # 365*24*3600
|
'year': 31536000, # 365*24*3600
|
||||||
'month': 2592000, # 30*24*3600
|
'month': 2592000, # 30*24*3600
|
||||||
@ -281,11 +296,8 @@ def check_tags(tags):
|
|||||||
with open_database() as connection:
|
with open_database() as connection:
|
||||||
with connection as cursor:
|
with connection as cursor:
|
||||||
for tag in tags:
|
for tag in tags:
|
||||||
channel_id_name_list += cursor.execute('''SELECT yt_channel_id, channel_name
|
channel_id_name_list += _channels_with_tag(cursor, tag)
|
||||||
FROM subscribed_channels
|
|
||||||
WHERE subscribed_channels.id IN (
|
|
||||||
SELECT tag_associations.sql_channel_id FROM tag_associations WHERE tag=?
|
|
||||||
)''', [tag]).fetchall()
|
|
||||||
channel_names.update(channel_id_name_list)
|
channel_names.update(channel_id_name_list)
|
||||||
check_channels_if_necessary([item[0] for item in channel_id_name_list])
|
check_channels_if_necessary([item[0] for item in channel_id_name_list])
|
||||||
|
|
||||||
@ -354,30 +366,87 @@ def import_subscriptions(env, start_response):
|
|||||||
|
|
||||||
sub_list_item_template = Template('''
|
sub_list_item_template = Template('''
|
||||||
<li>
|
<li>
|
||||||
|
<input class="sub-list-checkbox" name="channel_ids" value="$channel_id" form="subscription-manager-form" type="checkbox">
|
||||||
<a href="$channel_url" class="sub-list-item-name" title="$channel_name">$channel_name</a>
|
<a href="$channel_url" class="sub-list-item-name" title="$channel_name">$channel_name</a>
|
||||||
<span class="tag-list">$tags</span>
|
<span class="tag-list">$tags</span>
|
||||||
<input class="sub-list-checkbox" name="channel_ids" value="$channel_id" form="subscription-manager-form" type="checkbox">
|
|
||||||
</li>''')
|
</li>''')
|
||||||
|
|
||||||
|
tag_group_template = Template('''
|
||||||
|
<li class="tag-group">
|
||||||
|
<h2 class="tag-group-name">$tag</h2>
|
||||||
|
<ol class="sub-list">
|
||||||
|
$sub_list
|
||||||
|
</ol>
|
||||||
|
</li>
|
||||||
|
''')
|
||||||
def get_subscription_manager_page(env, start_response):
|
def get_subscription_manager_page(env, start_response):
|
||||||
|
|
||||||
sub_list_html = ''
|
|
||||||
with open_database() as connection:
|
with open_database() as connection:
|
||||||
with connection as cursor:
|
with connection as cursor:
|
||||||
for channel_name, channel_id in _get_subscribed_channels():
|
if env['parameters'].get('group_by_tags', '0')[0] == '1':
|
||||||
sub_list_html += sub_list_item_template.substitute(
|
|
||||||
channel_url = util.URL_ORIGIN + '/channel/' + channel_id,
|
sort_name = "Don't group"
|
||||||
channel_name = html.escape(channel_name),
|
sort_link = util.URL_ORIGIN + '/subscription_manager'
|
||||||
channel_id = channel_id,
|
|
||||||
tags = ', '.join(_get_tags(cursor, channel_id)),
|
main_list_html = '<ul class="tag-group-list">'
|
||||||
)
|
for tag in _get_all_tags():
|
||||||
|
sub_list_html = ''
|
||||||
|
for channel_id, channel_name in _channels_with_tag(cursor, tag, order=True):
|
||||||
|
sub_list_html += sub_list_item_template.substitute(
|
||||||
|
channel_url = util.URL_ORIGIN + '/channel/' + channel_id,
|
||||||
|
channel_name = html.escape(channel_name),
|
||||||
|
channel_id = channel_id,
|
||||||
|
tags = ', '.join(t for t in _get_tags(cursor, channel_id) if t != tag),
|
||||||
|
)
|
||||||
|
main_list_html += tag_group_template.substitute(
|
||||||
|
tag = tag,
|
||||||
|
sub_list = sub_list_html,
|
||||||
|
)
|
||||||
|
|
||||||
|
# Channels with no tags
|
||||||
|
channel_list = cursor.execute('''SELECT yt_channel_id, channel_name
|
||||||
|
FROM subscribed_channels
|
||||||
|
WHERE id NOT IN (
|
||||||
|
SELECT sql_channel_id FROM tag_associations
|
||||||
|
)
|
||||||
|
ORDER BY channel_name''').fetchall()
|
||||||
|
if channel_list:
|
||||||
|
sub_list_html = ''
|
||||||
|
for channel_id, channel_name in channel_list:
|
||||||
|
sub_list_html += sub_list_item_template.substitute(
|
||||||
|
channel_url = util.URL_ORIGIN + '/channel/' + channel_id,
|
||||||
|
channel_name = html.escape(channel_name),
|
||||||
|
channel_id = channel_id,
|
||||||
|
tags = '',
|
||||||
|
)
|
||||||
|
main_list_html += tag_group_template.substitute(
|
||||||
|
tag = "No tags",
|
||||||
|
sub_list = sub_list_html,
|
||||||
|
)
|
||||||
|
main_list_html += '</ul>'
|
||||||
|
|
||||||
|
else:
|
||||||
|
|
||||||
|
sort_name = "Group by tags"
|
||||||
|
sort_link = util.URL_ORIGIN + '/subscription_manager?group_by_tags=1'
|
||||||
|
|
||||||
|
main_list_html = '<ol class="sub-list">'
|
||||||
|
for channel_name, channel_id in _get_subscribed_channels():
|
||||||
|
main_list_html += sub_list_item_template.substitute(
|
||||||
|
channel_url = util.URL_ORIGIN + '/channel/' + channel_id,
|
||||||
|
channel_name = html.escape(channel_name),
|
||||||
|
channel_id = channel_id,
|
||||||
|
tags = ', '.join(_get_tags(cursor, channel_id)),
|
||||||
|
)
|
||||||
|
main_list_html += '</ol>'
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
start_response('200 OK', [('Content-type','text/html'),])
|
start_response('200 OK', [('Content-type','text/html'),])
|
||||||
return subscription_manager_template.substitute(
|
return subscription_manager_template.substitute(
|
||||||
header = html_common.get_header(),
|
header = html_common.get_header(),
|
||||||
sub_list = sub_list_html,
|
main_list = main_list_html,
|
||||||
|
sort_name = sort_name,
|
||||||
|
sort_link = sort_link,
|
||||||
page_buttons = '',
|
page_buttons = '',
|
||||||
).encode('utf-8')
|
).encode('utf-8')
|
||||||
|
|
||||||
|
@ -44,6 +44,18 @@
|
|||||||
padding:10px;
|
padding:10px;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
.tag-group-list{
|
||||||
|
list-style: none;
|
||||||
|
margin-left: 10px;
|
||||||
|
margin-right: 10px;
|
||||||
|
padding: 0px;
|
||||||
|
}
|
||||||
|
.tag-group{
|
||||||
|
border-style: solid;
|
||||||
|
margin-bottom: 10px;
|
||||||
|
}
|
||||||
|
|
||||||
.sub-list{
|
.sub-list{
|
||||||
list-style: none;
|
list-style: none;
|
||||||
padding:10px;
|
padding:10px;
|
||||||
@ -52,10 +64,16 @@
|
|||||||
}
|
}
|
||||||
.sub-list > li{
|
.sub-list > li{
|
||||||
display:flex;
|
display:flex;
|
||||||
justify-content: space-between;
|
|
||||||
margin-bottom: 10px;
|
margin-bottom: 10px;
|
||||||
background-color: #dadada;
|
background-color: #dadada;
|
||||||
}
|
}
|
||||||
|
.tag-list{
|
||||||
|
margin-left:15px;
|
||||||
|
font-weight:bold;
|
||||||
|
}
|
||||||
|
.sub-list-item-name{
|
||||||
|
margin-left:15px;
|
||||||
|
}
|
||||||
.sub-list-checkbox{
|
.sub-list-checkbox{
|
||||||
height: 1.5em;
|
height: 1.5em;
|
||||||
width: 1.5em;
|
width: 1.5em;
|
||||||
@ -82,7 +100,7 @@ $header
|
|||||||
<hr>
|
<hr>
|
||||||
|
|
||||||
<form id="subscription-manager-form" class="sub-list-controls" method="POST">
|
<form id="subscription-manager-form" class="sub-list-controls" method="POST">
|
||||||
<a class="sort-button" href="/youtube.com/subscription_manager?group_by_tags=1">Group by tags</a>
|
<a class="sort-button" href="$sort_link">$sort_name</a>
|
||||||
<input type="text" name="tags">
|
<input type="text" name="tags">
|
||||||
<button type="submit" name="action" value="add_tags">Add tags</button>
|
<button type="submit" name="action" value="add_tags">Add tags</button>
|
||||||
<button type="submit" name="action" value="remove_tags">Remove tags</button>
|
<button type="submit" name="action" value="remove_tags">Remove tags</button>
|
||||||
@ -90,9 +108,7 @@ $header
|
|||||||
<input type="reset" value="Clear Selection">
|
<input type="reset" value="Clear Selection">
|
||||||
</form>
|
</form>
|
||||||
|
|
||||||
<ol class="sub-list">
|
$main_list
|
||||||
$sub_list
|
|
||||||
</ol>
|
|
||||||
|
|
||||||
</main>
|
</main>
|
||||||
</body>
|
</body>
|
||||||
|
Loading…
x
Reference in New Issue
Block a user