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
.db
import IntegrityError
23 from django
.views
.decorators
.csrf
import csrf_exempt
24 from django
.views
.decorators
.cache
import never_cache
26 from mygpo
.log
import log
27 from mygpo
.api
.sanitizing
import sanitize_urls
28 from mygpo
.users
.models
import User
29 from mygpo
.api
.opml
import Importer
, Exporter
30 from mygpo
.core
.models
import Podcast
31 from mygpo
.api
.backend
import get_device
34 LEGACY_DEVICE_NAME
= 'Legacy Device'
35 LEGACY_DEVICE_UID
= 'legacy'
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
)
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()]
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
]
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
))
79 p
.subscribe(user
, dev
)
80 except Exception 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
})
85 p
= Podcast
.for_url(r
, create
=True)
87 p
.unsubscribe(user
, dev
)
88 except Exception 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')
97 emailaddr
= request
.GET
.get('username', None)
98 password
= request
.GET
.get('password', None)
100 user
= auth(emailaddr
, password
)
102 return HttpResponse('@AUTHFAIL', mimetype
='text/plain')
104 dev
= get_device(user
, LEGACY_DEVICE_UID
,
105 request
.META
.get('HTTP_USER_AGENT', ''),
107 podcasts
= dev
.get_subscribed_podcasts()
109 # FIXME: Get username and set a proper title (e.g. "thp's subscription list")
110 title
= 'Your subscription list'
111 exporter
= Exporter(title
)
113 opml
= exporter
.generate(podcasts
)
115 return HttpResponse(opml
, mimetype
='text/xml')
118 def auth(emailaddr
, password
):
119 if emailaddr
is None or password
is None:
122 user
= User
.get_user_by_email(emailaddr
)
126 if not user
.check_password(password
):
129 if not user
.is_active
: