Radically simple ORM for Pyrus's tasks
Project description
pyrus-orm
Radically simple, django/peewee-like, easy and incomplete ORM for Pyrus.
With pyrus-orm, you can read, create and modify tasks.
Works with pyrus-api under the hood.
This is an early development version
Features:
- Define models with:
- simple fields (text, number, dates, ...)
- catalog fields, single item
- catalog fields, multiple items
- "title" fields (pyrus-orm ignores the nested structure of 'title' fields, all its contents are treated as usual root-level fields)
- multiple choice fields (without nested fields at this moment)
- Operations with models:
- Create and save
- Read from registry by ID
- Modify and save changes
- Filtering:
- by include_archived and steps fields
- by value of simple or catalog fields
- less than, greater than
- value in a list
- ranges
Installation
pip install pyrus-orm
Examples
Define model and initialize
class Book(PyrusModel):
title = TextField(1) # 1 is a field ID in pyrus's form
time = TimeField(2)
date = DateField(3)
number = NumericField(4)
round_number = IntegerField(5)
author = CatalogField(6, catalog=<catalog id>)
class Meta:
form_id = <form_id>
pyrus_api = PyrusAPI(...)
session = PyrusORMSession(pyrus_api)
set_session_global(session)
Create item
book = Book(
title='Don Quixote',
date='1605-01-01',
author=Book.author.find({'Name': 'Alonso Fernández de Avellaneda'})
)
book.save()
book.id
>>> <task_id>
Read and modify item
book = Book.objects.get(id=...)
# simple field
book.title
>>> 'Don Quixote'
book.title = 'Don Quixote, Part Two'
book.save('title changed')
# catalog field
book.author
>>> CatalogItem(item_id=..., values={'Name': 'Alonso Fernández de Avellaneda'}) # values comes from the catalog definition
book.author.find_and_set({'Name': 'Miguel de Cervantes'}) # may raise ValueError if no value found
book.save('changed an author to the real one')
Catalog Enum fields
Enums can be mapped to catalog items by ID or by custom property name.
Enums mapped to specific catalog items ID
No catalog lookups are preformed on reading or writing of such fields.
class Genre(Enum):
fiction = 100001
nonfiction = 100002
class Book(PyrusModel):
genre = CatalogEnumField(<field_id>, catalog_id=<catalog_id>, enum=Genre, id_field='item_id')
book = Book.objects.get(id=...)
book.genre
>>> Genre.fiction
book.genre = Genre.nonfiction
book.save()
book.genre
>>> Genre.nonfiction
Enums mapped to catalog item properties
(imagine book has a property 'media' with field 'Name')
class Media(Enum):
paper = 'paper'
papirus = 'papirus'
pdf = 'pdf'
class Book(PyrusModel):
media = CatalogEnumField(<field_id>, catalog_id=<catalog_id>, enum=Genre, id_field='Name')
Filtering
Only basic filtering is supported:
Book.objects.get_filtered(
title='Don Quixote',
)
>>> [Book(...), ...]
Book.objects.get_filtered(
genre=Book.genre.find({'Name': 'Fiction'})
)
>>> [Book(...), ...]
Book.objects.get_filtered(
...
include_archived=True,
steps=[1, 2],
)
>>> [Book(...), ...]
Catalog fields, all the API
# Read values
# Non-empty value
book.author
>>> CatalogItem(item_id=..., values={<your custom values here>})
assert bool(book.author) == True
# Empty value
book.author
>>> CatalogEmptyValue()
assert bool(book.author) == False
# Get all possible values (works for empty fields as well)
book.author.catalog()
>>> [CatalogItem(...), CatalogItem(...), ...]
# Find a value in a catalog
new_author = book.author.catalog().find({'Name': 'Miguel de Cervantes'})
new_author
>>> CatalogItem(item_id=..., values={'Name': 'Miguel de Cervantes'}) # or None
book.author = new_author
book.save()
# Find and set shortcut
book.author.catalog().find_and_set({'Name': 'William Shakespeare'})
book.author.find_and_set({'Name': 'NonExistent'})
>>> ValueError raised
# Set value to a specific item_id
book.author = CatalogItem(item_id=123456)
Project details
Release history Release notifications | RSS feed
Download files
Download the file for your platform. If you're not sure which to choose, learn more about installing packages.
Source Distribution
pyrus_orm-0.0.7.tar.gz
(13.2 kB
view details)
Built Distribution
pyrus_orm-0.0.7-py3-none-any.whl
(13.5 kB
view details)
File details
Details for the file pyrus_orm-0.0.7.tar.gz
.
File metadata
- Download URL: pyrus_orm-0.0.7.tar.gz
- Upload date:
- Size: 13.2 kB
- Tags: Source
- Uploaded using Trusted Publishing? No
- Uploaded via: poetry/1.3.2 CPython/3.11.1 Darwin/22.3.0
File hashes
Algorithm | Hash digest | |
---|---|---|
SHA256 | 4dbe2f59fc32552b471b5b645e6ee591f9ef10b486c693b469196a7b7bbb8104 |
|
MD5 | 165bc46cb0ed65d8719c483984bfaca5 |
|
BLAKE2b-256 | a44101cec9733bf6fc46c76dfe166fb9903af21d4fee5b50d803cff4e9f261f2 |
File details
Details for the file pyrus_orm-0.0.7-py3-none-any.whl
.
File metadata
- Download URL: pyrus_orm-0.0.7-py3-none-any.whl
- Upload date:
- Size: 13.5 kB
- Tags: Python 3
- Uploaded using Trusted Publishing? No
- Uploaded via: poetry/1.3.2 CPython/3.11.1 Darwin/22.3.0
File hashes
Algorithm | Hash digest | |
---|---|---|
SHA256 | d531417b41bde5c08bb9a7474ad2716c78069431da5d0198b2147707361c0999 |
|
MD5 | 729b8430480bc270841d926b0b927036 |
|
BLAKE2b-256 | 79e2633ff9d6ae89baf77816f214eeab946a8a54661e7553c307cff1c71d43b6 |