Compare commits

..

No commits in common. "2023-01-14_2" and "master" have entirely different histories.

74 changed files with 957 additions and 4214 deletions

3
.gitignore vendored
View File

@ -1,7 +1,6 @@
uploads/*
!uploads/.gitkeep
.idea/
portal-ds4-ds1/
# Byte-compiled / optimized / DLL files
__pycache__/

View File

@ -13,5 +13,6 @@ WORKDIR /usr/src/portal-webapp
RUN apt-get update && apt-get -y install wkhtmltopdf && \
rm -rf /var/lib/apt/lists/*
RUN pip3 install --no-cache-dir pdfkit markupsafe==2.0.1 flask==1.1.4 flask-dropzone flask-log-request-id flask-login Flask-SQLAlchemy==2.5.1 alembic flask-migrate==2.7.0 Flask-script psycopg2 gunicorn pdfkit Werkzeug==1.0.1 PyJWT
RUN pip3 install --no-cache-dir pdfkit flask==1.1.4 flask-dropzone flask-log-request-id flask-login Flask-SQLAlchemy alembic flask-migrate==2.7.0 Flask-script psycopg2 gunicorn pdfkit Werkzeug==1.0.1 PyJWT
ENTRYPOINT ["./entrypoint.sh"]

473
app.py
View File

@ -2,8 +2,6 @@ import logging
import os
import re
import configparser
import random
import string
from pathlib import Path
from werkzeug.security import check_password_hash
@ -14,10 +12,6 @@ from flask_script import Manager
from flask_login import LoginManager, login_required, login_user, current_user, logout_user
from portal.model import db, RegisteredUser
from email.mime.multipart import MIMEMultipart
from email.mime.text import MIMEText
from email.mime.application import MIMEApplication
import portal.solar
# TODO: Integrate Shibboleth login.
@ -32,8 +26,6 @@ config = configparser.ConfigParser()
config.read('config.ini')
config = config['DEFAULT']
SERVER_NAME = config['SERVER_NAME']
ROUTE_PREFIX = config['ROUTE_PREFIX']
MAIL_HOST = config['MAIL_HOST']
MAIL_LOGIN = config['MAIL_LOGIN']
MAIL_PASS = config['MAIL_PASS']
@ -55,10 +47,6 @@ if not UPLOADS_DIR.exists:
UPLOADS_DIR.mkdir(parents=True)
# Override configs with environment variables, if set
if 'PORTALDS4DS1_SERVER_NAME' in os.environ:
SERVER_NAME = os.environ['PORTALDS4DS1_SERVER_NAME']
if 'PORTALDS4DS1_ROUTE_PREFIX' in os.environ:
ROUTE_PREFIX = os.environ['PORTALDS4DS1_ROUTE_PREFIX']
if 'PORTALDS4DS1_MAIL_HOST' in os.environ:
MAIL_HOST = os.environ['PORTALDS4DS1_MAIL_HOST']
if 'PORTALDS4DS1_MAIL_LOGIN' in os.environ:
@ -89,11 +77,9 @@ if 'PORTALDS4DS1_SQL_CONN_STR' in os.environ:
######################
app = Flask(__name__, static_url_path = ROUTE_PREFIX + '/static')
#app = Flask(__name__)
app = Flask(__name__)
app.config.update(
SERVER_NAME = SERVER_NAME,
SECRET_KEY = APP_SECRET_KEY,
UPLOADED_PATH = UPLOADS_DIR,
MAX_CONTENT_LENGTH = MAX_UPLOAD_SIZE,
@ -113,7 +99,6 @@ manager.add_command('db', MigrateCommand)
dropzone = Dropzone(app)
upload_handler_solar = portal.solar.UploadHandlerSolar(
SERVER_NAME = SERVER_NAME,
UPLOADS_DIR=UPLOADS_DIR,
MAIL_HOST=MAIL_HOST,
MAIL_LOGIN=MAIL_LOGIN,
@ -139,11 +124,11 @@ def redirect_url(default='/'):
url_for(default)
@app.route(ROUTE_PREFIX + '/')
@app.route('/')
def index():
if current_user.is_authenticated:
return redirect(ROUTE_PREFIX + '/oddaja/')
return redirect(ROUTE_PREFIX + '/login/')
return redirect('/oddaja')
return redirect('/login')
@login_manager.user_loader
@ -152,17 +137,17 @@ def load_user(user_id):
return user
@app.route(ROUTE_PREFIX + '/login')
@app.route('/login')
def solar_login_get():
return render_template('solar-login.html', ROUTE_PREFIX=ROUTE_PREFIX)
return render_template('solar-login.html')
@app.route(ROUTE_PREFIX + '/register')
@app.route('/register')
def solar_register_get():
return render_template('solar-register.html', ROUTE_PREFIX=ROUTE_PREFIX)
return render_template('solar-register.html')
@app.route(ROUTE_PREFIX + '/login', methods=['POST'])
@app.route('/login', methods=['POST'])
def solar_login_post():
email = request.form.get('email')
password = request.form.get('password')
@ -172,19 +157,19 @@ def solar_login_post():
if not user or not check_password_hash(user.pass_hash, password):
flash('Napačni podatki za prijavo. Poskusite ponovno.')
return redirect(ROUTE_PREFIX + '/login/')
return redirect('/login')
if not user.active:
flash('Vaš uporabniški račun še ni bil aktiviran.')
return redirect(ROUTE_PREFIX + '/login/')
return redirect('/login')
#portal.solar.add_user_session(user.id)
login_user(user, remember=remember)
return redirect(ROUTE_PREFIX + '/oddaja/')
return redirect('/oddaja')
@app.route(ROUTE_PREFIX + '/register', methods=['POST'])
@app.route('/register', methods=['POST'])
def solar_register_post():
name = request.form.get('name')
email = request.form.get('email')
@ -197,38 +182,38 @@ def solar_register_post():
if user:
flash('Uporabniški račun s tem emailom je že registriran.')
return redirect(ROUTE_PREFIX + '/register/')
return redirect('/register')
if not name:
flash('Prazno polje za ime.')
return redirect(ROUTE_PREFIX + '/register/')
return redirect('/register')
if len(name) > 100:
flash('Predolgo ime.')
return redirect(ROUTE_PREFIX + '/register/')
return redirect('/register')
if not email:
flash('Prazno polje za elektronsko pošto.')
return redirect(ROUTE_PREFIX + '/register/')
return redirect('/register')
if len(email) > 100:
flash('Predolgi email naslov')
return redirect(ROUTE_PREFIX + '/register/')
return redirect('/register')
elif not re.search(portal.solar.REGEX_EMAIL, email):
flash('Email napačnega formata.')
return redirect(ROUTE_PREFIX + '/register/')
return redirect('/register')
if not password:
flash('Prazno polje za geslo.')
return redirect(ROUTE_PREFIX + '/register/')
if len(password) < 8:
return redirect('/register')
if len(password) > 8:
flash('Geslo mora biti vsaj 8 znakov dolgo.')
return redirect(ROUTE_PREFIX + '/register/')
return redirect('/register')
if len(password) > 100:
flash('Predolgo geslo.')
return redirect(ROUTE_PREFIX + '/register/')
return redirect('/register')
if institution_role not in ['coordinator', 'mentor', 'other']:
flash('Neveljavna vloga v instituciji.')
return redirect(ROUTE_PREFIX + '/register/')
return redirect('/register')
if not institution:
institution_id = portal.solar.add_institution(institution_name, "")
@ -239,22 +224,20 @@ def solar_register_post():
user_id = portal.solar.register_new_user(name, email, password, active=False)
portal.solar.add_user_to_institution(user_id, institution_id, institution_role)
portal.solar.add_cooperation_history_item(user_id, institution_id, institution_role)
portal.solar.send_admins_new_user_notification_mail(user_id, upload_handler_solar.config)
flash('Podatki so bili poslani v potrditev. Ko bo registracija potrjena, boste o tem obveščeni po e-mailu.')
return redirect(ROUTE_PREFIX + '/login/')
flash('Podatki so bili poslani v potrditev. Ko bo registracija potrjena, boste o tem obveščeni po e-mailu, ki ste ga posredovali zgoraj.')
return redirect('/login')
@app.route(ROUTE_PREFIX + '/logout')
@app.route('/logout')
@login_required
def logout():
logout_user()
return redirect(ROUTE_PREFIX + '/login/')
return redirect('/login')
@app.route(ROUTE_PREFIX + '/<path:text>')
@app.route('/<path:text>')
@login_required
def solar(text):
is_admin = current_user.role == 'admin'
@ -269,7 +252,6 @@ def solar(text):
if text.startswith('oddaja/') or text == 'oddaja':
return render_template('solar-oddaja.html',
ROUTE_PREFIX=ROUTE_PREFIX,
is_admin=is_admin,
institution=current_user_institution,
institution_contract=institution_contract,
@ -288,10 +270,9 @@ def solar(text):
else:
institution_names.append(institution.name)
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,
ROUTE_PREFIX=ROUTE_PREFIX)
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/'):
# Check for download contract request.
# Check for ownload contract request.
match = re.match('^pogodbe-(institucije|ucencistarsi)/([a-z0-9_]+\.pdf)$', text)
if match:
contract_type = match.group(1)
@ -318,66 +299,52 @@ def solar(text):
enable_upload_school_contract = False
show_upload_form = False
collaborators = []
institution_id = ""
cooperation_history = dict()
if current_user_institution:
collaborators = portal.solar.get_all_active_institution_users(current_user_institution.id)
show_upload_form = True
contract_school = portal.solar.get_institution_contract(current_user_institution.id)
cooperation_history = portal.solar.get_institution_cooperation_history(current_user_institution.id)
institution_id = current_user_institution.id
if portal.solar.is_institution_coordinator(current_user_obj.id, current_user_institution.id):
contracts_students = portal.solar.get_institution_student_contracts(current_user_institution.id)
enable_upload_school_contract = True
else:
contracts_students = portal.solar.get_institution_student_contracts(current_user_institution.id, current_user_obj.id)
return render_template('solar-pogodbe.html',
ROUTE_PREFIX=ROUTE_PREFIX,
contracts_students=contracts_students,
return render_template('solar-pogodbe.html', contracts_students=contracts_students,
contract_school=contract_school,
enable_upload_school_contract=enable_upload_school_contract,
show_upload_form=show_upload_form,
collaborators=collaborators,
cooperation_history=cooperation_history,
user_id=current_user.id,
institution_id=institution_id,
is_admin=is_admin, is_institution_coordinator=current_user_institution_coordinator)
elif text.startswith('admin/') or text == 'admin':
users = portal.solar.get_all_users_join_institutions()
inactive_users = portal.solar.get_all_users_join_institutions(active=False)
solar_institutions = portal.solar.get_all_institutions()
cooperation_history = portal.solar.get_cooperation_history()
uploads = portal.solar.get_all_upload_history(-1)
if is_admin:
return render_template('solar-admin.html', ROUTE_PREFIX=ROUTE_PREFIX, users=users,
return render_template('solar-admin.html', users=users, user_cooperation_history=cooperation_history,
institutions=solar_institutions, inactive_users=inactive_users, uploads=uploads)
elif text.startswith('manage-institution/') or text == 'manage-institution':
if portal.solar.is_institution_coordinator(current_user.id, current_user_institution.id):
solar_users = portal.solar.get_all_active_users()
institution_users = portal.solar.get_all_active_institution_users(current_user_institution.id)
role_map = dict()
for institution_user in institution_users:
role_map[institution_user.id] = portal.solar.get_user_institution_role_str(institution_user.id, current_user_institution.id)
return render_template('solar-manage-institution.html',
ROUTE_PREFIX=ROUTE_PREFIX,
institution=current_user_institution,
users=solar_users,
institution_users=institution_users,
role_map=role_map)
return render_template('solar-manage-institution.html', users=solar_users,
institution_users=institution_users)
return '', 404
@app.route(ROUTE_PREFIX + '/pogodbe', methods=['POST'])
@app.route('/pogodbe', methods=['POST'])
@login_required
def solar_upload_contract():
msg = upload_handler_solar.handle_contract_upload(request, current_user.get_id())
flash(msg)
return redirect(ROUTE_PREFIX + redirect_url())
return redirect(redirect_url())
@app.route(ROUTE_PREFIX + '/adduser', methods=['POST'])
@app.route('/adduser', methods=['POST'])
@login_required
def solar_add_user():
@ -390,41 +357,41 @@ def solar_add_user():
if not name:
flash('Prazno polje za ime.')
return redirect(ROUTE_PREFIX + redirect_url())
return redirect(redirect_url())
if len(name) > 100:
flash('Predolgo ime.')
return redirect(ROUTE_PREFIX + redirect_url())
return redirect(redirect_url())
if not email:
flash('Prazno polje za elektronsko pošto.')
return redirect(ROUTE_PREFIX + redirect_url())
return redirect(redirect_url())
if len(email) > 100:
flash('Predolg email naslov.')
return redirect(ROUTE_PREFIX + redirect_url())
return redirect(redirect_url())
elif not re.search(portal.solar.REGEX_EMAIL, email):
flash('Email napačnega formata.')
return redirect(ROUTE_PREFIX + redirect_url())
return redirect(redirect_url())
if not password:
flash('Prazno polje za geslo.')
return redirect(ROUTE_PREFIX + redirect_url())
return redirect(redirect_url())
if len(password) > 100:
flash('Predolgo geslo.')
return redirect(ROUTE_PREFIX + redirect_url())
return redirect(redirect_url())
user = portal.solar.get_user_obj_by_email(email)
if user:
#portal.solar.undo_remove_user(user.id)
flash('Uporabnik s tem emailom je že vnešen v sistem.')
return redirect(ROUTE_PREFIX + redirect_url())
return redirect(redirect_url())
portal.solar.register_new_user(name, email, password)
flash('Uporabnik je bil uspešno dodan.')
return redirect(ROUTE_PREFIX + redirect_url())
return redirect(redirect_url())
@app.route(ROUTE_PREFIX + '/activateuser', methods=['POST'])
@app.route('/activateuser', methods=['POST'])
@login_required
def solar_activate_user():
if not portal.solar.is_admin(current_user.id):
@ -433,7 +400,7 @@ def solar_activate_user():
user_id = request.form.get('id')
if not user_id:
flash('Prazno polje za ID uporabnika.')
return redirect(ROUTE_PREFIX + redirect_url())
return redirect(redirect_url())
rowcount = portal.solar.activate_user(user_id)
if rowcount == 0:
@ -442,35 +409,35 @@ def solar_activate_user():
portal.solar.send_user_activation_mail(user_id, upload_handler_solar.config)
flash('Uporabnik je bil aktiviran.')
return redirect(ROUTE_PREFIX + redirect_url())
return redirect(redirect_url())
@app.route(ROUTE_PREFIX + '/forgotpass')
@app.route('/forgotpass')
def solar_forgotpass():
return render_template('solar-forgotpass.html', ROUTE_PREFIX=ROUTE_PREFIX)
return render_template('solar-forgotpass.html')
@app.route(ROUTE_PREFIX + '/sendresetpass', methods=['POST'])
@app.route('/sendresetpass', methods=['POST'])
def solar_sendresetpass():
email = request.form.get('email')
portal.solar.send_resetpass_mail(email, upload_handler_solar.config)
flash('Povezava za ponastavitev gesla je bila poslana na vpisani e-naslov.')
return redirect(ROUTE_PREFIX + redirect_url())
flash('Povezava za ponastavitev gesla je bila poslana na vpisan email naslov.')
return redirect(redirect_url())
@app.route(ROUTE_PREFIX + '/resetpass/<token>')
@app.route('/resetpass/<token>')
def solar_resetpass(token):
user = portal.solar.verify_reset_token(token, upload_handler_solar.config['APP_SECRET_KEY'])
if not user:
return '', 404
return render_template('solar-resetpass.html',ROUTE_PREFIX=ROUTE_PREFIX, user=user, token=token)
return render_template('solar-resetpass.html', user=user, token=token)
@app.route(ROUTE_PREFIX + '/resetpass/<token>', methods=['POST'])
@app.route('/resetpass/<token>', methods=['POST'])
def solar_resetpass_post(token):
new_password = request.form.get('new_password')
user = portal.solar.verify_reset_token(token, upload_handler_solar.config['APP_SECRET_KEY'])
@ -483,33 +450,16 @@ def solar_resetpass_post(token):
return '', 404
flash('Ponastavitev gesla je bila uspešna.')
return redirect(ROUTE_PREFIX + '/login/')
return redirect('/login')
@app.route(ROUTE_PREFIX + '/topuploads')
@app.route('/topuploads')
@login_required
def solar_topuploads():
def solar_topuploads_srednje():
return jsonify(portal.solar.get_top_uploading_institutions())
@app.route(ROUTE_PREFIX + '/topuploads-institution/<institution_id>')
@login_required
def solar_topuploads_institution(institution_id):
return jsonify(portal.solar.get_top_uploading_users(institution_id))
@app.route(ROUTE_PREFIX + '/uploadstats-institution/<institution_id>')
@login_required
def solar_uploadstats_institution(institution_id):
return jsonify(portal.solar.get_institution_upload_stats(institution_id))
@app.route(ROUTE_PREFIX + '/uploadstats-per-region')
@login_required
def solar_uploadstats_per_region():
return jsonify(portal.solar.get_region_stats())
@app.route(ROUTE_PREFIX + '/deluser', methods=['POST'])
@app.route('/deluser', methods=['POST'])
@login_required
def solar_del_user():
if not portal.solar.is_admin(current_user.id):
@ -517,9 +467,9 @@ def solar_del_user():
user_id = request.form.get('user_id')
portal.solar.remove_user(user_id)
flash('Uporabnik je bil odstranjen.')
return redirect(ROUTE_PREFIX + redirect_url())
return redirect(redirect_url())
@app.route(ROUTE_PREFIX + '/addinstitution', methods=['POST'])
@app.route('/addinstitution', methods=['POST'])
@login_required
def add_institution():
if not portal.solar.is_admin(current_user.id):
@ -530,21 +480,21 @@ def add_institution():
if not name:
flash('Prazno polje za naziv.')
return redirect(ROUTE_PREFIX + redirect_url())
return redirect(redirect_url())
if len(name) > 100:
flash('Predolgo ime.')
return redirect(ROUTE_PREFIX + redirect_url())
return redirect(redirect_url())
if not region in portal.solar.VALID_REGIONS:
flash('Neveljavna vrednost za regijo.')
return redirect(ROUTE_PREFIX + redirect_url())
return redirect(redirect_url())
institution_id = portal.solar.add_institution(name, region)
portal.solar.grant_institution_corpus_access(institution_id, "solar") # TODO: throw out
flash('Institucija je bila dodana.')
return redirect(ROUTE_PREFIX + redirect_url())
return redirect(redirect_url())
@app.route(ROUTE_PREFIX + '/mergeinstitutions', methods=['POST'])
@app.route('/mergeinstitutions', methods=['POST'])
@login_required
def merge_institutions():
if not portal.solar.is_admin(current_user.id):
@ -555,18 +505,18 @@ def merge_institutions():
if not id_from or not id_to:
flash('Prazno polje.')
return redirect(ROUTE_PREFIX + redirect_url())
return redirect(redirect_url())
institution_from = portal.solar.get_institution_obj(id_from)
institution_to = portal.solar.get_institution_obj(id_to)
if not institution_from:
flash('Institucija z ID "{}" ne obstaja.'.format(id_from))
return redirect(ROUTE_PREFIX + redirect_url())
return redirect(redirect_url())
if not institution_to:
flash('Institucija z ID "{}" ne obstaja.'.format(id_to))
return redirect(ROUTE_PREFIX + redirect_url())
return redirect(redirect_url())
portal.solar.transfer_users_institution(institution_from.id, institution_to.id)
@ -575,45 +525,45 @@ def merge_institutions():
portal.solar.remove_institution(institution_from.id)
flash('Instituciji uspešno združeni')
return redirect(ROUTE_PREFIX + redirect_url())
return redirect(redirect_url())
#@app.route(ROUTE_PREFIX + '/addcooperationhistoryitem', methods=['POST'])
#@login_required
#def add_cooperation_history_item():
# if not portal.solar.is_admin(current_user.id):
# return '', 404
#
# user_id = request.form.get('user')
# institution_id = request.form.get('institution')
# role = request.form.get('role')
# school_year = request.form.get('school-year')
# badge_text = request.form.get('badge-text')
#
# user = portal.solar.get_user_obj(user_id)
# institution = portal.solar.get_institution_obj(institution_id)
#
# if not user:
# flash('Uporabnik s tem ID-jem ne obstaja.')
# return redirect(ROUTE_PREFIX + redirect_url())
#
# if not institution:
# flash('Institucija s tem ID-jem ne obstaja.')
# return redirect(ROUTE_PREFIX + redirect_url())
#
# if not role in ['coordinator', 'mentor', 'other']:
# flash('Neveljavna vloga "{}".'.format(role))
# return redirect(ROUTE_PREFIX + redirect_url())
#
# if not school_year or not re.match('[0-9]{4}/[0-9]{2}', school_year):
# flash('Šolsko leto mora biti formata "2021/22".')
# return redirect(ROUTE_PREFIX + redirect_url())
#
# portal.solar.add_cooperation_history_item(user_id, institution_id, role, school_year, badge_text)
#
# flash('Vnos dodan.')
# return redirect(ROUTE_PREFIX + redirect_url())
@app.route('/addcooperationhistoryitem', methods=['POST'])
@login_required
def add_cooperation_history_item():
if not portal.solar.is_admin(current_user.id):
return '', 404
@app.route(ROUTE_PREFIX + '/updateuploaditem', methods=['POST'])
user_id = request.form.get('user')
institution_id = request.form.get('institution')
role = request.form.get('role')
school_year = request.form.get('school-year')
badge_text = request.form.get('badge-text')
user = portal.solar.get_user_obj(user_id)
institution = portal.solar.get_institution_obj(institution_id)
if not user:
flash('Uporabnik s tem ID-jem ne obstaja.')
return redirect(redirect_url())
if not institution:
flash('Institucija s tem ID-jem ne obstaja.')
return redirect(redirect_url())
if not role in ['coordinator', 'mentor', 'other']:
flash('Neveljavna vloga "{}".'.format(role))
return redirect(redirect_url())
if not school_year or not re.match('[0-9]{4}/[0-9]{2}', school_year):
flash('Šolsko leto mora biti formata "2021/22".')
return redirect(redirect_url())
portal.solar.add_cooperation_history_item(user_id, institution_id, role, school_year, badge_text)
flash('Vnos dodan.')
return redirect(redirect_url())
@app.route('/updateuploaditem', methods=['POST'])
@login_required
def update_upload_item():
if not portal.solar.is_admin(current_user.id):
@ -622,7 +572,7 @@ def update_upload_item():
err_msg = portal.solar.UploadHandlerSolar.check_form(request.form)
if err_msg:
flash(err_msg)
return redirect(ROUTE_PREFIX + redirect_url())
return redirect(redirect_url())
item_id = request.form.get('item-id')
program = request.form.get('program')
@ -649,22 +599,22 @@ def update_upload_item():
return '', 404
flash('Vnos spremenjen.')
return redirect(ROUTE_PREFIX + redirect_url())
return redirect(redirect_url())
#@app.route(ROUTE_PREFIX + '/delcooperationhistoryitem', methods=['POST'])
#@login_required
#def del_cooperation_history_item():
# if not portal.solar.is_admin(current_user.id):
# return '', 404
#
# entry_id = request.form.get('entry-id')
# portal.solar.del_cooperation_history_item(entry_id)
#
# flash('Vnos odstranjen.')
# return redirect(ROUTE_PREFIX + redirect_url())
@app.route('/delcooperationhistoryitem', methods=['POST'])
@login_required
def del_cooperation_history_item():
if not portal.solar.is_admin(current_user.id):
return '', 404
@app.route(ROUTE_PREFIX + '/changeinstitutiondata', methods=['POST'])
entry_id = request.form.get('entry-id')
portal.solar.del_cooperation_history_item(entry_id)
flash('Vnos odstranjen.')
return redirect(redirect_url())
@app.route('/changeinstitutiondata', methods=['POST'])
@login_required
def change_institution_data():
if not portal.solar.is_admin(current_user.id):
@ -676,21 +626,21 @@ def change_institution_data():
if not new_name:
flash('Prazno polje za naziv.')
return redirect(ROUTE_PREFIX + redirect_url())
return redirect(redirect_url())
if len(new_name) > 100:
flash('Predolgo ime.')
return redirect(ROUTE_PREFIX + redirect_url())
return redirect(redirect_url())
if not new_region in portal.solar.VALID_REGIONS:
flash('Neveljavna vrednost za regijo.')
return redirect(ROUTE_PREFIX + redirect_url())
return redirect(redirect_url())
portal.solar.update_institution_data(institution_id, new_name, new_region)
flash('Podatki institucije so bili spremenjeni.')
return redirect(ROUTE_PREFIX + redirect_url())
return redirect(redirect_url())
@app.route(ROUTE_PREFIX + '/changeuseremail', methods=['POST'])
@app.route('/changeuseremail', methods=['POST'])
@login_required
def change_user_email():
if not portal.solar.is_admin(current_user.id):
@ -701,43 +651,17 @@ def change_user_email():
if not re.search(portal.solar.REGEX_EMAIL, email):
flash('Email napačnega formata.')
return redirect(ROUTE_PREFIX + redirect_url())
return redirect(redirect_url())
portal.solar.update_user_email(user_id, email)
flash('Email spremenjen.')
return redirect(ROUTE_PREFIX + redirect_url())
@app.route(ROUTE_PREFIX + '/changeuserrole-institution', methods=['POST'])
@login_required
def change_user_role_institution():
institution = portal.solar.get_user_institution(current_user.id)
if not portal.solar.is_admin(current_user.id):
# Institution coordinators can only assign roles of users in their own
# institution.
if institution and portal.solar.is_institution_coordinator(current_user.id, institution.id):
pass
else:
return '', 404
user_id = request.form.get('user-id')
role = request.form.get('role')
if role not in ['coordinator', 'mentor', 'other']:
flash('Neveljavna vloga.')
return redirect(ROUTE_PREFIX + redirect_url())
portal.solar.update_user_institution_role(user_id, institution.id, role)
portal.solar.add_cooperation_history_item(user_id, institution.id, role)
flash('Vloga v instituciji spremenjena.')
return redirect(ROUTE_PREFIX + redirect_url())
return redirect(redirect_url())
@app.route(ROUTE_PREFIX + '/changeuserrole', methods=['POST'])
@app.route('/changeuserrole', methods=['POST'])
@login_required
def change_user_role():
institution = portal.solar.get_user_institution(current_user.id)
if not portal.solar.is_admin(current_user.id):
return '', 404
@ -746,14 +670,14 @@ def change_user_role():
if not role in ['admin', 'user']:
flash('Neveljavna vloga.')
return redirect(ROUTE_PREFIX + redirect_url())
return redirect(redirect_url())
portal.solar.update_user_role(user_id, role)
flash('Vloga spremenjena.')
return redirect(ROUTE_PREFIX + redirect_url())
return redirect(redirect_url())
@app.route(ROUTE_PREFIX + '/changeusername', methods=['POST'])
@app.route('/changeusername', methods=['POST'])
@login_required
def change_user_name():
if not portal.solar.is_admin(current_user.id):
@ -765,9 +689,9 @@ def change_user_name():
portal.solar.update_user_name(user_id, name)
flash('Ime in priimek spremenjena.')
return redirect(ROUTE_PREFIX + redirect_url())
return redirect(redirect_url())
@app.route(ROUTE_PREFIX + '/addusertoinstitution', methods=['POST'])
@app.route('/addusertoinstitution', methods=['POST'])
@login_required
def add_user_institution_mapping():
institution_id = request.form.get('institution_id')
@ -776,7 +700,7 @@ def add_user_institution_mapping():
if institution:
institution_id = institution.id
if not portal.solar.is_admin(current_user.id):
if not (portal.solar.is_admin(current_user.id) or portal.solar.is_institution_coordinator(current_user.id, institution_id)):
return '', 404
user_id = request.form['user_id']
@ -786,143 +710,36 @@ def add_user_institution_mapping():
if portal.solar.get_user_institution(user_id):
flash('Uporabnik je že dodeljen instituciji.')
return redirect(ROUTE_PREFIX + redirect_url())
return redirect(redirect_url())
portal.solar.add_user_to_institution(user_id, institution_id, role)
portal.solar.add_cooperation_history_item(user_id, institution_id, role)
flash('Uporabnik je bil dodeljen instituciji.')
return redirect(ROUTE_PREFIX + redirect_url())
return redirect(redirect_url())
@app.route(ROUTE_PREFIX + '/deluserfrominstitution', methods=['POST'])
@app.route('/deluserfrominstitution', methods=['POST'])
@login_required
def del_user_institution_mapping():
user_id = request.form['user_id']
institution = portal.solar.get_user_institution(user_id)
if not institution:
flash('Uporabnik ni član nobene institucije.')
return redirect(ROUTE_PREFIX + redirect_url())
return redirect(redirect_url())
if not portal.solar.is_admin(current_user.id) \
and not portal.solar.is_institution_coordinator(current_user.id, institution.id):
flash('Nimate ustreznih pravic za odstranitev uporabnika iz institucije.')
return redirect(ROUTE_PREFIX + redirect_url())
return redirect(redirect_url())
portal.solar.del_user_from_institution(user_id, institution.id)
flash('Uporabnik je bil odstranjen iz institucije.')
return redirect(ROUTE_PREFIX + redirect_url())
return redirect(redirect_url())
@app.route(ROUTE_PREFIX + '/upload', methods=['POST'])
@app.route('/upload', methods=['POST'])
def handle_upload():
if not current_user.is_authenticated:
return '', 404
return upload_handler_solar.handle_upload(request, current_user.get_id())
@app.route(ROUTE_PREFIX + '/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)
f_suffix = f_name.split('.')[-1]
f_dlname = upload_obj.upload_file_codes[file_hashes.index(file_hash)]
if f_suffix in portal.solar.UploadHandlerSolar.ENABLED_FILETYPES:
f_dlname += '.' + f_suffix
try:
return send_file(safe_path, attachment_filename=f_dlname, as_attachment=True)
except FileNotFoundError:
return '', 404
@app.route(ROUTE_PREFIX + '/institutionadduser', methods=['POST'])
@login_required
def solar_institution_add_user():
current_user_institution = portal.solar.get_user_institution(current_user.id)
if not portal.solar.is_institution_coordinator(current_user.id, current_user_institution.id):
return '', 404
name = request.form.get('name')
email = request.form.get('email')
role = request.form.get('role')
password=''.join(random.choices(string.ascii_lowercase, k=8))
if not name:
flash('Prazno polje za ime.')
return redirect(ROUTE_PREFIX + redirect_url())
if len(name) > 100:
flash('Predolgo ime.')
return redirect(ROUTE_PREFIX + redirect_url())
if not email:
flash('Prazno polje za elektronsko pošto.')
return redirect(ROUTE_PREFIX + redirect_url())
if len(email) > 100:
flash('Predolg email naslov.')
return redirect(ROUTE_PREFIX + redirect_url())
elif not re.search(portal.solar.REGEX_EMAIL, email):
flash('Email napačnega formata.')
return redirect(ROUTE_PREFIX + redirect_url())
if not password:
flash('Prazno polje za geslo.')
return redirect(ROUTE_PREFIX + redirect_url())
if len(password) > 100:
flash('Predolgo geslo.')
return redirect(ROUTE_PREFIX + redirect_url())
user = portal.solar.get_user_obj_by_email(email)
if user:
#portal.solar.undo_remove_user(user.id)
flash('Uporabnik s tem emailom je že vnešen v sistem.')
return redirect(ROUTE_PREFIX + redirect_url())
new_user_id = portal.solar.register_new_user(name, email, password)
portal.solar.add_user_to_institution(new_user_id, current_user_institution.id, role)
portal.solar.activate_user(new_user_id)
#token za nastaviti geslo
jwt_token = portal.solar.get_password_reset_token(email, config['APP_SECRET_KEY'])
#pošlji email uporabniku
body = '''
Ustvarjen je bil uporabniški račun na Portalu Šolar.
Geslo lahko nastavite na naslednji povezavi: https://{}/resetpass/{}'''.format(config['SERVER_NAME'], jwt_token)
message = MIMEMultipart()
message['From'] = config['MAIL_LOGIN']
message['To'] = email
message['Subject'] = 'Portal Šolar: Ponastavitev gesla'
message.attach(MIMEText(body, "plain"))
text = message.as_string()
# Create a secure SSL context
context = ssl.create_default_context()
try:
with SMTP_SSL(config['MAIL_HOST'], config['SMTP_PORT'], context=context) as server:
server.login(config['MAIL_LOGIN'], config['MAIL_PASS'])
server.sendmail(config['MAIL_LOGIN'], email, text)
except Exception:
traceback.print_exc()
flash('Uporabnik je bil uspešno dodan.')
return redirect(ROUTE_PREFIX + redirect_url())
if __name__ == '__main__':
app.run(debug=True)

View File

@ -1,6 +1,4 @@
[DEFAULT]
SERVER_NAME=localhost:5000
ROUTE_PREFIX=
SQL_CONN_STR=postgresql://portal:randompass123@localhost/portal
MAIL_HOST=posta.cjvt.si
MAIL_LOGIN=oddaja-besedil@cjvt.si
@ -12,6 +10,8 @@ MAX_UPLOAD_SIZE=1000000000
MAX_FILES_PER_UPLOAD=30
UPLOADS_DIR=./uploads
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_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

@ -4,7 +4,6 @@ services:
build: .
restart: always
environment:
- PORTALDS4DS1_SERVER_NAME=localhost:5000
- PORTALDS4DS1_SQL_CONN_STR=postgresql://portal:randompass123@db/portal
- PORTALDS4DS1_MAIL_HOST=posta.cjvt.si
- PORTALDS4DS1_MAIL_LOGIN=oddaja-besedil@cjvt.si

View File

@ -1,36 +0,0 @@
"""Altered cooperation history structure.
Revision ID: 0cf2d8f74766
Revises: c7bb822adf9f
Create Date: 2022-02-14 13:04:01.143637
"""
from alembic import op
import sqlalchemy as sa
# revision identifiers, used by Alembic.
revision = '0cf2d8f74766'
down_revision = 'c7bb822adf9f'
branch_labels = None
depends_on = None
def upgrade():
# Delete all rows
query = 'DELETE FROM user_cooperation;'
op.execute(query)
# ### commands auto generated by Alembic - please adjust! ###
op.add_column('user_cooperation', sa.Column('timestamp', sa.DateTime(), nullable=False))
op.drop_column('user_cooperation', 'badge_text')
op.drop_column('user_cooperation', 'school_year')
# ### end Alembic commands ###
def downgrade():
# ### commands auto generated by Alembic - please adjust! ###
op.add_column('user_cooperation', sa.Column('school_year', sa.VARCHAR(), autoincrement=False, nullable=False))
op.add_column('user_cooperation', sa.Column('badge_text', sa.VARCHAR(), autoincrement=False, nullable=True))
op.drop_column('user_cooperation', 'timestamp')
# ### end Alembic commands ###

View File

@ -1,28 +0,0 @@
"""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

@ -1,30 +0,0 @@
"""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,7 +19,6 @@ class UploadSolar(db.Model):
institution = db.Column(db.Integer, sqlalchemy.ForeignKey('institution.id'), nullable=True)
upload_hash = db.Column(db.String, 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)
subject = db.Column(db.String, nullable=True)
subject_custom = db.Column(db.String, nullable=True)
@ -29,8 +28,6 @@ class UploadSolar(db.Model):
school_year = 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_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):
@ -71,7 +68,8 @@ class UserCooperationHistory(db.Model):
user = db.Column(db.Integer, sqlalchemy.ForeignKey('registered_user.id'), nullable=False)
institution = db.Column(db.Integer, sqlalchemy.ForeignKey('institution.id'), nullable=False)
role = db.Column(db.String, nullable=False)
timestamp = db.Column(db.DateTime, default=datetime.utcnow, nullable=False)
school_year = db.Column(db.String, nullable=False)
badge_text = db.Column(db.String, nullable=True)
class Institution(db.Model):

View File

@ -6,11 +6,15 @@ import traceback
import ssl
from datetime import datetime
from sqlalchemy import desc
from sqlalchemy import func
from collections import Counter
from pathlib import Path
import imaplib
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.text import MIMEText
from email.mime.application import MIMEApplication
@ -25,11 +29,10 @@ from werkzeug.security import generate_password_hash
from . model import *
VALID_PROGRAMS = {'OS', 'SSG', 'MGP', 'ZG', 'NPI', 'SPI', 'SSI', 'PTI'}
VALID_SUBJECTS = {'SLO', 'DJP', 'DDP', 'DNP', 'DSP', 'DIP'}
VALID_TEXT_TYPES = {'E', 'PB', 'T', 'R'}
VALID_GRAMMAR_CORRECTIONS = {'DD', 'N', 'DN'}
VALID_SUBJECTS = {'slo', 'drug-jez', 'drug-druz', 'drug-narav', 'drug-strok', 'drug-izb'}
VALID_TEXT_TYPES = {'esej-spis', 'prakticno', 'solski-test', 'delo-v-razredu'}
VALID_GRAMMAR_CORRECTIONS = {'popr-ne', 'brez-popr', 'popr-da'}
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}$')
@ -45,6 +48,7 @@ class ContractCreator:
template_loader = FileSystemLoader(searchpath="./")
template_env = Environment(loader=template_loader)
self.template = template_env.get_template(template_path)
self.pdfkit_options = {
'page-size': 'A4',
'margin-top': '0.75in',
@ -70,7 +74,7 @@ class ContractCreator:
class UploadHandlerSolar():
ENABLED_FILETYPES = ['txt', 'csv', 'pdf', 'doc', 'docx', 'xls', 'xlsx', 'ppt', 'pptx', 'xml', 'mxliff', 'tmx', 'jpg', 'jpeg', 'png']
def __init__(self, **kwargs):
self.config = kwargs
@ -150,49 +154,25 @@ class UploadHandlerSolar():
timestamp = datetime.fromtimestamp(upload_metadata['timestamp'])
form_data = upload_metadata['form_data']
file_hashes = upload_metadata['file_hashes_dict']
sorted_file_items = sorted(file_hashes.items(), key=lambda item: item[1])
sorted_f_hashes = list(file_hashes.values())
sorted_f_hashes.sort()
institution_id = get_user_institution(user_id).id
region = form_data['regija']
program = form_data['program']
subject = form_data['predmet'],
subject_custom = form_data['predmet-custom'],
grade = form_data['letnik'],
text_type = form_data['vrsta'],
text_type_custom = form_data['vrsta-custom'],
school_year = form_data['solsko-leto'],
grammar_corrections = form_data['jezikovni-popravki'],
upload_file_codes = []
for i in range(len(sorted_file_items)):
file_code = '{}_{}_{}_{}_{}_{}_{}_{}'.format(
region,
program,
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_names=[x[0] for x in sorted_file_items],
upload_file_codes=upload_file_codes,
program=form_data['program'],
subject=form_data['predmet'],
subject_custom=form_data['predmet-custom'],
grade=form_data['letnik'],
text_type=form_data['vrsta'],
text_type_custom=form_data['vrsta-custom'],
school_year=form_data['solsko-leto'],
grammar_corrections=form_data['jezikovni-popravki'],
upload_file_hashes=sorted_f_hashes
)
UploadHandlerSolar.store_model(model_obj)
@ -238,7 +218,7 @@ class UploadHandlerSolar():
# Store to database.
self.store_metadata(upload_metadata, user_id)
return 'Število uspešno oddanih datotek: {}. Podatki o oddaji so na voljo v zavihku Zgodovina sodelovanja.'.format(len(request.files))
return 'Uspešno ste oddali datotek(e). Št. datotek: {}'.format(len(request.files))
def handle_contract_upload(self, request, user_id):
contract_type = request.form['tip-pogodbe']
@ -302,7 +282,6 @@ class UploadHandlerSolar():
@staticmethod
def check_form(form):
region = form['regija']
program = form['program']
predmet = form['predmet']
letnik = int(form['letnik'])
@ -310,8 +289,6 @@ class UploadHandlerSolar():
solsko_leto = form['solsko-leto']
jezikovni_popravki = form['jezikovni-popravki']
if region not in VALID_REGIONS:
return 'Invalid region "{}"'.format(region)
if program not in VALID_PROGRAMS:
return 'Invalid program "{}"'.format(program)
if predmet not in VALID_SUBJECTS:
@ -416,9 +393,6 @@ def get_upload_history(user_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()
def get_upload_object(upload_id):
return UploadSolar.query.filter_by(id=upload_id).first()
def get_all_upload_history(n=20):
if n == -1:
return UploadSolar.query.order_by(desc(UploadSolar.timestamp)).all()
@ -459,63 +433,6 @@ def get_top_uploading_institutions():
return dict(sorted(res.items(), key=lambda x:x[1], reverse=True))
def get_top_uploading_users(institution_id):
res = dict()
users = get_all_active_institution_users(institution_id)
for user in users:
uploads = UploadSolar.query.filter_by(upload_user=user.id).all()
for upload in uploads:
if user.name not in res:
res[user.name] = 0
res[user.name] += len(upload.upload_file_hashes)
if len(res) >= 5:
return dict(sorted(res.items(), key=lambda x:x[1], reverse=True)[:5])
return dict(sorted(res.items(), key=lambda x:x[1], reverse=True))
def get_institution_upload_stats(institution_id):
res = {
'region': [],
'program': [],
}
# Region
for region in VALID_REGIONS:
count = UploadSolar.query.filter_by(institution=institution_id, region=region).count()
res['region'].append((region, count))
res['region'] = sorted(res['region'], key=lambda x:x[1], reverse=True)
# Program
for program in VALID_PROGRAMS:
count = UploadSolar.query.filter_by(institution=institution_id, program=program).count()
res['program'].append((program, count))
res['program'] = sorted(res['program'], key=lambda x:x[1], reverse=True)
return res
def get_region_stats():
ret = {'CE': [0,0], 'GO': [0,0], 'KK': [0,0], 'KP': [0,0], 'KR': [0,0], 'LJ': [0,0], 'MB': [0,0], 'MS': [0,0], 'NM': [0,0], 'PO': [0,0], 'SG': [0,0]}
os = db.session.query(UploadSolar.region, func.count(UploadSolar.id)).filter_by(program="OS").group_by(UploadSolar.region).all()
neos = db.session.query(UploadSolar.region, func.count(UploadSolar.id)).filter(sqlalchemy.not_(UploadSolar.program.contains("OS"))).group_by(UploadSolar.region).all()
#logging.error(os)
#logging.error(neos)
for key, val in os:
if key not in VALID_REGIONS:
continue
ret[key][0] = val
for key, val in neos:
if key not in VALID_REGIONS:
continue
ret[key][1] = val
logging.error(ret)
return ret
def get_all_active_users():
# TODO: do filtering purely within an SQL query
res = []
@ -525,9 +442,8 @@ def get_all_active_users():
res.append(user)
return res
def update_upload_item(item_id, region, program, subject, subject_custom, grade, text_type, text_type_custom, school_year, grammar_corrections):
def update_upload_item(item_id, 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({
'region': region,
'program': program,
'subject': subject,
'subject_custom': subject_custom,
@ -552,48 +468,20 @@ def get_institution_contract(institution_id):
def get_institution_cooperation_history(institution_id):
items = db.session.query(UserCooperationHistory.role,
UserCooperationHistory.timestamp,
RegisteredUser.id,
RegisteredUser.name
).select_from(
UserCooperationHistory,
).join(
RegisteredUser,
UserCooperationHistory.user == RegisteredUser.id,
).filter(
UserCooperationHistory.institution == institution_id,
).order_by(UserCooperationHistory.timestamp.desc()).all()
#return CooperationToken.query.join(UserCooperationTokenMapping,
# UserCooperationTokenMapping.cooperation_token == CooperationToken.id).filter(UserCooperationTokenMapping.user == user_id).all()
#
res = dict()
res = []
prev_schoolyear = None
item_buff = []
users_seen = set()
for item in items:
timestamp = item.timestamp
year = timestamp.year
month = timestamp.month
if month >= 9 :
school_year = '{}/{}'.format(year, str(year+1)[-2:])
else:
school_year = '{}/{}'.format(year-1, str(year)[-2:])
if school_year != prev_schoolyear:
if len(item_buff) > 0:
res.append((prev_schoolyear, item_buff))
prev_schoolyear = school_year
item_buff = []
users_seen = set()
if not item.id in users_seen:
users_seen.add(item.id)
item_buff.append(item)
if len(item_buff) > 0:
res.append((prev_schoolyear, item_buff))
uch_rows = UserCooperationHistory.query.filter_by(institution=institution_id).order_by(UserCooperationHistory.school_year.desc()).all()
for row in uch_rows:
if row.user not in res:
res[row.user] = {
'coordinator': [],
'mentor': [],
'other': []
}
res[row.user][row.role].append((row.school_year, row.badge_text))
return res
@ -602,20 +490,21 @@ def get_cooperation_history():
return UserCooperationHistory.query.all()
def add_cooperation_history_item(user_id, institution_id, role):
def add_cooperation_history_item(user_id, institution_id, role, school_year, badge_text):
model_obj = UserCooperationHistory(
user=user_id,
institution=institution_id,
role=role,
timestamp=datetime.now()
school_year=school_year,
badge_text=badge_text
)
db.session.add(model_obj)
db.session.commit()
return model_obj.id
#def del_cooperation_history_item(entry_id):
# db.session.query(UserCooperationHistory).filter_by(id=entry_id).delete()
# db.session.commit()
def del_cooperation_history_item(entry_id):
db.session.query(UserCooperationHistory).filter_by(id=entry_id).delete()
db.session.commit()
def has_user_corpus_access(user_id, corpus_name):
user = RegisteredUser.query.filter_by(id=user_id).first()
@ -651,6 +540,7 @@ def get_user_obj_by_email(email):
def get_institution_obj(institution_id):
return Institution.query.filter_by(id=institution_id).first()
def get_institution_obj_by_name(institution_name):
return Institution.query.filter_by(name=institution_name).first()
@ -719,12 +609,6 @@ def update_user_role(user_id, role):
return rowcount
def update_user_institution_role(user_id, institution_id, role):
rowcount = db.session.query(UserInstitutionMapping).filter_by(user=user_id, institution=institution_id).update({'role': role})
db.session.commit()
return rowcount
def update_user_email(user_id, new_email):
rowcount = db.session.query(RegisteredUser).filter_by(id=user_id).update({'email': new_email})
db.session.commit()
@ -767,22 +651,6 @@ def del_user_from_institution(user_id, institution_id):
db.session.commit()
def get_user_institution_role_str(user_id, institution_id):
res = UserInstitutionMapping.query.filter_by(
user=user_id
).filter_by(
institution=institution_id
).first()
if not res:
return ''
role_str_map = {
'coordinator': 'Koordinator/-ka',
'mentor': 'Mentor/-ica',
'other': 'Druga vloga'
}
return role_str_map[res.role]
def get_all_active_users():
return RegisteredUser.query.filter_by(active=True).order_by(RegisteredUser.id).all()
@ -797,6 +665,7 @@ def get_all_users_join_institutions(active=True):
RegisteredUser.id == UserInstitutionMapping.user).filter(RegisteredUser.active == active).order_by(RegisteredUser.id).all()
def get_all_active_institution_users(institution_id):
return RegisteredUser.query.filter_by(active=True).join(UserInstitutionMapping,
RegisteredUser.id == UserInstitutionMapping.user).filter(UserInstitutionMapping.institution == institution_id).all()
@ -833,11 +702,9 @@ def get_actual_studentparent_contract_filename(f_hash):
def get_password_reset_token(email, key, expires=600):
token = jwt.encode({'reset_password': email,
return jwt.encode({'reset_password': email,
'exp': int(time.time()) + expires},
key=key, algorithm='HS256')
logging.error(token)
return token
def transfer_users_institution(institution_id_from, institution_id_to):
@ -882,11 +749,12 @@ def send_resetpass_mail(email, config):
body = '''
Zahtevali ste ponastavitev gesla vašega uporabniškega računa.
Geslo lahko ponastavite na naslednji povezavi: https://{}/resetpass/{}'''.format(config['SERVER_NAME'], jwt_token)
Geslo lahko ponastavite na naslednji povezavi: https://zbiranje.slovenscina.eu/solar/resetpass/{}'''.format(jwt_token)
message = MIMEMultipart()
message['From'] = config['MAIL_LOGIN']
message['To'] = email
message['Subject'] = 'Portal Šolar: Ponastavitev gesla'
message['Subject'] = 'Ponastavitev gesla'
message.attach(MIMEText(body, "plain"))
text = message.as_string()
@ -935,7 +803,7 @@ def send_user_activation_mail(user_id, config):
message = MIMEMultipart()
message['From'] = config['MAIL_LOGIN']
message['To'] = user.email
message['Subject'] = 'Portal Šolar: Vaš uporabniški račun je odobren'
message['Subject'] = 'Ponastavitev gesla'
message.attach(MIMEText(body, "plain"))
text = message.as_string()
@ -949,4 +817,3 @@ def send_user_activation_mail(user_id, config):
except Exception:
traceback.print_exc()

View File

@ -1,158 +0,0 @@
@import url(https://fonts.googleapis.com/css?family=Roboto:400,400italic,500,500italic,700,700italic,900,900italic,300italic,300,100italic,100);
html {
font-family: 'Roboto', sans-serif;
font-size: 16px;
color: #46535B; }
body {
font-size: 16px;
padding: 0;
margin: 0; }
h1 {
font-size: 30px;
font-style: normal;
font-weight: 300;
line-height: 35px;
color: #006CB7; }
h2 {
font-size: 18px;
font-style: normal;
font-weight: 300;
line-height: 21px;
text-transform: uppercase;
color: #006CB7; }
h3 {
font-size: 18px;
font-style: normal;
font-weight: 300;
line-height: 21px; }
em {
font-weight: 300; }
.btn {
border: none;
line-height: 2.5rem;
padding: 0 2.5rem;
color: white;
background: #006CB7;
border-radius: 20px;
font-size: 1.125rem;
font-weight: 400;
cursor: pointer;
transition: opacity 0.3s ease-out; }
.btn:hover {
opacity: 0.8; }
.btn:disabled {
cursor: default;
opacity: 0.5; }
.panel {
background: #F5F5F5;
padding: 40px 60px;
border-radius: 20px;
max-width: 30rem; }
.panel .panel-logo {
position: absolute;
top: -60px;
left: 0;
right: 0;
display: block;
margin: auto;
background: #F5F5F5;
padding: 20px 30px;
width: 100px;
border-radius: 100%;
text-align: center; }
.line {
background: #C4C4C4;
height: 2px;
width: 200px;
margin: auto; }
.a-right {
display: block;
text-align: right;
font-size: 10px;
text-decoration: none;
color: #006CB7;
text-transform: uppercase; }
.alert {
position: relative;
color: #8D3D3D;
margin-bottom: 2rem; }
.alert.alert-success {
color: #88B52F; }
.alert img {
position: relative;
top: 0.25rem;
width: 1.8rem; }
.alert p {
position: absolute;
display: flex;
flex-direction: column;
justify-content: center;
align-items: center;
height: 2rem;
left: 3rem;
top: 0;
margin: 0;
text-transform: uppercase; }
.submit-alert {
background: white;
border: 2px solid #B7DB70;
box-sizing: border-box;
border-radius: 8px; }
.submit-alert .btn {
margin-top: 0.5rem;
background: #88B52F;
border-radius: 4px; }
.contract-item {
position: relative;
margin-left: 3rem;
border-bottom: 1px solid #C4C4C4;
padding-bottom: 1.25rem; }
.contract-item .contract-item-icon {
position: absolute;
left: -3rem;
top: 0;
width: 2rem;
height: 2rem; }
.contract-item .contract-item-title {
font-weight: 500;
font-size: 0.875rem;
line-height: 1rem; }
.contract-item .contract-item-date {
font-weight: normal;
font-size: 0.625rem;
line-height: 0.75rem;
text-transform: uppercase; }
.contract-item .contract-item-download {
position: absolute;
right: 0;
top: 1rem;
font-size: 0.75rem;
line-height: 0.825rem;
text-transform: uppercase;
color: #006CB7;
text-decoration: none; }
.team-item {
background: white;
width: 100%;
padding-left: 1rem;
position: relative; }
.team-item .team-item-name {
line-height: 3.25rem; }
.team-item .team-item-name .team-item-role {
color: #848C90;
margin-left: 1rem; }
/*# sourceMappingURL=contracts.css.map */

View File

@ -1,7 +0,0 @@
{
"version": 3,
"mappings": "AAAQ,+IAAuI;AAa/I,IAAK;EACH,WAAW,EAAE,oBAAoB;EACjC,SAAS,EAAC,IAAI;EACd,KAAK,EAZC,OAAO;;AAef,IAAK;EACH,SAAS,EAAC,IAAI;EACd,OAAO,EAAC,CAAC;EACT,MAAM,EAAC,CAAC;;ACpBV,EAAG;EACD,SAAS,EAAE,IAAI;EACf,UAAU,EAAE,MAAM;EAClB,WAAW,EAAE,GAAG;EAChB,WAAW,EAAE,IAAI;EACjB,KAAK,EDLA,OAAO;;ACOd,EAAG;EACD,SAAS,EAAE,IAAI;EACf,UAAU,EAAE,MAAM;EAClB,WAAW,EAAE,GAAG;EAChB,WAAW,EAAE,IAAI;EACjB,cAAc,EAAE,SAAS;EACzB,KAAK,EDbA,OAAO;;ACgBd,EAAG;EACD,SAAS,EAAE,IAAI;EACf,UAAU,EAAE,MAAM;EAClB,WAAW,EAAE,GAAG;EAChB,WAAW,EAAE,IAAI;;AAGnB,EAAG;EACD,WAAW,EAAE,GAAG;;AAGlB,IAAK;EACH,MAAM,EAAC,IAAI;EACX,WAAW,EAAE,MAAM;EACnB,OAAO,EAAE,QAAQ;EACjB,KAAK,EAAC,KAAK;EACX,UAAU,EDhCL,OAAO;ECiCZ,aAAa,EAAE,IAAI;EACnB,SAAS,EAAE,QAAQ;EACnB,WAAW,EAAE,GAAG;EAChB,MAAM,EAAE,OAAO;EACf,UAAU,EAAE,qBAAqB;EACjC,UAAQ;IACN,OAAO,EAAE,GAAG;EAEd,aAAW;IACT,MAAM,EAAC,OAAO;IACd,OAAO,EAAC,GAAG;;AAMf,MAAO;EACL,UAAU,ED5CJ,OAAO;EC6Cb,OAAO,EAAE,SAAS;EAClB,aAAa,EAAE,IAAI;EACnB,SAAS,EAAC,KAAK;EACf,kBAAY;IACV,QAAQ,EAAC,QAAQ;IACjB,GAAG,EAAE,KAAK;IACV,IAAI,EAAC,CAAC;IACN,KAAK,EAAC,CAAC;IACP,OAAO,EAAC,KAAK;IACb,MAAM,EAAC,IAAI;IACX,UAAU,EDvDN,OAAO;ICwDX,OAAO,EAAC,SAAS;IACjB,KAAK,EAAE,KAAK;IACZ,aAAa,EAAE,IAAI;IACnB,UAAU,EAAE,MAAM;;AAKtB,KAAM;EACJ,UAAU,EDpEL,OAAO;ECqEZ,MAAM,EAAC,GAAG;EACV,KAAK,EAAC,KAAK;EACX,MAAM,EAAE,IAAI;;AAGd,QAAS;EACP,OAAO,EAAC,KAAK;EACb,UAAU,EAAE,KAAK;EACjB,SAAS,EAAC,IAAI;EACd,eAAe,EAAE,IAAI;EACrB,KAAK,EDlFA,OAAO;ECmFZ,cAAc,EAAE,SAAS;;AAG3B,MAAO;EACL,QAAQ,EAAC,QAAQ;EACjB,KAAK,EDvFD,OAAO;ECwFX,aAAa,EAAC,IAAI;EAClB,oBAAgB;IACd,KAAK,EDnFD,OAAO;ECqFb,UAAI;IACF,QAAQ,EAAC,QAAQ;IACjB,GAAG,EAAC,OAAO;IACX,KAAK,EAAC,MAAM;EAEd,QAAE;IACA,QAAQ,EAAE,QAAQ;IAClB,OAAO,EAAE,IAAI;IACb,cAAc,EAAE,MAAM;IACtB,eAAe,EAAE,MAAM;IACvB,WAAW,EAAE,MAAM;IACnB,MAAM,EAAC,IAAI;IACX,IAAI,EAAC,IAAI;IACT,GAAG,EAAE,CAAC;IACN,MAAM,EAAC,CAAC;IACR,cAAc,EAAE,SAAS;;AAI7B,aAAc;EACZ,UAAU,EAAC,KAAK;EAChB,MAAM,EAAE,iBAAsB;EAC9B,UAAU,EAAE,UAAU;EACtB,aAAa,EAAE,GAAG;EAClB,kBAAK;IACH,UAAU,EAAC,MAAM;IACjB,UAAU,ED/GN,OAAO;ICgHX,aAAa,EAAE,GAAG;;ACxHtB,cAAe;EACb,QAAQ,EAAC,QAAQ;EACjB,WAAW,EAAC,IAAI;EAChB,aAAa,EAAE,iBAAe;EAC9B,cAAc,EAAC,OAAO;EACtB,kCAAoB;IAClB,QAAQ,EAAC,QAAQ;IACjB,IAAI,EAAC,KAAK;IACV,GAAG,EAAC,CAAC;IACL,KAAK,EAAC,IAAI;IACV,MAAM,EAAC,IAAI;EAEb,mCAAqB;IACnB,WAAW,EAAE,GAAG;IAChB,SAAS,EAAE,QAAQ;IACnB,WAAW,EAAE,IAAI;EAEnB,kCAAoB;IAClB,WAAW,EAAE,MAAM;IACnB,SAAS,EAAE,QAAQ;IACnB,WAAW,EAAE,OAAO;IACpB,cAAc,EAAE,SAAS;EAE3B,sCAAwB;IACtB,QAAQ,EAAC,QAAQ;IACjB,KAAK,EAAC,CAAC;IACP,GAAG,EAAC,IAAI;IACR,SAAS,EAAE,OAAO;IAClB,WAAW,EAAE,QAAQ;IACrB,cAAc,EAAE,SAAS;IACzB,KAAK,EF9BF,OAAO;IE+BV,eAAe,EAAE,IAAI;;AAIzB,UAAW;EACT,UAAU,EAAC,KAAK;EAChB,KAAK,EAAC,IAAI;EACV,YAAY,EAAC,IAAI;EACjB,QAAQ,EAAC,QAAQ;EACjB,0BAAgB;IACd,WAAW,EAAC,OAAO;IACnB,0CAAgB;MACd,KAAK,EFvCC,OAAO;MEwCb,WAAW,EAAC,IAAI",
"sources": ["slovenscina-theme.scss","slovenscina-elements.scss","contracts.scss"],
"names": [],
"file": "contracts.css"
}

View File

@ -1,51 +0,0 @@
@import "slovenscina-elements.scss";
.contract-item {
position:relative;
margin-left:3rem;
border-bottom: 1px solid $grey;
padding-bottom:1.25rem;
.contract-item-icon {
position:absolute;
left:-3rem;
top:0;
width:2rem;
height:2rem;
}
.contract-item-title {
font-weight: 500;
font-size: 0.875rem;
line-height: 1rem;
}
.contract-item-date {
font-weight: normal;
font-size: 0.625rem;
line-height: 0.75rem;
text-transform: uppercase;
}
.contract-item-download {
position:absolute;
right:0;
top:1rem;
font-size: 0.75rem;
line-height: 0.825rem;
text-transform: uppercase;
color:$blue;
text-decoration: none;
}
}
.team-item {
background:white;
width:100%;
padding-left:1rem;
position:relative;
.team-item-name {
line-height:3.25rem;
.team-item-role {
color:$grey-dark;
margin-left:1rem;
}
}
}

View File

@ -1,212 +0,0 @@
@import url(https://fonts.googleapis.com/css?family=Roboto:400,400italic,500,500italic,700,700italic,900,900italic,300italic,300,100italic,100);
html {
font-family: 'Roboto', sans-serif;
font-size: 16px;
color: #46535B; }
body {
font-size: 16px;
padding: 0;
margin: 0; }
h1 {
font-size: 30px;
font-style: normal;
font-weight: 300;
line-height: 35px;
color: #006CB7; }
h2 {
font-size: 18px;
font-style: normal;
font-weight: 300;
line-height: 21px;
text-transform: uppercase;
color: #006CB7; }
h3 {
font-size: 18px;
font-style: normal;
font-weight: 300;
line-height: 21px; }
em {
font-weight: 300; }
.btn {
border: none;
line-height: 2.5rem;
padding: 0 2.5rem;
color: white;
background: #006CB7;
border-radius: 20px;
font-size: 1.125rem;
font-weight: 400;
cursor: pointer;
transition: opacity 0.3s ease-out; }
.btn:hover {
opacity: 0.8; }
.btn:disabled {
cursor: default;
opacity: 0.5; }
.panel {
background: #F5F5F5;
padding: 40px 60px;
border-radius: 20px;
max-width: 30rem; }
.panel .panel-logo {
position: absolute;
top: -60px;
left: 0;
right: 0;
display: block;
margin: auto;
background: #F5F5F5;
padding: 20px 30px;
width: 100px;
border-radius: 100%;
text-align: center; }
.line {
background: #C4C4C4;
height: 2px;
width: 200px;
margin: auto; }
.a-right {
display: block;
text-align: right;
font-size: 10px;
text-decoration: none;
color: #006CB7;
text-transform: uppercase; }
.alert {
position: relative;
color: #8D3D3D;
margin-bottom: 2rem; }
.alert.alert-success {
color: #88B52F; }
.alert img {
position: relative;
top: 0.25rem;
width: 1.8rem; }
.alert p {
position: absolute;
display: flex;
flex-direction: column;
justify-content: center;
align-items: center;
height: 2rem;
left: 3rem;
top: 0;
margin: 0;
text-transform: uppercase; }
.submit-alert {
background: white;
border: 2px solid #B7DB70;
box-sizing: border-box;
border-radius: 8px; }
.submit-alert .btn {
margin-top: 0.5rem;
background: #88B52F;
border-radius: 4px; }
.form-wrapper {
margin-bottom: 1rem; }
.form-wrapper label {
display: block;
font-weight: normal;
font-size: 0.75rem;
line-height: 0.875rem;
text-transform: uppercase; }
.form-wrapper select {
display: block;
background: #FFFFFF;
border: 1px solid #B6BEC3;
padding: 0.75rem 1rem;
width: 100%; }
.form-wrapper input[type="text"] {
box-sizing: border-box;
display: block;
background: #FFFFFF;
border: 1px solid #B6BEC3;
padding: 0.75rem 1rem;
width: 100%; }
.form-wrapper input[type="radio"] {
float: left;
margin: 0;
margin-right: 0.5rem; }
.form-wrapper .dropzone {
box-sizing: border-box;
padding: 0.5rem;
height: 4.5rem;
background: #E0E6EA; }
.form-wrapper .dropzone .dz-default.dz-message {
box-sizing: border-box;
display: block;
height: 3.5rem;
text-align: center;
border: 2px dashed white; }
.form-wrapper .dropzone .dz-default.dz-message span {
display: inline-block;
background: #006CB7;
border-radius: 6px;
color: white;
padding: 0.5rem 0.75rem;
margin-top: 0.5rem;
cursor: pointer; }
.form-wrapper .dz-preview.dz-file-preview {
position: relative;
background: white;
height: 4.5rem;
margin-top: 1rem; }
.form-wrapper .dz-preview.dz-file-preview .dz-image {
position: absolute;
left: 1rem;
top: 1rem;
background: url(/static/image/file.svg);
background-repeat: no-repeat;
background-position: center;
width: 2rem;
height: 2rem; }
.form-wrapper .dz-preview.dz-file-preview .dz-image img {
display: none; }
.form-wrapper .dz-preview.dz-file-preview .dz-details .dz-filename {
position: absolute;
top: 1.5rem;
left: 4rem;
width: 50%;
white-space: nowrap;
overflow: hidden;
text-overflow: ellipsis; }
.form-wrapper .dz-preview.dz-file-preview .dz-details .dz-size {
position: absolute;
top: 1.5rem;
right: 2.5rem; }
.form-wrapper .dz-preview.dz-file-preview .dz-success-mark, .form-wrapper .dz-preview.dz-file-preview .dz-error-mark {
display: none; }
.form-wrapper .dz-preview.dz-file-preview .dz-progress {
position: absolute;
left: 50%;
top: 1.5rem;
width: 28%;
border-radius: 10px;
overflow: hidden; }
.form-wrapper .dz-preview.dz-file-preview .dz-progress .dz-upload {
height: 20px;
display: inline-block;
background: #006CB7; }
.form-wrapper .dz-preview.dz-file-preview .dz-remove {
position: absolute;
top: 1.5rem;
right: 1rem;
width: 1rem;
height: 1rem;
background: url(/static/image/trash.svg);
background-repeat: no-repeat;
background-position: center; }
/*# sourceMappingURL=form.css.map */

View File

@ -1,7 +0,0 @@
{
"version": 3,
"mappings": "AAAQ,+IAAuI;AAa/I,IAAK;EACH,WAAW,EAAE,oBAAoB;EACjC,SAAS,EAAC,IAAI;EACd,KAAK,EAZC,OAAO;;AAef,IAAK;EACH,SAAS,EAAC,IAAI;EACd,OAAO,EAAC,CAAC;EACT,MAAM,EAAC,CAAC;;ACpBV,EAAG;EACD,SAAS,EAAE,IAAI;EACf,UAAU,EAAE,MAAM;EAClB,WAAW,EAAE,GAAG;EAChB,WAAW,EAAE,IAAI;EACjB,KAAK,EDLA,OAAO;;ACOd,EAAG;EACD,SAAS,EAAE,IAAI;EACf,UAAU,EAAE,MAAM;EAClB,WAAW,EAAE,GAAG;EAChB,WAAW,EAAE,IAAI;EACjB,cAAc,EAAE,SAAS;EACzB,KAAK,EDbA,OAAO;;ACgBd,EAAG;EACD,SAAS,EAAE,IAAI;EACf,UAAU,EAAE,MAAM;EAClB,WAAW,EAAE,GAAG;EAChB,WAAW,EAAE,IAAI;;AAGnB,EAAG;EACD,WAAW,EAAE,GAAG;;AAGlB,IAAK;EACH,MAAM,EAAC,IAAI;EACX,WAAW,EAAE,MAAM;EACnB,OAAO,EAAE,QAAQ;EACjB,KAAK,EAAC,KAAK;EACX,UAAU,EDhCL,OAAO;ECiCZ,aAAa,EAAE,IAAI;EACnB,SAAS,EAAE,QAAQ;EACnB,WAAW,EAAE,GAAG;EAChB,MAAM,EAAE,OAAO;EACf,UAAU,EAAE,qBAAqB;EACjC,UAAQ;IACN,OAAO,EAAE,GAAG;EAEd,aAAW;IACT,MAAM,EAAC,OAAO;IACd,OAAO,EAAC,GAAG;;AAMf,MAAO;EACL,UAAU,ED5CJ,OAAO;EC6Cb,OAAO,EAAE,SAAS;EAClB,aAAa,EAAE,IAAI;EACnB,SAAS,EAAC,KAAK;EACf,kBAAY;IACV,QAAQ,EAAC,QAAQ;IACjB,GAAG,EAAE,KAAK;IACV,IAAI,EAAC,CAAC;IACN,KAAK,EAAC,CAAC;IACP,OAAO,EAAC,KAAK;IACb,MAAM,EAAC,IAAI;IACX,UAAU,EDvDN,OAAO;ICwDX,OAAO,EAAC,SAAS;IACjB,KAAK,EAAE,KAAK;IACZ,aAAa,EAAE,IAAI;IACnB,UAAU,EAAE,MAAM;;AAKtB,KAAM;EACJ,UAAU,EDpEL,OAAO;ECqEZ,MAAM,EAAC,GAAG;EACV,KAAK,EAAC,KAAK;EACX,MAAM,EAAE,IAAI;;AAGd,QAAS;EACP,OAAO,EAAC,KAAK;EACb,UAAU,EAAE,KAAK;EACjB,SAAS,EAAC,IAAI;EACd,eAAe,EAAE,IAAI;EACrB,KAAK,EDlFA,OAAO;ECmFZ,cAAc,EAAE,SAAS;;AAG3B,MAAO;EACL,QAAQ,EAAC,QAAQ;EACjB,KAAK,EDvFD,OAAO;ECwFX,aAAa,EAAC,IAAI;EAClB,oBAAgB;IACd,KAAK,EDnFD,OAAO;ECqFb,UAAI;IACF,QAAQ,EAAC,QAAQ;IACjB,GAAG,EAAC,OAAO;IACX,KAAK,EAAC,MAAM;EAEd,QAAE;IACA,QAAQ,EAAE,QAAQ;IAClB,OAAO,EAAE,IAAI;IACb,cAAc,EAAE,MAAM;IACtB,eAAe,EAAE,MAAM;IACvB,WAAW,EAAE,MAAM;IACnB,MAAM,EAAC,IAAI;IACX,IAAI,EAAC,IAAI;IACT,GAAG,EAAE,CAAC;IACN,MAAM,EAAC,CAAC;IACR,cAAc,EAAE,SAAS;;AAI7B,aAAc;EACZ,UAAU,EAAC,KAAK;EAChB,MAAM,EAAE,iBAAsB;EAC9B,UAAU,EAAE,UAAU;EACtB,aAAa,EAAE,GAAG;EAClB,kBAAK;IACH,UAAU,EAAC,MAAM;IACjB,UAAU,ED/GN,OAAO;ICgHX,aAAa,EAAE,GAAG;;ACxHtB,aAAc;EACZ,aAAa,EAAC,IAAI;EAClB,mBAAM;IACJ,OAAO,EAAC,KAAK;IACb,WAAW,EAAE,MAAM;IACnB,SAAS,EAAE,OAAO;IAClB,WAAW,EAAE,QAAQ;IACrB,cAAc,EAAE,SAAS;EAE3B,oBAAO;IACL,OAAO,EAAC,KAAK;IACb,UAAU,EAAE,OAAO;IACnB,MAAM,EAAE,iBAAsB;IAC9B,OAAO,EAAE,YAAY;IACrB,KAAK,EAAC,IAAI;EAEZ,gCAAmB;IACjB,UAAU,EAAE,UAAU;IACtB,OAAO,EAAC,KAAK;IACb,UAAU,EAAE,OAAO;IACnB,MAAM,EAAE,iBAAsB;IAC9B,OAAO,EAAE,YAAY;IACrB,KAAK,EAAC,IAAI;EAEZ,iCAAoB;IAClB,KAAK,EAAC,IAAI;IACV,MAAM,EAAC,CAAC;IACR,YAAY,EAAC,MAAM;EAErB,uBAAU;IACR,UAAU,EAAE,UAAU;IACtB,OAAO,EAAC,MAAM;IACd,MAAM,EAAC,MAAM;IACb,UAAU,EAAC,OAAO;IAClB,8CAAuB;MACrB,UAAU,EAAE,UAAU;MACtB,OAAO,EAAE,KAAK;MACd,MAAM,EAAC,MAAM;MACb,UAAU,EAAE,MAAM;MAClB,MAAM,EAAC,gBAAgB;MACvB,mDAAK;QACH,OAAO,EAAE,YAAY;QACrB,UAAU,EF1CX,OAAO;QE2CN,aAAa,EAAE,GAAG;QAClB,KAAK,EAAC,KAAK;QACX,OAAO,EAAE,cAAc;QACvB,UAAU,EAAC,MAAM;QACjB,MAAM,EAAE,OAAO;EAIrB,yCAA4B;IAC1B,QAAQ,EAAC,QAAQ;IACjB,UAAU,EAAC,KAAK;IAChB,MAAM,EAAC,MAAM;IACb,UAAU,EAAC,IAAI;IACf,mDAAU;MACR,QAAQ,EAAC,QAAQ;MACjB,IAAI,EAAC,IAAI;MACT,GAAG,EAAC,IAAI;MACR,UAAU,EAAE,2BAA2B;MACvC,iBAAiB,EAAE,SAAS;MAC5B,mBAAmB,EAAE,MAAM;MAC3B,KAAK,EAAC,IAAI;MACV,MAAM,EAAC,IAAI;MACX,uDAAI;QACF,OAAO,EAAE,IAAI;IAIf,kEAAa;MACX,QAAQ,EAAC,QAAQ;MACjB,GAAG,EAAC,MAAM;MACV,IAAI,EAAC,IAAI;MACT,KAAK,EAAC,GAAG;MACT,WAAW,EAAE,MAAM;MACnB,QAAQ,EAAE,MAAM;MAChB,aAAa,EAAE,QAAQ;IAEzB,8DAAS;MACP,QAAQ,EAAC,QAAQ;MACjB,GAAG,EAAC,MAAM;MACV,KAAK,EAAC,MAAM;IAIhB,oHAAgC;MAAC,OAAO,EAAC,IAAI;IAC7C,sDAAa;MACX,QAAQ,EAAC,QAAQ;MACjB,IAAI,EAAC,GAAG;MACR,GAAG,EAAE,MAAM;MACX,KAAK,EAAC,GAAG;MACT,aAAa,EAAE,IAAI;MACnB,QAAQ,EAAE,MAAM;MAChB,iEAAW;QACT,MAAM,EAAE,IAAI;QACZ,OAAO,EAAE,YAAY;QACrB,UAAU,EFjGX,OAAO;IEoGV,oDAAW;MACT,QAAQ,EAAC,QAAQ;MACjB,GAAG,EAAC,MAAM;MACV,KAAK,EAAC,IAAI;MACV,KAAK,EAAC,IAAI;MACV,MAAM,EAAC,IAAI;MACX,UAAU,EAAE,4BAA4B;MACxC,iBAAiB,EAAE,SAAS;MAC5B,mBAAmB,EAAE,MAAM",
"sources": ["slovenscina-theme.scss","slovenscina-elements.scss","form.scss"],
"names": [],
"file": "form.css"
}

View File

@ -1,114 +0,0 @@
@import "slovenscina-elements.scss";
.form-wrapper {
margin-bottom:1rem;
label {
display:block;
font-weight: normal;
font-size: 0.75rem;
line-height: 0.875rem;
text-transform: uppercase;
}
select {
display:block;
background: #FFFFFF;
border: 1px solid $grey-border;
padding: 0.75rem 1rem;
width:100%;
}
input[type="text"] {
box-sizing: border-box;
display:block;
background: #FFFFFF;
border: 1px solid $grey-border;
padding: 0.75rem 1rem;
width:100%;
}
input[type="radio"] {
float:left;
margin:0;
margin-right:0.5rem;
}
.dropzone {
box-sizing: border-box;
padding:0.5rem;
height:4.5rem;
background:#E0E6EA;
.dz-default.dz-message {
box-sizing: border-box;
display: block;
height:3.5rem;
text-align: center;
border:2px dashed white;
span {
display: inline-block;
background: $blue;
border-radius: 6px;
color:white;
padding: 0.5rem 0.75rem;
margin-top:0.5rem;
cursor: pointer;
}
}
}
.dz-preview.dz-file-preview {
position:relative;
background:white;
height:4.5rem;
margin-top:1rem;
.dz-image {
position:absolute;
left:1rem;
top:1rem;
background: url(/static/image/file.svg);
background-repeat: no-repeat;
background-position: center;
width:2rem;
height:2rem;
img {
display: none;
}
}
.dz-details {
.dz-filename {
position:absolute;
top:1.5rem;
left:4rem;
width:50%;
white-space: nowrap;
overflow: hidden;
text-overflow: ellipsis;
}
.dz-size {
position:absolute;
top:1.5rem;
right:2.5rem;
}
}
.dz-success-mark,.dz-error-mark {display:none;}
.dz-progress {
position:absolute;
left:50%;
top: 1.5rem;
width:28%;
border-radius: 10px;
overflow: hidden;
.dz-upload {
height: 20px;
display: inline-block;
background:$blue;
}
}
.dz-remove {
position:absolute;
top:1.5rem;
right:1rem;
width:1rem;
height:1rem;
background: url(/static/image/trash.svg);
background-repeat: no-repeat;
background-position: center;
}
}
}

View File

@ -1,225 +0,0 @@
@import url(https://fonts.googleapis.com/css?family=Roboto:400,400italic,500,500italic,700,700italic,900,900italic,300italic,300,100italic,100);
html {
font-family: 'Roboto', sans-serif;
font-size: 16px;
color: #46535B; }
body {
font-size: 16px;
padding: 0;
margin: 0; }
h1 {
font-size: 30px;
font-style: normal;
font-weight: 300;
line-height: 35px;
color: #006CB7; }
h2 {
font-size: 18px;
font-style: normal;
font-weight: 300;
line-height: 21px;
text-transform: uppercase;
color: #006CB7; }
h3 {
font-size: 18px;
font-style: normal;
font-weight: 300;
line-height: 21px; }
em {
font-weight: 300; }
.btn {
border: none;
line-height: 2.5rem;
padding: 0 2.5rem;
color: white;
background: #006CB7;
border-radius: 20px;
font-size: 1.125rem;
font-weight: 400;
cursor: pointer;
transition: opacity 0.3s ease-out; }
.btn:hover {
opacity: 0.8; }
.btn:disabled {
cursor: default;
opacity: 0.5; }
.panel {
background: #F5F5F5;
padding: 40px 60px;
border-radius: 20px;
max-width: 30rem; }
.panel .panel-logo {
position: absolute;
top: -60px;
left: 0;
right: 0;
display: block;
margin: auto;
background: #F5F5F5;
padding: 20px 30px;
width: 100px;
border-radius: 100%;
text-align: center; }
.line {
background: #C4C4C4;
height: 2px;
width: 200px;
margin: auto; }
.a-right {
display: block;
text-align: right;
font-size: 10px;
text-decoration: none;
color: #006CB7;
text-transform: uppercase; }
.alert {
position: relative;
color: #8D3D3D;
margin-bottom: 2rem; }
.alert.alert-success {
color: #88B52F; }
.alert img {
position: relative;
top: 0.25rem;
width: 1.8rem; }
.alert p {
position: absolute;
display: flex;
flex-direction: column;
justify-content: center;
align-items: center;
height: 2rem;
left: 3rem;
top: 0;
margin: 0;
text-transform: uppercase; }
.submit-alert {
background: white;
border: 2px solid #B7DB70;
box-sizing: border-box;
border-radius: 8px; }
.submit-alert .btn {
margin-top: 0.5rem;
background: #88B52F;
border-radius: 4px; }
body {
background: #F5F5F5; }
header {
position: fixed;
top: 0;
width: 100%;
height: 4rem;
background: #006CB7;
z-index: 1000000;
box-shadow: 0px 4px 40px rgba(0, 0, 0, 0.2); }
header .logo {
display: inline-block;
padding: 0.5rem 1.5rem; }
header .logo img {
height: 3rem; }
header .menu-items {
float: right;
padding: 1.5rem 1.5rem;
display: inline-block; }
header .menu-items a {
margin-left: 2rem;
display: inline-block;
color: white;
text-decoration: none; }
.tab-nav {
margin-top: 2rem;
border-bottom: 1px solid #848C90; }
.tab-nav a {
position: relative;
top: 1px;
display: inline-block;
font-weight: 500;
text-transform: uppercase;
font-size: 1.125rem;
padding: 0.25rem 2rem;
text-decoration: none;
color: #848C90;
transition: color 0.3s ease-out; }
.tab-nav a.active, .tab-nav a:hover {
color: #006CB7;
border-bottom: 4px solid #006CB7; }
h1.title {
font-weight: 300;
font-size: 1.5rem;
line-height: 1.75rem;
margin: 0;
color: #006CB7; }
p.subtitle {
font-size: 14px;
line-height: 150%;
margin-top: 0.5rem; }
/* Style The Dropdown Button */
.dropbtn {
color: white;
line-height: 4rem;
border: none;
cursor: pointer;
background: none;
padding: 0 1rem; }
.dropbtn img {
position: relative;
top: 0.75rem; }
/* The container <div> - needed to position the dropdown content */
.dropdown {
margin-right: 1rem;
float: right;
display: inline-block;
position: relative; }
/* Dropdown Content (Hidden by Default) */
.dropdown-content {
display: none;
position: absolute;
right: 0;
background-color: #f9f9f9;
min-width: 160px;
box-shadow: 0px 8px 16px 0px rgba(0, 0, 0, 0.2);
z-index: 1; }
/* Links inside the dropdown */
.dropdown-content a {
color: #848C90;
padding: 0.5rem 1rem;
text-decoration: none;
display: block; }
.dropdown-content a:hover {
background-color: #f1f1f1;
cursor: pointer; }
.dropdown-content hr {
margin-top: 0;
margin-bottom: 0;
border-top: 1px solid #B6BEC3; }
/* Show the dropdown menu on hover */
.dropdown:hover .dropdown-content {
display: block; }
/* Change the background color of the dropdown button when the dropdown content is shown */
.dropdown:hover .dropbtn {
background: rgba(0, 0, 0, 0.2); }
/*# sourceMappingURL=header.css.map */

View File

@ -1,7 +0,0 @@
{
"version": 3,
"mappings": "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",
"sources": ["slovenscina-theme.scss","slovenscina-elements.scss","header.scss"],
"names": [],
"file": "header.css"
}

View File

@ -1,134 +0,0 @@
@import "slovenscina-elements.scss";
body {
background: $white;
}
header {
position:fixed;
top:0;
width:100%;
height:4rem;
background:$blue;
z-index: 1000000;
box-shadow: 0px 4px 40px rgba(0, 0, 0, 0.2);
}
header {
.logo {
display: inline-block;
padding:0.5rem 1.5rem;
img {
height:3rem;
}
}
.menu-items {
float:right;
padding: 1.5rem 1.5rem;
display: inline-block;
a {
margin-left:2rem;
display: inline-block;
color:white;
text-decoration: none;
}
}
}
.tab-nav {
margin-top:2rem;
border-bottom:1px solid $grey-dark;
a {
position:relative;
top:1px;
display: inline-block;
font-weight: 500;
text-transform: uppercase;
font-size: 1.125rem;
padding: 0.25rem 2rem;
text-decoration: none;
color: $grey-dark;
transition: color 0.3s ease-out;
&.active,&:hover {
color:$blue;
border-bottom: 4px solid $blue;
}
}
}
h1.title {
font-weight: 300;
font-size: 1.5rem;
line-height: 1.75rem;
margin:0;
color: $blue;
}
p.subtitle {
font-size: 14px;
line-height: 150%;
margin-top:0.5rem;
}
/* Style The Dropdown Button */
.dropbtn {
color: white;
line-height:4rem;
border: none;
cursor: pointer;
background:none;
padding:0 1rem;
img {
position:relative;
top:0.75rem;
}
}
/* The container <div> - needed to position the dropdown content */
.dropdown {
margin-right:1rem;
float:right;
display: inline-block;
position:relative;
}
/* Dropdown Content (Hidden by Default) */
.dropdown-content {
display: none;
position: absolute;
right:0;
background-color: #f9f9f9;
min-width: 160px;
box-shadow: 0px 8px 16px 0px rgba(0,0,0,0.2);
z-index: 1;
}
/* Links inside the dropdown */
.dropdown-content {
a {
color: $grey-dark;
padding: 0.5rem 1rem;
text-decoration: none;
display: block;
&:hover {
background-color: #f1f1f1;
cursor:pointer;
}
}
hr {
margin-top:0;
margin-bottom:0;
border-top: 1px solid $grey-border;
}
}
/* Show the dropdown menu on hover */
.dropdown:hover .dropdown-content {
display: block;
}
/* Change the background color of the dropdown button when the dropdown content is shown */
.dropdown:hover .dropbtn {
background:rgba(0,0,0,0.2);
}

View File

@ -1,206 +0,0 @@
@import url(https://fonts.googleapis.com/css?family=Roboto:400,400italic,500,500italic,700,700italic,900,900italic,300italic,300,100italic,100);
html {
font-family: 'Roboto', sans-serif;
font-size: 16px;
color: #46535B; }
body {
font-size: 16px;
padding: 0;
margin: 0; }
h1 {
font-size: 30px;
font-style: normal;
font-weight: 300;
line-height: 35px;
color: #006CB7; }
h2 {
font-size: 18px;
font-style: normal;
font-weight: 300;
line-height: 21px;
text-transform: uppercase;
color: #006CB7; }
h3 {
font-size: 18px;
font-style: normal;
font-weight: 300;
line-height: 21px; }
em {
font-weight: 300; }
.btn {
border: none;
line-height: 2.5rem;
padding: 0 2.5rem;
color: white;
background: #006CB7;
border-radius: 20px;
font-size: 1.125rem;
font-weight: 400;
cursor: pointer;
transition: opacity 0.3s ease-out; }
.btn:hover {
opacity: 0.8; }
.btn:disabled {
cursor: default;
opacity: 0.5; }
.panel {
background: #F5F5F5;
padding: 40px 60px;
border-radius: 20px;
max-width: 30rem; }
.panel .panel-logo {
position: absolute;
top: -60px;
left: 0;
right: 0;
display: block;
margin: auto;
background: #F5F5F5;
padding: 20px 30px;
width: 100px;
border-radius: 100%;
text-align: center; }
.line {
background: #C4C4C4;
height: 2px;
width: 200px;
margin: auto; }
.a-right {
display: block;
text-align: right;
font-size: 10px;
text-decoration: none;
color: #006CB7;
text-transform: uppercase; }
.alert {
position: relative;
color: #8D3D3D;
margin-bottom: 2rem; }
.alert.alert-success {
color: #88B52F; }
.alert img {
position: relative;
top: 0.25rem;
width: 1.8rem; }
.alert p {
position: absolute;
display: flex;
flex-direction: column;
justify-content: center;
align-items: center;
height: 2rem;
left: 3rem;
top: 0;
margin: 0;
text-transform: uppercase; }
.submit-alert {
background: white;
border: 2px solid #B7DB70;
box-sizing: border-box;
border-radius: 8px; }
.submit-alert .btn {
margin-top: 0.5rem;
background: #88B52F;
border-radius: 4px; }
.history-item {
background: white;
min-height: 2.875rem;
max-height: 2.875rem;
padding: 1rem 1.5rem;
position: relative;
transition: max-height 1s ease-out;
cursor: pointer;
overflow: hidden; }
.history-item .history-item-chevron {
position: absolute;
bottom: 1rem;
right: 1rem; }
.history-item .history-item-date {
text-transform: uppercase;
display: inline-block;
color: #848C90;
line-height: 1rem;
font-weight: 400;
font-size: 0.875rem; }
.history-item .history-item-uploader {
display: inline-block;
padding-left: 1rem;
margin-left: 1rem;
border-left: 1px solid #848C90;
color: #848C90;
line-height: 1rem;
font-weight: 400;
font-size: 0.875rem; }
.history-item .history-item-filecount {
position: absolute;
top: 1rem;
right: 1rem;
color: #006CB7;
line-height: 1rem;
font-weight: 400;
font-size: 0.875rem; }
.history-item .history-item-desc {
position: absolute;
bottom: 1rem;
font-style: normal;
font-weight: normal;
font-size: 1rem;
line-height: 1.25rem;
color: #46535B; }
.history-item .history-item-desc-full {
display: none;
margin-top: 1rem; }
.history-item .history-item-files-full {
display: none; }
.history-item .history-item-files-full .file-item {
position: relative;
height: 3.125rem;
border-bottom: 1px solid #848C90; }
.history-item .history-item-files-full .file-item:last-child {
border-bottom: none; }
.history-item .history-item-files-full .file-item .file-icon {
position: absolute;
width: 1.5rem;
height: 1.5rem;
left: 0;
top: 1rem; }
.history-item .history-item-files-full .file-item .file-name {
position: absolute;
left: 3rem;
top: 1rem;
color: #46535B;
text-decoration: none;
cursor: pointer; }
.history-item .history-item-files-full .file-item .file-name:hover {
text-decoration: underline; }
.history-item.open {
max-height: 20rem; }
.history-item.open .history-item-date {
display: block; }
.history-item.open .history-item-uploader {
display: block;
padding-left: 0;
margin-left: 0;
border-left: none; }
.history-item.open .history-item-desc {
display: none; }
.history-item.open .history-item-desc-full {
display: block; }
.history-item.open .history-item-files-full {
display: block; }
.history-item.open .history-item-chevron {
transform: rotate(180deg); }
/*# sourceMappingURL=history.css.map */

View File

@ -1,7 +0,0 @@
{
"version": 3,
"mappings": "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",
"sources": ["slovenscina-theme.scss","slovenscina-elements.scss","history.scss"],
"names": [],
"file": "history.css"
}

View File

@ -1,108 +0,0 @@
@import "slovenscina-elements.scss";
.history-item {
background:white;
min-height:2.875rem;
max-height:2.875rem;
padding:1rem 1.5rem;
position:relative;
transition: max-height 1s ease-out;
cursor:pointer;
overflow:hidden;
.history-item-chevron {
position:absolute;
bottom:1rem;
right:1rem;
}
.history-item-date {
text-transform: uppercase;
display: inline-block;
color:$grey-dark;
line-height: 1rem;
font-weight: 400;
font-size:0.875rem;
}
.history-item-uploader {
display: inline-block;
padding-left:1rem;
margin-left:1rem;
border-left: 1px solid $grey-dark;
color:$grey-dark;
line-height: 1rem;
font-weight: 400;
font-size:0.875rem;
}
.history-item-filecount {
position:absolute;
top:1rem;
right:1rem;
color:$blue;
line-height: 1rem;
font-weight: 400;
font-size:0.875rem;
}
.history-item-desc {
position:absolute;
bottom:1rem;
font-style: normal;
font-weight: normal;
font-size: 1rem;
line-height: 1.25rem;
color:$black;
}
.history-item-desc-full {
display: none;
margin-top:1rem;
}
.history-item-files-full {
display: none;
.file-item {
position:relative;
height:3.125rem;
border-bottom: 1px solid $grey-dark;
&:last-child {
border-bottom:none;
}
.file-icon {
position:absolute;
width:1.5rem;
height:1.5rem;
left:0;
top:1rem;
}
.file-name {
position:absolute;
left:3rem;
top:1rem;
color:$black;
text-decoration: none;
cursor:pointer;
&:hover {
text-decoration: underline;
}
}
}
}
&.open {
max-height: 20rem;
.history-item-date {display:block;}
.history-item-uploader {
display:block;
padding-left:0;
margin-left:0;
border-left: none;
}
.history-item-desc {
display: none;
}
.history-item-desc-full {
display: block;
}
.history-item-files-full {
display: block;
}
.history-item-chevron {
transform:rotate(180deg);
}
}
}

View File

@ -1,198 +0,0 @@
@import url(https://fonts.googleapis.com/css?family=Roboto:400,400italic,500,500italic,700,700italic,900,900italic,300italic,300,100italic,100);
html {
font-family: 'Roboto', sans-serif;
font-size: 16px;
color: #46535B; }
body {
font-size: 16px;
padding: 0;
margin: 0; }
h1 {
font-size: 30px;
font-style: normal;
font-weight: 300;
line-height: 35px;
color: #006CB7; }
h2 {
font-size: 18px;
font-style: normal;
font-weight: 300;
line-height: 21px;
text-transform: uppercase;
color: #006CB7; }
h3 {
font-size: 18px;
font-style: normal;
font-weight: 300;
line-height: 21px; }
em {
font-weight: 300; }
.btn {
border: none;
line-height: 2.5rem;
padding: 0 2.5rem;
color: white;
background: #006CB7;
border-radius: 20px;
font-size: 1.125rem;
font-weight: 400;
cursor: pointer;
transition: opacity 0.3s ease-out; }
.btn:hover {
opacity: 0.8; }
.btn:disabled {
cursor: default;
opacity: 0.5; }
.panel {
background: #F5F5F5;
padding: 40px 60px;
border-radius: 20px;
max-width: 30rem; }
.panel .panel-logo {
position: absolute;
top: -60px;
left: 0;
right: 0;
display: block;
margin: auto;
background: #F5F5F5;
padding: 20px 30px;
width: 100px;
border-radius: 100%;
text-align: center; }
.line {
background: #C4C4C4;
height: 2px;
width: 200px;
margin: auto; }
.a-right {
display: block;
text-align: right;
font-size: 10px;
text-decoration: none;
color: #006CB7;
text-transform: uppercase; }
.alert {
position: relative;
color: #8D3D3D;
margin-bottom: 2rem; }
.alert.alert-success {
color: #88B52F; }
.alert img {
position: relative;
top: 0.25rem;
width: 1.8rem; }
.alert p {
position: absolute;
display: flex;
flex-direction: column;
justify-content: center;
align-items: center;
height: 2rem;
left: 3rem;
top: 0;
margin: 0;
text-transform: uppercase; }
.submit-alert {
background: white;
border: 2px solid #B7DB70;
box-sizing: border-box;
border-radius: 8px; }
.submit-alert .btn {
margin-top: 0.5rem;
background: #88B52F;
border-radius: 4px; }
.background {
background: #848C90;
-webkit-background-size: cover;
-moz-background-size: cover;
-o-background-size: cover;
background-size: cover;
overflow-y: scroll;
height: 200vh;
width: 100%; }
.login-panel {
position: absolute;
width: 50%;
left: 25%;
top: 100px;
box-shadow: 0 0 2.5rem 0 rgba(0, 0, 0, 0.25); }
.register-button {
position: relative;
margin-top: 2rem;
display: block;
text-decoration: none;
color: #848C90; }
.register-button img {
width: 2rem; }
.register-button h3 {
position: absolute;
left: 3rem;
top: 0;
margin: 0; }
.register-button p {
position: absolute;
left: 3rem;
bottom: 0;
margin: 0;
font-size: 0.875rem;
font-weight: 300; }
.input-wrapper {
position: relative;
height: 4rem; }
.input-wrapper .input-icon {
position: absolute;
left: 0;
top: 0.5rem;
display: block;
width: 1.5rem; }
.input-wrapper .input-floating-label {
position: absolute;
left: 3rem;
right: 0;
display: block; }
.input-wrapper .input-floating-label input, .input-wrapper .input-floating-label select {
padding: 0.25rem 0;
background: none;
border: none;
display: block;
width: 100%;
border-bottom: 2px solid #C4C4C4; }
.input-wrapper .input-floating-label input:focus, .input-wrapper .input-floating-label select:focus {
outline: none; }
.input-wrapper .input-floating-label label {
font-size: 10px;
color: #46535B; }
.input-wrapper .input-floating-label label.input-hint {
color: #848C90; }
.back-to-login {
position: relative;
height: 2rem; }
.back-to-login img {
position: absolute;
top: 0.25rem;
left: 0.5rem; }
.back-to-login a {
position: relative;
top: 0;
left: 3rem;
text-decoration: none;
color: #46535B; }
/*# sourceMappingURL=login-styles.css.map */

View File

@ -1,7 +0,0 @@
{
"version": 3,
"mappings": "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",
"sources": ["slovenscina-theme.scss","slovenscina-elements.scss","login-styles.scss"],
"names": [],
"file": "login-styles.css"
}

View File

@ -1,102 +0,0 @@
@import "slovenscina-elements.scss";
.background {
background: $grey-dark;
-webkit-background-size: cover;
-moz-background-size: cover;
-o-background-size: cover;
background-size: cover;
overflow-y: scroll;
height:200vh;
width:100%;
}
.login-panel {
position:absolute;
width:50%;
left:25%;
top: 100px;
box-shadow: 0 0 2.5rem 0 rgba(0,0,0,0.25);
}
.register-button {
position:relative;
margin-top:2rem;
display: block;
text-decoration: none;
color:$grey-dark;
img {
width:2rem;
}
h3 {
position:absolute;
left:3rem;
top:0;
margin:0;
}
p {
position:absolute;
left:3rem;
bottom:0;
margin:0;
font-size:0.875rem;
font-weight: 300;
}
}
.input-wrapper {
position:relative;
height:4rem;
.input-icon {
position:absolute;
left:0;
top:0.5rem;
display:block;
width:1.5rem;
}
.input-floating-label {
position:absolute;
left: 3rem;
right:0;
display:block;
input, select {
padding:0.25rem 0;
background: none;
border:none;
display:block;
width:100%;
border-bottom: 2px solid $grey;
&:focus {
outline: none;
}
}
label {
font-size: 10px;
color: $black;
}
label.input-hint {
color:$grey-dark;
}
}
}
.back-to-login {
position:relative;
height:2rem;
img {
position:absolute;
top:0.25rem;
left:0.5rem;
}
a {
position: relative;
top:0;
left:3rem;
text-decoration: none;
color:$black;
}
}

View File

@ -1,117 +0,0 @@
@import url(https://fonts.googleapis.com/css?family=Roboto:400,400italic,500,500italic,700,700italic,900,900italic,300italic,300,100italic,100);
html {
font-family: 'Roboto', sans-serif;
font-size: 16px;
color: #46535B; }
body {
font-size: 16px;
padding: 0;
margin: 0; }
h1 {
font-size: 30px;
font-style: normal;
font-weight: 300;
line-height: 35px;
color: #006CB7; }
h2 {
font-size: 18px;
font-style: normal;
font-weight: 300;
line-height: 21px;
text-transform: uppercase;
color: #006CB7; }
h3 {
font-size: 18px;
font-style: normal;
font-weight: 300;
line-height: 21px; }
em {
font-weight: 300; }
.btn {
border: none;
line-height: 2.5rem;
padding: 0 2.5rem;
color: white;
background: #006CB7;
border-radius: 20px;
font-size: 1.125rem;
font-weight: 400;
cursor: pointer;
transition: opacity 0.3s ease-out; }
.btn:hover {
opacity: 0.8; }
.btn:disabled {
cursor: default;
opacity: 0.5; }
.panel {
background: #F5F5F5;
padding: 40px 60px;
border-radius: 20px;
max-width: 30rem; }
.panel .panel-logo {
position: absolute;
top: -60px;
left: 0;
right: 0;
display: block;
margin: auto;
background: #F5F5F5;
padding: 20px 30px;
width: 100px;
border-radius: 100%;
text-align: center; }
.line {
background: #C4C4C4;
height: 2px;
width: 200px;
margin: auto; }
.a-right {
display: block;
text-align: right;
font-size: 10px;
text-decoration: none;
color: #006CB7;
text-transform: uppercase; }
.alert {
position: relative;
color: #8D3D3D;
margin-bottom: 2rem; }
.alert.alert-success {
color: #88B52F; }
.alert img {
position: relative;
top: 0.25rem;
width: 1.8rem; }
.alert p {
position: absolute;
display: flex;
flex-direction: column;
justify-content: center;
align-items: center;
height: 2rem;
left: 3rem;
top: 0;
margin: 0;
text-transform: uppercase; }
.submit-alert {
background: white;
border: 2px solid #B7DB70;
box-sizing: border-box;
border-radius: 8px; }
.submit-alert .btn {
margin-top: 0.5rem;
background: #88B52F;
border-radius: 4px; }
/*# sourceMappingURL=manage-institution.css.map */

View File

@ -1,7 +0,0 @@
{
"version": 3,
"mappings": "AAAQ,+IAAuI;AAa/I,IAAK;EACH,WAAW,EAAE,oBAAoB;EACjC,SAAS,EAAC,IAAI;EACd,KAAK,EAZC,OAAO;;AAef,IAAK;EACH,SAAS,EAAC,IAAI;EACd,OAAO,EAAC,CAAC;EACT,MAAM,EAAC,CAAC;;ACpBV,EAAG;EACD,SAAS,EAAE,IAAI;EACf,UAAU,EAAE,MAAM;EAClB,WAAW,EAAE,GAAG;EAChB,WAAW,EAAE,IAAI;EACjB,KAAK,EDLA,OAAO;;ACOd,EAAG;EACD,SAAS,EAAE,IAAI;EACf,UAAU,EAAE,MAAM;EAClB,WAAW,EAAE,GAAG;EAChB,WAAW,EAAE,IAAI;EACjB,cAAc,EAAE,SAAS;EACzB,KAAK,EDbA,OAAO;;ACgBd,EAAG;EACD,SAAS,EAAE,IAAI;EACf,UAAU,EAAE,MAAM;EAClB,WAAW,EAAE,GAAG;EAChB,WAAW,EAAE,IAAI;;AAGnB,EAAG;EACD,WAAW,EAAE,GAAG;;AAGlB,IAAK;EACH,MAAM,EAAC,IAAI;EACX,WAAW,EAAE,MAAM;EACnB,OAAO,EAAE,QAAQ;EACjB,KAAK,EAAC,KAAK;EACX,UAAU,EDhCL,OAAO;ECiCZ,aAAa,EAAE,IAAI;EACnB,SAAS,EAAE,QAAQ;EACnB,WAAW,EAAE,GAAG;EAChB,MAAM,EAAE,OAAO;EACf,UAAU,EAAE,qBAAqB;EACjC,UAAQ;IACN,OAAO,EAAE,GAAG;EAEd,aAAW;IACT,MAAM,EAAC,OAAO;IACd,OAAO,EAAC,GAAG;;AAMf,MAAO;EACL,UAAU,ED5CJ,OAAO;EC6Cb,OAAO,EAAE,SAAS;EAClB,aAAa,EAAE,IAAI;EACnB,SAAS,EAAC,KAAK;EACf,kBAAY;IACV,QAAQ,EAAC,QAAQ;IACjB,GAAG,EAAE,KAAK;IACV,IAAI,EAAC,CAAC;IACN,KAAK,EAAC,CAAC;IACP,OAAO,EAAC,KAAK;IACb,MAAM,EAAC,IAAI;IACX,UAAU,EDvDN,OAAO;ICwDX,OAAO,EAAC,SAAS;IACjB,KAAK,EAAE,KAAK;IACZ,aAAa,EAAE,IAAI;IACnB,UAAU,EAAE,MAAM;;AAKtB,KAAM;EACJ,UAAU,EDpEL,OAAO;ECqEZ,MAAM,EAAC,GAAG;EACV,KAAK,EAAC,KAAK;EACX,MAAM,EAAE,IAAI;;AAGd,QAAS;EACP,OAAO,EAAC,KAAK;EACb,UAAU,EAAE,KAAK;EACjB,SAAS,EAAC,IAAI;EACd,eAAe,EAAE,IAAI;EACrB,KAAK,EDlFA,OAAO;ECmFZ,cAAc,EAAE,SAAS;;AAG3B,MAAO;EACL,QAAQ,EAAC,QAAQ;EACjB,KAAK,EDvFD,OAAO;ECwFX,aAAa,EAAC,IAAI;EAClB,oBAAgB;IACd,KAAK,EDnFD,OAAO;ECqFb,UAAI;IACF,QAAQ,EAAC,QAAQ;IACjB,GAAG,EAAC,OAAO;IACX,KAAK,EAAC,MAAM;EAEd,QAAE;IACA,QAAQ,EAAE,QAAQ;IAClB,OAAO,EAAE,IAAI;IACb,cAAc,EAAE,MAAM;IACtB,eAAe,EAAE,MAAM;IACvB,WAAW,EAAE,MAAM;IACnB,MAAM,EAAC,IAAI;IACX,IAAI,EAAC,IAAI;IACT,GAAG,EAAE,CAAC;IACN,MAAM,EAAC,CAAC;IACR,cAAc,EAAE,SAAS;;AAI7B,aAAc;EACZ,UAAU,EAAC,KAAK;EAChB,MAAM,EAAE,iBAAsB;EAC9B,UAAU,EAAE,UAAU;EACtB,aAAa,EAAE,GAAG;EAClB,kBAAK;IACH,UAAU,EAAC,MAAM;IACjB,UAAU,ED/GN,OAAO;ICgHX,aAAa,EAAE,GAAG",
"sources": ["slovenscina-theme.scss","slovenscina-elements.scss"],
"names": [],
"file": "manage-institution.css"
}

View File

@ -1 +0,0 @@
@import "slovenscina-elements.scss";

View File

@ -1,120 +0,0 @@
.hidden-sm {
display: none; }
.container {
width: 90%;
margin-left: auto;
margin-right: auto; }
@media only screen and (min-width: 33.75em) {
.container {
width: 80%; } }
@media only screen and (min-width: 60em) {
.container {
width: 90%;
max-width: 80rem; } }
.row {
position: relative;
width: 100%; }
.row [class^="col"] {
float: left;
margin: 0.5rem 2%;
min-height: 0.125rem; }
.row::after {
content: "";
display: table;
clear: both; }
.col-1,
.col-2,
.col-3,
.col-4,
.col-5,
.col-6,
.col-7,
.col-8,
.col-9,
.col-10,
.col-11,
.col-12 {
width: 96%; }
.col-1-sm {
width: 4.3333333333%; }
.col-2-sm {
width: 12.6666666667%; }
.col-3-sm {
width: 21%; }
.col-4-sm {
width: 29.3333333333%; }
.col-5-sm {
width: 37.6666666667%; }
.col-6-sm {
width: 46%; }
.col-7-sm {
width: 54.3333333333%; }
.col-8-sm {
width: 62.6666666667%; }
.col-9-sm {
width: 71%; }
.col-10-sm {
width: 79.3333333333%; }
.col-11-sm {
width: 87.6666666667%; }
.col-12-sm {
width: 96%; }
@media only screen and (min-width: 45em) {
.col-1 {
width: 4.3333333333%; }
.col-2 {
width: 12.6666666667%; }
.col-3 {
width: 21%; }
.col-4 {
width: 29.3333333333%; }
.col-5 {
width: 37.6666666667%; }
.col-6 {
width: 46%; }
.col-7 {
width: 54.3333333333%; }
.col-8 {
width: 62.6666666667%; }
.col-9 {
width: 71%; }
.col-10 {
width: 79.3333333333%; }
.col-11 {
width: 87.6666666667%; }
.col-12 {
width: 96%; }
.hidden-sm {
display: block; } }
/*# sourceMappingURL=simple-grid.css.map */

View File

@ -1,7 +0,0 @@
{
"version": 3,
"mappings": "AACA,UAAW;EACT,OAAO,EAAE,IAAI;;AAWf,UAAW;EACT,KAAK,EAAE,GAAG;EACV,WAAW,EAAE,IAAI;EACjB,YAAY,EAAE,IAAI;EAElB,2CAAsD;IALxD,UAAW;MAMP,KAAK,EAAE,GAAG;EAGZ,wCAAsD;IATxD,UAAW;MAUP,KAAK,EAAE,GAAG;MACV,SAAS,EAAE,KAAK;;AAIpB,IAAK;EACH,QAAQ,EAAE,QAAQ;EAClB,KAAK,EAAE,IAAI;;AAGb,mBAAoB;EAClB,KAAK,EAAE,IAAI;EACX,MAAM,EAAE,SAAS;EACjB,UAAU,EAAE,QAAQ;;AAGtB,WAAY;EACV,OAAO,EAAE,EAAE;EACX,OAAO,EAAE,KAAK;EACd,KAAK,EAAE,IAAI;;AAGb;;;;;;;;;;;OAWQ;EACN,KAAK,EAlDC,GAAG;;AAqDX,SAAU;EAAE,KAAK,EAAC,aAAmC;;AACrD,SAAU;EAAE,KAAK,EAAE,cAAkC;;AACrD,SAAU;EAAE,KAAK,EAAE,GAAiC;;AACpD,SAAU;EAAE,KAAK,EAAE,cAAiC;;AACpD,SAAU;EAAE,KAAK,EAAE,cAAwC;;AAC3D,SAAU;EAAE,KAAK,EAAE,GAAiC;;AACpD,SAAU;EAAE,KAAK,EAAE,cAAwC;;AAC3D,SAAU;EAAE,KAAK,EAAE,cAAwC;;AAC3D,SAAU;EAAE,KAAK,EAAE,GAAwC;;AAC3D,UAAW;EAAE,KAAK,EAAE,cAAyC;;AAC7D,UAAW;EAAE,KAAK,EAAE,cAAyC;;AAC7D,UAAW;EAAE,KAAK,EAhEV,GAAG;;AAkEX,wCAAoD;EAClD,MAAO;IAAE,KAAK,EAAC,aAAmC;;EAClD,MAAO;IAAE,KAAK,EAAE,cAAkC;;EAClD,MAAO;IAAE,KAAK,EAAE,GAAiC;;EACjD,MAAO;IAAE,KAAK,EAAE,cAAiC;;EACjD,MAAO;IAAE,KAAK,EAAE,cAAwC;;EACxD,MAAO;IAAE,KAAK,EAAE,GAAiC;;EACjD,MAAO;IAAE,KAAK,EAAE,cAAwC;;EACxD,MAAO;IAAE,KAAK,EAAE,cAAwC;;EACxD,MAAO;IAAE,KAAK,EAAE,GAAwC;;EACxD,OAAQ;IAAE,KAAK,EAAE,cAAyC;;EAC1D,OAAQ;IAAE,KAAK,EAAE,cAAyC;;EAC1D,OAAQ;IAAE,KAAK,EA9ET,GAAG;;EAgFT,UAAW;IACT,OAAO,EAAE,KAAK",
"sources": ["simple-grid.scss"],
"names": [],
"file": "simple-grid.css"
}

View File

@ -1,91 +0,0 @@
.hidden-sm {
display: none;
}
// grid
$width: 96%;
$gutter: 4%;
$breakpoint-small: 33.75em; // 540px
$breakpoint-med: 45em; // 720px
$breakpoint-large: 60em; // 960px
.container {
width: 90%;
margin-left: auto;
margin-right: auto;
@media only screen and (min-width: $breakpoint-small) {
width: 80%;
}
@media only screen and (min-width: $breakpoint-large) {
width: 90%;
max-width: 80rem;
}
}
.row {
position: relative;
width: 100%;
}
.row [class^="col"] {
float: left;
margin: 0.5rem 2%;
min-height: 0.125rem;
}
.row::after {
content: "";
display: table;
clear: both;
}
.col-1,
.col-2,
.col-3,
.col-4,
.col-5,
.col-6,
.col-7,
.col-8,
.col-9,
.col-10,
.col-11,
.col-12 {
width: $width;
}
.col-1-sm { width:($width / 12) - ($gutter * 11 / 12); }
.col-2-sm { width: ($width / 6) - ($gutter * 10 / 12); }
.col-3-sm { width: ($width / 4) - ($gutter * 9 / 12); }
.col-4-sm { width: ($width / 3) - ($gutter * 8 / 12); }
.col-5-sm { width: ($width / (12 / 5)) - ($gutter * 7 / 12); }
.col-6-sm { width: ($width / 2) - ($gutter * 6 / 12); }
.col-7-sm { width: ($width / (12 / 7)) - ($gutter * 5 / 12); }
.col-8-sm { width: ($width / (12 / 8)) - ($gutter * 4 / 12); }
.col-9-sm { width: ($width / (12 / 9)) - ($gutter * 3 / 12); }
.col-10-sm { width: ($width / (12 / 10)) - ($gutter * 2 / 12); }
.col-11-sm { width: ($width / (12 / 11)) - ($gutter * 1 / 12); }
.col-12-sm { width: $width; }
@media only screen and (min-width: $breakpoint-med) {
.col-1 { width:($width / 12) - ($gutter * 11 / 12); }
.col-2 { width: ($width / 6) - ($gutter * 10 / 12); }
.col-3 { width: ($width / 4) - ($gutter * 9 / 12); }
.col-4 { width: ($width / 3) - ($gutter * 8 / 12); }
.col-5 { width: ($width / (12 / 5)) - ($gutter * 7 / 12); }
.col-6 { width: ($width / 2) - ($gutter * 6 / 12); }
.col-7 { width: ($width / (12 / 7)) - ($gutter * 5 / 12); }
.col-8 { width: ($width / (12 / 8)) - ($gutter * 4 / 12); }
.col-9 { width: ($width / (12 / 9)) - ($gutter * 3 / 12); }
.col-10 { width: ($width / (12 / 10)) - ($gutter * 2 / 12); }
.col-11 { width: ($width / (12 / 11)) - ($gutter * 1 / 12); }
.col-12 { width: $width; }
.hidden-sm {
display: block;
}
}

View File

@ -1,144 +0,0 @@
@import url(https://fonts.googleapis.com/css?family=Roboto:400,400italic,500,500italic,700,700italic,900,900italic,300italic,300,100italic,100);
html {
font-family: 'Roboto', sans-serif;
font-size: 16px;
color: #46535B; }
body {
font-size: 16px;
padding: 0;
margin: 0; }
h1 {
font-size: 30px;
font-style: normal;
font-weight: 300;
line-height: 35px;
color: #006CB7; }
h2 {
font-size: 18px;
font-style: normal;
font-weight: 300;
line-height: 21px;
text-transform: uppercase;
color: #006CB7; }
h3 {
font-size: 18px;
font-style: normal;
font-weight: 300;
line-height: 21px; }
em {
font-weight: 300; }
.btn {
border: none;
line-height: 2.5rem;
padding: 0 2.5rem;
color: white;
background: #006CB7;
border-radius: 20px;
font-size: 1.125rem;
font-weight: 400;
cursor: pointer;
transition: opacity 0.3s ease-out; }
.btn:hover {
opacity: 0.8; }
.btn:disabled {
cursor: default;
opacity: 0.5; }
.panel {
background: #F5F5F5;
padding: 40px 60px;
border-radius: 20px;
max-width: 30rem; }
.panel .panel-logo {
position: absolute;
top: -60px;
left: 0;
right: 0;
display: block;
margin: auto;
background: #F5F5F5;
padding: 20px 30px;
width: 100px;
border-radius: 100%;
text-align: center; }
.line {
background: #C4C4C4;
height: 2px;
width: 200px;
margin: auto; }
.a-right {
display: block;
text-align: right;
font-size: 10px;
text-decoration: none;
color: #006CB7;
text-transform: uppercase; }
.alert {
position: relative;
color: #8D3D3D;
margin-bottom: 2rem; }
.alert.alert-success {
color: #88B52F; }
.alert img {
position: relative;
top: 0.25rem;
width: 1.8rem; }
.alert p {
position: absolute;
display: flex;
flex-direction: column;
justify-content: center;
align-items: center;
height: 2rem;
left: 3rem;
top: 0;
margin: 0;
text-transform: uppercase; }
.submit-alert {
background: white;
border: 2px solid #B7DB70;
box-sizing: border-box;
border-radius: 8px; }
.submit-alert .btn {
margin-top: 0.5rem;
background: #88B52F;
border-radius: 4px; }
.tableFixHead {
overflow-y: scroll;
max-height: 306px; }
.tableFixHead thead th {
position: sticky;
top: 0; }
table {
border-collapse: collapse;
width: 100%; }
table th, table td {
padding: 8px 16px;
border: 1px solid #ccc; }
table th {
background: #eee; }
table input[type=submit], table a {
font-size: 0.8rem;
background: none;
outline: none;
border: none;
cursor: pointer;
text-decoration: none;
color: #006CB7; }
table input[type=submit]:hover, table a:hover {
text-decoration: underline; }
/*# sourceMappingURL=slovenscina-admin.css.map */

View File

@ -1,7 +0,0 @@
{
"version": 3,
"mappings": "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",
"sources": ["slovenscina-theme.scss","slovenscina-elements.scss","slovenscina-admin.scss"],
"names": [],
"file": "slovenscina-admin.css"
}

View File

@ -1,33 +0,0 @@
@import "slovenscina-elements.scss";
.tableFixHead {
overflow-y: scroll;
max-height: 306px;
}
.tableFixHead thead th {
position: sticky;
top: 0;
}
table {
border-collapse: collapse;
width: 100%;
th,td {
padding: 8px 16px;
border: 1px solid #ccc;
}
th {
background: #eee;
}
input[type=submit],a {
font-size: 0.8rem;
background:none;
outline:none;
border:none;
cursor:pointer;
text-decoration: none;
color:$blue;
&:hover {
text-decoration: underline;
}
}
}

View File

@ -1,8 +0,0 @@
html {
font-family: 'Roboto', sans-serif;
color: #46535B; }
.panel {
background: #F5F5F5; }
/*# sourceMappingURL=slovenscina-elments.css.map */

View File

@ -1,7 +0,0 @@
{
"version": 3,
"mappings": "AAMA,IAAK;EACH,WAAW,EAAE,oBAAoB;EACjC,KAAK,EANC,OAAO;;ACAf,MAAO;EACL,UAAU,EDCJ,OAAO",
"sources": ["slovenscina-theme.scss","slovenscina-elments.scss"],
"names": [],
"file": "slovenscina-elments.css"
}

View File

@ -1,125 +0,0 @@
@import "slovenscina-theme.scss";
h1 {
font-size: 30px;
font-style: normal;
font-weight: 300;
line-height: 35px;
color:$blue;
}
h2 {
font-size: 18px;
font-style: normal;
font-weight: 300;
line-height: 21px;
text-transform: uppercase;
color:$blue;
}
h3 {
font-size: 18px;
font-style: normal;
font-weight: 300;
line-height: 21px;
}
em {
font-weight: 300;
}
.btn {
border:none;
line-height: 2.5rem;
padding: 0 2.5rem;
color:white;
background: $blue;
border-radius: 20px;
font-size: 1.125rem;
font-weight: 400;
cursor: pointer;
transition: opacity 0.3s ease-out;
&:hover {
opacity: 0.8;
}
&:disabled {
cursor:default;
opacity:0.5;
}
}
.panel {
background: $white;
padding: 40px 60px;
border-radius: 20px;
max-width:30rem;
.panel-logo {
position:absolute;
top: -60px;
left:0;
right:0;
display:block;
margin:auto;
background: $white;
padding:20px 30px;
width: 100px;
border-radius: 100%;
text-align: center;
}
}
.line {
background: $grey;
height:2px;
width:200px;
margin: auto;
}
.a-right {
display:block;
text-align: right;
font-size:10px;
text-decoration: none;
color:$blue;
text-transform: uppercase;
}
.alert {
position:relative;
color:$red;
margin-bottom:2rem;
&.alert-success {
color:$green;
}
img {
position:relative;
top:0.25rem;
width:1.8rem;
}
p {
position: absolute;
display: flex;
flex-direction: column;
justify-content: center;
align-items: center;
height:2rem;
left:3rem;
top: 0;
margin:0;
text-transform: uppercase;
}
}
.submit-alert {
background:white;
border: 2px solid $green-light;
box-sizing: border-box;
border-radius: 8px;
.btn {
margin-top:0.5rem;
background: $green;
border-radius: 4px;
}
}

View File

@ -1,5 +0,0 @@
html {
font-family: 'Roboto', sans-serif;
color: #46535B; }
/*# sourceMappingURL=slovenscina-theme.css.map */

View File

@ -1,7 +0,0 @@
{
"version": 3,
"mappings": "AAMA,IAAK;EACH,WAAW,EAAE,oBAAoB;EACjC,KAAK,EANC,OAAO",
"sources": ["slovenscina-theme.scss"],
"names": [],
"file": "slovenscina-theme.css"
}

View File

@ -1,24 +0,0 @@
@import url(https://fonts.googleapis.com/css?family=Roboto:400,400italic,500,500italic,700,700italic,900,900italic,300italic,300,100italic,100);
$blue: #006CB7;
$red: #8D3D3D;
$black: #46535B;
$grey: #C4C4C4;
$grey-dark: #848C90;
$grey-border: #B6BEC3;
$white: #F5F5F5;
$green-light: #B7DB70;
$green: #88B52F;
html {
font-family: 'Roboto', sans-serif;
font-size:16px;
color: $black;
}
body {
font-size:16px;
padding:0;
margin:0;
}

View File

@ -1,105 +0,0 @@
@import url(https://fonts.googleapis.com/css?family=Roboto:400,400italic,500,500italic,700,700italic,900,900italic,300italic,300,100italic,100);
html {
font-family: 'Roboto', sans-serif;
font-size: 16px;
color: #46535B; }
body {
font-size: 16px;
padding: 0;
margin: 0; }
h1 {
font-size: 30px;
font-style: normal;
font-weight: 300;
line-height: 35px;
color: #006CB7; }
h2 {
font-size: 18px;
font-style: normal;
font-weight: 300;
line-height: 21px;
text-transform: uppercase;
color: #006CB7; }
h3 {
font-size: 18px;
font-style: normal;
font-weight: 300;
line-height: 21px; }
em {
font-weight: 300; }
.btn {
border: none;
line-height: 2.5rem;
padding: 0 2.5rem;
color: white;
background: #006CB7;
border-radius: 20px;
font-size: 1.125rem;
font-weight: 400;
cursor: pointer;
transition: opacity 0.3s ease-out; }
.btn:hover {
opacity: 0.8; }
.panel {
background: #F5F5F5;
padding: 40px 60px;
border-radius: 20px; }
.panel .panel-logo {
position: absolute;
top: -60px;
left: 0;
right: 0;
display: block;
margin: auto;
background: #F5F5F5;
padding: 20px 30px;
width: 100px;
border-radius: 100%;
text-align: center; }
.line {
background: #C4C4C4;
height: 2px;
width: 200px;
margin: auto; }
.a-right {
display: block;
text-align: right;
font-size: 10px;
text-decoration: none;
color: #006CB7;
text-transform: uppercase; }
.alert {
position: relative;
color: #8D3D3D; }
.alert img {
position: relative;
top: 0.25rem;
width: 1.8rem; }
.alert p {
position: absolute;
left: 3rem;
top: 0;
margin: 0;
text-transform: uppercase; }
.submit-alert {
background: white;
border: 2px solid #B7DB70;
box-sizing: border-box;
border-radius: 8px; }
.submit-alert .btn {
margin-top: 0.5rem;
background: #88B52F;
border-radius: 4px; }
/*# sourceMappingURL=styles.css.map */

View File

@ -1,7 +0,0 @@
{
"version": 3,
"mappings": "AAAQ,+IAAuI;AAa/I,IAAK;EACH,WAAW,EAAE,oBAAoB;EACjC,SAAS,EAAC,IAAI;EACd,KAAK,EAZC,OAAO;;AAef,IAAK;EACH,SAAS,EAAC,IAAI;EACd,OAAO,EAAC,CAAC;EACT,MAAM,EAAC,CAAC;;ACpBV,EAAG;EACD,SAAS,EAAE,IAAI;EACf,UAAU,EAAE,MAAM;EAClB,WAAW,EAAE,GAAG;EAChB,WAAW,EAAE,IAAI;EACjB,KAAK,EDLA,OAAO;;ACOd,EAAG;EACD,SAAS,EAAE,IAAI;EACf,UAAU,EAAE,MAAM;EAClB,WAAW,EAAE,GAAG;EAChB,WAAW,EAAE,IAAI;EACjB,cAAc,EAAE,SAAS;EACzB,KAAK,EDbA,OAAO;;ACgBd,EAAG;EACD,SAAS,EAAE,IAAI;EACf,UAAU,EAAE,MAAM;EAClB,WAAW,EAAE,GAAG;EAChB,WAAW,EAAE,IAAI;;AAGnB,EAAG;EACD,WAAW,EAAE,GAAG;;AAGlB,IAAK;EACH,MAAM,EAAC,IAAI;EACX,WAAW,EAAE,MAAM;EACnB,OAAO,EAAE,QAAQ;EACjB,KAAK,EAAC,KAAK;EACX,UAAU,EDhCL,OAAO;ECiCZ,aAAa,EAAE,IAAI;EACnB,SAAS,EAAE,QAAQ;EACnB,WAAW,EAAE,GAAG;EAChB,MAAM,EAAE,OAAO;EACf,UAAU,EAAE,qBAAqB;EACjC,UAAQ;IACN,OAAO,EAAE,GAAG;;AAMhB,MAAO;EACL,UAAU,EDxCJ,OAAO;ECyCb,OAAO,EAAE,SAAS;EAClB,aAAa,EAAE,IAAI;EACnB,kBAAY;IACV,QAAQ,EAAC,QAAQ;IACjB,GAAG,EAAE,KAAK;IACV,IAAI,EAAC,CAAC;IACN,KAAK,EAAC,CAAC;IACP,OAAO,EAAC,KAAK;IACb,MAAM,EAAC,IAAI;IACX,UAAU,EDlDN,OAAO;ICmDX,OAAO,EAAC,SAAS;IACjB,KAAK,EAAE,KAAK;IACZ,aAAa,EAAE,IAAI;IACnB,UAAU,EAAE,MAAM;;AAKtB,KAAM;EACJ,UAAU,ED/DL,OAAO;ECgEZ,MAAM,EAAC,GAAG;EACV,KAAK,EAAC,KAAK;EACX,MAAM,EAAE,IAAI;;AAGd,QAAS;EACP,OAAO,EAAC,KAAK;EACb,UAAU,EAAE,KAAK;EACjB,SAAS,EAAC,IAAI;EACd,eAAe,EAAE,IAAI;EACrB,KAAK,ED7EA,OAAO;EC8EZ,cAAc,EAAE,SAAS;;AAG3B,MAAO;EACL,QAAQ,EAAC,QAAQ;EACjB,KAAK,EDlFD,OAAO;ECmFX,UAAI;IACF,QAAQ,EAAC,QAAQ;IACjB,GAAG,EAAC,OAAO;IACX,KAAK,EAAC,MAAM;EAEd,QAAE;IACA,QAAQ,EAAE,QAAQ;IAClB,IAAI,EAAC,IAAI;IACT,GAAG,EAAE,CAAC;IACN,MAAM,EAAC,CAAC;IACR,cAAc,EAAE,SAAS;;AAI7B,aAAc;EACZ,UAAU,EAAC,KAAK;EAChB,MAAM,EAAE,iBAAsB;EAC9B,UAAU,EAAE,UAAU;EACtB,aAAa,EAAE,GAAG;EAClB,kBAAK;IACH,UAAU,EAAC,MAAM;IACjB,UAAU,EDjGN,OAAO;ICkGX,aAAa,EAAE,GAAG",
"sources": ["slovenscina-theme.scss","slovenscina-elements.scss"],
"names": [],
"file": "styles.css"
}

View File

@ -1,17 +0,0 @@
.text-center {
text-align: center; }
.m-b-1 {
margin-bottom: 1rem; }
.m-b-2 {
margin-bottom: 2rem; }
.m-b-3 {
margin-bottom: 3rem; }
.set-open-transition {
transition: max-height 0.3s ease-out;
overflow: hidden; }
/*# sourceMappingURL=utils.css.map */

View File

@ -1,7 +0,0 @@
{
"version": 3,
"mappings": "AAAA,YAAa;EACX,UAAU,EAAE,MAAM;;AAGpB,MAAO;EACL,aAAa,EAAC,IAAI;;AAEpB,MAAO;EACL,aAAa,EAAC,IAAI;;AAEpB,MAAO;EACL,aAAa,EAAC,IAAI;;AAGpB,oBAAqB;EACnB,UAAU,EAAE,wBAAwB;EACpC,QAAQ,EAAE,MAAM",
"sources": ["utils.scss"],
"names": [],
"file": "utils.css"
}

View File

@ -1,18 +0,0 @@
.text-center {
text-align: center;
}
.m-b-1 {
margin-bottom:1rem;
}
.m-b-2 {
margin-bottom:2rem;
}
.m-b-3 {
margin-bottom:3rem;
}
.set-open-transition {
transition: max-height 0.3s ease-out;
overflow: hidden;
}

Binary file not shown.

Before

Width:  |  Height:  |  Size: 4.2 KiB

View File

@ -1,10 +0,0 @@
<svg version="1.1" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 512 512">
<rect fill="#006CB7" width="512" height="512"/>
<path fill="#fff" d="M409.26,145.32V69.5l-46.06,55.16c-5.06-1.88-10.5-3.99-16.1-5.71c-16.12-4.52-32.56-7.82-49.17-9.86
c-5.37-0.47-11.2-0.47-17.04-0.47c-64.88,0-87.21,25.27-87.21,51.25c0,29.89,32.44,46.95,107.28,66.27
c89.47,22.07,117.94,63.93,117.94,114.79c0.04,6.77-0.59,13.54-1.87,20.19c41.39-26.92,66.98-64.24,66.98-105.48
c0-43.74-28.79-83.02-74.61-110.33"/>
<path fill="#fff" d="M241.92,278.65c-84.49-19.95-124.47-61.66-124.47-112.6c-0.13-10.68,1.69-21.29,5.37-31.3
c-57.41,27.07-94.76,71.13-94.76,120.89c0,42.02,26.61,79.89,69.32,107.04v79.81l47.38-56.73c23.89,8.63,48.73,14.33,73.98,16.98
c8.56,0.7,17.35,1.17,26.53,1.17c65.66,0,96.39-23.47,96.39-58.45c0-29.26-28.32-50-99.81-66.82"/>
</svg>

Before

Width:  |  Height:  |  Size: 852 B

View File

@ -1,5 +0,0 @@
<svg width="30" height="30" viewBox="0 0 30 30" fill="none" xmlns="http://www.w3.org/2000/svg">
<path d="M15 29.6668C6.86671 29.6668 0.333374 23.1335 0.333374 15.0002C0.333374 6.86683 6.86671 0.333496 15 0.333496C23.1334 0.333496 29.6667 6.86683 29.6667 15.0002C29.6667 23.1335 23.1334 29.6668 15 29.6668ZM15 3.00016C8.33337 3.00016 3.00004 8.3335 3.00004 15.0002C3.00004 21.6668 8.33337 27.0002 15 27.0002C21.6667 27.0002 27 21.6668 27 15.0002C27 8.3335 21.6667 3.00016 15 3.00016Z" fill="#8D3D3D"/>
<path d="M15 16.3335C14.2 16.3335 13.6667 15.8002 13.6667 15.0002V9.66683C13.6667 8.86683 14.2 8.3335 15 8.3335C15.8 8.3335 16.3334 8.86683 16.3334 9.66683V15.0002C16.3334 15.8002 15.8 16.3335 15 16.3335Z" fill="#8D3D3D"/>
<path d="M15 21.6668C14.6 21.6668 14.3334 21.5335 14.0667 21.2668C13.8 21.0002 13.6667 20.7335 13.6667 20.3335C13.6667 20.2002 13.6667 19.9335 13.8 19.8002C13.9334 19.6668 13.9334 19.5335 14.0667 19.4002C14.4667 19.0002 15 18.8668 15.5334 19.1335C15.6667 19.1335 15.6667 19.1335 15.8 19.2668C15.8 19.2668 15.9334 19.4002 16.0667 19.4002C16.2 19.5335 16.3334 19.6668 16.3334 19.8002C16.3334 19.9335 16.3334 20.2002 16.3334 20.3335C16.3334 20.4668 16.3334 20.7335 16.2 20.8668C16.0667 21.0002 16.0667 21.1335 15.9334 21.2668C15.6667 21.5335 15.4 21.6668 15 21.6668Z" fill="#8D3D3D"/>
</svg>

Before

Width:  |  Height:  |  Size: 1.3 KiB

View File

@ -1,3 +0,0 @@
<svg width="14" height="8" viewBox="0 0 14 8" fill="none" xmlns="http://www.w3.org/2000/svg">
<path fill-rule="evenodd" clip-rule="evenodd" d="M13.7071 0.292893C14.0976 0.683418 14.0976 1.31658 13.7071 1.70711L7.70711 7.70711C7.31658 8.09763 6.68342 8.09763 6.29289 7.70711L0.292893 1.70711C-0.0976315 1.31658 -0.0976315 0.683417 0.292893 0.292893C0.683417 -0.0976317 1.31658 -0.0976317 1.70711 0.292893L7 5.58579L12.2929 0.292893C12.6834 -0.0976312 13.3166 -0.0976311 13.7071 0.292893Z" fill="#848C91"/>
</svg>

Before

Width:  |  Height:  |  Size: 516 B

View File

@ -1,3 +0,0 @@
<svg width="8" height="14" viewBox="0 0 8 14" fill="none" xmlns="http://www.w3.org/2000/svg">
<path fill-rule="evenodd" clip-rule="evenodd" d="M7.70711 0.292893C8.09763 0.683417 8.09763 1.31658 7.70711 1.70711L2.41421 7L7.70711 12.2929C8.09763 12.6834 8.09763 13.3166 7.70711 13.7071C7.31658 14.0976 6.68342 14.0976 6.29289 13.7071L0.292893 7.70711C-0.0976311 7.31658 -0.0976311 6.68342 0.292893 6.29289L6.29289 0.292893C6.68342 -0.0976311 7.31658 -0.0976311 7.70711 0.292893Z" fill="#46535B"/>
</svg>

Before

Width:  |  Height:  |  Size: 506 B

View File

@ -1,5 +0,0 @@
<svg width="32" height="32" viewBox="0 0 32 32" fill="none" xmlns="http://www.w3.org/2000/svg">
<rect width="32" height="32" rx="4" fill="#B6BEC4"/>
<path fill-rule="evenodd" clip-rule="evenodd" d="M10.6667 11.3333C10.4899 11.3333 10.3204 11.4036 10.1953 11.5286C10.0703 11.6536 10.0001 11.8232 10.0001 12V21.3333C10.0001 21.5101 10.0703 21.6797 10.1953 21.8047C10.3204 21.9298 10.4899 22 10.6667 22H20.0001C20.1769 22 20.3465 21.9298 20.4715 21.8047C20.5965 21.6797 20.6667 21.5101 20.6667 21.3333V17.7733C20.6667 17.4051 20.9652 17.1067 21.3334 17.1067C21.7016 17.1067 22.0001 17.4051 22.0001 17.7733V21.3333C22.0001 21.8638 21.7894 22.3725 21.4143 22.7475C21.0392 23.1226 20.5305 23.3333 20.0001 23.3333H10.6667C10.1363 23.3333 9.62761 23.1226 9.25253 22.7475C8.87746 22.3725 8.66675 21.8638 8.66675 21.3333V12C8.66675 11.4696 8.87746 10.9609 9.25253 10.5858C9.62761 10.2107 10.1363 10 10.6667 10H14.2267C14.5949 10 14.8934 10.2985 14.8934 10.6667C14.8934 11.0349 14.5949 11.3333 14.2267 11.3333H10.6667Z" fill="white"/>
<path fill-rule="evenodd" clip-rule="evenodd" d="M19.5287 8.86225C19.789 8.6019 20.2111 8.6019 20.4715 8.86225L23.1382 11.5289C23.3985 11.7893 23.3985 12.2114 23.1382 12.4717L16.4715 19.1384C16.3465 19.2634 16.1769 19.3337 16.0001 19.3337H13.3334C12.9652 19.3337 12.6667 19.0352 12.6667 18.667V16.0003C12.6667 15.8235 12.737 15.6539 12.862 15.5289L19.5287 8.86225ZM14.0001 16.2765V18.0003H15.7239L21.7239 12.0003L20.0001 10.2765L14.0001 16.2765Z" fill="white"/>
</svg>

Before

Width:  |  Height:  |  Size: 1.5 KiB

View File

@ -1,7 +0,0 @@
<svg width="18" height="22" viewBox="0 0 18 22" fill="none" xmlns="http://www.w3.org/2000/svg">
<path fill-rule="evenodd" clip-rule="evenodd" d="M0.87868 0.87868C1.44129 0.31607 2.20435 0 3 0H11C11.2652 0 11.5196 0.105357 11.7071 0.292893L17.7071 6.29289C17.8946 6.48043 18 6.73478 18 7V19C18 19.7957 17.6839 20.5587 17.1213 21.1213C16.5587 21.6839 15.7957 22 15 22H3C2.20435 22 1.44129 21.6839 0.87868 21.1213C0.31607 20.5587 0 19.7957 0 19V3C0 2.20435 0.31607 1.44129 0.87868 0.87868ZM3 2C2.73478 2 2.48043 2.10536 2.29289 2.29289C2.10536 2.48043 2 2.73478 2 3V19C2 19.2652 2.10536 19.5196 2.29289 19.7071C2.48043 19.8946 2.73478 20 3 20H15C15.2652 20 15.5196 19.8946 15.7071 19.7071C15.8946 19.5196 16 19.2652 16 19V7.41421L10.5858 2H3Z" fill="#006CB7"/>
<path fill-rule="evenodd" clip-rule="evenodd" d="M11 0C11.5523 0 12 0.447715 12 1V6H17C17.5523 6 18 6.44772 18 7C18 7.55228 17.5523 8 17 8H11C10.4477 8 10 7.55228 10 7V1C10 0.447715 10.4477 0 11 0Z" fill="#006CB7"/>
<path fill-rule="evenodd" clip-rule="evenodd" d="M4 12C4 11.4477 4.44772 11 5 11H13C13.5523 11 14 11.4477 14 12C14 12.5523 13.5523 13 13 13H5C4.44772 13 4 12.5523 4 12Z" fill="#006CB7"/>
<path fill-rule="evenodd" clip-rule="evenodd" d="M4 16C4 15.4477 4.44772 15 5 15H13C13.5523 15 14 15.4477 14 16C14 16.5523 13.5523 17 13 17H5C4.44772 17 4 16.5523 4 16Z" fill="#006CB7"/>
<path fill-rule="evenodd" clip-rule="evenodd" d="M4 8C4 7.44772 4.44772 7 5 7H7C7.55228 7 8 7.44772 8 8C8 8.55228 7.55228 9 7 9H5C4.44772 9 4 8.55228 4 8Z" fill="#006CB7"/>
</svg>

Before

Width:  |  Height:  |  Size: 1.5 KiB

View File

@ -1,3 +0,0 @@
<svg width="84" height="68" viewBox="0 0 84 68" fill="none" xmlns="http://www.w3.org/2000/svg">
<path fill-rule="evenodd" clip-rule="evenodd" d="M70.5773 14.0998V0L61.2523 9.90788C55.5732 8.0324 49.1389 6.96077 42.3177 6.92846C39.5976 7.41691 37.0641 8.30531 35.0728 9.52887C32.1261 11.3395 30.7423 13.5548 30.7423 16.4536C30.7423 17.8381 31.7831 19.8281 36.7724 22.1191C38.9769 23.1314 41.3947 23.9282 43.6859 24.6078C44.1748 24.7529 44.7212 24.9089 45.2881 25.0707C46.9002 25.531 48.6777 26.0384 49.7688 26.4749C50.3128 26.6925 50.9257 26.926 51.5891 27.1789L51.5892 27.1789L51.5899 27.1792C54.8363 28.4164 59.2939 30.1152 62.8313 32.6669C67.7809 36.2372 71.4433 41.674 71.4433 49.7938C71.4433 50.8957 71.3731 51.9819 71.2341 53.0479C79.107 48.1686 84 41.3361 84 33.7731C84 26.002 78.834 19.002 70.5773 14.0998ZM12.9897 53.1856V67.1134L21.806 57.3175C27.7981 59.4216 34.6804 60.6184 42 60.6184C43.4856 60.6184 44.9532 60.5691 46.399 60.473L46.3705 60.2349C50.5048 59.7388 53.2834 58.2414 54.9723 56.5219C56.6194 54.8448 57.5876 52.608 57.5876 49.7938C57.5876 46.6227 56.4871 45.1748 54.7254 43.9041C52.7993 42.5147 50.4943 41.6232 47.3688 40.4145L47.3687 40.4144L47.3687 40.4144L47.3684 40.4143L47.3669 40.4137C46.516 40.0847 45.6043 39.7321 44.6229 39.3395C44.2108 39.1747 43.5896 38.9982 42.5362 38.6989L42.5357 38.6988C41.8252 38.4969 40.918 38.2392 39.7458 37.8915C37.2471 37.1503 34.0901 36.134 30.9905 34.7108C25.3715 32.1306 16.8866 26.7598 16.8866 16.4536C16.8866 14.9059 17.0383 13.4376 17.3212 12.0486C6.82395 16.9288 0 24.8416 0 33.7731C0 41.4075 4.98579 48.2975 12.9897 53.1856Z" fill="#ffffff"/>
</svg>

Before

Width:  |  Height:  |  Size: 1.6 KiB

View File

@ -1,5 +0,0 @@
<svg width="7" height="27" viewBox="0 0 7 27" fill="none" xmlns="http://www.w3.org/2000/svg">
<circle cx="3.5" cy="3.5" r="2.5" stroke="#F5F5F5" stroke-width="2"/>
<circle cx="3.5" cy="13.5" r="2.5" stroke="#F5F5F5" stroke-width="2"/>
<circle cx="3.5" cy="23.5" r="2.5" stroke="#F5F5F5" stroke-width="2"/>
</svg>

Before

Width:  |  Height:  |  Size: 325 B

BIN
static/image/password.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.1 KiB

View File

@ -1,4 +0,0 @@
<svg width="24" height="24" viewBox="0 0 24 24" fill="none" xmlns="http://www.w3.org/2000/svg">
<path fill-rule="evenodd" clip-rule="evenodd" d="M5 12C4.44772 12 4 12.4477 4 13V20C4 20.5523 4.44772 21 5 21H19C19.5523 21 20 20.5523 20 20V13C20 12.4477 19.5523 12 19 12H5ZM2 13C2 11.3431 3.34315 10 5 10H19C20.6569 10 22 11.3431 22 13V20C22 21.6569 20.6569 23 19 23H5C3.34315 23 2 21.6569 2 20V13Z" fill="#006CB7"/>
<path fill-rule="evenodd" clip-rule="evenodd" d="M12 3C10.9391 3 9.92172 3.42143 9.17157 4.17157C8.42143 4.92172 8 5.93913 8 7V11C8 11.5523 7.55228 12 7 12C6.44772 12 6 11.5523 6 11V7C6 5.4087 6.63214 3.88258 7.75736 2.75736C8.88258 1.63214 10.4087 1 12 1C13.5913 1 15.1174 1.63214 16.2426 2.75736C17.3679 3.88258 18 5.4087 18 7V11C18 11.5523 17.5523 12 17 12C16.4477 12 16 11.5523 16 11V7C16 5.93913 15.5786 4.92172 14.8284 4.17157C14.0783 3.42143 13.0609 3 12 3Z" fill="#006CB7"/>
</svg>

Before

Width:  |  Height:  |  Size: 912 B

BIN
static/image/register.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.2 KiB

View File

@ -1,12 +0,0 @@
<svg width="46" height="47" viewBox="0 0 46 47" fill="none" xmlns="http://www.w3.org/2000/svg">
<path d="M21.1498 10.4492C23.3595 10.4492 25.3602 11.3447 26.8086 12.7931C28.2571 14.2416 29.1525 16.2423 29.1525 18.452C29.1525 20.6616 28.2571 22.6623 26.8086 24.1108C26.209 24.7096 25.5153 25.2144 24.7509 25.6002C27.475 26.2666 29.9097 27.6725 31.83 29.5928C34.5638 32.3257 36.2542 36.102 36.2542 40.273C36.2542 40.7834 35.8402 41.1974 35.3298 41.1974C34.8194 41.1974 34.4054 40.7834 34.4054 40.273C34.4054 36.6124 32.9216 33.2983 30.523 30.8998C28.1245 28.5012 24.8104 27.0174 21.1498 27.0174C17.4893 27.0174 14.1751 28.5012 11.7766 30.8998C9.37801 33.2983 7.89417 36.6124 7.89417 40.273C7.89417 40.7834 7.48021 41.1974 6.96979 41.1974C6.45937 41.1974 6.04541 40.7834 6.04541 40.273C6.04541 36.102 7.73582 32.3257 10.4696 29.5928C12.3899 27.6725 14.8246 26.2666 17.5487 25.6002C16.7843 25.2144 16.0906 24.7096 15.491 24.1108C14.0425 22.6623 13.1471 20.6616 13.1471 18.452C13.1471 16.2423 14.0425 14.2416 15.491 12.7931C16.9394 11.3447 18.9401 10.4492 21.1498 10.4492ZM25.5016 14.1001C24.3884 12.9868 22.8491 12.298 21.1498 12.298C19.4506 12.298 17.9113 12.9868 16.798 14.1001C15.6847 15.2134 14.9958 16.7527 14.9958 18.452C14.9958 20.1512 15.6847 21.6897 16.798 22.8038C17.9113 23.9171 19.4506 24.6059 21.1498 24.6059C22.8491 24.6059 24.3884 23.9171 25.5016 22.8038C26.6149 21.6897 27.3038 20.1512 27.3038 18.452C27.3038 16.7527 26.6149 15.2134 25.5016 14.1001Z" fill="#848C91"/>
<g clip-path="url(#clip0_3:140)">
<path fill-rule="evenodd" clip-rule="evenodd" d="M41.441 9.67357C41.441 9.98072 41.192 10.2297 40.8849 10.2297H31.4467C31.1395 10.2297 30.8905 9.98072 30.8905 9.67357C30.8905 9.36642 31.1395 9.11742 31.4467 9.11742H40.8849C41.192 9.11742 41.441 9.36642 41.441 9.67357Z" fill="#848C91"/>
<path fill-rule="evenodd" clip-rule="evenodd" d="M36.1658 4.39833C36.4729 4.39833 36.7219 4.64733 36.7219 4.95448L36.7219 14.3927C36.7219 14.6998 36.4729 14.9488 36.1658 14.9488C35.8586 14.9488 35.6096 14.6998 35.6096 14.3927L35.6096 4.95448C35.6096 4.64733 35.8586 4.39833 36.1658 4.39833Z" fill="#848C91"/>
</g>
<defs>
<clipPath id="clip0_3:140">
<rect width="13.3476" height="13.3476" fill="white" transform="translate(36.1658 0.235352) rotate(45)"/>
</clipPath>
</defs>
</svg>

Before

Width:  |  Height:  |  Size: 2.3 KiB

BIN
static/image/showpass.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.7 KiB

View File

@ -1,4 +0,0 @@
<svg width="24" height="24" viewBox="0 0 24 24" fill="none" xmlns="http://www.w3.org/2000/svg">
<path fill-rule="evenodd" clip-rule="evenodd" d="M2.14074 12C2.25003 12.1889 2.39492 12.4296 2.57441 12.7075C3.03543 13.4213 3.71817 14.3706 4.60454 15.3161C6.39552 17.2264 8.89951 19 12 19C15.1005 19 17.6045 17.2264 19.3955 15.3161C20.2818 14.3706 20.9646 13.4213 21.4256 12.7075C21.6051 12.4296 21.75 12.1889 21.8593 12C21.75 11.8111 21.6051 11.5704 21.4256 11.2925C20.9646 10.5787 20.2818 9.6294 19.3955 8.68394C17.6045 6.77356 15.1005 5 12 5C8.89951 5 6.39552 6.77356 4.60454 8.68394C3.71817 9.6294 3.03543 10.5787 2.57441 11.2925C2.39492 11.5704 2.25003 11.8111 2.14074 12ZM23 12C23.8944 11.5528 23.8943 11.5524 23.8941 11.5521L23.8925 11.5489L23.889 11.542L23.8777 11.5198C23.8681 11.5013 23.8546 11.4753 23.8372 11.4424C23.8025 11.3767 23.752 11.2832 23.686 11.166C23.5542 10.9316 23.3601 10.6015 23.1057 10.2075C22.5979 9.42131 21.8432 8.3706 20.8545 7.31606C18.8955 5.22644 15.8995 3 12 3C8.10049 3 5.10448 5.22644 3.14546 7.31606C2.15683 8.3706 1.40207 9.42131 0.894336 10.2075C0.63985 10.6015 0.445792 10.9316 0.313971 11.166C0.248023 11.2832 0.19754 11.3767 0.162753 11.4424C0.145357 11.4753 0.131875 11.5013 0.122338 11.5198L0.11099 11.542L0.107539 11.5489L0.10637 11.5512C0.106186 11.5516 0.105573 11.5528 1 12L0.105573 11.5528C-0.0351909 11.8343 -0.0351909 12.1657 0.105573 12.4472L1 12C0.105573 12.4472 0.105389 12.4468 0.105573 12.4472L0.107539 12.4511L0.11099 12.458L0.122338 12.4802C0.131875 12.4987 0.145357 12.5247 0.162753 12.5576C0.19754 12.6233 0.248023 12.7168 0.313971 12.834C0.445792 13.0684 0.63985 13.3985 0.894336 13.7925C1.40207 14.5787 2.15683 15.6294 3.14546 16.6839C5.10448 18.7736 8.10049 21 12 21C15.8995 21 18.8955 18.7736 20.8545 16.6839C21.8432 15.6294 22.5979 14.5787 23.1057 13.7925C23.3601 13.3985 23.5542 13.0684 23.686 12.834C23.752 12.7168 23.8025 12.6233 23.8372 12.5576C23.8546 12.5247 23.8681 12.4987 23.8777 12.4802L23.889 12.458L23.8925 12.4511L23.8936 12.4488C23.8938 12.4484 23.8944 12.4472 23 12ZM23 12L23.8944 12.4472C24.0352 12.1657 24.0348 11.8336 23.8941 11.5521L23 12Z" fill="#848C91"/>
<path fill-rule="evenodd" clip-rule="evenodd" d="M12 10C10.8954 10 10 10.8954 10 12C10 13.1046 10.8954 14 12 14C13.1046 14 14 13.1046 14 12C14 10.8954 13.1046 10 12 10ZM8 12C8 9.79086 9.79086 8 12 8C14.2091 8 16 9.79086 16 12C16 14.2091 14.2091 16 12 16C9.79086 16 8 14.2091 8 12Z" fill="#848C91"/>
</svg>

Before

Width:  |  Height:  |  Size: 2.4 KiB

View File

@ -1,5 +0,0 @@
<svg width="30" height="30" viewBox="0 0 30 30" fill="none" xmlns="http://www.w3.org/2000/svg">
<path d="M15 29.6668C6.86671 29.6668 0.333374 23.1335 0.333374 15.0002C0.333374 6.86683 6.86671 0.333496 15 0.333496C23.1334 0.333496 29.6667 6.86683 29.6667 15.0002C29.6667 23.1335 23.1334 29.6668 15 29.6668ZM15 3.00016C8.33337 3.00016 3.00004 8.3335 3.00004 15.0002C3.00004 21.6668 8.33337 27.0002 15 27.0002C21.6667 27.0002 27 21.6668 27 15.0002C27 8.3335 21.6667 3.00016 15 3.00016Z" fill="#88B52F"/>
<path d="M15 16.3335C14.2 16.3335 13.6667 15.8002 13.6667 15.0002V9.66683C13.6667 8.86683 14.2 8.3335 15 8.3335C15.8 8.3335 16.3334 8.86683 16.3334 9.66683V15.0002C16.3334 15.8002 15.8 16.3335 15 16.3335Z" fill="#88B52F"/>
<path d="M15 21.6668C14.6 21.6668 14.3334 21.5335 14.0667 21.2668C13.8 21.0002 13.6667 20.7335 13.6667 20.3335C13.6667 20.2002 13.6667 19.9335 13.8 19.8002C13.9334 19.6668 13.9334 19.5335 14.0667 19.4002C14.4667 19.0002 15 18.8668 15.5334 19.1335C15.6667 19.1335 15.6667 19.1335 15.8 19.2668C15.8 19.2668 15.9334 19.4002 16.0667 19.4002C16.2 19.5335 16.3334 19.6668 16.3334 19.8002C16.3334 19.9335 16.3334 20.2002 16.3334 20.3335C16.3334 20.4668 16.3334 20.7335 16.2 20.8668C16.0667 21.0002 16.0667 21.1335 15.9334 21.2668C15.6667 21.5335 15.4 21.6668 15 21.6668Z" fill="#88B52F"/>
</svg>

Before

Width:  |  Height:  |  Size: 1.3 KiB

View File

@ -1,6 +0,0 @@
<svg width="14" height="15" viewBox="0 0 14 15" fill="none" xmlns="http://www.w3.org/2000/svg">
<path fill-rule="evenodd" clip-rule="evenodd" d="M0.333252 3.49984C0.333252 3.13165 0.631729 2.83317 0.999919 2.83317H12.9999C13.3681 2.83317 13.6666 3.13165 13.6666 3.49984C13.6666 3.86803 13.3681 4.1665 12.9999 4.1665H0.999919C0.631729 4.1665 0.333252 3.86803 0.333252 3.49984Z" fill="#848C91"/>
<path fill-rule="evenodd" clip-rule="evenodd" d="M5.66659 1.49984C5.48977 1.49984 5.32021 1.57007 5.19518 1.6951C5.07016 1.82012 4.99992 1.98969 4.99992 2.1665V2.83317H8.99992V2.1665C8.99992 1.98969 8.92968 1.82012 8.80466 1.6951C8.67963 1.57007 8.51006 1.49984 8.33325 1.49984H5.66659ZM10.3333 2.83317V2.1665C10.3333 1.63607 10.1225 1.12736 9.74747 0.75229C9.37239 0.377218 8.86369 0.166504 8.33325 0.166504H5.66659C5.13615 0.166504 4.62744 0.377218 4.25237 0.75229C3.8773 1.12736 3.66659 1.63607 3.66659 2.1665V2.83317H2.33325C1.96506 2.83317 1.66659 3.13165 1.66659 3.49984V12.8332C1.66659 13.3636 1.8773 13.8723 2.25237 14.2474C2.62744 14.6225 3.13615 14.8332 3.66659 14.8332H10.3333C10.8637 14.8332 11.3724 14.6225 11.7475 14.2474C12.1225 13.8723 12.3333 13.3636 12.3333 12.8332V3.49984C12.3333 3.13165 12.0348 2.83317 11.6666 2.83317H10.3333ZM2.99992 4.1665V12.8332C2.99992 13.01 3.07016 13.1795 3.19518 13.3046C3.32021 13.4296 3.48977 13.4998 3.66659 13.4998H10.3333C10.5101 13.4998 10.6796 13.4296 10.8047 13.3046C10.9297 13.1795 10.9999 13.01 10.9999 12.8332V4.1665H2.99992Z" fill="#848C91"/>
<path fill-rule="evenodd" clip-rule="evenodd" d="M5.66659 6.1665C6.03478 6.1665 6.33325 6.46498 6.33325 6.83317V10.8332C6.33325 11.2014 6.03478 11.4998 5.66659 11.4998C5.2984 11.4998 4.99992 11.2014 4.99992 10.8332V6.83317C4.99992 6.46498 5.2984 6.1665 5.66659 6.1665Z" fill="#848C91"/>
<path fill-rule="evenodd" clip-rule="evenodd" d="M8.33325 6.1665C8.70144 6.1665 8.99992 6.46498 8.99992 6.83317V10.8332C8.99992 11.2014 8.70144 11.4998 8.33325 11.4998C7.96506 11.4998 7.66659 11.2014 7.66659 10.8332V6.83317C7.66659 6.46498 7.96506 6.1665 8.33325 6.1665Z" fill="#848C91"/>
</svg>

Before

Width:  |  Height:  |  Size: 2.0 KiB

BIN
static/image/user.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.2 KiB

View File

@ -1,4 +0,0 @@
<svg width="24" height="24" viewBox="0 0 24 24" fill="none" xmlns="http://www.w3.org/2000/svg">
<path fill-rule="evenodd" clip-rule="evenodd" d="M4.46447 15.4645C5.40215 14.5268 6.67392 14 8 14H16C17.3261 14 18.5979 14.5268 19.5355 15.4645C20.4732 16.4021 21 17.6739 21 19V21C21 21.5523 20.5523 22 20 22C19.4477 22 19 21.5523 19 21V19C19 18.2044 18.6839 17.4413 18.1213 16.8787C17.5587 16.3161 16.7956 16 16 16H8C7.20435 16 6.44129 16.3161 5.87868 16.8787C5.31607 17.4413 5 18.2044 5 19V21C5 21.5523 4.55228 22 4 22C3.44772 22 3 21.5523 3 21V19C3 17.6739 3.52678 16.4021 4.46447 15.4645Z" fill="#006CB7"/>
<path fill-rule="evenodd" clip-rule="evenodd" d="M12 4C10.3431 4 9 5.34315 9 7C9 8.65685 10.3431 10 12 10C13.6569 10 15 8.65685 15 7C15 5.34315 13.6569 4 12 4ZM7 7C7 4.23858 9.23858 2 12 2C14.7614 2 17 4.23858 17 7C17 9.76142 14.7614 12 12 12C9.23858 12 7 9.76142 7 7Z" fill="#006CB7"/>
</svg>

Before

Width:  |  Height:  |  Size: 908 B

View File

@ -16,7 +16,9 @@ label {
body,
html {
height: 100%;
margin: 0;
overflow-y: hidden;
}
html {

View File

@ -3,12 +3,6 @@
<head>
<meta charset="UTF-8">
<title>Admin panel - Šolar</title>
<link rel="icon" href="/static/favicon.ico" type="image/x-icon" >
<link rel="icon" href="static/favicon.svg" sizes="any" type="image/svg+xml">
<link rel="stylesheet" href="{{ROUTE_PREFIX}}/static/css/header.css" type="text/css">
<link rel="stylesheet" href="{{ROUTE_PREFIX}}/static/css/form.css" type="text/css">
<link rel="stylesheet" href="{{ROUTE_PREFIX}}/static/css/simple-grid.css" type="text/css">
<link rel="stylesheet" href="{{ROUTE_PREFIX}}/static/css/manage-institution.css" type="text/css">
<style>
.tableFixHead {
overflow-y: scroll;
@ -36,21 +30,7 @@
</style>
</head>
<body>
<header>
<div class="logo"><a href="{{ROUTE_PREFIX}}/"><img src="{{ROUTE_PREFIX}}/static/image/logo-white.svg"/></a></div>
<div class="menu-items">
<a href="{{ROUTE_PREFIX}}/oddaja">Oddaja besedil</a>
{% if is_institution_coordinator %}
<a href="{{ROUTE_PREFIX}}/manage-institution">Upravljaj z ekipo</a>
{% endif %}
{% if is_admin %}
<a href="{{ROUTE_PREFIX}}/admin">Administracijski meni</a>
{% endif %}
<a href="https://slovenscina.eu/" target="_blank">Več informacij o sodelovanju</a>
<a href="{{ROUTE_PREFIX}}/logout">Odjava</a>
</div>
</header>
<div class="container" style="margin-top:8rem;">
<a href="../oddaja">Nazaj na oddajo</a>
{% with messages = get_flashed_messages() %}
{% if messages %}
<div style="background: blue;">
@ -85,7 +65,7 @@
</table>
</div>
<h3>Dodaj uporabnika</h3>
<form action="{{ROUTE_PREFIX}}/adduser" method="post">
<form action="../adduser" method="post">
<label for="name">Ime in priimek:</label><br>
<input type="text" id="name" name="name"><br>
<label for="email">Email:</label><br>
@ -95,7 +75,7 @@
<input type="submit" value="Dodaj">
</form>
<h3>Spremeni email uporabnika</h3>
<form action="{{ROUTE_PREFIX}}/changeuseremail" method="post">
<form action="../changeuseremail" method="post">
<label for="user-id">ID uporabnika:</label><br>
<input type="text" id="user-id" name="user-id"><br>
<label for="email">Nov email:</label><br>
@ -103,7 +83,7 @@
<input type="submit" value="Spremeni">
</form>
<h3>Spremeni ime in priimek uporabnika</h3>
<form action="{{ROUTE_PREFIX}}/changeusername" method="post">
<form action="../changeusername" method="post">
<label for="user-id">ID uporabnika:</label><br>
<input type="text" id="user-id" name="user-id"><br>
<label for="name">Ime in priimek:</label><br>
@ -111,13 +91,13 @@
<input type="submit" value="Spremeni">
</form>
<h3>Odstrani uporabnika</h3>
<form action="{{ROUTE_PREFIX}}/deluser" method="post">
<form action="../deluser" method="post">
<label for="user_id">ID uporabnika:</label><br>
<input type="text" id="user_id" name="user_id"><br>
<input type="submit" value="Odstrani">
</form>
<h3>Dodeli uporabnika instituciji</h3>
<form action="{{ROUTE_PREFIX}}/addusertoinstitution" method="post">
<form action="../addusertoinstitution" method="post">
<label for="user_id">ID uporabnika:</label>
<input type="text" id="user_id" name="user_id"><br>
<label for="institution_id">ID institucije:</label>
@ -131,13 +111,13 @@
<input type="submit" value="Dodeli">
</form>
<h3>Odstrani uporabnika iz institucije</h3>
<form action="{{ROUTE_PREFIX}}/deluserfrominstitution" method="post">
<form action="../deluserfrominstitution" method="post">
<label for="user_id">ID uporabnika:</label>
<input type="text" id="user_id" name="user_id"><br>
<input type="submit" value="Odstrani">
</form>
<h3>Spremeni vlogo uporabniškega računa</h3>
<form action="{{ROUTE_PREFIX}}/changeuserrole" method="post">
<form action="../changeuserrole" method="post">
<label for="user-id">ID uporabnika:</label>
<input type="text" id="user-id" name="user-id"><br>
<label for="role">Vloga:</label>
@ -157,7 +137,6 @@
<th>Email</th>
<th>Institucija</th>
<th>Vloga v instituciji</th>
<th>Akcije</th>
</tr>
</thead>
<tbody>
@ -168,21 +147,20 @@
<td>{{item[0].email}}</td>
<td>{{item[1].institution}}</td>
<td>{{item[1].role}}</td>
<td>
<form action="{{ROUTE_PREFIX}}/activateuser" method="post">
<input type="hidden" id="id" name="id" value="{{item[0].id}}">
<input type="submit" value="Aktiviraj">
</form>
</td>
</tr>
{% endfor %}
</table>
</div>
<h3>Aktiviraj uporabnika</h3>
<form action="../activateuser" method="post">
<label for="id">ID uporabnika:</label>
<input type="text" id="id" name="id"><br>
<input type="submit" value="Aktiviraj">
</form>
<div> </div>
<h2>Institucije</h2>
<h3>Dodaj institucijo</h3>
<form action="{{ROUTE_PREFIX}}/addinstitution" method="post">
<form action="../addinstitution" method="post">
<label for="name">Naziv:</label>
<input type="text" id="name" name="name"><br>
<label for="region">Regija:</label>
@ -222,7 +200,7 @@
</table>
</div>
<h3>Združi instituciji</h3>
<form action="{{ROUTE_PREFIX}}/mergeinstitutions" method="post">
<form action="../mergeinstitutions" method="post">
<label for="id-from">Institucijo z ID</label>
<input type="text" id="id-from" name="id-from">
<label for="id-to">združi v institucijo z ID</label>
@ -230,7 +208,7 @@
<input type="submit" value="Združi">
</form>
<h3>Spremeni podatke institucije</h3>
<form action="{{ROUTE_PREFIX}}/changeinstitutiondata" method="post">
<form action="../changeinstitutiondata" method="post">
<label for="id">ID institucije</label>
<input type="text" id="id" name="id"><br>
<label for="name">Nov naziv:</label>
@ -251,8 +229,52 @@
</select>
<input type="submit" value="Spremeni">
</form>
<h2>Zgodovina sodelovanja</h2>
<div class="tableFixHead">
<table>
<thead>
<tr>
<th>ID</th>
<th>ID uporabnika</th>
<th>ID institucije</th>
<th>Vloga</th>
<th>Šolsko leto</th>
<th>Besedilo značke</th>
</tr>
</thead>
<tbody>
{% for item in user_cooperation_history %}
<tr>
<td>{{item.id}}</td>
<td>{{item.user}}</td>
<td>{{item.institution}}</td>
<td>{{item.role}}</td>
<td>{{item.school_year}}</td>
<td>{{item.badge_text}}</td>
</tr>
{% endfor %}
</table>
</div>
<h3>Dodaj vnos</h3>
<form action="../addcooperationhistoryitem" method="post">
<label for="user">ID uporabnika</label>
<input type="text" id="user" name="user"><br>
<label for="institution">ID institucije</label>
<input type="text" id="institution" name="institution"><br>
<label for="role">Vloga</label>
<select name="role" id="role">
<option value="coordinator">Koordinator/-ka</option>
<option value="mentor">Mentor/-ica</option>
<option value="other">Druga vloga</option>
</select><br>
<label for="school-year">Šolsko leto (npr. "2021/22")</label>
<input type="text" id="school-year" name="school-year"><br>
<label for="badge-text">Besedilo značke</label>
<input type="text" id="badge-text" name="badge-text"><br>
<input type="submit" value="Dodaj">
</form>
<h3>Odstrani vnos</h3>
<form action="{{ROUTE_PREFIX}}/delcooperationhistoryitem" method="post">
<form action="../delcooperationhistoryitem" method="post">
<label for="entry-id">ID vnosa</label>
<input type="text" id="entry-id" name="entry-id"><br>
<input type="submit" value="Odstrani">
@ -298,7 +320,7 @@
</table>
</div>
<h3>Posodobi podatke nalaganja</h3>
<form action="{{ROUTE_PREFIX}}/updateuploaditem" method="post">
<form action="../updateuploaditem" method="post">
<label for="item-id">ID nalaganja</label>
<input type="text" id="item-id" name="item-id"/><br>
<label for="program">Program</label>
@ -367,7 +389,6 @@
<button id="button-submit" type="submit">Posodobi</button>
</form>
</div>
<script>
var selectPredmet = document.getElementById("predmet");
var selectVrsta = document.getElementById("vrsta");

View File

@ -3,46 +3,38 @@
<head>
<meta charset="UTF-8">
<title>Portal ŠOLAR</title>
<link rel="icon" href="/static/favicon.ico" type="image/x-icon" >
<link rel="icon" href="static/favicon.svg" sizes="any" type="image/svg+xml">
<link rel="stylesheet" href="{{ROUTE_PREFIX}}/static/css/login-styles.css" type="text/css">
<link rel="stylesheet" href="{{ROUTE_PREFIX}}/static/css/utils.css" type="text/css">
<link rel="stylesheet" href="/static/style.css" type="text/css">
</head>
<body>
<div class="background">
<div class="panel login-panel">
<div class="panel-logo">
<img src="{{ROUTE_PREFIX}}/static/image/logo.svg" alt="logo"/>
</div>
<h1 class="m-b-3">Pozabljeno geslo - ŠOLAR</h1>
<div>
<form method="POST" action="{{ROUTE_PREFIX}}/sendresetpass" class="m-b-2">
<div class="input-wrapper">
<img src="{{ROUTE_PREFIX}}/static/image/user.svg" alt="user" class="input-icon"/>
<div class="input-floating-label">
<label>E-mail</label>
<input type="text" name="email">
</div>
</div>
<button class="btn" style="margin-left: 46px;">Pošlji</button>
</form>
{% with messages = get_flashed_messages() %}
{% if messages %}
<div class="alert alert-success">
<img src="{{ROUTE_PREFIX}}/static/image/success.svg" alt="alert"/>
<p>{{ messages[0] }}</p>
<div id="main-window">
<div id="rect1">
<div style="padding: 50px;">
<div id="logo-container">
<img src="/static/image/logo.svg" alt="logo"/>
</div>
{% endif %}
{% endwith %}
<a href="../login" class="contract-item-button" style="float: none;">Nazaj na prijavo</a>
<h3 id="title" style="font-size: 27px; text-align: left;">Pozabljeno geslo - ŠOLAR</h3>
<div>
{% with messages = get_flashed_messages() %}
{% if messages %}
<div>
{{ messages[0] }}
</div>
{% endif %}
{% endwith %}
<form method="POST" action="../sendresetpass">
<div>
<div>
<input type="email" name="email" placeholder="Email" autofocus="">
</div>
</div>
<div class="back-to-login">
<img src="{{ROUTE_PREFIX}}/static/image/chevron-left.svg"/>
<a href="{{ROUTE_PREFIX}}/login">Nazaj na prijavo</a>
<button class="button-general" style="margin-top: 20px;">Pošlji</button>
</form>
</div>
</div>
</div>
<div id="rect2" class="mock-side">
</div>
</div>
</body>

View File

@ -3,67 +3,63 @@
<head>
<meta charset="UTF-8">
<title>Portal ŠOLAR</title>
<link rel="icon" href="/static/favicon.ico" type="image/x-icon" >
<link rel="icon" href="static/favicon.svg" sizes="any" type="image/svg+xml">
<link rel="stylesheet" href="{{ROUTE_PREFIX}}/static/css/login-styles.css" type="text/css">
<link rel="stylesheet" href="{{ROUTE_PREFIX}}/static/css/utils.css" type="text/css">
<link rel="stylesheet" href="/static/style.css" type="text/css">
</head>
<body>
<div class="background">
<div class="panel login-panel">
<div class="panel-logo">
<img src="{{ROUTE_PREFIX}}/static/image/logo.svg" alt="logo"/>
</div>
<h2 class="text-center">Portal za oddajanje besedil</h2>
<div class="line"></div>
<h1 class="text-center">Korpus ŠOLAR</h1>
<div class="text-center m-b-3"><em>Zbiranje besedil za korpus Šolar poteka po naslednjem postopku, ki prinaša tudi točke za napredovanje v pedagoški naziv.</em></div>
<h1 class="m-b-3">Prijava</h1>
{% with messages = get_flashed_messages() %}
{% if messages %}
{% if "potrditev" in messages[0] or "uspešna" in messages[0] %}
<div class="alert alert-success">
<img src="{{ROUTE_PREFIX}}/static/image/success.svg" alt="alert"/>
<p>{{ messages[0] }}</p>
<div id="main-window">
<div id="rect1">
<div style="padding: 25px;">
<div id="logo-container">
<img src="/static/image/logo.svg" alt="logo"/>
</div>
{% else %}
<div class="alert">
<img src="{{ROUTE_PREFIX}}/static/image/alert.svg" alt="alert"/>
<p>{{ messages[0] }}</p>
<h1 id="title">Portal za oddajanje besedil</h1>
<h2 id="subtitle">Korpus Šolar</h2>
<div class="form-text"><em>Zbiranje besedil za korpus Šolar poteka po naslednjem postopku, ki prinaša tudi točke za napredovanje.</em></div>
<h3 id="title" style="font-size: 27px; text-align: left;">Prijava</h3>
<div>
{% with messages = get_flashed_messages() %}
{% if messages %}
<div>
{{ messages[0] }}
</div>
{% endif %}
{% endwith %}
<form method="POST" action="../login">
<div>
<div>
<img src="../static/image/user.png" alt="user" style="float: left; width: 10%;"/>
<input type="email" name="email" placeholder="Email" autofocus=""
style="float: right; width: 85%; margin-bottom: 20px; margin-top: 10px;">
</div>
</div>
<div>
<div>
<img src="/static/image/password.png" alt="user" style="float: left; width: 10%; margin-top: 20px;"/>
<input type="password" name="password" placeholder="Geslo"
style="float: right; width: 85%; margin-bottom: 20px; margin-top: 10px;">
</div>
</div>
<button class="button-general" style="margin-top: 30px; margin-bottom: 20px;">PRIJAVA</button>
</form>
<a href="../forgotpass" class="contract-item-button">Pozabljeno geslo</a>
<a href="../register" class="contract-item-button"
style="-webkit-appearance: button;
-moz-appearance: button;
appearance: button;
margin-top: 80px;
text-decoration: none;
color: #46535b;
width: 100%;"
><img src="../static/image/register.png" alt="user" style="float: left; width: 15%; margin-right: 25px;"/>
Registracija<br><div style="font-size: 11px; margin-top: 10px;">Še nimate uporabniškega računa? Registrirajte se!</div></a>
</div>
{% endif %}
{% endif %}
{% endwith %}
<div>
<form method="POST" action="{{ROUTE_PREFIX}}/login" class="m-b-2">
<div class="input-wrapper">
<img src="{{ROUTE_PREFIX}}/static/image/user.svg" alt="user" class="input-icon"/>
<div class="input-floating-label">
<label>E-mail</label>
<input type="text" name="email">
</div>
</div>
<div class="input-wrapper">
<img src="{{ROUTE_PREFIX}}/static/image/password.svg" alt="user" class="input-icon"/>
<div class="input-floating-label">
<label>Geslo</label>
<input type="password" name="password">
</div>
</div>
<a href="{{ROUTE_PREFIX}}/forgotpass" class="a-right m-b-1">Pozabljeno geslo</a>
<button class="btn" style="margin-left: 46px;">PRIJAVA</button>
</form>
</div>
<a href="{{ROUTE_PREFIX}}/register" class="register-button">
<img src="{{ROUTE_PREFIX}}/static/image/register.svg" alt="register"/>
<h3>Registracija</h3>
<p>Še nimate uporabniškega računa? Registrirajte se!</p>
</a>
</div>
<div id="rect2" class="mock-side">
</div>
</div>
</body>

View File

@ -3,126 +3,100 @@
<head>
<meta charset="UTF-8">
<title>Upravljanje institucije - Šolar</title>
<link rel="icon" href="/static/favicon.ico" type="image/x-icon" >
<link rel="icon" href="static/favicon.svg" sizes="any" type="image/svg+xml">
<link rel="stylesheet" href="{{ROUTE_PREFIX}}/static/css/header.css" type="text/css">
<link rel="stylesheet" href="{{ROUTE_PREFIX}}/static/css/form.css" type="text/css">
<link rel="stylesheet" href="{{ROUTE_PREFIX}}/static/css/simple-grid.css" type="text/css">
<link rel="stylesheet" href="{{ROUTE_PREFIX}}/static/css/slovenscina-admin.css" type="text/css">
<link rel="stylesheet" href="{{ROUTE_PREFIX}}/static/css/manage-institution.css" type="text/css">
<style>
.tableFixHead {
overflow-y: scroll;
max-height: 306px;
}
.tableFixHead thead th {
position: sticky;
top: 0;
}
table {
border-collapse: collapse;
width: 100%;
}
th,
td {
padding: 8px 16px;
border: 1px solid #ccc;
}
th {
background: #eee;
}
h2 {
color: blue;
}
</style>
</head>
<body>
<header>
<div class="logo"><a href="{{ROUTE_PREFIX}}/"><img src="{{ROUTE_PREFIX}}/static/image/logo-white.svg"/></a></div>
<div class="menu-items">
<a href="{{ROUTE_PREFIX}}/oddaja">Oddaja besedil</a>
{% if is_institution_coordinator %}
<a href="{{ROUTE_PREFIX}}/manage-institution">Upravljaj z ekipo</a>
{% endif %}
{% if is_admin %}
<a href="{{ROUTE_PREFIX}}/admin">Administracijski meni</a>
{% endif %}
<a href="https://slovenscina.eu/" target="_blank">Več informacij o sodelovanju</a>
<a href="{{ROUTE_PREFIX}}/logout">Odjava</a>
</div>
</header>
<div class="container" style="margin-top:8rem;">
<a href="../oddaja">Nazaj na oddajo</a>
{% with messages = get_flashed_messages() %}
{% if messages %}
<div>
<div style="background: blue;">
{{ messages[0] }}
</div>
{% endif %}
{% endwith %}
<div class="row">
<div class="col-12">
<h1>{{institution.name}}</h1>
<h3>Seznam uporabnikov v vaši instituciji</h3>
<table class="tableFixHead">
<thead>
<tr>
<th>Ime in priimek</th>
<th>Email</th>
<th>Vloga</th>
<th>Akcije</th>
</tr>
</thead>
<tbody>
{% for item in institution_users %}
<tr>
<td>{{item.name}}</td>
<td>{{item.email}}</td>
<td>
<div>
<a href="javascript:void(0);" onclick="toggleEditForm(this)" class="toggle-edit-role">Spremeni</a>
{{role_map[item.id]}}
</div>
<form action="{{ROUTE_PREFIX}}/changeuserrole-institution" method="post" style="display:none;">
<input type="hidden" id="user-id" name="user-id" value="{{item.id}}"/>
<select class="role" name="role">
<option value="coordinator">Koordinator/-ka</option>
<option value="mentor">Mentor/-ica</option>
<option value="other">Druga vloga</option>
</select>
<input type="submit" value="Shrani"/>
</form>
</td>
<td>
<form action="{{ROUTE_PREFIX}}/deluserfrominstitution" method="post">
<input type="hidden" id="user_id" name="user_id" value="{{item.id}}">
<input type="submit" value="Odstrani uporabnika">
</form>
</td>
</tr>
{% endfor %}
</tbody>
</table>
</div>
<h3>Seznam vseh aktivnih uporabnikov</h3>
<div class="tableFixHead">
<table>
<thead>
<tr>
<th>ID</th>
<th>Ime in priimek</th>
<th>Email</th>
</tr>
</thead>
<tbody>
{% for item in users %}
<tr>
<td>{{item.id}}</td>
<td>{{item.name}}</td>
<td>{{item.email}}</td>
</tr>
{% endfor %}
</table>
</div>
<form action="/institutionadduser" method="POST">
<div class="row">
<div class="col-6">
<h1>Dodaj uporabnika</h1>
<div class="form-wrapper">
<label for="regija">Ime</label>
<input type="text" name="name" />
</div>
<div class="form-wrapper">
<label for="regija">Email</label>
<input type="text" name="email" />
</div>
<div class="form-wrapper">
<label for="regija">Vloga</label>
<select class="role" name="role">
<option value="coordinator">Koordinator/-ka</option>
<option value="mentor">Mentor/-ica</option>
<option value="other">Druga vloga</option>
</select>
</div>
<input type="submit" class="btn" value="Dodaj"/>
</div>
</div>
</form>
<h3>Seznam uporabnikov v vaši instituciji</h3>
<div class="tableFixHead">
<table>
<thead>
<tr>
<th>ID</th>
<th>Ime in priimek</th>
<th>Email</th>
</tr>
</thead>
<tbody>
{% for item in institution_users %}
<tr>
<td>{{item.id}}</td>
<td>{{item.name}}</td>
<td>{{item.email}}</td>
</tr>
{% endfor %}
</table>
</div>
<br>
</div>
<h3>Dodaj uporabnika instituciji</h3>
<form action="../addusertoinstitution" method="post">
<label for="user_id">ID uporabnika:</label>
<input type="text" id="user_id" name="user_id"><br>
<label for="role">Vloga v instituciji:</label>
<select name="role" id="role">
<option value="coordinator">Koordinator/-ka</option>
<option value="mentor">Mentor/-ica</option>
<option value="other">Druga vloga</option>
</select>
<input type="submit" value="Dodeli">
</form>
<h3>Odstrani uporabnika iz institucije</h3>
<form action="../deluserfrominstitution" method="post">
<label for="user_id">ID uporabnika:</label>
<input type="text" id="user_id" name="user_id"><br>
<input type="submit" value="Odstrani">
</form>
<div> </div>
</body>
<script>
var toggleEditForm = function(el) {
var td = el.closest("td");
el.closest("div").style.display = "none";
td.querySelector("form").style.display = "block";
};
</script>
</html>

View File

@ -3,277 +3,136 @@
<head>
<meta charset="UTF-8">
<title>Portal za oddajanje besedil</title>
<link rel="icon" href="/static/favicon.ico" type="image/x-icon" >
<link rel="icon" href="static/favicon.svg" sizes="any" type="image/svg+xml">
<link rel="stylesheet" href="{{ROUTE_PREFIX}}/static/css/header.css" type="text/css">
<link rel="stylesheet" href="{{ROUTE_PREFIX}}/static/css/form.css" type="text/css">
<link rel="stylesheet" href="{{ROUTE_PREFIX}}/static/css/simple-grid.css" type="text/css">
<link rel="stylesheet" href="{{ROUTE_PREFIX}}/static/css/utils.css" type="text/css">
<!--{{ dropzone.load_css() }}-->
<link rel="stylesheet" href="/static/dropzone.css" type="text/css">
{{ dropzone.style('position: absolute;
top: -0.5px;
width: 388px;
height: 732px;
left: 385px;
background: linear-gradient(198.62deg, rgba(255, 255, 255, 0.49) -1.62%, rgba(255, 255, 255, 0.73) -1.61%, rgba(255, 255, 255, 0.41) 79.34%);
box-shadow: 20px 4px 40px rgba(0, 0, 0, 0.25);
border: 0px;
backdrop-filter: blur(20px);
border-radius: 0px 20px 20px 0px;') }}
<link rel="stylesheet" href="/static/style.css" type="text/css">
</head>
<body>
<header>
<div class="logo"><a href="{{ROUTE_PREFIX}}/"><img src="{{ROUTE_PREFIX}}/static/image/logo-white.svg"/></a></div>
<div class="menu-items">
{% if is_institution_coordinator %}
<a href="{{ROUTE_PREFIX}}/manage-institution">Upravljaj z ekipo</a>
{% endif %}
{% if is_admin %}
<a href="{{ROUTE_PREFIX}}/admin">Administracijski meni</a>
{% endif %}
<a href="https://slovenscina.eu/" target="_blank">Več informacij o sodelovanju</a>
<a href="{{ROUTE_PREFIX}}/logout">Odjava</a>
</div>
</header>
<div class="container" style="margin-top:8rem;">
<div class="row">
<div class="col-12">
<h1 class="title">Korpus Šolar</h1>
<p class="subtitle" style="width:60%">Prosimo, določite podatke o besedilih, ki jih želite oddati, in nato naložite besedila. Če oddajate besedila, ki so nastala v različnih razredih, se razlikujejo glede učiteljskih popravkov in podobno, jih oddajte v ločenih paketih.</p>
<div class="tab-nav">
<a href="{{ROUTE_PREFIX}}/oddaja" class="active">Oddaja besedil</a>
<a href="{{ROUTE_PREFIX}}/zgodovina">Zgodovina sodelovanja</a>
<a href="{{ROUTE_PREFIX}}/pogodbe">Ekipa</a>
</div>
<a href="../logout">Odjavi se</a>
{% if is_institution_coordinator %}
<br><a href="../manage-institution">Upravljaj z institucijo</a>
{% endif %}
{% if is_admin %}
<br><a href="../admin">Administracijski meni</a>
{% endif %}
<br><a href="mailto:email@example.com">Pomoč</a>
<div class="bg"></div>
<div id="main-window">
<div id="rect1">
<div id="logo-container">
<img src="/static/image/logo.svg" alt="logo"/>
</div>
</div>
<form id="my-dropzone" class="dropzone">
<div style="position: relative; right: 390px;">
<h1 id="title" style="font-size: 25px;">Korpus ŠOLAR</h1>
<div class="row">
<div class="col-6">
{% if not institution %}
<div class="alert">
<img src="{{ROUTE_PREFIX}}/static/image/alert.svg" alt="alert"/>
<p>Niste član nobene institucije!</p>
</div>
{% elif not institution_contract %}
<!--<div class="alert">
<img src="{{ROUTE_PREFIX}}/static/image/alert.svg" alt="alert"/>
<p>Pogodba s šolo še ni naložena!</p>
</div>-->
{% endif %}
<div class="alert" id="error-message">
<img src="{{ROUTE_PREFIX}}/static/image/alert.svg" alt="alert"/>
<p></p>
</div>
<div class="alert alert-success" id="success-message">
<img src="{{ROUTE_PREFIX}}/static/image/success.svg" alt="alert"/>
<p></p>
</div>
</div>
</div>
<form id="form-oddaja">
<div class="row">
<div class="col-6">
<div class="form-wrapper">
<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 class="selection-tabs">
<button id="button-oddaja" class="selection-tab-button selected">ODDAJA</button>
<button id="button-zgodovina" class="selection-tab-button">ZGODOVINA</button>
<button id="button-pogodbe" class="selection-tab-button">POGODBE</button>
</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">
<option value="OS" selected="selected">Osnovnošolski (OŠ)</option>
<option value="SSG">Splošna in strokovna gimnazija (SGG)</option>
<option value="MGP">Mednarodni gimnazijski programi (MGP)</option>
<option value="ZG">Zasebne gimnazije (ZG)</option>
<option value="NPI">Nižje poklicno izobraževanje (NPI)</option>
<option value="SPI">Srednje poklicno izobraževanje (SPI)</option>
<option value="SSI">Srednje strokovno izobraževanje (SSI)</option>
<option value="PTI">Poklicno-tehniško izobraževanje (PTI)</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="predmet">Predmet</label>
<select id="predmet" name="predmet">
<option value="SLO" selected="selected">Slovenščina (SLO)</option>
<option value="DJP">Drugi jezikoslovni predmeti (vtipkajte ime predmeta) (DJP)</option>
<option value="DDP">Drugi družboslovni predmeti (vtipkajte ime predmeta) (DDP)</option>
<option value="DNP">Drugi naravoslovni predmeti (vtipkajte ime predmeta) (DNP)</option>
<option value="DSP">Drugi strokovni predmeti (vtipkajte ime predmeta) (DSP)</option>
<option value="DIP">Drugi izbirni ali dodatni predmeti (vtipkajte ime predmeta) (DIP)</option>
</select>
</div>
</div>
<div class="col-6">
<p></p>
</div>
</div>
<div class="row set-open-transition">
<div class="col-6">
<div class="form-wrapper" id="predmet-custom-box">
{% if not institution %}
<div class="warning">Niste član nobene institucije!</div>
{% elif not institution_contract %}
<div class="warning">Pogodba s šolo še ni naložena!</div>
{% endif %}
<div id="data-confirm-notification" class="message-notification" style="display: none;">Prosimo, preverite in potrdite vnešene podatke.</div>
<label for="program">PROGRAM</label>
<select id="program" name="program">
<option value="OS" selected="selected">Osnovnošolski (OŠ)</option>
<option value="SSG">Splošna in strokovna gimnazija (SGG)</option>
<option value="MGP">Mednarodni gimnazijski programi (MGP)</option>
<option value="ZG">Zasebne gimnazije (ZG)</option>
<option value="NPI">Nižje poklicno izobraževanje (NPI)</option>
<option value="SPI">Srednje poklicno izobraževanje (SPI)</option>
<option value="SSI">Srednje strokovno izobraževanje (SSI)</option>
<option value="PTI">Poklicno-tehnično izobraževanje (PTI)</option>
</select>
<label for="predmet">PREDMET</label>
<select id="predmet" name="predmet">
<option value="slo" selected="selected">Slovenščina</option>
<option value="drug-jez">Drugi jezikoslovni predmeti</option>
<option value="drug-druz">Drugi družboslovni predmeti</option>
<option value="drug-narav">Drugi naravoslovni predmeti</option>
<option value="drug-strok">Drugi strokovni predmeti</option>
<option value="drug-izb">Drugi izbirni ali dodatni predmeti</option>
</select>
<div id="predmet-custom-box" style="display: none;">
<label for="predmet-custom">Ime predmeta:</label>
<input type="text" id="predmet-custom" name="predmet-custom"/>
</div>
</div>
<div class="col-6">
<p></p>
</div>
</div>
<div class="row">
<div class="col-6">
<div class="form-wrapper">
<label for="letnik">Razred/Letnik</label>
<select id="letnik" name="letnik">
<option value="1" selected="selected">1</option>
<option value="2">2</option>
<option value="3">3</option>
<option value="4">4</option>
<option value="5">5</option>
<option value="6">6</option>
<option value="7">7</option>
<option value="8">8</option>
<option value="9">9</option>
</select>
</div>
</div>
<div class="col-6">
<p></p>
</div>
</div>
<label for="letnik">LETNIK</label>
<select id="letnik" name="letnik">
<option value="1" selected="selected">1</option>
<option value="2">2</option>
<option value="3">3</option>
<option value="4">4</option>
<option value="5">5</option>
<option value="6">6</option>
<option value="7">7</option>
<option value="8">8</option>
<option value="9">9</option>
</select>
<div class="row">
<div class="col-6">
<div class="form-wrapper" >
<label for="vrsta">Vrsta besedila</label>
<select id="vrsta" name="vrsta">
<option value="E" selected="selected">Esej ali spis (E)</option>
<option value="PB">Praktično besedilo, napisano za oceno - npr. vabilo, prošnja ali podobno (PE)</option>
<option value="T">Šolski test (T)</option>
<option value="R">Delo v razredu, ne za oceno (vtipkajte besedilo vrsto) (R)</option>
</select>
</div>
</div>
<div class="col-6">
<p></p>
</div>
</div>
<div class="row set-open-transition">
<div class="col-6">
<div class="form-wrapper" id="vrsta-custom-box">
<label for="vrsta">VRSTA BESEDILA</label>
<select id="vrsta" name="vrsta">
<option value="esej-spis" selected="selected">Esej ali spis</option>
<option value="prakticno">Praktično besedilo (npr. vabila, prošnje ipd. pri pouku slovenščine), napisano za oceno</option>
<option value="solski-test">Šolski test</option>
<option value="delo-v-razredu">Delo v razredu, ne za oceno</option>
</select>
<div id="vrsta-custom-box" style="display: none;">
<label for="vrsta-custom">Vtipkajte besedilno vrsto:</label>
<input type="text" id="vrsta-custom" name="vrsta-custom"/>
</div>
</div>
<div class="col-6">
<p></p>
</div>
</div>
<div class="row">
<div class="col-6">
<div class="form-wrapper">
<label for="solsko-leto">Šolsko leto</label>
<select id="solsko-leto" name="solsko-leto">
<option value="20-21" selected="selected">2020/21</option>
<option value="21-22">2021/22</option>
</select>
</div>
</div>
<div class="col-6">
<p></p>
</div>
</div>
<label for="solsko-leto">ŠOLSKO LETO</label>
<select id="solsko-leto" name="solsko-leto">
<option value="20-21" selected="selected">2020/21</option>
<option value="21-22">2021/22</option>
</select>
<div class="row">
<div class="col-6">
<div class="form-wrapper">
<label for="jezikovni-popravki">Jezikovni popravki</label>
<select id="jezikovni-popravki" name="jezikovni-popravki">
<option value="DD" selected="selected">Besedilo vsebuje učiteljske popravke in strinjam se z njihovo vključitvijo v korpus. (DD)</option>
<option value="N">Besedilo ne vsebuje učiteljskih popravkov. (N)</option>
<option value="DN">Besedilo vsebuje učiteljske popravke in ne strinjam se z njihovo vključitvijo v korpus. (DN)</option>
</select>
</div>
</div>
<div class="col-6">
<p></p>
</div>
</div>
<label for="jezikovni-popravki">JEZIKOVNI POPRAVKI</label>
<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="brez-popr">Besedilo ne vsebuje učiteljskih popravkov</option>
<option value="popr-da">Besedilo vsebuje učiteljske popravke in ne strinjam se z njihovo vključitvijo v korpus</option>
</select>
<div class="row">
<div class="col-6">
<div class="form-wrapper">
<div id="dropzone-previews" class="dropzone-previews"></div>
</div>
<button id="button-submit" type="submit">Oddaj</button>
</div>
</div>
<div class="row">
<div class="col-6">
<div class="form-wrapper">
<label for="jezikovni-popravki">Datoteka</label>
<div id="my-dropzone" class="dropzone"></div>
</div>
<div class="dropzone-previews">
</div>
<div class="col-6">
<p>Oddate lahko eno ali (hkrati) več besedil, ki ustrezajo izbranim podatkom. Sprejemljivi formati so: txt, csv, pdf, doc, docx, xls, xlsx, ppt, pptx, jpg, jpeg, png.</p>
</div>
</div>
</form>
<div class="row">
<div class="col-6">
<div class="form-wrapper">
<button id="button-submit" type="button" class="btn">Oddaj</button>
</div>
</div>
<div class="col-6">
</div>
</div>
<div class="row submit-alert" id="data-confirm-notification">
<div class="col-6">
<button id="button-submit-final" type="button" class="btn">Potrdi in oddaj</button>
</div>
<div class="col-6">
<p>Prosimo, preverite, če so vneseni podatki ustrezni in besedila prava. Naknadno spreminjanje ne bo več mogoče.</p>
</div>
</div>
</form>
</div>
</div>
<br/><br/><br/><br/><br/><br/><br/>
<div id="popup-terms" style="display: none">
<div id="popup-terms-text">
</div>
<button id="button-submit-cancel" class="button-terms" style="background: #ff2d2d;">Prekliči</button>
<button id="button-submit-final" class="button-terms">Oddaj</button>
</div>
<!--{{ dropzone.load_js() }}-->
<script src="{{ROUTE_PREFIX}}/static/dropzone.js"></script>
<script src="/static/dropzone.js"></script>
<script>
/////////////////////////
// Dropzone //
@ -283,66 +142,26 @@
var btnSubmit = document.getElementById("button-submit");
var btnSubmitFinal = document.getElementById("button-submit-final");
var btnSubmitCancel = document.getElementById("button-submit-cancel");
var btnZgodovina = document.getElementById("button-zgodovina");
var btnPogodbe = document.getElementById("button-pogodbe");
var elemTermsPopup = document.getElementById("popup-terms");
var termsScrollbox = document.getElementById("popup-terms-text");
var dataConfirmNotification = document.getElementById("data-confirm-notification");
var errorMessage = document.getElementById("error-message");
var successMessage = document.getElementById("success-message");
var form = document.forms["form-oddaja"];
var scrollboxTriggered = false;
var form = document.forms["my-dropzone"];
{% if not institution %}
btnSubmit.disabled = true;
btnSubmit.disabled = true;
{% endif %}
function isEmptyOrSpaces(str){
return str == null || str.match(/^ *$/) !== null;
}
function showError(str) {
errorMessage.querySelector("p").textContent = str;
errorMessage.style.display = "block";
window.scroll({
top: 0,
behavior: 'smooth'
});
}
function showSuccess(str) {
successMessage.querySelector("p").textContent = str;
successMessage.style.display = "block";
window.scroll({
top: 0,
behavior: 'smooth'
});
}
//onready
selectPredmet.addEventListener("change", function(e) {
var predmetCustomBox = document.getElementById("predmet-custom-box").closest('.row');
if (selectPredmet.value.startsWith("D")) {
predmetCustomBox.style.maxHeight = "150px";
} else {
predmetCustomBox.style.maxHeight = "0px";
}
});
selectVrsta.addEventListener("change", function(e) {
var vrstaCustomBox = document.getElementById("vrsta-custom-box").closest('.row');
if (selectVrsta.value == "R") {
vrstaCustomBox.style.maxHeight = "150px";
} else {
vrstaCustomBox.style.maxHeight = "0px";
}
});
var event = new CustomEvent("change");
selectPredmet.dispatchEvent(event);
selectVrsta.dispatchEvent(event);
const reEmail = /^[^\s@]+@[^\s@]+\.[^\s@]+$/;
Dropzone.options.myDropzone = { // The camelized version of the ID of the form element
url: "{{ROUTE_PREFIX}}/upload",
url: "../upload",
autoProcessQueue: false,
uploadMultiple: true,
parallelUploads: 20,
@ -351,24 +170,38 @@
timeout: 5000000, // milliseconds
acceptedFiles: ".txt, .csv, .pdf, .doc, .docx, .xls, .xlsx, .ppt, .pptx, .jpg, .jpeg, .png",
maxFiles: 20,
previewsContainer: "#dropzone-previews",
dictDefaultMessage: "Kliknite to polje ali povlecite datoteke vanj.",
dictDefaultMessage: `Kliknite ali odložite datoteke sem.`,
dictFallbackMessage: "Vaš brskalnik ne podpira izbiranje datotek z odlaganjem (\"drag & drop\").",
dictInvalidFileType: "Datoteka je napačnega formata.",
dictFileTooBig: "Datoteke je prevelika {{filesize}}. Največja dovoljena velikost: {{maxFilesize}}MiB.",
dictResponseError: "Napaka strežnika: {{statusCode}}",
dictMaxFilesExceeded: "Ne morete naložiti več datotek.",
dictCancelUpload: "",
dictRemoveFile: "",
dictCancelUpload: "Prekini prenos",
dictRemoveFile: "Odstrani datoteko",
dictCancelUploadConfirmation: "Ali res želite odstraniti to datoteko?",
dictUploadCanceled: "Prenos prekinjen",
addRemoveLinks: true,
// The setting up of the dropzone
init: function() {
var dz = this;
dataConfirmNotification.style.display = "none";
errorMessage.style.display = "none";
successMessage.style.display = "none";
selectPredmet.addEventListener("change", function(e) {
var predmetCustomBox = document.getElementById("predmet-custom-box");
if (selectPredmet.value.startsWith("drug")) {
predmetCustomBox.style.display = "inherit";
} else {
predmetCustomBox.style.display = "none";
}
});
selectVrsta.addEventListener("change", function(e) {
var vrstaCustomBox = document.getElementById("vrsta-custom-box");
if (selectVrsta.value == "delo-v-razredu") {
vrstaCustomBox.style.display = "inherit";
} else {
vrstaCustomBox.style.display = "none";
}
});
btnSubmit.addEventListener("click", function(e) {
// Make sure that the form isn't actually being sent.
@ -376,7 +209,6 @@
e.stopPropagation();
// Check form validity.
var regija = form["regija"].value;
var program = form["program"].value;
var predmet = form["predmet"].value;
var predmetCustom = form["predmet-custom"].value;
@ -386,22 +218,27 @@
var solskoLeto = form["solsko-leto"].value;
var jezikovniPopravki = form["jezikovni-popravki"].value;
if (predmet.startsWith("D") && isEmptyOrSpaces(predmetCustom)) {
showError("Polje za predmet ne more biti prazno!");
} else if (vrsta === "R" && isEmptyOrSpaces(vrstaCustom)) {
showError("Polje za vrsto besedila ne more biti prazno!");
if (predmet.startsWith("drug") && isEmptyOrSpaces(predmetCustom)) {
alert("Polje za predmet ne more biti prazno!");
} else if (vrsta === "delo-v-razredu" && isEmptyOrSpaces(vrstaCustom)) {
alert("Polje za vrsto besedila ne more biti prazno!");
} else if (dataConfirmNotification.style.display == "none") {
dataConfirmNotification.style.display = "inherit";
btnSubmit.style.display = "none";
btnSubmit.textContent = "Potrdi";
} else {
// Then make terms popup visible
//btnSubmit.disabled = true;
//btnSubmitFinal.disabled = true;
//elemTermsPopup.style.display = "inline";
//scrollboxtriggered = false;
// Hand off data to dropzone
//dz.processQueue();
dz.processQueue();
// Clear fields and hide popup agian
dataConfirmNotification.style.display = "none";
btnSubmit.textContent = "Oddaj";
//form.reset();
form.reset();
}
});
@ -410,56 +247,73 @@
btnSubmitFinal.addEventListener("click", function(e) {
// Hand off data to dropzone
dz.processQueue();
// Clear fields and hide popup agian
btnSubmit.disabled = false;
elemTermsPopup.style.display = "none";
dataConfirmNotification.style.display = "none";
btnSubmit.textContent = "Oddaj";
form.reset();
scrollboxTriggered = false;
});
// Listen to the sendingmultiple event. In this case, it's the sendingmultiple event instead
btnSubmitCancel.addEventListener("click", function(e) {
btnSubmit.disabled = false;
scrollboxTriggered = false;
elemTermsPopup.style.display = "none";
});
btnZgodovina.addEventListener("click", function(e) {
e.preventDefault();
e.stopPropagation();
window.location.replace("../zgodovina");
});
btnPogodbe.addEventListener("click", function(e) {
e.preventDefault();
e.stopPropagation();
window.location.replace("../pogodbe");
});
// Enable final submit button only if user scrolls to the end of the terms.
function checkScrollboxTrigger(event) {
var element = event.target;
if (!scrollboxTriggered
&& element.scrollHeight - element.scrollTop <= element.clientHeight + 50
) {
scrollboxTriggered = true;
btnSubmitFinal.disabled = false;
}
}
termsScrollbox.addEventListener('scroll', function(event) {
checkScrollboxTrigger(event);
});
termsScrollbox.addEventListener("mouseenter", function(event) {
checkScrollboxTrigger(event);
});
// Listen to the sendingmultiple event. In this case, it's the sendingmultiple event instead
// of the sending event because uploadMultiple is set to true.
this.on("sendingmultiple", function() {
// Gets triggered when the form is actually being sent.
// Hide the success button or the complete form.
});
this.on("successmultiple", function(files, response) {
showSuccess(response);
dz.removeAllFiles();
dataConfirmNotification.style.display = "none";
btnSubmit.style.display = "";
return;
this.on("successmultiple", function(files, response) {
// Gets triggered when the files have successfully been sent.
// Redirect user or notify of success.
alert("Odgovor strežnika: " + response);
location.reload();
});
this.on("errormultiple", function(files, response) {
// Gets triggered when there was an error sending the files.
// Maybe show form again, and notify user of error
});
this.on("sending", function(file, xhr, formData) {
formData.append("regija",form["regija"].value);
formData.append("program",form["program"].value);
formData.append("predmet",form["predmet"].value);
formData.append("predmet-custom",form["predmet-custom"].value);
formData.append("letnik",form["letnik"].value);
formData.append("vrsta",form["vrsta"].value);
formData.append("vrsta-custom",form["vrsta-custom"].value);
formData.append("solsko-leto",form["solsko-leto"].value);
formData.append("jezikovni-popravki",form["jezikovni-popravki"].value);
});
},
uploadprogress: function(file, progress, bytesSent) {
if (file.previewElement) {
//console.log(progress);
var progressElement = file.previewElement.querySelector("[data-dz-uploadprogress]");
progressElement.style.width = progress + "%";
//progressElement.querySelector(".progress-text").textContent = progress + "%";
}
}
}
</script>
</body>

View File

@ -3,261 +3,170 @@
<head>
<meta charset="UTF-8">
<title>Portal za oddajanje besedil</title>
<link rel="icon" href="/static/favicon.ico" type="image/x-icon" >
<link rel="icon" href="static/favicon.svg" sizes="any" type="image/svg+xml">
<link rel="stylesheet" href="{{ROUTE_PREFIX}}/static/css/header.css" type="text/css">
<link rel="stylesheet" href="{{ROUTE_PREFIX}}/static/css/form.css" type="text/css">
<link rel="stylesheet" href="{{ROUTE_PREFIX}}/static/css/simple-grid.css" type="text/css">
<link rel="stylesheet" href="{{ROUTE_PREFIX}}/static/css/contracts.css" type="text/css">
<link rel="stylesheet" href="/static/style.css" type="text/css">
</head>
<body>
<header>
<div class="logo"><a href="{{ROUTE_PREFIX}}/"><img src="{{ROUTE_PREFIX}}/static/image/logo-white.svg"/></a></div>
<div class="menu-items">
{% if is_institution_coordinator %}
<a href="{{ROUTE_PREFIX}}/manage-institution">Upravljaj z ekipo</a>
{% endif %}
{% if is_admin %}
<a href="{{ROUTE_PREFIX}}/admin">Administracijski meni</a>
{% endif %}
<a href="https://slovenscina.eu/" target="_blank">Več informacij o sodelovanju</a>
<a href="{{ROUTE_PREFIX}}/logout">Odjava</a>
</div>
</header>
<div class="container" style="margin-top:8rem;">
<div class="row">
<div class="col-12">
<h1 class="title">Korpus Šolar</h1>
<p class="subtitle"></p>
<div class="tab-nav">
<a href="{{ROUTE_PREFIX}}/oddaja">Oddaja besedil</a>
<a href="{{ROUTE_PREFIX}}/zgodovina">Zgodovina sodelovanja</a>
<a href="{{ROUTE_PREFIX}}/pogodbe" class="active">Ekipa</a>
<a href="../logout">Odjavi se</a>
{% if is_institution_coordinator %}
<br><a href="../manage-institution">Upravljaj z institucijo</a>
{% endif %}
{% if is_admin %}
<br><a href="../admin">Administracijski meni</a>
{% endif %}
<br><a href="mailto:email@example.com">Pomoč</a>
<div class="bg"></div>
<div id="main-window">
<div id="rect1">
<div style="padding: 20px;">
<div id="logo-container">
<img src="/static/image/logo.svg" alt="logo"/>
</div>
<h1 id="title" style="font-size: 25px; position: relative;">Korpus ŠOLAR</h1>
<div class="selection-tabs">
<button onclick="window.location.replace('../oddaja');" class="selection-tab-button">ODDAJA</button>
<button onclick="window.location.replace('../zgodovina');" class="selection-tab-button">ZGODOVINA</button>
<button onclick="window.location.replace('../pogodbe');" class="selection-tab-button selected">POGODBE</button>
</div>
</div>
</div>
<!--<div class="row">
<div class="col-12">
<h2>Sodelujoči</h2>
</div>
</div>-->
<div class="row" id="my_dataviz_title">
<div class="col-12">
<h2>Število oddaj na uporabnika</h2>
</div>
</div>
<div class="row">
<div class="col-6">
<div id="my_dataviz">
{% with messages = get_flashed_messages() %}
{% if messages %}
<div class="message-notification">
{{ messages[0] }}
</div>
</div>
</div>
{% set vars = {'prev_schoolyear': ''} %}
{% for item in cooperation_history %}
{% if item[0] != vars.prev_schoolyear %}
<div class="row">
<div class="col-12">
<h2>Šolsko leto {{item[0]}}</h2>
<div id="contract-container" style="height: 250px;">
{% else %}
<div id="contract-container">
{% endif %}
{% endwith %}
{% if contract_school %}
<div class="contract-item">
<img src="/static/image/contract.png" alt="contract" class="contract-item-icon"/>
<div class="contract-item-title">Pogodba s šolo</div>
<div class="contract-item-data">{{contract_school.original_filename}}</div>
<div class="contract-item-data">DODANO: {{contract_school.timestamp}}</div>
<a href="../pogodbe-institucije/{{ contract_school.file_contract }}.pdf" class="contract-item-button">Prenesi</a>
</div>
</br>
{% endif %}
{% for item in contracts_students %}
<div class="contract-item">
<img src="/static/image/contract.png" alt="contract" class="contract-item-icon"/>
<div class="contract-item-title" style="font-size: 12px;">{{item.original_filename}}</div>
<div class="contract-item-data">Pogodba o prenosu lastništva</div>
<div class="contract-item-data">DODANO: {{item.timestamp}}</div>
<a href="../pogodbe-ucencistarsi/{{ item.file_contract }}.pdf" class="contract-item-button">Prenesi</a>
</div>
</div>
{% if vars.update({'prev_schoolyear': item[0]}) %} {% endif %}
{% endif %}
{% for entry in item[1] %}
<div class="row">
<div class="col-6">
<div class="team-item">
<div class="team-item-name">{{entry.name}} <span class="team-item-role">{%if entry.role == "mentor" %}Mentor/-ica{%elif entry.role == "coordinator" %}Koordinator/-ica{%elif entry.role == "other" %}Druga vloga{%endif%}</span></div>
</br>
{% endfor %}
</div>
</br>
</br>
{% if show_upload_form %}
<div style="padding: 20px; position: absolute; top: 500px; width: 89%;">
<div class="section-desc">Oddaj pogodbo</div>
<form action="../pogodbe" method="post" enctype="multipart/form-data">
{% if enable_upload_school_contract %}
<div style="display:flex; flex-direction: row; justify-content: left; align-items: center">
<label style="width: 80%; text-align: right;" for="sola">Pogodba s šolo</label>
<input style="width: 20%;" type="radio" id="sola" name="tip-pogodbe" value="sola">
</div>
</div>
</div>
{% endfor %}
{% endfor %}
<div class="row" id="my_dataviz__region_title">
<div class="col-12">
<h2>Število vseh oddaj po regijah</h2>
{% else %}
<div style="display:flex; flex-direction: row; justify-content: left; align-items: center">
<label style="width: 80%; text-align: right;" for="sola">Pogodba s šolo</label>
<input style="width: 20%;"type="radio" id="sola" name="tip-pogodbe" value="sola" disabled>
</div>
{% endif %}
<div style="display:flex; flex-direction: row; justify-content: left; align-items: center">
<label style="width: 80%; text-align: right;" for="ucenci-starsi">Pogodba z učenci / starši</label>
<input style="width: 20%;" type="radio" id="ucenci-starsi" name="tip-pogodbe" value="ucenci-starsi" checked>
</div>
<input style="font-size: 10px;" type="file" id="file-contract" name="file[]" multiple="">
<button style="float: right;" type="submit">Oddaj pogodbo</button>
</form>
</div>
{% endif %}
</div>
<div class="row">
<div class="col-6">
<div id="my_dataviz_region">
<div id="rect2" class="mock-side">
<div id="collaborators-container">
<div class="container-title">Sodelujoči</div>
<div style="overflow-y: auto;">
{% for collaborator in collaborators %}
<div class="collaborators-item">
<div class="collaborators-item-name">{{collaborator.name}}</div>
{% if collaborator.id in cooperation_history %}
{% if cooperation_history[collaborator.id]["coordinator"]|length > 0 %}
<div class="collaborators-item-years"><b>Vodenje:</b> {% for item in cooperation_history[collaborator.id]["coordinator"] %}
{% if loop.index != 1 %}, {% endif %}
{{item[0]}}
{% endfor %}</div>
{% endif %}
{% if cooperation_history[collaborator.id]["mentor"]|length > 0 %}
<div class="collaborators-item-years"><b>Mentorstvo:</b> {% for item in cooperation_history[collaborator.id]["mentor"] %}
{% if loop.index != 1 %}, {% endif %}
{{item[0]}}
{% endfor %}</div>
{% endif %}
{% if cooperation_history[collaborator.id]["other"]|length > 0 %}
<div class="collaborators-item-years"><b>Drugo:</b> {% for item in cooperation_history[collaborator.id]["other"] %}
{% if loop.index != 1 %}, {% endif %}
{{item[0]}}
{% endfor %}</div>
{% endif %}
{% endif %}
</div>
{% endfor %}
</div>
<div>
<div style="display:inline-block;width:12px;height:12px;background:#006CB7"></div>
<p style="display:inline-block">Osnovne šole</p>
<div style="margin-left:32px;display:inline-block;width:12px;height:12px;background:#B86D00"></div>
<p style="display:inline-block">Sredje šole</p>
</div>
<div id="awards-container">
<div class="container-title">Sodelovanje v letih</div>
<div style="overflow-y: auto; margin: auto; width: 100%; height: 200px;">
{% if cooperation_history.keys()|length > 0 %}
{% if user_id in cooperation_history %}
{% for item in cooperation_history[user_id]['coordinator'] %}
<div style="border-bottom: 2px solid #c4c4c4; min-height: 50px; margin-bottom: 10px;">
<img src="/static/image/star.png" alt="star" style="float: left; width: 40px;"/>
<div class="collaborators-item-name"
style="float: right; width: 250px; text-align: left; margin-left: 20px;text-overflow: ellipsis; overflow: hidden; white-space: nowrap;">
{{item[1]}}
</div>
<div class="collaborators-item-name"
style="float: right; width: 250px; text-align: left; margin-left: 20px;">
{{item[0]}}
</div>
</div>
{% endfor %}
{% for item in cooperation_history[user_id]['mentor'] %}
<div style="border-bottom: 2px solid #c4c4c4; min-height: 50px; margin-bottom: 10px;">
<img src="/static/image/star.png" alt="star" style="float: left; width: 40px;"/>
<div class="collaborators-item-name"
style="float: right; width: 250px; text-align: left; margin-left: 20px;text-overflow: ellipsis; overflow: hidden; white-space: nowrap;">
{{item[1]}}
</div>
<div class="collaborators-item-name"
style="float: right; width: 250px; text-align: left; margin-left: 20px;">
{{item[0]}}
</div>
</div>
{% endfor %}
{% for item in cooperation_history[user_id]['other'] %}
<div style="border-bottom: 2px solid #c4c4c4; min-height: 50px; margin-bottom: 10px;">
<img src="/static/image/star.png" alt="star" style="float: left; width: 40px;"/>
<div class="collaborators-item-name"
style="float: right; width: 250px; text-align: left; margin-left: 20px;text-overflow: ellipsis; overflow: hidden; white-space: nowrap;">
{{item[1]}}
</div>
<div class="collaborators-item-name"
style="float: right; width: 250px; text-align: left; margin-left: 20px;">
{{item[0]}}
</div>
</div>
{% endfor %}
{% endif %}
{% endif %}
</div>
</div>
</div>
</div>
<br/><br/><br/><br/><br/><br/><br/><br/><br/><br/><br/><br/><br/><br/><br/><br/><br/><br/>
</body>
<script src="https://d3js.org/d3.v6.js"></script>
<style>
#my_dataviz .tick line{
visibility:hidden;
}
#my_dataviz path.domain{
visibility:hidden;
}
#my_dataviz_region .tick line{
visibility:hidden;
}
#my_dataviz_region path.domain{
visibility:hidden;
}
</style>
<script>
var data;
// Parse the Data
d3.json("/topuploads-institution/{{institution_id}}").then(function(jsondata) {
if(Object.keys(jsondata).length < 1) {
document.getElementById("my_dataviz_title").remove();
return;
}
data = [];
console.log(Object.keys(jsondata).length);
var margin = {top: 20, right: 0, bottom: 40, left: 0};
var width = document.getElementById("my_dataviz").clientWidth - margin.left - margin.right;
var height = Object.keys(jsondata).length * 56;
var svg = d3.select("#my_dataviz")
.append("svg")
.attr("width", width + margin.left + margin.right)
.attr("height", height + margin.top + margin.bottom)
.style("overflow","visible")
.append("g")
.attr("transform",
"translate(" + margin.left + "," + margin.top + ")");
for(var key in jsondata) {
data.push({'name': key, 'value':jsondata[key]});
}
console.log(data);
// Add X axis
var x = d3.scaleLinear()
.domain([0,d3.max(data, function (d) { return d.value})])
.range([ 0, width]);
svg.append("g")
.attr("transform", "translate(0," + height + ")")
.call(d3.axisBottom(x))
.selectAll("text")
.style("text-anchor", "center");
// Y axis
var y = d3.scaleBand()
.range([ 0, data.length*56 ])
.domain(data.map(function(d) { return d.name; }))
.padding(0);
svg.append("g")
.call(d3.axisLeft(y))
.selectAll("text")
.style("text-anchor", "start")
.style("font-size", "14px")
.attr("transform", "translate(8,-36)");
//Bars
svg.selectAll("myRect")
.data(data)
.enter()
.append("rect")
.attr("x", x(0) )
.attr("y", function(d) { return y(d.name); })
.attr("width", function(d) { return x(d.value); })
.attr("height", 32 )
.attr("fill", "#006CB7");
})
</script>
<script>
var data;
// Parse the Data
d3.json("/uploadstats-per-region").then(function(jsondata) {
data = [];
console.log(Object.keys(jsondata).length);
var margin = {top: 20, right: 0, bottom: 40, left: 0};
var width = document.getElementById("my_dataviz_region").clientWidth - margin.left - margin.right;
var height = Object.keys(jsondata).length * 56;
var svg = d3.select("#my_dataviz_region")
.append("svg")
.attr("width", width + margin.left + margin.right)
.attr("height", height + margin.top + margin.bottom)
.style("overflow","visible")
.append("g")
.attr("transform",
"translate(" + margin.left + "," + margin.top + ")");
for(var key in jsondata) {
data.push({'name': key, 'value':jsondata[key]});
}
console.log(data);
// Add X axis
var x = d3.scaleLinear()
.domain([0,d3.max(data, function (d) { return Math.max(...d.value)})])
.range([ 0, width]);
svg.append("g")
.attr("transform", "translate(0," + height + ")")
.call(d3.axisBottom(x))
.selectAll("text")
.style("text-anchor", "center");
// Y axis
var y = d3.scaleBand()
.range([ 0, data.length*56 ])
.domain(data.map(function(d) { return d.name; }))
.padding(0);
svg.append("g")
.call(d3.axisLeft(y))
.selectAll("text")
.style("text-anchor", "start")
.style("font-size", "14px")
.attr("transform", "translate(8,-36)");
//Bars
svg.selectAll("myRect")
.data(data)
.enter()
.append("rect")
.attr("x", x(0) )
.attr("y", function(d) { return y(d.name); })
.attr("width", function(d) { return x(d.value[0]); })
.attr("height", 16 )
.attr("fill", "#006CB7");
svg.selectAll("myRect")
.data(data)
.enter()
.append("rect")
.attr("x", x(0) )
.attr("y", function(d) { return y(d.name); })
.attr("width", function(d) { return x(d.value[1]); })
.attr("height", 16 )
.attr("transform", "translate(0,16)")
.attr("fill", "#B86D00");
})
</script>
</html>

View File

@ -3,86 +3,67 @@
<head>
<meta charset="UTF-8">
<title>Portal ŠOLAR</title>
<link rel="icon" href="/static/favicon.ico" type="image/x-icon" >
<link rel="icon" href="static/favicon.svg" sizes="any" type="image/svg+xml">
<link rel="stylesheet" href="{{ROUTE_PREFIX}}/static/css/login-styles.css" type="text/css">
<link rel="stylesheet" href="{{ROUTE_PREFIX}}/static/css/utils.css" type="text/css">
<link rel="stylesheet" href="/static/style.css" type="text/css">
</head>
<body>
<div id="main-window">
<div id="rect1">
<div style="padding: 50px;">
<div id="logo-container">
<img src="/static/image/logo.svg" alt="logo"/>
</div>
<h1 id="title">Portal za oddajanje besedil</h1>
<h2 id="subtitle">Korpus Šolar</h2>
<div class="background">
<div class="panel login-panel">
<div class="panel-logo">
<img src="{{ROUTE_PREFIX}}/static/image/logo.svg" alt="logo"/>
</div>
<h2 class="text-center">Portal za oddajanje besedil</h2>
<div class="line"></div>
<h1 class="text-center">Korpus ŠOLAR</h1>
<div class="form-text"><em>Zbiranje besedil za korpus Šolar poteka po naslednjem postopku, ki prinaša tudi točke za napredovanje.</em></div>
<div class="text-center m-b-3"><em>Zbiranje besedil za korpus Šolar poteka po naslednjem postopku, ki prinaša tudi točke za napredovanje v pedagoški naziv.</em></div>
<a href="../login" class="contract-item-button" style="float: none;">Nazaj na prijavo</a>
<h3 id="title" style="font-size: 27px; text-align: left;">Registracija</h3>
<div>
{% with messages = get_flashed_messages() %}
{% if messages %}
<div>
{{ messages[0] }}
</div>
{% endif %}
{% endwith %}
<form method="POST" action="../register">
<div>
<div>
<input type="name" name="name" placeholder="Ime in priimek" autofocus="">
</div>
</div>
<h1 class="m-b-3">Registracija</h1>
{% with messages = get_flashed_messages() %}
{% if messages %}
<div class="alert">
<img src="{{ROUTE_PREFIX}}/static/image/alert.svg" alt="alert"/>
<p>{{ messages[0] }}</p>
</div>
{% endif %}
{% endwith %}
<div>
<form method="POST" action="{{ROUTE_PREFIX}}/register" class="m-b-2">
<div class="input-wrapper">
<img src="{{ROUTE_PREFIX}}/static/image/user.svg" alt="user" class="input-icon"/>
<div class="input-floating-label">
<label>Ime in priimek</label>
<input type="name" name="name" autofocus="">
</div>
</div>
<div class="input-wrapper">
<img src="{{ROUTE_PREFIX}}/static/image/user.svg" alt="user" class="input-icon"/>
<div class="input-floating-label">
<label>Email</label>
<input type="email" name="email">
</div>
</div>
<div class="input-wrapper">
<img src="{{ROUTE_PREFIX}}/static/image/password.svg" alt="user" class="input-icon"/>
<div class="input-floating-label">
<label>Geslo</label>
<input type="password" name="password">
<label class="input-hint">Geslo naj bo dolgo vsaj 8 znakov.</label>
</div>
</div>
<div class="input-wrapper">
<img src="{{ROUTE_PREFIX}}/static/image/user.svg" alt="user" class="input-icon"/>
<div class="input-floating-label">
<label>Naziv institucije</label>
<input type="institution" name="institution">
</div>
</div>
<div class="input-wrapper">
<img src="{{ROUTE_PREFIX}}/static/image/password.svg" alt="user" class="input-icon"/>
<div class="input-floating-label">
<label>Vloga v instituciji</label>
<div>
<div>
<input type="email" name="email" placeholder="Email" autofocus="">
</div>
</div>
<div>
<div>
<input type="password" name="password" placeholder="Geslo">
</div>
</div>
<div>
<div>
<input type="institution" name="institution" placeholder="Naziv institucije" autofocus="">
</div>
</div>
<label for="role">Vloga v instituciji</label>
<select id="role" name="role" >
<option value="coordinator">Koordinator/-ka</option>
<option value="mentor">Mentor/-ica</option>
<option value="other">Druga vloga</option>
</select>
</div>
<button class="button-general" style="margin-top: 20px;">REGISTRACIJA</button>
</form>
</div>
<button class="btn" style="margin-left: 46px;">REGISTRACIJA</button>
</form>
</div>
</div>
<div class="back-to-login">
<img src="{{ROUTE_PREFIX}}/static/image/chevron-left.svg"/>
<a href="{{ROUTE_PREFIX}}/login">Nazaj na prijavo</a>
<div id="rect2" class="mock-side">
</div>
</div>
</div>
</body>

View File

@ -3,40 +3,36 @@
<head>
<meta charset="UTF-8">
<title>Portal ŠOLAR</title>
<link rel="icon" href="/static/favicon.ico" type="image/x-icon" >
<link rel="icon" href="static/favicon.svg" sizes="any" type="image/svg+xml">
<link rel="stylesheet" href="{{ROUTE_PREFIX}}/static/css/login-styles.css" type="text/css">
<link rel="stylesheet" href="{{ROUTE_PREFIX}}/static/css/utils.css" type="text/css">
<link rel="stylesheet" href="/static/style.css" type="text/css">
</head>
<body>
<div class="background">
<div class="panel login-panel">
<div class="panel-logo">
<img src="{{ROUTE_PREFIX}}/static/image/logo.svg" alt="logo"/>
</div>
<h1 class="m-b-3">Ponastavitev gesla - ŠOLAR</h1>
<div>
<form method="POST" action="" class="m-b-2">
<div class="input-wrapper">
<img src="{{ROUTE_PREFIX}}/static/image/password.svg" alt="user" class="input-icon"/>
<div class="input-floating-label">
<label>Novo geslo</label>
<input type="password" name="new_password">
<label class="input-hint">Geslo naj bo dolgo vsaj 8 znakov.</label>
</div>
<div id="main-window">
<div id="rect1">
<div style="padding: 50px;">
<div id="logo-container">
<img src="/static/image/logo.svg" alt="logo"/>
</div>
<h3 id="title" style="font-size: 27px; text-align: left;">Ponastavitev gesla - ŠOLAR</h3>
<div>
{% with messages = get_flashed_messages() %}
{% if messages %}
<div>
{{ messages[0] }}
</div>
{% endif %}
{% endwith %}
<form method="POST" action="">
<div>
<div>
<input type="password" name="new_password" placeholder="Novo geslo">
</div>
</div>
<button class="button-general" style="margin-top: 20px;">PONASTAVI</button>
</form>
</div>
<button class="btn" style="margin-left: 46px;">Ponastavi</button>
</form>
{% with messages = get_flashed_messages() %}
{% if messages %}
<div class="alert">
<img src="{{ROUTE_PREFIX}}/static/image/alert.svg" alt="alert"/>
<p>{{ messages[0] }}</p>
</div>
{% endif %}
{% endwith %}
</div>
<div id="rect2" class="mock-side">
</div>
</div>
</div>
</body>

View File

@ -3,213 +3,120 @@
<head>
<meta charset="UTF-8">
<title>Portal za oddajanje besedil</title>
<!--<link rel="stylesheet" href="{{ROUTE_PREFIX}}/static/style.css" type="text/css">-->
<script src="{{ROUTE_PREFIX}}/static/chart.js"></script>
<link rel="icon" href="/static/favicon.ico" type="image/x-icon" >
<link rel="icon" href="static/favicon.svg" sizes="any" type="image/svg+xml">
<link rel="stylesheet" href="{{ROUTE_PREFIX}}/static/css/header.css" type="text/css">
<link rel="stylesheet" href="{{ROUTE_PREFIX}}/static/css/form.css" type="text/css">
<link rel="stylesheet" href="{{ROUTE_PREFIX}}/static/css/simple-grid.css" type="text/css">
<link rel="stylesheet" href="{{ROUTE_PREFIX}}/static/css/history.css" type="text/css">
<link rel="stylesheet" href="/static/style.css" type="text/css">
<script src="/static/chart.js"></script>
</head>
<body>
<header>
<div class="logo"><a href="{{ROUTE_PREFIX}}/"><img src="{{ROUTE_PREFIX}}/static/image/logo-white.svg"/></a></div>
<div class="menu-items">
{% if is_institution_coordinator %}
<a href="{{ROUTE_PREFIX}}/manage-institution">Upravljaj z ekipo</a>
{% endif %}
{% if is_admin %}
<a href="{{ROUTE_PREFIX}}/admin">Administracijski meni</a>
{% endif %}
<a href="https://slovenscina.eu/" target="_blank">Več informacij o sodelovanju</a>
<a href="{{ROUTE_PREFIX}}/logout">Odjava</a>
</div>
</header>
<div class="container" style="margin-top:8rem;">
<div class="row">
<div class="col-12">
<h1 class="title">Korpus Šolar</h1>
<p class="subtitle"></p>
<div class="tab-nav">
<a href="{{ROUTE_PREFIX}}/oddaja">Oddaja besedil</a>
<a href="{{ROUTE_PREFIX}}/zgodovina" class="active">Zgodovina sodelovanja</a>
<a href="{{ROUTE_PREFIX}}/pogodbe">Ekipa</a>
<a href="../logout">Odjavi se</a>
{% if is_institution_coordinator %}
<br><a href="../manage-institution">Upravljaj z institucijo</a>
{% endif %}
{% if is_admin %}
<br><a href="../admin">Administracijski meni</a>
{% endif %}
<br><a href="mailto:email@example.com">Pomoč</a>
<div class="bg"></div>
<div id="main-window">
<div id="rect1">
<div style="padding: 20px;">
<div id="logo-container">
<img src="/static/image/logo.svg" alt="logo"/>
</div>
<h1 id="title" style="font-size: 25px; position: relative;">Korpus ŠOLAR</h1>
<div class="selection-tabs">
<button onclick="window.location.replace('../oddaja');" class="selection-tab-button">ODDAJA</button>
<button onclick="window.location.replace('../zgodovina');" class="selection-tab-button selected">ZGODOVINA</button>
<button onclick="window.location.replace('../pogodbe');" class="selection-tab-button">POGODBE</button>
</div>
</div>
</div>
<!--<div class="row">
<div class="col-12">
<h2>Zgodovina naloženih datotek</h2>
</div>
</div>-->
{% set map_program = {
"OS" : "Osnovna šola",
"SSG" : "Splošna in strokovna gimnazija",
"MGP" : "Mednarodni gimnazijski programi",
"ZG" : "Zasebne gimnazije",
"NPI" : "Nižje poklicno izobraževanje",
"SPI" : "Srednje poklicno izobraževanje",
"SSI" : "Srednje strokovno izobraževanje",
"PTI" : "Poklicno-tehnično izobraževanje"
}%}
{% set map_subject = {
"SLO" : "Slovenščina",
"DJP" : "Drugi jezikoslovni predmeti",
"DDP" : "Drugi družboslovni predmeti",
"DNP" : "Drugi naravoslovni predmeti",
"DSP" : "Drugi strokovni predmeti",
"DIP" : "Drugi izbirni ali dodatni predmeti",
}%}
{% set map_text_type = {
"E" : "Esej ali spis",
"PB" : "Praktično besedilo, napisano za oceno",
"T" : "Šolski test",
"R" : "Delo v razredu, ne za oceno",
}%}
{% set map_grammar_corrections = {
"DD" : "Besedilo vsebuje učiteljske popravke",
"N" : "Besedilo ne vsebuje učiteljskih popravkov",
"DN" : "Besedilo vsebuje učiteljske popravke in ne strinjam se z njihovo vključitvijo v korpus",
}%}
{% set map_regions = {
"CE" : "Celje",
"GO" : "Nova Gorica",
"KK" : "Krško",
"KP" : "Koper",
"KR" : "Kranj",
"LJ" : "Ljubljana",
"MB" : "Maribor",
"MS" : "Murska Sobota",
"NM" : "Novo Mesto",
"PO" : "Postojna",
"SG" : "Slovenj Gradec",
}%}
{% if upload_history|length == 0 %}
<div class="row">
<div class="col-6">
<p>Zgodovina sodelovanja je trenutno še prazna.</p>
</div>
</div>
{% endif %}
{% for item in upload_history %}
{% set item_values = [] %}
{% if institution_names[loop.index - 1] %}
{% set item_values = item_values + [institution_names[loop.index - 1]] %}
{% endif %}
{% if item.region %}
{% set item_values = item_values + [map_regions[item.region]] %}
{% endif %}
{% if item.program %}
{% set item_values = item_values + [map_program[item.program]] %}
{% endif %}
{% if item.subject %}
{% set item_values = item_values + [map_subject[item.subject]] %}
{% endif %}
{% if item.subject_custom %}
{% set item_values = item_values + [item.subject_custom] %}
{% endif %}
{% if item.grade %}
{% set item_values = item_values + [item.grade ~ ". razred"] %}
{% endif %}
{% if item.text_type %}
{% set item_values = item_values + [map_text_type[item.text_type]] %}
{% endif %}
{% if item.text_type_custom %}
{% set item_values = item_values + [item.text_type_custom] %}
{% endif %}
{% if item.school_year %}
{% set item_values = item_values + ['20' ~ item.school_year | replace("-", "/")] %}
{% endif %}
{% if item.grammar_corrections %}
{% set item_values = item_values + [map_grammar_corrections[item.grammar_corrections]] %}
{% endif %}
<div class="row">
<div class="col-12">
<div class="history-item">
<div class="history-item-date">Dodano {{ item.timestamp.strftime('%d. %m. %Y') }}</div>
<div class="history-item-uploader">{{ uploader_names[loop.index - 1] }}</div>
<div class="history-item-filecount">Št. datotek: {{ item.upload_file_hashes|length }}</div>
<div class="history-item-chevron"><img src="{{ROUTE_PREFIX}}/static/image/chevron-down.svg"/></div>
<div class="history-item-desc">
{{ item_values | join(" | ") |truncate(120) }}
</div>
<div class="row">
<div class="col-6" style="margin:0">
<div class="history-item-desc-full">
{% for v in item_values %}
{{v}}<br>
{% endfor %}
</div>
</div>
<div class="col-6" style="margin:0">
<div class="history-item-files-full">
{% if item.upload_file_names != None %}
{% for f_name in item.upload_file_names %}
<div class="file-item">
<div class="file-icon"><img src="{{ROUTE_PREFIX}}/static/image/file.svg"/></div>
<a href="getuploadfile/{{item.id}}/{{item.upload_file_hashes[loop.index - 1]}}" class="file-name" {% if item.upload_file_codes != None %}download="{{item.upload_file_codes[loop.index - 1]}}.{{f_name.split('.')[1]}}"{%endif%}>
{% if item.upload_file_codes != None %}
{{item.upload_file_codes[loop.index - 1]}}.{{f_name.split('.')[1]}}
{%else%}
{{f_name}}
{% endif %}
</a>
</br>
{% if item.upload_file_codes != None %}
<!--<div>{{item.upload_file_codes[loop.index - 1]}}</div>-->
{% endif %}
</div>
{% endfor %}
{% else %}
{% for f_hash in item.upload_file_hashes %}
<div class="file-item">
<div class="file-icon"><img src="{{ROUTE_PREFIX}}/static/image/file.svg"/></div>
<a href="getuploadfile/{{item.id}}/{{f_hash}}" class="file-name">{{f_hash}}</a>
</div>
{% endfor %}
{% endif %}
</div>
<div id="history-container" style="padding: 20px;">
{% for item in upload_history %}
<div class="history-item">
<div class="history-item-date">{{ item.timestamp }}</div>
<div class="history-item-uploader">{{ uploader_names[loop.index - 1] }}</div>
<div class="history-item-filecount">Št. datotek: {{ item.upload_file_hashes|length }}</div>
<div class="history-item-desc">
[
{% set began = False %}
{% if institution_names[loop.index - 1] %}
{% if began %}, {% endif %} {{ institution_names[loop.index - 1] }}
{% set began = True %}
{% endif %}
{% if item.program %}
{% if began %}, {% endif %} {{ item.program }}
{% set began = True %}
{% endif %}
{% if item.subject %}
{% if began %}, {% endif %} {{ item.subject }}
{% set began = True %}
{% endif %}
{% if item.subject_custom %}
{% if began %}, {% endif %} {{ item.subject_custom }}
{% set began = True %}
{% endif %}
{% if item.grade %}
{% if began %}, {% endif %} {{ item.grade }}
{% set began = True %}
{% endif %}
{% if item.text_type %}
{% if began %}, {% endif %} {{ item.text_type }}
{% set began = True %}
{% endif %}
{% if item.text_type_custom %}
{% if began %}, {% endif %} {{ item.text_type_custom }}
{% set began = True %}
{% endif %}
{% if item.school_year %}
{% if began %}, {% endif %} {{ item.school_year }}
{% set began = True %}
{% endif %}
{% if item.grammar_corrections %}
{% if began %}, {% endif %} {{ item.grammar_corrections }}
{% set began = True %}
{% endif %}
]
</div>
</div>
</div>
</br>
{% endfor %}
</div>
</div>
{% endfor %}
<div id="rect2" class="mock-side">
<canvas id="myChart" width="400" height="400"></canvas>
<script>
function drawChart(data) {
var ctx = document.getElementById('myChart').getContext('2d');
var myChart = new Chart(ctx, {
type: 'bar',
data: {
labels: Object.keys(data),
datasets: [{
label: 'št. naloženih datotek',
data: Object.values(data),
backgroundColor: 'rgba(54, 162, 235, 1.0)',
borderWidth: 1
}]
},
options: {
plugins: {
title: {
display: true,
text: ''
}
},
scales: {
y: {
beginAtZero: true
}
},
indexAxis: 'y'
}
});
}
fetch('../topuploads').then(r => r.json()).then(j => drawChart(j));
</script>
</div>
</div>
<br/><br/><br/><br/><br/><br/><br/>
<script>
var toggleOpen = function() {
this.classList.toggle("open");
};
var elements = document.getElementsByClassName("history-item");
for (var i = 0; i < elements.length; i++) {
elements[i].addEventListener('click', toggleOpen, false);
}
var files = document.getElementsByClassName("file-item");
for (var i = 0; i < files.length; i++) {
files[i].addEventListener('click', function(e) {
e.stopPropagation();
}, false);
}
</script>
</body>
</html>