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