Skip to content

Commit

Permalink
Implement user bookmarks (create and delete) with a most popular book…
Browse files Browse the repository at this point in the history
…mark page and if_bookmarked template tag. On page 196.
  • Loading branch information
grokcode committed Apr 3, 2012
1 parent 4e3699f commit 8cd7260
Show file tree
Hide file tree
Showing 16 changed files with 190 additions and 5 deletions.
8 changes: 5 additions & 3 deletions cab/admin.py
@@ -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)




3 changes: 3 additions & 0 deletions cab/managers.py
Expand Up @@ -7,6 +7,9 @@
class SnippetManager(models.Manager):
def top_authors(self):
return User.objects.annotate(score=Count('snippet')).order_by('score')
def most_bookmarked(self):
return self.annotate(score=Count('bookmark')).order_by('score')


class LanguageManager(models.Manager):
def top_languages(self):
Expand Down
4 changes: 2 additions & 2 deletions cab/models.py
Expand Up @@ -85,7 +85,7 @@ class Meta:
def __unicode__(self):
return "%s bookmarked by %s" % (self.snippet, self.user)

def save(self):
def save(self, *args, **kwargs):
if not self.id:
self.date = datetime.datetime.now()
super(Bookmark, self).save()
super(Bookmark, self).save(*args, **kwargs)
1 change: 1 addition & 0 deletions cab/templatetags/__init__.py
@@ -0,0 +1 @@

50 changes: 50 additions & 0 deletions cab/templatetags/snippets.py
@@ -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)
14 changes: 14 additions & 0 deletions cab/urls/bookmarks.py
@@ -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'),
)
3 changes: 3 additions & 0 deletions cab/urls/popular.py
Expand Up @@ -9,4 +9,7 @@
url(r'^languages/$',
popular.top_languages,
name='cab_top_languages'),
url(r'^bookmarks/$',
popular.most_bookmarked,
name='cab_most_bookmarked'),
)
39 changes: 39 additions & 0 deletions cab/views/bookmarks.py
@@ -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)



6 changes: 6 additions & 0 deletions cab/views/popular.py
Expand Up @@ -13,3 +13,9 @@ def top_languages(request):
queryset=Language.objects.top_languages(),
template_name='cab/top_languages.html',
paginate_by=20)

def most_bookmarked(request):
return object_list(request,
queryset=Snippet.objects.most_bookmarked(),
template_name='cab/most_bookmarked.html',
paginate_by=20)
Binary file modified codeshare/cms.db
Binary file not shown.
1 change: 1 addition & 0 deletions codeshare/templates/base.html
Expand Up @@ -21,6 +21,7 @@ <h2>Navigation</h2>
<li id="main-nav-languages"><a href="{% url cab_language_list %}">Languages</a></li>
<li id="main-nav-authors"><a href="{% url cab_top_authors %}">Authors</a></li>
<li id="main-nav-add-snippet"><a href="{% url cab_snippet_add %}">Add Snippet</a></li>
<li id="main-nav-bookmarks"><a href="{% url cab_user_bookmarks %}">Bookmarks</a></li>
</ul>
</div>

Expand Down
9 changes: 9 additions & 0 deletions codeshare/templates/cab/confirm_bookmark_delete.html
@@ -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 %}
24 changes: 24 additions & 0 deletions codeshare/templates/cab/most_bookmarked.html
@@ -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 %}
10 changes: 10 additions & 0 deletions codeshare/templates/cab/snippet_detail.html
Expand Up @@ -8,6 +8,16 @@ <h2>{{ object.title }}</h2>
<p>In language {{ object.language }}, by {{ object.author }}.
First published: {{ object.pub_date|date:"F j, Y" }},
last updated {{ object.updated_date|date:"F j, Y" }}</p>

{% load snippets %}
{% if_bookmarked user object %}
<form method="post" action="{% url cab_bookmark_delete object.id %}">
<p><input type="submit" value="Delete bookmark"></p>
</form>
{% else %}
<p><a href="{% url cab_bookmark_add snippet_id=object.id %}">Add bookmark</a></p>
{% endif_bookmarked %}

{{ object.description_html|safe }}
{{ object.highlighted_code|safe }}

Expand Down
22 changes: 22 additions & 0 deletions codeshare/templates/cab/user_bookmarks.html
@@ -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 %}
1 change: 1 addition & 0 deletions codeshare/urls.py
Expand Up @@ -11,4 +11,5 @@
(r'^snippets/', include('cab.urls.snippets')),
(r'^languages/', include('cab.urls.languages')),
(r'^popular/', include('cab.urls.popular')),
(r'^bookmarks/', include('cab.urls.bookmarks'))
)

0 comments on commit 8cd7260

Please sign in to comment.