diff --git a/notes/managers.py b/notes/managers.py index 88c1c24..db76b63 100644 --- a/notes/managers.py +++ b/notes/managers.py @@ -1,9 +1,32 @@ from django.db.models import Manager +from django.db.models.query import QuerySet + + +class NoteQuerySet(QuerySet): + + def _ordered_by_field(self, field, reverse=False): + return self.order_by( '%s%s' % ( "-" if reverse else "", + field + ) + ) + + def by_date(self, reverse=False): + return self._ordered_by_field('created_date', reverse=reverse) + + def by_time(self, reverse=False): + return self._ordered_by_field('created_time', reverse=reverse) class NoteManager(Manager): - def by_date(self): - return self.get_queryset().order_by('created_date') + def get_queryset(self): + return NoteQuerySet(self.model) + + get_query_set = get_queryset + + def by_date(self, **kwargs): + return self.get_queryset().by_date(**kwargs) + + def by_time(self, **kwargs): + return self.get_queryset().by_time(**kwargs) + - def by_time(self): - return self.get_queryset().order_by('created_time') diff --git a/notes/models.py b/notes/models.py index 7b8bab2..7245785 100644 --- a/notes/models.py +++ b/notes/models.py @@ -40,7 +40,9 @@ class Note(models.Model): return super().save(*args, **kwargs) def __str__(self): - return "%s of %s" % (self.child_class.__qualname__, self.created_by) + return "%s [%s %s]" % ( self.child_class.__qualname__, + self.created_date, + self.created_time) def note_date(self): """ Default 'created_date' value. Child may override this method. """ diff --git a/notes/tests.py b/notes/tests.py index 7ce503c..1e1bc23 100644 --- a/notes/tests.py +++ b/notes/tests.py @@ -1,3 +1,101 @@ from django.test import TestCase - +from .models import Note # Create your tests here. + + +class NoteManagerTestCase(TestCase): + """ managers.NoteManager Test Case """ + + + def setUp(self): + from notes.managers import NoteManager + self.note_manager = NoteManager + + def test_note_default_manager_is_NoteManager(self): + self.assertIsInstance(Note.objects, self.note_manager, + msg="%s is not Note default manager" % self.note_manager) + + def test_by_date(self): + prev_note = None + for note in Note.objects.by_date(reverse=False): + if not prev_note: + prev_note = note + else: + self.assertLessEqual(prev_note.created_date, note.created_date, + msg="%s is not same date or prior to %s" % (prev_note, note)) + prev_note = note + + def test_by_date_reversed(self): + prev_note = None + for note in Note.objects.by_date(reverse=True): + if not prev_note: + prev_note = note + else: + self.assertGreaterEqual(prev_note.created_date, note.created_date, + msg="%s is not same date or later to %s" % (prev_note, note)) + prev_note = note + + def test_by_time(self): + prev_note = None + for note in Note.objects.by_time(reverse=False): + if not prev_note: + prev_note = note + else: + self.assertLessEqual(prev_note.created_time, note.created_time, + msg="%s is not same time or prior to %s" % (prev_note, note)) + prev_note = note + + def test_by_time_reversed(self): + prev_note = None + for note in Note.objects.by_time(reverse=True): + if not prev_note: + prev_note = note + else: + self.assertLessEqual(prev_note.created_time, note.created_time, + msg="%s is not same time or later to %s" % (prev_note, note)) + prev_note = note + +class NoteQuerySetTestCase(TestCase): + + def setUp(self): + self.qs = Note.objects.all() + + def test_by_date(self): + prev_note = None + for note in self.qs.by_date(reverse=False): + if not prev_note: + prev_note = note + else: + self.assertLessEqual(prev_note.created_date, note.created_date, + msg="%s is not same date or prior to %s" % (prev_note, note)) + prev_note = note + + def test_by_date_reversed(self): + prev_note = None + for note in self.qs.by_date(reverse=True): + if not prev_note: + prev_note = note + else: + self.assertGreaterEqual(prev_note.created_date, note.created_date, + msg="%s is not same date or later to %s" % (prev_note, note)) + prev_note = note + + def test_by_time(self): + prev_note = None + for note in self.qs.by_time(reverse=False): + if not prev_note: + prev_note = note + else: + self.assertLessEqual(prev_note.created_time, note.created_time, + msg="%s is not same time or prior to %s" % (prev_note, note)) + prev_note = note + + def test_by_time_reversed(self): + prev_note = None + for note in self.qs.by_time(reverse=True): + if not prev_note: + prev_note = note + else: + self.assertLessEqual(prev_note.created_time, note.created_time, + msg="%s is not same time or later to %s" % (prev_note, note)) + prev_note = note