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 like import update_likes_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 undo_reaction_collection_entry
from utils import get_new_post_endpoints
@ -3544,6 +3547,10 @@ class PubServer(BaseHTTPRequestHandler):
if search_str.startswith('#'):
nickname = get_nickname_from_actor(actor_str)
# hashtag search
timezone = None
if self.server.account_timezone.get(nickname):
timezone = \
self.server.account_timezone.get(nickname)
hashtag_str = \
html_hashtag_search(self.server.css_cache,
nickname, domain, port,
@ -3568,7 +3575,8 @@ class PubServer(BaseHTTPRequestHandler):
self.server.max_like_count,
self.server.signing_priv_key_pem,
self.server.cw_lists,
self.server.lists_enabled)
self.server.lists_enabled,
timezone)
if hashtag_str:
msg = hashtag_str.encode('utf-8')
msglen = len(msg)
@ -3636,6 +3644,10 @@ class PubServer(BaseHTTPRequestHandler):
# your post history search
nickname = get_nickname_from_actor(actor_str)
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 = \
html_history_search(self.server.css_cache,
self.server.translate,
@ -3663,7 +3675,8 @@ class PubServer(BaseHTTPRequestHandler):
self.server.max_like_count,
self.server.signing_priv_key_pem,
self.server.cw_lists,
self.server.lists_enabled)
self.server.lists_enabled,
timezone)
if history_str:
msg = history_str.encode('utf-8')
msglen = len(msg)
@ -3704,6 +3717,10 @@ class PubServer(BaseHTTPRequestHandler):
# bookmark search
nickname = get_nickname_from_actor(actor_str)
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 = \
html_history_search(self.server.css_cache,
self.server.translate,
@ -3731,7 +3748,8 @@ class PubServer(BaseHTTPRequestHandler):
self.server.max_like_count,
self.server.signing_priv_key_pem,
self.server.cw_lists,
self.server.lists_enabled)
self.server.lists_enabled,
timezone)
if bookmarks_str:
msg = bookmarks_str.encode('utf-8')
msglen = len(msg)
@ -3811,6 +3829,10 @@ class PubServer(BaseHTTPRequestHandler):
self.server.cached_webfingers
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 = \
html_profile_after_search(self.server.css_cache,
recent_posts_cache,
@ -3840,7 +3862,8 @@ class PubServer(BaseHTTPRequestHandler):
self.server.max_like_count,
signing_priv_key_pem,
self.server.cw_lists,
self.server.lists_enabled)
self.server.lists_enabled,
timezone)
if profile_str:
msg = profile_str.encode('utf-8')
msglen = len(msg)
@ -5604,6 +5627,24 @@ class PubServer(BaseHTTPRequestHandler):
set_actor_languages(base_dir, actor_json, '')
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
current_tox_address = get_tox_address(actor_json)
if fields.get('toxAddress'):
@ -7835,6 +7876,10 @@ class PubServer(BaseHTTPRequestHandler):
nickname = nickname.split('/')[0]
if '?' in nickname:
nickname = nickname.split('?')[0]
timezone = None
if self.server.account_timezone.get(nickname):
timezone = \
self.server.account_timezone.get(nickname)
hashtag_str = \
html_hashtag_search(self.server.css_cache,
nickname, domain, port,
@ -7857,7 +7902,8 @@ class PubServer(BaseHTTPRequestHandler):
self.server.max_like_count,
self.server.signing_priv_key_pem,
self.server.cw_lists,
self.server.lists_enabled)
self.server.lists_enabled,
timezone)
if hashtag_str:
msg = hashtag_str.encode('utf-8')
msglen = len(msg)
@ -8047,6 +8093,10 @@ class PubServer(BaseHTTPRequestHandler):
follower_approval_active(base_dir,
self.post_to_nickname, domain)
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,
self.server.recent_posts_cache,
self.server.max_recent_posts,
@ -8074,7 +8124,8 @@ class PubServer(BaseHTTPRequestHandler):
manually_approve_followers,
False, True, False,
self.server.cw_lists,
self.server.lists_enabled)
self.server.lists_enabled,
timezone)
actor_absolute = self._get_instance_url(calling_domain) + actor
actor_path_str = \
@ -8516,6 +8567,10 @@ class PubServer(BaseHTTPRequestHandler):
follower_approval_active(base_dir,
self.post_to_nickname, domain)
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,
False,
self.server.recent_posts_cache,
@ -8545,7 +8600,8 @@ class PubServer(BaseHTTPRequestHandler):
manually_approve_followers,
False, True, False,
self.server.cw_lists,
self.server.lists_enabled)
self.server.lists_enabled,
timezone)
else:
print('WARN: Liked post not found: ' + liked_post_filename)
# clear the icon from the cache so that it gets updated
@ -8674,6 +8730,10 @@ class PubServer(BaseHTTPRequestHandler):
follower_approval_active(base_dir,
self.post_to_nickname, domain)
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,
False,
self.server.recent_posts_cache,
@ -8703,7 +8763,8 @@ class PubServer(BaseHTTPRequestHandler):
manually_approve_followers,
False, True, False,
self.server.cw_lists,
self.server.lists_enabled)
self.server.lists_enabled,
timezone)
else:
print('WARN: Unliked post not found: ' + liked_post_filename)
# clear the icon from the cache so that it gets updated
@ -8861,6 +8922,10 @@ class PubServer(BaseHTTPRequestHandler):
follower_approval_active(base_dir,
self.post_to_nickname, domain)
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,
False,
self.server.recent_posts_cache,
@ -8890,7 +8955,8 @@ class PubServer(BaseHTTPRequestHandler):
manually_approve_followers,
False, True, False,
self.server.cw_lists,
self.server.lists_enabled)
self.server.lists_enabled,
timezone)
else:
print('WARN: Emoji reaction post not found: ' +
reaction_post_filename)
@ -9038,6 +9104,10 @@ class PubServer(BaseHTTPRequestHandler):
follower_approval_active(base_dir,
self.post_to_nickname, domain)
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,
False,
self.server.recent_posts_cache,
@ -9067,7 +9137,8 @@ class PubServer(BaseHTTPRequestHandler):
manually_approve_followers,
False, True, False,
self.server.cw_lists,
self.server.lists_enabled)
self.server.lists_enabled,
timezone)
else:
print('WARN: Unreaction post not found: ' +
reaction_post_filename)
@ -9139,6 +9210,10 @@ class PubServer(BaseHTTPRequestHandler):
self._redirect_headers(actor_path_str, cookie, calling_domain)
return
timezone = None
if self.server.account_timezone.get(self.post_to_nickname):
timezone = \
self.server.account_timezone.get(self.post_to_nickname)
msg = \
html_emoji_reaction_picker(self.server.css_cache,
self.server.recent_posts_cache,
@ -9163,7 +9238,8 @@ class PubServer(BaseHTTPRequestHandler):
self.server.signing_priv_key_pem,
self.server.cw_lists,
self.server.lists_enabled,
timeline_str, page_number)
timeline_str, page_number,
timezone)
msg = msg.encode('utf-8')
msglen = len(msg)
self._set_headers('text/html', msglen,
@ -9260,6 +9336,10 @@ class PubServer(BaseHTTPRequestHandler):
follower_approval_active(base_dir,
self.post_to_nickname, domain)
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,
False,
self.server.recent_posts_cache,
@ -9289,7 +9369,8 @@ class PubServer(BaseHTTPRequestHandler):
manually_approve_followers,
False, True, False,
self.server.cw_lists,
self.server.lists_enabled)
self.server.lists_enabled,
timezone)
else:
print('WARN: Bookmarked post not found: ' + bookmark_filename)
# self._post_to_outbox(bookmark_json,
@ -9391,6 +9472,10 @@ class PubServer(BaseHTTPRequestHandler):
follower_approval_active(base_dir,
self.post_to_nickname, domain)
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,
False,
self.server.recent_posts_cache,
@ -9420,7 +9505,8 @@ class PubServer(BaseHTTPRequestHandler):
manually_approve_followers,
False, True, False,
self.server.cw_lists,
self.server.lists_enabled)
self.server.lists_enabled,
timezone)
else:
print('WARN: Unbookmarked post not found: ' +
bookmark_filename)
@ -9596,6 +9682,10 @@ class PubServer(BaseHTTPRequestHandler):
allow_downloads = False
show_avatar_options = True
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,
allow_downloads,
self.server.recent_posts_cache,
@ -9626,7 +9716,8 @@ class PubServer(BaseHTTPRequestHandler):
show_public_only, store_to_cache,
use_cache_only,
self.server.cw_lists,
self.server.lists_enabled)
self.server.lists_enabled,
timezone)
else:
print('WARN: Muted post not found: ' + mute_filename)
@ -9707,6 +9798,10 @@ class PubServer(BaseHTTPRequestHandler):
allow_downloads = False
show_avatar_options = True
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,
allow_downloads,
self.server.recent_posts_cache,
@ -9737,7 +9832,8 @@ class PubServer(BaseHTTPRequestHandler):
show_public_only, store_to_cache,
use_cache_only,
self.server.cw_lists,
self.server.lists_enabled)
self.server.lists_enabled,
timezone)
else:
print('WARN: Unmuted post not found: ' + mute_filename)
if calling_domain.endswith('.onion') and onion_domain:
@ -9830,6 +9926,10 @@ class PubServer(BaseHTTPRequestHandler):
twitter_replacement_domain = \
self.server.twitter_replacement_domain
peertube_instances = self.server.peertube_instances
timezone = None
if self.server.account_timezone.get(nickname):
timezone = \
self.server.account_timezone.get(nickname)
msg = \
html_post_replies(self.server.css_cache,
recent_posts_cache,
@ -9855,7 +9955,8 @@ class PubServer(BaseHTTPRequestHandler):
self.server.max_like_count,
self.server.signing_priv_key_pem,
self.server.cw_lists,
self.server.lists_enabled)
self.server.lists_enabled,
timezone)
msg = msg.encode('utf-8')
msglen = len(msg)
self._set_headers('text/html', msglen,
@ -9922,6 +10023,10 @@ class PubServer(BaseHTTPRequestHandler):
twitter_replacement_domain = \
self.server.twitter_replacement_domain
peertube_instances = self.server.peertube_instances
timezone = None
if self.server.account_timezone.get(nickname):
timezone = \
self.server.account_timezone.get(nickname)
msg = \
html_post_replies(self.server.css_cache,
recent_posts_cache,
@ -9947,7 +10052,8 @@ class PubServer(BaseHTTPRequestHandler):
self.server.max_like_count,
self.server.signing_priv_key_pem,
self.server.cw_lists,
self.server.lists_enabled)
self.server.lists_enabled,
timezone)
msg = msg.encode('utf-8')
msglen = len(msg)
self._set_headers('text/html', msglen,
@ -10027,6 +10133,11 @@ class PubServer(BaseHTTPRequestHandler):
base_dir, nickname, domain)
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 = \
html_profile(self.server.signing_priv_key_pem,
self.server.rss_icon_at_top,
@ -10059,7 +10170,8 @@ class PubServer(BaseHTTPRequestHandler):
roles_list,
None, None, self.server.cw_lists,
self.server.lists_enabled,
self.server.content_license_url)
self.server.content_license_url,
timezone)
msg = msg.encode('utf-8')
msglen = len(msg)
self._set_headers('text/html', msglen,
@ -10146,6 +10258,11 @@ class PubServer(BaseHTTPRequestHandler):
self.server.content_license_url
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 = \
html_profile(signing_priv_key_pem,
self.server.rss_icon_at_top,
@ -10179,7 +10296,8 @@ class PubServer(BaseHTTPRequestHandler):
None, None,
self.server.cw_lists,
self.server.lists_enabled,
content_license_url)
content_license_url,
timezone)
msg = msg.encode('utf-8')
msglen = len(msg)
self._set_headers('text/html', msglen,
@ -10320,6 +10438,10 @@ class PubServer(BaseHTTPRequestHandler):
return True
remove_post_interactions(pjo, True)
if self._request_http():
timezone = None
if self.server.account_timezone.get(nickname):
timezone = \
self.server.account_timezone.get(nickname)
msg = \
html_individual_post(self.server.css_cache,
self.server.recent_posts_cache,
@ -10345,7 +10467,8 @@ class PubServer(BaseHTTPRequestHandler):
self.server.max_like_count,
self.server.signing_priv_key_pem,
self.server.cw_lists,
self.server.lists_enabled)
self.server.lists_enabled,
timezone)
msg = msg.encode('utf-8')
msglen = len(msg)
self._set_headers('text/html', msglen,
@ -10573,6 +10696,10 @@ class PubServer(BaseHTTPRequestHandler):
self.server.shared_items_federated_domains
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,
default_timeline,
recent_posts_cache,
@ -10612,7 +10739,8 @@ class PubServer(BaseHTTPRequestHandler):
shared_items_federated_domains,
self.server.signing_priv_key_pem,
self.server.cw_lists,
self.server.lists_enabled)
self.server.lists_enabled,
timezone)
if getreq_start_time:
fitness_performance(getreq_start_time,
self.server.fitness,
@ -10727,6 +10855,10 @@ class PubServer(BaseHTTPRequestHandler):
self.server.twitter_replacement_domain
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 = \
html_inbox_dms(self.server.css_cache,
self.server.default_timeline,
@ -10766,7 +10898,8 @@ class PubServer(BaseHTTPRequestHandler):
shared_items_federated_domains,
self.server.signing_priv_key_pem,
self.server.cw_lists,
self.server.lists_enabled)
self.server.lists_enabled,
timezone)
msg = msg.encode('utf-8')
msglen = len(msg)
self._set_headers('text/html', msglen,
@ -10874,6 +11007,10 @@ class PubServer(BaseHTTPRequestHandler):
self.server.twitter_replacement_domain
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 = \
html_inbox_replies(self.server.css_cache,
self.server.default_timeline,
@ -10913,7 +11050,8 @@ class PubServer(BaseHTTPRequestHandler):
shared_items_federated_domains,
self.server.signing_priv_key_pem,
self.server.cw_lists,
self.server.lists_enabled)
self.server.lists_enabled,
timezone)
msg = msg.encode('utf-8')
msglen = len(msg)
self._set_headers('text/html', msglen,
@ -11018,6 +11156,10 @@ class PubServer(BaseHTTPRequestHandler):
self.server.allow_local_network_access
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 = \
html_inbox_media(self.server.css_cache,
self.server.default_timeline,
@ -11058,7 +11200,8 @@ class PubServer(BaseHTTPRequestHandler):
fed_domains,
self.server.signing_priv_key_pem,
self.server.cw_lists,
self.server.lists_enabled)
self.server.lists_enabled,
timezone)
msg = msg.encode('utf-8')
msglen = len(msg)
self._set_headers('text/html', msglen,
@ -11163,6 +11306,10 @@ class PubServer(BaseHTTPRequestHandler):
self.server.allow_local_network_access
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 = \
html_inbox_blogs(self.server.css_cache,
self.server.default_timeline,
@ -11203,7 +11350,8 @@ class PubServer(BaseHTTPRequestHandler):
fed_domains,
self.server.signing_priv_key_pem,
self.server.cw_lists,
self.server.lists_enabled)
self.server.lists_enabled,
timezone)
msg = msg.encode('utf-8')
msglen = len(msg)
self._set_headers('text/html', msglen,
@ -11316,6 +11464,10 @@ class PubServer(BaseHTTPRequestHandler):
fed_domains = \
self.server.shared_items_federated_domains
timezone = None
if self.server.account_timezone.get(nickname):
timezone = \
self.server.account_timezone.get(nickname)
msg = \
html_inbox_news(self.server.css_cache,
self.server.default_timeline,
@ -11357,7 +11509,8 @@ class PubServer(BaseHTTPRequestHandler):
fed_domains,
self.server.signing_priv_key_pem,
self.server.cw_lists,
self.server.lists_enabled)
self.server.lists_enabled,
timezone)
msg = msg.encode('utf-8')
msglen = len(msg)
self._set_headers('text/html', msglen,
@ -11473,6 +11626,10 @@ class PubServer(BaseHTTPRequestHandler):
self.server.twitter_replacement_domain
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 = \
html_inbox_features(self.server.css_cache,
self.server.default_timeline,
@ -11514,7 +11671,8 @@ class PubServer(BaseHTTPRequestHandler):
shared_items_federated_domains,
self.server.signing_priv_key_pem,
self.server.cw_lists,
self.server.lists_enabled)
self.server.lists_enabled,
timezone)
msg = msg.encode('utf-8')
msglen = len(msg)
self._set_headers('text/html', msglen,
@ -11585,6 +11743,10 @@ class PubServer(BaseHTTPRequestHandler):
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 = \
html_shares(self.server.css_cache,
self.server.default_timeline,
@ -11622,7 +11784,7 @@ class PubServer(BaseHTTPRequestHandler):
self.server.shared_items_federated_domains,
self.server.signing_priv_key_pem,
self.server.cw_lists,
self.server.lists_enabled)
self.server.lists_enabled, timezone)
msg = msg.encode('utf-8')
msglen = len(msg)
self._set_headers('text/html', msglen,
@ -11670,6 +11832,10 @@ class PubServer(BaseHTTPRequestHandler):
self.server.key_shortcuts[nickname]
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 = \
html_wanted(self.server.css_cache,
self.server.default_timeline,
@ -11707,7 +11873,8 @@ class PubServer(BaseHTTPRequestHandler):
self.server.shared_items_federated_domains,
self.server.signing_priv_key_pem,
self.server.cw_lists,
self.server.lists_enabled)
self.server.lists_enabled,
timezone)
msg = msg.encode('utf-8')
msglen = len(msg)
self._set_headers('text/html', msglen,
@ -11794,6 +11961,10 @@ class PubServer(BaseHTTPRequestHandler):
self.server.twitter_replacement_domain
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 = \
html_bookmarks(self.server.css_cache,
self.server.default_timeline,
@ -11834,7 +12005,8 @@ class PubServer(BaseHTTPRequestHandler):
shared_items_federated_domains,
self.server.signing_priv_key_pem,
self.server.cw_lists,
self.server.lists_enabled)
self.server.lists_enabled,
timezone)
msg = msg.encode('utf-8')
msglen = len(msg)
self._set_headers('text/html', msglen,
@ -11934,6 +12106,10 @@ class PubServer(BaseHTTPRequestHandler):
access_keys = \
self.server.key_shortcuts[nickname]
timezone = None
if self.server.account_timezone.get(nickname):
timezone = \
self.server.account_timezone.get(nickname)
msg = \
html_outbox(self.server.css_cache,
self.server.default_timeline,
@ -11972,7 +12148,8 @@ class PubServer(BaseHTTPRequestHandler):
self.server.shared_items_federated_domains,
self.server.signing_priv_key_pem,
self.server.cw_lists,
self.server.lists_enabled)
self.server.lists_enabled,
timezone)
msg = msg.encode('utf-8')
msglen = len(msg)
self._set_headers('text/html', msglen,
@ -12068,6 +12245,10 @@ class PubServer(BaseHTTPRequestHandler):
self.server.allow_local_network_access
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 = \
html_moderation(self.server.css_cache,
self.server.default_timeline,
@ -12107,7 +12288,8 @@ class PubServer(BaseHTTPRequestHandler):
shared_items_federated_domains,
self.server.signing_priv_key_pem,
self.server.cw_lists,
self.server.lists_enabled)
self.server.lists_enabled,
timezone)
msg = msg.encode('utf-8')
msglen = len(msg)
self._set_headers('text/html', msglen,
@ -12198,6 +12380,10 @@ class PubServer(BaseHTTPRequestHandler):
base_dir, nickname, domain)
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 = \
html_profile(self.server.signing_priv_key_pem,
self.server.rss_icon_at_top,
@ -12232,7 +12418,8 @@ class PubServer(BaseHTTPRequestHandler):
page_number, SHARES_PER_PAGE,
self.server.cw_lists,
self.server.lists_enabled,
self.server.content_license_url)
self.server.content_license_url,
timezone)
msg = msg.encode('utf-8')
msglen = len(msg)
self._set_headers('text/html', msglen,
@ -12307,6 +12494,7 @@ class PubServer(BaseHTTPRequestHandler):
access_keys = self.server.access_keys
city = None
timezone = None
if '/users/' in path:
nickname = path.split('/users/')[1]
if '/' in nickname:
@ -12317,6 +12505,9 @@ class PubServer(BaseHTTPRequestHandler):
city = get_spoofed_city(self.server.city,
base_dir, nickname, domain)
if self.server.account_timezone.get(nickname):
timezone = \
self.server.account_timezone.get(nickname)
content_license_url = \
self.server.content_license_url
shared_items_federated_domains = \
@ -12356,7 +12547,8 @@ class PubServer(BaseHTTPRequestHandler):
FOLLOWS_PER_PAGE,
self.server.cw_lists,
self.server.lists_enabled,
content_license_url).encode('utf-8')
content_license_url,
timezone).encode('utf-8')
msglen = len(msg)
self._set_headers('text/html',
msglen, cookie, calling_domain, False)
@ -12428,6 +12620,7 @@ class PubServer(BaseHTTPRequestHandler):
access_keys = self.server.access_keys
city = None
timezone = None
if '/users/' in path:
nickname = path.split('/users/')[1]
if '/' in nickname:
@ -12438,6 +12631,9 @@ class PubServer(BaseHTTPRequestHandler):
city = get_spoofed_city(self.server.city,
base_dir, nickname, domain)
if self.server.account_timezone.get(nickname):
timezone = \
self.server.account_timezone.get(nickname)
content_license_url = \
self.server.content_license_url
shared_items_federated_domains = \
@ -12478,7 +12674,8 @@ class PubServer(BaseHTTPRequestHandler):
FOLLOWS_PER_PAGE,
self.server.cw_lists,
self.server.lists_enabled,
content_license_url).encode('utf-8')
content_license_url,
timezone).encode('utf-8')
msglen = len(msg)
self._set_headers('text/html', msglen,
cookie, calling_domain, False)
@ -12568,6 +12765,7 @@ class PubServer(BaseHTTPRequestHandler):
access_keys = self.server.access_keys
city = None
timezone = None
if '/users/' in path:
nickname = path.split('/users/')[1]
if '/' in nickname:
@ -12578,6 +12776,9 @@ class PubServer(BaseHTTPRequestHandler):
city = get_spoofed_city(self.server.city,
base_dir, nickname, domain)
if self.server.account_timezone.get(nickname):
timezone = \
self.server.account_timezone.get(nickname)
msg = \
html_profile(self.server.signing_priv_key_pem,
self.server.rss_icon_at_top,
@ -12612,7 +12813,8 @@ class PubServer(BaseHTTPRequestHandler):
None, None, None,
self.server.cw_lists,
self.server.lists_enabled,
self.server.content_license_url).encode('utf-8')
self.server.content_license_url,
timezone).encode('utf-8')
msglen = len(msg)
self._set_headers('text/html', msglen,
cookie, calling_domain, False)
@ -19217,6 +19419,8 @@ def run_daemon(dyslexic_font: bool,
# scan the theme directory for any svg files containing scripts
assert not scan_themes_for_scripts(base_dir)
httpd.account_timezone = load_account_timezones(base_dir)
httpd.post_to_nickname = None
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'
blocked_cache = {}
languages_understood = [system_language]
languages_understood = []
indent = ' '
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')
parser.add_argument('--language', dest='language',
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',
type=str, default=None,
help='Adds a new account')
@ -1394,7 +1399,8 @@ if args.message:
signing_priv_key_pem = None
if args.secure_mode:
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)
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 reaction import update_reaction_collection
from reaction import valid_emoji_content
from utils import get_account_timezone
from utils import domain_permitted
from utils import is_group_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,
signing_priv_key_pem: str,
cw_lists: {},
lists_enabled: str) -> None:
lists_enabled: str,
timezone: str) -> None:
"""Converts the json post into html and stores it in a cache
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,
theme_name, system_language, max_like_count,
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:
@ -1100,6 +1102,7 @@ def _receive_like(recent_posts_cache: {},
manually_approve_followers = \
follower_approval_active(base_dir, handle_name, domain)
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,
recent_posts_cache, max_recent_posts,
translate, page_number, base_dir,
@ -1118,7 +1121,7 @@ def _receive_like(recent_posts_cache: {},
show_individual_post_icons,
manually_approve_followers,
False, True, False, cw_lists,
lists_enabled)
lists_enabled, timezone)
return True
@ -1213,6 +1216,7 @@ def _receive_undo_like(recent_posts_cache: {},
manually_approve_followers = \
follower_approval_active(base_dir, handle_name, domain)
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,
recent_posts_cache, max_recent_posts,
translate, page_number, base_dir,
@ -1231,7 +1235,7 @@ def _receive_undo_like(recent_posts_cache: {},
show_individual_post_icons,
manually_approve_followers,
False, True, False, cw_lists,
lists_enabled)
lists_enabled, timezone)
return True
@ -1362,6 +1366,7 @@ def _receive_reaction(recent_posts_cache: {},
manually_approve_followers = \
follower_approval_active(base_dir, handle_name, domain)
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,
recent_posts_cache, max_recent_posts,
translate, page_number, base_dir,
@ -1381,7 +1386,7 @@ def _receive_reaction(recent_posts_cache: {},
show_individual_post_icons,
manually_approve_followers,
False, True, False, cw_lists,
lists_enabled)
lists_enabled, timezone)
return True
@ -1495,6 +1500,7 @@ def _receive_undo_reaction(recent_posts_cache: {},
manually_approve_followers = \
follower_approval_active(base_dir, handle_name, domain)
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,
recent_posts_cache, max_recent_posts,
translate, page_number, base_dir,
@ -1514,7 +1520,7 @@ def _receive_undo_reaction(recent_posts_cache: {},
show_individual_post_icons,
manually_approve_followers,
False, True, False, cw_lists,
lists_enabled)
lists_enabled, timezone)
return True
@ -1606,6 +1612,7 @@ def _receive_bookmark(recent_posts_cache: {},
manually_approve_followers = \
follower_approval_active(base_dir, nickname, domain)
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,
recent_posts_cache, max_recent_posts,
translate, page_number, base_dir,
@ -1624,7 +1631,7 @@ def _receive_bookmark(recent_posts_cache: {},
show_individual_post_icons,
manually_approve_followers,
False, True, False, cw_lists,
lists_enabled)
lists_enabled, timezone)
return True
@ -1720,6 +1727,7 @@ def _receive_undo_bookmark(recent_posts_cache: {},
manually_approve_followers = \
follower_approval_active(base_dir, nickname, domain)
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,
recent_posts_cache, max_recent_posts,
translate, page_number, base_dir,
@ -1737,7 +1745,8 @@ def _receive_undo_bookmark(recent_posts_cache: {},
max_like_count, not_dm,
show_individual_post_icons,
manually_approve_followers,
False, True, False, cw_lists, lists_enabled)
False, True, False, cw_lists, lists_enabled,
timezone)
return True
@ -1926,6 +1935,7 @@ def _receive_announce(recent_posts_cache: {},
not_dm = True
if debug:
print('Generating html for announce ' + message_json['id'])
timezone = get_account_timezone(base_dir, nickname, domain)
announce_html = \
individual_post_as_html(signing_priv_key_pem, True,
recent_posts_cache, max_recent_posts,
@ -1945,7 +1955,7 @@ def _receive_announce(recent_posts_cache: {},
show_individual_post_icons,
manually_approve_followers,
False, True, False, cw_lists,
lists_enabled)
lists_enabled, timezone)
if not announce_html:
print('WARN: Unable to generate html for announce ' +
str(message_json))
@ -3060,6 +3070,7 @@ def _receive_question_vote(base_dir: str, nickname: str, domain: str,
manually_approve_followers = \
follower_approval_active(base_dir, nickname, domain)
not_dm = not is_dm(question_json)
timezone = get_account_timezone(base_dir, nickname, domain)
individual_post_as_html(signing_priv_key_pem, False,
recent_posts_cache, max_recent_posts,
translate, page_number, base_dir,
@ -3078,7 +3089,7 @@ def _receive_question_vote(base_dir: str, nickname: str, domain: str,
show_individual_post_icons,
manually_approve_followers,
False, True, False, cw_lists,
lists_enabled)
lists_enabled, timezone)
# add id to inbox index
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]
allow_local_net_access = allow_local_network_access
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,
max_recent_posts,
translate, base_dir,
@ -3620,7 +3633,8 @@ def _inbox_after_initial(recent_posts_cache: {}, max_recent_posts: int,
max_like_count,
signing_priv_key_pem,
cw_lists,
lists_enabled)
lists_enabled,
timezone)
if debug:
time_diff = \
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():
destination = \
queue_json['destination'].replace(inbox_handle, handle)
languages_understood = [system_language]
languages_understood = []
_inbox_after_initial(recent_posts_cache,
max_recent_posts,
session, key_id, handle,

View File

@ -51,8 +51,11 @@ def set_actor_languages(base_dir: str, actor_json: {},
languages_str: str) -> None:
"""Sets the languages used by the given actor
"""
separator = ','
if '/' in languages_str:
languages_str = languages_str.strip()
separator = None
if ',' in languages_str:
separator = ','
elif '/' in languages_str:
separator = '/'
elif ',' in languages_str:
separator = ','
@ -62,7 +65,10 @@ def set_actor_languages(base_dir: str, actor_json: {},
separator = '+'
elif ' ' in languages_str:
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 = ''
for lang in lang_list:
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 send_to_followers_thread
from posts import send_to_named_addresses_thread
from utils import get_account_timezone
from utils import has_object_stringType
from utils import get_base_content_from_post
from utils import has_object_dict
@ -454,6 +455,9 @@ def post_message_to_outbox(session, translate: {},
manually_approve_followers = \
follower_approval_active(base_dir,
post_to_nickname, domain)
timezone = \
get_account_timezone(base_dir,
post_to_nickname, domain)
individual_post_as_html(signing_priv_key_pem,
False, recent_posts_cache,
max_recent_posts,
@ -477,7 +481,8 @@ def post_message_to_outbox(session, translate: {},
show_individual_post_icons,
manually_approve_followers,
False, True, use_cache_only,
cw_lists, lists_enabled)
cw_lists, lists_enabled,
timezone)
if outbox_announce(recent_posts_cache,
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_unfollow_request_via_server
from siteactive import site_is_active
from utils import convert_published_to_local_timezone
from utils import convert_to_snake_case
from utils import get_sha_256
from utils import dangerous_svg
@ -6628,6 +6629,26 @@ def _test_safe_webtext() -> None:
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():
base_dir = os.getcwd()
print('Running tests...')
@ -6644,6 +6665,7 @@ def run_all_tests():
'message_json', 'liked_post_json'])
_test_checkbox_names()
_test_functions()
_test_published_to_local_timezone()
_test_safe_webtext()
_test_get_link_from_rss_item()
_test_xml_podcast_dict(base_dir)

View File

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

View File

@ -510,5 +510,6 @@
"Multi Status": "Estat múltiple",
"Lots of things": "Moltes coses",
"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",
"Lots of things": "Llawer o pethau",
"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",
"Lots of things": "Viele Dinge",
"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",
"Lots of things": "Lots of things",
"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",
"Lots of things": "Muchas cosas",
"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",
"Lots of things": "Beaucoup de choses",
"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",
"Lots of things": "A lán rudaí",
"Created": "Cruthaithe",
"It is done": "Déantar é"
"It is done": "Déantar é",
"Time Zone": "Crios Ama"
}

View File

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

View File

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

View File

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

View File

@ -510,5 +510,6 @@
"Multi Status": "Multi Status",
"Lots of things": "Gelek tişt",
"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",
"Lots of things": "Lots of things",
"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",
"Lots of things": "Muitas coisas",
"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": "Мульти статус",
"Lots of things": "Много всего",
"Created": "Созданный",
"It is done": "Сделано"
"It is done": "Сделано",
"Time Zone": "Часовой пояс"
}

View File

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

View File

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

View File

@ -15,6 +15,7 @@ import datetime
import json
import idna
import locale
from dateutil.tz import tz
from pprint import pprint
from cryptography.hazmat.backends import default_backend
from cryptography.hazmat.primitives import hashes
@ -78,6 +79,8 @@ def get_actor_languages_list(actor_json: {}) -> []:
lang_list_temp = lang_str.split('+')
elif ' ' in lang_str:
lang_list_temp = lang_str.split(' ')
else:
return [lang_str]
lang_list = []
for lang in lang_list_temp:
lang = lang.strip()
@ -3348,3 +3351,68 @@ def valid_hash_tag(hashtag: str) -> bool:
if _is_valid_language(hashtag):
return True
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_alt_path
from utils import acct_dir
from utils import get_account_timezone
from webapp_utils import set_custom_background
from webapp_utils import html_header_with_external_style
from webapp_utils import html_footer
@ -64,6 +65,7 @@ def html_confirm_delete(css_cache: {},
get_config_param(base_dir, 'instanceTitle')
delete_post_str = \
html_header_with_external_style(css_filename, instance_title, None)
timezone = get_account_timezone(base_dir, nickname, domain)
delete_post_str += \
individual_post_as_html(signing_priv_key_pem,
True, recent_posts_cache, max_recent_posts,
@ -79,7 +81,7 @@ def html_confirm_delete(css_cache: {},
peertube_instances, allow_local_network_access,
theme_name, system_language, max_like_count,
False, False, False, False, False, False,
cw_lists, lists_enabled)
cw_lists, lists_enabled, timezone)
delete_post_str += '<center>'
delete_post_str += \
' <p class="followText">' + \

View File

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

View File

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

View File

@ -54,7 +54,8 @@ def html_moderation(css_cache: {}, default_timeline: str,
max_like_count: int,
shared_items_federated_domains: [],
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
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,
text_mode_banner, access_keys, system_language,
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: {},

View File

@ -23,6 +23,7 @@ from posts import post_is_muted
from posts import get_person_box
from posts import download_announce
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_html
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: {},
show_published_date_only: bool) -> str:
show_published_date_only: bool,
timezone: str) -> str:
"""Return the html for the published date on a post
"""
published_str = ''
@ -862,6 +864,11 @@ def _get_published_date_str(post_json_object: {},
published_str = \
published_str.replace('T', ' ').split('.')[0]
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:
published_str = datetime_object.strftime("%a %b %d, %H:%M")
else:
@ -1366,7 +1373,8 @@ def individual_post_as_html(signing_priv_key_pem: str,
store_to_cache: bool,
use_cache_only: bool,
cw_lists: {},
lists_enabled: str) -> str:
lists_enabled: str,
timezone: str) -> str:
""" Shows a single post as html
"""
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)
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')
@ -2038,7 +2047,8 @@ def html_individual_post(css_cache: {},
allow_local_network_access: bool,
theme_name: str, system_language: str,
max_like_count: int, signing_priv_key_pem: str,
cw_lists: {}, lists_enabled: str) -> str:
cw_lists: {}, lists_enabled: str,
timezone: str) -> str:
"""Show an individual post as html
"""
original_post_json = post_json_object
@ -2104,7 +2114,7 @@ def html_individual_post(css_cache: {},
allow_local_network_access, theme_name,
system_language, max_like_count,
False, authorized, False, False, False, False,
cw_lists, lists_enabled)
cw_lists, lists_enabled, timezone)
message_id = remove_id_ending(post_json_object['id'])
# show the previous posts
@ -2139,7 +2149,8 @@ def html_individual_post(css_cache: {},
max_like_count,
False, authorized,
False, False, False, False,
cw_lists, lists_enabled) + post_str
cw_lists, lists_enabled,
timezone) + post_str
# show the following posts
post_filename = locate_post(base_dir, nickname, domain, message_id)
@ -2176,7 +2187,8 @@ def html_individual_post(css_cache: {},
max_like_count,
False, authorized,
False, False, False, False,
cw_lists, lists_enabled)
cw_lists, lists_enabled,
timezone)
css_filename = base_dir + '/epicyon-profile.css'
if os.path.isfile(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,
max_like_count: int,
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
"""
replies_str = ''
@ -2228,7 +2241,8 @@ def html_post_replies(css_cache: {},
max_like_count,
False, False, False, False,
False, False,
cw_lists, lists_enabled)
cw_lists, lists_enabled,
timezone)
css_filename = base_dir + '/epicyon-profile.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,
max_like_count: int, signing_priv_key_pem: 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
"""
reacted_to_post_str = \
@ -2280,7 +2295,7 @@ def html_emoji_reaction_picker(css_cache: {},
theme_name, system_language,
max_like_count,
False, False, False, False, False, False,
cw_lists, lists_enabled)
cw_lists, lists_enabled, timezone)
reactions_filename = base_dir + '/emoji/reactions.json'
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 local_actor_url
from utils import get_reply_interval_hours
from utils import get_account_timezone
from languages import get_actor_languages
from skills import get_skills
from theme import get_themes_list
@ -142,7 +143,8 @@ def html_profile_after_search(css_cache: {},
system_language: 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 a profile page after a search for a fediverse address
"""
http = False
@ -354,7 +356,8 @@ def html_profile_after_search(css_cache: {},
max_like_count,
False, False, False,
False, False, False,
cw_lists, lists_enabled)
cw_lists, lists_enabled,
timezone)
i += 1
if i >= 8:
break
@ -576,7 +579,8 @@ def html_profile(signing_priv_key_pem: str,
extraJson: {}, page_number: int,
max_items_per_page: int,
cw_lists: {}, lists_enabled: str,
content_license_url: str) -> str:
content_license_url: str,
timezone: str) -> str:
"""Show the profile page as html
"""
nickname = profile_json['preferredUsername']
@ -986,7 +990,8 @@ def html_profile(signing_priv_key_pem: str,
theme, system_language,
max_like_count,
signing_priv_key_pem,
cw_lists, lists_enabled) + license_str
cw_lists, lists_enabled,
timezone) + license_str
if not is_group:
if selected == 'following':
profile_str += \
@ -1059,7 +1064,8 @@ def _html_profile_posts(recent_posts_cache: {}, max_recent_posts: int,
theme_name: str, system_language: str,
max_like_count: int,
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
These should only be public posts
"""
@ -1107,7 +1113,8 @@ def _html_profile_posts(recent_posts_cache: {}, max_recent_posts: int,
max_like_count,
False, False, False,
True, False, False,
cw_lists, lists_enabled)
cw_lists, lists_enabled,
timezone)
if post_str:
profile_str += post_str + separator_str
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,
moved_to: str, donate_url: str, website_url: str,
blog_address: str, actor_json: {},
translate: {}) -> str:
translate: {},
nickname: str, domain: str) -> str:
"""main info on edit profile screen
"""
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',
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'
return edit_profile_form
@ -2296,7 +2309,8 @@ def html_edit_profile(css_cache: {}, translate: {}, base_dir: str, path: str,
edit_profile_form += \
_html_edit_profile_main(base_dir, display_nickname, bio_str,
moved_to, donate_url, website_url,
blog_address, actor_json, translate)
blog_address, actor_json, translate,
nickname, domain)
# Option checkboxes
edit_profile_form += \

View File

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

View File

@ -454,7 +454,8 @@ def html_timeline(css_cache: {}, default_timeline: str,
max_like_count: int,
shared_items_federated_domains: [],
signing_priv_key_pem: str,
cw_lists: {}, lists_enabled: str) -> str:
cw_lists: {}, lists_enabled: str,
timezone: str) -> str:
"""Show the timeline as html
"""
enable_timing_log = False
@ -930,7 +931,8 @@ def html_timeline(css_cache: {}, default_timeline: str,
show_individual_post_icons,
manually_approve_followers,
False, True, use_cache_only,
cw_lists, lists_enabled)
cw_lists, lists_enabled,
timezone)
_log_timeline_timing(enable_timing_log,
timeline_start_time, box_name, '12')
@ -1158,7 +1160,8 @@ def html_shares(css_cache: {}, default_timeline: str,
max_like_count: int,
shared_items_federated_domains: [],
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
"""
manually_approve_followers = \
@ -1188,7 +1191,7 @@ def html_shares(css_cache: {}, default_timeline: str,
access_keys, system_language, max_like_count,
shared_items_federated_domains,
signing_priv_key_pem,
cw_lists, lists_enabled)
cw_lists, lists_enabled, timezone)
def html_wanted(css_cache: {}, default_timeline: str,
@ -1216,7 +1219,8 @@ def html_wanted(css_cache: {}, default_timeline: str,
max_like_count: int,
shared_items_federated_domains: [],
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
"""
manually_approve_followers = \
@ -1246,7 +1250,7 @@ def html_wanted(css_cache: {}, default_timeline: str,
access_keys, system_language, max_like_count,
shared_items_federated_domains,
signing_priv_key_pem,
cw_lists, lists_enabled)
cw_lists, lists_enabled, timezone)
def html_inbox(css_cache: {}, default_timeline: str,
@ -1275,7 +1279,8 @@ def html_inbox(css_cache: {}, default_timeline: str,
max_like_count: int,
shared_items_federated_domains: [],
signing_priv_key_pem: str,
cw_lists: {}, lists_enabled: str) -> str:
cw_lists: {}, lists_enabled: str,
timezone: str) -> str:
"""Show the inbox as html
"""
manually_approve_followers = \
@ -1305,7 +1310,7 @@ def html_inbox(css_cache: {}, default_timeline: str,
access_keys, system_language, max_like_count,
shared_items_federated_domains,
signing_priv_key_pem,
cw_lists, lists_enabled)
cw_lists, lists_enabled, timezone)
def html_bookmarks(css_cache: {}, default_timeline: str,
@ -1334,7 +1339,8 @@ def html_bookmarks(css_cache: {}, default_timeline: str,
max_like_count: int,
shared_items_federated_domains: [],
signing_priv_key_pem: str,
cw_lists: {}, lists_enabled: str) -> str:
cw_lists: {}, lists_enabled: str,
timezone: str) -> str:
"""Show the bookmarks as html
"""
manually_approve_followers = \
@ -1363,7 +1369,7 @@ def html_bookmarks(css_cache: {}, default_timeline: str,
allow_local_network_access, text_mode_banner,
access_keys, system_language, max_like_count,
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,
@ -1392,7 +1398,8 @@ def html_inbox_dms(css_cache: {}, default_timeline: str,
max_like_count: int,
shared_items_federated_domains: [],
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
"""
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,
shared_items_federated_domains,
signing_priv_key_pem,
cw_lists, lists_enabled)
cw_lists, lists_enabled, timezone)
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,
shared_items_federated_domains: [],
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
"""
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,
access_keys, system_language, max_like_count,
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,
@ -1499,7 +1507,8 @@ def html_inbox_media(css_cache: {}, default_timeline: str,
max_like_count: int,
shared_items_federated_domains: [],
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
"""
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,
access_keys, system_language, max_like_count,
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,
@ -1552,7 +1561,8 @@ def html_inbox_blogs(css_cache: {}, default_timeline: str,
max_like_count: int,
shared_items_federated_domains: [],
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
"""
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,
access_keys, system_language, max_like_count,
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,
@ -1606,7 +1616,8 @@ def html_inbox_features(css_cache: {}, default_timeline: str,
max_like_count: int,
shared_items_federated_domains: [],
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
"""
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,
access_keys, system_language, max_like_count,
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,
@ -1658,7 +1669,8 @@ def html_inbox_news(css_cache: {}, default_timeline: str,
max_like_count: int,
shared_items_federated_domains: [],
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
"""
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,
access_keys, system_language, max_like_count,
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,
@ -1710,7 +1722,8 @@ def html_outbox(css_cache: {}, default_timeline: str,
max_like_count: int,
shared_items_federated_domains: [],
signing_priv_key_pem: str,
cw_lists: {}, lists_enabled: str) -> str:
cw_lists: {}, lists_enabled: str,
timezone: str) -> str:
"""Show the Outbox as html
"""
manually_approve_followers = \
@ -1736,4 +1749,4 @@ def html_outbox(css_cache: {}, default_timeline: str,
allow_local_network_access, text_mode_banner,
access_keys, system_language, max_like_count,
shared_items_federated_domains, signing_priv_key_pem,
cw_lists, lists_enabled)
cw_lists, lists_enabled, timezone)