from permabots.serializers import HookSerializer, TelegramRecipientSerializer, HookUpdateSerializer, KikRecipientSerializer, MessengerRecipientSerializer
from permabots.models import Hook, TelegramRecipient, KikRecipient, MessengerRecipient
from permabots.models import Response as handlerResponse
from rest_framework.response import Response
from rest_framework import status
import logging
from django.http.response import Http404
from rest_framework import exceptions
from permabots.views.api.base import PermabotsAPIView, ListBotAPIView, DetailBotAPIView, ObjectBotListView
logger = logging.getLogger(__name__)
[docs]class HookList(ListBotAPIView):
serializer = HookSerializer
def _query(self, bot):
return bot.hooks.all()
def _creator(self, bot, serializer):
response = handlerResponse.objects.create(text_template=serializer.data['response']['text_template'],
keyboard_template=serializer.data['response']['keyboard_template'])
return Hook.objects.create(bot=bot,
enabled=serializer.data['enabled'],
response=response,
name=serializer.data['name'])
[docs] def get(self, request, bot_id, format=None):
"""
Get list of hooks
---
serializer: HookSerializer
responseMessages:
- code: 401
message: Not authenticated
"""
return super(HookList, self).get(request, bot_id, format)
[docs] def post(self, request, bot_id, format=None):
"""
Add a new hook
---
serializer: HookSerializer
responseMessages:
- code: 401
message: Not authenticated
- code: 400
message: Not valid request
"""
return super(HookList, self).post(request, bot_id, format)
[docs]class HookDetail(DetailBotAPIView):
model = Hook
serializer = HookSerializer
serializer_update = HookUpdateSerializer
[docs] def get(self, request, bot_id, id, format=None):
"""
Get hook by id
---
serializer: HookSerializer
responseMessages:
- code: 401
message: Not authenticated
"""
return super(HookDetail, self).get(request, bot_id, id, format)
[docs] def put(self, request, bot_id, id, format=None):
"""
Update existing hook
---
serializer: HookUpdateSerializer
responseMessages:
- code: 401
message: Not authenticated
- code: 400
message: Not valid request
"""
return super(HookDetail, self).put(request, bot_id, id, format)
[docs] def delete(self, request, bot_id, id, format=None):
"""
Delete existing hook
---
responseMessages:
- code: 401
message: Not authenticated
"""
return super(HookDetail, self).delete(request, bot_id, id, format)
[docs]class TelegramRecipientList(ObjectBotListView):
serializer = TelegramRecipientSerializer
obj_model = Hook
def _query(self, bot, obj):
return obj.telegram_recipients.all()
def _creator(self, obj, serializer):
return TelegramRecipient.objects.create(chat_id=serializer.data['chat_id'],
name=serializer.data['name'],
hook=obj)
[docs] def get(self, request, bot_id, id, format=None):
"""
Get list of telegram recipients of a hook
---
serializer: TelegramRecipientSerializer
responseMessages:
- code: 401
message: Not authenticated
"""
return super(TelegramRecipientList, self).get(request, bot_id, id, format)
[docs] def post(self, request, bot_id, id, format=None):
"""
Add a new telegram recipient to a handler
---
serializer: TelegramRecipientSerializer
responseMessages:
- code: 401
message: Not authenticated
- code: 400
message: Not valid request
"""
return super(TelegramRecipientList, self).post(request, bot_id, id, format)
[docs]class TelegramRecipientDetail(PermabotsAPIView):
model = TelegramRecipient
serializer = TelegramRecipientSerializer
[docs] def get_hook(self, id, bot, user):
try:
hook = Hook.objects.get(id=id, bot=bot)
if hook.bot.owner != user:
raise exceptions.AuthenticationFailed()
return hook
except Hook.DoesNotExist:
raise Http404
def _user(self, obj):
return obj.hook.bot.owner
[docs] def get_recipient(self, id, hook, user):
try:
obj = self.model.objects.get(id=id, hook=hook)
if self._user(obj) != user:
raise exceptions.AuthenticationFailed()
return obj
except self.model.DoesNotExist:
raise Http404
[docs] def get(self, request, bot_id, hook_id, id, format=None):
"""
Get recipient by id
---
serializer: TelegramRecipientSerializer
responseMessages:
- code: 401
message: Not authenticated
"""
bot = self.get_bot(bot_id, request.user)
hook = self.get_hook(hook_id, bot, request.user)
recipient = self.get_recipient(id, hook, request.user)
serializer = self.serializer(recipient)
return Response(serializer.data)
[docs] def put(self, request, bot_id, hook_id, id, format=None):
"""
Update existing telegram recipient
---
serializer: TelegramRecipientSerializer
responseMessages:
- code: 401
message: Not authenticated
- code: 400
message: Not valid request
"""
bot = self.get_bot(bot_id, request.user)
hook = self.get_hook(hook_id, bot, request.user)
recipient = self.get_recipient(id, hook, request.user)
serializer = self.serializer(recipient, data=request.data)
if serializer.is_valid():
serializer.save()
return Response(serializer.data)
return Response(serializer.errors, status=status.HTTP_400_BAD_REQUEST)
[docs] def delete(self, request, bot_id, hook_id, id, format=None):
"""
Delete an existing telegram recipient
---
responseMessages:
- code: 401
message: Not authenticated
"""
bot = self.get_bot(bot_id, request.user)
hook = self.get_hook(hook_id, bot, request.user)
recipient = self.get_recipient(id, hook, request.user)
recipient.delete()
return Response(status=status.HTTP_204_NO_CONTENT)
[docs]class KikRecipientList(ObjectBotListView):
serializer = KikRecipientSerializer
obj_model = Hook
def _query(self, bot, obj):
return obj.kik_recipients.all()
def _creator(self, obj, serializer):
return KikRecipient.objects.create(chat_id=serializer.data['chat_id'],
name=serializer.data['name'],
username=serializer.data['username'],
hook=obj)
[docs] def get(self, request, bot_id, id, format=None):
"""
Get list of kik recipients of a hook
---
serializer: KikRecipientSerializer
responseMessages:
- code: 401
message: Not authenticated
"""
return super(KikRecipientList, self).get(request, bot_id, id, format)
[docs] def post(self, request, bot_id, id, format=None):
"""
Add a new kik recipient to a handler
---
serializer: KikRecipientSerializer
responseMessages:
- code: 401
message: Not authenticated
- code: 400
message: Not valid request
"""
return super(KikRecipientList, self).post(request, bot_id, id, format)
[docs]class KikRecipientDetail(PermabotsAPIView):
model = KikRecipient
serializer = KikRecipientSerializer
[docs] def get_hook(self, id, bot, user):
try:
hook = Hook.objects.get(id=id, bot=bot)
if hook.bot.owner != user:
raise exceptions.AuthenticationFailed()
return hook
except Hook.DoesNotExist:
raise Http404
def _user(self, obj):
return obj.hook.bot.owner
[docs] def get_recipient(self, id, hook, user):
try:
obj = self.model.objects.get(id=id, hook=hook)
if self._user(obj) != user:
raise exceptions.AuthenticationFailed()
return obj
except self.model.DoesNotExist:
raise Http404
[docs] def get(self, request, bot_id, hook_id, id, format=None):
"""
Get recipient by id
---
serializer: KikRecipientSerializer
responseMessages:
- code: 401
message: Not authenticated
"""
bot = self.get_bot(bot_id, request.user)
hook = self.get_hook(hook_id, bot, request.user)
recipient = self.get_recipient(id, hook, request.user)
serializer = self.serializer(recipient)
return Response(serializer.data)
[docs] def put(self, request, bot_id, hook_id, id, format=None):
"""
Update existing telegram recipient
---
serializer: KikRecipientSerializer
responseMessages:
- code: 401
message: Not authenticated
- code: 400
message: Not valid request
"""
bot = self.get_bot(bot_id, request.user)
hook = self.get_hook(hook_id, bot, request.user)
recipient = self.get_recipient(id, hook, request.user)
serializer = self.serializer(recipient, data=request.data)
if serializer.is_valid():
serializer.save()
return Response(serializer.data)
return Response(serializer.errors, status=status.HTTP_400_BAD_REQUEST)
[docs] def delete(self, request, bot_id, hook_id, id, format=None):
"""
Delete an existing kik recipient
---
responseMessages:
- code: 401
message: Not authenticated
"""
bot = self.get_bot(bot_id, request.user)
hook = self.get_hook(hook_id, bot, request.user)
recipient = self.get_recipient(id, hook, request.user)
recipient.delete()
return Response(status=status.HTTP_204_NO_CONTENT)
[docs]class MessengerRecipientList(ObjectBotListView):
serializer = MessengerRecipientSerializer
obj_model = Hook
def _query(self, bot, obj):
return obj.messenger_recipients.all()
def _creator(self, obj, serializer):
return MessengerRecipient.objects.create(chat_id=serializer.data['chat_id'],
name=serializer.data['name'],
hook=obj)
[docs] def get(self, request, bot_id, id, format=None):
"""
Get list of Messenger recipients of a hook
---
serializer: MessengerRecipientSerializer
responseMessages:
- code: 401
message: Not authenticated
"""
return super(MessengerRecipientList, self).get(request, bot_id, id, format)
[docs] def post(self, request, bot_id, id, format=None):
"""
Add a new messenger recipient to a handler
---
serializer: MessengerRecipientSerializer
responseMessages:
- code: 401
message: Not authenticated
- code: 400
message: Not valid request
"""
return super(MessengerRecipientList, self).post(request, bot_id, id, format)
[docs]class MessengerRecipientDetail(PermabotsAPIView):
model = MessengerRecipient
serializer = MessengerRecipientSerializer
[docs] def get_hook(self, id, bot, user):
try:
hook = Hook.objects.get(id=id, bot=bot)
if hook.bot.owner != user:
raise exceptions.AuthenticationFailed()
return hook
except Hook.DoesNotExist:
raise Http404
def _user(self, obj):
return obj.hook.bot.owner
[docs] def get_recipient(self, id, hook, user):
try:
obj = self.model.objects.get(id=id, hook=hook)
if self._user(obj) != user:
raise exceptions.AuthenticationFailed()
return obj
except self.model.DoesNotExist:
raise Http404
[docs] def get(self, request, bot_id, hook_id, id, format=None):
"""
Get recipient by id
---
serializer: MessengerRecipientSerializer
responseMessages:
- code: 401
message: Not authenticated
"""
bot = self.get_bot(bot_id, request.user)
hook = self.get_hook(hook_id, bot, request.user)
recipient = self.get_recipient(id, hook, request.user)
serializer = self.serializer(recipient)
return Response(serializer.data)
[docs] def put(self, request, bot_id, hook_id, id, format=None):
"""
Update existing telegram recipient
---
serializer: MessengerRecipientSerializer
responseMessages:
- code: 401
message: Not authenticated
- code: 400
message: Not valid request
"""
bot = self.get_bot(bot_id, request.user)
hook = self.get_hook(hook_id, bot, request.user)
recipient = self.get_recipient(id, hook, request.user)
serializer = self.serializer(recipient, data=request.data)
if serializer.is_valid():
serializer.save()
return Response(serializer.data)
return Response(serializer.errors, status=status.HTTP_400_BAD_REQUEST)
[docs] def delete(self, request, bot_id, hook_id, id, format=None):
"""
Delete an existing Messenger recipient
---
responseMessages:
- code: 401
message: Not authenticated
"""
bot = self.get_bot(bot_id, request.user)
hook = self.get_hook(hook_id, bot, request.user)
recipient = self.get_recipient(id, hook, request.user)
recipient.delete()
return Response(status=status.HTTP_204_NO_CONTENT)