update predavanja, solar progress
This commit is contained in:
@@ -19,7 +19,7 @@ from email.mime.application import MIMEApplication
|
||||
import pdfkit
|
||||
from jinja2 import Environment, FileSystemLoader
|
||||
|
||||
from . model import db, UploadRegular, UploadSolar, RegisteredUser
|
||||
from . model import db, UploadRegular, UploadSolar, RegisteredUser, CorpusAccess, Institution
|
||||
|
||||
|
||||
ENABLED_FILETYPES = ['txt', 'csv', 'pdf', 'doc', 'docx', 'xls', 'xlsx', 'ppt', 'pptx', 'xml', 'mxliff', 'tmx']
|
||||
@@ -233,3 +233,15 @@ class UploadHandler:
|
||||
match = db.session.query(RegisteredUser).filter(RegisteredUser.id == user_id).one()
|
||||
return match.institution
|
||||
|
||||
|
||||
def has_user_corpus_access(user_id, corpus_name):
|
||||
user = RegisteredUser.query.filter_by(id=user_id).first()
|
||||
if user.role == 'admin':
|
||||
return True
|
||||
return CorpusAccess.query.filter_by(user_id=user.id, corpus=corpus_name).first() is not None
|
||||
|
||||
def get_user_obj(user_id):
|
||||
return RegisteredUser.query.filter_by(id=user_id).first()
|
||||
|
||||
def get_institution_obj(institution_id):
|
||||
return Institution.query.filter_by(id=institution_id).first()
|
||||
|
||||
121
portal/model.py
121
portal/model.py
@@ -16,70 +16,99 @@ db = SQLAlchemy()
|
||||
class UploadRegular(db.Model):
|
||||
__tablename__ = 'upload_regular'
|
||||
id = db.Column(db.Integer, primary_key=True)
|
||||
upload_hash = db.Column(db.String)
|
||||
timestamp = db.Column(db.DateTime, default=datetime.utcnow)
|
||||
name = db.Column(db.String)
|
||||
org = db.Column(db.String)
|
||||
address = db.Column(db.String)
|
||||
zipcode = db.Column(db.String)
|
||||
email = db.Column(db.String)
|
||||
file_contract = db.Column(db.String)
|
||||
upload_file_hashes = db.Column(sqlalchemy.types.ARRAY(db.String))
|
||||
corpus_name = db.Column(db.String)
|
||||
upload_hash = db.Column(db.String, nullable=False)
|
||||
timestamp = db.Column(db.DateTime, default=datetime.utcnow, nullable=False)
|
||||
name = db.Column(db.String, nullable=False)
|
||||
org = db.Column(db.String, nullable=True)
|
||||
address = db.Column(db.String, nullable=True)
|
||||
zipcode = db.Column(db.String, nullable=True)
|
||||
email = db.Column(db.String, nullable=False)
|
||||
file_contract = db.Column(db.String, nullable=True)
|
||||
upload_file_hashes = db.Column(sqlalchemy.types.ARRAY(db.String), nullable=True)
|
||||
corpus_name = db.Column(db.String, nullable=False)
|
||||
|
||||
|
||||
class UploadPredavanja(db.Model):
|
||||
__tablename__ = 'upload_predavanja'
|
||||
id = db.Column(db.Integer, primary_key=True)
|
||||
upload_hash = db.Column(db.String)
|
||||
timestamp = db.Column(db.DateTime, default=datetime.utcnow)
|
||||
name = db.Column(db.String)
|
||||
address = db.Column(db.String)
|
||||
subject = db.Column(db.String)
|
||||
faculty = db.Column(db.String)
|
||||
email = db.Column(db.String)
|
||||
phone = db.Column(db.String)
|
||||
keywords = db.Column(db.String)
|
||||
agree_publish = db.Column(db.Boolean)
|
||||
file_contract = db.Column(db.String)
|
||||
upload_file_hashes = db.Column(sqlalchemy.types.ARRAY(db.String))
|
||||
upload_hash = db.Column(db.String, nullable=False)
|
||||
timestamp = db.Column(db.DateTime, default=datetime.utcnow, nullable=False)
|
||||
name = db.Column(db.String, nullable=False)
|
||||
address = db.Column(db.String, nullable=False)
|
||||
subject = db.Column(db.String, nullable=False)
|
||||
faculty = db.Column(db.String, nullable=False)
|
||||
email = db.Column(db.String, nullable=False)
|
||||
phone = db.Column(db.String, nullable=True)
|
||||
keywords = db.Column(db.String, nullable=False)
|
||||
agree_publish = db.Column(db.Boolean, nullable=False)
|
||||
agree_publish_future = db.Column(db.String, nullable=False)
|
||||
agree_machine_translation = db.Column(db.Boolean, default=False, nullable=False)
|
||||
agree_news_cjvt = db.Column(db.Boolean, default=False, nullable=False)
|
||||
file_contract = db.Column(db.String, nullable=True)
|
||||
upload_file_hashes = db.Column(sqlalchemy.types.ARRAY(db.String), nullable=True)
|
||||
|
||||
|
||||
class UploadSolar(db.Model):
|
||||
__tablename__ = 'upload_solar'
|
||||
id = db.Column(db.Integer, primary_key=True)
|
||||
upload_user = db.Column(db.Integer, sqlalchemy.ForeignKey('registered_user.id'))
|
||||
institution = db.Column(db.Integer, sqlalchemy.ForeignKey('institution.id'))
|
||||
upload_hash = db.Column(db.String)
|
||||
timestamp = db.Column(db.DateTime, default=datetime.utcnow)
|
||||
program = db.Column(db.String)
|
||||
subject = db.Column(db.String)
|
||||
subject_custom = db.Column(db.String)
|
||||
grade = db.Column(db.Integer)
|
||||
text_type = db.Column(db.String)
|
||||
text_type_custom = db.Column(db.String)
|
||||
school_year = db.Column(db.String)
|
||||
grammar_corrections = db.Column(db.String)
|
||||
upload_file_hashes = db.Column(sqlalchemy.types.ARRAY(db.String))
|
||||
upload_user = db.Column(db.Integer, sqlalchemy.ForeignKey('registered_user.id'), nullable=True)
|
||||
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)
|
||||
program = db.Column(db.String, nullable=True)
|
||||
subject = db.Column(db.String, nullable=True)
|
||||
subject_custom = db.Column(db.String, nullable=True)
|
||||
grade = db.Column(db.Integer, nullable=True)
|
||||
text_type = db.Column(db.String, nullable=True)
|
||||
text_type_custom = db.Column(db.String, nullable=True)
|
||||
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)
|
||||
|
||||
|
||||
class StampsSolar(db.Model):
|
||||
__tablename__ = 'stamps_solar'
|
||||
id = db.Column(db.Integer, primary_key=True)
|
||||
institution = db.Column(db.Integer, sqlalchemy.ForeignKey('institution.id'), nullable=True)
|
||||
name = db.Column(db.String, nullable=False)
|
||||
file_logo = db.Column(db.String, nullable=True)
|
||||
|
||||
|
||||
class ContractsSolar(db.Model):
|
||||
__tablename__ = 'contracts_solar'
|
||||
id = db.Column(db.Integer, primary_key=True)
|
||||
institution = db.Column(db.Integer, sqlalchemy.ForeignKey('institution.id'), nullable=False)
|
||||
upload_user = db.Column(db.Integer, sqlalchemy.ForeignKey('registered_user.id'), nullable=True)
|
||||
timestamp = db.Column(db.DateTime, default=datetime.utcnow, nullable=False)
|
||||
file_contract = db.Column(db.String, nullable=False)
|
||||
contract_type = db.Column(db.String, nullable=False)
|
||||
|
||||
|
||||
class CorpusAccess(db.Model):
|
||||
__tablename__ = 'corpus_access'
|
||||
id = db.Column(db.Integer, primary_key=True)
|
||||
user_id = db.Column(db.Integer, sqlalchemy.ForeignKey('registered_user.id'), nullable=False)
|
||||
corpus = db.Column(db.String, nullable=False)
|
||||
|
||||
|
||||
class RegisteredUser(UserMixin, db.Model):
|
||||
__tablename__ = 'registered_user'
|
||||
id = db.Column(db.Integer, primary_key=True)
|
||||
name = db.Column(db.String)
|
||||
email = db.Column(db.String)
|
||||
role = db.Column(db.String)
|
||||
pass_hash = db.Column(db.String)
|
||||
active = db.Column(db.Boolean)
|
||||
last_login = db.Column(db.DateTime)
|
||||
registered = db.Column(db.DateTime)
|
||||
institution = db.Column(db.Integer, sqlalchemy.ForeignKey('institution.id'))
|
||||
name = db.Column(db.String, nullable=False)
|
||||
email = db.Column(db.String, nullable=False)
|
||||
role = db.Column(db.String, nullable=False)
|
||||
pass_hash = db.Column(db.String, nullable=False)
|
||||
active = db.Column(db.Boolean, nullable=True)
|
||||
last_login = db.Column(db.DateTime, nullable=True)
|
||||
registered = db.Column(db.DateTime, nullable=True)
|
||||
institution = db.Column(db.Integer, sqlalchemy.ForeignKey('institution.id'), nullable=True)
|
||||
institution_moderator = db.Column(db.Boolean, default=False)
|
||||
|
||||
|
||||
class Institution(db.Model):
|
||||
__tablename__ = 'institution'
|
||||
id = db.Column(db.Integer, primary_key=True)
|
||||
name = db.Column(db.String)
|
||||
region = db.Column(db.String)
|
||||
file_contract = db.Column(db.String)
|
||||
name = db.Column(db.String, nullable=False)
|
||||
region = db.Column(db.String, nullable=False)
|
||||
file_contract = db.Column(db.String, nullable=True)
|
||||
|
||||
|
||||
@@ -54,6 +54,9 @@ class UploadHandlerPredavanja(UploadHandler):
|
||||
phone=form_data.get('phone'),
|
||||
keywords=form_data['kljucne-besede'],
|
||||
agree_publish=True if 'kljucne-besde' in form_data else False,
|
||||
agree_publish_future=form_data['javna-objava-prihodnost'],
|
||||
agree_machine_translation=True if 'strojno-prevajanje' in form_data else False,
|
||||
agree_news_cjvt=True if 'obvestila' in form_data else False,
|
||||
file_contract=upload_metadata['contract_file'],
|
||||
upload_file_hashes=sorted_f_hashes,
|
||||
)
|
||||
|
||||
110
portal/solar.py
110
portal/solar.py
@@ -1,10 +1,12 @@
|
||||
import logging
|
||||
import re
|
||||
import traceback
|
||||
import hashlib
|
||||
from datetime import datetime
|
||||
from sqlalchemy import desc
|
||||
|
||||
import portal.base
|
||||
from portal.base import UploadHandler
|
||||
from portal.model import UploadSolar
|
||||
from portal.model import db, UploadSolar, ContractsSolar, RegisteredUser, Institution
|
||||
|
||||
|
||||
VALID_PROGRAMS = {'OS', 'SSG', 'MGP', 'ZG', 'NPI', 'SPI', 'SSI', 'PTI'}
|
||||
@@ -27,29 +29,25 @@ class UploadHandlerSolar(UploadHandler):
|
||||
|
||||
institution_id = UploadHandler.get_user_institution(user_id)
|
||||
|
||||
try:
|
||||
model_obj = UploadSolar(
|
||||
upload_user = user_id,
|
||||
institution = institution_id,
|
||||
upload_hash=upload_metadata['upload_id'],
|
||||
timestamp=timestamp,
|
||||
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
|
||||
)
|
||||
db.session.add(model_obj)
|
||||
db.session.commit()
|
||||
except Exception:
|
||||
traceback.print_exc()
|
||||
model_obj = UploadSolar(
|
||||
upload_user = user_id,
|
||||
institution = institution_id,
|
||||
upload_hash=upload_metadata['upload_id'],
|
||||
timestamp=timestamp,
|
||||
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
|
||||
)
|
||||
self.store_model(model_obj)
|
||||
|
||||
def handle_upload(self, request, user_id):
|
||||
err = portal.base.check_upload_request(request, self)
|
||||
err = self.check_upload_request(request)
|
||||
if err:
|
||||
return err, 400
|
||||
|
||||
@@ -74,6 +72,57 @@ class UploadHandlerSolar(UploadHandler):
|
||||
|
||||
return 'Uspešno ste oddali datotek(e). Št. datotek: {}'.format(len(request.files))
|
||||
|
||||
def handle_contract_upload(self, request, user_id):
|
||||
contracts_type = request.form['tip-pogodbe']
|
||||
|
||||
if contracts_type not in ['sola', 'ucenci-starsi']:
|
||||
return 'Neveljaven tip pogodbe.'
|
||||
|
||||
f_obj = None
|
||||
for key, f in request.files.items():
|
||||
if key.startswith('file'):
|
||||
mimetype = f.content_type
|
||||
if mimetype != 'application/pdf':
|
||||
return 'Datoteka "{}" ni formata PDF.'.format(f.filename)
|
||||
else:
|
||||
f_obj = f
|
||||
break
|
||||
|
||||
if not f_obj:
|
||||
return 'Niste naložili nobene datoteke.'
|
||||
|
||||
base = self.get_uploads_subdir('contracts')
|
||||
f_hash = hashlib.md5(f_obj.read())
|
||||
|
||||
# First byte used for indexing, similarly like git does for example.
|
||||
sub_dir = base / f_hash[:2]
|
||||
if not sub_dir.exists():
|
||||
sub_dir.mkdir()
|
||||
|
||||
path = sub_dir / f_hash[2:] + '.pdf'
|
||||
f_obj.save(path)
|
||||
|
||||
user_obj = RegisteredUser.query.filter_by(id=user_id).one()
|
||||
institution_id = user_obj.institution
|
||||
is_institution_moderator = user_obj.institution_moderator
|
||||
|
||||
if institution_id is None:
|
||||
return 'Vaš uporabnik ni dodeljen nobeni inštituciji.'
|
||||
|
||||
if contracts_type == 'sola':
|
||||
if not is_institution_moderator:
|
||||
return 'Vaš uporabnik nima pravic za nalaganje pogodbe s šolo.'
|
||||
Institution.update().values(file_contract=f_hash).where(id=institution_id)
|
||||
|
||||
model_obj = ContractsSolar(
|
||||
institution=institution_id,
|
||||
upload_user=user_id,
|
||||
file_contract=f_hash,
|
||||
contracts_type=contracts_type,
|
||||
)
|
||||
self.store_model(model_obj)
|
||||
return 'Nalaganje pogodbe je bilo uspešno.'
|
||||
|
||||
@staticmethod
|
||||
def check_form(form):
|
||||
program = form['program']
|
||||
@@ -99,3 +148,18 @@ class UploadHandlerSolar(UploadHandler):
|
||||
for key, val in form.items():
|
||||
if len(val) > MAXLEN_FORM:
|
||||
return 'Value in form field "{}" exceeds max len of {}'.format(key, MAXLEN_FORM)
|
||||
|
||||
|
||||
def get_upload_history(user_id, n=20):
|
||||
return UploadSolar.query.filter_by(upload_user=user_id).order_by(desc(UploadSolar.timestamp)).limit(n).all()
|
||||
|
||||
|
||||
def get_institution_student_contracts(institution_id):
|
||||
return ContractsSolar.query.filter_by(id=institution_id, contract_type='ucenci-starsi').all()
|
||||
|
||||
|
||||
def get_institution_contract(institution_id):
|
||||
return ContractsSolar.query.filter_by(id=institution_id, contract_type='sola').first()
|
||||
|
||||
|
||||
|
||||
|
||||
Reference in New Issue
Block a user