示例#1
0
    def filter(cls, **query_args):
        """Finds data entries from storage as list of Model instances

        :param: query_args - a dict holding query conditions like {'id': 123}
        :returns: list with Model instances or empty list if no match

        """
        retval = []
        storage = StorageForge()
        model_name = cls.get_model_name()
        values_list = storage.filter(model_name, **query_args)
        for values in values_list:
            retval.append(cls(**values))
        return retval
示例#2
0
    def __init__(self, **values):
        """During initialization  it is possible to set all Fields

        To set Field values during Model initialization time a dict
        of field names and values is required in such form:

            {<field-name>: <value>}

        """
        if values:
            for name, value in values.items():
                field = getattr(self, name)
                # FIXME field value gets overwritten when creating multiple
                #       instances
                field.put_value(value)
        self.storage = StorageForge()
示例#3
0
class Model(object):
    """Provides Model for storing and managing data

    to initiate model one needs to subclass from Model class and use
    Field class data-type-methods to define Model. This alows data
    validation and control when assigning values to Model instance.

    Also this class implements ``sync`` method which synchronises
    data schema with actual data storage.

    """
    def __new__(cls, **kwargs):
        user_model_inst = super(Model, cls).__new__(cls, **kwargs)
        return user_model_inst

    def __setattr__(self, name, value):
        """Here we define how user values should be assigned

        When Field does not exists by name it will be added

        :param: name - string name of an Field
        :param: value - data value which gets passed to Field

        """
        field = self._introspect(name=name)
        if field:
            field = field[name].put_value(value)
        else:
            super(Model, self).__setattr__(name, value)

    def __init__(self, **values):
        """During initialization  it is possible to set all Fields

        To set Field values during Model initialization time a dict
        of field names and values is required in such form:

            {<field-name>: <value>}

        """
        if values:
            for name, value in values.items():
                field = getattr(self, name)
                # FIXME field value gets overwritten when creating multiple
                #       instances
                field.put_value(value)
        self.storage = StorageForge()

    def save(self):
        """Here is where value of Field gets stored in actual storage

        All Field values are collected here and passed to storage
        back-end where these get saved according to earlier Model
        definition which was synced with storage.

        """
        values = []
        fields = self._introspect()
        for name, field in fields.items():
            attr = getattr(self, name)
            values.append(attr)
        model_name = self.get_model_name()
        self.storage.save(model_name, values)

    @classmethod
    def filter(cls, **query_args):
        """Finds data entries from storage as list of Model instances

        :param: query_args - a dict holding query conditions like {'id': 123}
        :returns: list with Model instances or empty list if no match

        """
        retval = []
        storage = StorageForge()
        model_name = cls.get_model_name()
        values_list = storage.filter(model_name, **query_args)
        for values in values_list:
            retval.append(cls(**values))
        return retval

    @classmethod
    def sync(cls):
        """Synchronizes Model with Storage"""
        fields = cls._introspect()
        storage = StorageForge()
        model_name = cls.get_model_name()
        storage.sync(model_name, fields)

    @classmethod
    def flush(cls):
        """Deletes all Model entries in storage"""
        fields = cls._introspect()
        storage = StorageForge()
        model_name = cls.get_model_name()
        storage.flush(model_name)

    @classmethod
    def _introspect(cls, name=None):
        """Looks for defined Field in the Model definition

        :param: name - string name of specific Field (optional)
        :returns: dict of {'name': Field,} or first matched Field if ``name`` given

        """
        fields = {}
        for attr_name in dir(cls):
            attr = getattr(cls, attr_name)
            if isinstance(attr, Field):
                if name is not None:
                    if attr_name == name:
                        return {attr_name: attr}
                else:
                    fields[attr_name] = attr
        return fields

    @classmethod
    def get_model_name(cls):
        """Gets name of model in lower case

        :returns: name - string name of the model

        """
        return cls.__name__.lower()
示例#4
0
 def flush(cls):
     """Deletes all Model entries in storage"""
     fields = cls._introspect()
     storage = StorageForge()
     model_name = cls.get_model_name()
     storage.flush(model_name)
示例#5
0
 def sync(cls):
     """Synchronizes Model with Storage"""
     fields = cls._introspect()
     storage = StorageForge()
     model_name = cls.get_model_name()
     storage.sync(model_name, fields)