- - - + + + + + users + + + + + + UsersDB + - - -API Docs for TM-Admin¶ -tmadmin_manage.py¶ - - - - - - - - - + + + + + + updateRole() + - - - - - - - - - - - - - - - - - TmAdminManage - - -¶ -TmAdminManage(dburi='localhost/tm_admin') - - - - - Bases: object - - - - Source code in tm_admin/tmadmin_manage.py - 41 -42 -43 -44 -45 -46 -47 -48 -49 -50def __init__(self, - dburi: str = "localhost/tm_admin" - ): - # this is for processing an SQL diff - self.columns = {'drop': list(), 'add': list()} - self.dburi = dict() - self.pg = None + + + + + updateMappingLevel() + + + + + + + updateExpert() + + + + + + + getRegistered() + + + + + + + + + + + + main() + + + + + + + projects.py + + + + + + + projects + + + + + + + ProjectsDB + + + + + + + main() + + + + + + + organizations.py + + + + + + + organizations + + + + + + + OrganizationsDB + + + + + + + main() + + + + + + + tasks.py + + + + + + + tasks + + + + + + + TasksDB + + + + + + + main() + + + + + + + + + + + + + + + + + + + + + + +API Docs for TM-Admin¶ +tmadmin_manage.py¶ + + + + + + + + + + + + + + + + + + + + + + + + + + + TmAdminManage + + +¶ +TmAdminManage(dburi='localhost/tm_admin') + + + + + Bases: object + + + + Source code in tm_admin/tmadmin_manage.py + 41 +42 +43 +44 +45 +46 +47 +48 +49 +50def __init__(self, + dburi: str = "localhost/tm_admin" + ): + # this is for processing an SQL diff + self.columns = {'drop': list(), 'add': list()} + self.dburi = dict() + self.pg = None if dburi: self.dburi = uriParser(dburi) self.pg = PostgresClient(dburi) @@ -2541,8 +2680,7 @@ Source code in tm_admin/dbsupport.py - 42 -43 + 43 44 45 46 @@ -2561,7 +2699,8 @@ 59 60 61 -62def __init__(self, +62 +63def __init__(self, table: str, dburi: str = "localhost/tm_admin", ): @@ -2646,8 +2785,7 @@ Source code in tm_admin/dbsupport.py - 64 - 65 + 65 66 67 68 @@ -2695,7 +2833,8 @@ 110 111 112 -113def createTable(self, +113 +114def createTable(self, obj, ): """ @@ -2727,7 +2866,7 @@ except: pass if column == 'id': - sql += f"nextval('public.organizations_id_seq')," + sql += f"nextval('public.{self.table}_id_seq')," continue if value is None: continue @@ -2743,7 +2882,7 @@ elif type(value) == str: sql += f"'{value}'," - print(sql[:-1]) + #print(sql[:-1]) result = self.pg.dbcursor.execute(f"{sql[:-1]});") @@ -2801,8 +2940,7 @@ Source code in tm_admin/dbsupport.py - 115 -116 + 116 117 118 119 @@ -2836,7 +2974,8 @@ 147 148 149 -150def updateTable(self, +150 +151def updateTable(self, id: int = None, ): """ @@ -2898,12 +3037,12 @@ Source code in tm_admin/dbsupport.py - 152 -153 + 153 154 155 156 -157def resetSequence(self): +157 +158def resetSequence(self): """ Reset the postgres sequence to zero. """ @@ -2989,8 +3128,7 @@ Source code in tm_admin/dbsupport.py - 159 -160 + 160 161 162 163 @@ -3012,7 +3150,8 @@ 179 180 181 -182def getByID(self, +182 +183def getByID(self, id: int, ): """ @@ -3116,8 +3255,7 @@ Source code in tm_admin/dbsupport.py - 184 -185 + 185 186 187 188 @@ -3138,7 +3276,8 @@ 203 204 205 -206def getByName(self, +206 +207def getByName(self, name: str, ): """ @@ -3150,7 +3289,7 @@ Returns: (list): The results of the query """ - sql = f"SELECT * FROM {self.table} WHERE name='{name}' LIMIT 1" + sql = f"SELECT * FROM {self.table} WHERE username='{name}' LIMIT 1" self.pg.dbcursor.execute(sql) data = dict() entry = self.pg.dbcursor.fetchone() @@ -3211,8 +3350,7 @@ Source code in tm_admin/dbsupport.py - 208 -209 + 209 210 211 212 @@ -3234,7 +3372,8 @@ 228 229 230 -231def getAll(self): +231 +232def getAll(self): """ Return all the data in the table. @@ -3338,8 +3477,7 @@ Source code in tm_admin/dbsupport.py - 233 -234 + 234 235 236 237 @@ -3361,7 +3499,9 @@ 253 254 255 -256def getByWhere(self, +256 +257 +258def getByWhere(self, where: str, ): """ @@ -3373,7 +3513,8 @@ Returns: (list): The results of the query """ - sql = f"SELECT * FROM {self.table} WHERE {where}'" + sql = f"SELECT * FROM {self.table} WHERE {where}" + # print(sql) result = self.pg.dbcursor.execute(sql) data = dict() entry = self.pg.dbcursor.fetchone() @@ -3392,37 +3533,80 @@ + - - - + + getByLocation - +¶ +getByLocation(location, table='projects') + + + + Return the database records in a table using GPS coordinates. - - main + Parameters: + + + + Name + Type + Description + Default + + + + + location + + Point + + + + The location to use to find the project or task. + + + + required + + + + -¶ -main() - - - - This main function lets this class be run standalone by a bash script. + Returns: + + + + Type + Description + + + + + + list + + + + The results of the query + + + + + Source code in tm_admin/dbsupport.py - 258 -259 -260 + 260 261 262 263 @@ -3446,20 +3630,293 @@ 281 282 283 -284 -285 -286 -287 -288 -289 -290 -291 -292 -293 -294 +284def getByLocation(self, + location: Point, + table: str = 'projects', + ): + """ + Return the database records in a table using GPS coordinates. + + Args: + location (Point): The location to use to find the project or task. + + Returns: + (list): The results of the query + """ + data = dict() + ewkt = shape(location) + sql = f"SELECT * FROM {table} WHERE ST_CONTAINS(ST_GeomFromEWKT('SRID=4326;{ewkt}') geom)" + self.pg.dbcursor.execute(sql) + entry = self.pg.dbcursor.fetchall() + for column in self.profile.data.keys(): + index = 0 + for column in self.profile.data.keys(): + data[column] = entry[index] + index += 1 + + return [data] + + + + + + + + + + + + + + deleteByID + + +¶ +deleteByID(id) + + + + + Delete the record for the ID in the table. + + + + Parameters: + + + + Name + Type + Description + Default + + + + + id + + int + + + + The ID of the dataset to delete. + + + + required + + + + + + + Source code in tm_admin/dbsupport.py + 286 +287 +288 +289 +290 +291 +292 +293 +294 295 -296 -297def main(): +296def deleteByID(self, + id: int, + ): + """ + Delete the record for the ID in the table. + + Args: + id (int): The ID of the dataset to delete. + """ + sql = f"DELETE FROM {self.table} WHERE id='{id}'" + result = self.pg.dbcursor.execute(sql) + + + + + + + + + + + + + + updateColumn + + +¶ +updateColumn(id, data) + + + + + This updates a single column in the database. If you want to update multiple columns, +use self.updateTable() instead. + + + + Parameters: + + + + Name + Type + Description + Default + + + + + id + + int + + + + The ID of the user to update + + + + required + + + + data + + dict + + + + The column and new value + + + + required + + + + + + + Source code in tm_admin/dbsupport.py + 298 +299 +300 +301 +302 +303 +304 +305 +306 +307 +308 +309 +310 +311 +312 +313 +314 +315 +316 +317def updateColumn(self, + id: int, + data: dict, + ): + """ + This updates a single column in the database. If you want to update multiple columns, + use self.updateTable() instead. + + Args: + id (int): The ID of the user to update + data (dict): The column and new value + """ + [[column, value]] = data.items() + sql = f"UPDATE {self.table} SET {column}='{value}' WHERE id='{id}'" + # print(sql) + try: + result = self.pg.dbcursor.execute(f"{sql};") + return True + except: + return False + + + + + + + + + + + + + + + + + + + + + + + main + + +¶ +main() + + + + + This main function lets this class be run standalone by a bash script. + + + Source code in tm_admin/dbsupport.py + 319 +320 +321 +322 +323 +324 +325 +326 +327 +328 +329 +330 +331 +332 +333 +334 +335 +336 +337 +338 +339 +340 +341 +342 +343 +344 +345 +346 +347 +348 +349 +350 +351 +352 +353 +354 +355 +356 +357 +358def main(): """This main function lets this class be run standalone by a bash script.""" parser = argparse.ArgumentParser() parser.add_argument("-v", "--verbose", nargs="?", const="0", help="verbose output") @@ -3568,7 +4025,7 @@ - filespec( + filespec str @@ -3578,7 +4035,7 @@ - required + None @@ -3653,7 +4110,7 @@ A class that generates the output files from the config data. Args: - filespec( str): The config file to use as source. + filespec (str): The config file to use as source. Returns: (Generator): An instance of this class @@ -3675,7 +4132,7 @@ } self.yaml2sql = {'int32': 'int', - 'int64': 'int', + 'int64': 'bigint', 'bool': 'bool', 'string': 'character varying', 'bytes': 'bytea', @@ -3730,7 +4187,7 @@ - filespec( + filespec str @@ -3765,7 +4222,7 @@ Reads in the YAML config file. Args: - filespec( str): The config file to use as source. + filespec (str): The config file to use as source. """ self.filespec = Path(filespec) self.yaml = YamlFile(filespec) @@ -4372,7 +4829,7 @@ log.warning(f"GEOMETRY: {datatype}") elif k1[:7] == 'public.': # FIXME: It's in the SQL types - log.warning(f"SQL ENUM {k1}!") + # log.warning(f"SQL ENUM {k1}!") datatype = f"tm_admin.types_tm.{k1[7:].capitalize()}" elif k1 in self.yaml2py: datatype = self.yaml2py[k1] @@ -4580,7 +5037,9 @@ 348 349 350 -351 def createSQLTable(self): +351 +352 +353 def createSQLTable(self): """ Create the source for an SQL table. @@ -4629,7 +5088,9 @@ if public: out += f"\t{k} {v[0]}{array}{required},\n" else: - print(v) + # print(v) + # FIXME: if this produces an error, check the yaml file as this + # usually means the type field isn't first in the list. out += f"\t{k} {self.yaml2sql[v[0]]}{array}{required},\n" if len(unique) > 0: out += f"\tUNIQUE({unique})\n);\n" @@ -4681,9 +5142,7 @@ Source code in tm_admin/generator.py - 353 -354 -355 + 355 356 357 358 @@ -4734,7 +5193,9 @@ 403 404 405 -406def main(): +406 +407 +408def main(): """This main function lets this class be run standalone by a bash script.""" parser = argparse.ArgumentParser( prog="generator", @@ -5474,27 +5935,7 @@ Source code in tm_admin/tmserver.py -
+ + + + + + + +API Docs for TM-Admin¶ +tmadmin_manage.py¶ + + + + + + + + + + + + + + + + + + + + + + + + + + + TmAdminManage + + +¶ +TmAdminManage(dburi='localhost/tm_admin') + + + + + Bases: object + + + + Source code in tm_admin/tmadmin_manage.py + 41 +42 +43 +44 +45 +46 +47 +48 +49 +50def __init__(self, + dburi: str = "localhost/tm_admin" + ): + # this is for processing an SQL diff + self.columns = {'drop': list(), 'add': list()} + self.dburi = dict() + self.pg = None if dburi: self.dburi = uriParser(dburi) self.pg = PostgresClient(dburi) @@ -2541,8 +2680,7 @@ Source code in tm_admin/dbsupport.py - 42 -43 + 43 44 45 46 @@ -2561,7 +2699,8 @@ 59 60 61 -62def __init__(self, +62 +63def __init__(self, table: str, dburi: str = "localhost/tm_admin", ): @@ -2646,8 +2785,7 @@ Source code in tm_admin/dbsupport.py - 64 - 65 + 65 66 67 68 @@ -2695,7 +2833,8 @@ 110 111 112 -113def createTable(self, +113 +114def createTable(self, obj, ): """ @@ -2727,7 +2866,7 @@ except: pass if column == 'id': - sql += f"nextval('public.organizations_id_seq')," + sql += f"nextval('public.{self.table}_id_seq')," continue if value is None: continue @@ -2743,7 +2882,7 @@ elif type(value) == str: sql += f"'{value}'," - print(sql[:-1]) + #print(sql[:-1]) result = self.pg.dbcursor.execute(f"{sql[:-1]});") @@ -2801,8 +2940,7 @@ Source code in tm_admin/dbsupport.py - 115 -116 + 116 117 118 119 @@ -2836,7 +2974,8 @@ 147 148 149 -150def updateTable(self, +150 +151def updateTable(self, id: int = None, ): """ @@ -2898,12 +3037,12 @@ Source code in tm_admin/dbsupport.py - 152 -153 + 153 154 155 156 -157def resetSequence(self): +157 +158def resetSequence(self): """ Reset the postgres sequence to zero. """ @@ -2989,8 +3128,7 @@ Source code in tm_admin/dbsupport.py - 159 -160 + 160 161 162 163 @@ -3012,7 +3150,8 @@ 179 180 181 -182def getByID(self, +182 +183def getByID(self, id: int, ): """ @@ -3116,8 +3255,7 @@ Source code in tm_admin/dbsupport.py - 184 -185 + 185 186 187 188 @@ -3138,7 +3276,8 @@ 203 204 205 -206def getByName(self, +206 +207def getByName(self, name: str, ): """ @@ -3150,7 +3289,7 @@ Returns: (list): The results of the query """ - sql = f"SELECT * FROM {self.table} WHERE name='{name}' LIMIT 1" + sql = f"SELECT * FROM {self.table} WHERE username='{name}' LIMIT 1" self.pg.dbcursor.execute(sql) data = dict() entry = self.pg.dbcursor.fetchone() @@ -3211,8 +3350,7 @@ Source code in tm_admin/dbsupport.py - 208 -209 + 209 210 211 212 @@ -3234,7 +3372,8 @@ 228 229 230 -231def getAll(self): +231 +232def getAll(self): """ Return all the data in the table. @@ -3338,8 +3477,7 @@ Source code in tm_admin/dbsupport.py - 233 -234 + 234 235 236 237 @@ -3361,7 +3499,9 @@ 253 254 255 -256def getByWhere(self, +256 +257 +258def getByWhere(self, where: str, ): """ @@ -3373,7 +3513,8 @@ Returns: (list): The results of the query """ - sql = f"SELECT * FROM {self.table} WHERE {where}'" + sql = f"SELECT * FROM {self.table} WHERE {where}" + # print(sql) result = self.pg.dbcursor.execute(sql) data = dict() entry = self.pg.dbcursor.fetchone() @@ -3392,37 +3533,80 @@ + - - - + + getByLocation - +¶ +getByLocation(location, table='projects') + + + + Return the database records in a table using GPS coordinates. - - main + Parameters: + + + + Name + Type + Description + Default + + + + + location + + Point + + + + The location to use to find the project or task. + + + + required + + + + -¶ -main() - - - - This main function lets this class be run standalone by a bash script. + Returns: + + + + Type + Description + + + + + + list + + + + The results of the query + + + + + Source code in tm_admin/dbsupport.py - 258 -259 -260 + 260 261 262 263 @@ -3446,20 +3630,293 @@ 281 282 283 -284 -285 -286 -287 -288 -289 -290 -291 -292 -293 -294 +284def getByLocation(self, + location: Point, + table: str = 'projects', + ): + """ + Return the database records in a table using GPS coordinates. + + Args: + location (Point): The location to use to find the project or task. + + Returns: + (list): The results of the query + """ + data = dict() + ewkt = shape(location) + sql = f"SELECT * FROM {table} WHERE ST_CONTAINS(ST_GeomFromEWKT('SRID=4326;{ewkt}') geom)" + self.pg.dbcursor.execute(sql) + entry = self.pg.dbcursor.fetchall() + for column in self.profile.data.keys(): + index = 0 + for column in self.profile.data.keys(): + data[column] = entry[index] + index += 1 + + return [data] + + + + + + + + + + + + + + deleteByID + + +¶ +deleteByID(id) + + + + + Delete the record for the ID in the table. + + + + Parameters: + + + + Name + Type + Description + Default + + + + + id + + int + + + + The ID of the dataset to delete. + + + + required + + + + + + + Source code in tm_admin/dbsupport.py + 286 +287 +288 +289 +290 +291 +292 +293 +294 295 -296 -297def main(): +296def deleteByID(self, + id: int, + ): + """ + Delete the record for the ID in the table. + + Args: + id (int): The ID of the dataset to delete. + """ + sql = f"DELETE FROM {self.table} WHERE id='{id}'" + result = self.pg.dbcursor.execute(sql) + + + + + + + + + + + + + + updateColumn + + +¶ +updateColumn(id, data) + + + + + This updates a single column in the database. If you want to update multiple columns, +use self.updateTable() instead. + + + + Parameters: + + + + Name + Type + Description + Default + + + + + id + + int + + + + The ID of the user to update + + + + required + + + + data + + dict + + + + The column and new value + + + + required + + + + + + + Source code in tm_admin/dbsupport.py + 298 +299 +300 +301 +302 +303 +304 +305 +306 +307 +308 +309 +310 +311 +312 +313 +314 +315 +316 +317def updateColumn(self, + id: int, + data: dict, + ): + """ + This updates a single column in the database. If you want to update multiple columns, + use self.updateTable() instead. + + Args: + id (int): The ID of the user to update + data (dict): The column and new value + """ + [[column, value]] = data.items() + sql = f"UPDATE {self.table} SET {column}='{value}' WHERE id='{id}'" + # print(sql) + try: + result = self.pg.dbcursor.execute(f"{sql};") + return True + except: + return False + + + + + + + + + + + + + + + + + + + + + + + main + + +¶ +main() + + + + + This main function lets this class be run standalone by a bash script. + + + Source code in tm_admin/dbsupport.py + 319 +320 +321 +322 +323 +324 +325 +326 +327 +328 +329 +330 +331 +332 +333 +334 +335 +336 +337 +338 +339 +340 +341 +342 +343 +344 +345 +346 +347 +348 +349 +350 +351 +352 +353 +354 +355 +356 +357 +358def main(): """This main function lets this class be run standalone by a bash script.""" parser = argparse.ArgumentParser() parser.add_argument("-v", "--verbose", nargs="?", const="0", help="verbose output") @@ -3568,7 +4025,7 @@ - filespec( + filespec str @@ -3578,7 +4035,7 @@ - required + None @@ -3653,7 +4110,7 @@ A class that generates the output files from the config data. Args: - filespec( str): The config file to use as source. + filespec (str): The config file to use as source. Returns: (Generator): An instance of this class @@ -3675,7 +4132,7 @@ } self.yaml2sql = {'int32': 'int', - 'int64': 'int', + 'int64': 'bigint', 'bool': 'bool', 'string': 'character varying', 'bytes': 'bytea', @@ -3730,7 +4187,7 @@ - filespec( + filespec str @@ -3765,7 +4222,7 @@ Reads in the YAML config file. Args: - filespec( str): The config file to use as source. + filespec (str): The config file to use as source. """ self.filespec = Path(filespec) self.yaml = YamlFile(filespec) @@ -4372,7 +4829,7 @@ log.warning(f"GEOMETRY: {datatype}") elif k1[:7] == 'public.': # FIXME: It's in the SQL types - log.warning(f"SQL ENUM {k1}!") + # log.warning(f"SQL ENUM {k1}!") datatype = f"tm_admin.types_tm.{k1[7:].capitalize()}" elif k1 in self.yaml2py: datatype = self.yaml2py[k1] @@ -4580,7 +5037,9 @@ 348 349 350 -351 def createSQLTable(self): +351 +352 +353 def createSQLTable(self): """ Create the source for an SQL table. @@ -4629,7 +5088,9 @@ if public: out += f"\t{k} {v[0]}{array}{required},\n" else: - print(v) + # print(v) + # FIXME: if this produces an error, check the yaml file as this + # usually means the type field isn't first in the list. out += f"\t{k} {self.yaml2sql[v[0]]}{array}{required},\n" if len(unique) > 0: out += f"\tUNIQUE({unique})\n);\n" @@ -4681,9 +5142,7 @@ Source code in tm_admin/generator.py - 353 -354 -355 + 355 356 357 358 @@ -4734,7 +5193,9 @@ 403 404 405 -406def main(): +406 +407 +408def main(): """This main function lets this class be run standalone by a bash script.""" parser = argparse.ArgumentParser( prog="generator", @@ -5474,27 +5935,7 @@ Source code in tm_admin/tmserver.py -