Back to tasks
Junior — Senior
52
Ревью и отладка Django‑кода
Companies where asked:
NDA COMPANY
Task condition
livecode
Требуется выполнить проверку качества и корректность работы представленного кода Django‑приложения, а при необходимости исправить найденные ошибки.
# push/models.py
from django.db import models
import enums
class PlannedPush(models.Model):
title = models.CharField(max_length=255)
body = models.TextField()
is_promo = models.BooleanField(default=False)
status = models.CharField(max_length=255, choices=enums.PushStatus.choises(), default=enums.PushStatus.CREATED)
created_at = models.DateTimeField(auto_now_add=True)
updated_at = models.DateTimeField(auto_now=True)
class Push(models.Model):
planned_push = models.ForeignKey(PlannedPush, on_delete=models.CASCADE)
user = models.ForeignKey('users.User', on_delete=models.CASCADE)
status = models.CharField(
max_length=55,
choices=enums.PushStatus.choises(),
default=enums.PushStatus.CREATED
)
sent_at = models.DateTimeField(null=True)
created_at = models.DateTimeField(auto_now_add=True)
updated_at = models.DateTimeField(auto_now=True)
# push/views.py
from django.http import JsonResponse
import json
from .models import PlannedPush
from .models import Push
from users.models import User
from .utils.ios_push import send_push_to_ios
def create_push(request):
data = json.loads(request.body)
try:
planned_push = PlannedPush.objects.create(
title=data['title'],
body=data['body'],
is_promo=data['is_promo']
)
except KeyError as e:
print(e)
return JsonResponse({'error': 'missing required field'}, status=status.HTTP_400_BAD_REQUEST)
return JsonResponse({'id': planned_push.id}, status=status.HTTP_201_CREATED)
def send_push(request):
data = json.loads(request.body)
try:
planned_push = PlannedPush.objects.get(id=data['planned_push_id'])
except PlannedPush.DoesNotExist:
return JsonResponse({'error': 'planned push not found'}, status=status.HTTP_404_NOT_FOUND)
users = User.objects.all()
for user in users:
if not user.user_settings_set.first().push_enabled:
continue
push = Push.objects.create(
planned_push=planned_push,
user=user
)
for device in user.devices_set.filter(device_type='ios'):
try:
is_sent = send_push_to_ios(device, push.planned_push.title, push.planned_push.body)
except Exception as e:
print(e)
push.status = enums.PushStatus.ERROR
push.save()
continue
if is_sent:
push.status = enums.PushStatus.SENT
push.sent_at = timezone.now()
push.save()
break
planned_push.status = enums.PushStatus.SENT
return JsonResponse({'status': 'ok'}, status=status.HTTP_200_OK)