Skip to content
Snippets Groups Projects

Dodělávky manipulace s places

Merged Jiří Setnička requested to merge jirka/schools into master
2 unresolved threads
5 files
+ 129
12
Compare changes
  • Side-by-side
  • Inline
Files
5
  • 5f58f6cd
    Přesuny míst · 5f58f6cd
    Jiří Setnička authored
    Dvojkrokově, nejdříve vyhledání a pak přesun. Lze přesunout jen pod místa,
    která neporuší constrain na level daného typu a která mohu editovat.
+ 76
0
@@ -115,7+115,7 @@
@@ -115,7+115,7 @@
what=g.user.user_id,
what=g.user.user_id,
details={'action': 'school-delete', 'school': db.row2dict(school)},
details={'action': 'school-delete', 'school': db.row2dict(school)},
)
)
app.logger.info(f"Deleting school record for place {place.place_id}")
app.logger.info(f"Deleting school record for place {place.place_id}")
db.get_session().delete(school)
db.get_session().delete(school)
msg = 'Změny místa uloženy, záznam o škole smazán'
msg = 'Změny místa uloženy, záznam o škole smazán'
else:
else:
@@ -157,7+157,7 @@
@@ -157,7+157,7 @@
)
)
 
class PlaceMoveForm(FlaskForm):
 
code = wtforms.StringField(validators=[validators.DataRequired()])
 
submit = wtforms.SubmitField('Najít místo')
 
reset = wtforms.HiddenField()
 
move = wtforms.HiddenField()
 
 
 
class PlaceMoveConfirmForm(FlaskForm):
 
code = wtforms.HiddenField()
 
reset = wtforms.SubmitField('Zrušit')
 
move = wtforms.SubmitField('Přesunout')
 
 
 
@app.route('/org/place/<int:id>/move', methods=('GET', 'POST'))
 
def org_place_move(id: int):
 
sess = db.get_session()
 
 
# Tests: can move only existing places that we can edit
 
place = sess.query(db.Place).get(id)
 
if not place:
 
raise werkzeug.exceptions.NotFound()
 
rr = mo.rights.Rights(g.user)
 
rr.get_for(place)
 
if not rr.can_edit_place(place):
 
raise werkzeug.exceptions.Forbidden()
 
 
parents = reversed(db.get_place_parents(place)[1:]) # without place itself and from the top
 
new_parents = None
 
search_error = None
 
 
form = PlaceMoveForm()
 
form_confirm = None
 
if form.validate_on_submit():
 
if form.reset.data:
 
return redirect(url_for('org_place_move', id=id))
 
 
new_parent = db.place_by_code(form.code.data)
 
if not new_parent:
 
search_error = 'Místo s tímto kódem se nepovedlo nalézt'
 
else:
 
new_parents = reversed(db.get_place_parents(new_parent))
 
(_, levels) = db.place_type_names_and_levels[place.type]
 
 
rr.get_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
 
 
return render_template(
 
'org_place_move.html',
 
place=place, form=form, form_confirm=form_confirm, search_error=search_error,
 
parents=parents, new_parents=new_parents
 
)
 
 
@app.route('/org/place/<int:id>/delete', methods=('POST',))
@app.route('/org/place/<int:id>/delete', methods=('POST',))
def org_place_delete(id: int):
def org_place_delete(id: int):
sess = db.get_session()
sess = db.get_session()
Loading