6
0

Model.py 1.8 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556
  1. from contextlib import closing
  2. from json import loads, dumps
  3. class Model:
  4. """
  5. database class for label providers
  6. """
  7. def __init__(self, database, row):
  8. self.database = database
  9. self.identifier = row[0]
  10. self.name = row[1]
  11. self.description = row[2]
  12. self.root_folder = row[3]
  13. self.supports = loads(row[4])
  14. def copy_to(self, name: str, root_folder: str):
  15. """
  16. copies the models database entry while changing name and root_folder
  17. :param name: copy name
  18. :param root_folder: copy root folder
  19. :return: copy
  20. """
  21. supports = dumps(self.supports)
  22. with closing(self.database.con.cursor()) as cursor:
  23. cursor.execute('''
  24. INSERT INTO models (name, description, root_folder, supports)
  25. VALUES (?, ?, ?, ?)
  26. ON CONFLICT (root_folder)
  27. DO UPDATE SET name = ?, description = ?, supports = ?
  28. ''', (name, self.description, root_folder, supports, name, self.description, supports))
  29. # lastrowid is 0 if on conflict clause applies.
  30. # If this is the case we do an extra query to receive the row id.
  31. if cursor.lastrowid > 0:
  32. row_id = cursor.lastrowid
  33. insert = True
  34. else:
  35. cursor.execute('SELECT id FROM models WHERE root_folder = ?', [root_folder])
  36. row_id = cursor.fetchone()[0]
  37. insert = False
  38. return self.database.model(row_id), insert
  39. def remove(self):
  40. """
  41. remove this model from the database
  42. :return:
  43. """
  44. with closing(self.database.con.cursor()) as cursor:
  45. cursor.execute('DELETE FROM models WHERE id = ?', [self.identifier])