def test_simple_object_2(self):
        qs = "&id=foo&dog.name=lucy&dog.color=brown"
        result = parse(qs)

        self.assertEqual(result["id"], "foo")
        self.assertEqual(result["dog"]["name"], "lucy")
        self.assertEqual(result["dog"]["color"], "brown")
 def test_push_array(self):
     qs = "&id=foo&dog[]=z-lucy&dog[]=radar"
     result = parse(qs)
     self.assertEqual(result["id"], "foo")
     self.assertEqual(len(result["dog"]), 2)
     self.assertEqual(result["dog"][0], "z-lucy")
     self.assertEqual(result["dog"][1], "radar")
    def test_odd_names(self):
        qs = "&id=foo&dog[name.1]=lucy&dog[name[2]]=radar"
        result = parse(qs)

        self.assertEqual(result["id"], "foo")
        self.assertEqual(result["dog"]["name.1"], "lucy")
        self.assertEqual(result["dog"]["name[2]"], "radar")
    def test_simple_object_4(self):
        qs = "&id=foo&dog2[name]=lucy&dog2[name2]=lucy&dog[ color ]=brown"
        result = parse(qs)

        self.assertEqual(result["id"], "foo")
        self.assertEqual(result["dog2"]["name2"], "lucy")
        self.assertEqual(result["dog"]["color"], "brown")
    def test_simple(self):
        qs = "&id=foo&dog=lucy&cat=ollie"
        result = parse(qs)

        self.assertEqual(result["id"], "foo")
        self.assertEqual(result["dog"], "lucy")
        self.assertEqual(result["cat"], "ollie")
Beispiel #6
0
def update_micropub_syndicate_to():
    def adapt_expanded(targets):
        """Backcompat support for old-style "syndicate-to-expanded" properties,
        e.g.,
        {
          "id": "twitter::kylewmahan",
          "name": "@kylewmahan",
          "service": "Twitter"
        }
        """
        if targets:
            return [{
                'uid': t.get('id'),
                'name': '{} on {}'.format(t.get('name'), t.get('service')),
            } for t in targets]
        return targets

    endpt = flask_login.current_user.micropub_endpoint
    token = flask_login.current_user.access_token
    if not endpt or not token:
        return
    resp = util.requests_get(endpt,
                             params={
                                 'q': 'syndicate-to',
                             },
                             headers={
                                 'Authorization': 'Bearer ' + token,
                                 'Accept': 'application/json',
                             })
    if resp.status_code // 100 != 2:
        flask.current_app.logger.warn(
            'Unexpected response querying micropub endpoint %s: %s', resp,
            resp.text)
        return

    flask.current_app.logger.debug('syndicate-to response: %s %s', resp,
                                   resp.text)

    content_type = resp.headers['content-type']
    if content_type:
        content_type = content_type.split(';', 1)[0]

    try:
        if content_type == 'application/json':
            blob = resp.json()
            syndicate_tos = adapt_expanded(blob.get('syndicate-to-expanded'))
            if not syndicate_tos:
                syndicate_tos = blob.get('syndicate-to')

        else:  # try to parse query string
            syndicate_tos = pyquerystring.parse(resp.text).get(
                'syndicate-to', [])
            if isinstance(syndicate_tos, list):
                syndicate_tos = list(syndicate_tos)

        flask_login.current_user.set_setting('syndicate-to', syndicate_tos)
        db.session.commit()
    except ValueError as e:
        flask.flash('Could not parse syndicate-to response: {}'.format(e))
def scrobble(request):
    # check session
    session_key = request.POST.get("s")
    try:
        profile = ScrobbleSession.objects.get(key=session_key).profile
    except ScrobbleSession.DoesNotExist:
        return HttpResponseBadRequest("BADSESSION")

    # turn query into usable format
    query_string = request.POST.urlencode()
    data = parse(query_string)

    timestamps = data.get("i", [])
    artists = data.get("a", [])
    tracks = data.get("t", [])
    albums = data.get("b", [])
    lengths = data.get("l", [])
    tracknumbers = data.get("n", [])

    # create scrobble form
    excluded_fields = ["artist", "album", "track", "date"]
    ScrobbleForm = modelform_factory(Scrobble, exclude=excluded_fields)

    for i, a, t, b, l, n in zip_longest(
        timestamps, artists, tracks, albums, lengths, tracknumbers
    ):
        # check if scrobble exists
        scrobble = Scrobble.objects.filter(profile=profile, timestamp=i)
        if scrobble.exists():
            """
            The Audioscrobbler protocol requires us to fail silently here.
            Any response except "OK" would prompt new submission attempts from
            the client. However, if a scrobble with the same profile and
            timestamp is already in the database, this submission will never be
            accepted and the client will try re-submitting indefinitely for as
            long as the submission queue isn't flushed manually. Per protocol,
            only the "OK" response prompts the client to remove a submission
            from the queue.
            """
            continue

        form = ScrobbleForm(
            {
                "profile": profile.pk,
                "timestamp": i,
                "artist_name": a,
                "track_title": t,
                "album_title": b,
                "length": l,
                "tracknumber": n,
            }
        )

        if not form.is_valid():
            return HttpResponseBadRequest("FAILED request invalid")
        else:
            form.save()

    return HttpResponse("OK")
    def test_simple_array(self):
        qs = "&id=foo&dog[1]=lucy&dog[0]=tucker"
        result = parse(qs)

        self.assertEqual(result["id"], "foo")
        self.assertEqual(len(result["dog"]), 2)
        self.assertEqual(result["dog"][0], "tucker")
        self.assertEqual(result["dog"][1], "lucy")
    def test_object_with_array(self):
        qs = "&id=foo&dog[0].name=lucy&dog[1].name=radar"
        result = parse(qs)

        self.assertEqual(result["id"], "foo")
        self.assertEqual(len(result["dog"]), 2)
        self.assertEqual(result["dog"][0]["name"], "lucy")
        self.assertEqual(result["dog"][1]["name"], "radar")
 def test_multidimensional_array_with_object(self):
     qs = "&id=foo&dog[0][0].name=lucy&dog[0][1].name=radar&bar=baz"
     result = parse(qs)
     self.assertEqual(result["id"], "foo")
     self.assertEqual(result["bar"], "baz")
     self.assertEqual(len(result["dog"]), 1)
     self.assertEqual(result["dog"][0][0]["name"], "lucy")
     self.assertEqual(result["dog"][0][1]["name"], "radar")
 def test_list_gap(self):
     qs = "&id=foo&dog[2]=dexter&cat=ollie"
     result = parse(qs)
     self.assertEqual(result["id"], "foo")
     self.assertEqual(len(result["dog"]), 3)
     self.assertEqual(result["dog"][0], None)
     self.assertEqual(result["dog"][1], None)
     self.assertEqual(result["dog"][2], "dexter")
     self.assertEqual(result["cat"], "ollie")
Beispiel #12
0
 def __init__(self, httprequest):
     super(HttpRestRequest, self).__init__(httprequest)
     if self.httprequest.mimetype == 'application/json':
         self.params = json.loads(self.httprequest.data)
     else:
         # We reparse the query_string in order to handle data structure
         # more information on https://github.com/aventurella/pyquerystring
         self.params = pyquerystring.parse(self.httprequest.query_string)
     self._determine_context_lang()
    def test_multidimensional_array3x(self):
        qs = "&id=foo&dog[0][0][0]=lucy&dog[0][0][1]=radar&dog[0][0][2]=tucker"
        result = parse(qs)

        self.assertEqual(result["id"], "foo")
        self.assertEqual(len(result["dog"][0][0]), 3)
        self.assertEqual(result["dog"][0][0][0], "lucy")
        self.assertEqual(result["dog"][0][0][1], "radar")
        self.assertEqual(result["dog"][0][0][2], "tucker")
    def test_push_array_object(self):
        qs = "&id=foo&dog.name[]=radar&dog.name[]=tucker&dog.name[]=lucy"
        result = parse(qs)

        self.assertEqual(result["id"], "foo")
        self.assertEqual(len(result["dog"]["name"]), 3)
        self.assertEqual(result["dog"]["name"][0], "radar")
        self.assertEqual(result["dog"]["name"][1], "tucker")
        self.assertEqual(result["dog"]["name"][2], "lucy")
    def test_multidimensional_array2x_object(self):
        qs = "&id=foo&dog[0][0].name=lucy&dog[0][1].name=ollie&dog[1][0].name=radar"
        result = parse(qs)

        self.assertEqual(result["id"], "foo")
        self.assertEqual(len(result["dog"]), 2)
        self.assertEqual(result["dog"][0][0]["name"], "lucy")
        self.assertEqual(result["dog"][0][1]["name"], "ollie")
        self.assertEqual(result["dog"][1][0]["name"], "radar")
Beispiel #16
0
def update_micropub_syndicate_to():

    def adapt_expanded(targets):
        """Backcompat support for old-style "syndicate-to-expanded" properties,
        e.g.,
        {
          "id": "twitter::kylewmahan",
          "name": "@kylewmahan",
          "service": "Twitter"
        }
        """
        if targets:
            return [{
                'uid': t.get('id'),
                'name': '{} on {}'.format(t.get('name'), t.get('service')),
            } for t in targets]
        return targets

    endpt = flask_login.current_user.micropub_endpoint
    token = flask_login.current_user.access_token
    if not endpt or not token:
        return
    resp = util.requests_get(endpt, params={
        'q': 'syndicate-to',
    }, headers={
        'Authorization': 'Bearer ' + token,
        'Accept': 'application/json',
    })
    if resp.status_code // 100 != 2:
        flask.current_app.logger.warn(
            'Unexpected response querying micropub endpoint %s: %s',
            resp, resp.text)
        return

    flask.current_app.logger.debug('syndicate-to response: %s %s',
                                   resp, resp.text)

    content_type = resp.headers['content-type']
    if content_type:
        content_type = content_type.split(';', 1)[0]

    if content_type == 'application/json':
        blob = resp.json()
        syndicate_tos = adapt_expanded(blob.get('syndicate-to-expanded'))
        if not syndicate_tos:
            syndicate_tos = blob.get('syndicate-to')

    else:  # try to parse query string
        syndicate_tos = pyquerystring.parse(resp.text).get('syndicate-to', [])
        if isinstance(syndicate_tos, list):
            syndicate_tos = list(syndicate_tos)

    flask_login.current_user.set_setting('syndicate-to', syndicate_tos)
    db.session.commit()
Beispiel #17
0
 def __init__(self, httprequest):
     super(HttpRestRequest, self).__init__(httprequest)
     if self.httprequest.mimetype == 'application/json':
         self.params = json.loads(self.httprequest.data)
     else:
         # We reparse the query_string in order to handle data structure
         # more information on https://github.com/aventurella/pyquerystring
         self.params = pyquerystring.parse(self.httprequest.query_string)
     lang = self.httprequest.headers.get('Lang')
     if lang:
         self._context = self._context or {}
         self._context['lang'] = lang
 def test_array_with_object_with_array(self):
     qs = "&id=foo&dog[0].name=lucy&dog[0].attributes[0]=tail&dog[0].attributes[1]=paws&dog[0].attributes[2]=ears&dog[0].attributes[3].type=dog&dog[1].name=radar"
     result = parse(qs)
     self.assertEqual(result["id"], "foo")
     self.assertEqual(len(result["dog"]), 2)
     self.assertEqual(result["dog"][0]["name"], "lucy")
     self.assertEqual(len(result["dog"][0]["attributes"]), 4)
     self.assertEqual(result["dog"][0]["attributes"][0], "tail")
     self.assertEqual(result["dog"][0]["attributes"][1], "paws")
     self.assertEqual(result["dog"][0]["attributes"][2], "ears")
     self.assertEqual(result["dog"][0]["attributes"][3]["type"], "dog")
     self.assertEqual(result["dog"][1]["name"], "radar")
Beispiel #19
0
 def __init__(self, httprequest):
     super(HttpRestRequest, self).__init__(httprequest)
     if self.httprequest.mimetype == "application/json":
         data = self.httprequest.get_data().decode(self.httprequest.charset)
         try:
             self.params = json.loads(data)
         except ValueError as e:
             msg = "Invalid JSON data: %s" % str(e)
             _logger.info("%s: %s", self.httprequest.path, msg)
             raise BadRequest(msg) from e
     else:
         # We reparse the query_string in order to handle data structure
         # more information on https://github.com/aventurella/pyquerystring
         self.params = pyquerystring.parse(
             self.httprequest.query_string.decode("utf-8"))
     self._determine_context_lang()
    def test_lotsa_items(self):
        qs = (
            "&id=foo&dog[2]=dexter&dog[1]=tucker&dog[0]=lucy&dog[3]=lucy"
            "&dog[4]=lucy&dog[5]=lucy&dog[6]=lucy&dog[7]=lucy&dog[8]=lucy"
            "&dog[9]=lucy&dog[10]=fido&dog[11]=lucyagain"
        )
        result = parse(qs)

        self.assertEqual(result["id"], "foo")
        self.assertEqual(len(result["dog"]), 12)
        self.assertEqual(result["dog"][0], "lucy")
        self.assertEqual(result["dog"][1], "tucker")
        self.assertEqual(result["dog"][2], "dexter")
        self.assertEqual(result["dog"][3], "lucy")
        self.assertEqual(result["dog"][4], "lucy")
        self.assertEqual(result["dog"][5], "lucy")
        self.assertEqual(result["dog"][10], "fido")
        self.assertEqual(result["dog"][11], "lucyagain")
Beispiel #21
0
    def get_context_data(self, request):
        """
        Gets paginated data.
        Returned as json dict.
        """

        json_response = dict(draw=0,
                             recordsTotal=0,
                             recordsFiltered=0,
                             data=[])

        additional_data = request.GET.get("additional_data")
        filter_params = parse(additional_data) if additional_data else {}
        try:
            qs = self.get_initial_queryset(request)
            total_records = qs.count()
            qs = self.filter_by_search(qs)
            if filter_params:
                qs = qs.filter(**filter_params)

            # number of records after filtering
            total_display_records = qs.count()

            qs = self.ordering(qs)
            qs = self.paging(qs)
            data = self.prepare_results(qs)
            json_response.update({
                "draw": int(self._querydict.get('draw', 0)),
                "recordsTotal": total_records,
                "recordsFiltered": total_display_records,
                "data": data
            })

        except Exception as e:
            LOG.exception(str(e))
            json_response['error'] = self.report_traceback()

        return json_response
    def test_mixed1(self):
        qs = "&id=foo&dog[2]=dexter&dog[1]=tucker&dog[0]=lucy&cat=ollie\
&pets[1].name=pogo&pets[1].type=catz&pets[0].name=kiki\
&pets[0].type=cat&fish.name=robofish&fish.type=fishz\
&person.name[0]=adam&person.name[1]=adamz\
&plants.name[0][1]=flower&plants.name[0][0]=tree\
&plants.name[1][0]=willow&plants.name[1][1]=fern\
&end[0][0][0]=lucy&end[0][0][1]=radar&end[0][0][2]=tucker"
        result = parse(qs)

        self.assertEqual(result["id"], "foo")
        self.assertEqual(len(result["dog"]), 3)
        self.assertEqual(result["dog"][0], "lucy")
        self.assertEqual(result["dog"][1], "tucker")
        self.assertEqual(result["dog"][2], "dexter")
        self.assertEqual(result["cat"], "ollie")
        self.assertEqual(len(result["pets"]), 2)
        self.assertEqual(result["pets"][0]["name"], "kiki")
        self.assertEqual(result["pets"][0]["type"], "cat")
        self.assertEqual(result["pets"][1]["name"], "pogo")
        self.assertEqual(result["pets"][1]["type"], "catz")
        self.assertEqual(result["fish"]["name"], "robofish")
        self.assertEqual(result["fish"]["type"], "fishz")
        self.assertEqual(len(result["person"]["name"]), 2)
        self.assertEqual(result["person"]["name"][0], "adam")
        self.assertEqual(result["person"]["name"][1], "adamz")
        self.assertEqual(len(result["plants"]["name"]), 2)
        self.assertEqual(len(result["plants"]["name"][0]), 2)
        self.assertEqual(len(result["plants"]["name"][1]), 2)
        self.assertEqual(result["plants"]["name"][0][0], "tree")
        self.assertEqual(result["plants"]["name"][0][1], "flower")
        self.assertEqual(result["plants"]["name"][1][0], "willow")
        self.assertEqual(result["plants"]["name"][1][1], "fern")
        self.assertEqual(result["end"][0][0][0], "lucy")
        self.assertEqual(result["end"][0][0][1], "radar")
        self.assertEqual(result["end"][0][0][2], "tucker")
 def test_overlaping_array_objects(self):
     qs = "&id[1].name=foo&id[1].name=foo2"
     result = parse(qs)
     self.assertEqual(result["id"][1]['name'], "foo2")
Beispiel #24
0
 def _querydict(self):
     if self.request.method == 'POST':
         return self.request.POST
     else:
         return parse(self.request.GET)
    def test_simple_object_1(self):
        qs = "&id=foo&dog.name=lucy"
        result = parse(qs)

        self.assertEqual(result["id"], "foo")
        self.assertEqual(result["dog"]["name"], "lucy")
 def test_bad_format(self):
     qs = "&id=foo&dog[1]]=lucy"
     with self.assertRaises(IOError):
         parse(qs)
 def test_overlaping_array_keys(self):
     qs = "&id[1]=foo&id[1]=foo2"
     result = parse(qs)
     self.assertEqual(result["id"][1], "foo2")
Beispiel #28
0
    def _querydict(self):
        if self.request.method == 'POST':
            return self.request.POST

        return parse(self.request.GET)
Beispiel #29
0
def bench():
    parse("id=1")