Пример #1
0
 def _DocumentBase__initialize_indexes(cls):
     # We initialize an index in order to get users by their phone number
     try:
         logger.info(
             "Creating indexes for collection {c}".format(c=cls.__name__))
         session().query(
             q.create_index({
                 "name":
                 "user_by_phone_number",
                 "source":
                 q.collection(cls._collection_name),
                 "terms": [{
                     "field": ["data", "phone_number"]
                 }],
                 "unique":
                 True,
                 "values": [
                     {
                         "field": ["data", "name"]
                     },
                     {
                         "field": ["data", "country"]
                     },
                     {
                         "field": ["data", "endless_medical_token"]
                     },
                     {
                         "field": ["ref"]
                     },
                 ],
             }))
         session().query(
             q.create_index({
                 "name":
                 "all_users",
                 "source":
                 q.collection(cls._collection_name),
                 "values": [
                     {
                         "field": ["data", "name"]
                     },
                     {
                         "field": ["data", "phone_number"]
                     },
                     {
                         "field": ["data", "country"]
                     },
                     {
                         "field": ["data", "endless_medical_token"]
                     },
                     {
                         "field": ["ref"]
                     },
                 ],
             }))
     except BadRequest:
         logger.info("One or more indexes already exist, skipping creation")
Пример #2
0
 def __initialize_collection(cls):
     logger.info("Checking if collection {c} exists...".format(
         c=cls._collection_name))
     try:
         session().query(q.get(q.collection(cls._collection_name)))
         logger.info("{c} exists, skipping creation.".format(
             c=cls._collection_name))
     except BadRequest:
         logger.info("{c} does not exist, creating...".format(
             c=cls._collection_name))
         session().query(q.create_collection({"name":
                                              cls._collection_name}))
Пример #3
0
    def delete_user_by_phone_number(cls, phone_number: str):
        user = cls.get_by_phone(phone_number)

        if not user:
            raise RuntimeError("User not found")
        result = session().query(q.delete(user.ref))
        if not result["data"]:
            raise RuntimeError(
                "Error deleting the user, maybe does not exist?")
        return UserDocument(ref=result["ref"], **result["data"])
Пример #4
0
    def get_by_phone(cls, phone_number: str):
        result = session().query(
            q.paginate(q.match(q.index("user_by_phone_number"), phone_number)))
        if len(result["data"]) == 0:
            return None
        # The result is a list with the values ordered as the index defined below
        name, country, endless_medical_token, ref = result["data"][0]

        return UserDocument(
            ref=ref,
            name=name,
            country=country,
            phone_number=phone_number,
            endless_medical_token=endless_medical_token,
        )
Пример #5
0
    def save(self):
        """
        Saves the document in the collection,
        the attributes are serialized utilizing Pydantic's dict method, which
        traverses trough the child class attributes
        :return: An instance of the newly saved object.
        """
        attributes = self.dict()
        logger.debug(
            "Saving object for collection {c} with attributes {attr}".format(
                c=self._collection_name, attr=attributes))
        result = session().query(
            q.create(
                q.collection(self._collection_name),
                {"data": attributes},
            ))
        logger.debug("Object saved with id {ref}".format(ref=result["ref"]))

        return self.__class__(ref=result["ref"],
                              ts=result["ts"],
                              **result["data"])
Пример #6
0
    def delete(self):
        session().query(q.delete(self.ref))

        return self
Пример #7
0
    def update(self):
        updated_vals = self.dict(exclude={"ref", "ts"})
        updated_vals["updated_at"] = datetime.now(pytz.timezone("UTC"))

        session().query(q.update(self.ref, {"data": {**updated_vals}}))