diff --git a/cab/admin.py b/cab/admin.py index ee71c69..848c6ba 100644 --- a/cab/admin.py +++ b/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) + diff --git a/cab/managers.py b/cab/managers.py index f7242d0..edf6ed3 100644 --- a/cab/managers.py +++ b/cab/managers.py @@ -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): diff --git a/cab/models.py b/cab/models.py index 49ca7ac..4249bf0 100644 --- a/cab/models.py +++ b/cab/models.py @@ -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) diff --git a/cab/templatetags/__init__.py b/cab/templatetags/__init__.py new file mode 100644 index 0000000..8b13789 --- /dev/null +++ b/cab/templatetags/__init__.py @@ -0,0 +1 @@ + diff --git a/cab/templatetags/snippets.py b/cab/templatetags/snippets.py new file mode 100644 index 0000000..b7a62fb --- /dev/null +++ b/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) diff --git a/cab/urls/bookmarks.py b/cab/urls/bookmarks.py new file mode 100644 index 0000000..be15fee --- /dev/null +++ b/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\d+)/$', + bookmarks.add_bookmark, + name='cab_bookmark_add'), + url(r'^delete/(?P\d+)/$', + bookmarks.delete_bookmark, + name='cab_bookmark_delete'), + ) diff --git a/cab/urls/popular.py b/cab/urls/popular.py index e883720..5e422b5 100644 --- a/cab/urls/popular.py +++ b/cab/urls/popular.py @@ -9,4 +9,7 @@ url(r'^languages/$', popular.top_languages, name='cab_top_languages'), + url(r'^bookmarks/$', + popular.most_bookmarked, + name='cab_most_bookmarked'), ) diff --git a/cab/views/bookmarks.py b/cab/views/bookmarks.py new file mode 100644 index 0000000..a352ecf --- /dev/null +++ b/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) + + + diff --git a/cab/views/popular.py b/cab/views/popular.py index 24fe7ec..45c3a8b 100644 --- a/cab/views/popular.py +++ b/cab/views/popular.py @@ -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) diff --git a/codeshare/cms.db b/codeshare/cms.db index cf1ae74..ebb0c10 100644 Binary files a/codeshare/cms.db and b/codeshare/cms.db differ diff --git a/codeshare/templates/base.html b/codeshare/templates/base.html index f7bb7f5..634a696 100644 --- a/codeshare/templates/base.html +++ b/codeshare/templates/base.html @@ -21,6 +21,7 @@

Navigation

+ diff --git a/codeshare/templates/cab/confirm_bookmark_delete.html b/codeshare/templates/cab/confirm_bookmark_delete.html new file mode 100644 index 0000000..103ea87 --- /dev/null +++ b/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 %} +
+

+
+{% endblock %} \ No newline at end of file diff --git a/codeshare/templates/cab/most_bookmarked.html b/codeshare/templates/cab/most_bookmarked.html new file mode 100644 index 0000000..f9dcb9b --- /dev/null +++ b/codeshare/templates/cab/most_bookmarked.html @@ -0,0 +1,24 @@ +{% extends "base.html" %} + +{% block title %}{{ block.super }} | Most Bookmarked Snippets{% endblock %} + +{% block content %} + +

Most Bookmarked Snippets

+ + {% for snip in object_list %} +

{{ snip.title }}

+

In language {{ snip.language }}.

+ {{ snip.description_html|safe }} + View snippet + {% endfor %} + +

Page {{ page }}; + {% if page.has_previous %} + Previous page + {% endif %} + {% if page.has_next_page %} + Next page + {% endif %}

+ +{% endblock %} diff --git a/codeshare/templates/cab/snippet_detail.html b/codeshare/templates/cab/snippet_detail.html index fef5aa2..d5eef7c 100644 --- a/codeshare/templates/cab/snippet_detail.html +++ b/codeshare/templates/cab/snippet_detail.html @@ -8,6 +8,16 @@

{{ object.title }}

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" }}

+ + {% load snippets %} + {% if_bookmarked user object %} +
+

+
+ {% else %} +

Add bookmark

+ {% endif_bookmarked %} + {{ object.description_html|safe }} {{ object.highlighted_code|safe }} diff --git a/codeshare/templates/cab/user_bookmarks.html b/codeshare/templates/cab/user_bookmarks.html new file mode 100644 index 0000000..43d9359 --- /dev/null +++ b/codeshare/templates/cab/user_bookmarks.html @@ -0,0 +1,22 @@ +{% extends "base.html" %} + +{% block title %}{{ block.super }} | User Bookmark List{% endblock %} + +{% block content %} + +

User bookmarks

+ + +

Page {{ page }}; + {% if page.has_previous %} + Previous page + {% endif %} + {% if page.has_next_page %} + Next page + {% endif %}

+ +{% endblock %} diff --git a/codeshare/urls.py b/codeshare/urls.py index d3bd157..6f03127 100644 --- a/codeshare/urls.py +++ b/codeshare/urls.py @@ -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')) )