def post(self, request, *args, **kwargs): if request.is_ajax(): image = get_object_or_404(Image, pk=kwargs.get('pk')) ret = None try: # Only delete it if it's in the future and from the same # judge. iotd = Iotd.objects.get(image=image) if iotd.date <= datetime.now().date(): ret = { 'iotd': iotd.pk, 'date': formats.date_format(iotd.date, "SHORT_DATE_FORMAT"), 'used_today': iotd_elections_today(request.user), 'error': ugettext("You cannot unelect a past or current IOTD."), } elif iotd.judge != request.user: ret = { 'iotd': iotd.pk, 'date': formats.date_format(iotd.date, "SHORT_DATE_FORMAT"), 'used_today': iotd_elections_today(request.user), 'error': ugettext("You cannot unelect an IOTD elected by another judge."), } else: iotd.delete() ret = { 'used_today': iotd_elections_today(request.user), } except Iotd.DoesNotExist: max_days = settings.IOTD_JUDGEMENT_MAX_FUTURE_DAYS for date in (datetime.now().date() + timedelta(n) for n in range(max_days)): try: iotd = Iotd.objects.get(date=date) except Iotd.DoesNotExist: may, reason = may_elect_iotd(request.user, image) if may: iotd = Iotd.objects.create( judge=request.user, image=image, date=date) ret = { 'iotd': iotd.pk, 'date': formats.date_format(iotd.date, "SHORT_DATE_FORMAT"), 'used_today': iotd_elections_today(request.user), } else: ret = { 'error': reason, } break if not ret: ret = { 'error': ugettext("All IOTD slots for the next %(days)s days are already filled.") % { 'days': max_days, }, } return self.render_json_response(ret) return HttpResponseForbidden()
def create(self, request, *args, **kwargs): try: image = Image.objects.get(pk=str(request.data.get('image'))) may, reason = may_elect_iotd(request.user, image) if not may: return HttpResponseForbidden(reason) return super().create(request, *args, **kwargs) except ValidationError as e: return HttpResponseForbidden(str(e))
def may_not_elect_reason(user, image): may, reason = may_elect_iotd(user, image) return reason
def may_elect(user, image): may, reason = may_elect_iotd(user, image) return may
def clean(self): may, reason = may_elect_iotd(self.judge, self.image) if not may: raise ValidationError(reason)