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

(-)a/Koha/REST/V1/DisplayItems.pm (+259 lines)
Line 0 Link Here
1
package Koha::REST::V1::DisplayItems;
2
3
# This file is part of Koha.
4
#
5
# Koha is free software; you can redistribute it and/or modify it
6
# under the terms of the GNU General Public License as published by
7
# the Free Software Foundation; either version 3 of the License, or
8
# (at your option) any later version.
9
#
10
# Koha is distributed in the hope that it will be useful, but
11
# WITHOUT ANY WARRANTY; without even the implied warranty of
12
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
13
# GNU General Public License for more details.
14
#
15
# You should have received a copy of the GNU General Public License
16
# along with Koha; if not, see <http://www.gnu.org/licenses>.
17
18
use Modern::Perl;
19
20
use Mojo::Base 'Mojolicious::Controller';
21
22
use Koha::DisplayItem;
23
use Koha::DisplayItems;
24
use Koha::Displays;
25
26
use Try::Tiny    qw( catch try );
27
use Scalar::Util qw( blessed );
28
29
use Koha::BackgroundJob::BatchAddDisplayItems;
30
use Koha::BackgroundJob::BatchDeleteDisplayItems;
31
32
=head1 API
33
34
=head2 Methods
35
36
=head3 list
37
38
=cut
39
40
sub list {
41
    my $c = shift->openapi->valid_input or return;
42
43
    return try {
44
        my $displayitems = $c->objects->search( Koha::DisplayItems->new );
45
        return $c->render( status => 200, openapi => $displayitems );
46
    } catch {
47
        $c->unhandled_exception($_);
48
    };
49
50
}
51
52
=head3 get
53
54
=cut
55
56
sub get {
57
    my $c = shift->openapi->valid_input or return;
58
59
    return try {
60
        my $displayitem = Koha::DisplayItems->find(
61
            {
62
                display_item_id => $c->param('display_item_id'),
63
                display_id      => $c->param('display_id'),
64
                itemnumber      => $c->param('item_id')
65
            }
66
        );
67
        return $c->render_resource_not_found("Display item")
68
            unless $displayitem;
69
70
        return $c->render( status => 200, openapi => $c->objects->to_api($displayitem), );
71
    } catch {
72
        $c->unhandled_exception($_);
73
    };
74
}
75
76
=head3 add
77
78
=cut
79
80
sub add {
81
    my $c = shift->openapi->valid_input or return;
82
83
    return try {
84
        my $displayitem = Koha::DisplayItem->new_from_api( $c->req->json );
85
        $displayitem->store;
86
        $c->res->headers->location(
87
            $c->req->url->to_string . '/' . $displayitem->display_id . '/' . $displayitem->itemnumber );
88
        return $c->render(
89
            status  => 201,
90
            openapi => $c->objects->to_api($displayitem),
91
        );
92
    } catch {
93
        $c->unhandled_exception($_);
94
    };
95
}
96
97
=head3 update
98
99
=cut
100
101
sub update {
102
    my $c = shift->openapi->valid_input or return;
103
104
    my $displayitem = Koha::DisplayItems->find(
105
        {
106
            display_item_id => $c->param('display_item_id'),
107
            display_id      => $c->param('display_id'),
108
            itemnumber      => $c->param('item_id')
109
        }
110
    );
111
112
    return $c->render_resource_not_found("Display item")
113
        unless $displayitem;
114
115
    return try {
116
        $displayitem->set_from_api( $c->req->json );
117
        $displayitem->store();
118
        return $c->render( status => 200, openapi => $c->objects->to_api($displayitem), );
119
    } catch {
120
        $c->unhandled_exception($_);
121
    };
122
}
123
124
=head3 delete
125
126
=cut
127
128
sub delete {
129
    my $c = shift->openapi->valid_input or return;
130
131
    my $displayitem = Koha::DisplayItems->find(
132
        {
133
            display_item_id => $c->param('display_item_id'),
134
            display_id      => $c->param('display_id'),
135
            itemnumber      => $c->param('item_id')
136
        }
137
    );
138
139
    return $c->render_resource_not_found("Display item")
140
        unless $displayitem;
141
142
    return try {
143
        $displayitem->delete;
144
        return $c->render_resource_deleted;
145
    } catch {
146
        $c->unhandled_exception($_);
147
    };
148
}
149
150
=head3 list_public
151
152
=cut
153
154
sub list_public {
155
    my $c = shift->openapi->valid_input or return;
156
157
    return try {
158
        my $displayitems = $c->objects->search( Koha::DisplayItems->new );
159
        return $c->render( status => 200, openapi => $displayitems );
160
    } catch {
161
        $c->unhandled_exception($_);
162
    };
163
}
164
165
=head3 get_public
166
167
=cut
168
169
sub get_public {
170
    my $c = shift->openapi->valid_input or return;
171
172
    return try {
173
        my $displayitem = Koha::DisplayItems->find(
174
            {
175
                display_item_id => $c->param('display_item_id'),
176
                display_id      => $c->param('display_id'),
177
                itemnumber      => $c->param('item_id')
178
            }
179
        );
180
        return $c->render_resource_not_found("Display item")
181
            unless $displayitem;
182
183
        return $c->render( status => 200, openapi => $c->objects->to_api($displayitem), );
184
    } catch {
185
        $c->unhandled_exception($_);
186
    };
187
}
188
189
=head3 batch_add
190
191
Add multiple items to a display
192
193
=cut
194
195
sub batch_add {
196
    my $c = shift->openapi->valid_input or return;
197
198
    return try {
199
        my $body = $c->req->json;
200
201
        # Validate that display exists
202
        my $display = Koha::Displays->find( $body->{display_id} );
203
        return $c->render_resource_not_found("Display")
204
            unless $display;
205
206
        # Enqueue background job for batch processing
207
        my $job_id = Koha::BackgroundJob::BatchAddDisplayItems->new->enqueue(
208
            {
209
                display_id  => $body->{display_id},
210
                item_ids    => $body->{item_ids},
211
                date_remove => $body->{date_remove} // undef,
212
            }
213
        );
214
215
        return $c->render(
216
            status  => 202,
217
            openapi => {
218
                job_id  => $job_id,
219
                message => "Batch add operation queued"
220
            }
221
        );
222
    } catch {
223
        $c->unhandled_exception($_);
224
    };
225
}
226
227
=head3 batch_delete
228
229
Remove multiple items from displays
230
231
=cut
232
233
sub batch_delete {
234
    my $c = shift->openapi->valid_input or return;
235
236
    return try {
237
        my $body = $c->req->json;
238
239
        # Enqueue background job for batch processing
240
        my $job_id = Koha::BackgroundJob::BatchDeleteDisplayItems->new->enqueue(
241
            {
242
                item_ids   => $body->{item_ids},
243
                display_id => $body->{display_id} // undef,
244
            }
245
        );
246
247
        return $c->render(
248
            status  => 202,
249
            openapi => {
250
                job_id  => $job_id,
251
                message => "Batch delete operation queued"
252
            }
253
        );
254
    } catch {
255
        $c->unhandled_exception($_);
256
    };
257
}
258
259
1;
(-)a/Koha/REST/V1/Displays.pm (+250 lines)
Line 0 Link Here
1
package Koha::REST::V1::Displays;
2
3
# This file is part of Koha.
4
#
5
# Koha is free software; you can redistribute it and/or modify it
6
# under the terms of the GNU General Public License as published by
7
# the Free Software Foundation; either version 3 of the License, or
8
# (at your option) any later version.
9
#
10
# Koha is distributed in the hope that it will be useful, but
11
# WITHOUT ANY WARRANTY; without even the implied warranty of
12
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
13
# GNU General Public License for more details.
14
#
15
# You should have received a copy of the GNU General Public License
16
# along with Koha; if not, see <http://www.gnu.org/licenses>.
17
18
use Modern::Perl;
19
20
use Mojo::Base 'Mojolicious::Controller';
21
22
use Koha::Display;
23
use Koha::Displays;
24
use Koha::DateUtils qw( dt_from_string );
25
26
use Try::Tiny qw( catch try );
27
28
=head1 API
29
30
=head2 Methods
31
32
=head3 config
33
34
Return the configuration options needed for the Display Vue app
35
36
=cut
37
38
sub config {
39
    my $c = shift->openapi->valid_input or return;
40
41
    my $patron = $c->stash('koha.user');
42
43
    return $c->render(
44
        status  => 200,
45
        openapi => {
46
            settings => {
47
                enabled => C4::Context->preference('UseDisplayModule'),
48
            },
49
        },
50
    );
51
}
52
53
=head3 list
54
55
=cut
56
57
sub list {
58
    my $c = shift->openapi->valid_input or return;
59
60
    return try {
61
        my $displays_set = Koha::Displays->new;
62
63
        my $active = $c->param('active');
64
        if ( defined $active && $active ) {
65
            $displays_set = $displays_set->active;
66
        }
67
68
        # Filter displays based on user's library permissions
69
        my $patron = $c->stash('koha.user');
70
        if ($patron) {
71
            my @restricted_branchcodes = $patron->libraries_where_can_edit_displays;
72
            if (@restricted_branchcodes) {
73
74
                # User can only see displays from specific libraries
75
                $displays_set = $displays_set->search( { 'me.display_branch' => { -in => \@restricted_branchcodes } } );
76
            }
77
78
            # If @restricted_branchcodes is empty, user has access to all displays
79
        }
80
81
        my $displays = $c->objects->search($displays_set);
82
        return $c->render( status => 200, openapi => $displays );
83
    } catch {
84
        $c->unhandled_exception($_);
85
    };
86
87
}
88
89
=head3 get
90
91
=cut
92
93
sub get {
94
    my $c = shift->openapi->valid_input or return;
95
96
    return try {
97
        my $display = Koha::Displays->find( $c->param('display_id') );
98
        return $c->render_resource_not_found("Display")
99
            unless $display;
100
101
        # Check if user has permission to view this display
102
        my $patron = $c->stash('koha.user');
103
        if ($patron) {
104
            my @restricted_branchcodes = $patron->libraries_where_can_edit_displays;
105
            if (@restricted_branchcodes) {
106
107
                # User can only see displays from specific libraries
108
                unless ( grep { $_ eq $display->display_branch } @restricted_branchcodes ) {
109
                    return $c->render_resource_not_found("Display");
110
                }
111
            }
112
113
            # If @restricted_branchcodes is empty, user has access to all displays
114
        }
115
116
        return $c->render( status => 200, openapi => $c->objects->to_api($display), );
117
    } catch {
118
        $c->unhandled_exception($_);
119
    };
120
}
121
122
=head3 add
123
124
=cut
125
126
sub add {
127
    my $c = shift->openapi->valid_input or return;
128
129
    return try {
130
        my $body = $c->req->json;
131
132
        my $display_items = delete $body->{display_items} || [];
133
134
        my $display = Koha::Display->new_from_api($body)->store;
135
        $display->display_items($display_items);
136
137
        $c->res->headers->location( $c->req->url->to_string . '/' . $display->display_id );
138
        return $c->render(
139
            status  => 201,
140
            openapi => $c->objects->to_api($display),
141
        );
142
    } catch {
143
        $c->unhandled_exception($_);
144
    };
145
}
146
147
=head3 update
148
149
=cut
150
151
sub update {
152
    my $c = shift->openapi->valid_input or return;
153
154
    my $display = Koha::Displays->find( $c->param('display_id') );
155
156
    return $c->render_resource_not_found("Display")
157
        unless $display;
158
159
    return try {
160
        my $body = $c->req->json;
161
162
        my $display_items = delete $body->{display_items} || [];
163
164
        $display->set_from_api($body)->store;
165
        $display->display_items($display_items);
166
167
        return $c->render( status => 200, openapi => $c->objects->to_api($display), );
168
    } catch {
169
        $c->unhandled_exception($_);
170
    };
171
}
172
173
=head3 delete
174
175
=cut
176
177
sub delete {
178
    my $c = shift->openapi->valid_input or return;
179
180
    my $display = Koha::Displays->find( $c->param('display_id') );
181
182
    return $c->render_resource_not_found("Display")
183
        unless $display;
184
185
    return try {
186
        $display->delete;
187
        return $c->render_resource_deleted;
188
    } catch {
189
        $c->unhandled_exception($_);
190
    };
191
}
192
193
=head3 list_public
194
195
=cut
196
197
sub list_public {
198
    my $c = shift->openapi->valid_input or return;
199
200
    return try {
201
        my $displays_set = Koha::Displays->new;
202
203
        my $active = $c->param('active');
204
        if ( defined $active && $active ) {
205
            $displays_set = $displays_set->active;
206
        } else {
207
            my $today = dt_from_string->truncate( to => 'day' );
208
            $displays_set = $displays_set->search(
209
                {
210
                    -or => [
211
                        { end_date => { '>=' => $today } },
212
                        { end_date => undef }
213
                    ]
214
                }
215
            );
216
        }
217
218
        my $displays = $c->objects->search($displays_set);
219
        return $c->render( status => 200, openapi => $displays );
220
    } catch {
221
        $c->unhandled_exception($_);
222
    };
223
}
224
225
=head3 get_public
226
227
=cut
228
229
sub get_public {
230
    my $c = shift->openapi->valid_input or return;
231
232
    return try {
233
        my $display = Koha::Displays->find( $c->param('display_id') );
234
235
        return $c->render_resource_not_found("Display")
236
            unless $display;
237
238
        my $today = dt_from_string->truncate( to => 'day' )->ymd;
239
240
        if ( $display->end_date && $display->end_date < $today ) {
241
            return $c->render_resource_not_found("Display");
242
        }
243
244
        return $c->render( status => 200, openapi => $c->objects->to_api($display), );
245
    } catch {
246
        $c->unhandled_exception($_);
247
    };
248
}
249
250
1;
(-)a/api/v1/swagger/definitions/display.yaml (+97 lines)
Line 0 Link Here
1
---
2
type: object
3
properties:
4
  display_id:
5
    type: integer
6
    description: internally assigned display identifier
7
    readOnly: true
8
  display_name:
9
    description: display name
10
    type: string
11
  start_date:
12
    description: display start date
13
    type:
14
      - string
15
      - "null"
16
    format: date
17
  end_date:
18
    description: display end date
19
    type:
20
      - string
21
      - "null"
22
    format: date
23
  enabled:
24
    description: determines whether the display is active
25
    type: boolean
26
  display_location:
27
    description: shelving location for the display
28
    type:
29
      - string
30
      - "null"
31
  display_code:
32
    description: collection code for the display
33
    type:
34
      - string
35
      - "null"
36
  display_branch:
37
    description: home branch for items while on display
38
    type:
39
      - string
40
      - "null"
41
  display_holding_branch:
42
    description: holding branch for items while on display
43
    type:
44
      - string
45
      - "null"
46
  display_itype:
47
    description: item type for items while on display
48
    type:
49
      - string
50
      - "null"
51
  staff_note:
52
    description: staff note for the display
53
    type:
54
      - string
55
      - "null"
56
  public_note:
57
    description: public note for the display
58
    type:
59
      - string
60
      - "null"
61
  display_days:
62
    description: default number of days items will remain on display
63
    type:
64
      - integer
65
      - "null"
66
  display_return_over:
67
    description: should the item be removed from the display when it is returned
68
    type: string
69
    enum:
70
      - "yes - any library"
71
      - "yes - except at home library"
72
      - "no"
73
    default: "no"
74
  display_items:
75
    type:
76
      - array
77
      - "null"
78
    description: The object representing the display items
79
  library:
80
    type:
81
      - object
82
      - "null"
83
    description: The object representing the display library
84
  item_type:
85
    type:
86
      - object
87
      - "null"
88
    description: The object representing the display item type
89
  _strings:
90
    type:
91
      - object
92
      - "null"
93
additionalProperties: false
94
required:
95
  - display_name
96
  - enabled
97
  - display_return_over 
(-)a/api/v1/swagger/definitions/display_config.yaml (+7 lines)
Line 0 Link Here
1
---
2
type: object
3
properties:
4
  settings:
5
    type: object
6
    description: List of sysprefs used for the Displays module
7
additionalProperties: false
(-)a/api/v1/swagger/definitions/displayitem.yaml (+31 lines)
Line 0 Link Here
1
---
2
type: object
3
properties:
4
  display_item_id:
5
    type: integer
6
    description: primary key
7
  display_id:
8
    type: integer
9
    description: foreign key to link to displays.display_id
10
  itemnumber:
11
    type: integer
12
    description: items.itemnumber for the item on display
13
  biblionumber:
14
    type: integer
15
    description: biblio.biblionumber for the bibliographic record on display
16
  date_added:
17
    description: the date the item was added to the display
18
    type:
19
      - string
20
      - "null"
21
    format: date
22
  date_remove:
23
    description: the date the item should be removed from the display
24
    type:
25
      - string
26
      - "null"
27
    format: date
28
additionalProperties: false
29
required:
30
  - display_id
31
  - itemnumber
(-)a/api/v1/swagger/definitions/item.yaml (+20 lines)
Lines 38-43 properties: Link Here
38
      - "null"
38
      - "null"
39
    description: Internal library id for the library the item belongs to
39
    description: Internal library id for the library the item belongs to
40
    maxLength: 10
40
    maxLength: 10
41
  effective_home_library_id:
42
    type:
43
      - string
44
      - "null"
45
    description: Effective home library id - shows display branch if item is on an active display, otherwise regular home branch
41
  purchase_price:
46
  purchase_price:
42
    type:
47
    type:
43
      - number
48
      - number
Lines 153-158 properties: Link Here
153
      - "null"
158
      - "null"
154
    description: Library that is currently in possession item
159
    description: Library that is currently in possession item
155
    maxLength: 10
160
    maxLength: 10
161
  effective_holding_library_id:
162
    type:
163
      - string
164
      - "null"
165
    description: Effective holding library id - shows display holding branch if item is on an active display, otherwise regular holding branch
156
  timestamp:
166
  timestamp:
157
    type: string
167
    type: string
158
    format: date-time
168
    format: date-time
Lines 197-202 properties: Link Here
197
      - "null"
207
      - "null"
198
    description: Authorized value for the collection code associated with this item
208
    description: Authorized value for the collection code associated with this item
199
    maxLength: 80
209
    maxLength: 80
210
  effective_collection_code:
211
    type:
212
      - string
213
      - "null"
214
    description: Effective collection code - shows display collection code if item is on an active display, otherwise regular collection code
200
  materials_notes:
215
  materials_notes:
201
    type:
216
    type:
202
      - string
217
      - string
Lines 223-228 properties: Link Here
223
      - string
238
      - string
224
      - "null"
239
      - "null"
225
    description: Effective itemtype defining the type for this item_id
240
    description: Effective itemtype defining the type for this item_id
241
  effective_location:
242
    type:
243
      - string
244
      - "null"
245
    description: Effective location code - shows display location if item is on an active display, otherwise regular location
226
  extended_subfields:
246
  extended_subfields:
227
    type:
247
    type:
228
      - string
248
      - string
(-)a/api/v1/swagger/paths/displayitems.yaml (+395 lines)
Line 0 Link Here
1
---
2
/display/items:
3
  get:
4
    x-mojo-to: DisplayItems#list
5
    operationId: listDisplayItems
6
    tags:
7
      - displayitems
8
    summary: List display items
9
    produces:
10
      - application/json
11
    parameters:
12
      - name: display_item_id
13
        in: query
14
        description: Filter by display item ID
15
        required: false
16
        type: integer
17
      - name: display_id
18
        in: query
19
        description: Filter by display ID
20
        required: false
21
        type: integer
22
      - name: itemnumber
23
        in: query
24
        description: Filter by item number
25
        required: false
26
        type: integer
27
      - name: biblionumber
28
        in: query
29
        description: Filter by bibliographic record number
30
        required: false
31
        type: integer
32
      - name: date_added
33
        in: query
34
        description: Filter by date added
35
        required: false
36
        type: string
37
        format: date
38
      - name: date_remove
39
        in: query
40
        description: Filter by date to remove
41
        required: false
42
        type: string
43
        format: date
44
      - $ref: "../swagger.yaml#/parameters/match"
45
      - $ref: "../swagger.yaml#/parameters/order_by"
46
      - $ref: "../swagger.yaml#/parameters/page"
47
      - $ref: "../swagger.yaml#/parameters/per_page"
48
      - $ref: "../swagger.yaml#/parameters/q_param"
49
      - $ref: "../swagger.yaml#/parameters/q_body"
50
      - $ref: "../swagger.yaml#/parameters/request_id_header"
51
    responses:
52
      "200":
53
        description: A list of display items
54
        schema:
55
          type: array
56
          items:
57
            $ref: "../swagger.yaml#/definitions/displayitem"
58
      "400":
59
        description: |
60
          Bad request. Possible `error_code` attribute values:
61
62
            * `invalid_query`
63
        schema:
64
          $ref: "../swagger.yaml#/definitions/error"
65
      "403":
66
        description: Access forbidden
67
        schema:
68
          $ref: "../swagger.yaml#/definitions/error"
69
      "500":
70
        description: |
71
          Internal server error. Possible `error_code` attribute values:
72
73
          * `internal_server_error`
74
        schema:
75
          $ref: "../swagger.yaml#/definitions/error"
76
      "503":
77
        description: Under maintenance
78
        schema:
79
          $ref: "../swagger.yaml#/definitions/error"
80
    x-koha-authorization:
81
      permissions:
82
        displays: "*"
83
  post:
84
    x-mojo-to: DisplayItems#add
85
    operationId: addDisplayItem
86
    tags:
87
      - displayitems
88
    summary: Add display item
89
    parameters:
90
      - name: body
91
        in: body
92
        description: A JSON object containing information about the new display item
93
        required: true
94
        schema:
95
          $ref: "../swagger.yaml#/definitions/displayitem"
96
    produces:
97
      - application/json
98
    responses:
99
      "201":
100
        description: Display item added
101
        schema:
102
          $ref: "../swagger.yaml#/definitions/displayitem"
103
      "400":
104
        description: Bad request
105
        schema:
106
          $ref: "../swagger.yaml#/definitions/error"
107
      "401":
108
        description: Authentication required
109
        schema:
110
          $ref: "../swagger.yaml#/definitions/error"
111
      "403":
112
        description: Access forbidden
113
        schema:
114
          $ref: "../swagger.yaml#/definitions/error"
115
      "500":
116
        description: |
117
          Internal server error. Possible `error_code` attribute values:
118
119
          * `internal_server_error`
120
        schema:
121
          $ref: "../swagger.yaml#/definitions/error"
122
      "503":
123
        description: Under maintenance
124
        schema:
125
          $ref: "../swagger.yaml#/definitions/error"
126
    x-koha-authorization:
127
      permissions:
128
        displays: add_items_to_display
129
"/display/items/{display_id}/{item_id}":
130
  get:
131
    x-mojo-to: DisplayItems#get
132
    operationId: getDisplayItem
133
    tags:
134
      - displayitems
135
    summary: Get display item
136
    parameters:
137
      - $ref: "../swagger.yaml#/parameters/display_id_pp"
138
      - $ref: "../swagger.yaml#/parameters/item_id_pp"
139
    produces:
140
      - application/json
141
    responses:
142
      "200":
143
        description: A display item
144
        schema:
145
          $ref: "../swagger.yaml#/definitions/displayitem"
146
      "400":
147
        description: Bad request
148
        schema:
149
          $ref: "../swagger.yaml#/definitions/error"
150
      "404":
151
        description: Display item not found
152
        schema:
153
          $ref: "../swagger.yaml#/definitions/error"
154
      "500":
155
        description: |
156
          Internal server error. Possible `error_code` attribute values:
157
158
          * `internal_server_error`
159
        schema:
160
          $ref: "../swagger.yaml#/definitions/error"
161
      "503":
162
        description: Under maintenance
163
        schema:
164
          $ref: "../swagger.yaml#/definitions/error"
165
    x-koha-authorization:
166
      permissions:
167
        displays: "*"
168
  put:
169
    x-mojo-to: DisplayItems#update
170
    operationId: updateDisplayItem
171
    tags:
172
      - displayitems
173
    summary: Update display item
174
    parameters:
175
      - $ref: "../swagger.yaml#/parameters/display_id_pp"
176
      - $ref: "../swagger.yaml#/parameters/item_id_pp"
177
      - name: body
178
        in: body
179
        description: A display item object
180
        required: true
181
        schema:
182
          $ref: "../swagger.yaml#/definitions/displayitem"
183
    produces:
184
      - application/json
185
    responses:
186
      "200":
187
        description: A display item
188
        schema:
189
          $ref: "../swagger.yaml#/definitions/displayitem"
190
      "400":
191
        description: Bad request
192
        schema:
193
          $ref: "../swagger.yaml#/definitions/error"
194
      "401":
195
        description: Authentication required
196
        schema:
197
          $ref: "../swagger.yaml#/definitions/error"
198
      "403":
199
        description: Access forbidden
200
        schema:
201
          $ref: "../swagger.yaml#/definitions/error"
202
      "404":
203
        description: Display item not found
204
        schema:
205
          $ref: "../swagger.yaml#/definitions/error"
206
      "500":
207
        description: Internal error
208
        schema:
209
          $ref: "../swagger.yaml#/definitions/error"
210
      "503":
211
        description: Under maintenance
212
        schema:
213
          $ref: "../swagger.yaml#/definitions/error"
214
    x-koha-authorization:
215
      permissions:
216
        displays: add_items_to_display
217
  delete:
218
    x-mojo-to: DisplayItems#delete
219
    operationId: deleteDisplayItem
220
    tags:
221
      - displayitems
222
    summary: Delete display item
223
    parameters:
224
      - $ref: "../swagger.yaml#/parameters/display_id_pp"
225
      - $ref: "../swagger.yaml#/parameters/item_id_pp"
226
    produces:
227
      - application/json
228
    responses:
229
      "204":
230
        description: Display item deleted
231
      "400":
232
        description: Bad request
233
        schema:
234
          $ref: "../swagger.yaml#/definitions/error"
235
      "401":
236
        description: Authentication required
237
        schema:
238
          $ref: "../swagger.yaml#/definitions/error"
239
      "403":
240
        description: Access forbidden
241
        schema:
242
          $ref: "../swagger.yaml#/definitions/error"
243
      "404":
244
        description: Display item not found
245
        schema:
246
          $ref: "../swagger.yaml#/definitions/error"
247
      "500":
248
        description: Internal error
249
        schema:
250
          $ref: "../swagger.yaml#/definitions/error"
251
      "503":
252
        description: Under maintenance
253
        schema:
254
          $ref: "../swagger.yaml#/definitions/error"
255
    x-koha-authorization:
256
      permissions:
257
        displays: remove_items_from_display
258
/display/items/batch:
259
  post:
260
    x-mojo-to: DisplayItems#batch_add
261
    operationId: batchAddDisplayItems
262
    tags:
263
      - displayitems
264
    summary: Add multiple items to a display
265
    parameters:
266
      - name: body
267
        in: body
268
        description: A JSON object containing display and item information
269
        required: true
270
        schema:
271
          type: object
272
          properties:
273
            display_id:
274
              description: ID of the display to add items to
275
              type: integer
276
            item_ids:
277
              description: Array of item numbers to add to the display
278
              type: array
279
              items:
280
                type: integer
281
              minItems: 1
282
            date_remove:
283
              description: Optional date when items should be removed from display
284
              type: string
285
              format: date
286
          required:
287
            - display_id
288
            - item_ids
289
          additionalProperties: false
290
    produces:
291
      - application/json
292
    responses:
293
      "202":
294
        description: Batch operation queued
295
        schema:
296
          type: object
297
          properties:
298
            job_id:
299
              type: integer
300
              description: ID of the background job processing this request
301
            message:
302
              type: string
303
              description: Confirmation message
304
          additionalProperties: false
305
      "400":
306
        description: Bad request
307
        schema:
308
          $ref: "../swagger.yaml#/definitions/error"
309
      "401":
310
        description: Authentication required
311
        schema:
312
          $ref: "../swagger.yaml#/definitions/error"
313
      "403":
314
        description: Access forbidden
315
        schema:
316
          $ref: "../swagger.yaml#/definitions/error"
317
      "404":
318
        description: Display not found
319
        schema:
320
          $ref: "../swagger.yaml#/definitions/error"
321
      "500":
322
        description: Internal server error
323
        schema:
324
          $ref: "../swagger.yaml#/definitions/error"
325
      "503":
326
        description: Under maintenance
327
        schema:
328
          $ref: "../swagger.yaml#/definitions/error"
329
    x-koha-authorization:
330
      permissions:
331
        displays: add_items_to_display
332
  delete:
333
    x-mojo-to: DisplayItems#batch_delete
334
    operationId: batchDeleteDisplayItems
335
    tags:
336
      - displayitems
337
    summary: Remove multiple items from displays
338
    parameters:
339
      - name: body
340
        in: body
341
        description: A JSON object containing item information
342
        required: true
343
        schema:
344
          type: object
345
          properties:
346
            item_ids:
347
              description: Array of item numbers to remove from displays
348
              type: array
349
              items:
350
                type: integer
351
              minItems: 1
352
            display_id:
353
              description: Optional display ID - if specified, only remove items from this display
354
              type: integer
355
          required:
356
            - item_ids
357
          additionalProperties: false
358
    produces:
359
      - application/json
360
    responses:
361
      "202":
362
        description: Batch operation queued
363
        schema:
364
          type: object
365
          properties:
366
            job_id:
367
              type: integer
368
              description: ID of the background job processing this request
369
            message:
370
              type: string
371
              description: Confirmation message
372
          additionalProperties: false
373
      "400":
374
        description: Bad request
375
        schema:
376
          $ref: "../swagger.yaml#/definitions/error"
377
      "401":
378
        description: Authentication required
379
        schema:
380
          $ref: "../swagger.yaml#/definitions/error"
381
      "403":
382
        description: Access forbidden
383
        schema:
384
          $ref: "../swagger.yaml#/definitions/error"
385
      "500":
386
        description: Internal server error
387
        schema:
388
          $ref: "../swagger.yaml#/definitions/error"
389
      "503":
390
        description: Under maintenance
391
        schema:
392
          $ref: "../swagger.yaml#/definitions/error"
393
    x-koha-authorization:
394
      permissions:
395
        displays: remove_items_from_display
(-)a/api/v1/swagger/paths/displays.yaml (+273 lines)
Line 0 Link Here
1
---
2
/displays:
3
  get:
4
    x-mojo-to: Displays#list
5
    operationId: listDisplays
6
    tags:
7
      - displays
8
    summary: List displays
9
    produces:
10
      - application/json
11
    parameters:
12
      - name: display_name
13
        in: query
14
        description: Case insensitive search on display name
15
        required: false
16
        type: string
17
      - name: enabled
18
        in: query
19
        description: Filter by enabled status
20
        required: false
21
        type: boolean
22
      - name: active
23
        in: query
24
        description: Filter by active status (not expired, end_date >= today or null)
25
        required: false
26
        type: boolean
27
      - name: display_branch
28
        in: query
29
        description: Filter by display branch
30
        required: false
31
        type: string
32
      - name: display_type
33
        in: query
34
        description: Filter by display type
35
        required: false
36
        type: string
37
      - $ref: "../swagger.yaml#/parameters/match"
38
      - $ref: "../swagger.yaml#/parameters/order_by"
39
      - $ref: "../swagger.yaml#/parameters/page"
40
      - $ref: "../swagger.yaml#/parameters/per_page"
41
      - $ref: "../swagger.yaml#/parameters/q_param"
42
      - $ref: "../swagger.yaml#/parameters/q_body"
43
      - $ref: "../swagger.yaml#/parameters/request_id_header"
44
      - name: x-koha-embed
45
        in: header
46
        required: false
47
        description: Embed list sent as a request header
48
        type: array
49
        items:
50
          type: string
51
          enum:
52
            - display_items
53
            - library
54
            - item_type
55
            - +strings
56
        collectionFormat: csv
57
    responses:
58
      "200":
59
        description: A list of displays
60
        schema:
61
          type: array
62
          items:
63
            $ref: "../swagger.yaml#/definitions/display"
64
      "400":
65
        description: |
66
          Bad request. Possible `error_code` attribute values:
67
68
            * `invalid_query`
69
        schema:
70
          $ref: "../swagger.yaml#/definitions/error"
71
      "403":
72
        description: Access forbidden
73
        schema:
74
          $ref: "../swagger.yaml#/definitions/error"
75
      "500":
76
        description: |
77
          Internal server error. Possible `error_code` attribute values:
78
79
          * `internal_server_error`
80
        schema:
81
          $ref: "../swagger.yaml#/definitions/error"
82
      "503":
83
        description: Under maintenance
84
        schema:
85
          $ref: "../swagger.yaml#/definitions/error"
86
    x-koha-authorization:
87
      permissions:
88
        displays: "*"
89
  post:
90
    x-mojo-to: Displays#add
91
    operationId: addDisplay
92
    tags:
93
      - displays
94
    summary: Add display
95
    parameters:
96
      - name: body
97
        in: body
98
        description: A JSON object containing information about the new display
99
        required: true
100
        schema:
101
          $ref: "../swagger.yaml#/definitions/display"
102
    produces:
103
      - application/json
104
    responses:
105
      "201":
106
        description: Display added
107
        schema:
108
          $ref: "../swagger.yaml#/definitions/display"
109
      "400":
110
        description: Bad request
111
        schema:
112
          $ref: "../swagger.yaml#/definitions/error"
113
      "401":
114
        description: Authentication required
115
        schema:
116
          $ref: "../swagger.yaml#/definitions/error"
117
      "403":
118
        description: Access forbidden
119
        schema:
120
          $ref: "../swagger.yaml#/definitions/error"
121
      "500":
122
        description: |
123
          Internal server error. Possible `error_code` attribute values:
124
125
          * `internal_server_error`
126
        schema:
127
          $ref: "../swagger.yaml#/definitions/error"
128
      "503":
129
        description: Under maintenance
130
        schema:
131
          $ref: "../swagger.yaml#/definitions/error"
132
    x-koha-authorization:
133
      permissions:
134
        displays: add_display
135
"/displays/{display_id}":
136
  get:
137
    x-mojo-to: Displays#get
138
    operationId: getDisplay
139
    tags:
140
      - displays
141
    summary: Get display
142
    parameters:
143
      - $ref: "../swagger.yaml#/parameters/display_id_pp"
144
      - name: x-koha-embed
145
        in: header
146
        required: false
147
        description: Embed list sent as a request header
148
        type: array
149
        items:
150
          type: string
151
          enum:
152
            - display_items
153
            - library
154
            - item_type
155
            - +strings
156
        collectionFormat: csv
157
    produces:
158
      - application/json
159
    responses:
160
      "200":
161
        description: A display
162
        schema:
163
          $ref: "../swagger.yaml#/definitions/display"
164
      "400":
165
        description: Bad request
166
        schema:
167
          $ref: "../swagger.yaml#/definitions/error"
168
      "404":
169
        description: Display not found
170
        schema:
171
          $ref: "../swagger.yaml#/definitions/error"
172
      "500":
173
        description: |
174
          Internal server error. Possible `error_code` attribute values:
175
176
          * `internal_server_error`
177
        schema:
178
          $ref: "../swagger.yaml#/definitions/error"
179
      "503":
180
        description: Under maintenance
181
        schema:
182
          $ref: "../swagger.yaml#/definitions/error"
183
    x-koha-authorization:
184
      permissions:
185
        displays: "*"
186
  put:
187
    x-mojo-to: Displays#update
188
    operationId: updateDisplay
189
    tags:
190
      - displays
191
    summary: Update display
192
    parameters:
193
      - $ref: "../swagger.yaml#/parameters/display_id_pp"
194
      - name: body
195
        in: body
196
        description: A display object
197
        required: true
198
        schema:
199
          $ref: "../swagger.yaml#/definitions/display"
200
    produces:
201
      - application/json
202
    responses:
203
      "200":
204
        description: A display
205
        schema:
206
          $ref: "../swagger.yaml#/definitions/display"
207
      "400":
208
        description: Bad request
209
        schema:
210
          $ref: "../swagger.yaml#/definitions/error"
211
      "401":
212
        description: Authentication required
213
        schema:
214
          $ref: "../swagger.yaml#/definitions/error"
215
      "403":
216
        description: Access forbidden
217
        schema:
218
          $ref: "../swagger.yaml#/definitions/error"
219
      "404":
220
        description: Display not found
221
        schema:
222
          $ref: "../swagger.yaml#/definitions/error"
223
      "500":
224
        description: Internal error
225
        schema:
226
          $ref: "../swagger.yaml#/definitions/error"
227
      "503":
228
        description: Under maintenance
229
        schema:
230
          $ref: "../swagger.yaml#/definitions/error"
231
    x-koha-authorization:
232
      permissions:
233
        displays: edit_display
234
  delete:
235
    x-mojo-to: Displays#delete
236
    operationId: deleteDisplay
237
    tags:
238
      - displays
239
    summary: Delete display
240
    parameters:
241
      - $ref: "../swagger.yaml#/parameters/display_id_pp"
242
    produces:
243
      - application/json
244
    responses:
245
      "204":
246
        description: Display deleted
247
      "400":
248
        description: Bad request
249
        schema:
250
          $ref: "../swagger.yaml#/definitions/error"
251
      "401":
252
        description: Authentication required
253
        schema:
254
          $ref: "../swagger.yaml#/definitions/error"
255
      "403":
256
        description: Access forbidden
257
        schema:
258
          $ref: "../swagger.yaml#/definitions/error"
259
      "404":
260
        description: Display not found
261
        schema:
262
          $ref: "../swagger.yaml#/definitions/error"
263
      "500":
264
        description: Internal error
265
        schema:
266
          $ref: "../swagger.yaml#/definitions/error"
267
      "503":
268
        description: Under maintenance
269
        schema:
270
          $ref: "../swagger.yaml#/definitions/error"
271
    x-koha-authorization:
272
      permissions:
273
        displays: delete_display 
(-)a/api/v1/swagger/paths/displays_config.yaml (+38 lines)
Line 0 Link Here
1
---
2
/displays/config:
3
  get:
4
    x-mojo-to: Displays#config
5
    operationId: getDisplaysConfig
6
    description: This resource returns a list of options needed for the Displays Vue app. EXPERIMENTAL - DO NOT RELY on this, it is subject to change!
7
    summary: get the Displays Config
8
    tags:
9
      - displays
10
    produces:
11
      - application/json
12
    responses:
13
      200:
14
        description: The Displays module config
15
        schema:
16
          $ref: "../swagger.yaml#/definitions/display_config"
17
      400:
18
        description: Bad request
19
        schema:
20
          $ref: "../swagger.yaml#/definitions/error"
21
      403:
22
        description: Access forbidden
23
        schema:
24
          $ref: "../swagger.yaml#/definitions/error"
25
      500:
26
        description: |
27
          Internal server error. Possible `error_code` attribute values:
28
29
          * `internal_server_error`
30
        schema:
31
          $ref: "../swagger.yaml#/definitions/error"
32
      503:
33
        description: Under maintenance
34
        schema:
35
          $ref: "../swagger.yaml#/definitions/error"
36
    x-koha-authorization:
37
      permissions:
38
        displays: "*"
(-)a/api/v1/swagger/paths/public_displayitems.yaml (+94 lines)
Line 0 Link Here
1
---
2
"/public/display/items":
3
  get:
4
    x-mojo-to: DisplayItems#list_public
5
    operationId: listDisplayItemsPublic
6
    tags:
7
      - displayitems
8
    summary: List display items (public)
9
    produces:
10
      - application/json
11
    parameters:
12
      - name: display_id
13
        in: query
14
        description: Filter by display ID
15
        required: false
16
        type: integer
17
      - name: itemnumber
18
        in: query
19
        description: Filter by item number
20
        required: false
21
        type: integer
22
      - name: biblionumber
23
        in: query
24
        description: Filter by bibliographic record number
25
        required: false
26
        type: integer
27
      - $ref: "../swagger.yaml#/parameters/match"
28
      - $ref: "../swagger.yaml#/parameters/order_by"
29
      - $ref: "../swagger.yaml#/parameters/page"
30
      - $ref: "../swagger.yaml#/parameters/per_page"
31
      - $ref: "../swagger.yaml#/parameters/q_param"
32
      - $ref: "../swagger.yaml#/parameters/q_body"
33
      - $ref: "../swagger.yaml#/parameters/request_id_header"
34
    responses:
35
      "200":
36
        description: A list of display items
37
        schema:
38
          type: array
39
          items:
40
            $ref: "../swagger.yaml#/definitions/displayitem"
41
      "400":
42
        description: |
43
          Bad request. Possible `error_code` attribute values:
44
45
            * `invalid_query`
46
        schema:
47
          $ref: "../swagger.yaml#/definitions/error"
48
      "500":
49
        description: |
50
          Internal server error. Possible `error_code` attribute values:
51
52
          * `internal_server_error`
53
        schema:
54
          $ref: "../swagger.yaml#/definitions/error"
55
      "503":
56
        description: Under maintenance
57
        schema:
58
          $ref: "../swagger.yaml#/definitions/error"
59
"/public/display/items/{display_id}/{item_id}":
60
  get:
61
    x-mojo-to: DisplayItems#get_public
62
    operationId: getDisplayItemPublic
63
    tags:
64
      - displayitems
65
    summary: Get display item (public)
66
    parameters:
67
      - $ref: "../swagger.yaml#/parameters/display_id_pp"
68
      - $ref: "../swagger.yaml#/parameters/item_id_pp"
69
    produces:
70
      - application/json
71
    responses:
72
      "200":
73
        description: A display item
74
        schema:
75
          $ref: "../swagger.yaml#/definitions/displayitem"
76
      "400":
77
        description: Bad request
78
        schema:
79
          $ref: "../swagger.yaml#/definitions/error"
80
      "404":
81
        description: Display item not found
82
        schema:
83
          $ref: "../swagger.yaml#/definitions/error"
84
      "500":
85
        description: |
86
          Internal server error. Possible `error_code` attribute values:
87
88
          * `internal_server_error`
89
        schema:
90
          $ref: "../swagger.yaml#/definitions/error"
91
      "503":
92
        description: Under maintenance
93
        schema:
94
          $ref: "../swagger.yaml#/definitions/error"
(-)a/api/v1/swagger/paths/public_displays.yaml (+124 lines)
Line 0 Link Here
1
---
2
"/public/displays":
3
  get:
4
    x-mojo-to: Displays#list_public
5
    operationId: listDisplaysPublic
6
    tags:
7
      - displays
8
    summary: List displays (public)
9
    produces:
10
      - application/json
11
    parameters:
12
      - name: active
13
        in: query
14
        description: Filter by active status (enabled and within start/end date range)
15
        required: false
16
        type: boolean
17
      - name: enabled
18
        in: query
19
        description: Filter by enabled status
20
        required: false
21
        type: boolean
22
      - name: display_branch
23
        in: query
24
        description: Filter by display branch
25
        required: false
26
        type: string
27
      - name: display_type
28
        in: query
29
        description: Filter by display type
30
        required: false
31
        type: string
32
      - $ref: "../swagger.yaml#/parameters/match"
33
      - $ref: "../swagger.yaml#/parameters/order_by"
34
      - $ref: "../swagger.yaml#/parameters/page"
35
      - $ref: "../swagger.yaml#/parameters/per_page"
36
      - $ref: "../swagger.yaml#/parameters/q_param"
37
      - $ref: "../swagger.yaml#/parameters/q_body"
38
      - $ref: "../swagger.yaml#/parameters/request_id_header"
39
      - name: x-koha-embed
40
        in: header
41
        required: false
42
        description: Embed list sent as a request header
43
        type: array
44
        items:
45
          type: string
46
          enum:
47
            - display_items
48
            - library
49
            - item_type
50
            - +strings
51
        collectionFormat: csv
52
    responses:
53
      "200":
54
        description: A list of displays
55
        schema:
56
          type: array
57
          items:
58
            $ref: "../swagger.yaml#/definitions/display"
59
      "400":
60
        description: |
61
          Bad request. Possible `error_code` attribute values:
62
63
            * `invalid_query`
64
        schema:
65
          $ref: "../swagger.yaml#/definitions/error"
66
      "500":
67
        description: |
68
          Internal server error. Possible `error_code` attribute values:
69
70
          * `internal_server_error`
71
        schema:
72
          $ref: "../swagger.yaml#/definitions/error"
73
      "503":
74
        description: Under maintenance
75
        schema:
76
          $ref: "../swagger.yaml#/definitions/error"
77
"/public/displays/{display_id}":
78
  get:
79
    x-mojo-to: Displays#get_public
80
    operationId: getDisplayPublic
81
    tags:
82
      - displays
83
    summary: Get display (public)
84
    parameters:
85
      - $ref: "../swagger.yaml#/parameters/display_id_pp"
86
      - name: x-koha-embed
87
        in: header
88
        required: false
89
        description: Embed list sent as a request header
90
        type: array
91
        items:
92
          type: string
93
          enum:
94
            - display_items
95
            - library
96
            - item_type
97
            - +strings
98
        collectionFormat: csv
99
    produces:
100
      - application/json
101
    responses:
102
      "200":
103
        description: A display
104
        schema:
105
          $ref: "../swagger.yaml#/definitions/display"
106
      "400":
107
        description: Bad request
108
        schema:
109
          $ref: "../swagger.yaml#/definitions/error"
110
      "404":
111
        description: Display not found
112
        schema:
113
          $ref: "../swagger.yaml#/definitions/error"
114
      "500":
115
        description: |
116
          Internal server error. Possible `error_code` attribute values:
117
118
          * `internal_server_error`
119
        schema:
120
          $ref: "../swagger.yaml#/definitions/error"
121
      "503":
122
        description: Under maintenance
123
        schema:
124
          $ref: "../swagger.yaml#/definitions/error"
(-)a/api/v1/swagger/swagger.yaml (-1 / +38 lines)
Lines 42-47 definitions: Link Here
42
    $ref: ./definitions/circ-rule-kind.yaml
42
    $ref: ./definitions/circ-rule-kind.yaml
43
  city:
43
  city:
44
    $ref: ./definitions/city.yaml
44
    $ref: ./definitions/city.yaml
45
  display_config:
46
    $ref: ./definitions/display_config.yaml
47
  display:
48
    $ref: ./definitions/display.yaml
49
  displayitem:
50
    $ref: ./definitions/displayitem.yaml
45
  credit:
51
  credit:
46
    $ref: ./definitions/credit.yaml
52
    $ref: ./definitions/credit.yaml
47
  debit:
53
  debit:
Lines 325-330 paths: Link Here
325
    $ref: ./paths/cities.yaml#/~1cities
331
    $ref: ./paths/cities.yaml#/~1cities
326
  "/cities/{city_id}":
332
  "/cities/{city_id}":
327
    $ref: "./paths/cities.yaml#/~1cities~1{city_id}"
333
    $ref: "./paths/cities.yaml#/~1cities~1{city_id}"
334
  /displays/config:
335
    $ref: ./paths/displays_config.yaml#/~1displays~1config
336
  /displays:
337
    $ref: ./paths/displays.yaml#/~1displays
338
  "/displays/{display_id}":
339
    $ref: "./paths/displays.yaml#/~1displays~1{display_id}"
340
  /display/items:
341
    $ref: ./paths/displayitems.yaml#/~1display~1items
342
  /display/items/batch:
343
    $ref: ./paths/displayitems.yaml#/~1display~1items~1batch
344
  /display/items/{display_id}/{item_id}:
345
    $ref: ./paths/displayitems.yaml#/~1display~1items~1{display_id}~1{item_id}
328
  "/clubs/{club_id}/holds":
346
  "/clubs/{club_id}/holds":
329
    $ref: "./paths/clubs.yaml#/~1clubs~1{club_id}~1holds"
347
    $ref: "./paths/clubs.yaml#/~1clubs~1{club_id}~1holds"
330
  /config/smtp_servers:
348
  /config/smtp_servers:
Lines 551-556 paths: Link Here
551
    $ref: "./paths/biblios.yaml#/~1public~1biblios~1{biblio_id}"
569
    $ref: "./paths/biblios.yaml#/~1public~1biblios~1{biblio_id}"
552
  "/public/checkouts/availability":
570
  "/public/checkouts/availability":
553
    $ref: ./paths/checkouts.yaml#/~1public~1checkouts~1availability
571
    $ref: ./paths/checkouts.yaml#/~1public~1checkouts~1availability
572
  "/public/display/items":
573
    $ref: "./paths/public_displayitems.yaml#/~1public~1display~1items"
574
  "/public/display/items/{display_id}/{item_id}":
575
    $ref: "./paths/public_displayitems.yaml#/~1public~1display~1items~1{display_id}~1{item_id}"
576
  "/public/displays":
577
    $ref: "./paths/public_displays.yaml#/~1public~1displays"
578
  "/public/displays/{display_id}":
579
    $ref: "./paths/public_displays.yaml#/~1public~1displays~1{display_id}"
554
  "/public/items":
580
  "/public/items":
555
    $ref: "./paths/items.yaml#/~1public~1items"
581
    $ref: "./paths/items.yaml#/~1public~1items"
556
  "/public/biblios/{biblio_id}/items":
582
  "/public/biblios/{biblio_id}/items":
Lines 745-750 parameters: Link Here
745
    name: city_id
771
    name: city_id
746
    required: true
772
    required: true
747
    type: integer
773
    type: integer
774
  display_id_pp:
775
    description: Display internal identifier
776
    in: path
777
    name: display_id
778
    required: true
779
    type: integer
748
  club_id_pp:
780
  club_id_pp:
749
    description: Internal club identifier
781
    description: Internal club identifier
750
    in: path
782
    in: path
Lines 1240-1245 tags: Link Here
1240
  - description: "Manage cities\n"
1272
  - description: "Manage cities\n"
1241
    name: cities
1273
    name: cities
1242
    x-displayName: Cities
1274
    x-displayName: Cities
1275
  - description: "Manage displays\n"
1276
    name: displays
1277
    x-displayName: Displays
1278
  - description: "Manage display items\n"
1279
    name: displayitems
1280
    x-displayName: Display items
1243
  - description: "Manage patron clubs\n"
1281
  - description: "Manage patron clubs\n"
1244
    name: clubs
1282
    name: clubs
1245
    x-displayName: Clubs
1283
    x-displayName: Clubs
1246
- 

Return to bug 14962