diff --git a/ietf/doc/models.py b/ietf/doc/models.py index 8a171d0c4..76919354b 100644 --- a/ietf/doc/models.py +++ b/ietf/doc/models.py @@ -3,7 +3,6 @@ import datetime import logging import os -#import re from django.db import models from django.core import checks @@ -22,7 +21,7 @@ from ietf.name.models import ( DocTypeName, DocTagName, StreamName, IntendedStdL from ietf.person.models import Email, Person from ietf.utils import log from ietf.utils.admin import admin_link -#from ietf.utils.rfcmarkup import markup +from ietf.utils.rfcmarkup import markup from ietf.utils.validators import validate_no_control_chars logger = logging.getLogger('django') @@ -100,10 +99,13 @@ class DocumentInfo(models.Model): def get_file_path(self): if not hasattr(self, '_cached_file_path'): if self.type_id == "draft": - if self.get_state_slug() == "rfc": - self._cached_file_path = settings.RFC_PATH - else: + if self.is_dochistory(): self._cached_file_path = settings.INTERNET_DRAFT_PATH + else: + if self.get_state_slug() == "rfc": + self._cached_file_path = settings.RFC_PATH + else: + self._cached_file_path = settings.INTERNET_DRAFT_PATH elif self.type_id in ("agenda", "minutes", "slides", "bluesheets") and self.meeting_related(): doc = self.doc if isinstance(self, DocHistory) else self if doc.session_set.exists(): @@ -124,16 +126,21 @@ class DocumentInfo(models.Model): def get_base_name(self): if not hasattr(self, '_cached_base_name'): if self.type_id == 'draft': - if self.get_state_slug() == 'rfc': - self._cached_base_name = "%s.txt" % self.canonical_name() + if self.is_dochistory(): + self._cached_base_name = "%s-%s.txt" % (self.doc.name, self.rev) else: - self._cached_base_name = "%s-%s.txt" % (self.name, self.rev) + if self.get_state_slug() == 'rfc': + self._cached_base_name = "%s.txt" % self.canonical_name() + else: + self._cached_base_name = "%s-%s.txt" % (self.name, self.rev) elif self.type_id in ["slides", "agenda", "minutes", "bluesheets", ] and self.meeting_related(): if self.external_url: # we need to remove the extension for the globbing below to work self._cached_base_name = self.external_url else: self._cached_base_name = "%s.txt" % self.canonical_name() # meeting materials are unversioned at the moment + elif self.type_id == 'review': + self._cached_base_name = "%s.txt" % self.name else: if self.rev: self._cached_base_name = "%s-%s.txt" % (self.canonical_name(), self.rev) @@ -146,6 +153,16 @@ class DocumentInfo(models.Model): self._cached_file_name = os.path.join(self.get_file_path(), self.get_base_name()) return self._cached_file_name + def revisions(self): + revisions = [] + doc = self.doc if isinstance(self, DocHistory) else self + for e in doc.docevent_set.filter(type='new_revision').distinct().order_by("time", "id"): + if e.rev and not e.rev in revisions: + revisions.append(e.rev) + if not doc.rev in revisions: + revisions.append(doc.rev) + return revisions + def href(self, meeting=None): """ Returns an url to the document text. This differs from .get_absolute_url(), @@ -290,6 +307,11 @@ class DocumentInfo(models.Model): else: return state.name + def is_rfc(self): + if not hasattr(self, '_cached_is_rfc'): + self._cached_is_rfc = self.pk and self.type_id == 'draft' and self.states.filter(type='draft',slug='rfc').exists() + return self._cached_is_rfc + def author_list(self): return ", ".join(email.address for email in self.authors.all()) @@ -383,8 +405,35 @@ class DocumentInfo(models.Model): def all_related_that_doc(self, relationship, related=None): return list(set([x.target for x in self.all_relations_that_doc(relationship)])) + def replaces(self): + return set([ r.document for r in self.related_that_doc("replaces")]) + def replaced_by(self): - return [ r.document for r in self.related_that("replaces") ] + return set([ r.document for r in self.related_that("replaces") ]) + + def text(self): + path = self.get_file_name() + try: + with open(path, 'rb') as file: + raw = file.read() + except IOError as e: + logger.error("IOError for %s: %s", path, e, exc_info=e) + return None + try: + text = raw.decode('utf-8') + except UnicodeDecodeError as e: + text = raw.decode('latin-1') + # + return text + + def htmlized(self): + text = self.text() + html = None + if text: + # The path here has to match the urlpattern for htmlized documents + html = markup(text, path=settings.HTMLIZER_URL_PREFIX) + #html = re.sub(r'