Exemple #1
0
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]
            })
Exemple #2
0
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()
Exemple #3
0
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())