Source code for save_to_db.core.model_deleter
from pprint import pprint
[docs]class ModelDeleter(object):
"""This class keeps track of new items and is able to find those items
in database that are not new in order to delete or unrefrence them
(from x-to-many relationships).
:param model_cls: ORM model class used by items that instance of this class
deals with.
:param selector_fields: List of fields that are collected from items. The
values are used later to pull models from database.
:param keeper_fields: Similar to `selector_fields`. If a model can be
pulled from database using values from `keeper_fields`, then this model
is ignored by this class.
"""
def __init__(self, model_cls, selector_fields, keeper_fields):
self.model_cls = model_cls
self.selector_fields = selector_fields
self.keeper_fields = keeper_fields
self.reset()
[docs] def reset(self):
""" Resets `selectors` and `keepers`. """
self.selectors = []
self.keepers = []
[docs] def collect_model(self, model):
"""Saves `selector_fields` from `model`.
:param model: ORM Model to collect field values from.
"""
filters = self.__collect_filters(model, self.selector_fields)
if filters not in self.selectors:
self.selectors.append(filters)
filters = self.__collect_filters(model, self.keeper_fields)
if filters not in self.keepers:
self.keepers.append(filters)
def __collect_filters(self, model, fields):
filters = {}
for field in fields:
if not hasattr(model, field):
filters[field] = None
else:
filters[field] = getattr(model, field)
return filters
[docs] def execute_delete(self, db_adapter):
"""Deletes rows from database that can be selected (pulled from
database) using values from `selectors` but excluding those that can
be selected by `keepers`.
:param db_adapter: Database adapter.
"""
db_adapter.execute_delete(self.model_cls, self.selectors, self.keepers)
self.reset()
[docs] def execute_unref(self, parent_model, fkey, db_adapter):
"""Removes x-to-many references in database from x-to-many
relationship from `parent_model` to child model through `fkey`
if refrenced models can be selected using `selectors` values,
exluding those that can be selected by `keepers`.
:param parent_model: Parent ORM model.
:param fkey: Foreign key field of `parent_model`.
:param db_adapter: Database adapter.
"""
db_adapter.execute_unref(parent_model, fkey, self.selectors, self.keepers)
self.reset()
[docs] def pprint(self):
""" Pretty-prints an instance data to console. """
pprint(
{
"selectors": self.selectors,
"keepers": self.keepers,
"selector_fields": self.selector_fields,
"keeper_fields": self.keeper_fields,
}
)