Skip to content

Commit

Permalink
Implement archive function (#46)
Browse files Browse the repository at this point in the history
  • Loading branch information
Sascha Ißbrücker committed Feb 14, 2021
1 parent f555bba commit 256084f
Show file tree
Hide file tree
Showing 10 changed files with 167 additions and 4 deletions.
18 changes: 18 additions & 0 deletions bookmarks/migrations/0006_bookmark_is_archived.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,18 @@
# Generated by Django 2.2.13 on 2021-02-14 09:08

from django.db import migrations, models


class Migration(migrations.Migration):

dependencies = [
('bookmarks', '0005_auto_20210103_1212'),
]

operations = [
migrations.AddField(
model_name='bookmark',
name='is_archived',
field=models.BooleanField(default=False),
),
]
1 change: 1 addition & 0 deletions bookmarks/models.py
Original file line number Diff line number Diff line change
Expand Up @@ -39,6 +39,7 @@ class Bookmark(models.Model):
website_title = models.CharField(max_length=512, blank=True, null=True)
website_description = models.TextField(blank=True, null=True)
unread = models.BooleanField(default=True)
is_archived = models.BooleanField(default=False)
date_added = models.DateTimeField()
date_modified = models.DateTimeField()
date_accessed = models.DateTimeField(blank=True, null=True)
Expand Down
14 changes: 12 additions & 2 deletions bookmarks/queries.py
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
from django.contrib.auth.models import User
from django.db.models import Q, Count, Aggregate, CharField, Value, BooleanField
from django.db.models import Q, Count, Aggregate, CharField, Value, BooleanField, QuerySet

from bookmarks.models import Bookmark, Tag
from bookmarks.utils import unique
Expand All @@ -17,7 +17,7 @@ def __init__(self, expression, distinct=False, **extra):
**extra)


def query_bookmarks(user: User, query_string: str):
def _base_bookmarks_query(user: User, query_string: str) -> QuerySet:
# Add aggregated tag info to bookmark instances
query_set = Bookmark.objects \
.annotate(tag_count=Count('tags'),
Expand Down Expand Up @@ -51,6 +51,16 @@ def query_bookmarks(user: User, query_string: str):
return query_set


def query_bookmarks(user: User, query_string: str) -> QuerySet:
return _base_bookmarks_query(user, query_string) \
.filter(is_archived=False)


def query_archived_bookmarks(user: User, query_string: str) -> QuerySet:
return _base_bookmarks_query(user, query_string) \
.filter(is_archived=True)


def query_tags(user: User, query_string: str):
query_set = Tag.objects

Expand Down
12 changes: 12 additions & 0 deletions bookmarks/services/bookmarks.py
Original file line number Diff line number Diff line change
Expand Up @@ -39,6 +39,18 @@ def update_bookmark(bookmark: Bookmark, tag_string, current_user: User):
return bookmark


def archive_bookmark(bookmark: Bookmark):
bookmark.is_archived = True
bookmark.save()
return bookmark


def unarchive_bookmark(bookmark: Bookmark):
bookmark.is_archived = False
bookmark.save()
return bookmark


def _merge_bookmark_data(from_bookmark: Bookmark, to_bookmark: Bookmark):
to_bookmark.title = from_bookmark.title
to_bookmark.description = from_bookmark.description
Expand Down
7 changes: 7 additions & 0 deletions bookmarks/templates/bookmarks/bookmark_list.html
Original file line number Diff line number Diff line change
Expand Up @@ -24,6 +24,13 @@
<div class="actions">
<a href="{% url 'bookmarks:edit' bookmark.id %}?return_url={{ return_url }}"
class="btn btn-link btn-sm">Edit</a>
{% if bookmark.is_archived %}
<a href="{% url 'bookmarks:unarchive' bookmark.id %}?return_url={{ return_url }}"
class="btn btn-link btn-sm">Unarchive</a>
{% else %}
<a href="{% url 'bookmarks:archive' bookmark.id %}?return_url={{ return_url }}"
class="btn btn-link btn-sm">Archive</a>
{% endif %}
<a href="{% url 'bookmarks:remove' bookmark.id %}?return_url={{ return_url }}"
class="btn btn-link btn-sm"
onclick="return confirm('Do you really want to delete this bookmark?')">Remove</a>
Expand Down
47 changes: 47 additions & 0 deletions bookmarks/tests/test_bookmarks_service.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,47 @@
from django.contrib.auth import get_user_model
from django.test import TestCase
from django.utils import timezone

from bookmarks.models import Bookmark
from bookmarks.services.bookmarks import archive_bookmark, unarchive_bookmark

User = get_user_model()


class BookmarkServiceTestCase(TestCase):

def setUp(self) -> None:
self.user = User.objects.create_user('testuser', '[email protected]', 'password123')

def test_archive(self):
bookmark = Bookmark(
url='https://example.com',
date_added=timezone.now(),
date_modified=timezone.now(),
owner=self.user
)
bookmark.save()

self.assertFalse(bookmark.is_archived)

archive_bookmark(bookmark)

updated_bookmark = Bookmark.objects.get(id=bookmark.id)

self.assertTrue(updated_bookmark.is_archived)

def test_unarchive(self):
bookmark = Bookmark(
url='https://example.com',
date_added=timezone.now(),
date_modified=timezone.now(),
owner=self.user,
is_archived=True,
)
bookmark.save()

unarchive_bookmark(bookmark)

updated_bookmark = Bookmark.objects.get(id=bookmark.id)

self.assertFalse(updated_bookmark.is_archived)
48 changes: 48 additions & 0 deletions bookmarks/tests/test_queries.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,48 @@
from django.contrib.auth import get_user_model
from django.test import TestCase
from django.utils import timezone
from django.utils.crypto import get_random_string
from bookmarks.models import Bookmark
from bookmarks.queries import query_bookmarks, query_archived_bookmarks

User = get_user_model()


class QueriesTestCase(TestCase):

def setUp(self) -> None:
self.user = User.objects.create_user('testuser', '[email protected]', 'password123')

def setup_bookmark(self, is_archived: bool = False):
unique_id = get_random_string(length=32)
bookmark = Bookmark(
url='https://example.com/' + unique_id,
date_added=timezone.now(),
date_modified=timezone.now(),
owner=self.user,
is_archived=is_archived
)
bookmark.save()
return bookmark

def test_query_bookmarks_should_not_return_archived_bookmarks(self):
bookmark1 = self.setup_bookmark()
bookmark2 = self.setup_bookmark()
self.setup_bookmark(is_archived=True)
self.setup_bookmark(is_archived=True)
self.setup_bookmark(is_archived=True)

query = query_bookmarks(self.user, '')

self.assertCountEqual([bookmark1, bookmark2], list(query))

def test_query_archived_bookmarks_should_not_return_unarchived_bookmarks(self):
bookmark1 = self.setup_bookmark(is_archived=True)
bookmark2 = self.setup_bookmark(is_archived=True)
self.setup_bookmark()
self.setup_bookmark()
self.setup_bookmark()

query = query_archived_bookmarks(self.user, '')

self.assertCountEqual([bookmark1, bookmark2], list(query))
2 changes: 1 addition & 1 deletion bookmarks/tests/test_tags_service.py
Original file line number Diff line number Diff line change
Expand Up @@ -9,7 +9,7 @@
User = get_user_model()


class TagTestCase(TestCase):
class TagServiceTestCase(TestCase):

def setUp(self) -> None:
self.user = User.objects.create_user('testuser', '[email protected]', 'password123')
Expand Down
2 changes: 2 additions & 0 deletions bookmarks/urls.py
Original file line number Diff line number Diff line change
Expand Up @@ -15,6 +15,8 @@
path('bookmarks/close', views.bookmarks.close, name='close'),
path('bookmarks/<int:bookmark_id>/edit', views.bookmarks.edit, name='edit'),
path('bookmarks/<int:bookmark_id>/remove', views.bookmarks.remove, name='remove'),
path('bookmarks/<int:bookmark_id>/archive', views.bookmarks.archive, name='archive'),
path('bookmarks/<int:bookmark_id>/unarchive', views.bookmarks.unarchive, name='unarchive'),
path('bookmarklet', views.bookmarks.bookmarklet, name='bookmarklet'),
# Settings
path('settings', views.settings.index, name='settings.index'),
Expand Down
20 changes: 19 additions & 1 deletion bookmarks/views/bookmarks.py
Original file line number Diff line number Diff line change
Expand Up @@ -8,7 +8,7 @@

from bookmarks import queries
from bookmarks.models import Bookmark, BookmarkForm, build_tag_string
from bookmarks.services.bookmarks import create_bookmark, update_bookmark
from bookmarks.services.bookmarks import create_bookmark, update_bookmark, archive_bookmark, unarchive_bookmark
from bookmarks.queries import get_user_tags

_default_page_size = 30
Expand Down Expand Up @@ -126,6 +126,24 @@ def remove(request, bookmark_id: int):
return HttpResponseRedirect(return_url)


@login_required
def archive(request, bookmark_id: int):
bookmark = Bookmark.objects.get(pk=bookmark_id)
archive_bookmark(bookmark)
return_url = request.GET.get('return_url')
return_url = return_url if return_url else reverse('bookmarks:index')
return HttpResponseRedirect(return_url)


@login_required
def unarchive(request, bookmark_id: int):
bookmark = Bookmark.objects.get(pk=bookmark_id)
unarchive_bookmark(bookmark)
return_url = request.GET.get('return_url')
return_url = return_url if return_url else reverse('bookmarks:index')
return HttpResponseRedirect(return_url)


@login_required
def bookmarklet(request):
return render(request, 'bookmarks/bookmarklet.html', {
Expand Down

0 comments on commit 256084f

Please sign in to comment.