Archived
1
0
This repository has been archived on 2020-03-05. You can view files and clone it, but cannot push or open issues or pull requests.
rero-ils-graphs/orgas/gen.sh

171 lines
4.6 KiB
Bash
Raw Normal View History

#!/usr/bin/env bash
2020-02-06 13:12:25 +00:00
#
# Generate a dot file to create graph of RERO-ils data (orga, lib and users)
#
# Usage:
# bash gen.sh output.dot
# where `output.dot` is the output file that permit to generate a graph.
# To generate the graph:
# dot -Tsvg output.dot -o organisations.svg
# where `output.dot` is the previous file. And `organisations.svg` the final schema you want to display.
# CONFIG
2020-02-06 13:12:25 +00:00
RERO_DIR="${HOME}/projets/rero/rero-ils"
# pastel colors (Cf. https://www.color-hex.com/color-palette/5361)
COLOR1="#ffb3ba"
COLOR2="#ffdfba"
COLOR3="#ffffba"
COLOR4="#baffc9"
COLOR5="#bae1ff"
COMP_COLOR4="#ffd8ba"
# colors you choose for different objects
ORGA_COLOR="${COLOR1}" # organisations
LIB_COLOR="${COLOR2}" # libraries
PT_COLOR="${COLOR3}" # patron_types
USER_COLOR="${COLOR5}" # users/patrons
# Built variables
outputfile="$1"
2020-02-06 13:12:25 +00:00
SRC_DIR="${RERO_DIR}/data/"
# TESTS
if [[ -z "${outputfile}" ]]; then
echo "No output file given"
exit 1
elif [[ -f "${outputfile}" ]]; then
echo "File already exists!"
exit 1
fi
# FUNCTIONS
# write first argument in output file
output() {
echo -e "$1" >> "$outputfile"
}
# Output file initialization
echo "" > "$outputfile" # flush output file
output "digraph {"
output "rankdir = RL;"
output "label = \"Link between organisations, libraries and users.\";"
# ORGANISATIONS
2020-02-06 13:12:25 +00:00
orga_file="${SRC_DIR}organisations.json"
cat "${orga_file}"|jq -c '.[] | {
name,
pid,
code }'| while read orga
do
# take important info
pid=$(echo $orga|jq -r .pid)
code=$(echo $orga|jq -r .code)
name=$(echo $orga|jq -r .name)
# write result in output
output "Orga${pid} [shape=box color=\"transparent\" style=filled fillcolor=\"${ORGA_COLOR}\" label=<${name}<br/>(code: ${code})<br/>PID: ${pid}>]"
done
# LIBRARIES
2020-02-06 13:12:25 +00:00
lib_file="${SRC_DIR}libraries.json"
cat "${lib_file}"|jq -c '.[] | {
name,
pid,
2020-02-06 13:12:25 +00:00
code,
organisation: .organisation."$ref"}'|while read lib
do
pid=$(echo $lib|jq -r .pid)
name=$(echo $lib|jq -r .name)
2020-02-06 13:12:25 +00:00
code=$(echo $lib|jq -r .code)
orga=$(echo $lib|jq -r .organisation)
orga_pid=$(echo $orga|rev|cut -d "/" -f 1|rev)
# write result in output
l_id="Lib${pid}"
output "${l_id} [shape=house color=transparent style=filled fillcolor=\"${LIB_COLOR}\" label=<${name}<br/>(code: ${code})<br/>PID: ${pid}>]"
output "${l_id} -> Orga${orga_pid}"
done
# PATRON_TYPES
pt_file="${SRC_DIR}patron_types.json"
cat "${pt_file}" |jq -c '.[] | {
pid,
name,
organisation: .organisation."$ref"}'|while read pt
do
# # The char " is problematic. Delete it.
# pt=$(echo $pt| sed -e 's/^"//g' -e 's/"$//g')
# pid=$(echo $pt|cut -d "|" -f 1)
# name=$(echo $pt|cut -d "|" -f 2)
# orga=$(echo $pt|cut -d "|" -f 3)
pid=$(echo $pt|jq -r .pid)
name=$(echo $pt|jq -r .name)
orga=$(echo $pt|jq -r .organisation)
# write result in output
p_id="Type${pid}"
output "${p_id} [shape="polygon" sides=7 color=transparent style=filled fillcolor=\"${PT_COLOR}\" label=<${name}<br/>PID: ${pid}>]"
# Make a link with organisation if present
if [[ -n "${orga}" ]]; then
orga_pid=$(echo $orga|rev|cut -d "/" -f 1|rev)
output "${p_id} -> Orga${orga_pid}"
fi
done
# USERS
2020-02-06 13:12:25 +00:00
user_file="${SRC_DIR}users.json"
cat "${user_file}"|jq -c '.[] | {
email,
first_name,
last_name,
barcode,
roles,
library: .library."$ref",
pt: .patron_type."$ref"}'|while read user
do
email=$(echo $user|jq -r .email)
first_name=$(echo $user|jq -r .first_name)
last_name=$(echo $user|jq -r .last_name)
barcode=$(echo $user|jq -r .barcode)
roles=$(echo $user|jq -r .roles[])
library=$(echo $user|jq -r .library)
library_pid=$(echo $library|rev|cut -d "/" -f 1|rev)
pt=$(echo $user|jq -r .pt)
if [[ "${roles}" != "null" ]]; then
displayed_roles="roles: "
for role in ${roles}; do
displayed_roles="${displayed_roles}<font color='red' >${role}</font>, "
done
fi
# write result in output
u_id="User_${email}"
# Don't display barcode if no one
info=""
if [[ "${barcode}" != "null" ]]; then
info="${info}<br/>${barcode}"
fi
# Same for roles
if [[ -n "${displayed_roles}" ]]; then
info="${info}<br/>${displayed_roles}"
fi
output "\"${u_id}\" [color=transparent style=filled fillcolor=\"${USER_COLOR}\" label=<${first_name} ${last_name}<br/>${email}${info}>]"
# Display a link if library_pid is not null
if [[ "${library_pid}" != "null" ]]; then
output "\"${u_id}\" -> Lib${library_pid}"
fi
# Display a link if patron_type is not null
if [[ "$pt" != "null" ]]; then
pt_id=$(echo $pt|rev| cut -d "/" -f 1|rev)
output "\"${u_id}\" -> Type${pt_id}"
fi
done
# end of file
output "}"
# END of program
exit 0