Download uploaded files.

This commit is contained in:
msinkec 2021-12-14 15:36:36 +01:00
parent 8fae602660
commit f543beee1b
6 changed files with 75 additions and 8 deletions

30
app.py
View File

@ -272,7 +272,7 @@ def solar(text):
return render_template('solar-zgodovina.html', upload_history=upload_items, uploader_names=uploader_names, return render_template('solar-zgodovina.html', upload_history=upload_items, uploader_names=uploader_names,
institution_names=institution_names, is_admin=is_admin, is_institution_coordinator=current_user_institution_coordinator) institution_names=institution_names, is_admin=is_admin, is_institution_coordinator=current_user_institution_coordinator)
elif text.startswith('pogodbe-institucije/') or text.startswith('pogodbe-ucencistarsi/'): elif text.startswith('pogodbe-institucije/') or text.startswith('pogodbe-ucencistarsi/'):
# Check for ownload contract request. # Check for download contract request.
match = re.match('^pogodbe-(institucije|ucencistarsi)/([a-z0-9_]+\.pdf)$', text) match = re.match('^pogodbe-(institucije|ucencistarsi)/([a-z0-9_]+\.pdf)$', text)
if match: if match:
contract_type = match.group(1) contract_type = match.group(1)
@ -741,5 +741,33 @@ def handle_upload():
return upload_handler_solar.handle_upload(request, current_user.get_id()) return upload_handler_solar.handle_upload(request, current_user.get_id())
@app.route('/getuploadfile/<upload_id>/<file_hash>', methods=['GET'])
@login_required
def get_upload_file(upload_id, file_hash):
is_admin = current_user.role == 'admin'
current_user_institution = portal.solar.get_user_institution(current_user.id)
upload_obj = portal.solar.get_upload_object(upload_id)
if current_user_institution.id != upload_obj.institution:
return '', 404
file_hashes = upload_obj.upload_file_hashes
if file_hash not in upload_obj.upload_file_hashes:
return '', 404
prefix = file_hash[:2]
suffix = file_hash[2:]
safe_path = safe_join(str(upload_handler_solar.get_uploads_subdir('files')), prefix, suffix)
f_name = os.listdir(safe_path)[0]
safe_path = safe_join(safe_path, f_name)
try:
return send_file(safe_path, attachment_filename=f_name, as_attachment=True)
except FileNotFoundError:
return '', 404
if __name__ == '__main__': if __name__ == '__main__':
app.run(debug=True) app.run(debug=True)

View File

@ -10,8 +10,6 @@ MAX_UPLOAD_SIZE=1000000000
MAX_FILES_PER_UPLOAD=30 MAX_FILES_PER_UPLOAD=30
UPLOADS_DIR=./uploads UPLOADS_DIR=./uploads
CONTRACT_CLIENT_CONTACT=Testko Tester CONTRACT_CLIENT_CONTACT=Testko Tester
DESC_PREVODI=<h2 id="subtitle">Prevodi</h2><p>Strojno prevajanje je ena od uporabnih jezikovnih tehnologij, saj omogoča hitro sporazumevanje med ljudmi iz različnih kultur in jezikovnih okolij. Več o razvoju slovenskega strojnega prevajalnika lahko preberete na tej <a href="https://slovenscina.eu/strojno-prevajanje">povezavi</a>. Za kakovosten strojni prevajalnik so ključnega pomena prevodi, iz kateri se algoritmi umetne inteligence naučijo prevajati. S prispevanjem besedil v korpus prevodov boste pomembno prispevali k razvoju slovenskega strojnega prevajalnika med angleščino in slovenščino. Več informacij o prispevanju besedil najdete <a href="https://slovenscina.eu/zbiranje-besedil">tukaj</a>.</p>
DESC_GIGAFIDA=<h2 id="subtitle">Gigafida</h2><p><a href="https://viri.cjvt.si/gigafida/">Gigafida</a> je referenčni korpus pisne slovenščine. Besedila so izbrana in strojno obdelana z namenom, da bi korpus kot vzorec sodobne standardne slovenščine lahko služil za jezikoslovne in druge humanistične raziskave, izdelavo sodobnih slovarjev, slovnic, učnih gradiv in razvoj jezikovnih tehnologij za slovenščino. S prispevanjem besedil v korpus Gigafida pomembno prispevate k razvoju sodobnih jezikovnih tehnologij za slovenski jezik.</p>
MAIL_SUBJECT=RSDO: pogodba za oddana besedila ({upload_id}) MAIL_SUBJECT=RSDO: pogodba za oddana besedila ({upload_id})
MAIL_BODY=Hvala, ker ste prispevali besedila in na ta način pomagali pri razvoju slovenskega jezika v digitalnem okolju. V prilogi vam pošiljamo pogodbo s seznamom naloženih datotek. MAIL_BODY=Hvala, ker ste prispevali besedila in na ta način pomagali pri razvoju slovenskega jezika v digitalnem okolju. V prilogi vam pošiljamo pogodbo s seznamom naloženih datotek.

View File

@ -0,0 +1,28 @@
"""Added upload file names column.
Revision ID: 0d9dd68fd94b
Revises: 44dae32b13af
Create Date: 2021-12-14 10:52:34.326600
"""
from alembic import op
import sqlalchemy as sa
# revision identifiers, used by Alembic.
revision = '0d9dd68fd94b'
down_revision = '44dae32b13af'
branch_labels = None
depends_on = None
def upgrade():
# ### commands auto generated by Alembic - please adjust! ###
op.add_column('upload_solar', sa.Column('upload_file_names', sa.ARRAY(sa.String()), nullable=True))
# ### end Alembic commands ###
def downgrade():
# ### commands auto generated by Alembic - please adjust! ###
op.drop_column('upload_solar', 'upload_file_names')
# ### end Alembic commands ###

View File

@ -28,6 +28,7 @@ class UploadSolar(db.Model):
school_year = db.Column(db.String, nullable=True) school_year = db.Column(db.String, nullable=True)
grammar_corrections = db.Column(db.String, nullable=True) grammar_corrections = db.Column(db.String, nullable=True)
upload_file_hashes = db.Column(sqlalchemy.types.ARRAY(db.String), nullable=True) upload_file_hashes = db.Column(sqlalchemy.types.ARRAY(db.String), nullable=True)
upload_file_names = db.Column(sqlalchemy.types.ARRAY(db.String), nullable=True)
class ContractsSolar(db.Model): class ContractsSolar(db.Model):

View File

@ -153,8 +153,7 @@ class UploadHandlerSolar():
timestamp = datetime.fromtimestamp(upload_metadata['timestamp']) timestamp = datetime.fromtimestamp(upload_metadata['timestamp'])
form_data = upload_metadata['form_data'] form_data = upload_metadata['form_data']
file_hashes = upload_metadata['file_hashes_dict'] file_hashes = upload_metadata['file_hashes_dict']
sorted_f_hashes = list(file_hashes.values()) sorted_file_items = sorted(file_hashes.items(), key=lambda item: item[1])
sorted_f_hashes.sort()
institution_id = get_user_institution(user_id).id institution_id = get_user_institution(user_id).id
@ -171,7 +170,8 @@ class UploadHandlerSolar():
text_type_custom=form_data['vrsta-custom'], text_type_custom=form_data['vrsta-custom'],
school_year=form_data['solsko-leto'], school_year=form_data['solsko-leto'],
grammar_corrections=form_data['jezikovni-popravki'], grammar_corrections=form_data['jezikovni-popravki'],
upload_file_hashes=sorted_f_hashes upload_file_hashes=[x[1] for x in sorted_file_items],
upload_file_names=[x[0] for x in sorted_file_items],
) )
UploadHandlerSolar.store_model(model_obj) UploadHandlerSolar.store_model(model_obj)
@ -392,6 +392,9 @@ def get_upload_history(user_id, n=20):
def get_institution_upload_history(institution_id, n=20): def get_institution_upload_history(institution_id, n=20):
return UploadSolar.query.filter_by(institution=institution_id).order_by(desc(UploadSolar.timestamp)).limit(n).all() return UploadSolar.query.filter_by(institution=institution_id).order_by(desc(UploadSolar.timestamp)).limit(n).all()
def get_upload_object(upload_id):
return UploadSolar.query.filter_by(id=upload_id).first()
def get_all_upload_history(n=20): def get_all_upload_history(n=20):
if n == -1: if n == -1:
return UploadSolar.query.order_by(desc(UploadSolar.timestamp)).all() return UploadSolar.query.order_by(desc(UploadSolar.timestamp)).all()

View File

@ -124,12 +124,21 @@
</div> </div>
<div class="col-6" style="margin:0"> <div class="col-6" style="margin:0">
<div class="history-item-files-full"> <div class="history-item-files-full">
{% for f in item.upload_file_hashes %} {% if item.upload_file_names != None %}
{% for f_name in item.upload_file_names %}
<div class="file-item"> <div class="file-item">
<div class="file-icon"><img src="/static/image/file.svg"/></div> <div class="file-icon"><img src="/static/image/file.svg"/></div>
<div class="file-name">Datoteka 1</div> <a href="getuploadfile/{{item.id}}/{{item.upload_file_hashes[loop.index - 1]}}" class="file-name">{{f_name}}</a>
</div> </div>
{% endfor %} {% endfor %}
{% else %}
{% for f_hash in item.upload_file_hashes %}
<div class="file-item">
<div class="file-icon"><img src="/static/image/file.svg"/></div>
<a href="getuploadfile/{{item.id}}/{{f_hash}}" class="file-name">{{f_hash}}</a>
</div>
{% endfor %}
{% endif %}
</div> </div>
</div> </div>
</div> </div>