3

\                 @   s   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mZ d dlmZ d d	lmZmZ ed
dZed
dZeddZeddZeddZed
dZG dd deZG dd deZG dd deZdS )    )messages)InvalidPage)HttpResponsePermanentRedirect)get_object_or_404redirect)urlquote)gettext_lazy)
DetailViewTemplateView)product_viewed)	get_class	get_model	catalogueproductcategorycustomerProductAlertzcustomer.formsProductAlertFormzcatalogue.search_handlers get_product_search_handler_classProductCategoryc                   sv   e Zd ZdZeZeZdZdZ	dZ
 fddZd fdd		Zd
d Z fddZdd Zdd Zdd Zdd Z  ZS )ProductDetailViewr   r   TFc                sJ   | j   | _}| j|j|}|dk	r(|S t j|f|}| j||| |S )zR
        Ensures that the correct URL is used before rendering a response
        N)
get_objectobjectredirect_if_necessarypathsupergetsend_signal)selfrequestkwargsr   r   response)	__class__ 5/var/www/html/oscar2019/oscar/apps/catalogue/views.pyr   #   s    zProductDetailView.getNc                s    t | dr| jS t j|S d S )Nr   )hasattrr   r   r   )r   queryset)r"   r#   r$   r   1   s    
zProductDetailView.get_objectc             C   s@   | j r|jrt|jj S | jr<|j }|t|kr<t|S d S )N)enforce_parentis_childr   parentget_absolute_urlenforce_pathsr   )r   current_pathr   expected_pathr#   r#   r$   r   8   s    z'ProductDetailView.redirect_if_necessaryc                s   t  jf |}| j |d< | j |d< | jj}|svtjj| jdjddj	 }t
jj|jdj| jjdj d d }||d	< |S )
NZ
alert_formZhas_active_alert)r   T)primary)
categories)pk   recommended_products)r   get_context_dataget_alert_formget_alert_statusr   sorted_recommended_productsr   objectsfilterfirstProductr   excluder0   distinct)r   r    ctxr2   Zprimary_category)r"   r#   r$   r3   B   s    z"ProductDetailView.get_context_datac             C   s4   d}| j jjr0tjj| j| j jtjd}|j }|S )NF)r   userstatus)	r   r>   is_authenticatedr   r7   r8   r   ACTIVEexists)r   Z	has_alertalertsr#   r#   r$   r5   N   s    


z"ProductDetailView.get_alert_statusc             C   s   t | jj| jdS )N)r>   r   )r   r   r>   r   )r   r#   r#   r$   r4   X   s    z ProductDetailView.get_alert_formc             C   s   | j j| ||j||d d S )N)senderr   r>   r   r!   )view_signalsendr>   )r   r   r!   r   r#   r#   r$   r   \   s    
zProductDetailView.send_signalc             C   s>   | j r| j gS d| j| jjf d| j| jj jf d| j gS )a  
        Return a list of possible templates.

        If an overriding class sets a template name, we use that. Otherwise,
        we try 2 options before defaulting to catalogue/detail.html:
            1). detail-for-upc-<upc>.html
            2). detail-for-class-<classname>.html

        This allows alternative templates to be provided for a per-product
        and a per-item-class basis.
        z%s/detail-for-upc-%s.htmlz%s/detail-for-class-%s.htmlz%s/detail.html)template_nametemplate_folderr   upcget_product_classslug)r   r#   r#   r$   get_template_namesa   s    z$ProductDetailView.get_template_names)N)__name__
__module____qualname__context_object_namer:   modelr   rE   rH   r+   r'   r   r   r   r3   r5   r4   r   rL   __classcell__r#   r#   )r"   r$   r      s   

r   c                   s8   e Zd ZdZdZdZ fddZdd Zdd	 Z  Z	S )
CatalogueViewz.
    Browse all products in the catalogue
    productszcatalogue/browse.htmlc                sZ   y| j | jj|j g | _W n( tk
rD   tj|td t	dS X t
 j|f||S )Nz"The given page number was invalid.zcatalogue:index)get_search_handlerr   GETget_full_pathsearch_handlerr   r   error_r   r   r   )r   r   argsr    )r"   r#   r$   r      s    
zCatalogueView.getc             O   s   t  ||S )N)r   )r   r[   r    r#   r#   r$   rU      s    z CatalogueView.get_search_handlerc             K   s,   i }t d|d< | jj| j}|j| |S )NzAll productssummary)rZ   rX   get_search_context_datarP   update)r   r    r=   search_contextr#   r#   r$   r3      s    
zCatalogueView.get_context_data)
rM   rN   rO   __doc__rP   rG   r   rU   r3   rR   r#   r#   )r"   r$   rS   x   s   
rS   c                   sX   e Zd ZdZdZdZdZ fddZdd Zd	d
 Z	dd Z
dd Z fddZ  ZS )ProductCategoryViewz-
    Browse products in a given category
    rT   zcatalogue/category.htmlTc                s   | j  | _| j|j| j}|d k	r&|S y| j|j|j | j | _W n. t	k
rr   t
j|td t| jj S X t j|f||S )Nz"The given page number was invalid.)get_categoryr   r   r   rU   rV   rW   get_categoriesrX   r   r   rY   rZ   r   r*   r   r   )r   r   r[   r    Zpotential_redirect)r"   r#   r$   r      s    
zProductCategoryView.getc             C   s   t t| jd dS )Nr0   )r0   )r   Categoryr    )r   r#   r#   r$   rb      s    z ProductCategoryView.get_categoryc             C   s&   | j r"|j }|t|kr"t|S d S )N)r+   r*   r   r   )r   r,   r   r-   r#   r#   r$   r      s    z)ProductCategoryView.redirect_if_necessaryc             O   s   t  ||S )N)r   )r   r[   r    r#   r#   r$   rU      s    z&ProductCategoryView.get_search_handlerc             C   s
   | j j S )zI
        Return a list of the current category and its ancestors
        )r   get_descendants_and_self)r   r#   r#   r$   rc      s    z"ProductCategoryView.get_categoriesc                s4   t  jf |}| j|d< | jj| j}|j| |S )Nr   )r   r3   r   rX   r]   rP   r^   )r   r    contextr_   )r"   r#   r$   r3      s    

z$ProductCategoryView.get_context_data)rM   rN   rO   r`   rP   rG   r+   r   rb   r   rU   rc   r3   rR   r#   r#   )r"   r$   ra      s   ra   N)django.contribr   django.core.paginatorr   django.httpr   django.shortcutsr   r   django.utils.httpr   django.utils.translationr   rZ   Zdjango.views.genericr	   r
   oscar.apps.catalogue.signalsr   oscar.core.loadingr   r   r:   rd   r   r   r   r   r   rS   ra   r#   r#   r#   r$   <module>   s$   




c