roundabout,
created on Wednesday, 14 August 2024, 16:44:18 (1723653858),
received on Thursday, 15 August 2024, 07:42:21 (1723707741)
Author identity: vlad <vlad.muntoiu@gmail.com>
46b698a6f20e1386e39661df4e7552d1fdef093c
app.py
@@ -10,6 +10,7 @@ from flask_migrate import Migrate
from jinja2_fragments.flask import render_block
from sqlalchemy.orm import backref
import sqlalchemy.dialects.postgresql
from os import path
import config
import markdown
@@ -61,8 +62,10 @@ with app.app_context():
class PictureLicence(db.Model):
resource_id = db.Column(db.Integer, db.ForeignKey("picture_resource.id"), primary_key=True)
licence_id = db.Column(db.String(32), db.ForeignKey("licence.id"), primary_key=True)
id = db.Column(db.Integer, primary_key=True, autoincrement=True)
resource_id = db.Column(db.Integer, db.ForeignKey("picture_resource.id"))
licence_id = db.Column(db.String(32), db.ForeignKey("licence.id"))
resource = db.relationship("PictureResource", back_populates="licences")
licence = db.relationship("Licence", back_populates="pictures")
@@ -151,7 +154,7 @@ with app.app_context():
file_format = db.Column(db.String(64), nullable=False) # MIME type
width = db.Column(db.Integer, nullable=False)
height = db.Column(db.Integer, nullable=False)
nature_id = db.Column(db.String(32), db.ForeignKey("picture_nature.id"), nullable=False)
nature_id = db.Column(db.String(32), db.ForeignKey("picture_nature.id"), nullable=True)
nature = db.relationship("PictureNature", back_populates="resources")
@@ -166,13 +169,13 @@ with app.app_context():
licences = db.relationship("PictureLicence", back_populates="resource")
def __init__(self, title, description, origin_url, licence_ids, mime, size, nature,
def __init__(self, title, description, origin_url, licence_ids, mime, nature=None,
replaces=None):
self.title = title
self.description = description
self.origin_url = origin_url
self.file_format = mime
self.width, self.height = size
self.width = self.height = 0
self.nature = nature
db.session.add(self)
db.session.commit()
@@ -269,3 +272,49 @@ def profile(username):
return flask.abort(404)
return flask.render_template("profile.html", user=user)
@app.route("/upload")
def upload():
return flask.render_template("upload.html")
@app.route("/upload", methods=["POST"])
def upload_post():
title = flask.request.form["title"]
description = flask.request.form["description"]
origin_url = flask.request.form["origin_url"]
file = flask.request.files["file"]
if not file or not file.filename:
flask.flash("No selected file")
return flask.redirect(flask.request.url)
resource = PictureResource(title, description, origin_url, ["CC0-1.0"], file.mimetype)
db.session.add(resource)
db.session.commit()
file.save(path.join(config.DATA_PATH, "pictures", str(resource.id)))
return flask.redirect("/picture/" + str(resource.id))
@app.route("/picture/<int:id>")
def picture(id):
resource = db.session.get(PictureResource, id)
if resource is None:
return flask.abort(404)
return flask.render_template("picture.html", resource=resource)
@app.route("/raw/picture/<int:id>")
def raw_picture(id):
resource = db.session.get(PictureResource, id)
if resource is None:
return flask.abort(404)
response = flask.send_from_directory(path.join(config.DATA_PATH, "pictures"), str(resource.id))
response.mimetype = resource.file_format
return response
templates/picture.html
@@ -0,0 +1,14 @@
{% extends "default.html" %}
{% block title %}Picture | gigadata{% endblock %}
{% block content %}
<x-frame style="--width: 768px">
<h1>{{ resource.title }}</h1>
<p>{{ resource.description }}</p>
<img src="/raw/picture/{{ resource.id }}" alt="{{ resource.title }}">
<p>
<a href="{{ resource.origin_url }}">Original source</a> |
<a href="/raw/picture/{{ resource.id }}">View</a> |
<a href="/raw/picture/{{ resource.id }}" download="GigadataPicture_{{ resource.id }}">Download</a>
</p>
</x-frame>
{% endblock %}
templates/upload.html
@@ -0,0 +1,26 @@
{% extends "default.html" %}
{% block title %}Upload | gigadata{% endblock %}
{% block content %}
<x-frame style="--width: 768px">
<form method="POST" class="vbox" enctype="multipart/form-data">
<h2>Upload</h2>
<label>
Name
<input type="text" name="title" required>
</label>
<label>
Description
<textarea name="description" required></textarea>
</label>
<label>
Origin URL
<input type="url" name="origin_url" required>
</label>
<label>
File
<input type="file" name="file" required>
</label>
<button type="submit">Upload</button>
</form>
</x-frame>
{% endblock %}