Initial commit - landing page and roughing out

main
ookjosh 2025-10-28 22:35:16 -06:00
commit 6c6a0190e0
33 changed files with 756 additions and 0 deletions

140
.gitignore vendored 100644
View File

@ -0,0 +1,140 @@
# Django #
*.log
*.pot
*.pyc
__pycache__
db.sqlite3
media
# Backup files #
*.bak
# If you are using PyCharm #
# User-specific stuff
.idea/**/workspace.xml
.idea/**/tasks.xml
.idea/**/usage.statistics.xml
.idea/**/dictionaries
.idea/**/shelf
# AWS User-specific
.idea/**/aws.xml
# Generated files
.idea/**/contentModel.xml
# Sensitive or high-churn files
.idea/**/dataSources/
.idea/**/dataSources.ids
.idea/**/dataSources.local.xml
.idea/**/sqlDataSources.xml
.idea/**/dynamic.xml
.idea/**/uiDesigner.xml
.idea/**/dbnavigator.xml
# Gradle
.idea/**/gradle.xml
.idea/**/libraries
# File-based project format
*.iws
# IntelliJ
out/
# JIRA plugin
atlassian-ide-plugin.xml
# Python #
*.py[cod]
*$py.class
# Distribution / packaging
.Python build/
develop-eggs/
dist/
downloads/
eggs/
.eggs/
lib/
lib64/
parts/
sdist/
var/
wheels/
*.whl
*.egg-info/
.installed.cfg
*.egg
*.manifest
*.spec
# Installer logs
pip-log.txt
pip-delete-this-directory.txt
# Unit test / coverage reports
htmlcov/
.tox/
.coverage
.coverage.*
.cache
.pytest_cache/
nosetests.xml
coverage.xml
*.cover
.hypothesis/
# Jupyter Notebook
.ipynb_checkpoints
# pyenv
.python-version
# celery
celerybeat-schedule.*
# SageMath parsed files
*.sage.py
# Environments
.env
.venv
env/
venv/
ENV/
env.bak/
venv.bak/
# mkdocs documentation
/site
# mypy
.mypy_cache/
# Sublime Text #
*.tmlanguage.cache
*.tmPreferences.cache
*.stTheme.cache
*.sublime-workspace
*.sublime-project
# sftp configuration file
sftp-config.json
# Package control specific files Package
Control.last-run
Control.ca-list
Control.ca-bundle
Control.system-ca-bundle
GitHub.sublime-settings
# Visual Studio Code #
.vscode/*
!.vscode/settings.json
!.vscode/tasks.json
!.vscode/launch.json
!.vscode/extensions.json
.history
.ropeproject/*

View File

3
datavis/admin.py 100644
View File

@ -0,0 +1,3 @@
from django.contrib import admin
# Register your models here.

6
datavis/apps.py 100644
View File

@ -0,0 +1,6 @@
from django.apps import AppConfig
class DatavisConfig(AppConfig):
default_auto_field = 'django.db.models.BigAutoField'
name = 'datavis'

View File

View File

@ -0,0 +1,3 @@
from django.db import models
# Create your models here.

View File

@ -0,0 +1,45 @@
{% extends "datavis/index.html" %} {% block content %}
<main>
<article>
<h1>Summary</h1>
<table>
<thead>
<tr>
<th>Measurement Time</th>
<th>Temperature (18")</th>
<th>Temperature (36")</th>
<th>Alerts</th>
</tr>
</thead>
<tbody>
<tr>
<td>2025-01-01 00:00</td>
<td>35 C</td>
<td>38 C</td>
<td></td>
</tr>
<tr>
<td>2025-01-01 00:00</td>
<td>35 C</td>
<td>38 C</td>
<td></td>
</tr>
<tr>
<td>2025-01-01 00:00</td>
<td>35 C</td>
<td>38 C</td>
<td></td>
</tr>
</tbody>
</table>
</article>
<article>
<h1>Graphics</h1>
<section>
<svg viewBox="0 0 500 500">
<rect x="0" width="500" y="0" height="500" fill="#aaa" />
</svg>
</section>
</article>
</main>
{% endblock content %}

View File

@ -0,0 +1,11 @@
{% load static %}
<!doctype html>
<html>
<head>
<title>Robot Hands</title>
<script src="{% static 'marketing/tailwind.js' %}"></script>
</head>
<body>
{% block content %} {% endblock %}
</body>
</html>

3
datavis/tests.py 100644
View File

@ -0,0 +1,3 @@
from django.test import TestCase
# Create your tests here.

8
datavis/urls.py 100644
View File

@ -0,0 +1,8 @@
from django.urls import path
from . import views
urlpatterns = [
path("", views.index, name="dashboard_home"),
path("livedemo", views.index, name="livedemo")
]

14
datavis/views.py 100644
View File

@ -0,0 +1,14 @@
from django.shortcuts import render
# Create your views here.
def index(request):
context = {}
return render(request, "datavis/dashboard_home.html", context)
def guest_demo(request):
"""
Loads safe public data and presents a read-only view into it
"""
context = {}
return render(request, "datavis/dashboard_home.html", context)

22
manage.py 100755
View File

@ -0,0 +1,22 @@
#!/usr/bin/env python
"""Django's command-line utility for administrative tasks."""
import os
import sys
def main():
"""Run administrative tasks."""
os.environ.setdefault('DJANGO_SETTINGS_MODULE', 'roboteyes.settings')
try:
from django.core.management import execute_from_command_line
except ImportError as exc:
raise ImportError(
"Couldn't import Django. Are you sure it's installed and "
"available on your PYTHONPATH environment variable? Did you "
"forget to activate a virtual environment?"
) from exc
execute_from_command_line(sys.argv)
if __name__ == '__main__':
main()

View File

View File

@ -0,0 +1,3 @@
from django.contrib import admin
# Register your models here.

View File

@ -0,0 +1,6 @@
from django.apps import AppConfig
class MarketingConfig(AppConfig):
default_auto_field = 'django.db.models.BigAutoField'
name = 'marketing'

View File

View File

@ -0,0 +1,3 @@
from django.db import models
# Create your models here.

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.5 MiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.8 KiB

View File

@ -0,0 +1,111 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<!-- Generator: Adobe Adobe Illustrator 24.2.0, SVG Export Plug-In . SVG Version: 6.00 Build 0) -->
<svg
version="1.1"
x="0px"
y="0px"
width="40"
height="50"
viewBox="0 0 40 50"
xml:space="preserve"
id="svg18"
sodipodi:docname="Untitled-3 01 Artboard 1.svg"
inkscape:version="1.3 (0e150ed, 2023-07-21)"
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"><defs
id="defs18" /><sodipodi:namedview
id="namedview18"
pagecolor="#ffffff"
bordercolor="#000000"
borderopacity="0.25"
inkscape:showpageshadow="2"
inkscape:pageopacity="0.0"
inkscape:pagecheckerboard="0"
inkscape:deskcolor="#d1d1d1"
inkscape:zoom="4.1674204"
inkscape:cx="25.555377"
inkscape:cy="26.635182"
inkscape:window-width="1312"
inkscape:window-height="449"
inkscape:window-x="0"
inkscape:window-y="43"
inkscape:window-maximized="0"
inkscape:current-layer="svg18" />&#10;<style
type="text/css"
id="style1">&#10; .st0{fill:#FFFFFF;stroke:#376780;stroke-width:0.5;stroke-miterlimit:10;}&#10; .st1{fill:#E39032;}&#10; .st2{fill:#FFCC91;}&#10; .st3{fill:none;stroke:#E3A054;stroke-width:0.25;stroke-linecap:round;stroke-miterlimit:10;}&#10; .st4{fill:#E04338;}&#10; .st5{fill:#FFFFFF;stroke:#000000;stroke-width:0.25;stroke-miterlimit:10;}&#10; .st6{fill:#8F4403;stroke:#000000;stroke-width:0.25;stroke-miterlimit:10;}&#10; .st7{fill:#8F4403;stroke:#000000;stroke-width:0.25;stroke-linecap:round;stroke-miterlimit:10;}&#10; .st8{fill:none;stroke:#8F4403;stroke-width:0.25;stroke-linecap:round;stroke-miterlimit:10;}&#10; .st9{fill:none;stroke:#000000;stroke-width:0.25;stroke-linecap:round;stroke-miterlimit:10;}&#10; .st10{fill:#E08F89;}&#10; .st11{fill:#FFE4C4;}&#10; .st12{fill:none;stroke:#E8A558;stroke-width:0.25;stroke-miterlimit:10;}&#10; .st13{fill:#FFFFFF;}&#10; .st14{fill:#BABABA;}&#10;</style>&#10;<g
id="Layer_1"
transform="translate(-10.078177,-0.95982642)">&#10; <path
class="st1"
d="m 44.61,44.39 c 2.61,-1.78 3.34,-3.03 0.98,-5.85 -0.8,-0.95 -4.7,-3.77 -3.94,-5.74 2.02,-5.18 2.27,-9.93 -1.24,-13.86 9.36,-5.26 -0.29,-19.93 -8.77,-6.5 2.06,-12.16 -11.35,-8.4 -8.81,-0.09 -2.88,-8.96 -12.07,1.51 -4.85,6.02 -2.23,0.82 -2.36,3.34 -1.46,4.14 -7.05,12.4 -4.79,14.62 1.27,11.4 0.71,-0.37 4.93,-2.55 5.69,0.47 0.09,0.36 -0.09,0.73 -0.37,0.97 -4.03,3.53 -3.77,8.97 -1.97,9.83 7.26,3.47 15.46,3.77 23.47,-0.79 z"
id="path1" />&#10; <g
id="Layer_3">&#10; <path
class="st2"
d="m 19.49,20.49 c -0.11,-0.31 -1.19,-0.21 -2.6,1.52 -1.48,1.82 -4.01,7.94 -4.31,8.91 -0.28,0.89 -0.84,3.46 0.53,4.16 1.37,0.7 3.7,-0.5 4.69,-1.19 1.14,-0.8 3.13,-1.2 4.01,-1.08 3.56,0.49 3.93,-1.43 4.42,-3.55 0.28,-1.22 -2.98,-3.94 -5.62,-3.64 -2.65,0.31 -0.74,-4.05 -1.12,-5.13 z"
id="path2" />&#10; </g>&#10; <path
class="st3"
d="m 24.41,30.11 c -1.05,-1.69 -4.24,-1.05 -5.95,0.65 -1.32,1.32 -1.17,3.48 -2.59,4.02"
id="path3" />&#10; <g
id="Layer_4">&#10; <path
class="st4"
d="m 19.46,18.39 c -2.48,0.19 -3.35,-1.73 -4.07,-3.47 -0.66,-1.59 0.65,-4.66 2.35,-5.59 0.91,-0.5 2.96,-0.94 3.93,0.69 1.39,2.35 0.64,0.65 0.89,-0.45 0.24,-1.04 0.35,-1.7 1.13,-2.79 0.78,-1.1 2.49,-2.09 3.52,-2.09 1.52,0 2.36,0.28 3.15,0.95 1.09,0.93 1.33,1.79 1.41,3.02 0.08,1.35 0.32,1.4 -0.03,3.14 -0.35,1.74 0.13,-0.32 1.63,-1.82 1.5,-1.5 2.08,-2.19 4.08,-2.81 1.56,-0.49 3.33,-0.27 4.66,1.07 1.33,1.33 1.69,1.33 2.01,3.46 0.21,1.38 0.18,2.36 -0.45,3.84 -0.74,1.74 -2.1,2.97 -3.14,3.33 -0.36,0.13 0.43,0.41 1.28,2.04 0.71,1.35 1.34,2.92 0.79,2.92 -1.19,0 -3.4,0.46 -3.79,-2.3 -0.52,-3.75 -4.46,0.89 -5.45,-2.57 C 32.4,15.5 29.64,16.03 29.8,15 c 0.27,-1.72 -1.71,-3.59 -2.81,-1.41 -0.38,0.76 -1.4,1.02 -4.01,0.52 -1.53,-0.29 -2.35,-0.86 -3.02,-0.03 -0.41,0.5 -0.26,1.34 0.22,2.66"
id="path4" />&#10; </g>&#10; <g
id="Layer_2">&#10; <path
class="st6"
d="m 29.39,25.45 c -0.34,-1.75 -1.1,-8.53 -3.43,-8.15 -2.61,0.43 -0.79,6.43 -0.21,8.77 1.3,0.52 3.44,-0.45 3.64,-0.62 z"
id="path5" />&#10; <path
class="st7"
d="M 27.76,25.63 C 27.25,23.32 26.73,21.01 26.22,18.7"
id="path6" />&#10; </g>&#10; <path
class="st8"
d="m 18.2,27.11 c -0.56,0.23 -1,0.72 -1.17,1.3"
id="path7" />&#10; <path
class="st9"
d="m 44.61,44.39 c 2.61,-1.78 3.34,-3.03 0.98,-5.85 -0.8,-0.95 -4.7,-3.77 -3.94,-5.74 2.02,-5.18 2.27,-9.93 -1.24,-13.86 9.36,-5.26 -0.29,-19.93 -8.77,-6.5 2.06,-12.16 -11.35,-8.4 -8.81,-0.09 -2.88,-8.96 -12.07,1.51 -4.85,6.02 -2.23,0.82 -2.36,3.34 -1.46,4.14 -7.05,12.4 -4.79,14.62 1.27,11.4 0.71,-0.37 4.93,-2.55 5.69,0.47 0.09,0.36 -0.09,0.73 -0.37,0.97 -4.03,3.53 -3.77,8.97 -1.97,9.83 7.26,3.47 15.46,3.77 23.47,-0.79 z"
id="path8" />&#10;</g>&#10;<g
id="Layer_6"
transform="translate(-10.078177,-0.95982642)">&#10; <path
class="st10"
d="M 18.64,17.31 C 18.01,17.17 17.48,16.72 17.13,16.18 16.78,15.64 16.6,15 16.5,14.37 c -0.07,-0.41 -0.11,-0.82 -0.06,-1.23 0.08,-0.71 0.43,-1.38 0.96,-1.85"
id="path9" />&#10; <path
class="st10"
d="m 23.8,11.75 c -0.45,-2.12 0.54,-4.47 2.37,-5.63 0.32,-0.2 0.66,-0.37 1.02,-0.43 0.6,-0.11 1.24,0.06 1.76,0.39"
id="path10" />&#10; <path
class="st10"
d="m 32.93,13.02 c 1.26,-2.23 3.37,-3.95 5.8,-4.74 0.41,-0.13 0.84,-0.24 1.27,-0.23 1.04,0.03 2,0.87 2.18,1.89"
id="path11" />&#10; <path
class="st11"
d="m 18.64,21.76 c -0.31,-0.53 -7.05,10.75 -4.97,9.99 2.73,-0.99 0.73,-1.2 2.74,-5.2 0.15,-0.29 2.44,-4.42 2.23,-4.79 z"
id="path12" />&#10; <path
class="st12"
d="m 38.81,25.63 c 3.18,1.97 -0.19,4.35 -1.51,1.03 0.47,1.18 0.89,2.53 0.69,3.81 -0.95,1.53 -2.57,-0.7 -2.39,-2.05 0.72,3.95 -2.38,6.81 -3.78,2.74 -0.03,-0.08 -0.14,-0.07 -0.15,0.02 -0.14,4.61 -4.73,5.34 -3.83,-0.07"
id="path13" />&#10; <path
class="st12"
d="m 27.85,39.42 c 0.02,0.81 0.34,1.65 0.97,2.16 0.63,0.51 1.6,0.64 2.27,0.18 0.67,-0.46 0.87,-1.53 0.32,-2.13 0.66,1.44 2.2,2.43 3.79,2.43 0.77,0 1.65,-0.32 1.88,-1.06 0.22,-0.69 -0.22,-1.41 -0.64,-2 0.54,0.41 1.18,0.73 1.85,0.81 0.67,0.08 1.4,-0.1 1.9,-0.57 0.13,-0.12 0.24,-0.26 0.27,-0.43 0.03,-0.17 -0.02,-0.35 -0.09,-0.52 C 40.04,37.5 39.36,36.92 38.69,36.38 38.5,36.22 38.15,36.1 38.07,36.34"
id="path14" />&#10; <path
class="st12"
d="m 40.46,42.78 c 1.91,2.07 5.82,0.24 2.89,-2.09 3.65,2.48 2.24,-2.67 -0.25,-2.33"
id="path15" />&#10; <path
class="st12"
d="m 23.16,41.59 c -1.79,3.96 4.14,4.38 2.95,-0.04"
id="path16" />&#10;</g>&#10;<g
id="Layer_5"
transform="translate(-10.078177,-0.95982642)">&#10; <circle
class="st13"
cx="28.040001"
cy="19.75"
r="1.05"
id="circle16" />&#10; <circle
class="st13"
cx="27.209999"
cy="20.9"
r="0.51999998"
id="circle17" />&#10; <path
class="st14"
d="m 31.34,19.4 c 0.37,1.43 0.22,2.99 -0.42,4.33 -0.25,0.53 -0.59,1.03 -1.08,1.35 -0.08,0.05 -0.18,0.1 -0.26,0.04 -0.04,-0.03 -0.06,-0.09 -0.07,-0.14 -0.08,-0.36 -0.13,-0.73 -0.15,-1.1 0,-0.07 0,-0.14 0.02,-0.21 0.08,-0.2 0.34,-0.23 0.52,-0.35 0.14,-0.09 0.23,-0.23 0.32,-0.37 0.28,-0.43 0.55,-0.86 0.74,-1.34 0.19,-0.48 0.28,-1 0.16,-1.5 -0.03,-0.14 -0.08,-0.29 -0.07,-0.44 0.03,-0.14 0.13,-0.3 0.29,-0.27 z"
id="path17" />&#10; <path
class="st14"
d="m 24.96,24.24 c -0.76,0.11 -1.48,-0.43 -1.89,-1.09 -0.13,-0.21 -0.24,-0.44 -0.41,-0.61 -0.17,-0.17 -0.44,-0.28 -0.67,-0.2 -0.12,0.48 0.11,0.97 0.38,1.38 0.7,1.04 1.8,1.84 3.04,2.06 -0.12,-0.41 -0.23,-0.82 -0.35,-1.22 -0.04,-0.13 -0.09,-0.27 -0.21,-0.31 -0.18,-0.06 -0.41,0.1 0.11,-0.01 z"
id="path18" />&#10;</g>&#10;</svg>

After

Width:  |  Height:  |  Size: 7.5 KiB

File diff suppressed because one or more lines are too long

Binary file not shown.

After

Width:  |  Height:  |  Size: 575 KiB

View File

@ -0,0 +1,109 @@
{% extends "marketing/index.html" %}
{% load static %}
{% block content %}
<main class="bg-[url({% static 'marketing/background.png' %})] bg-no-repeat bg-cover bg-black bg-center text-white">
<div class="backdrop-blur-sm">
<div class="flex flex-col lg:flex-row p-10 relative">
<div class="absolute top-0 left-0 w-full h-full bg-black opacity-40 -z-10"></div>
<article class="flex-1 flex flex-col items-center pb-8">
<div class="lg:sticky lg:top-1/2 lg:translate-y-[-50%] text-center">
<div class="flex flex-col gap-2">
<img
class="w-[40%] mx-auto"
src="{% static 'marketing/w_solo.png' %}"
></img>
</div>
<h1 class="text-6xl font-extralight block pb-3 ">
Welcome to
<br /> Wisconsin Windrows
</h1>
</div>
</article>
<article class="flex-1">
<section class="h-[50lvh] lg:h-lvh lg:flex lg:flex-col lg:items-center lg:justify-center">
<section class="text-3xl py-4">
<b>Introducing Proboscus:</b> the remote temperature
monitoring solution that will transform your monitoring
process after a mass mortality event.
</section>
<section class="text-lg text-center p-8">
<a
href="{% url 'livedemo' %}"
class="p-4 text-2xl rounded-2xl text-black bg-blue-400 cursor-pointer hover:bg-blue-300 mr-4"
>
See it in action
</a>
<span class="inline-block">or read on to learn more</span>
</section>
</section>
<section class="text-lg">
<h2 class="text-3xl">Goodbye, manual measurement</h2>
<div>
Proboscus offers several critical improvements over the manual
windrow measurement techniques used today.
</div>
<div>
<ul>
{% for item in bullet_items_measurement %}
<li>
<span class="font-bold pr-3">{{item.key}}:</span>
<span>{{item.value}}</span>
</li>
{% endfor %}
</ul>
</div>
<h2 class="text-3xl mt-3">Hello, no-click insights</h2>
<div>
<ul>
{% for item in bullet_items_comfort %}
<li>
<span class="font-bold pr-3">{{item.key}}:</span>
<span>{{item.value}}</span>
</li>
{% endfor %}
</ul>
</div>
<div>
<h2 class="text-3xl mt-3">Additional Features:</h2>
<ul>
{% for item in bullet_items_additional %}
<li>
<span class="font-bold pr-3">{{item.key}}:</span>
<span>{{item.value}}</span>
</li>
{% endfor %}
</ul>
</div>
</section>
<section class="text-xl flex gap-2 items-center justify-center pt-4">
<span>Interested?</span>
<CallToActionButton onClick={props.onLogin} />
</section>
<section class="py-3">
<div class="pb-3">
Join our mailing list for updates! We'll keep you appraised of
the latest developments and opportunities for deployment.
</div>
<input
class="bg-gray-200 p-4 text-black"
placeholder="joe@example.com"
type="email"
></input>
<button class="p-4 text-black cursor-pointer bg-gray-200 hover:bg-gray-100">
Submit
</button>
</section>
</article>
</div>
<footer class="py-1 text-white text-center bg-black">
Contact us at
<a href="mailto:info@wisconsinwindrow.com" class="">
info@wisconsinwindrow.com
</a>
</footer>
</div>
</main>
{% endblock content %}

View File

@ -0,0 +1,11 @@
{% load static %}
<!doctype html>
<html>
<head>
<title>Robot Hands</title>
<script src="{% static 'marketing/tailwind.js' %}"></script>
</head>
<body>
{% block content %} {% endblock %}
</body>
</html>

View File

@ -0,0 +1,3 @@
from django.test import TestCase
# Create your tests here.

View File

@ -0,0 +1,7 @@
from django.urls import path
from . import views
urlpatterns = [
path("", views.index, name="index")
]

56
marketing/views.py 100644
View File

@ -0,0 +1,56 @@
from django.http.response import HttpResponse
from django.shortcuts import render
# Create your views here.
def index(request):
context = {
"bullet_items_measurement": [
{
"key": "Time",
"value": "No more manual measurements needed at each temperature site.",
},
{
"key": "Safety",
"value": "Reduces contact time with contaminated materials. Adds flexibility to scheduling visual inspections, pick optimal times for visual inspections.",
},
{
"key": "Accuracy",
"value": "Takes measurements at two depths in a consistent spot, with digital temperature readings that are sent to our servers. No transcription errors.",
}
],
"bullet_items_comfort": [
{
"key": "Visibility",
"value":
"Realtime remote updates with dedicated data visualizations that help ensure things are on track. Share progress updates with stakeholders anywhere, anytime.",
},
{
"key": "Comfort",
"value": "Check on progress remotely, anytime, anywhere.",
},
{
"key": "Ease of use",
"value": "Set and forget system. We provide a service. No need to buy special tools, we ensure our probes arrive in time at your site, set up to work with your locations specific needs, and remove them when the job is done. ",
},
{
"key": "Cost competitive",
"value": "Our service is cost competitive to the current systems.",
},
],
"bullet_items_additional": [
{
"key": "Data access",
"value":
"Laptop/Desktop data visualizations, downloadable data, mobile field maintenance site.",
},
{
"key": "Alerting",
"value": "Alert systems that allow you to quickly identify problematic temperature sites, and windrows, or even predictively let you know if there is a potential problem with a probe, which can simply be hot-swapped for a new one without fuss, and without losing data integrity.",
},
{
"key": "Redundancy",
"value": "Multiple redundant backups. The temperature data is collected and saved at the probe level, at the base-station level, and in our servers. Auditable results.",
},
]
}
return render(request, "marketing/homepage.html", context)

View File

@ -0,0 +1,4 @@
{
"venvPath": "..",
"venv": "djangovenv"
}

View File

16
roboteyes/asgi.py 100644
View File

@ -0,0 +1,16 @@
"""
ASGI config for roboteyes project.
It exposes the ASGI callable as a module-level variable named ``application``.
For more information on this file, see
https://docs.djangoproject.com/en/5.2/howto/deployment/asgi/
"""
import os
from django.core.asgi import get_asgi_application
os.environ.setdefault('DJANGO_SETTINGS_MODULE', 'roboteyes.settings')
application = get_asgi_application()

View File

@ -0,0 +1,124 @@
"""
Django settings for roboteyes project.
Generated by 'django-admin startproject' using Django 5.2.7.
For more information on this file, see
https://docs.djangoproject.com/en/5.2/topics/settings/
For the full list of settings and their values, see
https://docs.djangoproject.com/en/5.2/ref/settings/
"""
from pathlib import Path
# Build paths inside the project like this: BASE_DIR / 'subdir'.
BASE_DIR = Path(__file__).resolve().parent.parent
# Quick-start development settings - unsuitable for production
# See https://docs.djangoproject.com/en/5.2/howto/deployment/checklist/
# SECURITY WARNING: keep the secret key used in production secret!
SECRET_KEY = 'django-insecure-(crrkqaq*k%(5cm)x4r1d#hwa5i#y9dys1d*3!r1%z1doqf1w^'
# SECURITY WARNING: don't run with debug turned on in production!
DEBUG = True
ALLOWED_HOSTS = []
# Application definition
INSTALLED_APPS = [
'marketing.apps.MarketingConfig',
'datavis.apps.DatavisConfig',
'django.contrib.admin',
'django.contrib.auth',
'django.contrib.contenttypes',
'django.contrib.sessions',
'django.contrib.messages',
'django.contrib.staticfiles',
]
MIDDLEWARE = [
'django.middleware.security.SecurityMiddleware',
'django.contrib.sessions.middleware.SessionMiddleware',
'django.middleware.common.CommonMiddleware',
'django.middleware.csrf.CsrfViewMiddleware',
'django.contrib.auth.middleware.AuthenticationMiddleware',
'django.contrib.messages.middleware.MessageMiddleware',
'django.middleware.clickjacking.XFrameOptionsMiddleware',
]
ROOT_URLCONF = 'roboteyes.urls'
TEMPLATES = [
{
'BACKEND': 'django.template.backends.django.DjangoTemplates',
'DIRS': [],
'APP_DIRS': True,
'OPTIONS': {
'context_processors': [
'django.template.context_processors.request',
'django.contrib.auth.context_processors.auth',
'django.contrib.messages.context_processors.messages',
],
},
},
]
WSGI_APPLICATION = 'roboteyes.wsgi.application'
# Database
# https://docs.djangoproject.com/en/5.2/ref/settings/#databases
DATABASES = {
'default': {
'ENGINE': 'django.db.backends.sqlite3',
'NAME': BASE_DIR / 'db.sqlite3',
}
}
# Password validation
# https://docs.djangoproject.com/en/5.2/ref/settings/#auth-password-validators
AUTH_PASSWORD_VALIDATORS = [
{
'NAME': 'django.contrib.auth.password_validation.UserAttributeSimilarityValidator',
},
{
'NAME': 'django.contrib.auth.password_validation.MinimumLengthValidator',
},
{
'NAME': 'django.contrib.auth.password_validation.CommonPasswordValidator',
},
{
'NAME': 'django.contrib.auth.password_validation.NumericPasswordValidator',
},
]
# Internationalization
# https://docs.djangoproject.com/en/5.2/topics/i18n/
LANGUAGE_CODE = 'en-us'
TIME_ZONE = 'UTC'
USE_I18N = True
USE_TZ = True
# Static files (CSS, JavaScript, Images)
# https://docs.djangoproject.com/en/5.2/howto/static-files/
STATIC_URL = 'static/'
# Default primary key field type
# https://docs.djangoproject.com/en/5.2/ref/settings/#default-auto-field
DEFAULT_AUTO_FIELD = 'django.db.models.BigAutoField'

24
roboteyes/urls.py 100644
View File

@ -0,0 +1,24 @@
"""
URL configuration for roboteyes project.
The `urlpatterns` list routes URLs to views. For more information please see:
https://docs.djangoproject.com/en/5.2/topics/http/urls/
Examples:
Function views
1. Add an import: from my_app import views
2. Add a URL to urlpatterns: path('', views.home, name='home')
Class-based views
1. Add an import: from other_app.views import Home
2. Add a URL to urlpatterns: path('', Home.as_view(), name='home')
Including another URLconf
1. Import the include() function: from django.urls import include, path
2. Add a URL to urlpatterns: path('blog/', include('blog.urls'))
"""
from django.contrib import admin
from django.urls import include, path
urlpatterns = [
path('', include("marketing.urls")),
path('dashboard/', include("datavis.urls")),
path('admin/', admin.site.urls),
]

16
roboteyes/wsgi.py 100644
View File

@ -0,0 +1,16 @@
"""
WSGI config for roboteyes project.
It exposes the WSGI callable as a module-level variable named ``application``.
For more information on this file, see
https://docs.djangoproject.com/en/5.2/howto/deployment/wsgi/
"""
import os
from django.core.wsgi import get_wsgi_application
os.environ.setdefault('DJANGO_SETTINGS_MODULE', 'roboteyes.settings')
application = get_wsgi_application()