This commit is contained in:
nika fartenadze 2025-11-07 02:42:28 +04:00
parent cc636cd097
commit 1d82024a58
11 changed files with 291 additions and 132 deletions

View File

@ -3,19 +3,31 @@ FROM python:3.11-slim
WORKDIR /app
# Install system dependencies
# Install system dependencies (cached unless this changes)
RUN apt-get update && apt-get install -y \
curl \
gcc \
g++ \
&& rm -rf /var/lib/apt/lists/*
# Upgrade pip and install build tools first (cached)
RUN pip install --upgrade pip setuptools wheel
# Copy requirements first for better caching
COPY requirements.txt .
# Install Python dependencies
RUN pip install --no-cache-dir -r requirements.txt
# Remove --no-cache-dir to use pip's cache (much faster rebuilds)
# This layer will be cached unless requirements.txt changes
RUN pip install --upgrade pip && \
pip install -r requirements.txt
# Copy application files
COPY . .
# Docker automatically detects file changes via content hash
# If any .py file changes, only this layer and after rebuild (apt-get & pip stay cached!)
COPY *.py ./
COPY *.yaml* ./
COPY *.md ./
# Create directories for reports and output
RUN mkdir -p /app/reports /app/output

View File

@ -81,6 +81,7 @@ def create_app(config_path: Optional[str] = None):
try:
request_data = request.json or {}
download_from_sp = request_data.get('download_from_sharepoint', False)
downloaded_files = [] # Initialize here for scope
# Download from SharePoint if requested
if download_from_sp:
@ -105,9 +106,10 @@ def create_app(config_path: Optional[str] = None):
file_pattern=sp_config.get('file_pattern'),
overwrite=sp_config.get('overwrite', True)
)
logger.info(f"Downloaded {len(downloaded)} file(s) from SharePoint")
downloaded_files = downloaded if downloaded else []
logger.info(f"Downloaded {len(downloaded_files)} file(s) from SharePoint: {downloaded_files}")
except Exception as e:
logger.error(f"Failed to download from SharePoint: {e}")
logger.error(f"Failed to download from SharePoint: {e}", exc_info=True)
return jsonify({
'error': f'SharePoint download failed: {str(e)}'
}), 500
@ -131,7 +133,9 @@ def create_app(config_path: Optional[str] = None):
'message': 'Report generated successfully',
'output_file': output_file,
'summary': report_data.get('summary', {}),
'vendors_count': len(report_data.get('vendors', []))
'vendors_count': len(report_data.get('vendors', [])),
'downloaded_files': len(downloaded_files) if download_from_sp else 0,
'downloaded_file_names': [Path(f).name for f in downloaded_files] if download_from_sp else []
})
else:
return jsonify({

View File

@ -61,6 +61,11 @@ def get_priority_badge_class(priority: Optional[str]) -> str:
return "badge-secondary"
def escape_js_string(s: str) -> str:
"""Escape a string for use in JavaScript double-quoted strings."""
return s.replace('\\', '\\\\').replace('"', '\\"').replace('\n', '\\n').replace('\r', '\\r')
def generate_html_report(json_path: str, output_path: Optional[str] = None) -> str:
"""
Generate HTML report from JSON report file.
@ -786,7 +791,7 @@ def generate_html_content(report_data: Dict) -> str:
<div class="tabs-container">
<div class="tabs" id="vendor-tabs">
<button class="tab active" onclick="switchVendorTab('all')" data-vendor="all">All Vendors</button>
{''.join([f'<button class="tab" onclick="switchVendorTab(\'{vn}\')" data-vendor="{vn}">{vn}</button>' for vn in vendor_names])}
{''.join(['<button class="tab" onclick="switchVendorTab(' + "'" + escape_js_string(vn) + "'" + ')" data-vendor="' + vn + '">' + vn + '</button>' for vn in vendor_names])}
</div>
</div>
@ -1276,13 +1281,13 @@ def generate_vendor_section(vendor: Dict) -> str:
<div class="vendor-content">
<div class="status-tabs">
<button class="status-tab active" onclick="switchStatusTab(this, '{vendor_name}')" data-status="all">All ({total_items})</button>
<button class="status-tab" onclick="switchStatusTab(this, '{vendor_name}')" data-status="updates_24h">Yesterday's Updates ({len(updates_24h.get('added', [])) + len(updates_24h.get('closed', [])) + len(updates_24h.get('changed_to_monitor', []))})</button>
<button class="status-tab" onclick="switchStatusTab(this, '{vendor_name}')" data-status="oldest_unaddressed">Oldest Unaddressed ({len(oldest_unaddressed)})</button>
<button class="status-tab" onclick="switchStatusTab(this, '{vendor_name}')" data-status="closed">Closed ({closed_count})</button>
<button class="status-tab" onclick="switchStatusTab(this, '{vendor_name}')" data-status="monitor">Monitor ({monitor_count})</button>
<button class="status-tab" onclick="switchStatusTab(this, '{vendor_name}')" data-status="open">Open ({open_count})</button>
<button class="status-tab" onclick="switchStatusTab(this, '{vendor_name}')" data-status="incomplete">Incomplete ({incomplete_count})</button>
<button class="status-tab active" onclick="switchStatusTab(this, '" + escape_js_string(vendor_name) + "')" data-status="all">All ({total_items})</button>
<button class="status-tab" onclick="switchStatusTab(this, '" + escape_js_string(vendor_name) + "')" data-status="updates_24h">Yesterday's Updates ({len(updates_24h.get('added', [])) + len(updates_24h.get('closed', [])) + len(updates_24h.get('changed_to_monitor', []))})</button>
<button class="status-tab" onclick="switchStatusTab(this, '" + escape_js_string(vendor_name) + "')" data-status="oldest_unaddressed">Oldest Unaddressed ({len(oldest_unaddressed)})</button>
<button class="status-tab" onclick="switchStatusTab(this, '" + escape_js_string(vendor_name) + "')" data-status="closed">Closed ({closed_count})</button>
<button class="status-tab" onclick="switchStatusTab(this, '" + escape_js_string(vendor_name) + "')" data-status="monitor">Monitor ({monitor_count})</button>
<button class="status-tab" onclick="switchStatusTab(this, '" + escape_js_string(vendor_name) + "')" data-status="open">Open ({open_count})</button>
<button class="status-tab" onclick="switchStatusTab(this, '" + escape_js_string(vendor_name) + "')" data-status="incomplete">Incomplete ({incomplete_count})</button>
</div>
<div class="status-tab-content active" data-status="all" data-vendor="{vendor_name}">

View File

@ -1,6 +1,6 @@
PREPROCESSED EXCEL DATA
================================================================================
Current Date (Baltimore/Eastern): 2025-11-06 11:37:45 EST
Current Date (Baltimore/Eastern): 2025-11-06 16:50:13 EST
Total Items: 162
VENDOR: Amazon

View File

@ -587,7 +587,7 @@
<header>
<h1>Vendor Punchlist Report</h1>
<div class="meta">
Generated: 2025-11-06 20:37:46 |
Generated: 2025-11-07 01:50:13 |
Total Vendors: 16 |
Total Items: 162
</div>
@ -673,7 +673,7 @@
<div class="tabs-container">
<div class="tabs" id="vendor-tabs">
<button class="tab active" onclick="switchVendorTab('all')" data-vendor="all">All Vendors</button>
<button class="tab" onclick="switchVendorTab('Amazon')" data-vendor="Amazon">Amazon</button><button class="tab" onclick="switchVendorTab('Autstand')" data-vendor="Autstand">Autstand</button><button class="tab" onclick="switchVendorTab('Autstand/Beumer')" data-vendor="Autstand/Beumer">Autstand/Beumer</button><button class="tab" onclick="switchVendorTab('Autstand/DCS')" data-vendor="Autstand/DCS">Autstand/DCS</button><button class="tab" onclick="switchVendorTab('Beumer')" data-vendor="Beumer">Beumer</button><button class="tab" onclick="switchVendorTab('Caljan')" data-vendor="Caljan">Caljan</button><button class="tab" onclick="switchVendorTab('DCS')" data-vendor="DCS">DCS</button><button class="tab" onclick="switchVendorTab('DCS/Autstand')" data-vendor="DCS/Autstand">DCS/Autstand</button><button class="tab" onclick="switchVendorTab('DCS/Flow-Turn')" data-vendor="DCS/Flow-Turn">DCS/Flow-Turn</button><button class="tab" onclick="switchVendorTab('DCS/RME')" data-vendor="DCS/RME">DCS/RME</button><button class="tab" onclick="switchVendorTab('Datalogic')" data-vendor="Datalogic">Datalogic</button><button class="tab" onclick="switchVendorTab('FMH/Gorbel')" data-vendor="FMH/Gorbel">FMH/Gorbel</button><button class="tab" onclick="switchVendorTab('Gorbel')" data-vendor="Gorbel">Gorbel</button><button class="tab" onclick="switchVendorTab('MFO (Amazon)')" data-vendor="MFO (Amazon)">MFO (Amazon)</button><button class="tab" onclick="switchVendorTab('MISC')" data-vendor="MISC">MISC</button><button class="tab" onclick="switchVendorTab('Startup (Amazon)')" data-vendor="Startup (Amazon)">Startup (Amazon)</button>
<button class="tab" onclick="switchVendorTab("Amazon")" data-vendor="Amazon">Amazon</button><button class="tab" onclick="switchVendorTab("Autstand")" data-vendor="Autstand">Autstand</button><button class="tab" onclick="switchVendorTab("Autstand/Beumer")" data-vendor="Autstand/Beumer">Autstand/Beumer</button><button class="tab" onclick="switchVendorTab("Autstand/DCS")" data-vendor="Autstand/DCS">Autstand/DCS</button><button class="tab" onclick="switchVendorTab("Beumer")" data-vendor="Beumer">Beumer</button><button class="tab" onclick="switchVendorTab("Caljan")" data-vendor="Caljan">Caljan</button><button class="tab" onclick="switchVendorTab("DCS")" data-vendor="DCS">DCS</button><button class="tab" onclick="switchVendorTab("DCS/Autstand")" data-vendor="DCS/Autstand">DCS/Autstand</button><button class="tab" onclick="switchVendorTab("DCS/Flow-Turn")" data-vendor="DCS/Flow-Turn">DCS/Flow-Turn</button><button class="tab" onclick="switchVendorTab("DCS/RME")" data-vendor="DCS/RME">DCS/RME</button><button class="tab" onclick="switchVendorTab("Datalogic")" data-vendor="Datalogic">Datalogic</button><button class="tab" onclick="switchVendorTab("FMH/Gorbel")" data-vendor="FMH/Gorbel">FMH/Gorbel</button><button class="tab" onclick="switchVendorTab("Gorbel")" data-vendor="Gorbel">Gorbel</button><button class="tab" onclick="switchVendorTab("MFO (Amazon)")" data-vendor="MFO (Amazon)">MFO (Amazon)</button><button class="tab" onclick="switchVendorTab("MISC")" data-vendor="MISC">MISC</button><button class="tab" onclick="switchVendorTab("Startup (Amazon)")" data-vendor="Startup (Amazon)">Startup (Amazon)</button>
</div>
</div>
@ -708,13 +708,13 @@
<div class="vendor-content">
<div class="status-tabs">
<button class="status-tab active" onclick="switchStatusTab(this, 'Amazon')" data-status="all">All (1)</button>
<button class="status-tab" onclick="switchStatusTab(this, 'Amazon')" data-status="updates_24h">Yesterday's Updates (0)</button>
<button class="status-tab" onclick="switchStatusTab(this, 'Amazon')" data-status="oldest_unaddressed">Oldest Unaddressed (0)</button>
<button class="status-tab" onclick="switchStatusTab(this, 'Amazon')" data-status="closed">Closed (1)</button>
<button class="status-tab" onclick="switchStatusTab(this, 'Amazon')" data-status="monitor">Monitor (0)</button>
<button class="status-tab" onclick="switchStatusTab(this, 'Amazon')" data-status="open">Open (0)</button>
<button class="status-tab" onclick="switchStatusTab(this, 'Amazon')" data-status="incomplete">Incomplete (0)</button>
<button class="status-tab active" onclick="switchStatusTab(this, "" + escape_js_string(vendor_name) + "")" data-status="all">All (1)</button>
<button class="status-tab" onclick="switchStatusTab(this, "" + escape_js_string(vendor_name) + "")" data-status="updates_24h">Yesterday's Updates (0)</button>
<button class="status-tab" onclick="switchStatusTab(this, "" + escape_js_string(vendor_name) + "")" data-status="oldest_unaddressed">Oldest Unaddressed (0)</button>
<button class="status-tab" onclick="switchStatusTab(this, "" + escape_js_string(vendor_name) + "")" data-status="closed">Closed (1)</button>
<button class="status-tab" onclick="switchStatusTab(this, "" + escape_js_string(vendor_name) + "")" data-status="monitor">Monitor (0)</button>
<button class="status-tab" onclick="switchStatusTab(this, "" + escape_js_string(vendor_name) + "")" data-status="open">Open (0)</button>
<button class="status-tab" onclick="switchStatusTab(this, "" + escape_js_string(vendor_name) + "")" data-status="incomplete">Incomplete (0)</button>
</div>
<div class="status-tab-content active" data-status="all" data-vendor="Amazon">
@ -860,13 +860,13 @@
<div class="vendor-content">
<div class="status-tabs">
<button class="status-tab active" onclick="switchStatusTab(this, 'Autstand')" data-status="all">All (74)</button>
<button class="status-tab" onclick="switchStatusTab(this, 'Autstand')" data-status="updates_24h">Yesterday's Updates (0)</button>
<button class="status-tab" onclick="switchStatusTab(this, 'Autstand')" data-status="oldest_unaddressed">Oldest Unaddressed (3)</button>
<button class="status-tab" onclick="switchStatusTab(this, 'Autstand')" data-status="closed">Closed (67)</button>
<button class="status-tab" onclick="switchStatusTab(this, 'Autstand')" data-status="monitor">Monitor (4)</button>
<button class="status-tab" onclick="switchStatusTab(this, 'Autstand')" data-status="open">Open (3)</button>
<button class="status-tab" onclick="switchStatusTab(this, 'Autstand')" data-status="incomplete">Incomplete (3)</button>
<button class="status-tab active" onclick="switchStatusTab(this, "" + escape_js_string(vendor_name) + "")" data-status="all">All (74)</button>
<button class="status-tab" onclick="switchStatusTab(this, "" + escape_js_string(vendor_name) + "")" data-status="updates_24h">Yesterday's Updates (0)</button>
<button class="status-tab" onclick="switchStatusTab(this, "" + escape_js_string(vendor_name) + "")" data-status="oldest_unaddressed">Oldest Unaddressed (3)</button>
<button class="status-tab" onclick="switchStatusTab(this, "" + escape_js_string(vendor_name) + "")" data-status="closed">Closed (67)</button>
<button class="status-tab" onclick="switchStatusTab(this, "" + escape_js_string(vendor_name) + "")" data-status="monitor">Monitor (4)</button>
<button class="status-tab" onclick="switchStatusTab(this, "" + escape_js_string(vendor_name) + "")" data-status="open">Open (3)</button>
<button class="status-tab" onclick="switchStatusTab(this, "" + escape_js_string(vendor_name) + "")" data-status="incomplete">Incomplete (3)</button>
</div>
<div class="status-tab-content active" data-status="all" data-vendor="Autstand">
@ -3841,13 +3841,13 @@ KK 11/30 - Fixed the "Unknown" S04 message, verified with AWCS data</p>
<div class="vendor-content">
<div class="status-tabs">
<button class="status-tab active" onclick="switchStatusTab(this, 'Autstand/Beumer')" data-status="all">All (3)</button>
<button class="status-tab" onclick="switchStatusTab(this, 'Autstand/Beumer')" data-status="updates_24h">Yesterday's Updates (0)</button>
<button class="status-tab" onclick="switchStatusTab(this, 'Autstand/Beumer')" data-status="oldest_unaddressed">Oldest Unaddressed (0)</button>
<button class="status-tab" onclick="switchStatusTab(this, 'Autstand/Beumer')" data-status="closed">Closed (2)</button>
<button class="status-tab" onclick="switchStatusTab(this, 'Autstand/Beumer')" data-status="monitor">Monitor (1)</button>
<button class="status-tab" onclick="switchStatusTab(this, 'Autstand/Beumer')" data-status="open">Open (0)</button>
<button class="status-tab" onclick="switchStatusTab(this, 'Autstand/Beumer')" data-status="incomplete">Incomplete (0)</button>
<button class="status-tab active" onclick="switchStatusTab(this, "" + escape_js_string(vendor_name) + "")" data-status="all">All (3)</button>
<button class="status-tab" onclick="switchStatusTab(this, "" + escape_js_string(vendor_name) + "")" data-status="updates_24h">Yesterday's Updates (0)</button>
<button class="status-tab" onclick="switchStatusTab(this, "" + escape_js_string(vendor_name) + "")" data-status="oldest_unaddressed">Oldest Unaddressed (0)</button>
<button class="status-tab" onclick="switchStatusTab(this, "" + escape_js_string(vendor_name) + "")" data-status="closed">Closed (2)</button>
<button class="status-tab" onclick="switchStatusTab(this, "" + escape_js_string(vendor_name) + "")" data-status="monitor">Monitor (1)</button>
<button class="status-tab" onclick="switchStatusTab(this, "" + escape_js_string(vendor_name) + "")" data-status="open">Open (0)</button>
<button class="status-tab" onclick="switchStatusTab(this, "" + escape_js_string(vendor_name) + "")" data-status="incomplete">Incomplete (0)</button>
</div>
<div class="status-tab-content active" data-status="all" data-vendor="Autstand/Beumer">
@ -4074,13 +4074,13 @@ KK 10/19 - Done</p>
<div class="vendor-content">
<div class="status-tabs">
<button class="status-tab active" onclick="switchStatusTab(this, 'Autstand/DCS')" data-status="all">All (3)</button>
<button class="status-tab" onclick="switchStatusTab(this, 'Autstand/DCS')" data-status="updates_24h">Yesterday's Updates (0)</button>
<button class="status-tab" onclick="switchStatusTab(this, 'Autstand/DCS')" data-status="oldest_unaddressed">Oldest Unaddressed (0)</button>
<button class="status-tab" onclick="switchStatusTab(this, 'Autstand/DCS')" data-status="closed">Closed (3)</button>
<button class="status-tab" onclick="switchStatusTab(this, 'Autstand/DCS')" data-status="monitor">Monitor (0)</button>
<button class="status-tab" onclick="switchStatusTab(this, 'Autstand/DCS')" data-status="open">Open (0)</button>
<button class="status-tab" onclick="switchStatusTab(this, 'Autstand/DCS')" data-status="incomplete">Incomplete (0)</button>
<button class="status-tab active" onclick="switchStatusTab(this, "" + escape_js_string(vendor_name) + "")" data-status="all">All (3)</button>
<button class="status-tab" onclick="switchStatusTab(this, "" + escape_js_string(vendor_name) + "")" data-status="updates_24h">Yesterday's Updates (0)</button>
<button class="status-tab" onclick="switchStatusTab(this, "" + escape_js_string(vendor_name) + "")" data-status="oldest_unaddressed">Oldest Unaddressed (0)</button>
<button class="status-tab" onclick="switchStatusTab(this, "" + escape_js_string(vendor_name) + "")" data-status="closed">Closed (3)</button>
<button class="status-tab" onclick="switchStatusTab(this, "" + escape_js_string(vendor_name) + "")" data-status="monitor">Monitor (0)</button>
<button class="status-tab" onclick="switchStatusTab(this, "" + escape_js_string(vendor_name) + "")" data-status="open">Open (0)</button>
<button class="status-tab" onclick="switchStatusTab(this, "" + escape_js_string(vendor_name) + "")" data-status="incomplete">Incomplete (0)</button>
</div>
<div class="status-tab-content active" data-status="all" data-vendor="Autstand/DCS">
@ -4305,13 +4305,13 @@ KK 10/19 - Done</p>
<div class="vendor-content">
<div class="status-tabs">
<button class="status-tab active" onclick="switchStatusTab(this, 'Beumer')" data-status="all">All (32)</button>
<button class="status-tab" onclick="switchStatusTab(this, 'Beumer')" data-status="updates_24h">Yesterday's Updates (0)</button>
<button class="status-tab" onclick="switchStatusTab(this, 'Beumer')" data-status="oldest_unaddressed">Oldest Unaddressed (1)</button>
<button class="status-tab" onclick="switchStatusTab(this, 'Beumer')" data-status="closed">Closed (26)</button>
<button class="status-tab" onclick="switchStatusTab(this, 'Beumer')" data-status="monitor">Monitor (5)</button>
<button class="status-tab" onclick="switchStatusTab(this, 'Beumer')" data-status="open">Open (1)</button>
<button class="status-tab" onclick="switchStatusTab(this, 'Beumer')" data-status="incomplete">Incomplete (1)</button>
<button class="status-tab active" onclick="switchStatusTab(this, "" + escape_js_string(vendor_name) + "")" data-status="all">All (32)</button>
<button class="status-tab" onclick="switchStatusTab(this, "" + escape_js_string(vendor_name) + "")" data-status="updates_24h">Yesterday's Updates (0)</button>
<button class="status-tab" onclick="switchStatusTab(this, "" + escape_js_string(vendor_name) + "")" data-status="oldest_unaddressed">Oldest Unaddressed (1)</button>
<button class="status-tab" onclick="switchStatusTab(this, "" + escape_js_string(vendor_name) + "")" data-status="closed">Closed (26)</button>
<button class="status-tab" onclick="switchStatusTab(this, "" + escape_js_string(vendor_name) + "")" data-status="monitor">Monitor (5)</button>
<button class="status-tab" onclick="switchStatusTab(this, "" + escape_js_string(vendor_name) + "")" data-status="open">Open (1)</button>
<button class="status-tab" onclick="switchStatusTab(this, "" + escape_js_string(vendor_name) + "")" data-status="incomplete">Incomplete (1)</button>
</div>
<div class="status-tab-content active" data-status="all" data-vendor="Beumer">
@ -5660,13 +5660,13 @@ confirmed that it works</p>
<div class="vendor-content">
<div class="status-tabs">
<button class="status-tab active" onclick="switchStatusTab(this, 'Caljan')" data-status="all">All (4)</button>
<button class="status-tab" onclick="switchStatusTab(this, 'Caljan')" data-status="updates_24h">Yesterday's Updates (0)</button>
<button class="status-tab" onclick="switchStatusTab(this, 'Caljan')" data-status="oldest_unaddressed">Oldest Unaddressed (0)</button>
<button class="status-tab" onclick="switchStatusTab(this, 'Caljan')" data-status="closed">Closed (4)</button>
<button class="status-tab" onclick="switchStatusTab(this, 'Caljan')" data-status="monitor">Monitor (0)</button>
<button class="status-tab" onclick="switchStatusTab(this, 'Caljan')" data-status="open">Open (0)</button>
<button class="status-tab" onclick="switchStatusTab(this, 'Caljan')" data-status="incomplete">Incomplete (0)</button>
<button class="status-tab active" onclick="switchStatusTab(this, "" + escape_js_string(vendor_name) + "")" data-status="all">All (4)</button>
<button class="status-tab" onclick="switchStatusTab(this, "" + escape_js_string(vendor_name) + "")" data-status="updates_24h">Yesterday's Updates (0)</button>
<button class="status-tab" onclick="switchStatusTab(this, "" + escape_js_string(vendor_name) + "")" data-status="oldest_unaddressed">Oldest Unaddressed (0)</button>
<button class="status-tab" onclick="switchStatusTab(this, "" + escape_js_string(vendor_name) + "")" data-status="closed">Closed (4)</button>
<button class="status-tab" onclick="switchStatusTab(this, "" + escape_js_string(vendor_name) + "")" data-status="monitor">Monitor (0)</button>
<button class="status-tab" onclick="switchStatusTab(this, "" + escape_js_string(vendor_name) + "")" data-status="open">Open (0)</button>
<button class="status-tab" onclick="switchStatusTab(this, "" + escape_js_string(vendor_name) + "")" data-status="incomplete">Incomplete (0)</button>
</div>
<div class="status-tab-content active" data-status="all" data-vendor="Caljan">
@ -5931,13 +5931,13 @@ https://t.corp.amazon.com/V1969041198</div>
<div class="vendor-content">
<div class="status-tabs">
<button class="status-tab active" onclick="switchStatusTab(this, 'DCS')" data-status="all">All (25)</button>
<button class="status-tab" onclick="switchStatusTab(this, 'DCS')" data-status="updates_24h">Yesterday's Updates (0)</button>
<button class="status-tab" onclick="switchStatusTab(this, 'DCS')" data-status="oldest_unaddressed">Oldest Unaddressed (3)</button>
<button class="status-tab" onclick="switchStatusTab(this, 'DCS')" data-status="closed">Closed (20)</button>
<button class="status-tab" onclick="switchStatusTab(this, 'DCS')" data-status="monitor">Monitor (1)</button>
<button class="status-tab" onclick="switchStatusTab(this, 'DCS')" data-status="open">Open (4)</button>
<button class="status-tab" onclick="switchStatusTab(this, 'DCS')" data-status="incomplete">Incomplete (4)</button>
<button class="status-tab active" onclick="switchStatusTab(this, "" + escape_js_string(vendor_name) + "")" data-status="all">All (25)</button>
<button class="status-tab" onclick="switchStatusTab(this, "" + escape_js_string(vendor_name) + "")" data-status="updates_24h">Yesterday's Updates (0)</button>
<button class="status-tab" onclick="switchStatusTab(this, "" + escape_js_string(vendor_name) + "")" data-status="oldest_unaddressed">Oldest Unaddressed (3)</button>
<button class="status-tab" onclick="switchStatusTab(this, "" + escape_js_string(vendor_name) + "")" data-status="closed">Closed (20)</button>
<button class="status-tab" onclick="switchStatusTab(this, "" + escape_js_string(vendor_name) + "")" data-status="monitor">Monitor (1)</button>
<button class="status-tab" onclick="switchStatusTab(this, "" + escape_js_string(vendor_name) + "")" data-status="open">Open (4)</button>
<button class="status-tab" onclick="switchStatusTab(this, "" + escape_js_string(vendor_name) + "")" data-status="incomplete">Incomplete (4)</button>
</div>
<div class="status-tab-content active" data-status="all" data-vendor="DCS">
@ -7108,13 +7108,13 @@ https://t.corp.amazon.com/V1969041198</div>
<div class="vendor-content">
<div class="status-tabs">
<button class="status-tab active" onclick="switchStatusTab(this, 'DCS/Autstand')" data-status="all">All (1)</button>
<button class="status-tab" onclick="switchStatusTab(this, 'DCS/Autstand')" data-status="updates_24h">Yesterday's Updates (0)</button>
<button class="status-tab" onclick="switchStatusTab(this, 'DCS/Autstand')" data-status="oldest_unaddressed">Oldest Unaddressed (0)</button>
<button class="status-tab" onclick="switchStatusTab(this, 'DCS/Autstand')" data-status="closed">Closed (1)</button>
<button class="status-tab" onclick="switchStatusTab(this, 'DCS/Autstand')" data-status="monitor">Monitor (0)</button>
<button class="status-tab" onclick="switchStatusTab(this, 'DCS/Autstand')" data-status="open">Open (0)</button>
<button class="status-tab" onclick="switchStatusTab(this, 'DCS/Autstand')" data-status="incomplete">Incomplete (0)</button>
<button class="status-tab active" onclick="switchStatusTab(this, "" + escape_js_string(vendor_name) + "")" data-status="all">All (1)</button>
<button class="status-tab" onclick="switchStatusTab(this, "" + escape_js_string(vendor_name) + "")" data-status="updates_24h">Yesterday's Updates (0)</button>
<button class="status-tab" onclick="switchStatusTab(this, "" + escape_js_string(vendor_name) + "")" data-status="oldest_unaddressed">Oldest Unaddressed (0)</button>
<button class="status-tab" onclick="switchStatusTab(this, "" + escape_js_string(vendor_name) + "")" data-status="closed">Closed (1)</button>
<button class="status-tab" onclick="switchStatusTab(this, "" + escape_js_string(vendor_name) + "")" data-status="monitor">Monitor (0)</button>
<button class="status-tab" onclick="switchStatusTab(this, "" + escape_js_string(vendor_name) + "")" data-status="open">Open (0)</button>
<button class="status-tab" onclick="switchStatusTab(this, "" + escape_js_string(vendor_name) + "")" data-status="incomplete">Incomplete (0)</button>
</div>
<div class="status-tab-content active" data-status="all" data-vendor="DCS/Autstand">
@ -7260,13 +7260,13 @@ https://t.corp.amazon.com/V1969041198</div>
<div class="vendor-content">
<div class="status-tabs">
<button class="status-tab active" onclick="switchStatusTab(this, 'DCS/Flow-Turn')" data-status="all">All (1)</button>
<button class="status-tab" onclick="switchStatusTab(this, 'DCS/Flow-Turn')" data-status="updates_24h">Yesterday's Updates (0)</button>
<button class="status-tab" onclick="switchStatusTab(this, 'DCS/Flow-Turn')" data-status="oldest_unaddressed">Oldest Unaddressed (0)</button>
<button class="status-tab" onclick="switchStatusTab(this, 'DCS/Flow-Turn')" data-status="closed">Closed (1)</button>
<button class="status-tab" onclick="switchStatusTab(this, 'DCS/Flow-Turn')" data-status="monitor">Monitor (0)</button>
<button class="status-tab" onclick="switchStatusTab(this, 'DCS/Flow-Turn')" data-status="open">Open (0)</button>
<button class="status-tab" onclick="switchStatusTab(this, 'DCS/Flow-Turn')" data-status="incomplete">Incomplete (0)</button>
<button class="status-tab active" onclick="switchStatusTab(this, "" + escape_js_string(vendor_name) + "")" data-status="all">All (1)</button>
<button class="status-tab" onclick="switchStatusTab(this, "" + escape_js_string(vendor_name) + "")" data-status="updates_24h">Yesterday's Updates (0)</button>
<button class="status-tab" onclick="switchStatusTab(this, "" + escape_js_string(vendor_name) + "")" data-status="oldest_unaddressed">Oldest Unaddressed (0)</button>
<button class="status-tab" onclick="switchStatusTab(this, "" + escape_js_string(vendor_name) + "")" data-status="closed">Closed (1)</button>
<button class="status-tab" onclick="switchStatusTab(this, "" + escape_js_string(vendor_name) + "")" data-status="monitor">Monitor (0)</button>
<button class="status-tab" onclick="switchStatusTab(this, "" + escape_js_string(vendor_name) + "")" data-status="open">Open (0)</button>
<button class="status-tab" onclick="switchStatusTab(this, "" + escape_js_string(vendor_name) + "")" data-status="incomplete">Incomplete (0)</button>
</div>
<div class="status-tab-content active" data-status="all" data-vendor="DCS/Flow-Turn">
@ -7412,13 +7412,13 @@ https://t.corp.amazon.com/V1969041198</div>
<div class="vendor-content">
<div class="status-tabs">
<button class="status-tab active" onclick="switchStatusTab(this, 'DCS/RME')" data-status="all">All (1)</button>
<button class="status-tab" onclick="switchStatusTab(this, 'DCS/RME')" data-status="updates_24h">Yesterday's Updates (0)</button>
<button class="status-tab" onclick="switchStatusTab(this, 'DCS/RME')" data-status="oldest_unaddressed">Oldest Unaddressed (0)</button>
<button class="status-tab" onclick="switchStatusTab(this, 'DCS/RME')" data-status="closed">Closed (1)</button>
<button class="status-tab" onclick="switchStatusTab(this, 'DCS/RME')" data-status="monitor">Monitor (0)</button>
<button class="status-tab" onclick="switchStatusTab(this, 'DCS/RME')" data-status="open">Open (0)</button>
<button class="status-tab" onclick="switchStatusTab(this, 'DCS/RME')" data-status="incomplete">Incomplete (0)</button>
<button class="status-tab active" onclick="switchStatusTab(this, "" + escape_js_string(vendor_name) + "")" data-status="all">All (1)</button>
<button class="status-tab" onclick="switchStatusTab(this, "" + escape_js_string(vendor_name) + "")" data-status="updates_24h">Yesterday's Updates (0)</button>
<button class="status-tab" onclick="switchStatusTab(this, "" + escape_js_string(vendor_name) + "")" data-status="oldest_unaddressed">Oldest Unaddressed (0)</button>
<button class="status-tab" onclick="switchStatusTab(this, "" + escape_js_string(vendor_name) + "")" data-status="closed">Closed (1)</button>
<button class="status-tab" onclick="switchStatusTab(this, "" + escape_js_string(vendor_name) + "")" data-status="monitor">Monitor (0)</button>
<button class="status-tab" onclick="switchStatusTab(this, "" + escape_js_string(vendor_name) + "")" data-status="open">Open (0)</button>
<button class="status-tab" onclick="switchStatusTab(this, "" + escape_js_string(vendor_name) + "")" data-status="incomplete">Incomplete (0)</button>
</div>
<div class="status-tab-content active" data-status="all" data-vendor="DCS/RME">
@ -7564,13 +7564,13 @@ https://t.corp.amazon.com/V1969041198</div>
<div class="vendor-content">
<div class="status-tabs">
<button class="status-tab active" onclick="switchStatusTab(this, 'Datalogic')" data-status="all">All (5)</button>
<button class="status-tab" onclick="switchStatusTab(this, 'Datalogic')" data-status="updates_24h">Yesterday's Updates (0)</button>
<button class="status-tab" onclick="switchStatusTab(this, 'Datalogic')" data-status="oldest_unaddressed">Oldest Unaddressed (1)</button>
<button class="status-tab" onclick="switchStatusTab(this, 'Datalogic')" data-status="closed">Closed (3)</button>
<button class="status-tab" onclick="switchStatusTab(this, 'Datalogic')" data-status="monitor">Monitor (1)</button>
<button class="status-tab" onclick="switchStatusTab(this, 'Datalogic')" data-status="open">Open (1)</button>
<button class="status-tab" onclick="switchStatusTab(this, 'Datalogic')" data-status="incomplete">Incomplete (1)</button>
<button class="status-tab active" onclick="switchStatusTab(this, "" + escape_js_string(vendor_name) + "")" data-status="all">All (5)</button>
<button class="status-tab" onclick="switchStatusTab(this, "" + escape_js_string(vendor_name) + "")" data-status="updates_24h">Yesterday's Updates (0)</button>
<button class="status-tab" onclick="switchStatusTab(this, "" + escape_js_string(vendor_name) + "")" data-status="oldest_unaddressed">Oldest Unaddressed (1)</button>
<button class="status-tab" onclick="switchStatusTab(this, "" + escape_js_string(vendor_name) + "")" data-status="closed">Closed (3)</button>
<button class="status-tab" onclick="switchStatusTab(this, "" + escape_js_string(vendor_name) + "")" data-status="monitor">Monitor (1)</button>
<button class="status-tab" onclick="switchStatusTab(this, "" + escape_js_string(vendor_name) + "")" data-status="open">Open (1)</button>
<button class="status-tab" onclick="switchStatusTab(this, "" + escape_js_string(vendor_name) + "")" data-status="incomplete">Incomplete (1)</button>
</div>
<div class="status-tab-content active" data-status="all" data-vendor="Datalogic">
@ -7919,13 +7919,13 @@ https://t.corp.amazon.com/V1969041198</div>
<div class="vendor-content">
<div class="status-tabs">
<button class="status-tab active" onclick="switchStatusTab(this, 'FMH/Gorbel')" data-status="all">All (1)</button>
<button class="status-tab" onclick="switchStatusTab(this, 'FMH/Gorbel')" data-status="updates_24h">Yesterday's Updates (0)</button>
<button class="status-tab" onclick="switchStatusTab(this, 'FMH/Gorbel')" data-status="oldest_unaddressed">Oldest Unaddressed (0)</button>
<button class="status-tab" onclick="switchStatusTab(this, 'FMH/Gorbel')" data-status="closed">Closed (1)</button>
<button class="status-tab" onclick="switchStatusTab(this, 'FMH/Gorbel')" data-status="monitor">Monitor (0)</button>
<button class="status-tab" onclick="switchStatusTab(this, 'FMH/Gorbel')" data-status="open">Open (0)</button>
<button class="status-tab" onclick="switchStatusTab(this, 'FMH/Gorbel')" data-status="incomplete">Incomplete (0)</button>
<button class="status-tab active" onclick="switchStatusTab(this, "" + escape_js_string(vendor_name) + "")" data-status="all">All (1)</button>
<button class="status-tab" onclick="switchStatusTab(this, "" + escape_js_string(vendor_name) + "")" data-status="updates_24h">Yesterday's Updates (0)</button>
<button class="status-tab" onclick="switchStatusTab(this, "" + escape_js_string(vendor_name) + "")" data-status="oldest_unaddressed">Oldest Unaddressed (0)</button>
<button class="status-tab" onclick="switchStatusTab(this, "" + escape_js_string(vendor_name) + "")" data-status="closed">Closed (1)</button>
<button class="status-tab" onclick="switchStatusTab(this, "" + escape_js_string(vendor_name) + "")" data-status="monitor">Monitor (0)</button>
<button class="status-tab" onclick="switchStatusTab(this, "" + escape_js_string(vendor_name) + "")" data-status="open">Open (0)</button>
<button class="status-tab" onclick="switchStatusTab(this, "" + escape_js_string(vendor_name) + "")" data-status="incomplete">Incomplete (0)</button>
</div>
<div class="status-tab-content active" data-status="all" data-vendor="FMH/Gorbel">
@ -8071,13 +8071,13 @@ https://t.corp.amazon.com/V1969041198</div>
<div class="vendor-content">
<div class="status-tabs">
<button class="status-tab active" onclick="switchStatusTab(this, 'Gorbel')" data-status="all">All (2)</button>
<button class="status-tab" onclick="switchStatusTab(this, 'Gorbel')" data-status="updates_24h">Yesterday's Updates (0)</button>
<button class="status-tab" onclick="switchStatusTab(this, 'Gorbel')" data-status="oldest_unaddressed">Oldest Unaddressed (0)</button>
<button class="status-tab" onclick="switchStatusTab(this, 'Gorbel')" data-status="closed">Closed (2)</button>
<button class="status-tab" onclick="switchStatusTab(this, 'Gorbel')" data-status="monitor">Monitor (0)</button>
<button class="status-tab" onclick="switchStatusTab(this, 'Gorbel')" data-status="open">Open (0)</button>
<button class="status-tab" onclick="switchStatusTab(this, 'Gorbel')" data-status="incomplete">Incomplete (0)</button>
<button class="status-tab active" onclick="switchStatusTab(this, "" + escape_js_string(vendor_name) + "")" data-status="all">All (2)</button>
<button class="status-tab" onclick="switchStatusTab(this, "" + escape_js_string(vendor_name) + "")" data-status="updates_24h">Yesterday's Updates (0)</button>
<button class="status-tab" onclick="switchStatusTab(this, "" + escape_js_string(vendor_name) + "")" data-status="oldest_unaddressed">Oldest Unaddressed (0)</button>
<button class="status-tab" onclick="switchStatusTab(this, "" + escape_js_string(vendor_name) + "")" data-status="closed">Closed (2)</button>
<button class="status-tab" onclick="switchStatusTab(this, "" + escape_js_string(vendor_name) + "")" data-status="monitor">Monitor (0)</button>
<button class="status-tab" onclick="switchStatusTab(this, "" + escape_js_string(vendor_name) + "")" data-status="open">Open (0)</button>
<button class="status-tab" onclick="switchStatusTab(this, "" + escape_js_string(vendor_name) + "")" data-status="incomplete">Incomplete (0)</button>
</div>
<div class="status-tab-content active" data-status="all" data-vendor="Gorbel">
@ -8266,13 +8266,13 @@ https://t.corp.amazon.com/V1969041198</div>
<div class="vendor-content">
<div class="status-tabs">
<button class="status-tab active" onclick="switchStatusTab(this, 'MFO (Amazon)')" data-status="all">All (1)</button>
<button class="status-tab" onclick="switchStatusTab(this, 'MFO (Amazon)')" data-status="updates_24h">Yesterday's Updates (0)</button>
<button class="status-tab" onclick="switchStatusTab(this, 'MFO (Amazon)')" data-status="oldest_unaddressed">Oldest Unaddressed (0)</button>
<button class="status-tab" onclick="switchStatusTab(this, 'MFO (Amazon)')" data-status="closed">Closed (1)</button>
<button class="status-tab" onclick="switchStatusTab(this, 'MFO (Amazon)')" data-status="monitor">Monitor (0)</button>
<button class="status-tab" onclick="switchStatusTab(this, 'MFO (Amazon)')" data-status="open">Open (0)</button>
<button class="status-tab" onclick="switchStatusTab(this, 'MFO (Amazon)')" data-status="incomplete">Incomplete (0)</button>
<button class="status-tab active" onclick="switchStatusTab(this, "" + escape_js_string(vendor_name) + "")" data-status="all">All (1)</button>
<button class="status-tab" onclick="switchStatusTab(this, "" + escape_js_string(vendor_name) + "")" data-status="updates_24h">Yesterday's Updates (0)</button>
<button class="status-tab" onclick="switchStatusTab(this, "" + escape_js_string(vendor_name) + "")" data-status="oldest_unaddressed">Oldest Unaddressed (0)</button>
<button class="status-tab" onclick="switchStatusTab(this, "" + escape_js_string(vendor_name) + "")" data-status="closed">Closed (1)</button>
<button class="status-tab" onclick="switchStatusTab(this, "" + escape_js_string(vendor_name) + "")" data-status="monitor">Monitor (0)</button>
<button class="status-tab" onclick="switchStatusTab(this, "" + escape_js_string(vendor_name) + "")" data-status="open">Open (0)</button>
<button class="status-tab" onclick="switchStatusTab(this, "" + escape_js_string(vendor_name) + "")" data-status="incomplete">Incomplete (0)</button>
</div>
<div class="status-tab-content active" data-status="all" data-vendor="MFO (Amazon)">
@ -8418,13 +8418,13 @@ https://t.corp.amazon.com/V1969041198</div>
<div class="vendor-content">
<div class="status-tabs">
<button class="status-tab active" onclick="switchStatusTab(this, 'MISC')" data-status="all">All (7)</button>
<button class="status-tab" onclick="switchStatusTab(this, 'MISC')" data-status="updates_24h">Yesterday's Updates (0)</button>
<button class="status-tab" onclick="switchStatusTab(this, 'MISC')" data-status="oldest_unaddressed">Oldest Unaddressed (0)</button>
<button class="status-tab" onclick="switchStatusTab(this, 'MISC')" data-status="closed">Closed (7)</button>
<button class="status-tab" onclick="switchStatusTab(this, 'MISC')" data-status="monitor">Monitor (0)</button>
<button class="status-tab" onclick="switchStatusTab(this, 'MISC')" data-status="open">Open (0)</button>
<button class="status-tab" onclick="switchStatusTab(this, 'MISC')" data-status="incomplete">Incomplete (0)</button>
<button class="status-tab active" onclick="switchStatusTab(this, "" + escape_js_string(vendor_name) + "")" data-status="all">All (7)</button>
<button class="status-tab" onclick="switchStatusTab(this, "" + escape_js_string(vendor_name) + "")" data-status="updates_24h">Yesterday's Updates (0)</button>
<button class="status-tab" onclick="switchStatusTab(this, "" + escape_js_string(vendor_name) + "")" data-status="oldest_unaddressed">Oldest Unaddressed (0)</button>
<button class="status-tab" onclick="switchStatusTab(this, "" + escape_js_string(vendor_name) + "")" data-status="closed">Closed (7)</button>
<button class="status-tab" onclick="switchStatusTab(this, "" + escape_js_string(vendor_name) + "")" data-status="monitor">Monitor (0)</button>
<button class="status-tab" onclick="switchStatusTab(this, "" + escape_js_string(vendor_name) + "")" data-status="open">Open (0)</button>
<button class="status-tab" onclick="switchStatusTab(this, "" + escape_js_string(vendor_name) + "")" data-status="incomplete">Incomplete (0)</button>
</div>
<div class="status-tab-content active" data-status="all" data-vendor="MISC">
@ -8793,13 +8793,13 @@ https://t.corp.amazon.com/V1969041198</div>
<div class="vendor-content">
<div class="status-tabs">
<button class="status-tab active" onclick="switchStatusTab(this, 'Startup (Amazon)')" data-status="all">All (1)</button>
<button class="status-tab" onclick="switchStatusTab(this, 'Startup (Amazon)')" data-status="updates_24h">Yesterday's Updates (0)</button>
<button class="status-tab" onclick="switchStatusTab(this, 'Startup (Amazon)')" data-status="oldest_unaddressed">Oldest Unaddressed (0)</button>
<button class="status-tab" onclick="switchStatusTab(this, 'Startup (Amazon)')" data-status="closed">Closed (1)</button>
<button class="status-tab" onclick="switchStatusTab(this, 'Startup (Amazon)')" data-status="monitor">Monitor (0)</button>
<button class="status-tab" onclick="switchStatusTab(this, 'Startup (Amazon)')" data-status="open">Open (0)</button>
<button class="status-tab" onclick="switchStatusTab(this, 'Startup (Amazon)')" data-status="incomplete">Incomplete (0)</button>
<button class="status-tab active" onclick="switchStatusTab(this, "" + escape_js_string(vendor_name) + "")" data-status="all">All (1)</button>
<button class="status-tab" onclick="switchStatusTab(this, "" + escape_js_string(vendor_name) + "")" data-status="updates_24h">Yesterday's Updates (0)</button>
<button class="status-tab" onclick="switchStatusTab(this, "" + escape_js_string(vendor_name) + "")" data-status="oldest_unaddressed">Oldest Unaddressed (0)</button>
<button class="status-tab" onclick="switchStatusTab(this, "" + escape_js_string(vendor_name) + "")" data-status="closed">Closed (1)</button>
<button class="status-tab" onclick="switchStatusTab(this, "" + escape_js_string(vendor_name) + "")" data-status="monitor">Monitor (0)</button>
<button class="status-tab" onclick="switchStatusTab(this, "" + escape_js_string(vendor_name) + "")" data-status="open">Open (0)</button>
<button class="status-tab" onclick="switchStatusTab(this, "" + escape_js_string(vendor_name) + "")" data-status="incomplete">Incomplete (0)</button>
</div>
<div class="status-tab-content active" data-status="all" data-vendor="Startup (Amazon)">

View File

@ -1,5 +1,5 @@
{
"report_generated_at": "2025-11-06T20:37:46.364471",
"report_generated_at": "2025-11-07T01:50:13.559722",
"vendors": [
{
"vendor_name": "Amazon",

View File

@ -67,9 +67,10 @@ class SharePointDownloader:
try:
if self.use_app_authentication and self.client_id and self.client_secret:
# App authentication (recommended for automation)
logger.info(f"Attempting app authentication with client_id: {self.client_id[:8]}...")
credentials = ClientCredential(self.client_id, self.client_secret)
self.ctx = ClientContext(self.site_url).with_credentials(credentials)
logger.info("Authenticated with SharePoint using app credentials")
logger.info("Created SharePoint context with app credentials")
elif self.username and self.password:
# User authentication
credentials = UserCredential(self.username, self.password)
@ -80,6 +81,7 @@ class SharePointDownloader:
return False
# Test connection
logger.info("Testing SharePoint connection...")
web = self.ctx.web
self.ctx.load(web)
self.ctx.execute_query()
@ -87,7 +89,10 @@ class SharePointDownloader:
return True
except Exception as e:
logger.error(f"SharePoint authentication failed: {e}")
logger.error(f"SharePoint authentication failed: {e}", exc_info=True)
logger.error(f"Site URL: {self.site_url}")
logger.error(f"Client ID: {self.client_id[:8] if self.client_id else 'None'}...")
logger.error(f"Using app auth: {self.use_app_authentication}")
return False
def download_file(

26
test_docker.ps1 Normal file
View File

@ -0,0 +1,26 @@
# Simple Docker test script
Write-Host "=== Testing Docker Image ===" -ForegroundColor Cyan
Write-Host "`n1. Testing local file..." -ForegroundColor Yellow
python test_syntax.py
Write-Host "`n2. Building Docker image..." -ForegroundColor Yellow
docker build --no-cache -t vendor-report-api-test . 2>&1 | Select-String "Step|COPY|ERROR" | Select-Object -Last 5
Write-Host "`n3. Checking line 794 in LOCAL file:" -ForegroundColor Yellow
Get-Content html_generator.py | Select-Object -Index 793
Write-Host "`n4. Checking line 794 in DOCKER image:" -ForegroundColor Yellow
docker run --rm vendor-report-api-test sed -n '794p' /app/html_generator.py 2>&1
Write-Host "`n5. Checking line 1284 in LOCAL file:" -ForegroundColor Yellow
Get-Content html_generator.py | Select-Object -Index 1283
Write-Host "`n6. Checking line 1284 in DOCKER image:" -ForegroundColor Yellow
docker run --rm vendor-report-api-test sed -n '1284p' /app/html_generator.py 2>&1
Write-Host "`n7. Testing Python import in Docker:" -ForegroundColor Yellow
docker run --rm vendor-report-api-test python -c "import html_generator; print('SUCCESS')" 2>&1
Write-Host "`n=== Done ===" -ForegroundColor Cyan

20
test_syntax.py Normal file
View File

@ -0,0 +1,20 @@
#!/usr/bin/env python3
"""Quick syntax test for html_generator.py"""
import sys
try:
import html_generator
print("SUCCESS: html_generator.py imports without syntax errors!")
print(f"escape_js_string function exists: {hasattr(html_generator, 'escape_js_string')}")
sys.exit(0)
except SyntaxError as e:
print(f"SYNTAX ERROR: {e}")
print(f" File: {e.filename}")
print(f" Line: {e.lineno}")
print(f" Text: {e.text}")
sys.exit(1)
except Exception as e:
print(f"ERROR: {e}")
sys.exit(1)

55
verify_build.ps1 Normal file
View File

@ -0,0 +1,55 @@
# Comprehensive build verification script
Write-Host "=== Vendor Report API Build Verification ===" -ForegroundColor Cyan
# 1. Verify local file syntax
Write-Host "`n1. Checking local file syntax..." -ForegroundColor Yellow
python -c "import html_generator; print('Local file syntax OK')" 2>&1
if ($LASTEXITCODE -ne 0) {
Write-Host "Local file has syntax errors!" -ForegroundColor Red
exit 1
} else {
Write-Host "Local file syntax OK" -ForegroundColor Green
}
# 2. Check specific lines
Write-Host "`n2. Checking fixed lines..." -ForegroundColor Yellow
$line794 = (Get-Content html_generator.py)[793]
$line1284 = (Get-Content html_generator.py)[1283]
Write-Host "Line 794: $($line794.Substring(0, [Math]::Min(80, $line794.Length)))..."
if ($line794 -match '\\"') {
Write-Host "Line 794 still has backslash!" -ForegroundColor Red
} else {
Write-Host "Line 794 looks correct (no backslash)" -ForegroundColor Green
}
Write-Host "Line 1284: $($line1284.Substring(0, [Math]::Min(80, $line1284.Length)))..."
if ($line1284 -match '\\"') {
Write-Host "Line 1284 still has backslash!" -ForegroundColor Red
} else {
Write-Host "Line 1284 looks correct (no backslash)" -ForegroundColor Green
}
# 3. Build image with --no-cache
Write-Host "`n3. Building Docker image with --no-cache..." -ForegroundColor Yellow
docker build --no-cache -t vendor-report-api-test . 2>&1 | Select-String "Step|COPY|ERROR" | Select-Object -Last 10
# 4. Verify what's in the image
Write-Host "`n4. Verifying Docker image contents..." -ForegroundColor Yellow
Write-Host "Line 794 in image:"
docker run --rm vendor-report-api-test sed -n '794p' /app/html_generator.py 2>&1
Write-Host "`nLine 1284 in image:"
docker run --rm vendor-report-api-test sed -n '1284p' /app/html_generator.py 2>&1
# 5. Test import in Docker
Write-Host "`n5. Testing Python import in Docker container..." -ForegroundColor Yellow
docker run --rm vendor-report-api-test python -c "import html_generator; print('SUCCESS')" 2>&1
if ($LASTEXITCODE -eq 0) {
Write-Host "✓ Docker image works!" -ForegroundColor Green
} else {
Write-Host "✗ Docker image still has errors!" -ForegroundColor Red
}
Write-Host "`n=== Verification Complete ===" -ForegroundColor Cyan

32
verify_docker_image.ps1 Normal file
View File

@ -0,0 +1,32 @@
# Verify what's actually in the Docker image
param(
[string]$ImageName = "vendor-report-api-test"
)
Write-Host "=== Verifying Docker Image Contents ===" -ForegroundColor Cyan
# Build the image
Write-Host "`n1. Building image: $ImageName" -ForegroundColor Yellow
docker build -t $ImageName . 2>&1 | Select-String "COPY|Step"
# Check line 794 in the image
Write-Host "`n2. Checking line 794 in Docker image:" -ForegroundColor Yellow
docker run --rm $ImageName sed -n '794p' /app/html_generator.py
# Check line 1284 in the image
Write-Host "`n3. Checking line 1284 in Docker image:" -ForegroundColor Yellow
docker run --rm $ImageName sed -n '1284p' /app/html_generator.py
# Try to import the module
Write-Host "`n4. Testing Python import in Docker:" -ForegroundColor Yellow
docker run --rm $ImageName python -c "import html_generator; print('SUCCESS')" 2>&1
# Compare with local file
Write-Host "`n5. Local file line 794:" -ForegroundColor Yellow
Get-Content html_generator.py | Select-Object -Index 793
Write-Host "`n6. Local file line 1284:" -ForegroundColor Yellow
Get-Content html_generator.py | Select-Object -Index 1283
Write-Host "`n=== Done ===" -ForegroundColor Cyan