2 from functools
import partial
3 from datetime
import datetime
5 from django
.http
import HttpResponse
, HttpResponseBadRequest
, \
7 from django
.views
.decorators
.csrf
import csrf_exempt
8 from django
.core
.urlresolvers
import reverse
9 from django
.contrib
.sites
.requests
import RequestSite
10 from django
.contrib
.auth
import get_user_model
11 from django
.utils
.text
import slugify
12 from django
.views
.decorators
.cache
import never_cache
13 from django
.http
import Http404
14 from django
.shortcuts
import get_object_or_404
16 from mygpo
.podcasts
.models
import Podcast
17 from mygpo
.utils
import get_timestamp
18 from mygpo
.api
.advanced
.directory
import podcast_data
19 from mygpo
.api
.httpresponse
import JsonResponse
20 from mygpo
.podcastlists
.models
import PodcastList
21 from mygpo
.api
.basic_auth
import require_valid_user
, check_username
22 from mygpo
.decorators
import allowed_methods
, cors_origin
23 from mygpo
.api
.simple
import parse_subscription
, format_podcast_list
, \
25 from mygpo
.podcastlists
.views
import list_decorator
33 @allowed_methods(['POST'])
35 def create(request
, username
, format
):
36 """ Creates a new podcast list and links to it in the Location header """
38 title
= request
.GET
.get('title', None)
41 return HttpResponseBadRequest('Title missing')
46 return HttpResponseBadRequest('Invalid title')
48 plist
, created
= PodcastList
.objects
.get_or_create(
55 'created': datetime
.utcnow(),
56 'modified': datetime
.utcnow(),
61 return HttpResponse('List already exists', status
=409)
63 urls
= parse_subscription(request
.body
.decode('utf-8'), format
)
64 podcasts
= [Podcast
.objects
.get_or_create_for_url(url
) for url
in urls
]
66 for podcast
in podcasts
:
67 plist
.add_entry(podcast
)
69 response
= HttpResponse(status
=201)
70 list_url
= reverse('api-get-list', args
=[request
.user
.username
, slug
, format
])
71 response
['Location'] = list_url
77 def _get_list_data(l
, username
, domain
):
81 web
= 'http://%s%s' % (domain
,
82 reverse('list-show', args
=[username
, l
.slug
])),
88 @allowed_methods(['GET'])
90 def get_lists(request
, username
):
91 """ Returns a list of all podcast lists by the given user """
93 User
= get_user_model()
94 user
= User
.objects
.get(username
=username
)
98 lists
= PodcastList
.objects
.filter(user
=user
)
100 site
= RequestSite(request
)
102 get_data
= partial(_get_list_data
, username
=user
.username
,
104 lists_data
= list(map(get_data
, lists
))
106 return JsonResponse(lists_data
)
112 @allowed_methods(['GET', 'PUT', 'DELETE'])
114 def podcast_list(request
, username
, slug
, format
):
119 DELETE
= delete_list
,
121 return handlers
[request
.method
](request
, username
, slug
, format
)
124 @list_decorator(must_own
=False)
126 def get_list(request
, plist
, owner
, format
):
127 """ Returns the contents of the podcast list """
130 scale
= int(request
.GET
.get('scale_logo', 64))
131 except (TypeError, ValueError):
132 return HttpResponseBadRequest('scale_logo has to be a numeric value')
134 domain
= RequestSite(request
).domain
135 p_data
= lambda p
: podcast_data(p
, domain
, scale
)
136 title
= '{title} by {username}'.format(title
=plist
.title
,
137 username
=owner
.username
)
139 objs
= [entry
.content_object
for entry
in plist
.entries
.all()]
141 return format_podcast_list(objs
, format
, title
, json_map
=p_data
,
142 jsonp_padding
=request
.GET
.get('jsonp', ''),
143 xml_template
='podcasts.xml', request
=request
)
146 @list_decorator(must_own
=True)
148 def update_list(request
, plist
, owner
, format
):
149 """ Replaces the podcasts in the list and returns 204 No Content """
150 urls
= parse_subscription(request
.body
.decode('utf-8'), format
)
151 podcasts
= [Podcast
.objects
.get_or_create_for_url(url
) for url
in urls
]
152 plist
.set_entries(podcasts
)
154 return HttpResponse(status
=204)
157 @list_decorator(must_own
=True)
159 def delete_list(request
, plist
, owner
, format
):
160 """ Delete the podcast list and returns 204 No Content """
162 return HttpResponse(status
=204)