예제 #1
0
def delete_extract(request):
    user_id = request.authenticated_userid
    discussion_id = int(request.matchdict['discussion_id'])

    if not user_id:
        # Straight from annotator
        token = request.headers.get('X-Annotator-Auth-Token')
        if token:
            token = decode_token(token,
                                 request.registry.settings['session.secret'])
            if token:
                user_id = token['userId']
    user_id = user_id or Everyone

    extract_id = request.matchdict['id']
    extract = Extract.get_instance(extract_id)

    if not (user_has_permission(discussion_id, user_id, P_EDIT_EXTRACT) or
            (user_has_permission(discussion_id, user_id, P_EDIT_MY_EXTRACT)
             and user_id == extract.owner_id)):
        raise HTTPForbidden()

    if not extract:
        return HTTPNoContent()

    # TODO: Tombstonable extracts???
    extract.delete()
    return HTTPNoContent()
예제 #2
0
def delete_extract(request):
    user_id = authenticated_userid(request)
    discussion = request.context

    if not user_id:
        # Straight from annotator
        token = request.headers.get('X-Annotator-Auth-Token')
        if token:
            token = decode_token(token,
                                 request.registry.settings['session.secret'])
            if token:
                user_id = token['userId']
        user_id = user_id or Everyone

    extract_id = request.matchdict['id']
    extract = Extract.get_instance(extract_id)
    permissions = get_permissions(user_id, discussion.id, extract)
    if P_EDIT_EXTRACT not in permissions:
        raise HTTPForbidden()

    if not extract:
        return HTTPNoContent()

    # TODO: Tombstonable extracts???
    extract.delete()
    return HTTPNoContent()
예제 #3
0
def account_timezone(request):
    if request.POST["timezone"] in timezones:
        Session.query(User).filter(User.id == request.user.id).update({
            "timezone":
            request.POST["timezone"],
        })
    return HTTPNoContent()
예제 #4
0
    def get_egrid_ident(self):
        """
        Returns a list with the matched EGRIDs for the given NBIdent and property number.

        Returns:
            pyramid.response.Response: The `getegrid` response.
        """
        params = Parameter('json' if self._is_json() else 'xml')
        identdn = self._request.matchdict.get('identdn')
        number = self._request.matchdict.get('number')
        try:
            if identdn and number:
                records = self._real_estate_reader.read(
                    params, **{
                        'nb_ident': identdn,
                        'number': number
                    })
                response = self.__get_egrid_response__(records)
            else:
                raise HTTPBadRequest('IDENTDN and NUMBER must be defined.')
        except HTTPNoContent as err:
            response = HTTPNoContent('{}'.format(err))
        except HTTPBadRequest as err:
            response = HTTPBadRequest('{}'.format(err))
        response.extras = OerebStats(service='GetEgridIdent',
                                     params={
                                         'identdn': identdn,
                                         'number': number
                                     })
        return response
예제 #5
0
    def get_egrid_coord(self):
        """
        Returns a list with the matched EGRIDs for the given coordinates.

        Returns:
            pyramid.response.Response: The `getegrid` response.
        """
        params = Parameter('json' if self._is_json() else 'xml')
        xy = self._params.get('XY')
        gnss = self._params.get('GNSS')
        try:
            if xy or gnss:
                geom_wkt = 'SRID={0};{1}'
                if xy:
                    geom_wkt = geom_wkt.format(
                        Config.get('srid'),
                        self.__parse_xy__(xy, buffer_dist=1.0).wkt)
                elif gnss:
                    geom_wkt = geom_wkt.format(Config.get('srid'),
                                               self.__parse_gnss__(gnss).wkt)
                records = self._real_estate_reader.read(
                    params, **{'geometry': geom_wkt})
                response = self.__get_egrid_response__(records)
            else:
                raise HTTPBadRequest('XY or GNSS must be defined.')
        except HTTPNoContent as err:
            response = HTTPNoContent('{}'.format(err))
        except HTTPBadRequest as err:
            response = HTTPBadRequest('{}'.format(err))
        response.extras = OerebStats(service='GetEgridCoord',
                                     params={
                                         'xy': xy,
                                         'gnss': gnss
                                     })
        return response
예제 #6
0
    def activate_by_email(self,
                          activation_code: str,
                          location: str = None) -> Response:
        """Active a user after user after the activation email.

            * User clicks link in the activation email
            * User enters the activation code on the form by hand

        :param activation_code: Activation code for user account.
        :param location: URL to redirect the user to, after activation.
        :raise: HTTPNotFound is activation_code is invalid.
        :return: Redirect to location.
        """
        request = self.request
        settings = request.registry.settings
        user_registry = UserRegistry(request)

        login_after_activation = asbool(
            settings.get('tm.registry.login_after_activation', False))

        user = user_registry.activate_user_by_email_token(activation_code)
        if not user:
            raise HTTPNotFound("Activation code not found",
                               json={'message': 'Activation code not found.'})

        if login_after_activation:
            login_service = LoginService(self.request)
            return login_service.authenticate_user(user, login_source="email")
        else:
            self.request.registry.notify(
                RegistrationActivatedEvent(self.request, user, None))
            return HTTPNoContent(json=None)
예제 #7
0
def submit_view(request):
    api_key = request.GET.get('key', None)
    heka_client = get_heka_client()

    if api_key is None:
        # we don't require API keys for submit yet
        heka_client.incr('submit.no_api_key')
    else:
        heka_client.incr('submit.api_key.%s' % api_key.replace('.', '__'))

    data, errors = preprocess_request(
        request,
        schema=SubmitSchema(),
        extra_checks=(submit_validator, ),
    )

    items = data['items']
    nickname = request.headers.get('X-Nickname', u'')
    if isinstance(nickname, str):
        nickname = nickname.decode('utf-8', 'ignore')
    # batch incoming data into multiple tasks, in case someone
    # manages to submit us a huge single request
    for i in range(0, len(items), 100):
        insert_measures.delay(
            # TODO convert items to json with support for decimal/datetime
            items=dumps(items[i:i + 100]),
            nickname=nickname,
        )
    return HTTPNoContent()
예제 #8
0
def delete_journal_aop(request):
    try:
        request.services["remove_ahead_of_print_bundle_from_journal"](
            id=request.matchdict["journal_id"])
    except exceptions.DoesNotExist as exc:
        return HTTPNotFound(str(exc))
    return HTTPNoContent()
예제 #9
0
 def get(self):
     """Return user settings."""
     objects = ObjectSettings.list_db(self.user)
     settings = [x.marshall_dict() for x in objects]
     if settings:
         return settings[0]
     raise HTTPNoContent()
예제 #10
0
def put_asset(request):
    """Adiciona ou atualiza registro de ativo do documento. A atualização do
    ativo é idempotente.

    A semântica desta view-function está definida conforme a especificação:
    https://www.w3.org/Protocols/rfc2616/rfc2616-sec9.html#sec9.6
    """
    assets_list = get_assets_list(request)
    assets_map = {asset["slug"]: asset["id"] for asset in assets_list["assets"]}
    asset_slug = request.matchdict["asset_slug"]
    try:
        asset_id = assets_map[asset_slug]
    except KeyError:
        raise HTTPNotFound(
            'cannot fetch asset with slug "%s": asset does not exist' % asset_slug
        )

    asset_url = request.validated["asset_url"]
    try:
        request.services["register_asset_version"](
            id=request.matchdict["document_id"], asset_id=asset_id, asset_url=asset_url
        )
    except exceptions.VersionAlreadySet as exc:
        LOGGER.info(
            'skipping request to add version to "%s/assets/%s": %s',
            request.matchdict["document_id"],
            request.matchdict["asset_slug"],
            exc,
        )
    return HTTPNoContent("asset updated successfully")
예제 #11
0
    def __get_egrid_response__(self, records):
        """
        Creates a valid GetEGRID response from a list of real estate records.

        Args:
            records (list of pyramid_oereb.lib.records.real_estate.RealEstateRecord): List of real
                estate records.

        Returns:
            pyramid.response.Response: The `getegrid` response.
        """

        if len(records) == 0:
            return HTTPNoContent()

        real_estates = list()
        for r in records:
            real_estates.append({
                'egrid': getattr(r, 'egrid'),
                'number': getattr(r, 'number'),
                'identDN': getattr(r, 'identdn')
            })
        egrid = {'GetEGRIDResponse': real_estates}
        renderer_name = 'json' if self._is_json() else 'pyramid_oereb_getegrid_xml'
        response = render_to_response(renderer_name, egrid, request=self._request)
        if self._is_json():
            response.content_type = 'application/json; charset=UTF-8'
        return response
예제 #12
0
파일: moderation.py 프로젝트: kaydoh/h
def delete(context, request):
    context.annotation.moderation = None

    event = events.AnnotationEvent(request, context.annotation.id, "update")
    request.notify_after_commit(event)

    return HTTPNoContent()
예제 #13
0
파일: flags.py 프로젝트: jimtyhurst/h
def create(context, request):
    svc = request.find_service(name="flag")
    svc.create(request.user, context.annotation)

    _email_group_admin(request, context.annotation)

    return HTTPNoContent()
예제 #14
0
    def delete(self):
        """Remove the identity"""

        self.request.identity_provider.delete(self.request.identity)
        headers = forget(self.request)
        self.request.response.headers.extend(headers)
        return HTTPNoContent()
예제 #15
0
def put_document(request):
    """Adiciona ou atualiza registro de documento. A atualização do documento é
    idempotente.

    A semântica desta view-function está definida conforme a especificação:
    https://www.w3.org/Protocols/rfc2616/rfc2616-sec9.html#sec9.6
    """
    data_url = request.validated["data"]
    assets = {
        asset["asset_id"]: asset["asset_url"]
        for asset in request.validated.get("assets", [])
    }
    try:
        request.services["register_document"](
            id=request.matchdict["document_id"],
            data_url=data_url,
            assets=assets)
    except exceptions.AlreadyExists:
        try:
            request.services["register_document_version"](
                id=request.matchdict["document_id"],
                data_url=data_url,
                assets=assets)
        except exceptions.VersionAlreadySet as exc:
            LOGGER.info(
                'skipping request to add version to "%s": %s',
                request.matchdict["document_id"],
                exc,
            )
        return HTTPNoContent("document updated successfully")
    else:
        return HTTPCreated("document created successfully")
예제 #16
0
    def _get_egrid_address(self, params):
        """
        Returns a list with the matched EGRIDs for the given postal address.

        Args:
            params (pyramid_oereb.views.webservice.Parameter): The parameter object.

        Returns:
            list of pyramid_oereb.core.records.real_estate.RealEstateRecord:
                The list of all found records filtered by the passed criteria.
        """
        postalcode = self._params.get('POSTALCODE')
        localisation = self._params.get('LOCALISATION')
        number = self._params.get('NUMBER')
        if postalcode and localisation and number:
            reader = AddressReader(
                Config.get_address_config().get('source').get('class'),
                **Config.get_address_config().get('source').get('params'))
            addresses = reader.read(params, localisation, int(postalcode),
                                    number)
            if len(addresses) == 0:
                raise HTTPNoContent()
            geometry = 'SRID={srid};{wkt}'.format(srid=Config.get('srid'),
                                                  wkt=addresses[0].geom.wkt)
            processor = create_processor()
            return processor.real_estate_reader.read(params,
                                                     **{'geometry': geometry})
        else:
            raise HTTPBadRequest(
                'POSTALCODE, LOCALISATION and NUMBER must be defined.')
예제 #17
0
def patch_documents_bundle(request):
    try:
        request.services["update_documents_bundle_metadata"](
            request.matchdict["bundle_id"], metadata=request.validated)
    except exceptions.DoesNotExist as exc:
        return HTTPNotFound(str(exc))
    else:
        return HTTPNoContent("bundle updated successfully")
예제 #18
0
def put_documents_bundle(request):
    try:
        request.services["create_documents_bundle"](
            request.matchdict["bundle_id"], metadata=request.validated)
    except exceptions.AlreadyExists:
        return HTTPNoContent("bundle updated successfully")
    else:
        return HTTPCreated("bundle created successfully")
예제 #19
0
파일: annotations.py 프로젝트: maticanzic/h
def mark(context, request):
    svc = request.find_service(name="mark")
    svc.mark(request.user, context.annotation)

    event = AnnotationEvent(request, context.annotation.id, "mark")
    request.notify_after_commit(event)

    return HTTPNoContent()
예제 #20
0
def chat_delete(request):
    chat, own_chat_user = _get_chat(request, ongoing=False)
    if chat.status == "ongoing":
        _post_end_message(request, chat, own_chat_user)
    Session.delete(own_chat_user)
    if request.is_xhr:
        return HTTPNoContent()
    return HTTPFound(request.route_path("chat_list"))
예제 #21
0
파일: auth.py 프로젝트: shangxor/assembl
def send_account_verification(request):
    ctx = request.context
    instance = ctx._instance
    if instance.verified:
        return HTTPNoContent("No need to verify email <%s>" % (instance.email))
    request.matchdict = {}
    send_confirmation_email(request, instance)
    return {}
예제 #22
0
파일: annotations.py 프로젝트: maticanzic/h
def downvote(context, request):
    svc = request.find_service(name="downvote")
    svc.downvote(request.user, context.annotation)

    event = AnnotationEvent(request, context.annotation.id, "downvote")
    request.notify_after_commit(event)

    return HTTPNoContent()
예제 #23
0
def default_options_view(resource, request, methods=None):
    """Default OPTIONS view for resources."""
    response = HTTPNoContent()
    if methods is None:
        state = RestState.from_resource(resource)
        methods = state.supported_methods()
    response.headers['Access-Control-Allow-Methods'] = ', '.join(methods)
    return response
예제 #24
0
def patch_journal_issues(request):
    try:
        if request.validated.get("index") is not None:
            request.services["insert_issue_to_journal"](
                id=request.matchdict["journal_id"],
                index=request.validated["index"],
                issue=request.validated["issue"],
            )
        else:
            request.services["add_issue_to_journal"](
                id=request.matchdict["journal_id"], issue=request.validated["issue"]
            )
    except exceptions.DoesNotExist as exc:
        return HTTPNotFound(str(exc))
    except exceptions.AlreadyExists as exc:
        return HTTPNoContent("issue added to journal successfully.")
    else:
        return HTTPNoContent("issue added to journal successfully.")
예제 #25
0
def patch_journal_aop(request):
    try:
        request.services["set_ahead_of_print_bundle_to_journal"](
            id=request.matchdict["journal_id"], aop=request.validated["aop"])
    except exceptions.DoesNotExist:
        return HTTPNotFound('cannot find journal with id "%s"' %
                            request.matchdict["journal_id"])

    return HTTPNoContent("aop added to journal successfully")
예제 #26
0
def delete(context, request):

    svc = request.find_service(name="annotation_moderation")
    svc.unhide(context.annotation)

    event = events.AnnotationEvent(request, context.annotation.id, "update")
    request.notify_after_commit(event)

    return HTTPNoContent()
예제 #27
0
def create(context, request):

    svc = request.find_service(name='annotation_moderation')
    svc.hide(context.annotation)

    event = events.AnnotationEvent(request, context.annotation.id, 'update')
    request.notify_after_commit(event)

    return HTTPNoContent()
예제 #28
0
def delete_journal_issues(request):
    try:
        request.services["remove_issue_from_journal"](
            id=request.matchdict["journal_id"], issue=request.validated["issue"]
        )
    except exceptions.DoesNotExist as exc:
        return HTTPNotFound(str(exc))
    else:
        return HTTPNoContent("issue removed from journal successfully.")
예제 #29
0
    def logout(self) -> Response:
        """Log out user from the site.

        :return: HTTPNoContent empty Authorization header.
        """
        # headers = forget(request)
        headers = {'Authorization': ''}

        return HTTPNoContent(headers=headers, json=None)
예제 #30
0
def submit_view(request):
    stats_client = request.registry.stats_client
    api_key_log = getattr(request, 'api_key_log', False)
    api_key_name = getattr(request, 'api_key_name', None)

    try:
        data, errors = preprocess_request(
            request,
            schema=SubmitSchema(),
            extra_checks=(submit_validator, ),
            response=JSONError,
        )
    except JSONError:
        # capture JSON exceptions for submit calls
        request.registry.raven_client.captureException()
        raise

    items = data['items']
    nickname = request.headers.get('X-Nickname', u'')
    if isinstance(nickname, str):
        nickname = nickname.decode('utf-8', 'ignore')

    email = request.headers.get('X-Email', u'')
    if isinstance(email, str):
        email = email.decode('utf-8', 'ignore')

    # count the number of batches and emit a pseudo-timer to capture
    # the number of reports per batch
    length = len(items)
    stats_client.incr('items.uploaded.batches')
    stats_client.timing('items.uploaded.batch_size', length)

    if api_key_log:
        stats_client.incr('items.api_log.%s.uploaded.batches' % api_key_name)
        stats_client.timing(
            'items.api_log.%s.uploaded.batch_size' % api_key_name, length)

    # batch incoming data into multiple tasks, in case someone
    # manages to submit us a huge single request
    for i in range(0, length, 100):
        batch = kombu_dumps(items[i:i + 100])
        # insert observations, expire the task if it wasn't processed
        # after six hours to avoid queue overload
        try:
            insert_measures.apply_async(kwargs={
                'email': email,
                'items': batch,
                'nickname': nickname,
                'api_key_log': api_key_log,
                'api_key_name': api_key_name,
            },
                                        expires=21600)
        except ConnectionError:  # pragma: no cover
            return HTTPServiceUnavailable()

    return HTTPNoContent()