View | Details | Raw Unified | Return to bug 41768
Collapse All | Expand All

(-)a/Koha/REST/V1/Biblios.pm (-1 / +10 lines)
Lines 474-480 sub pickup_locations { Link Here
474
    return $c->render_resource_not_found("Bibliographic record")
474
    return $c->render_resource_not_found("Bibliographic record")
475
        unless $biblio;
475
        unless $biblio;
476
476
477
    my $patron = Koha::Patrons->find( $c->param('patron_id') );
477
    my $patron;
478
    $patron = Koha::Patrons->find( $c->param('patron_id') );
479
480
    if ( $c->stash('is_public') || !$patron ) {
481
        my $userenv = C4::Context->userenv;
482
        if ( $userenv and $userenv->{number} ) {
483
            $patron = Koha::Patrons->find( $userenv->{number} );
484
        }
485
    }
486
478
    $c->req->params->remove('patron_id');
487
    $c->req->params->remove('patron_id');
479
488
480
    unless ($patron) {
489
    unless ($patron) {
(-)a/Koha/REST/V1/Holds.pm (+14 lines)
Lines 21-26 use Mojo::Base 'Mojolicious::Controller'; Link Here
21
21
22
use Mojo::JSON;
22
use Mojo::JSON;
23
23
24
use C4::Context;
24
use C4::Reserves;
25
use C4::Reserves;
25
26
26
use Koha::Items;
27
use Koha::Items;
Lines 543-548 sub pickup_locations { Link Here
543
    return $c->render_resource_not_found("Hold")
544
    return $c->render_resource_not_found("Hold")
544
        unless $hold;
545
        unless $hold;
545
546
547
    if ( $c->stash('is_public') ) {
548
        my $userenv = C4::Context->userenv;
549
        return $c->render(
550
            status  => 401,
551
            openapi => { error => 'Cannot find connected user' }
552
        ) unless ( $userenv and $userenv->{number} );
553
554
        return $c->render(
555
            status  => 403,
556
            openapi => { error => 'Hold do not belong to the connected user' }
557
        ) unless ( $hold->patron->id eq $userenv->{number} );
558
    }
559
546
    return try {
560
    return try {
547
        my $ps_set;
561
        my $ps_set;
548
562
(-)a/Koha/REST/V1/Items.pm (-2 / +10 lines)
Lines 19-24 use Modern::Perl; Link Here
19
19
20
use Mojo::Base 'Mojolicious::Controller';
20
use Mojo::Base 'Mojolicious::Controller';
21
21
22
use C4::Context;
22
use C4::Circulation qw( barcodedecode );
23
use C4::Circulation qw( barcodedecode );
23
24
24
use Koha::Items;
25
use Koha::Items;
Lines 210-217 sub pickup_locations { Link Here
210
    return $c->render_resource_not_found("Item")
211
    return $c->render_resource_not_found("Item")
211
        unless $item;
212
        unless $item;
212
213
213
    my $patron_id = $c->param('patron_id');
214
    my $patron;
214
    my $patron    = Koha::Patrons->find($patron_id);
215
    $patron = Koha::Patrons->find( $c->param('patron_id') );
216
217
    if ( $c->stash('is_public') || !$patron ) {
218
        my $userenv = C4::Context->userenv;
219
        if ( $userenv and $userenv->{number} ) {
220
            $patron = Koha::Patrons->find( $userenv->{number} );
221
        }
222
    }
215
223
216
    $c->req->params->remove('patron_id');
224
    $c->req->params->remove('patron_id');
217
225
(-)a/api/v1/swagger/paths/biblios.yaml (+56 lines)
Lines 920-922 Link Here
920
        description: Under maintenance
920
        description: Under maintenance
921
        schema:
921
        schema:
922
          $ref: "../swagger.yaml#/definitions/error"
922
          $ref: "../swagger.yaml#/definitions/error"
923
"/public/biblios/{biblio_id}/pickup_locations":
924
  get:
925
    x-mojo-to: Biblios#pickup_locations
926
    operationId: getBiblioPickupLocationsPublic
927
    tags:
928
      - biblios
929
    summary: Get valid pickup locations for a biblio for the connected user
930
    parameters:
931
      - $ref: "../swagger.yaml#/parameters/biblio_id_pp"
932
      - $ref: "../swagger.yaml#/parameters/match"
933
      - $ref: "../swagger.yaml#/parameters/order_by"
934
      - $ref: "../swagger.yaml#/parameters/page"
935
      - $ref: "../swagger.yaml#/parameters/per_page"
936
      - $ref: "../swagger.yaml#/parameters/q_param"
937
      - $ref: "../swagger.yaml#/parameters/q_body"
938
    consumes:
939
      - application/json
940
    produces:
941
      - application/json
942
    responses:
943
      "200":
944
        description: Biblio pickup locations
945
        schema:
946
          type: array
947
          items:
948
            $ref: "../swagger.yaml#/definitions/library"
949
      "400":
950
        description: |
951
          Bad request. Possible `error_code` attribute values:
952
953
            * `invalid_query`
954
        schema:
955
          $ref: "../swagger.yaml#/definitions/error"
956
      "401":
957
        description: Authentication required
958
        schema:
959
          $ref: "../swagger.yaml#/definitions/error"
960
      "403":
961
        description: Access forbidden
962
        schema:
963
          $ref: "../swagger.yaml#/definitions/error"
964
      "404":
965
        description: Bibliographic record not found
966
        schema:
967
          $ref: "../swagger.yaml#/definitions/error"
968
      "500":
969
        description: |
970
          Internal server error. Possible `error_code` attribute values:
971
972
          * `internal_server_error`
973
        schema:
974
          $ref: "../swagger.yaml#/definitions/error"
975
      "503":
976
        description: Under maintenance
977
        schema:
978
          $ref: "../swagger.yaml#/definitions/error"
(-)a/api/v1/swagger/paths/holds.yaml (+65 lines)
Lines 957-959 Link Here
957
    x-koha-authorization:
957
    x-koha-authorization:
958
      permissions:
958
      permissions:
959
        reserveforothers: modify_holds_priority
959
        reserveforothers: modify_holds_priority
960
"/public/holds/{hold_id}/pickup_locations":
961
  get:
962
    x-mojo-to: Holds#pickup_locations
963
    operationId: getHoldPickupLocationsPublic
964
    tags:
965
      - holds
966
    summary: Get valid pickup locations for hold
967
    parameters:
968
      - name: x-koha-override
969
        in: header
970
        required: false
971
        description: Overrides list sent as a request header
972
        type: array
973
        items:
974
          type: string
975
          enum:
976
            - any
977
        collectionFormat: csv
978
      - $ref: "../swagger.yaml#/parameters/hold_id_pp"
979
      - $ref: "../swagger.yaml#/parameters/match"
980
      - $ref: "../swagger.yaml#/parameters/order_by"
981
      - $ref: "../swagger.yaml#/parameters/page"
982
      - $ref: "../swagger.yaml#/parameters/per_page"
983
      - $ref: "../swagger.yaml#/parameters/q_param"
984
      - $ref: "../swagger.yaml#/parameters/q_body"
985
      - $ref: "../swagger.yaml#/parameters/request_id_header"
986
    produces:
987
      - application/json
988
    responses:
989
      "200":
990
        description: Hold pickup location
991
        schema:
992
          type: array
993
          items:
994
            $ref: "../swagger.yaml#/definitions/library"
995
      "400":
996
        description: |
997
          Bad request. Possible `error_code` attribute values:
998
999
            * `invalid_query`
1000
        schema:
1001
          $ref: "../swagger.yaml#/definitions/error"
1002
      "401":
1003
        description: Authentication required
1004
        schema:
1005
          $ref: "../swagger.yaml#/definitions/error"
1006
      "403":
1007
        description: Hold pickup location list not allowed
1008
        schema:
1009
          $ref: "../swagger.yaml#/definitions/error"
1010
      "404":
1011
        description: Hold not found
1012
        schema:
1013
          $ref: "../swagger.yaml#/definitions/error"
1014
      "500":
1015
        description: |
1016
          Internal server error. Possible `error_code` attribute values:
1017
1018
          * `internal_server_error`
1019
        schema:
1020
          $ref: "../swagger.yaml#/definitions/error"
1021
      "503":
1022
        description: Under maintenance
1023
        schema:
1024
          $ref: "../swagger.yaml#/definitions/error"
(-)a/api/v1/swagger/paths/items.yaml (+57 lines)
Lines 542-544 Link Here
542
        description: Under maintenance
542
        description: Under maintenance
543
        schema:
543
        schema:
544
          $ref: "../swagger.yaml#/definitions/error"
544
          $ref: "../swagger.yaml#/definitions/error"
545
"/public/items/{item_id}/pickup_locations":
546
  get:
547
    x-mojo-to: Items#pickup_locations
548
    operationId: getItemPickupLocationsPublic
549
    summary: Get valid pickup locations for an item for the connected user
550
    tags:
551
      - items
552
    parameters:
553
      - $ref: "../swagger.yaml#/parameters/item_id_pp"
554
      - $ref: "../swagger.yaml#/parameters/match"
555
      - $ref: "../swagger.yaml#/parameters/order_by"
556
      - $ref: "../swagger.yaml#/parameters/page"
557
      - $ref: "../swagger.yaml#/parameters/per_page"
558
      - $ref: "../swagger.yaml#/parameters/q_param"
559
      - $ref: "../swagger.yaml#/parameters/q_body"
560
      - $ref: "../swagger.yaml#/parameters/request_id_header"
561
    consumes:
562
      - application/json
563
    produces:
564
      - application/json
565
    responses:
566
      "200":
567
        description: Item pickup locations
568
        schema:
569
          type: array
570
          items:
571
            $ref: "../swagger.yaml#/definitions/library"
572
      "400":
573
        description: |
574
          Bad request. Possible `error_code` attribute values:
575
576
            * `invalid_query`
577
        schema:
578
          $ref: "../swagger.yaml#/definitions/error"
579
      "401":
580
        description: Authentication required
581
        schema:
582
          $ref: "../swagger.yaml#/definitions/error"
583
      "403":
584
        description: Access forbidden
585
        schema:
586
          $ref: "../swagger.yaml#/definitions/error"
587
      "404":
588
        description: Bibliographic record not found
589
        schema:
590
          $ref: "../swagger.yaml#/definitions/error"
591
      "500":
592
        description: |
593
          Internal server error. Possible `error_code` attribute values:
594
595
          * `internal_server_error`
596
        schema:
597
          $ref: "../swagger.yaml#/definitions/error"
598
      "503":
599
        description: Under maintenance
600
        schema:
601
          $ref: "../swagger.yaml#/definitions/error"
(-)a/api/v1/swagger/swagger.yaml (+6 lines)
Lines 555-560 paths: Link Here
555
    $ref: ./paths/checkouts.yaml#/~1public~1checkouts~1availability
555
    $ref: ./paths/checkouts.yaml#/~1public~1checkouts~1availability
556
  "/public/items":
556
  "/public/items":
557
    $ref: "./paths/items.yaml#/~1public~1items"
557
    $ref: "./paths/items.yaml#/~1public~1items"
558
  "/public/items/{item_id}/pickup_locations":
559
    $ref: "./paths/items.yaml#/~1public~1items~1{item_id}~1pickup_locations"
560
  "/public/holds/{hold_id}/pickup_locations":
561
    $ref: "./paths/holds.yaml#/~1public~1holds~1{hold_id}~1pickup_locations"
562
  "/public/biblios/{biblio_id}/pickup_locations":
563
    $ref: "./paths/biblios.yaml#/~1public~1biblios~1{biblio_id}~1pickup_locations"
558
  "/public/biblios/{biblio_id}/items":
564
  "/public/biblios/{biblio_id}/items":
559
    $ref: "./paths/biblios.yaml#/~1public~1biblios~1{biblio_id}~1items"
565
    $ref: "./paths/biblios.yaml#/~1public~1biblios~1{biblio_id}~1items"
560
  "/public/biblios/{biblio_id}/ratings":
566
  "/public/biblios/{biblio_id}/ratings":
(-)a/koha-tmpl/opac-tmpl/bootstrap/js/pickup-locations.js (-10 / +3 lines)
Lines 44-50 Link Here
44
     *
44
     *
45
     * It expects the select object to contain several data-* attributes
45
     * It expects the select object to contain several data-* attributes
46
     * - data-pickup-location-source: 'biblio', 'item' or 'hold' (default)
46
     * - data-pickup-location-source: 'biblio', 'item' or 'hold' (default)
47
     * - data-patron-id: required for 'biblio' and 'item'
48
     * - data-biblio-id: required for 'biblio' only
47
     * - data-biblio-id: required for 'biblio' only
49
     * - data-item-id: required for 'item' only
48
     * - data-item-id: required for 'item' only
50
     *
49
     *
Lines 54-60 Link Here
54
    $.fn.pickup_locations_dropdown = function () {
53
    $.fn.pickup_locations_dropdown = function () {
55
        var select = $(this);
54
        var select = $(this);
56
        var pickup_location_source = $(this).data("pickup-location-source");
55
        var pickup_location_source = $(this).data("pickup-location-source");
57
        var patron_id = $(this).data("patron-id");
58
        var biblio_id = $(this).data("biblio-id");
56
        var biblio_id = $(this).data("biblio-id");
59
        var item_id = $(this).data("item-id");
57
        var item_id = $(this).data("item-id");
60
        var hold_id = $(this).data("hold-id");
58
        var hold_id = $(this).data("hold-id");
Lines 63-80 Link Here
63
61
64
        if (pickup_location_source === "biblio") {
62
        if (pickup_location_source === "biblio") {
65
            url =
63
            url =
66
                "/api/v1/biblios/" +
64
                "/api/v1/public/biblios/" +
67
                encodeURIComponent(biblio_id) +
65
                encodeURIComponent(biblio_id) +
68
                "/pickup_locations";
66
                "/pickup_locations";
69
        } else if (pickup_location_source === "item") {
67
        } else if (pickup_location_source === "item") {
70
            url =
68
            url =
71
                "/api/v1/items/" +
69
                "/api/v1/public/items/" +
72
                encodeURIComponent(item_id) +
70
                encodeURIComponent(item_id) +
73
                "/pickup_locations";
71
                "/pickup_locations";
74
        } else {
72
        } else {
75
            // hold
73
            // hold
76
            url =
74
            url =
77
                "/api/v1/holds/" +
75
                "/api/v1/public/holds/" +
78
                encodeURIComponent(hold_id) +
76
                encodeURIComponent(hold_id) +
79
                "/pickup_locations";
77
                "/pickup_locations";
80
        }
78
        }
Lines 98-107 Link Here
98
                        _page: params.page,
96
                        _page: params.page,
99
                    };
97
                    };
100
98
101
                    if (pickup_location_source !== "hold") {
102
                        query["patron_id"] = patron_id;
103
                    }
104
105
                    return query;
99
                    return query;
106
                },
100
                },
107
                processResults: function (data) {
101
                processResults: function (data) {
108
- 

Return to bug 41768