def remove(request, key): if request.method != 'POST': return MethodNotAllowed() if request.user.is_anonymous(): return Unauthorized() recipe = models.Recipe.get(key) if not recipe: return NotFound() # Użytkownik może usunąć swój publiczny przepis tą metodą, ale nie jest to reklamowane! if not (request.user.is_admin or request.user.key() == recipe.parent_key()): return Unauthorized() # Jeśli jest już wyłączony, wykonaj prostsze kroki usuwające if recipe.disabled: to_delete = models.RecipeIngr.all().ancestor(recipe).fetch(20) db.delete(to_delete) Counter.remove_by_name(SHARD_RECIPE_KEY % recipe.key()) recipe.delete() else: # Zmień status na wyłączony recipe.disabled = True recipe.put() # Usuń liczniki, składniki i użytkownika to_delete = models.RecipeIngr.all().ancestor(recipe).fetch(20) db.delete(to_delete) Counter.remove_by_name(SHARD_RECIPE_KEY % recipe.key()) if recipe.rec_vis == VISIBILITY[2]: def utx(): user = PMMUser.get(recipe.parent_key()) user.rec_pub -= 1 if user.rec_pub < 0: user.rec_pub = 0 user.put() cache_delete('gfcu', recipe.parent_key().name()) db.run_in_transaction(utx) # na później odłóż indeksację, uaktualnienie tagów i licznika kategorii deferred_lib.defer(deferred.recipe_update, recipe.key(), 'delete') request.notifications.success('Przepis usunięty!') return render_json_response({'redirectUrl': url_for('przepisy/my_list')})