Публикация данных в календаре Outlook с использованием Django, запросов и Microsoft Graph - PullRequest
0 голосов
/ 21 января 2020

У меня есть функция, когда я пытаюсь сделать запрос на публикацию в моем календаре Outlook с помощью Microsoft Graph API.

def create_calendar_event(token, payload, **kwargs):
    """
    Creates a new calendar event
    :param payload: json str
    :param token: str
    :return: dict
    """
    graph_client = OAuth2Session(token=token)
    url_endpoint = "https://graph.microsoft.com/v1.0/me/events"
    events = graph_client.post(url=url_endpoint, json=payload)

    return events.json()

На мой взгляд, я использую форму для получения данных от пользователя, поэтому В свою очередь, я могу опубликовать данные пользователя в моем календаре Outlook. Форма выглядит примерно так:

class CalendarFormView(TemplateView):
    template_name = "event-form.html"

    def get(self, request, **kwargs):
        form = CalendarEventForm()
        return render(request, self.template_name, {"form": form})

    def post(self, request):
        form = CalendarEventForm(request.POST)
        token = client.get_token(request)  # does get the token correctly

        if form.is_valid():
            subject = form.cleaned_data["subject"]
            content = form.cleaned_data["body_content"]
            start = form.cleaned_data["start"]
            end = form.cleaned_data["end"]
            location = form.cleaned_data["location"]
            is_all_day = form.cleaned_data["is_all_day"]

            payload = {
                "subject": subject,
                "body": {"contentType": "html", "content": content},
                “start”: {
                    "dateTime": start.strftime("%Y-%m-%dT%H:%M:%S.%f"),
                    "timeZone": "UTC",
                },
                "end": {
                    "dateTime": end.strftime("%Y-%m-%dT%H:%M:%S.%f"),
                    "timeZone": "UTC",
                },
                "location": {"displayName": location},
                "isAllDay": is_all_day,
            }
            event = create_calendar_event(token, json.dumps(payload))
            print(event)

            return render(request, self.template_name, context=event)

        return render(request, "event-form.html", {"form": form})

Я получаю access_token, и данные формы правильно передаются в словарь полезной нагрузки, однако при выводе event я получаю следующее сообщение об ошибке:

{u'error': {u'innerError': {u'date': u'2020-01-20T21:59:24', u'request-id': u'fxbxd5c1-myxx-reqx-idxx-1xxxxab91a'}, u'message': u'Empty Payload. JSON content expected.', u'code': u'BadRequest'}}

Все правильно настроено на стороне Azure / Microsoft Graph. Я могу получить события календаря и запросы POST, когда использую Microsoft Graph Explorer . Проблема только в размещении событий в моем календаре из моего приложения Django.

Есть мысли о том, где я могу пойти не так?

1 Ответ

0 голосов
/ 21 января 2020

Я никогда не пойму, почему нужно потратить время на то, чтобы написать сообщение о стеке, прежде чем ответ волшебным образом придет к вам.

Проблема была в моей почтовой функции:

event = create_calendar_event(token, json.dumps(payload))

Я должен указывать в dict, а не json в качестве полезной нагрузки. замена json.dumps(payload) на payload делает свое дело. Событие должно выглядеть так:

event = create_calendar_event(token, payload)  # remove json.dumps from payload
...