def delete_if_unconfirmed(self, permanence): if not self.is_order_confirm_send: from repanier.email.email_order import export_order_2_1_customer from repanier.models.purchase import Purchase filename = "{0}-{1}.xlsx".format( slugify(_("Canceled order")), slugify(permanence) ) sender_email, sender_function, signature, cc_email_staff = get_signature( is_reply_to_order_email=True) export_order_2_1_customer( self.customer, filename, permanence, sender_email, sender_function, signature, cancel_order=True ) purchase_qs = Purchase.objects.filter( customer_invoice_id=self.id, is_box_content=False, ).order_by('?') for a_purchase in purchase_qs.select_related("customer"): create_or_update_one_cart_item( customer=a_purchase.customer, offer_item_id=a_purchase.offer_item_id, q_order=DECIMAL_ZERO, batch_job=True, comment=_("Cancelled qty : %s") % number_format(a_purchase.quantity_ordered, 4) )
def btn_confirm_order_ajax(request): if not request.is_ajax(): raise Http404 permanence_id = sint(request.GET.get('permanence', 0)) user = request.user if not user.is_authenticated(): raise Http404 customer = Customer.objects.filter( user_id=user.id, is_active=True, may_order=True).order_by('?').first() if customer is None: raise Http404 translation.activate(customer.language) permanence = Permanence.objects.filter(id=permanence_id).order_by('?').first() if permanence is None: raise Http404 customer_invoice = CustomerInvoice.objects.filter( permanence_id=permanence_id, customer_id=customer.id, is_order_confirm_send=False, total_price_with_tax__gt=DECIMAL_ZERO ).order_by('?') if not customer_invoice.exists(): raise Http404 filename = "{0}-{1}.xlsx".format( slugify(_("Order")), slugify(permanence) ) sender_email, sender_function, signature, cc_email_staff = get_signature( is_reply_to_order_email=True) export_order_2_1_customer( customer, filename, permanence, sender_email, sender_function, signature ) customer_invoice = CustomerInvoice.objects.filter( permanence_id=permanence_id, customer_id=customer.id ).order_by('?').first() customer_invoice.confirm_order() customer_invoice.save() to_json = [] my_basket(customer_invoice.is_order_confirm_send, customer_invoice.get_total_price_with_tax(), to_json) basket_message = calc_basket_message( customer, permanence, PERMANENCE_CLOSED ) my_order_confirmation( permanence=permanence, customer_invoice=customer_invoice, is_basket=True, basket_message=basket_message, to_json=to_json ) return HttpResponse(json.dumps(to_json, cls=DjangoJSONEncoder), content_type="application/json")
def btn_confirm_order_ajax(request): if not request.is_ajax(): raise Http404 permanence_id = sint(request.GET.get('permanence', 0)) user = request.user customer = Customer.objects.filter(user_id=user.id, is_active=True, may_order=True).order_by('?').first() if customer is None: raise Http404 translation.activate(customer.language) permanence = Permanence.objects.filter( id=permanence_id).order_by('?').first() if permanence is None: raise Http404 customer_invoice = CustomerInvoice.objects.filter( permanence_id=permanence_id, customer_id=customer.id, is_order_confirm_send=False, is_group=False, # total_price_with_tax__gt=DECIMAL_ZERO purchase__quantity_ordered__gt=DECIMAL_ZERO, ).order_by('?') if not customer_invoice.exists(): raise Http404 filename = "{0}-{1}.xlsx".format(slugify(_("Order")), slugify(permanence)) sender_email, sender_function, signature, cc_email_staff = get_signature( is_reply_to_order_email=True) export_order_2_1_customer(customer, filename, permanence, sender_email, sender_function, signature) customer_invoice = CustomerInvoice.objects.filter( permanence_id=permanence_id, customer_id=customer.id).order_by('?').first() customer_invoice.confirm_order() customer_invoice.save() to_json = [] my_basket(customer_invoice.is_order_confirm_send, customer_invoice.get_total_price_with_tax(), to_json) if customer_invoice.delivery is not None: status = customer_invoice.delivery.status else: status = customer_invoice.status basket_message = calc_basket_message(customer, permanence, status) customer_invoice.my_order_confirmation(permanence=permanence, is_basket=True, basket_message=basket_message, to_json=to_json) return HttpResponse(json.dumps(to_json, cls=DjangoJSONEncoder), content_type="application/json")
def is_order_confirm_send(self, request): permanence_id = request.GET.get('permanence', None) customer_id = request.GET.get('customer', None) user_message_level = messages.ERROR user_message = _("Action canceled by the system.") if permanence_id is not None and customer_id is not None: customer = Customer.objects.filter(id=customer_id).order_by('?').first() permanence = Permanence.objects.filter(id=permanence_id).order_by('?').first() if permanence is not None and customer is not None: customer_invoice = CustomerInvoice.objects.filter( customer_id=customer_id, permanence_id=permanence_id, ).order_by('?').first() if customer_invoice is not None: if customer_invoice.status == PERMANENCE_OPENED and not customer_invoice.is_order_confirm_send: filename = "{0}-{1}.xlsx".format( slugify(_("Order")), slugify(permanence) ) sender_email, sender_function, signature, cc_email_staff = get_signature( is_reply_to_order_email=True) export_order_2_1_customer( customer, filename, permanence, sender_email, sender_function, signature) user_message_level = messages.INFO user_message = customer.my_order_confirmation_email_send_to() else: user_message_level = messages.INFO user_message = _('Order confirmed') customer_invoice.confirm_order() customer_invoice.save() else: user_message_level = messages.INFO user_message = _('Nothing to confirm') redirect_to = "%s?permanence=%s&customer=%s" % ( urlresolvers.reverse('admin:repanier_purchase_changelist', ), permanence_id, customer_id) elif permanence_id is not None: redirect_to = "%s?permanence=%s" % ( urlresolvers.reverse('admin:repanier_purchase_changelist', ), permanence_id) else: redirect_to = urlresolvers.reverse('admin:repanier_purchase_changelist', ) self.message_user(request, user_message, user_message_level) return HttpResponseRedirect(redirect_to)
def send_order(self, request, queryset): if 'cancel' in request.POST: user_message = _("Action canceled by the user.") user_message_level = messages.INFO self.message_user(request, user_message, user_message_level) return permanence = queryset.first() if permanence is None or permanence.status not in [ PERMANENCE_OPENED, PERMANENCE_CLOSED ]: user_message = _("Action canceled by the system.") user_message_level = messages.ERROR self.message_user(request, user_message, user_message_level) return if 'apply' in request.POST: deliveries_to_be_send = [] producers_to_be_send = [] producer_qs = Producer.objects.filter(permanence=permanence.id) if "deliveries" in request.POST: deliveries_to_be_send = request.POST.getlist("deliveries") if len(deliveries_to_be_send) == 0: user_message = _( "You must select at least one delivery point.") user_message_level = messages.WARNING self.message_user(request, user_message, user_message_level) return all_producers = "all-producer-invoices" in request.POST producers_invoices_to_be_send = [] if "producer-invoices" in request.POST: producers_invoices_to_be_send = request.POST.getlist( "producer-invoices") if not all_producers and len(producers_invoices_to_be_send) == 0: user_message = _("You must select at least one producer.") user_message_level = messages.WARNING self.message_user(request, user_message, user_message_level) return producer_qs = producer_qs.filter( producerinvoice__in=producers_invoices_to_be_send) for producer in producer_qs.only("id").order_by('?'): producers_to_be_send.append(producer.id) user_message, user_message_level = task_order.admin_send( permanence_id=permanence.id, all_producers=all_producers, deliveries_id=deliveries_to_be_send, producers_id=producers_to_be_send) self.message_user(request, user_message, user_message_level) return template_order_customer_mail = [] template_order_producer_mail = [] template_order_staff_mail = [] cur_language = translation.get_language() for language in settings.PARLER_LANGUAGES[settings.SITE_ID]: language_code = language["code"] translation.activate(language_code) template = Template( repanier.apps.REPANIER_SETTINGS_CONFIG.order_customer_mail) sender_email, sender_function, signature, cc_email_staff = get_signature( is_reply_to_order_email=True) customer_last_balance = \ _('The balance of your account as of %(date)s is %(balance)s.') % { 'date' : timezone.now().strftime(settings.DJANGO_SETTINGS_DATE), 'balance': RepanierMoney(123.45) } customer_on_hold_movement = \ _( 'This balance does not take account of any unrecognized payments %(bank)s and any unbilled order %(other_order)s.') \ % { 'bank' : RepanierMoney(123.45), 'other_order': RepanierMoney(123.45) } bank_account_number = repanier.apps.REPANIER_SETTINGS_BANK_ACCOUNT if bank_account_number is not None: group_name = repanier.apps.REPANIER_SETTINGS_GROUP_NAME if permanence.short_name: communication = "%s (%s)" % (_('Short name'), permanence.short_name) else: communication = _('Short name') customer_payment_needed = '<font color="#bd0926">%s</font>' % ( _('Please pay %(payment)s to the bank account %(name)s %(number)s with communication %(communication)s.' ) % { 'payment': RepanierMoney(123.45), 'name': group_name, 'number': bank_account_number, 'communication': communication }) else: customer_payment_needed = EMPTY_STRING context = TemplateContext({ 'name': _('Long name'), 'long_basket_name': _('Long name'), 'basket_name': _('Short name'), 'short_basket_name': _('Short name'), 'permanence_link': mark_safe('<a href=#">%s</a>' % permanence), 'last_balance': mark_safe('<a href="#">%s</a>' % customer_last_balance), 'order_amount': RepanierMoney(123.45), 'on_hold_movement': mark_safe(customer_on_hold_movement), 'payment_needed': mark_safe(customer_payment_needed), 'delivery_point': _('delivery point').upper(), 'signature': mark_safe('%s<br/>%s<br/>%s' % (signature, sender_function, repanier.apps.REPANIER_SETTINGS_GROUP_NAME)), }) template_order_customer_mail.append(language_code) template_order_customer_mail.append(template.render(context)) template = Template( repanier.apps.REPANIER_SETTINGS_CONFIG.order_producer_mail) context = TemplateContext({ 'name': _('Long name'), 'long_profile_name': _('Long name'), 'order_empty': False, 'duplicate': True, 'permanence_link': mark_safe('<a href=#">%s</a>' % permanence), 'signature': mark_safe('%s<br/>%s<br/>%s' % (signature, sender_function, repanier.apps.REPANIER_SETTINGS_GROUP_NAME)), }) template_order_producer_mail.append(language_code) template_order_producer_mail.append(template.render(context)) board_composition, board_composition_and_description = get_board_composition( permanence.id) template = Template( repanier.apps.REPANIER_SETTINGS_CONFIG.order_staff_mail) context = TemplateContext({ 'permanence_link': mark_safe('<a href=#">%s</a>' % permanence), 'board_composition': mark_safe(board_composition), 'board_composition_and_description': mark_safe(board_composition_and_description), 'signature': mark_safe('%s<br/>%s<br/>%s' % (signature, sender_function, repanier.apps.REPANIER_SETTINGS_GROUP_NAME)), }) template_order_staff_mail.append(language_code) template_order_staff_mail.append(template.render(context)) translation.activate(cur_language) order_customer_email_will_be_sent, order_customer_email_will_be_sent_to = send_email_to_who( repanier.apps.REPANIER_SETTINGS_SEND_ORDER_MAIL_TO_CUSTOMER) order_producer_email_will_be_sent, order_producer_email_will_be_sent_to = send_email_to_who( repanier.apps.REPANIER_SETTINGS_SEND_ORDER_MAIL_TO_PRODUCER) order_board_email_will_be_sent, order_board_email_will_be_sent_to = send_email_to_who( repanier.apps.REPANIER_SETTINGS_SEND_ORDER_MAIL_TO_BOARD, board=True) form = CloseAndSendOrderForm( initial={ 'template_order_customer_mail': mark_safe("<br/>==============<br/>".join( template_order_customer_mail)), 'template_order_producer_mail': mark_safe("<br/>==============<br/>".join( template_order_producer_mail)), 'template_order_staff_mail': mark_safe("<br/>==============<br/>".join( template_order_staff_mail)), }) if repanier.apps.REPANIER_SETTINGS_CUSTOMERS_MUST_CONFIRM_ORDERS or DeliveryBoard.objects.filter( permanence_id=permanence.id, status__gt=PERMANENCE_OPENED).order_by('?').exists(): # /!\ If one delivery point has been closed, I may not close anymore by producer: producer_invoices = ProducerInvoice.objects.none() else: producer_invoices = ProducerInvoice.objects.filter( Q(permanence_id=permanence.id, status=PERMANENCE_OPENED, producer__represent_this_buyinggroup=False) | Q(permanence_id=permanence.id, status=PERMANENCE_CLOSED, producer__represent_this_buyinggroup=False)).order_by( "producer") return render( request, 'repanier/confirm_admin_send_order.html', { 'sub_title': _("Please, confirm the action : send orders"), 'action_checkbox_name': admin.ACTION_CHECKBOX_NAME, 'action': 'send_order', 'permanence': permanence, 'deliveries': DeliveryBoard.objects.filter( permanence_id=permanence.id, status__in=[PERMANENCE_OPENED, PERMANENCE_CLOSED ]).order_by("id"), 'producer_invoices': producer_invoices, 'form': form, 'order_customer_email_will_be_sent': order_customer_email_will_be_sent, 'order_customer_email_will_be_sent_to': order_customer_email_will_be_sent_to, 'order_producer_email_will_be_sent': order_producer_email_will_be_sent, 'order_producer_email_will_be_sent_to': order_producer_email_will_be_sent_to, 'order_board_email_will_be_sent': order_board_email_will_be_sent, 'order_board_email_will_be_sent_to': order_board_email_will_be_sent_to })
def open_and_send_offer(self, request, queryset): if 'cancel' in request.POST: user_message = _("Action canceled by the user.") user_message_level = messages.INFO self.message_user(request, user_message, user_message_level) return permanence = queryset.first() if permanence is None or not (PERMANENCE_PLANNED <= permanence.status <= PERMANENCE_WAIT_FOR_OPEN): user_message = _("Action canceled by the system.") user_message_level = messages.ERROR self.message_user(request, user_message, user_message_level) return pre_open = (permanence.status == PERMANENCE_PLANNED) and Producer.objects.filter( permanence__id=permanence.id, is_active=True, producer_pre_opening=True).order_by('?').exists() if pre_open: template_offer_mail = [] template_cancel_order_mail = [] cur_language = translation.get_language() for language in settings.PARLER_LANGUAGES[settings.SITE_ID]: language_code = language["code"] translation.activate(language_code) with switch_language(repanier.apps.REPANIER_SETTINGS_CONFIG, language_code): template = Template(repanier.apps.REPANIER_SETTINGS_CONFIG. offer_producer_mail) sender_email, sender_function, signature, cc_email_staff = get_signature( is_reply_to_order_email=True) with switch_language(permanence, language_code): offer_description = permanence.safe_translation_getter( 'offer_description', any_language=True, default=EMPTY_STRING) context = TemplateContext({ 'name': _('long_profile_name'), 'long_profile_name': _('long_profile_name'), 'permanence_link': mark_safe('<a href="#">%s</a>' % _("offer")), 'offer_description': mark_safe(offer_description), 'offer_link': mark_safe('<a href="#">%s</a>' % _("offer")), 'signature': mark_safe('%s<br/>%s<br/>%s' % (signature, sender_function, repanier.apps.REPANIER_SETTINGS_GROUP_NAME)), }) template_offer_mail.append(language_code) template_offer_mail.append(template.render(context)) translation.activate(cur_language) email_will_be_sent, email_will_be_sent_to = send_email_to_who(True) else: template_offer_mail = [] template_cancel_order_mail = [] cur_language = translation.get_language() for language in settings.PARLER_LANGUAGES[settings.SITE_ID]: language_code = language["code"] translation.activate(language_code) with switch_language(repanier.apps.REPANIER_SETTINGS_CONFIG, language_code): template = Template(repanier.apps.REPANIER_SETTINGS_CONFIG. offer_customer_mail) sender_email, sender_function, signature, cc_email_staff = get_signature( is_reply_to_order_email=True) with switch_language(permanence, language_code): offer_description = permanence.safe_translation_getter( 'offer_description', any_language=True, default=EMPTY_STRING) offer_producer = ', '.join( [p.short_profile_name for p in permanence.producers.all()]) qs = Product.objects.filter( producer=permanence.producers.first(), is_into_offer=True, order_unit__lt= PRODUCT_ORDER_UNIT_DEPOSIT # Don't display technical products. ).order_by("translations__long_name")[:5] offer_detail = '<ul>%s</ul>' % ("".join( '<li>%s, %s</li>' % (p.get_long_name(with_box_unicode=False), p.producer.short_profile_name) for p in qs), ) context = TemplateContext({ 'offer_description': mark_safe(offer_description), 'offer_detail': offer_detail, 'offer_recent_detail': offer_detail, 'offer_producer': offer_producer, 'permanence_link': mark_safe('<a href="#">%s</a>' % permanence), 'signature': mark_safe('%s<br/>%s<br/>%s' % (signature, sender_function, repanier.apps.REPANIER_SETTINGS_GROUP_NAME)), }) template_offer_mail.append(language_code) template_offer_mail.append(template.render(context)) if repanier.apps.REPANIER_SETTINGS_CUSTOMERS_MUST_CONFIRM_ORDERS: context = TemplateContext({ 'name': _('long_basket_name'), 'long_basket_name': _('long_basket_name'), 'basket_name': _('short_basket_name'), 'short_basket_name': _('short_basket_name'), 'permanence_link': mark_safe('<a href=#">%s</a>' % permanence), 'signature': mark_safe( '%s<br/>%s<br/>%s' % (signature, sender_function, repanier.apps.REPANIER_SETTINGS_GROUP_NAME)), }) template_cancel_order_mail.append(language_code) template_cancel_order_mail.append(template.render(context)) translation.activate(cur_language) email_will_be_sent, email_will_be_sent_to = send_email_to_who( repanier.apps.REPANIER_SETTINGS_SEND_OPENING_MAIL_TO_CUSTOMER) if 'apply' in request.POST or 'apply-wo-mail' in request.POST: form = OpenAndSendOfferForm(request.POST) if form.is_valid(): user_message, user_message_level = task_order.admin_open_and_send( request, permanence, 'apply-wo-mail' in request.POST) self.message_user(request, user_message, user_message_level) return HttpResponseRedirect(request.get_full_path()) else: form = OpenAndSendOfferForm( initial={ 'template_offer_customer_mail': mark_safe("<br/>==============<br/>".join( template_offer_mail)), 'template_cancel_order_customer_mail': mark_safe("<br/>==============<br/>".join( template_cancel_order_mail)), }) return render( request, 'repanier/confirm_admin_open_and_send_offer.html', { 'sub_title': _("Please, confirm the action : open and send offers"), 'action_checkbox_name': admin.ACTION_CHECKBOX_NAME, 'action': 'open_and_send_offer', 'permanence': permanence, 'pre_open': pre_open, 'form': form, 'email_will_be_sent': email_will_be_sent, 'email_will_be_sent_to': email_will_be_sent_to })
def send_invoices(self, request, permanence_qs): if 'cancel' in request.POST: user_message = _("Action canceled by the user.") user_message_level = messages.INFO self.message_user(request, user_message, user_message_level) return permanence = permanence_qs.first() if permanence is None or permanence.status != PERMANENCE_INVOICED: user_message = _("Action canceled by the system.") user_message_level = messages.ERROR self.message_user(request, user_message, user_message_level) return template = Template( repanier.apps.REPANIER_SETTINGS_CONFIG.invoice_customer_mail) invoice_description = permanence.safe_translation_getter( 'invoice_description', any_language=True, default=EMPTY_STRING) sender_email, sender_function, signature, cc_email_staff = get_signature( is_reply_to_invoice_email=True) # TODO : Align on tools.payment_message customer_order_amount = \ _('The amount of your order is %(amount)s.') % { 'amount': RepanierMoney(123.45) } customer_last_balance = \ _('The balance of your account as of %(date)s is %(balance)s.') % { 'date' : timezone.now().strftime(settings.DJANGO_SETTINGS_DATE), 'balance': RepanierMoney(123.45) } customer_payment_needed = "%s %s %s (%s) %s \"%s\"." % ( _('Please pay'), RepanierMoney(123.45), _('to the bank account number'), repanier.apps.REPANIER_SETTINGS_BANK_ACCOUNT, _('with communication'), _('short_basket_name')) context = TemplateContext({ 'name': _('long_basket_name'), 'long_basket_name': _('long_basket_name'), 'basket_name': _('short_basket_name'), 'short_basket_name': _('short_basket_name'), 'permanence_link': mark_safe('<a href=#">%s</a>' % permanence), 'last_balance_link': mark_safe('<a href="#">%s</a>' % customer_last_balance), 'last_balance': customer_last_balance, 'order_amount': mark_safe(customer_order_amount), 'payment_needed': mark_safe(customer_payment_needed), 'invoice_description': mark_safe(invoice_description), 'signature': mark_safe('%s<br/>%s<br/>%s' % (signature, sender_function, repanier.apps.REPANIER_SETTINGS_GROUP_NAME)), }) template_invoice_customer_mail = template.render(context) invoice_customer_email_will_be_sent, invoice_customer_email_will_be_sent_to = send_email_to_who( repanier.apps.REPANIER_SETTINGS_SEND_INVOICE_MAIL_TO_CUSTOMER) template = Template( repanier.apps.REPANIER_SETTINGS_CONFIG.invoice_producer_mail) context = TemplateContext({ 'name': _('long_profile_name'), 'long_profile_name': _('long_profile_name'), 'permanence_link': mark_safe('<a href=#">%s</a>' % permanence), 'signature': mark_safe('%s<br/>%s<br/>%s' % (signature, sender_function, repanier.apps.REPANIER_SETTINGS_GROUP_NAME)), }) template_invoice_producer_mail = template.render(context) invoice_producer_email_will_be_sent, invoice_producer_email_will_be_sent_to = send_email_to_who( repanier.apps.REPANIER_SETTINGS_SEND_INVOICE_MAIL_TO_PRODUCER) if 'apply' in request.POST: form = InvoiceOrderForm(request.POST) if form.is_valid(): user_message, user_message_level = task_invoice.admin_send( permanence) self.message_user(request, user_message, user_message_level) return HttpResponseRedirect(request.get_full_path()) else: form = InvoiceOrderForm( initial={ 'template_invoice_customer_mail': mark_safe(template_invoice_customer_mail), 'template_invoice_producer_mail': mark_safe(template_invoice_producer_mail), }) return render( request, 'repanier/confirm_admin_send_invoice.html', { 'sub_title': _("Please, confirm the action : send invoices"), 'action_checkbox_name': admin.ACTION_CHECKBOX_NAME, 'action': 'send_invoices', 'permanence': permanence, 'form': form, 'invoice_customer_email_will_be_sent': invoice_customer_email_will_be_sent, 'invoice_customer_email_will_be_sent_to': invoice_customer_email_will_be_sent_to, 'invoice_producer_email_will_be_sent': invoice_producer_email_will_be_sent, 'invoice_producer_email_will_be_sent_to': invoice_producer_email_will_be_sent_to })
def close_order(permanence, all_producers, producers_id=None): getcontext().rounding = ROUND_HALF_UP today = timezone.now().date() if repanier.apps.REPANIER_SETTINGS_CUSTOMERS_MUST_CONFIRM_ORDERS: # 0 - Cancel unconfirmed purchases purchase_qs = Purchase.objects.filter( permanence_id=permanence.id, customer_invoice__is_order_confirm_send=False, is_box_content=False ).exclude( quantity_ordered=DECIMAL_ZERO ).order_by('customer_invoice') if not all_producers: purchase_qs = purchase_qs.filter(producer_id__in=producers_id) customer_invoice_id_save = -1 for purchase in purchase_qs.select_related("customer", "offer_item"): if customer_invoice_id_save != purchase.customer_invoice_id: customer_invoice_id_save = purchase.customer_invoice_id # This order has been cancelled # filename = force_filename("%s - %s.xlsx" % (_("Canceled order"), permanence)) filename = "{0}-{1}.xlsx".format( slugify(_("Canceled order")), slugify(permanence) ) sender_email, sender_function, signature, cc_email_staff = get_signature( is_reply_to_order_email=True) export_order_2_1_customer( purchase.customer, filename, permanence, sender_email, sender_function, signature, cancel_order=True) update_or_create_purchase( customer=purchase.customer, offer_item_id=purchase.offer_item.id, value_id=DECIMAL_ZERO, batch_job=True ) else: # 0 - Delete unused purchases purchase_qs = Purchase.objects.filter( permanence_id=permanence.id, quantity_ordered=0 ).order_by('?') if not all_producers: purchase_qs = purchase_qs.filter(producer_id__in=producers_id) purchase_qs.delete() # 1 - Round to multiple producer_order_by_quantity offer_item_qs = OfferItem.objects.filter( permanence_id=permanence.id, is_active=True, order_unit__lt=PRODUCT_ORDER_UNIT_DEPOSIT, producer_order_by_quantity__gt=1, quantity_invoiced__gt=0 ).order_by('?') if not all_producers: offer_item_qs = offer_item_qs.filter(producer_id__in=producers_id) for offer_item in offer_item_qs: # It's possible to round the ordered qty even If we do not manage stock if offer_item.manage_replenishment: needed = (offer_item.quantity_invoiced - offer_item.stock) else: needed = offer_item.quantity_invoiced if needed > DECIMAL_ZERO: offer_item.add_2_stock = offer_item.producer_order_by_quantity - ( needed % offer_item.producer_order_by_quantity) offer_item.save() # 2 - Add Transport offer_item_qs = OfferItem.objects.filter( permanence_id=permanence.id, is_active=False, order_unit=PRODUCT_ORDER_UNIT_TRANSPORTATION ).order_by('?') if not all_producers: offer_item_qs = offer_item_qs.filter(producer_id__in=producers_id) for offer_item in offer_item_qs: buying_group = Customer.objects.filter(is_active=True, represent_this_buyinggroup=True).order_by('?').first() create_or_update_one_purchase(buying_group, offer_item, 1, None, True, is_box_content=False) membership_fee_product = Product.objects.filter(is_membership_fee=True, is_active=True).order_by('?').first() membership_fee_product.producer_unit_price = repanier.apps.REPANIER_SETTINGS_MEMBERSHIP_FEE # Update the prices membership_fee_product.save() membership_fee_offer_item = get_or_create_offer_item( permanence, membership_fee_product.id, membership_fee_product.producer_id ) for customer in Customer.objects.filter( is_active=True, may_order=True, customerinvoice__permanence_id=permanence.id, customerinvoice__total_price_with_tax__gt=DECIMAL_ZERO, represent_this_buyinggroup=False ).order_by('?'): # 3 - Add Deposit offer_item_qs = OfferItem.objects.filter( permanence_id=permanence.id, order_unit=PRODUCT_ORDER_UNIT_DEPOSIT ).order_by('?') if not all_producers: offer_item_qs = offer_item_qs.filter(producer_id__in=producers_id) for offer_item in offer_item_qs: create_or_update_one_purchase(customer, offer_item, 1, None, True, is_box_content=False) create_or_update_one_purchase(customer, offer_item, 0, None, True, is_box_content=False) # 4 - Add Add Membership fee Subscription if repanier.apps.REPANIER_SETTINGS_MEMBERSHIP_FEE_DURATION > 0: # There is a membership fee if customer.membership_fee_valid_until < today: permanence.producers.add(membership_fee_offer_item.producer_id) create_or_update_one_purchase(customer, membership_fee_offer_item, 1, None, True, is_box_content=False) while customer.membership_fee_valid_until < today: # Do not pay the membership fee if no order passed during a certain amount of time customer.membership_fee_valid_until = add_months( customer.membership_fee_valid_until, repanier.apps.REPANIER_SETTINGS_MEMBERSHIP_FEE_DURATION ) customer.save(update_fields=['membership_fee_valid_until', ]) # 5 - Add Common participation Subscription if all_producers: for offer_item in OfferItem.objects.filter( permanence_id=permanence.id, is_membership_fee=False, order_unit=PRODUCT_ORDER_UNIT_SUBSCRIPTION ).order_by('?'): for customer in Customer.objects.filter( is_active=True, may_order=True, represent_this_buyinggroup=False ).order_by('?'): permanence.producers.add(offer_item.producer_id) create_or_update_one_purchase(customer, offer_item, 1, None, True, is_box_content=False) # Disable subscription for next permanence Product.objects.filter( order_unit=PRODUCT_ORDER_UNIT_SUBSCRIPTION, is_into_offer=True, is_membership_fee=False ).order_by('?').update(is_into_offer=False) permanence.set_status(PERMANENCE_CLOSED, allow_downgrade=False) if not repanier.apps.REPANIER_SETTINGS_INVOICE and repanier.apps.REPANIER_SETTINGS_BANK_ACCOUNT is None: # No Invoice and no bank_account --> auto archive # Put send permanences to the done status, because they will "never" be invoiced for permanence in Permanence.objects.filter(status=PERMANENCE_SEND): permanence.set_status(PERMANENCE_ARCHIVED, update_payment_date=True) else: permanence.set_status(PERMANENCE_CLOSED, all_producers=all_producers, producers_id=producers_id) # 6 - Refresh the Purchase 'sum' for each customer recalculate_order_amount( permanence_id=permanence.id, all_producers=all_producers, producers_id=producers_id, send_to_producer=False, )
def close_order_delivery(permanence, delivery, all_producers, producers_id=None): today = timezone.now().date() getcontext().rounding = ROUND_HALF_UP # 0 - Delete unused purchases # No need to select : customer_invoice__delivery = delivery Purchase.objects.filter( permanence_id=permanence.id, quantity_ordered=0 ).order_by('?').delete() if repanier.apps.REPANIER_SETTINGS_CUSTOMERS_MUST_CONFIRM_ORDERS: purchase_qs = Purchase.objects.filter( permanence_id=permanence.id, customer_invoice__delivery=delivery, customer_invoice__is_order_confirm_send=False, is_box_content=False ).exclude( quantity_ordered=DECIMAL_ZERO ).order_by('customer_invoice') if not all_producers: # This may never be the but, but... purchase_qs = purchase_qs.filter(producer_id__in=producers_id) customer_invoice_id_save = -1 for purchase in purchase_qs.select_related("customer", "offer_item"): if customer_invoice_id_save != purchase.customer_invoice_id: customer_invoice_id_save =purchase.customer_invoice_id # This order has been cancelled # filename = force_filename("%s - %s.xlsx" % (_("Canceled order"), permanence)) filename = "{0}-{1}.xlsx".format( slugify(_("Canceled order")), slugify(permanence) ) sender_email, sender_function, signature, cc_email_staff = get_signature( is_reply_to_order_email=True) export_order_2_1_customer( purchase.customer, filename, permanence, sender_email, sender_function, signature, cancel_order=True) update_or_create_purchase( customer=purchase.customer, offer_item_id=purchase.offer_item.id, value_id=DECIMAL_ZERO, batch_job=True ) if all_producers: # 1 - Do not round to multiple producer_order_by_quantity # 2 - Do not add Transport membership_fee_product = Product.objects.filter(is_membership_fee=True, is_active=True).order_by('?').first() membership_fee_product.producer_unit_price = repanier.apps.REPANIER_SETTINGS_MEMBERSHIP_FEE # Update the prices membership_fee_product.save() membership_fee_offer_item = get_or_create_offer_item(permanence, membership_fee_product.id, membership_fee_product.producer_id) for customer in Customer.objects.filter( is_active=True, may_order=True, customerinvoice__permanence_id=permanence.id, customerinvoice__delivery=delivery, customerinvoice__total_price_with_tax__gt=DECIMAL_ZERO, represent_this_buyinggroup=False ).order_by('?'): # 3 - Add Deposit for offer_item in OfferItem.objects.filter(permanence_id=permanence.id, # is_active=False, order_unit=PRODUCT_ORDER_UNIT_DEPOSIT).order_by('?'): permanence.producers.add(offer_item.producer_id) create_or_update_one_purchase(customer, offer_item, 1, None, True, is_box_content=False) create_or_update_one_purchase(customer, offer_item, 0, None, True, is_box_content=False) # 4 - Add Membership fee Subscription if repanier.apps.REPANIER_SETTINGS_MEMBERSHIP_FEE_DURATION > 0: # There is a membership fee if customer.membership_fee_valid_until < today: permanence.producers.add(membership_fee_offer_item.producer_id) create_or_update_one_purchase(customer, membership_fee_offer_item, 1, None, True, is_box_content=False) customer.membership_fee_valid_until = add_months( customer.membership_fee_valid_until, repanier.apps.REPANIER_SETTINGS_MEMBERSHIP_FEE_DURATION ) customer.save(update_fields=['membership_fee_valid_until', ]) # 5 - Add Common participation Subscription for offer_item in OfferItem.objects.filter( permanence_id=permanence.id, is_membership_fee=False, order_unit=PRODUCT_ORDER_UNIT_SUBSCRIPTION).order_by('?'): for customer in Customer.objects.filter(is_active=True, may_order=True, represent_this_buyinggroup=False).order_by('?'): permanence.producers.add(offer_item.producer_id) create_or_update_one_purchase(customer, offer_item, 1, None, True, is_box_content=False) # 6 - Refresh the Purchase 'sum' recalculate_order_amount( permanence_id=permanence.id, all_producers=all_producers, producers_id=producers_id, send_to_producer=False ) delivery.set_status(PERMANENCE_CLOSED, all_producers, producers_id)
def send_invoices(self, request, queryset): if "cancel" in request.POST: user_message = _("Action canceled by the user.") user_message_level = messages.INFO self.message_user(request, user_message, user_message_level) return None permanence = queryset.order_by("?").first() if permanence is None or permanence.status != PERMANENCE_DONE: user_message = _("Action canceled by the system.") user_message_level = messages.ERROR self.message_user(request, user_message, user_message_level) return None template = Template(repanier.apps.REPANIER_SETTINGS_CONFIG.invoice_customer_mail) try: invoice_description = permanence.invoice_description except TranslationDoesNotExist: invoice_description = EMPTY_STRING sender_email, sender_function, signature, cc_email_staff = get_signature(is_reply_to_invoice_email=True) # TODO : Align on tools.payment_message customer_order_amount = _("The amount of your order is %(amount)s.") % {"amount": RepanierMoney(123.45)} customer_last_balance = _("The balance of your account as of %(date)s is %(balance)s.") % { "date": timezone.now().strftime(settings.DJANGO_SETTINGS_DATE), "balance": RepanierMoney(123.45), } customer_payment_needed = '%s %s %s (%s) %s "%s".' % ( _("Please pay"), RepanierMoney(123.45), _("to the bank account number"), repanier.apps.REPANIER_SETTINGS_BANK_ACCOUNT, _("with communication"), _("short_basket_name"), ) context = TemplateContext( { "name": _("long_basket_name"), "long_basket_name": _("long_basket_name"), "basket_name": _("short_basket_name"), "short_basket_name": _("short_basket_name"), "permanence_link": mark_safe('<a href=#">%s</a>' % permanence), "last_balance_link": mark_safe('<a href="#">%s</a>' % customer_last_balance), "last_balance": customer_last_balance, "order_amount": mark_safe(customer_order_amount), "payment_needed": mark_safe(customer_payment_needed), "invoice_description": mark_safe(invoice_description), "signature": mark_safe( "%s<br/>%s<br/>%s" % (signature, sender_function, repanier.apps.REPANIER_SETTINGS_GROUP_NAME) ), } ) template_invoice_customer_mail = template.render(context) invoice_customer_email_will_be_sent, invoice_customer_email_will_be_sent_to = send_email_to_who( repanier.apps.REPANIER_SETTINGS_SEND_INVOICE_MAIL_TO_CUSTOMER ) template = Template(repanier.apps.REPANIER_SETTINGS_CONFIG.invoice_producer_mail) context = TemplateContext( { "name": _("long_profile_name"), "long_profile_name": _("long_profile_name"), "permanence_link": mark_safe('<a href=#">%s</a>' % permanence), "signature": mark_safe( "%s<br/>%s<br/>%s" % (signature, sender_function, repanier.apps.REPANIER_SETTINGS_GROUP_NAME) ), } ) template_invoice_producer_mail = template.render(context) invoice_producer_email_will_be_sent, invoice_producer_email_will_be_sent_to = send_email_to_who( repanier.apps.REPANIER_SETTINGS_SEND_INVOICE_MAIL_TO_PRODUCER ) if "apply" in request.POST: form = InvoiceOrderForm(request.POST) if form.is_valid(): user_message, user_message_level = task_invoice.admin_send(permanence.id) self.message_user(request, user_message, user_message_level) return HttpResponseRedirect(request.get_full_path()) else: form = InvoiceOrderForm( initial={ "template_invoice_customer_mail": mark_safe(template_invoice_customer_mail), "template_invoice_producer_mail": mark_safe(template_invoice_producer_mail), } ) return render( request, "repanier/confirm_admin_send_invoice.html", { "sub_title": _("Please, confirm the action : send invoices"), "action_checkbox_name": admin.ACTION_CHECKBOX_NAME, "action": "send_invoices", "permanence": permanence, "form": form, "invoice_customer_email_will_be_sent": invoice_customer_email_will_be_sent, "invoice_customer_email_will_be_sent_to": invoice_customer_email_will_be_sent_to, "invoice_producer_email_will_be_sent": invoice_producer_email_will_be_sent, "invoice_producer_email_will_be_sent_to": invoice_producer_email_will_be_sent_to, }, )
def send_order(self, request, queryset): if 'cancel' in request.POST: user_message = _("Action canceled by the user.") user_message_level = messages.INFO self.message_user(request, user_message, user_message_level) return None permanence = queryset.order_by('?').first() if permanence is None or permanence.status not in [PERMANENCE_OPENED, PERMANENCE_CLOSED]: user_message = _("Action canceled by the system.") user_message_level = messages.ERROR self.message_user(request, user_message, user_message_level) return None if 'apply' in request.POST: deliveries_to_be_send = [] producers_to_be_send = [] producer_qs = Producer.objects.filter(permanence=permanence.id) if "deliveries" in request.POST: deliveries_to_be_send = request.POST.getlist("deliveries") if len(deliveries_to_be_send) == 0: user_message = _("You must select at least one delivery point.") user_message_level = messages.WARNING self.message_user(request, user_message, user_message_level) return None all_producers = "all-producer-invoices" in request.POST producers_invoices_to_be_send = [] if "producer-invoices" in request.POST: producers_invoices_to_be_send = request.POST.getlist("producer-invoices") if not all_producers and len(producers_invoices_to_be_send) == 0: user_message = _("You must select at least one producer.") user_message_level = messages.WARNING self.message_user(request, user_message, user_message_level) return None producer_qs = producer_qs.filter( producerinvoice__in=producers_invoices_to_be_send) for producer in producer_qs.only("id").order_by('?'): producers_to_be_send.append(producer.id) user_message, user_message_level = task_order.admin_send( permanence_id=permanence.id, all_producers=all_producers, deliveries_id=deliveries_to_be_send, producers_id=producers_to_be_send ) self.message_user(request, user_message, user_message_level) return None template_order_customer_mail = [] template_order_producer_mail = [] template_order_staff_mail = [] cur_language = translation.get_language() for language in settings.PARLER_LANGUAGES[settings.SITE_ID]: language_code = language["code"] translation.activate(language_code) template = Template(repanier.apps.REPANIER_SETTINGS_CONFIG.order_customer_mail) sender_email, sender_function, signature, cc_email_staff = get_signature(is_reply_to_order_email=True) customer_last_balance = \ _('The balance of your account as of %(date)s is %(balance)s.') % { 'date' : timezone.now().strftime(settings.DJANGO_SETTINGS_DATE), 'balance': RepanierMoney(123.45) } customer_on_hold_movement = \ _( 'This balance does not take account of any unrecognized payments %(bank)s and any unbilled order %(other_order)s.') \ % { 'bank' : RepanierMoney(123.45), 'other_order': RepanierMoney(123.45) } bank_account_number = repanier.apps.REPANIER_SETTINGS_BANK_ACCOUNT if bank_account_number is not None: group_name = repanier.apps.REPANIER_SETTINGS_GROUP_NAME if permanence.short_name: communication = "%s (%s)" % (_('short_basket_name'), permanence.short_name) else: communication = _('short_basket_name') customer_payment_needed = '<font color="#bd0926">%s</font>' % ( _( 'Please pay %(payment)s to the bank account %(name)s %(number)s with communication %(communication)s.') % { 'payment' : RepanierMoney(123.45), 'name' : group_name, 'number' : bank_account_number, 'communication': communication } ) else: customer_payment_needed = EMPTY_STRING context = TemplateContext({ 'name' : _('long_basket_name'), 'long_basket_name' : _('long_basket_name'), 'basket_name' : _('short_basket_name'), 'short_basket_name': _('short_basket_name'), 'permanence_link' : mark_safe('<a href=#">%s</a>' % permanence), 'last_balance' : mark_safe('<a href="#">%s</a>' % customer_last_balance), 'order_amount' : RepanierMoney(123.45), 'on_hold_movement' : mark_safe(customer_on_hold_movement), 'payment_needed' : mark_safe(customer_payment_needed), 'delivery_point' : _('delivery point').upper(), 'signature' : mark_safe( '%s<br/>%s<br/>%s' % (signature, sender_function, repanier.apps.REPANIER_SETTINGS_GROUP_NAME)), }) template_order_customer_mail.append(language_code) template_order_customer_mail.append(template.render(context)) template = Template(repanier.apps.REPANIER_SETTINGS_CONFIG.order_producer_mail) context = TemplateContext({ 'name' : _('long_profile_name'), 'long_profile_name': _('long_profile_name'), 'order_empty' : False, 'duplicate' : True, 'permanence_link' : mark_safe('<a href=#">%s</a>' % permanence), 'signature' : mark_safe( '%s<br/>%s<br/>%s' % (signature, sender_function, repanier.apps.REPANIER_SETTINGS_GROUP_NAME)), }) template_order_producer_mail.append(language_code) template_order_producer_mail.append(template.render(context)) board_composition, board_composition_and_description = get_board_composition(permanence.id) template = Template(repanier.apps.REPANIER_SETTINGS_CONFIG.order_staff_mail) context = TemplateContext({ 'permanence_link' : mark_safe('<a href=#">%s</a>' % permanence), 'board_composition' : mark_safe(board_composition), 'board_composition_and_description': mark_safe(board_composition_and_description), 'signature' : mark_safe( '%s<br/>%s<br/>%s' % (signature, sender_function, repanier.apps.REPANIER_SETTINGS_GROUP_NAME)), }) template_order_staff_mail.append(language_code) template_order_staff_mail.append(template.render(context)) translation.activate(cur_language) order_customer_email_will_be_sent, order_customer_email_will_be_sent_to = send_email_to_who( repanier.apps.REPANIER_SETTINGS_SEND_ORDER_MAIL_TO_CUSTOMER ) order_producer_email_will_be_sent, order_producer_email_will_be_sent_to = send_email_to_who( repanier.apps.REPANIER_SETTINGS_SEND_ORDER_MAIL_TO_PRODUCER ) order_board_email_will_be_sent, order_board_email_will_be_sent_to = send_email_to_who( repanier.apps.REPANIER_SETTINGS_SEND_ORDER_MAIL_TO_BOARD, board=True ) form = CloseAndSendOrderForm( initial={ 'template_order_customer_mail': mark_safe("<br/>==============<br/>".join(template_order_customer_mail)), 'template_order_producer_mail': mark_safe("<br/>==============<br/>".join(template_order_producer_mail)), 'template_order_staff_mail' : mark_safe("<br/>==============<br/>".join(template_order_staff_mail)), } ) if repanier.apps.REPANIER_SETTINGS_CUSTOMERS_MUST_CONFIRM_ORDERS or DeliveryBoard.objects.filter( permanence_id=permanence.id, status__gt=PERMANENCE_OPENED ).order_by('?').exists(): # /!\ If one delivery point has been closed, I may not close anymore by producer: producer_invoices = ProducerInvoice.objects.none() else: producer_invoices = ProducerInvoice.objects.filter( Q( permanence=permanence.id, status=PERMANENCE_OPENED, producer__represent_this_buyinggroup=False ) | Q( permanence=permanence.id, status=PERMANENCE_CLOSED, producer__represent_this_buyinggroup=False ) ).order_by("producer") return render( request, 'repanier/confirm_admin_send_order.html', { 'sub_title' : _("Please, confirm the action : send orders"), 'action_checkbox_name' : admin.ACTION_CHECKBOX_NAME, 'action' : 'send_order', 'permanence' : permanence, 'deliveries' : DeliveryBoard.objects.filter( permanence_id=permanence.id, status__in=[PERMANENCE_OPENED, PERMANENCE_CLOSED] ).order_by("id"), 'producer_invoices' : producer_invoices, 'form' : form, 'order_customer_email_will_be_sent' : order_customer_email_will_be_sent, 'order_customer_email_will_be_sent_to': order_customer_email_will_be_sent_to, 'order_producer_email_will_be_sent' : order_producer_email_will_be_sent, 'order_producer_email_will_be_sent_to': order_producer_email_will_be_sent_to, 'order_board_email_will_be_sent' : order_board_email_will_be_sent, 'order_board_email_will_be_sent_to' : order_board_email_will_be_sent_to })
def open_and_send_offer(self, request, queryset): if 'cancel' in request.POST: user_message = _("Action canceled by the user.") user_message_level = messages.INFO self.message_user(request, user_message, user_message_level) return None permanence = queryset.order_by('?').first() if permanence is None or not (PERMANENCE_PLANNED <= permanence.status <= PERMANENCE_WAIT_FOR_OPEN): user_message = _("Action canceled by the system.") user_message_level = messages.ERROR self.message_user(request, user_message, user_message_level) return None pre_open = (permanence.status == PERMANENCE_PLANNED) and Producer.objects.filter( permanence__id=permanence.id, is_active=True, producer_pre_opening=True ).order_by('?').exists() if pre_open: template_offer_mail = [] template_cancel_order_mail = [] cur_language = translation.get_language() for language in settings.PARLER_LANGUAGES[settings.SITE_ID]: language_code = language["code"] translation.activate(language_code) with switch_language(repanier.apps.REPANIER_SETTINGS_CONFIG, language_code): template = Template(repanier.apps.REPANIER_SETTINGS_CONFIG.offer_producer_mail) sender_email, sender_function, signature, cc_email_staff = get_signature(is_reply_to_order_email=True) with switch_language(permanence, language_code): try: offer_description = permanence.offer_description except TranslationDoesNotExist: offer_description = EMPTY_STRING context = TemplateContext({ 'name' : _('long_profile_name'), 'long_profile_name': _('long_profile_name'), 'permanence_link' : mark_safe('<a href="#">%s</a>' % _("offer")), 'offer_description': mark_safe(offer_description), 'offer_link' : mark_safe('<a href="#">%s</a>' % _("offer")), 'signature' : mark_safe( '%s<br/>%s<br/>%s' % (signature, sender_function, repanier.apps.REPANIER_SETTINGS_GROUP_NAME)), }) template_offer_mail.append(language_code) template_offer_mail.append(template.render(context)) translation.activate(cur_language) email_will_be_sent, email_will_be_sent_to = send_email_to_who(True) else: template_offer_mail = [] template_cancel_order_mail = [] cur_language = translation.get_language() for language in settings.PARLER_LANGUAGES[settings.SITE_ID]: language_code = language["code"] translation.activate(language_code) with switch_language(repanier.apps.REPANIER_SETTINGS_CONFIG, language_code): template = Template(repanier.apps.REPANIER_SETTINGS_CONFIG.offer_customer_mail) sender_email, sender_function, signature, cc_email_staff = get_signature(is_reply_to_order_email=True) with switch_language(permanence, language_code): try: offer_description = permanence.offer_description except TranslationDoesNotExist: offer_description = EMPTY_STRING offer_producer = ', '.join([p.short_profile_name for p in permanence.producers.all()]) qs = Product.objects.filter( producer=permanence.producers.first(), is_into_offer=True, order_unit__lt=PRODUCT_ORDER_UNIT_DEPOSIT # Don't display technical products. ).order_by( "translations__long_name" )[:5] offer_detail = '<ul>%s</ul>' % ("".join('<li>%s, %s</li>' % ( p.get_long_name(box_unicode=EMPTY_STRING), p.producer.short_profile_name ) for p in qs ),) context = TemplateContext({ 'offer_description': mark_safe(offer_description), 'offer_detail' : offer_detail, 'offer_producer' : offer_producer, 'permanence_link' : mark_safe('<a href="#">%s</a>' % permanence), 'signature' : mark_safe( '%s<br/>%s<br/>%s' % (signature, sender_function, repanier.apps.REPANIER_SETTINGS_GROUP_NAME)), }) template_offer_mail.append(language_code) template_offer_mail.append(template.render(context)) if repanier.apps.REPANIER_SETTINGS_CUSTOMERS_MUST_CONFIRM_ORDERS: context = TemplateContext({ 'name' : _('long_basket_name'), 'long_basket_name' : _('long_basket_name'), 'basket_name' : _('short_basket_name'), 'short_basket_name': _('short_basket_name'), 'permanence_link' : mark_safe('<a href=#">%s</a>' % permanence), 'signature' : mark_safe( '%s<br/>%s<br/>%s' % (signature, sender_function, repanier.apps.REPANIER_SETTINGS_GROUP_NAME)), }) template_cancel_order_mail.append(language_code) template_cancel_order_mail.append(template.render(context)) translation.activate(cur_language) email_will_be_sent, email_will_be_sent_to = send_email_to_who( repanier.apps.REPANIER_SETTINGS_SEND_OPENING_MAIL_TO_CUSTOMER ) if 'apply' in request.POST: form = OpenAndSendOfferForm(request.POST) if form.is_valid(): user_message, user_message_level = task_order.admin_open_and_send( request, permanence ) self.message_user(request, user_message, user_message_level) return HttpResponseRedirect(request.get_full_path()) else: form = OpenAndSendOfferForm( initial={ 'template_offer_customer_mail': mark_safe("<br/>==============<br/>".join(template_offer_mail)), 'template_cancel_order_customer_mail': mark_safe("<br/>==============<br/>".join(template_cancel_order_mail)), } ) return render( request, 'repanier/confirm_admin_open_and_send_offer.html', { 'sub_title' : _("Please, confirm the action : open and send offers"), 'action_checkbox_name' : admin.ACTION_CHECKBOX_NAME, 'action' : 'open_and_send_offer', 'permanence' : permanence, 'pre_open' : pre_open, 'form' : form, 'email_will_be_sent' : email_will_be_sent, 'email_will_be_sent_to': email_will_be_sent_to })