From 6d7146745a64e9748053c8b79e18ec8919f87ede Mon Sep 17 00:00:00 2001 From: root <ma04274@surrey.ac.uk> Date: Sat, 1 Apr 2023 00:35:00 +0100 Subject: [PATCH] frontend has now home, post and create_post pages, which returns all posts, specific post to and its comment section, and post creation page consecutively. Comment addition is integrated post display page. First run post-service, then run frontend. --- frontend/application/__init__.py | 5 +- .../__pycache__/__init__.cpython-310.pyc | Bin 639 -> 684 bytes .../__pycache__/forms.cpython-310.pyc | Bin 1424 -> 1350 bytes .../__pycache__/views.cpython-310.pyc | Bin 2868 -> 3000 bytes .../application/frontend/api/PostClient.py | 20 ++-- .../__pycache__/PostClient.cpython-310.pyc | Bin 2202 -> 2164 bytes frontend/application/frontend/forms.py | 12 +-- frontend/application/frontend/views.py | 53 ++++------ frontend/application/{ => static}/css.css | 0 .../templates/forum/create_post.html | 32 ++++++ .../application/templates/forum/index.html | 28 ++++++ .../application/templates/forum/post.html | 95 ++++++++++++++++++ frontend/application/templates/macros.html | 12 +++ .../__pycache__/__init__.cpython-310.pyc | Bin 725 -> 725 bytes .../__pycache__/models.cpython-310.pyc | Bin 1772 -> 1772 bytes post-service/application/models.py | 1 + .../__pycache__/routes.cpython-310.pyc | Bin 3813 -> 3012 bytes post-service/application/post_api/routes.py | 48 ++------- post-service/instance/posts-service.db | Bin 16384 -> 16384 bytes 19 files changed, 210 insertions(+), 96 deletions(-) rename frontend/application/{ => static}/css.css (100%) create mode 100644 frontend/application/templates/forum/create_post.html create mode 100644 frontend/application/templates/forum/index.html create mode 100644 frontend/application/templates/forum/post.html create mode 100644 frontend/application/templates/macros.html diff --git a/frontend/application/__init__.py b/frontend/application/__init__.py index 7200a3c..cda22c2 100644 --- a/frontend/application/__init__.py +++ b/frontend/application/__init__.py @@ -2,16 +2,17 @@ from flask import Flask from os import environ from flask_login import LoginManager +from flask_ckeditor import CKEditor login_manager = LoginManager() - def create_app(): app = Flask(__name__) + ckeditor = CKEditor(app) app.config['SECRET_KEY'] = '3834j2724827' - login_manager.init_app(app) + # login_manager.init_app(app) with app.app_context(): diff --git a/frontend/application/__pycache__/__init__.cpython-310.pyc b/frontend/application/__pycache__/__init__.cpython-310.pyc index fc074320b91121f073733f1fb80373225a2b52fb..3c389dc4b0d64f45b241c79d6ad942efecccb9c8 100644 GIT binary patch delta 380 zcmX|6%}T>S5T4omZDS&$=&j(PP=g2Y?#b#w1TRH|B5Y%K6JqmIHY<8a@lfwl@&fkm z$;ZhX_zWI&Q_&e_=9`~yhWR$%Ex+)67qlGR_W9@1@8aq5u)oiNo2i{SBL_iP3m8#u zar*^E9qtSvpvx$D4zQtv%X6NnLQdKhe`07rwGFhDW9<|uT;LoOsX#~MSi!x)$q7{O zX0G6M7l9l4qLtZmf^F5Q$O>C@0|YpjS{DYw5RRb?9(4z66VJv}61~5njOAe_7?W0; z+LI!WlDOFjXEUa;5>Kk3k!(@UWv89lmLg6{B_z8`AH+;1xeAQN(2Ryoregh-?9?B4 zy+_d{uIUjM3F&>w9ZkOq+`3Epy=F5?!*a_08SDFgTEt1tvM>*0A?piru;pozhrenQ GkNf~4Lt484 delta 309 zcmXv~y-ve05WaK%OxiF2MPgtBmB7x#)`^7$!O+D@Yd1=jIFV~4hIA@Bit+;O#KJT1 zAbtkkpaa-Ke5X5ocly55={|!WKdF->1`GLp$v?W}9B;du@rejFFb%oSgEyE)JbZ*S z>QwqXchY|lOQ_9>&DG2n4H`GN297N(2`6`;y{+HE4iQ?|20M5kA#jiTWmrY)zbS38 z+n?ceKf?RvfpSX?WlUz3V9bQ`S}uy*BxRi!l2w_^a-j?@WT9EsG-hB6vmz~CwV?~; znB>acWsa1{i<K6N&B_<is6y(L7|%Ks?Z5EpG$t;FBt}9m_UhQ09#Yz;WE`l0ZF)_v N4&8f(=prOT?-#IbOc?+G diff --git a/frontend/application/frontend/__pycache__/forms.cpython-310.pyc b/frontend/application/frontend/__pycache__/forms.cpython-310.pyc index 4a22ad63e148a6a76e39717fc98514a9f9677412..a81f78029877e5827f4958a5ac6455a9b0e5e797 100644 GIT binary patch delta 253 zcmbQheT<7QpO=@50SGkG)KliNY~+(?3TM$|y2VzUpPZSPbBiq)OlvY#apmL}m#C%X zm*%BZaruDQZXh;LEqhvGa%oOU<t=tM2m`2^BdN4ftvEF&r;5V~$O;CsCZA(kz@`ec zsz`Nm33CV|+vJnXy%Dk?0XYyM4<Zym1V4xXxvEGRL~wuz6%YZ@4QHu=Sn5DR3W$qA f$~YKU7zLPk7>m>=uVYy*3X;RnG&ze^m5~nsVzoG- delta 328 zcmX@cHG!KipO=@50SNfssHUW|Zse0^s^`#Ty2X-_np1F##REtJd29uhB^mj7x7Y%} zG)N>bKP5G*_!gTVm<Eclr>Ewn7A5A~Vt0oyfMOhJsi`SRiOJcwINYEtO{OZ2jFQ|O z-Q?opDh`hjUmpeM;9!vc;?jbG{GyUuO6<W97Eq8YE3quGIJqdZpyU>p7o0u0g=qns zKG4-g`jfSoLm0Ux*E9D<sDlJFK!hfU&;k+sAOhsUB3%%{0V4E31VlHSWdLFs0tq=F hE(R&%U|?YsVB%pcGMt>kvRo7-hoNb*0;?*c5CEO<RYL#( diff --git a/frontend/application/frontend/__pycache__/views.cpython-310.pyc b/frontend/application/frontend/__pycache__/views.cpython-310.pyc index f56790c1c496b6811314f58abf343f6845edcc7d..2f86372d518740b140f44703d650e258eefb7e29 100644 GIT binary patch delta 1484 zcmZ8h&1+;u5buxoJ#Suy#B4T`7&DvQ#J3xh1=kOZE{O}P2##Vz)>9m(Uv{6FkI=8< z>hOjLIf#esr5C(-NWe=jf*|5W*uUcmf){a5-UFglJ(H|E168lPs=K=C_p6$pF8neT zb<5>|!0+3gCGmCiWAr!u$b#)HknA!jMULn(>64rYy2E6sn4kxg62%1r8$V>5B)000 zA5ubkmF=$FYp<pqk$kaoPqkYow6J%(naW~IUuTn%^dY321a(5>Mg0N0`OXw<LXZrV z$35mzi!ti_E78;QSMmO8C%Io(@4vVCVH1q!KMpG!#AMske|huty7v87u3Ewt&LKOX zn?(4KCK17Ryw6lggel3{_w)gH;&NS9^&Nli*}~2Cn$0B3PRF-px1*AdSh<_1Et9%_ z;4j=RtnEhHDtJA)AM+yEZQM<^RH|ADIJ&Z3Sa|gG!l3@9Od2XNw+#w0l?#w%9O_^F znfV$l3#Xl^dtFhCf8J=N0#A24TiM>H?NsSM{aV`q6?2J)<t4n~HcetmUPO~o)3{m! zg-B(yph6x{j|S8NsnCE`C<813&3_`>oa{{u@O(Y(sMj#(tyJ99k64xdtbb#-_v^WJ z<Q)@PSAK4N78s_<Q7N}_a?JX6Zp(EQBDe<(dZ4T#;R3wg0BZ2~BKV&NZi&(%M;dYl zF}MhU21kvF2xxGIG>p~dGgt|9&;*glsjPzP&ED#^+et@%;!n-afZ=rVoE(v6yRF8T z2I3R_2ftL6b8sSN1Hi7~nj73?P0w33=LNJ>^jp^QzJc@#?ByaT=uZh)$mek#4Vi12 zhm|bjsS+w|&H*Q`#OQ@5lWe!!$&$e<%jh@E0#BIrAmRvFMJUoYo@9=fGJH6&u<bn- z(hx{P0>g6($0_4O3LSYvuh|<PpSQe(yEvdZ$tlpoau`k+(&%hRVb7*vNT*4k3#$(V z<kk+CbKtj!)bin7q;^^V;Lct#oSD&y!zau@1MWew&@P4{U3C`ejNWh-D+s)dQC$TU zyZS3<X@3N|*cqS}48g%LFT&|!?96Z${3Q(ZDyoq_N87s~8QMehKM^vE18fw&03CEY zGdFwHRlQ+P=r`TV`gb-Tnfe*j&!Gvqe(0`Gp7k4%<~`GMFYCu{4QeWR3*)9H9H`ip z9(?4AUiX&nAoGK149)C3mGl}qN0LU{Hi$_&cq-|DS%&S9$u<3U@J)<EY-Uv6z!laj XM`D`j)A}^HHs(XQ6ClrlOhxQJWg|Q4 delta 1258 zcmZ8h&u<$=6rP!#{ppPzk~+2niEE5fwkdTeY9mlnwW`D=BCQm9ZKyIXq$PIrb`wOj zhDtec;53LM)JJY0frJGA01{U&D}=<61LB4dQY*f<uF_CT@6*hCZ+GW?-#7lg@$Fo7 zI5ias{6_U9^Hc4c>R<Af!uC2MeF2b(hjJ`NA{R#9R}^Q;$RjDS-xP`3_~SDvMB-3@ z)*^hjpKa|8(=4SL_K7Uqa`%;>hCNVMR_e&ch?Ls{Cs2XZk~n)<?Oom(WN&c)){ePS z=$kh--?o41dHJ>73%hpN?XIuq`e85@w2niCxz5E{jojR&%UNVx;~gm}vPu>kKUepr zOz^2XlA8jx&_pL{nydCpw=S#pJGU)c_7}Hfzi`6(;mqA3?eCs9JL%s0cRnmfN$jlm zqW#VB8i^`2>bvwj&YL)e=Cjg*z2SAd)10c=1Mi$%uvc~4{^+%D7iz~)$Q8eQrU<B? z?hOZNpB9m&Hp2p-@VAG%yZu4Ni$R73HMmwnlN;ibM`FIxCHtyB+l;|qBxhu#PD$k` zsigO)>d{$y+rPG^(O2qtfQ6AG#aiYfm!Qqb9iyP<H1q^b(9<zaOBme}BMoYm{nc+? z%5?6QMVD4GFl>D0ao}Pdn6Tv3%Y3j4OTZ454f60Q+X-gv>%o$ox9<c?Eq2kr&rO&u zaf^ogSw9Kv=fRm3ScD)vO`(e_3~Z3Zn=lqVAqJM9WiGyKe-G+wJzoBwBI4XdL^==9 zPAu77v4YDO!BY&DVnscBDO@`bI^=|oF^I`Q0?4QxlcA2u08zQL<M3+T;g6nTfaS&H zIOpu&VFz<IqwWmPNv{APH~X79_O0m5$Ly9#GmBotrNj5(0iNkKE<Q5|=Qa>2E3cjC z#2}G69)r6M!ydn_H|T$`jqUM|FR+VX@m2bseXLH)3%2d7HbcHAlY3!sfjN?BgIe~1 zv)CkN?(m6H+tk04^~)<@e{i}N>FIbCVrLcA>t)MLoZwBq7F8rmJ5!feF9Gb9?p#aM zBwKp^nORrSbQh7%0b-sNc4kXYL#%13|H0qGs{J|oBw^FjS%y;lk~n_)1bgMXoA#s1 Pa?Quni--nduB!e6;->$c diff --git a/frontend/application/frontend/api/PostClient.py b/frontend/application/frontend/api/PostClient.py index f779577..24155e0 100644 --- a/frontend/application/frontend/api/PostClient.py +++ b/frontend/application/frontend/api/PostClient.py @@ -36,10 +36,11 @@ class PostClient: return response - def create_post(form): + # payload = {'title':form.title.data, 'category':form.category.data, + # 'content':form.content.data, 'user':current_user} payload = {'title':form.title.data, 'category':form.category.data, - 'content':form.content.data, 'user':current_user} + 'content':form.content.data} url = 'http://172.16.238.130:5002/api/new-post' response = requests.request(method="POST", url=url, data=payload) @@ -47,16 +48,6 @@ class PostClient: if response: return response - # def create_post(form): - # payload = {'title':form.title, 'category':form.category, - # 'content':form.content, 'user':form.user_id} - - # url = 'http://172.16.238.130:5002/api/new-post' - # response = requests.request(method="POST", url=url, data=payload) - - # if response: - # return response - def delete_post(post_id): url = 'http://172.16.238.130:5002/api/' + str(post_id) + '/delete' @@ -66,8 +57,9 @@ class PostClient: return response def create_comment(form, post_id): - payload = {'content':form.content.data, 'user':current_user, - 'post_id':post_id} + # payload = {'content':form.content.data, 'user':current_user, + # 'post_id':post_id} + payload = {'content':form.content.data, 'post_id':post_id} url = 'http://172.16.238.130:5002/api/new-comment' response = requests.request(method="POST", url=url, data=payload) diff --git a/frontend/application/frontend/api/__pycache__/PostClient.cpython-310.pyc b/frontend/application/frontend/api/__pycache__/PostClient.cpython-310.pyc index 1e3590b2d6bdb6a42923fe3e019cf624cbf3b994..c104fb547b7b4b247ef6fd088662cfa373ba4971 100644 GIT binary patch delta 372 zcmYL@Jx{|h5QgK}P7F<|RBDz&Ddj5)f-VRN0Sn@5W9g2B>Ie~`rgFVdIbvb$bYemM z6AVl&jEv0v8}I`-hXD_d&aZuU&r9Pc3X3pYbnu+#iQIn;zbQEY!s1IwX0#;IEnUrW zE~#-1k!(s!YN%=%+IOVWcT#?p(mB_6`aYYB!Hv#t3-vJf2gOilLp@2LK|1iny0NEP zxJ7j=mMoSL@X1bs1dDNm2&e}!e<W>q=7(etzWCW`4|C(>PEK$=nV}9UQSIgwl~Afu zVuq>Muzw}Dny#AIJlU=kN-x-L<5jI7Qug;=$q1V+*p#bPTiY(xg?DeKeuU*XK-4L7 vBlz%}5c;EN-TtViF<WiG)KAC-y!kR(v%#jtmPG=o==n7f2ocoaS{(lZ&yz{I delta 377 zcmYL^u}%U(5QcAW=k8W=7Y~CLAc&&i6&f3&Arz8O)9?TmE-|@6ljUg4Ua+w=7SkDC zLJJGu!Nged8rmA1ISaS=GW+jj=G*W1sT|!zQOTk6v(eTc&(W6@JruBclz|ot$c1)u zH}g_oOY2&p;X&roN>j6P>}Y4~B;F_i96(hqVK$wZ+YS!=7T!U<6__dwHcdv2u}xTp zmosA~*VzSk;|mPJLyD&{AruN%Fc%G+dp*&|H*a`;Lb-KPClwj*7YmuY<Rmkh0y&XY z;RF`UmW6*OS!^?PJoUTX1`RPggv9%cn;h&i6l0A*PkUTf7%c+6Lls~B_41G|g`X0x u@K+%5)4z`oxUU!tT($8k=!g+M20Gs7pu^y=nFOUe4nkE?DlFld>i+_-9ZP!v diff --git a/frontend/application/frontend/forms.py b/frontend/application/frontend/forms.py index c224908..6725245 100644 --- a/frontend/application/frontend/forms.py +++ b/frontend/application/frontend/forms.py @@ -14,14 +14,10 @@ class CreatePostForm(FlaskForm): title = StringField('Title', validators=[InputRequired()]) category = SelectField('Category', choices=[ - ('help', 'Help'), - ('python', 'Python'), - ('nodejs', 'Nodejs'), - ('general', 'General'), - ('feedback', 'Feedback'), - ('html-css', 'HTML CSS'), - ('support', 'Support'), - ('javascript', 'Javascript') + ('social', 'Social'), + ('lost&found', 'Lost&Found'), + ('faculty', 'Faculty'), + ('buy&sell', 'Buy&Sell') ]) content = CKEditorField('Content', validators=[ InputRequired(), Length(min=20)]) diff --git a/frontend/application/frontend/views.py b/frontend/application/frontend/views.py index 4a938d7..240fc64 100644 --- a/frontend/application/frontend/views.py +++ b/frontend/application/frontend/views.py @@ -16,8 +16,9 @@ def get_posts(): if posts == 404: abort(404) - return posts - + + return render_template('forum/index.html', + posts=posts) @frontend_blueprint.route('/post/new', methods=['GET','POST']) # @login_required @@ -28,10 +29,16 @@ def create_post(): post = PostClient.create_post(form) if post: flash('Post created successfully', 'success') - return redirect(url_for('forum.create_post', _external=True)) + return redirect(url_for('frontend.get_posts', _external=True)) else : flash('Post not successful', 'fail') - return redirect(url_for('forum.forum_route', _external=True)) + return redirect(url_for('frontend.get_posts', _external=True)) + content = { + 'page_title': 'New', + 'form': form, + 'post': None + } + return render_template('forum/create_post.html', **content) @frontend_blueprint.route('/post/<int:post_id>', methods=['GET','POST']) @@ -49,14 +56,15 @@ def display_post(post_id): if request.method == "POST": if form.validate_on_submit(): + print(form.content) comment = PostClient.create_comment(form, post_id) if comment: flash('Comment created successfully', 'success') - return redirect(url_for('forum.display_post', post_id=post.id)) + return redirect(url_for('frontend.display_post', post_id=post_id)) else: flash('Comment not successful', 'fail') - return redirect(url_for('forum.display_post', form=form, post_id=post.id)) - + return redirect(url_for('frontend.display_post', form=form, post_id=post_id)) + content = { 'post': post, 'form': form, @@ -69,7 +77,6 @@ def display_post(post_id): @frontend_blueprint.route('/post/<int:post_id>/<int:comment_id>/delete', methods=['GET', 'POST']) # @login_required def delete_comment(post_id,comment_id): - user_id = 2 comment = PostClient.get_comment(post_id,comment_id) if comment == 404: @@ -77,7 +84,8 @@ def delete_comment(post_id,comment_id): comment_user_id = comment[0]['user_id'] - # if comment_user_id != current_user: + # if comment_user_id != int(current_user['id']): + user_id = 1 if comment_user_id != user_id: abort(403) @@ -88,13 +96,12 @@ def delete_comment(post_id,comment_id): else: flash(' Comment deletion not successful', 'fail') - return redirect(url_for('forum.forum_route')) + return redirect(url_for('frontend.display_post',post_id=post_id)) @frontend_blueprint.route('/post/<int:post_id>/delete', methods=['GET', 'POST']) # @login_required def delete_post(post_id): - user_id = 1 post = PostClient.get_post(post_id) if post == 404: @@ -102,7 +109,8 @@ def delete_post(post_id): post_user_id = post[0]['user_id'] - # if post_user_id != current_user: + # if post_user_id != int(current_user['id']): + user_id = 1 if post_user_id != user_id: abort(403) @@ -112,23 +120,4 @@ def delete_post(post_id): else: flash(' Post deletion not successful', 'fail') - return redirect(url_for('forum.forum_route')) - - -# @frontend_blueprint.route('/post/new', methods=['GET','POST']) -# # @login_required -# def create_post(): -# # form = forms.CreatePostForm() -# # if request.method == "POST": -# # if form.validate_on_submit(): -# form = FlaskForm(meta={'csrf': False}) -# form.title = 'hello world v2' -# form.category = 'social' -# form.content = 'testing from frontend' -# form.user_id = 1 - -# post = PostClient.create_post(form) -# print(post) -# if post: -# print('Post created successfully', 'success') -# # return redirect(url_for('forum.create_post', _external=True)) \ No newline at end of file + return redirect(url_for('frontend.get_posts')) \ No newline at end of file diff --git a/frontend/application/css.css b/frontend/application/static/css.css similarity index 100% rename from frontend/application/css.css rename to frontend/application/static/css.css diff --git a/frontend/application/templates/forum/create_post.html b/frontend/application/templates/forum/create_post.html new file mode 100644 index 0000000..e30d80e --- /dev/null +++ b/frontend/application/templates/forum/create_post.html @@ -0,0 +1,32 @@ +{# application/templates/forum/create_post.html #} + +{% from 'macros.html' import displayField %} + +{% block title %}Create Post{% endblock %} + +{% block content %} + + <h1>{{ page_title }} Post</h1> + + <form class="post__form" action="" method="POST"> + + {{ displayField(form.title, 'Enter post title') }} + <select id="category" name="category"> + <option value="social">Social</option> + <option value="lost&found">Lost&Found</option> + <option value="faculty">Faculty</option> + <option value="buy&sell">Buy&Sell</option> + </select> + {{ displayField(form.content, 'Type content here') }} + + <button class="btn btn--solid post-btn" aria-label="Create" type="submit">CREATE</button> + <a class="btn btn--cancel" href="{{ url_for('frontend.get_posts') }}">CANCEL</a> + + {{ form.csrf_token }} + + </form> + + {{ ckeditor.load() }} + {{ ckeditor.config(name='content') }} + +{% endblock %} diff --git a/frontend/application/templates/forum/index.html b/frontend/application/templates/forum/index.html new file mode 100644 index 0000000..4055d45 --- /dev/null +++ b/frontend/application/templates/forum/index.html @@ -0,0 +1,28 @@ +<!DOCTYPE html> +<html> +<body> + +<h1>Posts<h1> + +<a class="btn btn--link" href="{{ url_for('frontend.create_post') }}">New Post</a> + +{% for post in posts %} + + <div class="tile tile--wide"> + + <div class="tile__content"> + + <header class="tile__header"> + <h2 class="tile__title"><a href="{{ url_for('frontend.display_post', post_id=post.id) }}">{{ post['title'] }}</a></h2> + <span class="tile__date">{{ post['date_added']}}</span> + </header> + + <div class="tile__text"> + <p>{{ post['content'] | safe }}</p> + </div> + + </div> + + </div> + + {% endfor %} \ No newline at end of file diff --git a/frontend/application/templates/forum/post.html b/frontend/application/templates/forum/post.html new file mode 100644 index 0000000..80eaf32 --- /dev/null +++ b/frontend/application/templates/forum/post.html @@ -0,0 +1,95 @@ +{# application/templates/forum/post.html #} + +{% from 'macros.html' import displayField %} + +{% block title %}Post{% endblock %} + + <section class="row latest"> + + <!-- START posts --> + + <div class="tile tile--wide"> + + <div class="tile__content"> + + <div class="tile__header"> + <h2 class="tile__title"><a href="{{ url_for('frontend.display_post', post_id=post.id) }}">{{ post['title'] }}</a></h2> + <p class="tile__date">{{ post['date_added'] }}</p> + </div> + + <div class="tile__text"> + <p>{{ post['content'] | safe }}</p> + </div> + + <div class="tile__footer"> + + <div class="tile__author"> + {{ post['user_id']}} + </div> + + <div class="tile__buttons"> + <a class="tile__btn" href="{{ url_for('frontend.delete_post', post_id=post.id) }}">Delete</a> + </div> + + </div> + + </div> + + </div> + + <!-- END posts --> + + <!-- START comments --> + + {% if comments %} + + {% for comment in comments %} + + <div class="comment comment--wide"> + + <div class="comment__content"> + + <div class="comment__header"> + <h2 class="comment__title">{{ comment['title'] }}</h2> + <p class="tile__date">{{ comment['date_added'] }}</p> + </div> + + <div class="comment__text"> + <p>{{ comment['content'] | safe }}</p> + </div> + + <div class="comment__footer"> + + <div class="comment__author"> + <p class="comment__title">{{ comment['user_id']}}</p> + </div> + + <div class="tile__buttons"> + <a class="tile__btn" href="{{ url_for('frontend.delete_comment', post_id=post.id, comment_id=comment.id) }}">Delete Comment</a> + </div> + + </div> + + </div> + + </div> + + {% endfor %} + + {% endif %} + + <form class="comment__form" action="" method="POST"> + + {{ form.csrf_token }} + + {{ displayField(form.content, 'Type comment here...') }} + + <button class="btn btn--solid post-btn" type="submit">SUBMIT</button> + <a class="btn btn--link" href="{{ url_for('frontend.get_posts') }}">HOME</a> + + </form> + + {{ ckeditor.load(pkg_type="basic") }} + {{ ckeditor.config(name='content') }} + + <!-- END comments --> diff --git a/frontend/application/templates/macros.html b/frontend/application/templates/macros.html new file mode 100644 index 0000000..3b27f63 --- /dev/null +++ b/frontend/application/templates/macros.html @@ -0,0 +1,12 @@ +{# application/templates/macros.html #} + + +{% macro displayField(fieldName, placeholderValue) %} + + {{ fieldName(class_='input__field', placeholder=placeholderValue, **kwargs) }} + + {% for error in fieldName.errors %} + <p class="form__error">{{ error }}</p> + {% endfor %} + +{% endmacro %} diff --git a/post-service/application/__pycache__/__init__.cpython-310.pyc b/post-service/application/__pycache__/__init__.cpython-310.pyc index 01f59a94537dc3b4f411c5680869877bd387dfbd..7b3e4c585f168d3fe3a6724ca740665e46c8cddc 100644 GIT binary patch delta 20 Zcmcc0dX<$spO=@50R&>yH*%k10st`71YQ6D delta 20 acmcc0dX<$spO=@50SJz-R^7;biU|NX6$Nqt diff --git a/post-service/application/__pycache__/models.cpython-310.pyc b/post-service/application/__pycache__/models.cpython-310.pyc index 6651d0197ba8e2b46e0f0bbe8010326a5dd19023..0652316d85c960e44d4ebabb0352c9537bf710fc 100644 GIT binary patch delta 55 zcmaFE`-Yb<pO=@50SKzR)Kk3JHu8OBVicOh{F{+w^B-m_Mn<*C=ByJKH7B27-O4C8 KxsENDQ4#>0#}51e delta 55 zcmaFE`-Yb<pO=@50SJz-R!zCXx{>cA6QkfH=HHCWoBuFdF*2%7HfNo{s4@8j>sChD K$#rbGj1mCN$PhCC diff --git a/post-service/application/models.py b/post-service/application/models.py index bb46f06..9af9ad5 100644 --- a/post-service/application/models.py +++ b/post-service/application/models.py @@ -14,6 +14,7 @@ class Post(db.Model): def __repr__(self): return '<Post %r>' % (self.title + str(self.id)) + #this is going to change UserClient get user first_name, last_name by using user_id and return as 'user' def to_json(self): return { 'id': self.id, diff --git a/post-service/application/post_api/__pycache__/routes.cpython-310.pyc b/post-service/application/post_api/__pycache__/routes.cpython-310.pyc index 1c46abf130a35003a70104be8e15244d557a2720..493b4f7de7b0050188b73b6aa70882525becf283 100644 GIT binary patch literal 3012 zcmaJ@OK;mo5aupl67{g+IF9YSAAK-QqCV1Bng&IkqL;!A;PfK25M(dy$fiVPNi~Q- z0|nA+Z$0)PAM=-Z?J4KndTGBIlCs>|rLd#r%)aKEZ)O=a8lHjYVDBB}H4NiVdYOML zynKZgFA2j?h7zGM5FIg)9XT*N=D_M$!cbC~p*?Uq4*Hg|(RVv8_nojZsCKFYujBDJ zH>?fnow_grXRo0us=6zb_nTBTRsYp^DLPHoH)i^#T44PG>svGZ8MVmz7VFQ>^h@d- z>(8)$S)DJ|Us0>9Uu6B7s=^|9=L_m0Th6lO(rm_Mb%pgytiL)p<C?n8mUHUHrs3aw zO?dfM=I+JOu)p&nb9L}+9K=c181(jot`6c+G>n7H?rlXnc?}>9Uu27;C{DV)QNOzt zj)Rfz50lq2H%YbS%glO=0hzlV4F<t5!3^(*IMC~1A8!+{jhSs)BF@Zjzj*?)I|!1e zk&3tJJmq7eW23F3y?F?+YaAGfu_vbT(0FA0R6P)>F*Q>$wGNF#A&h5kiZT0AuO_w< zFQG}C6p=ZQsoXSP$&LQ+aKLvp@g}q3sD6=|y)ew2-e?pIRpus9m!QzJuO^pXnVF?} zNiQ>X^gOGSfV?vFDy)Bf*?t-gg7z5RwYQ&dh0!iMb_ef2_qPLhItu&Sy`&!v*+8JR zbu><b`0nUMR^1JfE+bLJYHyklmTZcasK^SMCG-WTCX0;N1HgQrk?*UA+Z2lOq0^Q~ z#R@M#O5{kTKnDH`;3P|&5*rvgkictS9*SwDz>}~vQ?nfRY%LXx=k26g;OV8n^}tH4 zO+&Y^kzZpl^%?XtkGzR=_ul*W^jRqM5{Vj_oSlA{1Uhqz^Xo-2%~1AjeT9ZqOMK(Z zqLKPM4O<~WaOYx;MpjDX&fzVl)ht;DbZc@3p48W&o-`P|?VO6IGfXdFaPE`KXJ()B za~?S}JF%vH|9z-B9je^vZ5nWq#0`kajsM25%@HlecPXgExbis`)bF50P-PxeNRvW` ze=8LTp`6->#sNa7j4@7?IC;1bau?x5cqu)SYATNh&zp1fGIq#=Ap0t_clsLev%5#$ zbB-6G@{Z1(waR`OzRWE&C&sQe2h)exHeQAR@4<Qbw}n<QD*|uQlG=x<2;nezeuqeb z>hk^OlVhdAp#{*WRKy{K5_zdma<xbWWunLUDGNO_kuMDp*+{J}Xb)+n64FjhNGEak zD${CeF>ciN4h<k!Q+8@i>xYJN{va&v)J7R~H#8j}vy*-j23ZC99_&V_EkI$IaLId& zb6@Q#6{uH|s$CrSc7x0TUgI$F8``A#)=s1cd2w>7qJR?mJs9+D5_d>YnaJE2^HEVy zyOhctg1Vn@wc?EPoy;1aF!vfQa8fSSIVk}z{eO*7F{PO0c+wM|aHNwrQOElt1?5wi zC#xqAS_NT{1jlL<c}9&xL(!hAOCmA%tf`#}hMD>f!|W=dWS=SxS8m_j&~4hX&M@Yi zD8F)4dh{ij865o)dYO}t(I1nVS!*)4^{E)t@)=x=f5fbq?ufccF4xKB&+$5GvCG86 zg5KNE&K^pZ83}2PQ%OkFLjtEJs3#$j#E^F4?77oQYBCzsuQD2*vXI0zkj`e(arO0` zoOC%YsCZ5q>v@gKd8Y3|=hvB8`UCXyT&D=+P|Wzmkm-A5nBkQZ$=08cmPgVS`dt#I zQ>Z}YDMsZv%@kq+3FnAD_hFyhI)Og_u7~Y{PxEDw5GJIVPmj>~-;yW`OmWN6*T5X6 zCBslOk-{az7D^0DlGRQsk@_a~)o+oYgv<f_jCwNweJe+qZ-G-`YZk04fcphY@Lkrl z%2HT23j%%t+lIf4${hCM{XE+#uQUO|g*r2|OMR{p&LG0tah@W41vl~OarfvmOxH0s zv-w+uzcTo?<hzQCE+;wDUQ@g@?LT+l@pYWv#1F95I1C=r7fE~zVnx*PYoRr9`eqHS SRs1h_vbEyLricIKru+x)j)4>a literal 3813 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 bb_DHEv|4CQH0smuYAD<5p+sM{Z?@z&tY$6G diff --git a/post-service/application/post_api/routes.py b/post-service/application/post_api/routes.py index 116dd30..a0a34ca 100644 --- a/post-service/application/post_api/routes.py +++ b/post-service/application/post_api/routes.py @@ -5,39 +5,7 @@ from .. import db from ..models import Post, Comment from .api.UserClient import UserClient -# for initial post -@post_api_blueprint.route('/api/initial-post') -def post_initialpost(): - post = Post() - post.user_id = int(1) - post.title = 'hello surrey' - post.category = 'social' - post.content = 'this is initial post, hello world' - - db.session.add(post) - db.session.commit() - - response = jsonify({'message': 'Post added', 'result': post.to_json()}) - - return response - -# for initial comment -@post_api_blueprint.route('/api/initial-comment') -def post_initialcomment(): - - comment = Comment() - comment.user_id = int(2) - comment.post_id = int(2) - comment.content = 'welcome to comment section' - - db.session.add(comment) - db.session.commit() - - response = jsonify({'message': 'Comment added', 'result': comment.to_json()}) - - return response - @post_api_blueprint.route('/api/posts', methods=['GET']) def get_posts(): data = [] @@ -99,9 +67,9 @@ def get_comment(post_id,comment_id): # @login_required def post_newpost(): - # user_id = request.form['user'] - user = request.form['current_user'] - u_id = int(user['id']) + # user = request.form['user'] + # u_id = int(user['id']) + u_id = 1 title = request.form['title'] category = request.form['category'] @@ -133,21 +101,21 @@ def delete_post(post_id): return response -# @post_api_blueprint.route('/api/<int:post_id>/new-comment', methods=['POST']) @post_api_blueprint.route('/api/new-comment', methods=['POST']) # @login_required def post_comment(): - user = request.form['current_user'] - u_id = int(user['id']) + # user = request.form['user'] + # u_id = int(user['id']) + u_id = 1 content = request.form['content'] - post_id = request.from_object['post_id'] + post_id = request.form['post_id'] comment = Comment() comment.user_id = u_id comment.post_id = post_id - comment.connect = content + comment.content = content db.session.add(comment) db.session.commit() diff --git a/post-service/instance/posts-service.db b/post-service/instance/posts-service.db index c0d65ae2fb58b795e3cce7e9b99df4007ff0b280..f6e18b37da6a48346349bc2e23f0587e609bd451 100755 GIT binary patch delta 743 zcmZ{hziZS`9Kc^p?k>q)@`77wOJ7l(t})5WZ_|_@NDG}bbT(eodT^J7yGSW2y?~p8 z9{CGg#ie#}b}9-Eg0t@39Gra@jfdKMJP7a0C!d7Rn@p(5gnGG5?Mzp0Q#+^kUqJ|2 zK#N@<zJ;OK6}xAWv?87qbh8Dxd#l0Y@L_+9$c|7FAE7KA=O|6k!6;4gIN3*8bQnK) zbbMnR4+ff|;SB|EU=?ZDRW(;LWye-5$MQ0Nn*eDS<$rXQs-K`<l*fnZ=orm3(J;G3 zRNTP3nfU@AGUc1K^{YgvsxEOVmW;8Z*>?GLZJmLy!S1x!z7jTSN>g3cadj*^1T&3_ z0s!nyi@OpJzX2Ma19%R<zzcYBCZTt5uS2g=_5U|{dWjmRy?!)c;1AFyZ_d_y+L)cH z84$>$El2>qhj$<=et^%!=i;s?2%m%(f^=GZ@0>gpSP&Ee;HZDXn683ln=H#9Vdh18 z>2Me)IXXy3q*FW(K1&tv|JNNYs8_{nUfb-nKo9`xug|NlVY^tB70ohjTqgeVb!M}D zIcT}MB0IX{n9gsIzZ@i&ZOevfYD#V77J`<n+PbOKMs^`+%9^R_xH9sL*Z2j3^0RN0 U?A8;`Yt@s`H#m=~Pan68pM+er6#xJL delta 356 zcmZo@U~Fh$oFL6;JW<A((RgFRLVkV*1_ow+4hH^J{2}}te0w$v2*~hFY;|Y!nb_zJ zB0T)OnAsUPH6<O*Gg5PM@)gSSi*iyF%8ZKhlQR=@j0}v7bq$PljSUox46KZdtqe@{ z%ndCp%uGvCi%T-|(iPH*@^e8%UP)?RN(j^BFnL8GBNGKf6Dv~#D?<xCLo-uTOUucf z@`_9$jBr^aD<cytV-r1Na|<&wbC9e67ucx}82G>Ozvh3ye|58f!VZ2PpdbSSH<(0W zaxqIXLY&BqU@~zsOL9U)dHK2+Soype_z&^B0X=?_&zsMCv!a4IAEzxlJA<Pm10&<) uUVBqkCjJ%%`-zR#oVKhm;mdZWliBTSS%CK0O>DH{v|)tEa85pLZwdgxT2aaX -- GitLab