diff --git a/app.py b/app.py index dbfd372..722e16b 100644 --- a/app.py +++ b/app.py @@ -6,6 +6,7 @@ import mimetypes import os import urllib from datetime import datetime +from datetime import timezone from functools import wraps from typing import Any from typing import Dict @@ -18,6 +19,7 @@ import piexif import pymongo import timeago from bson.objectid import ObjectId +from dateutil import parser from flask import Flask from flask import Response from flask import abort @@ -103,10 +105,27 @@ def verify_pass(pwd): @app.context_processor def inject_config(): + q = { + "type": "Create", + "activity.object.type": "Note", + "activity.object.inReplyTo": None, + "meta.deleted": False, + } + notes_count = DB.outbox.find( + {"$or": [q, {"type": "Announce", "meta.undo": False}]} + ).count() + q = {"type": "Create", "activity.object.type": "Note", "meta.deleted": False} + with_replies_count = DB.outbox.find( + {"$or": [q, {"type": "Announce", "meta.undo": False}]} + ).count() return dict( microblogpub_version=VERSION, config=config, logged_in=session.get("logged_in", False), + followers_count=DB.followers.count(), + following_count=DB.following.count(), + notes_count=notes_count, + with_replies_count=with_replies_count, ) @@ -183,24 +202,16 @@ def get_actor(url): @app.template_filter() def format_time(val): if val: - return datetime.strftime( - datetime.strptime(val, "%Y-%m-%dT%H:%M:%SZ"), "%B %d, %Y, %H:%M %p" - ) + dt = parser.parse(val) + return datetime.strftime(dt, "%B %d, %Y, %H:%M %p") return val @app.template_filter() def format_timeago(val): if val: - try: - return timeago.format( - datetime.strptime(val, "%Y-%m-%dT%H:%M:%SZ"), datetime.utcnow() - ) - except Exception: - return timeago.format( - datetime.strptime(val, "%Y-%m-%dT%H:%M:%S.%fZ"), datetime.utcnow() - ) - + dt = parser.parse(val) + return timeago.format(dt, datetime.now(timezone.utc)) return val diff --git a/requirements.txt b/requirements.txt index eb16141..3c3b9a3 100644 --- a/requirements.txt +++ b/requirements.txt @@ -1,3 +1,4 @@ +python-dateutil libsass gunicorn piexif diff --git a/sass/base_theme.scss b/sass/base_theme.scss index 775019a..00174ac 100644 --- a/sass/base_theme.scss +++ b/sass/base_theme.scss @@ -77,7 +77,15 @@ a:hover { } } a { - padding: 2px 7px; + padding: 5px 10px; + small.badge { + background-color: $color-menu-background; + color: $color-light; + border-radius: 2px; + margin-left: 5px; + padding: 3px 5px 0px 5px; + font-weight: bold; + } } a.selected { background: $primary-color; @@ -88,6 +96,11 @@ a:hover { background: $primary-color; color: $background-color; text-decoration: none; + border-radius: 2px; + .badge { + color: $primary-color; + background: $background-color; + } } } } @@ -105,7 +118,7 @@ a:hover { margin-bottom: 40px; .actor-icon { - width:120px; + width: 120px; border-radius:2px; } @@ -117,7 +130,7 @@ a:hover { overflow: hidden; } } -.actor-box { +.actor-box-big { display: block; text-decoration: none; @@ -206,19 +219,19 @@ form.action-form { } .summary { color: $color-summary; - font-size:1.3em; - margin-top:50px; - margin-bottom:70px; + font-size: 1.3em; + margin-top: 60px; + margin-bottom: 50px; } .summary a, .summay a:hover { color: $color-summary; - text-decoration:underline; + text-decoration: underline; } #followers, #following, #new { - margin-top:50px; + margin-top: 50px; } #admin { - margin-top:50px; + margin-top: 50px; } textarea, input { background: $color-menu-background; diff --git a/static/css/theme.css b/static/css/theme.css index 65dc70b..a4e9946 100644 --- a/static/css/theme.css +++ b/static/css/theme.css @@ -1 +1 @@ -.note-container p:first-child{margin-top:0}html,body{height:100%}body{background-color:#eee;color:#111;display:flex;flex-direction:column}.base-container{flex:1 0 auto}.footer{flex-shrink:0}a,h1,h2,h3,h4,h5,h6{color:#333}a{text-decoration:none}a:hover{text-decoration:underline}.gold{color:#1d781d}#header{margin-bottom:40px}#header .title{font-size:1.2em;padding-right:15px;color:#333}#header .title:hover{text-decoration:none}#header .subtitle-username{color:#111}#header .menu{padding:20px 0 10px 0}#header .menu ul{display:inline;list-style-type:none;padding:0}#header .menu ul li{float:left;padding-right:10px;margin-bottom:10px}#header .menu a{padding:2px 7px}#header .menu a.selected{background:#1d781d;color:#eee;border-radius:2px}#header .menu a:hover{background:#1d781d;color:#eee;text-decoration:none}#container{width:90%;max-width:720px;margin:40px auto}#container #notes{margin-top:20px}.actor-box{display:block;text-decoration:none;margin-bottom:40px}.actor-box .actor-icon{width:120px;border-radius:2px}.actor-box h3{margin:0}.actor-box .actor-inline{text-overflow:ellipsis;white-space:nowrap;overflow:hidden}.actor-box{display:block;text-decoration:none}.actor-box .actor-box-wrapper{margin-bottom:40px}.actor-box .actor-box-wrapper .actor-icon{width:120px;border-radius:2px}.actor-box .actor-box-wrapper h3{margin:0}.note{display:flex;margin-bottom:70px}.note .l{color:#333}.note .h-card{flex:initial;width:50px}.note .u-photo{width:50px;border-radius:2px}.note .note-wrapper{flex:1;padding-left:15px}.note .bottom-bar{margin-top:10px}.note .img-attachment{max-width:100%;border-radius:2px}.note h3{font-size:1.1em;color:#555}.note strong{font-weight:600}.note .note-container{clear:right;padding:10px 0}.bar-item{background:#ddd;padding:5px;color:#555;margin-right:5px;border-radius:2px}button.bar-item{border:0}form.action-form{display:inline}.perma{font-size:1.25em}.bottom-bar .perma-item{margin-right:5px}.bottom-bar a.bar-item:hover{text-decoration:none}.footer>div{width:90%;max-width:720px;margin:40px auto}.footer a,.footer a:hover,.footer a:visited{text-decoration:underline;color:#111}.summary{color:#111;font-size:1.3em;margin-top:50px;margin-bottom:70px}.summary a,.summay a:hover{color:#111;text-decoration:underline}#followers,#following,#new{margin-top:50px}#admin{margin-top:50px}textarea,input{background:#ddd;padding:10px;color:#555;border:0px;border-radius:2px}input{padding:10px}input[type=submit]{color:#1d781d;text-transform:uppercase} +.note-container p:first-child{margin-top:0}html,body{height:100%}body{background-color:#eee;color:#111;display:flex;flex-direction:column}.base-container{flex:1 0 auto}.footer{flex-shrink:0}a,h1,h2,h3,h4,h5,h6{color:#333}a{text-decoration:none}a:hover{text-decoration:underline}.gold{color:#1d781d}#header{margin-bottom:40px}#header .title{font-size:1.2em;padding-right:15px;color:#333}#header .title:hover{text-decoration:none}#header .subtitle-username{color:#111}#header .menu{padding:20px 0 10px 0}#header .menu ul{display:inline;list-style-type:none;padding:0}#header .menu ul li{float:left;padding-right:10px;margin-bottom:10px}#header .menu a{padding:5px 10px}#header .menu a small.badge{background-color:#ddd;color:#555;border-radius:2px;margin-left:5px;padding:3px 5px 0px 5px;font-weight:bold}#header .menu a.selected{background:#1d781d;color:#eee;border-radius:2px}#header .menu a:hover{background:#1d781d;color:#eee;text-decoration:none;border-radius:2px}#header .menu a:hover .badge{color:#1d781d;background:#eee}#container{width:90%;max-width:720px;margin:40px auto}#container #notes{margin-top:20px}.actor-box{display:block;text-decoration:none;margin-bottom:40px}.actor-box .actor-icon{width:120px;border-radius:2px}.actor-box h3{margin:0}.actor-box .actor-inline{text-overflow:ellipsis;white-space:nowrap;overflow:hidden}.actor-box-big{display:block;text-decoration:none}.actor-box-big .actor-box-wrapper{margin-bottom:40px}.actor-box-big .actor-box-wrapper .actor-icon{width:120px;border-radius:2px}.actor-box-big .actor-box-wrapper h3{margin:0}.note{display:flex;margin-bottom:70px}.note .l{color:#333}.note .h-card{flex:initial;width:50px}.note .u-photo{width:50px;border-radius:2px}.note .note-wrapper{flex:1;padding-left:15px}.note .bottom-bar{margin-top:10px}.note .img-attachment{max-width:100%;border-radius:2px}.note h3{font-size:1.1em;color:#555}.note strong{font-weight:600}.note .note-container{clear:right;padding:10px 0}.bar-item{background:#ddd;padding:5px;color:#555;margin-right:5px;border-radius:2px}button.bar-item{border:0}form.action-form{display:inline}.perma{font-size:1.25em}.bottom-bar .perma-item{margin-right:5px}.bottom-bar a.bar-item:hover{text-decoration:none}.footer>div{width:90%;max-width:720px;margin:40px auto}.footer a,.footer a:hover,.footer a:visited{text-decoration:underline;color:#111}.summary{color:#111;font-size:1.3em;margin-top:60px;margin-bottom:50px}.summary a,.summay a:hover{color:#111;text-decoration:underline}#followers,#following,#new{margin-top:50px}#admin{margin-top:50px}textarea,input{background:#ddd;padding:10px;color:#555;border:0px;border-radius:2px}input{padding:10px}input[type=submit]{color:#1d781d;text-transform:uppercase} diff --git a/templates/header.html b/templates/header.html index 9983dca..e6ea410 100644 --- a/templates/header.html +++ b/templates/header.html @@ -10,10 +10,10 @@