]> Untitled Git - web-gallery.git/commitdiff
Serves nested pages in a gallery
authorClifton Palmer <clifton.james.palmer@protonmail.com>
Sat, 28 Oct 2023 13:37:20 +0000 (08:37 -0500)
committerClifton Palmer <clifton.james.palmer@protonmail.com>
Sat, 28 Oct 2023 16:35:56 +0000 (11:35 -0500)
Dockerfile
app/app.py
app/templates/gallery.html
app/templates/page.html [new file with mode: 0644]
app/templates/pages.html [new file with mode: 0644]
docker-compose.yml
nginx.conf [new file with mode: 0644]

index c3e0f8365c2ea40884dac3561df1557ddf60cada..1d580e7abf8ae74e6186c9b135769f5f04c76415 100644 (file)
@@ -13,6 +13,7 @@ WORKDIR /app
 COPY ./requirements.txt /app
 RUN pip install -r requirements.txt
 
 COPY ./requirements.txt /app
 RUN pip install -r requirements.txt
 
-COPY ./app /app
+COPY ./app/app.py    /app
+COPY ./app/templates /app
 
 CMD ["flask", "run"]
 
 CMD ["flask", "run"]
index 86cbf799ee072e87873f4f0a630654b447ca5e59..e6d723a27b2c47652404ad4d9b6d800ad6b9a92b 100644 (file)
@@ -1,8 +1,45 @@
 from flask import Flask, render_template
 from flask import Flask, render_template
+import os
+import re
 
 app = Flask(__name__)
 
 app = Flask(__name__)
+gallery_root = "/app/gallery"
+get_num_regex = re.compile(r'\d+')
 
 @app.route('/')
 def render_gallery():
 
 @app.route('/')
 def render_gallery():
-    items = ['LittleWilly', 'foo', 'bar']
-    return render_template( 'gallery.html', gallery_items=items )
+    gallery_names = []
+    with os.scandir(gallery_root) as galleries:
+        for gallery in galleries:
+            if not gallery.is_file():
+                gallery_names.append(gallery.name)
+    gallery_names.sort()
+    return render_template( 'gallery.html', galleries=gallery_names )
+
+@app.route('/<gallery>')
+def render_pages(gallery=None):
+    page_names = []
+    with os.scandir(gallery_root + "/" + gallery) as pages:
+        for page in pages:
+            if page.is_file() and page.name.endswith('.png') or page.name.endswith('.jpg'):
+                page_names.append(page.name)
+    page_names.sort()
+    return render_template( 'pages.html', gallery=gallery, pages=page_names )
+
+@app.route('/<gallery>/<page>')
+def render_page(gallery=None, page=None):
+    src = '/images/{}/{}'.format( gallery, page )
+
+    page_num = int(get_num_regex.findall(page)[-1])
+    page_num_str = str(page_num).rjust(3, '0')
+    next_page_num_str = str(page_num + 1).rjust(3, '0')
+    prev_page_num_str = str(page_num - 1).rjust(3, '0')
+
+    prev_page_url = '/{}/{}'.format(gallery, page.replace(page_num_str, prev_page_num_str) )
+    next_page_url = '/{}/{}'.format(gallery, page.replace(page_num_str, next_page_num_str) )
+
+    return render_template( 'page.html',
+        gallery=gallery, page=page, page_num=page_num,
+        title=page, src=src, alt=page,
+        prev_page_url=prev_page_url,
+        next_page_url=next_page_url )
index 7f893b176e826491f7a02e81396def4fa1e25eef..375ad57e94b4c0c9bf676003995ee05ef6d90ad0 100644 (file)
@@ -7,8 +7,8 @@
     <h1>Gallery</h1>
 
     <ul id="navigation">
     <h1>Gallery</h1>
 
     <ul id="navigation">
-    {% for item in gallery_items %}
-        <li><a href="{{ item }}">{{ item }}</a></li>
+    {% for gallery in galleries %}
+        <li><a href="{{ gallery }}">{{ gallery }}</a></li>
     {% endfor %}
     </ul>
 </body>
     {% endfor %}
     </ul>
 </body>
diff --git a/app/templates/page.html b/app/templates/page.html
new file mode 100644 (file)
index 0000000..fe075ed
--- /dev/null
@@ -0,0 +1,17 @@
+<!DOCTYPE html>
+<html lang="en">
+<head>
+    <title>{{ title }}</title>
+</head>
+<body style='background-color: black'>
+<center>
+<div style='height: 99vh'>
+<a href="{{ next_page_url }}">
+    <img style='height: 100%; width: 100%; object-fit: contain'
+        src="{{ src }}" alt="{{ alt }}" />
+</a>
+</div>
+<p><a href="/">Home</a> | <a href="/{{ gallery }}">{{ gallery }}</a> | <a href="{{ prev_page_url }}">Prev</a>, <a href="{{ next_page_url }}">Next</a></p>
+</center>
+</body>
+</html>
diff --git a/app/templates/pages.html b/app/templates/pages.html
new file mode 100644 (file)
index 0000000..fe4e751
--- /dev/null
@@ -0,0 +1,15 @@
+<!DOCTYPE html>
+<html lang="en">
+<head>
+    <title>Pages</title>
+</head>
+<body>
+    <h1>Pages</h1>
+
+    <ul id="navigation">
+    {% for page in pages %}
+        <li><a href="{{ gallery }}/{{ page }}">{{ page }}</a></li>
+    {% endfor %}
+    </ul>
+</body>
+</html>
index 8a8677278b1baaa60516adfe26b21bc8ccf077b6..88d1329db236c7c4e33c6b2d08f62e5f58d1ae8c 100644 (file)
@@ -8,6 +8,15 @@ services:
         ports:
         - 5432:5432
     web:
         ports:
         - 5432:5432
     web:
+        image: nginx:1.17
+        volumes:
+        - ./nginx.conf:/etc/nginx/nginx.conf
+        - gallery_data:/data/images
+        ports:
+        - 80:80
+        depends_on:
+        - gallery
+    gallery:
         build: .
         image: cjpalmer/gallery:0.1.0
         volumes:
         build: .
         image: cjpalmer/gallery:0.1.0
         volumes:
@@ -15,8 +24,8 @@ services:
         - ./app:/app
         environment:
             FLASK_DEBUG: 1
         - ./app:/app
         environment:
             FLASK_DEBUG: 1
-        ports:
-        - 80:5000
+        depends_on:
+        - db
 volumes:
     gallery_data:
         driver: local
 volumes:
     gallery_data:
         driver: local
diff --git a/nginx.conf b/nginx.conf
new file mode 100644 (file)
index 0000000..cff3e3b
--- /dev/null
@@ -0,0 +1,17 @@
+worker_processes auto;
+
+events {
+    worker_connections 1024;
+}
+
+http {
+    server {
+        location / {
+            proxy_pass http://gallery:5000;
+        }
+
+        location /images {
+            root /data;
+        }
+    }
+}