From 2efd1e357fdfb01dd4c3fa6d564c4dd2745497d4 Mon Sep 17 00:00:00 2001 From: Daniel Tsvetkov Date: Sat, 1 May 2021 16:19:02 +0200 Subject: [PATCH] tags implemented --- data_static/Tag.csv | 20 +++ data_static/_process_order | 3 + data_static/blog_post__tag.csv | 156 ++++++++++++++++++ .../media/20120322_matura/maturatest.png | Bin 0 -> 57418 bytes .../media/20120322_matura/timeline.png | Bin 0 -> 30310 bytes migrations/versions/28f9ab4fc8b0_002.py | 41 ----- ...08a068031c3_001.py => d091fbf48f6f_001.py} | 39 ++++- webapp/models/__init__.py | 1 + webapp/models/_blog_post.py | 10 ++ webapp/models/_tag.py | 8 + webapp/models/tag.py | 1 + webapp/routes/__init__.py | 1 + webapp/routes/tag.py | 68 ++++++++ webapp/routes/tag_hooks.py | 71 ++++++++ webapp/templates/blog_post/_create.html | 18 ++ webapp/templates/blog_post/_get.html | 3 + webapp/templates/blog_post/_list_item.html | 9 + webapp/templates/blog_post/_table.html | 8 + webapp/templates/blog_post/_update.html | 13 ++ webapp/templates/blog_post/get_single.html | 6 +- webapp/templates/navigation.html | 7 +- webapp/templates/tag/_action_delete.html | 1 + webapp/templates/tag/_action_edit.html | 1 + webapp/templates/tag/_actions.html | 4 + webapp/templates/tag/_create.html | 15 ++ webapp/templates/tag/_get.html | 4 + webapp/templates/tag/_list.html | 3 + webapp/templates/tag/_list_item.html | 7 + webapp/templates/tag/_search.html | 11 ++ webapp/templates/tag/_table.html | 25 +++ webapp/templates/tag/_title.html | 2 + webapp/templates/tag/_update.html | 16 ++ webapp/templates/tag/create.html | 6 + webapp/templates/tag/get.html | 12 ++ webapp/templates/tag/list.html | 10 ++ webapp/templates/tag/search.html | 8 + webapp/templates/tag/table.html | 8 + webapp/templates/tag/update.html | 6 + webapp/view_models/BlogPost.yaml | 3 + webapp/view_models/Tag.yaml | 20 +++ 40 files changed, 599 insertions(+), 46 deletions(-) create mode 100644 data_static/Tag.csv create mode 100644 data_static/blog_post__tag.csv create mode 100644 data_static/media/20120322_matura/maturatest.png create mode 100644 data_static/media/20120322_matura/timeline.png delete mode 100644 migrations/versions/28f9ab4fc8b0_002.py rename migrations/versions/{d08a068031c3_001.py => d091fbf48f6f_001.py} (60%) create mode 100644 webapp/models/_tag.py create mode 100644 webapp/models/tag.py create mode 100644 webapp/routes/tag.py create mode 100644 webapp/routes/tag_hooks.py create mode 100644 webapp/templates/tag/_action_delete.html create mode 100644 webapp/templates/tag/_action_edit.html create mode 100644 webapp/templates/tag/_actions.html create mode 100644 webapp/templates/tag/_create.html create mode 100644 webapp/templates/tag/_get.html create mode 100644 webapp/templates/tag/_list.html create mode 100644 webapp/templates/tag/_list_item.html create mode 100644 webapp/templates/tag/_search.html create mode 100644 webapp/templates/tag/_table.html create mode 100644 webapp/templates/tag/_title.html create mode 100644 webapp/templates/tag/_update.html create mode 100644 webapp/templates/tag/create.html create mode 100644 webapp/templates/tag/get.html create mode 100644 webapp/templates/tag/list.html create mode 100644 webapp/templates/tag/search.html create mode 100644 webapp/templates/tag/table.html create mode 100644 webapp/templates/tag/update.html create mode 100644 webapp/view_models/Tag.yaml diff --git a/data_static/Tag.csv b/data_static/Tag.csv new file mode 100644 index 0000000..e596e2c --- /dev/null +++ b/data_static/Tag.csv @@ -0,0 +1,20 @@ +name +English +"Български" +"политика" +politics +technology +"технологии" +hacks +"мнения" +opinions +projects +"проекти" +"есета" +essays +"лични" +personal +university +learning +life +"живот" diff --git a/data_static/_process_order b/data_static/_process_order index 942a1ea..cdf738e 100644 --- a/data_static/_process_order +++ b/data_static/_process_order @@ -1,2 +1,5 @@ +Tag +BlogPost +blog_post__tag Role User \ No newline at end of file diff --git a/data_static/blog_post__tag.csv b/data_static/blog_post__tag.csv new file mode 100644 index 0000000..0ab320e --- /dev/null +++ b/data_static/blog_post__tag.csv @@ -0,0 +1,156 @@ +blog_post_id,tag_id +1,2 +1,3 +51,2 +51,3 +50,1 +51,6 +51,8 +1,8 +2,1 +2,9 +30,1 +30,5 +30,9 +34,2 +34,12 +43,2 +43,3 +43,8 +53,2 +53,3 +44,2 +44,3 +44,12 +47,2 +47,3 +47,8 +48,1 +48,13 +45,2 +45,11 +31,1 +31,15 +4,1 +4,16 +6,1 +6,16 +9,1 +9,16 +10,1 +10,16 +11,1 +11,16 +12,1 +12,16 +15,1 +15,16 +16,1 +16,16 +17,1 +17,16 +18,1 +18,16 +19,1 +19,16 +20,1 +20,16 +23,1 +23,16 +24,1 +24,16 +25,1 +25,16 +26,1 +26,16 +27,1 +27,16 +29,1 +29,16 +32,1 +32,16 +37,1 +37,16 +39,1 +39,16 +40,1 +40,16 +41,1 +41,16 +42,1 +42,7 +50,4 +49,1 +49,17 +21,1 +21,5 +21,7 +28,2 +28,3 +3,1 +3,5 +3,13 +5,1 +5,5 +5,13 +7,1 +7,13 +7,18 +8,1 +8,5 +8,7 +13,1 +13,16 +14,1 +14,5 +14,7 +22,1 +22,13 +22,18 +33,2 +33,8 +38,1 +38,9 +35,1 +35,5 +35,10 +35,17 +36,1 +36,13 +36,15 +36,18 +46,2 +46,6 +46,8 +52,2 +54,2 +54,8 +55,2 +56,2 +57,2 +57,12 +57,14 +57,19 +58,2 +58,14 +59,2 +59,8 +59,19 +60,2 +60,3 +60,8 +61,2 +61,6 +61,8 +62,2 +62,6 +62,8 +63,2 +63,14 +64,2 +64,14 +64,19 +65,2 +65,12 +66,2 +66,8 diff --git a/data_static/media/20120322_matura/maturatest.png b/data_static/media/20120322_matura/maturatest.png new file mode 100644 index 0000000000000000000000000000000000000000..4de85802cafac83b3f719808b986a1e36f7f778c GIT binary patch literal 57418 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 z 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 literal 0 HcmV?d00001 diff --git a/migrations/versions/28f9ab4fc8b0_002.py b/migrations/versions/28f9ab4fc8b0_002.py deleted file mode 100644 index 1e5952b..0000000 --- a/migrations/versions/28f9ab4fc8b0_002.py +++ /dev/null @@ -1,41 +0,0 @@ -"""002 - -Revision ID: 28f9ab4fc8b0 -Revises: d08a068031c3 -Create Date: 2020-07-08 14:27:11.649888 - -""" -from alembic import op -import sqlalchemy as sa - - -# revision identifiers, used by Alembic. -revision = '28f9ab4fc8b0' -down_revision = 'd08a068031c3' -branch_labels = None -depends_on = None - - -def upgrade(): - # ### commands auto generated by Alembic - please adjust! ### - op.create_table('blog_post', - sa.Column('created_dt', sa.UnicodeText(), nullable=True), - sa.Column('updated_dt', sa.UnicodeText(), nullable=True), - sa.Column('id', sa.Integer(), nullable=False), - sa.Column('uuid', sa.Unicode(), nullable=True), - sa.Column('filename', sa.UnicodeText(), nullable=True), - sa.Column('title', sa.UnicodeText(), nullable=True), - sa.Column('body', sa.UnicodeText(), nullable=True), - sa.Column('user_id', sa.Integer(), nullable=True), - sa.ForeignKeyConstraint(['user_id'], ['user.id'], ), - sa.PrimaryKeyConstraint('id') - ) - op.create_index(op.f('ix_blog_post_uuid'), 'blog_post', ['uuid'], unique=False) - # ### end Alembic commands ### - - -def downgrade(): - # ### commands auto generated by Alembic - please adjust! ### - op.drop_index(op.f('ix_blog_post_uuid'), table_name='blog_post') - op.drop_table('blog_post') - # ### end Alembic commands ### diff --git a/migrations/versions/d08a068031c3_001.py b/migrations/versions/d091fbf48f6f_001.py similarity index 60% rename from migrations/versions/d08a068031c3_001.py rename to migrations/versions/d091fbf48f6f_001.py index fb9df37..985ea69 100644 --- a/migrations/versions/d08a068031c3_001.py +++ b/migrations/versions/d091fbf48f6f_001.py @@ -1,8 +1,8 @@ """001 -Revision ID: d08a068031c3 +Revision ID: d091fbf48f6f Revises: -Create Date: 2020-07-08 11:48:15.369556 +Create Date: 2021-05-01 11:54:58.288320 """ from alembic import op @@ -10,7 +10,7 @@ import sqlalchemy as sa # revision identifiers, used by Alembic. -revision = 'd08a068031c3' +revision = 'd091fbf48f6f' down_revision = None branch_labels = None depends_on = None @@ -53,18 +53,51 @@ def upgrade(): sa.UniqueConstraint('email') ) op.create_index(op.f('ix_user_uuid'), 'user', ['uuid'], unique=False) + op.create_table('blog_post', + sa.Column('id', sa.Integer(), nullable=False), + sa.Column('uuid', sa.Unicode(), nullable=True), + sa.Column('filename', sa.UnicodeText(), nullable=True), + sa.Column('title', sa.UnicodeText(), nullable=True), + sa.Column('body', sa.UnicodeText(), nullable=True), + sa.Column('created_dt', sa.UnicodeText(), nullable=True), + sa.Column('updated_dt', sa.UnicodeText(), nullable=True), + sa.Column('user_id', sa.Integer(), nullable=True), + sa.ForeignKeyConstraint(['user_id'], ['user.id'], ), + sa.PrimaryKeyConstraint('id') + ) + op.create_index(op.f('ix_blog_post_uuid'), 'blog_post', ['uuid'], unique=False) op.create_table('roles_users', sa.Column('user_id', sa.Integer(), nullable=True), sa.Column('role_id', sa.Integer(), nullable=True), sa.ForeignKeyConstraint(['role_id'], ['role.id'], ), sa.ForeignKeyConstraint(['user_id'], ['user.id'], ) ) + op.create_table('tag', + sa.Column('id', sa.Integer(), nullable=False), + sa.Column('uuid', sa.Unicode(), nullable=True), + sa.Column('name', sa.UnicodeText(), nullable=True), + sa.Column('user_id', sa.Integer(), nullable=True), + sa.ForeignKeyConstraint(['user_id'], ['user.id'], ), + sa.PrimaryKeyConstraint('id') + ) + op.create_index(op.f('ix_tag_uuid'), 'tag', ['uuid'], unique=False) + op.create_table('blog_post__tag', + sa.Column('blog_post_id', sa.Integer(), nullable=True), + sa.Column('tag_id', sa.Integer(), nullable=True), + sa.ForeignKeyConstraint(['blog_post_id'], ['blog_post.id'], ), + sa.ForeignKeyConstraint(['tag_id'], ['tag.id'], ) + ) # ### end Alembic commands ### def downgrade(): # ### commands auto generated by Alembic - please adjust! ### + op.drop_table('blog_post__tag') + op.drop_index(op.f('ix_tag_uuid'), table_name='tag') + op.drop_table('tag') op.drop_table('roles_users') + op.drop_index(op.f('ix_blog_post_uuid'), table_name='blog_post') + op.drop_table('blog_post') op.drop_index(op.f('ix_user_uuid'), table_name='user') op.drop_table('user') op.drop_table('task') diff --git a/webapp/models/__init__.py b/webapp/models/__init__.py index 2f0e777..569feb8 100644 --- a/webapp/models/__init__.py +++ b/webapp/models/__init__.py @@ -1,2 +1,3 @@ from oshipka.persistance import db +from webapp.models.tag import Tag from webapp.models.blog_post import BlogPost diff --git a/webapp/models/_blog_post.py b/webapp/models/_blog_post.py index b008aa7..9e15c7e 100644 --- a/webapp/models/_blog_post.py +++ b/webapp/models/_blog_post.py @@ -1,5 +1,10 @@ from oshipka.persistance import db, ModelController, index_service, LiberalBoolean, Ownable +blog_post__tag = db.Table('blog_post__tag', + db.Column('blog_post_id', db.Integer(), db.ForeignKey('blog_post.id')), + db.Column('tag_id', db.Integer(), db.ForeignKey('tag.id')), + ) + class BlogPost(db.Model, ModelController, Ownable): __searchable__ = ['body', ] @@ -7,6 +12,11 @@ class BlogPost(db.Model, ModelController, Ownable): filename = db.Column(db.UnicodeText,) title = db.Column(db.UnicodeText,) body = db.Column(db.UnicodeText,) + tags = db.relationship('Tag', secondary=blog_post__tag, + backref=db.backref("blog_posts"), + ) + + _m_n_table_tags = 'Tag' created_dt = db.Column(db.UnicodeText,) updated_dt = db.Column(db.UnicodeText,) diff --git a/webapp/models/_tag.py b/webapp/models/_tag.py new file mode 100644 index 0000000..11ba1c5 --- /dev/null +++ b/webapp/models/_tag.py @@ -0,0 +1,8 @@ +from oshipka.persistance import db, ModelController, index_service, LiberalBoolean, Ownable + + +class Tag(db.Model, ModelController, Ownable): + name = db.Column(db.UnicodeText,) + + def __repr__(self): + return "{}".format(self.name) diff --git a/webapp/models/tag.py b/webapp/models/tag.py new file mode 100644 index 0000000..ddd6278 --- /dev/null +++ b/webapp/models/tag.py @@ -0,0 +1 @@ +from webapp.models._tag import Tag \ No newline at end of file diff --git a/webapp/routes/__init__.py b/webapp/routes/__init__.py index 0db7492..191e322 100644 --- a/webapp/routes/__init__.py +++ b/webapp/routes/__init__.py @@ -1 +1,2 @@ +from webapp.routes.tag import * from webapp.routes.blog_post import * diff --git a/webapp/routes/tag.py b/webapp/routes/tag.py new file mode 100644 index 0000000..320ba4b --- /dev/null +++ b/webapp/routes/tag.py @@ -0,0 +1,68 @@ +""" +!!!AUTOGENERATED: DO NOT EDIT!!! + +Edit the hooks in webapp/routes/tag_hooks.py instead +""" + +from oshipka.webapp import app +from oshipka.webapp.views import ModelView +from webapp.models import Tag +from webapp.routes.tag_hooks import * + +tag = ModelView(app, Tag) + +tag.register_verb(view_context=get_view_context, + verb="get", + methods=['GET'], + per_item=True, + is_login_required=False, + the_roles_required=[], + ) + +tag.register_verb(view_context=list_view_context, + verb="list", + methods=['GET'], + per_item=False, + is_login_required=False, + the_roles_required=[], + ) + +tag.register_verb(view_context=table_view_context, + verb="table", + methods=['GET'], + per_item=False, + is_login_required=False, + the_roles_required=[], + ) + +tag.register_verb(view_context=search_view_context, + verb="search", + methods=['GET'], + per_item=False, + is_login_required=False, + the_roles_required=[], + ) + +tag.register_verb(view_context=create_view_context, + verb="create", + methods=['GET', 'POST'], + per_item=False, + is_login_required=True, + the_roles_required=['admin'], + ) + +tag.register_verb(view_context=update_view_context, + verb="update", + methods=['GET', 'POST'], + per_item=True, + is_login_required=True, + the_roles_required=['admin'], + ) + +tag.register_verb(view_context=delete_view_context, + verb="delete", + methods=['GET', 'POST'], + per_item=True, + is_login_required=True, + the_roles_required=['admin'], + ) diff --git a/webapp/routes/tag_hooks.py b/webapp/routes/tag_hooks.py new file mode 100644 index 0000000..164439a --- /dev/null +++ b/webapp/routes/tag_hooks.py @@ -0,0 +1,71 @@ +from oshipka.webapp.views import ViewContext, default_get_args_func, default_get_func, default_list_func, \ + default_get_form_func, default_create_func, default_update_func, default_delete_func, default_search_func + + +def get_template(vc): + vc.template = "{}/get.html".format(vc.model_view.model_name) + + +def list_template(vc): + vc.template = "{}/list.html".format(vc.model_view.model_name) + + +def table_template(vc): + vc.template = "{}/table.html".format(vc.model_view.model_name) + + +def search_template(vc): + vc.template = "{}/search.html".format(vc.model_view.model_name) + + +def create_template(vc): + vc.template = "{}/create.html".format(vc.model_view.model_name) + + +def update_template(vc): + vc.template = "{}/update.html".format(vc.model_view.model_name) + + +def delete_template(vc): + vc.template = "delete_instance.html".format(vc.model_view.model_name) + + +get_view_context = ViewContext( + filter_func=default_get_func, + template_func=get_template, +) + +list_view_context = ViewContext( + filter_func=default_list_func, + template_func=list_template, +) + +table_view_context = ViewContext( + filter_func=default_list_func, + template_func=table_template, +) + +search_view_context = ViewContext( + filter_func=default_search_func, + template_func=list_template, +) + +create_view_context = ViewContext( + args_get_func=default_get_form_func, + template_func=create_template, + execute_func=default_create_func, +) + +update_view_context = ViewContext( + args_get_func=default_get_form_func, + filter_func=default_get_func, + template_func=update_template, + execute_func=default_update_func, +) + +delete_view_context = ViewContext( + args_get_func=default_get_form_func, + filter_func=default_get_func, + template_func=delete_template, + execute_func=default_delete_func, +) diff --git a/webapp/templates/blog_post/_create.html b/webapp/templates/blog_post/_create.html index 840025e..f9df3fc 100644 --- a/webapp/templates/blog_post/_create.html +++ b/webapp/templates/blog_post/_create.html @@ -25,6 +25,24 @@ + + {% endif %} + {% if "tag" not in disabled_columns %} + + : + + + {% endif %} {% if "created_dt" not in disabled_columns %} diff --git a/webapp/templates/blog_post/_get.html b/webapp/templates/blog_post/_get.html index a925ddf..a966370 100644 --- a/webapp/templates/blog_post/_get.html +++ b/webapp/templates/blog_post/_get.html @@ -8,6 +8,9 @@ {% if "body" not in skip_list %}
  • {{ _("body") }}: {{ instance.body }}
  • {% endif %} +{% if "tag" not in skip_list %} +
  • {{ _("tags") }}: {{ instance.tags }}
  • +{% endif %} {% if "created_dt" not in skip_list %}
  • {{ _("created_dt") }}: {{ instance.created_dt }}
  • {% endif %} diff --git a/webapp/templates/blog_post/_list_item.html b/webapp/templates/blog_post/_list_item.html index 5cf2b63..47dff3d 100644 --- a/webapp/templates/blog_post/_list_item.html +++ b/webapp/templates/blog_post/_list_item.html @@ -2,4 +2,13 @@ {% include "blog_post/_title.html" %} {% include "blog_post/_actions.html" %} + {% if instance.tags %} +
      +
    • + {{ _("Tags") }}: {% for tag in instance.tags %} + {{ tag.name }}{% if not loop.last %}, + {% endif %} {% endfor %}
      +
    • +
    + {% endif %} \ No newline at end of file diff --git a/webapp/templates/blog_post/_table.html b/webapp/templates/blog_post/_table.html index 7dd56e2..08bbdb6 100644 --- a/webapp/templates/blog_post/_table.html +++ b/webapp/templates/blog_post/_table.html @@ -10,6 +10,9 @@ {% if "body" not in skip_columns %} {{ _("body") }} {% endif %} + {% if "tag" not in skip_columns %} + {{ _("tag") }} + {% endif %} {% if "created_dt" not in skip_columns %} {{ _("created_dt") }} {% endif %} @@ -37,6 +40,11 @@ {{ instance.body }} {% endif %} + {% if "tag" not in skip_columns %} + + {{ instance.tags }} + + {% endif %} {% if "created_dt" not in skip_columns %} {{ instance.created_dt }} diff --git a/webapp/templates/blog_post/_update.html b/webapp/templates/blog_post/_update.html index 102def7..1d7696a 100644 --- a/webapp/templates/blog_post/_update.html +++ b/webapp/templates/blog_post/_update.html @@ -27,6 +27,19 @@ + + {% endif %} + {% if "tag" not in disabled_columns %} + + : + + + {% endif %} {% if "created_dt" not in disabled_columns %} diff --git a/webapp/templates/blog_post/get_single.html b/webapp/templates/blog_post/get_single.html index 504c928..79e3c95 100644 --- a/webapp/templates/blog_post/get_single.html +++ b/webapp/templates/blog_post/get_single.html @@ -1,3 +1,7 @@

    {{ instance.title }}

    -{{ _("Created on") }} {{ instance.created_dt }} +{% if instance.tags %} + {{ _("Tags") }}: {% for tag in instance.tags %} + {{ tag.name }}{% if not loop.last %},{% endif %} {% endfor %}
    +{% endif %} +{{ _("Created on") }} {{ instance.created_dt|to_dt|format_dt }} {{ instance.body|markdown|rawhtmlparse|safe }} \ No newline at end of file diff --git a/webapp/templates/navigation.html b/webapp/templates/navigation.html index 450b066..5545b69 100644 --- a/webapp/templates/navigation.html +++ b/webapp/templates/navigation.html @@ -1,4 +1,9 @@ {{ _("PiSquared Blog") }} | {{ _("Index") }} | +{{ _("Tags") }} | {{ _("RSS") }} | -{{ _("About Me") }} \ No newline at end of file +{{ _("About Me") }} + +{% if current_user.is_authenticated %} + | {{ _("Admin") }} +{% endif %} \ No newline at end of file diff --git a/webapp/templates/tag/_action_delete.html b/webapp/templates/tag/_action_delete.html new file mode 100644 index 0000000..75a6546 --- /dev/null +++ b/webapp/templates/tag/_action_delete.html @@ -0,0 +1 @@ +x \ No newline at end of file diff --git a/webapp/templates/tag/_action_edit.html b/webapp/templates/tag/_action_edit.html new file mode 100644 index 0000000..6be69bd --- /dev/null +++ b/webapp/templates/tag/_action_edit.html @@ -0,0 +1 @@ +e \ No newline at end of file diff --git a/webapp/templates/tag/_actions.html b/webapp/templates/tag/_actions.html new file mode 100644 index 0000000..da7efd6 --- /dev/null +++ b/webapp/templates/tag/_actions.html @@ -0,0 +1,4 @@ +[ +{% include "tag/_action_edit.html" %} | +{% include "tag/_action_delete.html" %} +] \ No newline at end of file diff --git a/webapp/templates/tag/_create.html b/webapp/templates/tag/_create.html new file mode 100644 index 0000000..6bad297 --- /dev/null +++ b/webapp/templates/tag/_create.html @@ -0,0 +1,15 @@ +
    + + + {% if "name" not in disabled_columns %} + + {% endif %} +
    + : + + +
    + +
    \ No newline at end of file diff --git a/webapp/templates/tag/_get.html b/webapp/templates/tag/_get.html new file mode 100644 index 0000000..026f572 --- /dev/null +++ b/webapp/templates/tag/_get.html @@ -0,0 +1,4 @@ + +{% if "name" not in skip_list %} +
  • {{ _("name") }}: {{ instance.name }}
  • +{% endif %} \ No newline at end of file diff --git a/webapp/templates/tag/_list.html b/webapp/templates/tag/_list.html new file mode 100644 index 0000000..43eb805 --- /dev/null +++ b/webapp/templates/tag/_list.html @@ -0,0 +1,3 @@ +{% for instance in instances %} +{% include "tag/_list_item.html" %} +{% endfor %} \ No newline at end of file diff --git a/webapp/templates/tag/_list_item.html b/webapp/templates/tag/_list_item.html new file mode 100644 index 0000000..83661c6 --- /dev/null +++ b/webapp/templates/tag/_list_item.html @@ -0,0 +1,7 @@ +
  • + + {% include "tag/_title.html" %} ({{ instance.blog_posts|count }}) + {% if current_user.is_authenticated %} + {% include "tag/_actions.html" %} + {% endif %} +
  • \ No newline at end of file diff --git a/webapp/templates/tag/_search.html b/webapp/templates/tag/_search.html new file mode 100644 index 0000000..b20ca58 --- /dev/null +++ b/webapp/templates/tag/_search.html @@ -0,0 +1,11 @@ +{% for instance in instances %} +
  • + + {% include "tag/_title.html" %} + | + [ + e | + x + ] +
  • +{% endfor %} \ No newline at end of file diff --git a/webapp/templates/tag/_table.html b/webapp/templates/tag/_table.html new file mode 100644 index 0000000..0d9f5bb --- /dev/null +++ b/webapp/templates/tag/_table.html @@ -0,0 +1,25 @@ + + + + {% if "name" not in skip_columns %} + + {% endif %} + + + + + {% for instance in instances %} + + {% if "name" not in skip_columns %} + + {% endif %} + + + {% endfor %} + +
    {{ _("name") }}{{ _("Actions") }}
    + {{ instance.name }} + + e | + x +
    \ No newline at end of file diff --git a/webapp/templates/tag/_title.html b/webapp/templates/tag/_title.html new file mode 100644 index 0000000..affb025 --- /dev/null +++ b/webapp/templates/tag/_title.html @@ -0,0 +1,2 @@ + + {{ instance.name }} \ No newline at end of file diff --git a/webapp/templates/tag/_update.html b/webapp/templates/tag/_update.html new file mode 100644 index 0000000..7be058e --- /dev/null +++ b/webapp/templates/tag/_update.html @@ -0,0 +1,16 @@ +
    + + + {% if "name" not in disabled_columns %} + + {% endif %} +
    + : + + +
    + +
    \ No newline at end of file diff --git a/webapp/templates/tag/create.html b/webapp/templates/tag/create.html new file mode 100644 index 0000000..46a11c3 --- /dev/null +++ b/webapp/templates/tag/create.html @@ -0,0 +1,6 @@ +{% extends "layout.html" %} + +{% block content %} +

    {{ _("Create") }} {{_("Tag") }}

    + {% include "tag/_create.html" %} +{% endblock %} \ No newline at end of file diff --git a/webapp/templates/tag/get.html b/webapp/templates/tag/get.html new file mode 100644 index 0000000..bd3732e --- /dev/null +++ b/webapp/templates/tag/get.html @@ -0,0 +1,12 @@ +{% extends "layout.html" %} + +{% block content %} + {{ _("list") }} +

    {% include "tag/_title.html" %}

    +
      + {% for blog_post in instance.blog_posts %} +
    • {{ blog_post.title }} - {{ _("Created on") }} {{ blog_post.created_dt|to_dt|format_dt }}
    • + {% endfor %} +
    + +{% endblock %} \ No newline at end of file diff --git a/webapp/templates/tag/list.html b/webapp/templates/tag/list.html new file mode 100644 index 0000000..d6a04fe --- /dev/null +++ b/webapp/templates/tag/list.html @@ -0,0 +1,10 @@ +{% extends "layout.html" %} + +{% block content %} +

    {{ _("Tags") }}

    + {% if current_user.is_authenticated %} + {{ _("Create") }} + {% endif %} +
    + {% include "tag/_list.html" %} +{% endblock %} \ No newline at end of file diff --git a/webapp/templates/tag/search.html b/webapp/templates/tag/search.html new file mode 100644 index 0000000..4d963b6 --- /dev/null +++ b/webapp/templates/tag/search.html @@ -0,0 +1,8 @@ +{% extends "layout.html" %} + +{% block content %} +

    {{ _("Search results for") }} {{ _("Tags") }}

    + {{ _("Create") }} +
    + {% include "tag/_search.html" %} +{% endblock %} \ No newline at end of file diff --git a/webapp/templates/tag/table.html b/webapp/templates/tag/table.html new file mode 100644 index 0000000..7ba99d8 --- /dev/null +++ b/webapp/templates/tag/table.html @@ -0,0 +1,8 @@ +{% extends "layout.html" %} + +{% block content %} +

    {{ _("Tags") }}

    + {{ _("Create") }} +
    + {% include "tag/_table.html" %} +{% endblock %} \ No newline at end of file diff --git a/webapp/templates/tag/update.html b/webapp/templates/tag/update.html new file mode 100644 index 0000000..8796ee8 --- /dev/null +++ b/webapp/templates/tag/update.html @@ -0,0 +1,6 @@ +{% extends "layout.html" %} + +{% block content %} +

    {{ _("Edit") }} {% include "tag/_title.html" %}

    + {% include "tag/_update.html" %} +{% endblock %} \ No newline at end of file diff --git a/webapp/view_models/BlogPost.yaml b/webapp/view_models/BlogPost.yaml index e581d10..2c745fa 100644 --- a/webapp/view_models/BlogPost.yaml +++ b/webapp/view_models/BlogPost.yaml @@ -21,6 +21,9 @@ columns: - name: title - name: body type: long_text + - name: tag + type: relationship + multiple: yes - name: created_dt - name: updated_dt display: diff --git a/webapp/view_models/Tag.yaml b/webapp/view_models/Tag.yaml new file mode 100644 index 0000000..b8e0b51 --- /dev/null +++ b/webapp/view_models/Tag.yaml @@ -0,0 +1,20 @@ +name: Tag +interits: + - Ownable +access: + - verb: all + login_required: true + roles_required: + - admin + - verb: get + login_required: false + - verb: list + login_required: false + - verb: table + login_required: false + - verb: search + login_required: false +columns: + - name: name +display: + primary: name \ No newline at end of file