def problem_data_file(request, problem, path): object = get_object_or_404(Problem, code=problem) if not object.is_editable_by(request.user): raise Http404() problem_dir = problem_data_storage.path(problem) if os.path.commonpath((problem_data_storage.path( os.path.join(problem, path)), problem_dir)) != problem_dir: raise Http404() response = HttpResponse() if hasattr(settings, 'DMOJ_PROBLEM_DATA_INTERNAL'): url_path = '%s/%s/%s' % (settings.DMOJ_PROBLEM_DATA_INTERNAL, problem, path) else: url_path = None try: add_file_response(request, response, url_path, os.path.join(problem, path), problem_data_storage) except IOError: raise Http404() response['Content-Type'] = 'application/octet-stream' return response
def get(self, request, *args, **kwargs): if not HAS_PDF: raise Http404() language = kwargs.get('language', self.request.LANGUAGE_CODE) if language not in self.languages: raise Http404() problem = self.get_object() try: trans = problem.translations.get(language=language) except ProblemTranslation.DoesNotExist: trans = None cache = os.path.join(settings.DMOJ_PDF_PROBLEM_CACHE, '%s.%s.pdf' % (problem.code, language)) if not os.path.exists(cache): self.logger.info('Rendering: %s.%s.pdf', problem.code, language) with DefaultPdfMaker() as maker, translation.override(language): problem_name = problem.name if trans is None else trans.name maker.html = get_template('problem/raw.html').render({ 'problem': problem, 'problem_name': problem_name, 'description': problem.description if trans is None else trans.description, 'url': request.build_absolute_uri(), 'math_engine': maker.math_engine, }).replace('"//', '"https://').replace("'//", "'https://") maker.title = problem_name assets = ['style.css', 'pygment-github.css'] if maker.math_engine == 'jax': assets.append('mathjax_config.js') for file in assets: maker.load(file, os.path.join(settings.DMOJ_RESOURCES, file)) maker.make() if not maker.success: self.logger.error('Failed to render PDF for %s', problem.code) return HttpResponse(maker.log, status=500, content_type='text/plain') shutil.move(maker.pdffile, cache) response = HttpResponse() if hasattr(settings, 'DMOJ_PDF_PROBLEM_INTERNAL'): url_path = '%s/%s.%s.pdf' % (settings.DMOJ_PDF_PROBLEM_INTERNAL, problem.code, language) else: url_path = None add_file_response(request, response, url_path, cache) response['Content-Type'] = 'application/pdf' response['Content-Disposition'] = 'inline; filename=%s.%s.pdf' % (problem.code, language) return response
def get(self, request, *args, **kwargs): if not os.path.exists(self.data_path): raise Http404() response = HttpResponse() if hasattr(settings, 'DMOJ_USER_DATA_INTERNAL'): url_path = '%s/%s.zip' % (settings.DMOJ_USER_DATA_INTERNAL, self.request.profile.id) else: url_path = None add_file_response(request, response, url_path, self.data_path) response['Content-Type'] = 'application/zip' response['Content-Disposition'] = 'attachment; filename=%s-data.zip' % self.request.user.username return response