3
^9\                 @   sl  d dl mZmZmZ d dlmZ d dlmZmZm	Z	m
Z
mZmZ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 d dlmZ d dlmZ G dd deZG dd dej 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j 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j Z*d d#l+T d$S )%    )CountSumQ)cached_property)AbstractAttributeOptionAbstractProductAttributeAbstractProductAttributeValueAbstractProductAbstractOptionAbstractCategoryAbstractProductCategoryAbstractProductClass)models)AutoSlugField)gettext_lazy   )get_category_templates)	mark_safe)validate_file_extension)SortableMixin)Userc               @   s   e Zd ZejdddZdS )ProductClassTz2Display individual product page in the front end ?)default	help_textN)__name__
__module____qualname__r   BooleanFieldZfront_end_view r   r   0/var/www/html/oscar2019/apps/catalogue/models.pyr      s   r   c               @   s^   e Zd ZejddZeddZejdddZ	ej
dd	Zej
dd
ZG dd dZdd ZdS )AttributeGroup   )
max_lengthname)populate_fromr   z+Display order in product details and filter)r   r   T)auto_now_add)auto_nowc               @   s   e Zd ZdgZdS )zAttributeGroup.MetaorderN)r   r   r   orderingr   r   r   r   Meta   s   r)   c             C   s   | j S )N)r#   )selfr   r   r   __str__    s    zAttributeGroup.__str__N)r   r   r   r   	CharFieldr#   r   slugIntegerFieldr'   DateTimeFieldcreatedupdatedr)   r+   r   r   r   r   r       s   
r    c               @   s   e Zd ZejddddZdS )AttributeOption
attributesT)	upload_tonullblankN)r   r   r   r   
ImageFieldimager   r   r   r   r2   $   s   r2   c               @   sV   e Zd ZejddZejddZejddZeje	dddej
dZejddddZdS )ProductAttributeF)r   Tr3   )r5   r6   related_name	on_delete)r4   r5   r6   N)r   r   r   r   r   Zuse_for_variationsdisplayZuse_for_filter
ForeignKeyr    SET_NULLgroupr7   r8   r   r   r   r   r9   (   s   
r9   c               @   s,   e Zd ZejdejedddZdd ZdS )ProductAttributeValuezcatalogue.ProductAttribute	Attributeattribute_values)r;   verbose_namer:   c             C   s   dj | jj| j}t|S )Nz{}:{})format	attributer#   Zvalue_as_textr   )r*   sr   r   r   summary5   s    zProductAttributeValue.summaryN)	r   r   r   r   r=   CASCADE_rE   rG   r   r   r   r   r@   1   s   r@   c               @   sD   e Zd Zd\ZZZZedfedfedfedfgZej	eed	d
Z
dS )Optiontextpreset_valuesrange_sliderbooleanTextzPreset ValueszRange SliderBoolean    )choicesr   r"   N)rK   rL   rM   rN   )r   r   r   TEXTZPRESET_VALUESZRANGE_SLIDERBOOLEANZDISPLAY_TYPE_CHOICESr   r,   Zdisplay_typer   r   r   r   rJ   :   s   
rJ   c               @   sN   e Zd ZejddZejddddZeje	dej
dZedd	 Zd
d ZdS )OptionChoice@   )r"   optionsT)r4   r5   r6   rR   )r:   r;   c             C   s:   g }t jj| dj }x|D ]}|j|j|jf qW |S )N)option)rU   objectsfilterallappendr#   )rX   retrR   choicer   r   r   get_choicesJ   s
    
zOptionChoice.get_choicesc             C   s   | j S )N)r#   )r*   r   r   r   r+   R   s    zOptionChoice.__str__N)r   r   r   r   r,   r#   r7   r8   r=   rJ   rH   rX   staticmethodr_   r+   r   r   r   r   rU   E   s
   rU   c               @   s   e Zd ZejdddddZdS )CategoryTz%Any custom template for this categoryrV   )r5   r6   r   r"   N)r   r   r   r   r,   templater   r   r   r   ra   V   s   ra   c               @   s2   e Zd ZejdddZejdejedddZ	dS )	ProductCategoryFzPrimary Category)r   r   zcatalogue.Categoryra   Zproduct_categories)r;   rC   r:   N)
r   r   r   r   r   primaryr=   rH   rI   categoryr   r   r   r   rc   Z   s   rc   c               @   s@  e Zd Zd)\ZZedfedffZejdddZej	ddd	e
gd
Zej	ddd	e
gd
ZejdeedZejdddZejdddZejddddZejddddZejdddZejdddZejdddddZejdddZejddddZejddddddZedd Zd d! Zd"d# Z e!d$d% Z"G d&d' d'e#j$Z$d(S )*ProductleftrightLeftRightFz<Check this if this product/variant is a subscription product)r   r   TZshipping_labels)r5   r6   r4   
validatorsrQ   )r"   rR   r   zFeature on homepagez0Is this product a limited availability product ?z:Date and time from when the product will be available from)r5   r6   r   z1Date and time until when the product is availablezIs this a pre order product ?zDisplay on front end?   zShipping weight in grams)r5   r6   r   r   r   z8Points that the user can earn by purchasing this product)r   editabledb_index      z4The struck off price displayed beside the real price)r5   r6   decimal_places
max_digitsr   c             C   sF   i }t jjdj| dj }x$|D ]}|jj|jd||jj< q"W |S )NrE   )product)r#   value)	r@   rY   prefetch_relatedrZ   r[   rE   r#   rt   code)r*   r]   rB   rt   r   r   r   attribute_dict~   s    
zProduct.attribute_dictc             C   s   | j  | _| j  dS )z*
        Recalculate rating field
        N)calculate_ratingratingsave)r*   r   r   r   update_rating   s    
zProduct.update_ratingc             C   sP   | j j jtdtdd}|d p&d}|d p2d}d}|dkrLt|| }|S )z(
        Calculate rating value
        scoreid)sumcountr~   r   r   N)product_reviewslive	aggregater   r   float)r*   resultZreviews_sumZreviews_country   r   r   r   rx      s    zProduct.calculate_ratingc             C   s   | j j j S )N)r   Zapprovedr   )r*   r   r   r   num_approved_reviews   s    zProduct.num_approved_reviewsc               @   s   e Zd ZdgZdS )zProduct.Meta	the_orderN)r   r   r   r(   r   r   r   r   r)      s   r)   N)rg   rh   )%r   r   r   LEFTRIGHTZLABEL_POSITIONSr   r   subscription	FileFieldr   label
label_dripr,   Zlabel_positionZfeaturedZlimited_availabilityr/   Zavailable_fromZavailable_tillZ	pre_orderr   r.   shipping_weightZloyalty_pointsPositiveIntegerFieldr   DecimalFieldZstrike_pricepropertyrw   r{   rx   r   r   r	   r)   r   r   r   r   rf   `   s<   




rf   c               @   s\   e Zd ZejedejdZejdejdddZ	ej
ddZej ZG dd	 d	Zd
d ZdS )Preferencesuser)r:   r;   zcatalogue.productT)r;   r6   r5   F)r   c               @   s   e Zd ZdZdS )zPreferences.Meta	catalogueN)r   r   r   	app_labelr   r   r   r   r)      s   r)   c             C   s
   d| j  S )Nz%s)
preference)r*   r   r   r   r+      s    zPreferences.__str__N)r   r   r   r   r=   r   rH   r   r>   rs   r   r   ManagerrY   r)   r+   r   r   r   r   r      s   
r   )*N),django.db.modelsr   r   r   django.utils.functionalr   Z$oscar.apps.catalogue.abstract_modelsr   r   r   r	   r
   r   r   r   	django.dbr   oscar.models.fieldsr   django.utils.translationr   rI   helpersr   django.utils.safestringr   r   Zadminsortable.modelsr   django.contrib.auth.modelsr   r   Modelr    r2   r9   r@   rJ   rU   ra   rc   rf   r   Zoscar.apps.catalogue.modelsr   r   r   r   <module>   s,   (		D