# -*- coding: utf-8 -*-
# (c) 2019 The PatZilla Developers
import logging
from cornice.service import Service
from patzilla.access.epo.publicationserver.client import fetch_pdf

log = logging.getLogger(__name__)


publicationserver_pdf_service = Service(
    name='publicationserver-pdf',
    path='/api/publicationserver/{patent}',
    description="EPO publication server pdf interface")


@publicationserver_pdf_service.get(renderer='pdf')
def publicationserver_pdf_handler(request):
    """request pdf from EPO publication server"""
    # https://data.epo.org/publication-server/pdf-document?cc=EP&pn=nnnnnn&ki=nn

    patent = request.matchdict['patent']

    pdf_payload = fetch_pdf(patent)

    # http://tools.ietf.org/html/rfc6266#section-4.2
    request.response.headers['Content-Disposition'] = 'inline; filename={0}.pdf'.format(patent)
    request.response.headers['X-Pdf-Source'] = 'epo-publication-server'

    return pdf_payload
Example #2
0
 def test_cors_policy_can_be_overwritten(self):
     policy = {'origins': ('foo', 'bar', 'baz')}
     foo = Service(name='foo', path='/foo', cors_origins=(),
                   cors_policy=policy)
     self.assertEqual(len(foo.cors_supported_origins), 0)
Example #3
0
# -*- coding: utf-8 -*-
from logging import getLogger
from cornice.service import Service
from openprocurement.api.utils import (
    save_tender,
    apply_patch,
    add_next_award,
    error_handler,
)
from openprocurement.api.validation import (
    validate_tender_auction_data, )

LOGGER = getLogger(__name__)

auction = Service(name='Tender Auction',
                  path='/tenders/{tender_id}/auction',
                  renderer='json',
                  error_handler=error_handler)


@auction.get(renderer='json', permission='auction')
def get_auction(request):
    """Get auction info.

    Get tender auction info
    -----------------------

    Example request to get tender auction information:

    .. sourcecode:: http

        GET /tenders/4879d3f8ee2443169b5fbbc9f89fa607/auction HTTP/1.1
Example #4
0
 def test_method_takes_precendence_for_credential_support(self):
     foo = Service(name='foo', path='/foo', cors_credentials=True)
     foo.add_view('GET', _stub, cors_credentials=False)
     self.assertFalse(foo.cors_support_credentials_for('GET'))
Example #5
0
 def test_max_age_can_be_defined(self):
     foo = Service(name='foo', path='/foo', cors_max_age=42)
     foo.add_view('POST', _stub)
     self.assertEqual(foo.cors_max_age_for(), 42)
Example #6
0
 def test_cors_headers_for_view_definition(self):
     # defining headers in the view should work.
     service = Service('coconuts', '/migrate')
     service.add_view('POST', _stub, cors_headers=('X-Header-Foobar'))
     self.assertIn('X-Header-Foobar', service.cors_supported_headers_for())
Example #7
0
 def test_credential_support_is_disabled_by_default(self):
     foo = Service(name='foo', path='/foo')
     foo.add_view('POST', _stub)
     self.assertFalse(foo.cors_support_credentials_for())
Example #8
0
# -*- coding: utf-8 -*-
from cornice.service import Service, get_services
from openregistry.api.constants import VERSION


spore = Service(name='spore', path='/spore', renderer='json')

#####
# from cornice.ext.spore import generate_spore_description
import re

URL_PLACEHOLDER = re.compile(r'\{([a-zA-Z0-9_-]*)\}')


def generate_spore_description(services, name, base_url, version, **kwargs):
    """Utility to turn cornice web services into a SPORE-readable file.

    See https://github.com/SPORE/specifications for more information on SPORE.
    """
    URL_PLACEHOLDER = re.compile(r'\{([a-zA-Z0-9_-]*)\}')

    spore_doc = dict(
        base_url=base_url,
        name=name,
        version=version,
        expected_status=[200, ],
        methods={},
        **kwargs
    )

    for service in services:
Example #9
0
# -*- coding: utf-8 -*-
# (c) 2013-2015 Andreas Motl, Elmyra UG
import logging
import arrow
from cornice.service import Service
from pyramid.httpexceptions import HTTPNotFound
from pyramid.response import Response
from patzilla.access.epo.ops.api import ops_service_usage
from patzilla.util.date import week_range, month_range, year_range
from patzilla.util.web.identity.store import User

log = logging.getLogger(__name__)

admin_users_emails_service = Service(
    name='admin-users-email-service',
    path='/api/admin/users/emails',
    description="Responds with email addresses of all customers")


@admin_users_emails_service.get()
def admin_users_emails_handler(request):
    tag = request.params.get('tag')
    users = User.objects()
    user_emails = []
    for user in users:
        if '@' not in user.username:
            continue
        if 'email:invalid' in user.tags or 'newsletter:opt-out' in user.tags:
            continue
        if tag and tag not in user.tags:
            continue
Example #10
0
 def test_max_age_can_be_defined(self):
     foo = Service(name='foo', path='/foo', cors_max_age=42)
     self.assertEqual(foo.cors_max_age_for(), 42)
Example #11
0
# -*- coding: utf-8 -*-
# (c) 2013-2015 Andreas Motl, Elmyra UG
import logging
from beaker.cache import cache_region
from cornice.service import Service
from patzilla.access.google.search import GooglePatentsAccess

log = logging.getLogger(__name__)

google_published_data_search_service = Service(
    name='google-published-data-search',
    path='/api/google/published-data/search',
    description="Google Patents search interface")


@cache_region('search')
def google_published_data_search(query, offset, limit):
    google = GooglePatentsAccess()
    try:
        return google.search(query, offset, limit)
    except SyntaxError as ex:
        log.warn('Invalid query for Google Patents: %s' % ex.msg)
        raise


@google_published_data_search_service.get(accept="application/json")
def google_published_data_search_handler(request):
    """Search for published-data at Google Patents"""

    # CQL query string
    query = request.params.get('query', '')
Example #12
0
 def test_credential_support_is_disabled_by_default(self):
     foo = Service(name='foo', path='/foo')
     self.assertFalse(foo.cors_support_credentials())
Example #13
0
 def test_credential_support_can_be_enabled(self):
     foo = Service(name='foo', path='/foo', cors_credentials=True)
     self.assertTrue(foo.cors_support_credentials())
Example #14
0
from pyramid.httpexceptions import HTTPBadGateway, HTTPBadRequest, HTTPNotFound
from json.decoder import JSONDecodeError
from cornice.validators import colander_body_validator
from .. import supervisor

from ..config import path
from ..device_discovery import PhilipsHueBridgeApiClient, UnauthenticatedDeviceError, UpstreamError
from ..lockfile import open_locked
from .api_descriptions import descriptions as desc

logger = logging.getLogger(__name__)

list_service = Service(
    name='devices_list',
    path=path('setup/devices'),
    description=desc.get('list_service'),
    renderer='json',
)


@list_service.get()
def devices_list_view(request):
    """
    Returns list of discovered devices/bridges.

    """
    return read_json(request.registry.settings['devices_path'], [])


discover_service = Service(
    name='devices_discover',
Example #15
0
        # TODO: log/send full stacktrace
        log.error(exception_traceback())

    except JwtVerifyError as ex:
        log.error('Error while decoding opaque parameter token: %s',
                  ex.message)
        request.opaque_meta.update({'status': 'error', 'errors': [ex.message]})
        # TODO: log/send full stacktrace
        log.error(exception_traceback())


# ------------------------------------------
#   services
# ------------------------------------------
opaquelinks_token_service = Service(name='opaquelinks-token',
                                    path='/api/opaquelinks/token',
                                    description="opaquelinks token generator")

opaquelinks_verify_service = Service(name='opaquelinks-verify',
                                     path='/api/opaquelinks/token/verify',
                                     description="opaquelinks token verifier")


# ------------------------------------------
#   service handlers
# ------------------------------------------
@opaquelinks_token_service.post(accept="application/json")
def opaquelinks_token_handler(request):
    """Generate an opaquelinks token"""
    payload = request_payload(request)
    signer = request.registry.getUtility(ISigner)
from .setup_devices import get_device
from .api_descriptions import descriptions as desc
from .nuimos import is_device_responsive

import yaml
import requests
import json
import time
import soco

logger = getLogger(__name__)

nuimo_components_service = Service(
    name='nuimo_components',
    path=service_path('nuimos/{mac_address:[a-z0-9\-]+}/components'),
    description=desc.get('nuimo_components_service'),
    renderer='json',
    accept='application/json',
)

nuimo_component_service = Service(
    name='nuimo_component',
    path=service_path(
        'nuimos/{mac_address:[a-z0-9\-]+}/components/{component_id:[a-z0-9\-]+}'
    ),
    description=desc.get('nuimo_component_service'),
    renderer='json',
    accept='application/json',
)

nuimo_device_test_service = Service(
Example #17
0
from cornice.service import Service
from pkg_resources import get_distribution

from ..config import path, get_logger


log = get_logger(__name__)


app_info = Service(
    name='appinfo',
    path=path(''),
    renderer='json',
    accept='application/json')


@app_info.get()
def get_app_info(request):
    result = dict(
        version=get_distribution('senic.nuimo_hub').version,
        bin_path=request.registry.settings['bin_path']
    )
    return result
Example #18
0
from pymongo.errors import OperationFailure
from pyramid.httpexceptions import HTTPNotFound, HTTPBadRequest
from patzilla.access.depatech import get_depatech_client
from patzilla.access.depatech.client import depatech_search, LoginException, depatech_crawl
from patzilla.access.depatech.expression import DepaTechParser, should_be_quoted
from patzilla.navigator.services import handle_generic_exception
from patzilla.util.expression.keywords import keywords_to_response
from patzilla.navigator.services.util import request_to_options
from patzilla.access.generic.exceptions import NoResultsException, SearchException
from patzilla.util.data.container import SmartBunch
from patzilla.util.python import _exception_traceback

log = logging.getLogger(__name__)

depatech_published_data_search_service = Service(
    name='depatech-published-data-search',
    path='/api/depatech/published-data/search',
    description="MTC depa.tech search interface")
depatech_published_data_crawl_service = Service(
    name='depatech-published-data-crawl',
    path='/api/depatech/published-data/crawl{dummy1:\/?}{constituents:.*?}',
    description="MTC depa.tech crawler interface")

status_upstream_depatech = Service(
    name='status_depatech',
    path='/api/status/upstream/mtc/depatech',
    description="Checks MTC depa-tech upstream for valid response")


@status_upstream_depatech.get()
def status_upstream_depatech_handler(request):
    client = get_depatech_client()
Example #19
0
 def test_credential_support_can_be_enabled(self):
     foo = Service(name='foo', path='/foo', cors_credentials=True)
     foo.add_view('POST', _stub)
     self.assertTrue(foo.cors_support_credentials_for())
Example #20
0
# This Source Code Form is subject to the terms of the Mozilla Public
# License, v. 2.0. If a copy of the MPL was not distributed with this file,
# You can obtain one at http://mozilla.org/MPL/2.0/.
from pyramid import testing
from pyramid.exceptions import NotFound
from pyramid.response import Response

from webtest import TestApp

from cornice.service import Service
from cornice.tests.support import TestCase, CatchErrors

squirel = Service(path='/squirel', name='squirel', cors_origins=('foobar', ))
spam = Service(path='/spam', name='spam', cors_origins=('*', ))
eggs = Service(path='/eggs',
               name='egg',
               cors_origins=('*', ),
               cors_expose_all_headers=False)
bacon = Service(path='/bacon/{type}', name='bacon', cors_origins=('*', ))


class Klass(object):
    """
    Class implementation of a service
    """
    def __init__(self, request):
        self.request = request

    def post(self):
        return "moar squirels (take care)"
Example #21
0
 def test_per_method_credential_support(self):
     foo = Service(name='foo', path='/foo')
     foo.add_view('GET', _stub, cors_credentials=True)
     foo.add_view('POST', _stub)
     self.assertTrue(foo.cors_support_credentials_for('GET'))
     self.assertFalse(foo.cors_support_credentials_for('POST'))
Example #22
0
from pyramid.threadlocal import get_current_request
from pyramid.httpexceptions import HTTPServerError, HTTPBadRequest
from patzilla.navigator.export import Dossier, DossierXlsx
from patzilla.util.config import read_list
from patzilla.util.cql.util import pair_to_cql
from patzilla.util.data.container import SmartBunch
from patzilla.util.expression.keywords import keywords_from_boolean_expression
from patzilla.util.numbers.numberlists import parse_numberlist, normalize_numbers
from patzilla.util.python import exception_traceback
from patzilla.util.xml.format import pretty_print
from patzilla.util.web.email.submit import email_issue_report

log = logging.getLogger(__name__)

query_expression_util_service = Service(
    name='query-expression-utility-service',
    path='/api/util/query-expression',
    description="Query expression utility service")

numberlist_util_service = Service(
    name='numberlist-utility-service',
    path='/api/util/numberlist',
    description="Numberlist utility service")

export_util_service = Service(
    name='export-utility-service',
    path='/api/util/export/{kind}.{format}',
    description="Export utility service")

issue_reporter_service = Service(
    name='issue-reporter-service',
    path='/api/util/issue/report',
Example #23
0
 def test_max_age_is_none_if_undefined(self):
     foo = Service(name='foo', path='/foo')
     foo.add_view('POST', _stub)
     self.assertIsNone(foo.cors_max_age_for('POST'))
Example #24
0
from pyramid.httpexceptions import HTTPNotFound, HTTPBadRequest
from patzilla.navigator.services import handle_generic_exception
from patzilla.util.expression.keywords import keywords_to_response
from patzilla.navigator.services.util import request_to_options
from patzilla.access.generic.exceptions import NoResultsException, SearchException
from patzilla.access.ificlaims.api import ificlaims_download, ificlaims_download_multi
from patzilla.access.ificlaims.client import IFIClaimsException, IFIClaimsFormatException, LoginException, ificlaims_search, ificlaims_crawl, ificlaims_client
from patzilla.access.ificlaims.expression import should_be_quoted, IFIClaimsParser
from patzilla.util.data.container import SmartBunch
from patzilla.util.data.zip import zip_multi
from patzilla.util.python import _exception_traceback

log = logging.getLogger(__name__)

ificlaims_published_data_search_service = Service(
    name='ificlaims-published-data-search',
    path='/api/ificlaims/published-data/search',
    description="IFI CLAIMS search interface")
ificlaims_published_data_crawl_service = Service(
    name='ificlaims-published-data-crawl',
    path='/api/ificlaims/published-data/crawl{dummy1:\/?}{constituents:.*?}',
    description="IFI CLAIMS crawler interface")

ificlaims_download_service = Service(
    name='ificlaims-download',
    path='/api/ificlaims/download/{resource}.{format}',
    description="IFI CLAIMS download interface")
ificlaims_deliver_service = Service(name='ificlaims-deliver',
                                    path='/api/ificlaims/deliver/{kind}',
                                    description="IFI CLAIMS deliver interface")

status_upstream_ificlaims = Service(
Example #25
0
 def test_cors_policy(self):
     policy = {'origins': ('foo', 'bar', 'baz')}
     foo = Service(name='foo', path='/foo', cors_policy=policy)
     self.assertTrue('foo' in foo.cors_supported_origins)
     self.assertTrue('bar' in foo.cors_supported_origins)
     self.assertTrue('baz' in foo.cors_supported_origins)
Example #26
0
from cornice.service import Service
from ..config import path
from .api_descriptions import descriptions as desc
from .. import hub_metadata


app_info = Service(
    name='appinfo',
    path=path(''),
    description=desc.get('app_info'),
    renderer='json',
    accept='application/json')


@app_info.get()
def get_app_info(request):
    return dict(
        wifi=hub_metadata.HubMetaData.wifi(),
        os_version=hub_metadata.HubMetaData.os_version(),
        hardware_identifier=hub_metadata.HubMetaData.hardware_identifier(),
    )
Example #27
0
    class SchemaFromQuerystring(MappingSchema):
        yeah = SchemaNode(String(), location="querystring", type='str')

    class ModelField(MappingSchema):
        name = SchemaNode(String())
        description = SchemaNode(String())

    class ModelFields(SequenceSchema):
        field = ModelField()

    class ModelDefinition(MappingSchema):
        title = SchemaNode(String(), location="body")
        fields = ModelFields(validator=Length(min=1), location="body")

    nested_service = Service(name='nested', path='/nested')

    @nested_service.post(schema=ModelDefinition)
    def get_nested(request):
        return "yay"

    foobar = Service(name="foobar", path="/foobar")

    @foobar.post(schema=FooBarSchema)
    def foobar_post(request):
        return {"test": "succeeded", 'baz': request.validated['baz']}

    @foobar.get(schema=SchemaFromQuerystring)
    def foobar_get(request):
        return {"test": "succeeded"}
Example #28
0
from cornice.service import Service
from restbase import path
import psycopg2
import math
search = Service(name='others', path=path('others'), renderer='json')


def distance(p0, p1):
    return math.sqrt((float(p0[0]) - float(p1[0]))**2 +
                     (float(p0[1]) - float(p1[1]))**2)


@search.get(accept='application/json')
def query(request):
    if "lat" in request.GET:
        lat = request.GET["lat"]
    else:
        lat = "50.5"
    if "lng" in request.GET:
        lng = request.GET["lng"]
    else:
        lng = "10.5"
    if "dist" in request.GET:
        dist = request.GET["dist"]
    else:
        dist = "0.1"
    con = psycopg2.connect(database='appartmapp', user='******')
    cur = con.cursor()
    cur.execute('SELECT * from items')
    rows = cur.fetchall()
    result = [(row) for row in rows
Example #29
0
from colander import MappingSchema, String, SchemaNode, Length

import mmap
import os
import struct

import soco
import requests
from nuimo import Controller, ControllerManager

logger = getLogger(__name__)


connected_nuimos = Service(
    name='connected_nuimos',
    path=service_path('nuimos'),
    description=desc.get('connected_nuimos'),
    renderer='json',
    accept='application/json')


configured_nuimos = Service(
    name='configured_nuimos',
    path=service_path('confnuimos'),
    description=desc.get('configured_nuimos'),
    renderer='json',
    accept='application/json')


nuimo_service = Service(
    name='nuimo_services',
    path=service_path('nuimos/{mac_address:[a-z0-9\-]+}'),
Example #30
0
        return True
    else:
        raise Invalid(node, _(node.title + u' already exists'))


class Schema(MappingSchema):
    """ Signup schema for new users. """
    firstname = SchemaNode(String(), missing=null)
    lastname = SchemaNode(String(), missing=null)
    email = SchemaNode(String(),
                       title=u'Email',
                       validator=All(Email(), email_not_registered))
    password = SchemaNode(String())


service = Service(name='signup', path=path('signup'))


@service.post(schema=Schema, accept='application/json')
def signup(request):
    signup_user(request, **request.validated)
    return dict(status='success')


def signup_user(request, **data):
    user = principals.Principal(active=False, **data)
    send_confirmation_mail(user, request)
    return user


def make_token(user):