properly register auto-flattr celery task
[mygpo.git] / mygpo / api / legacy.py
blobb0ef2ab3e47d369becda409d0a8465eefb34a5ac
2 # This file is part of my.gpodder.org.
4 # my.gpodder.org is free software: you can redistribute it and/or modify it
5 # under the terms of the GNU Affero General Public License as published by
6 # the Free Software Foundation, either version 3 of the License, or (at your
7 # option) any later version.
9 # my.gpodder.org is distributed in the hope that it will be useful, but
10 # WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
11 # or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Affero General Public
12 # License for more details.
14 # You should have received a copy of the GNU Affero General Public License
15 # along with my.gpodder.org. If not, see <http://www.gnu.org/licenses/>.
18 from datetime import datetime
20 from django.http import HttpResponse
21 from django.utils.datastructures import MultiValueDictKeyError
22 from django.views.decorators.csrf import csrf_exempt
23 from django.views.decorators.cache import never_cache
25 from mygpo.log import log
26 from mygpo.api.sanitizing import sanitize_urls
27 from mygpo.users.models import User
28 from mygpo.api.opml import Importer, Exporter
29 from mygpo.core.models import Podcast, SubscriptionException
30 from mygpo.api.backend import get_device
31 from mygpo.db.couchdb.podcast import podcast_for_url
34 LEGACY_DEVICE_NAME = 'Legacy Device'
35 LEGACY_DEVICE_UID = 'legacy'
37 @never_cache
38 @csrf_exempt
39 def upload(request):
40 try:
41 emailaddr = request.POST['username']
42 password = request.POST['password']
43 action = request.POST['action']
44 protocol = request.POST['protocol']
45 opml = request.FILES['opml'].read()
46 except MultiValueDictKeyError:
47 return HttpResponse("@PROTOERROR", mimetype='text/plain')
49 user = auth(emailaddr, password)
50 if (not user):
51 return HttpResponse('@AUTHFAIL', mimetype='text/plain')
53 dev = get_device(user, LEGACY_DEVICE_UID,
54 request.META.get('HTTP_USER_AGENT', ''))
56 existing_urls = [x.url for x in dev.get_subscribed_podcasts()]
58 i = Importer(opml)
60 podcast_urls = [p['url'] for p in i.items]
61 podcast_urls = sanitize_urls(podcast_urls)
62 podcast_urls = filter(lambda x: x, podcast_urls)
64 new = [u for u in podcast_urls if u not in existing_urls]
65 rem = [u for e in existing_urls if u not in podcast_urls]
67 #remove duplicates
68 new = list(set(new))
69 rem = list(set(rem))
71 for n in new:
72 try:
73 p = podcast_for_url(n, create=True)
74 except IntegrityError, e:
75 log('/upload: Error trying to get podcast object: %s (error: %s)' % (n, e))
76 continue
78 try:
79 p.subscribe(user, dev)
80 except SubscriptionException as e:
81 log('Legacy API: %(username)s: could not subscribe to podcast %(podcast_url)s on device %(device_id)s: %(exception)s' %
82 {'username': user.username, 'podcast_url': p.url, 'device_id': dev.id, 'exception': e})
84 for r in rem:
85 p = podcast_for_url(r, create=True)
86 try:
87 p.unsubscribe(user, dev)
88 except SubscriptionException as e:
89 log('Legacy API: %(username): could not unsubscribe from podcast %(podcast_url) on device %(device_id): %(exception)s' %
90 {'username': user.username, 'podcast_url': p.url, 'device_id': dev.id, 'exception': e})
92 return HttpResponse('@SUCCESS', mimetype='text/plain')
94 @never_cache
95 @csrf_exempt
96 def getlist(request):
97 emailaddr = request.GET.get('username', None)
98 password = request.GET.get('password', None)
100 user = auth(emailaddr, password)
101 if user is None:
102 return HttpResponse('@AUTHFAIL', mimetype='text/plain')
104 dev = get_device(user, LEGACY_DEVICE_UID,
105 request.META.get('HTTP_USER_AGENT', ''),
106 undelete=True)
107 podcasts = dev.get_subscribed_podcasts()
109 title = "{username}'s subscriptions".format(username=user.username)
110 exporter = Exporter(title)
112 opml = exporter.generate(podcasts)
114 return HttpResponse(opml, mimetype='text/xml')
117 def auth(emailaddr, password):
118 if emailaddr is None or password is None:
119 return None
121 user = User.get_user_by_email(emailaddr)
122 if not user:
123 return None
125 if not user.check_password(password):
126 return None
128 if not user.is_active:
129 return None
131 return user