From bb7016cb8ef42f4b012da37a34e7aba674d61a74 Mon Sep 17 00:00:00 2001 From: Sudo-JHare Date: Sun, 11 May 2025 20:35:32 +1000 Subject: [PATCH] Add files via upload --- Dockerfile | 2 +- app/forms.py | 10 +++--- app/routes.py | 69 ++++++++++++++++++------------------- app/templates/edit_app.html | 3 +- app/templates/gallery.html | 10 +++++- app/templates/landing.html | 10 +++++- docker-compose.yml | 2 +- 7 files changed, 62 insertions(+), 44 deletions(-) diff --git a/Dockerfile b/Dockerfile index fb09818..c1f7033 100644 --- a/Dockerfile +++ b/Dockerfile @@ -8,4 +8,4 @@ COPY instance/ instance/ COPY config.py . COPY .env . EXPOSE 5009 -CMD ["flask", "run", "--host=0.0.0.0" "--port=5009"] \ No newline at end of file +CMD ["flask", "run", "--host=0.0.0.0", "--port=5009"] \ No newline at end of file diff --git a/app/forms.py b/app/forms.py index b2a4da8..e3f5580 100644 --- a/app/forms.py +++ b/app/forms.py @@ -1,5 +1,5 @@ from flask_wtf import FlaskForm -from flask_wtf.file import FileField, FileAllowed +from flask_wtf.file import FileField, FileAllowed, MultipleFileField from wtforms import StringField, TextAreaField, SubmitField, PasswordField, SelectField, SelectMultipleField, BooleanField from wtforms.validators import DataRequired, Email, Length, EqualTo, Optional, ValidationError import re @@ -9,10 +9,12 @@ from app import db def validate_url_or_path(form, field): if not field.data: return - if field.data.startswith('/app/uploads/'): - path_pattern = r'^/app/uploads/[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}_[\w\-\.]+\.(jpg|png)$' + # Allow upload paths like /uploads/_.jpg|png + if field.data.startswith('/uploads/'): + path_pattern = r'^/uploads/[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}_[\w\-\.]+\.(jpg|png)$' if re.match(path_pattern, field.data, re.I): return + # Allow external URLs url_pattern = r'^(https?:\/\/)?([\w\-]+\.)+[\w\-]+(\/[\w\-\.]*)*\/?(\?[^\s]*)?(#[^\s]*)?$' if not re.match(url_pattern, field.data): raise ValidationError('Invalid URL or file path.') @@ -44,7 +46,7 @@ class FHIRAppForm(FlaskForm): licensing_pricing = SelectField('Licensing & Pricing', coerce=int, validators=[DataRequired()]) os_support = SelectMultipleField('OS Support', coerce=int, validators=[DataRequired()]) app_image_urls = TextAreaField('App Image URLs (one per line)', validators=[Optional(), Length(max=1000)], render_kw={"placeholder": "e.g., https://example.com/image1.png"}) - app_image_uploads = FileField('Upload App Images', validators=[FileAllowed(['jpg', 'png'], 'Images only!')]) + app_image_uploads = MultipleFileField('Upload App Images', validators=[FileAllowed(['jpg', 'png'], 'Images only!')]) submit = SubmitField('Register App') def __init__(self, *args, **kwargs): diff --git a/app/routes.py b/app/routes.py index e975e4a..43b29aa 100644 --- a/app/routes.py +++ b/app/routes.py @@ -154,25 +154,24 @@ def register(): if form.app_image_urls.data: app_images.extend([url.strip() for url in form.app_image_urls.data.splitlines() if url.strip().startswith(('http://', 'https://'))]) if form.app_image_uploads.data: - file = form.app_image_uploads.data - if file and allowed_file(file.filename): - filename = secure_filename(f"{uuid.uuid4()}_{file.filename}") - (my apologies, I did not mean to interrupt you, please go ahead and continue. - save_path = os.path.join(UPLOAD_FOLDER, filename) - logger.debug(f"Attempting to save app image to {save_path}") - try: - file.save(save_path) - if os.path.exists(save_path): - logger.debug(f"Successfully saved app image to {save_path}") - else: - logger.error(f"Failed to save app image to {save_path}") - flash('Failed to save app image.', 'danger') + for file in form.app_image_uploads.data: + if file and allowed_file(file.filename): + filename = secure_filename(f"{uuid.uuid4()}_{file.filename}") + save_path = os.path.join(UPLOAD_FOLDER, filename) + logger.debug(f"Attempting to save app image to {save_path}") + try: + file.save(save_path) + if os.path.exists(save_path): + logger.debug(f"Successfully saved app image to {save_path}") + else: + logger.error(f"Failed to save app image to {save_path}") + flash('Failed to save app image.', 'danger') + return render_template('register.html', form=form) + app_images.append(f"/uploads/{filename}") + except Exception as e: + logger.error(f"Error saving app image to {save_path}: {e}") + flash('Error saving app image.', 'danger') return render_template('register.html', form=form) - app_images.append(f"/uploads/{filename}") - except Exception as e: - logger.error(f"Error saving app image to {save_path}: {e}") - flash('Error saving app image.', 'danger') - return render_template('register.html', form=form) app = FHIRApp( name=form.name.data, @@ -258,24 +257,24 @@ def edit_app(app_id): app_images = [url.strip() for url in form.app_image_urls.data.splitlines() if url.strip()] if form.app_image_uploads.data: - file = form.app_image_uploads.data - if file and allowed_file(file.filename): - filename = secure_filename(f"{uuid.uuid4()}_{file.filename}") - save_path = os.path.join(UPLOAD_FOLDER, filename) - logger.debug(f"Attempting to save updated app image to {save_path}") - try: - file.save(save_path) - if os.path.exists(save_path): - logger.debug(f"Successfully saved updated app image to {save_path}") - else: - logger.error(f"Failed to save updated app image to {save_path}") - flash('Failed to save app image.', 'danger') + for file in form.app_image_uploads.data: + if file and allowed_file(file.filename): + filename = secure_filename(f"{uuid.uuid4()}_{file.filename}") + save_path = os.path.join(UPLOAD_FOLDER, filename) + logger.debug(f"Attempting to save updated app image to {save_path}") + try: + file.save(save_path) + if os.path.exists(save_path): + logger.debug(f"Successfully saved updated app image to {save_path}") + else: + logger.error(f"Failed to save updated app image to {save_path}") + flash('Failed to save app image.', 'danger') + return render_template('edit_app.html', form=form, app=app) + app_images.append(f"/uploads/{filename}") + except Exception as e: + logger.error(f"Error saving updated app image to {save_path}: {e}") + flash('Error saving app image.', 'danger') return render_template('edit_app.html', form=form, app=app) - app_images.append(f"/uploads/{filename}") - except Exception as e: - logger.error(f"Error saving updated app image to {save_path}: {e}") - flash('Error saving app image.', 'danger') - return render_template('edit_app.html', form=form, app=app) app.name = form.name.data app.description = form.description.data diff --git a/app/templates/edit_app.html b/app/templates/edit_app.html index 952029e..0dc0708 100644 --- a/app/templates/edit_app.html +++ b/app/templates/edit_app.html @@ -114,7 +114,8 @@
{{ form.app_image_uploads.label(class="form-label") }} - {{ form.app_image_uploads(class="form-control") }} + {{ form.app_image_uploads(class="form-control", multiple=True) }} + Select multiple images to upload. {% for error in form.app_image_uploads.errors %} {{ error }} {% endfor %} diff --git a/app/templates/gallery.html b/app/templates/gallery.html index 0acea97..f31a2d1 100644 --- a/app/templates/gallery.html +++ b/app/templates/gallery.html @@ -124,7 +124,7 @@
{% if app.logo_url %} - {{ app.name }} logo + {{ app.name }} logo {% else %} No Logo {% endif %} @@ -132,6 +132,14 @@
{{ app.name }}

{{ app.description | truncate(100) }}

By {{ app.developer }}

+
+ {% if app.website %} + Website + {% endif %} + {% if app.launch_url %} + Try App + {% endif %} +
View Details
diff --git a/app/templates/landing.html b/app/templates/landing.html index 5f4fb59..ff1389a 100644 --- a/app/templates/landing.html +++ b/app/templates/landing.html @@ -18,7 +18,7 @@
{% if app.logo_url %} - {{ app.name }} logo + {{ app.name }} logo {% else %} No Logo {% endif %} @@ -26,6 +26,14 @@
{{ app.name }}

{{ app.description | truncate(100) }}

By {{ app.developer }}

+
+ {% if app.website %} + Website + {% endif %} + {% if app.launch_url %} + Try App + {% endif %} +
View Details
diff --git a/docker-compose.yml b/docker-compose.yml index c44d3ac..c1d494d 100644 --- a/docker-compose.yml +++ b/docker-compose.yml @@ -10,4 +10,4 @@ services: environment: - FLASK_APP=app - FLASK_ENV=development - command: ["flask", "run", "--host=0.0.0.0"] \ No newline at end of file + command: ["flask", "run", "--host=0.0.0.0", "--port=5009"] \ No newline at end of file