From cffcf182c56e038c12514fe95036eb0e6ed92190 Mon Sep 17 00:00:00 2001 From: Jaden Diefenbaugh <blakcap@users.noreply.github.com> Date: Mon, 24 Apr 2017 14:23:21 +0200 Subject: [PATCH] refactor compileRST code to Report model, actually use perms in CompileRST api views --- beat/web/reports/api.py | 53 +++++++++++++++++--------------------- beat/web/reports/models.py | 29 +++++++++++++++++++++ 2 files changed, 52 insertions(+), 30 deletions(-) diff --git a/beat/web/reports/api.py b/beat/web/reports/api.py index 6d06e1f38..608ab8937 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 e8eb282c1..509f816ca 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"]) -- GitLab