# -*- coding: utf-8 -*- # # Iterativ GmbH # http://www.iterativ.ch/ # # Copyright (c) 2018 Iterativ GmbH. All rights reserved. # # Created on 25.09.18 # @author: Ramon Wenger import bleach import re from api.utils import get_object from assignments.models import Assignment from books.models import ContentBlock class AssignmentParameterException(Exception): pass def newlines_to_paragraphs(text): parts = re.split(r'[\r\n]+', text) paragraphs = ['

{}

'.format(p.strip()) for p in parts] return '\n'.join(paragraphs) ALLOWED_BLOCKS = ( 'text_block', 'student_entry', 'image_url_block', 'link_block', 'video_block', 'assignment', 'document_block', ) def handle_content_block(content, context=None, module=None, allowed_blocks=ALLOWED_BLOCKS): # todo: add all the content blocks # todo: sanitize user inputs! if content['type'] not in allowed_blocks: return if content['type'] == 'text_block': return { 'type': 'text_block', 'value': { 'text': newlines_to_paragraphs(bleach.clean(content['value']['text'], strip=True)) }} elif content['type'] == 'assignment': if module is None: raise AssignmentParameterException('Module is missing for assignment') # todo: define better exception if context is None: raise AssignmentParameterException('Context is missing for assignment') value = content['value'] if value.get('id') is not None: assignment = get_object(Assignment, value.get('id')) assignment.title = value.get('title') assignment.assignment = value.get('assignment') assignment.save() else: assignment = Assignment.objects.create( title=value.get('title'), assignment=value.get('assignment'), owner=context.user, module=module, user_created=True ) return { 'type': 'assignment', 'value': { 'assignment_id': assignment.id }} elif content['type'] == 'image_url_block': return { 'type': 'image_url_block', 'value': { 'url': bleach.clean(content['value']['url']) }} elif content['type'] == 'link_block': return { 'type': 'link_block', 'value': { 'text': bleach.clean(content['value']['text']), 'url': bleach.clean(content['value']['url']) } } elif content['type'] == 'video_block': return { 'type': 'video_block', 'value': { 'url': bleach.clean(content['value']['url']) }} elif content['type'] == 'document_block': return { 'type': 'document_block', 'value': { 'url': bleach.clean(content['value']['url']) }} return None def set_user_defined_block_type(block_type): if block_type == ContentBlock.TASK.upper(): return ContentBlock.TASK else: return ContentBlock.NORMAL