Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
Implement user bookmarks (create and delete) with a most popular book…
…mark page and if_bookmarked template tag. On page 196.
- Loading branch information
Showing
16 changed files
with
190 additions
and
5 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -1,17 +1,19 @@ | ||
from django.contrib import admin | ||
from cab.models import Snippet, Language | ||
from cab.models import Snippet, Language, Bookmark | ||
|
||
|
||
class SnippetAdmin(admin.ModelAdmin): | ||
pass | ||
|
||
admin.site.register(Snippet) | ||
|
||
class LanguageAdmin(admin.ModelAdmin): | ||
pass | ||
|
||
admin.site.register(Language, LanguageAdmin) | ||
|
||
class BookmarkAdmin(admin.ModelAdmin): | ||
pass | ||
admin.site.register(Bookmark, BookmarkAdmin) | ||
|
||
|
||
|
||
|
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1 @@ | ||
|
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,50 @@ | ||
from django import template | ||
from cab.models import Bookmark | ||
|
||
def do_if_bookmarked(parser, token): | ||
|
||
bits = token.contents.split() | ||
|
||
# Sanity checking on args. | ||
if len(bits) != 3: | ||
raise template.TemplateSyntaxError("%s tag takes two arguments" % bits[0]) | ||
|
||
# Parse. | ||
nodelist_true = parser.parse(('else', 'endif_bookmarked',)) | ||
token = parser.next_token() | ||
if token.contents == 'else': | ||
nodelist_false = parser.parse(('endif_bookmarked')) | ||
parser.delete_first_token() | ||
else: | ||
nodelist_false = template.NodeList() | ||
|
||
return IfBookmarkedNode(bits[1], bits[2], nodelist_true, nodelist_false) | ||
|
||
|
||
class IfBookmarkedNode(template.Node): | ||
|
||
def __init__(self, user, snippet, nodelist_true, nodelist_false): | ||
self.user = template.Variable(user) | ||
self.snippet = template.Variable(snippet) | ||
self.nodelist_true = nodelist_true | ||
self.nodelist_false = nodelist_false | ||
|
||
def render(self, context): | ||
|
||
# Resolve the variables | ||
try: | ||
user = self.user.resolve(context) | ||
snippet = self.snippet.resolve(context) | ||
except template.VariableDoesNotExist: | ||
return '' | ||
|
||
# Render the right if branch | ||
if Bookmark.objects.filter(user__pk=user.id, | ||
snippet__pk=snippet.id): | ||
return self.nodelist_true.render(context) | ||
else: | ||
return self.nodelist_false.render(context) | ||
|
||
|
||
register = template.Library() | ||
register.tag('if_bookmarked', do_if_bookmarked) |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,14 @@ | ||
from django.conf.urls.defaults import * | ||
from cab.views import bookmarks | ||
|
||
urlpatterns = patterns('', | ||
url(r'^$', | ||
bookmarks.user_bookmarks, | ||
name='cab_user_bookmarks'), | ||
url(r'^add/(?P<snippet_id>\d+)/$', | ||
bookmarks.add_bookmark, | ||
name='cab_bookmark_add'), | ||
url(r'^delete/(?P<snippet_id>\d+)/$', | ||
bookmarks.delete_bookmark, | ||
name='cab_bookmark_delete'), | ||
) |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,39 @@ | ||
from django.http import HttpResponseRedirect | ||
from django.shortcuts import get_object_or_404, render_to_response | ||
from django.contrib.auth.decorators import login_required | ||
from django.views.generic.list_detail import object_list | ||
from cab.models import Bookmark, Snippet | ||
|
||
|
||
def user_bookmarks(request): | ||
return object_list(request, | ||
queryset=Bookmark.objects.filter(user__pk=request.user.id), | ||
template_name='cab/user_bookmarks.html', | ||
paginate_by=20) | ||
|
||
|
||
def add_bookmark(request, snippet_id): | ||
snippet = get_object_or_404(Snippet, pk=snippet_id) | ||
try: | ||
Bookmark.objects.get(user__pk=request.user.id, | ||
snippet__pk=snippet.id) | ||
except Bookmark.DoesNotExist: | ||
bookmark = Bookmark.objects.create(user=request.user, | ||
snippet=snippet) | ||
return HttpResponseRedirect(snippet.get_absolute_url()) | ||
add_bookmark = login_required(add_bookmark) | ||
|
||
|
||
def delete_bookmark(request, snippet_id): | ||
if request.method == 'POST': | ||
snippet = get_object_or_404(Snippet, pk=snippet_id) | ||
Bookmark.objects.filter(user__pk=request.user.id, | ||
snippet__pk=snippet.id).delete() | ||
return HttpResponseRedirect(snippet.get_absolute_url()) | ||
else: | ||
return render_to_response('cab/confirm_bookmark_delete.html', | ||
{'snippet': snippet}) | ||
delete_bookmark = login_required(delete_bookmark) | ||
|
||
|
||
|
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Binary file not shown.
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,9 @@ | ||
{% extends "base.html" %} | ||
|
||
{% block title %}{{ block.super }} | Really remove the bookmark?{% endblock %} | ||
|
||
{% block content %} | ||
<form method="post" action=""> | ||
<p><input type="submit" value="Delete bookmark"></p> | ||
</form> | ||
{% endblock %} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,24 @@ | ||
{% extends "base.html" %} | ||
|
||
{% block title %}{{ block.super }} | Most Bookmarked Snippets{% endblock %} | ||
|
||
{% block content %} | ||
|
||
<h2>Most Bookmarked Snippets</h2> | ||
|
||
{% for snip in object_list %} | ||
<h2>{{ snip.title }}</h2> | ||
<p>In language {{ snip.language }}.</p> | ||
{{ snip.description_html|safe }} | ||
<a href="{{ snip.get_absolute_url }}">View snippet</a> | ||
{% endfor %} | ||
|
||
<p>Page {{ page }}; | ||
{% if page.has_previous %} | ||
<a href="?page={{ page.previous_page_number }}">Previous page</a> | ||
{% endif %} | ||
{% if page.has_next_page %} | ||
<a href="?page={{ page.next_page_number }}">Next page</a> | ||
{% endif %}</p> | ||
|
||
{% endblock %} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,22 @@ | ||
{% extends "base.html" %} | ||
|
||
{% block title %}{{ block.super }} | User Bookmark List{% endblock %} | ||
|
||
{% block content %} | ||
|
||
<h2>User bookmarks</h2> | ||
<ul> | ||
{% for bookmark in object_list %} | ||
<li><a href="{{ bookmark.snippet.get_absolute_url }}">{{ bookmark }}</a></li> | ||
{% endfor %} | ||
</ul> | ||
|
||
<p>Page {{ page }}; | ||
{% if page.has_previous %} | ||
<a href="?page={{ page.previous_page_number }}">Previous page</a> | ||
{% endif %} | ||
{% if page.has_next_page %} | ||
<a href="?page={{ page.next_page_number }}">Next page</a> | ||
{% endif %}</p> | ||
|
||
{% endblock %} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters