From 022590a70821d5b4903ae51f8d49720819a80577 Mon Sep 17 00:00:00 2001 From: zPlus Date: Sun, 22 Jul 2018 09:43:39 +0200 Subject: [PATCH] Add "topic" filter in user interface. --- freepost/__init__.py | 81 +++++++++---------- freepost/database.py | 45 ++++------- freepost/static/stylus/freepost.styl | 17 ++-- freepost/static/stylus/reset.styl | 8 ++ freepost/templates/homepage.html | 4 +- freepost/templates/layout.html | 74 +++++++++++------ freepost/templates/submit.html | 2 +- ...ivate_homepage.html => user_settings.html} | 0 8 files changed, 123 insertions(+), 108 deletions(-) rename freepost/templates/{user_private_homepage.html => user_settings.html} (100%) diff --git a/freepost/__init__.py b/freepost/__init__.py index e76844a2..060df8ce 100755 --- a/freepost/__init__.py +++ b/freepost/__init__.py @@ -49,13 +49,14 @@ template = functools.partial ( 'globals': { 'new_messages': lambda user_id: database.count_unread_messages (user_id), 'now': lambda: datetime.now (timezone.utc), - 'url': application.get_url, + 'request': request, # Return a setting from 'settings.yaml' 'settings': lambda section, key: settings[section][key], # Get the current user of the session 'session_user': lambda: session.user (), # Split a string of topics into a list - 'split_topics': lambda topics: [ topic for topic in topics.split (' ') ] if topics else [] + 'split_topics': lambda topics: [ topic for topic in topics.split (' ') ] if topics else [], + 'url': application.get_url, }, 'autoescape': True }) @@ -94,7 +95,7 @@ def requires_logout (controller): secret = settings['cookies']['secret']) if database.is_valid_session (session_token): - redirect (application.get_url ('user')) + redirect (application.get_url ('user_settings')) else: return controller () @@ -108,26 +109,8 @@ def homepage (): Display homepage with posts sorted by 'hot'. """ - # Page number - page = int (request.query.page or 0) - - if page < 0: - redirect (application.get_url ('homepage')) - - user = session.user () - posts = database.get_hot_posts (page, user['id'] if user else None) - - return template ( - 'homepage.html', - page_number=page, - posts=posts, - sorting='hot') - -@get ('/new', name='new') -def new (): - """ - Display homepage with posts sorted by 'new'. - """ + # Sort order + sort = request.query.sort or 'hot' # Page number page = int (request.query.page or 0) @@ -136,13 +119,19 @@ def new (): redirect (application.get_url ('homepage')) user = session.user () - posts = database.get_new_posts (page, user['id'] if user else None) + + if sort in [ 'hot', 'new' ]: + posts = database.get_posts ( + page, user['id'] if user else None, + sort) + else: + posts = [] return template ( 'homepage.html', page_number=page, posts=posts, - sorting='new') + sorting=sort) # TODO implement this @get ('/topic/', name='topic') @@ -151,22 +140,30 @@ def topic (name): Display posts by topic. """ - return "" + # Sort order + sort = request.query.sort or 'hot' # Page number page = int (request.query.page or 0) if page < 0: - redirect (application.get_url ('topic', name=name)) + redirect (application.get_url ('homepage')) user = session.user () - posts = database.get_topic_posts (page, user['id'] if user else None) + + if sort in [ 'hot', 'new' ]: + posts = database.get_posts ( + page, user['id'] if user else None, + sort, name) + else: + posts = [] return template ( 'homepage.html', + topic=name, page_number=page, posts=posts, - sorting='hot') + sorting=sort) @get ('/about', name='about') def about (): @@ -393,20 +390,20 @@ def validate_new_password (): # Start new session and redirect user session.start (user['id']) - redirect (application.get_url ('user')) + redirect (application.get_url ('user_settings')) -@get ('/user', name='user') +@get ('/user/settings', name='user_settings') @requires_login -def user_private_homepage (): +def user_settings (): """ A user's personal page. """ - return template ('user_private_homepage.html') + return template ('user_settings.html') -@post ('/user') +@post ('/user/settings') @requires_login -def update_user (): +def update_user_settings (): """ Update user info (about, email, ...). """ @@ -417,12 +414,12 @@ def update_user (): email = request.forms.get ('email') if about is None or email is None: - redirect (application.get_url ('user')) + redirect (application.get_url ('user_settings')) # Update user info in the database database.update_user (user['id'], about, email, False) - redirect (application.get_url ('user')) + redirect (application.get_url ('user_settings')) @get ('/user_activity/posts') @requires_login @@ -440,7 +437,7 @@ def user_comments (): return template ('user_comments.html', comments=comments) -@get ('/user_activity/replies') +@get ('/user_activity/replies', name='user_replies') @requires_login def user_replies (): user = session.user () @@ -450,7 +447,7 @@ def user_replies (): return template ('user_replies.html', replies=replies) -@get ('/user/', name='user_public') +@get ('/user/public/', name='user_public') def user_public_homepage (username): """ Display a publicly accessible page with public info about the user. @@ -459,7 +456,7 @@ def user_public_homepage (username): account = database.get_user_by_username (username) if account is None: - redirect (application.get_url ('user')) + redirect (application.get_url ('user_settings')) return template ('user_public_homepage.html', account=account) @@ -610,7 +607,7 @@ def submit (): return template ('submit.html') -@post ('/submit') +@post ('/submit', name='submit') @requires_login def submit_check (): """ @@ -783,7 +780,7 @@ def vote (): # Add -1 database.vote_comment (comment['id'], user['id'], -1) -@get ('/search') +@get ('/search', name='search') def search (): """ Search content on this instance, and display the results. diff --git a/freepost/database.py b/freepost/database.py index bedc2478..f81d8ea5 100644 --- a/freepost/database.py +++ b/freepost/database.py @@ -157,36 +157,17 @@ def get_user_by_session_token (session_token): return cursor.fetchone () # Get posts by date (for homepage) -def get_new_posts (page = 0, session_user_id = None): - cursor = db.cursor (MySQLdb.cursors.DictCursor) +def get_posts (page = 0, session_user_id = None, sort = 'hot', topic = None): + if sort == 'new': + sort = 'ORDER BY P.created DESC' + else: + sort = 'ORDER BY P.dateCreated DESC, P.vote DESC, P.commentsCount DESC' - cursor.execute ( - """ - SELECT - P.*, - U.username, - V.vote AS user_vote, - GROUP_CONCAT(DISTINCT T.name ORDER BY T.name SEPARATOR " ") AS topics - FROM post AS P - JOIN user AS U ON P.userId = U.id - LEFT JOIN vote_post as V ON V.postId = P.id AND V.userId = %(user)s - LEFT JOIN topic as T ON T.post_id = P.id - GROUP BY P.id - ORDER BY P.created DESC - LIMIT %(limit)s - OFFSET %(offset)s - """, - { - 'user': session_user_id, - 'limit': settings['defaults']['items_per_page'], - 'offset': page * settings['defaults']['items_per_page'] - } - ) + if topic: + topic_name = 'WHERE T.name = %(topic)s' + else: + topic_name = '' - return cursor.fetchall () - -# Get posts by rating (for homepage) -def get_hot_posts (page = 0, session_user_id = None): cursor = db.cursor (MySQLdb.cursors.DictCursor) cursor.execute ( @@ -200,15 +181,17 @@ def get_hot_posts (page = 0, session_user_id = None): JOIN user AS U ON P.userId = U.id LEFT JOIN vote_post as V ON V.postId = P.id AND V.userId = %(user)s LEFT JOIN topic as T ON T.post_id = P.id + {topic} GROUP BY P.id - ORDER BY P.dateCreated DESC, P.vote DESC, P.commentsCount DESC + {order} LIMIT %(limit)s OFFSET %(offset)s - """, + """.format (topic=topic_name, order=sort), { 'user': session_user_id, 'limit': settings['defaults']['items_per_page'], - 'offset': page * settings['defaults']['items_per_page'] + 'offset': page * settings['defaults']['items_per_page'], + 'topic': topic } ) diff --git a/freepost/static/stylus/freepost.styl b/freepost/static/stylus/freepost.styl index c80a5702..b60b12e5 100755 --- a/freepost/static/stylus/freepost.styl +++ b/freepost/static/stylus/freepost.styl @@ -40,11 +40,13 @@ body /* Page header */ > .header + display grid + grid-template-columns max-content auto padding 1rem 0 text-align center /* Menu under the logo */ - > .menu + .menu border-bottom 1px solid transparent display flex flex-direction row @@ -53,8 +55,6 @@ body align-content flex-start align-items flex-start - margin 1em auto - > .flex-item flex 0 1 auto align-self auto @@ -65,10 +65,6 @@ body color #000 margin 0 0 padding 0 .5rem .5rem .5rem - - &:first-child - border-bottom 2px solid transparent - margin-left 0 /* Highlight menu item of the current active page (Hot/New/Submit/...) */ > .active_page @@ -84,6 +80,13 @@ body padding .5em .5em text-decoration none + .submenu + display flex + flex-direction row + flex-wrap wrap + justify-content flex-start + align-content flex-start + align-items flex-start > .content padding 1em 0 diff --git a/freepost/static/stylus/reset.styl b/freepost/static/stylus/reset.styl index 273c7747..83a48d49 100755 --- a/freepost/static/stylus/reset.styl +++ b/freepost/static/stylus/reset.styl @@ -191,5 +191,13 @@ p > code white-space -moz-pre-wrap white-space -o-pre-wrap +select + -webkit-appearance none + -moz-appearance none + appearance none + background transparent + border 0 + cursor pointer + ul, ol margin 1.2em 2em diff --git a/freepost/templates/homepage.html b/freepost/templates/homepage.html index 521cc576..527a76de 100755 --- a/freepost/templates/homepage.html +++ b/freepost/templates/homepage.html @@ -79,12 +79,12 @@
{% if page_number > 0 %} - + Previous {% endif %} - + Next
diff --git a/freepost/templates/layout.html b/freepost/templates/layout.html index a583fabb..4aae247c 100644 --- a/freepost/templates/layout.html +++ b/freepost/templates/layout.html @@ -15,38 +15,62 @@
- diff --git a/freepost/templates/submit.html b/freepost/templates/submit.html index f8883c3f..0fd7c835 100755 --- a/freepost/templates/submit.html +++ b/freepost/templates/submit.html @@ -29,7 +29,7 @@ {% if settings ('defaults', 'topics_per_post') > 0 %}

Topics

- +
Max {{ settings ('defaults', 'topics_per_post') }} diff --git a/freepost/templates/user_private_homepage.html b/freepost/templates/user_settings.html similarity index 100% rename from freepost/templates/user_private_homepage.html rename to freepost/templates/user_settings.html