From 6e21f084cdcacf69bdaa264de6d118501912d39e Mon Sep 17 00:00:00 2001 From: Phuoc CAO Date: Thu, 12 May 2022 11:46:42 +0200 Subject: [PATCH] added tag_edit --- cao_blogr.sqlite | Bin 245760 -> 245760 bytes cao_blogr/forms.py | 9 ++++ cao_blogr/routes.py | 1 + cao_blogr/services/blog_record.py | 17 ++++++- cao_blogr/templates/blog.jinja2 | 3 +- cao_blogr/templates/blog_edit.jinja2 | 5 ++ cao_blogr/templates/home.jinja2 | 4 +- cao_blogr/templates/tag_edit.jinja2 | 64 ++++++++++++++++++++++++++ cao_blogr/templates/topic_edit.jinja2 | 53 +++++++++++++++++++++ cao_blogr/templates/topics.jinja2 | 4 +- cao_blogr/views/blog.py | 6 +-- cao_blogr/views/default.py | 60 ++++++++++++++++++++++-- 12 files changed, 213 insertions(+), 13 deletions(-) create mode 100644 cao_blogr/templates/tag_edit.jinja2 diff --git a/cao_blogr.sqlite b/cao_blogr.sqlite index 753f26bac6e965c353af99629ebec1d9184ea824..32dddfee698f1035d941fb27f170681e683441d7 100644 GIT binary patch delta 3619 zcmeHKeQZ0ZDB9XZgN6_dOH4&-Q|&{VG_h{gG{gk-k4fv)v1N2xna|+wo*|C2qyL#c^I$d5O=4I{q|C z5JbOo_3ExZPp`u7lla0XN)eAa>*|0TmeNbh!z&#ir)q6@Ymdg4UWXmH)l~*phS&JO zW?!))MT$dxvdfHCv3=RLhH~S^c(aZx{N+W zlV}F*4!JiM98Z<-HkR{)jBle5lPU2>!Xe1^xC zUjv>vvNJmet8MQPX3H6ZIa_(bdKUfCat57aG)4oJM=b86WLcSW?KkDFK3}Y}I}+`T z#M;MkJP8N+M7<^))LP?$qzOuWht1M1cIf}AqT~9&DSDNy-7R*s4=DzJs6(G#MXxlq zyJ2+d6wUd8=^pPmif9mi%nC;K_J#YqcRd~XJmJ~*p51INh|HP?pK3COhL*gBEi#;L zVw6`>yrHHA56e=5*Mzi^Jvi7HTvEtTWzNQ9a4K9R8jEyqi$;1P(f-d>Y8_}^RvH*+ zt}p2CO)KKCC@5H!B`m1pim0_Mcy zDPVrWg}>5Su#&kz+|0f^u+Z+PFjZGOcNL#lECzE1<{o_Pq{+D!b@c_qcwCXkWz~f) z5}z(ydNx6t&^2@o0y&H91u+H!Rv4Sh7p}{X*&QCt210&Mh--5NeVcs#w#!pi+}sYU z>VVb(Jqlz8LO=}A8lY7`tAW_8@BGHKZWyfxY6PkWY5@uX)d1BlJb(W9AW7&qPf}ma zC0Tlksd)cr6mPkGbw>YN2mSXJ&VxBN#Bw1v;PQJ|*6Zo&^X?M2$FmTDr z2nciN=MPhm^f7ae@iRx@psN`g(-D38K3Q!8JgOFY@g;lAhq zw^>vwUS&*Sq!)d?q3q7)syef5VL-oAL5zjBKrvDFqNC@Mgd zS*XB#riHS-xYKMQI$w_E#bxW}YID4eev$GNMREoXf&oAG5Rs=_$}B|c+z4#0t<8q# z*j%)X{&l(GIDm-rg;>_*39x>z7t$e?mJUIY>xuR9il`C<_4C{lHu@J-x%nPpzQ@?- zGoP55Pv~+hv1|GdO~%i@h?*5|&on*Pwd4kyxhIIX1>7w(2*@!pXtDv4?L^r91% zuHBfOe0x`JxSBpimIYwCHD|vIr)d|&5lNO*oaAvQu>Cp5Y4Wc~zd(~V1DHh4v6;M% zHWond4f)$#0S^~oePD0D0d>HepnV4TS1!>4T22#Bi1oVyEX#5LQD0cmL?|BWZa%p< z3mb8lpeTZp$tdKepO~q8$jqlfXIsuZPToUyMYCD95;QeMR4$tSO-;>b6v}q&d8>tp zoYD z&L%|O$k2iY6;vEJaKI%Pi(5;Jh1Qgi5TPT(%7QXOazjJ6gd@>yJGx`ri+Z*g6&Ugn z+Jb_|#DrS3-4HyqGz*hs;$%W~NrL7UrG#+MHL9hOh7UZH`m_=k@&cBmX?RGM$5iMw zd|ZPsUP|DSMMYIu9>#n!iTM#hbrmh@@9XZ|+qolBa#2&n_@Q`mQZVXW{^0sY1zgnC zCrpUKf#UvdX@6Q&L}>)~fTblVhCkx+9Aspo7>2MCAB6zr%_)i92W~;YFx*x&e1KQ+ zq$oin5g}B=ik!k+FyOm0mG!V3lxL5pmG!q4(#_izf?V~s`2%h2|DJhB7QeE^Vj*JL zMk9+GcJR2z2zMchIQDcjJ2+RCgHrhdnH%{weT4QFicK)&@wx(>C%9=-DY+jgH;~|y z%RsLC0?1zg83XwLFF;HowWw!PU_y{^hZxUj-Tn36^$2@ zcx(PfTFTDx0>2fmgQ*l>OwG?!NXUAHpLl;d!P_i)rGw`5$O(G;WDC}cHy0J^B#@}a zA$wK4Au5jXhxlfj<#BA(Xy_og6Y8nLCrheTgKgZ_ftxRI&G^pLYdFFy$wQ@bVBG1U zl))lNP39{rTo7W5v&nWLe`k{5(hJQk$x9SvIuN2=|K~RLB`@+yr>GQ ze)0rezpl{ZJ&?&hmuC~)wBY}s;2vRUsYPEoO`Gkea|C^EKJyyQ{60omiNn)#M!&6V a(vRfG+1$_%=(AS+osSCL)c58k+WsF$C`QBp delta 3460 zcmb_e4{Q_H8NYYW|KdM)35JBk3Aq?TAR+eIXUD{I%uL81DnbGYe}#kXp^HY%J?g$2xUGl$LEs6O2mRB*wO)ZQ3-c-8&~C z!EU8$n&i*--uJ%ueZTMDdv9cf9vPue*ueQzc{4aa^~h=Gs-px=l>o|5mC(PVFHn!s zQF;gMqpN5m^*8D&b&fho?adSweq>3b4J*_B;2)1HEzlCy($d!L?yflhWr?5tFE?Or zRTbujq~su$@rNJ?uhmx3y4^La-81`P zJOoj;LZj}fyT8V56(1A$B-0g7U)a!AjknUYm7pu>+w^<%PwCg`d-M@{kba&%P4jdY zT~9aBR_xJTDsAoD=cY8)QgGjwf+ZSjl{#I3ZlE<*o64GltWTfr+;64N5jyidf_lk( zk9v)M$8wQAg>_ywvv}dQwfgCm7+%ZP?v~AMTU$C>w)Tv+lUi%_Q^_25kV)U%yH;Z{ z;sLd9?Fx0!m5hrAL?O;3ViF@H2IHcrFu*7;(wVEV6@^7C!>;#p zF2CF5@UC~cS?=`_6SKA+2e1xPC8i=wg_vke6sB@a#h6MlElGPO>ME>wv#k4GQc;cD;xWwO@oMKss=>UD0fWZ-De8*Sb)_CirrC%lp4Y zM_b^Q%;O*IC6TioR%HJ5>wXeVKLpoi#%~M*jjB-DTnH2zT_^xW=r7}>M`aRdTo3!m z4guY|Miwh&26#im1_s>0P%f)nmqaL;jknO=P4h?%KbUQ?qDYJ0+Qqi?LkkR=!W@jl~W!ekQ;(199O%lO5Ugu)e__?B@I8d{mI+ zn4^c61`ZCyr2c@D56|GdWA{XeVm?}3wx5gfv%jLEQjWy%&@O^S_Ah}>qEE$O<6M0Gc6ayy>utxRe zkRjifw++zMmFG(+5)q<&f3^hX-RYK-vfR(d<wAYB zY6UJ1JK9qK*XE|!9qb+w<;R71gqOne(VVZ?T<1{gFu4?6D}Ywjzjq5@X>P9WU?fF( z{vopwE^nIGj=N%^M%FRSp z?xdQ52hWT{Cg^U-+lRZDPso>EjSEa4?lgP?tz)``IBtN?b|wIF zXm;eFOHJTqqWLJqx~vwoZ44HpKRgGAP-+}@p|2f-E_CM@ zEJZ&$2Ayc;IJDQy8u2z_$PTw!RjLtO@dTl5Bf8TYR8W?=WUf34p8!4~!3a`95b;T_ zUVsTEEHLxWDE!cpnW&f$um}@LM#XIR4)Sp(qFnhZyi8UJOr%DPMq|BVM3gU`ab%xk zwQF`>IwM^=6X$y)XqyjO(c90$-E}H9)qB5(b$D3T?NRG-uHbL)H<*c0=jbIXMp!{8 zl`G&aK>P0w=}pA8(Hk|GTS}mRe+=wOZ3(=tQ!9wYL}X6>xF0C{L%>I+BR{A@N+-_p z%oW@03+Q_Vph|rZwY{+yj8Fv|wlW(r)ia2n1T~1J!8?_#hjDR!&gW;n4o`#2%eh;( zbKAr=+$LDP2c0-XK7rtBumlZ02TD-qaX=}r7J_zKwctf(_k$hEW(IsWJ8wXSU1VH2 zz=E;toIuw*$y&ueLE_ih4=YKV*k&CV*_5IK_Ja z8b5{;eLtxl^+C$I9X_uY|K^hlKKZ{U72%}XY-7zvBUam_*2#4%AW7Q7ffmt K%U(GT3;zrIa`Z|7 diff --git a/cao_blogr/forms.py b/cao_blogr/forms.py index 51926ef..a834436 100644 --- a/cao_blogr/forms.py +++ b/cao_blogr/forms.py @@ -11,6 +11,8 @@ class BlogCreateForm(Form): body = TextAreaField('Corps du texte', validators=[InputRequired(), Length(min=1)], filters=[strip_filter]) tag = SelectField('Sous-rubrique') + author = StringField('Auteur', validators=[InputRequired(), Length(min=1, max=50)], + filters=[strip_filter]) class BlogUpdateForm(BlogCreateForm): @@ -42,3 +44,10 @@ class TopicForm(Form): filters=[strip_filter]) +class TagForm(Form): + id = IntegerField(widget=HiddenInput()) + + tag = StringField('Sous-rubrique', validators=[InputRequired(), Length(min=1, max=25)], + filters=[strip_filter]) + tag_name = StringField('Intitulé', validators=[InputRequired(), Length(min=1, max=25)], + filters=[strip_filter]) diff --git a/cao_blogr/routes.py b/cao_blogr/routes.py index 67e63a0..b27ece8 100644 --- a/cao_blogr/routes.py +++ b/cao_blogr/routes.py @@ -8,6 +8,7 @@ def includeme(config): config.add_route('login', '/login') config.add_route('logout', '/logout') config.add_route('settings', '/settings') + config.add_route('tag_edit', '/tag_edit/{topic}/{id}') config.add_route('topic', '/topic/{topic}') config.add_route('topic_edit', '/topic_edit/{topic}') config.add_route('topics', '/topics') diff --git a/cao_blogr/services/blog_record.py b/cao_blogr/services/blog_record.py index 7aa54e7..395a138 100644 --- a/cao_blogr/services/blog_record.py +++ b/cao_blogr/services/blog_record.py @@ -32,7 +32,7 @@ class BlogRecordService(object): def get_last_five(cls, request): # gest the last 5 items modified query = request.dbsession.query(BlogRecord).filter(BlogRecord.topic_id != 'ADM') - query = query.order_by(sa.desc(BlogRecord.edited)).limit(5).all() + query = query.order_by(sa.desc(BlogRecord.created)).limit(5).all() return query @classmethod @@ -42,6 +42,12 @@ class BlogRecordService(object): query = query.order_by(Tags.tag_name).all() return query + @classmethod + def get_tags_byId(cls, request, id): + # gest the last 5 items modified + query = request.dbsession.query(Tags).filter(Tags.id == id).first() + return query + @classmethod def get_topic_byTopic(cls, request, id): # get the name of a given topic @@ -59,3 +65,12 @@ class BlogRecordService(object): request.dbsession.query(BlogRecord).filter(BlogRecord.id == id).delete(synchronize_session=False) return + @classmethod + def tag_delete(cls, request, id): + request.dbsession.query(Tags).filter(Tags.id == id).delete(synchronize_session=False) + return + + @classmethod + def topic_delete(cls, request, id): + request.dbsession.query(Topics).filter(Topics.topic == id).delete(synchronize_session=False) + return diff --git a/cao_blogr/templates/blog.jinja2 b/cao_blogr/templates/blog.jinja2 index 90f9bc0..02c5261 100644 --- a/cao_blogr/templates/blog.jinja2 +++ b/cao_blogr/templates/blog.jinja2 @@ -16,7 +16,8 @@

{{ body_html | safe }}


- Publié le : {{ entry.edited.strftime("%d-%m-%Y - %H:%M") }} + Auteur : {{ entry.author }}
+ Publié le : {{ entry.created.strftime("%d-%m-%Y - %H:%M") }}

{% endblock %} diff --git a/cao_blogr/templates/blog_edit.jinja2 b/cao_blogr/templates/blog_edit.jinja2 index 3dd172e..d770198 100644 --- a/cao_blogr/templates/blog_edit.jinja2 +++ b/cao_blogr/templates/blog_edit.jinja2 @@ -25,6 +25,11 @@ {{ form.tag(class_='form-control') }} +
+ + {{ form.author(class_='form-control') }} +
+

Topic : {{ entry.topic_id }} {% if blog_id != '0' %} diff --git a/cao_blogr/templates/home.jinja2 b/cao_blogr/templates/home.jinja2 index cda50cd..d6d1b6f 100644 --- a/cao_blogr/templates/home.jinja2 +++ b/cao_blogr/templates/home.jinja2 @@ -150,10 +150,10 @@

    {% for entry in last_five %}
  • - {{ entry.edited.strftime("%d-%m-%Y") }}   -   {{ entry.title }} + {{ entry.title }} +  — {{ entry.author }}, {{ entry.created.strftime("%d-%m-%Y") }}
  • {% endfor %} diff --git a/cao_blogr/templates/tag_edit.jinja2 b/cao_blogr/templates/tag_edit.jinja2 new file mode 100644 index 0000000..ce3affc --- /dev/null +++ b/cao_blogr/templates/tag_edit.jinja2 @@ -0,0 +1,64 @@ +{% extends "cao_blogr:templates/layout.jinja2" %} + +{% block content %} + +
    + + {% for error in form.tag.errors %} +
    {{ error }}
    + {% endfor %} + +
    + + {{form.tag(class_='form-control')}} +
    + + {% for error in form.tag_name.errors %} +
    {{error}}
    + {% endfor %} + +
    + + {{form.tag_name(class_='form-control')}} +
    + +
    + + Retour + + {% if form.id.data %} + + {% endif %} +
    + + +
    + + + + +{% endblock %} diff --git a/cao_blogr/templates/topic_edit.jinja2 b/cao_blogr/templates/topic_edit.jinja2 index 42ce499..50c25f1 100644 --- a/cao_blogr/templates/topic_edit.jinja2 +++ b/cao_blogr/templates/topic_edit.jinja2 @@ -35,9 +35,62 @@ Retour + {% if form.topic.data %} + + {% endif %} +

    Sous-rubriques

    +

    + Nouveau +

    + + + + + + + + + {% for entry in tags %} + + + + + {% endfor %} +
    Sous-rubriqueIntitulé
    {{ entry.tag }} + + {{ entry.tag_name }} + +
    + + + + {% endblock %} diff --git a/cao_blogr/templates/topics.jinja2 b/cao_blogr/templates/topics.jinja2 index 528581f..6527062 100644 --- a/cao_blogr/templates/topics.jinja2 +++ b/cao_blogr/templates/topics.jinja2 @@ -4,8 +4,8 @@

    Retour - - Nouvel utilisateur + + Nouvelle rubrique

    diff --git a/cao_blogr/views/blog.py b/cao_blogr/views/blog.py index 1eb2d14..650e0b6 100644 --- a/cao_blogr/views/blog.py +++ b/cao_blogr/views/blog.py @@ -131,9 +131,9 @@ def topic(request): if items: liste += '
      ' for item in items: - liste += '
    • {1} — {2}
    • '.format( - request.route_url('blog', id=item.id, slug=item.slug), item.title, - item.edited.strftime("%d-%m-%Y")) + liste += '
    • {1} — {2}, {3}
    • '.format( + request.route_url('blog', id=item.id, slug=item.slug), item.title, item.author, + item.created.strftime("%d-%m-%Y")) liste += '
    ' else: liste += '
    ' diff --git a/cao_blogr/views/default.py b/cao_blogr/views/default.py index 2b0d800..344dcbe 100644 --- a/cao_blogr/views/default.py +++ b/cao_blogr/views/default.py @@ -9,9 +9,9 @@ from pyramid_mailer.message import Message from ..services.user import UserService from ..services.blog_record import BlogRecordService -from ..forms import UserCreateForm, TopicForm +from ..forms import UserCreateForm, TopicForm, TagForm from ..models.user import User -from ..models.blog_record import Topics +from ..models.blog_record import Topics, Tags @view_config(route_name='home', @@ -196,7 +196,7 @@ def topics(request): # get all topics topics = BlogRecordService.get_topics(request) return { - 'page_title': "Liste des topics", + 'page_title': "Liste des rubriques", 'topics': topics } @@ -230,14 +230,66 @@ def topic_edit(request): form.populate_obj(entry) request.dbsession.add(entry) - return HTTPFound(location=request.route_url('topic', topic=topic)) + return HTTPFound(location=request.route_url('topics')) else: del form.topic # SECURITY: prevent overwriting of primary key form.populate_obj(entry) return HTTPFound(location=request.route_url('topics')) + if 'form.deleted' in request.params: + BlogRecordService.topic_delete(request, entry.topic) + request.session.flash("La fiche a été supprimée avec succès.", 'success') + return HTTPFound(location=request.route_url('topics')) + return { 'page_title': page_title, 'url': url, 'form': form, + 'tags': tags, + } + +@view_config(route_name='tag_edit', + renderer='cao_blogr:templates/tag_edit.jinja2', permission='manage') +def tag_edit(request): + # get tag parameters from request + topic = request.matchdict['topic'] + tag_id = request.matchdict['id'] + url = request.route_url('tag_edit', topic=topic, id=tag_id) + + if tag_id == '0': + # create a new tag + entry = Tags() + form = TagForm(request.POST, entry) + page_title = "Nouvelle sous-rubrique" + + else: + # modify post + entry = BlogRecordService.get_tags_byId(request, tag_id) + if not entry: + request.session.flash(u"Tag non trouvé : %s" % tag_id, 'warning') + return HTTPFound(location=request.route_url('topic_edit', topic=topic)) + form = TagForm(request.POST, entry) + page_title = entry.tag_name + + if 'form.submitted' in request.params and form.validate(): + if tag_id == '0': + form.populate_obj(entry) + entry.topic = topic + request.dbsession.add(entry) + return HTTPFound(location=request.route_url('topic_edit', topic=topic)) + else: + del form.id # SECURITY: prevent overwriting of primary key + form.populate_obj(entry) + return HTTPFound(location=request.route_url('topic_edit', topic=topic)) + + if 'form.deleted' in request.params: + BlogRecordService.tag_delete(request, entry.id) + request.session.flash("La fiche a été supprimée avec succès.", 'success') + return HTTPFound(location=request.route_url('topic_edit', topic=topic)) + + return { + 'page_title': page_title, + 'url': url, + 'form': form, + 'topic': topic, }