3

\                 @   s   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 d d	lmZ d d
lmZ eddZG dd dejZG dd dejZdS )    )ValidationError)models)CountSum)reverse)gettext_lazy)pgettext_lazy)get_default_review_status)
validators)AUTH_USER_MODEL)	get_classzcatalogue.reviews.managersProductReviewQuerySetc                   s  e Zd ZdZejdddejdZedd e	dd	D Z
ejed
e
dZejedddejgdZejedZejeddejddZejedddddZejedddZejedddZdH\ZZZeedfeedfeedffZejedee dZ!ej"eddd Z#ej"ed!ddd"Z$ej%dd#Z&e'j( Z)G d$d% d%Z*d&d' Z+d(d) Z,d*d+ Z-d,d- Z.d.d/ Z/ fd0d1Z0 fd2d3Z1e2d4d5 Z3e2d6d7 Z4e2d8d9 Z5e2d:d; Z6e2d<d= Z7e2d>d? Z8e2d@dA Z9e2dBdC Z:dDdE Z;dFdG Z<  Z=S )IAbstractProductReviewzR
    A review of a product

    Reviews can belong to a user or be anonymous.
    zcatalogue.ProductreviewsT)related_namenull	on_deletec             C   s   g | ]}||fqS  r   ).0xr   r   G/var/www/html/oscar2019/oscar/apps/catalogue/reviews/abstract_models.py
<listcomp>   s    z AbstractProductReview.<listcomp>r      Score)choiceszProduct review titleTitle   )verbose_name
max_lengthr
   Body)blankr   r   r   zAnonymous reviewer nameName)r   r    Email)r    URL      zRequires moderationApprovedRejectedStatus)r   defaultzTotal Votes)r)   zDelta Votes)r)   db_index)auto_now_addc               @   s0   e Zd ZdZdZddgZdZedZedZ	d	S )zAbstractProductReview.MetaTr   z-delta_votesidproductuserzProduct reviewzProduct reviewsNr-   r.   )r/   )
__name__
__module____qualname__abstract	app_labelorderingunique_together_r   verbose_name_pluralr   r   r   r   MetaJ   s   r9   c             C   s"   | j j| j j| jd}td|dS )N)product_slug
product_pkpkzcatalogue:reviews-detail)kwargs)r-   slugr,   r   )selfr=   r   r   r   get_absolute_urlR   s    
z&AbstractProductReview.get_absolute_urlc             C   s   | j S )N)title)r?   r   r   r   __str__Z   s    zAbstractProductReview.__str__c             C   s>   | j j | _ | jj | _| j r:| jo*| j r:ttdd S )Nz2Anonymous reviews must include a name and an email)rA   stripbodyr.   nameemailr   r7   )r?   r   r   r   clean]   s
    zAbstractProductReview.cleanc             C   s   | j j|tjd d S )N)r.   delta)votescreateAbstractVoteUP)r?   r.   r   r   r   vote_upd   s    zAbstractProductReview.vote_upc             C   s   | j j|tjd d S )N)r.   rH   )rI   rJ   rK   DOWN)r?   r.   r   r   r   	vote_downg   s    zAbstractProductReview.vote_downc                s   t  j|| | jj  d S )N)supersaver-   update_rating)r?   argsr=   )	__class__r   r   rQ   j   s    zAbstractProductReview.savec                s&   t  j|| | jd k	r"| jj  d S )N)rP   deleter-   rR   )r?   rS   r=   )rT   r   r   rU   n   s    
zAbstractProductReview.deletec             C   s
   | j d kS )N)r.   )r?   r   r   r   is_anonymousu   s    z"AbstractProductReview.is_anonymousc             C   s   | j | jkS )N)statusFOR_MODERATION)r?   r   r   r   pending_moderationy   s    z(AbstractProductReview.pending_moderationc             C   s   | j | jkS )N)rW   APPROVED)r?   r   r   r   is_approved}   s    z!AbstractProductReview.is_approvedc             C   s   | j | jkS )N)rW   REJECTED)r?   r   r   r   is_rejected   s    z!AbstractProductReview.is_rejectedc             C   s
   | j dkS )Nr   )total_votes)r?   r   r   r   	has_votes   s    zAbstractProductReview.has_votesc             C   s   t | j| j d S )zReturns the total up votesr%   )intr^   delta_votes)r?   r   r   r   num_up_votes   s    z"AbstractProductReview.num_up_votesc             C   s   t | j| j d S )zReturns the total down votesr%   )r`   r^   ra   )r?   r   r   r   num_down_votes   s    z$AbstractProductReview.num_down_votesc             C   s*   | j r | j j }|r|S tdS | jS d S )N	anonymous)r.   get_full_namer7   rE   )r?   rE   r   r   r   reviewer_name   s    
z#AbstractProductReview.reviewer_namec             C   s@   | j jtdtdd}|d p"d| _|d p0d| _| j  dS )z.
        Update total and delta votes
        rH   r,   )scorer^   r^   r   rg   N)rI   	aggregater   r   r^   ra   rQ   )r?   resultr   r   r   update_totals   s
    z#AbstractProductReview.update_totalsc             C   s^   |j sdtdfS | jj| |dd}y|j  W n( tk
rX } zdd| fS d}~X nX d	S )
zX
        Test whether the passed user is allowed to vote on this
        review
        FzOnly signed in users can voter$   )reviewr.   rH   z%sNT )Trl   )is_authenticatedr7   rI   model
full_cleanr   )r?   r.   voteer   r   r   can_user_vote   s    z#AbstractProductReview.can_user_vote)r   r$   r%   )>r0   r1   r2   __doc__r   
ForeignKeyCASCADEr-   tuplerangeSCORE_CHOICESSmallIntegerFieldr7   rg   	CharFieldr   r
   non_whitespacerA   	TextFieldrD   r   r.   rE   
EmailFieldrF   URLFieldhomepagerX   rZ   r\   STATUS_CHOICESr	   rW   IntegerFieldr^   ra   DateTimeFielddate_createdr   
as_managerobjectsr9   r@   rB   rG   rM   rO   rQ   rU   propertyrV   rY   r[   r]   r_   rb   rc   rf   rj   rr   __classcell__r   r   )rT   r   r      sf   






r   c                   s   e Zd ZdZejdejddZejedejdZ	d\Z
Ze
edfeed	ffZejed
edZejddZG dd dZdd Zdd Z fddZ  ZS )rK   zx
    Records user ratings as yes/no vote.

    * Only signed-in users can vote.
    * Each user can vote only once.
    zreviews.ProductReviewrI   )r   r   Zreview_votes)r   r   r$   ZUpZDownDelta)r   T)r+   c               @   s.   e Zd ZdZdZdgZd
ZedZedZ	dS )zAbstractVote.MetaTr   z-date_createdr.   rk   ZVoteZVotesNr.   rk   )r   )
r0   r1   r2   r3   r4   r5   r6   r7   r   r8   r   r   r   r   r9      s   r9   c             C   s   d| j | jf S )Nz%s vote for %s)rH   rk   )r?   r   r   r   rB      s    zAbstractVote.__str__c             C   sf   | j j r$| j j| jkr$ttd| jjs8ttd| j jj| jd}t|dkrbttdd S )Nz#You cannot vote on your own reviewsz(Only signed-in users can vote on reviews)r.   r   z"You can only vote once on a review)	rk   rV   r.   r   r7   r,   rI   filterlen)r?   Zprevious_votesr   r   r   rG      s    zAbstractVote.cleanc                s   t  j|| | jj  d S )N)rP   rQ   rk   rj   )r?   rS   r=   )rT   r   r   rQ      s    zAbstractVote.save)r$   r   )r0   r1   r2   rs   r   rt   ru   rk   r   r.   rL   rN   r7   ZVOTE_CHOICESry   rH   r   r   r9   rB   rG   rQ   r   r   r   )rT   r   rK      s$   

rK   N)django.core.exceptionsr   	django.dbr   django.db.modelsr   r   django.urlsr   django.utils.translationr   r7   r   "oscar.apps.catalogue.reviews.utilsr	   
oscar.corer
   oscar.core.compatr   Zoscar.core.loadingr   r   Modelr   rK   r   r   r   r   <module>   s   
 &