From 81f229754654032fd2cc683b700f2f3d8f5d0ee2 Mon Sep 17 00:00:00 2001 From: Stefan Koegl Date: Sat, 24 Apr 2010 13:38:11 +0200 Subject: [PATCH] marking episodes as favorites, added favorite-list --- htdocs/media/fav-add.png | Bin 0 -> 2043 bytes htdocs/media/fav.png | Bin 0 -> 1761 bytes install/update-29.sql | 8 ++++++++ mygpo/api/models/users.py | 30 ++++++++++++++++++++++++++++++ mygpo/urls.py | 3 +++ mygpo/web/templates/episode.html | 16 ++++++++++++++++ mygpo/web/templates/favorites.html | 35 +++++++++++++++++++++++++++++++++++ mygpo/web/templatetags/menu.py | 1 + mygpo/web/views/episode.py | 23 +++++++++++++++++++++++ 9 files changed, 116 insertions(+) create mode 100644 htdocs/media/fav-add.png create mode 100644 htdocs/media/fav.png create mode 100644 mygpo/api/models/users.py create mode 100644 mygpo/web/templates/favorites.html diff --git a/htdocs/media/fav-add.png b/htdocs/media/fav-add.png new file mode 100644 index 0000000000000000000000000000000000000000..431fb2b3cc36e2b44effcdf71ab7e130a0e951dd GIT binary patch literal 2043 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. +# + +from django.db import models +from django.contrib.auth.models import User +from mygpo.api.models import Episode + +class EpisodeFavorite(models.Model): + user = models.ForeignKey(User) + episode = models.ForeignKey(Episode) + created = models.DateTimeField(auto_now_add=True) + + class Meta: + db_table = 'episode_favorites' + unique_together = ('user', 'episode') + diff --git a/mygpo/urls.py b/mygpo/urls.py index 95ad8335..8561fcd3 100644 --- a/mygpo/urls.py +++ b/mygpo/urls.py @@ -50,6 +50,9 @@ urlpatterns = patterns('', (r'^episode/(?P\d+)$', 'mygpo.web.views.episode.episode'), (r'^episode/(?P\d+)/add-chapter$', 'mygpo.web.views.episode.add_chapter'), (r'^episode/(?P\d+)/remove-chapter/(?P\d+)$', 'mygpo.web.views.episode.remove_chapter'), + (r'^episode/(?P\d+)/toggle-favorite', 'mygpo.web.views.episode.toggle_favorite'), + + (r'^favorites/', 'mygpo.web.views.episode.list_favorites'), (r'account/$', 'mygpo.web.views.settings.account'), (r'account/privacy$', 'mygpo.web.views.settings.privacy'), diff --git a/mygpo/web/templates/episode.html b/mygpo/web/templates/episode.html index c742b2c3..ddd30bd5 100644 --- a/mygpo/web/templates/episode.html +++ b/mygpo/web/templates/episode.html @@ -37,6 +37,22 @@ {% endif %} {% if user.is_authenticated %} + + {% if is_favorite %} + + {% else %} + + {% endif %} + +

{% trans "Chapters" %}

diff --git a/mygpo/web/templates/favorites.html b/mygpo/web/templates/favorites.html new file mode 100644 index 00000000..97b56d92 --- /dev/null +++ b/mygpo/web/templates/favorites.html @@ -0,0 +1,35 @@ +{% extends "base.html" %} +{% load i18n %} +{% load podcasts %} + +{% load menu %} +{% block mainmenu %}{{ "/subscriptions/"|main_menu }}{% endblock %} +{% block sectionmenu %}{{ "/favorites/"|section_menu }}{% endblock %} + +{% block title %}{% trans "Favorite Episodes" %}{% endblock %} + +{% block content %} +

{% trans "Favorite Episodes" %}

+ + + + + + + {% for episode in episodes %} + + + + + {% endfor %} +
{{ episode.podcast|podcast_logo }} + {% if episode.title %} + {{ episode.title|striptags }} + {% else %} + {% trans "Unnamed Episode" %} + {% endif %} +
+ {% trans "from" %} {{ episode.podcast|striptags }}
+ +{% endblock %} + diff --git a/mygpo/web/templatetags/menu.py b/mygpo/web/templatetags/menu.py index c6abb6da..9ed85a58 100644 --- a/mygpo/web/templatetags/menu.py +++ b/mygpo/web/templatetags/menu.py @@ -22,6 +22,7 @@ MENU_STRUCTURE = ( )), (_('My Podcasts'), ( ('/subscriptions/', _('Subscriptions')), + ('/favorites/', _('Favorite Episodes')), ('/history/', _('History')), ('/suggestions/', _('Suggestions')), )), diff --git a/mygpo/web/views/episode.py b/mygpo/web/views/episode.py index fffe5d76..0cdc1d30 100644 --- a/mygpo/web/views/episode.py +++ b/mygpo/web/views/episode.py @@ -20,6 +20,7 @@ from django.http import HttpResponseRedirect, HttpResponse, HttpResponseBadReque from django.template import RequestContext from mygpo.api.models import Podcast, Episode, Device, EpisodeAction, Subscription from mygpo.api.models.episodes import Chapter +from mygpo.api.models.users import EpisodeFavorite from mygpo.utils import parse_time from django.utils.translation import ugettext as _ from django.contrib.auth.decorators import login_required @@ -37,9 +38,11 @@ def episode(request, id): subscription_meta = subscription_tmp[0].get_meta() else: subscription_meta = None + is_fav = EpisodeFavorite.objects.filter(user=request.user, episode=episode).exists() else: history = [] subscription_meta = None + is_fav = False chapters = [c for c in Chapter.objects.filter(episode=episode).order_by('start') if c.is_public() or c.user == request.user] @@ -48,6 +51,7 @@ def episode(request, id): 'history': history, 'chapters': chapters, 'subscription_meta': subscription_meta, + 'is_favorite': is_fav, }, context_instance=RequestContext(request)) @@ -79,3 +83,22 @@ def remove_chapter(request, id, chapter_id): return HttpResponseRedirect('/episode/%s' % id) + +@login_required +def toggle_favorite(request, id): + episode = get_object_or_404(Episode, id=id) + fav, c = EpisodeFavorite.objects.get_or_create(user=request.user, episode=episode) + if not c: + fav.delete() + + return HttpResponseRedirect('/episode/%s' % id) + + +@login_required +def list_favorites(request): + episodes = [x.episode for x in EpisodeFavorite.objects.filter(user=request.user).order_by('-created')] + + return render_to_response('favorites.html', { + 'episodes': episodes + }, context_instance=RequestContext(request)) + -- 2.11.4.GIT