From e289ac7f25c81d9184b83e342918dccf1bf9d556 Mon Sep 17 00:00:00 2001
From: CyrilM <mammar@lal.in2p3.fr>
Date: Mon, 16 Jul 2018 16:43:50 +0200
Subject: [PATCH] Add page for add labels and alias.

---
 app/__pycache__/labelsTower.cpython-35.pyc   | Bin 0 -> 1338 bytes
 app/__pycache__/sql_request.cpython-35.pyc   | Bin 0 -> 479 bytes
 app/__pycache__/tuto.cpython-35.pyc          | Bin 0 -> 332 bytes
 app/__pycache__/update_labels.cpython-35.pyc | Bin 0 -> 3718 bytes
 app/bdd_for_labels.db                        | Bin 0 -> 12288 bytes
 app/createBdd.sql                            |  37 +++++
 app/labels                                   |  40 +++++
 app/labelsTower.py                           |  41 +++++
 app/sql_request.py                           |  16 ++
 app/templates/manage_labels.html             |  22 +++
 app/templates/print_labels.html              | 101 ++++++++++++
 app/update_labels.py                         | 152 +++++++++++++++++++
 12 files changed, 409 insertions(+)
 create mode 100644 app/__pycache__/labelsTower.cpython-35.pyc
 create mode 100644 app/__pycache__/sql_request.cpython-35.pyc
 create mode 100644 app/__pycache__/tuto.cpython-35.pyc
 create mode 100644 app/__pycache__/update_labels.cpython-35.pyc
 create mode 100644 app/bdd_for_labels.db
 create mode 100644 app/createBdd.sql
 create mode 100644 app/labels
 create mode 100644 app/labelsTower.py
 create mode 100644 app/sql_request.py
 create mode 100644 app/templates/manage_labels.html
 create mode 100644 app/templates/print_labels.html
 create mode 100644 app/update_labels.py

diff --git a/app/__pycache__/labelsTower.cpython-35.pyc b/app/__pycache__/labelsTower.cpython-35.pyc
new file mode 100644
index 0000000000000000000000000000000000000000..bb39b7f6674656d0723fc14fd520a9deed132c2b
GIT binary patch
literal 1338
zcmZuw&2G~`5T5l<eww7efIx7FxF8p)K5#*(s*tJz2M7q~WP~i!-KJ^Rak{&qY6Pe9
z3cLe62RBZL<6b%O3Y?hP#33LYdow%Vcs=vYH`h9ym2V%PzWVM1{D7q^MEfB=`YSFR
zZw3+|o!K5p27U6P<;^S~qz^>^X#hnCX$VCP(i#+XNbA5v0HOhx4ALfuCY-DQ4`|Cn
z;5GOF4r*0U-9ZiD%?fH)5Wd&~-Ui-*frnv?uL57I!a7yhx;tS5_+|xR7=t9*`ib>G
zFJhK$M}Z9=$y}e>x)Ns-p^aTrV#I~Yj3~x3H^SCWbU7LxUHoG4A-!2$42^w!bbyOH
z+3Tgjld=$>K{e3#XZf`qAEQ5(xhw`M)<Yw7Y$m3R^YIwHZ-mtS@?5B$@r7+23n|O&
zyi}6c>3k0t@YD*f)9dj-n2hHp*YU14YB(A^80Cf7JEU~zqJM1VEVW%U-nr~fJy5s6
z02rj4XrntJ%m>2mSD0%GVc3`?s`YGbmf!SBa`5zEzu(>NK6?55S$F2OVJ?Tco^CC`
zBUKh%=d|I0Ql*MKRl_vwx<+C%eI~Ox)!2c6a{t4VYEocxQDO_Xn(79x&DI$`Y8`je
z)wsw<`9NgzEb4_Y$0gU+e|*rl!Hefff6*%<gc5MQdW{B>aDpT-SNB~o-kgy42>HYZ
z4~R5WR$>AdjS>yv29m-S0d&aBjq1fdT{17haY&*@Pi<0)|D|iX`B&aM$EJ{qs!Uss
zvTQgSPfS|Zlfy%y^<)d71nn=MbeD^+ydy?$%b|#BibQ8?v$EAHZWPU{?M%ifjs-8l
zQK<^#*;hjUOLOP1ROm}{s@I5UZ-c4p=$m%pF{;eWnO?Ap5Rfn(tJESS1SuuqL|$*Y
zvHX%NGh!~or7YZxxQ@4%qi^A1mF91t9jzfBXA)=Tp1O+rw6&xm8y?a4DjxyI$?PLe
zaE&Y@d1aaPam;L}%83zfjGTyEd5XU9-<%q|Mad^p?2&#nsjkgd@OPWFy_><!#+~MG
D68a^0

literal 0
HcmV?d00001

diff --git a/app/__pycache__/sql_request.cpython-35.pyc b/app/__pycache__/sql_request.cpython-35.pyc
new file mode 100644
index 0000000000000000000000000000000000000000..4849a9cd134dac57625c6c75b7840a3f4efb5e5d
GIT binary patch
literal 479
zcmYjOu};G<5Is9dQ&lPL0umE*7@C0<AtYAl!d8T$#CB<m6SuY_0ZOOx2Ydy;<dvxt
zI}_)qL#^D?^ShV3vwb!k4t~GxpUw%u4;-xk`7MUIK;ZZhkN`6z6nFqUgiiu9;`PTg
z+M@}kdn^KsdX6i?@ca(LJR?|uRrkY=z?MQwVMSpFunnLMV1)>PDdH2MPmmVv6kaLl
zht3jp_7Li%+x8CIHpCf%>BniYUS}oe`CRE-7NwA8!b|OkNMje9ja*uB<zlAlS}^N+
ztkFhk7mGK+8Y@sxRkgIPKNprQ3Mmgv)gp~tti`4g#_B#6bfK@}2y=lJ<{R`0ihq~c
zLRBJ@g{)q5X0V;fY-3gCC&T{vp~PhU?#4#cJU<fsm76gFkP%79kPHw<G$GoHDb?Q4
Z@vhksj4<K)*OlUp6gU1Aj6ZZj{{fzEZ5RLm

literal 0
HcmV?d00001

diff --git a/app/__pycache__/tuto.cpython-35.pyc b/app/__pycache__/tuto.cpython-35.pyc
new file mode 100644
index 0000000000000000000000000000000000000000..6f25c4371850f1e9c1259f9a15df44cce554f8d9
GIT binary patch
literal 332
zcmYLDyGjHx6g`=l45AKLSu0ipVz5?J5X5SmEd(vXV4|xgn<1G|wAF9$AN-}XTlouH
zc@xpS<Q~p_<lM8}H0z&-r#BYBg7QB~VrP`$h(OU}Fo0#aW?-5@7kH<lgf8(|LFH1F
zP!&FqM;wY{+ScDBfR;smVY=|NWa2h8{(=!XrwkPV9htVp<gK~X#<=~RE9Z^c{en-!
z6)g9}%vmi=XY9Qf;bG80==pPIVi*T^(7(owSrU;iNhAFa1px|Q6HeMX^1I~6r*2%6
ma^6`jWh}eCkKDU)(0Oxp^_TIyer%l@jXp{4v-2&sS^NN|Z$onc

literal 0
HcmV?d00001

diff --git a/app/__pycache__/update_labels.cpython-35.pyc b/app/__pycache__/update_labels.cpython-35.pyc
new file mode 100644
index 0000000000000000000000000000000000000000..cdda45a3f7e97501541df7db0cfe056dec2af501
GIT binary patch
literal 3718
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

literal 0
HcmV?d00001

diff --git a/app/bdd_for_labels.db b/app/bdd_for_labels.db
new file mode 100644
index 0000000000000000000000000000000000000000..dbaf72ad3b77c331b00748c706a0e4b812f3f345
GIT binary patch
literal 12288
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

literal 0
HcmV?d00001

diff --git a/app/createBdd.sql b/app/createBdd.sql
new file mode 100644
index 0000000..7b657e6
--- /dev/null
+++ b/app/createBdd.sql
@@ -0,0 +1,37 @@
+/*CREATE DATABASE labels_tower CHARACTER SET 'utf8';
+USE labels_tower;*/
+
+CREATE TABLE IF NOT EXISTS tutos (
+	link VARCHAR(200) NOT NULL,
+	author_mail UNSIGNED MEDIUM INT,
+	date DEFAULT CURRENT_TIMESTAMP
+);
+
+CREATE TABLE IF NOT EXISTS labels (
+	id INTEGER PRIMARY KEY AUTOINCREMENT,
+	name VARCHAR(100) NOT NULL,
+	father_id UNISGNED MEDIUM INT DEFAULT NULL
+);
+
+CREATE TABLE IF NOT EXISTS tutos_labels (
+	link VARCHAR(200) NOT NULL,
+	id_label UNSIGNED MEDIUM INT
+);
+
+CREATE TABLE IF NOT EXISTS alias (
+	id_label UNSIGNED MEDIUM INT,
+	name VARCHAR(100) NOT NULL
+);
+
+CREATE TABLE IF NOT EXISTS votes (
+	link VARCHAR(200) NOT NULL,
+	mark TINYINT,
+	author_mail VARCHAR(100)
+);
+
+CREATE TABLE IF NOT EXISTS comments (
+	link VARCHAR(200) NOT NULL,
+	message VARCHAR(500),
+	author_mail VARCHAR(100),
+	date DATETIME DEFAULT CURRENT_TIMESTAMP
+);
diff --git a/app/labels b/app/labels
new file mode 100644
index 0000000..e09f93d
--- /dev/null
+++ b/app/labels
@@ -0,0 +1,40 @@
+Calcul
+	Vectorisation
+	Profilage
+	Gpu, Gpgpu, accélérateur(s), co-processeur(s)
+	Data Science, Big Data, Science des données
+	Calcul Intensif, Hpc
+	Machine Learning, Apprentissage, Deep Learning
+Controle-Commande-Acquisition
+Enseignement
+	Creation Plongeons
+	Notebooks
+Génie Logiciel
+	Construction, Build, Make
+	Documentation
+	Test
+	Gestion de versions, Version, Versions
+		Git
+			test1
+			test2
+				test3
+	Gitlab
+	Integration Continue
+	Deploiement
+	Gestion de paquets
+Interfaces Homme-Machine, Ihm, Gui
+Langages
+	Cpp, C++, Cplusplus
+	Go
+	Python
+	Ada
+	Scala
+Programmation
+	Orientée Objet, Orientée Objets, OO, objet, objets
+	Fonctionnelle
+Virtualisation
+	Docker
+	Singularity
+	Jupyter
+Administration
+	Orchestration
diff --git a/app/labelsTower.py b/app/labelsTower.py
new file mode 100644
index 0000000..d53c796
--- /dev/null
+++ b/app/labelsTower.py
@@ -0,0 +1,41 @@
+import sqlite3
+from update_labels import *
+from sql_request import *
+from flask import Flask, request, render_template, jsonify
+app = Flask(__name__)
+
+@app.route('/')
+def home():
+    return 'Home'
+
+@app.route('/get_datas/<string:name>')
+def get_datas(name):
+    '''Return labels table or alias table for Ajax.
+    '''
+    if (name == 'labels'):
+        return (jsonify(send_sql_request('SELECT * FROM labels')))
+    elif (name == 'alias'):
+        return (jsonify(send_sql_request('SELECT * from alias')))
+    return 'Error'
+
+@app.route('/manage_labels', methods=['GET', 'POST'])
+def manage_labels():
+    '''For manage all labels and alias register in database.
+    (Add new labels and alias actually)
+    '''
+    if request.method == 'GET':
+        res = send_sql_request('SELECT * FROM labels')
+        return render_template('manage_labels.html', labels=res)
+    else:
+        update_labels(request.form['alias_input'])
+        return render_template('manage_labels.html', labels=request.form['alias_input'], success="Succès de l'envoie")
+
+@app.route('/print_labels')
+def print_labels():
+    '''Print labels like a tree. ex :
+    L> Virtualisation
+        L> Docker
+        L>Singularity
+    L> Others
+    '''
+    return render_template('print_labels.html')
diff --git a/app/sql_request.py b/app/sql_request.py
new file mode 100644
index 0000000..94b6d47
--- /dev/null
+++ b/app/sql_request.py
@@ -0,0 +1,16 @@
+import sqlite3
+
+def send_sql_request(request, fetchall = 1):
+    '''Execute sql request on bdd_for_labels database.
+    If second parameter is 0 return one line of the response
+    else return all lines.
+    '''
+    conn = sqlite3.connect('app/bdd_for_labels.db')
+    c = conn.cursor()
+    c.execute(request)
+    conn.commit()
+    if (fetchall == 1):
+        res = c.fetchall()
+    else:
+        res = c.fetchone()
+    return (res)
diff --git a/app/templates/manage_labels.html b/app/templates/manage_labels.html
new file mode 100644
index 0000000..575a38b
--- /dev/null
+++ b/app/templates/manage_labels.html
@@ -0,0 +1,22 @@
+<html>
+	<head>
+		<title>Manage Labels</title>
+		<script src="https://cdn.jsdelivr.net/npm/vue/dist/vue.js"></script>
+	</head>
+
+	<body>
+		<p>{{ success }}</p>
+		<div id='input_zone'>
+			<form action="" method="POST">
+				<textarea class="text" type="text" name="alias_input" cols="60" rows="40">{{ labels }}</textarea>
+				<br>
+				<input type="submit" value="Envoyer"/>
+			</form>
+		</div>
+	</body>
+
+	<script>
+
+	</script>
+
+</html>
diff --git a/app/templates/print_labels.html b/app/templates/print_labels.html
new file mode 100644
index 0000000..b477e81
--- /dev/null
+++ b/app/templates/print_labels.html
@@ -0,0 +1,101 @@
+<html>
+	<head>
+		<title>Print labels</title>
+		<script src="https://cdn.jsdelivr.net/npm/vue/dist/vue.js"></script>
+	</head>
+
+	<body>
+		<ul id="tuto">
+			<li v-for="(value, index) in fruits" @click="getFruit(index)">
+				{{ index }} => {{ value }}
+			</li>
+		</ul>
+
+		<!---<div>
+			<div id="test" v-for="value in labels" @click="clickLabel()">
+				{{ value }}
+			</div>
+		</div>-->
+	</body>
+
+	<script>
+
+		function request(address) {
+			var xhr = new XMLHttpRequest();
+			/*xhr.onreadystatechange = function () {
+				//if (xhr.readyState == 4)
+					//alert("reponse = " + xhr.responseText);
+			};*/
+			xhr.open("GET", "http://127.0.0.1:5000/"+address, false);
+			xhr.send();
+			return (xhr.responseText);
+		};
+
+		//add \t to the child in function
+		function print_elem(txt, nb_tabs) {
+			var new_msg = "";
+			for (var i = 0; i < nb_tabs; i++)
+				new_msg += '\t';
+			new_msg += txt;
+			console.log(nb_tabs + new_msg);
+		}
+
+		//print the tab that represent labels with theirs childs 
+		function print_tab(tab, nb_tabs) {
+			for (var i = 0; tab[i]; i++) {
+				if (Array.isArray(tab[i - 1]))
+					nb_tabs--;
+				if (Array.isArray(tab[i])) {
+					nb_tabs++;
+					print_tab(tab[i], nb_tabs)
+				} else
+					print_elem(tab[i], nb_tabs);
+			}
+		}
+
+		var tab = ['addition', 'soustraction', 'complexe', ['c1', 'c2', ['lol1', 'lol2'], 'c3'], 'easy', ['un', ['deux', ['trois', ['quatre']]]], 'ok'];
+		var labels_tab = JSON.parse(request("get_datas/labels"))
+		var labels_list = []
+
+		for (var i = 0; labels_tab[i]; i++) {
+			if (labels_tab[i][2] == null)
+				labels_list.push(labels_tab[i][0])
+		}
+
+		console.log(labels_tab)
+		console.log('\n================\n', labels_list)
+		console.log(labels_tab[0][2])
+		//crrer l'espece de liste sur la gaucje
+		//print_tab(tab, 0);
+
+		/*new Vue({
+			el: '#test',
+			data: {
+				labels: ['a', 'b', 'c']
+			},
+			methods: {
+				clickLabel: function() {
+					alert("clique");
+				}
+			}
+		});*/
+
+		new Vue({
+			el: '#tuto',
+			data: {
+				fruits: [
+					'pomme',
+					'cerise',
+					'abricot'
+				]
+			},
+			methods: {
+				getFruit: function(index) {
+					alert('Je suis ' + this.fruits[index]);
+				}
+			}
+		});
+
+	</script>
+
+</html>
diff --git a/app/update_labels.py b/app/update_labels.py
new file mode 100644
index 0000000..708dedd
--- /dev/null
+++ b/app/update_labels.py
@@ -0,0 +1,152 @@
+'''Take user input and send labels and alias in database if they don't exist.
+'''
+
+import sqlite3
+from sql_request import *
+conn = sqlite3.connect('app/bdd_for_labels.db', check_same_thread=False)
+c = conn.cursor()
+
+def get_file_content(filename):
+    '''For tests. Read file that contain user input.
+    '''
+    my_file = open(filename, "r")
+    content = my_file.read()
+    content = content.split('\n')
+    my_file.close()
+    return (content)
+
+def put_labels_in_db(content, labels_table):
+    '''Send all labels contained in content if it doesn't exist
+    in labels table (in DB). If label line contain alias, just the
+    first alias is send. executemany() requiere 2D array. It's why
+    label is put in intermediate array 'inter'.
+    '''
+    labels_name = []
+    for line in content:
+        inter = []
+        line = line.replace("\t", '')
+        line = line.split(',')
+        inter.append(line[0])
+        if (is_in_labels_table(line[0], labels_table) != 1):
+            labels_name.append(inter)
+    c.executemany("INSERT INTO labels(name) VALUES(?)", labels_name)
+    conn.commit()
+
+def get_labels_table():
+    '''Retrieve all the content in 'labels' from DB.
+    '''
+    c.execute('SELECT * FROM labels')
+    all_table = c.fetchall()
+    return (all_table)
+
+def get_tab_alias_name():
+    '''Select all alias in DB
+    '''
+    c.execute('SELECT name FROM alias')
+    all_table = c.fetchall()
+    return (all_table)
+
+def is_in_labels_table(name, labels_table):
+    '''Return 1 if name is in 'labels' table or 0 if not.
+    '''
+    name = name.lower()
+    for label in labels_table:
+        inter = label[1]
+        inter = inter.lower()
+        if (inter == name):
+            return (1)
+    return (0)
+
+def is_an_alias(name, tab_alias_name):
+    '''Return 1 if name is in 'alias' table or 0 if not.
+    '''
+    name = name.lower()
+    for alias in tab_alias_name:
+        inter = alias[0]
+        inter = inter.lower()
+        if (inter == name):
+            return (1)
+    return (0)
+
+def is_alias_or_label(name, labels_table, tab_alias_name):
+    '''Return 1 if name is a label or and alias.
+    '''
+    if (is_in_labels_table(name, labels_table) == 1):
+        return (1)
+    if (is_an_alias(name, tab_alias_name) == 1):
+        return (1)
+    return (0)
+
+
+def get_last_element(tab):
+    '''Retrive the last element from the pile 'tab' because pop()
+    delete the last element when is it return.
+    '''
+    for case in tab:
+        result = case
+    return (case)
+
+def get_father_id(father_name, labels_table):
+    '''Return the ID of an label stock in 'labels' table.
+    This ID will be send in 'father' column of the child.
+    '''
+    for label in labels_table:
+        if (label[1] == father_name):
+            return (label[0])
+    return (-1)
+
+def update_alias(content, labels_table, tab_alias_name):
+    '''Check the user input and add alias in alias tab if it's not
+    a label or an alias.
+    '''
+    label_alias = []
+    for line in content:
+        line = line.replace("\t", '')
+        line = line.replace(", ", ',')
+        line = line.split(',')
+        label = line[0]
+        line.remove(line[0])
+        for alias in line:
+            inter = []
+            if (is_alias_or_label(alias, labels_table, tab_alias_name) != 1):
+                inter.append(get_father_id(label, labels_table))
+                inter.append(alias)
+                label_alias.append(inter)
+    c.executemany("INSERT INTO alias(id_label, name) VALUES(?, ?)", label_alias)
+    conn.commit()
+
+def update_father_id_in_db(content, labels_table):
+    '''Get the user input and with the number of '\t' behind label
+    dermine if the label is a father or a child.
+    If it's a child, the id of his father is send in his
+    'father_id' column.
+    '''
+    father_pile = ['no_father']
+    prece = ''
+    for line in content:
+        line_alias = line.split(',')
+        label = line_alias[0]
+        if (line.count('\t') > prece.count('\t')):
+            father_pile.append(prece.replace("\t", ''))
+        if (line.count('\t') < prece.count('\t')):
+            nb_tour = prece.count('\t') - line.count('\t')
+            for i in range(0, nb_tour):
+                father_pile.pop()
+                father_name = get_last_element(father_pile)
+        father_id = get_father_id(father_name, labels_table)
+        if (father_id != -1):
+            c.execute('UPDATE labels SET father_id = ? WHERE name = ?', (father_id, label.replace("\t", '')))
+            conn.commit()
+        prece = label
+
+def update_labels(content):
+    '''Get the user input and add new lables in 'labels' table of DB.
+    '''
+    #content = get_file_content("labels")
+    content = content.split('\r\n')
+    labels_table = get_labels_table()
+    tab_alias_name = get_tab_alias_name()
+    put_labels_in_db(content, labels_table)
+    labels_table = get_labels_table()
+    update_father_id_in_db(content, labels_table)
+    update_alias(content, labels_table, tab_alias_name)
-- 
GitLab