o
    i:                     @   s  d dl mZ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 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 d	dlmZmZmZmZmZm Z  d dl!m"Z"m#Z# d dl$m%Z% G dd dej&Z'G dd dej&Z(G dd dej&Z)G dd dej*Z+dS )    )viewsetsstatusfilters)action)Response)IsAuthenticatedOrReadOnlyIsAuthenticated)DjangoFilterBackend)Q)method_decorator)
cache_page   )GovernorateCategoryAmenityPlace)calculate_distance)GovernorateSerializerCategorySerializerAmenitySerializerPlaceListSerializerPlaceDetailSerializerPlaceCreateUpdateSerializer)IsPlaceAdminIsPlaceOwner)StandardResultsSetPaginationc                       s@   e Zd ZdZej ZeZ	e
gZeed fddZ  ZS )GovernorateViewSetzGovernorate ViewSet  c                       t  j|g|R i |S Nsuperlistselfrequestargskwargs	__class__ 1/var/www/newdalilibackend/backend/places/views.pyr"         zGovernorateViewSet.list)__name__
__module____qualname____doc__r   objectsallquerysetr   serializer_classr   permission_classesr   r   r"   __classcell__r*   r*   r(   r+   r      s    

r   c                       sD   e Zd ZdZejjddZeZ	e
gZeed fddZ  ZS )CategoryViewSetzCategory ViewSetT	is_activer   c                    r   r   r    r#   r(   r*   r+   r"   (   r,   zCategoryViewSet.list)r-   r.   r/   r0   r   r1   filterr3   r   r4   r   r5   r   r   r"   r6   r*   r*   r(   r+   r7   "   s    
r7   c                   @   s$   e Zd ZdZej ZeZ	e
gZdS )AmenityViewSetzAmenity ViewSetN)r-   r.   r/   r0   r   r1   r2   r3   r   r4   r   r5   r*   r*   r*   r+   r;   -   s
    

r;   c                   @   s,  e Zd ZdZejjddZegZ	e
ZeejejgZg dZg dZddgZdd	 Zd
d Zeddgddd Zeddgdddd Zeddgdddd Zeddgdd+ddZeddgddd,ddZedd gd!dd+d"d#Zedd gd$dd+d%d&Zd'd( Zedddgdd+d)d*ZdS )-PlaceViewSetzPlace ViewSetTr8   )namedescriptionaddress)ratingreviews_count
created_atz-ratingz-reviews_countc                 C   s    | j dkrtS | j dv rtS tS )Nr"   )createupdatepartial_update)r   r   r   r   )r$   r*   r*   r+   get_serializer_class>   s
   

z!PlaceViewSet.get_serializer_classc              	   C   s  t jjdddddd}| jjd}|r|j|d}| jjd}|r-|j|d}| jjd	}|d urB|j| d
kd}| jjd}|d urW|j| d
kd}| jjd}|rtz
|jt	|d}W n	 t
ys   Y nw | jjd}| jjd}| jjd}	|r|r|	rz3t	|}t	|}t	|	}	g }
|D ]}t||	t	|jt	|j}||kr|
|j q|j|
d}W |S  t
tfy   Y |S w |S )NTr8   categorygovernorateowner	amenities)category__slug)governorate__codeis_opentrue)rM   has_booking)rO   
min_rating)rating__gtemax_distancelatlng)id__in)r   r1   r:   select_relatedprefetch_relatedr%   query_paramsgetlowerfloat
ValueErrorr   latitude	longitudeappendid	TypeError)r$   r3   rG   rH   rM   rO   rP   rR   user_latuser_lngfiltered_placesplacedistancer*   r*   r+   get_querysetE   s`   zPlaceViewSet.get_querysetFrY   )detailmethodsc           
   	   C   s   |j d}|j d}t|j dd}|r|s"tdditjdS z
t|}t|}W n ttfy@   tdditjd Y S w |  }g }|D ](}t	||t|j
t|j}||krqt|d	|id
j}	t|d|	d< ||	 qI|jdd d t|S )zGet nearby placesrS   rT   rR   
   errorz#lat and lng parameters are requiredr   zInvalid lat or lng valuesr%   context   distance_kmc                 S   s   | d S )Nrp   r*   )xr*   r*   r+   <lambda>   s    z%PlaceViewSet.nearby.<locals>.<lambda>)key)rX   rY   r[   r   r   HTTP_400_BAD_REQUESTr\   ra   rg   r   r]   r^   r   dataroundr_   sort)
r$   r%   rS   rT   rR   placesnearby_placesre   rf   
place_datar*   r*   r+   nearby   s>   

zPlaceViewSet.nearbyzsearch-suggestions)rh   ri   url_pathc                 C   s  |j dd }t|j dd}|rt|dk rtg S g }tjjd|dj	ddd	
 d
| }|D ]}|d|dd q5tjjd|dj	ddd	
 d
d }|D ]}|d|dd qVtjj|dj	ddd	
 d
d }	|	D ]}
|d|
dd qvt|d
| S )z%Get search suggestions based on queryq limitrj   ro   T)r9   name__icontainsr=   )flatNre   zfa-map-marker-alt)typetexticon)r9   name_ar__icontainsname_ar   rG   zfa-tag)r   rH   zfa-city)rX   rY   stripintlenr   r   r1   r:   values_listdistinctr_   r   r   )r$   r%   queryr   suggestionsrx   
place_name
categoriescat_namegovernoratesgov_namer*   r*   r+   search_suggestions   s^   





zPlaceViewSet.search_suggestionszmy-placec                 C   sN   |j }|jdkst|dstdditjdS |jj}t|d|id}t|j	S )zGet place for place adminplace_adminplace_admin_profilerk   zYou are not a place adminrl   r%   rm   )
userrolehasattrr   r   HTTP_403_FORBIDDENr   re   r   ru   )r$   r%   r   re   
serializerr*   r*   r+   my_place   s   
zPlaceViewSet.my_placepostNc              
   C   s  |   }| |j|stdditjdS d|jvr"tdditjdS ddlm	} ddl
m} z;|jd }d	|j d
|j }|||dd}|jrMt|jng }	|	|j|  |	|_|jdgd td|jdW S  ty }
 ztdt|
itjdW  Y d}
~
S d}
~
ww )zAdd image to place galleryrk   /You do not have permission to manage this placerl   imagezNo image file providedr   )
save_image)settingszplaces/z	/gallery/T)optimizegalleryupdate_fieldszImage added to gallerymessager   N)
get_object_can_manage_placer   r   r   r   FILESrt   common.utilsr   django.confr   r`   r=   r   r"   r_   	MEDIA_URLsave	Exceptionstr)r$   r%   pkre   r   r   
image_file
image_path
saved_pathr   er*   r*   r+   r      s@   



zPlaceViewSet.gallerydeletezgallery/(?P<image_index>[0-9]+)c                 C   s   |   }| |j|stdditjdS z:t|}|jr!t|jng }|dk s-|t	|kr7tdditj
dW S || ||_|jdgd td|jd	W S  ty`   tdditj
d Y S w )
zDelete image from place galleryrk   r   rl   r   zInvalid image indexr   r   zImage removed from galleryr   )r   r   r   r   r   r   r   r   r"   r   rt   popr   r\   )r$   r%   r   image_indexre   r   r*   r*   r+   delete_gallery_image  s6   


z!PlaceViewSet.delete_gallery_imagepatchzgallery/reorderc                    s   |   }| |j|stdditjdS |jdg }t|t	s)tdditj
dS |jr1t	|jng  t|t krDtdditj
dS  fdd|D }||_|jd	gd
 td|jdS )zReorder gallery imagesrk   r   rl   orderzOrder must be a listz*Order length does not match gallery lengthc                    s0   g | ]}d |  krt  k rn n | qS )r   )r   ).0ir   r*   r+   
<listcomp>W  s   0 z0PlaceViewSet.reorder_gallery.<locals>.<listcomp>r   r   zGallery reorderedr   )r   r   r   r   r   r   ru   rY   
isinstancer"   rt   r   r   r   )r$   r%   r   re   	new_orderreordered_galleryr*   r   r+   reorder_gallery<  s2   
zPlaceViewSet.reorder_galleryzworking-hoursc                 C   st   |   }| |j|stdditjdS |jd}t|t	s(tdditj
dS ||_|jdgd td|jdS )	zUpdate place working hoursrk   r   rl   working_hoursz"working_hours must be a dictionaryr   zWorking hours updated)r   r   )r   r   r   r   r   r   ru   rY   r   dictrt   r   r   )r$   r%   r   re   r   r*   r*   r+   update_working_hours`  s$   
z!PlaceViewSet.update_working_hoursc                 C   s2   |j dv rdS |j dkrt|dr|jj|kS dS )zCheck if user can manage place)super_adminadminTr   r   F)r   r   r   re   )r$   r   re   r*   r*   r+   r   {  s
   
zPlaceViewSet._can_manage_placec                 C   s   |   }ddlm} |jdkr.|jj|j|d\}}|r%tdditj	dS tdditj
dS |jd	krG|jj|j|d  tdd
itj
dS dS )z"Add or remove place from favoritesr   )FavoritePOST)r   re   r   zAdded to favoritesrl   zAlready in favoritesDELETEzRemoved from favoritesN)r   notifications.modelsr   methodr1   get_or_creater   r   r   HTTP_201_CREATEDHTTP_200_OKr:   r   )r$   r%   r   re   r   favoritecreatedr*   r*   r+   r     s   


zPlaceViewSet.favoriter   )NN) r-   r.   r/   r0   r   r1   r:   r3   r   r5   r   pagination_classr	   r   SearchFilterOrderingFilterfilter_backendssearch_fieldsordering_fieldsorderingrF   rg   r   r{   r   r   r   r   r   r   r   r   r*   r*   r*   r+   r<   4   s8    <
(
3
)$#r<   N),rest_frameworkr   r   r   rest_framework.decoratorsr   rest_framework.responser   rest_framework.permissionsr   r   django_filters.rest_frameworkr	   django.db.modelsr
   django.utils.decoratorsr   django.views.decorators.cacher   modelsr   r   r   r   utilsr   serializersr   r   r   r   r   r   common.permissionsr   r   common.paginationr   ReadOnlyModelViewSetr   r7   r;   ModelViewSetr<   r*   r*   r*   r+   <module>   s"     