o
    [hza                     @   s  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 d d	lmZ d d
lmZ d dlZd dlZd dlZd dl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$m%Z%m&Z&m'Z'm(Z(m)Z)m*Z*m+Z+m,Z,m-Z-m.Z.m/Z/m0Z0 G dd deZ1G dd deZ2G dd deZ3G dd deZ4G dd deZ5G dd deZ6G dd deZ7G dd deZ8G d d! d!eZ9G d"d# d#eZ:G d$d% d%eZ;G d&d' d'eZ<G d(d) d)eZ=dS )*    )APIView)Responsestatus)swagger_auto_schema)openapi)get_object_or_404)IsAuthenticated)User)Token)MultiPartParserN)BytesIO)urlparse)r
   UserLanguage	UserImageUserInterest	UserBlockUserTransaction)UserInterestSerializerUserLanguageSerializerUserImageSerializerUserSerializerEditUserSerializerUserStatusUpdateSerializerUsergetInterestSerializerUsergetLanguageSerializerUsertypeUpdateSerializerUserImageUpdateSerializerProfileupdateSerializerFemaleVerifySerializerUpdateLanguageSerializer UserDisplayImageUpdateSerializerc                
   @   s`   e Zd Zedejejejejejej	dejej	dddddde
did	d
d ZdS )UserInterestViewzRReplace all user interests with the provided list. Removes any not in the request.type)userinterestr$   
propertiesz*List of interest objects to set for a userr$   itemsdescription   zInterests replaced successfullyoperation_descriptionrequest_body	responsesc           	      C     t |jtstdddtjdS |jstdddtjdS |jd d}|s1tdddtjdS tjj	|d	
  g }g }|jD ]6}|d}|d
}|rQ|sZ||dd qAt|d}| rn|  ||j qA|||jd qAtd||dtjdS )Nerrorz$Expected a list of interest objects.r   messager   Empty list provided.r   r%   "User ID is required in each entry.r%   r&   zUser and interest are required.entryr2   datasuccessr   createderrors)
isinstancer;   listr   r   HTTP_400_BAD_REQUESTgetr   objectsfilterdeleteappendr   is_validsaver?   HTTP_201_CREATED)	selfrequestuser_idr>   r?   r9   r%   r&   
serializer rO   S/var/www/vedio/testing/chatpythonscript.ninositsolution.com/user/views/user_data.pypost   V   



zUserInterestView.postN)__name__
__module____qualname__r   r   Schema
TYPE_ARRAYItemsTYPE_OBJECTTYPE_INTEGERr   rQ   rO   rO   rO   rP   r"      s    r"   c                
   @   sZ   e Zd Zedejejejejejej	dejej	dddddddid	d
d Z
dS )UserLanguageViewzRReplace all user languages with the provided list. Removes any not in the request.r#   )r%   languager'   z*List of language objects to set for a userr)   r,   z Languages replaced successfully.r-   c           	      C   r1   )Nr2   z$Expected a list of language objects.r3   r   r5   r   r%   r6   r7   r\   zUser and language are required.r8   r:   r<   r=   )r@   r;   rA   r   r   rB   rC   r   rD   rE   rF   rG   r   rH   rI   r?   rJ   )	rK   rL   rM   r>   r?   r9   r%   r\   rN   rO   rO   rP   rQ   W   rR   zUserLanguageView.postN)rS   rT   rU   r   r   rV   rW   rX   rY   rZ   rQ   rO   rO   rO   rP   r[   V   s    r[   c                   @   s(   e Zd ZegZegZdd Zdd ZdS )UserImageViewc                 C   s  |j d}|jd}|stddiddS |s tddiddS z	tjj|d}W n tjy;   tdd	id
d Y S w tj	dddddd}g }|D ]}zgt
| }|d t|j\}	}
|	pcd}	|jdd  }dt  d| }|j|d|d|	dd d| }|j|d}t|d}| r|  |d||jd n|d|j|jd W qJ ty } z|d|jt|d  W Y d }~qJd }~ww t|tjdS )!Nimagesr%   r2   z$At least one image file is required.  r   User ID is required.idUser not found.  s3sgp1#https://sgp1.digitaloceanspaces.comNMQAUQUGQAQ4ZE4QNKFN+IbTaeOcuA8Xb9WFclN1vow53a3D6yjyxbwn1Yzvw5ncregion_nameendpoint_urlaws_access_key_idaws_secret_access_keyr   zapplication/octet-stream.zchatapp/user_images/foodieninospublic-read)ACLContentType	ExtraArgs4https://foodieninos.sgp1.cdn.digitaloceanspaces.com/)r%   imager:   r<   )r   	image_urlr;   )r   
image_namer?   )r   rz   r2   )FILESgetlistr;   rC   r   r
   rD   DoesNotExistboto3clientr   readseek	mimetypes
guess_typenamesplitloweruuiduuid4upload_fileobjrb   r   rH   rI   rG   r?   	Exceptionstrr   HTTP_207_MULTI_STATUS)rK   rL   image_filesrM   r%   re   results
image_file
image_copycontent_type_extfilenamery   
image_datarN   erO   rO   rP   rQ      sx   



zUserImageView.postc              
   C   s   z1t t|d}t|j}|jd}tjdddddd}|jd	|d
 |	  t
dddtjdW S  tyR } zt
ddt| dtjdW  Y d}~S d}~ww )z9
        Delete a user image by its primary key.
        pk/re   rf   rg   rh   ri   rj   rq   )BucketKeyr<   zImage deleted successfullyr3   r   r2   zFailed to delete image: N)r   r   r   rx   pathlstripr~   r   delete_objectrF   r   r   HTTP_200_OKr   r   HTTP_500_INTERNAL_SERVER_ERROR)rK   rL   r   	image_obj
parsed_url	image_keyre   r   rO   rO   rP   rF      s8   
zUserImageView.deleteN)	rS   rT   rU   r	   permission_classesr   parser_classesrQ   rF   rO   rO   rO   rP   r]      s
    Jr]   c                   @      e Zd ZegZdd ZdS )UserDetailViewc                 C   sB  |j }z	tjj|d}W n tjy   tdditjd Y S w tjj	|dj
ddd}tjj	|d	j
d
dd}t|t| }tjj	ddj|d}|jdkrW|j	dd}n|jdkrb|j	dd}|jd}|rzdd |dD }	|j	|	d}W n ty   tdditjd Y S w |jd}
|
rzdd |
dD }|j	|d}W n ty   tdditjd Y S w |jd}|jd}|r|j	t|d}|r|j	t|d}| }g }|D ]5}t|j}ttjj	|dddj}ttjj	|dddj}ttjj	|dddj}|||||d qt|tjdS )N)display_namer2   zLogged-in user not found.r   r7   blocked_user_idT)flat)blocked_userrM      )id__in   )genderlanguage_idc                 S   $   g | ]}|   rt|  qS rO   stripisdigitint).0lrO   rO   rP   
<listcomp>     $ z&UserDetailView.get.<locals>.<listcomp>,)language_id__inzInvalid language ID format.	interestsc                 S   r   rO   r   )r   irO   rO   rP   r   %  r   )interests__interest__id__inzInvalid interest ID format.min_agemax_age)age__gte)age__ltemany)r%   r   	languagesr^   )r%   r
   rD   rC   r}   r   r   HTTP_404_NOT_FOUNDr   rE   values_listrA   excluder   query_paramsr   
ValueErrorrB   r   distinctr   r;   r   r   r   r   r   r   rG   r   )rK   rL   logged_in_userr%   blocked_idsblocked_by_others_idsexclude_idsuserslanguage_idslanguage_id_listinterest_idsinterest_id_listr   r   result	user_datainterest_datalanguage_datar   rO   rO   rP   rC     sd   



zUserDetailView.getNrS   rT   rU   r	   r   rC   rO   rO   rO   rP   r         r   c                   @   r   )UpdateUserLanguageViewc                 C   s   |j d}|stdddtjdS z	tjj|d}W n tjy/   tdddtjd Y S w t	||j dd	}|
 rL|  td
d|j dtjdS tdd|jdtjdS )NrM   r2   zuser_id is required.r3   r   ra   rc   Tr;   partialr<   zLanguage updated successfully.r   r4   r;   zInvalid data.r   r4   r?   )r;   rC   r   r   rB   r
   rD   r}   r   r    rH   rI   r   r?   )rK   rL   rM   r%   rN   rO   rO   rP   rQ   H  s:   


zUpdateUserLanguageView.postNrS   rT   rU   r	   r   rQ   rO   rO   rO   rP   r   E  r   r   c                   @   r   )UserDetailByPKViewc                 C   s   z	t jj|d}W n t jy   tdditjd Y S w t|j}t	jj
|d}tjj
|d}tjj
|d}t|ddj|d< t|ddj|d	< t|ddj|d
< td|dtjdS )z
        Retrieve full user details by ID, including interests, languages, and images
        (nested inside the user object).
        r   r4   User not foundr   r7   Tr   r   r   r^   r<   )r   r;   )r
   rD   rC   r}   r   r   r   r   r;   r   rE   r   r   r   r   r   r   )rK   rL   r   r%   r   r   r   r^   rO   rO   rP   rC   d  s*   

zUserDetailByPKView.getNr   rO   rO   rO   rP   r   a  r   r   c                   @   0   e Zd ZegZeedddddddd Zd	S )
UserEditView!User details updated successfullyInvalid data providedr      r_   rd   Edit user details by user ID.r/   r0   r.   c                 C   sR   t t|d}t||jd}| r|  tdditjdS td|j	dtj
dS )zJ
        Edit the details of a specific user by ID (POST method).
        r   r:   r4   r   r   r   r4   r?   )r   r
   r   r;   rH   rI   r   r   r   r?   rB   rK   rL   r   r%   rN   rO   rO   rP   rQ     s   
zUserEditView.postN)rS   rT   rU   r	   r   r   r   rQ   rO   rO   rO   rP   r         	r   c                   @   r   )
ProfileEditViewr   r   r   r   r   r   c                 C   s\  t t|d}|j}|j}t||jdd}| r|jd|}||kr[|dkr?|dkr?t	j
j|d r>tdd	d
tjdS n|dkrQ|dkrQtdddtjdS d|jd< d|jd< | }z%tj
j|d}	|jd}
|
r|
|kr|
|	_|	  tj
j|	d\}}W n tjy   d }Y nw tddt v r|jnd dtjdS td|jdtjdS )Nr   Tr   r   r   r   r7   r<   zGGender change from male to female is not allowed after any transaction.r3   r   r2   z1Gender change from female to male is not allowed.)r?   r4      r   r   admin_status)usernamer   r   token)r4   r   r   r   )r   r
   r   r   r   r;   rH   validated_datarC   r   rD   rE   existsr   r   rB   rI   
DjangoUserr   r   get_or_creater}   localskeyr   r?   )rK   rL   r   custom_userold_display_name
old_genderrN   
new_genderupdated_user	auth_usernew_display_namer   r>   rO   rO   rP   rQ     sV   


zProfileEditView.postN)rS   rT   rU   r	   r   r   r   rQ   rO   rO   rO   rP   r     r   r   c                   @   r   )
UserStatusUpdateAPIViewz1User status and admin status updated successfullyInvalid datar   r   z3Update the status and admin status of a user by ID.r   c                 C   s\   t t|d}t||jdd}| r"|  tdd|jdtjdS tdd	|j	d
tj
dS )Nr   Tr   r<   z-User status/admin_status updated successfullyr   r   r2   z'Invalid status or admin_status providedr   )r   r
   r   r;   rH   rI   r   r   r   r?   rB   r   rO   rO   rP   rQ     s$   
zUserStatusUpdateAPIView.postN)rS   rT   rU   r	   r   r   r   rQ   rO   rO   rO   rP   r     r   r   c                   @   s.   e Zd Zeeddddddddd	 Zd
S )FemaleVerifyAPIViewTr   Users verified successfullyr  )r   r_   z,Bulk update admin_status for multiple users.r   c              	   C   s   t |jdd}| r=|jD ]$}|d }|d }ztjj|d}||_|  W q tj	y2   Y qw t
dddtjd	S t
d
d|jdtjd	S )NT)r;   r   rb   r   ra   r<   r  r3   r   r2   zInvalid inputr   )r   r;   rH   r   r
   rD   rC   r   rI   r}   r   r   r   r?   rB   )rK   rL   rN   itemrM   r   r%   rO   rO   rP   rQ     s2   	
zFemaleVerifyAPIView.postN)rS   rT   rU   r   r   rQ   rO   rO   rO   rP   r     s    r  c                   @   r   )
UserTypeUpdateAPIViewUser type updated successfullyr  r   r   z Update the type of a user by ID.r   c                 C   sZ   t t|d}t||jd}| r!|  tdd|jdtjdS tdd|j	d	tj
dS )
Nr   r:   r<   r  r   r   r2   zInvalid type providedr   )r   r
   r   r;   rH   rI   r   r   r   r?   rB   r   rO   rO   rP   rQ   &  s$   
zUserTypeUpdateAPIView.postN)rS   rT   rU   r	   r   r   r   rQ   rO   rO   rO   rP   r  #  r   r  c                   @   s    e Zd ZegZegZdd ZdS )UserImageUpdateViewc              
   C   s  |j d}|stdditjdS z	tjj|d}W n tjy-   tdditjd Y S w |j	d}|j	d}|sF|sFtdd	id
dS t
jdddddd}i }z_d }d }	|r}dt  d|jdd  }
|j|d|
ddid d|
 }||d< |rdt  d|jdd  }|j|d|ddid d| }	|	|d< |	r|	|d< n|r||d< W n  ty } ztddt| itjdW  Y d }~S d }~ww t||dd}| r|  tdd|j d tjdS t|jtjdS )!Nr%   r2   r`   r   r   rc   default_imageprofile_imagez@At least one image (default_image or profile_image) is required.r_   re   rf   rg   rh   ri   rj   zchatapp/user_default_images/ro   rp   rq   rs   rr   ru   rw   zchatapp/user_profile_images/display_imagezImage upload failed: Tr   r<   z#User image(s) updated successfully.r   )r;   rC   r   r   rB   r
   rD   r}   r   r{   r~   r   r   r   r   r   r   r   r   r   r   rH   rI   r   r?   )rK   rL   rM   r%   default_image_fileprofile_image_filere   update_datadefault_urlprofile_urldefault_filenameprofile_filenamer   rN   rO   rO   rP   rQ   E  sj    
 

(zUserImageUpdateView.postN)rS   rT   rU   r	   r   r   r   rQ   rO   rO   rO   rP   r  A  s    r  c                   @   r   )UpdateDisplayImageViewc                 C   s   |j d}|j d}|stdditjdS |s"tdditjdS z	tjj|d}W n tjy>   tdditjd Y S w t	|d|id	d
}|
 r\|  tdd|j dtjdS t|jtjdS )NrM   r
  r2   r`   r   zDisplay image URL is required.ra   rc   Tr   r<   z#Display image updated successfully.r   )r;   rC   r   r   rB   r
   rD   r}   r   r!   rH   rI   r   r?   )rK   rL   rM   ry   r%   rN   rO   rO   rP   rQ     s,   zUpdateDisplayImageView.postNr   rO   rO   rO   rP   r    r   r  )>rest_framework.viewsr   rest_framework.responser   rest_frameworkr   drf_yasg.utilsr   drf_yasgr   django.shortcutsr   rest_framework.permissionsr	   django.contrib.auth.modelsr
   r   rest_framework.authtoken.modelsr   rest_framework.parsersr   r~   r   r   ior   urllib.parser   user.modelsr   r   r   r   r   user.serializersr   r   r   r   r   r   r   r   r   r   r   r   r    r!   r"   r[   r]   r   r   r   r   r   r   r  r  r  r  rO   rO   rO   rP   <module>   s<     @<=qA!B#D