Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Delete Invite #1147

Merged
merged 8 commits into from Apr 12, 2022
Merged
Show file tree
Hide file tree
Changes from 7 commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
1 change: 1 addition & 0 deletions CHANGELOG.md
Original file line number Diff line number Diff line change
Expand Up @@ -78,3 +78,4 @@ Please add a _short_ line describing the PR you make, if the PR implements a spe
- New endpoint for adding a message of the day to the database ([#1136](https://github.com/ScilifelabDataCentre/dds_web/pull/1136))
- Patch: Custom error for PI email validation ([#1146](https://github.com/ScilifelabDataCentre/dds_web/pull/1146))
- New Data Delivery System logo ([#1148](https://github.com/ScilifelabDataCentre/dds_web/pull/1148))
- Cronjob: Scheduled task for deleting unanswered invites after a week ([#1147](https://github.com/ScilifelabDataCentre/dds_web/pull/1147))
1 change: 1 addition & 0 deletions dds_web/database/models.py
Original file line number Diff line number Diff line change
Expand Up @@ -726,6 +726,7 @@ class Invite(db.Model):
nonce = db.Column(db.LargeBinary(12), default=None)
public_key = db.Column(db.LargeBinary(300), default=None)
private_key = db.Column(db.LargeBinary(300), default=None)
created_at = db.Column(db.DateTime(), nullable=False, default=dds_web.utils.current_time())

@property
def projects(self):
Expand Down
39 changes: 39 additions & 0 deletions dds_web/scheduled_tasks.py
Original file line number Diff line number Diff line change
@@ -1,3 +1,5 @@
from datetime import datetime, timedelta

import flask_apscheduler
import flask

Expand Down Expand Up @@ -167,3 +169,40 @@ def set_expired_to_archived():
)
for proj in errors[unit].keys():
scheduler.app.logger.error(f"Error for project '{proj}': {errors[unit][proj]} ")


@scheduler.task("cron", id="delete_invite", hour=0, minute=1, misfire_grace_time=3600)
def delete_invite():
"""Delete invite older than a week"""

scheduler.app.logger.debug("Task: Checking for invites to delete.")

from sqlalchemy.exc import OperationalError, SQLAlchemyError
from dds_web import db
from dds_web.database import models
from dds_web.errors import DatabaseError
from dds_web.utils import current_time

with scheduler.app.app_context():
expiration: datetime.datetime = current_time()
errors: Dict = {}

try:
invites: list = db.session.query(models.Invite).all()
for invite in invites:
if (invite.created_at + timedelta(weeks=1)) < expiration:
try:
db.session.delete(invite)
i-oden marked this conversation as resolved.
Show resolved Hide resolved
db.session.commit()
scheduler.app.logger.debug("Invite deleted.")
except (OperationalError, SQLAlchemyError) as err:
errors[invite] = str(err)
scheduler.app.logger.exception(err)
db.session.rollback()
continue
except (OperationalError, SQLAlchemyError) as err:
scheduler.app.logger.exception(err)
raise

for invite, error in errors.items():
scheduler.app.logger.error(f"{invite} not deleted: {error}")
28 changes: 28 additions & 0 deletions migrations/versions/1fbd604872e9_add_column_created_at.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,28 @@
"""add_column_created_at

Revision ID: 1fbd604872e9
Revises: 19b877061c98
Create Date: 2022-04-08 14:32:26.800385

"""
from alembic import op
import sqlalchemy as sa
from sqlalchemy.dialects import mysql

from dds_web.utils import current_time

# revision identifiers, used by Alembic.
revision = "1fbd604872e9"
down_revision = "19b877061c98"
branch_labels = None
depends_on = None


def upgrade():
op.add_column(
"invites", sa.Column("created_at", sa.DateTime(), nullable=False, default=current_time())
)


def downgrade():
op.drop_column("invites", "created_at")
7 changes: 6 additions & 1 deletion tests/conftest.py
Original file line number Diff line number Diff line change
Expand Up @@ -319,7 +319,11 @@ def demo_data():
),
)

invites = [Invite(**{"email": "[email protected]", "role": "Researcher"})]
invites = [
Invite(**{"email": "[email protected]", "role": "Researcher"}),
Invite(**{"email": "[email protected]", "role": "Researcher"}),
]
invites[1].created_at = dds_web.utils.current_time() - datetime.timedelta(weeks=1)

return (units, users, projects, invites, files_and_versions)

Expand Down Expand Up @@ -420,6 +424,7 @@ def add_data_to_db():
units[0].projects.extend(projects)
units[0].users.extend([users[2], users[3], users[4]])
units[0].invites.append(invites[0])
units[0].invites.append(invites[1])

units[1].users.extend([users[8], users[9]])

Expand Down
14 changes: 14 additions & 0 deletions tests/test_scheduled_tasks.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,14 @@
import flask

import pytest

from dds_web import db
from dds_web.database import models

from dds_web.scheduled_tasks import delete_invite


def test_delete_invite(client: flask.testing.FlaskClient) -> None:
assert len(db.session.query(models.Invite).all()) == 2
delete_invite()
assert len(db.session.query(models.Invite).all()) == 1