=> 0d01131a492261983ad9ed92b3f28284b998febe
[1mdiff --git a/50_bubble.py b/50_bubble.py[m [1mindex bc10f79..02b882e 100644[m [1m--- a/50_bubble.py[m [1m+++ b/50_bubble.py[m [36m@@ -51,7 +51,7 @@[m [mclass Bubble:[m return error.code, str(error)[m except Exception as fatal:[m import traceback[m [31m- traceback.print_exception(fatal)[m [32m+[m[32m traceback.print_tb(fatal.__traceback__)[m return 42, 'Bubble Error: ' + str(fatal)[:500].replace('\n', ' ')[m finally:[m db.close()[m [36m@@ -296,7 +296,7 @@[m [mBubble is open source:[m [m except Exception as x:[m import traceback[m [31m- traceback.print_exception(x)[m [32m+[m[32m traceback.print_tb(x.__traceback__)[m return 10, 'That name is already taken. ' + session.NAME_HINT[m [m if req.path == self.path + 'add-cert':[m [1mdiff --git a/model.py b/model.py[m [1mindex 8bcaf60..c2d3457 100644[m [1m--- a/model.py[m [1m+++ b/model.py[m [36m@@ -6,7 +6,7 @@[m [mimport re[m import shutil[m import time[m from typing import Union[m [31m-from utils import ago_text, clean_title, parse_at_names, GeminiError[m [32m+[m[32mfrom utils import ago_text, clean_title, parse_at_names, GeminiError, UTC[m [m [m def parse_asn1_time(asn1_bytes):[m [36m@@ -64,7 +64,7 @@[m [mclass Notification:[m self.post_issueid = post_issueid[m [m def ymd_date(self):[m [31m- dt = datetime.datetime.fromtimestamp(self.ts, datetime.UTC)[m [32m+[m[32m dt = datetime.datetime.fromtimestamp(self.ts, UTC)[m return dt.strftime('%Y-%m-%d')[m [m def age(self):[m [36m@@ -197,7 +197,7 @@[m [mclass Commit:[m self.ts = ts[m [m def ymd_date(self):[m [31m- dt = datetime.datetime.fromtimestamp(self.ts, datetime.UTC)[m [32m+[m[32m dt = datetime.datetime.fromtimestamp(self.ts, UTC)[m return dt.strftime('%Y-%m-%d')[m [m [m [36m@@ -240,11 +240,11 @@[m [mclass Post:[m return '(untitled issue)' if self.issueid else '(untitled post)'[m [m def ymd_date(self):[m [31m- dt = datetime.datetime.fromtimestamp(self.ts_created, datetime.UTC)[m [32m+[m[32m dt = datetime.datetime.fromtimestamp(self.ts_created, UTC)[m return dt.strftime('%Y-%m-%d')[m [m def ymd_hm_tz(self):[m [31m- dt = datetime.datetime.fromtimestamp(self.ts_created, datetime.UTC)[m [32m+[m[32m dt = datetime.datetime.fromtimestamp(self.ts_created, UTC)[m return dt.strftime('%Y-%m-%d %H:%M UTC')[m [m def age(self):[m [1mdiff --git a/subspace.py b/subspace.py[m [1mindex a0e824b..2477997 100644[m [1m--- a/subspace.py[m [1m+++ b/subspace.py[m [36m@@ -120,7 +120,7 @@[m [mdef subspace_admin_actions(session, action):[m page += 'Repository will be fetched soon.\n'[m else:[m n = db.count_commits(repo)[m [31m- page += f'{n} commits in history. Repository was last fetched on {datetime.datetime.fromtimestamp(repo.ts_fetch, datetime.UTC).strftime("%Y-%m-%d at %H:%M:%S %Z")}.\n'[m [32m+[m[32m page += f'{n} commits in history. Repository was last fetched on {datetime.datetime.fromtimestamp(repo.ts_fetch, UTC).strftime("%Y-%m-%d at %H:%M:%S %Z")}.\n'[m [m page += f'\n=> {admin_link}/repo/delete/{db.get_token(user)} ❌ Delete repository\n'[m [m [36m@@ -311,7 +311,7 @@[m [mdef listed_items(items):[m [m [m def make_timestamp(ts, fmt="%Y-%m-%d at %H:%M"):[m [31m- return datetime.datetime.fromtimestamp(ts, datetime.UTC).strftime(fmt)[m [32m+[m[32m return datetime.datetime.fromtimestamp(ts, UTC).strftime(fmt)[m [m [m class GempubArchive:[m [36m@@ -319,7 +319,7 @@[m [mclass GempubArchive:[m class Entry:[m def __init__(self, post, label, page, file=None):[m self.ts = post.ts_created[m [31m- self.dt = datetime.datetime.fromtimestamp(self.ts, datetime.UTC)[m [32m+[m[32m self.dt = datetime.datetime.fromtimestamp(self.ts, UTC)[m self.post_id = post.id[m self.subspace_id = post.subspace[m self.label = label[m [36m@@ -670,4 +670,4 @@[m [mdef export_gempub_archive(session):[m archive.render_file_entries()[m data = archive.compress()[m [m [31m- return 20, 'application/gpub+zip', data[m \ No newline at end of file[m [32m+[m[32m return 20, 'application/gpub+zip', data[m [1mdiff --git a/utils.py b/utils.py[m [1mindex 909aa49..c850703 100644[m [1m--- a/utils.py[m [1m+++ b/utils.py[m [36m@@ -3,6 +3,8 @@[m [mimport re[m import time[m import urllib.parse as urlparse[m [m [32m+[m[32mUTC = datetime.timezone.utc[m [32m+[m [m class GeminiError (Exception):[m def __init__(self, code, msg):[m [36m@@ -123,7 +125,7 @@[m [mdef time_delta_text(sec, date_ts, suffix='ago', now='Now',[m if hours <= 24:[m return f'{hours} hour{plural_s(hours)} {suffix}'[m days = int(sec / 3600 / 24)[m [31m- dt = datetime.datetime.fromtimestamp(date_ts, datetime.UTC)[m [32m+[m[32m dt = datetime.datetime.fromtimestamp(date_ts, UTC)[m age = date_prefix + dt.strftime(date_fmt)[m if days < 14:[m return age + f'{date_sep}{days} day{plural_s(days)} {suffix}'[m [36m@@ -181,4 +183,4 @@[m [mdef form_link(url_label: tuple):[m return url + ' ' + label[m if len(label) == 0:[m return url[m [31m- return ''[m \ No newline at end of file[m [32m+[m[32m return ''[m
text/gemini; charset=utf-8
This content has been proxied by September (3851b).