Merge branch 'main' of gitlab.com:bashrc2/epicyon

merge-requests/30/head
Bob Mottram 2022-02-25 21:10:33 +00:00
commit 6f7ca5f94e
33 changed files with 522 additions and 124 deletions

276
daemon.py
View File

@ -247,6 +247,9 @@ from languages import set_actor_languages
from languages import get_understood_languages from languages import get_understood_languages
from like import update_likes_collection from like import update_likes_collection
from reaction import update_reaction_collection from reaction import update_reaction_collection
from utils import get_account_timezone
from utils import set_account_timezone
from utils import load_account_timezones
from utils import local_network_host from utils import local_network_host
from utils import undo_reaction_collection_entry from utils import undo_reaction_collection_entry
from utils import get_new_post_endpoints from utils import get_new_post_endpoints
@ -3544,6 +3547,10 @@ class PubServer(BaseHTTPRequestHandler):
if search_str.startswith('#'): if search_str.startswith('#'):
nickname = get_nickname_from_actor(actor_str) nickname = get_nickname_from_actor(actor_str)
# hashtag search # hashtag search
timezone = None
if self.server.account_timezone.get(nickname):
timezone = \
self.server.account_timezone.get(nickname)
hashtag_str = \ hashtag_str = \
html_hashtag_search(self.server.css_cache, html_hashtag_search(self.server.css_cache,
nickname, domain, port, nickname, domain, port,
@ -3568,7 +3575,8 @@ class PubServer(BaseHTTPRequestHandler):
self.server.max_like_count, self.server.max_like_count,
self.server.signing_priv_key_pem, self.server.signing_priv_key_pem,
self.server.cw_lists, self.server.cw_lists,
self.server.lists_enabled) self.server.lists_enabled,
timezone)
if hashtag_str: if hashtag_str:
msg = hashtag_str.encode('utf-8') msg = hashtag_str.encode('utf-8')
msglen = len(msg) msglen = len(msg)
@ -3636,6 +3644,10 @@ class PubServer(BaseHTTPRequestHandler):
# your post history search # your post history search
nickname = get_nickname_from_actor(actor_str) nickname = get_nickname_from_actor(actor_str)
search_str = search_str.replace("'", '', 1).strip() search_str = search_str.replace("'", '', 1).strip()
timezone = None
if self.server.account_timezone.get(nickname):
timezone = \
self.server.account_timezone.get(nickname)
history_str = \ history_str = \
html_history_search(self.server.css_cache, html_history_search(self.server.css_cache,
self.server.translate, self.server.translate,
@ -3663,7 +3675,8 @@ class PubServer(BaseHTTPRequestHandler):
self.server.max_like_count, self.server.max_like_count,
self.server.signing_priv_key_pem, self.server.signing_priv_key_pem,
self.server.cw_lists, self.server.cw_lists,
self.server.lists_enabled) self.server.lists_enabled,
timezone)
if history_str: if history_str:
msg = history_str.encode('utf-8') msg = history_str.encode('utf-8')
msglen = len(msg) msglen = len(msg)
@ -3704,6 +3717,10 @@ class PubServer(BaseHTTPRequestHandler):
# bookmark search # bookmark search
nickname = get_nickname_from_actor(actor_str) nickname = get_nickname_from_actor(actor_str)
search_str = search_str.replace('-', '', 1).strip() search_str = search_str.replace('-', '', 1).strip()
timezone = None
if self.server.account_timezone.get(nickname):
timezone = \
self.server.account_timezone.get(nickname)
bookmarks_str = \ bookmarks_str = \
html_history_search(self.server.css_cache, html_history_search(self.server.css_cache,
self.server.translate, self.server.translate,
@ -3731,7 +3748,8 @@ class PubServer(BaseHTTPRequestHandler):
self.server.max_like_count, self.server.max_like_count,
self.server.signing_priv_key_pem, self.server.signing_priv_key_pem,
self.server.cw_lists, self.server.cw_lists,
self.server.lists_enabled) self.server.lists_enabled,
timezone)
if bookmarks_str: if bookmarks_str:
msg = bookmarks_str.encode('utf-8') msg = bookmarks_str.encode('utf-8')
msglen = len(msg) msglen = len(msg)
@ -3811,6 +3829,10 @@ class PubServer(BaseHTTPRequestHandler):
self.server.cached_webfingers self.server.cached_webfingers
recent_posts_cache = \ recent_posts_cache = \
self.server.recent_posts_cache self.server.recent_posts_cache
timezone = None
if self.server.account_timezone.get(nickname):
timezone = \
self.server.account_timezone.get(nickname)
profile_str = \ profile_str = \
html_profile_after_search(self.server.css_cache, html_profile_after_search(self.server.css_cache,
recent_posts_cache, recent_posts_cache,
@ -3840,7 +3862,8 @@ class PubServer(BaseHTTPRequestHandler):
self.server.max_like_count, self.server.max_like_count,
signing_priv_key_pem, signing_priv_key_pem,
self.server.cw_lists, self.server.cw_lists,
self.server.lists_enabled) self.server.lists_enabled,
timezone)
if profile_str: if profile_str:
msg = profile_str.encode('utf-8') msg = profile_str.encode('utf-8')
msglen = len(msg) msglen = len(msg)
@ -5604,6 +5627,24 @@ class PubServer(BaseHTTPRequestHandler):
set_actor_languages(base_dir, actor_json, '') set_actor_languages(base_dir, actor_json, '')
actor_changed = True actor_changed = True
# change time zone
timezone = \
get_account_timezone(base_dir, nickname, domain)
if fields.get('timeZone'):
if fields['timeZone'] != timezone:
set_account_timezone(base_dir,
nickname, domain,
fields['timeZone'])
self.server.account_timezone[nickname] = \
fields['timeZone']
actor_changed = True
else:
if timezone:
set_account_timezone(base_dir,
nickname, domain, '')
del self.server.account_timezone[nickname]
actor_changed = True
# change tox address # change tox address
current_tox_address = get_tox_address(actor_json) current_tox_address = get_tox_address(actor_json)
if fields.get('toxAddress'): if fields.get('toxAddress'):
@ -7835,6 +7876,10 @@ class PubServer(BaseHTTPRequestHandler):
nickname = nickname.split('/')[0] nickname = nickname.split('/')[0]
if '?' in nickname: if '?' in nickname:
nickname = nickname.split('?')[0] nickname = nickname.split('?')[0]
timezone = None
if self.server.account_timezone.get(nickname):
timezone = \
self.server.account_timezone.get(nickname)
hashtag_str = \ hashtag_str = \
html_hashtag_search(self.server.css_cache, html_hashtag_search(self.server.css_cache,
nickname, domain, port, nickname, domain, port,
@ -7857,7 +7902,8 @@ class PubServer(BaseHTTPRequestHandler):
self.server.max_like_count, self.server.max_like_count,
self.server.signing_priv_key_pem, self.server.signing_priv_key_pem,
self.server.cw_lists, self.server.cw_lists,
self.server.lists_enabled) self.server.lists_enabled,
timezone)
if hashtag_str: if hashtag_str:
msg = hashtag_str.encode('utf-8') msg = hashtag_str.encode('utf-8')
msglen = len(msg) msglen = len(msg)
@ -8047,6 +8093,10 @@ class PubServer(BaseHTTPRequestHandler):
follower_approval_active(base_dir, follower_approval_active(base_dir,
self.post_to_nickname, domain) self.post_to_nickname, domain)
show_repeats = not is_dm(announce_json) show_repeats = not is_dm(announce_json)
timezone = None
if self.server.account_timezone.get(self.post_to_nickname):
timezone = \
self.server.account_timezone.get(self.post_to_nickname)
individual_post_as_html(self.server.signing_priv_key_pem, False, individual_post_as_html(self.server.signing_priv_key_pem, False,
self.server.recent_posts_cache, self.server.recent_posts_cache,
self.server.max_recent_posts, self.server.max_recent_posts,
@ -8074,7 +8124,8 @@ class PubServer(BaseHTTPRequestHandler):
manually_approve_followers, manually_approve_followers,
False, True, False, False, True, False,
self.server.cw_lists, self.server.cw_lists,
self.server.lists_enabled) self.server.lists_enabled,
timezone)
actor_absolute = self._get_instance_url(calling_domain) + actor actor_absolute = self._get_instance_url(calling_domain) + actor
actor_path_str = \ actor_path_str = \
@ -8516,6 +8567,10 @@ class PubServer(BaseHTTPRequestHandler):
follower_approval_active(base_dir, follower_approval_active(base_dir,
self.post_to_nickname, domain) self.post_to_nickname, domain)
show_repeats = not is_dm(liked_post_json) show_repeats = not is_dm(liked_post_json)
timezone = None
if self.server.account_timezone.get(self.post_to_nickname):
timezone = \
self.server.account_timezone.get(self.post_to_nickname)
individual_post_as_html(self.server.signing_priv_key_pem, individual_post_as_html(self.server.signing_priv_key_pem,
False, False,
self.server.recent_posts_cache, self.server.recent_posts_cache,
@ -8545,7 +8600,8 @@ class PubServer(BaseHTTPRequestHandler):
manually_approve_followers, manually_approve_followers,
False, True, False, False, True, False,
self.server.cw_lists, self.server.cw_lists,
self.server.lists_enabled) self.server.lists_enabled,
timezone)
else: else:
print('WARN: Liked post not found: ' + liked_post_filename) print('WARN: Liked post not found: ' + liked_post_filename)
# clear the icon from the cache so that it gets updated # clear the icon from the cache so that it gets updated
@ -8674,6 +8730,10 @@ class PubServer(BaseHTTPRequestHandler):
follower_approval_active(base_dir, follower_approval_active(base_dir,
self.post_to_nickname, domain) self.post_to_nickname, domain)
show_repeats = not is_dm(liked_post_json) show_repeats = not is_dm(liked_post_json)
timezone = None
if self.server.account_timezone.get(self.post_to_nickname):
timezone = \
self.server.account_timezone.get(self.post_to_nickname)
individual_post_as_html(self.server.signing_priv_key_pem, individual_post_as_html(self.server.signing_priv_key_pem,
False, False,
self.server.recent_posts_cache, self.server.recent_posts_cache,
@ -8703,7 +8763,8 @@ class PubServer(BaseHTTPRequestHandler):
manually_approve_followers, manually_approve_followers,
False, True, False, False, True, False,
self.server.cw_lists, self.server.cw_lists,
self.server.lists_enabled) self.server.lists_enabled,
timezone)
else: else:
print('WARN: Unliked post not found: ' + liked_post_filename) print('WARN: Unliked post not found: ' + liked_post_filename)
# clear the icon from the cache so that it gets updated # clear the icon from the cache so that it gets updated
@ -8861,6 +8922,10 @@ class PubServer(BaseHTTPRequestHandler):
follower_approval_active(base_dir, follower_approval_active(base_dir,
self.post_to_nickname, domain) self.post_to_nickname, domain)
show_repeats = not is_dm(reaction_post_json) show_repeats = not is_dm(reaction_post_json)
timezone = None
if self.server.account_timezone.get(self.post_to_nickname):
timezone = \
self.server.account_timezone.get(self.post_to_nickname)
individual_post_as_html(self.server.signing_priv_key_pem, individual_post_as_html(self.server.signing_priv_key_pem,
False, False,
self.server.recent_posts_cache, self.server.recent_posts_cache,
@ -8890,7 +8955,8 @@ class PubServer(BaseHTTPRequestHandler):
manually_approve_followers, manually_approve_followers,
False, True, False, False, True, False,
self.server.cw_lists, self.server.cw_lists,
self.server.lists_enabled) self.server.lists_enabled,
timezone)
else: else:
print('WARN: Emoji reaction post not found: ' + print('WARN: Emoji reaction post not found: ' +
reaction_post_filename) reaction_post_filename)
@ -9038,6 +9104,10 @@ class PubServer(BaseHTTPRequestHandler):
follower_approval_active(base_dir, follower_approval_active(base_dir,
self.post_to_nickname, domain) self.post_to_nickname, domain)
show_repeats = not is_dm(reaction_post_json) show_repeats = not is_dm(reaction_post_json)
timezone = None
if self.server.account_timezone.get(self.post_to_nickname):
timezone = \
self.server.account_timezone.get(self.post_to_nickname)
individual_post_as_html(self.server.signing_priv_key_pem, individual_post_as_html(self.server.signing_priv_key_pem,
False, False,
self.server.recent_posts_cache, self.server.recent_posts_cache,
@ -9067,7 +9137,8 @@ class PubServer(BaseHTTPRequestHandler):
manually_approve_followers, manually_approve_followers,
False, True, False, False, True, False,
self.server.cw_lists, self.server.cw_lists,
self.server.lists_enabled) self.server.lists_enabled,
timezone)
else: else:
print('WARN: Unreaction post not found: ' + print('WARN: Unreaction post not found: ' +
reaction_post_filename) reaction_post_filename)
@ -9139,6 +9210,10 @@ class PubServer(BaseHTTPRequestHandler):
self._redirect_headers(actor_path_str, cookie, calling_domain) self._redirect_headers(actor_path_str, cookie, calling_domain)
return return
timezone = None
if self.server.account_timezone.get(self.post_to_nickname):
timezone = \
self.server.account_timezone.get(self.post_to_nickname)
msg = \ msg = \
html_emoji_reaction_picker(self.server.css_cache, html_emoji_reaction_picker(self.server.css_cache,
self.server.recent_posts_cache, self.server.recent_posts_cache,
@ -9163,7 +9238,8 @@ class PubServer(BaseHTTPRequestHandler):
self.server.signing_priv_key_pem, self.server.signing_priv_key_pem,
self.server.cw_lists, self.server.cw_lists,
self.server.lists_enabled, self.server.lists_enabled,
timeline_str, page_number) timeline_str, page_number,
timezone)
msg = msg.encode('utf-8') msg = msg.encode('utf-8')
msglen = len(msg) msglen = len(msg)
self._set_headers('text/html', msglen, self._set_headers('text/html', msglen,
@ -9260,6 +9336,10 @@ class PubServer(BaseHTTPRequestHandler):
follower_approval_active(base_dir, follower_approval_active(base_dir,
self.post_to_nickname, domain) self.post_to_nickname, domain)
show_repeats = not is_dm(bookmark_post_json) show_repeats = not is_dm(bookmark_post_json)
timezone = None
if self.server.account_timezone.get(self.post_to_nickname):
timezone = \
self.server.account_timezone.get(self.post_to_nickname)
individual_post_as_html(self.server.signing_priv_key_pem, individual_post_as_html(self.server.signing_priv_key_pem,
False, False,
self.server.recent_posts_cache, self.server.recent_posts_cache,
@ -9289,7 +9369,8 @@ class PubServer(BaseHTTPRequestHandler):
manually_approve_followers, manually_approve_followers,
False, True, False, False, True, False,
self.server.cw_lists, self.server.cw_lists,
self.server.lists_enabled) self.server.lists_enabled,
timezone)
else: else:
print('WARN: Bookmarked post not found: ' + bookmark_filename) print('WARN: Bookmarked post not found: ' + bookmark_filename)
# self._post_to_outbox(bookmark_json, # self._post_to_outbox(bookmark_json,
@ -9391,6 +9472,10 @@ class PubServer(BaseHTTPRequestHandler):
follower_approval_active(base_dir, follower_approval_active(base_dir,
self.post_to_nickname, domain) self.post_to_nickname, domain)
show_repeats = not is_dm(bookmark_post_json) show_repeats = not is_dm(bookmark_post_json)
timezone = None
if self.server.account_timezone.get(self.post_to_nickname):
timezone = \
self.server.account_timezone.get(self.post_to_nickname)
individual_post_as_html(self.server.signing_priv_key_pem, individual_post_as_html(self.server.signing_priv_key_pem,
False, False,
self.server.recent_posts_cache, self.server.recent_posts_cache,
@ -9420,7 +9505,8 @@ class PubServer(BaseHTTPRequestHandler):
manually_approve_followers, manually_approve_followers,
False, True, False, False, True, False,
self.server.cw_lists, self.server.cw_lists,
self.server.lists_enabled) self.server.lists_enabled,
timezone)
else: else:
print('WARN: Unbookmarked post not found: ' + print('WARN: Unbookmarked post not found: ' +
bookmark_filename) bookmark_filename)
@ -9596,6 +9682,10 @@ class PubServer(BaseHTTPRequestHandler):
allow_downloads = False allow_downloads = False
show_avatar_options = True show_avatar_options = True
avatar_url = None avatar_url = None
timezone = None
if self.server.account_timezone.get(nickname):
timezone = \
self.server.account_timezone.get(nickname)
individual_post_as_html(self.server.signing_priv_key_pem, individual_post_as_html(self.server.signing_priv_key_pem,
allow_downloads, allow_downloads,
self.server.recent_posts_cache, self.server.recent_posts_cache,
@ -9626,7 +9716,8 @@ class PubServer(BaseHTTPRequestHandler):
show_public_only, store_to_cache, show_public_only, store_to_cache,
use_cache_only, use_cache_only,
self.server.cw_lists, self.server.cw_lists,
self.server.lists_enabled) self.server.lists_enabled,
timezone)
else: else:
print('WARN: Muted post not found: ' + mute_filename) print('WARN: Muted post not found: ' + mute_filename)
@ -9707,6 +9798,10 @@ class PubServer(BaseHTTPRequestHandler):
allow_downloads = False allow_downloads = False
show_avatar_options = True show_avatar_options = True
avatar_url = None avatar_url = None
timezone = None
if self.server.account_timezone.get(nickname):
timezone = \
self.server.account_timezone.get(nickname)
individual_post_as_html(self.server.signing_priv_key_pem, individual_post_as_html(self.server.signing_priv_key_pem,
allow_downloads, allow_downloads,
self.server.recent_posts_cache, self.server.recent_posts_cache,
@ -9737,7 +9832,8 @@ class PubServer(BaseHTTPRequestHandler):
show_public_only, store_to_cache, show_public_only, store_to_cache,
use_cache_only, use_cache_only,
self.server.cw_lists, self.server.cw_lists,
self.server.lists_enabled) self.server.lists_enabled,
timezone)
else: else:
print('WARN: Unmuted post not found: ' + mute_filename) print('WARN: Unmuted post not found: ' + mute_filename)
if calling_domain.endswith('.onion') and onion_domain: if calling_domain.endswith('.onion') and onion_domain:
@ -9830,6 +9926,10 @@ class PubServer(BaseHTTPRequestHandler):
twitter_replacement_domain = \ twitter_replacement_domain = \
self.server.twitter_replacement_domain self.server.twitter_replacement_domain
peertube_instances = self.server.peertube_instances peertube_instances = self.server.peertube_instances
timezone = None
if self.server.account_timezone.get(nickname):
timezone = \
self.server.account_timezone.get(nickname)
msg = \ msg = \
html_post_replies(self.server.css_cache, html_post_replies(self.server.css_cache,
recent_posts_cache, recent_posts_cache,
@ -9855,7 +9955,8 @@ class PubServer(BaseHTTPRequestHandler):
self.server.max_like_count, self.server.max_like_count,
self.server.signing_priv_key_pem, self.server.signing_priv_key_pem,
self.server.cw_lists, self.server.cw_lists,
self.server.lists_enabled) self.server.lists_enabled,
timezone)
msg = msg.encode('utf-8') msg = msg.encode('utf-8')
msglen = len(msg) msglen = len(msg)
self._set_headers('text/html', msglen, self._set_headers('text/html', msglen,
@ -9922,6 +10023,10 @@ class PubServer(BaseHTTPRequestHandler):
twitter_replacement_domain = \ twitter_replacement_domain = \
self.server.twitter_replacement_domain self.server.twitter_replacement_domain
peertube_instances = self.server.peertube_instances peertube_instances = self.server.peertube_instances
timezone = None
if self.server.account_timezone.get(nickname):
timezone = \
self.server.account_timezone.get(nickname)
msg = \ msg = \
html_post_replies(self.server.css_cache, html_post_replies(self.server.css_cache,
recent_posts_cache, recent_posts_cache,
@ -9947,7 +10052,8 @@ class PubServer(BaseHTTPRequestHandler):
self.server.max_like_count, self.server.max_like_count,
self.server.signing_priv_key_pem, self.server.signing_priv_key_pem,
self.server.cw_lists, self.server.cw_lists,
self.server.lists_enabled) self.server.lists_enabled,
timezone)
msg = msg.encode('utf-8') msg = msg.encode('utf-8')
msglen = len(msg) msglen = len(msg)
self._set_headers('text/html', msglen, self._set_headers('text/html', msglen,
@ -10027,6 +10133,11 @@ class PubServer(BaseHTTPRequestHandler):
base_dir, nickname, domain) base_dir, nickname, domain)
shared_items_federated_domains = \ shared_items_federated_domains = \
self.server.shared_items_federated_domains self.server.shared_items_federated_domains
timezone = None
if self.server.account_timezone.get(nickname):
timezone = \
self.server.account_timezone.get(nickname)
msg = \ msg = \
html_profile(self.server.signing_priv_key_pem, html_profile(self.server.signing_priv_key_pem,
self.server.rss_icon_at_top, self.server.rss_icon_at_top,
@ -10059,7 +10170,8 @@ class PubServer(BaseHTTPRequestHandler):
roles_list, roles_list,
None, None, self.server.cw_lists, None, None, self.server.cw_lists,
self.server.lists_enabled, self.server.lists_enabled,
self.server.content_license_url) self.server.content_license_url,
timezone)
msg = msg.encode('utf-8') msg = msg.encode('utf-8')
msglen = len(msg) msglen = len(msg)
self._set_headers('text/html', msglen, self._set_headers('text/html', msglen,
@ -10146,6 +10258,11 @@ class PubServer(BaseHTTPRequestHandler):
self.server.content_license_url self.server.content_license_url
peertube_instances = \ peertube_instances = \
self.server.peertube_instances self.server.peertube_instances
timezone = None
nick = nickname
if self.server.account_timezone.get(nick):
timezone = \
self.server.account_timezone.get(nick)
msg = \ msg = \
html_profile(signing_priv_key_pem, html_profile(signing_priv_key_pem,
self.server.rss_icon_at_top, self.server.rss_icon_at_top,
@ -10179,7 +10296,8 @@ class PubServer(BaseHTTPRequestHandler):
None, None, None, None,
self.server.cw_lists, self.server.cw_lists,
self.server.lists_enabled, self.server.lists_enabled,
content_license_url) content_license_url,
timezone)
msg = msg.encode('utf-8') msg = msg.encode('utf-8')
msglen = len(msg) msglen = len(msg)
self._set_headers('text/html', msglen, self._set_headers('text/html', msglen,
@ -10320,6 +10438,10 @@ class PubServer(BaseHTTPRequestHandler):
return True return True
remove_post_interactions(pjo, True) remove_post_interactions(pjo, True)
if self._request_http(): if self._request_http():
timezone = None
if self.server.account_timezone.get(nickname):
timezone = \
self.server.account_timezone.get(nickname)
msg = \ msg = \
html_individual_post(self.server.css_cache, html_individual_post(self.server.css_cache,
self.server.recent_posts_cache, self.server.recent_posts_cache,
@ -10345,7 +10467,8 @@ class PubServer(BaseHTTPRequestHandler):
self.server.max_like_count, self.server.max_like_count,
self.server.signing_priv_key_pem, self.server.signing_priv_key_pem,
self.server.cw_lists, self.server.cw_lists,
self.server.lists_enabled) self.server.lists_enabled,
timezone)
msg = msg.encode('utf-8') msg = msg.encode('utf-8')
msglen = len(msg) msglen = len(msg)
self._set_headers('text/html', msglen, self._set_headers('text/html', msglen,
@ -10573,6 +10696,10 @@ class PubServer(BaseHTTPRequestHandler):
self.server.shared_items_federated_domains self.server.shared_items_federated_domains
allow_local_network_access = \ allow_local_network_access = \
self.server.allow_local_network_access self.server.allow_local_network_access
timezone = None
if self.server.account_timezone.get(nickname):
timezone = \
self.server.account_timezone.get(nickname)
msg = html_inbox(self.server.css_cache, msg = html_inbox(self.server.css_cache,
default_timeline, default_timeline,
recent_posts_cache, recent_posts_cache,
@ -10612,7 +10739,8 @@ class PubServer(BaseHTTPRequestHandler):
shared_items_federated_domains, shared_items_federated_domains,
self.server.signing_priv_key_pem, self.server.signing_priv_key_pem,
self.server.cw_lists, self.server.cw_lists,
self.server.lists_enabled) self.server.lists_enabled,
timezone)
if getreq_start_time: if getreq_start_time:
fitness_performance(getreq_start_time, fitness_performance(getreq_start_time,
self.server.fitness, self.server.fitness,
@ -10727,6 +10855,10 @@ class PubServer(BaseHTTPRequestHandler):
self.server.twitter_replacement_domain self.server.twitter_replacement_domain
show_published_date_only = \ show_published_date_only = \
self.server.show_published_date_only self.server.show_published_date_only
timezone = None
if self.server.account_timezone.get(nickname):
timezone = \
self.server.account_timezone.get(nickname)
msg = \ msg = \
html_inbox_dms(self.server.css_cache, html_inbox_dms(self.server.css_cache,
self.server.default_timeline, self.server.default_timeline,
@ -10766,7 +10898,8 @@ class PubServer(BaseHTTPRequestHandler):
shared_items_federated_domains, shared_items_federated_domains,
self.server.signing_priv_key_pem, self.server.signing_priv_key_pem,
self.server.cw_lists, self.server.cw_lists,
self.server.lists_enabled) self.server.lists_enabled,
timezone)
msg = msg.encode('utf-8') msg = msg.encode('utf-8')
msglen = len(msg) msglen = len(msg)
self._set_headers('text/html', msglen, self._set_headers('text/html', msglen,
@ -10874,6 +11007,10 @@ class PubServer(BaseHTTPRequestHandler):
self.server.twitter_replacement_domain self.server.twitter_replacement_domain
show_published_date_only = \ show_published_date_only = \
self.server.show_published_date_only self.server.show_published_date_only
timezone = None
if self.server.account_timezone.get(nickname):
timezone = \
self.server.account_timezone.get(nickname)
msg = \ msg = \
html_inbox_replies(self.server.css_cache, html_inbox_replies(self.server.css_cache,
self.server.default_timeline, self.server.default_timeline,
@ -10913,7 +11050,8 @@ class PubServer(BaseHTTPRequestHandler):
shared_items_federated_domains, shared_items_federated_domains,
self.server.signing_priv_key_pem, self.server.signing_priv_key_pem,
self.server.cw_lists, self.server.cw_lists,
self.server.lists_enabled) self.server.lists_enabled,
timezone)
msg = msg.encode('utf-8') msg = msg.encode('utf-8')
msglen = len(msg) msglen = len(msg)
self._set_headers('text/html', msglen, self._set_headers('text/html', msglen,
@ -11018,6 +11156,10 @@ class PubServer(BaseHTTPRequestHandler):
self.server.allow_local_network_access self.server.allow_local_network_access
twitter_replacement_domain = \ twitter_replacement_domain = \
self.server.twitter_replacement_domain self.server.twitter_replacement_domain
timezone = None
if self.server.account_timezone.get(nickname):
timezone = \
self.server.account_timezone.get(nickname)
msg = \ msg = \
html_inbox_media(self.server.css_cache, html_inbox_media(self.server.css_cache,
self.server.default_timeline, self.server.default_timeline,
@ -11058,7 +11200,8 @@ class PubServer(BaseHTTPRequestHandler):
fed_domains, fed_domains,
self.server.signing_priv_key_pem, self.server.signing_priv_key_pem,
self.server.cw_lists, self.server.cw_lists,
self.server.lists_enabled) self.server.lists_enabled,
timezone)
msg = msg.encode('utf-8') msg = msg.encode('utf-8')
msglen = len(msg) msglen = len(msg)
self._set_headers('text/html', msglen, self._set_headers('text/html', msglen,
@ -11163,6 +11306,10 @@ class PubServer(BaseHTTPRequestHandler):
self.server.allow_local_network_access self.server.allow_local_network_access
twitter_replacement_domain = \ twitter_replacement_domain = \
self.server.twitter_replacement_domain self.server.twitter_replacement_domain
timezone = None
if self.server.account_timezone.get(nickname):
timezone = \
self.server.account_timezone.get(nickname)
msg = \ msg = \
html_inbox_blogs(self.server.css_cache, html_inbox_blogs(self.server.css_cache,
self.server.default_timeline, self.server.default_timeline,
@ -11203,7 +11350,8 @@ class PubServer(BaseHTTPRequestHandler):
fed_domains, fed_domains,
self.server.signing_priv_key_pem, self.server.signing_priv_key_pem,
self.server.cw_lists, self.server.cw_lists,
self.server.lists_enabled) self.server.lists_enabled,
timezone)
msg = msg.encode('utf-8') msg = msg.encode('utf-8')
msglen = len(msg) msglen = len(msg)
self._set_headers('text/html', msglen, self._set_headers('text/html', msglen,
@ -11316,6 +11464,10 @@ class PubServer(BaseHTTPRequestHandler):
fed_domains = \ fed_domains = \
self.server.shared_items_federated_domains self.server.shared_items_federated_domains
timezone = None
if self.server.account_timezone.get(nickname):
timezone = \
self.server.account_timezone.get(nickname)
msg = \ msg = \
html_inbox_news(self.server.css_cache, html_inbox_news(self.server.css_cache,
self.server.default_timeline, self.server.default_timeline,
@ -11357,7 +11509,8 @@ class PubServer(BaseHTTPRequestHandler):
fed_domains, fed_domains,
self.server.signing_priv_key_pem, self.server.signing_priv_key_pem,
self.server.cw_lists, self.server.cw_lists,
self.server.lists_enabled) self.server.lists_enabled,
timezone)
msg = msg.encode('utf-8') msg = msg.encode('utf-8')
msglen = len(msg) msglen = len(msg)
self._set_headers('text/html', msglen, self._set_headers('text/html', msglen,
@ -11473,6 +11626,10 @@ class PubServer(BaseHTTPRequestHandler):
self.server.twitter_replacement_domain self.server.twitter_replacement_domain
show_published_date_only = \ show_published_date_only = \
self.server.show_published_date_only self.server.show_published_date_only
timezone = None
if self.server.account_timezone.get(nickname):
timezone = \
self.server.account_timezone.get(nickname)
msg = \ msg = \
html_inbox_features(self.server.css_cache, html_inbox_features(self.server.css_cache,
self.server.default_timeline, self.server.default_timeline,
@ -11514,7 +11671,8 @@ class PubServer(BaseHTTPRequestHandler):
shared_items_federated_domains, shared_items_federated_domains,
self.server.signing_priv_key_pem, self.server.signing_priv_key_pem,
self.server.cw_lists, self.server.cw_lists,
self.server.lists_enabled) self.server.lists_enabled,
timezone)
msg = msg.encode('utf-8') msg = msg.encode('utf-8')
msglen = len(msg) msglen = len(msg)
self._set_headers('text/html', msglen, self._set_headers('text/html', msglen,
@ -11585,6 +11743,10 @@ class PubServer(BaseHTTPRequestHandler):
full_width_tl_button_header = \ full_width_tl_button_header = \
self.server.full_width_tl_button_header self.server.full_width_tl_button_header
timezone = None
if self.server.account_timezone.get(nickname):
timezone = \
self.server.account_timezone.get(nickname)
msg = \ msg = \
html_shares(self.server.css_cache, html_shares(self.server.css_cache,
self.server.default_timeline, self.server.default_timeline,
@ -11622,7 +11784,7 @@ class PubServer(BaseHTTPRequestHandler):
self.server.shared_items_federated_domains, self.server.shared_items_federated_domains,
self.server.signing_priv_key_pem, self.server.signing_priv_key_pem,
self.server.cw_lists, self.server.cw_lists,
self.server.lists_enabled) self.server.lists_enabled, timezone)
msg = msg.encode('utf-8') msg = msg.encode('utf-8')
msglen = len(msg) msglen = len(msg)
self._set_headers('text/html', msglen, self._set_headers('text/html', msglen,
@ -11670,6 +11832,10 @@ class PubServer(BaseHTTPRequestHandler):
self.server.key_shortcuts[nickname] self.server.key_shortcuts[nickname]
full_width_tl_button_header = \ full_width_tl_button_header = \
self.server.full_width_tl_button_header self.server.full_width_tl_button_header
timezone = None
if self.server.account_timezone.get(nickname):
timezone = \
self.server.account_timezone.get(nickname)
msg = \ msg = \
html_wanted(self.server.css_cache, html_wanted(self.server.css_cache,
self.server.default_timeline, self.server.default_timeline,
@ -11707,7 +11873,8 @@ class PubServer(BaseHTTPRequestHandler):
self.server.shared_items_federated_domains, self.server.shared_items_federated_domains,
self.server.signing_priv_key_pem, self.server.signing_priv_key_pem,
self.server.cw_lists, self.server.cw_lists,
self.server.lists_enabled) self.server.lists_enabled,
timezone)
msg = msg.encode('utf-8') msg = msg.encode('utf-8')
msglen = len(msg) msglen = len(msg)
self._set_headers('text/html', msglen, self._set_headers('text/html', msglen,
@ -11794,6 +11961,10 @@ class PubServer(BaseHTTPRequestHandler):
self.server.twitter_replacement_domain self.server.twitter_replacement_domain
show_published_date_only = \ show_published_date_only = \
self.server.show_published_date_only self.server.show_published_date_only
timezone = None
if self.server.account_timezone.get(nickname):
timezone = \
self.server.account_timezone.get(nickname)
msg = \ msg = \
html_bookmarks(self.server.css_cache, html_bookmarks(self.server.css_cache,
self.server.default_timeline, self.server.default_timeline,
@ -11834,7 +12005,8 @@ class PubServer(BaseHTTPRequestHandler):
shared_items_federated_domains, shared_items_federated_domains,
self.server.signing_priv_key_pem, self.server.signing_priv_key_pem,
self.server.cw_lists, self.server.cw_lists,
self.server.lists_enabled) self.server.lists_enabled,
timezone)
msg = msg.encode('utf-8') msg = msg.encode('utf-8')
msglen = len(msg) msglen = len(msg)
self._set_headers('text/html', msglen, self._set_headers('text/html', msglen,
@ -11934,6 +12106,10 @@ class PubServer(BaseHTTPRequestHandler):
access_keys = \ access_keys = \
self.server.key_shortcuts[nickname] self.server.key_shortcuts[nickname]
timezone = None
if self.server.account_timezone.get(nickname):
timezone = \
self.server.account_timezone.get(nickname)
msg = \ msg = \
html_outbox(self.server.css_cache, html_outbox(self.server.css_cache,
self.server.default_timeline, self.server.default_timeline,
@ -11972,7 +12148,8 @@ class PubServer(BaseHTTPRequestHandler):
self.server.shared_items_federated_domains, self.server.shared_items_federated_domains,
self.server.signing_priv_key_pem, self.server.signing_priv_key_pem,
self.server.cw_lists, self.server.cw_lists,
self.server.lists_enabled) self.server.lists_enabled,
timezone)
msg = msg.encode('utf-8') msg = msg.encode('utf-8')
msglen = len(msg) msglen = len(msg)
self._set_headers('text/html', msglen, self._set_headers('text/html', msglen,
@ -12068,6 +12245,10 @@ class PubServer(BaseHTTPRequestHandler):
self.server.allow_local_network_access self.server.allow_local_network_access
show_published_date_only = \ show_published_date_only = \
self.server.show_published_date_only self.server.show_published_date_only
timezone = None
if self.server.account_timezone.get(nickname):
timezone = \
self.server.account_timezone.get(nickname)
msg = \ msg = \
html_moderation(self.server.css_cache, html_moderation(self.server.css_cache,
self.server.default_timeline, self.server.default_timeline,
@ -12107,7 +12288,8 @@ class PubServer(BaseHTTPRequestHandler):
shared_items_federated_domains, shared_items_federated_domains,
self.server.signing_priv_key_pem, self.server.signing_priv_key_pem,
self.server.cw_lists, self.server.cw_lists,
self.server.lists_enabled) self.server.lists_enabled,
timezone)
msg = msg.encode('utf-8') msg = msg.encode('utf-8')
msglen = len(msg) msglen = len(msg)
self._set_headers('text/html', msglen, self._set_headers('text/html', msglen,
@ -12198,6 +12380,10 @@ class PubServer(BaseHTTPRequestHandler):
base_dir, nickname, domain) base_dir, nickname, domain)
shared_items_federated_domains = \ shared_items_federated_domains = \
self.server.shared_items_federated_domains self.server.shared_items_federated_domains
timezone = None
if self.server.account_timezone.get(nickname):
timezone = \
self.server.account_timezone.get(nickname)
msg = \ msg = \
html_profile(self.server.signing_priv_key_pem, html_profile(self.server.signing_priv_key_pem,
self.server.rss_icon_at_top, self.server.rss_icon_at_top,
@ -12232,7 +12418,8 @@ class PubServer(BaseHTTPRequestHandler):
page_number, SHARES_PER_PAGE, page_number, SHARES_PER_PAGE,
self.server.cw_lists, self.server.cw_lists,
self.server.lists_enabled, self.server.lists_enabled,
self.server.content_license_url) self.server.content_license_url,
timezone)
msg = msg.encode('utf-8') msg = msg.encode('utf-8')
msglen = len(msg) msglen = len(msg)
self._set_headers('text/html', msglen, self._set_headers('text/html', msglen,
@ -12307,6 +12494,7 @@ class PubServer(BaseHTTPRequestHandler):
access_keys = self.server.access_keys access_keys = self.server.access_keys
city = None city = None
timezone = None
if '/users/' in path: if '/users/' in path:
nickname = path.split('/users/')[1] nickname = path.split('/users/')[1]
if '/' in nickname: if '/' in nickname:
@ -12317,6 +12505,9 @@ class PubServer(BaseHTTPRequestHandler):
city = get_spoofed_city(self.server.city, city = get_spoofed_city(self.server.city,
base_dir, nickname, domain) base_dir, nickname, domain)
if self.server.account_timezone.get(nickname):
timezone = \
self.server.account_timezone.get(nickname)
content_license_url = \ content_license_url = \
self.server.content_license_url self.server.content_license_url
shared_items_federated_domains = \ shared_items_federated_domains = \
@ -12356,7 +12547,8 @@ class PubServer(BaseHTTPRequestHandler):
FOLLOWS_PER_PAGE, FOLLOWS_PER_PAGE,
self.server.cw_lists, self.server.cw_lists,
self.server.lists_enabled, self.server.lists_enabled,
content_license_url).encode('utf-8') content_license_url,
timezone).encode('utf-8')
msglen = len(msg) msglen = len(msg)
self._set_headers('text/html', self._set_headers('text/html',
msglen, cookie, calling_domain, False) msglen, cookie, calling_domain, False)
@ -12428,6 +12620,7 @@ class PubServer(BaseHTTPRequestHandler):
access_keys = self.server.access_keys access_keys = self.server.access_keys
city = None city = None
timezone = None
if '/users/' in path: if '/users/' in path:
nickname = path.split('/users/')[1] nickname = path.split('/users/')[1]
if '/' in nickname: if '/' in nickname:
@ -12438,6 +12631,9 @@ class PubServer(BaseHTTPRequestHandler):
city = get_spoofed_city(self.server.city, city = get_spoofed_city(self.server.city,
base_dir, nickname, domain) base_dir, nickname, domain)
if self.server.account_timezone.get(nickname):
timezone = \
self.server.account_timezone.get(nickname)
content_license_url = \ content_license_url = \
self.server.content_license_url self.server.content_license_url
shared_items_federated_domains = \ shared_items_federated_domains = \
@ -12478,7 +12674,8 @@ class PubServer(BaseHTTPRequestHandler):
FOLLOWS_PER_PAGE, FOLLOWS_PER_PAGE,
self.server.cw_lists, self.server.cw_lists,
self.server.lists_enabled, self.server.lists_enabled,
content_license_url).encode('utf-8') content_license_url,
timezone).encode('utf-8')
msglen = len(msg) msglen = len(msg)
self._set_headers('text/html', msglen, self._set_headers('text/html', msglen,
cookie, calling_domain, False) cookie, calling_domain, False)
@ -12568,6 +12765,7 @@ class PubServer(BaseHTTPRequestHandler):
access_keys = self.server.access_keys access_keys = self.server.access_keys
city = None city = None
timezone = None
if '/users/' in path: if '/users/' in path:
nickname = path.split('/users/')[1] nickname = path.split('/users/')[1]
if '/' in nickname: if '/' in nickname:
@ -12578,6 +12776,9 @@ class PubServer(BaseHTTPRequestHandler):
city = get_spoofed_city(self.server.city, city = get_spoofed_city(self.server.city,
base_dir, nickname, domain) base_dir, nickname, domain)
if self.server.account_timezone.get(nickname):
timezone = \
self.server.account_timezone.get(nickname)
msg = \ msg = \
html_profile(self.server.signing_priv_key_pem, html_profile(self.server.signing_priv_key_pem,
self.server.rss_icon_at_top, self.server.rss_icon_at_top,
@ -12612,7 +12813,8 @@ class PubServer(BaseHTTPRequestHandler):
None, None, None, None, None, None,
self.server.cw_lists, self.server.cw_lists,
self.server.lists_enabled, self.server.lists_enabled,
self.server.content_license_url).encode('utf-8') self.server.content_license_url,
timezone).encode('utf-8')
msglen = len(msg) msglen = len(msg)
self._set_headers('text/html', msglen, self._set_headers('text/html', msglen,
cookie, calling_domain, False) cookie, calling_domain, False)
@ -19217,6 +19419,8 @@ def run_daemon(dyslexic_font: bool,
# scan the theme directory for any svg files containing scripts # scan the theme directory for any svg files containing scripts
assert not scan_themes_for_scripts(base_dir) assert not scan_themes_for_scripts(base_dir)
httpd.account_timezone = load_account_timezones(base_dir)
httpd.post_to_nickname = None httpd.post_to_nickname = None
httpd.nodeinfo_is_active = False httpd.nodeinfo_is_active = False

View File

@ -1362,7 +1362,7 @@ def run_desktop_client(base_dir: str, proxy_type: str, http_prefix: str,
content_license_url = 'https://creativecommons.org/licenses/by/4.0' content_license_url = 'https://creativecommons.org/licenses/by/4.0'
blocked_cache = {} blocked_cache = {}
languages_understood = [system_language] languages_understood = []
indent = ' ' indent = ' '
if show_new_posts: if show_new_posts:

View File

@ -263,7 +263,12 @@ parser.add_argument('--twitterdomain', dest='twitter_replacement_domain',
help='Domain used to replace twitter.com') help='Domain used to replace twitter.com')
parser.add_argument('--language', dest='language', parser.add_argument('--language', dest='language',
type=str, default=None, type=str, default=None,
help='Language code, eg. en/fr/de/es') help='Specify a single language code, ' +
'eg. "en" or "fr" or "de"')
parser.add_argument('--languagesUnderstood', dest='languages_understood',
type=str, default=None,
help='List of the default languages understood eg. ' +
'"en / fr"')
parser.add_argument('-a', '--addaccount', dest='addaccount', parser.add_argument('-a', '--addaccount', dest='addaccount',
type=str, default=None, type=str, default=None,
help='Adds a new account') help='Adds a new account')
@ -1394,7 +1399,8 @@ if args.message:
signing_priv_key_pem = None signing_priv_key_pem = None
if args.secure_mode: if args.secure_mode:
signing_priv_key_pem = get_instance_actor_key(base_dir, domain) signing_priv_key_pem = get_instance_actor_key(base_dir, domain)
languages_understood = [args.language] if args.languages_understood:
languages_understood = [args.languages_understood]
print('Sending post to ' + args.sendto) print('Sending post to ' + args.sendto)
send_post_via_server(signing_priv_key_pem, __version__, send_post_via_server(signing_priv_key_pem, __version__,

View File

@ -17,6 +17,7 @@ from languages import understood_post_language
from like import update_likes_collection from like import update_likes_collection
from reaction import update_reaction_collection from reaction import update_reaction_collection
from reaction import valid_emoji_content from reaction import valid_emoji_content
from utils import get_account_timezone
from utils import domain_permitted from utils import domain_permitted
from utils import is_group_account from utils import is_group_account
from utils import is_system_account from utils import is_system_account
@ -294,7 +295,8 @@ def _inbox_store_post_to_html_cache(recent_posts_cache: {},
max_like_count: int, max_like_count: int,
signing_priv_key_pem: str, signing_priv_key_pem: str,
cw_lists: {}, cw_lists: {},
lists_enabled: str) -> None: lists_enabled: str,
timezone: str) -> None:
"""Converts the json post into html and stores it in a cache """Converts the json post into html and stores it in a cache
This enables the post to be quickly displayed later This enables the post to be quickly displayed later
""" """
@ -319,7 +321,7 @@ def _inbox_store_post_to_html_cache(recent_posts_cache: {},
peertube_instances, allow_local_network_access, peertube_instances, allow_local_network_access,
theme_name, system_language, max_like_count, theme_name, system_language, max_like_count,
not_dm, True, True, False, True, False, not_dm, True, True, False, True, False,
cw_lists, lists_enabled) cw_lists, lists_enabled, timezone)
def valid_inbox(base_dir: str, nickname: str, domain: str) -> bool: def valid_inbox(base_dir: str, nickname: str, domain: str) -> bool:
@ -1100,6 +1102,7 @@ def _receive_like(recent_posts_cache: {},
manually_approve_followers = \ manually_approve_followers = \
follower_approval_active(base_dir, handle_name, domain) follower_approval_active(base_dir, handle_name, domain)
not_dm = not is_dm(liked_post_json) not_dm = not is_dm(liked_post_json)
timezone = get_account_timezone(base_dir, handle_name, domain)
individual_post_as_html(signing_priv_key_pem, False, individual_post_as_html(signing_priv_key_pem, False,
recent_posts_cache, max_recent_posts, recent_posts_cache, max_recent_posts,
translate, page_number, base_dir, translate, page_number, base_dir,
@ -1118,7 +1121,7 @@ def _receive_like(recent_posts_cache: {},
show_individual_post_icons, show_individual_post_icons,
manually_approve_followers, manually_approve_followers,
False, True, False, cw_lists, False, True, False, cw_lists,
lists_enabled) lists_enabled, timezone)
return True return True
@ -1213,6 +1216,7 @@ def _receive_undo_like(recent_posts_cache: {},
manually_approve_followers = \ manually_approve_followers = \
follower_approval_active(base_dir, handle_name, domain) follower_approval_active(base_dir, handle_name, domain)
not_dm = not is_dm(liked_post_json) not_dm = not is_dm(liked_post_json)
timezone = get_account_timezone(base_dir, handle_name, domain)
individual_post_as_html(signing_priv_key_pem, False, individual_post_as_html(signing_priv_key_pem, False,
recent_posts_cache, max_recent_posts, recent_posts_cache, max_recent_posts,
translate, page_number, base_dir, translate, page_number, base_dir,
@ -1231,7 +1235,7 @@ def _receive_undo_like(recent_posts_cache: {},
show_individual_post_icons, show_individual_post_icons,
manually_approve_followers, manually_approve_followers,
False, True, False, cw_lists, False, True, False, cw_lists,
lists_enabled) lists_enabled, timezone)
return True return True
@ -1362,6 +1366,7 @@ def _receive_reaction(recent_posts_cache: {},
manually_approve_followers = \ manually_approve_followers = \
follower_approval_active(base_dir, handle_name, domain) follower_approval_active(base_dir, handle_name, domain)
not_dm = not is_dm(reaction_post_json) not_dm = not is_dm(reaction_post_json)
timezone = get_account_timezone(base_dir, handle_name, domain)
individual_post_as_html(signing_priv_key_pem, False, individual_post_as_html(signing_priv_key_pem, False,
recent_posts_cache, max_recent_posts, recent_posts_cache, max_recent_posts,
translate, page_number, base_dir, translate, page_number, base_dir,
@ -1381,7 +1386,7 @@ def _receive_reaction(recent_posts_cache: {},
show_individual_post_icons, show_individual_post_icons,
manually_approve_followers, manually_approve_followers,
False, True, False, cw_lists, False, True, False, cw_lists,
lists_enabled) lists_enabled, timezone)
return True return True
@ -1495,6 +1500,7 @@ def _receive_undo_reaction(recent_posts_cache: {},
manually_approve_followers = \ manually_approve_followers = \
follower_approval_active(base_dir, handle_name, domain) follower_approval_active(base_dir, handle_name, domain)
not_dm = not is_dm(reaction_post_json) not_dm = not is_dm(reaction_post_json)
timezone = get_account_timezone(base_dir, handle_name, domain)
individual_post_as_html(signing_priv_key_pem, False, individual_post_as_html(signing_priv_key_pem, False,
recent_posts_cache, max_recent_posts, recent_posts_cache, max_recent_posts,
translate, page_number, base_dir, translate, page_number, base_dir,
@ -1514,7 +1520,7 @@ def _receive_undo_reaction(recent_posts_cache: {},
show_individual_post_icons, show_individual_post_icons,
manually_approve_followers, manually_approve_followers,
False, True, False, cw_lists, False, True, False, cw_lists,
lists_enabled) lists_enabled, timezone)
return True return True
@ -1606,6 +1612,7 @@ def _receive_bookmark(recent_posts_cache: {},
manually_approve_followers = \ manually_approve_followers = \
follower_approval_active(base_dir, nickname, domain) follower_approval_active(base_dir, nickname, domain)
not_dm = not is_dm(bookmarked_post_json) not_dm = not is_dm(bookmarked_post_json)
timezone = get_account_timezone(base_dir, nickname, domain)
individual_post_as_html(signing_priv_key_pem, False, individual_post_as_html(signing_priv_key_pem, False,
recent_posts_cache, max_recent_posts, recent_posts_cache, max_recent_posts,
translate, page_number, base_dir, translate, page_number, base_dir,
@ -1624,7 +1631,7 @@ def _receive_bookmark(recent_posts_cache: {},
show_individual_post_icons, show_individual_post_icons,
manually_approve_followers, manually_approve_followers,
False, True, False, cw_lists, False, True, False, cw_lists,
lists_enabled) lists_enabled, timezone)
return True return True
@ -1720,6 +1727,7 @@ def _receive_undo_bookmark(recent_posts_cache: {},
manually_approve_followers = \ manually_approve_followers = \
follower_approval_active(base_dir, nickname, domain) follower_approval_active(base_dir, nickname, domain)
not_dm = not is_dm(bookmarked_post_json) not_dm = not is_dm(bookmarked_post_json)
timezone = get_account_timezone(base_dir, nickname, domain)
individual_post_as_html(signing_priv_key_pem, False, individual_post_as_html(signing_priv_key_pem, False,
recent_posts_cache, max_recent_posts, recent_posts_cache, max_recent_posts,
translate, page_number, base_dir, translate, page_number, base_dir,
@ -1737,7 +1745,8 @@ def _receive_undo_bookmark(recent_posts_cache: {},
max_like_count, not_dm, max_like_count, not_dm,
show_individual_post_icons, show_individual_post_icons,
manually_approve_followers, manually_approve_followers,
False, True, False, cw_lists, lists_enabled) False, True, False, cw_lists, lists_enabled,
timezone)
return True return True
@ -1926,6 +1935,7 @@ def _receive_announce(recent_posts_cache: {},
not_dm = True not_dm = True
if debug: if debug:
print('Generating html for announce ' + message_json['id']) print('Generating html for announce ' + message_json['id'])
timezone = get_account_timezone(base_dir, nickname, domain)
announce_html = \ announce_html = \
individual_post_as_html(signing_priv_key_pem, True, individual_post_as_html(signing_priv_key_pem, True,
recent_posts_cache, max_recent_posts, recent_posts_cache, max_recent_posts,
@ -1945,7 +1955,7 @@ def _receive_announce(recent_posts_cache: {},
show_individual_post_icons, show_individual_post_icons,
manually_approve_followers, manually_approve_followers,
False, True, False, cw_lists, False, True, False, cw_lists,
lists_enabled) lists_enabled, timezone)
if not announce_html: if not announce_html:
print('WARN: Unable to generate html for announce ' + print('WARN: Unable to generate html for announce ' +
str(message_json)) str(message_json))
@ -3060,6 +3070,7 @@ def _receive_question_vote(base_dir: str, nickname: str, domain: str,
manually_approve_followers = \ manually_approve_followers = \
follower_approval_active(base_dir, nickname, domain) follower_approval_active(base_dir, nickname, domain)
not_dm = not is_dm(question_json) not_dm = not is_dm(question_json)
timezone = get_account_timezone(base_dir, nickname, domain)
individual_post_as_html(signing_priv_key_pem, False, individual_post_as_html(signing_priv_key_pem, False,
recent_posts_cache, max_recent_posts, recent_posts_cache, max_recent_posts,
translate, page_number, base_dir, translate, page_number, base_dir,
@ -3078,7 +3089,7 @@ def _receive_question_vote(base_dir: str, nickname: str, domain: str,
show_individual_post_icons, show_individual_post_icons,
manually_approve_followers, manually_approve_followers,
False, True, False, cw_lists, False, True, False, cw_lists,
lists_enabled) lists_enabled, timezone)
# add id to inbox index # add id to inbox index
inbox_update_index('inbox', base_dir, handle, inbox_update_index('inbox', base_dir, handle,
@ -3600,6 +3611,8 @@ def _inbox_after_initial(recent_posts_cache: {}, max_recent_posts: int,
handle_name = handle.split('@')[0] handle_name = handle.split('@')[0]
allow_local_net_access = allow_local_network_access allow_local_net_access = allow_local_network_access
show_pub_date_only = show_published_date_only show_pub_date_only = show_published_date_only
timezone = get_account_timezone(base_dir,
handle_name, domain)
_inbox_store_post_to_html_cache(recent_posts_cache, _inbox_store_post_to_html_cache(recent_posts_cache,
max_recent_posts, max_recent_posts,
translate, base_dir, translate, base_dir,
@ -3620,7 +3633,8 @@ def _inbox_after_initial(recent_posts_cache: {}, max_recent_posts: int,
max_like_count, max_like_count,
signing_priv_key_pem, signing_priv_key_pem,
cw_lists, cw_lists,
lists_enabled) lists_enabled,
timezone)
if debug: if debug:
time_diff = \ time_diff = \
str(int((time.time() - html_cache_start_time) * str(int((time.time() - html_cache_start_time) *
@ -4542,7 +4556,7 @@ def run_inbox_queue(recent_posts_cache: {}, max_recent_posts: int,
for handle, _ in recipients_dict.items(): for handle, _ in recipients_dict.items():
destination = \ destination = \
queue_json['destination'].replace(inbox_handle, handle) queue_json['destination'].replace(inbox_handle, handle)
languages_understood = [system_language] languages_understood = []
_inbox_after_initial(recent_posts_cache, _inbox_after_initial(recent_posts_cache,
max_recent_posts, max_recent_posts,
session, key_id, handle, session, key_id, handle,

View File

@ -51,8 +51,11 @@ def set_actor_languages(base_dir: str, actor_json: {},
languages_str: str) -> None: languages_str: str) -> None:
"""Sets the languages used by the given actor """Sets the languages used by the given actor
""" """
separator = ',' languages_str = languages_str.strip()
if '/' in languages_str: separator = None
if ',' in languages_str:
separator = ','
elif '/' in languages_str:
separator = '/' separator = '/'
elif ',' in languages_str: elif ',' in languages_str:
separator = ',' separator = ','
@ -62,7 +65,10 @@ def set_actor_languages(base_dir: str, actor_json: {},
separator = '+' separator = '+'
elif ' ' in languages_str: elif ' ' in languages_str:
separator = ' ' separator = ' '
lang_list = languages_str.lower().split(separator) if separator:
lang_list = languages_str.lower().split(separator)
else:
lang_list = [languages_str.lower()]
lang_list2 = '' lang_list2 = ''
for lang in lang_list: for lang in lang_list:
lang = lang.strip() lang = lang.strip()

View File

@ -16,6 +16,7 @@ from posts import outbox_message_create_wrap
from posts import save_post_to_box from posts import save_post_to_box
from posts import send_to_followers_thread from posts import send_to_followers_thread
from posts import send_to_named_addresses_thread from posts import send_to_named_addresses_thread
from utils import get_account_timezone
from utils import has_object_stringType from utils import has_object_stringType
from utils import get_base_content_from_post from utils import get_base_content_from_post
from utils import has_object_dict from utils import has_object_dict
@ -454,6 +455,9 @@ def post_message_to_outbox(session, translate: {},
manually_approve_followers = \ manually_approve_followers = \
follower_approval_active(base_dir, follower_approval_active(base_dir,
post_to_nickname, domain) post_to_nickname, domain)
timezone = \
get_account_timezone(base_dir,
post_to_nickname, domain)
individual_post_as_html(signing_priv_key_pem, individual_post_as_html(signing_priv_key_pem,
False, recent_posts_cache, False, recent_posts_cache,
max_recent_posts, max_recent_posts,
@ -477,7 +481,8 @@ def post_message_to_outbox(session, translate: {},
show_individual_post_icons, show_individual_post_icons,
manually_approve_followers, manually_approve_followers,
False, True, use_cache_only, False, True, use_cache_only,
cw_lists, lists_enabled) cw_lists, lists_enabled,
timezone)
if outbox_announce(recent_posts_cache, if outbox_announce(recent_posts_cache,
base_dir, message_json, debug): base_dir, message_json, debug):

View File

@ -54,6 +54,7 @@ from follow import clear_followers
from follow import send_follow_requestViaServer from follow import send_follow_requestViaServer
from follow import send_unfollow_request_via_server from follow import send_unfollow_request_via_server
from siteactive import site_is_active from siteactive import site_is_active
from utils import convert_published_to_local_timezone
from utils import convert_to_snake_case from utils import convert_to_snake_case
from utils import get_sha_256 from utils import get_sha_256
from utils import dangerous_svg from utils import dangerous_svg
@ -6628,6 +6629,26 @@ def _test_safe_webtext() -> None:
assert expected_text == safe_text assert expected_text == safe_text
def _test_published_to_local_timezone() -> None:
print('published_to_local_timezone')
published_str = '2022-02-25T20:15:00Z'
timezone = 'Europe/Berlin'
published = \
datetime.datetime.strptime(published_str, "%Y-%m-%dT%H:%M:%SZ")
datetime_object = \
convert_published_to_local_timezone(published, timezone)
local_time_str = datetime_object.strftime("%a %b %d, %H:%M")
assert local_time_str == 'Fri Feb 25, 21:15'
timezone = 'Asia/Seoul'
published = \
datetime.datetime.strptime(published_str, "%Y-%m-%dT%H:%M:%SZ")
datetime_object = \
convert_published_to_local_timezone(published, timezone)
local_time_str = datetime_object.strftime("%a %b %d, %H:%M")
assert local_time_str == 'Sat Feb 26, 05:15'
def run_all_tests(): def run_all_tests():
base_dir = os.getcwd() base_dir = os.getcwd()
print('Running tests...') print('Running tests...')
@ -6644,6 +6665,7 @@ def run_all_tests():
'message_json', 'liked_post_json']) 'message_json', 'liked_post_json'])
_test_checkbox_names() _test_checkbox_names()
_test_functions() _test_functions()
_test_published_to_local_timezone()
_test_safe_webtext() _test_safe_webtext()
_test_get_link_from_rss_item() _test_get_link_from_rss_item()
_test_xml_podcast_dict(base_dir) _test_xml_podcast_dict(base_dir)

View File

@ -510,5 +510,6 @@
"Multi Status": "متعدد الحالات", "Multi Status": "متعدد الحالات",
"Lots of things": "أشياء كثيرة", "Lots of things": "أشياء كثيرة",
"Created": "مخلوق", "Created": "مخلوق",
"It is done": "تم" "It is done": "تم",
"Time Zone": "وحدة زمنية"
} }

View File

@ -510,5 +510,6 @@
"Multi Status": "Estat múltiple", "Multi Status": "Estat múltiple",
"Lots of things": "Moltes coses", "Lots of things": "Moltes coses",
"Created": "Creat", "Created": "Creat",
"It is done": "Esta fet" "It is done": "Esta fet",
"Time Zone": "Fus horari"
} }

View File

@ -510,5 +510,6 @@
"Multi Status": "Statws Aml", "Multi Status": "Statws Aml",
"Lots of things": "Llawer o pethau", "Lots of things": "Llawer o pethau",
"Created": "Wedi creu", "Created": "Wedi creu",
"It is done": "Mae'n cael ei wneud" "It is done": "Mae'n cael ei wneud",
"Time Zone": "Parth Amser"
} }

View File

@ -510,5 +510,6 @@
"Multi Status": "Multi-Status", "Multi Status": "Multi-Status",
"Lots of things": "Viele Dinge", "Lots of things": "Viele Dinge",
"Created": "Erstellt", "Created": "Erstellt",
"It is done": "Es ist vollbracht" "It is done": "Es ist vollbracht",
"Time Zone": "Zeitzone"
} }

View File

@ -510,5 +510,6 @@
"Multi Status": "Multi Status", "Multi Status": "Multi Status",
"Lots of things": "Lots of things", "Lots of things": "Lots of things",
"Created": "Created", "Created": "Created",
"It is done": "It is done" "It is done": "It is done",
"Time Zone": "Time Zone"
} }

View File

@ -510,5 +510,6 @@
"Multi Status": "Estado múltiple", "Multi Status": "Estado múltiple",
"Lots of things": "Muchas cosas", "Lots of things": "Muchas cosas",
"Created": "Creada", "Created": "Creada",
"It is done": "Se hace" "It is done": "Se hace",
"Time Zone": "Zona horaria"
} }

View File

@ -510,5 +510,6 @@
"Multi Status": "Statut multiple", "Multi Status": "Statut multiple",
"Lots of things": "Beaucoup de choses", "Lots of things": "Beaucoup de choses",
"Created": "Créé", "Created": "Créé",
"It is done": "C'est fait" "It is done": "C'est fait",
"Time Zone": "Fuseau horaire"
} }

View File

@ -510,5 +510,6 @@
"Multi Status": "Stádas Il", "Multi Status": "Stádas Il",
"Lots of things": "A lán rudaí", "Lots of things": "A lán rudaí",
"Created": "Cruthaithe", "Created": "Cruthaithe",
"It is done": "Déantar é" "It is done": "Déantar é",
"Time Zone": "Crios Ama"
} }

View File

@ -510,5 +510,6 @@
"Multi Status": "बहु स्थिति", "Multi Status": "बहु स्थिति",
"Lots of things": "बहुत सी बातें", "Lots of things": "बहुत सी बातें",
"Created": "बनाया था", "Created": "बनाया था",
"It is done": "हो गया है" "It is done": "हो गया है",
"Time Zone": "समय क्षेत्र"
} }

View File

@ -510,5 +510,6 @@
"Multi Status": "Stato multiplo", "Multi Status": "Stato multiplo",
"Lots of things": "Un sacco di cose", "Lots of things": "Un sacco di cose",
"Created": "Creata", "Created": "Creata",
"It is done": "È fatta" "It is done": "È fatta",
"Time Zone": "Fuso orario"
} }

View File

@ -510,5 +510,6 @@
"Multi Status": "マルチステータス", "Multi Status": "マルチステータス",
"Lots of things": "多くの物", "Lots of things": "多くの物",
"Created": "作成した", "Created": "作成した",
"It is done": "されております" "It is done": "されております",
"Time Zone": "タイムゾーン"
} }

View File

@ -510,5 +510,6 @@
"Multi Status": "Multi Status", "Multi Status": "Multi Status",
"Lots of things": "Gelek tişt", "Lots of things": "Gelek tişt",
"Created": "Afirandin", "Created": "Afirandin",
"It is done": "Tê kirin" "It is done": "Tê kirin",
"Time Zone": "Qada demê"
} }

View File

@ -506,5 +506,6 @@
"Multi Status": "Multi Status", "Multi Status": "Multi Status",
"Lots of things": "Lots of things", "Lots of things": "Lots of things",
"Created": "Created", "Created": "Created",
"It is done": "It is done" "It is done": "It is done",
"Time Zone": "Time Zone"
} }

View File

@ -510,5 +510,6 @@
"Multi Status": "Vários status", "Multi Status": "Vários status",
"Lots of things": "Muitas coisas", "Lots of things": "Muitas coisas",
"Created": "Criada", "Created": "Criada",
"It is done": "Está feito" "It is done": "Está feito",
"Time Zone": "Fuso horário"
} }

View File

@ -510,5 +510,6 @@
"Multi Status": "Мульти статус", "Multi Status": "Мульти статус",
"Lots of things": "Много всего", "Lots of things": "Много всего",
"Created": "Созданный", "Created": "Созданный",
"It is done": "Сделано" "It is done": "Сделано",
"Time Zone": "Часовой пояс"
} }

View File

@ -510,5 +510,6 @@
"Multi Status": "Hali nyingi", "Multi Status": "Hali nyingi",
"Lots of things": "Mambo mengi", "Lots of things": "Mambo mengi",
"Created": "Imeundwa", "Created": "Imeundwa",
"It is done": "Imefanyika" "It is done": "Imefanyika",
"Time Zone": "Eneo la Saa"
} }

View File

@ -510,5 +510,6 @@
"Multi Status": "多状态", "Multi Status": "多状态",
"Lots of things": "很多事情", "Lots of things": "很多事情",
"Created": "已创建", "Created": "已创建",
"It is done": "完成了" "It is done": "完成了",
"Time Zone": "时区"
} }

View File

@ -15,6 +15,7 @@ import datetime
import json import json
import idna import idna
import locale import locale
from dateutil.tz import tz
from pprint import pprint from pprint import pprint
from cryptography.hazmat.backends import default_backend from cryptography.hazmat.backends import default_backend
from cryptography.hazmat.primitives import hashes from cryptography.hazmat.primitives import hashes
@ -78,6 +79,8 @@ def get_actor_languages_list(actor_json: {}) -> []:
lang_list_temp = lang_str.split('+') lang_list_temp = lang_str.split('+')
elif ' ' in lang_str: elif ' ' in lang_str:
lang_list_temp = lang_str.split(' ') lang_list_temp = lang_str.split(' ')
else:
return [lang_str]
lang_list = [] lang_list = []
for lang in lang_list_temp: for lang in lang_list_temp:
lang = lang.strip() lang = lang.strip()
@ -3348,3 +3351,68 @@ def valid_hash_tag(hashtag: str) -> bool:
if _is_valid_language(hashtag): if _is_valid_language(hashtag):
return True return True
return False return False
def convert_published_to_local_timezone(published, timezone: str) -> str:
"""Converts a post published time into local time
"""
from_zone = tz.gettz('UTC')
if timezone:
try:
to_zone = tz.gettz(timezone)
except BaseException:
pass
if not timezone:
return published
utc = published.replace(tzinfo=from_zone)
local_time = utc.astimezone(to_zone)
return local_time
def load_account_timezones(base_dir: str) -> {}:
"""Returns a dictionary containing the preferred timezone for each account
"""
account_timezone = {}
for subdir, dirs, files in os.walk(base_dir + '/accounts'):
for acct in dirs:
if '@' not in acct:
continue
if acct.startswith('inbox@') or acct.startswith('Actor@'):
continue
acct_dir = os.path.join(base_dir + '/accounts', acct)
tz_filename = acct_dir + '/timezone.txt'
if not os.path.isfile(tz_filename):
continue
timezone = None
with open(tz_filename, 'r') as fp_timezone:
timezone = fp_timezone.read().strip()
if timezone:
nickname = acct.split('@')[0]
account_timezone[nickname] = timezone
break
return account_timezone
def get_account_timezone(base_dir: str, nickname: str, domain: str) -> str:
"""Returns the timezone for the given account
"""
tz_filename = \
base_dir + '/accounts/' + nickname + '@' + domain + '/timezone.txt'
if not os.path.isfile(tz_filename):
return None
timezone = None
with open(tz_filename, 'r') as fp_timezone:
timezone = fp_timezone.read().strip()
return timezone
def set_account_timezone(base_dir: str, nickname: str, domain: str,
timezone: str) -> None:
"""Sets the timezone for the given account
"""
tz_filename = \
base_dir + '/accounts/' + nickname + '@' + domain + '/timezone.txt'
timezone = timezone.strip()
with open(tz_filename, 'w+') as fp_timezone:
fp_timezone.write(timezone)

View File

@ -17,6 +17,7 @@ from utils import load_json
from utils import get_config_param from utils import get_config_param
from utils import get_alt_path from utils import get_alt_path
from utils import acct_dir from utils import acct_dir
from utils import get_account_timezone
from webapp_utils import set_custom_background from webapp_utils import set_custom_background
from webapp_utils import html_header_with_external_style from webapp_utils import html_header_with_external_style
from webapp_utils import html_footer from webapp_utils import html_footer
@ -64,6 +65,7 @@ def html_confirm_delete(css_cache: {},
get_config_param(base_dir, 'instanceTitle') get_config_param(base_dir, 'instanceTitle')
delete_post_str = \ delete_post_str = \
html_header_with_external_style(css_filename, instance_title, None) html_header_with_external_style(css_filename, instance_title, None)
timezone = get_account_timezone(base_dir, nickname, domain)
delete_post_str += \ delete_post_str += \
individual_post_as_html(signing_priv_key_pem, individual_post_as_html(signing_priv_key_pem,
True, recent_posts_cache, max_recent_posts, True, recent_posts_cache, max_recent_posts,
@ -79,7 +81,7 @@ def html_confirm_delete(css_cache: {},
peertube_instances, allow_local_network_access, peertube_instances, allow_local_network_access,
theme_name, system_language, max_like_count, theme_name, system_language, max_like_count,
False, False, False, False, False, False, False, False, False, False, False, False,
cw_lists, lists_enabled) cw_lists, lists_enabled, timezone)
delete_post_str += '<center>' delete_post_str += '<center>'
delete_post_str += \ delete_post_str += \
' <p class="followText">' + \ ' <p class="followText">' + \

View File

@ -17,6 +17,7 @@ from utils import get_config_param
from utils import acct_dir from utils import acct_dir
from utils import get_currencies from utils import get_currencies
from utils import get_category_types from utils import get_category_types
from utils import get_account_timezone
from webapp_utils import get_banner_file from webapp_utils import get_banner_file
from webapp_utils import html_header_with_external_style from webapp_utils import html_header_with_external_style
from webapp_utils import html_footer from webapp_utils import html_footer
@ -259,6 +260,8 @@ def html_new_post(css_cache: {}, media_instance: bool, translate: {},
'target="_blank">' + \ 'target="_blank">' + \
translate['this post'] + '</a></p>\n' translate['this post'] + '</a></p>\n'
if post_json_object: if post_json_object:
timezone = \
get_account_timezone(base_dir, nickname, domain)
new_post_text += \ new_post_text += \
individual_post_as_html(signing_priv_key_pem, individual_post_as_html(signing_priv_key_pem,
True, recent_posts_cache, True, recent_posts_cache,
@ -282,7 +285,8 @@ def html_new_post(css_cache: {}, media_instance: bool, translate: {},
max_like_count, max_like_count,
False, False, False, False, False, False,
False, False, False, False, False, False,
cw_lists, lists_enabled) cw_lists, lists_enabled,
timezone)
reply_str = '<input type="hidden" ' + \ reply_str = '<input type="hidden" ' + \
'name="replyTo" value="' + inReplyTo + '">\n' 'name="replyTo" value="' + inReplyTo + '">\n'

View File

@ -11,6 +11,7 @@ import os
from utils import is_system_account from utils import is_system_account
from utils import get_domain_from_actor from utils import get_domain_from_actor
from utils import get_config_param from utils import get_config_param
from utils import get_account_timezone
from person import person_box_json from person import person_box_json
from webapp_utils import html_header_with_external_style from webapp_utils import html_header_with_external_style
from webapp_utils import html_footer from webapp_utils import html_footer
@ -63,6 +64,7 @@ def _html_front_screen_posts(recent_posts_cache: {}, max_recent_posts: int,
break break
for item in outbox_feed['orderedItems']: for item in outbox_feed['orderedItems']:
if item['type'] == 'Create': if item['type'] == 'Create':
timezone = get_account_timezone(base_dir, nickname, domain)
post_str = \ post_str = \
individual_post_as_html(signing_priv_key_pem, individual_post_as_html(signing_priv_key_pem,
True, recent_posts_cache, True, recent_posts_cache,
@ -84,7 +86,8 @@ def _html_front_screen_posts(recent_posts_cache: {}, max_recent_posts: int,
max_like_count, max_like_count,
False, False, False, False, False, False,
True, False, False, True, False, False,
cw_lists, lists_enabled) cw_lists, lists_enabled,
timezone)
if post_str: if post_str:
profile_str += post_str + separator_str profile_str += post_str + separator_str
ctr += 1 ctr += 1

View File

@ -54,7 +54,8 @@ def html_moderation(css_cache: {}, default_timeline: str,
max_like_count: int, max_like_count: int,
shared_items_federated_domains: [], shared_items_federated_domains: [],
signing_priv_key_pem: str, signing_priv_key_pem: str,
cw_lists: {}, lists_enabled: str) -> str: cw_lists: {}, lists_enabled: str,
timezone: str) -> str:
"""Show the moderation feed as html """Show the moderation feed as html
This is what you see when selecting the "mod" timeline This is what you see when selecting the "mod" timeline
""" """
@ -79,7 +80,8 @@ def html_moderation(css_cache: {}, default_timeline: str,
peertube_instances, allow_local_network_access, peertube_instances, allow_local_network_access,
text_mode_banner, access_keys, system_language, text_mode_banner, access_keys, system_language,
max_like_count, shared_items_federated_domains, max_like_count, shared_items_federated_domains,
signing_priv_key_pem, cw_lists, lists_enabled) signing_priv_key_pem, cw_lists, lists_enabled,
timezone)
def html_account_info(css_cache: {}, translate: {}, def html_account_info(css_cache: {}, translate: {},

View File

@ -23,6 +23,7 @@ from posts import post_is_muted
from posts import get_person_box from posts import get_person_box
from posts import download_announce from posts import download_announce
from posts import populate_replies_json from posts import populate_replies_json
from utils import convert_published_to_local_timezone
from utils import remove_hash_from_post_id from utils import remove_hash_from_post_id
from utils import remove_html from utils import remove_html
from utils import get_actor_languages_list from utils import get_actor_languages_list
@ -841,7 +842,8 @@ def _get_delete_icon_html(nickname: str, domain_full: str,
def _get_published_date_str(post_json_object: {}, def _get_published_date_str(post_json_object: {},
show_published_date_only: bool) -> str: show_published_date_only: bool,
timezone: str) -> str:
"""Return the html for the published date on a post """Return the html for the published date on a post
""" """
published_str = '' published_str = ''
@ -862,6 +864,11 @@ def _get_published_date_str(post_json_object: {},
published_str = \ published_str = \
published_str.replace('T', ' ').split('.')[0] published_str.replace('T', ' ').split('.')[0]
datetime_object = parse(published_str) datetime_object = parse(published_str)
# convert to local time
datetime_object = \
convert_published_to_local_timezone(datetime_object, timezone)
if not show_published_date_only: if not show_published_date_only:
published_str = datetime_object.strftime("%a %b %d, %H:%M") published_str = datetime_object.strftime("%a %b %d, %H:%M")
else: else:
@ -1366,7 +1373,8 @@ def individual_post_as_html(signing_priv_key_pem: str,
store_to_cache: bool, store_to_cache: bool,
use_cache_only: bool, use_cache_only: bool,
cw_lists: {}, cw_lists: {},
lists_enabled: str) -> str: lists_enabled: str,
timezone: str) -> str:
""" Shows a single post as html """ Shows a single post as html
""" """
if not post_json_object: if not post_json_object:
@ -1803,7 +1811,8 @@ def individual_post_as_html(signing_priv_key_pem: str,
bookmark_str, delete_str, mute_str) bookmark_str, delete_str, mute_str)
published_str = \ published_str = \
_get_published_date_str(post_json_object, show_published_date_only) _get_published_date_str(post_json_object, show_published_date_only,
timezone)
_log_post_timing(enable_timing_log, post_start_time, '15') _log_post_timing(enable_timing_log, post_start_time, '15')
@ -2038,7 +2047,8 @@ def html_individual_post(css_cache: {},
allow_local_network_access: bool, allow_local_network_access: bool,
theme_name: str, system_language: str, theme_name: str, system_language: str,
max_like_count: int, signing_priv_key_pem: str, max_like_count: int, signing_priv_key_pem: str,
cw_lists: {}, lists_enabled: str) -> str: cw_lists: {}, lists_enabled: str,
timezone: str) -> str:
"""Show an individual post as html """Show an individual post as html
""" """
original_post_json = post_json_object original_post_json = post_json_object
@ -2104,7 +2114,7 @@ def html_individual_post(css_cache: {},
allow_local_network_access, theme_name, allow_local_network_access, theme_name,
system_language, max_like_count, system_language, max_like_count,
False, authorized, False, False, False, False, False, authorized, False, False, False, False,
cw_lists, lists_enabled) cw_lists, lists_enabled, timezone)
message_id = remove_id_ending(post_json_object['id']) message_id = remove_id_ending(post_json_object['id'])
# show the previous posts # show the previous posts
@ -2139,7 +2149,8 @@ def html_individual_post(css_cache: {},
max_like_count, max_like_count,
False, authorized, False, authorized,
False, False, False, False, False, False, False, False,
cw_lists, lists_enabled) + post_str cw_lists, lists_enabled,
timezone) + post_str
# show the following posts # show the following posts
post_filename = locate_post(base_dir, nickname, domain, message_id) post_filename = locate_post(base_dir, nickname, domain, message_id)
@ -2176,7 +2187,8 @@ def html_individual_post(css_cache: {},
max_like_count, max_like_count,
False, authorized, False, authorized,
False, False, False, False, False, False, False, False,
cw_lists, lists_enabled) cw_lists, lists_enabled,
timezone)
css_filename = base_dir + '/epicyon-profile.css' css_filename = base_dir + '/epicyon-profile.css'
if os.path.isfile(base_dir + '/epicyon.css'): if os.path.isfile(base_dir + '/epicyon.css'):
css_filename = base_dir + '/epicyon.css' css_filename = base_dir + '/epicyon.css'
@ -2203,7 +2215,8 @@ def html_post_replies(css_cache: {},
theme_name: str, system_language: str, theme_name: str, system_language: str,
max_like_count: int, max_like_count: int,
signing_priv_key_pem: str, cw_lists: {}, signing_priv_key_pem: str, cw_lists: {},
lists_enabled: str) -> str: lists_enabled: str,
timezone: str) -> str:
"""Show the replies to an individual post as html """Show the replies to an individual post as html
""" """
replies_str = '' replies_str = ''
@ -2228,7 +2241,8 @@ def html_post_replies(css_cache: {},
max_like_count, max_like_count,
False, False, False, False, False, False, False, False,
False, False, False, False,
cw_lists, lists_enabled) cw_lists, lists_enabled,
timezone)
css_filename = base_dir + '/epicyon-profile.css' css_filename = base_dir + '/epicyon-profile.css'
if os.path.isfile(base_dir + '/epicyon.css'): if os.path.isfile(base_dir + '/epicyon.css'):
@ -2257,7 +2271,8 @@ def html_emoji_reaction_picker(css_cache: {},
theme_name: str, system_language: str, theme_name: str, system_language: str,
max_like_count: int, signing_priv_key_pem: str, max_like_count: int, signing_priv_key_pem: str,
cw_lists: {}, lists_enabled: str, cw_lists: {}, lists_enabled: str,
box_name: str, page_number: int) -> str: box_name: str, page_number: int,
timezone: str) -> str:
"""Returns the emoji picker screen """Returns the emoji picker screen
""" """
reacted_to_post_str = \ reacted_to_post_str = \
@ -2280,7 +2295,7 @@ def html_emoji_reaction_picker(css_cache: {},
theme_name, system_language, theme_name, system_language,
max_like_count, max_like_count,
False, False, False, False, False, False, False, False, False, False, False, False,
cw_lists, lists_enabled) cw_lists, lists_enabled, timezone)
reactions_filename = base_dir + '/emoji/reactions.json' reactions_filename = base_dir + '/emoji/reactions.json'
if not os.path.isfile(reactions_filename): if not os.path.isfile(reactions_filename):

View File

@ -29,6 +29,7 @@ from utils import acct_dir
from utils import get_supported_languages from utils import get_supported_languages
from utils import local_actor_url from utils import local_actor_url
from utils import get_reply_interval_hours from utils import get_reply_interval_hours
from utils import get_account_timezone
from languages import get_actor_languages from languages import get_actor_languages
from skills import get_skills from skills import get_skills
from theme import get_themes_list from theme import get_themes_list
@ -142,7 +143,8 @@ def html_profile_after_search(css_cache: {},
system_language: str, system_language: str,
max_like_count: int, max_like_count: int,
signing_priv_key_pem: str, signing_priv_key_pem: str,
cw_lists: {}, lists_enabled: str) -> str: cw_lists: {}, lists_enabled: str,
timezone: str) -> str:
"""Show a profile page after a search for a fediverse address """Show a profile page after a search for a fediverse address
""" """
http = False http = False
@ -354,7 +356,8 @@ def html_profile_after_search(css_cache: {},
max_like_count, max_like_count,
False, False, False, False, False, False,
False, False, False, False, False, False,
cw_lists, lists_enabled) cw_lists, lists_enabled,
timezone)
i += 1 i += 1
if i >= 8: if i >= 8:
break break
@ -576,7 +579,8 @@ def html_profile(signing_priv_key_pem: str,
extraJson: {}, page_number: int, extraJson: {}, page_number: int,
max_items_per_page: int, max_items_per_page: int,
cw_lists: {}, lists_enabled: str, cw_lists: {}, lists_enabled: str,
content_license_url: str) -> str: content_license_url: str,
timezone: str) -> str:
"""Show the profile page as html """Show the profile page as html
""" """
nickname = profile_json['preferredUsername'] nickname = profile_json['preferredUsername']
@ -986,7 +990,8 @@ def html_profile(signing_priv_key_pem: str,
theme, system_language, theme, system_language,
max_like_count, max_like_count,
signing_priv_key_pem, signing_priv_key_pem,
cw_lists, lists_enabled) + license_str cw_lists, lists_enabled,
timezone) + license_str
if not is_group: if not is_group:
if selected == 'following': if selected == 'following':
profile_str += \ profile_str += \
@ -1059,7 +1064,8 @@ def _html_profile_posts(recent_posts_cache: {}, max_recent_posts: int,
theme_name: str, system_language: str, theme_name: str, system_language: str,
max_like_count: int, max_like_count: int,
signing_priv_key_pem: str, signing_priv_key_pem: str,
cw_lists: {}, lists_enabled: str) -> str: cw_lists: {}, lists_enabled: str,
timezone: str) -> str:
"""Shows posts on the profile screen """Shows posts on the profile screen
These should only be public posts These should only be public posts
""" """
@ -1107,7 +1113,8 @@ def _html_profile_posts(recent_posts_cache: {}, max_recent_posts: int,
max_like_count, max_like_count,
False, False, False, False, False, False,
True, False, False, True, False, False,
cw_lists, lists_enabled) cw_lists, lists_enabled,
timezone)
if post_str: if post_str:
profile_str += post_str + separator_str profile_str += post_str + separator_str
ctr += 1 ctr += 1
@ -2015,7 +2022,8 @@ def _get_supported_languagesSorted(base_dir: str) -> str:
def _html_edit_profile_main(base_dir: str, display_nickname: str, bio_str: str, def _html_edit_profile_main(base_dir: str, display_nickname: str, bio_str: str,
moved_to: str, donate_url: str, website_url: str, moved_to: str, donate_url: str, website_url: str,
blog_address: str, actor_json: {}, blog_address: str, actor_json: {},
translate: {}) -> str: translate: {},
nickname: str, domain: str) -> str:
"""main info on edit profile screen """main info on edit profile screen
""" """
image_formats = get_image_formats() image_formats = get_image_formats()
@ -2078,6 +2086,11 @@ def _html_edit_profile_main(base_dir: str, display_nickname: str, bio_str: str,
edit_text_field(translate['Languages'], 'showLanguages', edit_text_field(translate['Languages'], 'showLanguages',
show_languages, languages_list_str) show_languages, languages_list_str)
timezone = get_account_timezone(base_dir, nickname, domain)
edit_profile_form += \
edit_text_field(translate['Time Zone'], 'timeZone',
timezone, 'Europe/London')
edit_profile_form += ' </div>\n' edit_profile_form += ' </div>\n'
return edit_profile_form return edit_profile_form
@ -2296,7 +2309,8 @@ def html_edit_profile(css_cache: {}, translate: {}, base_dir: str, path: str,
edit_profile_form += \ edit_profile_form += \
_html_edit_profile_main(base_dir, display_nickname, bio_str, _html_edit_profile_main(base_dir, display_nickname, bio_str,
moved_to, donate_url, website_url, moved_to, donate_url, website_url,
blog_address, actor_json, translate) blog_address, actor_json, translate,
nickname, domain)
# Option checkboxes # Option checkboxes
edit_profile_form += \ edit_profile_form += \

View File

@ -610,7 +610,8 @@ def html_history_search(css_cache: {}, translate: {}, base_dir: str,
max_like_count: int, max_like_count: int,
signing_priv_key_pem: str, signing_priv_key_pem: str,
cw_lists: {}, cw_lists: {},
lists_enabled: str) -> str: lists_enabled: str,
timezone: str) -> str:
"""Show a page containing search results for your post history """Show a page containing search results for your post history
""" """
if historysearch.startswith("'"): if historysearch.startswith("'"):
@ -697,7 +698,8 @@ def html_history_search(css_cache: {}, translate: {}, base_dir: str,
show_individual_post_icons, show_individual_post_icons,
show_individual_post_icons, show_individual_post_icons,
False, False, False, False, False, False, False, False,
cw_lists, lists_enabled) cw_lists, lists_enabled,
timezone)
if post_str: if post_str:
history_search_form += separator_str + post_str history_search_form += separator_str + post_str
index += 1 index += 1
@ -722,7 +724,8 @@ def html_hashtag_search(css_cache: {},
theme_name: str, system_language: str, theme_name: str, system_language: str,
max_like_count: int, max_like_count: int,
signing_priv_key_pem: str, signing_priv_key_pem: str,
cw_lists: {}, lists_enabled: str) -> str: cw_lists: {}, lists_enabled: str,
timezone: str) -> str:
"""Show a page containing search results for a hashtag """Show a page containing search results for a hashtag
or after selecting a hashtag from the swarm or after selecting a hashtag from the swarm
""" """
@ -882,7 +885,7 @@ def html_hashtag_search(css_cache: {},
manually_approves_followers, manually_approves_followers,
show_public_only, show_public_only,
store_to_sache, False, cw_lists, store_to_sache, False, cw_lists,
lists_enabled) lists_enabled, timezone)
if post_str: if post_str:
hashtag_search_form += separator_str + post_str hashtag_search_form += separator_str + post_str
index += 1 index += 1

View File

@ -454,7 +454,8 @@ def html_timeline(css_cache: {}, default_timeline: str,
max_like_count: int, max_like_count: int,
shared_items_federated_domains: [], shared_items_federated_domains: [],
signing_priv_key_pem: str, signing_priv_key_pem: str,
cw_lists: {}, lists_enabled: str) -> str: cw_lists: {}, lists_enabled: str,
timezone: str) -> str:
"""Show the timeline as html """Show the timeline as html
""" """
enable_timing_log = False enable_timing_log = False
@ -930,7 +931,8 @@ def html_timeline(css_cache: {}, default_timeline: str,
show_individual_post_icons, show_individual_post_icons,
manually_approve_followers, manually_approve_followers,
False, True, use_cache_only, False, True, use_cache_only,
cw_lists, lists_enabled) cw_lists, lists_enabled,
timezone)
_log_timeline_timing(enable_timing_log, _log_timeline_timing(enable_timing_log,
timeline_start_time, box_name, '12') timeline_start_time, box_name, '12')
@ -1158,7 +1160,8 @@ def html_shares(css_cache: {}, default_timeline: str,
max_like_count: int, max_like_count: int,
shared_items_federated_domains: [], shared_items_federated_domains: [],
signing_priv_key_pem: str, signing_priv_key_pem: str,
cw_lists: {}, lists_enabled: str) -> str: cw_lists: {}, lists_enabled: str,
timezone: str) -> str:
"""Show the shares timeline as html """Show the shares timeline as html
""" """
manually_approve_followers = \ manually_approve_followers = \
@ -1188,7 +1191,7 @@ def html_shares(css_cache: {}, default_timeline: str,
access_keys, system_language, max_like_count, access_keys, system_language, max_like_count,
shared_items_federated_domains, shared_items_federated_domains,
signing_priv_key_pem, signing_priv_key_pem,
cw_lists, lists_enabled) cw_lists, lists_enabled, timezone)
def html_wanted(css_cache: {}, default_timeline: str, def html_wanted(css_cache: {}, default_timeline: str,
@ -1216,7 +1219,8 @@ def html_wanted(css_cache: {}, default_timeline: str,
max_like_count: int, max_like_count: int,
shared_items_federated_domains: [], shared_items_federated_domains: [],
signing_priv_key_pem: str, signing_priv_key_pem: str,
cw_lists: {}, lists_enabled: str) -> str: cw_lists: {}, lists_enabled: str,
timezone: str) -> str:
"""Show the wanted timeline as html """Show the wanted timeline as html
""" """
manually_approve_followers = \ manually_approve_followers = \
@ -1246,7 +1250,7 @@ def html_wanted(css_cache: {}, default_timeline: str,
access_keys, system_language, max_like_count, access_keys, system_language, max_like_count,
shared_items_federated_domains, shared_items_federated_domains,
signing_priv_key_pem, signing_priv_key_pem,
cw_lists, lists_enabled) cw_lists, lists_enabled, timezone)
def html_inbox(css_cache: {}, default_timeline: str, def html_inbox(css_cache: {}, default_timeline: str,
@ -1275,7 +1279,8 @@ def html_inbox(css_cache: {}, default_timeline: str,
max_like_count: int, max_like_count: int,
shared_items_federated_domains: [], shared_items_federated_domains: [],
signing_priv_key_pem: str, signing_priv_key_pem: str,
cw_lists: {}, lists_enabled: str) -> str: cw_lists: {}, lists_enabled: str,
timezone: str) -> str:
"""Show the inbox as html """Show the inbox as html
""" """
manually_approve_followers = \ manually_approve_followers = \
@ -1305,7 +1310,7 @@ def html_inbox(css_cache: {}, default_timeline: str,
access_keys, system_language, max_like_count, access_keys, system_language, max_like_count,
shared_items_federated_domains, shared_items_federated_domains,
signing_priv_key_pem, signing_priv_key_pem,
cw_lists, lists_enabled) cw_lists, lists_enabled, timezone)
def html_bookmarks(css_cache: {}, default_timeline: str, def html_bookmarks(css_cache: {}, default_timeline: str,
@ -1334,7 +1339,8 @@ def html_bookmarks(css_cache: {}, default_timeline: str,
max_like_count: int, max_like_count: int,
shared_items_federated_domains: [], shared_items_federated_domains: [],
signing_priv_key_pem: str, signing_priv_key_pem: str,
cw_lists: {}, lists_enabled: str) -> str: cw_lists: {}, lists_enabled: str,
timezone: str) -> str:
"""Show the bookmarks as html """Show the bookmarks as html
""" """
manually_approve_followers = \ manually_approve_followers = \
@ -1363,7 +1369,7 @@ def html_bookmarks(css_cache: {}, default_timeline: str,
allow_local_network_access, text_mode_banner, allow_local_network_access, text_mode_banner,
access_keys, system_language, max_like_count, access_keys, system_language, max_like_count,
shared_items_federated_domains, signing_priv_key_pem, shared_items_federated_domains, signing_priv_key_pem,
cw_lists, lists_enabled) cw_lists, lists_enabled, timezone)
def html_inbox_dms(css_cache: {}, default_timeline: str, def html_inbox_dms(css_cache: {}, default_timeline: str,
@ -1392,7 +1398,8 @@ def html_inbox_dms(css_cache: {}, default_timeline: str,
max_like_count: int, max_like_count: int,
shared_items_federated_domains: [], shared_items_federated_domains: [],
signing_priv_key_pem: str, signing_priv_key_pem: str,
cw_lists: {}, lists_enabled: str) -> str: cw_lists: {}, lists_enabled: str,
timezone: str) -> str:
"""Show the DM timeline as html """Show the DM timeline as html
""" """
artist = is_artist(base_dir, nickname) artist = is_artist(base_dir, nickname)
@ -1417,7 +1424,7 @@ def html_inbox_dms(css_cache: {}, default_timeline: str,
access_keys, system_language, max_like_count, access_keys, system_language, max_like_count,
shared_items_federated_domains, shared_items_federated_domains,
signing_priv_key_pem, signing_priv_key_pem,
cw_lists, lists_enabled) cw_lists, lists_enabled, timezone)
def html_inbox_replies(css_cache: {}, default_timeline: str, def html_inbox_replies(css_cache: {}, default_timeline: str,
@ -1446,7 +1453,8 @@ def html_inbox_replies(css_cache: {}, default_timeline: str,
max_like_count: int, max_like_count: int,
shared_items_federated_domains: [], shared_items_federated_domains: [],
signing_priv_key_pem: str, signing_priv_key_pem: str,
cw_lists: {}, lists_enabled: str) -> str: cw_lists: {}, lists_enabled: str,
timezone: str) -> str:
"""Show the replies timeline as html """Show the replies timeline as html
""" """
artist = is_artist(base_dir, nickname) artist = is_artist(base_dir, nickname)
@ -1470,7 +1478,7 @@ def html_inbox_replies(css_cache: {}, default_timeline: str,
allow_local_network_access, text_mode_banner, allow_local_network_access, text_mode_banner,
access_keys, system_language, max_like_count, access_keys, system_language, max_like_count,
shared_items_federated_domains, signing_priv_key_pem, shared_items_federated_domains, signing_priv_key_pem,
cw_lists, lists_enabled) cw_lists, lists_enabled, timezone)
def html_inbox_media(css_cache: {}, default_timeline: str, def html_inbox_media(css_cache: {}, default_timeline: str,
@ -1499,7 +1507,8 @@ def html_inbox_media(css_cache: {}, default_timeline: str,
max_like_count: int, max_like_count: int,
shared_items_federated_domains: [], shared_items_federated_domains: [],
signing_priv_key_pem: str, signing_priv_key_pem: str,
cw_lists: {}, lists_enabled: str) -> str: cw_lists: {}, lists_enabled: str,
timezone: str) -> str:
"""Show the media timeline as html """Show the media timeline as html
""" """
artist = is_artist(base_dir, nickname) artist = is_artist(base_dir, nickname)
@ -1523,7 +1532,7 @@ def html_inbox_media(css_cache: {}, default_timeline: str,
allow_local_network_access, text_mode_banner, allow_local_network_access, text_mode_banner,
access_keys, system_language, max_like_count, access_keys, system_language, max_like_count,
shared_items_federated_domains, signing_priv_key_pem, shared_items_federated_domains, signing_priv_key_pem,
cw_lists, lists_enabled) cw_lists, lists_enabled, timezone)
def html_inbox_blogs(css_cache: {}, default_timeline: str, def html_inbox_blogs(css_cache: {}, default_timeline: str,
@ -1552,7 +1561,8 @@ def html_inbox_blogs(css_cache: {}, default_timeline: str,
max_like_count: int, max_like_count: int,
shared_items_federated_domains: [], shared_items_federated_domains: [],
signing_priv_key_pem: str, signing_priv_key_pem: str,
cw_lists: {}, lists_enabled: str) -> str: cw_lists: {}, lists_enabled: str,
timezone: str) -> str:
"""Show the blogs timeline as html """Show the blogs timeline as html
""" """
artist = is_artist(base_dir, nickname) artist = is_artist(base_dir, nickname)
@ -1576,7 +1586,7 @@ def html_inbox_blogs(css_cache: {}, default_timeline: str,
allow_local_network_access, text_mode_banner, allow_local_network_access, text_mode_banner,
access_keys, system_language, max_like_count, access_keys, system_language, max_like_count,
shared_items_federated_domains, signing_priv_key_pem, shared_items_federated_domains, signing_priv_key_pem,
cw_lists, lists_enabled) cw_lists, lists_enabled, timezone)
def html_inbox_features(css_cache: {}, default_timeline: str, def html_inbox_features(css_cache: {}, default_timeline: str,
@ -1606,7 +1616,8 @@ def html_inbox_features(css_cache: {}, default_timeline: str,
max_like_count: int, max_like_count: int,
shared_items_federated_domains: [], shared_items_federated_domains: [],
signing_priv_key_pem: str, signing_priv_key_pem: str,
cw_lists: {}, lists_enabled: str) -> str: cw_lists: {}, lists_enabled: str,
timezone: str) -> str:
"""Show the features timeline as html """Show the features timeline as html
""" """
return html_timeline(css_cache, default_timeline, return html_timeline(css_cache, default_timeline,
@ -1629,7 +1640,7 @@ def html_inbox_features(css_cache: {}, default_timeline: str,
allow_local_network_access, text_mode_banner, allow_local_network_access, text_mode_banner,
access_keys, system_language, max_like_count, access_keys, system_language, max_like_count,
shared_items_federated_domains, signing_priv_key_pem, shared_items_federated_domains, signing_priv_key_pem,
cw_lists, lists_enabled) cw_lists, lists_enabled, timezone)
def html_inbox_news(css_cache: {}, default_timeline: str, def html_inbox_news(css_cache: {}, default_timeline: str,
@ -1658,7 +1669,8 @@ def html_inbox_news(css_cache: {}, default_timeline: str,
max_like_count: int, max_like_count: int,
shared_items_federated_domains: [], shared_items_federated_domains: [],
signing_priv_key_pem: str, signing_priv_key_pem: str,
cw_lists: {}, lists_enabled: str) -> str: cw_lists: {}, lists_enabled: str,
timezone: str) -> str:
"""Show the news timeline as html """Show the news timeline as html
""" """
return html_timeline(css_cache, default_timeline, return html_timeline(css_cache, default_timeline,
@ -1681,7 +1693,7 @@ def html_inbox_news(css_cache: {}, default_timeline: str,
allow_local_network_access, text_mode_banner, allow_local_network_access, text_mode_banner,
access_keys, system_language, max_like_count, access_keys, system_language, max_like_count,
shared_items_federated_domains, signing_priv_key_pem, shared_items_federated_domains, signing_priv_key_pem,
cw_lists, lists_enabled) cw_lists, lists_enabled, timezone)
def html_outbox(css_cache: {}, default_timeline: str, def html_outbox(css_cache: {}, default_timeline: str,
@ -1710,7 +1722,8 @@ def html_outbox(css_cache: {}, default_timeline: str,
max_like_count: int, max_like_count: int,
shared_items_federated_domains: [], shared_items_federated_domains: [],
signing_priv_key_pem: str, signing_priv_key_pem: str,
cw_lists: {}, lists_enabled: str) -> str: cw_lists: {}, lists_enabled: str,
timezone: str) -> str:
"""Show the Outbox as html """Show the Outbox as html
""" """
manually_approve_followers = \ manually_approve_followers = \
@ -1736,4 +1749,4 @@ def html_outbox(css_cache: {}, default_timeline: str,
allow_local_network_access, text_mode_banner, allow_local_network_access, text_mode_banner,
access_keys, system_language, max_like_count, access_keys, system_language, max_like_count,
shared_items_federated_domains, signing_priv_key_pem, shared_items_federated_domains, signing_priv_key_pem,
cw_lists, lists_enabled) cw_lists, lists_enabled, timezone)