7import hashlib, binascii
11from sqlalchemy.engine.url
import make_url
12from sqlalchemy
import create_engine
14from sqlalchemy.pool
import QueuePool
15from sqlalchemy
import MetaData
19from sqlalchemy.orm
import relationship, joinedload, subqueryload, Session
21from psycopg2
import IntegrityError
as psIntegrityError
23from sqlalchemy.exc
import IntegrityError
25def SQLconnector(args):
26 global metadata,conn,engine,pool,session
27 engine = create_engine(make_url(
"postgresql://"+args.login+
":"+os.getenv(
"passwordDB")+
"@"+args.host+
":"+args.port+
"/"+args.databasename),
39 metadata.reflect(engine)
60 session = Session(engine)
63 return(metadata,conn,engine,pool,session)
65def insert_table(table_name,values):
66 table_ = metadata.tables[table_name]
67 now = datetime.datetime.now()
70 if (
"creation_date" in table_.c
and "creation_date" in values):
71 values[
"creation_date"]=now
72 myinsert = table_.insert().returning(table_.c.id).values(values)
73 except (KeyError, AttributeError):
74 myinsert = table_.insert().returning(table_.c[values.copy().popitem()[0]]).values(values)
78 connexe=conn.execute(myinsert)
79 id_val=connexe.fetchall()[0][0]
81 print(
"Add "+table_name+
" :",id_val)
82 except (psIntegrityError, IntegrityError):
84 print(
'Warning IntegrityError: in '+table_name+
' values '+values[
"name"]+
' already exist.')
85 print(
'We will use previous value.')
86 id_val=session.query(table_).filter(table_.c.name==values[
"name"]).one()[0]
87 print(
"Reuse "+table_name+
" :",id_val)
91def print_table(table_name):
92 table_ = metadata.tables[table_name]
93 select_st = table_.select()
94 res = conn.execute(select_st)
99def encode_tileset(thistileset):
100 nbtiles=len(thistileset.tiles)
101 tile=thistileset.tiles[int(nbtiles/2)]
108 tile.source[
"variable"]
115 listiles=sorted((tile
for tile
in thistileset.tiles),key=
lambda x: int(x.source[
"connection"]));
117 listiles=sorted((tile
for tile
in thistileset.tiles),key=
lambda x: int(x.id));
118 for tile
in listiles:
120 name=tile.source[
"name"]
124 var=tile.source[
"variable"]
128 tiledata.append({
"title":tile.title,
129 "url":tile.source[
"url"],
130 "comment":tile.comment,
134 "pos_px_x":tile.pos_px_x,
135 "pos_px_y":tile.pos_px_y,
136 "IdLocation" : tile.IdLocation,
141def decode_tileset(thistileset):
144 tile=thistileset.tiles[0]
154 tile.source[
"variable"]
160 listiles=sorted((tile
for tile
in thistileset.tiles),key=
lambda x: int(x.source[
"connection"]));
162 listiles=sorted((tile
for tile
in thistileset.tiles),key=
lambda x: int(x.id));
166 [{
"title":tile.title,
167 "url" :tile.source[
"url"],
168 "comment" :tile.comment,
170 "variable" :tile.source[
"variable"],
171 "pos_px_x" :tile.pos_px_x,
172 "pos_px_y" :tile.pos_px_y,
173 "IdLocation" : tile.IdLocation,
174 "name" :tile.source[
"name"],
175 "connection" :tile.source[
"connection"],
176 }
for tile
in listiles ]}
179 [{
"title":tile.title,
180 "url" :tile.source[
"url"],
181 "comment" :tile.comment,
184 "pos_px_x" :tile.pos_px_x,
185 "pos_px_y" :tile.pos_px_y,
186 "IdLocation" : tile.IdLocation,
187 "name" :tile.source[
"name"],
188 "connection" :tile.source[
"connection"],
189 }
for tile
in listiles ]}
192 [{
"title":tile.title,
193 "url" :tile.source[
"url"],
194 "comment" :tile.comment,
196 "variable" :tile.source[
"variable"],
197 "pos_px_x" :tile.pos_px_x,
198 "pos_px_y" :tile.pos_px_y,
199 "IdLocation" : tile.IdLocation,
201 "connection" :tile.source[
"connection"],
202 }
for tile
in listiles ]}
205 [{
"title":tile.title,
206 "url" :tile.source[
"url"],
207 "comment" :tile.comment,
210 "pos_px_x" :tile.pos_px_x,
211 "pos_px_y" :tile.pos_px_y,
212 "IdLocation" : tile.IdLocation,
214 "connection" :tile.source[
"connection"],
215 }
for tile
in listiles ]}
218 json_tiles_text=json.JSONEncoder().encode(json_tiles)
221 return json_tiles_text
223def encode_session(sessionNAME,Session):
224 ThisSession=session.query(Session).filter(Session.name == sessionNAME).first()
225 ListAllTileSet_ThisSession=ThisSession.tile_sets
226 JsonSession=json.JSONEncoder().encode(
227 {
"info": {
"SessionName" : sessionNAME,
228 "ProjectName" : ThisSession.project.name,
229 "Users" : list(set([ThisSession.project.user.name]+
230 [SessionUser.name
for SessionUser
in ThisSession.users]))},
231 "tilesets": [ {
"name":thistileset.name,
232 "Dataset_path":thistileset.Dataset_path,
233 "tiles": [ {
"id" : tile.id,
234 "title" : tile.title,
235 "comment": tile.comment,
236 "source": tile.source,
238 }
for tile
in thistileset.tiles ] }
239 for thistileset
in ListAllTileSet_ThisSession ]
244def passrandom(nbchar):
246 ALPHABET =
"B6P8VbhZoGp9JYd0.uLCsAT4DXF1xqIUSyQMniNgje5_~3crvlHR-7W2f@kEtmazwKO$"
247 mystring=
''.join(random.choice(ALPHABET)
for i
in range(nbchar)).encode(
'utf-8')
252def passprotected(password):
253 mysalt=passrandom(20)
254 passhash = hashlib.pbkdf2_hmac(
'sha512',password.encode(
'utf-8'),mysalt,100000)
255 hexpass = binascii.hexlify(passhash)
256 return hexpass.decode(
"utf-8",
"ignore"),mysalt.decode(
"utf-8",
"ignore")
259def testpassprotected(Users,user,password,savedhash,savedsalt):
260 mysalt=savedsalt.encode(
'utf-8')
261 passhash = hashlib.pbkdf2_hmac(
'sha512',password.encode(
'utf-8'),mysalt,100000)
262 hexpass = binascii.hexlify(passhash)
263 thisUser=session.query(Users).filter_by(name=user).one()
264 readHash=thisUser.password
265 if (hexpass.decode(
"utf-8",
"ignore")==readHash):
266 now = datetime.datetime.now()
267 thisUser.dateverified=now
271 print(
'mysalt= %s\n passhash = %s\n hexpass = %s\n hexpass.decode("utf-8","ignore") = %s\n readHash = %s' % (mysalt, passhash, hexpass, hexpass.decode(
"utf-8",
"ignore"), readHash))