When using the versioned decorator I noticed that when adding or

revoking an api key the service it associated with was of course added
to db.session.dirty.

That resulted in an updated version of service being added to the
service history table that showed no visible difference from that
record immediately precending it as the change was to another table,
namely the api_key table. A new api key or revoked api key was correctly
added to api_key and api_key_history tables. However I think an
'unchanged' service history record may be a bit confusing as you'd need
to correlate with api_keys to work out what the change was.

I think it's best to just record the new/revoked api_key and not create
another version of the service.

This pr wraps the exisiting versioned decorator with one that take a
class which you are interested in versioning.

Using the new decorator you only get a new version and history record
for the class you pass to outer decorator.

If the exising behaviour is acceptable to the powers that be then by all
means ignore/close this pr.
This commit is contained in:
Adam Shimali
2016-04-21 18:10:57 +01:00
parent 783271f306
commit d14be2067c
4 changed files with 33 additions and 15 deletions

View File

@@ -7,12 +7,12 @@ from app.models import ApiKey
from app.dao.dao_utils import (
transactional,
versioned
version_class
)
@transactional
@versioned
@version_class(ApiKey)
def save_model_api_key(api_key, update_dict={}):
if update_dict:
update_dict.pop('id', None)

View File

@@ -18,13 +18,16 @@ def transactional(func):
return commit_or_rollback
def versioned(func):
@wraps(func)
def record_version(*args, **kwargs):
from app import db
func(*args, **kwargs)
history_objects = [create_history(obj) for obj in
versioned_objects(itertools.chain(db.session.new, db.session.dirty))]
for h_obj in history_objects:
db.session.add(h_obj)
return record_version
def version_class(model_class):
def versioned(func):
@wraps(func)
def record_version(*args, **kwargs):
from app import db
func(*args, **kwargs)
history_objects = [create_history(obj) for obj in
versioned_objects(itertools.chain(db.session.new, db.session.dirty))
if isinstance(obj, model_class)]
for h_obj in history_objects:
db.session.add(h_obj)
return record_version
return versioned

View File

@@ -6,7 +6,7 @@ from sqlalchemy import asc
from app.dao.dao_utils import (
transactional,
versioned
version_class
)
@@ -27,7 +27,7 @@ def dao_fetch_service_by_id_and_user(service_id, user_id):
@transactional
@versioned
@version_class(Service)
def dao_create_service(service, user):
from app.dao.permissions_dao import permission_dao
service.users.append(user)
@@ -37,7 +37,7 @@ def dao_create_service(service, user):
@transactional
@versioned
@version_class(Service)
def dao_update_service(service):
db.session.add(service)