telegram_bots/bots/views.py

96 lines
3.5 KiB
Python

from django.contrib import messages
from django.contrib.auth.mixins import LoginRequiredMixin
from django.contrib.contenttypes.models import ContentType
from django.core.cache import cache
from django.core.exceptions import PermissionDenied
from django.http import HttpResponseRedirect, HttpRequest
from django.shortcuts import redirect, get_object_or_404
from django.utils.decorators import method_decorator
from django.views import View
from django.views.decorators.csrf import csrf_exempt
from django.views.generic import ListView
from django.views.generic.detail import SingleObjectMixin
from jsonrpc import JSONRPCResponseManager
from bots.models import TelegramBot
from bots.modules import BOT_MODULES
from bots.utils import BaseBotConfigView, JSONResponseMixin, AjaxResponseMixin
from cabinet.utils import CabinetViewMixin
from config.utils import AllowCORSMixin
class BotListView(CabinetViewMixin, ListView):
template_name = 'cabinet/bots/bot_list.html'
title = 'Bot list'
sidebar_section = 'bots'
def get_queryset(self):
return TelegramBot.objects.filter(owner=self.request.user)
def get_context_data(self, *args, **kwargs):
ctx = super(BotListView, self).get_context_data(*args, **kwargs)
ctx['bot_modules'] = BOT_MODULES
return ctx
class BotConfigEditView(BaseBotConfigView, SingleObjectMixin):
title = 'Configure bot'
sidebar_section = 'bots'
def form_valid(self, bot_form, config_form):
bot_form.save()
config_form.save()
cache.set('bots_reset', '1')
messages.success(self.request, 'Config was successfully saved')
return HttpResponseRedirect('')
def get_content_type(self):
return self.get_object().config_type
class BotConfigCreateView(BaseBotConfigView):
title = 'Create bot'
sidebar_section = 'bots'
def get_object(self):
return None
def form_valid(self, bots_form, config_form):
config_form.save()
bots_form.instance.owner = self.request.user
bots_form.instance.config_type = self.get_content_type()
bots_form.instance.config_id = config_form.instance.pk
bots_form.save()
cache.set('bots_reset', '1')
messages.success(self.request, 'Config was successfully saved')
return redirect('cabinet:bots:edit', pk=bots_form.instance.pk)
def get_content_type(self):
return get_object_or_404(ContentType, model=self.kwargs['content_type'])
class BotConfigDeleteView(LoginRequiredMixin, SingleObjectMixin, View):
def get_queryset(self):
return TelegramBot.objects.filter(owner=self.request.user)
def post(self, request, *args, **kwargs):
feed = self.get_object()
messages.success(self.request, 'Bot "{}" was successfully deleted'.format(feed.title))
feed.delete()
return redirect('cabinet:bots:index')
class BotRPCView(JSONResponseMixin, AjaxResponseMixin, AllowCORSMixin, View):
@method_decorator(csrf_exempt)
def dispatch(self, request, *args, **kwargs):
return super().dispatch(request, *args, **kwargs)
def post(self, request: HttpRequest, *args, **kwargs):
bot = get_object_or_404(TelegramBot, rpc_name=self.kwargs.get('endpoint'))
if not hasattr(bot.config, 'rpc_dispatcher'):
raise PermissionDenied()
rpc_response = JSONRPCResponseManager.handle(request.body, bot.config.rpc_dispatcher)
response = self.render_json_response(rpc_response.data)
self.add_access_control_headers(response)
return response