Beispiel #1
0
async def history(context, request):
    bhr = await get_behavior(context, ICMSBehavior)
    container = get_current_container()
    result = []
    context_url = getMultiAdapter((context, request), IAbsoluteURL)()
    container_url = getMultiAdapter((container, request), IAbsoluteURL)()
    for ident, hist_data in enumerate(bhr.history):
        actor = hist_data.get("actor", "")
        type_ = hist_data.get("type", "")
        title = hist_data.get("title", "")
        value = {
            "@id": f"{context_url}/@history/{ident}",
            "action": title,
            "comments": hist_data.get("comments", ""),
            "time": hist_data.get("time", ""),
            "transition_title": title,
            "type": type_,
            "actor": {
                "@id": f"{container_url}/@users/{actor}",
                "fullname": actor,
                "id": actor,
                "username": actor
            }
        }

        data = hist_data.get("data", {})
        if type_ == 'versioning':
            value['may_revert']: False
            value['version']: ident
        elif type_ == "workflow":
            value['state_title'] = data.get('review_state')
            value['review_state'] = data.get('review_state')
        result.append(value)
    return result
        
    async def __call__(self):
        result = {'type': self.field_type}
        for schema in implementedBy(self.field.__class__).flattened():
            self.field_attributes.update(getFields(schema))
        for attribute_name in sorted(self.field_attributes.keys()):
            attribute_field = self.field_attributes[attribute_name]
            if attribute_name in self.filtered_attributes:
                continue

            element_name = attribute_field.__name__
            attribute_field = attribute_field.bind(self.field)
            force = (element_name in self.forced_fields)

            value = attribute_field.get(self.field)

            # For 'default', 'missing_value' etc, we want to validate against
            # the imported field type itself, not the field type of the
            # attribute
            if element_name in self.field_type_attributes or \
                    element_name in self.non_validated_field_type_attributes:
                attribute_field = self.field

            text = None
            if isinstance(value, bytes):
                text = value.decode('utf-8')
            elif isinstance(value, str):
                text = value
            elif IField.providedBy(value):
                serializer = getMultiAdapter((value, self.field, self.request),
                                             ISchemaFieldSerializeToJson)
                text = await serializer()
            elif value is not None and (force
                                        or value != self.field.missing_value):
                text = IValueToJson(value)

            # handle i18n
            # if isinstance(value, Message):
            #     child.set(ns('domain', I18N_NAMESPACE), value.domain)
            #     if not value.default:
            #         child.set(ns('translate', I18N_NAMESPACE), '')
            #     else:
            #         child.set(ns('translate', I18N_NAMESPACE), child.text)
            #         child.text = converter.toUnicode(value.default)

            if text:
                if attribute_name == 'value_type':
                    attribute_name = 'items'
                result[attribute_name] = text

        if result['type'] == 'object':
            if IJSONField.providedBy(self.field):
                result['properties'] = self.field.json_schema
            else:
                schema_serializer = getMultiAdapter(
                    (self.field.schema, self.request), ISchemaSerializeToJson)
                result['properties'] = await schema_serializer()
        return result
Beispiel #3
0
    async def __call__(self):
        if self.key is _marker:
            # No option to write the root of registry
            return ErrorResponse('InvalidRequest', 'Needs the registry key')

        await lock_object(self.request.container_settings)

        data = await self.request.json()
        if 'value' in data:
            value = data['value']
        else:
            value = data

        assert '.' in self.key, 'Registry key must be dotted.iface.name.fieldname'  # noqa
        iface, name = self.key.rsplit('.', 1)
        iface = resolve_dotted_name(iface)
        field = iface[name]

        try:
            new_value = getMultiAdapter((value, field), IJSONToValue)
        except ComponentLookupError:
            return ErrorResponse('DeserializationError',
                                 'Cannot deserialize type {}'.format(
                                     str(self.field)),
                                 status=501)

        try:
            self.request.container_settings[self.key] = new_value
        except DeserializationError as e:
            return ErrorResponse('DeserializationError',
                                 str(e),
                                 exc=e,
                                 status=400)

        return Response(response={}, status=204)
Beispiel #4
0
def test_all(dummy_request):
    mapping = [
        (schema.Object(schema=IResource),
         serialize_schema_field.DefaultSchemaFieldSerializer),
        (schema.Text(),
         serialize_schema_field.DefaultTextSchemaFieldSerializer),
        (schema.TextLine(),
         serialize_schema_field.DefaultTextLineSchemaFieldSerializer),
        (schema.Float(),
         serialize_schema_field.DefaultFloatSchemaFieldSerializer),
        (schema.Int(), serialize_schema_field.DefaultIntSchemaFieldSerializer),
        (schema.Bool(),
         serialize_schema_field.DefaultBoolSchemaFieldSerializer),
        (schema.List(),
         serialize_schema_field.DefaultCollectionSchemaFieldSerializer),
        (schema.Choice(values=('one', 'two')),
         serialize_schema_field.DefaultChoiceSchemaFieldSerializer),
        (schema.Object(schema=IResource),
         serialize_schema_field.DefaultObjectSchemaFieldSerializer),
        (RichText(),
         serialize_schema_field.DefaultRichTextSchemaFieldSerializer),
        (schema.Date(),
         serialize_schema_field.DefaultDateSchemaFieldSerializer),
        (schema.Time(),
         serialize_schema_field.DefaultTimeSchemaFieldSerializer),
        (schema.Dict(),
         serialize_schema_field.DefaultDictSchemaFieldSerializer),
        (schema.Datetime(),
         serialize_schema_field.DefaultDateTimeSchemaFieldSerializer),
    ]
    container = Container()
    for field, klass in mapping:
        adapter = getMultiAdapter((field, container, dummy_request),
                                  interface=ISchemaFieldSerializeToJson)
        assert isinstance(adapter, klass)
Beispiel #5
0
async def render_docs_index(context, request):
    if app_settings['swagger'].get('index_html'):
        index_file = app_settings['swagger']['index_html']
    else:
        index_file = os.path.join(here, "index.html")
    with open(index_file) as fi:
        html = fi.read()

    template = Template(html)
    swagger_settings = app_settings["swagger"]
    url = swagger_settings["base_url"] or request.headers.get(
        "X-VirtualHost-Monster")
    if url is None:
        try:
            url = getMultiAdapter((context, request), IAbsoluteURL)()
        except ComponentLookupError:
            url = "{}://{}".format(get_scheme(request), request.host)
    swagger_settings["initial_swagger_url"] = url
    return template.render(
        app_settings=app_settings,
        request=request,
        swagger_settings=swagger_settings,
        base_url=url,
        static_url="{}/swagger_static/".format(url if url != "/" else ""),
    )
Beispiel #6
0
    async def __call__(self):
        serializer = getMultiAdapter(
            (self.value, self.request), IFactorySerializeToJson
        )

        result = await serializer()
        return result
Beispiel #7
0
    async def __call__(self):
        if not hasattr(self, 'value'):
            self.value = [x[1] for x in getUtilitiesFor(IResourceFactory)]
        if isinstance(self.value, list):
            result = []
            for x in self.value:
                serializer = getMultiAdapter((x, self.request),
                                             IFactorySerializeToJson)

                result.append(await serializer())
        else:
            serializer = getMultiAdapter((self.value, self.request),
                                         IFactorySerializeToJson)

            result = await serializer()
        return result
Beispiel #8
0
async def add_comment(context, request):
    payload = await request.json()
    bhr = ICMSBehavior(context)
    if not bhr.allow_discussion:
        raise HTTPUnauthorized(content={"text": "Not available option"})
    await bhr.load()

    if bhr.comments is None:
        bhr.comments = {}

    user_id = get_authenticated_user_id()
    comment_uuid = uuid.uuid4().hex
    bhr.comments[comment_uuid] = {
        "@parent": None,
        "author_name": None,
        "author_username": user_id,
        "creation_date": datetime.now().isoformat(),
        "in_reply_to": None,
        "is_deletable": True,
        "is_editable": True,
        "modification_date": datetime.now().isoformat(),
        "text": {
            "data": payload.get("text", ""),
            "mime-type": "text/plain"
        },
        "user_notification": None,
    }

    bhr.register()

    url = getMultiAdapter((context, request), IAbsoluteURL)()
    headers = {"Location": url + "/@comments/" + comment_uuid}
    return Response(status=204, headers=headers)
Beispiel #9
0
async def render_docs_index(context, request):
    if app_settings['swagger'].get('index_html'):
        index_file = app_settings['swagger']['index_html']
    else:
        index_file = os.path.join(here, "index.html")
    with open(index_file) as fi:
        html = fi.read()

    swagger_settings = app_settings["swagger"]
    url = swagger_settings["base_url"] or request.headers.get(
        "X-VirtualHost-Monster")
    if url is None:
        try:
            url = getMultiAdapter((context, request), IAbsoluteURL)()
        except ComponentLookupError:
            url = "{}://{}".format(get_request_scheme(request), request.host)
    swagger_settings["initial_swagger_url"] = url

    if swagger_settings['authentication_allowed']:
        auth = AUTH_HTML
    else:
        auth = ''
    return html.format(
        app_settings=app_settings,
        request=request,
        swagger_settings=json.dumps(swagger_settings),
        base_url=url,
        static_url="{}/swagger_static/".format(url if url != "/" else ""),
        auth=auth,
        title=swagger_settings['base_configuration']['info']['title'])
Beispiel #10
0
async def modify_comment(context, request):
    payload = await request.json()
    comment_id = request.matchdict["comment_id"]
    bhr = ICMSBehavior(context)
    if not bhr.allow_discussion:
        raise HTTPUnauthorized(content={"text": "Not available option"})
    await bhr.load()

    if comment_id not in bhr.comments:
        raise ErrorResponse("InvalidComment",
                            "This comment does not exist",
                            status=412)

    user_id = get_authenticated_user_id()
    comment = bhr.comments[comment_id]

    # TODO: We need ?
    if user_id != comment["author_username"]:
        raise HTTPUnauthorized(content={"text": "Not the author"})

    comment["text"]["data"] = payload.get("text", "")
    comment["modification_date"] = datetime.now().isoformat()

    bhr.register()

    url = getMultiAdapter((context, request), IAbsoluteURL)()
    headers = {"Location": url + "/@comments/" + comment_id}
    return Response(status=204, headers=headers)
Beispiel #11
0
async def test_serialize_resource_omit_behavior(dummy_request):
    content = create_content()
    serializer = getMultiAdapter((content, dummy_request),
                                 IResourceSerializeToJson)
    result = await serializer(
        omit=['guillotina.behaviors.dublincore.IDublinCore'])
    assert 'guillotina.behaviors.dublincore.IDublinCore' not in result
Beispiel #12
0
 async def __call__(self, json_value):
     if self.request.resource:
         fti = queryUtility(
             IFactory, name=self.request.resource.type_name)
         schema_summary = getMultiAdapter(
             (fti, self.request), IResourceSerializeToJson)
         json_value['schema'] = await schema_summary()
     return json_value
Beispiel #13
0
    def __init__(self, manager, request=None, loop=None):
        self._txn_time = None
        self._tid = None
        self.status = Status.ACTIVE

        # Transaction Manager
        self._manager = manager

        # List of objects added
        # needs to be ordered because content inserted after other might
        # reference each other
        self.added = OrderedDict()
        self.modified = {}
        self.deleted = {}

        # OIDS to invalidate
        self._objects_to_invalidate = []

        # List of (hook, args, kws) tuples added by addBeforeCommitHook().
        self._before_commit = []

        # List of (hook, args, kws) tuples added by addAfterCommitHook().
        self._after_commit = []

        logger.debug("new transaction")

        # Connection to DB
        self._db_conn = None
        # Transaction on DB
        self._db_txn = None
        # Lock on the transaction
        # some databases need to lock during queries
        # this provides a lock for each transaction
        # which would correspond with one connection
        self._lock = asyncio.Lock(loop=loop)

        # we *not* follow naming standards of using "_request" here so
        # get_current_request can magically find us here...
        self.request = request
        self._strategy = getMultiAdapter(
            (manager._storage, self),
            ITransactionStrategy,
            name=manager._storage._transaction_strategy)
        self._cache = getMultiAdapter((manager._storage, self),
                                      IStorageCache,
                                      name=manager._storage._cache_strategy)
Beispiel #14
0
 async def __call__(self):
     if (self.behavior is not None and
             IAsyncBehavior.implementedBy(self.behavior.__class__)):
         # providedBy not working here?
         await self.behavior.load(create=True)
     # We need to get the upload as async IO and look for an adapter
     # for the field to save there by chunks
     adapter = getMultiAdapter(
         (self.context, self.request, self.field), IFileManager)
     return await adapter.upload()
Beispiel #15
0
async def test_serialize_omit_main_interface_field(dummy_request):
    from guillotina.test_package import FileContent, CloudFile
    obj = create_content(FileContent, type_name='File')
    obj.file = CloudFile(filename='foobar.json', size=25, md5='foobar')
    serializer = getMultiAdapter((obj, dummy_request),
                                 IResourceSerializeToJson)
    result = await serializer(omit=['file'])
    assert 'file' not in result
    result = await serializer()
    assert 'file' in result
Beispiel #16
0
async def system(context, request):

    url = getMultiAdapter((context, request), IAbsoluteURL)()
    return {
        "id": f"{url}/@system",
        "pil_version": version("pillow"),
        "guillotina": version("guillotina"),
        "guillotina_volto": version("guillotina_volto"),
        "python_version": platform.python_version(),
    }
    async def __call__(self):
        for name, field in getFieldsInOrder(self.schema):
            serializer = getMultiAdapter(
                (field, self.schema, self.request),
                ISchemaFieldSerializeToJson)
            self.schema_json['properties'][name] = await serializer()
            if field.required:
                self.schema_json['required'].append(name)
        self.schema_json['invariants'] = self.invariants

        return self.schema_json
Beispiel #18
0
async def test_serialize_resource_include_field(dummy_request):
    from guillotina.test_package import FileContent, CloudFile
    obj = create_content(FileContent, type_name='File')
    obj.file = CloudFile(filename='foobar.json', size=25, md5='foobar')
    serializer = getMultiAdapter((obj, dummy_request),
                                 IResourceSerializeToJson)
    result = await serializer(
        include=['guillotina.behaviors.dublincore.IDublinCore.creators'])
    assert 'creators' in result['guillotina.behaviors.dublincore.IDublinCore']
    assert len(result['guillotina.behaviors.dublincore.IDublinCore']) == 1
    assert 'file' not in result
Beispiel #19
0
 def __init__(self, manager=None):
     if manager is None:
         manager = MockTransactionManager()
     self._manager = manager
     self._tid = 1
     self.modified = {}
     self.request = None
     self._strategy = getMultiAdapter(
         (manager._storage, self), ITransactionStrategy,
         name=manager._storage._transaction_strategy)
     self._cache = DummyCache(manager._storage, self)
Beispiel #20
0
async def controlpanel(context, request):

    url = getMultiAdapter((context, request), IAbsoluteURL)()

    result = []
    for item, value in app_settings.get("controlpanels", {}):
        result.append({
            "@id": f"{url}/@controlpanels/{item}",
            "group": value["group"],
            "title": value["title"],
        })
    return result
Beispiel #21
0
 async def __call__(self, context, request):
     if IContentBehavior.implementedBy(context.__class__):
         field = self.field.bind(context)
         context = context.context
     else:
         field = self.field.bind(context)
     file_manager = getMultiAdapter((context, request, field), IFileManager)
     val = await file_manager.save_file(
         self.generator,
         content_type=self.value['content_type'],
         size=len(self.value['data']))
     return val
Beispiel #22
0
 async def __call__(self):
     serializer = getMultiAdapter((self.context, self.request),
                                  IResourceSerializeToJson)
     include = omit = []
     if self.request.GET.get('include'):
         include = self.request.GET.get('include').split(',')
     if self.request.GET.get('omit'):
         omit = self.request.GET.get('omit').split(',')
     try:
         result = await serializer(include=include, omit=omit)
     except TypeError:
         result = await serializer()
     await notify(ObjectVisitedEvent(self.context))
     return result
Beispiel #23
0
async def default_get(context, request):
    """We show the available schemas."""
    result = {}
    factory = get_cached_factory(context.type_name)
    result['static'] = []
    for schema in factory.behaviors or ():
        result['static'].append(schema.__identifier__)

    # convert to list, could be frozenset
    result['dynamic'] = [b for b in context.__behaviors__]

    result['available'] = []

    for iface, utility in getUtilitiesFor(IBehavior):
        serialize = False
        if isinstance(iface, str):
            name = iface
        else:
            name = iface.__identifier__
        if name not in result['dynamic'] and name not in result['static']:
            adaptable = queryAdapter(context,
                                     utility.interface,
                                     name='',
                                     default=None)
            if adaptable:
                result['available'].append(name)
                serialize = True
                schema_serializer = getMultiAdapter(
                    (utility.interface, request), ISchemaSerializeToJson)
                result[name] = await schema_serializer()
        else:
            serialize = True
        if serialize:
            schema_serializer = getMultiAdapter((utility.interface, request),
                                                ISchemaSerializeToJson)
            result[name] = await schema_serializer()
    return result
Beispiel #24
0
def schema_compatible(value, schema_or_field):
    """The schema_compatible function converts any value to guillotina.schema
    compatible data when possible, raising a TypeError for unsupported values.
    This is done by using the ISchemaCompatible converters.
    """
    if value is None:
        return value

    try:
        return getMultiAdapter((value, schema_or_field), IJSONToValue)
    except ComponentLookupError:
        logger.error((u'Deserializer not found for field type '
                      u'"{0:s}" with value "{1:s}" and it was '
                      u'deserialized to None.').format(schema_or_field, value))
        return None
Beispiel #25
0
 async def __call__(self):
     url = getMultiAdapter((self.context, self.request), IAbsoluteURL)()
     result = []
     roles = global_roles()
     for role in roles:
         role_obj = get_utility(IRole, name=role)
         result.append(
             {
                 "@id": f"{url}/@roles/{role}",
                 "@type": "role",
                 "id": role,
                 "title": role_obj.title,
             }
         )
     return result
    async def __call__(self):
        factory = self.factory
        result = {
            'title': factory.type_name,
            '$schema': 'http://json-schema.org/draft-04/schema#',
            'type': 'object',
            'required': [],
            'definitions': {},
            'properties': {}
        }

        # Base object class serialized
        for name, field in getFieldsInOrder(factory.schema):
            if field.required:
                result['required'].append(name)
            serializer = getMultiAdapter(
                (field, factory.schema, self.request),
                ISchemaFieldSerializeToJson)
            result['properties'][name] = await serializer()

            invariants = []
            for i in factory.schema.queryTaggedValue('invariants', []):
                invariants.append("%s.%s" % (i.__module__, i.__name__))
            result['invariants'] = invariants

        # Behavior serialization
        for schema in factory.behaviors or ():
            schema_serializer = getMultiAdapter(
                (schema, self.request), ISchemaSerializeToJson)

            serialization = await schema_serializer()
            result['properties'][schema_serializer.name] = \
                {'$ref': '#/definitions/' + schema_serializer.name},
            result['definitions'][schema_serializer.name] = serialization

        return result
    async def __call__(self, value):
        if value is None:
            return value

        try:
            # cloud files are callable adapters...
            converter = getMultiAdapter((value, self.field), IJSONToValue)
            if callable(converter):
                val = await apply_coroutine(converter, self.context,
                                            self.request)
            else:
                val = converter
            self.field.validate(val)
            return val
        except ComponentLookupError:
            logger.error(
                (u'Deserializer not found for field type '
                 u'"{0:s}" with value "{1:s}" and it was '
                 u'deserialized to None.').format(repr(self.field), value))
            return None
Beispiel #28
0
async def list_comments(context, request):
    bhr = ICMSBehavior(context)
    if not bhr.allow_discussion:
        raise HTTPUnauthorized(content={"text": "Not available option"})
    await bhr.load()
    url = getMultiAdapter((context, request), IAbsoluteURL)()
    result = []
    response = {"@id": url + "/@comments", "items": result}

    if bhr.comments is None:
        return response
    for key, value in bhr.comments.items():
        new_comment = deepcopy(value)
        new_comment["@type"] = "Discussion Item"
        if new_comment.get("@parent", False):
            new_comment["@parent"] = url + new_comment.get("@parent")
        new_comment["@id"] = url + "/@comments/" + key
        new_comment["comment_id"] = key
        result.append(new_comment)

    return response
Beispiel #29
0
async def controlpanel_element(context, request):

    url = getMultiAdapter((context, request), IAbsoluteURL)()
    type_id = request.matchdict["type_id"]
    registry = await get_registry()

    result = {
        "@id": f"{url}/@controlpanels/{type_id}",
        "group": "General",
        "title": "Validations Settings",
        "data": {},
    }

    controlpanels = app_settings.get("controlpanels", {})
    if type_id in controlpanels:
        schema = controlpanels[type_id].get("schema", None)
        if schema is None:
            return
        schemaObj = resolve_dotted_name(schema)
        config = registry.for_interface(schemaObj)
        schema = {"properties": {}, "fieldsets": [], "required": []}
        data = {}
        fields = []
        for name, field in get_fields_in_order(schemaObj):
            if field.required:
                result["required"].append(name)
            serializer = get_multi_adapter((field, schemaObj, request),
                                           ISchemaFieldSerializeToJson)
            schema["properties"][name] = await serializer()
            data[name] = config.__getitem__(name)
            fields.append(name)
        schema["fieldsets"] = [{
            "fields": fields,
            "id": "default",
            "title": "default"
        }]
        result["schema"] = schema
        result["data"] = data

    return result
Beispiel #30
0
 def __init__(self, context, request, field):
     iface = import_class(app_settings['cloud_storage'])
     alsoProvides(field, iface)
     self.real_file_manager = getMultiAdapter((context, request, field),
                                              IFileManager)