3

\-                 @   s  d dl mZmZmZ d dlmZ d dlmZmZ d dl	m
Z
mZ d dlmZ d dlmZ d dlmZ d dlmZ d d	lmZ d d
lmZmZmZmZ d dlmZmZmZ d dlm Z m!Z! d dl"m#Z#m$Z$ d dl%m&Z' d dlm(Z(m)Z) d dl*m+Z+ d dl,m-Z. d dl/m0Z0 d dl1m2Z2m3Z3 d dl4m5Z6 d dl7m8Z8 d dl9m9Z9 d dl:Z:d dl;Z;d dl<m=Z= d dl>m?Z? d dl@mAZA d dlBmCZC d dlDZDd dlEmFZF d dlGmHZH d dlImJZJ d dlKmLZL e3d d!ZMe3d"d#ZNe3d$d%ZOe3d$d&ZPe3d d'ZQe3d d(ZRe3d d)ZSe3d d*ZTe3d d+ZUe3d d,ZVe2d-d.ZWe2d/d0ZXe2d/d1ZYe2d/d2ZZe2d/d3Z[e2d/d4Z\e3d5d6Z]e3d5d7Z^e3d5d8Z_e3d"d9Z`e3d:d;ZaG d<d= d=eZbG d>d? d?eZcG d@dA dAeZdG dBdC dCeZeG dDdE dEeZfG dFdG dGeZgdHdI ZhdJdK ZiG dLdM dMe6Z5G dNdO dOe5ZjG dPdQ dQe5ZkG dRdS dSe5ZlG dTdU dUe5ZmG dVdW dWe5ZnG dXdY dYe5ZoG dZd[ d[e5ZpG d\d] d]e(ZqG d^d_ d_e(Zrdhd`daZsdbdc ZtG ddde dee)ZuG dfdg dge5ZvdS )i    )PdfFileWriterPdfFileReaderPdfFileMerger)render_to_string)ViewTemplateView)FileResponseJsonResponse)transaction)Decimal)InvalidOperation)messages)ObjectDoesNotExist)CountQSumfields)Http404HttpResponseHttpResponseRedirect)get_object_or_404redirect)reversereverse_lazy)gettext_lazy)
DetailView
UpdateView)get_supported_countries)
exceptions)PaymentError)	get_class	get_model)OrderListView)timezone)datetimeN)create_next_order)Subscription)settings)unquote_plus)RanOutOfProductsForm)enqueue)
send_email)MANDRILL_TEMPLATESorderShippingEventpartnerPartnerpaymentTransaction
SourceTypeOrder	OrderNoteShippingAddressLineShippingEventTypePaymentEventTypezorder.processingEventHandlerzdashboard.orders.formsOrderStatsFormOrderSearchFormOrderNoteFormShippingAddressFormOrderStatusForm	catalogueProductClassProductProductAttributeValueStockRecordaddressCountryc                   s(   e Zd ZdZ fddZdd Z  ZS )OutOfCoffeeViewz(subscription/partials/out_of_coffee.htmlc                s    t t| jf |}t |d< |S )Nform)superrG   get_context_datar)   )selfkwargscd)	__class__ 6/var/www/html/oscar2019/apps/dashboard/orders/views.pyrJ   >   s    
z OutOfCoffeeView.get_context_datac             O   s  t | jj}|j r|jd }|jd }t }tjjt	|dt	|dB jtj
tjgdjdddj j }x|D ]}|j|j |j}	t|	jd	d
t|	jdd
 }
}|
 r| rtjj|ddj |_|j  qttjj|dd}x6|j D ]*}|
|jjkr||jjkr||_|j  qW qtW tjjtjdjt	|dt	|dB jdddj j }x |D ]}|j|j x |jj D ]}|j}t|jd	d
t|jdd
 }
}|
 r| rtjj|ddj |_|j |_tjj||j dj |_!|j  nvtjj|d}xf|j D ]Z}|jj|jjkr|jj|jjkr||_tjj||j dj |_!|j |_|j  qW qW q`W xF|D ]>}t"t#dt$d |j%d|j&r|j&nd|j |j dd qW t'j(| jd t)dS d
S )zs
        Validate the form and que the emails
        :param args:
        :param kwargs:
        :return:
        Zout_ofreplacement)product)product__parent)
status__inrR   rS   product__attribute_valuesweightN	packagingT)parentsubscription)status)lines__product)Zlines__product__parentlinesr[   Zlines__stockrecord)rR   price_currency)rX   z?Hope you don't mind! We will be sending you something differentRAN_OUT_OF_COFFEEz-Hook Coffee Roastery <hola@hookcoffee.com.sg> )USERNAMEZ
OLD_COFFEEZ
NEW_COFFEE)subjecttemplateto_email
from_email
merge_varsSuccesszdashboard:order-list)*r)   requestPOSTis_validcleaned_datasetr&   objectsfilterr   ACTIVEPAUSEDprefetch_relateddistinctalladduserrR   getattrattrrB   firstsaverV   rW   r4   r'   ORDER_STATUS_PENDINGr\   	get_titletitlerD   currencystockrecordr*   r+   r,   email
first_namer   successr   )rK   argsrL   rH   rR   rQ   userssubscriptionsrY   Zsubscription_productrV   rW   querychildordersr-   lineprt   rO   rO   rP   postC   sr    






$

zOutOfCoffeeView.post)__name__
__module____qualname__template_namerJ   r   __classcell__rO   rO   )rN   rP   rG   ;   s   rG   c               @   s   e Zd ZdZdd ZdS )LabelPDFViewz!
    Print the product label
    c             O   s>   | j jd}tjj|djddj }x|jj D ]}q2W d S )Norder_id)pkr\   r[   )	rL   getr4   rl   rm   rp   rw   r\   rr   )rK   r   rL   r   r-   itemrO   rO   rP   r      s    zLabelPDFView.getN)r   r   r   __doc__r   rO   rO   rO   rP   r      s   r   c               @   s   e Zd Zdd Zdd ZdS )ProcessShipmentViewc             O   s   t dS )Nzdashbord:order-list)r   )rK   r   rL   rO   rO   rP   r      s    zProcessShipmentView.getc             O   s   | j jjdd}| j jjdd}|s:tj| j d t|S tjdt|}t	|shtj| j d tdS t
dttd	d
|d iddS )NZorder_qrr_   Z
return_urlzPlease enter the order numberz@(.*?)/zOrder ID not foundzdashboard:order-listr   z dashboard:print-shipping-addressnumberr   )rL   )rZ   url)rg   rh   r   r   errorr   refindallr(   lenr	   strr   )rK   rg   r   rL   qrr   matchesrO   rO   rP   r      s    zProcessShipmentView.postN)r   r   r   r   r   rO   rO   rO   rP   r      s   r   c               @   s   e Zd Zdd ZdS )ProcessOrderViewc             O   s   | j jdd }|stdS tt|d}g }d}|j rnx6|jj D ](}x"td|j	D ]}|j
|j  qTW qBW |rtj }	tj||	d tdd}
d	j||
d
< |
j|	j  |
S tj| jd tdS )Nr   zdashboard:order-list)r   zproduct_labels.pdfr   )outputstreamzapplication/pdf)content_typezattachment;filename="{}"zContent-DispositionzThere are no PDFs to print)rL   r   r   r   r4   process_orderr\   rr   rangequantityappendcreate_labelioBytesIOimg2pdfconvertr   formatwritegetvaluer   r   rg   )rK   r   rL   r   r-   imagesfilenamer   r   outputresponserO   rO   rP   r      s&    
zProcessOrderView.getN)r   r   r   r   rO   rO   rO   rP   r      s   r   c               @   s   e Zd ZdZdd ZdS )ShippingAddressViewz0
    Print the shipping address or waybill.
    c          
   O   s   | j jdj }d}tjj|djdj }tj	  |j
 }d|_|j  W d Q R X |rtdd}dj|j|d	< |j| |S tj| jd
 tdS )Nr   zaddress-{}.pdf)r   shipping_addressShippedzapplication/pdf)r   zattachment;filename="{}.pdf"zContent-DispositionzThere is no PDF to print yetzdashboard:order-list)rL   r   stripr4   rl   rm   rp   rw   r
   atomiccreate_shipping_labelrZ   rx   r   r   r   r   r   r   rg   r   )rK   r   rL   r   filename_templater-   Zaddress_pdfr   rO   rO   rP   r      s    


zShippingAddressView.getN)r   r   r   r   r   rO   rO   rO   rP   r      s   r   c               @   s   e Zd Zdd ZdS )ProductLabelViewc             O   s   | j jd}tjj|djdddj }dj|j}g }x6|j	j
 D ](}x"td|jD ]}|j|j  qVW qDW tj }	tj||	d td	d
}
dj||
d< |
j|	j  |
S )Nr   )r   r\   r   r[   zProduct-Labels-Form-{}.pdfr   )r   zapplication/pdf)r   zattachment;filename="{}"zContent-Disposition)rL   r   r4   rl   rm   rp   rw   r   r   r\   rr   r   r   r   r   r   r   r   r   r   r   r   )rK   r   rL   r   r-   r   Zlabel_imagesr   r   mergerr   rO   rO   rP   r      s    

zProductLabelView.getN)r   r   r   r   rO   rO   rO   rP   r      s   r   c             C   sH   t jjdddddjdd}| jr&|S tjj| d}|j|d	j S d
S )z
    Returns a queryset of all orders that a user is allowed to access.
    A staff user may access all orders.
    To allow access to an order for a non-staff user, at least one line's
    partner has to have the user in the partner's list.
    billing_addressbilling_address__countryr   shipping_address__countryrt   r\   status_changes)r   )lines__partner__inN)r4   _default_managerselect_relatedrp   is_staffr0   rm   rq   )rt   querysetpartnersrO   rO   rP   queryset_orders_for_user   s    r   c             C   s0   yt | j|dS  tk
r*   t Y nX d S )N)r   )r   r   r   r   )rt   r   rO   rO   rP   get_order_for_user_or_404  s    r   c                   sX   e Zd Z fddZdd Z fddZ fddZd	d
 Zdd Z fddZ	  Z
S )r"   c                s   t t| j }|jddddS )Nr\   lines__attributesr[    lines__product__attribute_values)rI   r"   get_querysetrp   )rK   qs)rN   rO   rP   r     s    zOrderListView.get_querysetc             C   sl   t j| jjjddj }| jjjdd}tjjdj	t
ddj|dj|djd	d
j }dd |D S )Nshipping_datez%d-%m-%YcountrySGuser_id)
user_count)lines__est_dispatch_date)shipping_address__country__pk   )Zuser_count__gtc             S   s   g | ]}|d  qS )r   rO   ).0r   rO   rO   rP   
<listcomp>%  s    z2OrderListView.todays_repeaters.<locals>.<listcomp>)r$   strptimerg   GETr   dater4   rl   valuesannotater   rm   order_by)rK   r   r   r   rO   rO   rP   todays_repeaters  s    zOrderListView.todays_repeatersc                s   | j   tt| j }tj| jjjddj	 }| jjjdddkrHdnd}|j
dd	d
d}|rn|j|d}n|j|d}|j| jjjdddjtdtddjddjtjtjgdj| j  d}|S )Nr   z%d-%m-%YbacklognoyesTFr\   r   r[   r   )Zlines__est_dispatch_date__lte)r   r   r   )r   r   )
line_countr   r   )r   )rT   )user__pk__in)r   rI   r"   r   r$   r   rg   r   r   r   rp   rm   r   r   r'   ry   ORDER_STATUS_BEING_PROCESSEDexclude)rK   r   r   r   Zsub_qs)rN   rO   rP   sub_queryset'  s"    zOrderListView.sub_querysetc                sP   t t| j|f||}|jjdd dkr2| j S |jjdd dkrL| j S |S )Nprocess_shippingtrueprocess_orders)rI   r"   dispatchr   r   r   r   )rK   rg   r   rL   d)rN   rO   rP   r   >  s    zOrderListView.dispatchc             C   s   g }d}x>| j  j D ].}|j rx |jj D ]}|j|j  q.W qW |rtj }tj	||d t
dd}dj||d< |j|j  |S tj| jd tdS )	z
        Process all the orders from the query set and print the labels.
        Process the payment for orders that are in the pending status.
        :return:
        zproduct_labels.pdf)r   zapplication/pdf)r   zattachment;filename="{}"zContent-DispositionzThere are no PDFs to printzdashboard:order-list)r   rr   r   r\   r   r   r   r   r   r   r   r   r   r   r   r   rg   r   )rK   r   r   r-   r   r   r   rO   rO   rP   r   F  s    
zOrderListView.process_ordersc          
   C   s   t j v t }d}xB| j j D ]2}d|_|j  |j }t|j	d}|j
| q"W tdd}dj||d< |j| |S Q R X dS )	zP
        Print the shipping labels for all the orders.
        :return:
        zshipping_labels.pdfr   r   zapplication/pdf)r   zattachment;filename="{}"zContent-DispositionN)r
   r   r   r   rr   rZ   rx   r   r   getPageaddPager   r   r   )rK   r   r   r-   Zpage_bufferpager   rO   rO   rP   r   ]  s    


zOrderListView.process_shippingc                s   t t| jf |}tj jd}| jjjd|}| jjjdd}||d< ||d< t	 |d< | jjjdd}||d< d	j
||||d
< tj|d< tj|d< tj|d< |S )Nz%d-%m-%Yr   r   r   	countriesr   r   country_selectedz'?shipping_date={}&country={}&backlog={}get_argsZbeing_processedpendingshipped)rI   r"   rJ   r#   	localdatestrftimerg   r   r   r   r   r'   r   ry   ORDER_STATUS_SHIPPED)rK   rL   rM   todayr   r   r   )rN   rO   rP   rJ   p  s    



zOrderListView.get_context_data)r   r   r   r   r   r   r   r   r   rJ   r   rO   rO   )rN   rP   r"     s   
r"   c                   s4   e Zd ZdZ fddZdd Z fddZ  ZS )CoffeeOrderListViewi  c                s:   |j jdd s"tj|d tdS tt| j|f||S )Nr   zPLease select the shipping datezdashboard:order-list)r   r   r   r   r   rI   r   r   )rK   rg   r   rL   )rN   rO   rP   r     s    zCoffeeOrderListView.dispatchc             C   s4   | j  }tjjdd}|jt|dt|dB j S )Nz
coffee-bag)slug)lines__product__product_class)%lines__product__parent__product_class)r   rA   rl   r   rm   r   rq   )rK   r   Zcoffee_bagsrO   rO   rP   r     s    z CoffeeOrderListView.get_querysetc                s   t t| jf |}d|d< |S )Ncoffees
active_tab)rI   r   rJ   )rK   rL   rM   )rN   rO   rP   rJ     s    z$CoffeeOrderListView.get_context_data)r   r   r   paginate_byr   r   rJ   r   rO   rO   )rN   rP   r     s   r   c                   s4   e Zd ZdZ fddZdd Z fddZ  ZS )PodsOrderListViewi  c                s:   |j jdd s"tj|d tdS tt| j|f||S )Nr   zPLease select the shipping datezdashboard:order-list)r   r   r   r   r   rI   r   r   )rK   rg   r   rL   )rN   rO   rP   r     s    zPodsOrderListView.dispatchc             C   s4   t jjdd}| j }|jt|dt|dB j S )Nzcoffee-pods)r   )r   )r   )rA   rl   r   r   rm   r   rq   )rK   Zcoffee_podsr   rO   rO   rP   r     s    zPodsOrderListView.get_querysetc                s   t t| jf |}d|d< |S )Npodsr   )rI   r   rJ   )rK   rL   rM   )rN   rO   rP   rJ     s    z"PodsOrderListView.get_context_data)r   r   r   r   r   r   rJ   r   rO   rO   )rN   rP   r     s   r   c                   s4   e Zd ZdZdd Z fddZ fddZ  ZS )HookBagsOrderListViewi  c             C   s4   t jjdd}| j }|jt|dt|dB j S )Nz	hook-bags)r   )r   )r   )rA   rl   r   r   rm   r   rq   )rK   Z	hook_bagsr   rO   rO   rP   r     s    z"HookBagsOrderListView.get_querysetc                s:   |j jdd s"tj|d tdS tt| j|f||S )Nr   zPLease select the shipping datezdashboard:order-list)r   r   r   r   r   rI   r   r   )rK   rg   r   rL   )rN   rO   rP   r     s    zHookBagsOrderListView.dispatchc                s   t t| jf |}d|d< |S )Nz	hook-bagsr   )rI   r   rJ   )rK   rL   rM   )rN   rO   rP   rJ     s    z&HookBagsOrderListView.get_context_data)r   r   r   r   r   r   rJ   r   rO   rO   )rN   rP   r     s   r   c                   s4   e Zd ZdZ fddZdd Z fddZ  ZS )GearsOrderListViewi  c                s:   |j jdd s"tj|d tdS tt| j|f||S )Nr   zPLease select the shipping datezdashboard:order-list)r   r   r   r   r   rI   r   r   )rK   rg   r   rL   )rN   rO   rP   r     s    zGearsOrderListView.dispatchc             C   sx   t jjdd}t jjdd}t jjdd}| j }|jt|dt|dB t|dB t|dB t|dB t|dB j S )Nzessential-gears)r   zcoffee-machinesz	gift-sets)r   )r   )rA   rl   r   r   rm   r   rq   )rK   Zessential_gearsZcoffee_machinesZ	gift_setsr   rO   rO   rP   r     s    zGearsOrderListView.get_querysetc                s   t t| jf |}d|d< |S )Ngearsr   )rI   r   rJ   )rK   rL   rM   )rN   rO   rP   rJ     s    z#GearsOrderListView.get_context_data)r   r   r   r   r   r   rJ   r   rO   rO   )rN   rP   r     s   r   c                   s8   e Zd ZdZ fddZ fddZ fddZ  ZS )MultipleOrderListViewi  c                s:   |j jdd s"tj|d tdS tt| j|f||S )Nr   zPLease select the shipping datezdashboard:order-list)r   r   r   r   r   rI   r  r   )rK   rg   r   rL   )rN   rO   rP   r     s    zMultipleOrderListView.dispatchc                s   t t| j }tj| jjjddj }|j	t
ddjtddt| j dB j|dj| jjjd	d
djtjtjgdjdj S )Nr   z%d-%m-%Yr\   )r   r   )Zline_count__gt)r   )r   r   r   )r   )rT   r   )rI   r  r   r$   r   rg   r   r   r   r   r   rm   r   r   r'   r   ry   r   rq   )rK   r   r   )rN   rO   rP   r     s    z"MultipleOrderListView.get_querysetc                s   t t| jf |}d|d< |S )Nmultipler   )rI   r  rJ   )rK   rL   rM   )rN   rO   rP   rJ     s    z&MultipleOrderListView.get_context_data)r   r   r   r   r   r   rJ   r   rO   rO   )rN   rP   r    s   r  c                   s,   e Zd ZdZ fddZ fddZ  ZS )DeclinedOrderListViewi  c                s0   t t| j }|j| jjjdddjtjdS )Nr   r   )r   )rZ   )	rI   r  r   rm   rg   r   r   r'   ORDER_STATUS_ERROR)rK   r   )rN   rO   rP   r     s    z"DeclinedOrderListView.get_querysetc                s   t t| jf |}d|d< |S )Ndeclinedr   )rI   r  rJ   )rK   rL   rM   )rN   rO   rP   rJ     s    z&DeclinedOrderListView.get_context_data)r   r   r   r   r   rJ   r   rO   rO   )rN   rP   r    s   r  c                   s4   e Zd ZdZ fddZdd Z fddZ  ZS )WorkshopOrderListViewi  c                s:   |j jdd s"tj|d tdS tt| j|f||S )Nr   zPlease select the shipping datezdashboard:order-list)r   r   r   r   r   rI   r  r   )rK   rg   r   rL   )rN   rO   rP   r     s    zWorkshopOrderListView.dispatchc             C   s4   t jjdd}| j }|jt|dt|dB j S )N	workshops)r   )r   )r   )rA   rl   r   r   rm   r   rq   )rK   r  r   rO   rO   rP   r     s    z"WorkshopOrderListView.get_querysetc                s   t t| jf |}d|d< |S )Nr  r   )rI   r  rJ   )rK   rL   rM   )rN   rO   rP   rJ     s    z&WorkshopOrderListView.get_context_data)r   r   r   r   r   r   rJ   r   rO   rO   )rN   rP   r    s   r  c                   s   e Zd ZdZeZdZdZd0Zd1Z	d2ddZ
dd Zdd Zdd Zdd Zd3ddZ fddZdd Zdd Zdd Zd d! Zd"d# Zd$d% Zd&d' Zd(d) Zd*d+ Zd,d- Zd4d.d/Z  ZS )5OrderDetailViewza
    Dashboard view to display a single order.

    Supports the permission-based dashboard.
    r-   z"dashboard/orders/order_detail.html	save_notedelete_notechange_order_statuscreate_order_payment_eventchange_line_statusescreate_shipping_eventcreate_payment_eventNc             C   s   t | jj| jd S )Nr   )r   rg   rt   rL   )rK   r   rO   rO   rP   
get_object2  s    zOrderDetailView.get_objectc             C   s   | j jj S )N)objectr\   rr   )rK   rO   rO   rP   get_order_lines6  s    zOrderDetailView.get_order_linesc             O   sZ   | j   }| _d|jkr,| j|||jd S d|jkrJ| j|||jd S | jtddS )Norder_actionline_actionzNo valid action submitted)r   )r  r  rh   handle_order_actionhandle_line_actionreload_page_)rK   rg   r   rL   r-   rO   rO   rP   r   9  s    

zOrderDetailView.postc             C   s*   || j kr| jtddS t| |||S )NzInvalid action)r   )order_actionsr  r  ru   )rK   rg   r-   actionrO   rO   rP   r  L  s    
z#OrderDetailView.handle_order_actionc             C   s:  || j kr| jtddS |jjd}t|dkrB| jtddS | j }|j|d}t|t|krv| jtddS g }x|D ]}|jjd|j	 }yt
|}W n tk
r   d }Y nX |d ks|dkrtd	}	| j|	|j	 dS ||jkrtd
}	|j	|jd}
| j|	|
 dS |j| qW t| |||||S )NzInvalid action)r   selected_liner   z$You must select some lines to act on)id__inzInvalid lines requestedzselected_line_qty_%sz.The entered quantity for line #%s is not validzQThe entered quantity for line #%(line_id)s should not be higher than %(quantity)s)line_idr   )line_actionsr  r  rh   getlistr   r  rm   r   idint
ValueErrorr   r   ru   )rK   rg   r-   r  line_idsr\   line_quantitiesr   qty	error_msgrL   rO   rO   rP   r  Q  s8    



z"OrderDetailView.handle_line_actionc             C   s>   t dd| jjid}|r$|d| 7 }|r6tj| j| t|S )Nzdashboard:order-detailr   )rL   #)r   r  r   r   r   rg   r   )rK   fragmentr   r   rO   rO   rP   r  w  s    zOrderDetailView.reload_pagec                sz   t  jf |}|jdd|d< | j |d< | j |d< | j |d< tj |d< tj	j
 |d< tj	j
 |d< | j |d< |S )	Nr   r\   	note_formorder_status_formline_statusesshipping_event_typespayment_event_typespayment_transactions)rI   rJ   r   get_order_note_formget_order_status_formr  r7   all_statusesr8   rl   rr   r9   get_payment_transactions)rK   rL   ctx)rN   rO   rP   rJ     s    z OrderDetailView.get_context_datac             C   s   t jj| jdS )N)source__order)r2   rl   rm   r  )rK   rO   rO   rP   r2    s    z(OrderDetailView.get_payment_transactionsc             C   sf   | j | jjd d}| jjdkr*| jj|d< | jjdd }|r\tt| j |d}|j	 r\||d< t
f |S )N)r-   rt   datarh   r5  note_id)r-   r   instance)r  rg   rt   methodrh   rL   r   r   r5   is_editabler=   )rK   rL   r6  noterO   rO   rP   r/    s    z#OrderDetailView.get_order_note_formc             C   s&   d }| j jdkr| j j}t| j|dS )Nrh   )r-   r5  )rg   r8  rh   r?   r  )rK   r5  rO   rO   rP   r0    s    z%OrderDetailView.get_order_status_formc             C   sN   | j  }|j r6|j  tj| jtd | jddS | j|dd}| j	|S )Nz
Note savednotes)r(  )r)  r   )
r/  ri   rx   r   r   rg   r  r  rJ   render_to_response)rK   rg   r-   rH   r3  rO   rO   rP   r	    s    zOrderDetailView.save_notec             C   sb   y|j j|jjdd d}W n$ tk
r@   tj|td Y nX tj|td |j  | j	 S )Nr6  )r   zNote cannot be deletedzNote deleted)
r;  r   rh   r   r   r   r  infodeleter  )rK   rg   r-   r:  rO   rO   rP   r
    s    zOrderDetailView.delete_notec       	      C   s   | j  }|j s | jtddS |j|jd  }}t|j}td||d }y|j|||d W nh t	k
r } zt
j|td|  W Y d d }~X n@ tjk
r } zt
j|td W Y d d }~X nX t
j|| | j S )	NzInvalid form submission)r   
new_statusz>Order status changed from '%(old_status)s' to '%(new_status)s')
old_statusr?  )note_msgz6Unable to change order status due to payment error: %szFUnable to change order status as the requested new status is not valid)r0  ri   r  r  rZ   rj   r:   rt   handle_order_status_changer   r   r   order_exceptionsInvalidOrderStatusr=  )	rK   rg   r-   rH   r@  r?  handlersuccess_msgerO   rO   rP   r    s*    

z#OrderDetailView.change_order_statusc             C   sR   |j jdd}yt|}W n( tk
rB   tj|td | j S X | j|||S )z<
        Create a payment event for the whole order
        amountNzPlease choose a valid amount)	rh   r   Dr   r   r   r  r  _create_payment_event)rK   rg   r-   
amount_strrH  rO   rO   rP   r    s    
z*OrderDetailView.create_order_payment_eventc             C   s   |j d j }|s.tj|td|  | j S g }x2|D ]*}||j kr8|jtd||jd  q8W |rtj|dj	| | j S g }x8|D ]0}td|j|j
|d }	|j|	 |j| qW dj	|}
tj||
 |jj|j|
tjd | j S )	Nr?  z The new status '%s' is not validz;'%(status)s' is not a valid new status for line %(line_id)d)rZ   r  
zMStatus of line #%(line_id)d changed from '%(old_status)s' to '%(new_status)s')r  r@  r?  )rt   message	note_type)rh   r   r   r   r  r  available_statusesr   r   joinrZ   
set_statusr=  r;  creatert   r5   SYSTEM)rK   rg   r-   r\   
quantitiesr?  errorsr   msgsmsgrM  rO   rO   rP   r    s6    






z$OrderDetailView.change_line_statusesc       	      C   s2  |j d }ytjj|d}W n. tjk
rJ   tj|td|  | j S X |j jdd }yt	 j
|||||d W n tjk
r } ztj|td|  W Y d d }~X n~ tjk
r } ztj|td|  W Y d d }~X nH tk
r } ztj|td|  W Y d d }~X nX tj|td | j S )	Nshipping_event_type)codez The event type '%s' is not valid	reference)rZ  z#Unable to create shipping event: %sz8Unable to create shipping event due to payment error: %szShipping event created)rh   r8   r   r   DoesNotExistr   r   r  r  r:   handle_shipping_eventrC  InvalidShippingEventInvalidStatusr   r   )	rK   rg   r-   r\   rT  rY  
event_typerZ  rG  rO   rO   rP   r    s.    

z%OrderDetailView.create_shipping_eventc             C   sn   |j jdd}|s&tdd |D }n6yt|}W n( tk
rZ   tj|td | j S X | j	|||||S )zD
        Create a payment event for a subset of order lines
        rH  Nc             S   s   g | ]
}|j qS rO   )line_price_incl_tax)r   r   rO   rO   rP   r   .  s    z8OrderDetailView.create_payment_event.<locals>.<listcomp>zPlease choose a valid amount)
rh   r   sumrI  r   r   r   r  r  rJ  )rK   rg   r-   r\   rT  rK  rH  rO   rO   rP   r  &  s    
z$OrderDetailView.create_payment_eventc       	      C   s   |j jd}ytjj|d}W n. tjk
rL   tj|td|  | j S X yt	 j
||||| W nl tk
r } ztj|td|  W Y d d }~X nH tjk
r } ztj|td|  W Y d d }~X nX tj|td | j S )Npayment_event_type)rY  z The event type '%s' is not validz7Unable to create payment event due to payment error: %sz"Unable to create payment event: %szPayment event created)rh   r   r9   r   r[  r   r   r  r  r:   handle_payment_eventr   rC  InvalidPaymentEventr=  )	rK   rg   r-   rH  r\   rT  rY  r_  rG  rO   rO   rP   rJ  9  s$    
"z%OrderDetailView._create_payment_event)r	  r
  r  r  )r  r  r  )N)NN)NN)r   r   r   r   r4   modelcontext_object_namer   r  r  r  r  r   r  r  r  rJ   r2  r/  r0  r	  r
  r  r  r  r  r  rJ  r   rO   rO   )rN   rP   r  !  s6     
&
	

 r  c                   s6   e Zd ZdZeZdZdZd	ddZ fddZ	  Z
S )
LineDetailViewzh
    Dashboard view to show a single line of an order.
    Supports the permission-based dashboard.
    r   z!dashboard/orders/line_detail.htmlNc             C   sL   t | jj| jd }y|jj| jd dS  | jjk
rF   t Y nX d S )Nr   r  )r   )	r   rg   rt   rL   r\   r   re  r[  r   )rK   r   r-   rO   rO   rP   r  Y  s    zLineDetailView.get_objectc                s   t  jf |}| jj|d< |S )Nr-   )rI   rJ   r  r-   )rK   rL   r3  )rN   rO   rP   rJ   a  s    zLineDetailView.get_context_data)N)r   r   r   r   r7   re  rf  r   r  rJ   r   rO   rO   )rN   rP   rg  P  s   
rg  c             C   st   |dkrg }i }x^| j jD ]R}t|tjtjjfs|j|kr>q|j| |j|kr|j| |j|f||j< qW |S )zB
    Return a dict of differences between two model instances
    N)	_metar   
isinstance	AutoFieldrelatedRelatedFieldnamevalue_from_objectverbose_name)model1model2excludeschangesfieldrO   rO   rP   get_changes_between_modelsg  s    
ru  c             C   sT   t | |dg}g }x6|j D ]*\}}|jtd||d |d d  qW dj|S )zF
    Generate a summary of the changes between two address models
    search_textz9%(field)s changed from '%(old_value)s' to '%(new_value)s'r   r   )rt  	old_value	new_valuerL  )ru  itemsr   r  rP  )rp  rq  rs  change_descriptionsrt  deltarO   rO   rP   get_change_summaryz  s    
r|  c                   sN   e Zd ZdZeZdZdZeZ	dddZ
 fddZ fd	d
Zdd Z  ZS )ShippingAddressUpdateViewzl
    Dashboard view to update an order's shipping address.
    Supports the permission-based dashboard.
    rE   z*dashboard/orders/shippingaddress_form.htmlNc             C   s"   t | jj| jd }t| j|dS )Nr   )r-   )r   rg   rt   rL   r   re  )rK   r   r-   rO   rO   rP   r    s    z$ShippingAddressUpdateView.get_objectc                s   t  jf |}| jj|d< |S )Nr-   )rI   rJ   r  r-   )rK   rL   r3  )rN   rO   rP   rJ     s    z*ShippingAddressUpdateView.get_context_datac                sZ   t jj| jjd}t j|}t|| j}|rVtd| }| jj	j
j| jj|tjd |S )N)r   zDelivery address updated:
%s)rt   rM  rN  )r6   rl   r   r  r   rI   
form_validr|  r  r-   r;  rR  rg   rt   r5   rS  )rK   rH   old_addressr   rs  rW  )rN   rO   rP   r~    s    
z$ShippingAddressUpdateView.form_validc             C   s(   t j| jtd tdd| jjjidS )NzDelivery address updatedzdashboard:order-detailr   )rL   )r   r=  rg   r  r   r  r-   r   )rK   rO   rO   rP   get_success_url  s    z)ShippingAddressUpdateView.get_success_url)N)r   r   r   r   r6   re  rf  r   r>   
form_classr  rJ   r~  r  r   rO   rO   )rN   rP   r}    s   

r}  c               @   s   e Zd ZdS )ProcessOrdersListViewN)r   r   r   rO   rO   rO   rP   r    s   r  )N)wPyPDF2r   r   r   django.template.loaderr   Zdjango.views.genericr   r   django.http.responser   r	   	django.dbr
   decimalr   rI  r   django.contribr   django.core.exceptionsr   django.db.modelsr   r   r   r   django.httpr   r   r   django.shortcutsr   r   django.urlsr   r   django.utils.translationr   r  r   r   apps.customer.utilsr   oscar.apps.orderr   rC  oscar.apps.payment.exceptionsr   oscar.core.loadingr    r!   Z!oscar.apps.dashboard.orders.viewsr"   ZBaseOrderListViewdjango.utilsr#   r$   r   r   subscription.utilsr%   Zsubscription.modelsr&   django.confr'   urllib.parser(   r   Zsubscription.formsr)   	django_rqr*   communication.tasksr+   communication.settingsr,   r.   r0   r2   r3   r4   r5   r6   r7   r8   r9   r:   r;   r<   r=   r>   r?   rA   rB   rC   rD   rF   rG   r   r   r   r   r   r   r   r   r   r   r   r  r  r  r  rg  ru  r|  r}  r  rO   rO   rO   rP   <module>   s   




















Zj  1
$