Coverage for cookbook/views/telegram.py: 36%
42 statements
« prev ^ index » next coverage.py v7.4.0, created at 2023-12-29 00:47 +0100
« prev ^ index » next coverage.py v7.4.0, created at 2023-12-29 00:47 +0100
1import json
2import traceback
4import requests
5from django.http import JsonResponse
6from django.shortcuts import get_object_or_404
7from django.views.decorators.csrf import csrf_exempt
9from cookbook.helper.ingredient_parser import IngredientParser
10from cookbook.helper.permission_helper import group_required
11from cookbook.models import ShoppingListEntry, TelegramBot
14@group_required('user')
15def setup_bot(request, pk):
16 bot = get_object_or_404(TelegramBot, pk=pk, space=request.space)
18 hook_url = f'{request.build_absolute_uri("/")}telegram/hook/{bot.webhook_token}/'
20 create_response = requests.get(f'https://api.telegram.org/bot{bot.token}/setWebhook?url={hook_url}')
21 info_response = requests.get(f'https://api.telegram.org/bot{bot.token}/getWebhookInfo')
23 return JsonResponse({'hook_url': hook_url, 'create_response': json.loads(create_response.content.decode()),
24 'info_response': json.loads(info_response.content.decode())}, json_dumps_params={'indent': 4})
27@group_required('user')
28def remove_bot(request, pk):
29 bot = get_object_or_404(TelegramBot, pk=pk, space=request.space)
31 remove_response = requests.get(f'https://api.telegram.org/bot{bot.token}/deleteWebhook')
32 info_response = requests.get(f'https://api.telegram.org/bot{bot.token}/getWebhookInfo')
34 return JsonResponse({'remove_response': json.loads(remove_response.content.decode()),
35 'info_response': json.loads(info_response.content.decode())}, json_dumps_params={'indent': 4})
38@csrf_exempt
39def hook(request, token):
40 try:
41 tb = get_object_or_404(TelegramBot, webhook_token=token)
43 data = json.loads(request.body.decode())
45 if tb.chat_id == '':
46 tb.chat_id = data['message']['chat']['id']
47 tb.save()
49 if tb.chat_id == str(data['message']['chat']['id']):
50 request.space = tb.space # TODO this is likely a bad idea. Verify and test
51 request.user = tb.created_by
52 ingredient_parser = IngredientParser(request, False)
53 amount, unit, food, note = ingredient_parser.parse(data['message']['text'])
54 f = ingredient_parser.get_food(food)
55 u = ingredient_parser.get_unit(unit)
57 ShoppingListEntry.objects.create(food=f, unit=u, amount=amount, created_by=request.user, space=request.space)
59 return JsonResponse({'data': data['message']['text']})
60 except Exception:
61 traceback.print_exc()
63 return JsonResponse({})