Пример #1
0
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')})