This commit is contained in:
@@ -69,6 +69,7 @@ TEMPLATES = [
|
|||||||
'django.template.context_processors.request',
|
'django.template.context_processors.request',
|
||||||
'django.contrib.auth.context_processors.auth',
|
'django.contrib.auth.context_processors.auth',
|
||||||
'django.contrib.messages.context_processors.messages',
|
'django.contrib.messages.context_processors.messages',
|
||||||
|
'public.context_processors.tianji_tracking',
|
||||||
],
|
],
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
@@ -153,3 +154,7 @@ EMAIL_USE_TLS = True
|
|||||||
# Authentication Redirects
|
# Authentication Redirects
|
||||||
LOGIN_REDIRECT_URL = '/'
|
LOGIN_REDIRECT_URL = '/'
|
||||||
LOGOUT_REDIRECT_URL = '/'
|
LOGOUT_REDIRECT_URL = '/'
|
||||||
|
|
||||||
|
# Tianji analytics (loaded only after user consent in production)
|
||||||
|
TIANJI_TRACKER_URL = 'https://tianji.aimloperations.com/tracker.js'
|
||||||
|
TIANJI_WEBSITE_ID = 'cm7w80pyy020oddswy2evl957'
|
||||||
|
|||||||
@@ -9,23 +9,28 @@
|
|||||||
<h1 class="section-title">Dashboard</h1>
|
<h1 class="section-title">Dashboard</h1>
|
||||||
|
|
||||||
<div class="card-grid" style="margin-bottom: 3rem;">
|
<div class="card-grid" style="margin-bottom: 3rem;">
|
||||||
<a href="{% url 'contracts' %}" class="card">
|
<a href="{% url 'contracts' %}" class="card"
|
||||||
|
data-tianji-event="financial_nav" data-tianji-event-destination="contracts">
|
||||||
<span class="card-title">View Contracts</span>
|
<span class="card-title">View Contracts</span>
|
||||||
<p class="card-text">Overview of all active and past contracts and their scopes.</p>
|
<p class="card-text">Overview of all active and past contracts and their scopes.</p>
|
||||||
</a>
|
</a>
|
||||||
<a href="{% url 'new_contract' %}" class="card">
|
<a href="{% url 'new_contract' %}" class="card"
|
||||||
|
data-tianji-event="financial_nav" data-tianji-event-destination="new_contract">
|
||||||
<span class="card-title">New Contract</span>
|
<span class="card-title">New Contract</span>
|
||||||
<p class="card-text">Establish a new project contract to track budgets.</p>
|
<p class="card-text">Establish a new project contract to track budgets.</p>
|
||||||
</a>
|
</a>
|
||||||
<a href="{% url 'new_employee' %}" class="card">
|
<a href="{% url 'new_employee' %}" class="card"
|
||||||
|
data-tianji-event="financial_nav" data-tianji-event-destination="new_employee">
|
||||||
<span class="card-title">New Employee</span>
|
<span class="card-title">New Employee</span>
|
||||||
<p class="card-text">Add a new personnel member to your organization.</p>
|
<p class="card-text">Add a new personnel member to your organization.</p>
|
||||||
</a>
|
</a>
|
||||||
<a href="{% url 'Timekeeping' %}" class="card">
|
<a href="{% url 'Timekeeping' %}" class="card"
|
||||||
|
data-tianji-event="financial_nav" data-tianji-event-destination="timekeeping">
|
||||||
<span class="card-title">Log Time</span>
|
<span class="card-title">Log Time</span>
|
||||||
<p class="card-text">Record work hours against specific contracts.</p>
|
<p class="card-text">Record work hours against specific contracts.</p>
|
||||||
</a>
|
</a>
|
||||||
<a href="{% url 'time_logs' %}" class="card">
|
<a href="{% url 'time_logs' %}" class="card"
|
||||||
|
data-tianji-event="financial_nav" data-tianji-event-destination="time_logs">
|
||||||
<span class="card-title">Manage Time Logs</span>
|
<span class="card-title">Manage Time Logs</span>
|
||||||
<p class="card-text">Review and edit submitted time entries.</p>
|
<p class="card-text">Review and edit submitted time entries.</p>
|
||||||
</a>
|
</a>
|
||||||
|
|||||||
@@ -226,7 +226,8 @@
|
|||||||
<textarea name="description" class="form-control" rows="4"></textarea>
|
<textarea name="description" class="form-control" rows="4"></textarea>
|
||||||
</div>
|
</div>
|
||||||
<input type="hidden" name="next" value="{{ request.path }}">
|
<input type="hidden" name="next" value="{{ request.path }}">
|
||||||
<button type="submit" class="btn">Create</button>
|
<button type="submit" class="btn"
|
||||||
|
data-tianji-event="planning_create_item">Create</button>
|
||||||
</form>
|
</form>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
@@ -328,9 +329,11 @@
|
|||||||
.then(data => {
|
.then(data => {
|
||||||
if (data.status !== 'success') {
|
if (data.status !== 'success') {
|
||||||
alert('Failed to update status');
|
alert('Failed to update status');
|
||||||
} else {
|
} else if (window.aimlTrack) {
|
||||||
// Update counts if necessary, though reloading or dynamic updates are better.
|
window.aimlTrack('planning_item_status_change', {
|
||||||
// Simple approach: user just sees it moved.
|
status: newStatus,
|
||||||
|
item_id: id
|
||||||
|
});
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
});
|
});
|
||||||
|
|||||||
@@ -0,0 +1,18 @@
|
|||||||
|
from django.conf import settings
|
||||||
|
|
||||||
|
|
||||||
|
def tianji_tracking(request):
|
||||||
|
return {
|
||||||
|
'tianji_enabled': not settings.DEBUG,
|
||||||
|
'tianji_tracker_url': getattr(
|
||||||
|
settings,
|
||||||
|
'TIANJI_TRACKER_URL',
|
||||||
|
'https://tianji.aimloperations.com/tracker.js',
|
||||||
|
),
|
||||||
|
'tianji_website_id': getattr(
|
||||||
|
settings,
|
||||||
|
'TIANJI_WEBSITE_ID',
|
||||||
|
'cm7w80pyy020oddswy2evl957',
|
||||||
|
),
|
||||||
|
'page_name': getattr(getattr(request, 'resolver_match', None), 'url_name', ''),
|
||||||
|
}
|
||||||
@@ -583,4 +583,118 @@ input:focus, select:focus, textarea:focus {
|
|||||||
display: block;
|
display: block;
|
||||||
margin-bottom: 1rem;
|
margin-bottom: 1rem;
|
||||||
margin-top: -0.5rem;
|
margin-top: -0.5rem;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Footer links */
|
||||||
|
.footer-links {
|
||||||
|
margin: 0.5rem 0;
|
||||||
|
font-size: 0.9rem;
|
||||||
|
}
|
||||||
|
|
||||||
|
.footer-links a {
|
||||||
|
color: var(--text-muted);
|
||||||
|
}
|
||||||
|
|
||||||
|
.footer-links a:hover {
|
||||||
|
color: var(--primary-color);
|
||||||
|
}
|
||||||
|
|
||||||
|
.footer-separator {
|
||||||
|
color: var(--text-muted);
|
||||||
|
margin: 0 0.5rem;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Legal pages */
|
||||||
|
.legal-page {
|
||||||
|
max-width: 820px;
|
||||||
|
}
|
||||||
|
|
||||||
|
.legal-updated {
|
||||||
|
text-align: center;
|
||||||
|
color: var(--text-muted);
|
||||||
|
margin-bottom: 2rem;
|
||||||
|
}
|
||||||
|
|
||||||
|
.legal-content h2 {
|
||||||
|
color: var(--primary-color);
|
||||||
|
font-size: 1.25rem;
|
||||||
|
margin: 2rem 0 0.75rem;
|
||||||
|
}
|
||||||
|
|
||||||
|
.legal-content h3 {
|
||||||
|
color: var(--text-color);
|
||||||
|
font-size: 1.05rem;
|
||||||
|
margin: 1.5rem 0 0.5rem;
|
||||||
|
}
|
||||||
|
|
||||||
|
.legal-content p,
|
||||||
|
.legal-content li {
|
||||||
|
color: var(--text-muted);
|
||||||
|
margin-bottom: 1rem;
|
||||||
|
}
|
||||||
|
|
||||||
|
.legal-content ul {
|
||||||
|
margin: 0 0 1rem 1.5rem;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Cookie consent banner */
|
||||||
|
.cookie-consent-banner {
|
||||||
|
position: fixed;
|
||||||
|
bottom: 0;
|
||||||
|
left: 0;
|
||||||
|
right: 0;
|
||||||
|
z-index: 1100;
|
||||||
|
padding: 1rem;
|
||||||
|
background: rgba(26, 26, 26, 0.98);
|
||||||
|
border-top: 1px solid rgba(0, 243, 255, 0.25);
|
||||||
|
backdrop-filter: blur(10px);
|
||||||
|
}
|
||||||
|
|
||||||
|
.cookie-consent-content {
|
||||||
|
max-width: 960px;
|
||||||
|
margin: 0 auto;
|
||||||
|
display: flex;
|
||||||
|
flex-wrap: wrap;
|
||||||
|
align-items: center;
|
||||||
|
justify-content: space-between;
|
||||||
|
gap: 1rem;
|
||||||
|
}
|
||||||
|
|
||||||
|
.cookie-consent-text {
|
||||||
|
flex: 1 1 420px;
|
||||||
|
color: var(--text-muted);
|
||||||
|
font-size: 0.95rem;
|
||||||
|
margin: 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
.cookie-consent-actions {
|
||||||
|
display: flex;
|
||||||
|
gap: 0.75rem;
|
||||||
|
flex-shrink: 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
.btn-outline {
|
||||||
|
background: transparent;
|
||||||
|
border: 1px solid rgba(255, 255, 255, 0.25);
|
||||||
|
color: var(--text-color);
|
||||||
|
}
|
||||||
|
|
||||||
|
.btn-outline:hover {
|
||||||
|
border-color: var(--primary-color);
|
||||||
|
color: var(--primary-color);
|
||||||
|
}
|
||||||
|
|
||||||
|
@media (max-width: 640px) {
|
||||||
|
.cookie-consent-content {
|
||||||
|
flex-direction: column;
|
||||||
|
align-items: stretch;
|
||||||
|
}
|
||||||
|
|
||||||
|
.cookie-consent-actions {
|
||||||
|
width: 100%;
|
||||||
|
}
|
||||||
|
|
||||||
|
.cookie-consent-actions .btn {
|
||||||
|
flex: 1;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
@@ -0,0 +1,159 @@
|
|||||||
|
(function () {
|
||||||
|
'use strict';
|
||||||
|
|
||||||
|
var CONSENT_KEY = 'aiml_analytics_consent';
|
||||||
|
var configEl = document.getElementById('tianji-config');
|
||||||
|
if (!configEl) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
var trackerUrl = configEl.dataset.trackerUrl;
|
||||||
|
var websiteId = configEl.dataset.websiteId;
|
||||||
|
var userId = configEl.dataset.userId || '';
|
||||||
|
var pendingConsentEvent = false;
|
||||||
|
|
||||||
|
function getConsent() {
|
||||||
|
try {
|
||||||
|
return localStorage.getItem(CONSENT_KEY);
|
||||||
|
} catch (e) {
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
function setConsent(value) {
|
||||||
|
try {
|
||||||
|
localStorage.setItem(CONSENT_KEY, value);
|
||||||
|
} catch (e) {
|
||||||
|
/* ignore storage errors */
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
function hideBanner() {
|
||||||
|
var banner = document.getElementById('cookie-consent-banner');
|
||||||
|
if (banner) {
|
||||||
|
banner.hidden = true;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
function showBanner() {
|
||||||
|
var banner = document.getElementById('cookie-consent-banner');
|
||||||
|
if (banner) {
|
||||||
|
banner.hidden = false;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
function trackEvent(name, data) {
|
||||||
|
if (window.tianji && typeof window.tianji.track === 'function') {
|
||||||
|
window.tianji.track(name, data || {});
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
function identifyUser() {
|
||||||
|
if (!userId || !window.tianji || typeof window.tianji.identify !== 'function') {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
window.tianji.identify({ userId: userId });
|
||||||
|
}
|
||||||
|
|
||||||
|
function loadTracker() {
|
||||||
|
if (document.querySelector('script[data-tianji-loaded="true"]')) {
|
||||||
|
identifyUser();
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
var script = document.createElement('script');
|
||||||
|
script.async = true;
|
||||||
|
script.defer = true;
|
||||||
|
script.src = trackerUrl;
|
||||||
|
script.setAttribute('data-website-id', websiteId);
|
||||||
|
script.setAttribute('data-do-not-track', 'true');
|
||||||
|
script.setAttribute('data-tianji-loaded', 'true');
|
||||||
|
|
||||||
|
script.onload = function () {
|
||||||
|
identifyUser();
|
||||||
|
if (pendingConsentEvent) {
|
||||||
|
trackEvent('consent_accepted');
|
||||||
|
pendingConsentEvent = false;
|
||||||
|
}
|
||||||
|
document.dispatchEvent(new CustomEvent('tianji:ready'));
|
||||||
|
};
|
||||||
|
|
||||||
|
document.head.appendChild(script);
|
||||||
|
}
|
||||||
|
|
||||||
|
function acceptTracking() {
|
||||||
|
setConsent('accepted');
|
||||||
|
hideBanner();
|
||||||
|
try {
|
||||||
|
localStorage.removeItem('tianji.disabled');
|
||||||
|
} catch (e) {
|
||||||
|
/* ignore storage errors */
|
||||||
|
}
|
||||||
|
pendingConsentEvent = true;
|
||||||
|
loadTracker();
|
||||||
|
}
|
||||||
|
|
||||||
|
function declineTracking() {
|
||||||
|
setConsent('declined');
|
||||||
|
hideBanner();
|
||||||
|
try {
|
||||||
|
localStorage.setItem('tianji.disabled', '1');
|
||||||
|
} catch (e) {
|
||||||
|
/* ignore storage errors */
|
||||||
|
}
|
||||||
|
if (window.aimlTrack) {
|
||||||
|
window.aimlTrack('consent_declined');
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
function bindBannerControls() {
|
||||||
|
var acceptBtn = document.getElementById('cookie-consent-accept');
|
||||||
|
var declineBtn = document.getElementById('cookie-consent-decline');
|
||||||
|
var manageLinks = document.querySelectorAll('[data-open-cookie-preferences]');
|
||||||
|
|
||||||
|
if (acceptBtn) {
|
||||||
|
acceptBtn.addEventListener('click', acceptTracking);
|
||||||
|
}
|
||||||
|
if (declineBtn) {
|
||||||
|
declineBtn.addEventListener('click', declineTracking);
|
||||||
|
}
|
||||||
|
manageLinks.forEach(function (link) {
|
||||||
|
link.addEventListener('click', function (event) {
|
||||||
|
event.preventDefault();
|
||||||
|
showBanner();
|
||||||
|
});
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
window.aimlTrack = function (name, data) {
|
||||||
|
trackEvent(name, data);
|
||||||
|
};
|
||||||
|
|
||||||
|
window.aimlTrackWhenReady = function (name, data) {
|
||||||
|
if (window.tianji && typeof window.tianji.track === 'function') {
|
||||||
|
trackEvent(name, data);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
document.addEventListener('tianji:ready', function handler() {
|
||||||
|
document.removeEventListener('tianji:ready', handler);
|
||||||
|
trackEvent(name, data);
|
||||||
|
});
|
||||||
|
};
|
||||||
|
|
||||||
|
document.addEventListener('DOMContentLoaded', function () {
|
||||||
|
bindBannerControls();
|
||||||
|
|
||||||
|
var consent = getConsent();
|
||||||
|
if (consent === 'accepted') {
|
||||||
|
hideBanner();
|
||||||
|
loadTracker();
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
if (consent === 'declined') {
|
||||||
|
hideBanner();
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
showBanner();
|
||||||
|
});
|
||||||
|
})();
|
||||||
@@ -36,9 +36,13 @@
|
|||||||
<link href="{% static 'public/css/style.css' %}" rel="stylesheet">
|
<link href="{% static 'public/css/style.css' %}" rel="stylesheet">
|
||||||
<link rel="icon" type="image/png" href="{% static 'public/img/favicon.png' %}">
|
<link rel="icon" type="image/png" href="{% static 'public/img/favicon.png' %}">
|
||||||
|
|
||||||
{% if not debug %}
|
{% if tianji_enabled %}
|
||||||
<script async defer src="https://tianji.aimloperations.com/tracker.js"
|
<div id="tianji-config"
|
||||||
data-website-id="cm7w80pyy020oddswy2evl957"></script>
|
data-tracker-url="{{ tianji_tracker_url }}"
|
||||||
|
data-website-id="{{ tianji_website_id }}"
|
||||||
|
data-page-name="{{ page_name }}"
|
||||||
|
{% if user.is_authenticated %}data-user-id="{{ user.pk }}"{% endif %}
|
||||||
|
hidden></div>
|
||||||
{% endif %}
|
{% endif %}
|
||||||
</head>
|
</head>
|
||||||
|
|
||||||
@@ -69,12 +73,15 @@
|
|||||||
</ul>
|
</ul>
|
||||||
</li>
|
</li>
|
||||||
<li><a href="{% url 'contact' %}"
|
<li><a href="{% url 'contact' %}"
|
||||||
class="{% if request.resolver_match.url_name == 'contact' %}active{% endif %}">Contact</a></li>
|
class="{% if request.resolver_match.url_name == 'contact' %}active{% endif %}"
|
||||||
|
data-tianji-event="nav_contact">Contact</a></li>
|
||||||
{% if user.is_authenticated %}
|
{% if user.is_authenticated %}
|
||||||
<li><a href="{% url 'planning:board_view' %}"
|
<li><a href="{% url 'planning:board_view' %}"
|
||||||
class="{% if 'planning' in request.path %}active{% endif %}">Planning</a></li>
|
class="{% if 'planning' in request.path %}active{% endif %}"
|
||||||
|
data-tianji-event="nav_planning">Planning</a></li>
|
||||||
<li><a href="{% url 'financial_index' %}"
|
<li><a href="{% url 'financial_index' %}"
|
||||||
class="{% if 'financial' in request.path %}active{% endif %}">Financials</a></li>
|
class="{% if 'financial' in request.path %}active{% endif %}"
|
||||||
|
data-tianji-event="nav_financials">Financials</a></li>
|
||||||
<li class="dropdown" id="user-profile-dropdown">
|
<li class="dropdown" id="user-profile-dropdown">
|
||||||
<a href="#" class="profile-icon-link" title="{{ user.get_full_name|default:user.username }}">
|
<a href="#" class="profile-icon-link" title="{{ user.get_full_name|default:user.username }}">
|
||||||
<svg class="profile-icon" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" fill="none"
|
<svg class="profile-icon" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" fill="none"
|
||||||
@@ -96,7 +103,8 @@
|
|||||||
</li>
|
</li>
|
||||||
{% else %}
|
{% else %}
|
||||||
<li><a href="{% url 'login' %}" class="btn"
|
<li><a href="{% url 'login' %}" class="btn"
|
||||||
style="border: 1px solid var(--primary-color); padding: 0.4rem 1rem; border-radius: 4px; margin-left: 1rem; color: #000;">Sign
|
style="border: 1px solid var(--primary-color); padding: 0.4rem 1rem; border-radius: 4px; margin-left: 1rem; color: #000;"
|
||||||
|
data-tianji-event="nav_sign_in">Sign
|
||||||
In</a></li>
|
In</a></li>
|
||||||
{% endif %}
|
{% endif %}
|
||||||
</ul>
|
</ul>
|
||||||
@@ -111,12 +119,36 @@
|
|||||||
<footer class="footer">
|
<footer class="footer">
|
||||||
<div class="container">
|
<div class="container">
|
||||||
<p class="footer-text">AI ML Operations, LLC — Forward-deployed AI engineering.</p>
|
<p class="footer-text">AI ML Operations, LLC — Forward-deployed AI engineering.</p>
|
||||||
|
<p class="footer-links">
|
||||||
|
<a href="{% url 'terms_of_service' %}" data-tianji-event="footer_terms">Terms & Privacy</a>
|
||||||
|
{% if tianji_enabled %}
|
||||||
|
<span class="footer-separator">|</span>
|
||||||
|
<a href="#" data-open-cookie-preferences data-tianji-event="footer_cookie_preferences">Cookie Preferences</a>
|
||||||
|
{% endif %}
|
||||||
|
</p>
|
||||||
<p class="footer-text footer-text--muted">© 2023 -
|
<p class="footer-text footer-text--muted">© 2023 -
|
||||||
<script>document.write(new Date().getFullYear());</script> All rights reserved.
|
<script>document.write(new Date().getFullYear());</script> All rights reserved.
|
||||||
</p>
|
</p>
|
||||||
</div>
|
</div>
|
||||||
</footer>
|
</footer>
|
||||||
|
|
||||||
|
{% if tianji_enabled %}
|
||||||
|
<div id="cookie-consent-banner" class="cookie-consent-banner" hidden role="dialog" aria-live="polite"
|
||||||
|
aria-label="Cookie consent">
|
||||||
|
<div class="cookie-consent-content">
|
||||||
|
<p class="cookie-consent-text">
|
||||||
|
We use Tianji analytics to understand how visitors use our site. Tracking runs only if you accept.
|
||||||
|
See our <a href="{% url 'terms_of_service' %}">Terms of Service & Privacy Policy</a> for details.
|
||||||
|
</p>
|
||||||
|
<div class="cookie-consent-actions">
|
||||||
|
<button type="button" id="cookie-consent-decline" class="btn btn-outline">Decline</button>
|
||||||
|
<button type="button" id="cookie-consent-accept" class="btn">Accept Analytics</button>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
<script src="{% static 'public/js/tianji-consent.js' %}"></script>
|
||||||
|
{% endif %}
|
||||||
|
|
||||||
<script>
|
<script>
|
||||||
document.addEventListener('DOMContentLoaded', function () {
|
document.addEventListener('DOMContentLoaded', function () {
|
||||||
const mobileBtn = document.querySelector('.mobile-menu-btn');
|
const mobileBtn = document.querySelector('.mobile-menu-btn');
|
||||||
@@ -129,6 +161,7 @@
|
|||||||
}
|
}
|
||||||
});
|
});
|
||||||
</script>
|
</script>
|
||||||
|
{% block tracking_events %}{% endblock %}
|
||||||
</body>
|
</body>
|
||||||
|
|
||||||
</html>
|
</html>
|
||||||
@@ -83,7 +83,8 @@ workshops, and training for teams.{% endblock %}
|
|||||||
<h2 class="section-title">Ready to Transform Your Business?</h2>
|
<h2 class="section-title">Ready to Transform Your Business?</h2>
|
||||||
<p class="hero-subtitle" style="margin-bottom: 2rem;">Contact us today to schedule your AI Education sessions.</p>
|
<p class="hero-subtitle" style="margin-bottom: 2rem;">Contact us today to schedule your AI Education sessions.</p>
|
||||||
<a href="{% url 'contact' %}"
|
<a href="{% url 'contact' %}"
|
||||||
style="display: inline-block; padding: 1rem 2rem; background: var(--primary-color); color: black; font-weight: bold; border-radius: 30px; text-transform: uppercase;">Get
|
style="display: inline-block; padding: 1rem 2rem; background: var(--primary-color); color: black; font-weight: bold; border-radius: 30px; text-transform: uppercase;"
|
||||||
|
data-tianji-event="service_cta" data-tianji-event-page="ai_education" data-tianji-event-action="get_started">Get
|
||||||
Started</a>
|
Started</a>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
|
|||||||
@@ -86,7 +86,8 @@ Machine Vision, Pattern Recognition, and NLP for sensors.{% endblock %}
|
|||||||
<div class="container">
|
<div class="container">
|
||||||
<h2 class="section-title">Ready to Enhance Your Sensors?</h2>
|
<h2 class="section-title">Ready to Enhance Your Sensors?</h2>
|
||||||
<p class="hero-subtitle" style="margin-bottom: 2rem;">Contact us today to discuss your AI sensor needs.</p>
|
<p class="hero-subtitle" style="margin-bottom: 2rem;">Contact us today to discuss your AI sensor needs.</p>
|
||||||
<a href="{% url 'contact' %}" class="btn">Get Started</a>
|
<a href="{% url 'contact' %}" class="btn"
|
||||||
|
data-tianji-event="service_cta" data-tianji-event-page="ai_sensor" data-tianji-event-action="get_started">Get Started</a>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
{% endblock %}
|
{% endblock %}
|
||||||
@@ -14,7 +14,8 @@
|
|||||||
Proprietary agents built for your workflows and conversations—hosted, scalable, and observable.
|
Proprietary agents built for your workflows and conversations—hosted, scalable, and observable.
|
||||||
</p>
|
</p>
|
||||||
<div class="hero-cta">
|
<div class="hero-cta">
|
||||||
<a href="{% url 'contact' %}?subject=AI%20Agents" class="btn">Build Your Agent</a>
|
<a href="{% url 'contact' %}?subject=AI%20Agents" class="btn"
|
||||||
|
data-tianji-event="service_cta" data-tianji-event-page="bot" data-tianji-event-action="build_agent">Build Your Agent</a>
|
||||||
<a href="{% url 'forward_deployed' %}" class="btn btn-secondary">Forward-Deployed AI</a>
|
<a href="{% url 'forward_deployed' %}" class="btn btn-secondary">Forward-Deployed AI</a>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
@@ -121,7 +122,8 @@
|
|||||||
<div class="container">
|
<div class="container">
|
||||||
<h2 class="section-title">Ready to Automate?</h2>
|
<h2 class="section-title">Ready to Automate?</h2>
|
||||||
<p class="hero-subtitle" style="margin-bottom: 2rem;">Tell us the workflow you want an agent to own—we will design, deploy, and monitor it.</p>
|
<p class="hero-subtitle" style="margin-bottom: 2rem;">Tell us the workflow you want an agent to own—we will design, deploy, and monitor it.</p>
|
||||||
<a href="{% url 'contact' %}?subject=AI%20Agents" class="btn">Get Started</a>
|
<a href="{% url 'contact' %}?subject=AI%20Agents" class="btn"
|
||||||
|
data-tianji-event="service_cta" data-tianji-event-page="bot" data-tianji-event-action="get_started">Get Started</a>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
{% endblock %}
|
{% endblock %}
|
||||||
|
|||||||
@@ -41,7 +41,8 @@
|
|||||||
|
|
||||||
<div style="margin-top: 2rem;">
|
<div style="margin-top: 2rem;">
|
||||||
<button type="submit" class="btn"
|
<button type="submit" class="btn"
|
||||||
style="width: 100%; padding: 0.75rem; background: var(--primary-color); color: white; border: none; border-radius: 4px; cursor: pointer; font-weight: 600; background: linear-gradient(90deg, #00d4ff 0%, #0099ff 100%);">Update
|
style="width: 100%; padding: 0.75rem; background: var(--primary-color); color: white; border: none; border-radius: 4px; cursor: pointer; font-weight: 600; background: linear-gradient(90deg, #00d4ff 0%, #0099ff 100%);"
|
||||||
|
data-tianji-event="password_change_submit">Update
|
||||||
Password</button>
|
Password</button>
|
||||||
</div>
|
</div>
|
||||||
</form>
|
</form>
|
||||||
|
|||||||
@@ -15,7 +15,8 @@
|
|||||||
designed to keep your data under your control.
|
designed to keep your data under your control.
|
||||||
</p>
|
</p>
|
||||||
<div style="display: flex; gap: 1rem; flex-wrap: wrap;">
|
<div style="display: flex; gap: 1rem; flex-wrap: wrap;">
|
||||||
<a href="https://chat.aimloperations.com" class="btn">Launch Chat</a>
|
<a href="https://chat.aimloperations.com" class="btn" target="_blank" rel="noopener noreferrer"
|
||||||
|
data-tianji-event="external_launch" data-tianji-event-product="chat">Launch Chat</a>
|
||||||
<a href="#features" class="btn"
|
<a href="#features" class="btn"
|
||||||
style="background: transparent; border: 1px solid var(--text-muted); color: var(--text-color);">Learn More</a>
|
style="background: transparent; border: 1px solid var(--text-muted); color: var(--text-color);">Learn More</a>
|
||||||
</div>
|
</div>
|
||||||
@@ -64,7 +65,8 @@
|
|||||||
<p style="color: var(--text-muted); margin-bottom: 2.5rem; font-size: 1.1rem;">
|
<p style="color: var(--text-muted); margin-bottom: 2.5rem; font-size: 1.1rem;">
|
||||||
Get full access to all features, including unlimited chats and file analysis.
|
Get full access to all features, including unlimited chats and file analysis.
|
||||||
</p>
|
</p>
|
||||||
<a class="btn" href="https://chat.aimloperations.com">Start Your Free Trial</a>
|
<a class="btn" href="https://chat.aimloperations.com" target="_blank" rel="noopener noreferrer"
|
||||||
|
data-tianji-event="external_launch" data-tianji-event-product="chat_trial">Start Your Free Trial</a>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
|
|||||||
@@ -87,7 +87,8 @@ PCs to AI servers and workstations.{% endblock %}
|
|||||||
<div class="container">
|
<div class="container">
|
||||||
<h2 class="section-title">Ready to Upgrade Your Systems?</h2>
|
<h2 class="section-title">Ready to Upgrade Your Systems?</h2>
|
||||||
<p class="hero-subtitle" style="margin-bottom: 2rem;">Contact us today to discuss your computer needs.</p>
|
<p class="hero-subtitle" style="margin-bottom: 2rem;">Contact us today to discuss your computer needs.</p>
|
||||||
<a href="{% url 'contact' %}" class="btn">Get Started</a>
|
<a href="{% url 'contact' %}" class="btn"
|
||||||
|
data-tianji-event="service_cta" data-tianji-event-page="computers" data-tianji-event-action="get_started">Get Started</a>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
{% endblock %}
|
{% endblock %}
|
||||||
@@ -58,7 +58,8 @@
|
|||||||
{% endif %}
|
{% endif %}
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
<button class="btn" type="submit">
|
<button class="btn" type="submit"
|
||||||
|
data-tianji-event="contact_form_submit">
|
||||||
Send Message
|
Send Message
|
||||||
</button>
|
</button>
|
||||||
</form>
|
</form>
|
||||||
@@ -85,4 +86,14 @@
|
|||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
|
{% endblock %}
|
||||||
|
|
||||||
|
{% block tracking_events %}
|
||||||
|
{% if success %}
|
||||||
|
<script>
|
||||||
|
if (window.aimlTrackWhenReady) {
|
||||||
|
window.aimlTrackWhenReady('contact_form_success');
|
||||||
|
}
|
||||||
|
</script>
|
||||||
|
{% endif %}
|
||||||
{% endblock %}
|
{% endblock %}
|
||||||
@@ -82,7 +82,8 @@ Protect your data with our advanced storage solutions.{% endblock %}
|
|||||||
<h2 class="section-title">Ready to Secure Your Files?</h2>
|
<h2 class="section-title">Ready to Secure Your Files?</h2>
|
||||||
<p class="hero-subtitle" style="margin-bottom: 2rem;">Contact us today to get started with our file hosting service.
|
<p class="hero-subtitle" style="margin-bottom: 2rem;">Contact us today to get started with our file hosting service.
|
||||||
</p>
|
</p>
|
||||||
<a href="{% url 'contact' %}" class="btn">Get Started</a>
|
<a href="{% url 'contact' %}" class="btn"
|
||||||
|
data-tianji-event="service_cta" data-tianji-event-page="file_hosting" data-tianji-event-action="get_started">Get Started</a>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
|
|||||||
@@ -145,7 +145,8 @@
|
|||||||
<h2 class="section-title">Ready to Deploy?</h2>
|
<h2 class="section-title">Ready to Deploy?</h2>
|
||||||
<p class="hero-subtitle" style="margin-bottom: 2rem;">Tell us the workflow that is costing you the most time. We will help you automate it.</p>
|
<p class="hero-subtitle" style="margin-bottom: 2rem;">Tell us the workflow that is costing you the most time. We will help you automate it.</p>
|
||||||
<div class="hero-cta" style="margin-top: 0;">
|
<div class="hero-cta" style="margin-top: 0;">
|
||||||
<a href="{% url 'contact' %}?subject=Forward-Deployed%20AI" class="btn">Start a Conversation</a>
|
<a href="{% url 'contact' %}?subject=Forward-Deployed%20AI" class="btn"
|
||||||
|
data-tianji-event="service_cta" data-tianji-event-page="forward_deployed" data-tianji-event-action="start_conversation">Start a Conversation</a>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
|
|||||||
@@ -84,7 +84,8 @@ supervised, unsupervised, and reinforcement learning.{% endblock %}
|
|||||||
<div class="container">
|
<div class="container">
|
||||||
<h2 class="section-title">Ready to Solve Your Problem?</h2>
|
<h2 class="section-title">Ready to Solve Your Problem?</h2>
|
||||||
<p class="hero-subtitle" style="margin-bottom: 2rem;">Contact us today to create your custom ML model.</p>
|
<p class="hero-subtitle" style="margin-bottom: 2rem;">Contact us today to create your custom ML model.</p>
|
||||||
<a href="{% url 'contact' %}" class="btn">Get Started</a>
|
<a href="{% url 'contact' %}" class="btn"
|
||||||
|
data-tianji-event="service_cta" data-tianji-event-page="ml_model" data-tianji-event-action="get_started">Get Started</a>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
{% endblock %}
|
{% endblock %}
|
||||||
@@ -18,7 +18,8 @@
|
|||||||
Forward-deployed AI engineering. We embed with your team to architect, build, and deploy custom AI workflows that solve complex operational bottlenecks.
|
Forward-deployed AI engineering. We embed with your team to architect, build, and deploy custom AI workflows that solve complex operational bottlenecks.
|
||||||
</p>
|
</p>
|
||||||
<div class="hero-cta">
|
<div class="hero-cta">
|
||||||
<a href="{% url 'forward_deployed' %}" class="btn btn-secondary">See How We Deploy</a>
|
<a href="{% url 'forward_deployed' %}" class="btn btn-secondary"
|
||||||
|
data-tianji-event="hero_cta" data-tianji-event-destination="forward_deployed">See How We Deploy</a>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
@@ -167,50 +168,59 @@
|
|||||||
</p>
|
</p>
|
||||||
<div class="card-grid">
|
<div class="card-grid">
|
||||||
|
|
||||||
<a href="{% url 'forward_deployed' %}" class="card card-featured">
|
<a href="{% url 'forward_deployed' %}" class="card card-featured"
|
||||||
|
data-tianji-event="service_click" data-tianji-event-service="Forward-Deployed AI">
|
||||||
<span class="card-badge">Primary</span>
|
<span class="card-badge">Primary</span>
|
||||||
<span class="card-title">Forward-Deployed AI</span>
|
<span class="card-title">Forward-Deployed AI</span>
|
||||||
<p class="card-text">Embed with your team to map bottlenecks, build integrations, and deploy custom AI workflows in your environment.</p>
|
<p class="card-text">Embed with your team to map bottlenecks, build integrations, and deploy custom AI workflows in your environment.</p>
|
||||||
</a>
|
</a>
|
||||||
|
|
||||||
<a href="{% url 'bot' %}" class="card card-featured">
|
<a href="{% url 'bot' %}" class="card card-featured"
|
||||||
|
data-tianji-event="service_click" data-tianji-event-service="AI Agents">
|
||||||
<span class="card-badge">Primary</span>
|
<span class="card-badge">Primary</span>
|
||||||
<span class="card-title">AI Agents & Automation</span>
|
<span class="card-title">AI Agents & Automation</span>
|
||||||
<p class="card-text">Proprietary web-hosted agents for your workflows and conversations—scalable hosting plus performance and real-time analytics.</p>
|
<p class="card-text">Proprietary web-hosted agents for your workflows and conversations—scalable hosting plus performance and real-time analytics.</p>
|
||||||
</a>
|
</a>
|
||||||
|
|
||||||
<a href="{% url 'web_design' %}" class="card">
|
<a href="{% url 'web_design' %}" class="card"
|
||||||
|
data-tianji-event="service_click" data-tianji-event-service="Web Design">
|
||||||
<span class="card-badge">Primary</span>
|
<span class="card-badge">Primary</span>
|
||||||
<span class="card-title">Web Design and Hosting</span>
|
<span class="card-title">Web Design and Hosting</span>
|
||||||
<p class="card-text">Modern websites with reliable hosting for your online presence.</p>
|
<p class="card-text">Modern websites with reliable hosting for your online presence.</p>
|
||||||
</a>
|
</a>
|
||||||
|
|
||||||
<a href="{% url 'ml_model' %}" class="card">
|
<a href="{% url 'ml_model' %}" class="card"
|
||||||
|
data-tianji-event="service_click" data-tianji-event-service="ML Model Creation">
|
||||||
<span class="card-title">ML Model Creation</span>
|
<span class="card-title">ML Model Creation</span>
|
||||||
<p class="card-text">Custom models designed for deployment inside your pipelines—not experiments that never ship.</p>
|
<p class="card-text">Custom models designed for deployment inside your pipelines—not experiments that never ship.</p>
|
||||||
</a>
|
</a>
|
||||||
|
|
||||||
<a href="{% url 'chat' %}" class="card">
|
<a href="{% url 'chat' %}" class="card"
|
||||||
|
data-tianji-event="service_click" data-tianji-event-service="Secure AI Chat">
|
||||||
<span class="card-title">Secure AI Chat</span>
|
<span class="card-title">Secure AI Chat</span>
|
||||||
<p class="card-text">Hosted LLM workspace with privacy-first architecture—an example of how we deliver scalable, observable AI products.</p>
|
<p class="card-text">Hosted LLM workspace with privacy-first architecture—an example of how we deliver scalable, observable AI products.</p>
|
||||||
</a>
|
</a>
|
||||||
|
|
||||||
<a href="{% url 'ai_sensor' %}" class="card">
|
<a href="{% url 'ai_sensor' %}" class="card"
|
||||||
|
data-tianji-event="service_click" data-tianji-event-service="AI Sensor Algorithms">
|
||||||
<span class="card-title">AI Sensor Algorithms</span>
|
<span class="card-title">AI Sensor Algorithms</span>
|
||||||
<p class="card-text">Intelligent algorithms for sensor data processing, real-time insights, and IoT applications.</p>
|
<p class="card-text">Intelligent algorithms for sensor data processing, real-time insights, and IoT applications.</p>
|
||||||
</a>
|
</a>
|
||||||
|
|
||||||
<a href="{% url 'ai_education' %}" class="card">
|
<a href="{% url 'ai_education' %}" class="card"
|
||||||
|
data-tianji-event="service_click" data-tianji-event-service="AI Education">
|
||||||
<span class="card-title">AI Education</span>
|
<span class="card-title">AI Education</span>
|
||||||
<p class="card-text">Tailored AI training for your team—in-person or virtual.</p>
|
<p class="card-text">Tailored AI training for your team—in-person or virtual.</p>
|
||||||
</a>
|
</a>
|
||||||
|
|
||||||
<a href="{% url 'computers' %}" class="card">
|
<a href="{% url 'computers' %}" class="card"
|
||||||
|
data-tianji-event="service_click" data-tianji-event-service="Computer Builds">
|
||||||
<span class="card-title">Computer Builds</span>
|
<span class="card-title">Computer Builds</span>
|
||||||
<p class="card-text">Servers and workstations for compute, storage, and local inference workloads.</p>
|
<p class="card-text">Servers and workstations for compute, storage, and local inference workloads.</p>
|
||||||
</a>
|
</a>
|
||||||
|
|
||||||
<a href="{% url 'file_hosting' %}" class="card">
|
<a href="{% url 'file_hosting' %}" class="card"
|
||||||
|
data-tianji-event="service_click" data-tianji-event-service="File Hosting">
|
||||||
<span class="card-title">File Hosting</span>
|
<span class="card-title">File Hosting</span>
|
||||||
<p class="card-text">Secure, scalable file hosting to store and share your data.</p>
|
<p class="card-text">Secure, scalable file hosting to store and share your data.</p>
|
||||||
</a>
|
</a>
|
||||||
|
|||||||
@@ -0,0 +1,202 @@
|
|||||||
|
{% extends "base.html" %}
|
||||||
|
|
||||||
|
{% block title %}Terms of Service & Privacy Policy - AI ML Operations, LLC{% endblock %}
|
||||||
|
{% block meta_description %}Terms of Service and Privacy Policy for AI ML Operations, LLC, including how we collect, use, and protect your information and analytics practices.{% endblock %}
|
||||||
|
|
||||||
|
{% block content %}
|
||||||
|
<div class="section">
|
||||||
|
<div class="container legal-page">
|
||||||
|
<h1 class="section-title">Terms of Service & Privacy Policy</h1>
|
||||||
|
<p class="legal-updated">Last updated: June 28, 2026</p>
|
||||||
|
|
||||||
|
<div class="legal-content">
|
||||||
|
<p>
|
||||||
|
These Terms of Service and Privacy Policy ("Terms") govern your access to and use of the website and online
|
||||||
|
services operated by AI ML Operations, LLC ("AI ML Operations," "we," "us," or "our"). By accessing or using
|
||||||
|
our website, you agree to these Terms. If you do not agree, do not use the site.
|
||||||
|
</p>
|
||||||
|
|
||||||
|
<h2>1. Use of the Website</h2>
|
||||||
|
<p>
|
||||||
|
You may use our website for lawful purposes only. You agree not to misuse the site, attempt unauthorized
|
||||||
|
access to our systems, interfere with site operation, or use the site in any way that violates applicable law.
|
||||||
|
</p>
|
||||||
|
<p>
|
||||||
|
Certain areas of the site, including internal planning and financial tools, are available only to
|
||||||
|
authenticated users authorized by AI ML Operations. You are responsible for maintaining the confidentiality
|
||||||
|
of your account credentials.
|
||||||
|
</p>
|
||||||
|
|
||||||
|
<h2>2. Services and Information</h2>
|
||||||
|
<p>
|
||||||
|
Content on this website describes our AI engineering, consulting, and related services. Information on the
|
||||||
|
site is provided for general informational purposes and does not constitute a binding offer unless expressly
|
||||||
|
agreed in a separate written contract.
|
||||||
|
</p>
|
||||||
|
|
||||||
|
<h2>3. Contact Submissions</h2>
|
||||||
|
<p>
|
||||||
|
When you submit a contact form, you represent that the information you provide is accurate and that you
|
||||||
|
have the right to share it with us. We may use that information to respond to your inquiry and for related
|
||||||
|
business communications.
|
||||||
|
</p>
|
||||||
|
|
||||||
|
<h2>4. Privacy Policy</h2>
|
||||||
|
<p>
|
||||||
|
This Privacy Policy explains what information we collect, how we use it, and the choices you have. It applies
|
||||||
|
to visitors and authenticated users of our public website and internal tools.
|
||||||
|
</p>
|
||||||
|
|
||||||
|
<h3>4.1 Information We Collect</h3>
|
||||||
|
<p>Depending on how you use the site, we may collect:</p>
|
||||||
|
<ul>
|
||||||
|
<li><strong>Information you provide:</strong> name, email address, message content, and other details submitted through contact forms or account-related requests.</li>
|
||||||
|
<li><strong>Account information:</strong> username and authentication data for authorized users of internal tools.</li>
|
||||||
|
<li><strong>Usage and analytics data:</strong> if you accept analytics in our cookie banner, we collect information about how you interact with the site, as described in Section 4.2.</li>
|
||||||
|
<li><strong>Technical information:</strong> browser type, device type, operating system, language, referring URLs, and similar data collected automatically when you use the site.</li>
|
||||||
|
</ul>
|
||||||
|
<p>
|
||||||
|
We do not intentionally collect sensitive personal information through the public website unless you choose to
|
||||||
|
include it in a message you send us.
|
||||||
|
</p>
|
||||||
|
|
||||||
|
<h3>4.2 Analytics and Usage Tracking</h3>
|
||||||
|
<p>
|
||||||
|
We use Tianji, a self-hosted analytics platform, to understand how visitors use our website and internal
|
||||||
|
tools. Tracking is enabled only after you provide consent through our cookie banner.
|
||||||
|
</p>
|
||||||
|
<p>When you accept analytics, we may collect information such as:</p>
|
||||||
|
<ul>
|
||||||
|
<li>Pages viewed and navigation paths</li>
|
||||||
|
<li>Approximate geographic location derived from truncated IP addresses</li>
|
||||||
|
<li>Browser type, device type, operating system, and language</li>
|
||||||
|
<li>Referring website or campaign parameters (UTM tags)</li>
|
||||||
|
<li>Custom interaction events, such as button clicks, form submissions, and feature usage</li>
|
||||||
|
<li>For signed-in users, an internal user identifier to associate activity with an account session</li>
|
||||||
|
</ul>
|
||||||
|
<p>
|
||||||
|
We do not use Tianji to sell your personal information. Analytics data helps us improve site performance,
|
||||||
|
content, and product usability. You may decline analytics at any time using the cookie preferences link
|
||||||
|
in the site footer. If you decline, the analytics script will not load.
|
||||||
|
</p>
|
||||||
|
<p>
|
||||||
|
We store your consent choice locally in your browser so we can remember your preference on future visits.
|
||||||
|
</p>
|
||||||
|
|
||||||
|
<h3>4.3 Cookies and Local Storage</h3>
|
||||||
|
<p>
|
||||||
|
In addition to analytics consent storage, our site uses essential cookies and session storage required for
|
||||||
|
authentication, security (including CSRF protection), and basic site functionality. These essential
|
||||||
|
technologies are necessary for the site to operate and are not used for marketing analytics.
|
||||||
|
</p>
|
||||||
|
|
||||||
|
<h3>4.4 How We Use Information</h3>
|
||||||
|
<p>We use collected information to:</p>
|
||||||
|
<ul>
|
||||||
|
<li>Operate, maintain, and secure the website and internal tools</li>
|
||||||
|
<li>Respond to contact requests and communicate with you about our services</li>
|
||||||
|
<li>Authenticate authorized users and provide access to restricted areas</li>
|
||||||
|
<li>Understand site usage and improve content, performance, and user experience</li>
|
||||||
|
<li>Comply with legal obligations and enforce these Terms</li>
|
||||||
|
</ul>
|
||||||
|
|
||||||
|
<h3>4.5 How We Share Information</h3>
|
||||||
|
<p>
|
||||||
|
We do not sell your personal information. We may share information only in these limited circumstances:
|
||||||
|
</p>
|
||||||
|
<ul>
|
||||||
|
<li>With service providers that help us operate the site (such as email delivery), subject to appropriate safeguards</li>
|
||||||
|
<li>When required by law, regulation, legal process, or governmental request</li>
|
||||||
|
<li>To protect the rights, property, or safety of AI ML Operations, our users, or others</li>
|
||||||
|
<li>In connection with a business transaction such as a merger or acquisition, with notice where required by law</li>
|
||||||
|
</ul>
|
||||||
|
<p>
|
||||||
|
Analytics data collected through Tianji is processed on our self-hosted analytics infrastructure and is not
|
||||||
|
shared with third-party advertising networks.
|
||||||
|
</p>
|
||||||
|
|
||||||
|
<h3>4.6 Data Retention</h3>
|
||||||
|
<p>
|
||||||
|
We retain contact form submissions and business communications for as long as needed to respond to inquiries,
|
||||||
|
maintain business records, and comply with legal obligations. Analytics data is retained according to our
|
||||||
|
internal retention settings on the Tianji platform. Account-related data is retained while your account is
|
||||||
|
active and as required thereafter for legitimate business or legal purposes.
|
||||||
|
</p>
|
||||||
|
|
||||||
|
<h3>4.7 Your Choices and Rights</h3>
|
||||||
|
<p>You can:</p>
|
||||||
|
<ul>
|
||||||
|
<li>Accept or decline analytics tracking through our cookie banner or the cookie preferences link in the footer</li>
|
||||||
|
<li>Contact us to request access to, correction of, or deletion of personal information you have provided, subject to applicable law</li>
|
||||||
|
<li>Disable non-essential browser storage or cookies through your browser settings, though essential site features may not function properly</li>
|
||||||
|
</ul>
|
||||||
|
<p>
|
||||||
|
Depending on your location, you may have additional privacy rights under applicable law. To exercise those
|
||||||
|
rights, contact us using the information in Section 12.
|
||||||
|
</p>
|
||||||
|
|
||||||
|
<h3>4.8 Security</h3>
|
||||||
|
<p>
|
||||||
|
We use reasonable administrative, technical, and organizational measures to protect information we collect.
|
||||||
|
No method of transmission or storage is completely secure, and we cannot guarantee absolute security.
|
||||||
|
</p>
|
||||||
|
|
||||||
|
<h3>4.9 Children's Privacy</h3>
|
||||||
|
<p>
|
||||||
|
Our website is not directed to children under 13, and we do not knowingly collect personal information from
|
||||||
|
children under 13. If you believe we have collected such information, contact us and we will take steps to
|
||||||
|
delete it.
|
||||||
|
</p>
|
||||||
|
|
||||||
|
<h2>5. Intellectual Property</h2>
|
||||||
|
<p>
|
||||||
|
The website, branding, text, graphics, logos, and other content are owned by AI ML Operations or its
|
||||||
|
licensors and are protected by applicable intellectual property laws. You may not copy, modify, distribute,
|
||||||
|
or create derivative works without our prior written permission, except as permitted by law.
|
||||||
|
</p>
|
||||||
|
|
||||||
|
<h2>6. Third-Party Links</h2>
|
||||||
|
<p>
|
||||||
|
Our site may contain links to third-party websites or services. We are not responsible for the content,
|
||||||
|
privacy practices, or terms of those third parties. Your use of third-party sites is at your own risk.
|
||||||
|
</p>
|
||||||
|
|
||||||
|
<h2>7. Disclaimer of Warranties</h2>
|
||||||
|
<p>
|
||||||
|
The website and its content are provided "as is" and "as available" without warranties of any kind, whether
|
||||||
|
express or implied, including implied warranties of merchantability, fitness for a particular purpose, and
|
||||||
|
non-infringement. We do not warrant that the site will be uninterrupted, error-free, or secure.
|
||||||
|
</p>
|
||||||
|
|
||||||
|
<h2>8. Limitation of Liability</h2>
|
||||||
|
<p>
|
||||||
|
To the fullest extent permitted by law, AI ML Operations will not be liable for any indirect, incidental,
|
||||||
|
special, consequential, or punitive damages, or any loss of profits, data, or goodwill, arising from your use
|
||||||
|
of the website. Our total liability for any claim relating to the website will not exceed one hundred U.S.
|
||||||
|
dollars (USD $100), unless applicable law requires otherwise.
|
||||||
|
</p>
|
||||||
|
|
||||||
|
<h2>9. Changes to These Terms</h2>
|
||||||
|
<p>
|
||||||
|
We may update these Terms from time to time. The "Last updated" date at the top of this page indicates when
|
||||||
|
the Terms were most recently revised. Continued use of the site after changes become effective constitutes
|
||||||
|
acceptance of the revised Terms.
|
||||||
|
</p>
|
||||||
|
|
||||||
|
<h2>10. Governing Law</h2>
|
||||||
|
<p>
|
||||||
|
These Terms are governed by the laws of the State of Ohio, United States, without regard to conflict-of-law
|
||||||
|
principles. Any dispute arising under these Terms will be resolved in the courts located in Ohio, unless
|
||||||
|
applicable law requires a different venue.
|
||||||
|
</p>
|
||||||
|
|
||||||
|
<h2>11. Contact Us</h2>
|
||||||
|
<p>
|
||||||
|
If you have questions about these Terms, our privacy practices, or your data, contact us at
|
||||||
|
<a href="mailto:ryan@aimloperations.com">ryan@aimloperations.com</a> or through our
|
||||||
|
<a href="{% url 'contact' %}">contact page</a>.
|
||||||
|
</p>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
{% endblock %}
|
||||||
@@ -186,7 +186,8 @@ visually stunning, functional websites tailored to your business.{% endblock %}
|
|||||||
<div class="container">
|
<div class="container">
|
||||||
<h2 class="section-title">Ready to Build Your Online Presence?</h2>
|
<h2 class="section-title">Ready to Build Your Online Presence?</h2>
|
||||||
<p class="hero-subtitle" style="margin-bottom: 2rem;">Contact us today to get started on your website project.</p>
|
<p class="hero-subtitle" style="margin-bottom: 2rem;">Contact us today to get started on your website project.</p>
|
||||||
<a href="{% url 'contact' %}" class="btn">Get Started</a>
|
<a href="{% url 'contact' %}" class="btn"
|
||||||
|
data-tianji-event="service_cta" data-tianji-event-page="web_design" data-tianji-event-action="get_started">Get Started</a>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
{% endblock %}
|
{% endblock %}
|
||||||
@@ -27,7 +27,8 @@
|
|||||||
<input type="password" name="password" autocomplete="current-password" required id="id_password" class="form-control" style="width: 100%; padding: 0.8rem; background: rgba(0,0,0,0.2); border: 1px solid rgba(255,255,255,0.1); border-radius: 6px; color: white;">
|
<input type="password" name="password" autocomplete="current-password" required id="id_password" class="form-control" style="width: 100%; padding: 0.8rem; background: rgba(0,0,0,0.2); border: 1px solid rgba(255,255,255,0.1); border-radius: 6px; color: white;">
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
<button type="submit" class="btn" style="width: 100%; padding: 0.8rem; font-size: 1.1rem; border-radius: 6px; background: var(--primary-color); color: #000; font-weight: bold; border: none; cursor: pointer; transition: 0.2s;" onmouseover="this.style.boxShadow='0 0 15px var(--primary-color)'" onmouseout="this.style.boxShadow='none'">Sign In</button>
|
<button type="submit" class="btn" style="width: 100%; padding: 0.8rem; font-size: 1.1rem; border-radius: 6px; background: var(--primary-color); color: #000; font-weight: bold; border: none; cursor: pointer; transition: 0.2s;" onmouseover="this.style.boxShadow='0 0 15px var(--primary-color)'" onmouseout="this.style.boxShadow='none'"
|
||||||
|
data-tianji-event="login_submit">Sign In</button>
|
||||||
<input type="hidden" name="next" value="{{ next|default:'/' }}">
|
<input type="hidden" name="next" value="{{ next|default:'/' }}">
|
||||||
</form>
|
</form>
|
||||||
</div>
|
</div>
|
||||||
|
|||||||
@@ -14,6 +14,7 @@ urlpatterns = [
|
|||||||
path("forward-deployed-ai", views.forward_deployed, name="forward_deployed"),
|
path("forward-deployed-ai", views.forward_deployed, name="forward_deployed"),
|
||||||
path("ml_model", views.ml_model, name="ml_model"),
|
path("ml_model", views.ml_model, name="ml_model"),
|
||||||
path("contact", views.contact, name="contact"),
|
path("contact", views.contact, name="contact"),
|
||||||
|
path("terms", views.terms_of_service, name="terms_of_service"),
|
||||||
path("change_password", views.change_password, name="change_password"),
|
path("change_password", views.change_password, name="change_password"),
|
||||||
path("preview_email/<int:pk>/", views.preview_email, name="preview_email")
|
path("preview_email/<int:pk>/", views.preview_email, name="preview_email")
|
||||||
]
|
]
|
||||||
|
|||||||
@@ -55,6 +55,9 @@ def forward_deployed(request):
|
|||||||
def ml_model(request):
|
def ml_model(request):
|
||||||
return render(request, "public/ml_model.html", {})
|
return render(request, "public/ml_model.html", {})
|
||||||
|
|
||||||
|
def terms_of_service(request):
|
||||||
|
return render(request, "public/terms_of_service.html", {})
|
||||||
|
|
||||||
@login_required
|
@login_required
|
||||||
def preview_email(request, pk):
|
def preview_email(request, pk):
|
||||||
email_instance = get_object_or_404(EmailMessage, pk=pk)
|
email_instance = get_object_or_404(EmailMessage, pk=pk)
|
||||||
|
|||||||
Reference in New Issue
Block a user