mirror of https://gitlab.com/bashrc2/epicyon
223 lines
9.7 KiB
Python
223 lines
9.7 KiB
Python
__filename__ = "webapp_frontscreen.py"
|
|
__author__ = "Bob Mottram"
|
|
__license__ = "AGPL3+"
|
|
__version__ = "1.3.0"
|
|
__maintainer__ = "Bob Mottram"
|
|
__email__ = "bob@libreserver.org"
|
|
__status__ = "Production"
|
|
__module_group__ = "Timeline"
|
|
|
|
import os
|
|
from utils import is_system_account
|
|
from utils import get_domain_from_actor
|
|
from utils import get_config_param
|
|
from utils import get_account_timezone
|
|
from person import person_box_json
|
|
from webapp_utils import html_header_with_external_style
|
|
from webapp_utils import html_footer
|
|
from webapp_utils import get_banner_file
|
|
from webapp_utils import html_post_separator
|
|
from webapp_utils import header_buttons_front_screen
|
|
from webapp_column_left import get_left_column_content
|
|
from webapp_column_right import get_right_column_content
|
|
from webapp_post import individual_post_as_html
|
|
|
|
|
|
def _html_front_screen_posts(recent_posts_cache: {}, max_recent_posts: int,
|
|
translate: {},
|
|
base_dir: str, http_prefix: str,
|
|
nickname: str, domain: str, port: int,
|
|
session, cached_webfingers: {}, person_cache: {},
|
|
project_version: str,
|
|
yt_replace_domain: str,
|
|
twitter_replacement_domain: str,
|
|
show_published_date_only: bool,
|
|
peertube_instances: [],
|
|
allow_local_network_access: bool,
|
|
theme_name: str, system_language: str,
|
|
max_like_count: int,
|
|
signing_priv_key_pem: str, cw_lists: {},
|
|
lists_enabled: str,
|
|
bold_reading: bool) -> str:
|
|
"""Shows posts on the front screen of a news instance
|
|
These should only be public blog posts from the features timeline
|
|
which is the blog timeline of the news actor
|
|
"""
|
|
separator_str = html_post_separator(base_dir, None)
|
|
profile_str = ''
|
|
max_items = 4
|
|
ctr = 0
|
|
curr_page = 1
|
|
box_name = 'tlfeatures'
|
|
authorized = True
|
|
while ctr < max_items and curr_page < 4:
|
|
outbox_feed_path_str = \
|
|
'/users/' + nickname + '/' + box_name + \
|
|
'?page=' + str(curr_page)
|
|
outbox_feed = \
|
|
person_box_json({}, session, base_dir, domain, port,
|
|
outbox_feed_path_str,
|
|
http_prefix, 10, box_name,
|
|
authorized, 0, False, 0)
|
|
if not outbox_feed:
|
|
break
|
|
if len(outbox_feed['orderedItems']) == 0:
|
|
break
|
|
for item in outbox_feed['orderedItems']:
|
|
if item['type'] == 'Create':
|
|
timezone = get_account_timezone(base_dir, nickname, domain)
|
|
post_str = \
|
|
individual_post_as_html(signing_priv_key_pem,
|
|
True, recent_posts_cache,
|
|
max_recent_posts,
|
|
translate, None,
|
|
base_dir, session,
|
|
cached_webfingers,
|
|
person_cache,
|
|
nickname, domain, port, item,
|
|
None, True, False,
|
|
http_prefix,
|
|
project_version, 'inbox',
|
|
yt_replace_domain,
|
|
twitter_replacement_domain,
|
|
show_published_date_only,
|
|
peertube_instances,
|
|
allow_local_network_access,
|
|
theme_name, system_language,
|
|
max_like_count,
|
|
False, False, False,
|
|
True, False, False,
|
|
cw_lists, lists_enabled,
|
|
timezone, False,
|
|
bold_reading)
|
|
if post_str:
|
|
profile_str += post_str + separator_str
|
|
ctr += 1
|
|
if ctr >= max_items:
|
|
break
|
|
curr_page += 1
|
|
return profile_str
|
|
|
|
|
|
def html_front_screen(signing_priv_key_pem: str,
|
|
rss_icon_at_top: bool,
|
|
css_cache: {}, icons_as_buttons: bool,
|
|
default_timeline: str,
|
|
recent_posts_cache: {}, max_recent_posts: int,
|
|
translate: {}, project_version: str,
|
|
base_dir: str, http_prefix: str, authorized: bool,
|
|
profile_json: {}, selected: str,
|
|
session, cached_webfingers: {}, person_cache: {},
|
|
yt_replace_domain: str,
|
|
twitter_replacement_domain: str,
|
|
show_published_date_only: bool,
|
|
newswire: {}, theme: str,
|
|
peertube_instances: [],
|
|
allow_local_network_access: bool,
|
|
access_keys: {},
|
|
system_language: str, max_like_count: int,
|
|
shared_items_federated_domains: [],
|
|
extra_json: {},
|
|
page_number: int,
|
|
max_items_per_page: int,
|
|
cw_lists: {}, lists_enabled: str) -> str:
|
|
"""Show the news instance front screen
|
|
"""
|
|
bold_reading = False
|
|
nickname = profile_json['preferredUsername']
|
|
if not nickname:
|
|
return ""
|
|
if not is_system_account(nickname):
|
|
return ""
|
|
domain, port = get_domain_from_actor(profile_json['id'])
|
|
if not domain:
|
|
return ""
|
|
domain_full = domain
|
|
if port:
|
|
domain_full = domain + ':' + str(port)
|
|
|
|
login_button = header_buttons_front_screen(translate, nickname,
|
|
'features', authorized,
|
|
icons_as_buttons)
|
|
|
|
# If this is the news account then show a different banner
|
|
banner_file, _ = \
|
|
get_banner_file(base_dir, nickname, domain, theme)
|
|
profile_header_str = \
|
|
'<img loading="lazy" decoding="async" class="timeline-banner" ' + \
|
|
'src="/users/' + nickname + '/' + banner_file + '" />\n'
|
|
if login_button:
|
|
profile_header_str += '<center>' + login_button + '</center>\n'
|
|
|
|
profile_header_str += \
|
|
'<table class="timeline">\n' + \
|
|
' <colgroup>\n' + \
|
|
' <col span="1" class="column-left">\n' + \
|
|
' <col span="1" class="column-center">\n' + \
|
|
' <col span="1" class="column-right">\n' + \
|
|
' </colgroup>\n' + \
|
|
' <tbody>\n' + \
|
|
' <tr>\n' + \
|
|
' <td valign="top" class="col-left" tabindex="-1">\n'
|
|
profile_header_str += \
|
|
get_left_column_content(base_dir, 'news', domain_full,
|
|
http_prefix, translate,
|
|
False, False,
|
|
False, None, rss_icon_at_top, True,
|
|
True, theme, access_keys,
|
|
shared_items_federated_domains)
|
|
profile_header_str += \
|
|
' </td>\n' + \
|
|
' <td valign="top" class="col-center" tabindex="-1">\n'
|
|
|
|
profile_str = profile_header_str
|
|
|
|
css_filename = base_dir + '/epicyon-profile.css'
|
|
if os.path.isfile(base_dir + '/epicyon.css'):
|
|
css_filename = base_dir + '/epicyon.css'
|
|
|
|
license_str = ''
|
|
banner_file, _ = \
|
|
get_banner_file(base_dir, nickname, domain, theme)
|
|
profile_str += \
|
|
_html_front_screen_posts(recent_posts_cache, max_recent_posts,
|
|
translate,
|
|
base_dir, http_prefix,
|
|
nickname, domain, port,
|
|
session, cached_webfingers, person_cache,
|
|
project_version,
|
|
yt_replace_domain,
|
|
twitter_replacement_domain,
|
|
show_published_date_only,
|
|
peertube_instances,
|
|
allow_local_network_access,
|
|
theme, system_language,
|
|
max_like_count,
|
|
signing_priv_key_pem,
|
|
cw_lists, lists_enabled,
|
|
bold_reading) + license_str
|
|
|
|
# Footer which is only used for system accounts
|
|
profile_footer_str = ' </td>\n'
|
|
profile_footer_str += \
|
|
' <td valign="top" class="col-right" tabindex="-1">\n'
|
|
profile_footer_str += \
|
|
get_right_column_content(base_dir, 'news', domain_full,
|
|
http_prefix, translate,
|
|
False, False, newswire, False,
|
|
False, None, False, False,
|
|
False, True, authorized, True, theme,
|
|
default_timeline, access_keys)
|
|
profile_footer_str += \
|
|
' </td>\n' + \
|
|
' </tr>\n' + \
|
|
' </tbody>\n' + \
|
|
'</table>\n'
|
|
|
|
instance_title = \
|
|
get_config_param(base_dir, 'instanceTitle')
|
|
profile_str = \
|
|
html_header_with_external_style(css_filename, instance_title, None) + \
|
|
profile_str + profile_footer_str + html_footer()
|
|
return profile_str
|