Project

General

Profile

Download (4.17 KB) Statistics
| Branch: | Tag: | Revision:
# corbo - Announces Manager
# Copyright (C) 2016 Entr'ouvert
#
# This program is free software: you can redistribute it and/or modify it
# under the terms of the GNU Affero General Public License as published
# by the Free Software Foundation, either version 3 of the License, or
# (at your option) any later version.
#
# This program is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
# GNU Affero General Public License for more details.
#
# You should have received a copy of the GNU Affero General Public License
# along with this program. If not, see <http://www.gnu.org/licenses/>.

import json
from collections import defaultdict

from django.core.exceptions import PermissionDenied
from django.db.models import Q
from django.db import transaction

from rest_framework.views import APIView
from rest_framework.response import Response

from .models import Category, Subscription, channel_choices


class NewslettersView(APIView):

def get(self, request):
newsletters = []
transports = [{'id': identifier, 'text': name} for identifier, name in channel_choices]
for c in Category.objects.all():
newsletter = {'id': str(c.pk), 'text': c.name,
'transports': transports}
newsletters.append(newsletter)
return Response({'data': newsletters})


class SubscriptionsView(APIView):

def get_subscriptions(self, email, uuid=None):
subscriptions = defaultdict(dict)
identifier = 'mailto:'+email
for s in Subscription.objects.filter(Q(identifier=identifier)|Q(uuid=uuid)):
cat_id = s.category.pk
subscriptions[cat_id]['id'] = str(cat_id)
subscriptions[cat_id]['text'] = s.category.name
transport_id, transport_name = identifier.split(':')
transport = {'id': transport_id,
'text': transport_id}
if 'transports' in subscriptions[cat_id]:
subscriptions[cat_id]['transports'].append(transport)
else:
subscriptions[cat_id]['transports'] = [transport]

return subscriptions.values()

@transaction.atomic
def update_subscriptions(self, category_id, transports, email, uuid=None):
uuid = uuid or u''
identifier = u'mailto:'
if email:
identifier += email
try:
cat = Category.objects.get(pk=category_id)
except Category.DoesNotExist:
return

subcriptions = cat.subscription_set

if email:
if 'mailto' in transports:
subcriptions.get_or_create(identifier=identifier, uuid=uuid)
if uuid:
subcriptions.exclude(uuid=uuid).filter(identifier=identifier).delete()
else:
subcriptions.filter(identifier=identifier).delete()

if uuid:
if 'homepage' in transports:
subcriptions.get_or_create(uuid=uuid)
else:
subcriptions.filter(identifier='', uuid=uuid).delete()

def get(self, request):
email = request.GET.get('email')
uuid = request.GET.get('uuid')
if not email:
raise PermissionDenied('Email parameter required')
return Response({'data': self.get_subscriptions(email, uuid)})

def post(self, request):
email = request.GET.get('email')
uuid = request.GET.get('uuid')
if not email:
raise PermissionDenied('Email parameter required')
data = json.loads(request.body)
for subscription in data:
self.update_subscriptions(subscription['id'], subscription['transports'],
email, uuid)
return Response({'data': True})

def delete(self, request):
email = request.GET.get('email')
uuid = request.GET.get('uuid')
if not email:
raise PermissionDenied('Email parameter required')

for subscription in self.get_subscriptions(email):
self.update_subscriptions(subscription['id'], [], email, uuid)
return Response({'data': True})
(3-3/11)