diff --git a/mo/web/org_place.py b/mo/web/org_place.py index a1bd66178175da146ffbb4d8e6769cf962c71886..28fb9bab4f7adfb960e4c806a61b0feb8142a9ca 100644 --- a/mo/web/org_place.py +++ b/mo/web/org_place.py @@ -13,6 +13,7 @@ import mo.imports import mo.rights import mo.util from mo.web import app +import mo.web.fields as mo_fields import wtforms.validators as validators @@ -177,14 +178,14 @@ def org_place_edit(id: int): class PlaceMoveForm(FlaskForm): - code = wtforms.StringField(validators=[validators.DataRequired()], render_kw={'autofocus': True}) + new_parent = mo_fields.Place(validators=[validators.DataRequired()], render_kw={'autofocus': True}) submit = wtforms.SubmitField('Najít místo') reset = wtforms.HiddenField() move = wtforms.HiddenField() class PlaceMoveConfirmForm(FlaskForm): - code = wtforms.HiddenField() + new_parent = mo_fields.Place(widget = wtforms.widgets.HiddenInput()) reset = wtforms.SubmitField('Zrušit') move = wtforms.SubmitField('Přesunout') @@ -206,42 +207,44 @@ def org_place_move(id: int): form = PlaceMoveForm() form_confirm = None - if form.validate_on_submit(): + if not form.validate_on_submit(): + if form.new_parent.place_error: + search_error = form.new_parent.place_error + else: if form.reset.data: return redirect(url_for('org_place_move', id=id)) - new_parent = db.get_place_by_code(form.code.data) - if not new_parent: - search_error = 'Místo s tímto kódem se nepovedlo nalézt' + new_parent = form.new_parent.place + new_parents = reversed(g.gatekeeper.get_parents(new_parent)) + (_, levels) = db.place_type_names_and_levels[place.type] + + rr = g.gatekeeper.rights_for(new_parent) + if not rr.can_edit_place(new_parent): + search_error = 'Nemáte právo k editaci vybraného nadřazeného místa, přesun nelze uskutečnit' + elif (new_parent.level + 1) not in levels: + search_error = f'Toto místo ({place.type_name()}) nelze přemístit pod vybrané místo ({new_parent.type_name()}), dostalo by se na nepovolený level' + elif new_parent.place_id == place.parent: + search_error = 'Žádná změna, místo je zde již umístěno' + elif form.move.data: + # Everything is OK, if submitted with 'move' do the move + place.parent = new_parent.place_id + place.level = new_parent.level + 1 + changes = db.get_object_changes(place) + mo.util.log( + type=db.LogType.place, + what=id, + details={'action': 'move', 'changes': changes}, + ) + app.logger.info(f"Place {id} moved, changes: {changes}") + db.get_session().commit() + flash('Místo úspěšně přesunuto', 'success') + return redirect(url_for('org_place', id=id)) else: - new_parents = reversed(g.gatekeeper.get_parents(new_parent)) - (_, levels) = db.place_type_names_and_levels[place.type] - - rr = g.gatekeeper.rights_for(new_parent) - if not rr.can_edit_place(new_parent): - search_error = 'Nemáte právo k editaci vybraného nadřazeného místa, přesun nelze uskutečnit' - elif (new_parent.level + 1) not in levels: - search_error = f'Toto místo ({place.type_name()}) nelze přemístit pod vybrané místo ({new_parent.type_name()}), dostalo by se na nepovolený level' - elif new_parent.place_id == place.parent: - search_error = 'Žádná změna, místo je zde již umístěno' - elif form.move.data: - # Everything is OK, if submitted with 'move' do the move - place.parent = new_parent.place_id - place.level = new_parent.level + 1 - changes = db.get_object_changes(place) - mo.util.log( - type=db.LogType.place, - what=id, - details={'action': 'move', 'changes': changes}, - ) - app.logger.info(f"Place {id} moved, changes: {changes}") - db.get_session().commit() - flash('Místo úspěšně přesunuto', 'success') - return redirect(url_for('org_place', id=id)) - else: - # OK but not confirmed yet, display the confirm form - form_confirm = PlaceMoveConfirmForm() - form_confirm.code.data = form.code.data + # OK but not confirmed yet, display the confirm form + form_confirm = PlaceMoveConfirmForm() + form_confirm.new_parent.data = form.new_parent.data + # tady se používá hnusný trik, že políčko new_parents z PlaceMoveConfirmForm se + # parsuje jako new_parents z PlaceMoveForm return render_template( 'org_place_move.html',