Upload file codes, upload region.

This commit is contained in:
msinkec 2021-12-20 11:15:01 +01:00
parent a72c5f03cf
commit 9e93d41bc3
5 changed files with 122 additions and 36 deletions

View File

@ -0,0 +1,30 @@
"""Added upload file codes column.
Revision ID: c7bb822adf9f
Revises: 0d9dd68fd94b
Create Date: 2021-12-20 09:00:57.208921
"""
from alembic import op
import sqlalchemy as sa
# revision identifiers, used by Alembic.
revision = 'c7bb822adf9f'
down_revision = '0d9dd68fd94b'
branch_labels = None
depends_on = None
def upgrade():
# ### commands auto generated by Alembic - please adjust! ###
op.add_column('upload_solar', sa.Column('region', sa.String(), nullable=True))
op.add_column('upload_solar', sa.Column('upload_file_codes', 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_codes')
op.drop_column('upload_solar', 'region')
# ### end Alembic commands ###

View File

@ -19,6 +19,7 @@ class UploadSolar(db.Model):
institution = db.Column(db.Integer, sqlalchemy.ForeignKey('institution.id'), nullable=True) institution = db.Column(db.Integer, sqlalchemy.ForeignKey('institution.id'), nullable=True)
upload_hash = db.Column(db.String, nullable=False) upload_hash = db.Column(db.String, nullable=False)
timestamp = db.Column(db.DateTime, default=datetime.utcnow, nullable=False) timestamp = db.Column(db.DateTime, default=datetime.utcnow, nullable=False)
region = db.Column(db.String, nullable=True)
program = db.Column(db.String, nullable=True) program = db.Column(db.String, nullable=True)
subject = db.Column(db.String, nullable=True) subject = db.Column(db.String, nullable=True)
subject_custom = db.Column(db.String, nullable=True) subject_custom = db.Column(db.String, nullable=True)
@ -29,6 +30,7 @@ class UploadSolar(db.Model):
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) upload_file_names = db.Column(sqlalchemy.types.ARRAY(db.String), nullable=True)
upload_file_codes = db.Column(sqlalchemy.types.ARRAY(db.String), nullable=True)
class ContractsSolar(db.Model): class ContractsSolar(db.Model):

View File

@ -6,15 +6,10 @@ import traceback
import ssl import ssl
from datetime import datetime from datetime import datetime
from sqlalchemy import desc from sqlalchemy import desc
from collections import Counter
from pathlib import Path from pathlib import Path
import imaplib
from smtplib import SMTP_SSL from smtplib import SMTP_SSL
import email
from email import encoders
from email.mime.base import MIMEBase
from email.mime.multipart import MIMEMultipart from email.mime.multipart import MIMEMultipart
from email.mime.text import MIMEText from email.mime.text import MIMEText
from email.mime.application import MIMEApplication from email.mime.application import MIMEApplication
@ -30,9 +25,9 @@ from . model import *
VALID_PROGRAMS = {'OS', 'SSG', 'MGP', 'ZG', 'NPI', 'SPI', 'SSI', 'PTI'} VALID_PROGRAMS = {'OS', 'SSG', 'MGP', 'ZG', 'NPI', 'SPI', 'SSI', 'PTI'}
VALID_SUBJECTS = {'slo', 'drug-jez', 'drug-druz', 'drug-narav', 'drug-strok', 'drug-izb'} VALID_SUBJECTS = {'SLO', 'DJP', 'DDP', 'DNP', 'DSP', 'DIP'}
VALID_TEXT_TYPES = {'esej-spis', 'prakticno', 'solski-test', 'delo-v-razredu'} VALID_TEXT_TYPES = {'E', 'PB', 'T', 'R'}
VALID_GRAMMAR_CORRECTIONS = {'popr-ne', 'brez-popr', 'popr-da'} VALID_GRAMMAR_CORRECTIONS = {'DD', 'N', 'DN'}
VALID_REGIONS = {'CE', 'GO', 'KK', 'KP', 'KR', 'LJ', 'MB', 'MS', 'NM', 'PO', 'SG'} VALID_REGIONS = {'CE', 'GO', 'KK', 'KP', 'KR', 'LJ', 'MB', 'MS', 'NM', 'PO', 'SG'}
#REGEX_EMAIL = re.compile('^[a-z0-9]+[\._]?[a-z0-9]+[@]\w+[.]\w{2,3}$') #REGEX_EMAIL = re.compile('^[a-z0-9]+[\._]?[a-z0-9]+[@]\w+[.]\w{2,3}$')
@ -157,12 +152,8 @@ class UploadHandlerSolar():
institution_id = get_user_institution(user_id).id institution_id = get_user_institution(user_id).id
model_obj = UploadSolar( region = form_data['regija']
upload_user = user_id, program = form_data['program']
institution = institution_id,
upload_hash=upload_metadata['upload_id'],
timestamp=timestamp,
program=form_data['program'],
subject = form_data['predmet'], subject = form_data['predmet'],
subject_custom = form_data['predmet-custom'], subject_custom = form_data['predmet-custom'],
grade = form_data['letnik'], grade = form_data['letnik'],
@ -170,8 +161,36 @@ 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_codes = []
for i in range(len(sorted_file_items)):
file_code = '{}_{}_{}_{}_{}_{}_{}_{}'.format(
region[0],
program[0],
subject[0],
grade[0],
text_type[0],
school_year[0],
grammar_corrections[0],
i)
upload_file_codes.append(file_code)
model_obj = UploadSolar(
upload_user = user_id,
institution = institution_id,
upload_hash=upload_metadata['upload_id'],
timestamp=timestamp,
region=region,
program=program,
subject=subject,
subject_custom=subject_custom,
grade=grade,
text_type=text_type,
text_type_custom=text_type_custom,
school_year=school_year,
grammar_corrections=grammar_corrections,
upload_file_hashes=[x[1] for x in sorted_file_items], upload_file_hashes=[x[1] for x in sorted_file_items],
upload_file_names=[x[0] for x in sorted_file_items], upload_file_names=[x[0] for x in sorted_file_items],
upload_file_codes=upload_file_codes,
) )
UploadHandlerSolar.store_model(model_obj) UploadHandlerSolar.store_model(model_obj)
@ -281,6 +300,8 @@ class UploadHandlerSolar():
@staticmethod @staticmethod
def check_form(form): def check_form(form):
logging.info(form)
region = form['regija']
program = form['program'] program = form['program']
predmet = form['predmet'] predmet = form['predmet']
letnik = int(form['letnik']) letnik = int(form['letnik'])
@ -288,6 +309,8 @@ class UploadHandlerSolar():
solsko_leto = form['solsko-leto'] solsko_leto = form['solsko-leto']
jezikovni_popravki = form['jezikovni-popravki'] jezikovni_popravki = form['jezikovni-popravki']
if region not in VALID_REGIONS:
return 'Invalid region "{}"'.format(region)
if program not in VALID_PROGRAMS: if program not in VALID_PROGRAMS:
return 'Invalid program "{}"'.format(program) return 'Invalid program "{}"'.format(program)
if predmet not in VALID_SUBJECTS: if predmet not in VALID_SUBJECTS:
@ -444,8 +467,9 @@ def get_all_active_users():
res.append(user) res.append(user)
return res return res
def update_upload_item(item_id, program, subject, subject_custom, grade, text_type, text_type_custom, school_year, grammar_corrections): def update_upload_item(item_id, region, program, subject, subject_custom, grade, text_type, text_type_custom, school_year, grammar_corrections):
rowcount = db.session.query(UploadSolar).filter_by(id=item_id).update({ rowcount = db.session.query(UploadSolar).filter_by(id=item_id).update({
'region': region,
'program': program, 'program': program,
'subject': subject, 'subject': subject,
'subject_custom': subject_custom, 'subject_custom': subject_custom,
@ -819,3 +843,4 @@ def send_user_activation_mail(user_id, config):
except Exception: except Exception:
traceback.print_exc() traceback.print_exc()

View File

@ -68,7 +68,30 @@
<div class="row"> <div class="row">
<div class="col-6"> <div class="col-6">
<div class="form-wrapper"> <div class="form-wrapper">
<label>Program</label> <label for="regija">Regija</label>
<select id="regija" name="regija">
<option value="CE" selected="selected">Celje (CE)</option>
<option value="GO">Nova Gorica (GO)</option>
<option value="KK">Krško (KK)</option>
<option value="KP">Koper (KP)</option>
<option value="KR">Kranj (KR)</option>
<option value="LJ">Ljubljana (LJ)</option>
<option value="MB">Maribor (MB)</option>
<option value="MS">Murska Sobota (MS)</option>
<option value="NM">Novo Mesto (NM)</option>
<option value="PO">Postojna (PO)</option>
<option value="SG">Slovenj Gradec (SG)</option>
</select>
</div>
</div>
<div class="col-6">
<p></p>
</div>
</div>
<div class="row">
<div class="col-6">
<div class="form-wrapper">
<label for="program">Program</label>
<select id="program" name="program"> <select id="program" name="program">
<option value="OS" selected="selected">Osnovnošolski (OŠ)</option> <option value="OS" selected="selected">Osnovnošolski (OŠ)</option>
<option value="SSG">Splošna in strokovna gimnazija (SGG)</option> <option value="SSG">Splošna in strokovna gimnazija (SGG)</option>
@ -77,7 +100,7 @@
<option value="NPI">Nižje poklicno izobraževanje (NPI)</option> <option value="NPI">Nižje poklicno izobraževanje (NPI)</option>
<option value="SPI">Srednje poklicno izobraževanje (SPI)</option> <option value="SPI">Srednje poklicno izobraževanje (SPI)</option>
<option value="SSI">Srednje strokovno izobraževanje (SSI)</option> <option value="SSI">Srednje strokovno izobraževanje (SSI)</option>
<option value="PTI">Poklicno-tehnično izobraževanje (PTI)</option> <option value="PTI">Poklicno-tehniško izobraževanje (PTI)</option>
</select> </select>
</div> </div>
</div> </div>
@ -90,12 +113,12 @@
<div class="form-wrapper"> <div class="form-wrapper">
<label for="predmet">Predmet</label> <label for="predmet">Predmet</label>
<select id="predmet" name="predmet"> <select id="predmet" name="predmet">
<option value="slo" selected="selected">Slovenščina</option> <option value="SLO" selected="selected">Slovenščina (SLO)</option>
<option value="drug-jez">Drugi jezikoslovni predmeti</option> <option value="DJP">Drugi jezikoslovni predmeti (vtipkajte ime predmeta) (DJP)</option>
<option value="drug-druz">Drugi družboslovni predmeti</option> <option value="DDP">Drugi družboslovni predmeti (vtipkajte ime predmeta) (DDP)</option>
<option value="drug-narav">Drugi naravoslovni predmeti</option> <option value="DNP">Drugi naravoslovni predmeti (vtipkajte ime predmeta) (DNP)</option>
<option value="drug-strok">Drugi strokovni predmeti</option> <option value="DSP">Drugi strokovni predmeti (vtipkajte ime predmeta) (DSP)</option>
<option value="drug-izb">Drugi izbirni ali dodatni predmeti</option> <option value="DIP">Drugi izbirni ali dodatni predmeti (vtipkajte ime predmeta) (DIP)</option>
</select> </select>
</div> </div>
</div> </div>
@ -143,10 +166,10 @@
<div class="form-wrapper" > <div class="form-wrapper" >
<label for="vrsta">Vrsta besedila</label> <label for="vrsta">Vrsta besedila</label>
<select id="vrsta" name="vrsta"> <select id="vrsta" name="vrsta">
<option value="esej-spis" selected="selected">Esej ali spis</option> <option value="E" selected="selected">Esej ali spis (E)</option>
<option value="prakticno">Praktično besedilo (npr. vabila, prošnje ipd. pri pouku slovenščine), napisano za oceno</option> <option value="PB">Praktično besedilo (npr. vabila, prošnje ipd. pri pouku slovenščine), napisano za oceno (PB)</option>
<option value="solski-test">Šolski test</option> <option value="T">Šolski test (T)</option>
<option value="delo-v-razredu">Delo v razredu, ne za oceno</option> <option value="R">Delo v razredu, ne za oceno (vtipkajte besedilo vrsto) (R)</option>
</select> </select>
</div> </div>
</div> </div>
@ -187,9 +210,9 @@
<div class="form-wrapper"> <div class="form-wrapper">
<label for="jezikovni-popravki">Jezikovni popravki</label> <label for="jezikovni-popravki">Jezikovni popravki</label>
<select id="jezikovni-popravki" name="jezikovni-popravki"> <select id="jezikovni-popravki" name="jezikovni-popravki">
<option value="popr-ne" selected="selected">Besedilo vsebuje učiteljske popravke in strinjam se z njihovo vključitvijo v korpus</option> <option value="DD" selected="selected">Besedilo vsebuje učiteljske popravke in strinjam se z njihovo vključitvijo v korpus. (DD)</option>
<option value="brez-popr">Besedilo ne vsebuje učiteljskih popravkov</option> <option value="N">Besedilo ne vsebuje učiteljskih popravkov. (N)</option>
<option value="popr-da">Besedilo vsebuje učiteljske popravke in ne strinjam se z njihovo vključitvijo v korpus</option> <option value="DN">Besedilo vsebuje učiteljske popravke in ne strinjam se z njihovo vključitvijo v korpus. (DN)</option>
</select> </select>
</div> </div>
</div> </div>
@ -295,7 +318,7 @@
//onready //onready
selectPredmet.addEventListener("change", function(e) { selectPredmet.addEventListener("change", function(e) {
var predmetCustomBox = document.getElementById("predmet-custom-box").closest('.row'); var predmetCustomBox = document.getElementById("predmet-custom-box").closest('.row');
if (selectPredmet.value.startsWith("drug")) { if (selectPredmet.value.startsWith("D")) {
predmetCustomBox.style.maxHeight = "150px"; predmetCustomBox.style.maxHeight = "150px";
} else { } else {
predmetCustomBox.style.maxHeight = "0px"; predmetCustomBox.style.maxHeight = "0px";
@ -304,7 +327,7 @@
selectVrsta.addEventListener("change", function(e) { selectVrsta.addEventListener("change", function(e) {
var vrstaCustomBox = document.getElementById("vrsta-custom-box").closest('.row'); var vrstaCustomBox = document.getElementById("vrsta-custom-box").closest('.row');
if (selectVrsta.value == "delo-v-razredu") { if (selectVrsta.value == "R") {
vrstaCustomBox.style.maxHeight = "150px"; vrstaCustomBox.style.maxHeight = "150px";
} else { } else {
vrstaCustomBox.style.maxHeight = "0px"; vrstaCustomBox.style.maxHeight = "0px";
@ -351,6 +374,7 @@
e.stopPropagation(); e.stopPropagation();
// Check form validity. // Check form validity.
var regija = form["regija"].value;
var program = form["program"].value; var program = form["program"].value;
var predmet = form["predmet"].value; var predmet = form["predmet"].value;
var predmetCustom = form["predmet-custom"].value; var predmetCustom = form["predmet-custom"].value;
@ -360,9 +384,9 @@
var solskoLeto = form["solsko-leto"].value; var solskoLeto = form["solsko-leto"].value;
var jezikovniPopravki = form["jezikovni-popravki"].value; var jezikovniPopravki = form["jezikovni-popravki"].value;
if (predmet.startsWith("drug") && isEmptyOrSpaces(predmetCustom)) { if (predmet.startsWith("D") && isEmptyOrSpaces(predmetCustom)) {
showError("Polje za predmet ne more biti prazno!"); showError("Polje za predmet ne more biti prazno!");
} else if (vrsta === "delo-v-razredu" && isEmptyOrSpaces(vrstaCustom)) { } else if (vrsta === "R" && isEmptyOrSpaces(vrstaCustom)) {
showError("Polje za vrsto besedila ne more biti prazno!"); showError("Polje za vrsto besedila ne more biti prazno!");
} else if (dataConfirmNotification.style.display == "none") { } else if (dataConfirmNotification.style.display == "none") {
dataConfirmNotification.style.display = "inherit"; dataConfirmNotification.style.display = "inherit";
@ -409,6 +433,7 @@
this.on("sending", function(file, xhr, formData) { this.on("sending", function(file, xhr, formData) {
formData.append("regija",form["regija"].value);
formData.append("program",form["program"].value); formData.append("program",form["program"].value);
formData.append("predmet",form["predmet"].value); formData.append("predmet",form["predmet"].value);
formData.append("predmet-custom",form["predmet-custom"].value); formData.append("predmet-custom",form["predmet-custom"].value);

View File

@ -130,6 +130,10 @@
<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>
<a href="getuploadfile/{{item.id}}/{{item.upload_file_hashes[loop.index - 1]}}" class="file-name">{{f_name}}</a> <a href="getuploadfile/{{item.id}}/{{item.upload_file_hashes[loop.index - 1]}}" class="file-name">{{f_name}}</a>
</br>
{% if item.upload_file_codes != None %}
<div>{{item.upload_file_codes[loop.index - 1]}}</div>
{% endif %}
</div> </div>
{% endfor %} {% endfor %}
{% else %} {% else %}