Metadata-Version: 2.1
Name: mdocument
Version: 2.1.1585339565
Summary: Simple DRM for motor client
Home-page: https://git.yurzs.dev/yurzs/MDocument
Author: Yurzs
Author-email: yurzs+mdocument@yurzs.dev
License: MIT
Keywords: mongo,motor,Document,ORM
Platform: UNKNOWN
Classifier: Development Status :: 3 - Alpha
Classifier: License :: OSI Approved :: MIT License
Classifier: Programming Language :: Python :: 3.6
Classifier: Programming Language :: Python :: 3.7
Classifier: Programming Language :: Python :: 3.8
Requires-Dist: motor

MDocument
=========

|pipeline status|

.. |pipeline status| image:: https://git.yurzs.dev/yurzs/mdocument/badges/master/pipeline.svg
   :target: https://git.yurzs.dev/yurzs/mdocument/-/commits/master

|coverage report|

.. |coverage report| image:: https://git.yurzs.dev/yurzs/mdocument/badges/master/coverage.svg
   :target: https://git.yurzs.dev/yurzs/mdocument/-/commits/master

Simple DRM for async mongo motor client

Usage
-----

.. code-block:: python

    import asyncio

    from mdocument import Document, DatabaseClient

    client1 = DatabaseClient(uri="localhost")

    class Comment(Document):
        _collection_ = "comments"
        _database_ = "mdocument"
        _client_ = client1


    class Video(Document):
        _collection_ = "videos"
        _database_ = "mdocument"
        _client_ = client1

        @Document.related(self_field="_id", other_field="video")
        def comments(self):
            return Comment


    loop = asyncio.get_event_loop()
    Document.setup(loop, "localhost", "test_database")

    async def main():
        video = await Video.create(
            title="Test",
        )

        comment1 = await Comment.create(
            video=video._id,
            message="First!",
        )

        comment2 = await Comment.create(
            video=video._id,
            message="Second!"
        )

    loop.run_until_complete(main())

Now we can easily access our comments using our related documents

.. code-block:: python

    print(await video.comments)
    [
        Comment(_id=5e7533d55eb6a8c6d24d3cc7, video=5e7533d55eb6a8c6d24d3cc6, message=First!),
        Comment(_id=5e7533d55eb6a8c6d24d3cc8, video=5e7533d55eb6a8c6d24d3cc6, message=Second!)
    ]

Document methods
================

Here is a list of Document basic methods

@related
--------

Decorator for defining related documents. Made for easily managing deletion of related documents.

.. code-block:: python

    def related(self_field, other_field, multiple=True, on_delete=None):

Example:

.. code-block:: python

    from mdocument import Document, DeleteDocument


    class Artist(Document):
        __collection__ = "artists"

        @Document.related("_id", "album._id", on_delete=DeleteDocument)
        def albums(self):
            return Album

    class Album(Document):
        __collection__ = "messages"

        @Document.related("_id", "album._id", on_delete=DeleteDocument)
        def songs(self):
            return Song


    class Song(Document):
        __collection__ = "songs"

As we set our relations. Now we have next actions:
Album deleted -> all songs related to this album are deleted
Author deleted -> all albums related to author are deleted -> each song related to deleted albums deleted

.create
-------
.. code-block:: python

    async def create(cls, loop=None, update_immediately=False, **kwargs):

If you want to create a new document you can do it easily with .create method.
Example:

.. code-block:: python

    import asyncio

    from mdocument import Document, DatabaseClient


    class Message(Document):
        _collection_ = "messages"
        _database_ = "mdocument"
        _client_ = DatabaseClient(host="localhost")

    Document.setup(loop, "localhost", "test_database")

    loop.run_until_complete(
        Message.create(from_user="admin", text="Test message!")
    )

This will create document in database:

.. code-block:: python

    {
        '_id': ObjectId('5e75373e5eb6a8c6d14d3ccd'),
        'from_user': 'admin',
        'text': "Test message!"
    }

.push_update
------------

Updates document and all @related fields.

.. code-block:: python

    await Message.push_update()

.delete
-------

Deletion of document from database. Based on your set @related rules all related documents will be modified too.

.. code-block:: python

    message = await Message.one(from_user="admin")

    await message.delete()


