leave no file untouched
@ -1,15 +1,16 @@
|
||||
import os
|
||||
import shutil
|
||||
|
||||
from app import db
|
||||
from distribusisinfo import DistribusisInfo
|
||||
from flask import render_template
|
||||
from sqlalchemy.exc import (DatabaseError, DataError, InterfaceError,
|
||||
InvalidRequestError)
|
||||
|
||||
from app import db
|
||||
from distribusikan.distribusisinfo import DistribusisInfo
|
||||
from forms.admindistribusiform import AdminDistribusiForm
|
||||
from forms.adminuserform import AdminUserForm
|
||||
from models.distribusimodel import Distribusis
|
||||
from models.usermodel import User
|
||||
from sqlalchemy.exc import (DatabaseError, DataError, InterfaceError,
|
||||
InvalidRequestError)
|
||||
|
||||
|
||||
def AdminPage():
|
||||
|
@ -1,10 +1,11 @@
|
||||
import sys
|
||||
|
||||
from sqlalchemy.exc import (DatabaseError, DataError, InterfaceError,
|
||||
InvalidRequestError)
|
||||
|
||||
from app import create_app, db
|
||||
from models.distribusimodel import Distribusis # noqa: F401
|
||||
from models.usermodel import User # noqa: F401
|
||||
from sqlalchemy.exc import (DatabaseError, DataError, InterfaceError,
|
||||
InvalidRequestError)
|
||||
|
||||
|
||||
def admintool():
|
||||
|
@ -16,7 +16,7 @@ login_manager = LoginManager()
|
||||
|
||||
|
||||
def create_app():
|
||||
APP.secret_key = "secret-key"
|
||||
APP.secret_key = os.urandom(24)
|
||||
APP.config["SQLALCHEMY_DATABASE_URI"] = "sqlite:///distribusiverse.db"
|
||||
APP.config["SQLALCHEMY_TRACK_MODIFICATIONS"] = True
|
||||
APP.config["MAX_CONTENT_LENGTH"] = 1024 * 1024 * 1024
|
||||
@ -59,6 +59,10 @@ def settings():
|
||||
return APP
|
||||
|
||||
|
||||
def get_app():
|
||||
return APP
|
||||
|
||||
|
||||
def settings_from_file():
|
||||
settings = {}
|
||||
if os.path.isfile("settings_development.toml"):
|
||||
|
@ -1,7 +1,8 @@
|
||||
def deploy():
|
||||
"""Run deployment of database."""
|
||||
from app import create_app, db
|
||||
from flask_migrate import init, migrate, stamp, upgrade
|
||||
|
||||
from app import create_app, db
|
||||
from models.distribusimodel import Distribusis # noqa: F401
|
||||
# This model is required for flask_migrate to make the table
|
||||
from models.usermodel import User # noqa: F401
|
||||
|
46
verse/distribusikan/distribusikan.py
Normal file
@ -0,0 +1,46 @@
|
||||
from flask import Blueprint
|
||||
from flask_login import login_required
|
||||
|
||||
from distribusikan.distribusiselector import DistribusiSelector
|
||||
# Distribusi Information
|
||||
from distribusikan.distribusisinfo import DistribusisInfo
|
||||
from distribusikan.distribusiworkflow import DistribusiWorkflow
|
||||
from distribusikan.editor import Editor
|
||||
from distribusikan.themeselector import ThemeSelector
|
||||
from distribusikan.uploadpage import UploadPage
|
||||
|
||||
distribusikan = Blueprint(
|
||||
"distribusikan",
|
||||
__name__,
|
||||
template_folder="templates/distribusikan",
|
||||
static_folder="static",
|
||||
)
|
||||
|
||||
|
||||
@distribusikan.route("/distribusi", methods=["GET", "POST"])
|
||||
@login_required
|
||||
def distribusi():
|
||||
return DistribusiWorkflow()
|
||||
|
||||
|
||||
@distribusikan.route("/upload", methods=["POST"])
|
||||
@login_required
|
||||
def upload():
|
||||
return UploadPage()
|
||||
|
||||
|
||||
@distribusikan.route("/theme", methods=["GET", "POST"])
|
||||
@login_required
|
||||
def theme():
|
||||
return ThemeSelector()
|
||||
|
||||
@distribusikan.route("/editor", methods=["GET", "POST"])
|
||||
@login_required
|
||||
def editor():
|
||||
return Editor()
|
||||
|
||||
|
||||
@distribusikan.route("/selector", methods=["GET", "POST"])
|
||||
@login_required
|
||||
def selector():
|
||||
return DistribusiSelector()
|
@ -1,10 +1,13 @@
|
||||
import os
|
||||
import shutil
|
||||
|
||||
from app import db
|
||||
from distribusisinfo import DistribusisInfo
|
||||
from flask import flash, render_template
|
||||
from flask_login import current_user
|
||||
from sqlalchemy.exc import (DatabaseError, DataError, InterfaceError,
|
||||
InvalidRequestError)
|
||||
|
||||
from app import db
|
||||
from distribusikan.distribusisinfo import DistribusisInfo
|
||||
from forms.distribusiform import DistribusiForm
|
||||
from forms.publicthemeform import PublicThemeForm
|
||||
from forms.selectorform import SelectorForm
|
||||
@ -12,8 +15,6 @@ from forms.themeform import ThemeForm
|
||||
from forms.uploadform import UploadForm
|
||||
from models.distribusimodel import Distribusis
|
||||
from models.usermodel import User
|
||||
from sqlalchemy.exc import (DatabaseError, DataError, InterfaceError,
|
||||
InvalidRequestError)
|
||||
# UserPengguna
|
||||
from statuspengguna.helper import UserHelper
|
||||
|
@ -1,4 +1,5 @@
|
||||
from flask_login import current_user
|
||||
|
||||
from models.distribusimodel import Distribusis
|
||||
from models.usermodel import User
|
||||
|
@ -2,13 +2,17 @@ import os
|
||||
import shutil
|
||||
import zipfile
|
||||
|
||||
from app import db
|
||||
# Tada!
|
||||
from distribusi.cli import build_argparser
|
||||
from distribusiselector import SelectorVisible
|
||||
from distribusisinfo import DistribusisInfo
|
||||
from distribusi.distribusi import distribusify
|
||||
from flask import flash, redirect, render_template, url_for
|
||||
from flask_login import current_user
|
||||
from sqlalchemy.exc import (DatabaseError, DataError, InterfaceError,
|
||||
InvalidRequestError)
|
||||
|
||||
from app import db
|
||||
from distribusikan.distribusiselector import SelectorVisible
|
||||
from distribusikan.distribusisinfo import DistribusisInfo
|
||||
from forms.distribusiform import DistribusiForm
|
||||
from forms.publicthemeform import PublicThemeForm
|
||||
from forms.selectorform import SelectorForm
|
||||
@ -17,13 +21,9 @@ from forms.themeform import ThemeForm
|
||||
from forms.uploadform import UploadForm
|
||||
from models.distribusimodel import Distribusis
|
||||
from models.usermodel import User
|
||||
from sqlalchemy.exc import (DatabaseError, DataError, InterfaceError,
|
||||
InvalidRequestError)
|
||||
# UserPengguna
|
||||
from statuspengguna.helper import UserHelper
|
||||
|
||||
from distribusi.distribusi import distribusify
|
||||
|
||||
|
||||
def DistribusiWorkflow():
|
||||
distribusiform = DistribusiForm()
|
@ -2,10 +2,14 @@ import os
|
||||
import shutil
|
||||
|
||||
import bleach
|
||||
from app import db
|
||||
from bleach_allowlist import all_styles
|
||||
from distribusisinfo import DistribusisInfo
|
||||
from flask import render_template
|
||||
from sqlalchemy.exc import (DatabaseError, DataError, InterfaceError,
|
||||
InvalidRequestError)
|
||||
from werkzeug.utils import secure_filename
|
||||
|
||||
from app import db
|
||||
from distribusikan.distribusisinfo import DistribusisInfo
|
||||
from forms.distribusiform import DistribusiForm
|
||||
from forms.editorform import EditorForm
|
||||
from forms.publicthemeform import PublicThemeForm
|
||||
@ -13,10 +17,7 @@ from forms.selectorform import SelectorForm
|
||||
from forms.themeform import ThemeForm
|
||||
from forms.uploadform import UploadForm
|
||||
from models.distribusimodel import Distribusis
|
||||
from sqlalchemy.exc import (DatabaseError, DataError, InterfaceError,
|
||||
InvalidRequestError)
|
||||
from statuspengguna.helper import UserHelper
|
||||
from werkzeug.utils import secure_filename
|
||||
|
||||
|
||||
def Editor():
|
@ -1,4 +1,4 @@
|
||||
{% extends "base.html" %}
|
||||
{% extends "base/base.html" %}
|
||||
{% block main %}
|
||||
<div id="buttons">
|
||||
<div class="overview">
|
@ -3,7 +3,7 @@
|
||||
<p class="tooltip">Run distribusi on your files. This will generate your website and make
|
||||
your content public. <span class="tooltiptext">Distribusi will unpack your zip file and turn it into a website!
|
||||
</span></p>
|
||||
<form method="POST" enctype="multipart/form-data" action="{{ url_for('distribusi') }}">
|
||||
<form method="POST" enctype="multipart/form-data" action="{{ url_for('distribusikan.distribusi') }}">
|
||||
{{ distribusiform.csrf_token }}
|
||||
{% if files_uploaded or distribusi_live %}
|
||||
<fieldset class="button required">
|
@ -1,7 +1,7 @@
|
||||
<div id="distribusi" class="workflow">
|
||||
<h2>Welcome back to your Distribusi</h2>
|
||||
<p>You have already uploaded a distribusi website:</p>
|
||||
<form method="POST" enctype="multipart/form-data" action="{{ url_for('selector') }}">
|
||||
<form method="POST" enctype="multipart/form-data" action="{{ url_for('distribusikan.selector') }}">
|
||||
{{ selectorform.csrf_token }}
|
||||
<fieldset class="required">
|
||||
{{ selectorform.distribusis.label }}
|
@ -4,7 +4,7 @@
|
||||
step 3.</p>
|
||||
<p>Don't forget to press Save</p>
|
||||
<hr>
|
||||
<form method="POST" enctype="multipart/form-data" action="{{ url_for('theme') }}">
|
||||
<form method="POST" enctype="multipart/form-data" action="{{ url_for('distribusikan.theme') }}">
|
||||
{{ themeform.csrf_token }}
|
||||
<fieldset class="required">
|
||||
{{ themeform.theme.label }}
|
||||
@ -23,7 +23,7 @@
|
||||
{% endif %}
|
||||
</form>
|
||||
<hr>
|
||||
<form method="POST" enctype="multipart/form-data" action="{{ url_for('theme') }}">
|
||||
<form method="POST" enctype="multipart/form-data" action="{{ url_for('distribusikan.theme') }}">
|
||||
{{ publicthemeform.csrf_token }}
|
||||
<fieldset id="publicthemes" class="required">
|
||||
{{ publicthemeform.publicthemes.label }}
|
@ -1,7 +1,7 @@
|
||||
<div id="upload" class="workflow">
|
||||
<h2>Step 1: Upload</h2>
|
||||
<p>Upload your files here:</p>
|
||||
<form method="POST" enctype="multipart/form-data" action="{{ url_for('upload') }}">
|
||||
<form method="POST" enctype="multipart/form-data" action="{{ url_for('distribusikan.upload') }}">
|
||||
{{ uploadform.csrf_token }}
|
||||
<fieldset class="required">
|
||||
{{ uploadform.sitename.label }}
|
@ -1,4 +1,4 @@
|
||||
{% extends "base.html" %}
|
||||
{% extends "base/base.html" %}
|
||||
{% block main %}
|
||||
<form method="POST" enctype="multipart/form-data" action="{{ url_for('editor') }}" class="editform">
|
||||
<div class="editareas">
|
@ -1,8 +1,9 @@
|
||||
import os
|
||||
import shutil
|
||||
|
||||
from distribusisinfo import DistribusisInfo
|
||||
from flask import render_template
|
||||
|
||||
from distribusikan.distribusisinfo import DistribusisInfo
|
||||
from forms.distribusiform import DistribusiForm
|
||||
from forms.publicthemeform import PublicThemeForm
|
||||
from forms.selectorform import SelectorForm
|
@ -1,15 +1,16 @@
|
||||
import os
|
||||
import shutil
|
||||
|
||||
from app import db
|
||||
from distribusiselector import SelectCurrentDistribusi
|
||||
from flask import flash
|
||||
from flask_login import current_user
|
||||
from sqlalchemy.exc import (DatabaseError, DataError, IntegrityError,
|
||||
InterfaceError, InvalidRequestError)
|
||||
|
||||
from app import db
|
||||
from distribusikan.distribusiselector import SelectCurrentDistribusi
|
||||
from forms.uploadform import UploadForm
|
||||
from models.distribusimodel import Distribusis
|
||||
from models.usermodel import User
|
||||
from sqlalchemy.exc import (DatabaseError, DataError, IntegrityError,
|
||||
InterfaceError, InvalidRequestError)
|
||||
from statuspengguna.helper import UserHelper
|
||||
|
||||
|
@ -1,14 +1,15 @@
|
||||
from app import APP
|
||||
from distribusiselector import SelectorVisible
|
||||
from distribusisinfo import DistribusisInfo
|
||||
from flask import render_template
|
||||
|
||||
from app import APP
|
||||
from distribusikan.distribusiselector import SelectorVisible
|
||||
from distribusikan.distribusisinfo import DistribusisInfo
|
||||
from distribusikan.upload import UploadNewDistribusi, UploadUpdatedFiles
|
||||
from forms.distribusiform import DistribusiForm
|
||||
from forms.publicthemeform import PublicThemeForm
|
||||
from forms.selectorform import SelectorForm
|
||||
from forms.themeform import ThemeForm
|
||||
# UserPengguna
|
||||
from statuspengguna.helper import UserHelper
|
||||
from upload import UploadNewDistribusi, UploadUpdatedFiles
|
||||
|
||||
|
||||
def UploadPage():
|
@ -1,4 +1,3 @@
|
||||
from app import settings
|
||||
from flask_wtf import FlaskForm
|
||||
from flask_wtf.file import FileAllowed, FileField, FileRequired, FileSize
|
||||
from wtforms import (IntegerField, SelectField, StringField, SubmitField,
|
||||
@ -6,6 +5,8 @@ from wtforms import (IntegerField, SelectField, StringField, SubmitField,
|
||||
from wtforms.validators import (DataRequired, Length, NumberRange,
|
||||
ValidationError)
|
||||
|
||||
from app import settings
|
||||
|
||||
|
||||
class UploadForm(FlaskForm):
|
||||
"""File upload class for a new site in distribusi-verse"""
|
||||
|
@ -1,6 +1,7 @@
|
||||
from app import db
|
||||
from flask_login import UserMixin
|
||||
|
||||
from app import db
|
||||
|
||||
|
||||
class User(UserMixin, db.Model):
|
||||
"""User model class for a user in distribusi-verse"""
|
||||
|
@ -2,36 +2,33 @@
|
||||
|
||||
from datetime import timedelta
|
||||
|
||||
# Interface! these are seperate files in main folder
|
||||
from adminpage import AdminPage
|
||||
from app import create_app, login_manager
|
||||
from distribusiselector import DistribusiSelector
|
||||
# Distribusi Information
|
||||
from distribusisinfo import DistribusisInfo
|
||||
from distribusiworkflow import DistribusiWorkflow
|
||||
from editor import Editor
|
||||
from flask import (Blueprint, redirect, render_template, send_from_directory,
|
||||
session, url_for)
|
||||
from flask_login import current_user, login_required, logout_user
|
||||
from flask_mail import Mail
|
||||
from flask_wtf.csrf import CSRFError
|
||||
|
||||
# Interface! these are seperate files in main folder
|
||||
from adminpage import AdminPage
|
||||
from app import create_app, login_manager
|
||||
from distribusikan.distribusikan import distribusikan
|
||||
from distribusikan.distribusisinfo import DistribusisInfo
|
||||
# Use upload form to populate filters
|
||||
from forms.uploadform import UploadForm
|
||||
from models.distribusimodel import Distribusis
|
||||
from models.usermodel import User
|
||||
from statuspengguna.forgotpassword import ForgotPassword
|
||||
# UserPengguna
|
||||
from statuspengguna.forgotpassword import forgot_password
|
||||
from statuspengguna.helper import UserHelper
|
||||
from statuspengguna.loginuser import LoginUser
|
||||
from statuspengguna.registeruser import RegisterUser
|
||||
from statuspengguna.resetpassword import ResetPassword
|
||||
from themeselector import ThemeSelector
|
||||
from uploadpage import UploadPage
|
||||
from statuspengguna.loginuser import login_section
|
||||
from statuspengguna.registeruser import register_user
|
||||
|
||||
APP = create_app()
|
||||
stash_page = Blueprint("stash_page", __name__, static_folder="stash")
|
||||
APP.register_blueprint(login_section, url_prefix="/login")
|
||||
APP.register_blueprint(register_user, url_prefix="/register")
|
||||
APP.register_blueprint(forgot_password, url_prefix="/login/forgotpassword")
|
||||
APP.register_blueprint(distribusikan)
|
||||
APP.register_blueprint(stash_page)
|
||||
mail = Mail(APP)
|
||||
|
||||
|
||||
@APP.before_request
|
||||
@ -60,7 +57,7 @@ def index():
|
||||
categories = uploadform.category.choices
|
||||
adminuser = isadminuser()
|
||||
template = render_template(
|
||||
"index.html",
|
||||
"base/index.html",
|
||||
distribusisindex=distribusisindex,
|
||||
years=years,
|
||||
categories=categories,
|
||||
@ -71,25 +68,7 @@ def index():
|
||||
|
||||
@APP.route("/help")
|
||||
def help():
|
||||
return render_template("help.html")
|
||||
|
||||
|
||||
@APP.route("/distribusi", methods=["GET", "POST"])
|
||||
@login_required
|
||||
def distribusi():
|
||||
return DistribusiWorkflow()
|
||||
|
||||
|
||||
@APP.route("/upload", methods=["POST"])
|
||||
@login_required
|
||||
def upload():
|
||||
return UploadPage()
|
||||
|
||||
|
||||
@APP.route("/theme", methods=["GET", "POST"])
|
||||
@login_required
|
||||
def theme():
|
||||
return ThemeSelector()
|
||||
return render_template("base/help.html")
|
||||
|
||||
|
||||
@APP.route("/publicthemes/<path>")
|
||||
@ -100,18 +79,6 @@ def publicthemes(path):
|
||||
return send_from_directory("themes", cssfile, as_attachment=True)
|
||||
|
||||
|
||||
@APP.route("/editor", methods=["GET", "POST"])
|
||||
@login_required
|
||||
def editor():
|
||||
return Editor()
|
||||
|
||||
|
||||
@APP.route("/selector", methods=["GET", "POST"])
|
||||
@login_required
|
||||
def selector():
|
||||
return DistribusiSelector()
|
||||
|
||||
|
||||
@APP.route("/stash")
|
||||
def shortstashurl():
|
||||
return redirect(url_for("index"))
|
||||
@ -132,26 +99,6 @@ def logout():
|
||||
return redirect(url_for("index"))
|
||||
|
||||
|
||||
@APP.route("/login", methods=["GET", "POST"])
|
||||
def login():
|
||||
return LoginUser()
|
||||
|
||||
|
||||
@APP.route("/register", methods=["GET", "POST"])
|
||||
def register():
|
||||
return RegisterUser()
|
||||
|
||||
|
||||
@APP.route("/forgotpassword", methods=["GET", "POST"])
|
||||
def forgotpassword():
|
||||
return ForgotPassword(mail)
|
||||
|
||||
|
||||
@APP.route("/resetpassword/<path>", methods=["GET", "POST"])
|
||||
def resetpassword(path):
|
||||
return ResetPassword(path)
|
||||
|
||||
|
||||
@APP.errorhandler(CSRFError)
|
||||
def handle_csrf_error(e):
|
||||
return render_template("csrf_error.html", reason=e.description), 400
|
||||
|
0
verse/statuspengguna/__init__.py
Normal file
@ -1,14 +1,28 @@
|
||||
from datetime import datetime
|
||||
from uuid import uuid1
|
||||
|
||||
from app import db
|
||||
from flask import render_template
|
||||
from flask_mail import Message
|
||||
from forms.forgotpasswordform import ForgotPasswordForm
|
||||
from models.usermodel import User
|
||||
from flask import Blueprint, render_template
|
||||
from flask_mail import Mail, Message
|
||||
from sqlalchemy.exc import (DatabaseError, DataError, InterfaceError,
|
||||
InvalidRequestError)
|
||||
|
||||
from app import db, get_app
|
||||
from forms.forgotpasswordform import ForgotPasswordForm
|
||||
from models.usermodel import User
|
||||
|
||||
mail = Mail(get_app())
|
||||
forgot_password = Blueprint(
|
||||
"forgotpassword",
|
||||
__name__,
|
||||
template_folder="templates/statuspengguna",
|
||||
static_folder="static",
|
||||
)
|
||||
|
||||
|
||||
@forgot_password.route("/", methods=["GET", "POST"])
|
||||
def forgotpassword():
|
||||
return ForgotPassword(mail)
|
||||
|
||||
|
||||
def ForgotPassword(mail):
|
||||
forgotpasswordform = ForgotPasswordForm()
|
||||
|
@ -1,14 +1,15 @@
|
||||
import os
|
||||
|
||||
from app import db
|
||||
from distribusisinfo import DistribusisInfo
|
||||
from flask import flash
|
||||
from flask_login import current_user
|
||||
from models.distribusimodel import Distribusis
|
||||
from models.usermodel import User
|
||||
from sqlalchemy.exc import (DatabaseError, DataError, InterfaceError,
|
||||
InvalidRequestError)
|
||||
|
||||
from app import db
|
||||
from distribusikan.distribusisinfo import DistribusisInfo
|
||||
from models.distribusimodel import Distribusis
|
||||
from models.usermodel import User
|
||||
|
||||
|
||||
class UserHelper:
|
||||
def is_zip_uploaded(distribusiname):
|
||||
|
@ -1,9 +1,23 @@
|
||||
from flask import abort, flash, redirect, render_template, request, url_for
|
||||
from flask import (Blueprint, abort, flash, redirect, render_template, request,
|
||||
send_from_directory, session, url_for)
|
||||
from flask_bcrypt import check_password_hash
|
||||
from flask_login import login_user
|
||||
|
||||
from forms.loginform import LoginForm
|
||||
from models.usermodel import User
|
||||
|
||||
login_section = Blueprint(
|
||||
"login",
|
||||
__name__,
|
||||
template_folder="templates/statuspengguna",
|
||||
static_folder="static",
|
||||
)
|
||||
|
||||
|
||||
@login_section.route("/", methods=["GET", "POST"])
|
||||
def login():
|
||||
return LoginUser()
|
||||
|
||||
|
||||
def LoginUser():
|
||||
loginform = LoginForm()
|
||||
@ -14,11 +28,14 @@ def LoginUser():
|
||||
loginform.password.errors.append("Invalid email or password!")
|
||||
return render_template("login.html", loginform=loginform)
|
||||
if check_password_hash(user.password, loginform.password.data):
|
||||
print(type(user))
|
||||
login_user(user)
|
||||
flash("Logged in successfully.", "success")
|
||||
next = request.args.get("next")
|
||||
if next is not None and not is_safe_url(next): # noqa: F821
|
||||
print(next)
|
||||
return abort(400)
|
||||
print("index")
|
||||
return redirect(next or url_for("index"))
|
||||
else:
|
||||
flash("Invalid email or password!", "danger")
|
||||
|
@ -1,13 +1,26 @@
|
||||
from app import db
|
||||
from flask import flash, redirect, render_template, url_for
|
||||
from flask import Blueprint, flash, redirect, render_template, url_for
|
||||
from flask_bcrypt import generate_password_hash
|
||||
from flask_login import login_user
|
||||
from forms.registerform import RegisterForm
|
||||
from models.usermodel import User
|
||||
from sqlalchemy.exc import (DatabaseError, DataError, IntegrityError,
|
||||
InterfaceError, InvalidRequestError)
|
||||
from werkzeug.routing import BuildError
|
||||
|
||||
from app import db
|
||||
from forms.registerform import RegisterForm
|
||||
from models.usermodel import User
|
||||
|
||||
register_user = Blueprint(
|
||||
"register",
|
||||
__name__,
|
||||
template_folder="templates/statuspengguna",
|
||||
static_folder="static",
|
||||
)
|
||||
|
||||
|
||||
@register_user.route("/", methods=["GET", "POST"])
|
||||
def register():
|
||||
return RegisterUser()
|
||||
|
||||
|
||||
def RegisterUser():
|
||||
registerform = RegisterForm()
|
||||
|
@ -1,15 +1,29 @@
|
||||
from datetime import datetime
|
||||
|
||||
from app import db
|
||||
from flask import flash, redirect, render_template, url_for
|
||||
from flask_bcrypt import generate_password_hash
|
||||
from flask_login import login_user
|
||||
from forms.resetpasswordform import ResetPasswordForm
|
||||
from models.usermodel import User
|
||||
from sqlalchemy.exc import (DatabaseError, DataError, IntegrityError,
|
||||
InterfaceError, InvalidRequestError)
|
||||
from werkzeug.routing import BuildError
|
||||
|
||||
from app import db
|
||||
from forms.resetpasswordform import ResetPasswordForm
|
||||
from models.usermodel import User
|
||||
from statuspengguna import statuspengguna
|
||||
|
||||
reset_password = Blueprint(
|
||||
"reset_password",
|
||||
__name__,
|
||||
template_folder="templates/statuspengguna",
|
||||
static_folder="static",
|
||||
)
|
||||
|
||||
|
||||
@reset_password.route("/resetpassword/<path>", methods=["GET", "POST"])
|
||||
def resetpassword(path):
|
||||
return ResetPassword(path)
|
||||
|
||||
|
||||
def ResetPassword(path):
|
||||
linkvalid = False
|
||||
|
69
verse/statuspengguna/static/css/dropdown.css
Normal file
@ -0,0 +1,69 @@
|
||||
/* Dropdown Button */
|
||||
/* for sorting on year and category
|
||||
*/
|
||||
button {
|
||||
background-color: #E0B0FF;
|
||||
text-decoration: none;
|
||||
border: none;
|
||||
}
|
||||
.filter {
|
||||
display: none;
|
||||
}
|
||||
|
||||
.activebtn {
|
||||
background-color: #62b264;
|
||||
}
|
||||
|
||||
.show {
|
||||
display: block;
|
||||
}
|
||||
.dropdown {
|
||||
position: relative;
|
||||
display: inline-block;
|
||||
}
|
||||
|
||||
/* Dropdown Content (Hidden by Default) */
|
||||
.dropdown-content {
|
||||
display: none;
|
||||
position: absolute;
|
||||
background-color: #E0B0FF;
|
||||
min-width: 120px;
|
||||
border: 2px solid;
|
||||
z-index: 1;
|
||||
border-style: outset;
|
||||
}
|
||||
|
||||
/* Links inside the dropdown */
|
||||
.dropdown-content button {
|
||||
color: black;
|
||||
padding: 6px;
|
||||
border: none;
|
||||
min-width: inherit;
|
||||
text-align: left;
|
||||
text-decoration: none;
|
||||
display: block;
|
||||
}
|
||||
.dropbtn {
|
||||
margin-top: 1em;
|
||||
}
|
||||
/* Change color of dropdown links on hover */
|
||||
.dropdown-content button:hover {background-color: #62b264;}
|
||||
|
||||
|
||||
/* Show the dropdown menu on hover */
|
||||
.dropdown:hover .dropdown-content {display: block;}
|
||||
|
||||
/* Change the background color of the dropdown button when the dropdown content is shown */
|
||||
.dropdown:hover .dropbtn {background-color: #62b264;}
|
||||
|
||||
@media only screen and (min-device-width: 320px) and (max-device-width: 480px) {
|
||||
.dropdown-content button {
|
||||
font-size: 0.7em;
|
||||
}
|
||||
.container > button {
|
||||
font-size: 0.7em;
|
||||
}
|
||||
.dropdown > button {
|
||||
font-size: 0.7em;
|
||||
}
|
||||
}
|
50
verse/statuspengguna/static/css/editor.css
Normal file
@ -0,0 +1,50 @@
|
||||
.editareas {
|
||||
margin: auto;
|
||||
display: flex;
|
||||
justify-content: flex-start;
|
||||
}
|
||||
.editarea {
|
||||
width: 30%;
|
||||
border: 3px solid #E0B0FF;
|
||||
border-style: outset;
|
||||
margin-right: 1em;
|
||||
margin-left: 0;
|
||||
}
|
||||
|
||||
.editor {
|
||||
min-width: 35%;
|
||||
}
|
||||
.editform {
|
||||
width: 100%%;
|
||||
margin: 0 auto;
|
||||
}
|
||||
#editorsubmitform {
|
||||
padding-top: 1em;
|
||||
}
|
||||
.required label {
|
||||
display: block;
|
||||
padding-bottom: 2px;
|
||||
width: 100%
|
||||
}
|
||||
textarea {
|
||||
width: 100%;
|
||||
height: 100%;
|
||||
box-sizing: border-box;
|
||||
min-height: 250px;
|
||||
background: #E0B0FF;
|
||||
outline: none;
|
||||
font-family: Courier, sans-serif;
|
||||
font-size: 16px;
|
||||
}
|
||||
|
||||
iframe {
|
||||
bottom: 0;
|
||||
position: relative;
|
||||
margin-top: 1em;
|
||||
width: 100%;
|
||||
height: 30em;
|
||||
}
|
||||
#html {
|
||||
background-color: #60337F;
|
||||
color: lightgrey;
|
||||
}
|
53
verse/statuspengguna/static/css/selector.css
Normal file
@ -0,0 +1,53 @@
|
||||
.selector-style {
|
||||
padding: 0;
|
||||
width: 20em;
|
||||
max-width: 20em;
|
||||
position: relative;
|
||||
border: none;
|
||||
background: #E0B0FF;
|
||||
text-decoration: none;
|
||||
text-overflow: ellipsis;
|
||||
white-space: nowrap;
|
||||
overflow: hidden;
|
||||
margin: 1px;
|
||||
}
|
||||
|
||||
.selector-style select {
|
||||
padding: 0.2em 0.2em;
|
||||
width: 20em;
|
||||
max-width: 20em;
|
||||
border: none;
|
||||
box-shadow: none;
|
||||
background-color: #E0B0FF;
|
||||
background-image: none;
|
||||
-webkit-appearance: none;
|
||||
-moz-appearance: none;
|
||||
appearance: none;
|
||||
}
|
||||
|
||||
.selector-style:after {
|
||||
top: 50%;
|
||||
left: 95%;
|
||||
border: solid;
|
||||
content: " ";
|
||||
height: 0;
|
||||
width: 0;
|
||||
position: absolute;
|
||||
pointer-events: none;
|
||||
border-color: rgba(0, 0, 0, 0);
|
||||
border-top-color: #000000;
|
||||
margin-top: -2px;
|
||||
z-index: 100;
|
||||
}
|
||||
select.selector option{
|
||||
color: white;
|
||||
background-color: #60337F;
|
||||
padding: 0 10px;
|
||||
}
|
||||
|
||||
.selector-style select:focus {
|
||||
outline: none;
|
||||
}
|
||||
.selector-style select option:hover {
|
||||
background: #60337F;
|
||||
}
|
286
verse/statuspengguna/static/css/style.css
Normal file
@ -0,0 +1,286 @@
|
||||
body
|
||||
{
|
||||
font-family: monospace, monospace;
|
||||
font-size: 15px;
|
||||
background-color: #fdfdfd;
|
||||
color:#29d148;
|
||||
word-wrap: break-word;
|
||||
line-height: 1.1;
|
||||
}
|
||||
|
||||
div#login{
|
||||
width: 30%;
|
||||
margin-left: auto;
|
||||
margin-right: auto;
|
||||
background-color:#fdfdfd;
|
||||
text-decoration: none;
|
||||
}
|
||||
|
||||
div#login form {
|
||||
width: 24em;
|
||||
margin: 0 auto;
|
||||
padding-left: 15%;
|
||||
padding-right: 15%;
|
||||
}
|
||||
|
||||
input[type=text], input[type=password], input[type=file] {
|
||||
color: #C397DF;
|
||||
width: 18em;
|
||||
max-width: 18em;
|
||||
background-color: #fdfdfd;
|
||||
border: 1px solid #E0B0FF;
|
||||
}
|
||||
|
||||
div#upload form {
|
||||
padding-right: 15%;
|
||||
}
|
||||
|
||||
.workflow{
|
||||
margin-top: 1em;
|
||||
padding: 0.5em;
|
||||
padding-left: auto;
|
||||
padding-right: auto;
|
||||
width: 31em;
|
||||
background-color:#fdfdfd;
|
||||
text-decoration: none;
|
||||
scroll-behavior: smooth;
|
||||
border-style: outset;
|
||||
}
|
||||
.workflow > p {
|
||||
padding-left: 1em;
|
||||
}
|
||||
.workflow > h2 {
|
||||
padding-left: 0.4em;;
|
||||
}
|
||||
|
||||
.workflow input{
|
||||
max-width: 20em;
|
||||
}
|
||||
|
||||
#mainworkflow
|
||||
{
|
||||
width: 30em;
|
||||
margin:0 auto;
|
||||
}
|
||||
|
||||
#distribusiverse {
|
||||
margin-bottom: 11em;
|
||||
}
|
||||
#distribusi-index {
|
||||
padding-left: 1em;
|
||||
}
|
||||
|
||||
div#buttons{
|
||||
position: fixed;
|
||||
top: 0.5em;
|
||||
right: 0.5em;
|
||||
display:flex;
|
||||
flex-direction: row;
|
||||
justify-content: center;
|
||||
align-items: center;
|
||||
}
|
||||
|
||||
div#buttons .distribusi input{
|
||||
border: none;
|
||||
background: #fff600;
|
||||
text-decoration: none;
|
||||
margin: 0.2em;
|
||||
}
|
||||
div#buttons .distribusi input:hover{
|
||||
background: #ffbf00;
|
||||
|
||||
}
|
||||
fieldset.required {
|
||||
border: none;
|
||||
}
|
||||
|
||||
fieldset.required > ul {
|
||||
padding-left: 0px;
|
||||
}
|
||||
|
||||
fieldset.required > ul > li{
|
||||
list-style-type: none;
|
||||
}
|
||||
fieldset.tagfield > input {
|
||||
width: 100%;
|
||||
max-width: 100%;
|
||||
}
|
||||
#publicthemes > ul {
|
||||
max-height: 20em;
|
||||
overflow: auto;
|
||||
}
|
||||
#publicthemes > ul > li{
|
||||
word-break: break-all;
|
||||
}
|
||||
|
||||
input {
|
||||
border: none;
|
||||
background: #E0B0FF;
|
||||
text-decoration: none;
|
||||
text-overflow: ellipsis;
|
||||
white-space: nowrap;
|
||||
overflow: hidden;
|
||||
margin: 0.2em;
|
||||
}
|
||||
|
||||
input:hover {
|
||||
background: #60337F;
|
||||
}
|
||||
|
||||
input[type="submit"]:disabled:hover,
|
||||
input[type="submit"]:disabled,
|
||||
input[type="submit"]:disabled:focus {
|
||||
background-color: #2D3039;
|
||||
color: #d28cff;
|
||||
}
|
||||
|
||||
.error {
|
||||
font-size: 110%;
|
||||
color: #F92020;
|
||||
}
|
||||
|
||||
#delete {
|
||||
color: black;
|
||||
background-color: #F92020;
|
||||
}
|
||||
|
||||
#update {
|
||||
color: black;
|
||||
background-color: #62b264;
|
||||
}
|
||||
|
||||
#tutors {
|
||||
color: black;
|
||||
background-color: #62b264;
|
||||
}
|
||||
|
||||
|
||||
/* unvisited link */
|
||||
a:link {
|
||||
color: #fff600;
|
||||
}
|
||||
|
||||
/* visited link */
|
||||
a:visited {
|
||||
color: #d28cff;
|
||||
}
|
||||
|
||||
/* mouse over link */
|
||||
a:hover {
|
||||
color: #60337F;
|
||||
}
|
||||
|
||||
/* selected link */
|
||||
a:active {
|
||||
color: white;
|
||||
}
|
||||
|
||||
/* STOLEN GOODS */
|
||||
#fancyboi::before {
|
||||
content: "$ ";
|
||||
}
|
||||
|
||||
@media (prefers-reduced-motion: no-preference) {
|
||||
@keyframes flash {
|
||||
50% { opacity: 0; }
|
||||
}
|
||||
@keyframes reveal {
|
||||
from { width: 2em; } /* Width of ::before */
|
||||
to { width: 55%; }
|
||||
}
|
||||
#fancyboi {
|
||||
width: 55%;
|
||||
padding: 0.5em;
|
||||
overflow: hidden;
|
||||
white-space: nowrap;
|
||||
animation: reveal 4s linear;
|
||||
text-overflow: "█";
|
||||
background-color: #2D3039;
|
||||
}
|
||||
#fancyboi::after {
|
||||
content: "█";
|
||||
animation: flash 0.5s step-end infinite;
|
||||
}
|
||||
}
|
||||
|
||||
div.maincontent{
|
||||
width: 55%;
|
||||
border: 3px #E0B0FF;
|
||||
margin-top: 0.5em;
|
||||
padding: 0.5em;
|
||||
border-style: outset;
|
||||
}
|
||||
|
||||
.tags{
|
||||
background-color: #000;
|
||||
color: #fff;
|
||||
display: inline-block;
|
||||
padding-left: 4px;
|
||||
padding-right: 4px;
|
||||
text-align: center;
|
||||
margin: 1px;
|
||||
}
|
||||
|
||||
.searched {
|
||||
background: #fff600 !important;
|
||||
color: black !important;
|
||||
}
|
||||
|
||||
.tooltip {
|
||||
position: relative;
|
||||
display: inline-block;
|
||||
border-bottom: 1px dotted black;
|
||||
}
|
||||
|
||||
.tooltip .tooltiptext {
|
||||
visibility: hidden;
|
||||
width: 120px;
|
||||
background-color: black;
|
||||
color: #fff;
|
||||
text-align: center;
|
||||
padding: 5px 0;
|
||||
position: absolute;
|
||||
z-index: 1;
|
||||
bottom: 100%;
|
||||
left: 50%;
|
||||
margin-left: -60px;
|
||||
|
||||
/* Fade in tooltip - takes 1 second to go from 0% to 100% opac: */
|
||||
opacity: 0;
|
||||
transition: opacity 2s;
|
||||
}
|
||||
|
||||
.tooltip:hover .tooltiptext {
|
||||
visibility: visible;
|
||||
opacity: 1;
|
||||
}
|
||||
|
||||
.code-example {
|
||||
width: 100%;
|
||||
color: black;
|
||||
padding: 1em;
|
||||
box-sizing: border-box;
|
||||
background: #E0B0FF;
|
||||
outline: none;
|
||||
font-family: Courier, sans-serif;
|
||||
font-size: 16px;
|
||||
}
|
||||
/*
|
||||
Project colors so far.
|
||||
light
|
||||
#E0B0FF
|
||||
medium
|
||||
#d28cff
|
||||
dark
|
||||
#60337F
|
||||
|
||||
background dark
|
||||
#2D3039
|
||||
|
||||
yellow important
|
||||
#fff600
|
||||
|
||||
red: danger
|
||||
ff5a5a
|
||||
backgrounds
|
||||
*/
|
6
verse/statuspengguna/static/icons/about.txt
Normal file
@ -0,0 +1,6 @@
|
||||
This favicon was generated using the following font:
|
||||
|
||||
- Font Title: Klee One
|
||||
- Font Author: Copyright 2020 The Klee Project Authors (https://github.com/fontworks-fonts/Klee)
|
||||
- Font Source: http://fonts.gstatic.com/s/kleeone/v5/LDIxapCLNRc6A8oT4q4AOeekWPrP.ttf
|
||||
- Font License: SIL Open Font License, 1.1 (http://scripts.sil.org/OFL))
|
BIN
verse/statuspengguna/static/icons/android-chrome-192x192.png
Normal file
After Width: | Height: | Size: 5.4 KiB |
BIN
verse/statuspengguna/static/icons/android-chrome-512x512.png
Normal file
After Width: | Height: | Size: 12 KiB |
BIN
verse/statuspengguna/static/icons/apple-touch-icon.png
Normal file
After Width: | Height: | Size: 4.3 KiB |
BIN
verse/statuspengguna/static/icons/favicon-16x16.png
Normal file
After Width: | Height: | Size: 322 B |
BIN
verse/statuspengguna/static/icons/favicon-32x32.png
Normal file
After Width: | Height: | Size: 666 B |
BIN
verse/statuspengguna/static/icons/favicon.ico
Normal file
After Width: | Height: | Size: 15 KiB |
1
verse/statuspengguna/static/icons/site.webmanifest
Normal file
@ -0,0 +1 @@
|
||||
{"name":"","short_name":"","icons":[{"src":"/android-chrome-192x192.png","sizes":"192x192","type":"image/png"},{"src":"/android-chrome-512x512.png","sizes":"512x512","type":"image/png"}],"theme_color":"#ffffff","background_color":"#ffffff","display":"standalone"}
|
92
verse/statuspengguna/static/js/dropdown.js
Normal file
@ -0,0 +1,92 @@
|
||||
filterSelection("all", "None");
|
||||
function filterSelection(c, name, id) {
|
||||
resetDropDownButtons();
|
||||
var i;
|
||||
var button = document.getElementById(id);
|
||||
if(button){
|
||||
button.innerText = name;
|
||||
addClass(button, "activebtn");
|
||||
}
|
||||
var alldistribusis = document.getElementsByClassName("filter");
|
||||
if (c == "all") {
|
||||
for (i = 0; i < alldistribusis.length; i++) {
|
||||
addClass(alldistribusis[i], "show");
|
||||
}
|
||||
}
|
||||
else {
|
||||
for (i = 0; i < alldistribusis.length; i++) {
|
||||
removeClass(alldistribusis[i], "show");
|
||||
if (alldistribusis[i].className.indexOf(c) > -1) {
|
||||
addClass(alldistribusis[i], "show");
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
function resetDropDownButtons(){
|
||||
document.getElementById("Year").innerText = "Year";
|
||||
document.getElementById("Category").innerText = "Category";
|
||||
allactivebuttons = document.getElementsByClassName("activebtn");
|
||||
for(var i = 0;allactivebuttons.length; i++) {
|
||||
removeClass(allactivebuttons[i], "activebtn");
|
||||
}
|
||||
}
|
||||
function addClass(element, name) {
|
||||
var i, arr1, arr2;
|
||||
arr1 = element.className.split(" ");
|
||||
arr2 = name.split(" ");
|
||||
for (i = 0; i < arr2.length; i++) {
|
||||
if (arr1.indexOf(arr2[i]) == -1) {element.className += " " + arr2[i];}
|
||||
}
|
||||
}
|
||||
|
||||
function removeClass(element, name) {
|
||||
var i, arr1, arr2;
|
||||
arr1 = element.className.split(" ");
|
||||
arr2 = name.split(" ");
|
||||
for (i = 0; i < arr2.length; i++) {
|
||||
while (arr1.indexOf(arr2[i]) > -1) {
|
||||
arr1.splice(arr1.indexOf(arr2[i]), 1);
|
||||
}
|
||||
}
|
||||
element.className = arr1.join(" ");
|
||||
}
|
||||
|
||||
|
||||
let searchInput = document.getElementById('tagsearch');
|
||||
let timeout = null;
|
||||
// Listen for keystroke events
|
||||
searchInput.addEventListener('keyup', function (e) {
|
||||
// Clear the timeout if it has already been set.
|
||||
clearTimeout(timeout);
|
||||
// Make a new timeout set to go off in 1000ms (1 second)
|
||||
timeout = setTimeout(function () {
|
||||
console.log('Input Value:', searchInput.value);
|
||||
if (searchInput.value.length > 2) {
|
||||
searchTags(searchInput.value);
|
||||
} else {
|
||||
clearSearchTags();
|
||||
}
|
||||
}, 1000);
|
||||
});
|
||||
|
||||
function searchTags(searchInput) {
|
||||
let tag_ele = document.getElementsByClassName('tags');
|
||||
for (var i = 0; i < tag_ele.length; ++i) {
|
||||
let searchText = searchInput.toLowerCase().trim();
|
||||
let tagtext = tag_ele[i].innerText.toLowerCase();
|
||||
if(searchText.includes(tagtext) || tagtext.includes(searchText)) {
|
||||
addClass(tag_ele[i], "searched");
|
||||
}
|
||||
else {
|
||||
removeClass(tag_ele[i], "searched");
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
function clearSearchTags() {
|
||||
let tag_ele = document.getElementsByClassName('tags');
|
||||
for (var i = 0; i < tag_ele.length; ++i) {
|
||||
removeClass(tag_ele[i], "searched");
|
||||
}
|
||||
}
|
19
verse/statuspengguna/static/js/editorupdate.js
Normal file
@ -0,0 +1,19 @@
|
||||
function update() {
|
||||
|
||||
var html = document.getElementById("html");
|
||||
var css = document.getElementById("css");
|
||||
var code = document.getElementById("code").contentWindow.document;
|
||||
|
||||
document.body.onkeyup = function(){
|
||||
code.open();
|
||||
code.writeln(html.value+"<style>"+css.value+"</style>");
|
||||
code.close();
|
||||
};
|
||||
document.addEventListener("DOMContentLoaded", function(){
|
||||
code.open();
|
||||
code.writeln(html.value+"<style>"+css.value+"</style>");
|
||||
code.close();
|
||||
});
|
||||
};
|
||||
|
||||
update();
|
25
verse/statuspengguna/static/js/script.js
Normal file
@ -0,0 +1,25 @@
|
||||
console.log("everything is still smooth")
|
||||
|
||||
function scrollToTheme() {
|
||||
var uploadsuccessful = document.getElementById("uploadsuccessful");
|
||||
if(uploadsuccessful){
|
||||
const theme = document.getElementById('theme')
|
||||
theme.scrollIntoView({ behavior: 'smooth', block: 'start' });
|
||||
}
|
||||
}
|
||||
|
||||
function scrollToLaunch() {
|
||||
var cssSelected = document.getElementById("cssSelected");
|
||||
if(cssSelected){
|
||||
const launch = document.getElementById('launch')
|
||||
launch.scrollIntoView({ behavior: 'smooth', block: 'end' });
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
document.addEventListener("DOMContentLoaded", scrollToTheme);
|
||||
document.addEventListener("DOMContentLoaded", scrollToLaunch);
|
||||
|
||||
// function(e) {
|
||||
// (e.keyCode === 13 || e.keyCode === 32) && $(this).trigger("click")
|
||||
// }
|
75
verse/statuspengguna/static/svg/arrow_1.svg
Normal file
@ -0,0 +1,75 @@
|
||||
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
|
||||
<!-- Created with Inkscape (http://www.inkscape.org/) -->
|
||||
|
||||
<svg
|
||||
width="240"
|
||||
height="320"
|
||||
viewBox="0 0 63.5 84.666667"
|
||||
version="1.1"
|
||||
id="svgArrowOne"
|
||||
inkscape:version="1.1.1 (3bf5ae0d25, 2021-09-20)"
|
||||
sodipodi:docname="arrow_1.svg"
|
||||
xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
|
||||
xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
|
||||
xmlns="http://www.w3.org/2000/svg"
|
||||
xmlns:svg="http://www.w3.org/2000/svg">
|
||||
<sodipodi:namedview
|
||||
id="namedview7"
|
||||
pagecolor="#ffffff"
|
||||
bordercolor="#666666"
|
||||
borderopacity="1.0"
|
||||
inkscape:pageshadow="2"
|
||||
inkscape:pageopacity="0.0"
|
||||
inkscape:pagecheckerboard="0"
|
||||
inkscape:document-units="px"
|
||||
showgrid="false"
|
||||
units="px"
|
||||
inkscape:zoom="1"
|
||||
inkscape:cx="236"
|
||||
inkscape:cy="70"
|
||||
inkscape:window-width="1916"
|
||||
inkscape:window-height="1041"
|
||||
inkscape:window-x="1366"
|
||||
inkscape:window-y="18"
|
||||
inkscape:window-maximized="1"
|
||||
inkscape:current-layer="layer1" />
|
||||
<defs
|
||||
id="defs2" />
|
||||
<g
|
||||
inkscape:label="Layer 1"
|
||||
inkscape:groupmode="layer"
|
||||
id="layer1">
|
||||
<circle
|
||||
id="path865"
|
||||
style="fill:#060000;stroke:#fcfffe;stroke-width:0.264583"
|
||||
cx="167.50412"
|
||||
cy="23.866825"
|
||||
r="0.211455" />
|
||||
<circle
|
||||
id="path867"
|
||||
style="fill:#e0b0ff;stroke:#fcfffe;stroke-width:0.264583;fill-opacity:1"
|
||||
cx="167.50412"
|
||||
cy="23.866825"
|
||||
r="0.211455" />
|
||||
<circle
|
||||
id="path2716"
|
||||
style="fill:#d28cff;stroke:#fcfffe;stroke-width:0.264583"
|
||||
cx="31.623327"
|
||||
cy="-54.739456"
|
||||
r="0.1057275" />
|
||||
<circle
|
||||
id="path2718"
|
||||
style="fill:#d28cff;stroke:#fcfffe;stroke-width:0.264583"
|
||||
cx="31.623327"
|
||||
cy="-54.739456"
|
||||
r="0.1057275" />
|
||||
<path
|
||||
style="fill:#d28cff;fill-opacity:1;stroke:none;stroke-width:0.799999"
|
||||
id="path2732"
|
||||
d="m 19.948434,3.1817159 c 1.290131,0.6550689 2.512225,1.4411814 3.755485,2.1807733 1.793529,1.0335667 3.565214,2.1021852 5.308482,3.2186226 0.483624,0.3097273 0.976024,0.6070071 1.443413,0.9407313 0.457224,0.3264641 0.885243,0.6920049 1.327862,1.0380079 2.123546,1.795334 3.693565,4.041838 4.640125,6.658655 0.242448,0.67026 0.417224,1.3631 0.625834,2.04465 0.468096,1.928539 0.850726,3.889399 1.025174,5.869019 0.146409,1.661472 0.09044,3.337613 0.06891,5.002416 -0.136327,2.53704 -0.886677,4.958631 -1.507659,7.401952 -0.562415,2.08257 -2.195008,3.525988 -3.642546,5.02172 -1.668862,1.796187 -3.430227,3.511629 -4.96204,5.428684 -1.232474,1.501685 -2.187443,3.200289 -3.147382,4.881737 -1.04435,1.719871 -1.86704,3.57665 -2.548164,5.467477 -0.710967,2.173634 -0.907385,4.460639 -1.024063,6.730664 0.02091,1.346742 0.05687,2.707192 0.493364,3.995719 0.26353,0.777933 0.396191,0.938664 0.795115,1.653278 0.654367,1.054661 1.365786,2.066507 2.102377,3.064017 0,0 3.841737,-0.248322 3.841737,-0.248322 v 0 c -0.75511,-0.983935 -1.542788,-1.939549 -2.17802,-3.011543 -0.382704,-0.652497 -0.537692,-0.849823 -0.799641,-1.562883 -0.455204,-1.239128 -0.493109,-2.567154 -0.52219,-3.871724 0.107265,-2.234121 0.278343,-4.485997 1.012129,-6.617327 0.708365,-1.865136 1.556754,-3.687384 2.575162,-5.404406 0.953056,-1.662009 1.928715,-3.32604 3.127534,-4.825259 1.51579,-1.902804 3.233504,-3.631578 4.905512,-5.395754 1.510255,-1.536197 3.212571,-3.04624 3.747334,-5.218498 0.540033,-2.47709 1.199993,-4.93743 1.330515,-7.483557 0.02558,-1.263529 0.06192,-2.073423 0.0096,-3.332359 C 41.644752,24.222411 41.147902,21.675409 40.546318,19.16389 40.076453,17.470971 39.976922,16.848842 39.271149,15.277213 38.380408,13.293695 37.001362,11.650365 35.365848,10.236089 34.920391,9.8793346 34.491789,9.5004423 34.02947,9.1658256 33.563896,8.8288536 33.065526,8.5396762 32.585453,8.223701 30.879732,7.1010218 29.144655,6.0327407 27.391958,4.9847267 26.212505,4.238663 25.04853,3.4635151 23.848505,2.7523961 c 0,0 -3.900058,0.4293198 -3.900058,0.4293198 z" />
|
||||
<path
|
||||
style="fill:#d28cff;fill-opacity:1;stroke:none;stroke-width:0.799999"
|
||||
id="path2736"
|
||||
d="m 17.143337,69.050471 c 1.633713,0.894598 3.185906,1.900385 4.678149,3.014075 1.115423,0.934426 2.160169,1.94547 3.113059,3.044203 1.826876,2.397014 -1.146831,1.665475 4.779041,1.263248 0.383141,-1.686153 0.758291,-3.374861 1.165924,-5.055598 0.206131,-0.876517 0.390895,-1.75066 0.653066,-2.611993 0,0 -3.799028,-0.103103 -3.799028,-0.103103 v 0 c -0.220279,0.87104 -0.384717,1.750875 -0.582906,2.627255 -0.396558,1.670132 -0.773763,3.348908 -1.349638,4.968864 1.273906,0.05246 2.548034,0.09977 3.821714,0.157393 0.02885,0.0013 -0.07003,0.03579 -0.08584,0.01161 -0.06107,-0.09337 -0.07566,-0.209923 -0.112684,-0.315174 -0.133537,-0.379648 -0.146335,-0.493044 -0.361696,-0.837912 -0.08452,-0.135356 -0.188793,-0.257328 -0.283188,-0.385993 -1.017286,-1.099923 -2.077482,-2.15043 -3.232635,-3.10924 -1.452916,-1.095015 -2.937697,-2.134709 -4.528692,-3.02179 0,0 -3.87465,0.354142 -3.87465,0.354142 z" />
|
||||
</g>
|
||||
</svg>
|
After Width: | Height: | Size: 4.9 KiB |
12
verse/statuspengguna/static/svg/arrow_2.svg
Normal file
@ -0,0 +1,12 @@
|
||||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<!-- Created with Inkscape (http://www.inkscape.org/) -->
|
||||
<svg width="240" height="320" version="1.1" viewBox="0 0 63.5 84.667" xmlns="http://www.w3.org/2000/svg">
|
||||
<circle cx="167.5" cy="23.867" r=".21146" fill="#060000" stroke="#fcfffe" stroke-width=".26458"/>
|
||||
<circle cx="167.5" cy="23.867" r=".21146" fill="#e0b0ff" stroke="#fcfffe" stroke-width=".26458"/>
|
||||
<g fill="#d28cff">
|
||||
<circle cx="31.623" cy="-54.739" r=".10573" stroke="#fcfffe" stroke-width=".26458"/>
|
||||
<circle cx="31.623" cy="-54.739" r=".10573" stroke="#fcfffe" stroke-width=".26458"/>
|
||||
<path d="m29.598 1.3629c0.29231 0.93057 0.37445 1.9094 0.44145 2.8774 0.01955 0.99076 0.29893 1.9483 0.43855 2.9253 0.04901 1.1628 0.31687 2.2714 0.7734 3.3386 0.60807 1.244 1.6241 2.1846 2.6231 3.1104 0.76132 0.7147 1.5224 1.4053 2.414 1.9528 0.85013 0.49091 1.8227 0.71794 2.7627 0.97569 1.4036 0.22312 2.1015 0.68412 3.1203 1.648 1.1101 1.0733 1.7779 2.4463 2.4311 3.8184 0.5827 1.142 0.76303 2.3828 0.73638 3.6503-0.08765 1.5129-0.67764 2.6923-1.5432 3.8976-0.84272 1.225-2.1589 1.8621-3.4214 2.5577-1.3039 0.74177-2.5458 1.586-3.8965 2.2408-1.5184 0.78493-3.077 1.4779-4.6378 2.1709-1.2968 0.70155-2.6371 1.3714-3.7845 2.3055-1.5755 1.3431-2.9301 2.8922-4.2407 4.4866-1.0773 1.3646-2.2517 2.7443-2.9262 4.3683-0.12219 0.2942-0.20988 0.60157-0.31482 0.90236-0.3176 1.1367-0.50828 2.2967-0.36852 3.4764 0.04693 0.39614 0.19687 1.057 0.27962 1.4461 0.30758 1.2289 0.84547 2.3725 1.4798 3.4625 0.70009 1.3121 1.6509 2.4545 2.6734 3.5243 1.0661 1.0736 2.1636 2.1225 3.154 3.2675 0.78168 0.87789 1.0179 1.9433 1.1372 3.0756 0.03544 0.92388 0.11577 1.8587 0.07073 2.7841-0.01773 0.36408-0.1093 0.87867-0.16701 1.2409-0.09034 1.015-0.40258 1.9744-0.65202 2.9542-0.22907 0.93923-0.24592 1.9133-0.26994 2.875 0.01627 0.16165 0.03253 0.3233 0.04879 0.48495 0 0 3.8677-0.04599 3.8677-0.04599l-0.06033-0.42856c0.0271-0.93446 0.05799-1.8763 0.28398-2.7884 0.25461-0.98959 0.52171-1.9723 0.61567-2.9949 0.18691-1.3678 0.16751-2.7404 0.09837-4.1178-0.10464-1.2084-0.33697-2.37-1.1681-3.3092-0.98696-1.161-2.0984-2.2119-3.1752-3.2885-1.0093-1.0344-1.9609-2.1448-2.6312-3.4346-0.61359-1.0586-1.166-2.1573-1.4984-3.3403-0.02657-0.1263-0.26629-1.2542-0.28656-1.3963-0.16054-1.1256 0.0079-2.2354 0.32978-3.3186 0.10325-0.28669 0.1907-0.57958 0.30976-0.86007 0.67556-1.5915 1.8191-2.9377 2.8755-4.2834 1.3254-1.6128 2.6979-3.0863 4.332-4.3948 1.1702-0.86077 2.4531-1.5682 3.751-2.2163 1.5673-0.6912 3.1104-1.4304 4.6479-2.1857 1.3437-0.6747 2.5823-1.5317 3.8988-2.2576 1.3084-0.71914 2.6043-1.447 3.4487-2.7293 0.89598-1.305 1.4437-2.5132 1.5458-4.1199 0.04656-1.326-0.09489-2.646-0.72638-3.8363-0.70909-1.3836-1.3422-2.8175-2.4524-3.9439-0.95909-0.99062-1.6743-1.6678-3.0935-1.8533-0.92413-0.22693-1.8609-0.47835-2.7296-0.86415-0.37733-0.23195-0.7701-0.43303-1.1225-0.70362-0.56026-0.43018-0.30161-0.27292-0.85155-0.76539-0.15495-0.13876-0.31951-0.26638-0.47927-0.39957-0.94654-0.91944-2.0219-1.7437-2.6195-2.9576-0.46026-1.0278-0.6805-2.1099-0.72907-3.2345-0.13163-0.97099-0.41801-1.9171-0.4545-2.8972-0.062288-0.99479-0.16352-1.9871-0.37122-2.9636l-3.9178 0.11147z"/>
|
||||
<path d="m22.025 71.064c1.1076 0.81571 1.8963 1.9751 2.6453 3.1096 0.63322 0.93788 1.2476 1.8855 1.6118 2.9617 0.28693 0.82149 0.62284 1.6252 1.0669 2.3743 1.0301 1.4304 1.5291 0.58576 4.4538 0.16545 0.14811-0.02127 0.42422-1.2095 0.46069-1.36 0.25411-0.96357 0.61812-1.6049 1.3587-2.2583 0.75053-0.69358 1.7635-0.9666 2.6863-1.3526 1.0408-0.39579 2.1353-0.68763 3.1287-1.1962 0.12805-0.06035 0.2561-0.12069 0.38414-0.18103 0 0-3.8517-0.43584-3.8517-0.43584-0.12618 0.06059-0.25236 0.12119-0.37854 0.18179-1.0095 0.4429-2.0552 0.79223-3.0867 1.1786-0.97696 0.38612-1.9942 0.73078-2.7537 1.4922-0.6784 0.69992-1.1041 1.5244-1.3418 2.4736-0.08563 0.30808-0.14275 0.60119-0.30832 0.87972-0.05051 0.08497-0.29376 0.21564-0.1952 0.22324 1.2279 0.09468 2.4644-0.01566 3.6945 0.04656 0.07116 0.0036-0.09855 0.1467-0.16824 0.13185-0.0954-0.02032-0.13522-0.1406-0.20282-0.2109-0.48406-0.68952-0.78002-1.4975-1.0935-2.2751-0.36094-1.1214-0.97173-2.1151-1.6698-3.0606-0.6571-0.99538-1.3971-2.1349-2.2397-2.9817-0.09081-0.09127-0.19994-0.16228-0.29991-0.24342l-3.9009 0.33725z"/>
|
||||
</g>
|
||||
</svg>
|
After Width: | Height: | Size: 4.1 KiB |
12
verse/statuspengguna/static/svg/arrow_3.svg
Normal file
@ -0,0 +1,12 @@
|
||||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<!-- Created with Inkscape (http://www.inkscape.org/) -->
|
||||
<svg width="240" height="320" version="1.1" viewBox="0 0 63.5 84.667" xmlns="http://www.w3.org/2000/svg">
|
||||
<circle cx="167.5" cy="23.867" r=".21146" fill="#060000" stroke="#fcfffe" stroke-width=".26458"/>
|
||||
<circle cx="167.5" cy="23.867" r=".21146" fill="#e0b0ff" stroke="#fcfffe" stroke-width=".26458"/>
|
||||
<g fill="#d28cff">
|
||||
<circle cx="31.623" cy="-54.739" r=".10573" stroke="#fcfffe" stroke-width=".26458"/>
|
||||
<circle cx="31.623" cy="-54.739" r=".10573" stroke="#fcfffe" stroke-width=".26458"/>
|
||||
<path d="m56.965 3.4219c0.12058 1.1521-0.2318 2.054-0.81004 3.0337-1.0875 1.5907-2.5336 2.8659-4.0843 3.9867-2.1505 1.3863-4.4585 2.4853-6.8625 3.3491-2.7815 0.78715-5.6335 1.3087-8.4879 1.7525-3.134 0.44066-6.2863 0.71397-9.4313 1.0632-3.4224 0.40837-6.8733 1.0287-10.07 2.3675-0.54185 0.22694-1.0603 0.5062-1.5904 0.75929-0.89954 0.54647-1.6469 0.92677-2.4068 1.6606-1.3388 1.2929-2.0863 2.9786-2.778 4.6654-0.87449 2.3542-1.198 4.6214-1.1672 7.1174 0.18717 1.5284 0.31332 3.0753 0.6288 4.5852 0.091869 0.43967 0.3934 1.5785 0.51155 2.0327 0.39771 1.1363 0.63254 2.4445 1.5286 3.3253 0.14764 0.14511 0.3231 0.25888 0.48465 0.38832 0.20368 0.10006 0.39798 0.22205 0.61104 0.30019 0.42615 0.15629 1.2969 0.32297 1.7205 0.41193 1.1822 0.24832 2.3631 0.46842 3.5556 0.66151 1.9566 0.35044 3.9445 0.66205 5.8228 1.331 1.3844 0.50374 2.5213 1.4098 3.6121 2.3711 1.0386 0.99728 2.1001 1.9882 2.7426 3.3026 0.16634 0.3403 0.28751 0.70088 0.43126 1.0513 0.86215 2.4558 1.0225 5.0522 0.9327 7.631-0.07031 1.5349-0.29391 3.1185-1.156 4.4316-0.12638 0.19249-0.28466 0.36202-0.42699 0.54304-0.81011 0.9275-1.7382 1.735-2.5931 2.6178-0.73658 0.82062-1.6053 0.85394-2.5586 1.1927-0.94832 0.22808-1.8262 0.65178-2.7421 0.97327-1.1741 0.61913-2.4826 0.76669-3.7501 1.0714-1.2105 0.21338-2.3976 0.48893-3.5183 1.0015-0.67364 0.34917-1.2076 0.81882-1.6407 1.4361l3.8658 0.2497c0.43909-0.54046 0.98065-0.94428 1.6142-1.2389 1.1138-0.46371 2.2851-0.70648 3.4664-0.93518 1.2893-0.27722 2.5716-0.54674 3.7736-1.1162 0.91684-0.34231 1.829-0.69308 2.7728-0.9567 1.0196-0.30093 1.8099-0.54985 2.5486-1.3801 0.87014-0.87766 1.7909-1.7075 2.5674-2.6739 0.13769-0.20005 0.28985-0.39088 0.41308-0.60015 0.82211-1.3961 1.0263-3.0131 1.0537-4.6056 0.05629-2.6169-0.0783-5.2743-0.90909-7.7781-0.13345-0.36853-0.2428-0.74671-0.40035-1.1056-0.60136-1.3698-1.6464-2.4153-2.7131-3.4287-1.0905-1.0008-2.2045-1.983-3.6142-2.5099-0.24452-0.10125-0.48125-0.22386-0.73356-0.30376-0.26822-0.08493-0.54885-0.12408-0.82261-0.18901-1.4524-0.34445-2.9022-0.68462-4.3809-0.90277-1.1723-0.18185-2.3227-0.40058-3.4815-0.65277-0.54954-0.11959-1.1101-0.19272-1.6518-0.34365-0.20174-0.05621-0.39234-0.14664-0.58852-0.21996-0.15779-0.10023-0.32954-0.18128-0.47337-0.30068-0.94359-0.78332-1.2089-2.059-1.6142-3.1487-0.16754-0.59766-0.40066-1.3998-0.53448-2.0013-0.33082-1.487-0.45328-3.013-0.62991-4.523-0.03942-2.3761 0.26799-4.7319 1.1144-6.9675 0.36685-0.8728 0.62759-1.5813 1.1166-2.3961 0.98125-1.6348 2.2842-2.7836 3.9639-3.6713 0.51139-0.24392 1.0106-0.5151 1.5342-0.73175 3.1926-1.3212 6.6474-1.892 10.059-2.2825 3.192-0.33755 6.3934-0.58867 9.5696-1.062 2.856-0.4763 5.7214-0.9862 8.4967-1.8227 2.4241-0.91126 4.7643-2.0293 6.9388-3.445 1.5814-1.1701 3.0403-2.506 4.1596-4.1381 0.60624-1.0679 0.95747-1.9925 0.94037-3.2331h-3.9289z"/>
|
||||
<path d="m12.023 67.543c0.49829 0.89935 0.97249 1.783 1.2618 2.7744 0.05193 0.50463 0.27477 0.97017 0.38441 1.4597 0.09562 0.42695 0.06722 0.87236 0.05564 1.3052-0.02684 0.65007-0.04547 1.3125-0.23635 1.9412-0.02066 0.06805-0.31569 0.75033-0.34246 0.81269-1.0192 2.7097-0.33194 1.7204 3.7574 1.4613 0.62653-0.65486 1.2245-1.3292 1.8921-1.9454 0.77212-0.76506 1.7378-1.0867 2.7527-1.378 1.0883-0.39202 2.2359-0.50662 3.3814-0.5819 0.64057-0.03615 1.2822-0.04273 1.9235-0.05158 0 0-3.7766-0.59155-3.7766-0.59155-0.64632 0.01315-1.2932 0.02268-1.9381 0.07203-1.1598 0.09954-2.3084 0.26952-3.4108 0.66115-1.0413 0.32357-1.9937 0.77464-2.7811 1.553-0.66771 0.6262-1.2491 1.3374-1.9404 1.9381 1.2373 0.03262 2.4793-0.01378 3.712 0.09787 0.08161 0.0074-0.02469 0.17515-0.08494 0.23068-0.03731 0.03439-0.0096-0.10235-1.85e-4 -0.15222 0.07511-0.39908 0.24315-0.78076 0.38022-1.1601 0.37962-0.92942 0.58939-1.8859 0.57777-2.896 0.01506-0.47523 0.04582-0.96424-0.0577-1.4334-0.10794-0.48914-0.37419-0.93937-0.40173-1.4497-0.15402-0.55207-0.32508-1.0754-0.57723-1.592-0.14541-0.29797-0.33208-0.5746-0.4773-0.87265-0.05226-0.10725-0.08657-0.22235-0.12986-0.33352l-3.9242 0.13069z"/>
|
||||
</g>
|
||||
</svg>
|
After Width: | Height: | Size: 4.5 KiB |
@ -1,4 +1,4 @@
|
||||
{% extends "base.html" %}
|
||||
{% extends "base/base.html" %}
|
||||
{% block main %}
|
||||
<div id="mainworkflow">
|
||||
<div class="workflow">
|
||||
@ -6,7 +6,8 @@
|
||||
<p>
|
||||
Enter the email address that was used to register with Distribusiverse.
|
||||
</p>
|
||||
<form class="form" action="{{ url_for('forgotpassword') }}" method="post">
|
||||
<form class="form" action="{{ url_for('forgotpassword.forgotpassword') }}"
|
||||
method="post">
|
||||
{{ forgotpasswordform.csrf_token }}
|
||||
<fieldset class="required">
|
||||
{{ forgotpasswordform.email.label }}
|
@ -1,7 +1,7 @@
|
||||
{% extends "base.html" %}
|
||||
{% extends "base/base.html" %}
|
||||
{% block main %}
|
||||
<div id="login">
|
||||
<form class="form" action="{{ url_for('login') }}" method="post">
|
||||
<form class="form" action="{{ url_for('login.login') }}" method="post">
|
||||
{{ loginform.csrf_token }}
|
||||
<fieldset class="required">
|
||||
{{ loginform.email.label }}
|
||||
@ -19,7 +19,7 @@
|
||||
</fieldset>
|
||||
<fieldset class="button required">
|
||||
{{ loginform.submit }}
|
||||
<a href="/forgotpassword">Forgot Password?</a>
|
||||
<a href="forgotpassword">Forgot Password?</a>
|
||||
</fieldset>
|
||||
</form>
|
||||
</div>
|
@ -1,7 +1,7 @@
|
||||
{% extends "base.html" %}
|
||||
{% extends "base/base.html" %}
|
||||
{% block main %}
|
||||
<div id="login">
|
||||
<form class="form" action="{{ url_for('register') }}" method="post">
|
||||
<form class="form" action="{{ url_for('register.register') }}" method="post">
|
||||
{{ registerform.csrf_token }}
|
||||
<fieldset class="required">
|
||||
{{ registerform.username.label }}
|
@ -1,4 +1,4 @@
|
||||
{% extends "base.html" %}
|
||||
{% extends "base/base.html" %}
|
||||
{% block main %}
|
||||
<div id="login">
|
||||
{% if linkvalid%}
|
@ -1,4 +1,4 @@
|
||||
{% extends "base.html" %}
|
||||
{% extends "base/base.html" %}
|
||||
{% block main %}
|
||||
<div id="buttons">
|
||||
<div class="overview">
|
@ -1,4 +1,4 @@
|
||||
{% extends "base.html" %}
|
||||
{% extends "base/base.html" %}
|
||||
{% block main %}
|
||||
<div id="buttons">
|
||||
<div class="overview">
|
@ -1,4 +1,4 @@
|
||||
{% extends "base.html" %}
|
||||
{% extends "base/base.html" %}
|
||||
{% block main %}
|
||||
<div id="buttons">
|
||||
|
||||
@ -50,7 +50,7 @@
|
||||
<!-- a div with all the distribusis listed in the distribusiverse -->
|
||||
<div id="distribusiverse" class="maincontent">
|
||||
<h2>List of distribusis</h2>
|
||||
{% include 'filtermenu.html' %}
|
||||
{% include 'base/filtermenu.html' %}
|
||||
<ul id="distribusi-index">
|
||||
{% for name, distribusi in distribusisindex.items() %}
|
||||
<li class='distribusi filter {{ distribusi["category"] }} {{ distribusi["year"] }} '>
|