import requests from django.conf import settings from django.contrib.auth.decorators import login_required from django.core.exceptions import ImproperlyConfigured from django.http import Http404, HttpResponse, HttpResponseBadRequest, HttpResponseForbidden, HttpResponseRedirect from django.utils.translation import gettext as _ from django.views.generic import View from judge.models import Submission __all__ = ['rejudge_submission', 'DetectTimezone'] @login_required def rejudge_submission(request): if request.method != 'POST' or not request.user.has_perm('judge.rejudge_submission') or \ not request.user.has_perm('judge.edit_own_problem'): return HttpResponseForbidden() if 'id' not in request.POST or not request.POST['id'].isdigit(): return HttpResponseBadRequest() try: submission = Submission.objects.get(id=request.POST['id']) except Submission.DoesNotExist: return HttpResponseBadRequest() if not request.user.has_perm('judge.edit_all_problem') and \ not submission.problem.is_editor(request.profile): return HttpResponseForbidden() submission.judge(rejudge=True) redirect = request.POST.get('path', None) return HttpResponseRedirect(redirect) if redirect else HttpResponse('success', content_type='text/plain') class DetectTimezone(View): def askgeo(self, lat, long): if not hasattr(settings, 'ASKGEO_ACCOUNT_ID') or not hasattr(settings, 'ASKGEO_ACCOUNT_API_KEY'): raise ImproperlyConfigured() data = requests.get('http://api.askgeo.com/v1/%s/%s/query.json?databases=TimeZone&points=%f,%f' % (settings.ASKGEO_ACCOUNT_ID, settings.ASKGEO_ACCOUNT_API_KEY, lat, long)).json() try: return HttpResponse(data['data'][0]['TimeZone']['TimeZoneId'], content_type='text/plain') except (IndexError, KeyError): return HttpResponse(_('Invalid upstream data: %s') % data, content_type='text/plain', status=500) def geonames(self, lat, long): if not hasattr(settings, 'GEONAMES_USERNAME'): raise ImproperlyConfigured() data = requests.get('http://api.geonames.org/timezoneJSON?lat=%f&lng=%f&username=%s' % (lat, long, settings.GEONAMES_USERNAME)).json() try: return HttpResponse(data['timezoneId'], content_type='text/plain') except KeyError: return HttpResponse(_('Invalid upstream data: %s') % data, content_type='text/plain', status=500) def default(self, lat, long): raise Http404() def get(self, request, *args, **kwargs): backend = settings.TIMEZONE_DETECT_BACKEND try: lat, long = float(request.GET['lat']), float(request.GET['long']) except (ValueError, KeyError): return HttpResponse(_('Bad latitude or longitude'), content_type='text/plain', status=404) return { 'askgeo': self.askgeo, 'geonames': self.geonames, }.get(backend, self.default)(lat, long)