<project version="4">
<component name="ChangeListManager">
<list default="true" id="e00b4877-6392-4152-a4a7-f9ffd3e1faca" name="Default Changelist" comment="">
- <change afterPath="$PROJECT_DIR$/flaskr/support.py" afterDir="false" />
- <change afterPath="$PROJECT_DIR$/flaskr/templates/support.html" afterDir="false" />
+ <change afterPath="$PROJECT_DIR$/MANIFEST.in" afterDir="false" />
+ <change afterPath="$PROJECT_DIR$/setup.py" afterDir="false" />
<change beforePath="$PROJECT_DIR$/.idea/workspace.xml" beforeDir="false" afterPath="$PROJECT_DIR$/.idea/workspace.xml" afterDir="false" />
- <change beforePath="$PROJECT_DIR$/flaskr/__init__.py" beforeDir="false" afterPath="$PROJECT_DIR$/flaskr/__init__.py" afterDir="false" />
- <change beforePath="$PROJECT_DIR$/flaskr/auth.py" beforeDir="false" afterPath="$PROJECT_DIR$/flaskr/auth.py" afterDir="false" />
- <change beforePath="$PROJECT_DIR$/flaskr/templates/auth/register.html" beforeDir="false" afterPath="$PROJECT_DIR$/flaskr/templates/auth/register.html" afterDir="false" />
<change beforePath="$PROJECT_DIR$/flaskr/templates/base.html" beforeDir="false" afterPath="$PROJECT_DIR$/flaskr/templates/base.html" afterDir="false" />
</list>
<option name="EXCLUDED_CONVERTED_TO_IGNORED" value="true" />
<component name="FileEditorManager">
<leaf SIDE_TABS_SIZE_LIMIT_KEY="300">
<file pinned="false" current-in-tab="false">
- <entry file="file://$PROJECT_DIR$/Readme.txt">
+ <entry file="file://$PROJECT_DIR$/flaskr/templates/base.html">
<provider selected="true" editor-type-id="text-editor">
- <state relative-caret-position="20">
- <caret line="1" lean-forward="true" selection-start-line="1" selection-end-line="1" selection-end-column="78" />
+ <state relative-caret-position="320">
+ <caret line="16" column="16" lean-forward="true" selection-start-line="16" selection-start-column="16" selection-end-line="16" selection-end-column="16" />
</state>
</provider>
</entry>
</file>
<file pinned="false" current-in-tab="false">
- <entry file="file://$PROJECT_DIR$/flaskr/templates/dashboard.html">
+ <entry file="file://$PROJECT_DIR$/flaskr/templates/support.html">
<provider selected="true" editor-type-id="text-editor">
- <state relative-caret-position="80">
- <caret line="4" column="19" selection-start-line="4" selection-start-column="19" selection-end-line="4" selection-end-column="19" />
+ <state relative-caret-position="340">
+ <caret line="17" selection-start-line="17" selection-end-line="17" />
</state>
</provider>
</entry>
</file>
<file pinned="false" current-in-tab="false">
- <entry file="file://$PROJECT_DIR$/flaskr/templates/base.html">
+ <entry file="file://$PROJECT_DIR$/flaskr/auth.py">
<provider selected="true" editor-type-id="text-editor">
- <state relative-caret-position="500">
- <caret line="25" column="8" lean-forward="true" selection-start-line="25" selection-start-column="8" selection-end-line="25" selection-end-column="8" />
+ <state relative-caret-position="240">
+ <caret line="27" column="24" selection-start-line="27" selection-start-column="24" selection-end-line="27" selection-end-column="24" />
+ <folding>
+ <element signature="e#0#99#0" expanded="true" />
+ </folding>
</state>
</provider>
</entry>
</file>
<file pinned="false" current-in-tab="false">
- <entry file="file://$PROJECT_DIR$/flaskr/dashboard.py">
+ <entry file="file://$PROJECT_DIR$/setup.py">
<provider selected="true" editor-type-id="text-editor">
- <state relative-caret-position="80">
- <caret line="4" column="27" selection-start-line="4" selection-start-column="27" selection-end-line="4" selection-end-column="27" />
+ <state relative-caret-position="200">
+ <caret line="10" column="1" lean-forward="true" selection-start-line="10" selection-start-column="1" selection-end-line="10" selection-end-column="1" />
</state>
</provider>
</entry>
</file>
<file pinned="false" current-in-tab="false">
- <entry file="file://$PROJECT_DIR$/flaskr/contact_us.py">
+ <entry file="file://$PROJECT_DIR$/flaskr/home.py">
<provider selected="true" editor-type-id="text-editor">
- <state relative-caret-position="660">
- <caret line="37" selection-start-line="37" selection-end-line="37" />
- <folding>
- <element signature="e#1#91#0" expanded="true" />
- </folding>
+ <state relative-caret-position="200">
+ <caret line="10" column="4" selection-start-line="10" selection-start-column="4" selection-end-line="10" selection-end-column="39" />
</state>
</provider>
</entry>
</file>
<file pinned="false" current-in-tab="false">
- <entry file="file://$PROJECT_DIR$/flaskr/templates/support.html">
+ <entry file="file://$PROJECT_DIR$/flaskr/templates/about.html">
<provider selected="true" editor-type-id="text-editor">
- <state relative-caret-position="340">
- <caret line="17" lean-forward="true" selection-start-line="17" selection-end-line="17" />
+ <state relative-caret-position="200">
+ <caret line="10" column="5" selection-start-line="10" selection-start-column="5" selection-end-line="10" selection-end-column="5" />
</state>
</provider>
</entry>
</file>
<file pinned="false" current-in-tab="false">
- <entry file="file://$PROJECT_DIR$/flaskr/support.py">
+ <entry file="file://$PROJECT_DIR$/flaskr/db.py">
<provider selected="true" editor-type-id="text-editor">
- <state relative-caret-position="180">
- <caret line="9" column="12" lean-forward="true" selection-start-line="9" selection-start-column="12" selection-end-line="9" selection-end-column="12" />
+ <state relative-caret-position="320">
+ <caret line="16" lean-forward="true" selection-start-line="16" selection-end-line="16" />
+ <folding>
+ <element signature="e#0#14#0" expanded="true" />
+ </folding>
</state>
</provider>
</entry>
</file>
<file pinned="false" current-in-tab="true">
- <entry file="file://$PROJECT_DIR$/flaskr/auth.py">
+ <entry file="file://$PROJECT_DIR$/MANIFEST.in">
<provider selected="true" editor-type-id="text-editor">
- <state relative-caret-position="520">
- <caret line="32" column="30" selection-start-line="32" selection-start-column="30" selection-end-line="32" selection-end-column="30" />
- <folding>
- <element signature="e#0#99#0" expanded="true" />
- </folding>
+ <state relative-caret-position="60">
+ <caret line="3" column="19" selection-start-line="3" selection-start-column="19" selection-end-line="3" selection-end-column="19" />
</state>
</provider>
</entry>
<file pinned="false" current-in-tab="false">
<entry file="file://$PROJECT_DIR$/flaskr/__init__.py">
<provider selected="true" editor-type-id="text-editor">
- <state relative-caret-position="780">
- <caret line="72" lean-forward="true" selection-start-line="72" selection-end-line="72" />
+ <state relative-caret-position="280">
+ <caret line="14" column="22" selection-start-line="14" selection-start-column="22" selection-end-line="14" selection-end-column="22" />
<folding>
<element signature="e#0#9#0" expanded="true" />
</folding>
<component name="IdeDocumentHistory">
<option name="CHANGED_PATHS">
<list>
- <option value="$PROJECT_DIR$/templates/mediaserver_file_list.html" />
- <option value="$PROJECT_DIR$/templates/base.html" />
- <option value="$PROJECT_DIR$/templates/register.html" />
- <option value="$PROJECT_DIR$/static/style.css" />
<option value="$PROJECT_DIR$/db.py" />
<option value="$PROJECT_DIR$/auth.py" />
<option value="$PROJECT_DIR$/templates/dashboard.html" />
<option value="$PROJECT_DIR$/flaskr/admin.py" />
<option value="$PROJECT_DIR$/flaskr/support.py" />
<option value="$PROJECT_DIR$/flaskr/__init__.py" />
- <option value="$PROJECT_DIR$/flaskr/templates/base.html" />
<option value="$PROJECT_DIR$/flaskr/templates/support.html" />
<option value="$PROJECT_DIR$/flaskr/templates/auth/register.html" />
<option value="$PROJECT_DIR$/flaskr/auth.py" />
+ <option value="$PROJECT_DIR$/flaskr/MANIFEST.in" />
+ <option value="$PROJECT_DIR$/flaskr/setup.py" />
+ <option value="$PROJECT_DIR$/setup.py" />
+ <option value="$PROJECT_DIR$/flaskr/templates/base.html" />
+ <option value="$PROJECT_DIR$/MANIFEST.in" />
</list>
</option>
</component>
<item name="openhouseparty.online" type="b2602c69:ProjectViewProjectNode" />
<item name="openhouseparty.online" type="462c0819:PsiDirectoryNode" />
</path>
+ <path>
+ <item name="openhouseparty.online" type="b2602c69:ProjectViewProjectNode" />
+ <item name="openhouseparty.online" type="462c0819:PsiDirectoryNode" />
+ <item name="dist" type="462c0819:PsiDirectoryNode" />
+ </path>
<path>
<item name="openhouseparty.online" type="b2602c69:ProjectViewProjectNode" />
<item name="openhouseparty.online" type="462c0819:PsiDirectoryNode" />
<item name="openhouseparty.online" type="b2602c69:ProjectViewProjectNode" />
<item name="openhouseparty.online" type="462c0819:PsiDirectoryNode" />
<item name="flaskr" type="462c0819:PsiDirectoryNode" />
- <item name="templates" type="462c0819:PsiDirectoryNode" />
- <item name="auth" type="462c0819:PsiDirectoryNode" />
+ <item name="upload" type="462c0819:PsiDirectoryNode" />
</path>
</expand>
<select />
<property name="settings.editor.selected.configurable" value="preferences.lookFeel" />
</component>
<component name="RecentsManager">
- <key name="CopyFile.RECENT_KEYS">
- <recent name="C:\Users\Joseph\Documents\GitHub\flaskr_mediaserver\templates" />
- <recent name="C:\Users\Joseph\Documents\GitHub\flaskr_mediaserver\templates\pcparts" />
- </key>
<key name="MoveFile.RECENT_KEYS">
+ <recent name="C:\Users\Joseph\Documents\GitHub\openhouseparty.online" />
<recent name="C:\Users\Joseph\Documents\GitHub\openhouseparty.online\flaskr" />
<recent name="C:\Users\Joseph\Documents\GitHub\openhouseparty.online\flaskr\static" />
<recent name="C:\Users\Joseph\Documents\GitHub\flaskr_mediaserver\templates" />
</key>
+ <key name="CopyFile.RECENT_KEYS">
+ <recent name="C:\Users\Joseph\Documents\GitHub\flaskr_mediaserver\templates" />
+ <recent name="C:\Users\Joseph\Documents\GitHub\flaskr_mediaserver\templates\pcparts" />
+ </key>
</component>
<component name="RunDashboard">
<option name="ruleStates">
</component>
<component name="ToolWindowManager">
<frame x="-4" y="-4" width="1928" height="1164" extended-state="6" />
- <editor active="true" />
<layout>
<window_info active="true" content_ui="combo" id="Project" order="0" visible="true" weight="0.24960506" />
<window_info id="Structure" order="1" side_tool="true" weight="0.25" />
</layout-to-restore>
</component>
<component name="editorHistoryManager">
- <entry file="file://$PROJECT_DIR$/templates/mediaserver_settings.html">
- <provider selected="true" editor-type-id="text-editor">
- <state relative-caret-position="140">
- <caret line="7" column="36" selection-start-line="7" selection-start-column="36" selection-end-line="7" selection-end-column="36" />
- <folding>
- <element signature="n#style#0;n#input#0;n#dd#0;n#dl#0;n#form#0;n#!!top" expanded="true" />
- </folding>
- </state>
- </provider>
- </entry>
- <entry file="file://$PROJECT_DIR$/flaskr.py">
- <provider selected="true" editor-type-id="text-editor">
- <state relative-caret-position="220">
- <caret line="180" lean-forward="true" selection-start-line="180" selection-end-line="180" />
- <folding>
- <element signature="e#18#33#0" expanded="true" />
- </folding>
- </state>
- </provider>
- </entry>
<entry file="file://$PROJECT_DIR$/flaskr/static/houseparty.png">
<provider selected="true" editor-type-id="images" />
</entry>
</state>
</provider>
</entry>
- <entry file="file://$PROJECT_DIR$/flaskr/db.py">
- <provider selected="true" editor-type-id="text-editor">
- <state relative-caret-position="280">
- <caret line="14" lean-forward="true" selection-start-line="14" selection-end-line="14" />
- <folding>
- <element signature="e#0#14#0" expanded="true" />
- </folding>
- </state>
- </provider>
- </entry>
<entry file="file://$PROJECT_DIR$/flaskr/templates/admin/user_edit.html">
<provider selected="true" editor-type-id="text-editor">
<state relative-caret-position="200">
</state>
</provider>
</entry>
- <entry file="file://$PROJECT_DIR$/flaskr/home.py">
- <provider selected="true" editor-type-id="text-editor">
- <state relative-caret-position="200">
- <caret line="10" column="4" selection-start-line="10" selection-start-column="4" selection-end-line="10" selection-end-column="39" />
- </state>
- </provider>
- </entry>
<entry file="file://$PROJECT_DIR$/flaskr/templates/contact_us.html">
<provider selected="true" editor-type-id="text-editor">
<state relative-caret-position="240">
</state>
</provider>
</entry>
- <entry file="file://$PROJECT_DIR$/flaskr/templates/about.html">
- <provider selected="true" editor-type-id="text-editor">
- <state relative-caret-position="200">
- <caret line="10" column="5" lean-forward="true" selection-start-line="10" selection-start-column="5" selection-end-line="10" selection-end-column="5" />
- </state>
- </provider>
- </entry>
<entry file="file://$PROJECT_DIR$/flaskr/contact_us.py">
<provider selected="true" editor-type-id="text-editor">
<state relative-caret-position="660">
<entry file="file://$PROJECT_DIR$/flaskr/support.py">
<provider selected="true" editor-type-id="text-editor">
<state relative-caret-position="180">
- <caret line="9" column="12" lean-forward="true" selection-start-line="9" selection-start-column="12" selection-end-line="9" selection-end-column="12" />
+ <caret line="9" column="12" selection-start-line="9" selection-start-column="12" selection-end-line="9" selection-end-column="12" />
</state>
</provider>
</entry>
<entry file="file://$PROJECT_DIR$/Readme.txt">
<provider selected="true" editor-type-id="text-editor">
<state relative-caret-position="20">
- <caret line="1" lean-forward="true" selection-start-line="1" selection-end-line="1" selection-end-column="78" />
+ <caret line="1" selection-start-line="1" selection-end-line="1" selection-end-column="78" />
</state>
</provider>
</entry>
</state>
</provider>
</entry>
- <entry file="file://$PROJECT_DIR$/flaskr/templates/base.html">
+ <entry file="file://$PROJECT_DIR$/flaskr/templates/support.html">
<provider selected="true" editor-type-id="text-editor">
- <state relative-caret-position="500">
- <caret line="25" column="8" lean-forward="true" selection-start-line="25" selection-start-column="8" selection-end-line="25" selection-end-column="8" />
+ <state relative-caret-position="340">
+ <caret line="17" selection-start-line="17" selection-end-line="17" />
</state>
</provider>
</entry>
- <entry file="file://$PROJECT_DIR$/flaskr/templates/support.html">
+ <entry file="file://$PROJECT_DIR$/flaskr/templates/auth/register.html">
<provider selected="true" editor-type-id="text-editor">
- <state relative-caret-position="340">
- <caret line="17" lean-forward="true" selection-start-line="17" selection-end-line="17" />
+ <state relative-caret-position="380">
+ <caret line="19" column="42" selection-start-line="19" selection-start-column="42" selection-end-line="19" selection-end-column="42" />
+ </state>
+ </provider>
+ </entry>
+ <entry file="file://$PROJECT_DIR$/flaskr/auth.py">
+ <provider selected="true" editor-type-id="text-editor">
+ <state relative-caret-position="240">
+ <caret line="27" column="24" selection-start-line="27" selection-start-column="24" selection-end-line="27" selection-end-column="24" />
+ <folding>
+ <element signature="e#0#99#0" expanded="true" />
+ </folding>
</state>
</provider>
</entry>
<entry file="file://$PROJECT_DIR$/flaskr/__init__.py">
<provider selected="true" editor-type-id="text-editor">
- <state relative-caret-position="780">
- <caret line="72" lean-forward="true" selection-start-line="72" selection-end-line="72" />
+ <state relative-caret-position="280">
+ <caret line="14" column="22" selection-start-line="14" selection-start-column="22" selection-end-line="14" selection-end-column="22" />
<folding>
<element signature="e#0#9#0" expanded="true" />
</folding>
</state>
</provider>
</entry>
- <entry file="file://$PROJECT_DIR$/flaskr/templates/auth/register.html">
+ <entry file="file://$PROJECT_DIR$/flaskr/home.py">
<provider selected="true" editor-type-id="text-editor">
- <state relative-caret-position="380">
- <caret line="19" column="42" selection-start-line="19" selection-start-column="42" selection-end-line="19" selection-end-column="42" />
+ <state relative-caret-position="200">
+ <caret line="10" column="4" selection-start-line="10" selection-start-column="4" selection-end-line="10" selection-end-column="39" />
</state>
</provider>
</entry>
- <entry file="file://$PROJECT_DIR$/flaskr/auth.py">
+ <entry file="file://$PROJECT_DIR$/flaskr/templates/about.html">
+ <provider selected="true" editor-type-id="text-editor">
+ <state relative-caret-position="200">
+ <caret line="10" column="5" selection-start-line="10" selection-start-column="5" selection-end-line="10" selection-end-column="5" />
+ </state>
+ </provider>
+ </entry>
+ <entry file="file://$PROJECT_DIR$/flaskr/templates/base.html">
+ <provider selected="true" editor-type-id="text-editor">
+ <state relative-caret-position="320">
+ <caret line="16" column="16" lean-forward="true" selection-start-line="16" selection-start-column="16" selection-end-line="16" selection-end-column="16" />
+ </state>
+ </provider>
+ </entry>
+ <entry file="file://$PROJECT_DIR$/flaskr/db.py">
<provider selected="true" editor-type-id="text-editor">
- <state relative-caret-position="520">
- <caret line="32" column="30" selection-start-line="32" selection-start-column="30" selection-end-line="32" selection-end-column="30" />
+ <state relative-caret-position="320">
+ <caret line="16" lean-forward="true" selection-start-line="16" selection-end-line="16" />
<folding>
- <element signature="e#0#99#0" expanded="true" />
+ <element signature="e#0#14#0" expanded="true" />
</folding>
</state>
</provider>
</entry>
+ <entry file="file://$PROJECT_DIR$/setup.py">
+ <provider selected="true" editor-type-id="text-editor">
+ <state relative-caret-position="200">
+ <caret line="10" column="1" lean-forward="true" selection-start-line="10" selection-start-column="1" selection-end-line="10" selection-end-column="1" />
+ </state>
+ </provider>
+ </entry>
+ <entry file="file://$PROJECT_DIR$/MANIFEST.in">
+ <provider selected="true" editor-type-id="text-editor">
+ <state relative-caret-position="60">
+ <caret line="3" column="19" selection-start-line="3" selection-start-column="19" selection-end-line="3" selection-end-column="19" />
+ </state>
+ </provider>
+ </entry>
</component>
</project>
\ No newline at end of file
--- /dev/null
+include flaskr/schema.sql
+graft flaskr/static
+graft flaskr/templates
+graft flaskr/upload
+global-exclude *.pyc
\ No newline at end of file
--- /dev/null
+import os
+
+from flask import Flask
+
+
+
+
+def create_app(test_config=None):
+ # create and configure the app
+ app = Flask(__name__, instance_relative_config=True)
+ app.config.from_mapping(
+ SECRET_KEY='dev',
+ DATABASE=os.path.join(app.instance_path, 'flaskr.sqlite'),
+ )
+ UPLOAD_FOLDER = "./upload"
+ app.config["UPLOAD_FOLDER"] = UPLOAD_FOLDER
+
+ if test_config is None:
+ # load the instance config, if it exists, when not testing
+ app.config.from_pyfile('config.py', silent=True)
+ else:
+ # load the test config if passed in
+ app.config.from_mapping(test_config)
+
+ # ensure the instance folder exists
+ try:
+ os.makedirs(app.instance_path)
+ except OSError:
+ pass
+
+ # a simple page that says hello
+ @app.route('/hello')
+ def hello():
+ return 'Hello, World!'
+
+ from . import db
+ db.init_app(app)
+
+ from . import auth
+ app.register_blueprint(auth.bp)
+
+ from . import blog
+ app.register_blueprint(blog.bp)
+
+
+ from . import home
+ app.register_blueprint(home.bp)
+ app.add_url_rule('/', endpoint='index')
+
+ from . import admin
+ app.register_blueprint(admin.bp)
+
+ from . import about
+ app.register_blueprint(about.bp)
+
+ from . import contact_us
+ app.register_blueprint(contact_us.bp)
+
+ from . import services
+ app.register_blueprint(services.bp)
+
+ from . import testimonials
+ app.register_blueprint(testimonials.bp)
+
+ from . import dashboard
+ app.register_blueprint(dashboard.bp)
+
+ from . import store
+ app.register_blueprint(store.bp)
+
+ from . import resources
+ app.register_blueprint(resources.bp)
+
+ from . import faq
+ app.register_blueprint(faq.bp)
+
+ from . import support
+ app.register_blueprint(support.bp)
+ return app
\ No newline at end of file
--- /dev/null
+
+from flask import (
+ Blueprint, flash, g, redirect, render_template, request, url_for
+)
+
+bp = Blueprint('about', __name__)
+
+#Display Data - About
+@bp.route('/about')
+def index():
+ return render_template('about.html')
\ No newline at end of file
--- /dev/null
+from flask import (
+ Blueprint, flash, g, redirect, render_template, request, url_for
+)
+from flaskr.auth import login_required
+from flaskr.db import get_db
+from werkzeug.security import generate_password_hash, check_password_hash
+
+bp = Blueprint('admin', __name__)
+
+#Display Data - Dashboard
+@bp.route('/admin')
+@login_required
+def index():
+ return render_template('admin/admin.html')
+
+@bp.route('/users_list')
+@login_required
+def get_users():
+ db = get_db()
+ users = db.execute(
+ 'SELECT xuser_id, xuser_username, xuser_firstname, xuser_lastname, xuser_email'
+ ' FROM xuser'
+ ).fetchall()
+
+ return render_template('admin/user_list.html', users=users)
+
+@bp.route('/user_delete', methods=['POST'])
+def delete_user():
+ db = get_db()
+ db.execute(
+ 'DELETE FROM xuser WHERE xuser_id = ?', [request.form['user_to_delete']]
+ )
+ db.commit()
+ return redirect(url_for('admin.get_users'))
+
+def get_user(user_id):
+ user = get_db().execute(
+ 'SELECT xuser_id, xuser_username, xuser_password, xuser_firstname, xuser_lastname, xuser_email'
+ ' FROM xuser'
+ ' WHERE xuser_id = ?',
+ (user_id,)
+ ).fetchone()
+
+ return user
+
+
+@bp.route('/<int:user_id>/user_update', methods=['GET', 'POST'])
+@login_required
+def update_user(user_id):
+ user = get_user(user_id)
+ if request.method == 'POST':
+ username = request.form['username']
+ firstname = request.form['firstname']
+ lastname = request.form['lastname']
+ email = request.form['email']
+ password = request.form['password']
+ error = None
+
+ if not username:
+ error = 'Username is required.'
+ elif not password:
+ error = 'Password is required.'
+
+ if error is not None:
+ flash(error)
+ else:
+ db = get_db()
+ db.execute(
+ 'UPDATE xuser SET xuser_username = ?, xuser_password = ?, xuser_firstname = ?, xuser_lastname = ?, xuser_email = ? WHERE xuser_id = ?',
+ [username,
+ generate_password_hash(password),
+ firstname,
+ lastname,
+ email,
+ user_id]
+ )
+ db.commit()
+ return redirect(url_for('admin.index'))
+
+ return render_template('admin/user_edit.html', user=user)
+
+
+@bp.route('/messages')
+@login_required
+def get_messages():
+ db = get_db()
+ messages = db.execute(
+ 'SELECT message_id, message_name, message_email, message_subject, message_body'
+ ' FROM message'
+ ).fetchall()
+
+ return render_template('admin/messages.html', messages=messages)
+
+@bp.route('/message_delete', methods=['POST'])
+@login_required
+def delete_message():
+ db = get_db()
+ db.execute(
+ 'DELETE FROM message WHERE message_id = ?', [request.form['message_to_delete']]
+ )
+ db.commit()
+ return redirect(url_for('admin.get_messages'))
\ No newline at end of file
--- /dev/null
+from flask import (
+ Blueprint, flash, redirect, render_template, request, url_for, session, g
+)
+from werkzeug.security import generate_password_hash, check_password_hash
+
+from flaskr.db import get_db
+import functools
+
+
+bp = Blueprint('auth', __name__, url_prefix='/auth')
+
+
+
+
+
+@bp.route('/register', methods=('GET', 'POST'))
+def register():
+ if request.method == 'POST':
+ username = request.form['username']
+ password = request.form['password']
+ firstname = request.form['firstname']
+ lastname = request.form['lastname']
+ email = request.form['email']
+ registration_code = request.form['registration_code']
+ db = get_db()
+ error = None
+
+ if not username:
+ error = 'Username is required.'
+ elif not password:
+ error = 'Password is required.'
+ elif not registration_code:
+ error = 'Registration code is required.'
+ elif not registration_code == "OpenHouseParty":
+ error = 'Invalid registration code.'
+
+ if error is None:
+ try:
+ db.execute(
+ "INSERT INTO xuser (xuser_username, xuser_password, xuser_firstname, xuser_lastname, xuser_email) VALUES (?, ?, ?, ?, ?)",
+ (username, generate_password_hash(password), firstname, lastname, email),
+ )
+ db.commit()
+ except db.IntegrityError:
+ error = f"User {username} is already registered."
+ else:
+ return redirect(url_for("auth.login"))
+
+ flash(error)
+
+ return render_template('auth/register.html')
+
+
+
+@bp.route('/login', methods=('GET', 'POST'))
+def login():
+ if request.method == 'POST':
+ username = request.form['username']
+ password = request.form['password']
+ db = get_db()
+ error = None
+ user = db.execute(
+ 'SELECT * FROM xuser WHERE xuser_username = ?', (username,)
+ ).fetchone()
+
+ if user is None:
+ error = 'Incorrect username.'
+ elif not check_password_hash(user['xuser_password'], password):
+ error = 'Incorrect password.'
+
+ if error is None:
+ session.clear()
+ session['xuser_id'] = user['xuser_id']
+ return redirect(url_for('index'))
+
+ flash(error)
+
+ return render_template('auth/login.html')
+
+
+
+@bp.before_app_request
+def load_logged_in_user():
+ user_id = session.get('xuser_id')
+
+ if user_id is None:
+ g.user = None
+ else:
+ g.user = get_db().execute(
+ 'SELECT * FROM xuser WHERE xuser_id = ?', (user_id,)
+ ).fetchone()
+
+
+@bp.route('/logout')
+def logout():
+ session.clear()
+ return redirect(url_for('index'))
+
+def login_required(view):
+ @functools.wraps(view)
+ def wrapped_view(**kwargs):
+ if g.user is None:
+ return redirect(url_for('auth.login'))
+
+ return view(**kwargs)
+
+ return wrapped_view
\ No newline at end of file
--- /dev/null
+from flask import (
+ Blueprint, flash, g, redirect, render_template, request, url_for
+)
+from werkzeug.exceptions import abort
+
+from flaskr.auth import login_required
+from flaskr.db import get_db
+import os
+
+bp = Blueprint('blog', __name__)
+
+
+@bp.route('/blog')
+def index():
+ db = get_db()
+ posts = db.execute(
+ 'SELECT p.post_id, post_title, post_body, post_shortbody, post_images, post_created, post_author_id, xuser_username'
+ ' FROM post p JOIN xuser u ON p.post_author_id = u.xuser_id'
+ ' ORDER BY post_created DESC'
+ ).fetchall()
+
+ #print("AAAAAAAAAAAAAA")
+ #print(posts[0][4])
+ #print("AAAAAAAAAAAAAA")
+ return render_template('blog/index.html', posts=posts)
+
+
+
+@bp.route('/upload/<filename>')
+def send_uploaded_file(filename=''):
+ from flask import send_from_directory
+ dirname = os.path.dirname(__file__)
+ upload_folder = os.path.join(dirname, 'upload')
+ return send_from_directory(upload_folder, filename)
+
+@bp.route('/create', methods=('GET', 'POST'))
+@login_required
+def create():
+ if request.method == 'POST':
+ #upload_folder = './flaskr/upload/'
+ #upload_folder = '//upload//'
+ dirname = os.path.dirname(__file__)
+ #print("AAAAAAAAA")
+ #print(dirname)
+ #print("AAAAAAAAA")
+ upload_folder = os.path.join(dirname, 'upload')
+ #print("BBBBBBB")
+ #print(upload_folder)
+ #print("BBBBBBB")
+
+ #upload_folder = 'c:/Users/Joseph/Documents/GitHub/openhouseparty.online/flaskr/upload'
+ #if "file1" not in request.files:
+ # return "there is no file1 in form!"
+ file1 = request.files["file1"]
+ if file1.filename != '':
+ path = os.path.join(upload_folder, file1.filename)
+ file1.save(path)
+
+ title = request.form['title']
+ body = request.form['body']
+ error = None
+ short_body = body[0:100]
+
+ if not title:
+ error = 'Title is required.'
+
+ if error is not None:
+ flash(error)
+ else:
+ db = get_db()
+ db.execute(
+ 'INSERT INTO post (post_title, post_body, post_shortbody, post_images, post_author_id)'
+ ' VALUES (?, ?, ?, ?, ?)',
+ (title, body, short_body, file1.filename, g.user['xuser_id'])
+ )
+ db.commit()
+ return redirect(url_for('blog.index'))
+
+ else:
+ title = request.form['title']
+ body = request.form['body']
+ error = None
+ short_body = body[0:100]
+
+ if not title:
+ error = 'Title is required.'
+
+ if error is not None:
+ flash(error)
+ else:
+ db = get_db()
+ db.execute(
+ 'INSERT INTO post (post_title, post_body, post_shortbody, post_author_id)'
+ ' VALUES (?, ?, ?, ?)',
+ (title, body, short_body, g.user['xuser_id'])
+ )
+ db.commit()
+ return redirect(url_for('blog.index'))
+
+
+ return render_template('blog/create.html')
+
+
+def get_post(id, check_author=True):
+ post = get_db().execute(
+ 'SELECT p.post_id, post_title, post_body, post_created, post_images, post_author_id, xuser_username'
+ ' FROM post p JOIN xuser u ON p.post_author_id = u.xuser_id'
+ ' WHERE p.post_id = ?',
+ (id,)
+ ).fetchone()
+
+ if post is None:
+ abort(404, f"Post id {id} doesn't exist.")
+
+ if check_author and post['post_author_id'] != g.user['xuser_id']:
+ abort(403)
+
+ return post
+
+
+def get_post_view(id):
+ post = get_db().execute(
+ 'SELECT p.post_id, post_title, post_body, post_created, post_images, post_author_id, xuser_username'
+ ' FROM post p JOIN xuser u ON p.post_author_id = u.xuser_id'
+ ' WHERE p.post_id = ?',
+ (id,)
+ ).fetchone()
+
+ if post is None:
+ abort(404, f"Post id {id} doesn't exist.")
+
+ return post
+
+@bp.route('/<int:id>/view', methods=('GET', 'POST'))
+def view(id):
+ post = get_post_view(id)
+
+ return render_template('blog/view_post.html', post=post)
+
+
+@bp.route('/<int:id>/update', methods=('GET', 'POST'))
+@login_required
+def update(id):
+ post = get_post(id)
+
+ if request.method == 'POST':
+ title = request.form['title']
+ body = request.form['body']
+ error = None
+ short_body = body[0:100]
+
+ if not title:
+ error = 'Title is required.'
+
+ if error is not None:
+ flash(error)
+ else:
+ db = get_db()
+ db.execute(
+ 'UPDATE post SET post_title = ?, post_shortbody = ?, post_body = ?'
+ ' WHERE post_id = ?',
+ (title, body, short_body, id)
+ )
+ db.commit()
+ return redirect(url_for('blog.index'))
+
+ return render_template('blog/update.html', post=post)
+
+
+@bp.route('/<int:id>/delete', methods=('POST',))
+@login_required
+def delete(id):
+ post = get_post(id)
+
+ dirname = os.path.dirname(__file__)
+ upload_folder = os.path.join(dirname, 'upload')
+ file_to_delete = os.path.join(upload_folder, post['post_images'])
+ os.remove(file_to_delete)
+
+
+
+ db = get_db()
+ db.execute('DELETE FROM post WHERE post_id = ?', (id,))
+ db.commit()
+ return redirect(url_for('blog.index'))
+
--- /dev/null
+
+from flask import (
+ Blueprint, flash, g, redirect, render_template, request, url_for
+)
+# import smtplib
+from flaskr.db import get_db
+
+bp = Blueprint('contact_us', __name__)
+
+#Display Data - About
+@bp.route('/contact_us', methods=['GET', 'POST'])
+def index():
+ if request.method == 'POST':
+
+ name = request.form['name']
+ email = request.form['email']
+ subject = request.form['subject']
+ body = request.form['body']
+
+ #message = "Thank you!"
+
+ #server = smtplib.SMTP("smtp.gmail.com", 587)
+ #server.starttls()
+ # set environmental variable here for password
+ #server.login('chas@gmail.com', 'password')
+ #send email from server to person who filled out the contact us form
+ #server.sendmail('chas@gmail.com', email, message)
+ error = None
+ db = get_db()
+ if not name:
+ error = 'Name is required.'
+ elif not email:
+ error = 'Email is required.'
+ elif not subject:
+ error = 'Subject is required.'
+ elif not body:
+ error = 'Message body is required.'
+
+ if error is None:
+ db.execute(
+ 'INSERT INTO message (message_name, message_email, message_subject, message_body) VALUES (?, ?, ?, ?)',
+ [name, email, subject, body]
+ )
+ db.commit()
+
+ return render_template('home.html')
+ else:
+ flash(error)
+
+
+ return render_template('contact_us.html')
+
+
+#create messages within the flaskr app: messages from people filling out contact_us form
+#add a new message to the sqlite database when a user hits submit on the web form
+#this way, we don't need to send an email from chas@gmail.com to chas@gmail.com essentially
\ No newline at end of file
--- /dev/null
+
+from flask import (
+ Blueprint, flash, g, redirect, render_template, request, url_for
+)
+from flaskr.auth import login_required
+
+bp = Blueprint('dashboard', __name__)
+
+#Display Data - Dashboard
+@bp.route('/dashboard')
+@login_required
+def index():
+ return render_template('dashboard.html')
\ No newline at end of file
--- /dev/null
+import sqlite3
+
+import click
+from flask import current_app, g
+from flask.cli import with_appcontext
+
+""" ---------------- ---------------- Database Functions ---------------- ---------------- """
+def get_db():
+ if 'db' not in g:
+ g.db = sqlite3.connect(
+ current_app.config['DATABASE'],
+ detect_types=sqlite3.PARSE_DECLTYPES
+ )
+ g.db.row_factory = sqlite3.Row
+
+ return g.db
+
+
+def close_db(e=None):
+ db = g.pop('db', None)
+
+ if db is not None:
+ db.close()
+
+
+def init_db():
+ db = get_db()
+
+ with current_app.open_resource('schema.sql') as f:
+ db.executescript(f.read().decode('utf8'))
+
+
+@click.command('init-db')
+@with_appcontext
+def init_db_command():
+ """Clear the existing data and create new tables."""
+ init_db()
+ click.echo('Initialized the database.')
+
+
+def init_app(app):
+ app.teardown_appcontext(close_db)
+ app.cli.add_command(init_db_command)
\ No newline at end of file
--- /dev/null
+import sqlite3
+
+import click
+from flask import current_app, g
+from flask.cli import with_appcontext
+
--- /dev/null
+
+from flask import (
+ Blueprint, flash, g, redirect, render_template, request, url_for
+)
+
+bp = Blueprint('faq', __name__)
+
+#Display Data - Dashboard
+@bp.route('/faq')
+def index():
+ return render_template('faq.html')
\ No newline at end of file
--- /dev/null
+
+from flask import (
+ Blueprint, flash, g, redirect, render_template, request, url_for
+)
+
+bp = Blueprint('home', __name__)
+
+#Display Data - Dashboard
+@bp.route('/')
+def index():
+ return render_template('home.html')
\ No newline at end of file
--- /dev/null
+
+from flask import (
+ Blueprint, flash, g, redirect, render_template, request, url_for
+)
+
+bp = Blueprint('resources', __name__)
+
+#Display Data - Dashboard
+@bp.route('/resources')
+def index():
+ return render_template('resources.html')
\ No newline at end of file
--- /dev/null
+--Users table
+drop table if exists user;
+create table user (
+ user_id integer primary key autoincrement,
+ user_name text unique not null,
+ user_password text not null
+);
+
+drop table if exists xuser;
+create table xuser (
+ xuser_id integer primary key autoincrement,
+ xuser_username text unique not null,
+ xuser_password text not null,
+ xuser_firstname,
+ xuser_lastname,
+ xuser_email
+);
+
+drop table if exists item;
+create table item (
+ item_id integer primary key autoincrement,
+ item_name text not null,
+ item_price numeric not null,
+ item_description text not null
+);
+
+drop table if exists message;
+create table message (
+ message_id integer primary key autoincrement,
+ message_name text not null,
+ message_email text not null,
+ message_subject text not null,
+ message_body text not null
+);
+
+drop table if exists post;
+CREATE TABLE post (
+ post_id INTEGER PRIMARY KEY AUTOINCREMENT,
+ post_author_id INTEGER NOT NULL,
+ post_created TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP,
+ post_title TEXT NOT NULL,
+ post_body TEXT NOT NULL,
+ post_shortbody TEXT NOT NULL,
+ post_images TEXT,
+ FOREIGN KEY (post_author_id) REFERENCES xuser (xuser_id)
+);
+
+
+
+
+
+--Basic info about an item
+--drop table if exists item;
+--create table item (
+-- item_id integer primary key autoincrement,
+-- item_name text,
+-- item_subtitle text,
+-- item_desc text,
+-- item_category text,
+-- item_condition text,
+-- item_conditionDesc text,
+-- item_cost numeric,
+-- item_returnPolicyDesc text,
+-- item_insertDate datetime
+--);
+
+
+--File Upload/Download Data
+drop table if exists file;
+create table file (
+ file_id integer primary key autoincrement,
+ file_name text,
+ file_path text,
+ file_size numeric,
+ file_today_date text
+);
+--Settings Data
+drop table if exists settings;
+create table settings (
+ settings_id integer primary key autoincrement,
+ settings_uploadFilePath text
+);
+
+INSERT INTO settings (settings_uploadFilePath) VALUES ('c:/Users/Joseph/Downloads/Media_Server_Upload');
+
+
+
+--Item Condition for a particular item
+drop table if exists itemCondition;
+create table itemCondition (
+ itemCondition_id integer primary key autoincrement,
+ itemCondition_name text
+);
+--Shipping info for a particular item
+drop table if exists itemShipping;
+create table itemShipping (
+ itemShipping_id integer primary key autoincrement,
+ itemShipping_method text,
+ itemShipping_weight numeric,
+ itemShipping_boxType text,
+ itemShipping_boxWidth numeric,
+ itemShipping_boxHeight numeric,
+ itemShipping_boxLength numeric,
+ itemShipping_handlingDuration datetime,
+ itemShipping_itemLocation text,
+ itemShipping_item_id integer,
+ FOREIGN KEY(itemShipping_item_id) REFERENCES item(item_id)
+);
+--Pictures for a particular item
+drop table if exists itemPicture;
+create table itemPicture (
+ itemPicture_id integer primary key autoincrement,
+ itemPicture_data blob,
+ itemPicture_caption text,
+ itemPicture_item_id integer,
+ FOREIGN KEY(itemPicture_item_id) REFERENCES item(item_id)
+);
+--Metrics for a particular item (will need to allow for adding new specs on the fly)
+drop table if exists itemSpecs;
+create table itemSpecs (
+ itemSpecs_id integer primary key autoincrement,
+ itemSpecs_name text,
+ itemSpecs_value text,
+ itemSpecs_item_id integer,
+ FOREIGN KEY(itemSpecs_item_id) REFERENCES item(item_id)
+);
+--Ebay-specific Item Data
+drop table if exists itemEbay;
+create table itemEbay (
+ itemEbay_id integer primary key autoincrement,
+ itemEbay_bid text,
+ itemEbay_buyItNow numeric,
+ itemEbay_reservePrice numeric,
+ itemEbay_fpQuantity integer,
+ itemEbay_fpBestOffer numeric,
+ itemEbay_fpMin numeric,
+ itemEbay_fpMax numeric,
+ itemEbay_duration datetime,
+ itemEbay_insertionFee numeric,
+ itemEbay_tax numeric,
+ itemEbay_item_id integer,
+ FOREIGN KEY(itemEbay_item_id) REFERENCES item(item_id)
+);
+--Table of PC Builds
+drop table if exists pcBuild;
+create table pcBuild (
+ pcBuild_id integer primary key autoincrement,
+ pcBuild_name text,
+ pcBuild_type text,
+ pcBuild_notes text,
+ pcBuild_avgPartAge numeric,
+ pcBuild_mobo_id integer,
+ pcBuild_case_id integer,
+ pcBuild_ram_id integer,
+ pcBuild_gpu_id integer,
+ pcBuild_ssd_id integer,
+ pcBuild_hdd_id integer,
+ pcBuild_cpu_id integer,
+ pcBuild_psu_id integer,
+ pcBuild_cpuCool_id integer,
+ pcBuild_fan_id integer,
+ pcBuild_ledkit_id integer,
+ pcBuild_os_id integer,
+ pcBuild_colorScheme text
+);
+--General PC Part Info
+drop table if exists pcPart;
+create table pcPart (
+ pcPart_id integer primary key autoincrement,
+ pcPart_type text,
+ pcPart_name text,
+ pcPart_modelNumber text,
+ pcPart_price numeric,
+ pcPart_desc text,
+ pcPart_brand text,
+ pcPart_condition text,
+ pcPart_notes text,
+ pcPart_age integer,
+ pcPart_pcBuild_id integer
+);
+--RAM Part-Specific Info
+drop table if exists ram;
+create table ram (
+ ram_id integer primary key autoincrement,
+ ram_kitSize text,
+ ram_stickSize integer,
+ ram_speed integer,
+ ram_type text,
+ ram_casLatency text,
+ ram_pcPart_id integer,
+ FOREIGN KEY(ram_pcPart_id) REFERENCES pcPart(pcPart_id) ON DELETE CASCADE
+);
+--Solid State Drive Part-Specific Info
+drop table if exists ssd;
+create table ssd (
+ ssd_id integer primary key autoincrement,
+ ssd_formFactor text,
+ ssd_size integer,
+ ssd_interface text,
+ ssd_pcPart_id integer,
+ FOREIGN KEY(ssd_pcPart_id) REFERENCES pcPart(pcPart_id) ON DELETE CASCADE
+);
+
+--HDD Part-Specific Info
+drop table if exists hdd;
+create table hdd (
+ hdd_id integer primary key autoincrement,
+ hdd_formFactor text,
+ hdd_size integer,
+ hdd_interface text,
+ hdd_cache integer,
+ hdd_rpm integer,
+ hdd_pcPart_id integer,
+ FOREIGN KEY(hdd_pcPart_id) REFERENCES pcPart(pcPart_id) ON DELETE CASCADE
+);
+--Case Part-Specific Info
+drop table if exists cases;
+create table cases (
+ case_id integer primary key autoincrement,
+ case_formFactor text,
+ case_width numeric,
+ case_height numeric,
+ case_length numeric,
+ case_525bay integer,
+ case_350bay integer,
+ case_250bay integer,
+ case_80fan integer,
+ case_120fan integer,
+ case_140fan integer,
+ case_240fan integer,
+ case_otherFan text,
+ case_fpSpk integer,
+ case_fpMic integer,
+ case_fpUSB3 integer,
+ case_fpUSB2 integer,
+ case_psuSlots integer,
+ case_waterSlots text,
+ case_pcPart_id integer,
+ FOREIGN KEY(case_pcPart_id) REFERENCES pcPart(pcPart_id) ON DELETE CASCADE
+);
+--Video Card Part-Specific Info
+drop table if exists gpu;
+create table gpu (
+ gpu_id integer primary key autoincrement,
+ gpu_vramType text,
+ gpu_vramSize text,
+ gpu_slotWidth text,
+ gpu_interface text,
+ gpu_6pin integer,
+ gpu_8pin integer,
+ gpu_clockSpeed numeric,
+ gpu_memClockSpeed numeric,
+ gpu_busBandwidth numeric,
+ gpu_crossfire integer,
+ gpu_sli integer,
+ gpu_pcPart_id integer,
+ FOREIGN KEY(gpu_pcPart_id) REFERENCES pcPart(pcPart_id) ON DELETE CASCADE
+);
+--Power Supply Part-Specific Info
+drop table if exists psu;
+create table psu (
+ psu_id integer primary key autoincrement,
+ psu_watt integer,
+ psu_effiency text,
+ psu_8pin integer,
+ psu_6pin integer,
+ psu_4pin integer,
+ psu_molex integer,
+ psu_sata integer,
+ psu_floppy integer,
+ psu_pcPart_id integer,
+ FOREIGN KEY(psu_pcPart_id) REFERENCES pcPart(pcPart_id) ON DELETE CASCADE
+);
+--Operating System Part-Specific Info
+drop table if exists os;
+create table os (
+ os_id integer primary key autoincrement,
+ os_type text,
+ os_bit integer,
+ os_version text,
+ os_pcPart_id integer,
+ FOREIGN KEY(os_pcPart_id) REFERENCES pcPart(pcPart_id) ON DELETE CASCADE
+);
+--CPU Cooler Part-Specific Info
+drop table if exists cpuCool;
+create table cpuCool (
+ cpuCool_id integer primary key autoincrement,
+ cpuCool_type text,
+ cpuCool_socketList text,
+ cpuCool_fanCount integer,
+ cpuCool_fanSize text,
+ cpuCool_pcPart_id integer,
+ FOREIGN KEY(cpuCool_pcPart_id) REFERENCES pcPart(pcPart_id) ON DELETE CASCADE
+);
+--Motherboard Part-Specific Info
+drop table if exists mobo;
+create table mobo (
+ mobo_id integer primary key autoincrement,
+ mobo_ramType text,
+ mobo_CPUsocket text,
+ mobo_dimmSlots integer,
+ mobo_pciSlots integer,
+ mobo_pcie16Slots integer,
+ mobo_pcie8Slots integer,
+ mobo_pcie4Slots integer,
+ mobo_pcie1Slots integer,
+ mobo_chipset text,
+ mobo_cpu4pin integer,
+ mobo_cpu8pin integer,
+ mobo_cpu6pin integer,
+ mobo_pcPart_id integer,
+ FOREIGN KEY(mobo_pcPart_id) REFERENCES pcPart(pcPart_id) ON DELETE CASCADE
+);
+--Case Fans Part-Specific Info
+drop table if exists fan;
+create table fan (
+ fan_id integer primary key autoincrement,
+ fan_size integer,
+ fan_type text,
+ fan_color text,
+ fan_pcPart_id integer,
+ FOREIGN KEY(fan_pcPart_id) REFERENCES pcPart(pcPart_id) ON DELETE CASCADE
+);
+--LED Kits Part-Specific Info
+drop table if exists ledkit;
+create table ledkit (
+ ledkit_id integer primary key autoincrement,
+ ledkit_color text,
+ ledkit_type text,
+ ledkit_notes text,
+ ledkit_pcPart_id integer,
+ FOREIGN KEY(ledkit_pcPart_id) REFERENCES pcPart(pcPart_id) ON DELETE CASCADE
+);
+--CPU Part-Specific Info
+drop table if exists cpu;
+create table cpu (
+ cpu_id integer primary key autoincrement,
+ cpu_socket text,
+ cpu_cores integer,
+ cpu_threads integer,
+ cpu_frequency numeric,
+ cpu_cache integer,
+ cpu_wattage integer,
+ cpu_pcPart_id integer,
+ FOREIGN KEY(cpu_pcPart_id) REFERENCES pcPart(pcPart_id) ON DELETE CASCADE
+);
+
+
+
+--Benchmark general data for a particular PC
+drop table if exists pcBenchmark;
+create table pcBenchmark (
+ pcBenchmark_id integer primary key autoincrement,
+ pcBenchmark_notes text,
+ pcBenchmark_score text,
+ pcBenchmark_fps text,
+ pcBenchmark_pcBuild_id integer,
+ FOREIGN KEY(pcBenchmark_pcBuild_id) REFERENCES pcBuild(pcBuild_id)
+);
+
+--Picture storage for a particular PC's benchmarks
+drop table if exists pcBenchmarkPictures;
+create table pcBenchmarkPictures (
+ pcBenchmarkPictures_id integer primary key autoincrement,
+ pcBenchmarkPictures_data blob,
+ pcBenchmarkPictures_pcBenchmark_id integer,
+ FOREIGN KEY(pcBenchmarkPictures_pcBenchmark_id) REFERENCES pcBenchmark(pcBenchmark_id)
+);
+
+--List of applications / games available for selection
+drop table if exists benchmarkAppList;
+create table benchmarkAppList (
+ benchmarkAppList_id integer primary key autoincrement,
+ --Type: either game or non-game
+ benchmarkAppList_type text,
+ benchmarkAppList_name text,
+ benchmarkAppList_desc text
+);
+
+
+
+INSERT INTO user
+ (user_name,
+ user_password)
+ VALUES ("admin",
+ "testing");
+/* INSERT INTO pcPart
+ (pcPart_type,
+ pcPart_name,
+ pcPart_modelNumber)
+ VALUES ("psu",
+ "Antec 500W",
+ "AN500W");
+INSERT INTO psu
+ (psu_watt,
+ psu_effiency,
+ psu_pcPart_id)
+ VALUES (500,
+ "80plus",
+ 1);
+
+
+INSERT INTO pcPart
+ (pcPart_type,
+ pcPart_name,
+ pcPart_modelNumber)
+ VALUES ("psu",
+ "Thermaltake 750W",
+ "TT750W");
+INSERT INTO psu
+ (psu_watt,
+ psu_effiency,
+ psu_pcPart_id)
+ VALUES (750,
+ "titanium",
+ 2);
+
+INSERT INTO pcBuild
+ (pcBuild_name,
+ pcBuild_type,
+ pcBuild_ssd_id)
+ VALUES ("Test PC Build",
+ "Gaming",
+ 1); */
+
+
\ No newline at end of file
--- /dev/null
+
+from flask import (
+ Blueprint, flash, g, redirect, render_template, request, url_for
+)
+
+bp = Blueprint('services', __name__)
+
+#Display Data - About
+@bp.route('/services')
+def index():
+ return render_template('services.html')
\ No newline at end of file
--- /dev/null
+/* html { font-family: sans-serif; background: #eee; padding: 1rem; } */
+html { font-family: sans-serif; background: white; padding: 1rem; }
+/* body { max-width: 960px; margin: 0 auto; background: white; } */
+body { max-width: 90%; margin: 0 auto; }
+/* h1 { font-family: serif; color: #377ba8; margin: 1rem 0; } */
+h1 { font-family: serif; color: black; margin: 1rem 0; }
+/* a { color: #377ba8; } */
+a { color: black; }
+hr { border: none; border-top: 1px solid lightgray; }
+/* nav { background: lightgray; display: flex; align-items: center; padding: 0 0.5rem; } */
+nav { background: white; display: flex; align-items: center; padding: 0 0.5rem; }
+
+nav h1 { flex: auto; margin: 0; }
+nav h1 a { text-decoration: none; padding: 0.25rem 0.5rem; }
+nav ul { display: flex; list-style: none; margin: 0; padding: 0; }
+nav ul li a, nav ul li span, header .action { display: block; padding: 0.5rem; }
+.content { padding: 0 1rem 1rem; }
+.content > header { border-bottom: 1px solid lightgray; display: flex; align-items: flex-end; }
+.content > header h1 { flex: auto; margin: 1rem 0 0.25rem 0; }
+.flash { margin: 1em 0; padding: 1em; background: #cae6f6; border: 1px solid #377ba8; }
+.post { width: 50%; margin-left: 25%;}
+.post > header { display: flex; align-items: flex-end; font-size: 0.85em; }
+.post > header > div:first-of-type { flex: auto; }
+.post > header h1 { font-size: 1.5em; margin-bottom: 0; }
+.post .about { color: slategray; font-style: italic; }
+.post .body { white-space: pre-line; }
+.content:last-child { margin-bottom: 0; }
+.content form { margin: 1em 0; display: flex; flex-direction: column; }
+.content label { font-weight: bold; margin-bottom: 0.5em; }
+.content input, .content textarea { margin-bottom: 1em; }
+.content textarea { min-height: 12em; resize: vertical; }
+input.danger { color: #cc2f2e; }
+input[type=submit] { align-self: start; min-width: 10em; }
+.bottom { background: white; display: flex; align-items: center; padding: 0 0.5rem; }
+
+.post2 { width: 25%; margin-left: 25%;}
+p2 {background-color: none; color: black; font-size: 25px; margin-left: 35%; }
+p3 {background-color: none; color: black; font-size: 25px; margin-left: 20%; }
+
+.center {
+ display: block;
+ margin-left: auto;
+ margin-right: auto;
+}
+
+.mainX {
+ display: block;
+ height: 650px;
+ align-items: center;
+}
+.mainX .main_left {
+ float: left;
+ width: 550px;
+ height: 600px;
+
+}
+
+.mainX .main_left2 {
+ float: left;
+ width: 400px;
+ height: 600px;
+ background: black;
+ color: orange;
+ text-align: center;
+ padding-left: 50px;
+ padding-right: 50px;
+}
+.mainX .main_left2 .fontSizeX {
+ font-size: 30px;
+}
+
+.mainX .main_left3 {
+ float: left;
+ width: 550px;
+ height: 600px;
+ overflow: hidden;
+}
+
+
+.homeX {
+ background-image: url("/static/home_party_house_kit.png");
+ background-repeat: no-repeat;
+
+
+}
+.homeX2 {
+ height: 600px;
+}
+
+/*
+.mainX .main_left {
+ display: block;
+ margin-left: auto;
+}
+
+.mainX .main_right {
+ display: block;
+ margin-right: auto;
+}
+*/
+
+/* The dropdown container */
+.dropdown {
+ float: left;
+ overflow: hidden;
+}
+
+/* Dropdown button */
+.dropdown .dropbtn {
+ font-size: 16px;
+ border: none;
+ outline: none;
+ color: white;
+ padding: 14px 16px;
+ background-color: inherit;
+ font-family: inherit; /* Important for vertical align on mobile phones */
+ margin: 0; /* Important for vertical align on mobile phones */
+}
+
+/* Dropdown content (hidden by default) */
+.dropdown-content {
+ display: none;
+ position: absolute;
+ background-color: #f9f9f9;
+ min-width: 160px;
+ box-shadow: 0px 8px 16px 0px rgba(0,0,0,0.2);
+ z-index: 1;
+}
+
+/* Links inside the dropdown */
+.dropdown-content a {
+ float: none;
+ color: black;
+ padding: 12px 16px;
+ text-decoration: none;
+ display: block;
+ text-align: left;
+}
+
+/* Add a grey background color to dropdown links on hover */
+.dropdown-content a:hover {
+ background-color: #ddd;
+}
+
+/* Show the dropdown menu on hover */
+.dropdown:hover .dropdown-content {
+ display: block;
+}
\ No newline at end of file
--- /dev/null
+
+from flask import (
+ Blueprint, flash, g, redirect, render_template, request, url_for
+)
+
+bp = Blueprint('store', __name__)
+
+#Display Data - Dashboard
+@bp.route('/store')
+def index():
+ return render_template('store.html')
\ No newline at end of file
--- /dev/null
+
+from flask import (
+ Blueprint, flash, g, redirect, render_template, request, url_for
+)
+
+bp = Blueprint('support', __name__)
+
+#Display Data - Support
+@bp.route('/support')
+def index():
+ return render_template('support.html')
\ No newline at end of file
--- /dev/null
+{% extends 'base.html' %}
+
+{% block header %}
+ <h1>{% block title %}About{% endblock %}</h1>
+{% endblock %}
+
+
+{% block content %}
+<section class="post">
+Charles Murillo is an Engineer by profession.
+</br>
+</br>
+He obtained his Degree at Michigan Technological University in 2017,
+and a power certificate along with a certificate in Fannuc Robotics
+which he obtained at the Northwest State Community College.
+</br>
+<img alt="Chas" src="\static\chas_portrait.png" width="281" height="337">
+</br>
+Realizing that the cost of living and debt levels are putting pressure on
+many people to compete with one another for more from life,
+Chas wants to take the junk/plastic life throws at him that’s over
+produced by society and put it into developing his replicable machinery
+for creating sustainable housing to mend people’s insecurities.
+</br>
+</br>
+</br>
+</br>
+</br>
+<b>The Birth of OpenHouseParty</b>
+</br>
+</br>
+Charles Murillo was able to witness the struggles of many ordinary people in having a
+decent house to live in or paying in their monthly rent. Moreover, he is aware that today’s
+modern way life is making more families to have less time together.
+</br>
+</br>
+These observations prompted him to create OpenHouseParty to give hope to families and individuals
+who are struggling to have proper homes as well as to provide the opportunity for families to bond together.
+</br>
+</br>
+The cost of each miniature design is affordable and made available to everyone because it is open-source.
+This project also encourages everyone to contribute and share their expertise to make the project better and more useful.
+</br>
+</br>
+OpenHouseParty aims to help people have stable housing at a very affordable cost.
+</br>
+</section>
+{% endblock %}
--- /dev/null
+{% extends "base.html" %}
+{% block content %}
+ <h1>Admin Panel</h1>
+ </br>
+ <h1><a href="{{ url_for('admin.get_users') }}">User List</a></h1>
+ <h1><a href="{{ url_for('admin.get_messages') }}">Messages</a></h1>
+{% endblock %}
\ No newline at end of file
--- /dev/null
+{% extends "base.html" %}
+{% block content %}
+ <h1><a href="{{ url_for('admin.index') }}">Admin Panel</a></h1>
+ <h1>Messages</h1>
+ </br>
+ {% for message in messages %}
+ <dl>
+ <dt>
+ <b>Person's Name:</b> {{ message.message_name }}
+ </br><b>Person's Email Address:</b> {{ message.message_email }}
+ </br><b>Message Subject:</b> {{ message.message_subject }}
+ </br><b>Message Body:</b></br> {{ message.message_body }}
+ <form action="{{ url_for('admin.delete_message') }}" method=post class=add-item>
+ <input type=hidden name=message_to_delete value="{{ message.message_id }}"></input>
+ <input type=submit value="Delete"></input>
+ </form>
+ </dt>
+ </dl>
+ {% endfor %}
+ </br>
+{% endblock %}
\ No newline at end of file
--- /dev/null
+{% extends "base.html" %}
+
+{% block header %}
+ <h1>{% block title %}Edit User {{ user['xuser_id'] }}{% endblock %}</h1>
+{% endblock %}
+
+{% block content %}
+ <form method="post">
+ <label for="username">Username</label>
+ <input name="username" id="username" value="{{ request.form['username'] or user['xuser_username'] }}" required>
+ <label for="password">Password</label>
+ <input name="password" id="password" type="password" value="{{ request.form['password'] or user['xuser_password'] }}" required>
+ <label for="email">Email</label>
+ <input name="email" id="email" value="{{ request.form['email'] or user['xuser_email'] }}">
+ <label for="firstname">First Name:</label>
+ <input name="firstname" id="firstname" value="{{ request.form['firstname'] or user['xuser_firstname'] }}">
+ <label for="lastname">Last Name:</label>
+ <input name="lastname" id="lastname" value="{{ request.form['lastname'] or user['xuser_lastname'] }}">
+ <input type="submit" value="Submit">
+ </form>
+{% endblock %}
\ No newline at end of file
--- /dev/null
+{% extends "base.html" %}
+{% block content %}
+ <h1><a href="{{ url_for('admin.index') }}">Admin Panel</a></h1>
+ <h1>User List</h1>
+ </br>
+ {% for user in users %}
+ <dl>
+ <dt>
+ <b>User Name:</b> {{ user.xuser_username }}
+ <form action="{{ url_for('admin.delete_user') }}" method=post class=add-item>
+ <input type=hidden name=user_to_delete value="{{ user.xuser_id }}"></input>
+ <input type=submit value="Delete"></input>
+ </form>
+ <form action="{{ url_for('admin.update_user', user_id=user['xuser_id']) }}" method=get class=add-item>
+ <input type=hidden name=user_to_edit value="{{ user.xuser_id }}"></input>
+ <input type=submit value="Edit"></input>
+ </form>
+ </dt>
+ </dl>
+ {% endfor %}
+ </br>
+{% endblock %}
\ No newline at end of file
--- /dev/null
+{% extends 'base.html' %}
+
+{% block header %}
+ <h1>{% block title %}Log In{% endblock %}</h1>
+{% endblock %}
+
+{% block content %}
+<section class="post2">
+ <form method="post">
+ <label for="username">Username</label>
+ <input name="username" id="username" required>
+ <label for="password">Password</label>
+ <input type="password" name="password" id="password" required>
+ <input type="submit" value="Log In">
+ </form>
+</section>
+{% endblock %}
\ No newline at end of file
--- /dev/null
+{% extends 'base.html' %}
+
+{% block header %}
+ <h1>{% block title %}Register{% endblock %}</h1>
+{% endblock %}
+
+{% block content %}
+<section class="post2">
+ <form method="post">
+ <label for="username">Username</label>
+ <input name="username" id="username" required>
+ <label for="password">Password</label>
+ <input type="password" name="password" id="password" required>
+ <label for="firstname">First Name</label>
+ <input name="firstname" id="firstname">
+ <label for="lastname">Last Name</label>
+ <input name="lastname" id="lastname">
+ <label for="email">E-Mail Address</label>
+ <input name="email" id="email">
+ <label for="registration_code">Registration Code</label>
+ <input name="registration_code" id="registration_code">
+ <input type="submit" value="Register">
+ </form>
+</section>
+{% endblock %}
\ No newline at end of file
--- /dev/null
+<!doctype html>
+<title>{% block title %}{% endblock %}</title>
+<link rel="stylesheet" href="{{ url_for('static', filename='style.css') }}">
+<img src="\static\houseparty.png" alt="Site Logo" width="100" height="100">
+<nav>
+ <h1>Open House Party</h1>
+ <head>
+ <style>
+ ul {
+ list-style-type: none;
+ margin: 0;
+ padding: 0;
+ }
+ ul2 {
+ list-style-type: none;
+ margin: 50;
+ padding: 50;
+ }
+ li a:hover {
+ background-color: #111;
+ color: white;
+ }
+ </style>
+ </head>
+
+ <body>
+ <ul>
+ {% if g.user %}
+ <li><a href="{{ url_for('dashboard.index') }}">Dashboard</a></li>
+ <li><a href="{{ url_for('home.index') }}">Home</a></li>
+ <li><a href="{{ url_for('blog.index') }}">Blog</a></li>
+ <li><a href="{{ url_for('about.index') }}">About</a></li>
+ <li><a href="{{ url_for('contact_us.index') }}">Contact Us</a></li>
+ <li><a href="{{ url_for('services.index') }}">Services</a></li>
+ <li><a href="{{ url_for('testimonials.index') }}">Testimonials</a></li>
+ <li><a href="{{ url_for('store.index') }}">Store</a></li>
+ <li><a href="{{ url_for('support.index') }}">Support</a></li>
+ {% else %}
+ <li><a href="{{ url_for('home.index') }}">Home</a></li>
+ <li><a href="{{ url_for('blog.index') }}">Blog</a></li>
+ <li><a href="{{ url_for('about.index') }}">About</a></li>
+ <li><a href="{{ url_for('contact_us.index') }}">Contact Us</a></li>
+ <li><a href="{{ url_for('services.index') }}">Services</a></li>
+ <li><a href="{{ url_for('testimonials.index') }}">Testimonials</a></li>
+ <li><a href="{{ url_for('store.index') }}">Store</a></li>
+ <li><a href="{{ url_for('support.index') }}">Support</a></li>
+ {% endif %}
+
+ </ul>
+ <div class="dropdown">
+ <button class=dropbtn">More
+ <i class="fa fa-caret-down"></i>
+ </button>
+ <div class="dropdown-content">
+ <a href="{{ url_for('faq.index') }}">FAQ</a>
+ <a href="{{ url_for('resources.index') }}">Resources</a>
+ </div>
+ </div>
+ </body>
+
+ <ul>
+ {% if g.user %}
+ <li><span>{{ g.user['xuser_username'] }}</span>
+ <li><a href="{{ url_for('auth.logout') }}">Log Out</a>
+ {% else %}
+ <li><a href="{{ url_for('auth.register') }}">Register</a>
+ <li><a href="{{ url_for('auth.login') }}">Log In</a>
+ {% endif %}
+ </ul>
+</nav>
+
+
+<section class="content">
+ <header>
+ {% block header %}{% endblock %}
+ </header>
+
+ {% for message in get_flashed_messages() %}
+ <div class="flash">{{ message }}</div>
+ {% endfor %}
+ {% block content %}{% endblock %}
+</section>
+<section class="bottom">
+ <ul>
+ <dt>Address: 6 Bellwood Drive Holland, Michigan 49423 United States
+ <dt>Phone Number: (616) 422-1226
+ <dt>E-Mail: openhousepartybychasmurillo@gmail.com
+ </ul>
+ <ul2>
+ <li>
+
+
+
+
+ <a href="https://www.facebook.com/openhousepartybychasmurillo">
+ <img alt="Facebook" src="\static\facebook_icon.png" width="50" height="50">
+ </a>
+ <a href="https://www.twitter.com/HouseParty_Chas">
+ <img alt="Twitter" src="\static\twitter_icon.png" width="50" height="50">
+ </a>
+ <a href="https://www.youtube.com/channel/UCD1uS5BGUauOoQKWM9WqlEQ">
+ <img alt="YouTube" src="\static\youtube_icon.png" width="50" height="50">
+ </a>
+ <a href="https://www.pinterest.ph/openhousepartybychasmurillo">
+ <img alt="Pinterest" src="\static\pinterest_icon.png" width="50" height="50">
+ </a>
+ <a href="https://www.instagram.com/openhousepartybychasmurillo">
+ <img alt="Instagram" src="\static\instagram_icon.png" width="50" height="50">
+ </a>
+ </li>
+ </ul2>
+</section>
\ No newline at end of file
--- /dev/null
+{% extends 'base.html' %}
+
+{% block header %}
+ <h1>{% block title %}New Post{% endblock %}</h1>
+{% endblock %}
+{% block content %}
+ <form method="post" enctype="multipart/form-data">
+ <label for="title">Title</label>
+ <input name="title" id="title" value="{{ request.form['title'] }}" required>
+ <label for="body">Body</label>
+ <textarea name="body" id="body">{{ request.form['body'] }}</textarea>
+ <label for="file1">Photos</label>
+ Browse… <input type="file" id="file1" name="file1">
+ <input type="submit" value="Save">
+ </form>
+{% endblock %}
\ No newline at end of file
--- /dev/null
+{% extends 'base.html' %}
+
+{% block header %}
+ <h1>{% block title %}Posts{% endblock %}</h1>
+ {% if g.user %}
+ <a class="action" href="{{ url_for('blog.create') }}">New</a>
+ {% endif %}
+{% endblock %}
+
+{% block content %}
+ {% for post in posts %}
+ <article class="post">
+ <header>
+ <div>
+ <h1><a class="action" href="{{ url_for('blog.view', id=post['post_id']) }}">{{ post['post_title'] }}</a></h1>
+ <div class="about">by {{ post['xuser_username'] }} on {{ post['post_created'].strftime('%Y-%m-%d') }}</div>
+ </div>
+ {% if g.user['xuser_id'] == post['post_author_id'] %}
+ <a class="action" href="{{ url_for('blog.update', id=post['post_id']) }}">Edit</a>
+ {% endif %}
+ </header>
+ {% if post['post_images'] != None %}
+ <img src="{{url_for('blog.send_uploaded_file', filename=post['post_images']) }}" width="25%" height="25%"/>
+ {% endif %}
+ <p class="body">{{ post['post_shortbody'] }}</p>
+ </article>
+ {% if not loop.last %}
+ <hr>
+ {% endif %}
+ {% endfor %}
+{% endblock %}
\ No newline at end of file
--- /dev/null
+{% extends 'base.html' %}
+
+{% block header %}
+ <h1>{% block title %}Edit "{{ post['post_title'] }}"{% endblock %}</h1>
+{% endblock %}
+
+{% block content %}
+ <form method="post">
+ <label for="title">Title</label>
+ <input name="title" id="title"
+ value="{{ request.form['title'] or post['post_title'] }}" required>
+ <label for="body">Body</label>
+ <textarea name="body" id="body">{{ request.form['body'] or post['post_body'] }}</textarea>
+ <input type="submit" value="Save">
+ </form>
+ <hr>
+ <form action="{{ url_for('blog.delete', id=post['post_id']) }}" method="post">
+ <input class="danger" type="submit" value="Delete" onclick="return confirm('Are you sure?');">
+ </form>
+{% endblock %}
\ No newline at end of file
--- /dev/null
+{% extends 'base.html' %}
+
+{% block header %}
+ <h1>{% block title %}Post{% endblock %}</h1>
+{% endblock %}
+
+{% block content %}
+ <article class="post">
+ <header>
+ <div>
+ <h1>{{ post['post_title'] }}</h1>
+ <div class="about">by {{ post['xuser_username'] }} on {{ post['post_created'].strftime('%Y-%m-%d') }}</div>
+ </div>
+ {% if g.user['xuser_id'] == post['post_author_id'] %}
+ <a class="action" href="{{ url_for('blog.update', id=post['post_id']) }}">Edit</a>
+ {% endif %}
+ </header>
+ <img src="{{url_for('blog.send_uploaded_file', filename=post['post_images']) }}" width="45%" height="45%" />
+ <p class="body">{{ post['post_body'] }}</p>
+ </article>
+{% endblock %}
\ No newline at end of file
--- /dev/null
+{% extends 'base.html' %}
+
+{% block header %}
+ <h1>{% block title %}Contact Us{% endblock %}</h1>
+{% endblock %}
+
+{% block content %}
+<section class="post">
+ <form method="post">
+ <label for="name">Name</label>
+ <input name="name" id="name" value="{{ request.form['name'] }}" required>
+ <label for="email">Email</label>
+ <input name="email" id="email" value="{{ request.form['email'] }}" required>
+ <label for="subject">Subject</label>
+ <input name="subject" id="subject" value="{{ request.form['subject'] }}" required>
+ <label for="body">Body</label>
+ <textarea name="body" id="body">{{ request.form['body'] }}</textarea>
+ <input type="submit" value="Submit">
+ </form>
+</section>
+{% endblock %}
\ No newline at end of file
--- /dev/null
+{% extends "base.html" %}
+{% block header %}
+ <h1>{% block title %}Dashboard{% endblock %}</h1>
+{% endblock %}
+{% block content %}
+<b>Landing Page</b>
+<em>Welcome to the dashboard!</em>
+</br>
+</br>
+<a href="{{ url_for('admin.index') }}">Visit Admin Panel</a>
+</br>
+</br>
+{% endblock %}
\ No newline at end of file
--- /dev/null
+{% extends "base.html" %}
+{% block header %}
+ <h1>{% block title %}Frequently Asked Questions{% endblock %}</h1>
+{% endblock %}
+{% block content %}
+</br>
+
+</br>
+</br>
+
+</br>
+</br>
+
+</br>
+</br>
+
+</br>
+</br>
+</br>
+</br>
+{% endblock %}
\ No newline at end of file
--- /dev/null
+{% extends "base.html" %}
+{% block header %}
+ <h1>{% block title %}Home{% endblock %}</h1>
+{% endblock %}
+{% block content %}
+<p2>
+ Create Your Dream Home!
+</p2>
+ </br>
+<p3>
+ Empowering people to create their dream home with the OpenHouseParty! kit.
+</p3>
+ </br>
+
+<div class="homeX">
+ <div class="homeX2">
+
+ <!-- <b>Landing Page</b> -->
+ </br>
+ <!--<em>Welcome to OpenHouseParty!</em> -->
+ </br>
+
+ </br>
+ <!-- <img alt="Home Kit" src="static\home_party_house_kit.png" width="948" height="295" class="center"> -->
+ </br>
+ </br>
+ <!-- <img alt="Sample House 1" src="static\home_sampleHouse1.png" width="806" height="546" class="center"> -->
+ </br>
+ </br>
+ </div>
+
+ <div class="mainX">
+ <div class="main_left">
+ <!-- original width=582 height=632 -->
+ <img alt="Winter Trees" src="\static\winter_trees.png" width="523" height="568">
+ </div>
+ <div class="main_left2">
+ <div class="fontSizeX">
+ <b>More About Our Workshop</b>
+ </div>
+ </br>
+ </br>
+ HouseParty! is the home owner's starter kit for an evolving selection of cool toys and
+ mods to be implemented in your own home. Our selection is affordable, appropriate, and awesome!
+ </br>
+ </br>
+ We believe that your home should reflect your own personal style.
+ Each corner of your life should be eye-catching and unique, just like you.
+ Charles Murillo is at your service to create a home owning experience that
+ you may create with your family. He is dedicated to helping clients discover their
+ own design personality utilizing appropriate technology. Browse through our
+ wide selection today to find just what you have been searching for.
+ </div>
+ <div class="main_left3">
+ <!-- original width=574 height=634 -->
+ <img alt="Sample House 2" src="\static\home_sampleHouse2.png" width="459" height="507">
+ </div>
+ </div>
+ <!--
+ <div class="mainX">
+ <div class="main_left">
+ <img alt="Winter Trees" src="\static\winter_trees.png" width="582" height="632" class="main_left">
+ </div>
+ <div id="text">
+ HouseParty! is the home owner's starter kit for an evolving selection of cool toys and
+ mods to be implemented in your own home. Our selection is affordable, appropriate, and awesome!
+ </div>
+ <div class="main_right">
+ <img alt="Sample House 2" src="\static\home_sampleHouse2.png" width="574" height="634" class="main_right">
+ </div>
+ </div>
+ -->
+ </br>
+
+ </br>
+ </br>
+ </br>
+ </br>
+</div>
+{% endblock %}
\ No newline at end of file
--- /dev/null
+{% extends "base.html" %}
+{% block header %}
+ <h1>{% block title %}Resources{% endblock %}</h1>
+{% endblock %}
+{% block content %}
+</br>
+<b>Useful References/Citations:</b>
+</br>
+</br>
+https://wiki.freecadweb.org/Wikihouse_porting_tutorial
+</br>
+</br>
+https://issuu.com/josesanchez010/docs/turner_travis_arch793_book
+</br>
+</br>
+https://issuu.com/josesanchez010/docs/wikihouse_xyshen_spread
+</br>
+</br>
+https://issuu.com/studiobiomorphis/docs/wiki_assembly_v3_issuu
+</br>
+</br>
+{% endblock %}
\ No newline at end of file
--- /dev/null
+{% extends 'base.html' %}
+
+{% block header %}
+ <h1>{% block title %}Services{% endblock %}</h1>
+{% endblock %}
+
+{% block content %}
+<section class="post">
+<b>Modular Toy Construction</b>
+</br>
+<img alt="Modular Toy Construction" src="\static\modular_toy_construction.png" width="162" height="116">
+</br>
+</br>
+<b>CNC Machine Works</b>
+</br>
+<img alt="CNC Machine Works" src="\static\cnc_machine_works.png" width="162" height="116">
+</br>
+</br>
+<b>Plastic Recycling</b>
+</br>
+<img alt="Plastic Recycling" src="\static\plastic_recycling.png" width="162" height="116">
+</br>
+</br>
+<b>Repurposing of 3D Printing</b>
+</br>
+<img alt="Repurposing of 3D Printing" src="\static\repurposing_of_3d_printing.png" width="162" height="116">
+</br>
+</br>
+</section>
+{% endblock %}
\ No newline at end of file
--- /dev/null
+{% extends "base.html" %}
+{% block header %}
+ <h1>{% block title %}Store{% endblock %}</h1>
+{% endblock %}
+{% block content %}
+</br>
+
+</br>
+</br>
+
+</br>
+</br>
+
+</br>
+</br>
+
+</br>
+</br>
+</br>
+</br>
+{% endblock %}
\ No newline at end of file
--- /dev/null
+{% extends 'base.html' %}
+
+{% block header %}
+ <h1>{% block title %}Support Us{% endblock %}</h1>
+{% endblock %}
+
+
+{% block content %}
+</br>
+<a href="https://www.paypal.com/donate/?business=SXCMGTXGEY7R6&no_recurring=0&item_name=Open+House+Party¤cy_code=USD">Donate via PayPal</a>
+</br>
+</br>
+<a href="https://youtube.com/channel/UCD1uS5BGUauOoQKWM9WqlEQ">Open House Party Youtube Channel</a>
+</br>
+</br>
+<a href="https://www.openhouseparty.online">Open House Party Wix Site</a>
+
+
+
+
+
+{% endblock %}
--- /dev/null
+{% extends 'base.html' %}
+
+{% block header %}
+ <h1>{% block title %}Testimonials{% endblock %}</h1>
+{% endblock %}
+
+{% block content %}
+<section class="post">
+</br>
+</br>
+<img alt="Elsa Jones" src="static\elsa_jones.png" width="199" height="200">
+</br>
+<b>Elsa Jones</b>
+</br>
+</br>
+The entire family had a great time building a miniature home!
+And yes, the kids put down their gadget because of this. I would definitely recommend the WikiHouse Kit.
+</br>
+</br>
+</br>
+</br>
+<img alt="Monique Whitehouse" src="static\monique_whitehouse.png" width="198" height="197">
+</br>
+<b>Monique Whitehouse</b>
+</br>
+</br>
+I'm not a crafty person and I was hesitant to buy the Seed Eco-home Kit but I wanted to see
+how a sustainable house would look like. It was a good decision to purchase one. It's so easy to assemble too!
+</br>
+</br>
+</br>
+</br>
+<img alt="Brian Fleming" src="static\brian_fleming.png" width="200" height="198">
+</br>
+<b>Brian Fleming</b>
+</br>
+</br>
+I've always been a fan of toy cars. I actually have a collection of cars since I was small.
+But this Tobby Toy Car kit is totally different because I get to experience how to put it together. Thanks OpenHouseParty!
+</br>
+</br>
+</br>
+</br>
+</section>
+{% endblock %}
\ No newline at end of file
--- /dev/null
+
+from flask import (
+ Blueprint, flash, g, redirect, render_template, request, url_for
+)
+
+bp = Blueprint('testimonials', __name__)
+
+#Display Data - About
+@bp.route('/testimonials')
+def index():
+ return render_template('testimonials.html')
\ No newline at end of file
--- /dev/null
+Metadata-Version: 1.0
+Name: flaskrOpenHousePartyWebsite
+Version: 1.0.0
+Summary: UNKNOWN
+Home-page: UNKNOWN
+Author: UNKNOWN
+Author-email: UNKNOWN
+License: UNKNOWN
+Description: UNKNOWN
+Platform: UNKNOWN
--- /dev/null
+MANIFEST.in
+setup.py
+flaskrOpenHousePartyWebsite.egg-info/PKG-INFO
+flaskrOpenHousePartyWebsite.egg-info/SOURCES.txt
+flaskrOpenHousePartyWebsite.egg-info/dependency_links.txt
+flaskrOpenHousePartyWebsite.egg-info/requires.txt
+flaskrOpenHousePartyWebsite.egg-info/top_level.txt
\ No newline at end of file
--- /dev/null
+Metadata-Version: 1.0
+Name: flaskr-Open-House-Party-website
+Version: 1.0.0
+Summary: UNKNOWN
+Home-page: UNKNOWN
+Author: UNKNOWN
+Author-email: UNKNOWN
+License: UNKNOWN
+Description: UNKNOWN
+Platform: UNKNOWN
--- /dev/null
+MANIFEST.in
+setup.py
+flaskr_Open_House_Party_website.egg-info/PKG-INFO
+flaskr_Open_House_Party_website.egg-info/SOURCES.txt
+flaskr_Open_House_Party_website.egg-info/dependency_links.txt
+flaskr_Open_House_Party_website.egg-info/requires.txt
+flaskr_Open_House_Party_website.egg-info/top_level.txt
\ No newline at end of file
</section>
<section class="bottom">
<ul>
- <dt>Address: 22278 County Road V, Archbold, Ohio 43502 United States
+ <dt>Address: 6 Bellwood Drive Holland, Michigan 49423 United States
<dt>Phone Number: (616) 422-1226
<dt>E-Mail: openhousepartybychasmurillo@gmail.com
</ul>
--- /dev/null
+Metadata-Version: 1.0
+Name: flaskrOpenHousePartyWebsite
+Version: 1.0.2
+Summary: UNKNOWN
+Home-page: UNKNOWN
+Author: UNKNOWN
+Author-email: UNKNOWN
+License: UNKNOWN
+Description: UNKNOWN
+Platform: UNKNOWN
--- /dev/null
+MANIFEST.in
+setup.py
+flaskr/__init__.py
+flaskr/about.py
+flaskr/admin.py
+flaskr/auth.py
+flaskr/blog.py
+flaskr/contact_us.py
+flaskr/dashboard.py
+flaskr/db.py
+flaskr/db2.py
+flaskr/faq.py
+flaskr/home.py
+flaskr/resources.py
+flaskr/schema.sql
+flaskr/services.py
+flaskr/store.py
+flaskr/support.py
+flaskr/testimonials.py
+flaskrOpenHousePartyWebsite.egg-info/PKG-INFO
+flaskrOpenHousePartyWebsite.egg-info/SOURCES.txt
+flaskrOpenHousePartyWebsite.egg-info/dependency_links.txt
+flaskrOpenHousePartyWebsite.egg-info/requires.txt
+flaskrOpenHousePartyWebsite.egg-info/top_level.txt
+flaskr/static/breaking_the_law.png
+flaskr/static/brian_fleming.png
+flaskr/static/chas_portrait.png
+flaskr/static/cnc_machine_works.png
+flaskr/static/elsa_jones.png
+flaskr/static/facebook_icon.png
+flaskr/static/home_party_house_kit.png
+flaskr/static/home_sampleHouse1.png
+flaskr/static/home_sampleHouse2.png
+flaskr/static/houseparty.png
+flaskr/static/instagram_icon.png
+flaskr/static/microhouse.png
+flaskr/static/modular_toy_construction.png
+flaskr/static/monique_whitehouse.png
+flaskr/static/pinterest_icon.png
+flaskr/static/plastic_recycling.png
+flaskr/static/repurposing_of_3d_printing.png
+flaskr/static/style.css
+flaskr/static/twitter_icon.png
+flaskr/static/winter_trees.png
+flaskr/static/youtube_icon.png
+flaskr/templates/about.html
+flaskr/templates/base.html
+flaskr/templates/contact_us.html
+flaskr/templates/dashboard.html
+flaskr/templates/faq.html
+flaskr/templates/home.html
+flaskr/templates/resources.html
+flaskr/templates/services.html
+flaskr/templates/store.html
+flaskr/templates/support.html
+flaskr/templates/testimonials.html
+flaskr/templates/admin/admin.html
+flaskr/templates/admin/messages.html
+flaskr/templates/admin/user_edit.html
+flaskr/templates/admin/user_list.html
+flaskr/templates/auth/login.html
+flaskr/templates/auth/register.html
+flaskr/templates/blog/create.html
+flaskr/templates/blog/index.html
+flaskr/templates/blog/update.html
+flaskr/templates/blog/view_post.html
+flaskr/upload/IMG_0524.JPG
+flaskr/upload/breaking_the_law.png
+flaskr/upload/microhouse.png
\ No newline at end of file
--- /dev/null
+from setuptools import find_packages, setup
+
+setup(
+ name='flaskrOpenHousePartyWebsite',
+ version='1.0.2',
+ packages=find_packages(),
+ include_package_data=True,
+ install_requires=[
+ 'flask',
+ ],
+)
\ No newline at end of file