From 1c4da05d55a3190dff57ed6cda4179ea02bc0576 Mon Sep 17 00:00:00 2001 From: MCAyd <ma04274@surrey.ac.uk> Date: Fri, 5 May 2023 15:54:35 +0100 Subject: [PATCH] final fixes and updates --- README.md | 8 +- .../application/frontend/api/PostClient.py | 11 ++ .../application/frontend/api/UserClient.py | 2 +- frontend/application/frontend/views.py | 46 ++++++- .../static/images/0bf48bdfa114d912.jpg | Bin 0 -> 24517 bytes .../static/images/users/a51fa503f5e95bb9.jpg | Bin 0 -> 5678 bytes .../static/images/users/b6490c982e8a116e.jpg | Bin 0 -> 5678 bytes .../application/templates/forum/category.html | 2 + .../application/templates/forum/hotposts.html | 119 ++++++++++++++++++ .../application/templates/forum/post.html | 4 +- .../application/templates/forum/profile.html | 2 +- .../application/templates/forum/search.html | 2 + .../application/templates/forum/user.html | 2 +- frontend/application/templates/navbar.html | 2 +- frontend/application/templates/sidebar.html | 1 - post-service/application/post_api/routes.py | 26 +++- post-service/instance/posts-service.db | Bin 24576 -> 24576 bytes user-service/instance/users-service.db | Bin 16384 -> 16384 bytes 18 files changed, 209 insertions(+), 18 deletions(-) create mode 100644 frontend/application/static/images/0bf48bdfa114d912.jpg create mode 100644 frontend/application/static/images/users/a51fa503f5e95bb9.jpg create mode 100644 frontend/application/static/images/users/b6490c982e8a116e.jpg create mode 100644 frontend/application/templates/forum/hotposts.html diff --git a/README.md b/README.md index 09a2229..fce3550 100644 --- a/README.md +++ b/README.md @@ -1,9 +1,9 @@ -# cwblog +#cwblog TO RUN IT USING DOCKER SERVICES, MAKE SURE ALL .ENV FILES IN SERVICES ARE AS CONFIGURATION_SETUP="config.ProductionConfig" THEN YOU CAN RUN PROJECT "sudo bash run.sh" -IF YOU WOULD LIKE TO USE DEVELOPMENT SERVER AND RUN APPLICATION IN LOCALHOST -GO INTO ALL SERVICES, CHANGE .ENV FILES AND CHANGE THEM AS +IF YOU WOULD LIKE TO USE DEVELOPMENT SERVER AND RUN APPLICATION WITHOUT DOCKER SERVICES +GO INTO ALL SERVICE FOLDERS, CHANGE .ENV FILES AS CONFIGURATION_SETUP="config.DevelopmentConfig" -THEN RUN SERVICES USING "python3 run.py" command for each services. +THEN RUN SERVICES USING TERMINAL "python3 run.py" IN EACH SERVICE FOLDER. diff --git a/frontend/application/frontend/api/PostClient.py b/frontend/application/frontend/api/PostClient.py index d73e2b4..737a48a 100644 --- a/frontend/application/frontend/api/PostClient.py +++ b/frontend/application/frontend/api/PostClient.py @@ -19,6 +19,17 @@ class PostClient: return response + def get_hot_posts(per_page,offset): + url = 'http://' + PostClient.post_service + '/api/hotposts/' + str(per_page) + '/' + str(offset) + response = requests.request(method="GET", url=url) + + if response.status_code == 404: + return response.status_code + + response = response.json() + + return response + def get_category_posts(category,per_page,offset): url = 'http://' + PostClient.post_service + '/api/posts/'+ str(category) + '/' + str(per_page) + '/' + str(offset) response = requests.request(method="GET", url=url) diff --git a/frontend/application/frontend/api/UserClient.py b/frontend/application/frontend/api/UserClient.py index ff7d8f9..2fdb58c 100644 --- a/frontend/application/frontend/api/UserClient.py +++ b/frontend/application/frontend/api/UserClient.py @@ -95,7 +95,7 @@ class UserClient: if response: d = response.json() - print("This is response from user api: " + str(d)) + # print("This is response from user api: " + str(d)) if d['api_key'] is not None: api_key = d['api_key'] return api_key diff --git a/frontend/application/frontend/views.py b/frontend/application/frontend/views.py index dc957e4..201bb5f 100644 --- a/frontend/application/frontend/views.py +++ b/frontend/application/frontend/views.py @@ -118,7 +118,6 @@ def login_route(): @frontend_blueprint.route('/', methods=['GET']) @frontend_blueprint.route('/page/<int:page>', methods=['GET']) def get_posts(page=1): - print(session) if len(session)<4: return redirect(url_for('frontend.login_route')) @@ -222,9 +221,40 @@ def search(page=1): image_urls.append(user['image_url']) categories = ['activities','courses&modules','societies', - 'student_union','accommodation','transportation','lost&found','sale&rental','other'] + 'student_union','accommodation','transportation','lost&found','sale&rental','other'] return render_template('forum/search.html', + data=zip(posts,image_urls), words=words, categories=categories,page=page, page_limit=page_limit) + + +@frontend_blueprint.route('/weeklyhots/', methods=['GET','POST']) +@frontend_blueprint.route('/weeklyhots/<int:page>', methods=['GET','POST']) +def get_hot_posts(page=1): + image_urls = [] + per_page = 4 + offset = (page - 1) * per_page + posts = PostClient.get_hot_posts(per_page,offset) + + if posts == 404: + flash('No post in last 7 days', 'fail') + return redirect(url_for('frontend.get_posts')) + + page_limit = True + offset_ = (page) * per_page + next_posts = PostClient.get_hot_posts(per_page,offset_) + if next_posts == 404: + page_limit = False + if len(posts) < per_page: + page_limit = False + + for post in posts: + user = UserClient.get_otheruser(post['user_id']) + image_urls.append(user['image_url']) + + categories = ['activities','courses&modules','societies', + 'student_union','accommodation','transportation','lost&found','sale&rental','other'] + + return render_template('forum/hotposts.html', data=zip(posts,image_urls), categories=categories,page=page, page_limit=page_limit) @@ -257,6 +287,7 @@ def save_user_image(image_file): @frontend_blueprint.route('/post/images/users/<image_id>' , methods=['GET']) +@frontend_blueprint.route('/weeklyhots/images/users/<image_id>' , methods=['GET']) @frontend_blueprint.route('/search/images/users/<image_id>' , methods=['GET']) @frontend_blueprint.route('/page/images/users/<image_id>' , methods=['GET']) @frontend_blueprint.route('/user/images/users/<image_id>' , methods=['GET']) @@ -264,17 +295,18 @@ def save_user_image(image_file): def get_user_image(image_id): picture_path = path.join(current_app.root_path, 'static/images/users', image_id) - print(picture_path) + return send_file(picture_path, mimetype='image/gif') @frontend_blueprint.route('/post/images/<image_id>' , methods=['GET']) +@frontend_blueprint.route('/weeklyhots/static/images/<image_id>' , methods=['GET']) @frontend_blueprint.route('/page/static/images/<image_id>' , methods=['GET']) @frontend_blueprint.route('/search/static/images/<image_id>' , methods=['GET']) def get_post_image(image_id): picture_path = path.join(current_app.root_path, 'static/images', image_id) - print(picture_path) + return send_file(picture_path, mimetype='image/gif') @@ -310,7 +342,11 @@ def create_post(): 'form': form, 'post': None } - return render_template('forum/create_post.html', **content) + + categories = ['activities','courses&modules','societies', + 'student_union','accommodation','transportation','lost&found','sale&rental','other'] + + return render_template('forum/create_post.html', **content, categories=categories) @frontend_blueprint.route('/post/<int:post_id>', methods=['GET','POST']) diff --git a/frontend/application/static/images/0bf48bdfa114d912.jpg b/frontend/application/static/images/0bf48bdfa114d912.jpg new file mode 100644 index 0000000000000000000000000000000000000000..b7f5716ea81e9977059833080a716ed0a84e799d GIT binary patch literal 24517 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 JD5A3&|JfW1KjQ!Z literal 0 HcmV?d00001 diff --git a/frontend/application/static/images/users/a51fa503f5e95bb9.jpg b/frontend/application/static/images/users/a51fa503f5e95bb9.jpg new file mode 100644 index 0000000000000000000000000000000000000000..88138f054c3dceabede0508508a813d15cc1bcb5 GIT binary patch literal 5678 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 literal 0 HcmV?d00001 diff --git a/frontend/application/static/images/users/b6490c982e8a116e.jpg b/frontend/application/static/images/users/b6490c982e8a116e.jpg new file mode 100644 index 0000000000000000000000000000000000000000..88138f054c3dceabede0508508a813d15cc1bcb5 GIT binary patch literal 5678 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 literal 0 HcmV?d00001 diff --git a/frontend/application/templates/forum/category.html b/frontend/application/templates/forum/category.html index bdd0755..97e6125 100644 --- a/frontend/application/templates/forum/category.html +++ b/frontend/application/templates/forum/category.html @@ -60,6 +60,8 @@ </div> </div> + <h2 style="text-align: center; font-size: medium; color: orange; font-weight: bold;margin-top: -27px">Posts in {{ category }} category</h2> + {% if page > 1 %} <a class="btn btn-outline-success my-2 my-sm-0" href="{{ url_for('frontend.categories',category=category, page=page-1) }}">Previous</a> {% endif %} diff --git a/frontend/application/templates/forum/hotposts.html b/frontend/application/templates/forum/hotposts.html new file mode 100644 index 0000000..4cad9bc --- /dev/null +++ b/frontend/application/templates/forum/hotposts.html @@ -0,0 +1,119 @@ +{% extends "base_col_1.html" %} +{% block title %} HOT POSTS OF THE WEEK {% endblock %} + +{% block pageContent%} + +<style> + body { + background-color: #f8f9fa; + color: #212529; + } + + .card-header { + background-color: #c6e2ff; + color: white; + } + + .nav-link.active { + background-color: #6c757d; + color: white; + } + + .btn-outline-success:hover { + background-color: #218838; + border-color: #1e7e34; + } + .profile-image { + width: 60px; + height: 60px; + object-fit: ; + border-radius: 50%; + } + .post-image { + width: 100px; + height: 100px; + object-fit: contain; + } +</style> + +<div> + +</div> + +<div class="col-md-6 gedf-main"> + <div class="card gedf-card"> + <div class="card-header"> + <ul class="nav nav-tabs card-header-tabs" id="myTab" role="tablist"> + <li class="nav-item"> + <a class="nav-link active" id="posts-tab" data-toggle="tab" href="#posts" role="tab" aria-controls="posts" aria-selected="true">Start a discussion</a> + </li> + </ul> + </div> + <div class="card-body"> + <div class="tab-content" id="myTabContent"> + <div class="tab-pane fade show active" id="posts" role="tabpanel" aria-labelledby="posts-tab"> + <div class="form-group"> + <label class="sr-only" for="message">post</label> + <a class="btn btn--link" href="{{ url_for('frontend.create_post') }}">New Post</a> + </div> + </div> + </div> + </div> + </div> + + <h2 style="text-align: center; font-size: medium; color: orange; font-weight: bold;margin-top: -27px">Weekly Hot Posts</h2> + + {% if page > 1 %} + <a class="btn btn-outline-success my-2 my-sm-0" href="{{ url_for('frontend.get_hot_posts', page=page-1) }}">Previous</a> + {% endif %} + + {% if page_limit == True %} + <a class="btn btn-outline-success my-2 my-sm-0" href="{{ url_for('frontend.get_hot_posts', page=page+1) }}">Next</a> + {% endif %} + + {% for post,image in data %} + <div class="card gedf-card"> + <div class="card-header"> + <div class="d-flex justify-content-between align-items-center"> + <div class="d-flex justify-content-between align-items-center"> + <div class="mr-2"> + <img class="profile-image" src="images/users/{{ image }}"> + </div> + <div class="ml-2"> + <div class="h5 m-0"><a href="{{ url_for('frontend.display_user', user_id=post.user_id) }}">{{ post['user_name'] }}</a></div> + </div> + </div> + <div> + <div class="dropdown"> + </div> + </div> + </div> + </div> + <div class="card-body"> + <div class="text-muted h7 mb-2"> <i class="fa fa-clock-o"></i>{{ post['date_added']}}</div> + <a class="card-link" href="{{ url_for('frontend.display_post', post_id=post.id) }}"> + <h5 class="card-title">{{ post['title'] }}</h5> + </a> + <p class="card-text">{{ post.content[:40] | safe }}{% if post.content|length > 30 %}...{% endif %}</p> + + {% if post['image_url'] != '' %} + <img class="post-image" src="static/images/{{ post['image_url'] }}"> + {% endif %} + </div> + <div class="card-footer"> + <a href="{{ url_for('frontend.display_post', post_id=post.id) }}" class="card-link"><i class="fa fa-comment"></i> Comment</a> + </div> + </div> +{% endfor %} + +{% if page > 1 %} +<a class="btn btn-outline-success my-2 my-sm-0" href="{{ url_for('frontend.get_hot_posts', page=page-1) }}">Previous</a> +{% endif %} + +{% if page_limit == True %} +<a class="btn btn-outline-success my-2 my-sm-0" href="{{ url_for('frontend.get_hot_posts', page=page+1) }}">Next</a> +{% endif %} + +</div> + +{% endblock %} diff --git a/frontend/application/templates/forum/post.html b/frontend/application/templates/forum/post.html index f845e18..a55cadc 100644 --- a/frontend/application/templates/forum/post.html +++ b/frontend/application/templates/forum/post.html @@ -158,7 +158,7 @@ <!-- START posts --> <div class="col-md-8"> - <div class="post-container" style="height: 400px; width: 100%; overflow: auto; + <div class="post-container" style="height: 40%; width: 100%; overflow-y: auto; word-wrap: break-word; white-space: normal"> <div class="tile__author"> <img class="profile-image" src="images/users/{{ owner_image }}"> @@ -185,7 +185,7 @@ <!-- START comments --> - <div class="comment-container" style="overflow-y: auto; height: 600px; width: 100%"> + <div class="comment-container" style="overflow-y: auto; height: 60%; width: 100%"> <h3 class="comment__title">COMMENTS</h3> {% if comments %} {% for comment, image in comments %} diff --git a/frontend/application/templates/forum/profile.html b/frontend/application/templates/forum/profile.html index 90cd7e3..e26a7ad 100644 --- a/frontend/application/templates/forum/profile.html +++ b/frontend/application/templates/forum/profile.html @@ -243,7 +243,7 @@ <input class="form-submit" type="submit" value="Update"> </form> </div> - <div class="posts"> + <div class="posts" style="word-wrap: break-word; white-space: normal"> <h2>Your Posts</h2> {% for post in posts %} <div class="post"> diff --git a/frontend/application/templates/forum/search.html b/frontend/application/templates/forum/search.html index 6134bfb..9312f92 100644 --- a/frontend/application/templates/forum/search.html +++ b/frontend/application/templates/forum/search.html @@ -61,6 +61,8 @@ </div> </div> + <h2 style="text-align: center; font-size: medium; color: orange; font-weight: bold; margin-top: -27px;">Search Results for "{{ words }}"</h2> + {% if page > 1 %} <a class="btn btn-outline-success my-2 my-sm-0" href="{{ url_for('frontend.search', page=page-1) }}">Previous</a> {% endif %} diff --git a/frontend/application/templates/forum/user.html b/frontend/application/templates/forum/user.html index f4e6fe2..89cf0c7 100644 --- a/frontend/application/templates/forum/user.html +++ b/frontend/application/templates/forum/user.html @@ -79,7 +79,7 @@ align-items: center; </div> <div class="col-md-8 offset-md-4" style="margin-top: 50px;"> <h2>POSTS OF THE USER</h2> - <div style="height: 1500px; overflow-y: scroll;"> + <div style="word-wrap: break-word; white-space: normal"> {% for post in posts %} <div class="post-card"> <h4><a href="{{ url_for('frontend.display_post', post_id=post.id) }}">{{ post['title'] }}</a></h4> diff --git a/frontend/application/templates/navbar.html b/frontend/application/templates/navbar.html index f8b6300..88d782a 100644 --- a/frontend/application/templates/navbar.html +++ b/frontend/application/templates/navbar.html @@ -96,7 +96,7 @@ <div class="collapse navbar-collapse justify-content-end" id="navbarNav"> <ul class="navbar-nav"> <li class="nav-item"> - <div class="nav-link" style="color: #007bff;"><a href="{{ url_for('frontend.display_currentuser') }}" style="text-decoration:none;">{{ session['user'].full_name }}</a></div> + <div class="nav-link" style="color: #007bff;"><a href="{{ url_for('frontend.get_hot_posts') }}" style="text-decoration:none; color:red">Hot Posts</a></div> <li class="nav-item"> <a class="nav-link" href="{{ url_for('frontend.logout') }}">Logout</a> </li> diff --git a/frontend/application/templates/sidebar.html b/frontend/application/templates/sidebar.html index 790b9ef..31a90de 100644 --- a/frontend/application/templates/sidebar.html +++ b/frontend/application/templates/sidebar.html @@ -44,7 +44,6 @@ <li class="list-group-item"> <div class="h6 text-muted">Categories</div> <ul class="category-menu"> - <p class="title__category" >{{category}}</p> {% for category in categories %} <li class="tile__category"> <a class="btn btn--link" href="{{ url_for('frontend.categories', category=category) }}" >{{category}}</a> diff --git a/post-service/application/post_api/routes.py b/post-service/application/post_api/routes.py index 695e7fb..4f4d0bc 100644 --- a/post-service/application/post_api/routes.py +++ b/post-service/application/post_api/routes.py @@ -4,7 +4,8 @@ from . import post_api_blueprint from .. import db from ..models import Post, Comment from .api.UserClient import UserClient - +from datetime import datetime, timedelta +from sqlalchemy import desc, func @post_api_blueprint.route('/api/posts/<int:per_page>/<int:offset>', methods=['GET']) def get_posts(per_page,offset): @@ -18,6 +19,28 @@ def get_posts(per_page,offset): response = jsonify(data) return response +@post_api_blueprint.route('/api/hotposts/<int:per_page>/<int:offset>', methods=['GET']) +def get_hot_posts(per_page,offset): + data = [] + + today = datetime.utcnow() + one_week_ago = today - timedelta(days=7) + + if offset == 8: + for row in Post.query.join(Post.comments).filter(Post.date_added >= one_week_ago).group_by(Post.id).order_by(desc(func.count(Comment.id))).offset(offset).limit(per_page)[:2]: + data.append(row.to_json()) + else: + for row in Post.query.join(Post.comments).filter(Post.date_added >= one_week_ago).group_by(Post.id).order_by(desc(func.count(Comment.id))).offset(offset).limit(per_page).all(): + data.append(row.to_json()) + + if data == []: + abort(404) + + print(data) + + response = jsonify(data) + return response + @post_api_blueprint.route('/api/posts/<int:user_id>', methods=['GET']) def get_user_posts(user_id): data = [] @@ -35,7 +58,6 @@ def get_category_posts(category,per_page,offset): for row in Post.query.filter_by(category=category).order_by(Post.date_added.desc()).offset(offset).limit(per_page).all(): data.append(row.to_json()) - print(data) if data == []: abort(404) diff --git a/post-service/instance/posts-service.db b/post-service/instance/posts-service.db index 4093f5fde0bcab101216b089f66979fefc2e5cba..93d2a302ab0f4ce54d8d3a21b7a1543a1dd476d3 100644 GIT binary patch delta 2019 zcmZ`)OK%%h81*BeiJOU2T1ZRN))U8Z61A7P&w1EQWKtdy4~Ys;ixjmtofJ8anV}?% zKthu)Sag@lz=j1y>?=jyAwl~CkSf^n50Ll)u;RNjlfZav*|Pk}KIfkEedoKg|1`h< zG=FeDfBoUydj9(1?H?{Zm&@grwS(S?3av~pYJY2gYJX_IYCmg_wePiq@?m+Syk360 z{A2lHd8dDBMrgeWG##!?7xlcnv)lfxz1!aUbU9rvrOSG{Tuhg>bh(f&tLajY%iaYv zSx)~l-{<IAzId^4qj$p4=f=Mse`kDV?Dw&+$6g<sDn2VdD85zH3cnS;Dcm@`f2I&N zE>7fH)m*-oCkCNc3=Z!KW{$xfP7t@4O^v3%>UBDu=F9$Sp}W<&x7Dr4&)xRNE6xP~ z>qEiJMz%#LPQXL3a|#;{0W*hjM1?RZjZe;im#>}&aD6D2P$U?!l7olpUTVB_WI7yh z4aOM~CN>C*&i1md>(|Z!nh!agIz%9Y*fvwH-9Wm&^g6ERyIGdS##yBy<DWVdI~X+B z7-M@>=WF&Xpf3$-00E}M8RD3eq<NX%Exh?6K-Uv!csz3IVBs(WnU<i;jPyt9W#D^m zC-A^a$IY-+n=b%cEh_}bu#Jc*7$ZQoE4#9rLC-hCGb7<J2+X)m_(-_kJUs#p;WZIs z3=2FO{o3;rxv*sq(as%45TT}xt*8;6FWcL$47|20x3ez3x_oLf*Lv_}Zt_ZMi!jhA zCW{bTs7So0x^TI&xmR)b?(KD5S?TXvcM84t*JkpS{;SrL*|Vk6T26bUy)pII)E86d zPX2WAX6c{Occrz%`_)qT;mRba)%BLGr54c*AZAj{>A$;ZAlP7uA(I>2jArY50gTi4 zWB~b;%F@QN;;v`8qZC9RVc?JCXAV^xF9=tQ<N8Vw(8C8rC*ogH{58GR7|;$<l!oZ< z$2aMKdZxm}LX!}DL=S-2F}POzx9W-htAqSOL@rf#M#`sZZG@mOsAKsNy;|a=L5txC z2LUWNgafu@bbnyID6$MwSZb+VsZ7WF<-74EbE~H4PwTCB(*}0DokVsBkC^{ACcY~S zM5$>Al~hHQ?5l+DpdDUb00#xCMV~Aj8Q=r)@l}322v9J*L(#>;Rt4h3rpXB6>;Scb zMk6*h?=oxCy(=+hu8j%W_CLB=RcFrXt(MmN<&~O%hf8$RP>w9ypoZ#(lG=&p15K2{ n5#0y#3A7PGmtrV)s6fIpalD&eCy3_c2Jn)eve|#Mal7y@f6Xra delta 115 zcmZoTz}Rqrae_3X^+XwGM(d3U3+37P)EE@_I3}|z7z^-k<d5Zd=J(}a%s-Johd*bt zpuj%f$rE(>CX49_@G~$lfG`YfHq|@N$SlC&I+@)-abu$_$7WZH{o-tlybBn37XWom L<K4U<Hh~EMKOh@$ diff --git a/user-service/instance/users-service.db b/user-service/instance/users-service.db index b2df22b256e888cef75d66e164d4116dac58be42..7de2750c041cca19b8b8c3c77797a80f0f70c58d 100644 GIT binary patch delta 198 zcmZo@U~Fh$oFL8EHc`fzv2A0*Qhs)>`;2_OJgS>{1dejDaNl6$+t|p(IQhQRZzcxc ziH)8DjkZjD493dLvXbJQjq0WhlOIVo=_Q$&SQ;c-S{S8TBpMo;rRrrBq#GF+8S5ID z=o(rm7+P4Fm|7W{>zSFGn3)-Fek!9V%=MFjKZ-w;zm)IiW&wj~d@TGv48ao{{U^`2 v7n{s)ZzmeZz{vmtEX)jyOw7y-ocvV`;u9T(IY9!f{GS+9CpIbqRVM-f)oU@5 delta 295 zcmZo@U~Fh$oFL6uK2gS*v3z5~Qhs*Mi;R4|oEJCq2pr`UY~p6(XE0V~mX#FeY*aUG zRG(}r)0CK+Xql8`VPbBWlxkp_l4_<`ke9Avs#26+nwL^+Yiew2U|^u)8BiJ&>={_% z?;jB19iC^Q65?4|QsL>Iq@Qo1mv8BxX&hisV4|OEP#O_w6m01mW?G!$ZCL10=I3QR z`LvAm<Ofo}m>79CHgYm<ek!9V%(aYxzn;I8?<e1~%>o9~_$JS{7qg|r5+;xdllkrK ln5!5xCpM}Iu`n|*vhp`Gure?+GjQ^MVvw2WC;?QI2ml`VR{a0~ -- GitLab