diff --git a/beat/web/reports/api.py b/beat/web/reports/api.py index 6d06e1f38b360a8a7d66b53f32bbb114eb171f81..608ab89374cbdb47bf69ae40653ad038c8e0b686 100644 --- a/beat/web/reports/api.py +++ b/beat/web/reports/api.py @@ -549,22 +549,24 @@ class ReportResultsAllExperimentsView(CommonContextMixin, generics.RetrieveAPIVi class ReportRSTCompileView(BaseReportActionView): permission_classes = BaseReportActionView.permission_classes + [IsEditable] + def get_queryset(self): + owner_name = self.kwargs.get('owner_name') + report_name = self.kwargs.get('report_name') + + report = get_object_or_404(Report, author__username=owner_name, name=report_name) + + self.check_object_permissions(self.request, report) + + return report + def post(self, request, owner_name, report_name): + report = self.get_queryset() + result = {} - try: - from docutils.core import publish_parts - except ImportError: - if settings.DEBUG: - raise template.TemplateSyntaxError("Error in ReportRSTCompileView: The Python docutils library isn't installed.") - result['html_str'] = force_text(value) - else: - docutils_settings = getattr(settings, "RESTRUCTUREDTEXT_FILTER_SETTINGS", {}) - parts = publish_parts(source=force_bytes(request.data['raw']), writer_name="html4css1", settings_overrides=docutils_settings) - result['html_str'] = force_text(parts["fragment"]) + result['html_str'] = report.compileTextItem(request.data['raw']) return Response(result) - #return BadRequestResponse(result) #---------------------------------------------------------- @@ -573,28 +575,19 @@ class ReportRSTCompileView(BaseReportActionView): class ReportRSTCompileAnonView(views.APIView): permission_classes = [permissions.AllowAny] - def post(self, request, number): + def get_queryset(self): + number = self.kwargs.get('number') + report = get_object_or_404(Report, number=int(number)) - content = json.loads(report.content) - textBlockMap = request.data['raw'].split('|') - rstStr = '' - try: - rstStr = content['groups'][textBlockMap[0]]['reportItems'][int(textBlockMap[1])]['content'] - except: - pass + self.check_object_permissions(self.request, report) + + return report + + def post(self, request, number): + report = self.get_queryset() result = {} - try: - from docutils.core import publish_parts - except ImportError: - if settings.DEBUG: - raise template.TemplateSyntaxError("Error in ReportRSTCompileView: The Python docutils library isn't installed.") - result['html_str'] = force_text(value) - else: - docutils_settings = getattr(settings, "RESTRUCTUREDTEXT_FILTER_SETTINGS", {}) - parts = publish_parts(source=force_bytes(rstStr), writer_name="html4css1", settings_overrides=docutils_settings) - result['html_str'] = force_text(parts["fragment"]) + result['html_str'] = report.compileTextItem(request.data['raw']) return Response(result) - #return BadRequestResponse(result) diff --git a/beat/web/reports/models.py b/beat/web/reports/models.py index e8eb282c14b1196baa56465ca8a4c13ba51881f0..509f816ca1b72e8ed10f2378f19db01790dc164c 100644 --- a/beat/web/reports/models.py +++ b/beat/web/reports/models.py @@ -28,6 +28,11 @@ from django.db import models from django.contrib.auth.models import User from django.core.urlresolvers import reverse +from django.utils.encoding import force_bytes, force_text +from django.conf import settings + +from ..common.utils import validate_restructuredtext +from ..ui.templatetags.markup import restructuredtext from ..algorithms.models import Algorithm from ..experiments.models import Experiment @@ -312,3 +317,27 @@ class Report(models.Model): alias_list = map(lambda x: report_content["alias_experiments"][x], experiments_list) return experiments_list, alias_list + + # the itemStr can either be: + def compileTextItem(self, itemStr): + content = json.loads(self.content) + rstStr = '' + + try: + textBlockMap = itemStr.split('|') + rstStr = content['groups'][textBlockMap[0]]['reportItems'][int(textBlockMap[1])]['content'] + except KeyError: + rstStr = itemStr + + result = {} + + try: + from docutils.core import publish_parts + except ImportError: + if settings.DEBUG: + raise template.TemplateSyntaxError("Error in ReportRSTCompileView: The Python docutils library isn't installed.") + return rstStr + else: + docutils_settings = getattr(settings, "RESTRUCTUREDTEXT_FILTER_SETTINGS", {}) + parts = publish_parts(source=force_bytes(rstStr), writer_name="html4css1", settings_overrides=docutils_settings) + return force_text(parts["fragment"])