ó
ø¢TQc        Q   @  sd  d  Z  d d l m Z d d l 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
 Z d d d d d d d d d d d d d d d d d d d d d d  d! d" d# d$ d% d& d' d( d) d* d+ d, d- d. d/ d0 d1 d2 d3 g) Z d4 d5 d d d d d d d d d d6 d d d d d7 d d8 d d9 d: d d; d d d d d d" d< d  d= d> d? d@ d! dA d# dB dC dD dE dF d$ d% d& d' d( dG d) d* dH d+ dI dJ dK d, d- d. dL dM dN d/ d0 d1 d2 dO dP dQ d3 dR dS dT dU dV dW dX dY dZ d[ gQ Z d\ e f d] „  ƒ  YZ d^ e f d_ „  ƒ  YZ d` e f da „  ƒ  YZ db e f dc „  ƒ  YZ d S(d   u    
Mexican-specific form helpers.
iÿÿÿÿ(   t   unicode_literalsN(   t   ValidationError(   t   Selectt
   RegexField(   t   six(   t   ugettext_lazy(   t   EMPTY_VALUES(   t   STATE_CHOICESud   \d{2}((01|03|05|07|08|10|12)(0[1-9]|[12]\d|3[01])|02(0[1-9]|[12]\d)|(04|06|09|11)(0[1-9]|[12]\d|30))u   BUEIu   BUEYu   CACAu   CACOu   CAGAu   CAGOu   CAKAu   CAKOu   COGEu   COJAu   COJEu   COJIu   COJOu   CULOu   FETOu   GUEYu   JOTOu   KACAu   KACOu   KAGAu   KAGOu   KOGEu   KOJOu   KAKAu   KULOu   MAMEu   MAMOu   MEARu   MEASu   MEONu   MIONu   MOCOu   MULAu   PEDAu   PEDOu   PENEu   PUTAu   PUTOu   QULOu   RATAu   RUINu   BACAu   BAKAu   COGIu   COLAu   FALOu   GETAu   GUEIu   JETAu   KAKOu   KOGIu   KOJAu   KOJEu   KOJIu   KOLAu   LILOu   LOCAu   LOCOu   LOKAu   LOKOu   MIARu   MOKOu   MULOu   NACAu   NACOu   PIPIu   PITOu   POPOu   ROBAu   ROBEu   ROBOu   SENOu   TETAu   VACAu   VAGAu   VAGOu   VAKAu   VUEIu   VUEYu   WUEIu   WUEYt   MXStateSelectc           B  s   e  Z d  Z d d „ Z RS(   uL   
    A Select widget that uses a list of Mexican states as its choices.
    c         C  s    t  t |  ƒ j | d t ƒd  S(   Nt   choices(   t   superR   t   __init__R   (   t   selft   attrs(    (    s<   ../Django//lib/python/django/contrib/localflavor/mx/forms.pyR   7   s    N(   t   __name__t
   __module__t   __doc__t   NoneR   (    (    (    s<   ../Django//lib/python/django/contrib/localflavor/mx/forms.pyR   3   s   t   MXZipCodeFieldc           B  s*   e  Z d  Z i e d ƒ d 6Z d „  Z RS(   u–   
    A form field that accepts a Mexican Zip Code.

    More info about this:
        http://en.wikipedia.org/wiki/List_of_postal_codes_in_Mexico
    u+   Enter a valid zip code in the format XXXXX.u   invalidc         O  s&   d } t  t |  ƒ j | | | Ž d  S(   Nu"   ^(0[1-9]|[1][0-6]|[2-9]\d)(\d{3})$(   R
   R   R   (   R   t   argst   kwargst   zip_code_re(    (    s<   ../Django//lib/python/django/contrib/localflavor/mx/forms.pyR   F   s    (   R   R   R   t   _t   default_error_messagesR   (    (    (    s<   ../Django//lib/python/django/contrib/localflavor/mx/forms.pyR   ;   s   t
   MXRFCFieldc           B  sa   e  Z d  Z i e d ƒ d 6e d ƒ d 6Z d d d „ Z d „  Z d	 „  Z d
 „  Z d „  Z	 RS(   uº  
    A form field that validates a Mexican *Registro Federal de Contribuyentes*
    for either `Persona fÃ­sica` or `Persona moral`.

    The Persona fÃ­sica RFC string is integrated by a juxtaposition of
    characters following the next pattern:

        =====  ======  ===========================================
        Index  Format  Accepted Characters
        =====  ======  ===========================================
        1      X       Any letter
        2      X       Any vowel
        3-4    XX      Any letter
        5-10   YYMMDD  Any valid date
        11-12  XX      Any letter or number between 0 and 9
        13     X       Any digit between 0 and 9 or the letter *A*
        =====  ======  ===========================================

    The Persona moral RFC string is integrated by a juxtaposition of
    characters following the next pattern:

        =====  ======  ============================================
        Index  Format  Accepted Characters
        =====  ======  ============================================
        1-3    XXX     Any letter including *&* and *Ã‘* chars
        4-9    YYMMDD  Any valid date
        10-11  XX      Any letter or number between 0 and 9
        12     X       Any number between 0 and 9 or the letter *A*
        =====  ======  ============================================

    More info about this:
        http://es.wikipedia.org/wiki/Registro_Federal_de_Contribuyentes_(M%C3%A9xico)
    u   Enter a valid RFC.u   invalidu   Invalid checksum for RFC.u   invalid_checksumi	   i   c         O  sE   t  j d t t  j ƒ } t t |  ƒ j | d | d | | | Žd  S(   Nu<   ^([A-Z&Ã‘Ã±]{3}|[A-Z][AEIOU][A-Z]{2})%s([A-Z0-9]{2}[0-9A])?$t
   min_lengtht
   max_length(   t   ret   compilet   DATE_REt
   IGNORECASER
   R   R   (   R   R   R   R   R   t   rfc_re(    (    s<   ../Django//lib/python/django/contrib/localflavor/mx/forms.pyR   r   s    c         C  s¢   t  t |  ƒ j | ƒ } | t k r( d S| j ƒ  } |  j | ƒ ry | d |  j | d  ƒ k sy t |  j d ƒ ‚ qy n  |  j	 | ƒ rž t |  j d ƒ ‚ n  | S(   Nu    iÿÿÿÿu   invalid_checksumu   invalid(
   R
   R   t   cleanR   t   uppert   _has_homoclavet	   _checksumR   R   t   _has_inconvenient_word(   R   t   value(    (    s<   ../Django//lib/python/django/contrib/localflavor/mx/forms.pyR    x   s    c         C  s'   t  j d t t  j ƒ } | j | ƒ S(   uË   
        This check is done due to the existance of RFCs without a *homoclave*
        since the current algorithm to calculate it had not been created for
        the first RFCs ever in Mexico.
        u   ^[A-Z&Ã‘Ã±]{3,4}%s$(   R   R   R   R   t   match(   R   t   rfct   rfc_without_homoclave_re(    (    s<   ../Django//lib/python/django/contrib/localflavor/mx/forms.pyR"   „   s    c           s‘   d ‰  t  | ƒ d k r% d | } n  t ‡  f d †  t t t d ƒ ƒ | ƒ Dƒ ƒ } d | d } | d k rt d S| d k r„ d St j | ƒ S(	   u‹   
        More info about this procedure:
            www.sisi.org.mx/jspsi/documentos/2005/seguimiento/06101/0610100162005_065.doc
        u(   0123456789ABCDEFGHIJKLMN&OPQRSTUVWXYZ-Ã‘i   u   -c         3  s(   |  ] \ } } | ˆ  j  | ƒ Vq d  S(   N(   t   index(   t   .0t   it   c(   t   chars(    s<   ../Django//lib/python/django/contrib/localflavor/mx/forms.pys	   <genexpr>—   s    i   i
   u   Au   0(   t   lent   sumt   zipt   reversedt   rangeR   t	   text_type(   R   R'   t   sum_t   checksum(    (   R-   s<   ../Django//lib/python/django/contrib/localflavor/mx/forms.pyR#   Ž   s    1c         C  s   | d  } | t  k S(   Ni   (   t   RFC_INCONVENIENT_WORDS(   R   R'   t
   first_four(    (    s<   ../Django//lib/python/django/contrib/localflavor/mx/forms.pyR$   ¡   s    
(
   R   R   R   R   R   R   R    R"   R#   R$   (    (    (    s<   ../Django//lib/python/django/contrib/localflavor/mx/forms.pyR   K   s   !		
	t   MXCURPFieldc           B  sX   e  Z d  Z i e d ƒ d 6e d ƒ d 6Z d d d „ Z d „  Z d „  Z d	 „  Z RS(
   uÚ  
    A field that validates a Mexican Clave Ãšnica de Registro de PoblaciÃ³n.

    The CURP is integrated by a juxtaposition of characters following the next
    pattern:

        =====  ======  ===================================================
        Index  Format  Accepted Characters
        =====  ======  ===================================================
        1      X       Any letter
        2      X       Any vowel
        3-4    XX      Any letter
        5-10   YYMMDD  Any valid date
        11     X       Either `H` or `M`, depending on the person's gender
        12-13  XX      Any valid acronym for a state in Mexico
        14-16  XXX     Any consonant
        17     X       Any number between 0 and 9 or any letter
        18     X       Any number between 0 and 9
        =====  ======  ===================================================

    More info about this:
        http://www.condusef.gob.mx/index.php/clave-unica-de-registro-de-poblacion-curp
    u   Enter a valid CURP.u   invalidu   Invalid checksum for CURP.u   invalid_checksumi   c         O  s`   d } d } d t  | | f } t j | t j ƒ } t t |  ƒ j | d | d | | | Žd  S(   Nud   (AS|BC|BS|CC|CL|CM|CS|CH|DF|DG|GT|GR|HG|JC|MC|MN|MS|NT|NL|OC|PL|QT|QR|SP|SL|SR|TC|TS|TL|VZ|YN|ZS|NE)u   [B-DF-HJ-NP-TV-Z]u-   ^[A-Z][AEIOU][A-Z]{2}%s[HM]%s%s{3}[0-9A-Z]\d$R   R   (   R   R   R   R   R
   R8   R   (   R   R   R   R   R   t	   states_ret   consonants_ret   curp_re(    (    s<   ../Django//lib/python/django/contrib/localflavor/mx/forms.pyR   Ã   s    c         C  s   t  t |  ƒ j | ƒ } | t k r( d S| j ƒ  } | d |  j | d  ƒ k rg t |  j d ƒ ‚ n  |  j | ƒ rŒ t |  j d ƒ ‚ n  | S(   Nu    iÿÿÿÿu   invalid_checksumu   invalid(	   R
   R8   R    R   R!   R#   R   R   R$   (   R   R%   (    (    s<   ../Django//lib/python/django/contrib/localflavor/mx/forms.pyR    Ì   s    c           sb   d ‰  t  ‡  f d †  t t t d ƒ ƒ | ƒ Dƒ ƒ } d | d } | d k rU d St j | ƒ S(   Nu%   0123456789ABCDEFGHIJKLMN&OPQRSTUVWXYZc         3  s(   |  ] \ } } | ˆ  j  | ƒ Vq d  S(   N(   R)   (   R*   R+   R,   (   R-   (    s<   ../Django//lib/python/django/contrib/localflavor/mx/forms.pys	   <genexpr>Ú   s    i   i
   u   0(   R/   R0   R1   R2   R   R3   (   R   R%   t   sR5   (    (   R-   s<   ../Django//lib/python/django/contrib/localflavor/mx/forms.pyR#   ×   s    1c         C  s   | d  } | t  k S(   Ni   (   t   CURP_INCONVENIENT_WORDS(   R   t   curpR7   (    (    s<   ../Django//lib/python/django/contrib/localflavor/mx/forms.pyR$   á   s    
(	   R   R   R   R   R   R   R    R#   R$   (    (    (    s<   ../Django//lib/python/django/contrib/localflavor/mx/forms.pyR8   ¦   s   			
(   R   t
   __future__R    R   t   django.formsR   t   django.forms.fieldsR   R   t   django.utilsR   t   django.utils.translationR   R   t   django.core.validatorsR   t'   django.contrib.localflavor.mx.mx_statesR   R   R6   R=   R   R   R   R8   (    (    (    s<   ../Django//lib/python/django/contrib/localflavor/mx/forms.pyt   <module>   s<   				[