Il modo più semplice per avviare un server di sviluppo è quello di utilizzare un container docker pre configurato.
cp docker/caps.env.template docker/caps.env
e poi dare il comando:
./start-dev-server.sh
Una volta avviato il container (per il primo avvio ci può volere più tempo) il server viene esposto all'indirizzo http://localhost:8765
L'interfaccia di CakePHP risulterà quindi accessibile tramite il comando
sudo docker exec -it caps bin/cake
Il database sarà invece accessibile tramite il comando
sudo docker exec -it caps-db mysql caps -u caps -p
la password del database è secret
(specificata in docker/caps.env).
I files del database persistono nella directory docker/database
Al primo utilizzo è necessario inserire un utente amministratore per accedere
al servizio. Per creare uno username admin
con password admin
dare
il comando:
sudo docker exec -it caps bin/cake grant-admin admin --force --password admin
CAPS è sviluppato utilizzando il framework CakePHP per il backend, ed alcune librerie Javascript per (parte) del frontend. Per un ambiente di sviuppo locale è necessario avere a disposizione PHP, NPM, e un database (Sqlite3 può andare bene).
apt install composer npm
apt install php-mbstring php-intl php-xml php-sqlite3 php-mysql php-zip php-ldap php-gd
apt install sqlite3 # for development
cd frontend/
npm ci
npm run test # run js unit tests
npm run deploy # compiles js and css files
npm run deploy:dev # as above but for development
cd ..
cd backend
composer install # installa pacchetti PHP
bin/cake migrations migrate # crea il database
vendor/bin/phpunit # esegue test
bin/cake server # fai partire il server
cd ..
Per utilizzare un server LDAP con certificato SSL non valido, ad esempio perchè inoltrato
tramite una porta locale, è necessario modificare la variabile d'ambiente CAPS_VERIFY_CERT
a false (si trovano più dettagli sotto). Ovviamente, questa configurazione non
è ideale in produzione.
Per lo sviluppo in locale, se non si vuole configurare LDAP, è possibile creare gli utenti e definire le password direttamente
nel database.
Se un utente accede tramite LDAP è possibile renderlo amministratore con il comando
bin/cake grant-admin username
Una volta che è presente il primo amministratore, gli altri possono essere creati tramite interfaccia web.
Se non si vuole configurare l'autenticazione LDAP si possono inserire le password localmente nel database.
Ad esempio per creare un utente admin
con password secret
:
bin/cake grant-admin --force --password secret admin
Per utilizzare un server LDAP disponibile in remoto (ad esempio '''idm2.unipi.it''' sulla macchina '''caps.dm.unipi.it''') in locale, va inoltrata la porta tramite SSH:
ssh -L 1636:idm2.unipi.it:636 utente@caps.dm.unipi.it
e poi vanno definite le seguenti variabili d'ambiente, ad esempio:
export CAPS_LDAP_URI=ldaps://127.0.0.1:1636/
export CAPS_LDAP_BASE=ou=people,dc=unipi,dc=it
export CAPS_VERIFY_CERT=false
Questa procedura viene gestita in automatico dall'immagine Docker.
Il template, basato su SB-Admin-2, (CSS e JS) si trova nella cartella frontend
.
Per compilare i file JS e CSS è necessario entrare nella cartella ed usare npm
.
cd frontend/
npm ci
npm run test # run js unit tests
npm run deploy # compiles js and css files
npm run deploy:dev # as above but for development
Dopo la prima compilazione, può essere conveniente usare il comando per ricompilare automaticamente i file JS e SCSS quando vengono modificati:
npm run watch
npm run watch:dev
I file sorgente si trovano rispettivamente
nelle cartelle frontend/scss
e frontend/src
.
Il comando deploy
esegue npm run build
e npm run install
che compilano e
copiano i file CSS e JS all'interno di ../app/webroot/
, rispettivamente. Per comodità, i file
già compilati sono inclusi nel repository.
Utilizziamo il branching model descritto qui: https://nvie.com/posts/a-successful-git-branching-model/ in particolare il branch master deve poter andare immediatamente in produzione mentre le modifiche non completamente testate andranno nel branch develop
cd app
git checkout develop
bin/cake migrations migrate # Crea o aggiorna il database
vendor/bin/phpunit # run unit tests
vendor/bin/phpunit --filter testLoginPage # run a single test
tail -f logs/*.log # display error messages
bin/cake server & # run a development server
Per importare un dump vecchio del database (di CAPS < 1.0.0) è necessario prima migrare ad una versione compatibile, e poi effettuare il resto delle migrazioni. Ad esempio:
bin/cake migrations migrate -t 20191217155946
sqlite3 caps.sqlite < dump.sql
bin/cake migrations migrate
Attachment [attachments]
id
filename
user -> User [user_id]
proposal -> Proposal [proposal_id]
data
mimetype
comment
created
ChosenExam [chosen_exams]
id
credits
chosen_year
exam -> Exam [exam_id]
proposal -> Proposal [proposal_id]
compulsory_group -> CompulsoryGroup [compulsory_group_id] (*) (!)
compulsory_exam -> CompulsoryExams [compulsory_exam_id] (*) (!)
free_choice_exam -> FreeChoiceExam [free_choice_exam_id] (*) (!)
(*) uno solo dei tre puo' essere non null: indica la corrispondenza dell'esame nel curriculum
(*) se tutti e tre sono null vuol dire che l'esame non era previsto nel curriculum
ChosenFreeChoiceExam [chosen_free_choice_exams]
id
name
credits
chosen_year
proposal -> Proposal [proposal_id]
CompulsoryExam [compulsory_exams]
id
year
position
exam -> Exam [exam_id]
curriculum -> Curriculum [curriculum_id]
CompulsoryGroup [compulsory_groups]
id
year
position
group -> Group [group_id]
curriculum -> Curriculum [curriculum_id]
Curriculum [curricula]
id
name
notes
degree -> Degree [degree_id]
proposals <- Proposals
free_choice_exams <- FreeChoiceExam
compulsory_exams <- CompulsoryExam
compulsory_groups <- CompulsoryGroup
Degree [degrees]
id
name
academic_year
years
enabled
enable_sharing
approval_confirmation
rejection_confirmation
submission_confirmation
approval_message
rejection_message
submission_message
free_choice_message
<- Curricula
<- Group
Documents
id
filename
owner_id
user_id
data
created
comment
mimetype
Exam [exams]
id
name
code
sector
credits
<-> Group [exams_groups]
FreeChoiceExam [free_choice_exams]
id
year
position
curriculum -> Curriculum [curriculum_id]
group -> Group [group_id, NULL]
Form [forms]
id
form_template -> FormTemplate
user > User
state
date_submitted
date_managed
data
FormAttachment [form_attachments]
id
filename
user -> User [user_id]
form -> Form [form_id]
data
mimetype
comment
created
FormTemplate [form_templates]
id
name
text
enabled
notify_emails
Group [groups]
id
degree -> Degree [degree_id]
name
<-> Exam [exams_groups]
ProposalAuth [proposal_auths]
id
email
secret
created
proposal -> Proposal [proposal_id]
Proposal
id
modified (date)
state in ['draft','submitted','approved','rejected']
submitted_date (date)
approved_date (date)
user -> User [user_id]
curriculum -> Curriculum [curriculum_id]
<- ChosenExam
<- ChosenFreeChoiceExam
<- ProposalAuth
<- Attachment
Settings [settings]
id
field
value
fieldtype
Tag [tags]
id
name
<-> Exam [tags_exams]
User [users]
id
username
name
number
givenname
surname
email
admin (bool)
password (encrypted)
(!) nel database manca il constraint!!