class DataModel: def __init__(self): self.define() self.initDB() def define(self): """Define column patterns and databases """ class FoodRow(Row): columns = [ ColumnSpec(LineEditColumn, key_name="name", label_name="Name"), ColumnSpec(LineEditColumn, key_name="price", label_name="Price"), ColumnSpec(CheckBoxColumn, key_name="spicy", label_name="Is spicy") ] self.FoodRow = FoodRow self.food_collection = SimpleCollection(filename="food_test.db", row_classes=[self.FoodRow]) class PersonRow(Row): columns = [ ColumnSpec(LineEditColumn, key_name="firstname", label_name="First Name"), ColumnSpec(LineEditColumn, key_name="surname", label_name="Surname"), ColumnSpec(LineEditColumn, key_name="address", label_name="Address"), ColumnSpec(CheckBoxColumn, key_name="married", label_name="Is married") ] self.PersonRow = PersonRow class PersonRowExtended(Row): columns = [ ColumnSpec(LineEditColumn, key_name="firstname", label_name="First Name"), ColumnSpec(LineEditColumn, key_name="secondname", label_name="Second Name"), ColumnSpec(LineEditColumn, key_name="surname", label_name="Surname"), ColumnSpec(LineEditColumn, key_name="address", label_name="Address"), # in the following, we're referring to self.food_collection and there, to the columns with keys "_id" and "name". The ListEditColumn itself is a list of foreign_keys ColumnSpec(ListEditColumn, key_name="foods", label_name="Favorite foods", collection=self.food_collection, foreign_label_name="name") ] self.PersonRowExtended = PersonRowExtended self.collection = SimpleCollection( filename="simple_test.db", row_classes=[PersonRow, PersonRowExtended]) class PersonList(List): def makeLabel(self, entry): try: st = entry["firstname"] + " " + entry["surname"] except KeyError: st = "?" return st self.PersonList = PersonList class FoodList(List): def makeLabel(self, entry): try: st = entry["name"] + " (" + str(entry["price"]) + " EUR)" except KeyError: st = "?" return st self.FoodList = FoodList def initDB(self): """Write some entries to databases """ self.collection.new( self.PersonRow, { "firstname": "Paavo", "surname": "Vayrynen", "address": "Koukkusaarentie 1", "married": True }) self.collection.new( self.PersonRow, { "firstname": "Martti", "surname": "Ahtisaari", "address": "Lokkisaarentie 1", "married": True }) # add some foods self.food_collection.new(self.FoodRow, { "name": "Hamburger", "price": 10, "spicy": False }) self.food_collection.new(self.FoodRow, { "name": "Hotdog", "price": 50, "spicy": False }) self.food_collection.new(self.FoodRow, { "name": "Freedom Fries", "price": 10, "spicy": False }) self.food_collection.new(self.FoodRow, { "name": "Bacalao", "price": 100, "spicy": False }) self.food_collection.new(self.FoodRow, { "name": "Piparra", "price": 1, "spicy": True }) # get ids of some foods .. bacalao = list( self.food_collection.get(query={"name": "Bacalao"}))[0]["_id"] piparra = list( self.food_collection.get(query={"name": "Piparra"}))[0]["_id"] self.collection.new( self.PersonRowExtended, { "firstname": "Juho", "secondname": "Kustaa", "surname": "Paasikivi", "address": "Kontulankaari 1", "foods": [] }) self.collection.new( self.PersonRowExtended, { "firstname": "Esko", "secondname": "Iiro", "surname": "Seppänen", "address": "Mellunraitti 3", "foods": [bacalao, piparra] })
class TestGui6(MyGui): """Left: list of records (users). Right: list of cards. Rightmost: user rights. """ # LineEditColumn(field_name="firstname",label_name="First Name", ..) # ComboBoxColum(collection=.., key_column_name=..,field_name=..,label_name="Car model") def initVars(self): # users self.collection1 = SimpleCollection(filename="simple_test6a.db") self.collection1.clear() # cars self.collection2 = SimpleCollection(filename="simple_test6b.db") self.collection2.clear() # permissions self.collection3 = SimpleCollection(filename="simple_test6c.db") self.collection3.clear() def setupUi(self): super().setupUi() # we need self.side_collection, hence the definitions here class Row1(Row): columns = [ ColumnSpec(LineEditColumn, key_name="name", label_name="First Name"), ColumnSpec(LineEditColumn, key_name="surname", label_name="Last Name") ] class Row2(Row): columns = [ ColumnSpec(LineEditColumn, key_name="brand", label_name="Brand"), ColumnSpec(LineEditColumn, key_name="year", label_name="Year") ] class LinkRow(Row): columns = [ ColumnSpec(ForeignKeyColumn, key_name="user_key"), ColumnSpec(ForeignKeyColumn, key_name="car_key"), ColumnSpec(CheckBoxColumn, key_name="drive", label_name="Can drive"), ColumnSpec(CheckBoxColumn, key_name="sell", label_name="Can sell") ] class TestList1(List): def makeLabel(self, entry): return entry["name"] + " " + entry["surname"] class TestList2(List): def makeLabel(self, entry): return entry["brand"] class TestFormSet1(FormSet): row_classes = [Row1] class TestFormSet2(FormSet): row_classes = [Row2] class TestFormSet3(PermissionFormSet): row_classes = [LinkRow] self.collection1.new(Row1, {"name": "Antti", "surname": "Mykkanen"}) self.collection1.new(Row1, {"name": "Jonne", "surname": "Paananen"}) self.collection1.new(Row1, {"name": "Juho", "surname": "Kokkonen"}) self.collection1.new(Row1, {"name": "Janne", "surname": "Suhonen"}) self.collection2.new(Row2, {"brand": "Ford", "year": 2000}) self.collection2.new(Row2, {"brand": "Audi", "year": 1996}) self.collection2.new(Row2, {"brand": "Seat", "year": 2004}) self.collection2.new(Row2, {"brand": "Yugo", "year": 1985}) self.collection2.new(Row2, {"brand": "BMW", "year": 2016}) self.lis1 = TestList1(collection=self.collection1) self.lis1.widget.setParent(self.w) self.lay.addWidget(self.lis1.widget) self.formset1 = TestFormSet1(collection=self.collection1) self.formset1.widget.setParent(self.w) self.lay.addWidget(self.formset1.widget) self.lis2 = TestList2(collection=self.collection2) self.lis2.widget.setParent(self.w) self.lay.addWidget(self.lis2.widget) self.formset2 = TestFormSet2(collection=self.collection2) self.formset2.widget.setParent(self.w) self.lay.addWidget(self.formset2.widget) self.formset3 = TestFormSet3(collection=self.collection3, key1_name="user_key", key2_name="car_key") self.formset3.widget.setParent(self.w) self.lay.addWidget(self.formset3.widget) self.lis1.widget.currentItemChanged.connect( self.formset1.chooseForm_slot ) # inform formset about the item in question self.lis2.widget.currentItemChanged.connect( self.formset2.chooseForm_slot ) # inform formset about the item in question # connect the user/car pair to the permission form self.lis1.widget.currentItemChanged.connect( self.formset3.pingCol1_slot ) # inform formset about the item in question self.lis2.widget.currentItemChanged.connect( self.formset3.pingCol2_slot ) # inform formset about the item in question # self.formset1.signals.new_record. connect(self.lis1.update_slot) # inform list that a new entry has been added def closeEvent(self, e): print("close event!") self.collection1.close() self.collection2.close() e.accept()
class DataModel: def __init__(self, directory="."): """DataModel ctor """ self.directory = directory self.define() def __del__(self): # self.close() pass def close(self): # print("close: ",self.area_rights_collection) for collection in self.collections: collection.close() def clearAll(self): # print("DataModel", "clearAll") self.clearCameraCollection() self.config_collection.clear() self.valkkafs_collection.clear() self.layout_collection.clear() def saveAll(self): for collection in self.collections: collection.save() def clearCameraCollection(self): self.camera_collection.clear() for i in range(1, constant.max_devices + 1): self.camera_collection.new(EmptyRow, {"slot": i}) def checkCameraCollection(self): c = 0 for c, device in enumerate(self.camera_collection.get()): pass if (c != constant.max_devices - 1): return False return True def autoGenerateCameraCollection(self, base_address, nstart, n, port, tail, username, password): """ :param: base_address str, e.g. "192.168.1" :param: nstart int, e.g. 24 :param: n int, how many ips generated """ self.camera_collection.clear() self.camera_collection.save() cc = nstart for i in range(1, min((n + 1, constant.max_devices + 1))): print(i) self.camera_collection.new( RTSPCameraRow, { "slot": i, "address": base_address + "." + str(cc), "username": username, "password": password, "port": port, "tail": tail, "subaddress_main": "", "live_main": True, "rec_main": False, "subaddress_sub": "", "live_sub": False, "rec_sub": False }) cc += 1 print("Camera addesses now:") for c, device in enumerate(self.camera_collection.get()): print(c + 1, RTSPCameraRow.getMainAddressFromDict(device)) for i in range(n + 1, constant.max_devices + 1): self.camera_collection.new(EmptyRow, {"slot": i}) self.camera_collection.save() print("Camera collection now:") for c, device in enumerate(self.camera_collection.get()): print(c + 1, device) def purge(self): """For migrations / cleanup. Collections should be in correct order. """ for collection in self.collections: # print("purging",collection) collection.purge() def define(self): """Define column patterns and collections """ self.collections = [] self.camera_collection = \ SimpleCollection(filename=os.path.join(self.directory, "devices.dat"), row_classes=[ EmptyRow, RTSPCameraRow, USBCameraRow ] ) self.collections.append(self.camera_collection) self.config_collection = \ SimpleCollection(filename=os.path.join(self.directory, "config.dat"), row_classes=[ # we could dump here all kinds of info related to different kind of configuration forms MemoryConfigRow ] ) self.collections.append(self.config_collection) self.valkkafs_collection = \ SimpleCollection(filename=os.path.join(self.directory, "valkkafs.dat"), row_classes=[ ValkkaFSConfigRow ] ) self.collections.append(self.valkkafs_collection) """ self.layout_collection = \ SimpleCollection(filename=os.path.join(self.directory, "layout.dat"), row_classes=[ VideoContainerNxMRow, PlayVideoContainerNxMRow, CameraListWindowRow, MainWindowRow ] ) """ self.layout_collection = \ SimpleCollection(filename=os.path.join(self.directory, "layout.dat"), row_classes=[ LayoutContainerRow ] ) self.collections.append(self.layout_collection) def getDeviceList(self): return DeviceList(collection=self.camera_collection) def getDeviceListAndForm(self, parent): device_list = DeviceList(collection=self.camera_collection) device_form = SlotFormSet(collection=self.camera_collection) return ListAndForm(device_list, device_form, title="Camera configuration", parent=parent) def getConfigForm(self): return MemoryConfigForm(row_class=MemoryConfigRow, collection=self.config_collection) def getValkkaFSForm(self): return ValkkaFSForm(row_class=ValkkaFSConfigRow, collection=self.valkkafs_collection) def getRowsById(self, query): rows = self.camera_collection.get(query) rows_by_id = {} for row in rows: rows_by_id[row["_id"]] = row return rows_by_id def getDevicesById(self): # , query): """ rows = self.camera_collection.get(query) devices_by_id = {} for row in rows: row.pop("classname") device = RTSPCameraDevice(**row) devices_by_id[device._id] = device return devices_by_id """ rows = self.camera_collection.get() devices_by_id = {} for row in rows: classname = row.pop("classname") if (classname == "RTSPCameraRow"): device = RTSPCameraDevice(**row) elif (classname == "USBCameraRow"): device = USBCameraDevice(**row) else: device = None if (device): devices_by_id[device._id] = device return devices_by_id def writeDefaultValkkaFSConfig(self): self.valkkafs_collection.new( ValkkaFSConfigRow, { # "dirname" : default.valkkafs_config["dirname"], # not written to db for the moment "n_blocks": default.get_valkkafs_config()["n_blocks"], "blocksize": default.get_valkkafs_config()["blocksize"], "fs_flavor": default.get_valkkafs_config()["fs_flavor"], "record": default.get_valkkafs_config()["record"], "partition_uuid": default.get_valkkafs_config()["partition_uuid"] }) def writeDefaultMemoryConfig(self): self.config_collection.new(MemoryConfigRow, default.get_memory_config())