fix: align PortalSEOAudit model with actual database table schema
Some checks are pending
NordaBiz Tests / Unit & Integration Tests (push) Waiting to run
NordaBiz Tests / E2E Tests (Playwright) (push) Blocked by required conditions
NordaBiz Tests / Smoke Tests (Production) (push) Blocked by required conditions
NordaBiz Tests / Send Failure Notification (push) Blocked by required conditions
Some checks are pending
NordaBiz Tests / Unit & Integration Tests (push) Waiting to run
NordaBiz Tests / E2E Tests (Playwright) (push) Blocked by required conditions
NordaBiz Tests / Smoke Tests (Production) (push) Blocked by required conditions
NordaBiz Tests / Send Failure Notification (push) Blocked by required conditions
Model had columns (overall_score, on_page_score, etc.) that didn't exist in the migration. Updated model and templates to match the actual table. Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
This commit is contained in:
parent
a8fd4b1b87
commit
9989e6fcb7
@ -74,30 +74,42 @@ def admin_portal_seo_run():
|
||||
tech = result.get('technical', {})
|
||||
on_page = result.get('on_page', {})
|
||||
|
||||
sec = result.get('security_headers', {})
|
||||
|
||||
audit = PortalSEOAudit(
|
||||
audited_at=datetime.now(),
|
||||
url=PORTAL_URL,
|
||||
# PageSpeed scores
|
||||
pagespeed_performance=ps_scores.get('performance'),
|
||||
pagespeed_seo=ps_scores.get('seo'),
|
||||
pagespeed_accessibility=ps_scores.get('accessibility'),
|
||||
pagespeed_best_practices=ps_scores.get('best_practices'),
|
||||
overall_score=result.get('overall_score'),
|
||||
on_page_score=on_page.get('score'),
|
||||
technical_score=tech.get('score'),
|
||||
local_seo_score=result.get('local_seo', {}).get('score'),
|
||||
# Core Web Vitals
|
||||
lcp_ms=cwv.get('lcp_ms'),
|
||||
fcp_ms=cwv.get('fcp_ms'),
|
||||
cls=cwv.get('cls'),
|
||||
tbt_ms=cwv.get('tbt_ms'),
|
||||
speed_index_ms=cwv.get('speed_index_ms'),
|
||||
# On-page checks
|
||||
has_meta_title=bool(on_page.get('meta_title')),
|
||||
has_meta_description=bool(on_page.get('meta_description')),
|
||||
has_canonical=tech.get('has_canonical'),
|
||||
has_robots_txt=tech.get('has_robots_txt'),
|
||||
has_sitemap=tech.get('has_sitemap'),
|
||||
has_canonical=tech.get('has_canonical'),
|
||||
has_structured_data=on_page.get('has_structured_data'),
|
||||
has_og_tags=on_page.get('has_og_tags'),
|
||||
has_ssl=tech.get('has_ssl'),
|
||||
is_mobile_friendly=tech.get('is_mobile_friendly'),
|
||||
has_hsts=result.get('security_headers', {}).get('has_hsts'),
|
||||
has_csp=result.get('security_headers', {}).get('has_csp'),
|
||||
# Security headers
|
||||
has_hsts=sec.get('has_hsts'),
|
||||
has_csp=sec.get('has_csp'),
|
||||
has_x_frame=sec.get('has_x_frame_options'),
|
||||
has_x_content_type=sec.get('has_x_content_type'),
|
||||
# Content metrics
|
||||
page_size_bytes=on_page.get('page_size_bytes'),
|
||||
image_count=on_page.get('total_images'),
|
||||
images_without_alt=on_page.get('images_without_alt'),
|
||||
# Full data
|
||||
full_results=result,
|
||||
notes=request.form.get('notes', ''),
|
||||
created_by=current_user.email
|
||||
@ -106,7 +118,7 @@ def admin_portal_seo_run():
|
||||
db.add(audit)
|
||||
db.commit()
|
||||
|
||||
flash(f'Audyt SEO portalu zakończony. Wynik ogólny: {audit.overall_score or "N/A"}', 'success')
|
||||
flash(f'Audyt SEO portalu zakończony. Performance: {audit.pagespeed_performance or "N/A"}', 'success')
|
||||
return redirect(url_for('admin.admin_portal_seo'))
|
||||
|
||||
except Exception as e:
|
||||
|
||||
20
database.py
20
database.py
@ -5519,22 +5519,19 @@ class PortalSEOAudit(Base):
|
||||
pagespeed_accessibility = Column(Integer)
|
||||
pagespeed_best_practices = Column(Integer)
|
||||
|
||||
# Overall scores from SEOAuditor
|
||||
overall_score = Column(Integer)
|
||||
on_page_score = Column(Integer)
|
||||
technical_score = Column(Integer)
|
||||
local_seo_score = Column(Integer)
|
||||
|
||||
# Core Web Vitals
|
||||
lcp_ms = Column(Numeric(10, 2))
|
||||
fcp_ms = Column(Numeric(10, 2))
|
||||
cls = Column(Numeric(6, 4))
|
||||
tbt_ms = Column(Numeric(10, 2))
|
||||
speed_index_ms = Column(Numeric(10, 2))
|
||||
|
||||
# Key checks
|
||||
# On-page SEO checks
|
||||
has_meta_title = Column(Boolean)
|
||||
has_meta_description = Column(Boolean)
|
||||
has_canonical = Column(Boolean)
|
||||
has_robots_txt = Column(Boolean)
|
||||
has_sitemap = Column(Boolean)
|
||||
has_canonical = Column(Boolean)
|
||||
has_structured_data = Column(Boolean)
|
||||
has_og_tags = Column(Boolean)
|
||||
has_ssl = Column(Boolean)
|
||||
@ -5543,6 +5540,13 @@ class PortalSEOAudit(Base):
|
||||
# Security headers
|
||||
has_hsts = Column(Boolean)
|
||||
has_csp = Column(Boolean)
|
||||
has_x_frame = Column(Boolean)
|
||||
has_x_content_type = Column(Boolean)
|
||||
|
||||
# Content metrics
|
||||
page_size_bytes = Column(Integer)
|
||||
image_count = Column(Integer)
|
||||
images_without_alt = Column(Integer)
|
||||
|
||||
# Full audit results from SEOAuditor
|
||||
full_results = Column(JSONB)
|
||||
|
||||
@ -158,8 +158,6 @@
|
||||
{{ score_card('SEO', latest.pagespeed_seo, prev.pagespeed_seo if prev else None) }}
|
||||
{{ score_card('Accessibility', latest.pagespeed_accessibility, prev.pagespeed_accessibility if prev else None) }}
|
||||
{{ score_card('Best Practices', latest.pagespeed_best_practices, prev.pagespeed_best_practices if prev else None) }}
|
||||
{{ score_card('On-Page', latest.on_page_score, prev.on_page_score if prev else None) }}
|
||||
{{ score_card('Technical', latest.technical_score, prev.technical_score if prev else None) }}
|
||||
</div>
|
||||
|
||||
<!-- Key checks -->
|
||||
@ -178,15 +176,19 @@
|
||||
</div>
|
||||
{% endmacro %}
|
||||
|
||||
{{ check_item('Meta Title', latest.has_meta_title) }}
|
||||
{{ check_item('Meta Description', latest.has_meta_description) }}
|
||||
{{ check_item('Canonical URL', latest.has_canonical) }}
|
||||
{{ check_item('robots.txt', latest.has_robots_txt) }}
|
||||
{{ check_item('sitemap.xml', latest.has_sitemap) }}
|
||||
{{ check_item('Canonical URL', latest.has_canonical) }}
|
||||
{{ check_item('Structured Data', latest.has_structured_data) }}
|
||||
{{ check_item('Open Graph', latest.has_og_tags) }}
|
||||
{{ check_item('SSL', latest.has_ssl) }}
|
||||
{{ check_item('Mobile Friendly', latest.is_mobile_friendly) }}
|
||||
{{ check_item('HSTS', latest.has_hsts) }}
|
||||
{{ check_item('CSP', latest.has_csp) }}
|
||||
{{ check_item('X-Frame-Options', latest.has_x_frame) }}
|
||||
{{ check_item('X-Content-Type', latest.has_x_content_type) }}
|
||||
</div>
|
||||
|
||||
<!-- Core Web Vitals -->
|
||||
@ -241,8 +243,6 @@
|
||||
<th>SEO</th>
|
||||
<th>A11y</th>
|
||||
<th>BP</th>
|
||||
<th>On-Page</th>
|
||||
<th>Tech</th>
|
||||
<th>Notatka</th>
|
||||
<th></th>
|
||||
</tr>
|
||||
@ -262,8 +262,6 @@
|
||||
{{ score_td(a.pagespeed_seo) }}
|
||||
{{ score_td(a.pagespeed_accessibility) }}
|
||||
{{ score_td(a.pagespeed_best_practices) }}
|
||||
{{ score_td(a.on_page_score) }}
|
||||
{{ score_td(a.technical_score) }}
|
||||
<td style="max-width: 200px; overflow: hidden; text-overflow: ellipsis; white-space: nowrap;">
|
||||
{{ a.notes or '' }}
|
||||
</td>
|
||||
|
||||
Loading…
Reference in New Issue
Block a user