
    Di3                        d dl 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mZ d
dl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&  G d dejN                        Z( G d dejR                        Z* G d dejR                        Z+ G d dejX                        Z- G d dejN                        Z. G d dejR                        Z/ G d dejR                        Z0 G d dejR                        Z1y)    )viewsetsstatuspermissions)action)Response)Token)authenticate)User)Q)DjangoFilterBackend)SearchFilterOrderingFilter   )MemberChildAnnouncementEventMeeting)MemberSerializerMemberCreateSerializerMemberUpdateSerializerMemberListSerializerChildSerializerUserLoginSerializerPasswordChangeSerializerAdminPasswordResetSerializerAnnouncementSerializerEventSerializerMeetingSerializerc                       e Zd ZdZd Zd Zy)IsAdminOrOwnerz`
    Custom permission: Admin can access everything, members can only access their own data
    c                 J    |j                   xr |j                   j                  S N)useris_authenticatedselfrequestviews      7/var/www/kalinger_portal/trust-backend/members/views.pyhas_permissionzIsAdminOrOwner.has_permission   s    ||= = ==    c                 b    |j                   j                  ry|j                   |j                   k(  S NT)r$   is_staff)r'   r(   r)   objs       r*   has_object_permissionz$IsAdminOrOwner.has_object_permission   s%    <<  xx7<<''r,   N)__name__
__module____qualname____doc__r+   r1    r,   r*   r!   r!      s    >(r,   r!   c                      e Zd ZdZej
                  j                         ZegZ	e
eegZdgZg dZg dZdgZd Zd Z edd	g
      d        Z edd	g
      d        Z eddg
      dd       Z edd	g
      d        Zy)MemberViewSetz,
    ViewSet for Member CRUD operations
    	is_active)namephonefather_name)r:   
created_at
annual_tax
amount_duer:   c                     | j                   dk(  rt        S | j                   dv rt        S | j                   dk(  rt        S t        S )z-Return appropriate serializer based on actioncreate)updatepartial_updatelist)r   r   r   r   r   r'   s    r*   get_serializer_classz"MemberViewSet.get_serializer_class/   s?    ;;("))[[88))[[F"''r,   c                     | j                   j                  }|j                  rt        j                  j                         S t        j                  j                  |      S )z"Filter queryset based on user roler$   )r(   r$   r/   r   objectsallfilter)r'   r$   s     r*   get_querysetzMemberViewSet.get_queryset9   sE    ||  ==>>%%'' >>((d(33r,   Fgetdetailmethodsc                    	 t         j                  j                  |j                        }t	        |      }t        |j                        S # t         j                  $ r  t        ddit        j                        cY S w xY w)z!Get current user's member profilerH   errorzMember profile not foundr   )
r   rI   rM   r$   r   r   dataDoesNotExistr   HTTP_404_NOT_FOUND)r'   r(   member
serializers       r*   mezMemberViewSet.meC   so    	^^''W\\':F)&1JJOO,,"" 	4500 	s   A	A 0A?>A?c                    |j                   j                  st        ddit        j                        S t
        j                  j                  d      j                         }t
        j                  j                  d      j                         }t
        j                  j                  d      j                         }t        |||d	      S )
z"Get member statistics (Admin only)rR   Admin access requiredrS   Tr9   r   )r?   )amount_due__gt)total_membersmembers_paidmembers_pending)	r$   r/   r   r   HTTP_403_FORBIDDENr   rI   rK   count)r'   r(   r^   
total_paidtotal_pendings        r*   
statisticszMemberViewSet.statisticsP   s     ||$$1200 
 ---=CCE^^**a*8>>@
--Q-?EEG*&,
  	r,   TpostNc                 &   | j                         }t        |j                        }|j                         r7|j	                  |       t        |j                  t        j                        S t        |j                  t        j                        S )zAdd a child to a memberrT   rW   rS   )

get_objectr   rT   is_validsaver   r   HTTP_201_CREATEDerrorsHTTP_400_BAD_REQUEST)r'   r(   pkrW   rX   s        r*   	add_childzMemberViewSet.add_childc   sh     "$',,7
 OO6O*JOOF4K4KLL
))&2M2MNNr,   c                 >   |j                   j                  st        ddit        j                        S ddlm} ddl} |d      }d	|d
<   |j                  |      }|j                  g d       t        j                  j                  d      j                         }|D ]  }dj                  |j                  j                         D cg c]+  }|j                    d|j"                   d|j$                   d- c}      }	|j                  |j&                  |j                   |j(                  |j"                  |j*                  |j,                  |j.                  |j0                  |	|j2                  |j4                  |j6                  |j8                  g        |S c c}w )z$Export members to Excel (Admin only)rR   r[   rS   r   )HttpResponseNztext/csv)content_typez"attachment; filename="members.csv"zContent-Disposition)z	Member IDNamePhoneDOBAddresszFather NamezMother NamezSpouse NameChildrenz
Annual TaxzAmount Paidz
Amount DueStatuschildrenz; z (z, ))r$   r/   r   r   ra   django.httprs   csvwriterwriterowr   rI   prefetch_relatedrJ   joinr{   r:   date_of_birthgender	member_idr;   addressr<   mother_namespouse_namer>   amount_paidr?   payment_status)
r'   r(   rs   r~   responser   membersrW   cchildren_lists
             r*   export_excelzMemberViewSet.export_exceln   sm    ||$$1200 
 	-Z8*N&'H% 
 	 ..11*=AAC 	F II,,.' 66("Q__-Rz;' M OO  V\\$$fnn""F$6$68J8J!!6#5#5v7H7H%% 	 's   	0F
r#   )r2   r3   r4   r5   r   rI   rJ   querysetr!   permission_classesr   r   r   filter_backendsfilterset_fieldssearch_fieldsordering_fieldsorderingrF   rL   r   rY   re   rq   r   r6   r,   r*   r8   r8   #   s     ~~!!#H()*L.IO#}4MHOxH 4 55'*
 +
 55'* +$ 4&*O +O 55'*& +&r,   r8   c                   T    e Zd ZdZej
                  j                         ZeZ	e
gZd Zy)ChildViewSetz+
    ViewSet for Child CRUD operations
    c                 r   | j                   j                  }|j                  rt        j                  j                         S 	 t        j                  j                  |      }t        j                  j                  |      S # t        j                  $ r! t        j                  j                         cY S w xY w)z"Filter children based on user rolerH   ri   )r(   r$   r/   r   rI   rJ   r   rM   rK   rU   none)r'   r$   rW   s      r*   rL   zChildViewSet.get_queryset   s    ||  ====$$&&,+++6}}++6+::&& ,}}))++,s   ?B 1B65B6N)r2   r3   r4   r5   r   rI   rJ   r   r   serializer_classr!   r   rL   r6   r,   r*   r   r      s/     }}  "H&()
,r,   r   c                       e Zd ZdZej
                  gZ eddg      d        Z eddgej                  g      d        Z
 eddgej                  g      d        Z eddgej                  g      d	        Zy
)AuthViewSetz/
    ViewSet for authentication operations
    Frf   rN   c           
         t        |j                        }|j                         r|j                  d   }|j                  d   }t	        ||      }|rt
        j                  j                  |      \  }}	 t        j                  j                  |      }|j                  }	t        |j                  |j                  ||	|j                  |j                  |j                  d      S t        d	d
it$        j&                        S t        |j(                  t$        j*                        S # t        j                   $ r= t        |j                  |j                  ||j                  |j"                  dd      cY S w xY w)zLogin with phone and passwordrh   r;   password)usernamer   rH   )tokenuser_idr;   is_adminr   r:   password_reset_requiredF)r   r   r;   r   r:   r   rR   zInvalid credentialsrS   )r   rT   rk   validated_datar	   r   rI   get_or_creater   rM   r/   r   keyidr:   r   rU   r   r   HTTP_401_UNAUTHORIZEDrn   ro   )
r'   r(   rX   r;   r   r$   r   createdrW   r   s
             r*   loginzAuthViewSet.login   sS    )gll;
 --g6E!00<H  BD!&!<!<$!<!Gw#^^//T/:F#}}H#!&#'77!&$,%+YY &393Q3Q%  (  34!77 
 
))&2M2MNN! ** 	#!&#'77!&$(MM $38%  	s   8A0D+ +AE;:E;)rO   rP   r   c                     	 |j                   j                  j                          t        ddi      S # t        $ r0}t        dt        |      it        j                        cY d}~S d}~ww xY w)zLogout usermessagezSuccessfully logged outrR   rS   N)r$   
auth_tokendeleter   	Exceptionstrr   HTTP_500_INTERNAL_SERVER_ERROR)r'   r(   es      r*   logoutzAuthViewSet.logout   s`    	LL##**,Y(ABCC 	#a&!<< 	s   03 	A,%A'!A,'A,c                 F   t        |j                        }|j                         r|j                  }|j                  d   }|j                  d   }|j                  |      rf|j                  |       |j                          	 t        j                  j                  |      }d|_        |j                          t        ddi      S t        dd	it        j                  
      S t        |j                   t        j                  
      S # t        j                  $ r Y dw xY w)zChange user passwordrh   old_passwordnew_passwordrH   Fr   zPassword changed successfullyrR   zOld password is incorrectrS   )r   rT   rk   r$   r   check_passwordset_passwordrl   r   rI   rM   r   rU   r   r   ro   rn   )r'   r(   rX   r$   r   r   rW   s          r*   change_passwordzAuthViewSet.change_password   s     .7<<@
 <<D%44^DL%44^DL""<0!!,/		#^^//T/:F5:F2KKM  ,K LMM9:!66 
 
))&2M2MNN ** s   7D
 
D D c                    |j                   j                  st        ddit        j                        S t        |j                        }|j                         r|j                  d   }	 t        j                  j                  |      }|j                   }|j                  }|j                  |       |j                          d|_        |j                          t        d|j                    ||j"                  d	      S t        |j(                  t        j*                        S # t        j$                  $ r  t        dd
it        j&                        cY S w xY w)z;Admin only: Reset member password to default (phone number)rR   r[   rS   rh   r   )r   Tz Password reset successfully for )r   temporary_passwordr   zMember not found)r$   r/   r   r   ra   r   rT   rk   r   r   rI   rM   r;   r   rl   r   r:   r   rU   rV   rn   ro   )r'   r(   rX   r   rW   r$   r   s          r*   reset_passwordzAuthViewSet.reset_password  s1    ||$$1200 
 2w||D
 "11+>I++y+9{{  &||!!,/		 26.!A&++O*6!'!   
))&2M2MNN && 01!44 s   *BD% %0EEN)r2   r3   r4   r5   r   AllowAnyr   r   r   IsAuthenticatedr   r   r   r6   r,   r*   r   r      s     &../56(+-O ,-O^ 56(@[@[?\]	 ^	 56(@[@[?\]O ^O< 56(@[@[?\]&O ^&Or,   r   c                       e Zd ZdZd Zy)IsAdminOrReadOnlyz+Admin can do anything, others can only readc                     |j                   t        j                  v ry|j                  xr |j                  j                  S r.   )methodr   SAFE_METHODSr$   r/   r&   s      r*   r+   z IsAdminOrReadOnly.has_permission:  s0    >>[555||5 5 55r,   N)r2   r3   r4   r5   r+   r6   r,   r*   r   r   8  s
    56r,   r   c                   2    e Zd ZeZej                  egZd Z	y)AnnouncementViewSetc                     | j                   j                  j                  rt        j                  j                         S t        j                  j                  d      S NTr\   )r(   r$   r/   r   rI   rJ   rK   rE   s    r*   rL   z AnnouncementViewSet.get_querysetD  sD    <<%%''++--##**T*::r,   N)
r2   r3   r4   r   r   r   r   r   r   rL   r6   r,   r*   r   r   @  s    -%557HI;r,   r   c                   2    e Zd ZeZej                  egZd Z	y)EventViewSetc                     | j                   j                  j                  rt        j                  j                         S t        j                  j                  d      S r   )r(   r$   r/   r   rI   rJ   rK   rE   s    r*   rL   zEventViewSet.get_querysetN  s@    <<%%==$$&&}}##d#33r,   N)
r2   r3   r4   r   r   r   r   r   r   rL   r6   r,   r*   r   r   J  s    &%557HI4r,   r   c                   2    e Zd ZeZej                  egZd Z	y)MeetingViewSetc                     | j                   j                  j                  rt        j                  j                         S t        j                  j                  d      S r   )r(   r$   r/   r   rI   rJ   rK   rE   s    r*   rL   zMeetingViewSet.get_querysetX  s@    <<%%??&&((%%%55r,   N)
r2   r3   r4   r   r   r   r   r   r   rL   r6   r,   r*   r   r   T  s    (%557HI6r,   r   N)2rest_frameworkr   r   r   rest_framework.decoratorsr   rest_framework.responser   rest_framework.authtoken.modelsr   django.contrib.authr	   django.contrib.auth.modelsr
   django.db.modelsr   django_filters.rest_frameworkr   rest_framework.filtersr   r   modelsr   r   r   r   r   serializersr   r   r   r   r   r   r   r   r   r   r   BasePermissionr!   ModelViewSetr8   r   ViewSetr   r   r   r   r   r6   r,   r*   <module>r      s    8 8 , , 1 , +  = ? ? ?   ([// (rH)) rj,8(( ,*HO("" HOV622 6;(// ;48(( 46X** 6r,   