def treat_product_new(request, category): name = request.POST.get('name', '').strip() prize = request.POST.get('prize', '').strip() if is_valid_product(request, name, prize): try: product = Produit(nom=name, prix=prize) product.set_category(category) product.save() except Exception as ex: messages.add_message(request, messages.ERROR, "Les modifications n'ont pu être enregistrées. ('{}')".format(ex)) else: return HttpResponseRedirect('/carte/categories/%s/' % category.id)
def categories_send(request): ''' :param HttpRequest request: :return rtype: HttpResponse ''' result = Produit().get_list_with_all_products() subject = _("Carte") mail = "" for line in result: mail += "%s\n" % line if request.user.email: try: send_mail(subject, mail, settings.DEFAULT_FROM_EMAIL, [request.user.email], fail_silently=False) except: messages.add_message(request, messages.ERROR, _("Message could not be sent")) else: messages.add_message( request, messages.SUCCESS, _("Message was sent to %s") % request.user.email) else: messages.add_message(request, messages.ERROR, _("You have no email address")) return redirect('categories')
def products_new(request, cat_id): data = get_user(request) cat = get_object_or_404(Categorie, pk=cat_id) name = request.POST.get('name', '').strip() billname = request.POST.get('billname', '').strip() prize = request.POST.get('prize', '').strip() if name: if billname: if prize: product = Produit() product.categorie = cat product.nom = name product.nom_facture = billname product.prix = prize try: product.save() logging.info("[%s] new product [%s]" % (data['user'].username, name)) except: logging.warning("[%s] new product failed: [%s]" % (data['user'].username, name)) messages.add_message(request, messages.ERROR, "Le nouveau produit n'a pu être créé.") else: messages.add_message(request, messages.ERROR, "Vous devez définir un prix pour le nouveau produit.") else: messages.add_message(request, messages.ERROR, "Vous devez choisir un nom qui s'affichera sur la facture pour le nouveau produit.") else: messages.add_message(request, messages.ERROR, "Vous devez choisir un nom pour le nouveau produit.") return HttpResponseRedirect('/carte/products/cat/%s/' % cat_id)
def products_new(request, cat_id): context = {'menu_manager': True, } context['category'] = get_object_or_404(Categorie, pk=cat_id) if request.method == 'POST': name = request.POST.get('name', '').strip() prize = request.POST.get('prize', '').strip() if is_valid_product(request, name, prize): try: product = Produit(nom=name, prix=prize) product.set_category(context['category']) product.save() except Exception as ex: messages.add_message(request, messages.ERROR, _("Changes could not be saved")) logger.warning(_("Changes could not be saved")+": "+ex) else: return redirect('categories_view', context['category'].id) return render(request, 'base/carte/product_new.html', context)
def products_new(request, cat_id): context = {'menu_manager': True, } context['category'] = get_object_or_404(Categorie, pk=cat_id) if request.method == 'POST': name = request.POST.get('name', '').strip() prize = request.POST.get('prize', '').strip() if is_valid_product(request, name, prize): try: product = Produit(nom=name, prix=prize) product.set_category(context['category']) product.save() except Exception as ex: messages.add_message(request, messages.ERROR, "Les modifications n'ont pu être " "enregistrées. ('{}')".format(ex)) else: return redirect('categories_view', context['category'].id) return render(request, 'base/carte/product_new.html', context)
def products_new(request, category_id): ''' TODO :param HttpRequest request: :param category_id: :type category_id: ''' context = { 'menu_manager': True, } context['category'] = get_object_or_404(Categorie, pk=category_id) if request.method == 'POST': name = request.POST.get('name', '').strip() prize = request.POST.get('prize', '').strip() if is_valid_product(request, name, prize): try: product = Produit(nom=name, prix=prize) product.set_category(context['category']) product.save() except Exception as ex: messages.add_message(request, messages.ERROR, _("Changes could not be saved")) LOGGER.warning(_("Changes could not be saved") + ": " + ex) else: return redirect('categories_view', context['category'].id) return render(request, 'base/carte/product_new.html', context)
def categories_print(request): result = Produit().get_list_with_all_products() if result: printers = Printer.objects.filter(manager=True) if printers: printer = printers[0] if printer.print_list(result, "carte_complete"): messages.add_message( request, messages.SUCCESS, _("Printing was sent to %s") % printer.name) else: messages.add_message( request, messages.ERROR, _("Printing has failed on %s") % printer.name) else: messages.add_message(request, messages.ERROR, _("No printers 'manager' available")) else: messages.add_message(request, messages.ERROR, _("No product")) return redirect('categories')
def products_new(request, cat_id): data = get_user(request) cat = get_object_or_404(Categorie, pk=cat_id) name = request.POST.get('name', '').strip() billname = request.POST.get('billname', '').strip() prize = request.POST.get('prize', '').strip() if name: if billname: if prize: product = Produit() product.categorie = cat product.nom = name product.nom_facture = billname product.prix = prize try: product.save() logging.info("[%s] new product [%s]" % (data['user'].username, name)) except: logging.warning("[%s] new product failed: [%s]" % (data['user'].username, name)) messages.add_message( request, messages.ERROR, "Le nouveau produit n'a pu être créé.") else: messages.add_message( request, messages.ERROR, "Vous devez définir un prix pour le nouveau produit.") else: messages.add_message( request, messages.ERROR, "Vous devez choisir un nom qui s'affichera sur la facture pour le nouveau produit." ) else: messages.add_message( request, messages.ERROR, "Vous devez choisir un nom pour le nouveau produit.") return HttpResponseRedirect('/carte/products/cat/%s/' % cat_id)
def products_change(request, product_id): data = get_user(request) name = request.POST.get('name', '').strip() billname = request.POST.get('billname', '').strip() prize = request.POST.get('prize', '').strip() product = get_object_or_404(Produit, pk=product_id) if prize != str(product.prix): # new prize, so we have to create a new product to keep statistics # and historics logging.info("[%s] new prize for [%s]: [%s] > [%s]" % (data['user'].username, product.nom, product.prix, prize)) old = product product = Produit() product.actif = old.actif old.actif = False old.save() product.prix = prize product.nom = old.nom product.nom_facture = old.nom_facture product.choix_cuisson = old.choix_cuisson product.choix_accompagnement = old.choix_accompagnement product.choix_sauce = old.choix_sauce product.categorie = old.categorie try: product.save() for c in old.categories_ok.distinct(): product.categories_ok.add(c) for p in old.produits_ok.distinct(): product.produits_ok.add(p) messages.add_message(request, messages.INFO, "Le prix d'un produit ne peut être modifié, en conséquence un nouveau produit a été créé et l'ancien a été désactivé.") except: messages.add_message(request, messages.ERROR, "Les modifications n'ont pu être enregistrées.") logging.warning("[%s] save failed for product [%s]" % (data['user'].username, product.nom)) return HttpResponseRedirect('/carte/products/cat/%s/' % product.categorie.id) if name != product.nom: logging.info("[%s] new product name: [%s] > [%s]" % (data['user'].username, product.nom, name)) product.nom = name if billname != product.nom_facture: logging.info("[%s] new product bill name [%s]: [%s] > [%s]" % (data['user'].username, product.nom, product.nom_facture, billname)) product.nom_facture = billname try: product.save() except: messages.add_message(request, messages.ERROR, "Les modifications n'ont pu être enregistrées.") logging.warning("[%s] save failed for product [%s]" % (data['user'].username, product.nom)) return HttpResponseRedirect('/carte/products/cat/%s/' % product.categorie.id)
vat_takeaway.set_tax("5") vat_takeaway.save() # on entre les nouveaux produits, les prix sont TTC jus = Categorie(nom="Jus", priorite=25, surtaxable=False, disable_surtaxe=False, made_in_kitchen=False, color="#44b3dc", vat_onsite=vat_onsite, vat_takeaway=vat_takeaway) jus.save() abricot = Produit(nom="jus abricot", prix="2.80", choix_cuisson=False, choix_dish=False, choix_sauce=False, categorie=jus) abricot.save() pomme = Produit(nom="jus pomme", prix="2.80", choix_cuisson=False, choix_dish=False, choix_sauce=False, categorie=jus) pomme.save() bieres = Categorie(nom="Bieres", priorite=2, surtaxable=False, disable_surtaxe=False,
cu.execute("select id,red,green,blue from couleurs") for id,red,green,blue in cu.fetchall(): couleur = Couleur(id=id, red=red, green=green, blue=blue) couleur.save() Couleur_get = Couleur.objects.get print "> les categories et les produits" cu.execute("select id,nom_facture,nom_ihm,priorite_facture,majoration_terrasse,id_couleur,is_alcool,override_surtaxe from categories") for id,nom_facture,nom_ihm,priorite_facture,majoration_terrasse,id_couleur,is_alcool,override_surtaxe in cu.fetchall(): couleur = Couleur_get(pk=id_couleur) categorie = Categorie(id=id, nom=nom_ihm, priorite=priorite_facture, surtaxable=majoration_terrasse, alcool=is_alcool, disable_surtaxe=override_surtaxe, couleur=couleur) categorie.save() cu.execute("select id,nom_facture,nom_ihm,prix_ttc,actif from produits where id_categorie=%s" % categorie.id) for id,nom_facture,nom_ihm,prix_ttc,actif in cu.fetchall(): produit = Produit(id=id, nom=nom_ihm, nom_facture=nom_facture, prix=convert_prix(prix_ttc), actif=actif, categorie=categorie) produit.save() Produit_get = Produit.objects.get Categorie_get = Categorie.objects.get print "> les menus" cu.execute("select id_formule,id_categorie from formules_categories") for id_formule,id_categorie in cu.fetchall(): formule = Produit_get(id=id_formule) categorie = Categorie_get(id=id_categorie) formule.categories_ok.add(categorie) formule.save() cu.execute("select id_formule,id_produit from formules_produits") for id_formule,id_produit in cu.fetchall(): formule = Produit_get(id=id_formule) produit = Produit_get(id=id_produit)
categorie = Categorie(id=id, nom=nom_ihm, priorite=priorite_facture, surtaxable=majoration_terrasse, alcool=is_alcool, disable_surtaxe=override_surtaxe, couleur=couleur) categorie.save() cu.execute( "select id,nom_facture,nom_ihm,prix_ttc,actif from produits where id_categorie=%s" % categorie.id) for id, nom_facture, nom_ihm, prix_ttc, actif in cu.fetchall(): produit = Produit(id=id, nom=nom_ihm, nom_facture=nom_facture, prix=convert_prix(prix_ttc), actif=actif, categorie=categorie) produit.save() Produit_get = Produit.objects.get Categorie_get = Categorie.objects.get print "> les menus" cu.execute("select id_formule,id_categorie from formules_categories") for id_formule, id_categorie in cu.fetchall(): formule = Produit_get(id=id_formule) categorie = Categorie_get(id=id_categorie) formule.categories_ok.add(categorie) formule.save() cu.execute("select id_formule,id_produit from formules_produits") for id_formule, id_produit in cu.fetchall():
def handle(self, *args, **options): # managers for username in ['demo', 'demo1', 'demo2']: user = User(username=username, first_name=username, email="*****@*****.**" % username) user.set_password(username) user.is_superuser = True user.save() # staff members for username in ['staff', 'staff1', 'staff2']: user = User(username=username, first_name=username, email="*****@*****.**" % username) user.set_password(username) user.save() # Type de paiements PaiementType(nom='AMEX', fixed_value=False).save() PaiementType(nom='ANCV', fixed_value=True).save() PaiementType(nom='CB', fixed_value=False).save() PaiementType(nom='Cheque', fixed_value=False).save() PaiementType(nom='Espece', fixed_value=False).save() PaiementType(nom='Tic. Resto.', fixed_value=True).save() # Type de paiements par défaut pour les remboursements lorsque # le paiement dépasse le montant de la facture id_type_paiement = PaiementType.objects.get(nom="Espece").id Config(key="payment_for_refunds", value=id_type_paiement).save() # Default PaymentType to select by default on the payment page id_type_paiement = PaiementType.objects.get(nom="Espece").id Config(key="default_type_payment", value=id_type_paiement).save() # Montant de la surtaxe Config(key="price_surcharge", value="0.20").save() # Tables z = Zone(nom='Bar', surtaxe=False) z.save() Table(nom="T--", zone=z).save() z = Zone(nom='Rez de chaussee', surtaxe=False) z.save() for i in xrange(1, 15): Table(nom="T%02d" % i, zone=z).save() z = Zone(nom='Terrasse', surtaxe=True) z.save() for i in xrange(15, 26): Table(nom="T%02d" % i, zone=z).save() # TVA vat_alcool = VAT(name="alcool") vat_alcool.set_tax("20") vat_alcool.save() vat_onsite = VAT(name="sur place") vat_onsite.set_tax("10") vat_onsite.save() vat_takeaway = VAT(name=u"à emporter") vat_takeaway.set_tax("7") vat_takeaway.save() # Options Option(name="A_Frites").save() Option(name="A_Salade").save() Option(name="S_Creme").save() Option(name="A_Haricots").save() Option(name="S_Mayo").save() # Notes Note(message="Pas de sel").save() Note(message="Sans champignon").save() # # Data example # on entre les nouveaux produits, les prix sont TTC jus = Categorie(nom="Jus", priorite=25, surtaxable=False, disable_surtaxe=False, made_in_kitchen=False, color="#44b3dc", vat_onsite=vat_onsite, vat_takeaway=vat_takeaway) jus.save() abricot = Produit(nom="jus abricot", prix="2.80", choix_cuisson=False, categorie=jus) abricot.save() pomme = Produit(nom="jus pomme", prix="2.80", choix_cuisson=False, categorie=jus) pomme.save() bieres = Categorie(nom="Bieres", priorite=2, surtaxable=False, disable_surtaxe=False, made_in_kitchen=False, color="#ea97b5", vat_onsite=vat_alcool, vat_takeaway=vat_alcool) bieres.save() biere = Produit(nom="biere 50cl", prix="2.80", choix_cuisson=False, categorie=bieres) biere.save() entrees = Categorie(nom="Entrees", priorite=5, surtaxable=False, disable_surtaxe=False, made_in_kitchen=True, color="#ff9f00", vat_onsite=vat_onsite, vat_takeaway=vat_takeaway) entrees.save() salade = Produit(nom="salade normande", prix="3.40", choix_cuisson=False, categorie=entrees) salade.save() buffet = Produit(nom="buffet", prix="6.40", choix_cuisson=False, categorie=entrees) buffet.save() plat = Categorie(nom="Plat", priorite=10, surtaxable=False, disable_surtaxe=False, made_in_kitchen=True, color="#c9a100", vat_onsite=vat_onsite, vat_takeaway=vat_takeaway) plat.save() entrecote = Produit(nom="entrecote", prix="8.40", choix_cuisson=True, categorie=plat) entrecote.save() pave = Produit(nom="pave de saumon", prix="9.40", choix_cuisson=False, categorie=plat) pave.save() # pour les menu menu = Categorie(nom="Menu", priorite=22, surtaxable=False, disable_surtaxe=False, made_in_kitchen=False, color="#88f027", vat_onsite=vat_onsite, vat_takeaway=vat_takeaway) menu.save() entree_plat = Produit(nom=u"Menu Entree/Plat", prix="13.40", choix_cuisson=False, categorie=menu) entree_plat.save() entree_plat.categories_ok.add(entrees) entree_plat.categories_ok.add(plat) entree_plat.produits_ok.add(salade) entree_plat.produits_ok.add(entrecote) entree_plat.produits_ok.add(pave) entree_plat.save() # mis a jour des TTC et TVA for product in Produit.objects.all(): product.update_vats(keep_clone=False) def create_bill(finish=True): """Create a bill """ table = 'T%d' % random.randint(10, 25) bill = Facture(table=Table.objects.get(nom=table)) bill.save() produits_bar = [biere, pomme, abricot] produits_guests = [salade, buffet, entrecote, pave] payments = ['CB', 'Espece', 'Cheque'] if random.randint(1, 2) == 1: # guests part produits = produits_guests bill.couverts = random.randint(1, 15) else: produits = produits_bar nb_produits = random.randint(1, 6) for i in xrange(nb_produits): # random number of products nb_max = len(produits) - 1 produit = produits[random.randint(0, nb_max)] sold = ProduitVendu(produit=produit) sold.save() bill.add_product(sold) # nouveau_menu = ProduitVendu(produit=entree_plat) # nouveau_menu.save() # for produit in [salade, pave]: # sold = ProduitVendu(produit=produit) # sold.save() # nouveau_menu.contient.add(sold) # nouveau_menu.save() bill.update() if finish: nb_max = len(payments) - 1 name = payments[random.randint(0, nb_max)] type_payment = PaiementType.objects.get(nom=name) bill.add_payment(type_payment, bill.total_ttc) return bill # on ajoute des données pour avoir des jolies graphiques de # démonstrations now = datetime.datetime.now() for month in xrange(1, 13): for i in xrange(20): day = random.randint(1, 28) bill = create_bill() bill.date_creation = datetime.datetime(now.year, month, day) bill.save() # Création d'une dizaine de facture for i in xrange(15): bill = create_bill(finish=False) if i % 2: bill.update_kitchen() bill.print_ticket_kitchen() Stat().update()
# # You should have received a copy of the GNU General Public License # along with POSSUM. If not, see <http://www.gnu.org/licenses/>. # import sys, os sys.path.append('/home/pos') os.environ['DJANGO_SETTINGS_MODULE'] = 'possum.settings' from possum.base.models import Accompagnement, Sauce, Etat, \ Categorie, Couleur, Cuisson, Facture, Log, LogType, Paiement, \ PaiementType, Produit, ProduitVendu, Suivi, Table, Zone # il faut une categorie c = Categorie.objects.get(id=1) for f in Facture.objects.exclude(restant_a_payer=0, produits__isnull=False): filter = Produit.objects.filter(prix=f.get_montant()) count = filter.count() if count > 0: p = filter[0] print p.nom else: nom = "recuperation ancienne base (%0.2f)" % f.get_montant() print nom p = Produit(nom=nom, nom_facture=nom, prix=f.get_montant(), actif=False, categorie=c) p.save() vendu = ProduitVendu(produit=p, facture=f) vendu.save() f.produits.add(vendu)
def handle(self, *args, **options): create_users() create_payment() # Montant de la surtaxe Config(key="price_surcharge", value="0.20").save() create_tables() # TVA vat_alcool = VAT(name="alcool") vat_alcool.set_tax("20") vat_alcool.save() vat_onsite = VAT(name="sur place") vat_onsite.set_tax("10") vat_onsite.save() vat_takeaway = VAT(name="à emporter") vat_takeaway.set_tax("7") vat_takeaway.save() # Options Option(name="A_Frites").save() Option(name="A_Salade").save() Option(name="S_Creme").save() Option(name="A_Haricots").save() Option(name="S_Mayo").save() # Notes Note(message="Pas de sel").save() Note(message="Sans champignon").save() # # Data example # on entre les nouveaux produits, les prix sont TTC jus = Categorie(nom="Jus", priorite=25, surtaxable=False, disable_surtaxe=False, made_in_kitchen=False, color="#44b3dc", vat_onsite=vat_onsite, vat_takeaway=vat_takeaway) jus.save() abricot = Produit(nom="jus abricot", prix="2.80", choix_cuisson=False, categorie=jus) abricot.save() pomme = Produit(nom="jus pomme", prix="2.80", choix_cuisson=False, categorie=jus) pomme.save() bieres = Categorie(nom="Bieres", priorite=2, surtaxable=False, disable_surtaxe=False, made_in_kitchen=False, color="#ea97b5", vat_onsite=vat_alcool, vat_takeaway=vat_alcool) bieres.save() biere = Produit(nom="biere 50cl", prix="2.80", choix_cuisson=False, categorie=bieres) biere.save() entrees = Categorie(nom="Entrees", priorite=5, surtaxable=False, disable_surtaxe=False, made_in_kitchen=True, color="#ff9f00", vat_onsite=vat_onsite, vat_takeaway=vat_takeaway) entrees.save() salade = Produit(nom="salade normande", prix="3.40", choix_cuisson=False, categorie=entrees) salade.save() buffet = Produit(nom="buffet", prix="6.40", choix_cuisson=False, categorie=entrees) buffet.save() plat = Categorie(nom="Plat", priorite=10, surtaxable=False, disable_surtaxe=False, made_in_kitchen=True, color="#c9a100", vat_onsite=vat_onsite, vat_takeaway=vat_takeaway) plat.save() entrecote = Produit(nom="entrecote", prix="8.40", choix_cuisson=True, categorie=plat) entrecote.save() pave = Produit(nom="pave de saumon", prix="9.40", choix_cuisson=False, categorie=plat) pave.save() # pour les menu menu = Categorie(nom="Menu", priorite=22, surtaxable=False, disable_surtaxe=False, made_in_kitchen=False, color="#88f027", vat_onsite=vat_onsite, vat_takeaway=vat_takeaway) menu.save() entree_plat = Produit(nom="Menu Entree/Plat", prix="13.40", choix_cuisson=False, categorie=menu) entree_plat.save() entree_plat.categories_ok.add(entrees) entree_plat.categories_ok.add(plat) entree_plat.produits_ok.add(salade) entree_plat.produits_ok.add(entrecote) entree_plat.produits_ok.add(pave) entree_plat.save() # mis a jour des TTC et TVA for product in Produit.objects.all(): product.update_vats(keep_clone=False) def create_bill(finish=True): """Create a bill """ table = 'T%d' % random.randint(10, 25) bill = Facture(table=Table.objects.get(nom=table)) bill.save() produits_bar = [biere, pomme, abricot] produits_guests = [salade, buffet, entrecote, pave] payments = ['CB', 'Espece', 'Cheque'] if random.randint(1, 2) == 1: # guests part produits = produits_guests bill.couverts = random.randint(1, 15) else: produits = produits_bar nb_produits = random.randint(1, 6) for i in range(nb_produits): # random number of products nb_max = len(produits) - 1 produit = produits[random.randint(0, nb_max)] sold = ProduitVendu(produit=produit) sold.save() bill.add_product(sold) # nouveau_menu = ProduitVendu(produit=entree_plat) # nouveau_menu.save() # for produit in [salade, pave]: # sold = ProduitVendu(produit=produit) # sold.save() # nouveau_menu.contient.add(sold) # nouveau_menu.save() bill.update() if finish: nb_max = len(payments) - 1 name = payments[random.randint(0, nb_max)] type_payment = PaiementType.objects.get(nom=name) bill.add_payment(type_payment, bill.total_ttc) return bill # on ajoute des données pour avoir des jolies graphiques de # démonstrations now = datetime.datetime.now() for month in range(1, 13): for i in range(20): day = random.randint(1, 28) bill = create_bill() bill.date_creation = datetime.datetime(now.year, month, day) bill.save() # Création d'une dizaine de facture for i in range(15): bill = create_bill(finish=False) if i % 2: bill.update_kitchen() bill.print_ticket_kitchen() Stat().update()
### # Data example # on entre les nouveaux produits, les prix sont TTC jus = Categorie(nom="Jus", priorite=25, surtaxable=False, disable_surtaxe=False, made_in_kitchen=False, color="#44b3dc", vat_onsite=vat_onsite, vat_takeaway=vat_takeaway) jus.save() abricot = Produit(nom="jus abricot", prix="2.80", choix_cuisson=False, categorie=jus) abricot.save() pomme = Produit(nom="jus pomme", prix="2.80", choix_cuisson=False, categorie=jus) pomme.save() bieres = Categorie(nom="Bieres", priorite=2, surtaxable=False, disable_surtaxe=False, made_in_kitchen=False, color="#ea97b5", vat_onsite=vat_alcool,
def products_change(request, product_id): data = get_user(request) name = request.POST.get('name', '').strip() billname = request.POST.get('billname', '').strip() prize = request.POST.get('prize', '').strip() product = get_object_or_404(Produit, pk=product_id) if prize != str(product.prix): # new prize, so we have to create a new product to keep statistics # and historics logging.info("[%s] new prize for [%s]: [%s] > [%s]" % (data['user'].username, product.nom, product.prix, prize)) old = product product = Produit() product.actif = old.actif old.actif = False old.save() product.prix = prize product.nom = old.nom product.nom_facture = old.nom_facture product.choix_cuisson = old.choix_cuisson product.choix_accompagnement = old.choix_accompagnement product.choix_sauce = old.choix_sauce product.categorie = old.categorie try: product.save() for c in old.categories_ok.distinct(): product.categories_ok.add(c) for p in old.produits_ok.distinct(): product.produits_ok.add(p) messages.add_message( request, messages.INFO, "Le prix d'un produit ne peut être modifié, en conséquence un nouveau produit a été créé et l'ancien a été désactivé." ) except: messages.add_message( request, messages.ERROR, "Les modifications n'ont pu être enregistrées.") logging.warning("[%s] save failed for product [%s]" % (data['user'].username, product.nom)) return HttpResponseRedirect('/carte/products/cat/%s/' % product.categorie.id) if name != product.nom: logging.info("[%s] new product name: [%s] > [%s]" % (data['user'].username, product.nom, name)) product.nom = name if billname != product.nom_facture: logging.info("[%s] new product bill name [%s]: [%s] > [%s]" % (data['user'].username, product.nom, product.nom_facture, billname)) product.nom_facture = billname try: product.save() except: messages.add_message(request, messages.ERROR, "Les modifications n'ont pu être enregistrées.") logging.warning("[%s] save failed for product [%s]" % (data['user'].username, product.nom)) return HttpResponseRedirect('/carte/products/cat/%s/' % product.categorie.id)