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

1import json 

2import traceback 

3 

4import requests 

5from django.http import JsonResponse 

6from django.shortcuts import get_object_or_404 

7from django.views.decorators.csrf import csrf_exempt 

8 

9from cookbook.helper.ingredient_parser import IngredientParser 

10from cookbook.helper.permission_helper import group_required 

11from cookbook.models import ShoppingListEntry, TelegramBot 

12 

13 

14@group_required('user') 

15def setup_bot(request, pk): 

16 bot = get_object_or_404(TelegramBot, pk=pk, space=request.space) 

17 

18 hook_url = f'{request.build_absolute_uri("/")}telegram/hook/{bot.webhook_token}/' 

19 

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') 

22 

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}) 

25 

26 

27@group_required('user') 

28def remove_bot(request, pk): 

29 bot = get_object_or_404(TelegramBot, pk=pk, space=request.space) 

30 

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') 

33 

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}) 

36 

37 

38@csrf_exempt 

39def hook(request, token): 

40 try: 

41 tb = get_object_or_404(TelegramBot, webhook_token=token) 

42 

43 data = json.loads(request.body.decode()) 

44 

45 if tb.chat_id == '': 

46 tb.chat_id = data['message']['chat']['id'] 

47 tb.save() 

48 

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) 

56 

57 ShoppingListEntry.objects.create(food=f, unit=u, amount=amount, created_by=request.user, space=request.space) 

58 

59 return JsonResponse({'data': data['message']['text']}) 

60 except Exception: 

61 traceback.print_exc() 

62 

63 return JsonResponse({})