3

\w"                 @   s\  d dl 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 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mZ d dlmZmZ d dlm Z  eddZ!eddZ"eddZ#eddZ$edddg\Z%Z&G dd deZ'G dd deZ(G dd deZ)G dd deZ*G d d! d!e eZ+G d"d# d#eZ,dS )$    N)settings)messages)
exceptions)Count)HttpResponseRedirect)HttpResponseget_object_or_404)render_to_string)reverse)gettext_lazy)	ungettext)
CreateView
DeleteViewListView
UpdateViewView)get_classes	get_model)BulkEditMixinofferRangeRangeProductRangeProductFileUpload	catalogueProductzdashboard.ranges.forms	RangeFormRangeProductFormc               @   s   e Zd ZeZdZdZejZ	dS )RangeListViewrangesz dashboard/ranges/range_list.htmlN)
__name__
__module____qualname__r   modelcontext_object_nametemplate_namer   OSCAR_DASHBOARD_ITEMS_PER_PAGEpaginate_by r'   r'   </var/www/html/oscar2019/oscar/apps/dashboard/ranges/views.pyr      s   r   c                   s0   e Zd ZeZdZeZdd Z fddZ	  Z
S )RangeCreateViewz dashboard/ranges/range_form.htmlc             C   sN   d| j jkr tdd| jjidS tdd| ji}tj| j |dd td	S d S )
Nactionzdashboard:range-productspk)kwargsz*dashboard/ranges/messages/range_saved.htmlrangezsafe noicon)
extra_tagszdashboard:range-list)requestPOSTr
   objectidr	   r   success)selfmsgr'   r'   r(   get_success_url'   s    zRangeCreateView.get_success_urlc                s   t  jf |}td|d< |S )NzCreate rangetitle)superget_context_data_)r4   r,   ctx)	__class__r'   r(   r9   2   s    z RangeCreateView.get_context_data)r   r    r!   r   r"   r$   r   
form_classr6   r9   __classcell__r'   r'   )r<   r(   r)   "   s
   r)   c                   s<   e Zd ZeZdZeZ fddZdd Z	 fddZ
  ZS )RangeUpdateViewz dashboard/ranges/range_form.htmlc                s   t  j }|jstjd|S )NzNot allowed)r8   
get_objectis_editabler   PermissionDenied)r4   obj)r<   r'   r(   r@   =   s    

zRangeUpdateView.get_objectc             C   sN   d| j jkr tdd| jjidS tdd| ji}tj| j |dd td	S d S )
Nr*   zdashboard:range-productsr+   )r,   z*dashboard/ranges/messages/range_saved.htmlr-   zsafe noicon)r.   zdashboard:range-list)r/   r0   r
   r1   r2   r	   r   r3   )r4   r5   r'   r'   r(   r6   C   s    zRangeUpdateView.get_success_urlc                s(   t  jf |}| j|d< | jj|d< |S )Nr-   r7   )r8   r9   r1   name)r4   r,   r;   )r<   r'   r(   r9   N   s    
z RangeUpdateView.get_context_data)r   r    r!   r   r"   r$   r   r=   r@   r6   r9   r>   r'   r'   )r<   r(   r?   8   s   r?   c               @   s    e Zd ZeZdZdZdd ZdS )RangeDeleteViewz"dashboard/ranges/range_delete.htmlr-   c             C   s   t j| jtd tdS )NzRange deletedzdashboard:range-list)r   warningr/   r:   r
   )r4   r'   r'   r(   r6   Z   s    zRangeDeleteView.get_success_urlN)r   r    r!   r   r"   r$   r#   r6   r'   r'   r'   r(   rE   U   s   rE   c                   s   e Zd ZeZdZdZdZeZ	e
jZ fddZdd Zd	d
 Z fddZdd Zdd Zdd Zdd Zdd Zdd Z  ZS )RangeProductListViewz(dashboard/ranges/range_product_list.htmlproductsremove_selected_productsadd_productsc                s:   | j  | _|jjdd dkr&| j|S t j|f||S )Nr*   rJ   )get_querysetobject_listr0   getrJ   r8   post)r4   r/   argsr,   )r<   r'   r(   rN   g   s    

zRangeProductListView.postc             C   s$   t | dstt| jd d| _| jS )N_ranger+   )r2   )hasattrr   r   r,   rP   )r4   r'   r'   r(   	get_rangem   s    
zRangeProductListView.get_rangec             C   s   | j  j }|jdS )Nrangeproduct__display_order)rR   all_productsorder_by)r4   rH   r'   r'   r(   rK   r   s    z!RangeProductListView.get_querysetc                s8   t  jf |}| j }||d< d|kr4| j||d< |S )Nr-   form)r8   r9   rR   r=   )r4   r,   r;   r-   )r<   r'   r(   r9   v   s    z%RangeProductListView.get_context_datac             C   sN   | j  }x|D ]}|j| qW t|}tj|tdd||  t| j|S )NzRemoved %d product from rangezRemoved %d products from range)rR   remove_productlenr   r3   r   r   r6   )r4   r/   rH   r-   productnum_productsr'   r'   r(   rI   ~   s    

z-RangeProductListView.remove_selected_productsc             C   sf   | j  }| j||j|j}|j s<| j|| jd}| j|S | j||| | j	||| t
| j|S )N)rV   rL   )rR   r=   r0   FILESis_validr9   rL   render_to_responsehandle_query_productshandle_file_productsr   r6   )r4   r/   r-   rV   r;   r'   r'   r(   rJ      s    

z!RangeProductListView.add_productsc       	      C   s   |j  }|sd S x|D ]}|j| qW t|}tj|tdd||  |j }|rntj|tddj	|  |j
 }|rtj|tddj	|  | j|| d S )Nz%d product added to rangez%d products added to rangezDThe products with SKUs or UPCs matching %s are already in this rangez, z4No product(s) were found with SKU or UPC matching %s)get_productsadd_productrX   r   r3   r   Zget_duplicate_skusrF   r:   joinZget_missing_skus&check_imported_products_sku_duplicates)	r4   r/   r-   rV   rH   rY   rZ   	dupe_skusZmissing_skusr'   r'   r(   r^      s,    

z*RangeProductListView.handle_query_productsc             C   sr   d|j krd S | j||}|j }|j s:tj||j n td||d}tj||dd |j	  | j
|| d S )Nfile_uploadz3dashboard/ranges/messages/range_products_saved.html)r-   uploadzsafe noicon block)r.   )r[   create_upload_objectprocesswas_processing_successfulr   errorerror_messager	   r3   delete_filerc   )r4   r/   r-   rV   rf   rH   r5   r'   r'   r(   r_      s    

z)RangeProductListView.handle_file_productsc             C   sj   |j d }tjjtj|j}t|d"}x|j D ]}|j	| q2W W d Q R X t
jj||j||jd}|S )Nre   zwb+)r-   uploaded_byfilepathsize)r[   ospathrb   r   OSCAR_UPLOAD_ROOTrD   openchunkswriter   objectscreateuserro   )r4   r/   r-   fZdestination_pathdestchunkrf   r'   r'   r(   rg      s    

z)RangeProductListView.create_upload_objectc             C   sT   |j djtddjddjd}|rPdd |D }tj|tddj|  d S )	Nstockrecords__partner_sku)total   )Z	total__gtc             S   s   g | ]}|d  qS )r|   r'   ).0pr'   r'   r(   
<listcomp>   s    zORangeProductListView.check_imported_products_sku_duplicates.<locals>.<listcomp>z+There are more than one product with SKU %sz, )	valuesannotater   filterrU   r   rF   r:   rb   )r4   r/   querysetZdupe_sku_productsrd   r'   r'   r(   rc      s    
z;RangeProductListView.check_imported_products_sku_duplicates)rI   rJ   )r   r    r!   r   r"   r$   r#   actionsr   r=   r   r%   r&   rN   rR   rK   r9   rI   rJ   r^   r_   rg   rc   r>   r'   r'   )r<   r(   rG   _   s    
rG   c               @   s   e Zd Zdd Zdd ZdS )RangeReorderViewc             C   s$   t |jjd}| j| tddS )NrY      )status)dictr0   rM   _save_page_orderr   )r4   r/   r+   orderr'   r'   r(   rN      s    
zRangeReorderView.postc             C   sT   t t| jd d}x<t|D ]0\}}tjj||d}|j|kr||_|j  qW dS )z>
        Save the order of the products within range.
        r+   )r+   )r-   Zproduct__pkN)	r   r   r,   	enumerater   rv   rM   display_ordersave)r4   r   r-   indexitementryr'   r'   r(   r      s    
z!RangeReorderView._save_page_orderN)r   r    r!   rN   r   r'   r'   r'   r(   r      s   r   )-rp   django.confr   django.contribr   django.corer   django.db.modelsr   django.httpr   django.shortcutsr   r   django.template.loaderr	   django.urlsr
   django.utils.translationr   r:   r   Zdjango.views.genericr   r   r   r   r   oscar.core.loadingr   r   oscar.views.genericr   r   r   r   r   r   r   r   r)   r?   rE   rG   r   r'   r'   r'   r(   <module>   s2   




{