def document_url(self): from bluebottle.utils.model_dispatcher import get_project_document_model document_model = get_project_document_model() content_type = ContentType.objects.get_for_model(document_model).id # pk may be unset if not saved yet, in which case no url can be # generated. if self.pk is not None: return reverse('document_download_detail', kwargs={'content_type': content_type, 'pk': self.pk or 1}) return None
from bluebottle.geo.models import Country from bluebottle.utils.serializers import MetaField from bluebottle.bluebottle_drf2.serializers import OEmbedField from bluebottle.bb_projects.serializers import ProjectThemeSerializer from bluebottle.donations.models import Donation from bluebottle.utils.model_dispatcher import get_project_model, get_project_document_model from bluebottle.bb_projects.serializers import (ProjectSerializer as BaseProjectSerializer, ManageProjectSerializer as BaseManageProjectSerializer, ProjectPreviewSerializer as BaseProjectPreviewSerializer) from bs4 import BeautifulSoup PROJECT_MODEL = get_project_model() PROJECT_DOCUMENT_MODEL = get_project_document_model() class StoryField(serializers.WritableField): def to_native(self, value): """ Reading / Loading the story field """ return value def from_native(self, data): """ Saving the story text """ #Convert > and < back to HTML tags so Beautiful Soup can clean unwanted tags. #Script tags are sent by redactor as "<;script>;", Iframe tags have just one semicolon. data = data.replace("<;", "<").replace(">;", ">").replace("<", "<").replace(">", ">") soup = BeautifulSoup(data, "html.parser") [s.extract() for s in soup(['script', 'iframe'])] return str(soup)