mirror of
https://github.com/thecyberlearn/quantum-ai-v2.git
synced 2026-08-18 07:52:58 +00:00
Rebrand platform from NetCop Hub to Quantum Tasks AI
- Update domain configuration to quantumtaskai.com - Change all page titles and branding across templates - Update Stripe integration with new domain URLs - Modify settings.py for new domain and cache prefixes - Update project documentation and test files - Change company name and contact information 🤖 Generated with [Claude Code](https://claude.ai/code) Co-Authored-By: Claude <noreply@anthropic.com>
This commit is contained in:
parent
9cb8dcb380
commit
8e3cf451a1
@ -4,7 +4,7 @@ This file provides guidance to Claude Code (claude.ai/code) when working with co
|
||||
|
||||
## Project Overview
|
||||
|
||||
NetCop Hub is a Django-based AI agent marketplace platform where users can purchase and interact with specialized AI agents. The system supports both webhook-based and API-based agents with integrated payment processing via Stripe.
|
||||
Quantum Tasks AI is a Django-based AI agent marketplace platform where users can purchase and interact with specialized AI agents. The system supports both webhook-based and API-based agents with integrated payment processing via Stripe.
|
||||
|
||||
## Development Commands
|
||||
|
||||
|
||||
@ -1,7 +1,7 @@
|
||||
{% extends 'base.html' %}
|
||||
{% load static %}
|
||||
|
||||
{% block title %}Data Analyzer - NetCop AI Hub{% endblock %}
|
||||
{% block title %}Data Analyzer - Quantum Tasks AI{% endblock %}
|
||||
|
||||
{% block extra_css %}
|
||||
<link rel="stylesheet" href="{% static 'css/agent-base.css' %}?v={{ timestamp }}">
|
||||
|
||||
@ -1,7 +1,7 @@
|
||||
{% extends 'base.html' %}
|
||||
{% load static %}
|
||||
|
||||
{% block title %}Email Writer Agent - NetCop AI Hub{% endblock %}
|
||||
{% block title %}Email Writer Agent - Quantum Tasks AI{% endblock %}
|
||||
|
||||
{% block extra_css %}
|
||||
<link rel="stylesheet" href="{% static 'css/agent-base.css' %}">
|
||||
|
||||
@ -1,133 +1,169 @@
|
||||
{% extends "base.html" %}
|
||||
{% extends 'base.html' %}
|
||||
{% load static %}
|
||||
|
||||
{% block title %}5 Whys Analysis Agent - NetCop AI Hub{% endblock %}
|
||||
{% block title %}5 Whys Analysis Agent - Quantum Tasks AI{% endblock %}
|
||||
|
||||
{% block extra_css %}
|
||||
<!-- Optimized Font Loading -->
|
||||
<link rel="preconnect" href="https://fonts.googleapis.com">
|
||||
<link rel="preconnect" href="https://fonts.gstatic.com" crossorigin>
|
||||
<link href="https://fonts.googleapis.com/css2?family=Inter:wght@400;500;600&display=swap" rel="stylesheet">
|
||||
|
||||
<!-- External Stylesheets -->
|
||||
<link rel="stylesheet" href="{% static 'css/themes.css' %}">
|
||||
<link rel="stylesheet" href="{% static 'css/agent-base.css' %}">
|
||||
|
||||
<!-- Five Whys Analyzer Specific Utilities -->
|
||||
<script>
|
||||
// Five Whys Analyzer - Self-contained utilities (no shared dependencies)
|
||||
const FiveWhysUtils = {
|
||||
/**
|
||||
* Update wallet balance display - Five Whys specific
|
||||
*/
|
||||
updateWalletBalance(newBalance) {
|
||||
// Update header balance (anchor tag with emoji)
|
||||
const headerBalance = document.querySelector('a[data-wallet-balance]');
|
||||
if (headerBalance) {
|
||||
headerBalance.textContent = `💰 ${newBalance.toFixed(2)} AED`;
|
||||
}
|
||||
|
||||
// Update page balance (div without emoji)
|
||||
const pageBalance = document.querySelector('div[data-wallet-balance]');
|
||||
if (pageBalance) {
|
||||
pageBalance.textContent = `${newBalance.toFixed(2)} AED`;
|
||||
}
|
||||
|
||||
window.currentWalletBalance = newBalance;
|
||||
},
|
||||
|
||||
/**
|
||||
* Show toast notification with duplicate prevention
|
||||
*/
|
||||
showToast(message, type = 'info') {
|
||||
// Prevent duplicate toasts
|
||||
const existingToast = document.querySelector('.five-whys-toast');
|
||||
if (existingToast) {
|
||||
existingToast.remove();
|
||||
}
|
||||
|
||||
const toast = document.createElement('div');
|
||||
toast.className = 'five-whys-toast';
|
||||
toast.style.cssText = `
|
||||
position: fixed;
|
||||
top: 16px;
|
||||
right: 16px;
|
||||
padding: 8px 12px;
|
||||
border-radius: 4px;
|
||||
color: white;
|
||||
font-size: 13px;
|
||||
z-index: 1000;
|
||||
max-width: 300px;
|
||||
font-weight: 500;
|
||||
${type === 'success' ? 'background: #10b981;' : 'background: #ef4444;'}
|
||||
`;
|
||||
toast.textContent = message;
|
||||
document.body.appendChild(toast);
|
||||
|
||||
setTimeout(() => {
|
||||
if (toast.parentNode) {
|
||||
toast.remove();
|
||||
}
|
||||
}, 2000);
|
||||
},
|
||||
|
||||
/**
|
||||
* Generate text for copy/download functionality
|
||||
*/
|
||||
generateTextForExport(contentElementId) {
|
||||
const content = document.getElementById(contentElementId);
|
||||
if (content) {
|
||||
return content.innerText || content.textContent || '';
|
||||
}
|
||||
return 'No content available';
|
||||
},
|
||||
|
||||
/**
|
||||
* Copy content to clipboard
|
||||
*/
|
||||
copyToClipboard(text, successMessage = 'Content copied to clipboard!') {
|
||||
navigator.clipboard.writeText(text).then(() => {
|
||||
this.showToast(`📋 ${successMessage}`, 'success');
|
||||
}).catch(() => {
|
||||
this.showToast('Failed to copy content', 'error');
|
||||
});
|
||||
},
|
||||
|
||||
/**
|
||||
* Download content as text file
|
||||
*/
|
||||
downloadAsFile(text, filename, successMessage = 'File downloaded!') {
|
||||
const blob = new Blob([text], { type: 'text/plain' });
|
||||
const url = URL.createObjectURL(blob);
|
||||
const a = document.createElement('a');
|
||||
a.href = url;
|
||||
a.download = filename || `content-${Date.now()}.txt`;
|
||||
a.click();
|
||||
URL.revokeObjectURL(url);
|
||||
this.showToast(`💾 ${successMessage}`, 'success');
|
||||
}
|
||||
};
|
||||
|
||||
// For backward compatibility, create AgentUtils alias
|
||||
const AgentUtils = FiveWhysUtils;
|
||||
</script>
|
||||
<link rel="stylesheet" href="{% static 'css/agent-base.css' %}?v={{ timestamp }}">
|
||||
{% endblock %}
|
||||
|
||||
{% block content %}
|
||||
<div class="agent-page theme-professional">
|
||||
<div class="agent-container">
|
||||
<!-- Quick Agent Access Panel -->
|
||||
{% include "components/quick_agents_panel.html" %}
|
||||
<script>
|
||||
// Agent Frontend Template - Common JavaScript Utilities
|
||||
|
||||
<!-- Main Content -->
|
||||
<div>
|
||||
<div class="card">
|
||||
<h3 class="section-title">🔍 {{ agent.name }}</h3>
|
||||
<p class="form-help">{{ agent.description }}</p>
|
||||
// Quick Agent Access Panel Functions
|
||||
function toggleQuickAgents() {
|
||||
const panel = document.getElementById('quickAgentsPanel');
|
||||
const overlay = document.getElementById('quickAgentsOverlay');
|
||||
const toggle = document.querySelector('.quick-agent-toggle');
|
||||
|
||||
const isActive = panel.classList.contains('active');
|
||||
|
||||
if (isActive) {
|
||||
panel.classList.remove('active');
|
||||
overlay.classList.remove('active');
|
||||
toggle.classList.remove('active');
|
||||
toggle.setAttribute('aria-expanded', 'false');
|
||||
panel.setAttribute('aria-hidden', 'true');
|
||||
overlay.setAttribute('aria-hidden', 'true');
|
||||
document.body.style.overflow = 'auto';
|
||||
} else {
|
||||
panel.classList.add('active');
|
||||
overlay.classList.add('active');
|
||||
toggle.classList.add('active');
|
||||
toggle.setAttribute('aria-expanded', 'true');
|
||||
panel.setAttribute('aria-hidden', 'false');
|
||||
overlay.setAttribute('aria-hidden', 'false');
|
||||
document.body.style.overflow = 'hidden';
|
||||
}
|
||||
}
|
||||
|
||||
function closeQuickAgents() {
|
||||
const panel = document.getElementById('quickAgentsPanel');
|
||||
const overlay = document.getElementById('quickAgentsOverlay');
|
||||
const toggle = document.querySelector('.quick-agent-toggle');
|
||||
|
||||
if (panel && overlay && toggle) {
|
||||
panel.classList.remove('active');
|
||||
overlay.classList.remove('active');
|
||||
toggle.classList.remove('active');
|
||||
toggle.setAttribute('aria-expanded', 'false');
|
||||
panel.setAttribute('aria-hidden', 'true');
|
||||
overlay.setAttribute('aria-hidden', 'true');
|
||||
document.body.style.overflow = 'auto';
|
||||
}
|
||||
}
|
||||
|
||||
// Toast Notification Function
|
||||
function showToast(message, type = 'info') {
|
||||
document.querySelectorAll('.toast').forEach(toast => toast.remove());
|
||||
|
||||
const toast = document.createElement('div');
|
||||
toast.className = `toast ${type}`;
|
||||
toast.textContent = message;
|
||||
|
||||
document.body.appendChild(toast);
|
||||
|
||||
setTimeout(() => toast.classList.add('show'), 100);
|
||||
|
||||
setTimeout(() => {
|
||||
toast.classList.remove('show');
|
||||
setTimeout(() => toast.remove(), 300);
|
||||
}, 3000);
|
||||
}
|
||||
|
||||
// Processing Status Functions
|
||||
function showProcessing() {
|
||||
const processingStatus = document.getElementById('processingStatus');
|
||||
processingStatus.style.display = 'block';
|
||||
processingStatus.classList.add('active');
|
||||
}
|
||||
|
||||
function hideProcessing() {
|
||||
const processingStatus = document.getElementById('processingStatus');
|
||||
processingStatus.style.display = 'none';
|
||||
processingStatus.classList.remove('active');
|
||||
}
|
||||
|
||||
// Wallet Balance Update Function
|
||||
function updateWalletBalance(newBalance) {
|
||||
if (newBalance !== undefined) {
|
||||
const walletBalance = document.getElementById('walletBalance');
|
||||
if (walletBalance) {
|
||||
walletBalance.textContent = newBalance.toFixed(2);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
// Copy to Clipboard Utility
|
||||
function copyToClipboard(text, successMessage = 'Copied to clipboard!') {
|
||||
navigator.clipboard.writeText(text).then(() => {
|
||||
showToast(`📋 ${successMessage}`, 'success');
|
||||
}).catch(() => {
|
||||
showToast('Failed to copy to clipboard', 'error');
|
||||
});
|
||||
}
|
||||
|
||||
// Download as File Utility
|
||||
function downloadAsFile(text, filename, successMessage = 'File downloaded!') {
|
||||
const blob = new Blob([text], { type: 'text/plain' });
|
||||
const url = URL.createObjectURL(blob);
|
||||
const a = document.createElement('a');
|
||||
a.href = url;
|
||||
a.download = filename || `content-${Date.now()}.txt`;
|
||||
a.click();
|
||||
URL.revokeObjectURL(url);
|
||||
showToast(`💾 ${successMessage}`, 'success');
|
||||
}
|
||||
|
||||
// Close panel on Escape key
|
||||
document.addEventListener('keydown', function(e) {
|
||||
if (e.key === 'Escape') {
|
||||
closeQuickAgents();
|
||||
}
|
||||
});
|
||||
|
||||
// Five Whys specific utilities
|
||||
const FiveWhysUtils = {
|
||||
copyReport() {
|
||||
const content = document.getElementById('reportContent');
|
||||
if (content) {
|
||||
const text = content.textContent || content.innerText || '';
|
||||
copyToClipboard(text, '5 Whys report copied to clipboard!');
|
||||
}
|
||||
},
|
||||
|
||||
downloadReport() {
|
||||
const content = document.getElementById('reportContent');
|
||||
if (content) {
|
||||
const text = content.textContent || content.innerText || '';
|
||||
downloadAsFile(text, `5-whys-report-${Date.now()}.txt`, '5 Whys report downloaded!');
|
||||
}
|
||||
}
|
||||
};
|
||||
|
||||
// Backward compatibility functions
|
||||
function copyReport() { FiveWhysUtils.copyReport(); }
|
||||
function downloadReport() { FiveWhysUtils.downloadReport(); }
|
||||
</script>
|
||||
<div class="agent-container">
|
||||
<!-- Agent Header -->
|
||||
{% include "components/agent_header.html" with agent_title="5 Whys Analyzer" agent_subtitle="AI-powered root cause analysis using the 5 Whys methodology" %}
|
||||
|
||||
<!-- Quick Agent Access Panel -->
|
||||
{% include "components/quick_agents_panel.html" %}
|
||||
|
||||
<!-- Agent Grid -->
|
||||
<div class="agent-grid">
|
||||
<div class="agent-widget widget-large" style="flex: 1; margin-right: var(--spacing-lg);">
|
||||
<div class="widget-header">
|
||||
<h3 class="widget-title">
|
||||
<span class="widget-icon">💬</span>
|
||||
5 Whys Analysis Chat
|
||||
</h3>
|
||||
</div>
|
||||
|
||||
<!-- Chat Messages Container -->
|
||||
<div class="card">
|
||||
<div class="widget-content">
|
||||
<!-- Chat Messages Container -->
|
||||
<div id="chatContainer" class="chat-container">
|
||||
<h4 class="section-subtitle">💬 Chat with 5 Whys Analyst</h4>
|
||||
|
||||
@ -168,83 +204,93 @@ const AgentUtils = FiveWhysUtils;
|
||||
</button>
|
||||
</div>
|
||||
</form>
|
||||
</div>
|
||||
|
||||
<!-- Report Generation Section -->
|
||||
<div class="card" id="reportSection">
|
||||
<h4 class="section-subtitle">📋 Generate Final Report</h4>
|
||||
<!-- Report Generation Section -->
|
||||
<div id="reportSection" style="margin-top: var(--spacing-lg);">
|
||||
<h4 class="section-subtitle">📋 Generate Final Report</h4>
|
||||
|
||||
<div id="reportNotReady" class="info-message">
|
||||
💬 Ask 2-3 questions about your problem first, then I'll generate a comprehensive report
|
||||
<div id="reportNotReady" class="info-message">
|
||||
💬 Ask 2-3 questions about your problem first, then I'll generate a comprehensive report
|
||||
</div>
|
||||
|
||||
<div id="reportReady" class="success-message" style="display: none;">
|
||||
✅ Ready! I can now generate a detailed 5 Whys analysis report based on our conversation
|
||||
</div>
|
||||
|
||||
<button
|
||||
id="generateReportBtn"
|
||||
onclick="generateReport()"
|
||||
class="btn btn-primary"
|
||||
disabled
|
||||
style="width: 100%;"
|
||||
>
|
||||
🔍 Generate Report ({{ agent.price }} AED)
|
||||
</button>
|
||||
</div>
|
||||
|
||||
<div id="reportReady" class="success-message" style="display: none;">
|
||||
✅ Ready! I can now generate a detailed 5 Whys analysis report based on our conversation
|
||||
</div>
|
||||
<!-- Generated Report Display -->
|
||||
<div id="reportResults" class="results-card" style="display: none;">
|
||||
<div class="results-header">
|
||||
<div style="font-size: 24px;">📊</div>
|
||||
<h3 style="font-size: 20px; font-weight: 600; color: var(--text-primary); margin: 0;">5 Whys Analysis Report</h3>
|
||||
<div style="background: var(--primary-color); color: white; padding: 6px 12px; border-radius: 6px; font-size: 14px; font-weight: 600; margin-left: auto;">✅ Complete</div>
|
||||
</div>
|
||||
|
||||
<button
|
||||
id="generateReportBtn"
|
||||
onclick="generateReport()"
|
||||
class="btn btn-primary"
|
||||
disabled
|
||||
style="width: 100%;"
|
||||
>
|
||||
🔍 Generate Report ({{ agent.price }} AED)
|
||||
</button>
|
||||
</div>
|
||||
<div class="results-content" id="reportContent">
|
||||
<!-- Report content will be displayed here -->
|
||||
</div>
|
||||
|
||||
<!-- Generated Report Display -->
|
||||
<div id="reportResults" class="results-card" style="display: none;">
|
||||
<div class="results-header">
|
||||
<div style="font-size: 24px;">📊</div>
|
||||
<h3 style="font-size: 20px; font-weight: 600; color: var(--text-primary); margin: 0;">5 Whys Analysis Report</h3>
|
||||
<div style="background: var(--primary-color); color: white; padding: 6px 12px; border-radius: 6px; font-size: 14px; font-weight: 600; margin-left: auto;">✅ Complete</div>
|
||||
</div>
|
||||
|
||||
<div class="results-content" id="reportContent">
|
||||
<!-- Report content will be displayed here -->
|
||||
</div>
|
||||
|
||||
<div class="action-buttons">
|
||||
<button onclick="copyReport()" class="btn btn-primary">📋 Copy Report</button>
|
||||
<button onclick="downloadReport()" class="btn btn-secondary">💾 Download Report</button>
|
||||
<div class="action-buttons">
|
||||
<button onclick="copyReport()" class="btn btn-primary">📋 Copy Report</button>
|
||||
<button onclick="downloadReport()" class="btn btn-secondary">💾 Download Report</button>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<!-- Wallet Sidebar -->
|
||||
<div class="wallet-section">
|
||||
<div class="card">
|
||||
<h3 class="section-title">💳 Your Wallet</h3>
|
||||
|
||||
<div class="wallet-balance" data-wallet-balance>{% if user.is_authenticated %}{{ user.wallet_balance|floatformat:2 }} AED{% else %}0.00 AED{% endif %}</div>
|
||||
<div class="balance-label">Available Balance</div>
|
||||
|
||||
{% if user.is_authenticated %}
|
||||
<a href="{% url 'wallet:wallet' %}" class="btn btn-primary" style="text-decoration: none; margin-top: 16px;">
|
||||
💰 Top Up Wallet
|
||||
</a>
|
||||
{% else %}
|
||||
<a href="{% url 'authentication:login' %}" class="btn btn-primary process-btn" style="text-decoration: none;">
|
||||
🔑 Login to Continue
|
||||
</a>
|
||||
{% endif %}
|
||||
<!-- How It Works Widget -->
|
||||
<div class="agent-widget widget-small" style="min-width: min(280px, 100%); max-width: min(280px, 100%); margin-left: auto;">
|
||||
<div class="widget-header">
|
||||
<h3 class="widget-title">
|
||||
<span class="widget-icon">ℹ️</span>
|
||||
How It Works
|
||||
</h3>
|
||||
</div>
|
||||
|
||||
<div class="usage-info">
|
||||
<h4>💡 How it works</h4>
|
||||
<ul>
|
||||
<div class="widget-content">
|
||||
<ol class="info-list">
|
||||
<li>Chat freely to explore your problem</li>
|
||||
<li>Get guidance and ask questions</li>
|
||||
<li>Generate final report when ready</li>
|
||||
<li>Pay only for the final report</li>
|
||||
</ul>
|
||||
</ol>
|
||||
|
||||
<!-- Quick Agents Toggle Button -->
|
||||
<button class="quick-agent-toggle" onclick="toggleQuickAgents()"
|
||||
title="Quick access to other agents"
|
||||
aria-label="Open quick access panel for other AI agents"
|
||||
aria-expanded="false"
|
||||
aria-controls="quickAgentsPanel"
|
||||
style="margin-top: var(--spacing-md);">
|
||||
<span class="toggle-icon" aria-hidden="true">🚀</span>
|
||||
<span class="toggle-text">Explore Other Agents</span>
|
||||
</button>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<!-- Processing Status -->
|
||||
<div class="agent-grid">
|
||||
{% include "components/processing_status.html" with status_title="Generating 5 Whys Report..." status_text="Please wait while we analyze your conversation and create a comprehensive report..." %}
|
||||
</div>
|
||||
|
||||
<!-- Results -->
|
||||
<div class="agent-grid">
|
||||
{% include "components/results_container.html" with results_title="5 Whys Analysis Report" %}
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<style>
|
||||
/* Five Whys Analyzer Specific Styles */
|
||||
.chat-container {
|
||||
background: var(--background-subtle);
|
||||
border-radius: 8px;
|
||||
@ -270,11 +316,6 @@ const AgentUtils = FiveWhysUtils;
|
||||
margin-bottom: 8px;
|
||||
}
|
||||
|
||||
.message-content {
|
||||
color: var(--text-primary);
|
||||
line-height: 1.6;
|
||||
}
|
||||
|
||||
.chat-form {
|
||||
border-top: 1px solid var(--border-color);
|
||||
padding-top: 16px;
|
||||
@ -306,36 +347,6 @@ const AgentUtils = FiveWhysUtils;
|
||||
box-shadow: 0 0 0 3px rgba(0, 0, 0, 0.1);
|
||||
}
|
||||
|
||||
.input-group .btn {
|
||||
height: 40px;
|
||||
padding: 8px 12px;
|
||||
width: 20%;
|
||||
display: flex;
|
||||
align-items: center;
|
||||
justify-content: center;
|
||||
flex-shrink: 0;
|
||||
box-sizing: border-box;
|
||||
font-size: 13px;
|
||||
}
|
||||
|
||||
.info-message {
|
||||
padding: 16px;
|
||||
background: var(--background-subtle);
|
||||
border-radius: 8px;
|
||||
text-align: center;
|
||||
color: var(--text-secondary);
|
||||
margin-bottom: 16px;
|
||||
}
|
||||
|
||||
.success-message {
|
||||
padding: 16px;
|
||||
background: #ecfdf5;
|
||||
border-radius: 8px;
|
||||
text-align: center;
|
||||
color: #059669;
|
||||
margin-bottom: 16px;
|
||||
}
|
||||
|
||||
.message {
|
||||
margin-bottom: 16px;
|
||||
animation: fadeIn 0.3s ease;
|
||||
@ -358,47 +369,6 @@ const AgentUtils = FiveWhysUtils;
|
||||
line-height: 1.6;
|
||||
}
|
||||
|
||||
.assistant-message .message-content {
|
||||
color: var(--text-primary);
|
||||
line-height: 1.6;
|
||||
}
|
||||
|
||||
.assistant-message .message-content h3 {
|
||||
color: var(--text-primary);
|
||||
font-size: 16px;
|
||||
font-weight: 600;
|
||||
margin: 16px 0 8px 0;
|
||||
}
|
||||
|
||||
.assistant-message .message-content h3:first-child {
|
||||
margin-top: 0;
|
||||
}
|
||||
|
||||
.assistant-message .message-content ul {
|
||||
margin: 8px 0;
|
||||
padding-left: 20px;
|
||||
}
|
||||
|
||||
.assistant-message .message-content li {
|
||||
margin: 4px 0;
|
||||
}
|
||||
|
||||
.assistant-message .message-content p {
|
||||
margin: 8px 0;
|
||||
}
|
||||
|
||||
.assistant-message .message-content p:first-child {
|
||||
margin-top: 0;
|
||||
}
|
||||
|
||||
.assistant-message .message-content p:last-child {
|
||||
margin-bottom: 0;
|
||||
}
|
||||
|
||||
.assistant-message .message-content strong {
|
||||
color: var(--text-primary);
|
||||
font-weight: 600;
|
||||
}
|
||||
@keyframes fadeIn {
|
||||
from { opacity: 0; transform: translateY(10px); }
|
||||
to { opacity: 1; transform: translateY(0); }
|
||||
@ -463,7 +433,7 @@ const AgentUtils = FiveWhysUtils;
|
||||
const message = input.value.trim();
|
||||
|
||||
if (!message) {
|
||||
AgentUtils.showToast('Please enter a message', 'error');
|
||||
showToast('Please enter a message', 'error');
|
||||
return;
|
||||
}
|
||||
|
||||
@ -503,14 +473,14 @@ const AgentUtils = FiveWhysUtils;
|
||||
// Check if report button should be enabled
|
||||
checkReportReadiness();
|
||||
} else {
|
||||
AgentUtils.showToast(data.error || 'Failed to send message', 'error');
|
||||
showToast(data.error || 'Failed to send message', 'error');
|
||||
}
|
||||
})
|
||||
.catch(error => {
|
||||
// Hide typing indicator on error
|
||||
hideTypingIndicator();
|
||||
console.error('Error:', error);
|
||||
AgentUtils.showToast('Network error occurred', 'error');
|
||||
showToast('Network error occurred', 'error');
|
||||
})
|
||||
.finally(() => {
|
||||
isProcessing = false;
|
||||
@ -665,12 +635,12 @@ const AgentUtils = FiveWhysUtils;
|
||||
if (isProcessing) return;
|
||||
|
||||
if (!currentSessionId) {
|
||||
AgentUtils.showToast('Please start a chat session first', 'error');
|
||||
showToast('Please start a chat session first', 'error');
|
||||
return;
|
||||
}
|
||||
|
||||
if (messageCount < 2) {
|
||||
AgentUtils.showToast('Please ask at least 2 questions before generating a report', 'error');
|
||||
showToast('Please ask at least 2 questions before generating a report', 'error');
|
||||
return;
|
||||
}
|
||||
|
||||
@ -710,17 +680,17 @@ const AgentUtils = FiveWhysUtils;
|
||||
|
||||
// Update wallet balance if provided
|
||||
if (data.wallet_balance !== undefined) {
|
||||
AgentUtils.updateWalletBalance(data.wallet_balance);
|
||||
updateWalletBalance(data.wallet_balance);
|
||||
}
|
||||
|
||||
AgentUtils.showToast('✅ Report generated and payment processed!', 'success');
|
||||
showToast('✅ Report generated and payment processed!', 'success');
|
||||
} else {
|
||||
AgentUtils.showToast(data.error || 'Failed to generate report', 'error');
|
||||
showToast(data.error || 'Failed to generate report', 'error');
|
||||
}
|
||||
})
|
||||
.catch(error => {
|
||||
console.error('Error:', error);
|
||||
AgentUtils.showToast('Network error occurred', 'error');
|
||||
showToast('Network error occurred', 'error');
|
||||
})
|
||||
.finally(() => {
|
||||
isProcessing = false;
|
||||
@ -771,13 +741,27 @@ const AgentUtils = FiveWhysUtils;
|
||||
|
||||
|
||||
function copyReport() {
|
||||
const reportText = AgentUtils.generateTextForExport('reportContent');
|
||||
AgentUtils.copyToClipboard(reportText, '📋 Report copied to clipboard!');
|
||||
const reportText = generateTextForExport('reportContent');
|
||||
copyToClipboard(reportText, '📋 Report copied to clipboard!');
|
||||
}
|
||||
|
||||
function downloadReport() {
|
||||
const reportText = AgentUtils.generateTextForExport('reportContent');
|
||||
AgentUtils.downloadAsFile(reportText, `five-whys-analysis-${Date.now()}.txt`, '💾 Report downloaded!');
|
||||
const reportText = generateTextForExport('reportContent');
|
||||
downloadAsFile(reportText, `five-whys-analysis-${Date.now()}.txt`, '💾 Report downloaded!');
|
||||
}
|
||||
|
||||
function generateTextForExport(elementId) {
|
||||
const element = document.getElementById(elementId);
|
||||
if (!element) return '';
|
||||
|
||||
// Extract text content while preserving some structure
|
||||
let text = element.innerText || element.textContent || '';
|
||||
|
||||
// Clean up extra whitespace
|
||||
text = text.replace(/\n\s*\n\s*\n/g, '\n\n');
|
||||
text = text.trim();
|
||||
|
||||
return text;
|
||||
}
|
||||
|
||||
</script>
|
||||
|
||||
@ -1,7 +1,7 @@
|
||||
{% extends 'base.html' %}
|
||||
{% load static %}
|
||||
|
||||
{% block title %}Job Posting Generator Agent - NetCop AI Hub{% endblock %}
|
||||
{% block title %}Job Posting Generator Agent - Quantum Tasks AI{% endblock %}
|
||||
|
||||
{% block extra_css %}
|
||||
<link rel="stylesheet" href="{% static 'css/agent-base.css' %}?v={{ timestamp }}">
|
||||
|
||||
@ -40,11 +40,11 @@ if missing_vars:
|
||||
# SECURITY WARNING: don't run with debug turned on in production!
|
||||
DEBUG = config('DEBUG', default=True, cast=bool)
|
||||
|
||||
ALLOWED_HOSTS = config('ALLOWED_HOSTS', default='localhost,127.0.0.1,testserver,netcop.up.railway.app').split(',')
|
||||
ALLOWED_HOSTS = config('ALLOWED_HOSTS', default='localhost,127.0.0.1,testserver,quantumtaskai.com').split(',')
|
||||
|
||||
# Site URL configuration for emails
|
||||
if config('RAILWAY_ENVIRONMENT', default=''):
|
||||
SITE_URL = 'https://netcop.up.railway.app'
|
||||
SITE_URL = 'https://quantumtaskai.com'
|
||||
else:
|
||||
SITE_URL = config('SITE_URL', default='http://localhost:8000')
|
||||
|
||||
@ -271,7 +271,7 @@ EMAIL_USE_TLS = config('EMAIL_USE_TLS', default=True, cast=bool)
|
||||
EMAIL_HOST_USER = config('EMAIL_HOST_USER', default='')
|
||||
EMAIL_HOST_PASSWORD = config('EMAIL_HOST_PASSWORD', default='')
|
||||
EMAIL_FILE_PATH = config('EMAIL_FILE_PATH', default='/tmp/app-messages')
|
||||
DEFAULT_FROM_EMAIL = config('DEFAULT_FROM_EMAIL', default='NetCop <noreply@netcop.com>')
|
||||
DEFAULT_FROM_EMAIL = config('DEFAULT_FROM_EMAIL', default='Quantum Tasks AI <noreply@quantumtaskai.com>')
|
||||
|
||||
# Security settings
|
||||
CSRF_TRUSTED_ORIGINS = [origin.strip() for origin in config('CSRF_TRUSTED_ORIGINS', default='').split(',') if origin.strip()]
|
||||
@ -281,8 +281,8 @@ if config('RAILWAY_ENVIRONMENT', default=''):
|
||||
railway_url = config('RAILWAY_PUBLIC_DOMAIN', default='')
|
||||
if railway_url:
|
||||
CSRF_TRUSTED_ORIGINS.append(f'https://{railway_url}')
|
||||
# Also add common Railway domain pattern
|
||||
CSRF_TRUSTED_ORIGINS.append('https://netcop.up.railway.app')
|
||||
# Also add production domain
|
||||
CSRF_TRUSTED_ORIGINS.append('https://quantumtaskai.com')
|
||||
SECURE_PROXY_SSL_HEADER = ('HTTP_X_FORWARDED_PROTO', 'https')
|
||||
|
||||
# Default primary key field type
|
||||
@ -298,7 +298,7 @@ CACHES = {
|
||||
'OPTIONS': {
|
||||
'CLIENT_CLASS': 'django_redis.client.DefaultClient',
|
||||
},
|
||||
'KEY_PREFIX': 'netcop',
|
||||
'KEY_PREFIX': 'quantumtaskai',
|
||||
'TIMEOUT': 300, # 5 minutes default
|
||||
'VERSION': 1,
|
||||
}
|
||||
@ -315,7 +315,7 @@ except (ImportError, Exception):
|
||||
CACHES = {
|
||||
'default': {
|
||||
'BACKEND': 'django.core.cache.backends.locmem.LocMemCache',
|
||||
'LOCATION': 'netcop-cache',
|
||||
'LOCATION': 'quantumtaskai-cache',
|
||||
'OPTIONS': {
|
||||
'MAX_ENTRIES': 1000,
|
||||
'CULL_FREQUENCY': 3,
|
||||
|
||||
@ -1,7 +1,7 @@
|
||||
{% extends 'base.html' %}
|
||||
{% load static %}
|
||||
|
||||
{% block title %}Social Ads Generator - NetCop AI Hub{% endblock %}
|
||||
{% block title %}Social Ads Generator - Quantum Tasks AI{% endblock %}
|
||||
|
||||
{% block extra_css %}
|
||||
<link rel="stylesheet" href="{% static 'css/agent-base.css' %}?v={{ timestamp }}">
|
||||
|
||||
@ -3,7 +3,7 @@
|
||||
<head>
|
||||
<meta charset="UTF-8">
|
||||
<meta name="viewport" content="width=device-width, initial-scale=1.0">
|
||||
<title>{{ agent.name }} - NetCop Hub</title>
|
||||
<title>{{ agent.name }} - Quantum Tasks AI</title>
|
||||
<style>
|
||||
body { font-family: Arial, sans-serif; margin: 0; padding: 20px; background-color: #f5f5f5; }
|
||||
.container { max-width: 800px; margin: 0 auto; }
|
||||
|
||||
@ -1,7 +1,7 @@
|
||||
{% extends 'base.html' %}
|
||||
{% load static %}
|
||||
|
||||
{% block title %}AI Marketplace - NetCop AI Hub{% endblock %}
|
||||
{% block title %}AI Marketplace - Quantum Tasks AI{% endblock %}
|
||||
|
||||
{% block extra_css %}
|
||||
<link rel="stylesheet" href="{% static 'css/marketplace.css' %}">
|
||||
|
||||
@ -4,7 +4,7 @@
|
||||
<head>
|
||||
<meta charset="UTF-8">
|
||||
<meta name="viewport" content="width=device-width, initial-scale=1.0">
|
||||
<title>{% block title %}NetCop Hub - AI Platform{% endblock %}</title>
|
||||
<title>{% block title %}Quantum Tasks AI - AI Platform{% endblock %}</title>
|
||||
|
||||
<!-- Unified Font Loading - Single Source of Truth -->
|
||||
<link rel="preconnect" href="https://fonts.googleapis.com">
|
||||
@ -26,7 +26,7 @@
|
||||
<div class="header-container">
|
||||
<div class="header-left">
|
||||
<a href="{% url 'core:homepage' %}" class="logo-section">
|
||||
<img src="{% static 'img/logo.png' %}" alt="NetCop Hub" class="logo-img">
|
||||
<img src="{% static 'img/logo.png' %}" alt="Quantum Tasks AI" class="logo-img">
|
||||
</a>
|
||||
<nav class="header-nav" id="header-nav">
|
||||
<a href="{% url 'core:homepage' %}" class="nav-link {% if request.resolver_match.url_name == 'homepage' %}active{% endif %}">Home</a>
|
||||
@ -69,15 +69,15 @@
|
||||
<!-- Company Info -->
|
||||
<div class="footer-company">
|
||||
<div class="footer-logo">
|
||||
<img src="{% static 'img/logo.png' %}" alt="NetCop Hub" class="footer-logo-img">
|
||||
<img src="{% static 'img/logo.png' %}" alt="Quantum Tasks AI" class="footer-logo-img">
|
||||
</div>
|
||||
<p class="footer-description">
|
||||
Leading cybersecurity consultancy providing comprehensive security solutions and AI-powered automation.
|
||||
</p>
|
||||
|
||||
<div class="footer-contact">
|
||||
<a href="mailto:contact@netcopconsultancy.com" class="footer-contact-item">
|
||||
📧 contact@netcopconsultancy.com
|
||||
<a href="mailto:contact@quantumtaskai.com" class="footer-contact-item">
|
||||
📧 contact@quantumtaskai.com
|
||||
</a>
|
||||
<span class="footer-contact-item">
|
||||
📍 Dubai, UAE
|
||||
@ -137,7 +137,7 @@
|
||||
</div>
|
||||
<div class="modal-text">
|
||||
<p style="margin-bottom: 16px;">
|
||||
<strong>NetCop Consultancy LLC FZ</strong> is committed to protecting your privacy and ensuring the security of your personal information.
|
||||
<strong>Quantum Tasks AI</strong> is committed to protecting your privacy and ensuring the security of your personal information.
|
||||
</p>
|
||||
<p style="margin-bottom: 16px;">
|
||||
<strong>Information We Collect:</strong><br>
|
||||
@ -153,7 +153,7 @@
|
||||
</p>
|
||||
<p style="margin-bottom: 16px;">
|
||||
<strong>Contact Us:</strong><br>
|
||||
If you have any questions about this Privacy Policy, please contact us at contact@netcopconsultancy.com
|
||||
If you have any questions about this Privacy Policy, please contact us at contact@quantumtaskai.com
|
||||
</p>
|
||||
<p style="margin: 0; font-size: 12px; color: #9ca3af;">
|
||||
Last updated: January 2025
|
||||
|
||||
@ -1,7 +1,7 @@
|
||||
{% extends 'base.html' %}
|
||||
{% load static %}
|
||||
|
||||
{% block title %}NetCop AI Hub - AI & Cybersecurity Solutions{% endblock %}
|
||||
{% block title %}Quantum Tasks AI - AI & Task Automation Solutions{% endblock %}
|
||||
|
||||
{% block extra_css %}
|
||||
<link rel="stylesheet" href="{% static 'css/homepage.css' %}">
|
||||
@ -61,7 +61,7 @@
|
||||
<div class="trust-indicators">
|
||||
<div class="trust-card">
|
||||
<div class="trust-number">
|
||||
18+
|
||||
35+
|
||||
</div>
|
||||
<div class="trust-text">
|
||||
Years Experience
|
||||
@ -94,13 +94,13 @@
|
||||
<div class="section-header">
|
||||
<div class="section-badge">
|
||||
<span class="section-badge-icon">🏢</span>
|
||||
<span class="section-badge-text">About Netcop Consultancy</span>
|
||||
<span class="section-badge-text">About Quantum Tasks AI</span>
|
||||
</div>
|
||||
<h2 class="section-title">
|
||||
Your Trusted Digital Guardian
|
||||
</h2>
|
||||
<p class="section-subtitle">
|
||||
Pioneering the future of cybersecurity with AI-powered solutions
|
||||
Pioneering the future of Automation & Cybersecurity with AI-powered solutions
|
||||
</p>
|
||||
</div>
|
||||
|
||||
@ -125,7 +125,7 @@
|
||||
<div class="company-badges">
|
||||
<div class="company-badge company-badge-primary">
|
||||
<div class="company-badge-icon">📅</div>
|
||||
18+ Years Experience
|
||||
35+ Years Experience
|
||||
</div>
|
||||
<div class="company-badge company-badge-purple">
|
||||
<div class="company-badge-icon">🏆</div>
|
||||
@ -256,9 +256,46 @@
|
||||
<section class="founder">
|
||||
<div class="founder-container">
|
||||
<h2 class="founder-title">
|
||||
Our Founder
|
||||
Our Founders
|
||||
</h2>
|
||||
|
||||
<!-- JP Goenka -->
|
||||
<div class="founder-grid">
|
||||
<div class="founder-card-container">
|
||||
<div class="founder-card">
|
||||
<div class="founder-avatar">👨💼</div>
|
||||
<h3 class="founder-name">Mr. JP Goenka</h3>
|
||||
<p class="founder-role">
|
||||
Founder & Business Development Leader
|
||||
</p>
|
||||
<div class="founder-badges">
|
||||
<div class="founder-badge">
|
||||
International Trading Expert
|
||||
</div>
|
||||
<div class="founder-badge">
|
||||
Dubai Business Leader
|
||||
</div>
|
||||
<div class="founder-badge">
|
||||
Global Perspective
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
<div class="founder-content">
|
||||
<p class="founder-text">
|
||||
Mr. J. P. Goenka
|
||||
|
||||
With over 45 years of entrepreneurial and leadership experience, Mr. J. P. Goenka has built a distinguished career across a diverse range of industries, including food processing, printed circuit boards, plastics manufacturing, beans splitting units, and international trade (import & export).
|
||||
|
||||
</p>
|
||||
<p class="founder-text">
|
||||
Mr. Goenka brings deep global business insight, supported by an extensive international network and a strong understanding of various markets, products, and cultural dynamics. Recognizing the transformative impact of emerging technologies, he co-founded Quantum Task AI LLC FZ in partnership with Mr. Abhay Chauhan, focusing on advancing solutions in Artificial Intelligence and Cybersecurity—two key pillars shaping the future of global business.
|
||||
</p>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<!-- Abhay Pal Chauhan -->
|
||||
<div class="founder-grid" style="margin-top: 3rem;">
|
||||
<div class="founder-card-container">
|
||||
<div class="founder-card">
|
||||
<div class="founder-avatar">👨💼</div>
|
||||
@ -268,7 +305,7 @@
|
||||
</p>
|
||||
<div class="founder-badges">
|
||||
<div class="founder-badge">
|
||||
18+ Years Experience
|
||||
35+ Years Experience
|
||||
</div>
|
||||
<div class="founder-badge">
|
||||
Cybersecurity Expert
|
||||
@ -281,7 +318,7 @@
|
||||
</div>
|
||||
<div class="founder-content">
|
||||
<p class="founder-text">
|
||||
Our Founder leverages over <strong>18 years of expertise</strong> in cybersecurity and process automation and optimization, backed by top certifications in Cybersecurity and <strong>Black Belt in Lean Six Sigma</strong>.
|
||||
Our Founder leverages over <strong>35 years of expertise</strong> in cybersecurity and process automation and optimization, backed by top certifications in Cybersecurity and <strong>Black Belt in Lean Six Sigma</strong>.
|
||||
</p>
|
||||
<p class="founder-text">
|
||||
His unique blend of technical knowledge and operational excellence ensures <strong>tailored, secure, and efficient solutions</strong> for our clients, driving business resilience and maximizing value in every engagement.
|
||||
@ -377,8 +414,8 @@
|
||||
<div class="contact-details">
|
||||
<h4>Email Address</h4>
|
||||
<p>
|
||||
<a href="mailto:abhay@netcopconsultancy.com" class="contact-email">
|
||||
abhay@netcopconsultancy.com
|
||||
<a href="mailto:abhay@quantumtaskai.com" class="contact-email">
|
||||
abhay@quantumtaskai.com
|
||||
</a>
|
||||
</p>
|
||||
</div>
|
||||
|
||||
@ -1,7 +1,7 @@
|
||||
{% extends 'base.html' %}
|
||||
{% load static %}
|
||||
|
||||
{% block title %}Pricing - NetCop Hub{% endblock %}
|
||||
{% block title %}Pricing - Quantum Tasks AI{% endblock %}
|
||||
|
||||
{% block extra_css %}
|
||||
<link rel="stylesheet" href="{% static 'css/agent-base.css' %}">
|
||||
|
||||
@ -1,7 +1,7 @@
|
||||
{% extends 'base.html' %}
|
||||
{% load static %}
|
||||
|
||||
{% block title %}Wallet - NetCop Hub{% endblock %}
|
||||
{% block title %}Wallet - Quantum Tasks AI{% endblock %}
|
||||
|
||||
{% block extra_css %}
|
||||
<link rel="stylesheet" href="{% static 'css/agent-base.css' %}">
|
||||
|
||||
@ -1,7 +1,7 @@
|
||||
{% extends 'base.html' %}
|
||||
{% load static %}
|
||||
|
||||
{% block title %}Top Up Wallet - NetCop Hub{% endblock %}
|
||||
{% block title %}Top Up Wallet - Quantum Tasks AI{% endblock %}
|
||||
|
||||
{% block extra_css %}
|
||||
<link rel="stylesheet" href="{% static 'css/agent-base.css' %}">
|
||||
|
||||
@ -4,10 +4,10 @@ import sys
|
||||
import django
|
||||
|
||||
# Add the project root to Python path
|
||||
sys.path.insert(0, '/home/amit/projects/netcop_django')
|
||||
sys.path.insert(0, '/home/amit/projects/quantumtaskai_django')
|
||||
|
||||
# Set Django settings
|
||||
os.environ.setdefault('DJANGO_SETTINGS_MODULE', 'netcop_hub.settings')
|
||||
os.environ.setdefault('DJANGO_SETTINGS_MODULE', 'quantumtaskai_hub.settings')
|
||||
django.setup()
|
||||
|
||||
from agent_base.models import BaseAgent
|
||||
|
||||
@ -7,7 +7,7 @@ import django
|
||||
sys.path.insert(0, '/home/amit/Desktop/quantum_ai')
|
||||
|
||||
# Set Django settings
|
||||
os.environ.setdefault('DJANGO_SETTINGS_MODULE', 'netcop_hub.settings')
|
||||
os.environ.setdefault('DJANGO_SETTINGS_MODULE', 'quantumtaskai_hub.settings')
|
||||
django.setup()
|
||||
|
||||
from agent_base.models import BaseAgent
|
||||
|
||||
@ -4,10 +4,10 @@ import sys
|
||||
import django
|
||||
|
||||
# Add the project root to Python path
|
||||
sys.path.insert(0, '/home/amit/projects/netcop_django')
|
||||
sys.path.insert(0, '/home/amit/projects/quantumtaskai_django')
|
||||
|
||||
# Set Django settings
|
||||
os.environ.setdefault('DJANGO_SETTINGS_MODULE', 'netcop_hub.settings')
|
||||
os.environ.setdefault('DJANGO_SETTINGS_MODULE', 'quantumtaskai_hub.settings')
|
||||
django.setup()
|
||||
|
||||
from django.test import Client
|
||||
|
||||
@ -15,7 +15,7 @@ def test_job_posting_webhook():
|
||||
form_data = {
|
||||
'user_id': 'test-user-123',
|
||||
'job_title': 'Senior Software Developer',
|
||||
'company_name': 'NetCop Technologies',
|
||||
'company_name': 'Quantum Tasks AI Technologies',
|
||||
'industry': 'technology',
|
||||
'job_type': 'full-time',
|
||||
'experience_level': 'senior',
|
||||
|
||||
@ -4,10 +4,10 @@ import sys
|
||||
import django
|
||||
|
||||
# Add the project root to Python path
|
||||
sys.path.insert(0, '/home/amit/projects/netcop_django')
|
||||
sys.path.insert(0, '/home/amit/projects/quantumtaskai_django')
|
||||
|
||||
# Set Django settings
|
||||
os.environ.setdefault('DJANGO_SETTINGS_MODULE', 'netcop_hub.settings')
|
||||
os.environ.setdefault('DJANGO_SETTINGS_MODULE', 'quantumtaskai_hub.settings')
|
||||
django.setup()
|
||||
|
||||
from django.contrib.auth import get_user_model
|
||||
|
||||
@ -28,8 +28,8 @@ class StripePaymentHandler:
|
||||
cancel_url = request.build_absolute_uri('/wallet/top-up/cancel/')
|
||||
else:
|
||||
# Fallback URLs
|
||||
success_url = 'https://netcop.up.railway.app/wallet/top-up/success/?session_id={CHECKOUT_SESSION_ID}'
|
||||
cancel_url = 'https://netcop.up.railway.app/wallet/top-up/cancel/'
|
||||
success_url = 'https://quantumtaskai.com/wallet/top-up/success/?session_id={CHECKOUT_SESSION_ID}'
|
||||
cancel_url = 'https://quantumtaskai.com/wallet/top-up/cancel/'
|
||||
|
||||
try:
|
||||
print(f"🚀 [STRIPE DEBUG] Starting checkout session creation...")
|
||||
@ -39,7 +39,7 @@ class StripePaymentHandler:
|
||||
print(f"🔑 API Version: {stripe.api_version}")
|
||||
print(f"📍 Success URL: {success_url}")
|
||||
print(f"📍 Cancel URL: {cancel_url}")
|
||||
print(f"📍 Expected Webhook URL: https://netcop.up.railway.app/stripe/webhook/")
|
||||
print(f"📍 Expected Webhook URL: https://quantumtaskai.com/stripe/webhook/")
|
||||
print(f"🌍 Environment: {'production' if 'railway.app' in (request.get_host() if request else '') else 'development'}")
|
||||
|
||||
# Create session with modern Stripe practices
|
||||
@ -52,10 +52,10 @@ class StripePaymentHandler:
|
||||
'price_data': {
|
||||
'currency': 'aed',
|
||||
'product_data': {
|
||||
'name': 'NetCop Wallet Top-up',
|
||||
'name': 'Quantum Tasks AI Wallet Top-up',
|
||||
'description': f'Add {amount} AED to your wallet balance',
|
||||
'metadata': {
|
||||
'service': 'netcop_wallet',
|
||||
'service': 'quantumtaskai_wallet',
|
||||
'user_id': str(user.id)
|
||||
}
|
||||
},
|
||||
@ -82,7 +82,7 @@ class StripePaymentHandler:
|
||||
'amount': str(amount),
|
||||
'currency': 'aed',
|
||||
'type': 'wallet_topup',
|
||||
'service': 'netcop',
|
||||
'service': 'quantumtaskai',
|
||||
'environment': 'production' if 'railway.app' in (request.get_host() if request else '') else 'development',
|
||||
'created_at': str(int(time.time())),
|
||||
'app_version': '1.0'
|
||||
@ -93,7 +93,7 @@ class StripePaymentHandler:
|
||||
'metadata': {
|
||||
'user_id': str(user.id),
|
||||
'amount': str(amount),
|
||||
'service': 'netcop_wallet'
|
||||
'service': 'quantumtaskai_wallet'
|
||||
}
|
||||
},
|
||||
|
||||
|
||||
@ -1,7 +1,7 @@
|
||||
{% extends 'base.html' %}
|
||||
{% load static %}
|
||||
|
||||
{% block title %}Weather Reporter Agent - NetCop AI Hub{% endblock %}
|
||||
{% block title %}Weather Reporter Agent - Quantum Tasks AI{% endblock %}
|
||||
|
||||
{% block extra_css %}
|
||||
<link rel="stylesheet" href="{% static 'css/agent-base.css' %}?v={{ timestamp }}">
|
||||
|
||||
Loading…
Reference in New Issue
Block a user