diff --git a/cao_blogr.sqlite b/cao_blogr.sqlite index 523635b..753f26b 100644 Binary files a/cao_blogr.sqlite and b/cao_blogr.sqlite differ diff --git a/cao_blogr/alembic/versions/20220501_07fa8fad6cc3.py b/cao_blogr/alembic/versions/20220501_07fa8fad6cc3.py deleted file mode 100644 index 672af29..0000000 --- a/cao_blogr/alembic/versions/20220501_07fa8fad6cc3.py +++ /dev/null @@ -1,62 +0,0 @@ -"""init - -Revision ID: 07fa8fad6cc3 -Revises: -Create Date: 2022-05-01 10:48:25.244455 - -""" -from alembic import op -import sqlalchemy as sa - - -# revision identifiers, used by Alembic. -revision = '07fa8fad6cc3' -down_revision = None -branch_labels = None -depends_on = None - -def upgrade(): - # ### commands auto generated by Alembic - please adjust! ### - op.create_table('tags', - sa.Column('id', sa.Integer(), nullable=False), - sa.Column('topic', sa.Unicode(length=25), nullable=True), - sa.Column('tag', sa.Unicode(length=25), nullable=True), - sa.Column('tag_name', sa.Unicode(length=25), nullable=False), - sa.PrimaryKeyConstraint('id', name=op.f('pk_tags')) - ) - op.create_index('topic_index', 'tags', ['topic', 'tag'], unique=False) - op.create_table('topics', - sa.Column('topic', sa.Unicode(length=25), nullable=False), - sa.Column('topic_name', sa.Unicode(length=25), nullable=False), - sa.PrimaryKeyConstraint('topic', name=op.f('pk_topics')) - ) - op.create_table('users', - sa.Column('id', sa.Integer(), nullable=False), - sa.Column('name', sa.Unicode(length=255), nullable=False), - sa.Column('password', sa.Unicode(length=255), nullable=False), - sa.Column('last_logged', sa.DateTime(), nullable=True), - sa.PrimaryKeyConstraint('id', name=op.f('pk_users')), - sa.UniqueConstraint('name', name=op.f('uq_users_name')) - ) - op.create_table('entries', - sa.Column('id', sa.Integer(), nullable=False), - sa.Column('title', sa.Unicode(length=255), nullable=False), - sa.Column('body', sa.UnicodeText(), nullable=True), - sa.Column('body_html', sa.UnicodeText(), nullable=True), - sa.Column('created', sa.DateTime(), nullable=True), - sa.Column('edited', sa.DateTime(), nullable=True), - sa.Column('topic_id', sa.Unicode(length=25), nullable=False), - sa.ForeignKeyConstraint(['topic_id'], ['topics.topic'], name=op.f('fk_entries_topic_id_topics')), - sa.PrimaryKeyConstraint('id', name=op.f('pk_entries')), - sa.UniqueConstraint('title', name=op.f('uq_entries_title')) - ) - # ### end Alembic commands ### - -def downgrade(): - # ### commands auto generated by Alembic - please adjust! ### - op.drop_table('entries') - op.drop_table('users') - op.drop_table('topics') - op.drop_index('topic_index', table_name='tags') - op.drop_table('tags') - # ### end Alembic commands ### diff --git a/cao_blogr/alembic/versions/20220501_1a99bede8b76.py b/cao_blogr/alembic/versions/20220501_1a99bede8b76.py deleted file mode 100644 index defe395..0000000 --- a/cao_blogr/alembic/versions/20220501_1a99bede8b76.py +++ /dev/null @@ -1,26 +0,0 @@ -"""init - -Revision ID: 1a99bede8b76 -Revises: 1c62fb741d2f -Create Date: 2022-05-01 16:50:53.674187 - -""" -from alembic import op -import sqlalchemy as sa - - -# revision identifiers, used by Alembic. -revision = '1a99bede8b76' -down_revision = '1c62fb741d2f' -branch_labels = None -depends_on = None - -def upgrade(): - # ### commands auto generated by Alembic - please adjust! ### - op.add_column('entries', sa.Column('title_url', sa.Unicode(length=255), nullable=True)) - # ### end Alembic commands ### - -def downgrade(): - # ### commands auto generated by Alembic - please adjust! ### - op.drop_column('entries', 'title_url') - # ### end Alembic commands ### diff --git a/cao_blogr/alembic/versions/20220505_5ad5927ad64d.py b/cao_blogr/alembic/versions/20220505_5ad5927ad64d.py deleted file mode 100644 index 35393b4..0000000 --- a/cao_blogr/alembic/versions/20220505_5ad5927ad64d.py +++ /dev/null @@ -1,30 +0,0 @@ -"""init - -Revision ID: 5ad5927ad64d -Revises: 1a99bede8b76 -Create Date: 2022-05-05 15:49:10.984878 - -""" -from alembic import op -import sqlalchemy as sa - - -# revision identifiers, used by Alembic. -revision = '5ad5927ad64d' -down_revision = '1a99bede8b76' -branch_labels = None -depends_on = None - -def upgrade(): - # ### commands auto generated by Alembic - please adjust! ### - op.add_column('entries', sa.Column('author', sa.UnicodeText(), nullable=True)) - op.drop_column('entries', 'title_url') - op.drop_column('entries', 'body_html') - # ### end Alembic commands ### - -def downgrade(): - # ### commands auto generated by Alembic - please adjust! ### - op.add_column('entries', sa.Column('body_html', sa.TEXT(), nullable=True)) - op.add_column('entries', sa.Column('title_url', sa.VARCHAR(length=255), nullable=True)) - op.drop_column('entries', 'author') - # ### end Alembic commands ### diff --git a/cao_blogr/alembic/versions/20220501_1c62fb741d2f.py b/cao_blogr/alembic/versions/20220510_a35fa375a82f.py similarity index 58% rename from cao_blogr/alembic/versions/20220501_1c62fb741d2f.py rename to cao_blogr/alembic/versions/20220510_a35fa375a82f.py index 914aa5a..76edf9e 100644 --- a/cao_blogr/alembic/versions/20220501_1c62fb741d2f.py +++ b/cao_blogr/alembic/versions/20220510_a35fa375a82f.py @@ -1,8 +1,8 @@ """init -Revision ID: 1c62fb741d2f -Revises: 07fa8fad6cc3 -Create Date: 2022-05-01 11:16:29.476581 +Revision ID: a35fa375a82f +Revises: +Create Date: 2022-05-10 08:28:42.146580 """ from alembic import op @@ -10,17 +10,17 @@ import sqlalchemy as sa # revision identifiers, used by Alembic. -revision = '1c62fb741d2f' -down_revision = '07fa8fad6cc3' +revision = 'a35fa375a82f' +down_revision = None branch_labels = None depends_on = None def upgrade(): # ### commands auto generated by Alembic - please adjust! ### - op.add_column('entries', sa.Column('tag', sa.Unicode(length=25), nullable=True)) + op.add_column('topics', sa.Column('topic_quote', sa.Unicode(length=255), nullable=True)) # ### end Alembic commands ### def downgrade(): # ### commands auto generated by Alembic - please adjust! ### - op.drop_column('entries', 'tag') + op.drop_column('topics', 'topic_quote') # ### end Alembic commands ### diff --git a/cao_blogr/forms.py b/cao_blogr/forms.py index 6ff35cf..51926ef 100644 --- a/cao_blogr/forms.py +++ b/cao_blogr/forms.py @@ -32,3 +32,13 @@ class ContactForm(Form): filters=[strip_filter]) comments = TextAreaField('Message', validators=[InputRequired(), Length(min=1)], filters=[strip_filter]) + +class TopicForm(Form): + topic = StringField('Rubrique', validators=[InputRequired(), Length(min=1, max=25)], + filters=[strip_filter]) + topic_name = StringField('Intitulé', validators=[InputRequired(), Length(min=1, max=25)], + filters=[strip_filter]) + topic_quote = TextAreaField('Citation', validators=[InputRequired(), Length(min=1)], + filters=[strip_filter]) + + diff --git a/cao_blogr/models/blog_record.py b/cao_blogr/models/blog_record.py index b3450da..b9ba8b2 100644 --- a/cao_blogr/models/blog_record.py +++ b/cao_blogr/models/blog_record.py @@ -20,13 +20,12 @@ class BlogRecord(Base): id = Column(Integer, primary_key=True) title = Column(Unicode(255), unique=True, nullable=False) body = Column(UnicodeText, default='') - author = Column(Unicode(30), default='') created = Column(DateTime, default=datetime.datetime.now) edited = Column(DateTime, default=datetime.datetime.now) - topic_id = Column(ForeignKey('topics.topic'), nullable=False) topic = relationship('Topics', backref='topic_pages') tag = Column(Unicode(25)) + author = Column(Unicode(50), default='') @property def slug(self): @@ -41,6 +40,7 @@ class Topics(Base): __tablename__ = 'topics' topic = Column(Unicode(25), primary_key=True) topic_name = Column(Unicode(25), nullable=False) + topic_quote = Column(Unicode(255), default='') class Tags(Base): __tablename__ = 'tags' diff --git a/cao_blogr/routes.py b/cao_blogr/routes.py index 9d1fe48..67e63a0 100644 --- a/cao_blogr/routes.py +++ b/cao_blogr/routes.py @@ -9,6 +9,8 @@ def includeme(config): config.add_route('logout', '/logout') config.add_route('settings', '/settings') config.add_route('topic', '/topic/{topic}') + config.add_route('topic_edit', '/topic_edit/{topic}') + config.add_route('topics', '/topics') config.add_route('users', '/users') config.add_route('user_add', '/user_add/{name}') config.add_route('user_pwd', '/user_pwd/{name}') diff --git a/cao_blogr/services/blog_record.py b/cao_blogr/services/blog_record.py index 771e44a..7aa54e7 100644 --- a/cao_blogr/services/blog_record.py +++ b/cao_blogr/services/blog_record.py @@ -43,10 +43,16 @@ class BlogRecordService(object): return query @classmethod - def get_topic_name(cls, request, id): - # gest the name of a given topic + def get_topic_byTopic(cls, request, id): + # get the name of a given topic query = request.dbsession.query(Topics).filter(Topics.topic == id).first() - return query.topic_name.upper() + return query + + @classmethod + def get_topics(cls, request): + # get all topics + query = request.dbsession.query(Topics).order_by(Topics.topic).all() + return query @classmethod def delete(cls, request, id): diff --git a/cao_blogr/templates/layout.jinja2 b/cao_blogr/templates/layout.jinja2 index 1fab712..e19a201 100644 --- a/cao_blogr/templates/layout.jinja2 +++ b/cao_blogr/templates/layout.jinja2 @@ -54,16 +54,16 @@
- Enseignement  + ENSEIGNEMENT  - Pratique  + PRATIQUE  - Qi Gong  + Qi GONG  - Sciences  + SCIENCES 
diff --git a/cao_blogr/templates/settings.jinja2 b/cao_blogr/templates/settings.jinja2 index e30aa22..7e340c1 100644 --- a/cao_blogr/templates/settings.jinja2 +++ b/cao_blogr/templates/settings.jinja2 @@ -11,7 +11,7 @@
{% endif %}
- +

TOPICS / TAGS

diff --git a/cao_blogr/templates/topic.jinja2 b/cao_blogr/templates/topic.jinja2 index 75fa467..d39a173 100644 --- a/cao_blogr/templates/topic.jinja2 +++ b/cao_blogr/templates/topic.jinja2 @@ -2,12 +2,16 @@ {% block content %} + {{ topic_quote | safe }} +
+ {% if request.authenticated_userid %}

Nouveau

{% endif%} + {{ liste | safe }} {% endblock %} diff --git a/cao_blogr/templates/topic_edit.jinja2 b/cao_blogr/templates/topic_edit.jinja2 new file mode 100644 index 0000000..42ce499 --- /dev/null +++ b/cao_blogr/templates/topic_edit.jinja2 @@ -0,0 +1,43 @@ +{% extends "cao_blogr:templates/layout.jinja2" %} + +{% block content %} + +
+ + {% for error in form.topic.errors %} +
{{ error }}
+ {% endfor %} + +
+ + {{form.topic(class_='form-control')}} +
+ + {% for error in form.topic_name.errors %} +
{{error}}
+ {% endfor %} + +
+ + {{form.topic_name(class_='form-control')}} +
+ + {% for error in form.topic_quote.errors %} +
{{ error }}
+ {% endfor %} +
+ + {{ form.topic_quote(class_='form-control', cols="35", rows="5") }} +
+ +
+ + Retour + +
+ + +
+ +{% endblock %} diff --git a/cao_blogr/templates/topics.jinja2 b/cao_blogr/templates/topics.jinja2 new file mode 100644 index 0000000..528581f --- /dev/null +++ b/cao_blogr/templates/topics.jinja2 @@ -0,0 +1,30 @@ +{% extends "layout.jinja2" %} + +{% block content %} +

+ + Retour + + Nouvel utilisateur +

+ + + + + + + + + {% for entry in topics %} + + + + + {% endfor %} +
RubriqueNom
{{ entry.topic }} + + {{ entry.topic_name }} + +
+ + {% endblock %} diff --git a/cao_blogr/views/blog.py b/cao_blogr/views/blog.py index cf3f445..1eb2d14 100644 --- a/cao_blogr/views/blog.py +++ b/cao_blogr/views/blog.py @@ -32,8 +32,7 @@ def blog(request): @view_config(route_name='blog_edit', - renderer='cao_blogr:templates/blog_edit.jinja2', - permission='view') + renderer='cao_blogr:templates/blog_edit.jinja2', permission='view') def blog_edit(request): # get post parameters from request topic = request.matchdict['topic'] @@ -49,6 +48,7 @@ def blog_edit(request): entry.topic_id = topic form = BlogCreateForm(request.POST, entry) form.tag.choices = [(row.tag, row.tag_name) for row in tags] + page_title = 'Nouvelle page' else: # modify post @@ -58,6 +58,7 @@ def blog_edit(request): return HTTPFound(location=request.route_url('home')) form = BlogUpdateForm(request.POST, entry) form.tag.choices = [(row.tag, row.tag_name) for row in tags] + page_title = 'Modifier : ' + entry.title if 'form.submitted' in request.params and form.validate(): if blog_id == '0': @@ -79,7 +80,7 @@ def blog_edit(request): return HTTPFound(location=request.route_url('topic', topic=topic)) return { - 'page_title': entry.title, + 'page_title': page_title, 'url': url, 'form': form, 'blog_id': blog_id, @@ -112,8 +113,12 @@ def blog_search(request): def topic(request): topic = request.matchdict['topic'] - # get the topic_name - topic_name = BlogRecordService.get_topic_name(request, topic) + # get the topic record + topic_record = BlogRecordService.get_topic_byTopic(request, topic) + # convertir mardown en HTML + markdowner = Markdown() + topic_quote = markdowner.convert(topic_record.topic_quote) + # get all the tags of this topic tags = BlogRecordService.get_tags_byTopic(request, topic) @@ -133,7 +138,8 @@ def topic(request): else: liste += '' return { - 'page_title': topic_name, + 'page_title': topic_record.topic_name, 'topic': topic, + 'topic_quote': topic_quote, 'liste': liste, } diff --git a/cao_blogr/views/default.py b/cao_blogr/views/default.py index c5ef42d..2b0d800 100644 --- a/cao_blogr/views/default.py +++ b/cao_blogr/views/default.py @@ -9,8 +9,9 @@ from pyramid_mailer.message import Message from ..services.user import UserService from ..services.blog_record import BlogRecordService -from ..forms import UserCreateForm, ContactForm +from ..forms import UserCreateForm, TopicForm from ..models.user import User +from ..models.blog_record import Topics @view_config(route_name='home', @@ -155,7 +156,7 @@ def user_add(request): return HTTPFound(location=request.route_url('users')) return { - 'page_title': 'Nouvel utilsateur', + 'page_title': 'Nouvel utilisateur', 'form': form, 'name': name, } @@ -188,3 +189,55 @@ def user_pwd(request): 'page_title': "Utilisateur : %s" %(entry.name), 'entry': entry, } + +@view_config(route_name='topics', + renderer='cao_blogr:templates/topics.jinja2', permission='manage') +def topics(request): + # get all topics + topics = BlogRecordService.get_topics(request) + return { + 'page_title': "Liste des topics", + 'topics': topics + } + +@view_config(route_name='topic_edit', + renderer='cao_blogr:templates/topic_edit.jinja2', permission='manage') +def topic_edit(request): + # get topic parameters from request + topic = request.matchdict['topic'] + url = request.route_url('topic_edit',topic=topic) + + # get the list of tags of this topic + tags = BlogRecordService.get_tags_byTopic(request, topic) + + if topic == '0': + # create a new topic + entry = Topics() + form = TopicForm(request.POST, entry) + page_title = "Nouvelle rubrique" + + else: + # modify post + entry = BlogRecordService.get_topic_byTopic(request, topic) + if not entry: + request.session.flash(u"Topic non trouvé : %s" % topic, 'warning') + return HTTPFound(location=request.route_url('topics')) + form = TopicForm(request.POST, entry) + page_title = entry.topic_name + + if 'form.submitted' in request.params and form.validate(): + if topic == '0': + form.populate_obj(entry) + request.dbsession.add(entry) + + return HTTPFound(location=request.route_url('topic', topic=topic)) + else: + del form.topic # SECURITY: prevent overwriting of primary key + form.populate_obj(entry) + return HTTPFound(location=request.route_url('topics')) + + return { + 'page_title': page_title, + 'url': url, + 'form': form, + }