Skip to content

Commit

Permalink
Merge d0ba9dd into 3ff9ed5
Browse files Browse the repository at this point in the history
  • Loading branch information
alisonrclarke committed Nov 4, 2020
2 parents 3ff9ed5 + d0ba9dd commit eb32992
Show file tree
Hide file tree
Showing 2 changed files with 61 additions and 6 deletions.
17 changes: 14 additions & 3 deletions hepdata/modules/submission/models.py
Original file line number Diff line number Diff line change
Expand Up @@ -174,8 +174,9 @@ class DataSubmission(db.Model):
@event.listens_for(db.Session, 'before_flush')
def receive_before_flush(session, flush_context, instances):
"""Listen for the 'before_flush' event to check for DataSubmission
deletions and ensure the DataResource mapped to the data_file field
is deleted."""
deletions and ensure related DataResource and DataReview entries are
loaded by SQLAlchemy before deletion to ensure all cascades, event
listeners, etc are run."""
for obj in session.deleted:
if isinstance(obj, DataSubmission):
try:
Expand All @@ -185,7 +186,17 @@ def receive_before_flush(session, flush_context, instances):
except Exception as e:
log.error("Unable to delete data resource with id %s whilst "
"deleting data submission id %s. Error was: %s"
% (obj.id, obj.data_file, e))
% (obj.data_file, obj.id, e))

log.debug("Deleting reviews for data submission %s" % obj.id)
reviews = DataReview.query.filter_by(data_recid=obj.id).all()
for review in reviews:
try:
db.session.delete(review)
except Exception as e:
log.error("Unable to delete review with id %s whilst "
"deleting data submission id %s. Error was: %s"
% (review.id, obj.id, e))


class Keyword(db.Model):
Expand Down
50 changes: 47 additions & 3 deletions tests/model_test.py
Original file line number Diff line number Diff line change
Expand Up @@ -20,7 +20,7 @@

from invenio_db import db

from hepdata.modules.submission.models import DataReview, DataResource, DataSubmission
from hepdata.modules.submission.models import DataReview, DataResource, DataSubmission, Message


def test_data_submission_cascades(app):
Expand All @@ -30,15 +30,19 @@ def test_data_submission_cascades(app):
db.session.add(datasubmission)
db.session.commit()

# Add a data review
# Add a data review with a message
message = Message(user=1, message="Test review message")
datareview = DataReview(publication_recid=recid,
data_recid=datasubmission.id)
data_recid=datasubmission.id,
messages=[message])
db.session.add(datareview)
db.session.commit()

reviews = DataReview.query.filter_by(publication_recid=recid).all()
assert(len(reviews) == 1)
assert(reviews[0] == datareview)
messages = Message.query.all()
assert(len(messages) == 1)

# Add some data resources with files
files_dir = os.path.join(app.config['CFG_DATADIR'], 'models_test')
Expand Down Expand Up @@ -75,6 +79,9 @@ def test_data_submission_cascades(app):
# Check that datareview is deleted
reviews = DataReview.query.filter_by(publication_recid=recid).all()
assert(len(reviews) == 0)
# Check that message is deleted
messages = Message.query.all()
assert(len(messages) == 0)

# Check all resources have been deleted
dataresources = DataResource.query.filter(
Expand All @@ -88,3 +95,40 @@ def test_data_submission_cascades(app):

# Tidy up
os.rmdir(files_dir)


def test_data_review_cascades(app):
# Create a data submission
recid = "12345"
datasubmission = DataSubmission(publication_recid=recid)
db.session.add(datasubmission)
db.session.commit()

# Add a data review with a message
message = Message(user=1, message="Test review message")
datareview = DataReview(publication_recid=recid,
data_recid=datasubmission.id,
messages=[message])
db.session.add(datareview)
db.session.commit()

# Check that message is created
reviews = DataReview.query.filter_by(publication_recid=recid).all()
assert(len(reviews) == 1)
assert(len(reviews[0].messages) == 1)
assert(reviews[0].messages[0].message == message.message)

review_messages = list(db.engine.execute("select * from review_messages where datareview_id = %s" % datareview.id))
assert(len(review_messages) == 1)
assert(review_messages[0].datareview_id == datareview.id)

db.session.delete(datareview)
db.session.commit()

# Check that datareview is deleted
reviews = DataReview.query.filter_by(publication_recid=recid).all()
assert(len(reviews) == 0)

# Check that message is deleted
messages = Message.query.filter_by(id=review_messages[0].message_id).all()
assert(len(messages) == 0)

0 comments on commit eb32992

Please sign in to comment.