added showing blogs by tag

This commit is contained in:
2023-02-09 21:53:51 +01:00
parent fcd83c48d7
commit f1287c3fad
9 changed files with 85 additions and 20 deletions

Binary file not shown.

View File

@@ -3,6 +3,7 @@ def includeme(config):
config.add_route('home', '/') config.add_route('home', '/')
config.add_route('apropos', '/apropos') config.add_route('apropos', '/apropos')
config.add_route('blog', '/blog/{id:\d+}/{slug}') config.add_route('blog', '/blog/{id:\d+}/{slug}')
config.add_route('blog_bytag', '/blog_bytag/{tag}/{retour}')
config.add_route('blog_edit', '/blog_edit/{id}') config.add_route('blog_edit', '/blog_edit/{id}')
config.add_route('blog_search', '/blog_search') config.add_route('blog_search', '/blog_search')
config.add_route('login', '/login') config.add_route('login', '/login')

View File

@@ -12,18 +12,26 @@ class BlogRecordService(object):
def by_criteria(cls, request, criteria): def by_criteria(cls, request, criteria):
search = "%{}%".format(criteria) search = "%{}%".format(criteria)
query = request.dbsession.query(BlogRecord) query = request.dbsession.query(BlogRecord)
query = query.filter(or_(BlogRecord.title.like(search), BlogRecord.body.like(search)))
if request.authenticated_userid == None: if request.authenticated_userid == None:
# if user is anonym, display only published posts # if user is anonym, display only published posts
query = query.filter(BlogRecord.status == 'publié') query = query.filter(BlogRecord.status == 'publié')
query = query.filter(or_(BlogRecord.title.like(search), return query.all()
BlogRecord.body.like(search))).all()
return query
@classmethod @classmethod
def by_id(cls, request, _id): def by_id(cls, request, _id):
query = request.dbsession.query(BlogRecord) query = request.dbsession.query(BlogRecord)
return query.get(_id) return query.get(_id)
@classmethod
def by_tag(cls, request, tag):
query = request.dbsession.query(BlogRecord)
query = query.filter(BlogRecord.tag == tag)
if request.authenticated_userid == None:
# if user is anonym, display only published posts
query = query.filter(BlogRecord.status == 'publié')
return query.order_by(sa.desc(BlogRecord.created)).all()
@classmethod @classmethod
def get_last_created(cls, request): def get_last_created(cls, request):
# gest the 10 last created posts # gest the 10 last created posts
@@ -31,7 +39,7 @@ class BlogRecordService(object):
if request.authenticated_userid == None: if request.authenticated_userid == None:
# if user is anonym, display only published posts # if user is anonym, display only published posts
query = query.filter(BlogRecord.status == 'publié') query = query.filter(BlogRecord.status == 'publié')
query = query.order_by(sa.desc(BlogRecord.created)).limit(10).all() query = query.order_by(sa.desc(BlogRecord.created)).limit(15).all()
return query return query
@classmethod @classmethod

View File

@@ -37,7 +37,6 @@ h3, h4 {
} }
@media (min-width: 1200px) { @media (min-width: 1200px) {
.container{ .container{
padding: 70px 0 0 0;
max-width: 950px; max-width: 950px;
} }
} }
@@ -115,6 +114,12 @@ h3, h4 {
.navbar-default .navbar-toggle { .navbar-default .navbar-toggle {
border-color: transparent; border-color: transparent;
} }
.navbar-brand {
/* centrer le logo */
transform: translateX(-50%);
left: 50%;
position: absolute;
}
footer { footer {
background-color: #bc2131; background-color: #bc2131;
color: #f5f5f5; color: #f5f5f5;

View File

@@ -0,0 +1,26 @@
{% extends "layout.jinja2" %}
{% block content %}
<p><a href="{{ url_retour }}">[ retour ]</a></p>
<table class="table table-condensed">
{% for entry in items %}
<tr>
<td>{{ entry.created.strftime("%d %b %y") }}</td>
<td>
<a href="{{ request.route_url('blog', id=entry.id, slug=entry.slug) }}">{{ entry.title }}</a>
</td>
{% if entry.status != 'publié' %}
<td><span class="label label-danger">{{ entry.status }}</span></td>
{% else %}
<td>&nbsp;</td>
{% endif%}
</tr>
{% else %}
<p class="text-danger">Aucun post trouvé !</p>
{% endfor %}
</table>
<p class="text-center">[ {{nb_items}} billets ]</p>
{% endblock %}

View File

@@ -46,6 +46,12 @@
{% endif %} {% endif %}
</div> </div>
<br /> <br />
<br /> <h2 class="text-center">Index</h2>
<p class="text-center">
|&nbsp;
{% for tag in tags %}
<a href="{{ request.route_url('blog_bytag', tag=tag.tag, retour='blog_search') }}">{{ tag.tag }}</a>&nbsp;|
{% endfor %}
</p>
{% endblock %} {% endblock %}

View File

@@ -10,11 +10,13 @@
<table id="posts_list" class="table table-condensed"> <table id="posts_list" class="table table-condensed">
{% for entry in last_ten %} {% for entry in last_ten %}
<tr> <tr>
<td>{{ entry.created.strftime("%d.%m.%Y") }}</td> <td>{{ entry.created.strftime("%d %b %y") }}</td>
<td> <td>
<a href="{{ request.route_url('blog', id=entry.id, slug=entry.slug) }}">{{ entry.title }}</a> <a href="{{ request.route_url('blog', id=entry.id, slug=entry.slug) }}">{{ entry.title }}</a>
</td> </td>
<td>{{ entry.tag }}</td> <td>
[ <a href="{{ request.route_url('blog_bytag', tag=entry.tag, retour='home') }}">{{ entry.tag }}</a> ]
</td>
{% if entry.status != 'publié' %} {% if entry.status != 'publié' %}
<td><span class="label label-danger">{{ entry.status }}</span></td> <td><span class="label label-danger">{{ entry.status }}</span></td>
{% else %} {% else %}
@@ -25,5 +27,5 @@
<p class="text-danger">Aucun post trouvé</p> <p class="text-danger">Aucun post trouvé</p>
{% endfor %} {% endfor %}
</table> </table>
{% endblock %} {% endblock %}

View File

@@ -29,7 +29,7 @@
<span class="icon-bar"></span> <span class="icon-bar"></span>
<span class="icon-bar"></span> <span class="icon-bar"></span>
</button> </button>
<a class="navbar-brand" href="{{ request.route_url('home') }}">CAO Blogr</a> <a class="navbar-brand" href="{{ request.route_url('home') }}">CAOTEK</a>
</div> </div>
<div class="collapse navbar-collapse" id="myNavbar"> <div class="collapse navbar-collapse" id="myNavbar">
<ul class="nav navbar-nav navbar-right"> <ul class="nav navbar-nav navbar-right">
@@ -59,14 +59,10 @@
</div> </div>
</nav> </nav>
{% if request.path == '/' %}
{# -- display carousel -- #}
{% block carousel %}
{% endblock carousel %}
{% endif %}
<!-- Container (The Page Template Section) --> <!-- Container (The Page Template Section) -->
<div class="container"> <div class="container">
<br>
<br>
<!-- Display Page Title --> <!-- Display Page Title -->
{% if page_title %} {% if page_title %}
<h1>{{ page_title }}</h1> <h1>{{ page_title }}</h1>

View File

@@ -92,12 +92,32 @@ def blog_edit(request):
'blog_id': blog_id, 'blog_id': blog_id,
'entry': entry, } 'entry': entry, }
@view_config(route_name='blog_bytag', renderer='cao_blogr:templates/blog_bytag.jinja2')
def blog_bytag(request):
# get tag parameters from request
tag = request.matchdict['tag']
retour = request.matchdict['retour']
url_retour = request.route_url(retour)
@view_config(route_name='blog_search', # get the posts by tag
renderer='cao_blogr:templates/blog_search.jinja2') items = BlogRecordService.by_tag(request, tag)
nb_items = len(items)
return {
'page_title': "Billets avec tag : " + tag,
'items': items,
'nb_items': nb_items,
'url_retour': url_retour,
}
@view_config(route_name='blog_search', renderer='cao_blogr:templates/blog_search.jinja2')
def blog_search(request): def blog_search(request):
criteria = '' criteria = ''
# get the list of tags
tags = BlogRecordService.get_tags(request)
form = BlogSearchForm(request.POST) form = BlogSearchForm(request.POST)
items = [] items = []
if 'form.submitted' in request.params and form.validate(): if 'form.submitted' in request.params and form.validate():
@@ -110,12 +130,13 @@ def blog_search(request):
'form': form, 'form': form,
'items': items, 'items': items,
'criteria': criteria, 'criteria': criteria,
'tags': tags,
} }
@view_config(route_name='tags', renderer='cao_blogr:templates/tags.jinja2', permission='view') @view_config(route_name='tags', renderer='cao_blogr:templates/tags.jinja2', permission='view')
def tags(request): def tags(request):
# get the list of tags of this topic # get the list of tags
tags = BlogRecordService.get_tags(request) tags = BlogRecordService.get_tags(request)
return { return {