This commit is contained in:
Felipe Monteiro
2017-07-22 00:03:08 +01:00
parent 0b80b5b4e7
commit f230d9b364
2 changed files with 43 additions and 39 deletions

View File

@@ -29,6 +29,7 @@ import six
from six.moves import range
import sqlalchemy
from sqlalchemy.ext.compiler import compiles
from sqlalchemy import desc
from sqlalchemy import MetaData, Table
import sqlalchemy.orm as sa_orm
from sqlalchemy import sql
@@ -120,9 +121,9 @@ def document_create(values, session=None):
values['schema_version'] = values.pop('schemaVersion')
session = session or get_session()
existing_document = document_get(
as_dict=False,
**{c: values[c] for c in models.Document.UNIQUE_CONSTRAINTS})
filters = copy.copy(models.Document.UNIQUE_CONSTRAINTS)
filters = [f for f in filters if f != 'revision_index']
existing_document = document_get(**{c: values[c] for c in filters})
def _document_changed():
other_document = copy.deepcopy(existing_document)
@@ -133,41 +134,41 @@ def document_create(values, session=None):
return True
return False
def _document_create():
document = models.Document()
with session.begin():
document.update(values)
document.save(session=session)
return document
created_document = {}
if existing_document:
# Only generate a new revision for the document if anything has
# changed.
# Only generate a new revision and entirely new document if anything
# was changed.
if _document_changed():
revision_index = revision_update(
revision_index=existing_document['revision_index'])['id']
values['revision_index'] = revision_index
created_document = _document_create().to_dict()
# TODO: indicate that now document was actually created.
else:
revision_index = revision_create()['id']
values['revision_index'] = revision_index
created_document = _document_create().to_dict()
document = existing_document or models.Document()
with session.begin():
document.update(values)
document.save(session=session)
return document.to_dict()
return created_document
def document_get(session=None, as_dict=True, **filters):
unqiue_constraints = models.Document.UNIQUE_CONSTRAINTS
def document_get(session=None, **filters):
session = session or get_session()
if 'document_id' in filters:
# Get the document by `document_id`.
document = session.query(models.Document).get(filters['document_id'])
elif all([c in filters for c in unqiue_constraints]):
# Get the document by its unique constraints.
document = session.query(models.Document)
document = document.filter_by(**{c: filters[c]
for c in unqiue_constraints}).first()
document = session.query(models.Document)\
.filter_by(**filters)\
.options(sa_orm.joinedload("revision_index"))\
.order_by(desc(models.Revision.created_at))\
.first()
if as_dict:
return document.to_dict() if document else {}
return document
return document.to_dict() if document else {}
####################