Skip to content

Commit efd4782

Browse files
authored
Merge pull request #8202 from 4teamwork/ran/TI-2959/spv-excerpt-create-update
Allow SPV users to return protocol excerpt to proposal dossier
2 parents ad3b174 + 04ae8c7 commit efd4782

21 files changed

Lines changed: 460 additions & 0 deletions

File tree

changes/TI-2959.feature

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
Allow SPV to send and update excerpts to proposal dossier. [ran]

docs/public/dev-manual/api/api_changelog.rst

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,8 @@ Breaking Changes
1313
Other Changes
1414
^^^^^^^^^^^^^
1515
- ``@membership-notes``: Add endpoint to update a note on a membership.
16+
- ``@ris-return-excerpt``: Add endpoint to allow users from spv to create a proposal excerpt in a dossier they do not have view permission in.
17+
- ``@ris-update-excerpt``: Add endpoint to allow users from spv to update a proposal excerpt in a dossier they do not have view permission in.
1618

1719

1820
2025.8.0 (2025-08-22)

docs/public/dev-manual/api/proposals.rst

Lines changed: 76 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -159,3 +159,79 @@ Die Response ist eine Liste die für jede Beilage die folgenden Informationen zu
159159
"source": "dossier-1/proposal-1/document-76"
160160
}
161161
]
162+
163+
164+
Protokollauszug im Antragsdossier ablegen
165+
=========================================
166+
167+
Mit dem ``@ris-return-excerpt`` Endpoint können Protokollauszüge aus der SPV
168+
ins Antragsdossier eingereicht werden. Der Endpoint erwartet als Pfad Parameter:
169+
170+
- Mandant ID
171+
- relative Dossierpfad
172+
173+
174+
**Beispiel-Request**:
175+
176+
.. sourcecode:: http
177+
178+
POST ordnungssystem/dossier-1/document-1/@ris-return-excerpt HTTP/1.1
179+
Accept: application/json
180+
181+
{
182+
"target_admin_unit_id": "fd",
183+
"target_dossier_relative_path": "ordnungssystem/dossier-1"
184+
}
185+
186+
**Beispiel-Response**:
187+
188+
189+
.. sourcecode:: http
190+
191+
HTTP/1.1 200 OK
192+
Content-Type: application/json
193+
194+
{
195+
"path": "ordnungssystem/dossier-2/document-2",
196+
"intid": 3,
197+
"url": "http://gever.onegovgever.ch/fd/ordnungssystem/dossier-2/document-2",
198+
"current_version_id": 1,
199+
}
200+
201+
202+
Protokollauszug im Antragsdossier aktualisieren
203+
===============================================
204+
205+
Mit dem ``@ris-update-excerpt`` Endpoint können Protokollauszüge aus der SPV
206+
im Antragsdossier aktualisiert werden. Der Endpoint erwartet als Pfad Parameter:
207+
208+
- Mandant ID
209+
- relative Dokumentpfad vom Protokollauszug
210+
211+
212+
**Beispiel-Request**:
213+
214+
.. sourcecode:: http
215+
216+
POST ordnungssystem/dossier-1/document-1/@ris-update-excerpt HTTP/1.1
217+
Accept: application/json
218+
219+
{
220+
"target_admin_unit_id": "fd",
221+
"target_document_relative_path": "ordnungssystem/dossier-1/document-1"
222+
}
223+
224+
**Beispiel-Response**:
225+
226+
227+
.. sourcecode:: http
228+
229+
HTTP/1.1 200 OK
230+
Content-Type: application/json
231+
232+
{
233+
"path": "ordnungssystem/dossier-2/document-2",
234+
"intid": 3,
235+
"url": "http://gever.onegovgever.ch/fd/ordnungssystem/dossier-2/document-2",
236+
"current_version_id": 1,
237+
}

opengever/api/tests/test_proposal.py

Lines changed: 45 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -388,3 +388,48 @@ def test_submitting_additional_document_new_version(self, browser):
388388
self.assertEqual(documents[0].file.data,
389389
self.document.file.data)
390390
self.assertEqual("New", documents[0].file.data)
391+
392+
393+
class TestRISExcerptEndpoints(IntegrationTestCase):
394+
395+
@browsing
396+
def test_ris_return_and_update_excerpt(self, browser):
397+
self.login(self.regular_user, browser)
398+
399+
dossier_rel = "/".join(self.dossier.getPhysicalPath()[2:])
400+
401+
browser.open(
402+
self.document.absolute_url() + "/@ris-return-excerpt",
403+
method="POST",
404+
headers=self.api_headers,
405+
data=json.dumps(
406+
{
407+
"target_admin_unit_id": "plone",
408+
"target_dossier_relative_path": dossier_rel,
409+
}
410+
),
411+
)
412+
413+
self.assertEqual(200, browser.status_code)
414+
data = browser.json
415+
self.assertEqual(data["current_version_id"], 0)
416+
417+
excerpt_doc = self.portal.unrestrictedTraverse(data["path"].encode("utf-8"))
418+
419+
self.assertEqual(excerpt_doc.file.data, self.document.file.data)
420+
self.assertTrue(excerpt_doc.is_final_document())
421+
422+
browser.open(
423+
self.document.absolute_url() + "/@ris-update-excerpt",
424+
method="POST",
425+
headers=self.api_headers,
426+
data=json.dumps(
427+
{
428+
"target_admin_unit_id": "plone",
429+
"target_doc_relative_path": data["path"],
430+
}
431+
),
432+
)
433+
434+
self.assertEqual(browser.json["current_version_id"], 1)
435+
self.assertTrue(excerpt_doc.is_final_document())

opengever/core/lawgiver.zcml

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -247,6 +247,8 @@
247247
opengever.propertysheets: Manage PropertySheets,
248248
opengever.repository: Export repository,
249249
opengever.ris: Add Proposal,
250+
opengever.ris: Return Excerpt,
251+
opengever.ris: Update Excerpt,
250252
opengever.sharing: List Protected Objects,
251253
opengever.webactions: Manage own WebActions,
252254
opengever.workspace: Add WorkspaceFolder,

opengever/core/profiles/default/rolemap.xml

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -284,6 +284,17 @@
284284
<role name="Administrator" />
285285
</permission>
286286

287+
<!-- RIS -->
288+
<permission name="opengever.ris: Return Excerpt" acquire="False">
289+
<role name="Manager" />
290+
<role name="Member" />
291+
</permission>
292+
293+
<permission name="opengever.ris: Update Excerpt" acquire="False">
294+
<role name="Manager" />
295+
<role name="Member" />
296+
</permission>
297+
287298
<!-- SHARING -->
288299
<permission name="Sharing page: Delegate Administrator role" acquire="True">
289300
<role name="Administrator" />

opengever/core/tests/test_view_security.py

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -36,6 +36,8 @@
3636
# Add-form views are special adapters were the permission is stored
3737
# differently. These views are verified manually:
3838
'opengever.disposition.browser.form.DispositionAddView',
39+
'opengever.ris.browser.ris_excerpt.RISReturnExcerptReceive',
40+
'opengever.ris.browser.ris_excerpt.RISUpdateExcerptReceive',
3941

4042
# The custom error page needs to be public, since errors may happen
4143
# during traversal or publish, in both cases security may not yet

opengever/core/upgrades/20250924150922_add_ris_return_excerpt_permission/__init__ .py

Whitespace-only changes.
Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,10 @@
1+
<rolemap>
2+
<permissions>
3+
4+
<permission name="opengever.ris: Return Excerpt" acquire="True">
5+
<role name="Manager" />
6+
<role name="Member" />
7+
</permission>
8+
9+
</permissions>
10+
</rolemap>
Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,9 @@
1+
from ftw.upgrade import UpgradeStep
2+
3+
4+
class AddRisReturnExcerptPermission(UpgradeStep):
5+
"""Add ris return excerpt permission.
6+
"""
7+
8+
def __call__(self):
9+
self.install_upgrade_profile()

0 commit comments

Comments
 (0)