"Beta release"
This commit is contained in:
		
							parent
							
								
									208029f41d
								
							
						
					
					
						commit
						9a61d14eb4
					
				
							
								
								
									
										1
									
								
								.gitignore
									
									
									
									
										vendored
									
									
								
							
							
						
						
									
										1
									
								
								.gitignore
									
									
									
									
										vendored
									
									
								
							| @ -2,4 +2,5 @@ | ||||
| *.swp | ||||
| *.pyc | ||||
| config.tetalab.py | ||||
| pg_* | ||||
| 
 | ||||
|  | ||||
							
								
								
									
										135
									
								
								data_migration.sh
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										135
									
								
								data_migration.sh
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,135 @@ | ||||
| #!/bin/bash | ||||
| DB_SRC_HOST=marian.local.tetalab.org | ||||
| DB_SRC=/var/www/stock.tetalab.org/stock | ||||
| DB_DST=tetastock | ||||
| DB_DST_USER=tetastock | ||||
| DB_DST_HOST=sonny.local.tetalab.org | ||||
| 
 | ||||
| PSQL_OPTS="-t -U ${DB_DST_USER} -h ${DB_DST_HOST} -d ${DB_DST}" | ||||
| 
 | ||||
| function log { | ||||
|   echo -e "\033[93m$@\033[0m" | ||||
| } | ||||
| 
 | ||||
| function red { | ||||
|   echo -e "\033[91m$@\033[0m" | ||||
| } | ||||
| 
 | ||||
| function out { | ||||
|   echo -e "\033[91m$@\033[0m" | ||||
|   exit 1 | ||||
| } | ||||
| 
 | ||||
| log "[+] Suppression des données existantes" | ||||
| psql -t ${PSQL_OPTS} -c "delete from stock_kit_compositions where id > 0;" | ||||
| psql -t ${PSQL_OPTS} -c "delete from stock_componants where id > 0;" | ||||
| psql -t ${PSQL_OPTS} -c "delete from stock_kits where id > 0;" | ||||
| 
 | ||||
| log "[+] Récupération des composants" | ||||
| 
 | ||||
| IFS_BAK=${IFS} | ||||
| IFS=$'\n' | ||||
| for LINE in $(ssh ${DB_SRC_HOST} sqlite3 ${DB_SRC} "'select distinct composants.id, composants.groupe, composants.type, composants.taille, composants.couleur, composants.valeur, composants.quantité , composants.emplacement from composants order by composants.groupe;'") | ||||
| do | ||||
|   IFS=${IFS_BAK} | ||||
|   COMP_ID=$(echo ${LINE} | awk -F'|' '{print $1}') | ||||
|   RAND=$(head -n40 /dev/urandom | md5sum | cut -d' ' -f1) | ||||
|   REF=$(echo ${LINE} | awk -F'|' '{print $2}') | ||||
|   REF=$(echo "${REF:0:3}-${RAND:0:5}" | tr [a-z] [A-Z] | sed 's/É/E/') | ||||
|   GROUP=$(echo ${LINE} | awk -F'|' '{print $2}' | sed 's/^ *//;s/ *$//') | ||||
|   TYPE=$(echo ${LINE} | awk -F'|' '{print $3}' | sed 's/^ *//;s/ *$//') | ||||
|   SIZE=$(echo ${LINE} | awk -F'|' '{print $4}' | sed 's/^ *//;s/ *$//') | ||||
|   COLOR=$(echo ${LINE} | awk -F'|' '{print $5}' | sed 's/^ *//;s/ *$//') | ||||
|   if [ "${COLOR}" == "0" ]; then | ||||
|     COLOR='' | ||||
|   fi | ||||
|   VALUE=$(echo ${LINE} | awk -F'|' '{print $6}' | sed 's/^ *//;s/ *$//') | ||||
|   QUANTITY=$(echo ${LINE} | awk -F'|' '{print $7}' | sed 's/^ *//;s/ *$//') | ||||
|   DESIGNATION=$(echo "${GROUP} ${TYPE} ${SIZE} ${COLOR} ${VALUE}" | sed 's/^ *//;s/ *$//;s/  +*/ /g;s/  */ /g') | ||||
|   if [ ${#QUANTITY} -eq 0 ]; then | ||||
|     QUANTITY=0 | ||||
|   fi | ||||
|   PLACE=$(echo ${LINE} | awk -F'|' '{print $8}') | ||||
|   log "  [+] Vérification de l'existence d'un doublon avec ${DESIGNATION}" | ||||
|   SQLREQ="select id from stock_componants where designation='${DESIGNATION}';" | ||||
|   EXIST=$(psql ${PSQL_OPTS} -c "${SQLREQ}") | ||||
|   if [ ! ${#EXIST} -eq 0 ]; then | ||||
|     red "    => Composant ${EXIST} a déjà une désignation égale à ${DESIGNATION}" | ||||
|     continue | ||||
|   fi | ||||
|   log "  [+] Enregistrement du nouveau composant: ${REF} / ${DESIGNATION}" | ||||
|   SQLREQ="insert into stock_componants (reference, designation, place, quantity) values ('${REF}', '${DESIGNATION}', '${PLACE}', ${QUANTITY});" | ||||
|   psql ${PSQL_OPTS} -c "${SQLREQ}" || out "${SQLREQ}" | ||||
|   IFS=$'\n' | ||||
| done | ||||
| 
 | ||||
| log "[+] Récupération des ID des kits" | ||||
| for KIT_ID in $(ssh ${DB_SRC_HOST} sqlite3 ${DB_SRC} "'select distinct id from kit;'") | ||||
| do | ||||
|   IFS=${IFS_BAK} | ||||
|   # On recupere le kit | ||||
|   log "  [+] Récupération du nom pour KIT_ID: ${KIT_ID}" | ||||
|   SQLREQ="select description from kit where ID=${KIT_ID};" | ||||
|   NAME=$(ssh ${DB_SRC_HOST} sqlite3 ${DB_SRC} "'${SQLREQ}'") | ||||
|   if [ ${#NAME} -lt 1 ]; then | ||||
|     log "[-] Trace: ${SQLREQ}" | ||||
|     out "Nom introuvable pour ${KIT_ID}" | ||||
|   fi | ||||
|   DESIGNATION=${NAME} | ||||
|   # On cree le kit | ||||
|   log "  [+] Enregistrement du kit ${NAME} / ${DESIGNATION}" | ||||
|   SQLREQ="insert into stock_kits (name, designation) values ('${NAME}', '${DESIGNATION}');" | ||||
|   psql ${PSQL_OPTS} -c "${SQLREQ}" || out "${SQLREQ}" | ||||
|   log "  [+] Récupération du nouvel ID du kit" | ||||
|   # On recupere l'ID du nouveau kit | ||||
|   SQLREQ="select id from stock_kits where name='${NAME}' and designation='${DESIGNATION}';" | ||||
|   NKIT_ID=$(psql ${PSQL_OPTS} -c "${SQLREQ}") | ||||
|   if [ ${#NKIT_ID} -lt 1 ]; then | ||||
|     log "[-] Trace: ${SQLREQ}" | ||||
|     out "Pas de NKIT_ID pour ${NAME}" | ||||
|   fi | ||||
|   log "    => ${NKIT_ID}" | ||||
|   # On recupere les composants du kit | ||||
|   log "  [+] Récupération de la liste des composants du kit" | ||||
|   SQLREQ="select id_composant, quantite from composants_kit where id_kit='${KIT_ID}';" | ||||
|   RECS=$(ssh ${DB_SRC_HOST} sqlite3 ${DB_SRC} "'${SQLREQ}'") | ||||
|   IFS=$'\n' | ||||
|   for REC in ${RECS} | ||||
|   do | ||||
|     IFS=${IFS_BAK} | ||||
|     COMP_ID=$(echo ${REC} | awk -F'|' '{print $1}') | ||||
|     QUANTITY=$(echo ${REC} | awk -F'|' '{print $2}') | ||||
|     IFS=${IFS_BAK} | ||||
|     log "    [+] Récupération du composant: ${COMP_ID}" | ||||
|     SQLREQ="select composants.id, composants.groupe, composants.type, composants.taille, composants.couleur, composants.valeur, composants.quantité , composants.emplacement from composants where id=${COMP_ID} order by composants.groupe;" | ||||
|     COMP=$(ssh ${DB_SRC_HOST} sqlite3 ${DB_SRC} "'${SQLREQ}'") | ||||
|     if [ ${#COMP} -lt 1 ]; then | ||||
|       red "[-] Trace: ${SQLREQ}" | ||||
|       red "Pas de composant avec ID ${COMP_ID}" | ||||
|       continue | ||||
|     fi | ||||
|     GROUP=$(echo ${COMP} | awk -F'|' '{print $2}' | sed 's/^ *//;s/ *$//') | ||||
|     TYPE=$(echo ${COMP} | awk -F'|' '{print $3}' | sed 's/^ *//;s/ *$//') | ||||
|     SIZE=$(echo ${COMP} | awk -F'|' '{print $4}' | sed 's/^ *//;s/ *$//') | ||||
|     COLOR=$(echo ${COMP} | awk -F'|' '{print $5}' | sed 's/^ *//;s/ *$//') | ||||
|     if [ "${COLOR}" == "0" ]; then | ||||
|       COLOR='' | ||||
|     fi | ||||
|     VALUE=$(echo ${COMP} | awk -F'|' '{print $6}' | sed 's/^ *//;s/ *$//') | ||||
|     DESIGNATION=$(echo "${GROUP} ${TYPE} ${SIZE} ${COLOR} ${VALUE}" | sed 's/^ *//;s/ *$//;s/  +*/ /g;s/  */ /g') | ||||
|     log "    [+] Récupération du nouvel ID du composant" | ||||
|     SQLREQ="select ID from stock_componants where designation='${DESIGNATION}';" | ||||
|     NCOMP_ID=$(psql ${PSQL_OPTS}  -c "${SQLREQ}") | ||||
|     if [ ${#NCOMP_ID} -lt 1 ]; then | ||||
|       log "[-] Trace: ${SQLREQ}" | ||||
|       out "Pas de composant avec NCOMP_ID ${NCOMP_ID}" | ||||
|     fi | ||||
|     log "      [+] ${NCOMP_ID}" | ||||
|     log "    [+] Enregistrement du composant ${NCOMP_ID} dans la composition du kit ${NKIT_ID} (q: ${QUANTITY})" | ||||
|     SQLREQ="insert into stock_kit_compositions (kit_id, componant_id, quantity) values (${NKIT_ID}, ${NCOMP_ID}, ${QUANTITY})" | ||||
|     psql ${PSQL_OPTS}  -c "${SQLREQ}" || out "${SQLREQ}" | ||||
|     IFS=$'\n' | ||||
|   done | ||||
|   IFS=$'\n' | ||||
| done | ||||
| IFS=${IFS_BAK} | ||||
| @ -67,6 +67,7 @@ function login() { | ||||
| 
 | ||||
| function logout() { | ||||
|   setcookie('token', '', 30); | ||||
|   setcookie('session', '', 30); | ||||
|   document.location='/'; | ||||
| } | ||||
| 
 | ||||
| @ -140,7 +141,6 @@ function c_next_page(nexthop) { | ||||
|   update_componants(); | ||||
| } | ||||
| 
 | ||||
| 
 | ||||
| // Search componants
 | ||||
| function search_componants_by_reference(obj) { | ||||
|   setcookie('c_reference', obj.value, 30); | ||||
| @ -651,7 +651,7 @@ function add_kit_componant(kit_id, componant_id) { | ||||
|     } | ||||
|   }; | ||||
|    | ||||
|   xhttp.open('POST', '/kits/add/'+kit_id+'/'+componant_id, true); | ||||
|   xhttp.open('POST', '/kits/composition/add/'+kit_id, true); | ||||
|   xhttp.setRequestHeader('Content-type', 'application/x-www-form-urlencoded'); | ||||
|   xhttp.send(); | ||||
| } | ||||
|  | ||||
| @ -162,7 +162,7 @@ div.error { | ||||
|   background-repeat: no-repeat; | ||||
|   background-position: center center; | ||||
|   background-color: #000000; | ||||
|   height: 476px; | ||||
|   height: 531px; | ||||
|   padding: 10px; | ||||
|   text-align: center; | ||||
|   font-size: 70px; | ||||
| @ -175,7 +175,7 @@ div.wip { | ||||
|   background-repeat: no-repeat; | ||||
|   background-position: center center; | ||||
|   background-color: #000000; | ||||
|   height: 476px; | ||||
|   height: 531px; | ||||
|   padding: 10px; | ||||
|   text-align: center; | ||||
|   font-size: 70px; | ||||
|  | ||||
							
								
								
									
										77
									
								
								stock.sql
									
									
									
									
									
								
							
							
						
						
									
										77
									
								
								stock.sql
									
									
									
									
									
								
							| @ -34,7 +34,7 @@ CREATE TABLE stock_providers ( | ||||
| CREATE TABLE stock_componants ( | ||||
|   id serial primary key, | ||||
|   reference varchar(20) unique not NULL, | ||||
|   designation varchar(50) not NULL, | ||||
|   designation varchar(100) not NULL, | ||||
|   last_price NUMERIC not NULL default 0, | ||||
|   mean_price NUMERIC not NULL default 0, | ||||
|   quantity NUMERIC not NULL default 0, | ||||
| @ -70,77 +70,4 @@ insert into stock_users (mail, password, name) values | ||||
| ('doug.letough@free.fr', '$2a$08$578910202124252729313uTyggq4ANEjMljcClFriOqcsttB2fnAW', 'Doug Le Tough'); | ||||
| insert into stock_users (mail, password, name) values | ||||
| ('doug@redatomik.org', '$2a$08$578910202124252729313uTyggq4ANEjMljcClFriOqcsttB2fnAW', 'Doug Le Tough'); | ||||
| 
 | ||||
| insert into stock_providers (name, address, mail, url, comment) | ||||
|   values ('Tous', 'N/A', 'N/A', 'N/A', 'N/A'); | ||||
| insert into stock_providers (name, address, mail, url, comment) | ||||
|   values ('Aucun', 'N/A', 'N/A', 'N/A', 'N/A'); | ||||
| insert into stock_providers (name, address, mail, url, comment) | ||||
|   values ('China Elec Co', 'Beijing', 'sales@chinaelecco.cc', 'https://chinaelecco.cc', 'Pas cher mais délai excessif et composants pourris'); | ||||
| 
 | ||||
| insert into stock_componants (reference, designation, last_price, mean_price, quantity, min_quantity, place, provider_id) | ||||
|   values ('Res-01', 'Resistance 10KΩ', 13.34, 12.42, 73, 0, 'B 43', 3); | ||||
| insert into stock_componants (reference, designation, last_price, mean_price, quantity, min_quantity, place, provider_id) | ||||
|   values ('Lor-01', '1 Lorem ipsum dolor sit ametconsectetur adipiscing', 13.34, 12.42, 73, 0, 'B 43', 3); | ||||
| insert into stock_componants (reference, designation, last_price, mean_price, quantity, min_quantity, place, provider_id) | ||||
|   values ('Res-02', 'Resistance 11KΩ', 13.34, 12.42, 73, 0, 'B 43', 3); | ||||
| insert into stock_componants (reference, designation, last_price, mean_price, quantity, min_quantity, place, provider_id) | ||||
|   values ('Res-03', 'Resistance 12KΩ', 13.34, 12.42, 73, 0, 'B 43', 3); | ||||
| insert into stock_componants (reference, designation, last_price, mean_price, quantity, min_quantity, place, provider_id) | ||||
|   values ('Res-04', 'Resistance 13KΩ', 13.34, 12.42, 73, 0, 'B 43', 2); | ||||
| insert into stock_componants (reference, designation, last_price, mean_price, quantity, min_quantity, place, provider_id) | ||||
|   values ('Res-05', 'Resistance 14KΩ', 13.34, 12.42, 73, 0, 'B 43', 3); | ||||
| insert into stock_componants (reference, designation, last_price, mean_price, quantity, min_quantity, place, provider_id) | ||||
|   values ('Lor-02', '2 Lorem ipsum dolor sit ametconsectetur adipiscing', 13.34, 12.42, 73, 0, 'B 43', 3); | ||||
| insert into stock_componants (reference, designation, last_price, mean_price, quantity, min_quantity, place, provider_id) | ||||
|   values ('Res-06', 'Resistance 15KΩ', 13.34, 12.42, 73, 0, 'B 43', 3); | ||||
| insert into stock_componants (reference, designation, last_price, mean_price, quantity, min_quantity, place, provider_id) | ||||
|   values ('Res-07', 'Resistance 16KΩ', 13.34, 12.42, 73, 0, 'B 43', 3); | ||||
| insert into stock_componants (reference, designation, last_price, mean_price, quantity, min_quantity, place, provider_id) | ||||
|   values ('Res-08', 'Resistance 17KΩ', 13.34, 12.42, 73, 0, 'B 43', 3); | ||||
| insert into stock_componants (reference, designation, last_price, mean_price, quantity, min_quantity, place, provider_id) | ||||
|   values ('Res-09', 'Resistance 18KΩ', 13.34, 12.42, 73, 0, 'B 43', 3); | ||||
| insert into stock_componants (reference, designation, last_price, mean_price, quantity, min_quantity, place, provider_id) | ||||
|   values ('Lor-03', '3 Lorem ipsum dolor sit ametconsectetur adipiscing', 13.34, 12.42, 73, 0, 'B 43', 3); | ||||
| insert into stock_componants (reference, designation, last_price, mean_price, quantity, min_quantity, place, provider_id) | ||||
|   values ('Res-10', 'Resistance 19KΩ', 13.34, 12.42, 73, 0, 'B 43', 2); | ||||
| insert into stock_componants (reference, designation, last_price, mean_price, quantity, min_quantity, place, provider_id) | ||||
|   values ('Res-11', 'Resistance 20KΩ', 13.34, 12.42, 73, 0, 'B 43', 3); | ||||
| insert into stock_componants (reference, designation, last_price, mean_price, quantity, min_quantity, place, provider_id) | ||||
|   values ('Res-12', 'Resistance 21KΩ', 13.34, 12.42, 73, 0, 'B 43', 3); | ||||
| insert into stock_componants (reference, designation, last_price, mean_price, quantity, min_quantity, place, provider_id) | ||||
|   values ('Res-13', 'Resistance 22KΩ', 13.34, 12.42, 73, 0, 'B 43', 3); | ||||
| insert into stock_componants (reference, designation, last_price, mean_price, quantity, min_quantity, place, provider_id) | ||||
|   values ('Lor-04', '4 Lorem ipsum dolor sit ametconsectetur adipiscing', 13.34, 12.42, 73, 0, 'B 43', 3); | ||||
| insert into stock_componants (reference, designation, last_price, mean_price, quantity, min_quantity, place, provider_id) | ||||
|   values ('Res-14', 'Resistance 23KΩ', 13.34, 12.42, 73, 0, 'B 43', 3); | ||||
| insert into stock_componants (reference, designation, last_price, mean_price, quantity, min_quantity, place, provider_id) | ||||
|   values ('Res-15', 'Resistance 24KΩ', 13.34, 12.42, 73, 0, 'B 43', 3); | ||||
| insert into stock_componants (reference, designation, last_price, mean_price, quantity, min_quantity, place, provider_id) | ||||
|   values ('Res-16', 'Resistance 25KΩ', 13.34, 12.42, 73, 0, 'B 43', 3); | ||||
| insert into stock_componants (reference, designation, last_price, mean_price, quantity, min_quantity, place, provider_id) | ||||
|   values ('Res-17', 'Resistance 26KΩ', 13.34, 12.42, 73, 0, 'B 43', 2); | ||||
| insert into stock_componants (reference, designation, last_price, mean_price, quantity, min_quantity, place, provider_id) | ||||
|   values ('Lor-05', '5 Lorem ipsum dolor sit ametconsectetur adipiscing', 13.34, 12.42, 73, 0, 'B 43', 3); | ||||
| insert into stock_componants (reference, designation, last_price, mean_price, quantity, min_quantity, place, provider_id) | ||||
|   values ('Res-18', 'Resistance 27KΩ', 13.34, 12.42, 73, 0, 'B 43', 3); | ||||
| insert into stock_componants (reference, designation, last_price, mean_price, quantity, min_quantity, place, provider_id) | ||||
|   values ('Res-19', 'Resistance 28KΩ', 13.34, 12.42, 73, 0, 'B 43', 3); | ||||
| insert into stock_componants (reference, designation, last_price, mean_price, quantity, min_quantity, place, provider_id) | ||||
|   values ('Res-20', 'Resistance 29KΩ', 13.34, 12.42, 73, 0, 'B 43', 3); | ||||
| 
 | ||||
| insert into stock_kits (name, designation) values ('Kit_test', 'Kit de test'); | ||||
| insert into stock_kits (name, designation) values ('Kit2_test2', 'Kit de test 2'); | ||||
| insert into stock_kits (name, designation) values ('MF_K', 'Mother fucking kit'); | ||||
| 
 | ||||
| insert into stock_kit_compositions (kit_id, componant_id, quantity) values (1, 5, 1); | ||||
| insert into stock_kit_compositions (kit_id, componant_id, quantity) values (1, 8, 2); | ||||
| insert into stock_kit_compositions (kit_id, componant_id, quantity) values (1, 10, 2); | ||||
| insert into stock_kit_compositions (kit_id, componant_id, quantity) values (1, 12, 7); | ||||
| 
 | ||||
| insert into stock_kit_compositions (kit_id, componant_id, quantity) values (2, 5, 2); | ||||
| insert into stock_kit_compositions (kit_id, componant_id, quantity) values (2, 4, 1); | ||||
| insert into stock_kit_compositions (kit_id, componant_id, quantity) values (2, 9, 3); | ||||
| insert into stock_kit_compositions (kit_id, componant_id, quantity) values (2, 22, 2); | ||||
| insert into stock_kit_compositions (kit_id, componant_id, quantity) values (2, 1, 5); | ||||
| insert into stock_kit_compositions (kit_id, componant_id, quantity) values (2, 14, 8); | ||||
| insert into stock_users (mail, password, name) values ('test', '$2b$08$OkfihuGRyLdpftBpGhnpeeeUhUTQS0oXvR2NFByC.65XCKKvPBWHS'); | ||||
|  | ||||
| @ -54,9 +54,9 @@ | ||||
|                       id='designation' | ||||
|                       type='text' | ||||
|                       onchange='javascript:update_componant(this, {{ componant.id }}, "text");' | ||||
|                       maxlength='50' | ||||
|                       title='Désignation (max. 50)' | ||||
|                       placeholder='Désignation (max. 50)' | ||||
|                       maxlength='100' | ||||
|                       title='Désignation (max. 100)' | ||||
|                       placeholder='Désignation (max. 100)' | ||||
|                       value='{{ componant.designation }}' /> | ||||
|               </div> | ||||
|               <div class='input_block'> | ||||
|  | ||||
| @ -4,7 +4,7 @@ | ||||
| {% endblock %} | ||||
| {% block title %}Éditer un kit{% endblock %} | ||||
|         {% block top_menu %} | ||||
|         <span class='top_menu_item' onclick='javascript:document.location="/providers";'>Gérer les kits</span> | ||||
|         <span class='top_menu_item' onclick='javascript:document.location="/kits";'>Gérer les kits</span> | ||||
|         <span class='top_menu_item_selected' onclick='javascript:document.location="/kits/{{ kit.id }}";'>Éditer un kit</span> | ||||
|         {% endblock %} | ||||
|           {% block left_menu %} | ||||
|  | ||||
| @ -16,10 +16,10 @@ | ||||
|               {% set row_class = cycler('odd', 'even') %} | ||||
|               {% for componant in componants %} | ||||
|               <div class='row_block {{ row_class.next() }}'> | ||||
|                 <text style='width: 190px;'>{{ componant.reference }}</text> | ||||
|                 <text class='border_left' style='width: 439px;'>{{ componant.designation }}</text> | ||||
|                 <text class='num border_left' style='width: 89px;'>{{ componant.quantity }}</text> | ||||
|                 <text class='num border_right border_left' style='width: 139px;'>{{ componant.place }}</text> | ||||
|                 <text style='width: 190px;' title='{{ componant.reference }}'>{{ componant.reference }}</text> | ||||
|                 <text class='border_left' style='width: 439px;' title='{{ componant.designation }}'>{{ componant.designation }}</text> | ||||
|                 <text class='num border_left' style='width: 89px;' title='{{ componant.quantity }}'>{{ componant.quantity }}</text> | ||||
|                 <text class='num border_right border_left' style='width: 139px;' title='{{ componant.place }}'>{{ componant.place }}</text> | ||||
|                 <div class='action_bar_block border_left' style='width: 89px;'> | ||||
|                   <input | ||||
|                     type='image' | ||||
|  | ||||
| @ -10,10 +10,10 @@ | ||||
|               {% set row_class = cycler('odd', 'even') %} | ||||
|               {% for componant in componants %} | ||||
|               <div class='row_block {{ row_class.next() }}'> | ||||
|                 <text style='width: 190px;'>{{ componant.reference }}</text> | ||||
|                 <text class='border_left' style='width: 439px;'>{{ componant.designation }}</text> | ||||
|                 <text style='width: 190px;' title='{{ componant.reference }}'>{{ componant.reference }}</text> | ||||
|                 <text class='border_left' style='width: 439px;' title='{{ componant.designation }}'>{{ componant.designation }}</text> | ||||
|                 <text class='num border_left' style='width: 89px;'>{{ componant.quantity }}</text> | ||||
|                 <text class='num border_right border_left' style='width: 139px;'>{{ componant.place }}</text> | ||||
|                 <text class='num border_right border_left' style='width: 139px;' title='{{ componant.place }}'>{{ componant.place }}</text> | ||||
|                 <div class='action_bar_block border_left' style='width: 89px;'> | ||||
|                   <input | ||||
|                     type='image' | ||||
|  | ||||
| @ -8,14 +8,20 @@ | ||||
|               </text> | ||||
|               <div class='row_block border_bottom'> | ||||
|                 <label style='width: 209px;' onclick='javascript:update_kits_by_name("{{ order }}");'>Nom</label> | ||||
|                 <label class='border_left' style='width: 700px;' onclick='javascript:update_kits_by_designation("{{ order }}");'>Désignation</label> | ||||
|                 <label class='border_left' style='width: 600px;' onclick='javascript:update_kits_by_designation("{{ order }}");'>Désignation</label> | ||||
|                 <label class='border_left' style='width: 99px;' style='cursor: default;'>Max dispo</label> | ||||
|                 <label class='border_left' style='width: 89px;' style='cursor: default;'>Action</label> | ||||
|               </div> | ||||
|               {% set row_class = cycler('odd', 'even') %} | ||||
|               {% for kit in kits %} | ||||
|               <div class='row_block {{ row_class.next() }}'> | ||||
|                 <text style='width: 199px;'>{{ kit.name }}</text> | ||||
|                 <text class='border_left' style='width: 690px;'>{{ kit.designation }}</text> | ||||
|                 <text style='width: 199px;' title='{{ kit.name }}'>{{ kit.name }}</text> | ||||
|                 <text class='border_left' style='width: 590px;' title='{{ kit.designation }}'>{{ kit.designation }}</text> | ||||
|                 {% set sclass='red' %} | ||||
|                 {% if kit. max_kit > 1 %} | ||||
|                 {%    set sclass='' %} | ||||
|                 {% endif %} | ||||
|                 <text class='border_left num {{ sclass }}' style='width: 89px;' title='{{ kit.max_kit }}'>{{ kit.max_kit }}</text> | ||||
|                 <div class='action_bar_block border_left' style='width: 89px;'> | ||||
|                   <input | ||||
|                     type='image' | ||||
|  | ||||
| @ -17,9 +17,9 @@ | ||||
|               {% for provider in providers %} | ||||
|               <div class='row_block {{ row_class.next() }}'> | ||||
|                 <text style='width: 199px;'>{{ provider.name }}</text> | ||||
|                 <text class='border_left' style='width: 189px;'>{{ provider.address }}</text> | ||||
|                 <text class='border_left' style='width: 189px;'>{{ provider.mail }}</text> | ||||
|                 <text class='border_left' style='width: 289px;'>{{ provider.url }}</text> | ||||
|                 <text class='border_left' style='width: 189px;' title='{{ provider.address }}'>{{ provider.address }}</text> | ||||
|                 <text class='border_left' style='width: 189px;' title='{{ provider.mail }}'>{{ provider.mail }}</text> | ||||
|                 <text class='border_left' style='width: 289px;' title='{{ provider.url }}'>{{ provider.url }}</text> | ||||
|                 <div class='action_bar_block border_left' style='width: 89px;'> | ||||
|                   <input | ||||
|                     type='image' | ||||
|  | ||||
| @ -1,7 +1,7 @@ | ||||
| <!DOCTYPE html>                                                                                                                                                            | ||||
| <html xmlns="http://www.w3.org/1999/xhtml" xml:lang="fr" lang="fr" dir="ltr"> | ||||
|   <head> | ||||
|     <title>Référentiel Infrastructure Tetalab - {% block title %}How The Fuck{% endblock %}</title> | ||||
|     <title>Tetastock</title> | ||||
|     <meta name="viewport" content="initial-scale=1.0"> | ||||
|     <meta http-equiv="content-type" content="text/html; charset=UTF-8" /> | ||||
|     <link rel="stylesheet" type="text/css" href="/static/style/style.css" /> | ||||
| @ -10,8 +10,8 @@ | ||||
|   <body> | ||||
|     <div class='main_wrapper'> | ||||
|       <div class='center'> | ||||
|         <div class='banner' title='Référentiel infrastrusture Tetalab'> | ||||
|           Référentiel Infrastructure Tetalab | ||||
|         <div class='banner' title='Tetastock'> | ||||
|           Tetastock | ||||
|         </div> | ||||
|         <div class='top_menu'> | ||||
|           <span class='top_menu_item' onclick='javascript:document.location="/";'>Retour</span> | ||||
|  | ||||
							
								
								
									
										75
									
								
								tetastock.py
									
									
									
									
									
								
							
							
						
						
									
										75
									
								
								tetastock.py
									
									
									
									
									
								
							| @ -77,6 +77,28 @@ class Stock_orders(db.Model): | ||||
| ######################################################################## | ||||
| # Here comes the fun | ||||
| ######################################################################## | ||||
| def get_max_kit(kit_id): | ||||
|   """ Get max available kit from kit.id """ | ||||
|   default_max_kit = float("inf") | ||||
|   max_kit = default_max_kit | ||||
|   composition = Stock_kit_compositions.query.filter_by(kit_id=kit_id).with_entities( | ||||
|                                                       Stock_kit_compositions.componant_id, | ||||
|                                                       Stock_kit_compositions.quantity).all() | ||||
|   for c_componant in composition: | ||||
|     componant = Stock_componants.query.filter_by(id=c_componant.componant_id).first() | ||||
|     if componant: | ||||
|       try: | ||||
|         mkit = int(componant.quantity) / int(c_componant.quantity) | ||||
|       except ZeroDivisionError as e: | ||||
|         print "[+] Error at get_max_kit:" | ||||
|         print "------------------------------" | ||||
|         print "%s" % e.message | ||||
|         print "------------------------------"         | ||||
|       if mkit < max_kit: | ||||
|         max_kit = mkit | ||||
|   if max_kit == default_max_kit: | ||||
|     max_kit = 0 | ||||
|   return max_kit | ||||
| 
 | ||||
| def sync_cookies(response, session): | ||||
|   """ Sync cookies with session """ | ||||
| @ -85,7 +107,7 @@ def sync_cookies(response, session): | ||||
|     if key != u'session': | ||||
|       print '[c]', key, session[key] | ||||
| 
 | ||||
| def sync_session(request, session, offset_reset): | ||||
| def sync_session(request, session): | ||||
|   """ Sync session with cookies""" | ||||
|   for key in request.cookies: | ||||
|     try: | ||||
| @ -101,10 +123,6 @@ def sync_session(request, session, offset_reset): | ||||
|       except ValueError: | ||||
|         # Value is not an int, will be treated as string | ||||
|         session[key] = str(request.cookies[key].encode('utf8')) | ||||
|     if key in offset_reset and len(str(session[key])) > 0 and old != str(session[key]): | ||||
|       session['c_offset'] = 0 | ||||
|       session['p_offset'] = 0 | ||||
|       session['k_offset'] = 0 | ||||
|     if key != u'session': | ||||
|       print '[s]', key, request.cookies[key] | ||||
| 
 | ||||
| @ -133,7 +151,6 @@ def check_user(request, session): | ||||
|     # Password mismatch | ||||
|     return False | ||||
| 
 | ||||
| 
 | ||||
| def resume_session(func): | ||||
|   """ Resume pending session """ | ||||
|   @wraps(func) | ||||
| @ -156,9 +173,6 @@ def resume_session(func): | ||||
|     k_count = 0 | ||||
|     kc_quantity = 0 | ||||
|     kc_limit = 3 | ||||
|     offset_reset = [u'c_reference', u'c_designation', u'c_place', | ||||
|                     u'c_provider', u'p_name', u'p_address', u'p_mail', u'p_url', | ||||
|                     u'k_name', u'k_designation'] | ||||
|     if not u'token' in session: | ||||
|       session[u'token'] = empty | ||||
|     if not u'password' in session: | ||||
| @ -260,8 +274,7 @@ def resume_session(func): | ||||
|     if not u'kc_reference' in session: | ||||
|       session[u'kc_reference'] = empty | ||||
|     # Cookies/session sync | ||||
|     sync_session(request, session, offset_reset) | ||||
| 
 | ||||
|     sync_session(request, session) | ||||
|     # Switch sort order | ||||
|     refresh = {u'desc': u'asc', u'asc': u'desc'} | ||||
|     if session[u'c_order_refresh'] == 1: | ||||
| @ -273,7 +286,6 @@ def resume_session(func): | ||||
|     if session[u'k_order_refresh'] == 1: | ||||
|       session[u'k_order'] = refresh[session[u'k_order']] | ||||
|       session[u'k_order_refresh'] = 0 | ||||
| 
 | ||||
|     # Check for valid session | ||||
|     if not check_user(request, session): | ||||
|       # User is not logged in, send him back to login page | ||||
| @ -315,7 +327,7 @@ def componants(): | ||||
|                             place=session[u'c_place'].decode('utf8'), | ||||
|                             provider_id=session[u'c_provider']) | ||||
| 
 | ||||
| @app.route('/componants/<componant_id>') | ||||
| @app.route('/componants/<componant_id>', methods=['GET', 'POST']) | ||||
| @resume_session | ||||
| def get_componant(componant_id): | ||||
|   """ Edit componant """ | ||||
| @ -348,7 +360,7 @@ def update_componant(componant_id): | ||||
|       pass | ||||
|   return 'KO' | ||||
| 
 | ||||
| @app.route('/componants/delete/<componant_id>') | ||||
| @app.route('/componants/delete/<componant_id>', methods=['GET', 'POST']) | ||||
| @resume_session | ||||
| def delete_componant(componant_id): | ||||
|   """ Delete componant """ | ||||
| @ -392,20 +404,20 @@ def new_componant(): | ||||
|     return 'KO' | ||||
|   return 'OK' | ||||
| 
 | ||||
| @app.route('/componants/in/<componant_id>') | ||||
| @app.route('/componants/in') | ||||
| @resume_session | ||||
| def in_componants(): | ||||
|   """ Incoming order """ | ||||
|   return render_template('wip.html') | ||||
| 
 | ||||
| @app.route('/componants/out/<componant_id>') | ||||
| @app.route('/componants/out') | ||||
| @resume_session | ||||
| def out_componants(): | ||||
|   """ Outgoing order """ | ||||
|   return render_template('wip.html') | ||||
| 
 | ||||
| ## Componants update result set | ||||
| @app.route('/componants/update', methods=['POST']) | ||||
| @app.route('/componants/update', methods=['GET', 'POST']) | ||||
| @resume_session | ||||
| def update_componants(): | ||||
|   """ Display componants list """ | ||||
| @ -719,6 +731,9 @@ def search_kits(): | ||||
|   kits = kits.limit(session[u'k_limit']) | ||||
|   # Get result | ||||
|   kits = kits.all() | ||||
|   for kit in kits: | ||||
|     max_kit = get_max_kit(kit.id) | ||||
|     setattr(kit, 'max_kit', max_kit) | ||||
|   response = app.make_response(render_template('result_kits.html', | ||||
|                             kits=kits, | ||||
|                             offset=session[u'k_offset'] , | ||||
| @ -738,9 +753,7 @@ def search_kits(): | ||||
| @app.route('/kits/composition/<kit_id>', methods=['POST']) | ||||
| @resume_session | ||||
| def get_kit_composition(kit_id): | ||||
|   default_max_kit = 999999999999999 | ||||
|   kit_composition = [] | ||||
|   max_kit = default_max_kit | ||||
|   composition = Stock_kit_compositions.query.filter_by(kit_id=kit_id).with_entities( | ||||
|                                                       Stock_kit_compositions.componant_id, | ||||
|                                                       Stock_kit_compositions.quantity).all() | ||||
| @ -756,20 +769,8 @@ def get_kit_composition(kit_id): | ||||
|            u'needed': c_componant.quantity | ||||
|            } | ||||
|       kit_composition.append(c) | ||||
|       try: | ||||
|         mkit = int(componant.quantity) / int(c_componant.quantity) | ||||
|       except ZeroDivisionError as e: | ||||
|         print "[+] Error at get_kit_composition:" | ||||
|         print "------------------------------" | ||||
|         print "%s" % e.message | ||||
|         print "------------------------------"         | ||||
|       if mkit < max_kit: | ||||
|         max_kit = mkit | ||||
|   if max_kit == default_max_kit: | ||||
|     max_kit = 0 | ||||
|   if len(kit_composition) > 0: | ||||
|     return render_template('kit_composition.html', kit_composition=kit_composition, max_kit=max_kit, kit_id=kit_id) | ||||
|   return "Aucun composant" | ||||
|   max_kit = get_max_kit(kit_id) | ||||
|   return render_template('kit_composition.html', kit_composition=kit_composition, max_kit=max_kit, kit_id=kit_id) | ||||
| 
 | ||||
| @app.route('/kits/remove/<kit_id>/<componant_id>', methods=['GET']) | ||||
| @resume_session | ||||
| @ -789,20 +790,20 @@ def remove_componant_from_kit(kit_id, componant_id): | ||||
|     print "------------------------------" | ||||
|   return get_kit(kit_id) | ||||
| 
 | ||||
| @app.route('/kits/add/<kit_id>/<componant_id>', methods=['POST', 'GET']) | ||||
| @app.route('/kits/composition/add/<kit_id>', methods=['POST', 'GET']) | ||||
| @resume_session | ||||
| def add_componant_to_kit(kit_id, componant_id): | ||||
| def add_componant_to_kit(kit_id): | ||||
|   """ Add componant to kit """ | ||||
|   try: | ||||
|     kit_id = int(kit_id) | ||||
|     count = Stock_kit_compositions.query.filter_by(kit_id=kit_id, componant_id=componant_id).count() | ||||
|     count = Stock_kit_compositions.query.filter_by(kit_id=kit_id, componant_id=session[u'kc_componant_id']).count() | ||||
|     if count > 0: | ||||
|       # Componant already in kit composition | ||||
|       # => Updating with new quantity | ||||
|       return update_kit_composition(kit_id) | ||||
| 
 | ||||
|     composition = Stock_kit_compositions(kit_id=kit_id,  | ||||
|                                           componant_id=componant_id, | ||||
|                                           componant_id=session[u'kc_componant_id'], | ||||
|                                           quantity=session[u'kc_quantity']) | ||||
|     db.session.add(composition) | ||||
|     commit =  db.session.commit() | ||||
|  | ||||
		Loading…
	
		Reference in New Issue
	
	Block a user