Files
orion/alembic/versions_backup/z6g7h8i9j0k1_add_main_platform.py
Samir Boulahtit f20266167d
Some checks failed
CI / ruff (push) Failing after 7s
CI / pytest (push) Failing after 1s
CI / architecture (push) Failing after 9s
CI / dependency-scanning (push) Successful in 27s
CI / audit (push) Successful in 8s
CI / docs (push) Has been skipped
fix(lint): auto-fix ruff violations and tune lint rules
- Auto-fixed 4,496 lint issues (import sorting, modern syntax, etc.)
- Added ignore rules for patterns intentional in this codebase:
  E402 (late imports), E712 (SQLAlchemy filters), B904 (raise from),
  SIM108/SIM105/SIM117 (readability preferences)
- Added per-file ignores for tests and scripts
- Excluded broken scripts/rename_terminology.py (has curly quotes)

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-02-12 23:10:42 +01:00

433 lines
17 KiB
Python

"""add main platform for marketing site
Revision ID: z6g7h8i9j0k1
Revises: z5f6g7h8i9j0
Create Date: 2026-01-19 14:00:00.000000
This migration adds the 'main' platform for the main marketing site:
1. Inserts main platform record (wizamart.lu)
2. Creates platform marketing pages (home, about, faq, pricing, contact)
The 'main' platform serves as the marketing homepage at:
- Development: localhost:9999/ (no /platforms/ prefix)
- Production: wizamart.lu/
All other platforms are accessed via:
- Development: localhost:9999/platforms/{code}/
- Production: {code}.lu or custom domain
"""
from collections.abc import Sequence
import sqlalchemy as sa
from alembic import op
# revision identifiers, used by Alembic.
revision: str = "z6g7h8i9j0k1"
down_revision: str | None = "z5f6g7h8i9j0"
branch_labels: str | Sequence[str] | None = None
depends_on: str | Sequence[str] | None = None
def upgrade() -> None:
conn = op.get_bind()
# =========================================================================
# 1. Insert Main Marketing platform
# =========================================================================
conn.execute(
sa.text("""
INSERT INTO platforms (code, name, description, domain, path_prefix, default_language,
supported_languages, is_active, is_public, theme_config, settings,
created_at, updated_at)
VALUES ('main', 'Wizamart', 'Main marketing site showcasing all Wizamart platforms',
'wizamart.lu', NULL, 'fr', '["fr", "de", "en"]', true, true,
'{"primary_color": "#2563EB", "secondary_color": "#3B82F6"}',
'{"is_marketing_site": true}',
CURRENT_TIMESTAMP, CURRENT_TIMESTAMP)
""")
)
# Get the Main platform ID
result = conn.execute(sa.text("SELECT id FROM platforms WHERE code = 'main'"))
main_platform_id = result.fetchone()[0]
# =========================================================================
# 2. Create platform marketing pages (is_platform_page=True)
# =========================================================================
platform_pages = [
{
"slug": "home",
"title": "Wizamart - E-commerce Solutions for Luxembourg",
"content": """<div class="hero-section">
<h1>Build Your Business with Wizamart</h1>
<p class="lead">All-in-one e-commerce, loyalty, and business solutions for Luxembourg merchants</p>
</div>
<div class="platforms-showcase">
<h2>Our Platforms</h2>
<div class="platform-card">
<h3>Wizamart OMS</h3>
<p>Order Management System for multi-channel selling. Manage orders, inventory, and fulfillment from one dashboard.</p>
<a href="/platforms/oms/" class="btn">Learn More</a>
</div>
<div class="platform-card">
<h3>Loyalty+</h3>
<p>Customer loyalty platform to reward your customers and increase retention. Points, rewards, and member tiers.</p>
<a href="/platforms/loyalty/" class="btn">Learn More</a>
</div>
<div class="platform-card">
<h3>Site Builder</h3>
<p>Create beautiful websites for your local business. No coding required.</p>
<span class="badge">Coming Soon</span>
</div>
</div>
<div class="why-wizamart">
<h2>Why Choose Wizamart?</h2>
<ul>
<li><strong>Made for Luxembourg:</strong> Built specifically for Luxembourg businesses with local payment methods, languages, and compliance.</li>
<li><strong>All-in-One:</strong> Use our platforms together or separately - they integrate seamlessly.</li>
<li><strong>Local Support:</strong> Real support from real people in Luxembourg.</li>
</ul>
</div>""",
"meta_description": "Wizamart offers e-commerce, loyalty, and business solutions for Luxembourg merchants. OMS, Loyalty+, and Site Builder platforms.",
"show_in_header": False,
"show_in_footer": False,
"display_order": 0,
},
{
"slug": "about",
"title": "About Wizamart",
"content": """<div class="about-page">
<h1>About Wizamart</h1>
<div class="mission">
<h2>Our Mission</h2>
<p>We're building the tools Luxembourg businesses need to thrive in the digital economy. From order management to customer loyalty, we provide the infrastructure that powers local commerce.</p>
</div>
<div class="story">
<h2>Our Story</h2>
<p>Wizamart was founded with a simple idea: Luxembourg businesses deserve world-class e-commerce tools that understand their unique needs. Local languages, local payment methods, local compliance - built in from the start.</p>
</div>
<div class="team">
<h2>Our Team</h2>
<p>We're a team of developers, designers, and business experts based in Luxembourg. We understand the local market because we're part of it.</p>
</div>
<div class="values">
<h2>Our Values</h2>
<ul>
<li><strong>Simplicity:</strong> Powerful tools that are easy to use</li>
<li><strong>Reliability:</strong> Your business depends on us - we take that seriously</li>
<li><strong>Local First:</strong> Built for Luxembourg, by Luxembourg</li>
<li><strong>Innovation:</strong> Always improving, always evolving</li>
</ul>
</div>
</div>""",
"meta_description": "Learn about Wizamart, the Luxembourg-based company building e-commerce and business solutions for local merchants.",
"show_in_header": True,
"show_in_footer": True,
"display_order": 1,
},
{
"slug": "pricing",
"title": "Pricing - Wizamart",
"content": """<div class="pricing-page">
<h1>Choose Your Platform</h1>
<p class="lead">Each platform has its own pricing. Choose the tools your business needs.</p>
<div class="platform-pricing">
<div class="platform-pricing-card">
<h3>Wizamart OMS</h3>
<p>Order Management System</p>
<div class="price-range">From €49/month</div>
<ul>
<li>Multi-channel order management</li>
<li>Inventory tracking</li>
<li>Shipping integrations</li>
<li>Analytics dashboard</li>
</ul>
<a href="/platforms/oms/pricing" class="btn">View OMS Pricing</a>
</div>
<div class="platform-pricing-card">
<h3>Loyalty+</h3>
<p>Customer Loyalty Platform</p>
<div class="price-range">From €49/month</div>
<ul>
<li>Points & rewards system</li>
<li>Member tiers</li>
<li>Analytics & insights</li>
<li>POS integrations</li>
</ul>
<a href="/platforms/loyalty/pricing" class="btn">View Loyalty+ Pricing</a>
</div>
<div class="platform-pricing-card">
<h3>Bundle & Save</h3>
<p>Use multiple platforms together</p>
<div class="price-range">Save up to 20%</div>
<ul>
<li>Seamless integration</li>
<li>Unified dashboard</li>
<li>Single invoice</li>
<li>Priority support</li>
</ul>
<a href="/contact" class="btn">Contact Sales</a>
</div>
</div>
</div>""",
"meta_description": "Wizamart pricing for OMS, Loyalty+, and bundled solutions. Plans starting at €49/month.",
"show_in_header": True,
"show_in_footer": True,
"display_order": 2,
},
{
"slug": "faq",
"title": "FAQ - Frequently Asked Questions",
"content": """<div class="faq-page">
<h1>Frequently Asked Questions</h1>
<div class="faq-section">
<h2>General</h2>
<div class="faq-item">
<h3>What is Wizamart?</h3>
<p>Wizamart is a suite of business tools for Luxembourg merchants, including order management (OMS), customer loyalty (Loyalty+), and website building (Site Builder).</p>
</div>
<div class="faq-item">
<h3>Do I need to use all platforms?</h3>
<p>No! Each platform works independently. Use one, two, or all three - whatever fits your business needs.</p>
</div>
<div class="faq-item">
<h3>What languages are supported?</h3>
<p>All platforms support French, German, and English - the three main languages of Luxembourg.</p>
</div>
</div>
<div class="faq-section">
<h2>Billing & Pricing</h2>
<div class="faq-item">
<h3>Is there a free trial?</h3>
<p>Yes! All platforms offer a 14-day free trial with no credit card required.</p>
</div>
<div class="faq-item">
<h3>What payment methods do you accept?</h3>
<p>We accept credit cards, SEPA direct debit, and bank transfers.</p>
</div>
<div class="faq-item">
<h3>Can I cancel anytime?</h3>
<p>Yes, you can cancel your subscription at any time. No long-term contracts required.</p>
</div>
</div>
<div class="faq-section">
<h2>Support</h2>
<div class="faq-item">
<h3>How do I get help?</h3>
<p>All plans include email support. Professional and Business plans include priority support with faster response times.</p>
</div>
<div class="faq-item">
<h3>Do you offer onboarding?</h3>
<p>Yes! We offer guided onboarding for all new customers to help you get started quickly.</p>
</div>
</div>
</div>""",
"meta_description": "Frequently asked questions about Wizamart platforms, pricing, billing, and support.",
"show_in_header": True,
"show_in_footer": True,
"display_order": 3,
},
{
"slug": "contact",
"title": "Contact Us - Wizamart",
"content": """<div class="contact-page">
<h1>Contact Us</h1>
<p class="lead">We'd love to hear from you. Get in touch with our team.</p>
<div class="contact-options">
<div class="contact-card">
<h3>Sales</h3>
<p>Interested in our platforms? Let's talk about how we can help your business.</p>
<p><a href="mailto:sales@wizamart.lu">sales@wizamart.lu</a></p>
</div>
<div class="contact-card">
<h3>Support</h3>
<p>Already a customer? Our support team is here to help.</p>
<p><a href="mailto:support@wizamart.lu">support@wizamart.lu</a></p>
</div>
<div class="contact-card">
<h3>General Inquiries</h3>
<p>For everything else, reach out to our general inbox.</p>
<p><a href="mailto:hello@wizamart.lu">hello@wizamart.lu</a></p>
</div>
</div>
<div class="address">
<h3>Office</h3>
<p>Wizamart S.à r.l.<br>
Luxembourg City<br>
Luxembourg</p>
</div>
</div>""",
"meta_description": "Contact Wizamart for sales, support, or general inquiries. We're here to help your Luxembourg business succeed.",
"show_in_header": True,
"show_in_footer": True,
"display_order": 4,
},
{
"slug": "terms",
"title": "Terms of Service - Wizamart",
"content": """<div class="terms-page">
<h1>Terms of Service</h1>
<p class="last-updated">Last updated: January 2026</p>
<p>These Terms of Service govern your use of Wizamart platforms and services.</p>
<h2>1. Acceptance of Terms</h2>
<p>By accessing or using our services, you agree to be bound by these Terms.</p>
<h2>2. Services</h2>
<p>Wizamart provides e-commerce and business management tools including order management, loyalty programs, and website building services.</p>
<h2>3. Account Registration</h2>
<p>You must provide accurate information when creating an account and keep your login credentials secure.</p>
<h2>4. Fees and Payment</h2>
<p>Subscription fees are billed in advance on a monthly or annual basis. Prices are listed in EUR and include applicable VAT for Luxembourg customers.</p>
<h2>5. Data Protection</h2>
<p>We process personal data in accordance with our Privacy Policy and applicable data protection laws including GDPR.</p>
<h2>6. Limitation of Liability</h2>
<p>Our liability is limited to the amount paid for services in the 12 months preceding any claim.</p>
<h2>7. Governing Law</h2>
<p>These Terms are governed by Luxembourg law. Disputes shall be resolved in Luxembourg courts.</p>
<h2>8. Contact</h2>
<p>For questions about these Terms, contact us at legal@wizamart.lu</p>
</div>""",
"meta_description": "Wizamart Terms of Service. Read the terms and conditions for using our e-commerce and business platforms.",
"show_in_header": False,
"show_in_footer": True,
"show_in_legal": True,
"display_order": 10,
},
{
"slug": "privacy",
"title": "Privacy Policy - Wizamart",
"content": """<div class="privacy-page">
<h1>Privacy Policy</h1>
<p class="last-updated">Last updated: January 2026</p>
<h2>Introduction</h2>
<p>Wizamart S.à r.l. ("we", "us") is committed to protecting your privacy. This policy explains how we collect, use, and protect your personal data.</p>
<h2>Data Controller</h2>
<p>Wizamart S.à r.l.<br>Luxembourg City, Luxembourg<br>Email: privacy@wizamart.lu</p>
<h2>Data We Collect</h2>
<ul>
<li>Account information (name, email, company details)</li>
<li>Usage data (how you use our platforms)</li>
<li>Payment information (processed by our payment providers)</li>
<li>Support communications</li>
</ul>
<h2>How We Use Your Data</h2>
<ul>
<li>To provide and improve our services</li>
<li>To process payments and billing</li>
<li>To communicate with you about your account</li>
<li>To send marketing communications (with your consent)</li>
</ul>
<h2>Your Rights</h2>
<p>Under GDPR, you have the right to:</p>
<ul>
<li>Access your personal data</li>
<li>Rectify inaccurate data</li>
<li>Request deletion of your data</li>
<li>Data portability</li>
<li>Object to processing</li>
</ul>
<h2>Contact</h2>
<p>To exercise your rights or ask questions, contact our Data Protection Officer at privacy@wizamart.lu</p>
</div>""",
"meta_description": "Wizamart Privacy Policy. Learn how we collect, use, and protect your personal data in compliance with GDPR.",
"show_in_header": False,
"show_in_footer": True,
"show_in_legal": True,
"display_order": 11,
},
]
for page in platform_pages:
show_in_legal = page.get("show_in_legal", False)
conn.execute(
sa.text("""
INSERT INTO content_pages (platform_id, vendor_id, slug, title, content, content_format,
meta_description, is_published, is_platform_page,
show_in_header, show_in_footer, show_in_legal, display_order,
created_at, updated_at)
VALUES (:platform_id, NULL, :slug, :title, :content, 'html',
:meta_description, true, true,
:show_in_header, :show_in_footer, :show_in_legal, :display_order,
CURRENT_TIMESTAMP, CURRENT_TIMESTAMP)
"""),
{
"platform_id": main_platform_id,
"slug": page["slug"],
"title": page["title"],
"content": page["content"],
"meta_description": page["meta_description"],
"show_in_header": page["show_in_header"],
"show_in_footer": page["show_in_footer"],
"show_in_legal": show_in_legal,
"display_order": page["display_order"],
}
)
def downgrade() -> None:
conn = op.get_bind()
# Get the Main platform ID
result = conn.execute(sa.text("SELECT id FROM platforms WHERE code = 'main'"))
row = result.fetchone()
if row:
main_platform_id = row[0]
# Delete all content pages for main platform
conn.execute(
sa.text("DELETE FROM content_pages WHERE platform_id = :platform_id"),
{"platform_id": main_platform_id}
)
# Delete vendor_platforms entries for main (if any)
conn.execute(
sa.text("DELETE FROM vendor_platforms WHERE platform_id = :platform_id"),
{"platform_id": main_platform_id}
)
# Delete main platform
conn.execute(sa.text("DELETE FROM platforms WHERE code = 'main'"))