Переглянути джерело

Add function to create and view pages

JoostSijm 6 роки тому
батько
коміт
573c12d4b8

+ 1 - 1
app/__init__.py

@@ -51,5 +51,5 @@ argon2 = Argon2(app)
 # Login
 login_manager = LoginManager()
 login_manager.init_app(app)
-login_manager.login_view = "login"
+login_manager.login_view = "backend.login"
 login_manager.login_message_category = "warning"

+ 55 - 34
app/modules/backend/app.py

@@ -3,12 +3,12 @@
 Backend
 """
 
-from flask_login import login_required, login_user, logout_user
+from flask_login import login_required, login_user, logout_user, current_user
 from flask_menu import Menu, register_menu
 from flask import render_template, request, redirect, url_for, flash, Blueprint, abort
 from jinja2 import TemplateNotFound
 from app import app, login_manager, db
-from app.models import User
+from app.models import User, Page
 
 
 BLUEPRINT = Blueprint(
@@ -31,66 +31,60 @@ def login():
                 if request.args.get("next") is not None:
                     return redirect(request.args.get("next"))
                 return redirect(url_for('index'))
-            else:
-                flash('Incorrect password.', 'danger')
+            flash('Incorrect password.', 'danger')
         else:
             flash('User not found.', 'danger')
-
         return redirect(url_for('login'))
-    else:
-        return render_template('user/login.j2')
+    return render_template('user/login.j2')
 
 
 @BLUEPRINT.route("/register", methods=["POST"])
 def register():
     """Register a new user"""
-    if request.method != "POST":
-        return redirect(url_for('login'))
+    name = request.form['name'] if 'name' in request.form else None
+    email = request.form['email'] if 'email' in request.form else None
+    password = request.form['password'] if 'email' in request.form else None
 
-    if "name" not in request.form or not request.form['name']:
+    if name is None:
         flash('Fill in the name.', 'warning')
         return render_template('user/login.j2')
 
-    if "email" not in request.form or not request.form['email']:
+    if email is None:
         flash('Fill in the email.', 'warning')
-        return render_template('user/login.j2', name=request.form['name'])
-
-    if "password" not in request.form or not request.form['password']:
-        flash('Fill in the password.', 'warning')
         return render_template(
             'user/login.j2',
-            name=request.form['name'],
-            email=request.form['email']
+            name=name
         )
 
-    user = User.query.filter(User.name == request.form['name']).first()
-    if user is None:
-        flash('Name not found.', 'warning')
+    if password is None:
+        flash('Fill in the password.', 'warning')
         return render_template(
             'user/login.j2',
-            name=request.form['name'],
-            email=request.form['email']
+            name=name,
+            email=email
         )
 
-    if user.email is not None:
-        flash('User already taken.', 'warning')
+    user = User.query.filter(User.email == email).first()
+    if user is not None:
+        flash('Email already taken.', 'warning')
         return render_template(
             'user/login.j2',
-            name=request.form['name'],
-            email=request.form['email']
+            name=name,
         )
 
-    user.email = request.form['email']
-    user.password = request.form['password']
+    user = User()
+    user.name = name
+    user.email = email
+    user.password = password
 
+    db.session.add(user)
     db.session.commit()
     login_user(user, remember=True)
-    flash('Succesfully registered account "%s".' % (user.name), 'success')
+    flash('Successfully registered account "%s".' % (user.name), 'success')
 
     if request.args.get("next") is not None:
         return redirect(request.args.get("next"))
-    else:
-        return redirect(url_for('index'))
+    return redirect(url_for('backend.index'))
 
 
 @BLUEPRINT.route("/logout")
@@ -98,13 +92,40 @@ def register():
 def logout():
     """Logout function for users"""
     logout_user()
-    flash('succesfully logged out.', 'success')
+    flash('Successfully logged out.', 'success')
     return redirect(url_for('login'))
 
 
 @BLUEPRINT.route('/')
-@register_menu(BLUEPRINT, '.', 'Home')
+@register_menu(BLUEPRINT, 'index', 'Home')
+@login_required
 def index():
     """Show homepage"""
+    pages = Page.query.all()
+    return render_template('site/index.j2', pages=pages)
+
+
+@BLUEPRINT.route('/page/create', methods=["GET", "POST"])
+@register_menu(BLUEPRINT, 'page_create', 'Create page')
+@login_required
+def create_page():
+    """Show creating page"""
+    if request.method == 'POST':
+        page = Page()
+        page.title = request.form['title']
+        page.source = request.form['source']
+        page.user_id = current_user.id
+
+        db.session.add(page)
+        db.session.commit()
+
+        flash('Page "%s" successfully created' % page.title, 'success')
+
+    return render_template('page/create.j2')
+
 
-    return render_template('site/index.j2')
+@BLUEPRINT.route('/page/<int:page_id>')
+def view_page(page_id):
+    """Display page"""
+    page = Page.query.get(page_id)
+    return render_template('page/view.j2', page=page)

+ 41 - 0
app/templates/page/create.j2

@@ -0,0 +1,41 @@
+<!DOCTYPE html>
+<html>
+<head>
+    <title>Page create</title>
+    <meta name="viewport" content="width=device-width, initial-scale=1">
+</head>
+<body>
+	{% with messages = get_flashed_messages(with_categories=true) %}
+	{% if messages %}
+	{% for category, message in messages %}
+	<div class="alert alert-{{ category }} alert-dismissible fade show" role="alert">
+		{{ message }}
+		<button type="button" class="close" data-dismiss="alert" aria-label="Close">
+			<span aria-hidden="true">&times;</span>
+		</button>
+	</div>
+	{% endfor %}
+	{% endif %}
+	{% endwith %}
+	{%- for item in current_menu.children recursive -%}
+	<li class="nav-item" data-toggle="tooltip" data-placement="right" title="{{ item.text }}">
+	    <a class="nav-link" href="{{ item.url}}">
+	        <span class="nav-link-text">{{ item.text }}</span>
+	    </a>
+	</li>
+	{%- endfor -%}
+	<h1>Page create</h1>
+	<form method="post">
+		<div class="form-group">
+			<label class="text-normal text-dark">title</label>
+			<input type="text" class="form-control" name="title" placeholder="title">
+		</div>
+		<div class="form-group">
+			<label class="text-normal text-dark">Source</label>
+			<textarea class="form-control" name="source"></textarea>
+		</div>
+		<div class="form-group pull-right">
+			<button class="btn btn-primary">Create</button>
+		</div>
+	</form>
+</body>

+ 29 - 0
app/templates/page/view.j2

@@ -0,0 +1,29 @@
+<!DOCTYPE html>
+<html>
+<head>
+    <title>{{ page.title }} - Page</title>
+    <meta name="viewport" content="width=device-width, initial-scale=1">
+</head>
+<body>
+	{% with messages = get_flashed_messages(with_categories=true) %}
+	{% if messages %}
+	{% for category, message in messages %}
+	<div class="alert alert-{{ category }} alert-dismissible fade show" role="alert">
+		{{ message }}
+		<button type="button" class="close" data-dismiss="alert" aria-label="Close">
+			<span aria-hidden="true">&times;</span>
+		</button>
+	</div>
+	{% endfor %}
+	{% endif %}
+	{% endwith %}
+	{%- for item in current_menu.children recursive -%}
+	<li class="nav-item" data-toggle="tooltip" data-placement="right" title="{{ item.text }}">
+	    <a class="nav-link" href="{{ item.url}}">
+	        <span class="nav-link-text">{{ item.text }}</span>
+	    </a>
+	</li>
+	{%- endfor -%}
+	<h1>Title: {{ page.title }}</h1>
+	<p>{{ page.source }}</p>
+</body>

+ 31 - 0
app/templates/site/index.j2

@@ -0,0 +1,31 @@
+<!DOCTYPE html>
+<html>
+<head>
+    <title>Backend</title>
+    <meta name="viewport" content="width=device-width, initial-scale=1">
+</head>
+<body>
+	{% with messages = get_flashed_messages(with_categories=true) %}
+	{% if messages %}
+	{% for category, message in messages %}
+	<div class="alert alert-{{ category }} alert-dismissible fade show" role="alert">
+		{{ message }}
+		<button type="button" class="close" data-dismiss="alert" aria-label="Close">
+			<span aria-hidden="true">&times;</span>
+		</button>
+	</div>
+	{% endfor %}
+	{% endif %}
+	{% endwith %}
+	{%- for item in current_menu.children recursive -%}
+	<li class="nav-item" data-toggle="tooltip" data-placement="right" title="{{ item.text }}">
+	    <a class="nav-link" href="{{ item.url}}">
+	        <span class="nav-link-text">{{ item.text }}</span>
+	    </a>
+	</li>
+	{%- endfor -%}
+	<h1>Backend</h1>
+	{% for page in pages %}
+	<a href="{{ url_for('backend.view_page', page_id=page.id) }}">{{ page.title }}</a><br>
+	{% endfor %}
+</body>

+ 58 - 0
app/templates/user/login.j2

@@ -0,0 +1,58 @@
+<!DOCTYPE html>
+<html>
+<head>
+    <title>Login</title>
+    <meta name="viewport" content="width=device-width, initial-scale=1">
+</head>
+<body>
+	{% with messages = get_flashed_messages(with_categories=true) %}
+	{% if messages %}
+	{% for category, message in messages %}
+	<div class="alert alert-{{ category }} alert-dismissible fade show" role="alert">
+		{{ message }}
+		<button type="button" class="close" data-dismiss="alert" aria-label="Close">
+			<span aria-hidden="true">&times;</span>
+		</button>
+	</div>
+	{% endfor %}
+	{% endif %}
+	{% endwith %}
+	<div class="row">
+		<div class="col-12 col-md-6">
+			<h2>Login</h2>
+			<form method="post">
+				<div class="form-group">
+					<label class="text-normal text-dark">Email</label>
+					<input type="email" class="form-control" name="email" placeholder="Email">
+				</div>
+				<div class="form-group">
+					<label class="text-normal text-dark">Password</label>
+					<input type="password" class="form-control" name="password" placeholder="Password">
+				</div>
+				<div class="form-group pull-right">
+					<button class="btn btn-primary">Login</button>
+				</div>
+			</form>
+		</div>
+		<div class="col-12 col-md-6">
+			<h2>Register</h2>
+			<form action="{{ url_for('backend.register')}}" method="post">
+				<div class="form-group">
+					<label class="text-normal text-dark">Name</label>
+					<input type="text" class="form-control" name="name" placeholder="Name" value="{{ name }}" required>
+				</div>
+				<div class="form-group">
+					<label class="text-normal text-dark">Email</label>
+					<input type="email" class="form-control" name="email" placeholder="Email" value="{{ email }}" required>
+				</div>
+				<div class="form-group">
+					<label class="text-normal text-dark">Password</label>
+					<input type="password" class="form-control" name="password" placeholder="Password" required>
+				</div>
+				<div class="form-group pull-right">
+					<button class="btn btn-primary">Register</button>
+				</div>
+			</form>
+		</div>
+	</div>
+</body>