Skip to content

Commit

Permalink
Feedback
Browse files Browse the repository at this point in the history
  • Loading branch information
Viicos committed Apr 2, 2024
1 parent e176e5f commit c5c8d26
Show file tree
Hide file tree
Showing 4 changed files with 56 additions and 22 deletions.
1 change: 1 addition & 0 deletions pyproject.toml
Original file line number Diff line number Diff line change
Expand Up @@ -42,6 +42,7 @@ Changelog = "https://github.com/maykinmedia/django-timeline-logger/blob/master/d
[project.optional-dependencies]
tests = [
"factory-boy",
"time-machine",
"psycopg2",
"pytest",
"pytest-cov",
Expand Down
24 changes: 17 additions & 7 deletions tests/test_management_commands.py
Original file line number Diff line number Diff line change
Expand Up @@ -8,13 +8,16 @@
from django.test import TestCase, override_settings
from django.utils import timezone

import time_machine

from timeline_logger.models import TimelineLog

from .factories import ArticleFactory, TimelineLogFactory, UserFactory


class ReportMailingTestCase(TestCase):
def setUp(self):
super().setUp()
self.article = ArticleFactory.create()

self.user = UserFactory.create(email="[email protected]")
Expand Down Expand Up @@ -155,33 +158,40 @@ def test_timeline_digest_from_email_setting(self):
self.assertEqual(mail.outbox[0].from_email, settings.TIMELINE_DIGEST_FROM_EMAIL)


@time_machine.travel(datetime(2024, 3, 5, 0, 0, 0, tzinfo=dt_timezone.utc))
class PruneTimelineLogsTestCase(TestCase):
def setUp(self):
super().setUp()

self.log_1 = TimelineLogFactory.create()
self.log_1.timestamp = datetime(2024, 3, 1, 12, 0, 0, tzinfo=dt_timezone.utc)
self.log_1.timestamp = datetime(2024, 3, 1, 0, 0, 0, tzinfo=dt_timezone.utc)
self.log_1.save()

self.log_2 = TimelineLogFactory.create()
self.log_2.timestamp = datetime(2024, 3, 1, 14, 0, 0, tzinfo=dt_timezone.utc)
self.log_2.timestamp = datetime(2024, 3, 4, 0, 0, 0, tzinfo=dt_timezone.utc)
self.log_2.save()

def test_prune_timeline_logs_no_date(self):
stdout = StringIO()

call_command(
"prune_timeline_logs", interactive=False, verbosity=0, stdout=stdout
"prune_timeline_logs",
"--all",
interactive=False,
verbosity=0,
stdout=stdout,
)

self.assertEqual(TimelineLog.objects.count(), 0)
stdout.seek(0)
self.assertEqual(stdout.read().strip(), "Successfully deleted 2 timeline logs.")
self.assertEqual(
stdout.getvalue().strip(), "Successfully deleted 2 timeline logs."
)

def test_prune_timeline_logs_date(self):
call_command(
"prune_timeline_logs",
"--before",
"2024-03-01T13:00:00+00:00",
"--keep-days",
"2",
interactive=False,
verbosity=0,
stdout=StringIO(),
Expand Down
34 changes: 19 additions & 15 deletions timeline_logger/management/commands/prune_timeline_logs.py
Original file line number Diff line number Diff line change
@@ -1,9 +1,8 @@
from datetime import datetime
from textwrap import dedent

from django.core.management.base import BaseCommand

from timeline_logger.models import TimelineLog
from timeline_logger.service import prune_timeline_logs


class Command(BaseCommand):
Expand All @@ -17,21 +16,30 @@ def add_arguments(self, parser):
dest="interactive",
help="Tells Django to NOT prompt the user for input of any kind.",
)
parser.add_argument(
"--before",
type=datetime.fromisoformat,
help="Only flush timeline logs older than the specified date.",
exclusive_group = parser.add_mutually_exclusive_group(required=True)

exclusive_group.add_argument(
"--all",
action="store_true",
help="Whether to delete all log records.",
)

exclusive_group.add_argument(
"--keep-days",
type=int,
help="Only delete records older than the specified number of days.",
)

def handle(self, *args, **options):
all = options["all"]
keep_days = options["keep_days"]
interactive = options["interactive"]
before = options["before"]

if not before and interactive:
if all and interactive:
confirm = input(

Check warning on line 39 in timeline_logger/management/commands/prune_timeline_logs.py

View check run for this annotation

Codecov / codecov/patch

timeline_logger/management/commands/prune_timeline_logs.py#L39

Added line #L39 was not covered by tests
dedent(
"""You haven't specified a date to limit the objects to be deleted.
This will delete all timeline logs objects. Are you sure you want to do this?
"""You have specified "--all", meaning all timeline logs will be deleted.
Are you sure you want to do this?
Type 'yes' to continue, or 'no' to cancel: """
)
Expand All @@ -40,11 +48,7 @@ def handle(self, *args, **options):
confirm = "yes"

if confirm == "yes":
if before:
qs = TimelineLog.objects.filter(timestamp__lte=before)
else:
qs = TimelineLog.objects.all()
number, _ = qs.delete()
number = prune_timeline_logs(keep_days=0 if all else keep_days)
self.stdout.write(f"Successfully deleted {number} timeline logs.")
else:
self.stdout.write("Flush cancelled.")

Check warning on line 54 in timeline_logger/management/commands/prune_timeline_logs.py

View check run for this annotation

Codecov / codecov/patch

timeline_logger/management/commands/prune_timeline_logs.py#L54

Added line #L54 was not covered by tests
19 changes: 19 additions & 0 deletions timeline_logger/service.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,19 @@
from datetime import timedelta

from django.utils import timezone

from .models import TimelineLog


def prune_timeline_logs(*, keep_days: int | None = None) -> int:
"""Delete the timeline logs instances.
:param keep_days: If specified, only delete records older than the specified number of days.
:returns: The number of deleted instances.
"""
limit = timezone.now()
if keep_days is not None:
limit -= timedelta(days=keep_days)

number, _ = TimelineLog.objects.filter(timestamp__lte=limit).delete()
return number

0 comments on commit c5c8d26

Please sign in to comment.