Ñò
¬y<Mc           @   sŽ  d  d k  Z  d  d k Z d  d k Z d  d k l Z d  d k l Z d  d k l	 Z	 l
 Z
 d  d k l Z l Z d  d k l Z d  d k l Z d  d k l Z e i d	 e i ƒ Z e i d
 e i ƒ Z d „  Z d „  Z d „  Z d „  Z d „  Z d „  Z d „  Z e d „ Z  d „  Z! d „  Z" d „  Z# d „  d „ Z$ d „  Z% d „  Z& d „  Z' d „  Z( d „  Z) e d „ Z* d „  Z+ d „  Z, d S(    iÿÿÿÿN(   t   data(   t   pot2po(   t   Storet   PARSED(   t   absolute_real_patht   relative_real_path(   t   factory_classes(   t	   Directory(   t   Languages*   ^[a-z]{2,3}([_-][a-z]{2,3})?(@[a-z0-9]+)?$s4   ^.*?[-_.]([a-z]{2,3}([_-][a-z]{2,3})?(@[a-z0-9]+)?)$c         C   s4   t  i i t  i i | ƒ ƒ \ } } t i |  | ƒ S(   N(   t   ost   patht   splitextt   basenamet   langdatat   languagematch(   t   language_codet   filenamet   namet   ext(    (    s5   /var/www/Pootle/local_apps/pootle_app/project_tree.pyt   language_match_filename'   s    $c         C   s½   t  i i t  i i | ƒ ƒ \ } } | |  j p | i ƒ  |  i ƒ  j o t St i i d | ƒ i	 ƒ  o t
 St i | ƒ } t | ƒ d j o+ | d |  j p | d i ƒ  |  i ƒ  j S(   Nt   code__iexacti   (   R	   R
   R   R   t   lowert   TrueR   t   objectst   filtert   countt   Falset   LANGCODE_POSTFIX_REt   splitt   len(   R   t	   path_nameR   R   t   detect(    (    s5   /var/www/Pootle/local_apps/pootle_app/project_tree.pyt   direct_language_match_filename+   s    $&c         C   sz   t  i i t  i i | ƒ ƒ \ } } | t  i i |  i ƒ  j o5 | t  i i |  i j o t St | ƒ p t Sn t	 S(   sF   test if path_name might point at a template file for given
    project(
   R	   R
   R   R   t   extsept   get_template_filtetypet   localfiletypeR   t   find_lang_postfixR   (   t   projectR   R   R   (    (    s5   /var/www/Pootle/local_apps/pootle_app/project_tree.pyt   match_template_filename6   s    $	c         C   s<   g  } t  i |  ƒ D]! } | i | j o | | q q ~ S(   N(   R	   t   listdirt   code(   t   project_dirt   languaget   _[1]t   lang_dir(    (    s5   /var/www/Pootle/local_apps/pootle_app/project_tree.pyt   get_matching_language_dirsD   s    c         C   s`   | d j o |  S| o* t  i i |  | i ƒ } t  i | ƒ | St d | i |  f ƒ ‚ d  S(   Nt   gnus/   directory not found for language %s, project %s(   R	   R
   t   joinR(   t   mkdirt
   IndexError(   R)   R*   t
   file_stylet	   make_dirst   language_dir(    (    s5   /var/www/Pootle/local_apps/pootle_app/project_tree.pyt   get_non_existant_language_dirH   s    c         C   sQ   t  |  | ƒ } t | ƒ d j o t |  | | | ƒ St i i |  | d ƒ Sd  S(   Ni    (   R-   R   R5   R	   R
   R/   (   R)   R*   R2   R3   t   matching_language_dirs(    (    s5   /var/www/Pootle/local_apps/pootle_app/project_tree.pyt   get_or_make_language_dirS   s    c         C   sG   t  i i |  | i ƒ } t  i i | ƒ p t |  | | | ƒ S| Sd  S(   N(   R	   R
   R/   R(   t   existsR7   (   R)   R*   R2   R3   R4   (    (    s5   /var/www/Pootle/local_apps/pootle_app/project_tree.pyt   get_language_dir[   s    c         C   s)   | d j o | St  | |  | | ƒ Sd S(   s¥   returns the base directory containing po files for the project

    If make_dirs is True, then we will create project and language
    directories as necessary.
    R.   N(   R9   (   R*   R)   R2   R3   (    (    s5   /var/www/Pootle/local_apps/pootle_app/project_tree.pyt   get_translation_project_dirc   s    c         C   s   |  d d j S(   Ni    t   .(    (   R
   (    (    s5   /var/www/Pootle/local_apps/pootle_app/project_tree.pyt   is_hidden_filen   s    c   	      C   sä   g  } g  } xË g  } t  i | ƒ D], } | |  j o t | ƒ o | | q# q# ~ D]€ } t  i i | | ƒ } t  i i | ƒ o. | i | ƒ o | | ƒ o | i | ƒ qV t  i i | ƒ o | i | ƒ qV qV W| | f S(   N(	   R	   R'   R<   R
   R/   t   isfilet   endswitht   appendt   isdir(	   t   ignored_filesR   t   real_dirt   file_filtert   filest   dirsR+   t
   child_patht   full_child_path(    (    s5   /var/www/Pootle/local_apps/pootle_app/project_tree.pyt   split_files_and_dirsq   s    - 0c      
   C   sÞ   g  } t  |  ƒ } t  | ƒ } | | } | | } x | D] } | | i ƒ  q9 Wx# | | D] } | i | | ƒ q\ Wx` | D]X } | | ƒ }	 | i |	 ƒ y |	 i ƒ  Wq~ t j
 o }
 t i d |	 |
 ƒ q~ Xq~ W| S(   Ns   Error while adding %s:
%s(   t   sett   deleteR?   t   savet	   Exceptiont   loggingt   error(   t   fs_itemst   db_itemst   create_db_itemt   itemst   fs_items_sett   db_items_sett   items_to_deletet   items_to_createR   t   itemt   e(    (    s5   /var/www/Pootle/local_apps/pootle_app/project_tree.pyt	   add_items}   s(    

   c         C   s   t  S(    (   R   (   t   _x(    (    s5   /var/www/Pootle/local_apps/pootle_app/project_tree.pyt   <lambda>”   s    c      
      så   t  | | ˆ  | ƒ \ } } t d „  ˆ i i d d ƒ i ƒ  Dƒ ƒ } t d „  ˆ i i ƒ  Dƒ ƒ }	 t | | ‡  ‡ ‡ f d †  ƒ t | |	 ‡ f d †  ƒ }
 x? |
 D]7 } t i i	 ˆ  | i
 ƒ } t ˆ | | | | | ƒ q¦ Wd  S(   Nc         s   s"   x |  ] } | i  | f Vq Wd  S(   N(   R   (   t   .0t   store(    (    s5   /var/www/Pootle/local_apps/pootle_app/project_tree.pys	   <genexpr>–   s   	 t   filet    c         s   s"   x |  ] } | i  | f Vq Wd  S(   N(   R   (   R\   t   dir(    (    s5   /var/www/Pootle/local_apps/pootle_app/project_tree.pys	   <genexpr>—   s   	 c      	      s4   t  d  t t i i ˆ  |  ƒ ƒ d ˆ d |  d ˆ ƒ S(   R^   t   parentR   t   translation_project(   R   R   R	   R
   R/   (   R   (   RB   Rb   t   db_dir(    s5   /var/www/Pootle/local_apps/pootle_app/project_tree.pyR[   ™   s   !c            s   t  d  |  d ˆ  ƒ S(   R   Ra   (   R   (   R   (   Rc   (    s5   /var/www/Pootle/local_apps/pootle_app/project_tree.pyR[   Ÿ   s    (   RH   t   dictt   child_storest   excludet   iteratort
   child_dirsRY   R	   R
   R/   R   t	   add_files(   Rb   RA   R   RB   Rc   RC   RD   RE   t   existing_storest   existing_dirst
   db_subdirst	   db_subdirt	   fs_subdir(    (   RB   Rb   Rc   s5   /var/www/Pootle/local_apps/pootle_app/project_tree.pyRi   ”   s    +		 c         C   s  t  i i t  i i |  ƒ ƒ d } t i | ƒ o | St i | ƒ } | o | i ƒ  d Sx© t i	 i
 d d t ƒD] } | i d | ƒ pp | i d | ƒ p\ | i d | ƒ pH | i ƒ  i d | i ƒ  ƒ p( | i d | ƒ p | i d | ƒ o | Squ Wd S(   s,   finds the language code at end of a filenamei    R(   t   flatt   -t   _R;   N(   R	   R
   R   R   t   LANGCODE_REt   matchR   t   groupsR   R   t   values_listR   R>   R   (   R   R   Rs   R(   (    (    s5   /var/www/Pootle/local_apps/pootle_app/project_tree.pyR$   ¥   s    " <Hc         C   sO  | i  ƒ  d j oå |  i d j oi xÎ t i | i ƒ  ƒ D]K \ } } } x9 | D]1 } | i | d t ƒo t | | ƒ o t SqO Wq9 WqKx¼ t i | i ƒ  ƒ D]N \ } } } x< | D]4 } | i | d t ƒo t	 |  i | ƒ o t Sq¸ Wq¢ WnT y= t i | i ƒ  ƒ i
 ƒ  \ } } } |  i | j o t SWn t j
 o n Xt S(   sT   tests if there are translation files corresponding to given
    language and projectR.   t	   templatest   match_templates(   t   get_treestyleR(   R	   t   walkt   get_real_patht   file_belongs_to_projectR   R&   R   R    t   nextt   StopIteration(   R*   R%   t   dirpatht   dirnamest	   filenamesR   (    (    s5   /var/www/Pootle/local_apps/pootle_app/project_tree.pyt    translation_project_should_exist´   s.        $	c         C   s3   | i  } |  i d j o | d j o d S| Sd S(   sd   file extension used for this project, returns pot if it's a po
    project and language is templatesRv   t   pot   potN(   R#   R(   (   R*   R%   R   (    (    s5   /var/www/Pootle/local_apps/pootle_app/project_tree.pyt   get_extensionÔ   s    	c         C   s:   t  i i |  ƒ } t  i i | ƒ p t  i | ƒ n d  S(   N(   R	   R
   t   dirnameR8   t   makedirs(   t   target_patht
   target_dir(    (    s5   /var/www/Pootle/local_apps/pootle_app/project_tree.pyt   ensure_target_dir_existsÝ   s    c         C   s    y t  |  d ƒ SWn d  SXd  S(   Nt   rb(   t   opent   None(   R‡   (    (    s5   /var/www/Pootle/local_apps/pootle_app/project_tree.pyt   read_original_targetâ   s    c   	      C   só  t  | ƒ | i o | i i } n | } y} t i i d | ƒ } | o5 | i t j  o% | i d | ƒ | i d t	 ƒ d S| i p | o
 | } n | i i } Wn" t i
 j
 o d } d } n Xt i | | d t d t ƒ} | i oW | o, | i d t	 d t	 d t d | d	 t	 ƒ n | i |  i i ƒ | i | ƒ nh | o, | i | d d
 t	 d t d t d t	 ƒn5 |  | _ | i | _ |  i | _ t | _ | i ƒ  | i o | i i ƒ  n | o | i o | i i ƒ  n d S(   sJ   run pot2po to update or initialize file on target_path with template_storet   pootle_pathR]   t   update_translationNt   fuzzymatchingt   classest   update_structuret   conservativet   fuzzyt   allownewstringst   suggestionst   notranslatet   obsoletemissing(   R‰   R^   R]   R   R   t   gett   stateR   t   updateR   t   DoesNotExistRŒ   R   t   convert_storesR   R   t   settargetlanguageR*   R(   t   savefilet	   mergefileRb   R   t	   directoryRa   RK   t   _delete_store_cache(	   Rb   t   template_storet   target_pootle_pathR‡   t   monolingualt   template_fileR]   t   original_filet   output_file(    (    s5   /var/www/Pootle/local_apps/pootle_app/project_tree.pyt   convert_templateè   sB    



,,		

c         C   sa  | i  i d ƒ } |  i i | d <d i | d  ƒ } | i d ƒ p | d } n |  i i t i |  i i	 } y< |  i
 i d | d | ƒ } | i  | i o
 | i i f SWn t i j
 o d } n X| i i i d d ƒ i ƒ  d j p% |  i
 i d | ƒ i d d ƒ i ƒ  } | p} xz |  i i i d d	 ƒ i ƒ  D]V } | i i t i |  i i	 } | i
 i d | ƒ i d d ƒ i ƒ  o t } Pq=q=Wn | o+| i i i d	 j o' t i i | i ƒ d
 }	 |	 d }
 n8 t i i | i ƒ d
 t | i i i ƒ  }
 |
 d  }	 y” |  i
 i d | d |	 d | |	 d | |	 d | |	 d | i ƒ  |	 d | i ƒ  |	 d | i ƒ  g ƒ d
 } | i  | i o
 | i i f SWqÓt i t f j
 o qÓXn d }
 | i o: | i i i t i ƒ } |
 | } | | d <| | d <n, | i i  ƒ  i t i ƒ } | i! | i ƒ d i | ƒ t i i | ƒ f S(   sG   given a template store and a translation_project return target filenamet   /i   iÿÿÿÿt   parent__pootle_patht   name__iexactR^   R_   t   language__codeRv   i    Rp   t   name__inRq   R;   N("   RŽ   R   R*   R(   R/   R>   R	   R!   R%   R#   t   storesR™   R^   R
   R   Rœ   RŒ   Ra   Re   Rf   R   t   translationproject_setRg   R   Rb   R   R   R   R   R   R1   t   sepRz   R?   (   Rb   R]   t   pootle_path_partsRŽ   t   suffixt   target_storet
   use_prefixt   tpt   temp_suffixt   tprefixt   prefixt
   path_partsR   (    (    s5   /var/www/Pootle/local_apps/pootle_app/project_tree.pyt   get_translated_name_gnu  sT    !%' (-
!@!	


c         C   só   t  i i | i ƒ \ } } | i o | i i i t  i ƒ } n, | i i ƒ  i t  i ƒ } | i	 | i ƒ | i
 i d ƒ } |  i i | d <|  i i | d <| d |  i i | d <| d |  i i | d <d i | ƒ t t  i i | ƒ ƒ f S(   NRª   i   R;   iÿÿÿÿ(   R	   R
   R   R   R^   R   R±   Ra   Rz   R?   RŽ   R*   R(   R%   R#   R/   R   (   Rb   R]   R   R   Rº   R²   (    (    s5   /var/www/Pootle/local_apps/pootle_app/project_tree.pyt   get_translated_nameM  s    
(-   R	   RM   t   ret   translate.langR    R   t   translate.convertR   t   pootle_store.modelsR   R   t   pootle_store.utilR   R   t   pootle_store.filetypesR   t   pootle_app.models.directoryR   t   pootle_language.modelsR   t   compilet
   IGNORECASERr   R   R   R    R&   R-   R5   R7   R9   R   R:   R<   RH   RY   Ri   R$   R   R„   R‰   R   R©   R»   R¼   (    (    (    s5   /var/www/Pootle/local_apps/pootle_app/project_tree.pyt   <module>   s>   												 				-	8