import logging from rest_framework.response import Response from rest_framework.permissions import IsAdminUser, AllowAny from django.utils.translation import gettext as _ from django.db import transaction from pingcap_sso.api.base import Endpoint from pingcap_sso.forms import TrackEventForm from pingcap_sso.discourse import signals as discourse_signals logger = logging.getLogger(__name__) class EventsCreateEndpoint(Endpoint): permission_classes = (IsAdminUser, ) def post(self, request, *args, **kwargs): form = TrackEventForm(data=request.data) if form.is_valid(): form.save() return Response({ 'detail': _('success') }) else: return Response({ 'detail': _('params error'), 'errors': form.errors }, status=400) class EventsBulckCreateEndpoint(Endpoint): permission_classes = (IsAdminUser, ) def post(self, request, *args, **kwargs): try: with transaction.atomic(): events = request.data for event in events: form = TrackEventForm(data=event) if form.is_valid(): form.save() else: raise Exception return Response({ 'detail': _('success') }) except Exception: import traceback return Response({ 'detail': _('params error'), 'errors': traceback.format_exc() }, status=400) class AsktugWebhookEndpoint(Endpoint): permission_classes = (AllowAny, ) def post(self, request, *args, **kwargs): event_type = request.META.get('HTTP_X_DISCOURSE_EVENT_TYPE') event_name = request.META.get('HTTP_X_DISCOURSE_EVENT') data = request.data if event_type == 'topic': if event_name in ('topic_created', 'topic_recovered'): discourse_signals.topic_created.send( sender=self.__class__, topic=data.get('topic')) elif event_name == 'topic_destroyed': discourse_signals.topic_destroyed.send( sender=self.__class__, topic=data.get('topic')) elif event_type == 'post': if event_name in ('post_created', 'post_recovered'): discourse_signals.post_created.send( sender=self.__class__, post=data.get('post')) elif event_name == 'post_destroyed': discourse_signals.post_destroyed.send( sender=self.__class__, post=data.get('post')) return Response({ 'detail': _('success') })