
    S
h                     
   d dl Z d dlZd dlZd dlZd dlZd dl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 d dlmZmZ d d	l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$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/m0Z0m1Z1 d dl2m3Z3m4Z4m5Z5 d dl6m7Z7m8Z8 d dl9m:Z:m;Z;m<Z<m=Z=m>Z>m?Z?m@Z@ d dlAmBZB d dlCmDZD d dlEmFZFmGZGmHZH d dlImJZJ d dlKmLZL d dlMmNZN d dlOmPZQ d dlRmSZS d d lTmUZU d d!lVmWZWmXZXmYZY d d"lZm[Z[ d d#l\m]Z] d d$l^m_Z_m`Z`maZambZb d d%lcmdZd d&d'lemfZf d&d(lgmhZhmiZimjZjmkZkmlZlmmZmmnZnmoZompZpmqZqmrZrmsZsmtZt d&d)lumvZvmwZwmxZxmyZymzZzm{Z{m|Z| d&d*l}m~Z~mZmZmZmZmZ  e            Z ej        d+          Zd,Z G d- d.          Z G d/ d0e          Z G d1 d2eeXe          Ze                                Z G d3 d4e          Ze                                Z G d5 d6e_          Z G d7 d8eb          Z G d9 d:e`          Z G d; d<eW          Z G d= d>eb          Ze                                Z G d? d@eeW          Ze                                Z G dA dBe          Ze                                Z G dC dDeeW          Z G dE dF          Z G dG dHeeXee          Ze                                Z G dI dJeeWe          Ze                                Z G dK dLeWe          Ze                                Z G dM dNeY          Ze                                ZdO Z G dP dQeY          Ze                                ZdR Z G dS dT          Z G dU dV          Z G dW dXe          Z G dY dZ          Z G d[ d\eeeW          Z G d] d^eW          Z G d_ d`eY          Z G da dbe          Z G dc ddeeX          Z G de dfeeX          Z G dg dheeee_          Zdi Z G dj dkeeeeb          Z G dl dmeeb          Z G dn doeY          Z G dp dqeea          Z G dr dse`          Z G dt dueeY          Z G dv dweY          Z G dx dye[          Z G dz d{e[          Z G d| d}e]          Z G d~ de          Z G d dee_          Z G d deeb          Z G d de`          Z G d de]          Z G d deeb          Z G d ded          Zd Z G d deX          ZeƠ                                ZeU eSddd          d                         Zd Z G d deX          ZdS )    N)datetime	timedelta)
InvalidURL)BytesIO)Path)SMTPException)	HTTPErrorURLError)
quote_plusurlparse)Requestbuild_opener)settings)messages)BACKEND_SESSION_KEYget_user_model)logout)D)SearchQuerySearchVector)Session)staticfiles_storage)PermissionDenied)	send_mail)	EmptyPagePageNotAnInteger	Paginator)BadSignatureSignerTimestampSigner)URLValidatorValidationError)Http404HttpResponseHttpResponseBadRequestHttpResponseForbiddenHttpResponsePermanentRedirectHttpResponseRedirectHttpResponseServerError)re_accepts_gzip)get_object_or_404)resolvereversereverse_lazy)translation)smart_bytes)
make_aware)gettext)cache_control)require_GET)
DetailViewTemplateViewView)RedirectView)BaseDetailView)
CreateView
DeleteViewFormView
UpdateView)ListView   )VERSION)DEFAULT_CENTERDEFAULT_LATITUDEDEFAULT_LONGITUDE!AnonymousDataLayerPermissionsFormAnonymousMapPermissionsFormDataLayerFormDataLayerPermissionsFormFlatErrorListMapSettingsFormSendLinkFormTeamFormUpdateMapPermissionsFormUserProfileForm)	DataLayerLicenceMap	PictogramStarTeam	TileLayer)ConflictError_urls_for_js	gzip_fileis_ajax
json_dumpsmerge_featureszS((^127\.)|(^10\.)|(^172\.1[6-9]\.)|(^172\.2[0-9]\.)|(^172\.3[0-1]\.)|(^192\.168\.))i ' c                   >     e Zd ZdZddZ fdZ fdZ fdZ xZS )PaginatorMixin   Nc                 4   t          ||p| j                  }| j        j                            d          }	 |                    |          }nJ# t          $ r |                    d          }Y n)t          $ r |                    |j                  }Y nw xY w|S )Npr?   )	r   per_pagerequestGETgetpager   r   	num_pages)selfqsr`   	paginatorrd   s        U/var/www/html/01_SiteInternet/03_Maps/venv/lib/python3.11/site-packages/umap/views.pypaginatezPaginatorMixin.paginate_   s    b(";dm<<	|##C((	5%%BB 	# 	# 	#""BBB 	5 	5 	5 	 344BBB	5 	s   A B/#BBc                     |                     dt          | j                  i            t                      j        di |S )NrX    )updaterX   ra   superget_context_datarf   kwargs	__class__s     ri   ro   zPaginatorMixin.get_context_datam   sA    y'$,"7"78999'uww'11&111    c                 |    t          | j                  r| j        gS t                                                      S )zU
        Dispatch template according to the kind of request: ajax or normal.
        )rX   ra   list_template_namern   get_template_names)rf   rr   s    ri   rv   z!PaginatorMixin.get_template_namesq   s9     4<   	-+,,ww))+++rs   c                      t                      j        |i |}t          | j                  rt	          |j                  S |S )N)html)rn   rc   rX   ra   simple_json_responserendered_content)rf   argsrq   responserr   s       ri   rc   zPaginatorMixin.gety   sI    577;///4<   	H'X-FGGGGrs   N)	__name__
__module____qualname__r`   rj   ro   rv   rc   __classcell__rr   s   @ri   r\   r\   \   s        H   2 2 2 2 2, , , , ,        rs   r\   c                       e Zd Zd Zd ZdS )PublicMapsMixinc                     t           j        }t          j        rEdt          j        d         d         vr+|                    t          t          d          f          }|                    d          }|S )N
spatialitedefaultENGINEr?   kmcenter__distance_gt-modified_at)	rP   publicr   UMAP_EXCLUDE_DEFAULT_MAPS	DATABASESfilterrA   r   order_by)rf   rg   mapss      ri   get_public_mapszPublicMapsMixin.get_public_maps   se    Z.	JH$6y$A($KKK Q/HIIB{{>**rs   c                    t           j                            d          }t          j                            |                              d          }t
          j                            |          }|                    d          }|S )NT)is_staff)by__inmappk__inr   )Userobjectsr   rR   valuesrP   r   r   )rf   staffstarsrg   r   s        ri   get_highlighted_mapsz$PublicMapsMixin.get_highlighted_maps   sn    ##T#22##5#1188??Ze,,{{>**rs   N)r~   r   r   r   r   rl   rs   ri   r   r      s2        	 	 	    rs   r   c                       e Zd ZdZdZd ZdS )Homezumap/home.htmlumap/map_list.htmlc                 >   t           j        g }n9t           j        dk    r|                                 }n|                                 }|                     |t           j                  }d }t          t           d          rA	 t          j        	                    t           j
                  }n# t          j        $ r Y nw xY wd }t          t           d          rA	 t          j        	                    t           j                  }n# t          j        $ r Y nw xY w|||dS )NhighlightedUMAP_DEMO_PKpkUMAP_SHOWCASE_PK)r   demo_mapshowcase_map)r   UMAP_HOME_FEEDr   r   rj   UMAP_MAPS_PER_PAGEhasattrrP   r   rc   r   DoesNotExistr   )rf   rq   r   r   r   s        ri   ro   zHome.get_context_data   s)   "*DD$55,,..DD''))D}}T8#>??8^,, 	:>>X-B>CC#    8/00 	"z~~1J~KK#     (
 
 	
s$   *B, ,B>=B>*D DDN)r~   r   r   template_nameru   ro   rl   rs   ri   r   r      s.        $M-
 
 
 
 
rs   r   c                       e Zd ZdZdS )Aboutzumap/about.htmlNr~   r   r   r   rl   rs   ri   r   r      s        %MMMrs   r   c                   @     e Zd ZeZddgZ ed          Z fdZ xZ	S )TeamNewnamedescription
user_teamsc                     t                                          |          }| j        j        j                            | j                   | j        j                                         |S r}   )rn   
form_validra   userteamsaddobjectsave)rf   formr|   rr   s      ri   r   zTeamNew.form_valid   sT    77%%d++##DK000   rs   )
r~   r   r   rS   modelfieldsr.   success_urlr   r   r   s   @ri   r   r      sV        Em$F,|,,K        rs   r   c                   F     e Zd ZeZeZ ed          Z fdZ	 fdZ
 xZS )
TeamUpdater   c                     t                                                      }| j        j                                        |d<   |S Nmembers)rn   get_initialr   usersall)rf   initialrr   s     ri   r   zTeamUpdate.get_initial   s8    ''%%''![.2244	rs   c                    | j         j                                        }|j        d         }|D ]9}||vr3|j                            | j                    |                                 :|D ]9}||vr3|j                            | j                    |                                 :t                      	                    |          S r   )
r   r   r   cleaned_datar   r   r   removern   r   )rf   r   actualwantedr   rr   s        ri   r   zTeamUpdate.form_valid   s    "&&(("9- 	 	D6!!
t{+++		 	 	D6!!
!!$+...		ww!!$'''rs   )r~   r   r   rS   r   rK   
form_classr.   r   r   r   r   r   s   @ri   r   r      sj        EJ,|,,K    
( ( ( ( ( ( ( ( (rs   r   c                   8     e Zd ZeZ ed          Z fdZ xZS )
TeamDeleter   c                 .   | j         j                                        dk    rt          t	          d                    S t          j        | j        t	          d          d| j         j        iz             t                      
                    |          S )Nr?   z.Cannot delete a team with more than one memberu$   Team “%(name)s” has been deletedr   )r   r   countr%   _r   infora   r   rn   r   )rf   r   rr   s     ri   r   zTeamDelete.form_valid   s    ;""$$q(()BCC   	L455AQ8RR	
 	
 	
 ww!!$'''rs   )	r~   r   r   rS   r   r.   r   r   r   r   s   @ri   r   r      sL        E,|,,K	( 	( 	( 	( 	( 	( 	( 	( 	(rs   r   c                   ,     e Zd ZeZdZd Z fdZ xZS )	UserTeamszumap/user_teams.htmlc                 p    |                                                      | j        j        j                  S Nr   get_querysetrc   ra   r   r   rf   s    ri   
get_objectzUserTeams.get_object   -      ""&&$,*;*>&???rs   c                     |                     d| j        j                                        i            t	                      j        di |S )Nr   rl   )rm   r   r   r   rn   ro   rp   s     ri   ro   zUserTeams.get_context_data   sH    w 1 5 5 7 78999'uww'11&111rs   )	r~   r   r   r   r   r   r   ro   r   r   s   @ri   r   r      sT        E*M@ @ @2 2 2 2 2 2 2 2 2rs   r   c                   B     e Zd ZeZeZ ed          Zd Z	 fdZ
 xZS )UserProfileuser_profilec                 p    |                                                      | j        j        j                  S r   r   r   s    ri   r   zUserProfile.get_object  r   rs   c                     |                     d| j        j                            dd          i            t	                      j        di |S )N	providersproviderTflatrl   )rm   r   social_authvalues_listrn   ro   rp   s     ri   ro   zUserProfile.get_context_data  sX    $+1==jt=TTU	
 	
 	
 (uww'11&111rs   )r~   r   r   r   r   rM   r   r.   r   r   ro   r   r   s   @ri   r   r      sc        E J,~..K@ @ @2 2 2 2 2 2 2 2 2rs   r   c                   ^     e Zd ZeZdZej        ZdZ	dZ
d Zed             Zd Z fdZ xZS )UserMaps
identifierr   current_userc                 ,    | j         j        | j        k    S r}   )ra   r   r   r   s    ri   is_ownerzUserMaps.is_owner  s    | DK//rs   c                 Z    |                                  rt          j        S t          j        S r}   )r   r   UMAP_MAPS_PER_PAGE_OWNERr   r   s    ri   r`   zUserMaps.per_page  s$    ==?? 	544**rs   c                     t           j        }|                    | j                                      |                    | j                            }|                    d          S )Nownereditorsr   )rP   r   r   r   unionr   rf   rg   s     ri   get_mapszUserMaps.get_maps"  sN    ZYYT[Y))//		$+	0N0NOO{{>***rs   c                     |                     d|                     |                                 | j                  i            t	                      j        di |S Nr   rl   )rm   rj   r   r`   rn   ro   rp   s     ri   ro   zUserMaps.get_context_data'  sO    vt}}T]]__dmLLMNNN'uww'11&111rs   )r~   r   r   r   r   slug_url_kwargr   USER_URL_FIELD
slug_fieldru   context_object_namer   propertyr`   r   ro   r   r   s   @ri   r   r     s        E!N(J-(0 0 0 + + X+
+ + +
2 2 2 2 2 2 2 2 2rs   r   c                       e Zd ZdZd ZdS )	UserStarszauth/user_stars.htmlc                     t           j                            | j                                      d          }t
          j                            |          }|                    d          S )N)byr   r   r   )rR   r   r   r   r   rP   r   r   )rf   r   rg   s      ri   r   zUserStars.get_maps2  sT    ##t{#33::5AAZe,,{{>***rs   N)r~   r   r   r   r   rl   rs   ri   r  r  /  s(        *M+ + + + +rs   r  c                   0     e Zd ZeZdZdZd Z fdZ xZ	S )TeamMapsr   current_teamc                     t           j        }| j        j        }|j        r,|| j        j                                        v rt           j        }|	                    | j                  
                    d          S )N)teamr   )rP   r   ra   r   is_authenticatedr   r   r   r   r   r   )rf   rg   r   s      ri   r   zTeamMaps.get_maps@  sd    Z|   	TT[->-B-B-D-D%D%DByydky**33NCCCrs   c                     |                     d|                     |                                 t          j                  i            t                      j        di |S r   )rm   rj   r   r   r   rn   ro   rp   s     ri   ro   zTeamMaps.get_context_dataG  sY    T]]4==??H4OPPQ	
 	
 	
 (uww'11&111rs   )
r~   r   r   rS   r   ru   r  r   ro   r   r   s   @ri   r
  r
  ;  s[        E-(D D D2 2 2 2 2 2 2 2 2rs   r
  c                       e Zd Zd ZdS )SearchMixinc                    | j         j                            d          }d | j         j                            d          D             }t          j                                        }|rat          dt          j	                  }t          |t          j	        d          }|                    |                              |          }|r|                    |	          }|s|r|S d S )
Nqc                     g | ]}||S rl   rl   ).0ts     ri   
<listcomp>z3SearchMixin.get_search_queryset.<locals>.<listcomp>Q  s    AAAaqAAAArs   tagsr   )config	websearch)r  search_type)search)tags__contains)ra   rb   rc   getlistrP   r   r   r   r   UMAP_SEARCH_CONFIGURATIONr   annotater   )rf   rq   r  r  rg   vectorquerys          ri   get_search_querysetzSearchMixin.get_search_querysetO  s    L  %%AA4<+33F;;AAA[__ 	A!&1STTTF(<+  E F++22%2@@B 	0$//B 	 	I	 	rs   N)r~   r   r   r#  rl   rs   ri   r  r  N  s#            rs   r  c                   2    e Zd ZdZdZd Zed             ZdS )Searchzumap/search.htmlr   c                 p   |                                  }d}g }|]|                    t          j                                      d          }|                                }|                     |          }n&|                                 d t          j	                 }|
                    ||d           |S )Nr   )share_statusr   )r   r   )r#  r   rP   PUBLICr   r   rj   r   r   UMAP_MAPS_PER_SEARCHrm   )rf   rq   rg   qs_countresultss        ri   ro   zSearch.get_context_datac  s    %%''>
33<<^LLBxxzzHmmB''GG**,,-Lx/L-LMGw::;;;rs   c                     t           j        S r}   )r   r)  r   s    ri   r`   zSearch.per_pagep  s    ,,rs   N)r~   r   r   r   ru   ro   r  r`   rl   rs   ri   r%  r%  _  sI        &M-   - - X- - -rs   r%  c                   6     e Zd ZeZdZdZd Zd Z fdZ	 xZ
S )UserDashboardzumap/user_dashboard.htmlzumap/map_table.htmlc                 p    |                                                      | j        j        j                  S r   r   r   s    ri   r   zUserDashboard.get_object}  r   rs   c                     |                                  pt          j                                        }|                    t          j        t          j        g          }| j        j                                        }|	                    | j                  
                    |	                    | j                            
                    |	                    |                    }|                    d          S )N)share_status__inr   r   )team__inr   )r#  rP   r   r   excludeDELETEDBLOCKEDr   r   r   r   r   )rf   rg   r   s      ri   r   zUserDashboard.get_maps  s    %%''<3;??+<+<ZZ#+s{)CZDD!%%''IIDKI((U299T[91122U299e9,,-- 	
 {{>***rs   c                    |                      |                                 t          j                  }|                    | j        j                            d          |d            t                      j	        di |S )Nr  )r  r   rl   )
rj   r   r   r   rm   ra   rb   rc   rn   ro   )rf   rq   rd   rr   s      ri   ro   zUserDashboard.get_context_data  sk    }}T]]__h.OPPDL,0055tDDEEE'uww'11&111rs   )r~   r   r   r   r   r   ru   r   r   ro   r   r   s   @ri   r.  r.  x  si        E.M.@ @ @	+ 	+ 	+2 2 2 2 2 2 2 2 2rs   r.  c                   $    e Zd ZeZd Zd Zd ZdS )UserDownloadc                 p    |                                                      | j        j        j                  S r   r   r   s    ri   r   zUserDownload.get_object  r   rs   c                 4   t           j                            | j        j                            d                    }|                    | j                                      |                    | j                            }|                    d          S )Nmap_id)id__inr   r   r   )	rP   r   r   ra   rb   r  r   r   r   r   s     ri   r   zUserDownload.get_maps  sr    [t|'7'?'?'I'IJJYYT[Y))//		$+	0N0NOO{{>***rs   c                 
   t          j                    }t          j        |dt          j        d          5 }|                                 D ]x}|                    | j                  }t          j        t          |                    }d|j
         d|j         d}	|                    |	|                                           y	 d d d            n# 1 swxY w Y   t          |                                d          }
d|
d	<   |
S )
NaFumap_backup_r   z.umapzapplication/zipcontent_typez/attachment; filename="umap_backup_complete.zip"Content-Disposition)ior   zipfileZipFileZIP_DEFLATEDr   generate_umapjsonra   StringIOrY   slugr   writestrgetvaluer$   )rf   contextr{   rq   
zip_bufferzip_filemap_umapjsongeojson_file	file_namer|   s              ri   render_to_responsezUserDownload.render_to_response  sJ   Z\\
_Zg.BEJJ 	Fh F F11$,??!{:h+?+?@@E49EEtwEEE	!!)\-B-B-D-DEEEE	F	F 	F 	F 	F 	F 	F 	F 	F 	F 	F 	F 	F 	F 	F 	F  
 3 3 5 5DUVVV= 	&' s   BCCCN)r~   r   r   r   r   r   r   rS  rl   rs   ri   r8  r8    sI        E@ @ @+ + +
    rs   r8  c                       e Zd Zd ZdS )MapsShowCasec                 "   t           j                            t          t	          d          f          }|                    d          d d         }d dfd|D             d	}t          t          t          |                              S )
Nr?   r   r   r   i	  c                    | j         pd}| j        rBd                    |t          d          | j                                        | j                  }d                    ||                                 t          d                    }| j                            dt          j	        | j
        j                            }d|| j        |d	d
S )N z#{description}
{by} [[{url}|{name}]]r  )r   r  urlr   z{}
[[{}|{}]]zView the mapgeometryFeature)r   r   )typerZ  
properties)r   r   formatr   get_urlget_absolute_urlr   rc   jsonloadscentergeojsonr   )mr   rZ  s      ri   makezMapsShowCase.get.<locals>.make  s    --2Kw DKK +ww))	 L   *00Q//111^3D3D K z~~j$*QX=M2N2NOOH!$'(vkJJ  rs   FeatureCollectionc                 &    g | ]} |          S rl   rl   )r  re  rf  s     ri   r  z$MapsShowCase.get.<locals>.<listcomp>  s!    <S<S<STT!WW<S<S<Srs   )r\  features)	rP   r   r   rA   r   r   r$   r0   rY   )rf   r{   rq   r   rd  rf  s        @ri   rc   zMapsShowCase.get  s    z  na1ggg5N OO}}^,,UdU3	 	 	& /<S<S<S<Sd<S<S<STTK
7(;(;<<===rs   Nr~   r   r   rc   rl   rs   ri   rU  rU    s#        > > > > >rs   rU  c                 6   | j         dk    s
J d            | j                            d          }|s
J d            	 t          |           n!# t          $ r}t          |          d }~ww xY wd| j        v s
J d            t          | j                            d                    }t          |          }t          t          j	                  }|j
        s
J d            |j
        |j
        k    sJ |j
         d|j
                     |j
        d	k    s
J d
            |j        |j        k    s
J d            	 t          j        |j
                  }n!# t          $ r}t          |          d }~ww xY wt                              |          r
J d            |S )Nrb   zWrong HTTP methodrY  zMissing URLHTTP_REFERERzMissing HTTP_REFERERzNo hostnamez != 	localhostzInvalid localhost targetzInvalid netlocz
Private IP)methodrb   rc   r!   r"   AssertionErrorMETAr   r   SITE_URLhostnamenetlocsocketgethostbyname	Exception
PRIVATE_IPmatch)ra   rY  errreferertoproxylocal	ipaddresss          ri   validate_urlr~    s   >U"""$7"""
+//%
 
 C"S " " "S!!!"W\)))+A)))w|''7788GsmmGX&''E**]***u~---'2B/X/X/X/X---{***,F***>U\)))+;)))"()9::		 " " "S!!!"	**88L888Js/   A 
A+A&&A+:E 
E2E--E2c                       e Zd Zd ZdS )	AjaxProxyc                 Z   	 t          | j                  }n7# t          $ r*}t          d|            t	                      cY d }~S d }~ww xY w	 t          | j        j                            d                    }n# t          t          f$ r d }Y nw xY wt          t          dd           r6t                      }dt          |           |t          j        <   |r||d<   |S ddi}|                    dd	          }t!          ||
          }t#                      }		 |	                    |d          }
|
j        }|
j                            d          }|st+          j        |          \  }}|
                                }d| j        j        _        t          |||          }|r||d<   |S # t4          $ r&}t          |j        |j        d          cY d }~S d }~wt8          $ r t	          d          cY S t:          $ r t	          d          cY S t<          $ r t	          d          cY S w xY w)NzAjaxProxy: ttlUMAP_XSENDFILE_HEADERz/proxy/zX-Accel-Expiresz
User-Agentz2uMapProxy +http://wiki.openstreetmap.org/wiki/UMap +)headers
   )timeoutzContent-TypeF)statusrA  z
text/plainz	URL errorzInvalid URLTimeout)r~  ra   ro  printr%   intrb   rc   	TypeError
ValueErrorgetattrr   r$   r   r  replacer   r   opencoder  	mimetypes
guess_typereadsessionaccessedr	   msgr
   r   TimeoutError)rf   r{   rq   rY  ry  r  r|   r  ra   openerproxied_requeststatus_coderA  encodingcontentes                   ri   rc   zAjaxProxy.get  s   	,t|,,CC 	, 	, 	,%%%&&&)++++++++	,	dl&**51122CC:& 	 	 	CCC	84d;; 	#~~H7RC7R7RHX34 2.1*+O  !UVkk#s###w///	$kk'2k>>O *.K*266~FFL C)2)=c)B)B&h%**,,G,1DL )#,  H  2.1*+O+  	Q 	Q 	Qaf<PPPPPPPPP 	7 	7 	7)+66666 	9 	9 	9)-88888 	5 	5 	5))44444	5s\    
AA AA,A< <BBF, ,
H*6GH*H*5H*H*)H*Nrj  rl   rs   ri   r  r    s#        - - - - -rs   r  c                  >    t          t          |           d          S )Napplication/jsonr@  )r$   rY   rq   s    ri   ry   ry   #  s    
6**9KLLLLrs   c                       e Zd Zd ZdS )SessionMixinc                 :   i }| j         j        }t          | d          r"| j                            | j                   |d<   |j        r|S |j        t          | j         j                  t          d          d |j	        
                                D             d|S )Nr   r   user_dashboardc                 6    g | ]}|                                 S rl   get_metadata)r  r  s     ri   r  z.SessionMixin.get_user_data.<locals>.<listcomp>8  s$    GGGdd''))GGGrs   )idr   rY  r   )ra   r   r   r   r   is_anonymousr   strr-   r   r   )rf   datar   s      ri   get_user_datazSessionMixin.get_user_data-  s    | 4"" 	B#{33DLAAD 	K')**+,,GGdjnn6F6FGGG	
 

 
 	
rs   N)r~   r   r   r  rl   rs   ri   r  r  ,  s#        
 
 
 
 
rs   r  c                   "    e Zd ZdgZd ZddZdS )FormLessEditMixinpostc                 R    t          |j        t          |j                            S )N)errorserror)ry   r  r  rf   r   s     ri   form_invalidzFormLessEditMixin.form_invalidB  s!    #4;c$+>N>NOOOOrs   Nc                 r    |                                  }t          |d<    |                                 di |S )Nerror_classrl   )get_form_kwargsrH   get_form_class)rf   r   rq   s      ri   get_formzFormLessEditMixin.get_formE  s?    %%'' -}$t""$$..v...rs   r}   )r~   r   r   http_method_namesr  r  rl   rs   ri   r  r  =  sE        P P P/ / / / / /rs   r  c                   l     e Zd ZeZdZd Zd Z fdZd Z	e
d             Zd Zd Zd	 Zd
 Zd Z xZS )MapDetailMixinr;  c                    |                     di                                d          }|s2|                     d          }|r|d                              d          }|r%t          |          j        }|rd|vrd| g|d<   d S d S d S d S )N	tilelayerurl_template
tilelayersr   {z//preconnect_domains)rc   r   rs  )rf   r]  rL  r  r  domains         ri   set_preconnectzMapDetailMixin.set_preconnectO  s    !~~k266::>JJ  	A#55J A)!}00@@ 	@l++2F @#V++1>f,---		@ 	@@ @++rs   c                    | j         j        }t                      t          j                    | j        t          j        |                                 | 	                                | 
                                t          d t          j                                        D                       t          t           j        t           j        t           j        t           j        d}t+          t-          | dd                     }|r,|                    | j        j        | j        j        d           |r| j        j        s	|s,|j        s%t          j        }t<          j        }t          j        }n$t          j         }t<          j         }t          j!        }d |D             |d<   d |D             |d<   d	 |D             |d
<   | "                                r| "                                |d<   | #                                |d<   |S )Nc              3   2   K   | ]}|j         |j        fV  d S r}   )r   ra  )r  ls     ri   	<genexpr>z4MapDetailMixin.get_map_properties.<locals>.<genexpr>h  s+      MM!afaf-MMMMMMrs   )urlsr  editModeschemar  starredr   licencesumap_versionfeaturesHaveOwnerwebsocketEnabled	importersdefaultLabelKeysr   )
created_atmodified_atc                 6    g | ]\  }}|t          |          fS rl   r  r  ilabels      ri   r  z5MapDetailMixin.get_map_properties.<locals>.<listcomp>  s&    &U&U&U81e3u::&U&U&Urs   edit_statusesc                 6    g | ]\  }}|t          |          fS rl   r  r  s      ri   r  z5MapDetailMixin.get_map_properties.<locals>.<listcomp>  s3     1
 1
 1
 (5QE

O1
 1
 1
rs   datalayer_edit_statusesc                 j    g | ]0\  }}|t           j        t           j        fv|t          |          f1S rl   )rP   r5  r4  r  r  s      ri   r  z5MapDetailMixin.get_map_properties.<locals>.<listcomp>  sD     (
 (
 (
5ck222 E

O222rs   share_statusesshortUrlr   )$ra   r   rV   rT   get_list	edit_moderP   extra_schemaget_id
is_starredr   dictrO   r   r   r@   r   !UMAP_DEFAULT_FEATURES_HAVE_OWNERSREALTIME_ENABLEDUMAP_IMPORTERSUMAP_LABEL_KEYSboolr  rm   r   r  r  r   r  EDIT_STATUSrN   SHARE_STATUSANONYMOUS_EDIT_STATUSANONYMOUS_SHARE_STATUSget_short_urlr  )rf   r   r]  createdr  datalayer_statusesr  s          ri   get_map_propertiesz!MapDetailMixin.get_map_properties^  s   |  NN#,..&++--((ZZ\\MMw7J7J7L7LMMMMM#!)!K ( 9!0 ( 8
 

 wtXt4455 	"&+"8#';#:     	8) 	87 	84CT 	8OM!*!6 -NN5M!*!@ 7N&U&U}&U&U&U
?#1
 1
,>1
 1
 1

,-(
 (
*(
 (
 (

#$
  	:%)%7%7%9%9Jz"!//11
6rs   c                 8    t                      j        di |}|                                 }t          j        rPt          j        }t          | j        d          r| j        j        }||d<   t          j	        |          }||d<   ||d<   | 
                                }d|vri |d<   |d                             |           |                                 |d         d<   t          |t          j                  |d<   |                     |d         |           |S )	NLANGUAGE_CODElanglocaler]  
datalayers)indentmap_settingsrl   )rn   ro   r  r   USE_I18Nr  r   ra   r/   	to_localeget_geojsonrm   get_datalayersrY   DEBUGr  )rf   rq   rL  r]  r  r  rd  rr   s          ri   ro   zMapDetailMixin.get_context_data  s"   *%''*44V44,,..
 	')Dt|_55 2|1!%Jv *400F#)Jx  &GH""$$w&&$&GL!$$Z000.2.A.A.C.Cl+",WX^"L"L"LGL17;;;rs   c                     g S r}   rl   r   s    ri   r  zMapDetailMixin.get_datalayers  s    	rs   c                     dS )Nadvancedrl   r   s    ri   r  zMapDetailMixin.edit_mode  s    zrs   c                     d S r}   rl   r   s    ri   r  zMapDetailMixin.get_id      trs   c                     dS )NFrl   r   s    ri   r  zMapDetailMixin.is_starred  s    urs   c                     dS )Nr   rl   r   s    ri   r   zMapDetailMixin.stars  s    qrs   c                 X    t           t          gddt          t          dd          g ddS )NPoint)coordinatesr\  LEAFLET_ZOOM   )zoomr  )rZ  r]  )rC   rB   r  r   r   s    ri   r  zMapDetailMixin.get_geojson  sG     !23CD 
  .!<<  	
 	
 		
rs   c                     d S r}   rl   r   s    ri   r  zMapDetailMixin.get_short_url  r  rs   )r~   r   r   rP   r   pk_url_kwargr  r  ro   r  r  r  r  r  r   r  r  r   r   s   @ri   r  r  K  s        EL@ @ @. . .`    *     X      

 

 

      rs   r  c                       e Zd Zd ZdS )PermissionsMixinc                    i }| j         j        |d<   | j         j        |d<   | j         j        rL| j         j                                        |d<   d | j         j                                        D             |d<   | j         j        r!| j         j                                        |d<   | j         j        s;| j                             | j	                  r| j         
                                |d<   |S )Nedit_statusr'  r   c                 6    g | ]}|                                 S rl   r  )r  editors     ri   r  z4PermissionsMixin.get_permissions.<locals>.<listcomp>  s1     & & &*0##%%& & &rs   r   r  anonymous_edit_url)r   r  r'  r   r  r   r   r  is_anonymous_ownerra   get_anonymous_edit_url)rf   permissionss     ri   get_permissionsz PermissionsMixin.get_permissions  s    %)[%<M"&*k&>N#; 	#';#4#A#A#C#CK & &48K4G4K4K4M4M& & &K	" ; 	B"&+"2"?"?"A"AK{  	UT[%C%CDL%Q%Q 	U040R0R0T0TK,-rs   N)r~   r   r   r  rl   rs   ri   r  r    s#            rs   r  c                   h     e Zd Z fdZ fdZd Zd Zed             Zd Z	d Z
d Zd	 Zd
 Z xZS )MapViewc                     t                      j        di |}| j                            t	          d                    |d<   t          | j                            | j                                                            |d<   |S )N
map_oembedoembed_absolute_uriquoted_absolute_urirl   )rn   ro   ra   build_absolute_urir-   r   r   r`  )rf   rq   rL  rr   s      ri   ro   zMapView.get_context_data  s    *%''*44V44)-)H)HL!!*
 *
%& *4L++DK,H,H,J,JKK*
 *
%& rs   c                 `   |                                  | _        |                                 }|j        |k    sK|j                            d          r"d                    ||j        d         g          }t          |          S  t          t          |           j        |g|R i |}d|d<   |S )NQUERY_STRING?*Access-Control-Allow-Origin)
r   r   get_canonical_urlpathrp  rc   joinr'   rn   r  )rf   ra   r{   rq   	canonicalr|   rr   s         ri   rc   zMapView.get  s    oo''**,,	|y((|// PHHin1M%NOO	0;;;+5$''+GEdEEEfEE25./rs   c                 4    | j                                         S r}   )r   r`  r   s    ri   r'  zMapView.get_canonical_url  s    {++---rs   c                 4      fd j         j        D             S )Nc                 D    g | ]}|                     j                  S rl   )metadatara   )r  dlrf   s     ri   r  z*MapView.get_datalayers.<locals>.<listcomp>  s'    KKKbDL))KKKrs   )r   r  r   s   `ri   r  zMapView.get_datalayers  s%     LKKKDK4JKKKKrs   c                      d} j                              j                  rd}n't           fd j         j        D                       rd}|S )Ndisabledr  c              3   L   K   | ]}|                     j                  V  d S r}   )can_editra   )r  drf   s     ri   r  z$MapView.edit_mode.<locals>.<genexpr>  s1      JJaDL))JJJJJJrs   simple)r   r3  ra   anyr  )rf   r  s   ` ri   r  zMapView.edit_mode  s^    	;-- 	!"IIJJJJ4;3IJJJJJ 	! Irs   c                     | j         j        S r}   )r   r   r   s    ri   r  zMapView.get_id  s    {~rs   c                     d }t          t          dd           r-t          dd| j        j        i          }t          j        |}|S )NSHORT_SITE_URLmap_short_urlr   r  )r  r   r.   r   r   r9  )rf   	short_url
short_paths      ri   r  zMapView.get_short_url  sP    	8-t44 	G%otT[^>TUUUJ"*"9"9::FIrs   c                 $   | j         j        }d|vri |d<   | j         j        |d         d<   |                                 |d         d<   | j                                         }|r-t          |          |                                d|d         d<   |S )Nr]  r   r  )r   rY  author)r   r   r   r  
get_authorr  r_  )rf   r  r>  s      ri   r  zMapView.get_geojson  s    {+|++)+L&-1[-=\"6*484H4H4J4J\"=1'')) 	F~~''4 4L&x0 rs   c                     | j         j        }|j        sdS t          j                            || j                                                  S )NF)r  r   )ra   r   r  rR   r   r   r   exists)rf   r   s     ri   r  zMapView.is_starred  sE    | $ 	5|""d"<<CCEEErs   c                 p    t           j                            | j                                                  S )Nr   )rR   r   r   r   r   r   s    ri   r   zMapView.stars  s)    |""t{"3399;;;rs   )r~   r   r   ro   rc   r'  r  r  r  r  r  r  r  r   r   r   s   @ri   r  r    s            	 	 	 	 	. . .L L L
   X      F F F< < < < < < <rs   r  c                   "    e Zd ZeZdZd Zd ZdS )MapDownloadr;  c                 :    t          d| j        j        f          S )Nmap_downloadr{   r-   r   r   r   s    ri   r'  zMapDownload.get_canonical_url!  s    ~T[^,=>>>>rs   c                     | j                             | j                  }t          di |}d| j         j         d|d<   |S )Nz"attachment; filename="umap_backup_z.umap"rB  rl   )r   rG  ra   ry   rI  )rf   rL  r{   rq   rP  r|   s         ri   rS  zMapDownload.render_to_response$  sQ    ;00>>'33(33I1AIII 	&' rs   N)r~   r   r   rP   r   r  r'  rS  rl   rs   ri   rE  rE    s<        EL? ? ?    rs   rE  c                       e Zd Zd ZdS )	MapOEmbedc                 @   ddd}|j                             dd          }|dk    rt          d          }d|_        |S |j                             d          }|st	          d	          t          |          }|j        }	t          j        }
|j	        |
vr|
d
gk    rt	          d          |j
        }t          j        |          }t          j        |           t          |          \  }}}d|vsd|vrt	          d          t          t           |d                   }|j        t           j        k    rt'          d          |                                }t+          d          }d}||d<   d}||d<   d| d|	 | d|	 | d| d}||d<   t-          di |}d
|d<   |S )Nrichz1.0)r\  versionr^  ra  z"Only `json` format is implemented.i  rY  zMissing `url` parameter.r%  zHost not allowed.rI  r;  zInvalid URL path.)r  zThis map is not public.zSee full screeni,  heighti   widthz<iframe width="100%" height="z?px" frameborder="0" allowfullscreen allow="geolocation" src="//z"></iframe><p><a href="//z">z</a></p>rx   r&  rl   )rb   rc   r)   r  r#   r   rs  r   ALLOWED_HOSTSrr  r(  r/   get_language_from_pathactivater,   r+   rP   r'  r(  r   r`  r   ry   )rf   ra   r{   rq   r  format_r|   rY  
parsed_urlrs  allowed_hostsurl_pathr  viewrO  map_urlr  rP  rQ  rx   s                       ri   rc   zMapOEmbed.get.  s   511+//(F33f./STTH#&H Okooe$$ 	64555c]]
" .m33#8N8N-...?1(;;T"""$X..dF86#9#9-... )9:::
**"#<===''))#$$XW@F @ @@%@ @ $@ &-@ @ 16@ @ @ 	 V'//$//25./rs   Nrj  rl   rs   ri   rL  rL  -  s#        . . . . .rs   rL  c                       e Zd Zd Zd ZdS )MapViewGeoJSONc                 :    t          d| j        j        f          S )Nmap_geojsonrH  rI  r   s    ri   r'  z MapViewGeoJSON.get_canonical_url`  s    }DKN+<====rs   c                 0    t          |d         d          S )Nr  r  r@  )r$   )rf   rL  r{   rq   s       ri   rS  z!MapViewGeoJSON.render_to_responsec  s    GN3BTUUUUrs   N)r~   r   r   r'  rS  rl   rs   ri   r\  r\  _  s7        > > >V V V V Vrs   r\  c                   "     e Zd ZdZ fdZ xZS )MapNewumap/map_detail.htmlc                 P   t                                                      }t          j        j                                        t          j        j                                        d|d<   | j        j        j	        r)| j        j        }|
                                |d         d<   |S )N)r  r'  r  r   )rn   r  rP   r  fieldr   r'  ra   r   r  r  )rf   r]  r   rr   s      ri   r  zMapNew.get_map_propertiesj  s    WW//11
?088::,2::<<%
 %

=! <- 	E<$D151B1B1D1DJ}%g.rs   r~   r   r   r   r  r   r   s   @ri   ra  ra  g  s=        *M	 	 	 	 	 	 	 	 	rs   ra  c                   "     e Zd ZdZ fdZ xZS )
MapPreviewrb  c                 R    t                                                      }d|d<   |S )NTpreview)rn   r  )rf   r]  rr   s     ri   r  zMapPreview.get_map_propertiesy  s(    WW//11
 $
9rs   re  r   s   @ri   rg  rg  v  s=        *M        rs   rg  c                       e Zd ZeZeZd ZdS )	MapCreatec                    | j         j        j        r| j         j        |j        _        |                                | _        |                                 }|                                 }| j        j        s#| j        	                                }||d<   d|d<   t          | j        j        | j                                        ||          }| j         j        j        s,| j        j        \  }}|                    ||t                     |S )Nr  Tr   r  rY  r  r   keyvaluemax_age)ra   r   r  instancer   r   r   r  r  r  ry   r   r`  signed_cookie_elementsset_signed_cookieANONYMOUS_COOKIE_MAX_AGE)rf   r   r  	user_dataanonymous_urlr|   ro  rp  s           ri   r   zMapCreate.form_valid  s   <- 	4"&,"3DMiikk**,,&&((	{  	) K>>@@M0=K,-$(Ij!'{~,,..#	
 
 
 | 1 	;JC&&u.F '    rs   N)r~   r   r   rP   r   rI   r   r   rl   rs   ri   rk  rk    s-        E J    rs   rk  c                 <   t           j                            |          }dg}|                    |           r|                    d           | j        j        r| j        j        }nd}t                      	                    |||d          }t          |          S )a  Return an signed authentication token for the currently
    connected user, allowing edits for this map over WebSocket.

    If the user is anonymous, return a signed token with the map id.

    The returned token is a signed object with the following keys:
    - user: user primary key OR "anonymous"
    - map_id: the map id
    - permissions: a list of allowed permissions for this user and this map
    r   editr   	anonymous)r   r;  r  )token)rP   r   rc   r   appendr   r  r   r    sign_objectry   )ra   r;  map_inst
map_objectr  r   signed_tokens          ri   get_websocket_auth_tokenr    s     kooo00J(K7## $7###|$ |"$$00DD L  l3333rs   c                        e Zd ZeZeZdZd ZdS )	MapUpdater;  c                    |j         d         | j        _        | j                                         t	          | j        j        | j                                        |                                 |                                           S )Nr   rm  )	r   r   r   r   ry   r   r`  r  r  r  s     ri   r   zMapUpdate.form_valid  su    #0<#{~,,..,,..##%%	
 
 
 	
rs   N)	r~   r   r   rP   r   rI   r   r  r   rl   rs   ri   r  r    s2        E JL
 
 
 
 
rs   r  c                   4     e Zd ZeZdZd Zd fd	Zd Z xZ	S )UpdateMapPermissionsr;  c                 6    | j         j        rt          S t          S r}   )r   r   rL   rE   r   s    ri   r  z#UpdateMapPermissions.get_form_class  s    ; 	/++..rs   Nc                     t                                          |          }| j        j        }| j        j        r(|| j        j        k    s|j        d= |j        d= |j        d= |S )Nr  r'  r   )rn   r  ra   r   r   r   r   )rf   r   r   r   rr   s       ri   r  zUpdateMapPermissions.get_form  sc    ww
++| ; 	%TT[->%>%>M*N+G$rs   c                 n    |                                 | _        t          t          d                    S )Nz!Map editors updated with success!r   r   r   ry   r   r  s     ri   r   zUpdateMapPermissions.form_valid  +    iikk#+N)O)OPPPPrs   r}   )
r~   r   r   rP   r   r  r  r  r   r   r   s   @ri   r  r    sl        EL/ / /     Q Q Q Q Q Q Qrs   r  c                       e Zd Zd ZdS )AttachAnonymousMapc                 h   |d         | _         | j         j        sO| j                             | j                  r0| j                             | j                  r| j        j        j        st                      S | j        j        | j         _        | j                                          t                      S )Nr~  )
r   r   r  ra   r3  r   r  r&   r   ry   )rf   r{   rq   s      ri   r  zAttachAnonymousMap.post  s    Z(K	+;11$,??	+ ;''55	+ <$5		+ )*** L-#%%%rs   Nr~   r   r   r  rl   rs   ri   r  r    s#        & & & & &rs   r  c                       e Zd ZeZd ZdS )SendEditLinkc                    |d         | _         | j         j        s>| j                             | j                  r| j                             | j                  st                      S |                                 }|                                r|j        d         }nt          d          S | j         
                                }t          d          d| j         j        iz  }t          d          d|iz  }	 t          ||t          j        |gd	           n2# t           $ r% t#          t          d
d|iz                      cY S w xY wt#          t          d          d|iz            S )Nr~  emailInvalidz-The uMap edit link for your map: %(map_name)smap_namez'Here is your secret edit link: %(link)slinkF)fail_silentlyzCan't send email to %(email)s)r  zEmail sent to %(email)sr  )r   r   r  ra   r3  r&   r  is_validr   r%   r  r   r   r   r   DEFAULT_FROM_EMAILr   ry   )rf   r   rq   r  r  subjectbodys          ri   r  zSendEditLink.post  s   Z(K	+;11$,??	+ ;''55	+
 )***}}==?? 	5%g.EE))444{1133CDD(H
 
 :;;vtnL	x:UGSX      	 	 	'77E:JJKK     	 $,--%0@@
 
 
 	
s   7D ,EEN)r~   r   r   rJ   r   r  rl   rs   ri   r  r    s(        J
 
 
 
 
rs   r  c                       e Zd ZeZdZd ZdS )	MapDeleter;  c                 $   |                                  | _        | j                            | j                  st	          t          d                    S | j                                         | j        j        j        rt          d          }nt          d          }t          j        | j        t          d                     t          | j                  rt          |          S t          |j                            d          p|          S )Nz"Only its owner can delete the map.r  homezMap successfully deleted.redirectnext)r   r   
can_deletera   r&   r   move_to_trashr   r  r-   r   r   rX   ry   r(   r  rc   )rf   r   redirect_urls      ri   r   zMapDelete.form_valid  s    oo''{%%dl33 	R(+O)P)PQQQ!!###<- 	+"#344LL"6??LdlA&A$B$BCCC4<   	O'>>>>'	f(=(=(MNNNrs   N)r~   r   r   rP   r   r  r   rl   rs   ri   r  r    s2        ELO O O O Ors   r  c                       e Zd Zd ZdS )MapClonec                    t          t          dd          s| j        j        j        st                      S | j        j        j        r| j        j        nd }|d                             |          | _        t          | j                  r(t          | j        
                                          }n&t          | j        
                                          }| j        j        j        sX| j        j        \  }}|                    ||t                     t          dd| j                                        iz            }nt          d	          }t#          j        | j        |           |S )
NUMAP_ALLOW_ANONYMOUSFr~  r   r  rn  zuYour map has been cloned! If you want to edit this map from another computer, please use this link: %(anonymous_url)srw  z*Congratulations, your map has been cloned!)r  r   ra   r   r  r&   cloner   rX   ry   r`  r(   rs  rt  ru  r   r  r   r   )rf   r{   rq   r   r|   ro  rp  r  s           ri   r  zMapClone.post&  s^   "8%@@	+L%6	+ )***%)\%6%GQ!!TZ(..U.;;4<   	L+T[5Q5Q5S5STTTHH+DK,H,H,J,JKKH| 1 	B;JC&&u.F '    L"DK$F$F$H$HIJ CC @AACdlC(((rs   Nr  rl   rs   ri   r  r  %  s#            rs   r  c                       e Zd Zd ZdS )ToggleMapStarStatusc                    t          t          |d                   }t          j                            || j        j                  }|                                r|                                 d}n-t          j        	                    || j        j                   d}t          |t          j                            |                                                    S )Nr;  r   )r   r  FTrC  )r  r   )r+   rP   rR   r   r   ra   r   rA  deletecreatery   r   )rf   r{   rq   r~  rg   r  s         ri   r  zToggleMapStarStatus.postC  s    $SVH-=>>>\  X$,2C DD99;; 	IIKKKFFLH1BCCCF#$,"5"5("5"C"C"I"I"K"K
 
 
 	
rs   Nr  rl   rs   ri   r  r  B  s#        
 
 
 
 
rs   r  c                       e Zd ZdZdZd ZdS )MapShortUrlTc                     t          t          |d                   }|                                }| j        r)| j        j                            dd          }|r|d|}|S )Nr   r   r#  rX  r$  )r+   rP   r`  query_stringra   rp  rc   )rf   rq   r~  rY  r{   s        ri   get_redirect_urlzMapShortUrl.get_redirect_urlU  sk    $SVD\:::'')) 	,<$((<<D ,!$dd+
rs   N)r~   r   r   r  	permanentr  rl   rs   ri   r  r  Q  s-        LI    rs   r  c                       e Zd ZdZd ZdS )MapAnonymousEditUrlFc                    t                      }	 |                    | j        d                   }nb# t          $ rU t          d          }	 |                    | j        d                   }n # t          $ r t	                      cY cY S w xY wY nw xY wt          t          |          }|                                }t          |          }|j	        s'|j
        \  }	}
|                    |	|
t                     |S )N	signaturesha1)	algorithmr   rn  )r   unsignrq   r   r&   r+   rP   r`  r(   r   rs  rt  ru  )rf   ra   r{   rq   signerr   r~  rY  r|   ro  rp  s              ri   rc   zMapAnonymousEditUrl.getb  s"   	/t{;788BB 	/ 	/ 	/f---F/]]4;{#;<< / / /,......./ 	/ %SR000''))',,~ 	!8JC&&u.F '    s3    1 B A-,B-B
B	B

BBN)r~   r   r   r  rc   rl   rs   ri   r  r  _  s(        I    rs   r  c                       e Zd ZeZed             Zed             Zed             Zed             Z	ed             Z
ed             Zd ZdS )	DataLayerViewc                 ~    t           j        o1t          j        | j        j                            dd                    S )NHTTP_ACCEPT_ENCODINGrX  )r   	UMAP_GZIPr*   r  ra   rp  rc   r   s    ri   accepts_gzipzDataLayerView.accepts_gzip  s:    ! 
o&<L!!"8"=='
 '
 	
rs   c                 6    dt           j        d         d         v S )NS3r  BACKEND)r   STORAGESr   s    ri   is_s3zDataLayerView.is_s3  s    x(0;;;rs   c                 >    t          | j        j        j                  S r}   )r   r   rd  r(  r   s    ri   filepathzDataLayerView.filepath  s    DK',---rs   c                 $    | j         j        j        S r}   )r   rd  rY  r   s    ri   fileurlzDataLayerView.fileurl  s    {"&&rs   c                     | j         j                            d          5 }|                                cd d d            S # 1 swxY w Y   d S )Nrb)r   rd  r  r  )rf   fs     ri   filedatazDataLayerView.filedata  s    [ %%d++ 	q6688	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	s   AAAc                     | j         j        S r}   r   reference_versionr   s    ri   fileversionzDataLayerView.fileversion  s    {,,rs   c                    d }| j         sG| j        r@t          | j         d          }|                                st          | j        |           t          t          dd           rbt                      }| j         rd| j	         }n2t          | j                                      t          j        d          }||t          j        <   n| j        }t          |d          }| j        |d<   |S )Nz.gzr  z/s3/z	/internalzapplication/geo+jsonr@  X-Datalayer-Version)r  r  r   r  rA  rW   r  r   r$   r  r  r  
MEDIA_ROOTr  r  r  )rf   rL  response_kwargsr|   	gzip_pathinternal_pathr  s          ri   rS  z DataLayerView.render_to_response  s    z 	4d/ 	422233I##%% 4$-33384d;; 	O#~~Hz  5t| 5 5 #DM 2 2 : :'! ! 8EHX344 =D#D7MNNNH*.*:&'rs   N)r~   r   r   rN   r   r  r  r  r  r  r  r  rS  rl   rs   ri   r  r  }  s        E
 
 X

 < < X< . . X. ' ' X'   X - - X-    rs   r  c                   f    e Zd Zed             Zed             Zed             Zed             ZdS )DataLayerVersionc                     	 t          t          j                  | j                            | j        d                   z  S # t          $ r t          d          w xY w)NrefzInvalid version reference)r   r   r  r   get_version_pathrq   r  r#   r   s    ri   r  zDataLayerVersion.filepath  si    	7+,,t{/K/KE"0 0    	7 	7 	75666	7s   >A Ac                 L    | j                             | j        d                   S Nr  )r   r  rq   r   s    ri   r  zDataLayerVersion.fileurl  s    {++DK,>???rs   c                     	 | j                             | j        d                   S # t          $ r t	          d          w xY w)Nr  zInvalid version reference.)r   get_versionrq   r  r#   r   s    ri   r  zDataLayerVersion.filedata  sN    	8;**4;u+=>>> 	8 	8 	86777	8s	   $' Ac                     | j         d         S r  r  r   s    ri   r  zDataLayerVersion.fileversion  s    {5!!rs   N)r~   r   r   r  r  r  r  r  rl   rs   ri   r  r    s        7 7 X7 @ @ X@ 8 8 X8 " " X" " "rs   r  c                       e Zd ZeZeZd ZdS )DataLayerCreatec                    | j         d         |j        _        | j         d         }t          j                            |                                          rt          d          S ||j        _        |	                                | _
        || j
        j        k    sJ | j
                            | j                  }t          di |}| j
        j        |d<   |S )Nr~  r   )uuidzUUID already existsr  rl   )rq   rr  r   rN   r   r   rA  r%   r  r   r   r.  ra   ry   r  )rf   r   r  r  r|   s        ri   r   zDataLayerCreate.form_valid  s     K
3{4 ###..5577 	A)*?@@@!iikkt{''''' {##DL11'//$//*.+*G&'rs   N)r~   r   r   rN   r   rF   r   r   rl   rs   ri   r  r    s-        EJ    rs   r  c                   8     e Zd ZeZeZd Zd Z fdZ	d Z
 xZS )DataLayerUpdatec                 &    |o| j         j        |k    S r}   r  )rf   incoming_versions     ri   has_changes_sincez!DataLayerUpdate.has_changes_since  s    UDK$AEU$UUrs   c                    | j         j        D ]>}|d         }||k    r.t          j        | j                             |                    } n?dS t          j        | j        j        d                                                   }| j         j        	                                5 }t          j        |                                          }ddd           n# 1 swxY w Y   	 t          |                    dg           |                    dg           |                    dg                     }||d<   |S # t          $ r Y dS w xY w)z
        Attempt to apply the incoming changes to the reference, and then merge it
        with the last document we have on storage.

        Returns either None (if the merge failed) or the merged python GeoJSON object.
        r  Nrd  ri  )r   versionsra  rb  r  ra   FILESr  rd  r  rZ   rc   rU   )	rf   r  rO  r  	referenceincomingr  latestmerged_featuress	            ri   mergezDataLayerUpdate.merge  s}    {+ 	 	G%.C C'' Jt{'>'>s'C'CDD	 (
 4:dl0;@@BBCC [ %%'' 	*1Z))F	* 	* 	* 	* 	* 	* 	* 	* 	* 	* 	* 	* 	* 	* 	*		,j"--

:r**Z,, O
 "1F:M 	 	 	44	s%   "'CCC!AD5 5
EEc                    |                                  | _        | j        j        j        t	          | j        d                   k    rt                      S | j                            | j                  st                      S | j        j	        
                    d          }|                     |          rz|                     |          }|st          d          S t          t          |                              d                    | j        j        d         _        d| j        j        d	<    t)                      j        |g|R i |S )
Nr;  ra   zX-Datalayer-Referencei  )r  zutf-8rd  Tneeds_reload)r   r   r   r   r  rq   r&   r3  ra   r  rc   r  r  r$   r   rY   encoder  filer  rn   r  )rf   ra   r{   rq   r  mergedrr   s         ri   r  zDataLayerUpdate.post  s4   oo'';?T[%:!;!;;;(***{##DL#99 	+(*** L0445LMM!!"344 	8ZZ 122F 0#3//// 296""))'222 2DLy).
 48DL 0uww|G5d555f555rs   c                    |                                 | _        | j        j                             dg           i | j                            | j                  }| j        j                            d          rTt          j        | j        j	        
                                                                          |d<   d| j        j        d<   t          di |}| j        j        |d<   |S )Nr  )update_fieldsr  rd  Fr  rl   )r   r   r   r.  ra   r  rc   ra  rb  rd  r  decodery   r  )rf   r   r  r|   s       ri   r   zDataLayerUpdate.form_valid'  s    iikkM?;;;5$+&&t|445<##N33 	9"j)<)A)A)C)C)J)J)L)LMMDO38DL 0'//$//*.+*G&'rs   )r~   r   r   rN   r   rF   r   r  r  r  r   r   r   s   @ri   r  r    ss        EJV V V! ! !F6 6 6 6 6.	 	 	 	 	 	 	rs   r  c                       e Zd ZeZd ZdS )DataLayerDeletec                     |                                  | _        | j        j        | j        d         k    rt	                      S | j                                         t          t          d                    S )Nr~  zLayer successfully deleted.r  )r   r   r   rq   r&   r  ry   r   r  s     ri   r   zDataLayerDelete.form_valid6  sc    oo'';?dk*555(***!!####+H)I)IJJJJrs   N)r~   r   r   rN   r   r   rl   rs   ri   r  r  3  s-        EK K K K Krs   r  c                       e Zd ZeZd ZdS )DataLayerVersionsc                 6    t          | j        j                  S )N)r  )ry   r   r  )rf   rL  r  s      ri   rS  z$DataLayerVersions.render_to_responseA  s    #T[-ABBBBrs   N)r~   r   r   rN   r   rS  rl   rs   ri   r  r  >  s-        EC C C C Crs   r  c                   "    e Zd ZeZdZd Zd ZdS )UpdateDataLayerPermissionsr   c                 @    | j         j        j        rt          S t          S r}   )r   r   r   rG   rD   r   s    ri   r  z)UpdateDataLayerPermissions.get_form_classI  s    ;?  	5++44rs   c                 n    |                                 | _        t          t          d                    S )Nz!Permissions updated with success!r  r  r  s     ri   r   z%UpdateDataLayerPermissions.form_validO  r  rs   N)r~   r   r   rN   r   r  r  r   rl   rs   ri   r  r  E  sA        EL5 5 5Q Q Q Q Qrs   r  c                       e Zd ZeZd ZdS )PictogramJSONListc                 r    d t           j                                        D             }t          |          S )Nc                     g | ]	}|j         
S rl   )ra  )r  r_   s     ri   r  z8PictogramJSONList.render_to_response.<locals>.<listcomp>]  s    ;;;a16;;;rs   )pictogram_list)rQ   r   r   ry   )rf   rL  r  r  s       ri   rS  z$PictogramJSONList.render_to_response\  s5    ;;9#4#8#8#:#:;;;#7;;;;rs   N)r~   r   r   rQ   r   rS  rl   rs   ri   r  r  Y  s(        E< < < < <rs   r  c                    t          t          j                              t          d          z
  }t          j                            dd          }t          t          j        	                    d                              dd                    }t          t          j
        j        j                            d	d                    }t          t          j        j        j                            d	d                    }t          |          |z
  |z
  |z
  }t          di t          t          j                                        t          j        	                    |
                                          t          j                                        t          j        	                    |                                          t"          j        	                    t          j                                                              t'          |          t'          |          t'          |          t'          |          d
S )N   )daysr   Tr   F)owner__isnullr   user_id)modified_at__gt)last_login__gt)expire_date__gt)
rO  
maps_countmaps_active_last_week_countusers_countusers_active_last_week_countactive_sessionsowners_counteditors_countmembers_countorphans_countrl   )r1   r   nowr   r   r   r   setrP   r   r   throughrS   r   ry   r@   r   r   utcnowlen)ra   	last_weekr   ownersr   r   orphanss          ri   statsr(  f  s   8<>>**YA->->->>IL$$T$55E//;;G$;OO F #+%-99)$9OOPPG$*$,888NNOOG%jj6!G+g5G  +++--+.;+=+= ) ,> , ,egg<--//,0L,?,?( -@ - -egg&55 ( 1 1  6    eggKK \\ \\ \\!
 
  rs   c                       e Zd ZdZdS )DesignSystemzumap/design_system.htmlNr   rl   rs   ri   r*  r*    s        -MMMrs   r*  iQ T)rq  	immutabler   c           
      z    t          di dt          j        d          dddt          j        d          dddgiS )	Niconszumap/favicons/icon-192.pngz	image/png192x192)srcr\  sizeszumap/favicons/icon-512.png512x512rl   )ry   r   rY  r  s    ri   webmanifestr2    sm        .23OPP'&  /23OPP'& 
  rs   c                 >    t          |            t          d          S )N/)	do_logoutr(   r  s    ri   r   r     s    g$$$rs   c                   &     e Zd ZdZdZ fdZ xZS )LoginPopupEndzI
    End of a login process in popup.
    Basically close the popup.
    zumap/login_popup_end.htmlc                     | j         j                            t                    }|t          j        v rt          t          d                    S  t                      j        |i |S )Nr   )	ra   r  rc   r   r   "DEPRECATED_AUTHENTICATION_BACKENDSr(   r-   rn   )rf   r{   rq   backendrr   s       ri   rc   zLoginPopupEnd.get  s[    ,&**+>??hAAA'(?(?@@@uww{D+F+++rs   )r~   r   r   __doc__r   rc   r   r   s   @ri   r7  r7    sI         
 0M, , , , , , , , ,rs   r7  )rC  ra  r  rert  rD  r   r   http.clientr   r   pathlibr   smtplibr   urllib.errorr	   r
   urllib.parser   r   urllib.requestr   r   django.confr   django.contribr   django.contrib.authr   r   r   r5  django.contrib.gis.measurer   django.contrib.postgres.searchr   r   django.contrib.sessions.modelsr   "django.contrib.staticfiles.storager   django.core.exceptionsr   django.core.mailr   django.core.paginatorr   r   r   django.core.signingr   r   r    django.core.validatorsr!   r"   django.httpr#   r$   r%   r&   r'   r(   r)   django.middleware.gzipr*   django.shortcutsr+   django.urlsr,   r-   r.   django.utilsr/   django.utils.encodingr0   django.utils.timezoner1   django.utils.translationr2   r   django.views.decorators.cacher3   django.views.decorators.httpr4   django.views.genericr5   r6   r7   django.views.generic.baser8   django.views.generic.detailr9   django.views.generic.editr:   r;   r<   r=   django.views.generic.listr>   rX  r@   formsrA   rB   rC   rD   rE   rF   rG   rH   rI   rJ   rK   rL   rM   modelsrN   rO   rP   rQ   rR   rS   rT   utilsrU   rV   rW   rX   rY   rZ   r   compilerw  ru  r\   r   r   r   as_viewr  r   aboutr   r   r   r   r   r   r   	user_mapsr  
user_starsr
  r  r%  r  r.  r  r8  user_downloadrU  showcaser~  r  
ajax_proxyry   r  r  r  r  r  rE  rL  r\  ra  rg  rk  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r(  r*  design_systemr2  r7  rl   rs   ri   <module>rj     s   				      				   ( ( ( ( ( ( ( ( " " " " " "             ! ! ! ! ! ! , , , , , , , , - - - - - - - - 0 0 0 0 0 0 0 0             # # # # # # C C C C C C C C 3 3 3 3 3 3 ( ( ( ( ( ( D D D D D D D D 2 2 2 2 2 2 B B B B B B 3 3 3 3 3 3 & & & & & & H H H H H H H H H H E E E E E E E E E E @ @ @ @ @ @ @ @                  3 2 2 2 2 2 . . . . . . 6 6 6 6 6 6 6 6 6 6 $ $ $ $ $ $ - - - - - - , , , , , , 1 1 1 1 1 1 7 7 7 7 7 7 4 4 4 4 4 4 ? ? ? ? ? ? ? ? ? ? 2 2 2 2 2 2 6 6 6 6 6 6 R R R R R R R R R R R R . . . . . .                                    N M M M M M M M M M M M M M M M M M                ~ RZ 
 - ! ! ! ! ! ! ! !H    f   (
 
 
 
 
>< 
 
 
D ||~~& & & & &D & & & 		 	 	 	 	j 	 	 	( ( ( ( ( ( ( (0( ( ( ( ( ( ( ( 	2 	2 	2 	2 	2
 	2 	2 	22 2 2 2 2* 2 2 2 ""$$2 2 2 2 2~z 2 2 24 	+ + + + + + + +   
2 2 2 2 2~z 2 2 2&       "- - - - -^\?K - - -, 
		2 2 2 2 2NJ 2 2 22 &&((    :{   6 $$&&> > > > >4 > > >8 !!  2. . . . . . . .b   
M M M
 
 
 
 
 
 
 
"/ / / / / / / /u u u u u\ u u up       "F< F< F< F< F<n.
 F< F< F<R    *    / / / / / / / /dV V V V VW V V V    ^\              !#3\:   :4 4 46
 
 
 
 
!#3\: 
 
 
 Q Q Q Q Q,j Q Q Q0& & & & & & & & 
  
  
  
  
$h  
  
  
FO O O O O
 O O O(       :
 
 
 
 
$ 
 
 
    ,       ,   <5 5 5 5 5N 5 5 5p" " " " "} " " "4    '   .J J J J J' J J JZK K K K Kj K K KC C C C C C C CQ Q Q Q Q!2J Q Q Q(< < < < < < < <  >. . . . .< . . . $$&& |tDAAA  BA &% % %
, , , , ,L , , , , ,rs   