|
27 | 27 | from invenio_records_resources.records.api import Record |
28 | 28 | from invenio_records_resources.records.systemfields import IndexField |
29 | 29 | from marshmallow import ValidationError |
30 | | -from sqlalchemy import or_ |
| 30 | +from sqlalchemy import select |
31 | 31 | from sqlalchemy.exc import NoResultFound |
32 | 32 |
|
33 | 33 | from .dumpers import EmailFieldDumperExt |
@@ -142,29 +142,25 @@ def _validate_user_data(user_data): |
142 | 142 | raise ValidationError(errors) |
143 | 143 |
|
144 | 144 |
|
145 | | -def _validate_group_data(group_data): |
146 | | - """Validate data for group creation.""" |
147 | | - group_id = group_data.get("id") |
148 | | - name = group_data.get("name") |
149 | | - |
150 | | - if not (group_id or name): |
| 145 | +def _validate_group_data(data, exclude_id=None): |
| 146 | + """Validate the group data.""" |
| 147 | + name = data.get("name") |
| 148 | + if not name: |
151 | 149 | return |
152 | 150 |
|
153 | | - role = current_datastore.role_model |
154 | | - |
155 | | - stmt = db.select(role).where(or_(role.id == group_id, role.name == name)).limit(1) |
| 151 | + errors = {} |
| 152 | + stmt = select(current_datastore.role_model.id).where( |
| 153 | + current_datastore.role_model.name == name |
| 154 | + ) |
| 155 | + if exclude_id is not None: |
| 156 | + stmt = stmt.where(current_datastore.role_model.id != exclude_id) |
156 | 157 |
|
157 | | - row = db.session.execute(stmt).scalars().first() |
158 | | - if not row: |
159 | | - return |
| 158 | + existing_role_id = db.session.execute(stmt).scalar_one_or_none() |
160 | 159 |
|
161 | | - errors = {} |
162 | | - if group_id and row.id == group_id: |
163 | | - errors["id"] = [_("Role id already used by another group.")] |
164 | | - if name and row.name == name: |
| 160 | + if existing_role_id: |
165 | 161 | errors["name"] = [_("Role name already used by another group.")] |
166 | | - |
167 | | - raise ValidationError(errors) |
| 162 | + if errors: |
| 163 | + raise ValidationError(errors) |
168 | 164 |
|
169 | 165 |
|
170 | 166 | class UserAggregate(BaseAggregate): |
@@ -270,9 +266,6 @@ def avatar_color(self): |
270 | 266 | def create(cls, data, id_=None, validator=None, format_checker=None, **kwargs): |
271 | 267 | """Create a new User and store it in the database.""" |
272 | 268 | try: |
273 | | - # Admin group view passes in an empty string as id, which will be a valid Role id. |
274 | | - if "id" in data and data["id"] == "": |
275 | | - data.pop("id") |
276 | 269 | # Check if email and username already exists by another account. |
277 | 270 | _validate_user_data(data) |
278 | 271 | # Create User |
@@ -437,6 +430,9 @@ def update(self, data, id_): |
437 | 430 | if role is None: |
438 | 431 | role = db.session.get(current_datastore.role_model, id_) |
439 | 432 |
|
| 433 | + if "name" in data: |
| 434 | + _validate_group_data({"name": data["name"]}, exclude_id=role.id) |
| 435 | + |
440 | 436 | role.name = data.get("name", role.name) |
441 | 437 | role.description = data.get("description", role.description) |
442 | 438 | role = current_datastore.update_role(role) |
|
0 commit comments