示例#1
0
class IdentityList:

    _ids = None

    def __init__(self, model: Any, key: str):
        self.collector = Collector(model)
        self.model = model
        self.key = key

    def __repr__(self):
        return f"{self.__class__.__name__}/{self.key}: {len(self)} ids"

    def __len__(self):
        return len(self.ids)

    def __iter__(self):
        for i in self.ids:
            yield i

    @property
    def ids(self) -> List[str]:
        if not self._ids:
            try:
                self._ids = self.model.objects(name=self.key)[0].ids
            except Exception:
                self._ids = []
        return self._ids

    @ids.setter
    def ids(self, ids: Union[List[str], bytes], sep: str = "\n"):
        if isinstance(ids, bytes):
            self._set_ids_from_bytes(ids, sep=sep)
        else:
            self._set_ids(ids)

    def _set_ids(self, ids: list):
        if ids:
            ids = [x for x in ids if x != ""]  # drop trailing empties
            self.collector.save({
                "name": self.key,
                "count": len(ids),
                "ids": ids
            })
            logger.info("Saved %s ids to %s/%s", len(ids), self.model.__name__,
                        self.key)

    def _set_ids_from_bytes(self, ids: bytes, sep: str = "\n"):
        self._set_ids(ids=ids.decode().split(sep))

    def delete(self):
        self.model.objects(name=self.key).delete()
        self.ids = []