feat(storage): add S3 image storage support with file-based config and migration script
This commit is contained in:
@@ -108,7 +108,7 @@ new Chart(document.getElementById('chart-received'), {
|
||||
<a href="/postcards/{{ pc.id }}" class="recent-item">
|
||||
<div class="recent-img">
|
||||
{% if pc.image_front %}
|
||||
<img src="{{ pc.image_front }}" alt="" loading="lazy">
|
||||
<img src="{{ pc.image_front|image_url }}" alt="" loading="lazy">
|
||||
{% else %}
|
||||
<span>📷</span>
|
||||
{% endif %}
|
||||
|
||||
@@ -33,8 +33,8 @@
|
||||
{% if visible|length > 0 or has_more %}
|
||||
<div class="showcase-grid" id="showcase-grid">
|
||||
{% for pc in visible %}
|
||||
<div class="showcase-card" data-front="{{ pc.image_front }}" onclick="openLightbox(this)">
|
||||
<img src="{{ pc.image_front }}" alt="" class="showcase-card-img" loading="lazy">
|
||||
<div class="showcase-card" data-front="{{ pc.image_front|image_url }}" onclick="openLightbox(this)">
|
||||
<img src="{{ pc.image_front|image_url }}" alt="" class="showcase-card-img" loading="lazy">
|
||||
<div class="showcase-card-body">
|
||||
<div class="showcase-card-meta">
|
||||
{% if pc.country_from and pc.country_to %}<span>{{ pc.country_from|flag }} {{ pc.country_from }} → {{ pc.country_to|flag }} {{ pc.country_to }}</span>
|
||||
|
||||
@@ -28,7 +28,7 @@
|
||||
<div class="image-block">
|
||||
<h3>{{ 'pc_detail.front'|t(user.language) }}</h3>
|
||||
{% if postcard.image_front %}
|
||||
<img src="{{ postcard.image_front }}" alt="" class="detail-img">
|
||||
<img src="{{ postcard.image_front|image_url }}" alt="" class="detail-img">
|
||||
{% else %}
|
||||
<div class="detail-img placeholder">{{ 'pc_detail.no_front'|t(user.language) }}</div>
|
||||
{% endif %}
|
||||
@@ -40,7 +40,7 @@
|
||||
<div class="image-block">
|
||||
<h3>{{ 'pc_detail.back'|t(user.language) }}</h3>
|
||||
{% if postcard.image_back %}
|
||||
<img src="{{ postcard.image_back }}" alt="" class="detail-img">
|
||||
<img src="{{ postcard.image_back|image_url }}" alt="" class="detail-img">
|
||||
{% else %}
|
||||
<div class="detail-img placeholder">{{ 'pc_detail.no_back'|t(user.language) }}</div>
|
||||
{% endif %}
|
||||
|
||||
@@ -36,7 +36,7 @@
|
||||
<a href="/postcards/{{ pc.id }}" class="postcard-row">
|
||||
<div class="postcard-row-img">
|
||||
{% if pc.image_front %}
|
||||
<img src="{{ pc.image_front }}" alt="" loading="lazy">
|
||||
<img src="{{ pc.image_front|image_url }}" alt="" loading="lazy">
|
||||
{% else %}
|
||||
<div class="thumb placeholder">📷</div>
|
||||
{% endif %}
|
||||
@@ -78,7 +78,7 @@
|
||||
<a href="/postcards/{{ pc.id }}" class="postcard-row">
|
||||
<div class="postcard-row-img">
|
||||
{% if pc.image_front %}
|
||||
<img src="{{ pc.image_front }}" alt="" loading="lazy">
|
||||
<img src="{{ pc.image_front|image_url }}" alt="" loading="lazy">
|
||||
{% else %}
|
||||
<div class="thumb placeholder">📷</div>
|
||||
{% endif %}
|
||||
|
||||
@@ -45,8 +45,8 @@
|
||||
{% if mode == 'flat' %}
|
||||
<div class="showcase-grid" id="grid-sent">
|
||||
{% for pc in sent_visible %}
|
||||
<div class="showcase-card" data-front="{{ pc.image_front }}" onclick="openLightbox(this)">
|
||||
<img src="{{ pc.image_front }}" alt="" class="showcase-card-img" loading="lazy">
|
||||
<div class="showcase-card" data-front="{{ pc.image_front|image_url }}" onclick="openLightbox(this)">
|
||||
<img src="{{ pc.image_front|image_url }}" alt="" class="showcase-card-img" loading="lazy">
|
||||
<div class="showcase-card-body">
|
||||
<div class="showcase-card-meta">
|
||||
{% if pc.country_from and pc.country_to %}<span>{{ pc.country_from|flag }} {{ pc.country_from }} → {{ pc.country_to|flag }} {{ pc.country_to }}</span>
|
||||
@@ -70,8 +70,8 @@
|
||||
<h3 style="margin:1rem 0 .75rem;font-size:.95rem;color:var(--text-muted)">{{ g.profile.nickname }}</h3>
|
||||
<div class="showcase-grid">
|
||||
{% for pc in g_sent %}
|
||||
<div class="showcase-card" data-front="{{ pc.image_front }}" onclick="openLightbox(this)">
|
||||
<img src="{{ pc.image_front }}" alt="" class="showcase-card-img" loading="lazy">
|
||||
<div class="showcase-card" data-front="{{ pc.image_front|image_url }}" onclick="openLightbox(this)">
|
||||
<img src="{{ pc.image_front|image_url }}" alt="" class="showcase-card-img" loading="lazy">
|
||||
<div class="showcase-card-body">
|
||||
<div class="showcase-card-meta">
|
||||
{% if pc.country_from and pc.country_to %}<span>{{ pc.country_from|flag }} {{ pc.country_from }} → {{ pc.country_to|flag }} {{ pc.country_to }}</span>
|
||||
@@ -96,8 +96,8 @@
|
||||
{% if mode == 'flat' %}
|
||||
<div class="showcase-grid" id="grid-received">
|
||||
{% for pc in received_visible %}
|
||||
<div class="showcase-card" data-front="{{ pc.image_front }}" onclick="openLightbox(this)">
|
||||
<img src="{{ pc.image_front }}" alt="" class="showcase-card-img" loading="lazy">
|
||||
<div class="showcase-card" data-front="{{ pc.image_front|image_url }}" onclick="openLightbox(this)">
|
||||
<img src="{{ pc.image_front|image_url }}" alt="" class="showcase-card-img" loading="lazy">
|
||||
<div class="showcase-card-body">
|
||||
<div class="showcase-card-meta">
|
||||
{% if pc.country_from and pc.country_to %}<span>{{ pc.country_from|flag }} {{ pc.country_from }} → {{ pc.country_to|flag }} {{ pc.country_to }}</span>
|
||||
@@ -121,8 +121,8 @@
|
||||
<h3 style="margin:1rem 0 .75rem;font-size:.95rem;color:var(--text-muted)">{{ g.profile.nickname }}</h3>
|
||||
<div class="showcase-grid">
|
||||
{% for pc in g_received %}
|
||||
<div class="showcase-card" data-front="{{ pc.image_front }}" onclick="openLightbox(this)">
|
||||
<img src="{{ pc.image_front }}" alt="" class="showcase-card-img" loading="lazy">
|
||||
<div class="showcase-card" data-front="{{ pc.image_front|image_url }}" onclick="openLightbox(this)">
|
||||
<img src="{{ pc.image_front|image_url }}" alt="" class="showcase-card-img" loading="lazy">
|
||||
<div class="showcase-card-body">
|
||||
<div class="showcase-card-meta">
|
||||
{% if pc.country_from and pc.country_to %}<span>{{ pc.country_from|flag }} {{ pc.country_from }} → {{ pc.country_to|flag }} {{ pc.country_to }}</span>
|
||||
|
||||
Reference in New Issue
Block a user