Táto aplikácia umožňuje editovať informačné listy a študijné programy.
- Python >=2.7, <3.0
- virtualenv
- postgresql databáza s unaccent extension (postgresql-contrib)
- webserver s CoSign-om
V tejto sekcii je popísaná inštalácia na Ubuntu 14.04 LTS, na iných systémoch sa aplikácia inštaluje obdobne.
Aplikáciu naklonujeme do /var/www-apps/ilsp
pod používateľom ka
.
Najprv vytvorme systémového používateľa, ak neexistuje:
sudo adduser --system --group ka
Potom vytvorme adresár pre aplikáciu a nahrajme doň zdrojové kódy:
sudo mkdir -p /var/www-apps/ilsp
sudo chown ka:ka /var/www-apps/ilsp
cd /var/www-apps/ilsp
Ak zatiaľ nemáme nainštalovaný git, nainštalujme ho príkazom:
sudo apt-get install git
A stiahnime zdrojové kódy (všimnite si bodku na konci príkazu):
sudo -u ka -H git clone https://github.com/fmfi/infolist-editor.git .
Ak ešte nemáme v systéme nainštalovaný PostgreSQL server, spravme tak teraz:
sudo apt-get install postgresql postgresql-contrib
Prihlásme sa ako DBA do postgresu:
sudo -u postgres psql
Vytvorme databázového používateľa a databázu pre aplikáciu
(namiesto hesla changeit
chceme vygenerovať nejaké náhodné napríklad
pomocou pwgen -s 64
):
CREATE USER ka WITH PASSWORD 'changeit';
CREATE DATABASE akreditacia WITH OWNER ka;
Vytvorme databázovú extension unaccent
, to musíme spraviť v správnej databáze,
prepnime sa a vytvorme extension:
\connect akreditacia
CREATE EXTENSION unaccent;
Teraz sa odhlásme z psql (napríklad stlačením Ctrl+D
alebo príkazom \q
).
Dáta aplikácie musíme nahrať pod vlastníkom databázy:
cd /var/www-apps/ilsp
sudo -u ka psql akreditacia <db-schema.sql
Aplikácia má nejaké systémové a nejaké python závislosti, nainštalujme najprv tie systémové:
sudo apt-get install build-essential python-dev libpq-dev python-virtualenv libxml2-dev libxslt-dev zlib1g-dev
Prihlásme sa do shellu ako používateľ ka
:
sudo -u ka -H -s
A ako tento používateľ vytvorme virtualenv a nainštalujme doň python závislosti:
cd /var/www-apps/ilsp
virtualenv venv
source venv/bin/activate
pip install -r requirements.txt
Opustime shell použivateľa ka
:
exit
Vytvorme adresár pre upload súborov
sudo -u ka -H mkdir /home/ka/ilsp-files
sudo chmod go= /home/ka/ilsp-files
Skopírujme príklad konfiguračného súboru na správne miesto:
cd /var/www-apps/ilsp
sudo -u ka -H mkdir instance
sudo -u ka -H cp local_settings.py.example instance/local_settings.py
sudo -u ka -H chmod go= instance/local_settings.py
sudoedit -u ka instance/local_settings.py
Konfiguračný súbor je spustiteľný python kód skladá sa z nasledovných častí:
SECRET_KEY = 'change this!' # tajny sifrovaci kluc
SECRET_KEY
musí byť náhodný tajný reťazec, najlepšie je vygenerovať ho automaticky:
python -c 'import os; print repr(os.urandom(32))'
toto vypíše pythonový string literál, ktorý sa dá použiť ako tajný kľúč.
DATABASE = 'host=localhost dbname=akreditacia user=ka password=changeit'
DATABASE
je spojenie na postgresql databázu, tak ako ho používa psycopg2
databázový modul
FILES_DIR = '/home/ka/ilsp-files'
Sem bude aplikácia nahrávať súbory uploadnuté používateľmi.
VPCHAR_DIR = '/home/ka/vpchar-files'
Editor infolistov načítava vedecko-predagogické charakteristiky vytvorené samostatnou aplikáciou na vytváranie charakteristík - https://github.com/fmfi/akreditacia-charakteristika
Charakteristiky sú načítavané z JSON a RTF súborov (oba musia byť prítomné).
ADMIN_EMAILS = ['[email protected]']
SMTP_SERVER = 'smtp.example.com'
EMAIL_FROM = '[email protected]'
ADMIN_EMAILS
je zoznam adries na ktoré sa hlásenia majú posielaťSMTP_SERVER
je adresa SMTP servera, cez ktorý sa posiela (bez autentifikácie)EMAIL_FROM
je adresa odosielateľa e-mailov
LANGUAGES = ['sk', 'en']
DEFAULT_LANG = 'sk'
Nastavenie pre aké jazyky sa v databáze editujú údaje. Je možné uviesť zoznam viacerých
jazykov, pričom sk
je v aktuálnej verzii potrebné ponechať.
Prepokladáme, že máme nainštalovaný Apache2 spolu s mod_cosign a rozbehaným SSL-kom. Návod na skompilovanie cosign modulu je v repozitári cosignu.
Poznámka: Cosign s Apachom 2.4 som netestoval, ale podľa všetkého by mal fungovať OK.
Pre beh aplikácie pod Apache2 použijeme mod_wsgi:
sudo apt-get install libapache2-mod-wsgi
sudo a2enmod wsgi
Do správneho virtualhostu (pravdepodobne /etc/apache2/sites-available/default-ssl
) vložíme nasledovnú Apache2 konfiguráciu:
WSGIScriptAlias /ka/ilsp /var/www-apps/ilsp/ilsp_app.py
Alias /ka/ilsp/static /var/www-apps/ilsp/ilsp/static
WSGIDaemonProcess kailsp user=ka group=ka processes=2 threads=15 display-name={%GROUP} python-path=/var/www-apps/ilsp:/var/www-apps/ilsp/venv/lib/python2.7/site-packages home=/var/www-apps/ilsp
<Directory /var/www-apps/ilsp/>
WSGIProcessGroup kailsp
WSGICallableObject app
Require all granted
</Directory>
<Location /ka/ilsp/login>
CosignAllowPublicAccess Off
AuthType Cosign
</Location>
Poznámka: Uvedená Apache konfigurácia je pre verziu 2.4, pre Apache 2.2 je namiesto
Require all granted
Treba napísať:
Order deny,allow Allow from all
A nezabudnime reštartovať web server:
sudo service apache2 restart
Na používanie aplikácie treba naimportovať minimálne informácie o osobách a pridať jednotlivým osobám oprávnenia na prístup do aplikácie.
Aplikácia obsahuje príkazy spúštané z príkazového riadka, no tieto musia byť
spúšťané ako vlastník aplikácie (v našom príklade používateľ ka
) a s aktívnym
virtuálnym prostredím pythonu. Prostredie teda aktivujeme príkazmi:
sudo -u ka -H -s
# Zmení sa shell na používateľa ka
cd /var/www-apps/ilsp
source venv/bin/activate
Potom už môžeme spúšťať príkazy aplikácie, napríklad:
./ilsp_app.py --help
Treba naplniť tabuľku osoba
zoznamom osôb, s ktorými má aplikácia pracovať (tí čo sa prihlasujú + tí čo sú uvedení v infolistoch).
Je možné naimportovať csv súbor v kódovaní UTF-8, ktorý je nasledovného tvaru:
Plné meno,ID,Meno,Priezvisko,Rodné,Karty,Login,UOČ
"doc. Ing. Jana Hrašková, CSc.",1234567,Jana,Hrašková,Mrkvičková,"UOC - 12345678, PIK - 13245678901234567",hraskova47,12345678
- Na poradí stĺpcov nezáleží.
- Stĺpce navyše nevadia.
- Stĺpce
Plné meno
,Rodné
,Login
,UOČ
aKarty
sú nepovinné. - Výrazne odporúčam naimportovať okrem AIS ID aj UOČ.
- Ak sa UOČ nenájde v stĺpci UOČ (alebo stĺpec neexistuje, berie sa zo stĺpca s kartami).
- PIK-y sa nepoužívajú, iba UOC.
- Stĺpec
Rodné
sa môže volať ajPôvodné
. ID
je z AIS-u.- položky s AISovým ID, ktoré už existuje v cieľovej databáze sa ignorujú.
- id v databáze ILSP sa vyrobí automaticky.
- import ako celok sa nevykoná (resp. spadne a necommitne sa transakcia) ak by sa vkladalo duplicitné UOČ alebo login.
./ilsp_app.py import-osoby </cesta/k/suboru.csv
Poznámka: Naimportované osoby sa budú dať vybrať pri výbere vyučujúceho predmetu a pod. Ak ich nechceme označiť ako vyučujúcich, môžeme použiť prepínač
--nie-su-vyucujuci
Oprávnenia osôb sú v tabuľke ilsp_opravnenia
(ktorá môže obsahovať hodnoty pre
rôzne organizačné jednotky, avšak zatiaľ sa používa len FMFI).
- Používateľ (t.j. existuje daný záznam pre osobu a OJ) sa môže prihlásiť a editovať infolisty, vidí študijné programy
- Garant môže navyše editovať študijné programy
- Admin môže všetko čo iné role + exportovať dáta, prezerať zoznam používateľov, zamykať/odomykať veci hocikomu, mazať dokumenty a uploadovať VP charakteristiky
Oprávnenia sa dajú pridať aj pomocou príkazu
./ilsp_app.py pridaj-opravnenie --je-admin --je-garant hrasko47
Poznámka: Definícia oprávnení je v súbore
ilsp/common/storage.py
v triedeUser
Treba naplniť tabuľku osoba_uvazok
informáciami o pracovných úväzkoch osôb.
Je možné naimportovať csv súbor v kódovaní UTF-8, ktorý je nasledovného tvaru:
Pracovisko,Priezvisko,Meno,Funkcia,Kvalifikácia,Prac .úv.,UOČ,ID osoby AIS
KJFBF,Hraško,Janko,1H,21,100,123456,12345678
- Na poradí stĺpcov nezáleží.
- Stĺpce navyše nevadia.
- Stĺpce Meno a Priezvisko sú nepovinné a používajú sa len pri výpise chýb
- Osoby sa identifikujú podľa UOČ alebo ID osoby z AISu (stačí vyplniť len jednu položku, UOČ má prednosť)
./ilsp_app.py import-osoby-uvazky </cesta/k/suboru.csv
Treba naplniť tabuľku literatura
položkami z knižnice.
Je možné naimportovať csv súbor v kódovaní UTF-8, ktorý je nasledovného tvaru:
BIBID,Signatúra,Dokument,Vyd. údaje
22110,1856,"Europe's environment : The Dobříš assessment : The report on the state of the pan-European environment requested by the environment ministers for the whole of Europe at the ministerial conference held at Dobříš Castle, Czechoslovakia, June 1991 / Edited by: David Stanners and Philippe Bourdeau"," Copenhagen : EUR OP, 1955"
- Poradie stĺpcov môže byť hocijaké (vyžaduje sa hlavička na začiatku so správnymi popismi).
- Stĺpce navyše nevadia.
- Súbor môže obsahovať viac položiek s rovnakým bib_id, ale
Dokument
aVyd. údaje
musia byť zhodné. - Signatúry z rôznych riadkov sa pri importe spoja do čiarkami oddeleného zoznamu.
./ilsp_app.py import-literatura-kniznica </cesta/k/suboru.csv
Viď dokumentáciu k projektu infolist-import.
Aktuálne vie aplikácia exportovať údaje vo formáte pre akreditačnú komisiu, ako zip archív:
./ilsp_app.py export nazov_vystupneho_suboru.zip
Poznámka voliteľne sa dajú vyexportovať v samostatných súboroch (položkách archívu) informačné listy (
--infolisty-samostatne
) alebo VP charakteristiky (--charakteristiky-samostatne
), prípadne obe súčasne
Na lokálny vývoj a testovanie sa dá použiť db-fixtures.sql
:
cd /var/www-apps/ilsp
sudo -u ka psql akreditacia <db-fixtures.sql
INFOLIST_DEBUG=1 REMOTE_USER=hrasko47 ./ilsp_app.py runserver
Aplikácia používa Flask mikroframework ako základ a je rozdelená do viacerých modulov (blueprintov).
Štruktúra projektu sa delí nasledovne:
/
ilsp_app.py - spustiteľný súbor, zároveň exporuje WSGI aplikáciu
db-schema.sql - skript na vytvorenie schémy DB v PostgreSQL
db-fixtures.sql - skript na vloženie dát pre vývoj
drop.sql - skript na zmazanie tabuliek z PostgreSQL
local_settings.py.example - príklad nastavení
requirements.txt - súbor obsahujúci zoznam Python závislostí a ich verzií (pre pip)
tests.py - súbor obsahujúci unit testy
instance/ - adresár lokálny pre inštanciu
local_settings.py - konfiguračný súbor
venv/ - python virtual environment
ilsp/ - adresár s balíkmi aplikácie
commands.py - konzolové príkazy aplikácie
export.py - kód starajúci sa o generovanie exportu a manažment príloh
storage.py - ostatné funkcie na prácu s databázou
utils.py - pomocné funkcie
common/
auth.py - prihlasovanie a odhlasovanie
filters.py - filtre v jinja2 templatoch (zväčša preložia ID na názov)
podmienka.py - parsovanie logických formúl obsahujúcich ID predmetov
proxies.py - inicializácia databázy
rtf.py - pomocné funkcie na prácu s RTF
schema.py - pomocné funkcie na prácu s colander formulárovými schémamy
storage.py - definícia používateľa a funkcie na prácu s SQL
upload.py - funkcie na spracovávanie uploadnutých súborov
widgets.py - dodatočné formulárové widgety pre deform
infolist/
literatura.py - REST API pre vyhľadávanie literatúry
schema.py - deform schéma formuláru pre infolist
storage.py - storage mixin s funkciami na prácu s infolistami v databáze
views.py - flaskove routy + API pre JS na prácu s infolistami
templates/ - jinja2/ZPT/text šablóny
infolist.html - read-only infolist (view)
infolist.pt - template select2 deform widgetu na výber infolistu
infolist.rtf - textový template na generovanie RTF infolistu
(nahradzujú sa v ňom placeholdery začínajúce na IL_)
infolist-core.rtf - ako infolist.rtf, len bez RTF hlavičky a pätičky
(aby sa dalo opakovať pre spojené RTF s infolistami)
infolist-form.html - template pre formulár na editáciu infolistu
infolist-skin.html - začiatok a koniec RTF infolistu, oddelený textom
INFOLIST_CORE (viď tiež infolist-core.rtf)
literatura.pt - template select2 deform widgetu na výber literatúry
osoba/
views.py - flaskove routy na upload VPCHAR + API pre JS na hľadanie osôb
templates/
charakteristika-skin.rtf - začiatok a koniec RTF charakteristiky,
oddelený textom CHARAKTERISTIKA_CORE
(používa sa na spájanie RTF charakteristík)
osoba.pt - template select2 deform widgetu na výber osoby
osoba-vpchar-upload.html - template view-u na upload VP charakteristiky
predmet/
storage.py - mixin s databázovými funkciami na prácu s predmetmi
views.py - flaskove routy + API pre JS na prácu s predmetmi
templates/
predmet.html - template stránky so zobrazením jedného predmetu
predmet-index.html - template stránky so zoznamom predmetov
predmet-item.html - template jedného predmetu (v predmet.html a predmet-index.html)
static/ - statické súbory pre prehliadač
css/ - bootstrap css
fonts/ - bootstrap fonts
select2/ - knižnica select2 (combo boxy s vyhľadávaním)
beautify.css - css pre bootstrap deform štýl
bootstrap.min.js - bootstrap js knižnica
deform.js - deform js knižnica (upravená)
form.css - CSS používané vo formulároch
infolist.css - CSS pre zobrazovanie infolistu
infolist.js - javascript pre infolisty
infolist-form.js - javascript pre infolisty
jquery* - jquery knižnice
selectize*.css - knižnica selectize - CSS
selectize.js - knižnica selectize (upravená)
studprog-form.js - javascript pre formuláre ŠP
typeahead.* - knižnica na autocomplete
studprog/
schema.py - deform schéma formuláru pre ŠP
statistiky.py - počítanie štatistík ŠP
storage.py - mixin na prácu so ŠP v databáze
views.py - flask routes pre študijné programy
templates/ - ostatné šablóny
exporty.html - stránka na export dát
layout.html - štuktúra stránky (hlavička, menu, trackovací kód piwiku)
login.html - prihlasovacia stránka
macros.html - pomocné funkcie používané v šablónach
mapping.pt - deform template pre mapping (dictionary/objekt)
mapping_item.pt - deform template pre položku mappingu
ping.js - jinja2 template na generovanie pingovacieho javascriptu
(aby nás cosign neodhlásil)
podmienka.pt - deform2 widget na editovanie logickej formuly obsahujúcej ID predmetov
pouzivatelia.html - stránka so zoznamom používateľov
select2.pt - generický select2 deform widget
sequence.pt - deform widget pre editovanie zoznamov
sequence_item.pt - položka deform zoznamu
stav-vyplnania.html - template stránky so zoznamom zistených varovaní
unauthorized.html - stránka zobrazená ak človek nemá povolený prístup do aplikácie