예제 #1
0
def save_type(request):
    """Save the current type in the database.

    Args:
        request:

    Returns:

    """
    try:
        type_name = request.POST['typeName']
        template_id = request.POST['templateID']
        xsd_string = request.session['newXmlTemplateCompose']

        response_dict = {}

        # can save as type if new type or from existing type
        if template_id != "new":
            try:
                # check if the type exists, raises exception otherise
                type_api.get(template_id)
            except:
                # the type does not exist
                return _error_response(
                    "Unable to save an existing template as a type.")

        try:
            # remove root from tree if present
            xsd_string = composer_xml_utils.remove_single_root_element(
                xsd_string)
            # build xsd tree
            xsd_tree = XSDTree.build_tree(xsd_string)
            # validate the schema
            error = main_xml_utils.validate_xml_schema(xsd_tree)

            if error is not None:
                return _error_response('This is not a valid XML schema. ' +
                                       error)
        except Exception, e:
            return _error_response('This is not a valid XML schema. ' +
                                   e.message)

        dependencies = _get_dependencies_ids(
            request.session["includedTypesCompose"])

        try:
            # create type version manager
            type_version_manager = TypeVersionManager(title=type_name,
                                                      user=str(
                                                          request.user.id))
            # create type
            type_object = Type(filename=type_name,
                               content=xsd_string,
                               dependencies=dependencies)
            # save type in database
            type_version_manager_api.insert(type_version_manager, type_object)
        except exceptions.NotUniqueError, e:
            return HttpResponseBadRequest(
                "A type with the same name already exists. Please choose another name."
            )
예제 #2
0
    def test_template_get_raises_exception_if_object_does_not_exist(self, mock_get_by_id):
        # Arrange
        mock_absent_id = ObjectId()
        mock_get_by_id.side_effect = exceptions.DoesNotExist('')

        # Act + Assert
        with self.assertRaises(exceptions.DoesNotExist):
            type_api.get(mock_absent_id)
예제 #3
0
    def test_template_get_raises_exception_if_object_does_not_exist(
            self, mock_get_by_id):
        # Arrange
        mock_user = create_mock_user("1", is_superuser=True)
        mock_request = create_mock_request(user=mock_user)
        mock_absent_id = ObjectId()
        mock_get_by_id.side_effect = exceptions.DoesNotExist("")

        # Act + Assert
        with self.assertRaises(exceptions.DoesNotExist):
            type_api.get(mock_absent_id, request=mock_request)
예제 #4
0
def _get_dependencies_ids(list_dependencies):
    """Return list of type ids from list of dependencies.

    Args:
        list_dependencies:

    Returns:

    """
    # declare list of dependencies
    dependencies = []
    # get pattern to match a template download
    pattern = get_template_download_pattern()
    # get all type ids
    for uri in list_dependencies:
        # parse dependency url
        url = urlparse(uri)
        try:
            # get object id from url
            object_id = pattern.match(url.path).group('pk')
            # get type by id, exception raised if not found
            type_object = type_api.get(object_id)
            # add id to list of internal dependencies
            dependencies.append(type_object)
        except:
            # id not found, don't add it to list of dependencies
            pass

    return dependencies
예제 #5
0
def _get_dependencies_ids(list_dependencies, request):
    """Return list of type ids from list of dependencies.

    Args:
        list_dependencies:

    Returns:

    """
    # declare list of dependencies
    dependencies = []
    # get pattern to match a template download
    pattern = get_template_download_pattern()
    # get all type ids
    for uri in list_dependencies:
        # parse dependency url
        url = urlparse(uri)
        try:
            # get object id from url
            object_id = pattern.match(url.path).group("pk")
            # get type by id, exception raised if not found
            type_object = type_api.get(object_id, request=request)
            # add id to list of internal dependencies
            dependencies.append(type_object)
        except Exception as e:
            # id not found, don't add it to list of dependencies
            logger.warning(
                "_get_dependencies_ids threw an exception: {0}".format(str(e)))

    return dependencies
예제 #6
0
def insert_element_sequence(request):
    """Insert the type in the original schema.

    Args:
        request:

    Returns:

    """
    try:
        type_id = request.POST["typeID"]
        type_name = request.POST["typeName"]
        xpath = request.POST["xpath"]
        namespace = request.POST["namespace"]
        path = request.POST["path"]

        # get link to the type to include
        xsd_string = request.session["newXmlTemplateCompose"]

        if type_id == "built_in_type":
            # insert built-in type into xsd string
            new_xsd_str = composer_xml_utils.insert_element_built_in_type(
                xsd_string, xpath, type_name, request=request)
        else:
            # get type from database
            type_object = type_api.get(type_id, request=request)
            # generate include url
            include_url = main_xml_utils._get_schema_location_uri(str(type_id))
            # insert element in xsd string
            new_xsd_str = composer_xml_utils.insert_element_type(
                xsd_string,
                xpath,
                type_object.content,
                type_name,
                include_url,
                request=request,
            )
            # add the id of the type if not already present
            if include_url not in request.session["includedTypesCompose"]:
                request.session["includedTypesCompose"].append(include_url)

        # save the tree in the session
        request.session["newXmlTemplateCompose"] = new_xsd_str

        template = loader.get_template(
            "core_composer_app/user/builder/new_element.html")
        context = {
            "namespace": namespace,
            "path": path,
            "type_name": type_name
        }
        new_element_html = template.render(context)
        return HttpResponse(
            json.dumps({"new_element": new_element_html}),
            content_type="application/json",
        )
    except Exception as e:
        return HttpResponseBadRequest(escape(str(e)),
                                      content_type="application/javascript")
예제 #7
0
    def test_type_get_returns_type(self, mock_get_by_id):
        # Arrange
        type_filename = "Schema"
        mock_type = _create_mock_type(type_filename)

        mock_get_by_id.return_value = mock_type

        # Act
        result = type_api.get(mock_type.id)

        # Assert
        self.assertIsInstance(result, Type)
예제 #8
0
def insert_element_sequence(request):
    """Insert the type in the original schema.

    Args:
        request:

    Returns:

    """
    try:
        type_id = request.POST['typeID']
        type_name = request.POST['typeName']
        xpath = request.POST['xpath']
        namespace = request.POST['namespace']
        path = request.POST['path']

        # get link to the type to include
        xsd_string = request.session['newXmlTemplateCompose']

        if type_id == 'built_in_type':
            # insert built-in type into xsd string
            new_xsd_str = composer_xml_utils.insert_element_built_in_type(
                xsd_string, xpath, type_name)
        else:
            # get type from database
            type_object = type_api.get(type_id)
            # generate include url
            include_url = main_xml_utils._get_schema_location_uri(str(type_id))
            # insert element in xsd string
            new_xsd_str = composer_xml_utils.insert_element_type(
                xsd_string, xpath, type_object.content, type_name, include_url)
            # add the id of the type if not already present
            if include_url not in request.session['includedTypesCompose']:
                request.session['includedTypesCompose'].append(include_url)

        # save the tree in the session
        request.session['newXmlTemplateCompose'] = new_xsd_str

        template = loader.get_template(
            'core_composer_app/user/builder/new_element.html')
        context = {
            'namespace': namespace,
            'path': path,
            'type_name': type_name
        }
        new_element_html = template.render(context)
        return HttpResponse(json.dumps({'new_element': new_element_html}),
                            content_type='application/json')
    except Exception, e:
        return HttpResponseBadRequest(e.message,
                                      content_type='application/javascript')
예제 #9
0
    def test_type_get_returns_type(self, mock_get_by_id):
        # Arrange
        mock_user = create_mock_user("1", is_superuser=True)
        mock_request = create_mock_request(user=mock_user)
        type_filename = "Schema"
        mock_type = _create_mock_type(type_filename)

        mock_get_by_id.return_value = mock_type

        # Act
        result = type_api.get(mock_type.id, request=mock_request)

        # Assert
        self.assertIsInstance(result, Type)
예제 #10
0
    def test_post_owner_is_global(self):
        # Arrange
        user = create_mock_user('1', is_staff=True)

        # Act
        response = RequestMock.do_request_post(views.GlobalTypeList.as_view(),
                                               user,
                                               data=self.data)

        # get type version manager from posted type
        type_id = response.data['id']
        type_object = type_api.get(type_id)
        type_version_manager = vm_api.get_from_version(type_object)

        # Assert
        self.assertEqual(type_version_manager.user, None)
예제 #11
0
    def test_post_owner_is_user(self):
        # Arrange
        user = create_mock_user("1")
        mock_request = create_mock_request(user=user)

        # Act
        response = RequestMock.do_request_post(views.UserTypeList.as_view(),
                                               user,
                                               data=self.data)

        # get type version manager from posted type
        type_id = response.data["id"]
        type_object = type_api.get(type_id, request=mock_request)
        type_version_manager = vm_api.get_from_version(type_object,
                                                       request=mock_request)

        # Assert
        self.assertEqual(type_version_manager.user, user.id)
예제 #12
0
    def get(self, request, *args, **kwargs):
        """ Method GET

        Args:
            request:
            args:
            kwargs:

        Returns:
        """

        # Get types
        if self.administration:
            type_versions = type_version_manager_api.get_all_version_manager()
        else:
            type_versions = type_version_manager_api.get_version_managers_by_user(
                request.user.id)

        detailed_types = []
        for type_version in type_versions:

            # If the version manager doesn't have a user, the type is global.
            if type_version.user is not None:
                detailed_types.append({
                    'type_version':
                    type_version,
                    'type':
                    type_api.get(type_version.current),
                    'user':
                    user_api.get_user_by_id(type_version.user).username,
                    'title':
                    type_version.title
                })

        context = {
            'number_total': len(type_versions),
            'user_form': UserForm(request.user),
            'document': dashboard_constants.FUNCTIONAL_OBJECT_ENUM.TYPE,
            'object_name': dashboard_constants.FUNCTIONAL_OBJECT_ENUM.TYPE,
            'template': dashboard_constants.DASHBOARD_TYPES_TEMPLATE_TABLE,
            'menu': False,
            'user_data': detailed_types
        }

        modals = [
            "core_main_app/admin/templates/list/modals/disable.html",
            EditTemplateVersionManagerView.get_modal_html_path()
        ]

        assets = {
            "css":
            dashboard_constants.CSS_COMMON,
            "js": [{
                "path": 'core_main_app/common/js/templates/list/restore.js',
                "is_raw": False
            }, {
                "path":
                'core_main_app/common/js/templates/list/modals/disable.js',
                "is_raw": False
            },
                   EditTemplateVersionManagerView.get_modal_js_path()]
        }

        return self.common_render(request,
                                  self.template,
                                  context=context,
                                  assets=assets,
                                  modals=modals)
예제 #13
0
    def get(self, request, *args, **kwargs):
        """Method GET

        Args:
            request:
            args:
            kwargs:

        Returns:
        """

        try:
            # Get types
            if self.administration:
                type_versions = type_version_manager_api.get_all_version_manager(
                    request=request
                )
            else:
                type_versions = type_version_manager_api.get_version_managers_by_user(
                    request=request
                )

            detailed_types = []
            for type_version in type_versions:
                # If the version manager doesn't have a user, the type is global.
                if type_version.user is not None:
                    try:
                        username = user_api.get_user_by_id(type_version.user).username
                    except ObjectDoesNotExist:
                        username = "******"
                    detailed_types.append(
                        {
                            "type_version": type_version,
                            "type": type_api.get(type_version.current, request=request),
                            "user": username,
                            "title": type_version.title,
                        }
                    )

            context = {
                "number_total": len(detailed_types),
                "user_form": UserForm(request.user),
                "document": dashboard_constants.FUNCTIONAL_OBJECT_ENUM.TYPE.value,
                "object_name": dashboard_constants.FUNCTIONAL_OBJECT_ENUM.TYPE.value,
                "template": dashboard_constants.DASHBOARD_TYPES_TEMPLATE_TABLE,
                "menu": False,
                "user_data": detailed_types,
            }

            modals = [
                "core_main_app/admin/templates/list/modals/disable.html",
                EditTemplateVersionManagerView.get_modal_html_path(),
            ]

            assets = {
                "css": dashboard_constants.CSS_COMMON,
                "js": [
                    {
                        "path": "core_main_app/common/js/templates/list/restore.js",
                        "is_raw": False,
                    },
                    {
                        "path": "core_main_app/common/js/templates/list/modals/disable.js",
                        "is_raw": False,
                    },
                    EditTemplateVersionManagerView.get_modal_js_path(),
                ],
            }

            return self.common_render(
                request, self.template, context=context, assets=assets, modals=modals
            )
        except AccessControlError:
            return self.common_render(
                request,
                "core_main_app/common/commons/error.html",
                context={"error": "Access Forbidden", "status_code": 403},
            )
예제 #14
0
def save_type(request):
    """Save the current type in the database.

    Args:
        request:

    Returns:

    """
    try:
        type_name = request.POST["typeName"]
        template_id = request.POST["templateID"]
        xsd_string = request.session["newXmlTemplateCompose"]

        response_dict = {}

        # can save as type if new type or from existing type
        if template_id != "new":
            try:
                # check if the type exists, raises exception otherwise
                type_api.get(template_id, request=request)
            except Exception as e:
                # the type does not exist
                logger.warning("save_type threw an exception: {0}".format(
                    str(e)))
                return _error_response(
                    "Unable to save an existing template as a type.")

        try:
            # remove root from tree if present
            xsd_string = composer_xml_utils.remove_single_root_element(
                xsd_string)
            # build xsd tree
            xsd_tree = XSDTree.build_tree(xsd_string)
            # validate the schema
            error = main_xml_utils.validate_xml_schema(xsd_tree,
                                                       request=request)

            if error is not None:
                return _error_response("This is not a valid XML schema. " +
                                       error)
        except Exception as e:
            return _error_response("This is not a valid XML schema. " + str(e))

        dependencies = _get_dependencies_ids(
            request.session["includedTypesCompose"], request=request)

        try:
            # create type version manager
            type_version_manager = TypeVersionManager(title=type_name,
                                                      user=str(
                                                          request.user.id))
            # create type
            type_object = Type(
                filename=type_name,
                content=xsd_string,
                dependencies=dependencies,
                user=str(request.user.id),
            )
            # save type in database
            type_version_manager_api.insert(type_version_manager,
                                            type_object,
                                            request=request)
        except exceptions.NotUniqueError:
            return HttpResponseBadRequest(
                "A type with the same name already exists. Please choose another name."
            )
        except Exception as e:
            return _error_response(escape(str(e)))

        return HttpResponse(json.dumps(response_dict),
                            content_type="application/javascript")
    except Exception as e:
        return HttpResponseBadRequest(escape(str(e)),
                                      content_type="application/javascript")