o
    %elj                    @   s  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Zd dlZd dlZd dl	m
Z
 d dlZd dlmZmZmZ d dlmZ d dlmZ d dl	mZ d dlmZmZmZ d dlmZ d d	lmZ d d
lmZ d dlm Z  d dl!m"Z" d dl#m#Z#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l0m1Z1 d dl2m3Z3m4Z4 d dl5Z5d dl6m7Z7m8Z8 d dl9m:Z: d dl;m<Z< d dl=m>Z> d dl,m?Z? ddl@mAZAmBZBmCZCmDZDmEZEmFZFmGZGmHZHmIZImJZJmKZKmLZLmMZMmNZNmOZO ddlPmQZQmRZRmSZSmTZTmUZUmVZVmWZWmXZXmYZYmZZZm[Z[m\Z\m]Z]m^Z^m_Z_m`Z`maZambZbmcZcmdZdmeZemfZf d dlgmhZh d dlimjZj d dl	mkZk d d llmmZm d d!lnmoZo dd"lpmqZq d d#lrmsZsmtZtmuZumvZvmwZwmxZx d d$lymzZz d d%l{m|Z| d d&l}m~Z~ d d'l{mZ d d(l2mZ d dlZd dlZd d)lgmZ d dlZd d*lmZ eh emd+d, Zeh emd-d. Zd/d0 Zd1d2 Zeh d3d4 Zeed5d6 Zd7d8 Zekeh d9d: Zd;d< Zd=d> Zd?d@ ZdAdB ZdCdD ZdEdF ZdGdH ZdIdJ ZdKdL ZedMdN ZdOdP ZdQdR ZdSdT Z	 dUdV Zeh eedWdX Zeh eeddZd[Zdd\d]Zdd^d_Zeh d`da Ze
dbdc Zeddde Zdfe_dgdh Zdidj Zdkdl Zdmdn Zdodp Zdqdr Zdsdt Zdudv Zdwdx Zdydz Zd{d| Zd}d~ Zdd ZdddZdd Zdfe_dd Zdd Zdd Zdd Zdd Zdd Zdd Zdd Zdd Zdfe_dddZdfe_dd Zdd Zdfe_dddZdfe_dddZdfe_dd Zdfe_dddZdfe_dd Zdfe_dd Zdfe_dd Zdd Zdd Zdd Zdd Zdd Zdd Zdd Zdd Ze1jfddZdd ZАdddZddÄ Zddń ZddǄ ZddɄ Zdd˄ Zdd̈́ Zdfe_ddτ Zdfe_eee+١ dde1j d fddӄZdfe_ddՄ Zddׄ Zeh eddل Zdfe_eee+١ eh eddۄ Zdfe_dd݄ Zdd߄ Zeee+١ eh edd Zdfe_dd Zdd Zeh dd Zdfe_e+١ dd Zdfe_dd ZdddZdd ZdddZdd ZdddZdd Zdd ZdddZdddZdd Zd d ZdddZdfe_dddZdfe_ekeh dddZdfe_e+١ dd	 Zdfe_e+١ d
d Zdd Zdd ZdddZdd Zdfe_G dd dZekeh dd Zdfe_e+١ dd Zdd Zekeh dd Z dfe _eh d d! Zekeh ej d"d# Zdfe_ekeh d$d% Zekeh d&d' Zd(d) Zdfe_d*d+ Zdfe_eh eed,d- Zdfe_ekeh d.d/ Zdfe_dd0d1Z	dfe	_dd2d3Z
dd4d5Zd6d7 Zekeh ed8d9 Zdd:d;Zdd<d=Zdfe_d>d? Zdfe_d@dA ZdBdC Zeh edDdE Zdfe_dFdG ZdHdI ZddJdKZekeh ddLdMZdfe_ddNdOZddPdQZe1jfdRdSZdTdU ZdVdW Zeh dXdY Zeh dZd[ Zd\d] Z d^d_ Z!d`da Z"e#dbZ$dcdd Z%dedf Z&dgdh Z'didj Z(eh eedkdl Z)eh eedmdn Z*dodp Z+dqdr Z,dsdt Z-dudv Z.dwdx Z/eh eedydz Z0eh eed{d| Z1eh eed}d~ Z2ekeh eedd Z3G dd dZ4dd Z5dd Z6dd Z7ekeh dd Z8dfe8_ekeh dd Z9dfe9_ekeh dd Z:dfe:_ekeh e+١ dd Z;dfe;_ekeh dd Z<eeekeh dd Z=dfe=_eee+١ eh edd Z>dfe>_eeeh eke+١ dd Z?dfe?_eeekeh e+١ edd Z@dfe@_eeekeh e+١ edd ZAdfeA_eeekeh e+١ edd ZBdfeB_eeeh edddZCdfeC_ekeh edd ZDdfeD_ekeh dd ZEdd ZFekeh dd ZGdS (      N)csrf_exempt)runcheck_outputCalledProcessError)
whitespace)logout)csrf_protect)getFirebaseInstancefirebaseClientToken
push_value)myutils)user_logged_out)receiver)deepcopy)serializers)datetime	timedelta)timezone)relativedelta)IntegrityErrortransaction)BadHeaderError)SMTPException)settings)HttpResponseHttpResponseRedirect)get_object_or_404render)reverse)	ErrorList)User)	send_mail   )NodeEdgeFriendMap_desc	MapmemberMap_access_changedUserProfileWhosViewingMapNodeCommentVoteClientPermissionWhosLoggedIn	ContactUsMapPathEndpointsColors)ContactUsFormOpenMapFormNewNodeFormNewTunnelNodeFormNodeCommentForm
NewMapFormDeleteMapFormFriendTableUserSelectTableNotifyUsersFormSearchAllUsersFormMapSettingsFormAlterEdgeFormAlterMapFormFriendDefineFormMyAccountFormVoteFormFileUploadFormValidateNodeFormValidateEdgeFormConfirmCancelAccountFormValidateMapForm)login_required)verified_email_required)ensure_csrf_cookie)staff_member_required)modelformset_factory)tooltips)PermissionDeniedObjectDoesNotExistFieldDoesNotExist
FieldErrorValidationErrorSuspiciousOperation)defaultdict)F)RequestConfig)Q)JsonResponse)user_passes_test)pprintc              
   C   sZ   ddl m} z||  tdddW S  ty, } ztt|ddW  Y d }~S d }~ww )Nr   )initPermissionsTableSuccess   status  )ideatree.utilsr[   initPermsTabler   	Exceptionstr)requestr[   err rg   +/var/www/ideatree/wsgi/../ideatree/views.py	initPermsF   s   
ri   c              
   C   sX   zddl m} |  tdddW S  ty+ } ztt|ddW  Y d }~S d }~ww )Nr   )importColorTabler\   r]   r^   r`   )ra   rj   importColorsr   rc   rd   )re   rj   rf   rg   rg   rh   
initColorsR   s   rl   c                 C   s   | j tjk }| r|S dS NF)usernamer   GUEST_USERNAME)user	not_guestrg   rg   rh   not_guest_useri   s   rr   c                 C   s   	 dS NTrg   re   rg   rg   rh   showOutlines   s   ru   c                 C   s`   z+t | jd }t t| j d }tjj|d	  tjj
||d tdddW S     )N_auth_user_idmapIduser_id)ry   currentmap_idr\   r]   r^   )intsessionjsonloadsbodydecoder.   objectsfilterdeletecreater   )re   userIdrw   rg   rg   rh   incrementViewersx   s   r   c                 K   s2   z|d }t jj|d  tdddW S     )Nrp   rp   r\   r]   r^   )r.   r   r   r   r   )senderkwargsrp   rg   rg   rh   decrementViewers   s   r   c              
   C   sn   zt d}tjsdnd}|tjtj|d}t| d|W S  ty6 } ztt	|ddW  Y d }~S d }~ww )N@B F)enableGoogleAnalyticswhatnodeiscalledwhatagraphiscalled	randomNumz!ideatree/networkGraphLanding.htmlr`   r^   )
random	randranger   DEBUGWHAT_A_NODE_IS_CALLEDWHAT_A_GRAPH_IS_CALLEDr   rc   r   rd   )re   r   r   contextrf   rg   rg   rh   index   s   
r   c              
   C   s   z9t jdu r+t jdu rtdtjd tt jd}nt jdur+tdtjd tt jd}|	 }|
  t|ddW S  tyM } ztdtt d }~w tyf } ztt|d	d
W  Y d }~S d }~ww )NTz3Sending DEVELOPMENT Firebase credentials to client.filerz2Sending PRODUCTION Firebase credentials to client.ztext/javascriptcontent_typeFileNotFoundError:r`   r^   )r   USE_FIREBASEUSE_DEVEL_FIREBASE_SITEprintsysstderropen,FIREBASE_DEVELOPMENT_CLIENT_CREDENTIALS_PATH+FIREBASE_PRODUCTION_CLIENT_CREDENTIALS_PATHreadcloser   FileNotFoundErrorrc   rd   msg)re   fpcontentrf   rg   rg   rh   firebaseClientCredentials   s$   


r   c              
   C   R   zt jt jd}t| d|W S  ty( } ztt|ddW  Y d }~S d }~ww )Nr   whatanodeiscalledzideatree/features.htmlr`   r^   r   r   r   r   rc   r   rd   re   r   rf   rg   rg   rh   features      r   c              
   C   r   )Nr   zideatree/shared_or_private.htmlr`   r^   r   r   rg   rg   rh   shared_or_private   r   r   c              
   C   V   zt jt jt jd}t| d|W S  ty* } ztt|ddW  Y d }~S d }~ww )N)r   r   what_an_edge_is_calledz!ideatree/advanced_but_simple.htmlr`   r^   )r   r   r   WHAT_AN_EDGE_IS_CALLEDr   rc   r   rd   r   rg   rg   rh   advanced_but_simple      r   c              
   C   N   zdt ji}t| d|W S  ty& } ztt|ddW  Y d }~S d }~ww )Nr   zideatree/link_or_analyze.htmlr`   r^   r   r   r   rc   r   rd   r   rg   rg   rh   link_or_analyze      
r   c              
   C   B   zt | dW S  ty  } ztt|ddW  Y d }~S d }~ww )Nzideatree/videos.htmlr`   r^   r   rc   r   rd   re   rf   rg   rg   rh   videos      r   c              
   C   r   )Nr   zideatree/video_how_to_use.htmlr`   r^   r   r   rg   rg   rh   video_how_to_use   r   r   c              
   C   r   )Nr   z(ideatree/video_for_project_managers.htmlr`   r^   r   r   rg   rg   rh   video_for_project_managers   r   r   c              
   C   r   )Nzideatree/research.htmlr`   r^   r   r   rg   rg   rh   research   r   r   c              
   C   r   )Nzideatree/presskit.htmlr`   r^   r   r   rg   rg   rh   press   r   r   c              
   C   s   z&| j  r| j d nd }|d u}|tjd}| jdkr$	 t| d|W S W d S  ty@ } ztt|ddW  Y d }~S d }~ww )Nrv   )loggedInideatrees_emailGETzideatree/contactus.htmlr`   r^   )	r|   keysr   EMAIL_OF_IDEATREEmethodr   rc   r   rd   )re   r   r   r   rf   rg   rg   rh   	contactus  s   
r   c              
   C   r   )Nzideatree/terms-of-service.htmlr`   r^   r   r   rg   rg   rh   terms_of_service(  r   r   c              
   C   sR   zddddd}t | d|W S  ty( } ztt|ddW  Y d }~S d }~ww )	NStripezhttps://stripe.com/gb/privacyzGoogle Firebasez+https://firebase.google.com/support/privacy)paymentprocessor&paymentprocessor_privacy_statement_urlreal_time_dbreal_time_db_privacy_statmentzideatree/privacystatement.htmlr`   r^   r   r   rg   rg   rh   privacystatement0  s   r   c              
   C   r   )Nzideatree/idea_selection_2.pdfr`   r^   r   r   rg   rg   rh   idea_selection_paper=  s   r   c              
   C   s  zfd}d}t jt j }g }|dt jdgt jdggf |dt jdgt jdggf |dt jdgt jdggf |dt jdgt jdggf |dt jdgt jdggf |d	t jdgt jdggf |d
t jdgt jdggf |dt jdgt jdggf |dt jdgt jdggf |dt jdgt jdggf |dt jdgt jdggf |dt jdgt jdggf |dt jdgt jdggf |dt j d t jdgt jdggf |dt j d t jt jgt jt	t j
d ggf |dt j d t j d t jt jgt jt	t jggf |dt jdgt j|ggf |dt jdgt j|ggf |dt jdgt jdggf |dt jdgt jd ggf |t jt j|d!}t| d"|W S  ty } ztt	|d#d$W  Y d }~S d }~ww )%NzIncluded for early adoptersz$By request.  Additional fee applies.z*Real-time collaboration (not just sharing)TzCollapsible brancheszView graph as text outlinez%Create tunnels between related graphszLink nodes to websiteszShortest path analysisz!Free publishing to public websitezExcel import/exportz%Cloud-based, no installation requiredzAutomatic free updatesVotingzChat boxz!Email notifications to co-editorszComments on zs:z
Number of zs: z owned, plus unlimited sharedzs per z: zAdditional analysis functionsFz Additional import/export formatsSupportz"How-to newsletter, contact us formzRHow-to newsletter, contact us form, plus initial half-hour one-on-one consultationBrowsersz?Latest versions of Chrome, Brave, Firefox, or Edge (not Safari)Same)r   r   premium_account_pricefree_trial_dayszideatree/presignup.htmlr`   r^   )r   FREE_ACCT_TRIALPERIOD_DAYSFREE_ACCT_GRACEPERIOD_DAYSappend	FREE_ACCTPREMIUM_ACCTr   r   FREE_USER_NUM_MAPS_ALLOWEDrd   PREMIUM_USER_NUM_MAPS_ALLOWEDMAX_FREE_ACCOUNT_NODES_PER_MAP!MAX_PREMIUM_ACCOUNT_NODES_PER_MAPPREMIUM_ACCT_PRICEr   rc   r   )re   special_msg	extra_feer   r   r   rf   rg   rg   rh   	presignupO  s>   (4:r   c           	   
   C   s  t jjt| jd d}|jtjtjtj	|j
|j|jd}z| jds5t }|d|i t| d|W S t| j}|d|i | sPt| d|tj	dW S |jd d	ks]|dd
 |jd tjksk|dd |jrut| d|W S tjj|d}|jd }|rd	|_|  d }|jtjtjfv }|r|j}|stdt|j t | ||d t!| W S  t"y } zt#dt| t$j%d t&dt| ddW  Y d }~S d }~w t'j(j)y } zt#dt| t$j%d t&dt| ddW  Y d }~S d }~w t"y& } zt#dt| t$j%d t&dt| ddW  Y d }~S d }~w tyM } zt#dt| t$j%d t&dt| ddW  Y d }~S d }~ww )Nrv   pk)rn   r   inactiveUserDeletionDelayr   email
first_name	last_name	submittedformzideatree/cancelAccount.htmlr   r   iHaveReadAndUnderstoodTzThis is required.confirmcancelz*The typed phrase did not match the prompt.r   deleteDataInNonOwnedMapsz7No Stripe customer id found in IdeaTree UserProfile id:)stripecustomeridpaidAccountzCancel account error: r   r`   r^   r]   )*r    r   getr{   r|   rn   r   PAYMENT_PROCESSOR_NAME!INACTIVE_USER_DELETION_DELAY_DAYSr   r   r   r   POSTrF   updater   is_validcleaned_data	add_errorCONFIRM_DELETE_PHRASEerrorsr)   deletegloballysaveaccounttypeREGULAR_ACCTr   r   rc   rd   idcancelAccountPart2signoutr   r   r   r   r   stripeerrorInvalidRequestError)	re   rp   r   r   user_profileglobalDeleter   r   rf   rg   rg   rh   cancelAccounts  s^   "


    r  Fc              
   C   s  z_|rY|rYt jt_tttj|}||d krU|d d dkr/t	d|d d  dd	W S |d d d
kr?t
d|d  |d d d
 d }tjj|ddd W d S t
dt|  W d S  tyl } z d }~w tjjyz } z d }~w t
y } z d }~ww )Nr  subscriptionstotal_countr"   ziError: multiple subscriptions found.  Please contact your administrator. Reference: your IdeaTree id is: metadatary   r`   r^   r   z=No Stripe subscription found. Reference: Stripe customer ID: dataT)prorateinvoice_nowz3cancelAccountPart2: mismatched Stripe customer Ids.)r   STRIPE_API_KEYr  api_keyr}   r~   rd   Customerretriever   rc   Subscriptionr   cancelAccountPart3r   r  r	  )re   r   r   customersubscriptionidrf   rg   rg   rh   r    s.   r  c              
   C   s  zd| j v rt| j d nd }|r tjj|d}tjj|d}n|r5|jjj}tjj|d}|j	}|j
}ntdt Y d|_|  tj|_|  tjj|djtjd |jrtd	tjd
 tjj|djtjd tjj|djtjd tjj|djtj d ntdtjd
 W d    n1 sw   Y  tdt!| d t!|j
 tjd
 W d S  ty } ztdt!| tjd
 t|d }~ww )Nrv   r   r   )r   zTcancelAccountPart3: Not enough data in either request or event to determine user Id.F)ownerr^   zDeleting global data.r   z No global deleting will be done.z(Successfully cancelled account of user: z id:zCancelAccountPart3: )"r|   r{   r    r   r   r)   r  objectr  rp   r  rc   r   atomic	is_activer  r   r   r  r&   r   r   MAP_DELETEDr   r   r   r   r#   NODE_DELETEDr+   NODE_COMMENT_DELETEDr$   EDGE_DELETEDrd   )re   eventr   rp   userProfileeventCustomerrf   rg   rg   rh   r    s>   

*r  c              
   C   sB   zt | dW S  ty  } ztt|ddW  Y d }~S d }~ww )Nzideatree/upgradeSuccess.htmlr`   r^   r   )re   checkoutSessionIdrf   rg   rg   rh   upgradeSuccess  s   r'  c              
   C   s   z8t | jd }tjj|d}tjj|d}|j}tjt	_
t	jjjdddg|tjddg|d	d
}t|jddW S  tyR } ztt|ddW  Y d }~S d }~w tyk } ztt|ddW  Y d }~S d }~ww )Nrv   r   rx   zHhttps://www.ideatree.net/ideatree/upgradeSuccess/{CHECKOUT_SESSION_ID}/'z&https://www.ideatree.net/ideatree/map/cardr"   )pricequantitysubscription)success_url
cancel_urlpayment_method_typesclient_reference_id
line_itemsr  modei/  r^   r`   )r{   r|   r    r   r   r)   r   r   r  r  r  checkoutSessionr   STRIPE_PRICE_IDr   urlr   r   rd   rc   )re   r   rp   r$  stripeCustomerIdstripesessionrf   rg   rg   rh   upgrade  s.   
r8  c              
   C   s  dd l }| j}d }zztjt|tj}W n ty/ } zt	ddW  Y d }~W S d }~ww |j
dkr|d d }|jdkr|d}|d	}|rPt|nd }tjj||d
}|tjtjd}	|	 D ]
\}
}t||
| qf|  td| d t|	 tjd n|j
dkr|jt| |fd}|  n	 t	ddW S  ty } zt	dt| dd W Y d }~d S d }~w tjjy } zt	dt| ddW  Y d }~S d }~w tjy } zt	t|ddW  Y d }~S d }~w t y } zt	t|ddW  Y d }~S d }~w tjj!y( } zt	t|ddW  Y d }~S d }~w t"yB } zt	t|ddW  Y d }~S d }~ww )Nr     r^   zcheckout.session.completedr  r  paidr  r/  )r   ry   )r   r  nummapsallowedzMSuccessful IdeaTree-side handling of Checkout payment for Stripe customerid: z. Updated user with: r   zcustomer.subscription.deleted)targetargsr]   zSuspiciousOperation: i  r`   )#	threadingr   r  Eventconstruct_fromr}   r~   r  
ValueErrorr   typepayment_statusr   r{   r)   r   r   r  r   itemssetattrr  r   rd   r   r   Threadr  startr  SignatureVerificationErrorDoesNotExistr   r	  rc   )re   r>  payloadr#  echeckout_sessionr   stripeClientReferencer$  newValskeyvaluethrf   rg   rg   rh   stripe_webhook%  s^   





" rR  c              
   C   s  zddl m}m} ddlm} || tjtjd}|d u r td|| | t	j
jtj|dd d }|sAt	j
jtj|dtj d	}|jd
ddd }|| jd< |jdddd }|sft	j
j|djtjd td|i}| rutdW S tdt|j ddW S  ty }	 zdt|	i}
t| d|
ddW  Y d }	~	S d }	~	w ty }	 zd}t|	}t||W  Y d }	~	S d }	~	w ty }	 ztdt|	 ddW  Y d }	~	S d }	~	ww )Nr   )authenticatelogin)redirect)rn   passwordzFailed login for guest user.)mapnamer  r"   zScratch pad )rW  r  descriptionr  Tflatrw   	nodesleftr   r[  z/ideatree/map/Invalid entry:r`   r^   r  showWarning.htmlapplication/htmlr   X  System error:)django.contrib.authrS  rT  django.shortcutsrU  r   ro   GUEST_PASSWORDrc   r&   r   r   DEMO_MAPNAMEr   r   values_listr|   r   r   r3   r   r   r   rd   r   Warningr   rN   makeResponse)re   rS  rT  rU  	guestuserdemomaprw   r[  r   rf   r   r_   r   rg   rg   rh   demoMaps  s@   


 rk  Tc              
   C   r   )Nr   whataclusteriscalledr   z!ideatree/help/commandSummary.htmlr`   r^   r   r   WHAT_A_CLUSTER_IS_CALLEDr   r   rc   r   rd   r   rg   rg   rh   commandSummary  r   rp  c              
   C   r   )Nr   r   zideatree/help/quickStart.htmlr`   r^   r   r   r   r   rc   r   rd   r   rg   rg   rh   quickStartHelp  r   rs  c              
   C   r   )Nrq  zideatree/help/prettify.htmlr`   r^   rr  r   rg   rg   rh   prettifyHelp  r   rt  c              
   C   r   )Nrm  r   r   z#ideatree/help/prettifyCircular.htmlr`   r^   r   ro  r   r   r   rc   r   rd   r   rg   rg   rh   prettifyCircularHelp  r   rw  c              
   C   r   )Nru  z!ideatree/help/prettifyRadial.htmlr`   r^   rv  r   rg   rg   rh   prettifyRadialHelp  r   rx  c              
   C   r   )Nru  z!ideatree/help/prettifySpring.htmlr`   r^   rv  r   rg   rg   rh   prettifySpringHelp  r   ry  c              
   C   r   )Nrl  zideatree/help/clustering.htmlr`   r^   rn  r   rg   rg   rh   clusteringHelp  r   rz  c              
   C   r   )Nr   zideatree/help/teams.htmlr`   r^   r   r   rg   rg   rh   	teamsHelp  r   r{  c              
   C   r   )Nr   zideatree/help/notifyTeam.htmlr`   r^   r   r   rg   rg   rh   notifyTeamHelp  r   r|  c              
   C   r   )N)edge_default_weightr   z ideatree/help/edgeWeighting.htmlr`   r^   )r   DEFAULTEDGE_COSTr   r   rc   r   rd   r   rg   rg   rh   edgeWeightHelp  s   r  c              
   C   r   )Nrq  z'ideatree/help/conceptVsMindMapping.htmlr`   r^   rr  r   rg   rg   rh   conceptVsMindHelp  r   r  c              
   C   r   )Nrq  zideatree/help/exporting.htmlr`   r^   rr  r   rg   rg   rh   
exportHelp  r   r  c              
   C   r   )NzsaveExplain.htmlr`   r^   r   r   rg   rg   rh   saveExplain  s   r  c              
   C   sd   zt j}| r|| W S |W S  ty  } ztt|d }~w ty1 } ztt|d }~ww N)r   NODE_SHAPESr   
IndexErrorrg  rd   	TypeError)getIndexForshapesrf   rg   rg   rh   
nodeShapes  s   r  c                 C   s*   zt j|j|ddj| dW S     )NTrY  user__id)r)   r   select_relatedrf  r   )userIDfieldrg   rg   rh   lookup_user_info  s    r  c                 C   s:   zt jj|ddj| d}|s|dkr|W S W d S     )NTrY  r   r   )r#   r   rf  r   )nodeIdr  inforg   rg   rh   lookup_node_info#  s   r  c                 C   s2   zt jj| ddj|d}|r|W S W d S     )NTrY  )	fieldname)r#   r   valuesr   )r  rP  r  rg   rg   rh   lookup_node_by_field.  s   r  c                 C   s,   zt jj|ddj| dW S  ty    w )NTrY  r   )r&   r   rf  r   rc   )rw   r  rg   rg   rh   lookup_map_info;  s
   r  c                 C   s6   zt jj| djdi ||i W dS  ty    w )Nr  Trg   )r&   r   r   r   rc   )rw   r  fieldvalrg   rg   rh   set_map_propertyC  s   r  c                 C   s,   zt jj| tjddW S  ty    w )N)	initiatorr_   	friend_id)r%   r   r   r   FRIEND_ACCEPTEDr  rc   r  rg   rg   rh   
friends_ofJ  
   r  c                 C   s(   zt jj| tjdjW S  ty    w )N)ry   r_   )r%   r   r   r   FRIEND_INVITEDr  rc   r  rg   rg   rh   friends_invitedP  s
   r  c                 C   s$   z	t jj| |dW S  ty    w )N	member_idofmap_id)r'   r   r   rc   )r  rw   rg   rg   rh   map_membershipV  
   r  c                 C   s0   z| j drt| j d W S ttj    )Nrw   )r|   r   r{   rg  r   PLEASE_OPEN_GRAPH_PROMPTrt   rg   rg   rh   currently_opened_map^  s   
r  c                 C   sV   z&t |  g }t| jd D ]	}||d  qt||vr$ttjW d S     )Naccessible_mapsr  )	update_mymap_listr}   r~   r|   r   r{   rN   r   PERMISSION_DENIED_PROMPT)re   rw   	mapIdListmapDictrg   rg   rh   have_map_accessk  s   
r  c                 C   sr   z0t jj| tjd}g }|D ]}|r||jj q|r"|| q||jj|jji q|W S  t	y8    w )Nofmapr_   )
r'   r   r   r   MAPMEMBERSHIP_ACTIVEr   memberr  rn   rc   )rw   idsOnly	asObjectsusersuserListrp   rg   rg   rh   all_map_membersz  s   r  c                 C   s,   z| t |v p|t | v W S  ty    w r  )r  rc   )userID1userID2rg   rg   rh   have_relationship  r  r  c                 C   s*   zt jj| tjd W S  ty    w )N)rW  r_   )r&   r   r   r   
MAP_ACTIVEexistsrc   )rW  rg   rg   rh   duplicate_mapname  
   r  created_datec                 C   s   zG|rt jj| djtjdjtjd W S |r3t jj| djtjdjtjdjtjd	|W S t jj| djtjdjtjd	|W S  t
yO    w )N)	ofmap__idr^   nodetype)r#   r   r   excluder   r   PROVISIONALcountCLUSTERorder_byrc   )rw   orderBy	countOnlyexcludeClustersrg   rg   rh   all_nodes_in_this_map  s   (4*r  c                 C   sZ   z(t jt|tjdt|tjdB  d}|r&|j	t
| jd dW S |W S     )Nr  r_   )mapmember__membermapmember__statusrW  rw   r   )r&   r   r   rW   r   r  r  distinctr  r  r{   r|   )re   thisUserexclude_currentallaccessiblerg   rg   rh   all_accessible_maps  s   .r  c              	   C   sz   z8t jjt| jd d}ttt| |	dddd| jd< ttt
jj|tjd	ddd| jd	< W d S     )
Nrv   r   r  rW  rX  r  r  r  
owned_maps)r    r   r   r{   r|   r}   dumpslistr  r  r&   r   r   r  )re   r  rg   rg   rh   r    s   &2r  c                 C   s~   z6t  t| d }|D ]'}tj|d  }|dkr3|dkr3|dkr3|dkr3|r3||kr3t| qW d S  ty>    w )Nz*.*r"   fbcgxlxdotgv)globrd   ospathsplitextlowerunlinkrc   )outputDirNameskipExtensionfilelistfilename	extensionrg   rg   rh   clearOutputFiles  s"   
r  c                 C   s>   zt jd t|  }tj|rt| W d S W d S     )Nz/user)r   MAP_DOWNLOAD_DIRrd   r  r  isdirshutilrmtree)r  mainBackupDirrg   rg   rh   eraseMapBackupDirs  s   r  c                 C   4   zt | }tj|rt| W d S W d S     r  )make_absoluteExportDirr  r  r  r  r  )rw   mainExportDirrg   rg   rh   eraseExports     r  c                 C   s:   zt | |d kr| d | d W S | W S  ty    w )N   ...)lenrc   )labellabelLengthrg   rg   rh   
shortLabel  s
   (r  c                 C   s    zt | d W S  ty    w N/rd   rc   rw   rg   rg   rh   get_relativeOutfileDir)  s
   r  c                 C   &   z
t | t| | W S  ty    w r  )r  get_outfileNamerc   rw   suffixrg   rg   rh   get_relativeOutfilePath0  
   r  c                 C   s$   z	dt |  d W S  ty    w )Nzpull/r  r  r  rg   rg   rh   get_outfileURL7  r  r  c                   C   s   t jd t j d S r  )r   BASE_DIROUTPUTDIRNAMErg   rg   rg   rh   get_absoluteOutput_BASE_Dirname>  s   r  c                 C   s"   zt  t|  W S  ty    w r  )r  r  rc   r  rg   rg   rh   get_absoluteOutfileDirC  s
   r  c                 C   *   zt | }|t| | W S  ty    w r  )r  r  rc   )rw   r   	outputDirrg   rg   rh   get_absoluteOutfilePathJ     r
  c                   C   s*   zt jd d d d W S  ty    w )Nr   DIRSr  )r   	TEMPLATESrc   rg   rg   rg   rh   get_absoluteTemplatesDirS  r  r  c                 C   r  r  )r  r  rc   )rw   r   	exportDirrg   rg   rh   get_absoluteExportPathZ  r  r  c                 C   s$   z	t | d | W S  ty    w N.r  r  rg   rg   rh   r  b  s
   r  c                 C   r  r  )make_absoluteOutfileDirr  rc   r  rg   rg   rh   make_absoluteOutfilePathk  r  r  c                 C   sb   z(|rt tj| }tj|t| d | W S tjtjt| t| d | W S  ty0    w r  )	make_absolutePublishDirr   PUBLISH_DIR_PATHr  r  joinrd   PUBLISH_DIRNAMErc   )rw   r   absolutepubDirrg   rg   rh   make_publishPathv  s   $r  c                 C   sr   z0t j| dd tj| tjtjB d t j| t	|}t j|dd tj|tjtjB d |W S  t
y8    w )NTexist_okmask)r  makedirsr   doWSGIPermissionsstatS_IRWXUS_IRWXGr  r  rd   rc   )mainPublishDirrw   mapSpecificPublishDirrg   rg   rh   r    s   r  c                 C   s   z?t  }ttdgdd}tj|dd t|tj t||d |t	|  }tj|dd t|tj t||d |W S     )Nzid -u wsgiuserTshellr  )
r  r{   r   r  r   chmodr"  r#  chownr  )rw   baseoutputDirr   second_level_output_dirrg   rg   rh   r    s   r  c                 C   sF   zt | tj }tj|dd t|tj |d W S  ty"    w )NTr  r  )	r  r   EXPORTS_DIRNAMEr  r   r*  r"  r#  rc   )rw   r  rg   rg   rh   r    s   
r  c                 C   s:   zt | tj }tj|dd t|tj |W S     )NTr  )r  r   IMPORTS_DIRNAMEr  r   r*  r"  r#  )rw   	importDirrg   rg   rh   make_absoluteImportDir  s   r1  c                 C   r  r  )r  r  r  r  r  r  )rw   r	  rg   rg   rh   remove_absoluteOutfileDir  r  r2  c                 C   sB   zt | }t|d }|D ]}t| qW d S  ty     w )Nz/*.*)r  r  r  r  rc   )rw   r  r  r   rg   rg   rh   clear_absoluteExportDir  s   r3  c                 C   s    zt jjd| d W d S     )NT)changedrp   )r(   r   update_or_creater   rg   rg   rh   set_map_access_changed  s   r6  z
A starter r  c           	      C   s  zt | }t| |d |d drtdtj d t| jd }|s,| jd d tj }t|r?d	| d
 tj d }t|| j	drJ| 	dsYt
|dtjkrVtj}ntj}tjj	|d}tjj||||d}tjj||d tt|j ttjj	|d t|  |jW S     )NnumMapsAllowed	ownedMapsr7  r8  zAllowable number of zs exceeded.rv   rn   z's starter zSorry, 'z#' is taken.  Please select another z name.editing_mapr  r   )rW  r  r[  rX  )r  r  )_mapsAllowedMetrics_mapNumLimitReachedrc   r   r   r{   r|   r  rg  r   r  r   r   r   r    r   r&   r   r'   r  r  r  r6  r  )	re   rW  rX  
mapMetricsr  promptallowedNodesr  newmaprg   rg   rh   makeMap  s.   rA  c                 C   sT   z%t | jd }tjj|dj}| jdrt| jd ng }||dW S     )Nrv   r  r  r9  )r{   r|   r)   r   r   r;  r}   r~   )re   r   r7  r8  rg   rg   rh   r;  !  s    r;  c                 C   s*   d| j v p| j d tjkpt||k}|S )N
is_studentrn   )r|   r   ro   r  )re   r7  r8  noMoreAllowedrg   rg   rh   r<  +  s   &r<  c           	   
   C   s"  zW| j ds3t|  t| }|d }|d }t| ||d}t }||||tjd}t| d|ddW S t| j }|	 rHt
| |jd	 |jd
 }||tjd}t| d|ddW S  tyw } zdt|i}t| d|ddW  Y d }~S d }~w ty } ztt|ddW  Y d }~S d }~ww )Nr   r7  r8  r9  )r   r7  r8  rC  r   znewmap.htmlr_  r   rW  rX  )r   rw   r   znewmapSuccess.htmlr  r^  r`   r^   )r   r   r  r;  r<  r7   r   r   r   r   rA  r   rg  rd   rc   r   )	re   r=  r7  r8  rC  r   r   rw   rf   rg   rg   rh   newMap0  s.   
rD  c           
   
      s  zt |  t| jd }t|   t| jd }dd |D } |vr)ttjt	 dd}|r6ttj
 fdd|D }|d tjtjd	}| jd
sXt| d|ddW S t| j}| rt ddD ]}t|j qgtjj djtjd tjj djtjd t  tt  t  | jd= t| d|ddW S |d|i t| d|ddW S  t y }	 zdt!|	i}t| d|ddW  Y d }	~	S d }	~	w ty }	 zdt!|	i}t| d|ddW  Y d }	~	S d }	~	w t"y
 }	 zt#t!|	ddW  Y d }	~	S d }	~	ww )Nrv   r  c                 S      g | ]}|d  qS r  rg   .0mrg   rg   rh   
<listcomp>Z      zdeleteMap.<locals>.<listcomp>Tr  c                    s    g | ]}|d   kr|d qS )r  rW  rg   rG  nr  rg   rh   rI  b       r   )rW  what_nodes_are_calledr   r   zdeleteMap.htmlr_  r   Fr   r^   r  rw   zdeleteMapSuccess.htmlr   r  r^  r`   )$r  r{   r|   r  r}   r~   rg  r   MUST_OWN_GRAPH_PROMPTr  DELETE_AFTER_GRAPH_EMPTY_PROMPTr   r   r   r   r   r8   r   r  r6  r  r&   r   r   r   r  r'   MAPMEMBERSHIP_DELETEDr  r  r  r2  rN   rd   rc   r   )
re   r   r8  owned_list_of_idsnumnodesrW  r   r   rp   rf   rg   r  rh   	deleteMapL  sP   



rV  c                 C   s   dS rs   rg   rt   rg   rg   rh   signout_firebase  s   rW  c                 C   s   z	t |  tdW S     )Nz/accounts/logout/)rW  r   rt   rg   rg   rh   r    s
   
r  c              
   C   s  zt | }t| jd }z
tjj||d}W n tjy'   tdtj	 d w i }| j
d}|dv r6dnd}|sm| jd	rE| jd	 nd }| jd
rR| jd
 nd }t||dd}|||tj	d}t| d|ddW S tjj|d}	t| j
|	d}| r|jdd}
tjj|d|
_|
  t| | | jd	 || jd
 d}t| d|ddW S ||tj	d t| d|ddW S  ty } zt|ddW  Y d }~S d }~w ty } zdt|i}t| d|ddW  Y d }~S d }~w ty } ztt|ddW  Y d }~S d }~ww )Nrv   )r   owner_idz0Sorry, you must be the original creator of this z to change its name.r   )1trueTrueTFrW  mapDescription)rW  rX  )initial)r   rW  rX  r   zeditMapnameAndDescription.htmlr_  r   r   instance)commit)rW  rw   r\  zeditMapnameSuccess.htmlr   r`   r^   r  r^  )r  r{   r|   r&   r   r   rI  rg  r   r   r   r7   r   r   r  r    r  updateMapSessionDatar   r   r   rd   rc   )re   rw   r   thisMapOwnedByThisUserr   r   rW  rX  r   r_  newFormNamerf   rg   rg   rh   editMapName  sN   
rd  c                 C   sv   z6t j}t| jd D ]'}t|d t|kr3|d }t||d kr,|d | d n|}|  W S qW dS     )Nr  r  rW  r  r  z[unknown map])r   MAPNAME_TRUNCATED_LENGTHr}   r~   r|   r{   r  )re   rw   lengthr  rW  rg   rg   rh   get_truncated_mapname  s   $
rg  c                 C   sZ   z(t | jd}t | jd}|t|d }|t|tj d }t||}||dW S     )Nregisterdatetrialperioddays)days)trialEndWarningTimetimeToExpiration)r  r  r   r   r   r   )ausernowTimerh  trialPeriodDaysrk  trialEndTimerl  rg   rg   rh   freeTrialDates  s   
rq  c              
   C   s  zt |  d| jvst| jd stg | jd< d| jv r%t  tdt| jd }tjj	|d}d| jvs@t| jd sDt
|  dtji}d| jvrd	}t|jd
tjkrt }t||}||d krs| j	dtjkrsd}|d jdk s|d jdk rdn|d j}|d|i t| jd }dd |D }	||	|t| jd d t| d|W S t| j}
|
 rt| |
jd  |
jd | jd< d|
jd  d }t| dd|iddW S tdt|
j ddW S  ty } zdt|i}t| d|ddW  Y d }~S d }~w ty* } zd }t|}t ||W  Y d }~S d }~w t!yF } ztd!t| ddW  Y d }~S d }~ww )"Nr  readOnlyz.Open Map not available for read only accounts.rv   r   r  r   rw   Fr  rk  rn   Trl  r   daysToExpirationc                 S   rE  r  rg   rF  rg   rg   rh   rI    rJ  zopenMap.<locals>.<listcomp>)r  showExpirationPromptmap_listzpickmap.html#r  zpickmapResult.htmlthisMapHashr_  r   r]  r`   r^   r  r^  r`  ra  )"r  r|   r}   r~   rd   r  rg  r    r   r   rA  r   r   r   r  r  r   r   nowrq  ro   rj  yearsr   r   r3   r   r  r  r   r   rN   rh  rc   )re   r  r  r   rt  rn  ftdrs  r  
owned_listr   rw  rf   r_   r   rg   rg   rh   openMap  sZ   



*
 r|  c                 C   sj   z0t jj|d}|j| jd< |j| jd< |jj| jd< tjj|jjdj	| jd< |j| jd< W d S     )Nr   r\  rW  	map_ownermap_owner_namerw   )
r&   r   r   rX  r|   rW  r  r  r    rn   )re   rw   mapObjrg   rg   rh   ra  (  s   ra  c                 C   sH   zt jd t|  d }tj|rdt|d W S W dS     )Nr  /public.jsonz
PUBLISHED z%c )	r   READ_ONLY_DIRECTORY_NAMErd   r  r  isfiler"  st_mtimestrftime)rw   publishedFilePathrg   rg   rh   getPublishedDateDescription8  s   r  c                 C   sr   z4|d krt td}d| }|d krt t }| s tddt | d t | d t |  d W S     )Nr   APIMissing mapId.z{"transactionId":"z
", "time":z
, "mapId":z, "changes":[)rd   r   r   r   	millisNowrc   )rw   transIDtimer   rg   rg   rh   makeTransactionHeaderJSOND  s   *r  c                 C   2   zg }| d | |  | | |W S     )NsetMapAttributer   )attrName	attrValueCMrg   rg   rh    makeSetMapAttributeChangeMessageW  s   


r  c                 C   s@   zg }| d | |  |r| | | | |W S     )NsetNodeAttributer  )r  r  r  r  rg   rg   rh   !makeSetNodeAttributeChangeMessaged  s   



r  c                 C   r  )NputNodeInClusterr  )r  	clusterIdr  rg   rg   rh   !makePutNodeInClusterChangeMessager     


r  c                 C   sJ   z |r| t fW S g }|d ||  || || |W S     NsetEdgeAttribute)
edgeParamsr   )edgeId	paramName
paramValueforGraphvizLayoutr  rg   rg   rh   makeAlterEdgeChangeMessage  s   




r  c                 C   s<   zg }| d | |  | | | | |W S     r  r  )r  r  r  r  rg   rg   rh   !makeSetEdgeAttributeChangeMessage  s   



r  c                 C   r  )N
removeEdger  )r  rw   r  rg   rg   rh   makeRemoveEdgeChangeMessage  r  r  c                 C   @   z|r| |fW S g }| d | |  | | |W S     )N
createNoder  )r  paramsr  r  rg   rg   rh   makeCreateNodeChangeMessageJSON  s   



r  c                 C   r  )N
createEdger  )r  r  r  r  rg   rg   rh   makeCreateEdgeChangeMessageJSON  s   



r  c                 C   s  zU|st dt| | t|}tjj|d}|j}|j}|j}|j	
 }|j}|j}	|j}
|j}|j}tjj|djj}d| d }|d| d 7 }|d| d 7 }|d| d 7 }|dtj d	 7 }|d
| jd  d	 7 }|d| d	 7 }|dt| d 7 }|d|	 d	 7 }|dt|
 d 7 }|dt| d 7 }|d| d	 7 }|dtj d	 7 }|d| jd  d 7 }|dtj d	 7 }|dttj d	 7 }|dtj d	 7 }|dttj d 7 }|dttj d	 7 }|dtj d	 7 }|dtj d	 7 }|d7 }|d7 }|dtj d	 7 }|d tj d	 7 }|d!7 }|d"| d	 7 }|d#tj d	 7 }|d$tj d	 7 }|d%tj  d	 7 }|d&| d	 7 }|d'tj!tj"  d( 7 }|W S     ))Nr  r   z  ["setMapAttribute", "mapname","z"], z$ ["setMapAttribute", "description","z! ["setMapAttribute", "mapOwner","z  ["setMapAttribute", "bgcolor","z$ ["setMapAttribute", "orientation","z"],z) ["setMapAttribute", "defaultNodeOwner","rn   z) ["setMapAttribute", "defaultNodeStyle","z( ["setMapAttribute", "defaultNodeShape",],z- ["setMapAttribute", "defaultNodeFillcolor","z) ["setMapAttribute", "defaultNodeHeight",z( ["setMapAttribute", "defaultNodeWidth",z( ["setMapAttribute", "defaultNodeType","z) ["setMapAttribute", "defaultNodeLabel","z% ["setMapAttribute", "currentUserID",rv   z, ["setMapAttribute", "defaultNodePencolor","z( ["setMapAttribute", "defaultEdgeCost","z) ["setMapAttribute", "defaultEdgeColor","z, ["setMapAttribute", "defaultEdgeArrowhead",z, ["setMapAttribute", "defaultEdgePenwidth","z, ["setMapAttribute", "defaultVotableLabel","z0 ["setMapAttribute", "defaultVotableFillcolor","zw ["setMapAttribute", "defaultVotableSliderParameters", {"value":5, "min":0, "max":10, "step":1, "submitName":"Send" }],z: ["setMapAttribute", "defaultVotableSubmitName", "Send" ],z+ ["setMapAttribute", "defaultClusterType","z, ["setMapAttribute", "defaultClusterLabel","z. ["setMapAttribute", "defaultClusterShape",0],z, ["setMapAttribute", "defaultClusterStyle","z/ ["setMapAttribute", "defaultClusterPencolor","z0 ["setMapAttribute", "defaultClusterFillcolor","z/ ["setMapAttribute", "defaultTunnelFillcolor","z+ ["setMapAttribute", "defaultTunnelStyle","z+ ["setMapAttribute", "defaultTunnelLabel","z"] )#rc   r  r  r&   r   r   rW  rX  bgcolordefaultNodeStylestripdefaultNodeShapedefaultNodeFillcolordefaultNodeHeightdefaultNodeWidthdefaultNodeTyper  rn   r   DEFAULT_MAP_LAYOUT_ORIENTATIONr|   rd   EMPTY_NODE_LABEL_PLACEHOLDERDEFAULTNODE_PENCOLORr~  DEFAULTEDGE_PENCOLORDEFAULTEDGE_ARROWHEAD_STYLEDEFAULTEDGE_PENWIDTHVOTABLE_NODE_COLORr  DEFAULT_CLUSTER_LABELDEFAULT_CLUSTER_FILLCOLORTUNNELNODECOLORDEFAULTLABELSTUNNEL_NODE)re   rw   mapPublishInfor  rW  map_descriptionmap_bgcolorr  r  r  r  r  r  r~  	graphSpecrg   rg   rh   makeGraphDefaults  sf   

r  c                 C   s@   zt |  rt| }|dkrd}t t | W S | W S     )Nr)  r   )rd   	isnumericr{   r  )shapenumericShaperg   rg   rh   convertToTextShape'  s   r  c              	   C   s  z=d}g }g }t ||d}	|	r/|	D ]}
|r||
 qd }|
js'td|
jr5tjj|
jjdj	}nd}t
|
jtdddtjd  }i }|
jrQ|
j|d< |
jrY|
j|d	< |
jrb|
jj|d
< |
jrmt|
j|d< nd|d< |
jr{t|
j|d< |
jr|
j|d< |
jrt|
j|d< |
jr|
j|d< |
jr|
j|d< |
jr|
j|d< |
jr|
j|d< |r|
j|d< |
jr|
j|d< |r|
jr|
jd}|d t|d< |d t|d< n|
jr|
j|d< |
j j|d< t|
j!d t|
j" |d< ||d< |s$|t#$t%|
j||d 7 }|
j&dkr#|dt|
j d t|
j& d 7 }q|t%|
j|| q|s<|s<t'(|dW S |W S     ) Nr  )r  z&Missing nodetype in method 'makenodes'r   i  r"   )tzinforX  targetMapNametunnelfarendmappencolorz#000000r  hiddenbranchnumcommentslwidthr5  	nodestyle	fillcolorr  r  ,r   widthheightsizeownerIDpos	timestampz["putNodeInCluster",r  ))r  r   r  rc   r  r&   r   r   r  rW  roundr  r   r   utctotal_secondsrX  targetmapnamer  rd   r  r  r  r5  styler  r  r  r  splitr  r   r  xposyposr}   r  r  	clusteridr   rStrChop)re   rw   
asNodeList	withLabelr  r  r  hidden_nodesnodeListnodesnoder  r  r  r  r  rg   rg   rh   	makenodes8  s   
 









$r  c           	      C   s4  zd}g }t jjtj| d}|D ]w}|jj|jj|jjd}t	|j
|j|d< |r7|j
dk r7tdt|j
 |j
|d< |jrD|j|d< |jrL|j|d	< |jrT|j|d
< |jr\|j|d< |rm||d |d |d f q|rz|t|j|| q|tt|j|d 7 }q|s|st|dW S |W S     )Nr  )r_   r  )originr<  r  r  r   zEFor this function, edge weights must be zero or greater.  Cost found:costr  penwidthcolor_draw_r  r<  )r$   r   r   r   EDGE_ACTIVEr  r  r<  r  costToLabelr  r  rg  rd   r  r  r  drawr   r  r}   r  r   r  )	rw   endpointsAndEdgeCostsOnlyr  positiveEdgeCostsOnlyr  edgeListedgesedgeedgeargsrg   rg   rh   edgeit  s8   




r  c              
   C   s   z=zt | }W n ty } ztdt| d }~ww t| jd }t| jd }||d}t| |||}tt	|W S  ty\ } ztt	dt|iddW  Y d }~S d }~ww )Nra  provisionalIdsRequested[node]provisionalIdsRequested[edge]r  r  r  r`   r^   )
r  rg  rc   rd   r{   r   makeProvisionalsr   r}   r  )re   forUserrw   rf   numNodesnumEdgesnumProvisionalIdsRequestedprovisionalsrg   rg   rh   createNewEntityProvisional  s    
&r  c           
   	   C   s   zH|st | jd }tjj|d}i }tjj|d}| D ]'\}}t |dkr/||g i tt |D ]}	|| 	t
t||| q5q|W S     )Nrv   r   r   )r{   r|   r    r   r   r&   rD  r   ranger   rd   makeProvisional)
re   rw   r  r  r  idsr  
entityTypenumxrg   rg   rh   r    s   r  c                 C   s:   z|dkrt | |W S |dkrt| |W S td    )Nr  r  zMissing entity type.)allocateNodeRecordallocateEdgeRecordrc   )r  r  r  rg   rg   rh   r    s   r  c                 C   &   zt jj|tj| d}|jW S     )N)r  r  r  )r#   r   r   r   r  r  )r  r  provisionalNoderg   rg   rh   r
    s
   r
  c                 C   r  )N)r  r_   r  )r$   r   r   r   EDGE_PROVISIONALr  )r  r  provisionalEdgerg   rg   rh   r    s
   r  r9  application/jsonc                 C   s   zTi }| dkrd|d< |r||d< n+| dkr#d} d|d< |r"||d< n| |d< t jj|  d | |d	< d} d|d< d
|d< d|d< d|d< d|d< tt|ddddW S     )Nr]   Sresultmessager`  EoriginalStatusz, originalMessager  zMon, 26 Jul 1997 05:00:00 GMTExpiresz>no-store, no-cache, must-revalidate, post-check=0, pre-check=0zCache-Controlzno-cachePragmar  UTF-8r_   r   charset)httpclient	responsesr   r}   r  )r_   r   r   bodyDictrg   rg   rh   rh    s0   rh  c                 C   sX   z#|st d||d< |ststdtjr!tdt|| W d S W d S  ty+    w )NzlsendToFirebase:  Missing mapId. Change message not sent to map sharers, but may have been saved to database.r  zSsendToFirebase:  Canonical time stamp missing. Change message not sent to Firebase.changeMessages)rg  fromFilerc   r   r   r   rd   )re   	chgMTransrw   r  rg   rg   rh   sendToFirebase<  s   
r#  c                   @   s8   e Zd Zzdd Zdd Zdd Zdd ZW d	S     )
changeMsgParsec                 C   s*   z| j d }| std|W S     )Nr   z-Illegal characters in change message command.)changeMessageisalpharc   )self	chCommandrg   rg   rh   cmd`  s   
zchangeMsgParse.cmdc                 C   s^   z*| j d r(| j d }t|tr$| dkrW d S | s!td|W S t|}|W S     )Nr"   nullz1Change Message itemId must be numbers or letters.)r%  
isinstancerd   r  isalnumrc   r{   )r'  cmrg   rg   rh   itemIdi  s   


zchangeMsgParse.itemIdc              
   C   s  zt | jdk rdd iW S | jd }|dkrddiW S |dkr$ddiW S |s+dd iW S t|tsui }t | jdkr\t| jd trL| jd || jd < n)t| jd tr[| jd |d< nt | jdkrut| jd tru| jd || jd < | D ].\}}td	|st	d
| t|trt|}qyt|tr|rtt
j|std| qy|W S  ty } zt	|d }~w ty } zt|d }~w    )Nr  _value   r   r*  r  r"      z	[a-zA-Z_]zAChange Message attribute KEY must be letters or underscore only: zInvalid characters in VALUE: )r  r%  r+  dictrd   r{   rD  rematchrc   r   STRING_SAFETY_REGEXrA  r  rg  )r'  myattrsrO  valdummyrf   rg   rg   rh   attrsy  sN   








zchangeMsgParse.attrsc                 C   s   z|| _ W d S     r  )r%  )r'  r%  rg   rg   rh   __init__     zchangeMsgParse.__init__N)__name__
__module____qualname__r)  r.  r9  r:  rg   rg   rg   rh   r$  ]  s    	-r$  c           
   
      s  fdd	
fdddd 	 d,fdd		d
_ dd d
_ dd  d
 _ dd d
_ fddd
_ dd d
_  fdd}dd }zt| jd }t| }||d< t| jd d| jv rx| jd rxtdg 

| t	|		d= g 	d< |d }|| j
d krtd!d d"W S t F t | jd#< | j
d$r| jd$ | jd# kr| jd# | jd$< ntd%
D ]}|| | || || qtd!d|id"W  d    W S 1 sw   Y  W d S  ty } zd&t| d' }tt|d(|d)d!d*W  Y d }~S d }~w ty@ } zd&t| d' }tt|d(|d)d!d*W  Y d }~S d }~w ty] } zd+}t|}	t||	W  Y d }~S d }~w tyw } ztd+t|d"W  Y d }~S d }~ww )-Nc              
      s  zt |}| st|jdD ]}||r|j| ||< q|d}|ds0td|d< nt|d trB|d}t||d< t	j
j|d}	t| |	 	 |dr[|d|d< |drg|d|d	< ||d
< |tjkrtj
j|dd rtdtj d tj
j|d|id n"|tjkrtj
j|dd rtdtj d tj
j|d|id |tjkrt|  d|| t|}
t| ||||
d tj
j|dj}||d< t	j
j|djtdd d W d S  ty } zt|d }~w    )N)r  rX  r5  r  r  squarer   creationDater  r  r  r  F)r  pathBeginNode_id__isnullz-Sorry, there can be only one PATH ORIGIN per r  pathBeginNode_id)r  defaults)r  pathEndNode_id__isnullz*Sorry, there can be only one PATH END per pathEndNode_idr  r  r[  r"   r\  )rD   r   rc   r   r   r   r  r+  rd   r&   r   customCheckr   PATH_BEGIN_NODEr0   r   r  rg  r   r5  PATH_END_NODEr  checkPermissionsr   storeNodeToDBr    rn   r   rU   rR   )re   r  r  rw   	nodeAttrsr   namer  shapeSentByClientr  
attrsForDBunamerf   r  rg   rh   _createNode  sT   










	$z)changeMessageHandler.<locals>._createNodec                    s8   zt  }| |d< |d | | W d S     )Nrw   changes)r   r   )rw   	changeMsgtempTransaction)transTemplatetransactionsrg   rh   _putInTransQueue	  s   z.changeMessageHandler.<locals>._putInTransQueuec                 S   s4   zt jjt|t| djt|d W d S     )N)r   r  r  )r#   r   r   r{   r   )rw   r  r  rg   rg   rh   _putNodeInCluster%	  s   *z/changeMessageHandler.<locals>._putNodeInClusterFc              
      s  zt |d}t |d}t |d}tjj|d}tjj|tjdt|dt|dB }|D ]}t	|j
|}	 ||	 q-|tjkrLtjj|djtjd	 tjj|d
jtjd	 tjj||djtjd	 tjj|djtdd d |tjkrtjj|djd d n|tjkrtjj|djd d |tjv rtjj|d d d  |tjkrtjj|d
jtjd	 W d S W d S  ty }
 zt|
d }
~
w    )Nr  r  r  r   r  )r  )r<  )node_idr^   )r  r   r  r[  r"   r\  r  )rB  )rE  )r  pathBeginNodepathEndNode)r  r&   r   r   r$   r   r   r  rW   r  r  VOTABLE_NODEr,   r   VOTABLE_DELETEDr+   r!  r#   r   rU   rG  r0   rH  PATH_ENDPOINT_NODE_TYPESr   rO   rc   )re   r  rw   r9  r  	nodeownerr  r  r  r  rf   rV  rg   rh   _removeNode9	  s8   


(




z)changeMessageHandler.<locals>._removeNodeTc                 S   sb   z,|t |i}|dkrW d S |dkr|}t| t t| |d|| t| ||||d W d S     )Ntunnelr  r  )rd   r  tunnelfarendmapIdrI  rJ  )re   r  r  rw   r  r  attrDatarequestedTargetMaprg   rg   rh   _setNodeAttributer	  s   
z/changeMessageHandler.<locals>._setNodeAttributec              
   S   s  zt |}| st|j|dr|jd |d< d  }}t|d }t|d }tjj	||t
jd s>tdt| tjj	||t
jd sRtdt| t| |d||| ttjj	|t
jdjd	d
dd }ttjj	|t
jdjd	d
dd }	|t
jkrtd|	t
jkrtdt|}
d|
v r|
d|
d< tjj	|djd|t
jd|
 W d S  ty } zt|d }~w    )Nr  r  r<  )r   r  r_   zAOrigin node does not exist (maybe someone else deleted it?).  ID:zATarget node does not exist (maybe someone else deleted it?).  ID:r  r   r_   r  TrY  r   zAYou can't connect TO a path-beginning node, only FROM it.  Sorry.z>You can't connect FROM a path-ending node, only TO it.  Sorry.r  r  r  r  rg   )rE   r   rc   r   r   r   r{   r#   r   r   r   NODE_ACTIVEr  rg  rd   rI  rf  rG  rH  r   popr$   r   r  rP   )re   r  edgeIDrw   r   r   originIdtargetIdtargetnodetypeoriginnodetyper  rf   rg   rg   rh   _createEdge	  s:   

$$

(z)changeMessageHandler.<locals>._createEdgec              
   S   sb   zt | |d|d | tjj|dj|djtjd W d S  tjy- } zt|d }~w    )Nr  rP  r  r^   )	rI  r$   r   r   r   r   r"  rI  rc   )re   r  rl  rw   rf   rg   rg   rh   _removeEdge	  s   &z)changeMessageHandler.<locals>._removeEdgec                    s  zt |}| st|j|dr|jd |d< t| |d|d | d|v r.|d|d< ||d< ||d< ||d< |drKt	|d 
t|d< |drg|d}t|d |}t|d|} || ttjj|tjd	d
d}|d d }	|d d }
ttjj|	tjd	jdddd }ttjj|
tjd	jdddd }d}|tjks|tjkr|drd}tj|d< |dstj|d< t|}| rtjj||tjdjdi | |rtdtj d tj d W dS t|j    )Nr  r  r  r  r  r  r  r  ri  r  r<  r   r"   r  TrY  F)r  r  r_   zSorry, connections to/from z<br/>or z cannot be assigned weights.rg   ) rE   r   rc   r   r   r   rI  rk  r   
addslashesr  r   r  r  r  r$   r   r   r   r  rf  rd   r#   rj  rG  rH  r~  r>   r   rg  PATH_ORIGIN_LABELPATH_END_LABEL)re   r  r  rw   r   r   newLabelr  edgeEndpointsrm  rn  rp  ro  showNoEdgeCostWarningrb  rg   rh   _setEdgeAttribute	  sP   





$$



 
z/changeMessageHandler.<locals>._setEdgeAttributec                 S   s   t |}| st|jzL|drt|d tj d|d< |dr0t|d tj d|d< t| |d| j	d  t
|}| rUtjj| j	d djdi | W d S t|j    )Nr  r0  r  r  rw   r  rg   )rG   r   rc   r   r   r  r   DOTS_PER_INCHrI  r|   r?   r&   r   r   r   )re   r  r   r   rg   rg   rh   _setMapAttribute6
  s   


&
z.changeMessageHandler.<locals>._setMapAttributec                    sr  z|d }|d D ]}t |}| }| }| }|r|dkr*| |||| q	|dkr;||t| d  q	|dkrWt|d }	t| d }
| ||||	|
 q	|dkrc| ||| q	|dkrp | |||| q	|d	kr|r|dr|dn|}| ||| q	|d
krd|v r|d sd|d< d|d< | |||| q	|dkr| || q	W d S     )Nrw   rQ  r  r  r   r  
removeNoder  r  r  r  r  r  r  )r$  r9  r.  r)  r  r  r   )re   r  cmTransrw   changecmPchgAtrr.  r)  r  r  )rq  rP  rX  rr  rc  ry  r{  rh  rg   rh   
_doHandlerM
  sD   "z(changeMessageHandler.<locals>._doHandlerc                 S   s>   z|| j d< |d}tjrt| ||| j d  W d S     )NlastCompletedTransactionIdrw   tableLockTime)r|   r   r   r   r#  )re   transacttransactionIdrw   rg   rg   rh   _sendCM2Firebasev
  s   

z.changeMessageHandler.<locals>._sendCM2FirebasechngMsgTransrw   rv   rr  z.This action not allowed for non-editing users.rQ  r  r  r]   r_   r   r  lastCompletedChangeMessageTimezJChange message received that's older than others that have been completed.2<div class='prompt centerText eighteenChMINwidth'></div>r  )r  r  r  r^   r`   F)alters_datar}   r~   r   r  r{   r|   rc   r   r   r   rh  r   r  r   r  rg  rd   r   r  rN   rO   )
re   r  r  originalClientTransactionrw   r  transrf   r_   r   rg   )rq  rP  rV  rX  rr  rc  ry  r{  rh  rT  rU  r  rh   changeMessageHandler  sx   b5W	=)

 (&&r  c                 C   s   z=t t }t td}t|||}|t| |d 7 }|t t| |7 }|t|7 }t	|d}|d7 }|
| W dS     )Nr   r  ]}T)rd   r   r  r   r   r  r  r  r  r  write)re   rw   graph_fpcanonicalTimer  r  rg   rg   rh   db_to_chgMsgFile
  s   
r  c              
   C   sF  zi }||d< t j|d< d|d< dt j d |d< d| jv r>d	|d< tjd
t| d s3d|d< n+d
t| d |d< n d|d< d| jv rX| jd t jkrXt	t
||d< nt||d< | jd |d< t|dd|d< | jd |d< | jd |d< d|d< tt|W S  ty } ztdt| ddW  Y d }~S d }~ww )NprovisionalIdssecondsToStaleProvisionalr  debug_outputz<h4>You can create a zC by dragging one of the icons at the upper right to this area.</h4>r>  rr  r"   zROideatree/r  z&{"error":"Map has not been published"}imagezpublic.jsonr   	grfFormatr~  mapOwnerNameF)r  mapUsersr\  rW  r  r  ra  r`   r^   )r   PROVISIONAL_SECONDS_TO_STALEr   r|   r  r  r  rd   OUTLINEFORMAT
getHtmlMapr  r  r  r   r}   r  rc   )re   rw   provisionalIdsRequestedr  graphrf   rg   rg   rh   map_meta  s2   


 r  c              
   C   s  zt | jd }t | jd }tjj|d}t| | d| jvrt| | t|}t	| t
|tj}tjdddd}t| || |  t|j| t | jd	 }t | jd
 }||d}	t| |||	}
tjj|d}tjj||d t| ||
|}t|ddddW S 	 W d S  ty } zt|}d}t||W  Y d }~S d }~w ty } zd}t|}t||W  Y d }~S d }~w ty } ztdt| ddW  Y d }~S d }~ww )Nrw   rv   r   rr  zw+tr  F)encodingr   r  r  r  )rp   	mapViewedr]   r  r  r`  ra  r`   r^   )r{   r   r|   r    r   r   r  ra  r  r  r  r   MAPLOAD_TEMP_FILE_SUFFIXtempfileNamedTemporaryFiler  r   r  moverL  r  r&   r*   r5  r  r   rg  rd   rh  rN   rc   )re   rw   r  r  r	  outfilePathr  r  r   r  r  
currentMapr  rf   r   r_   rg   rg   rh   	mapLoaderG  sJ   



 r  c              
   C   s   zt | }ttt d dW S  ty# } ztdtt d }~w tyB } zdt|i}t	| d|ddW  Y d }~S d }~ww )NzchatWin.htmlr   r   r  r^  r_  r   )
r  r   r   r  r   rc   rd   r   rg  r   )re   rw   rf   r   rg   rg   rh   chatWin  s   r  c              
   C   sp  zt | jd }tjj|d}tjj|d}|j| jd< | jd}|r0| jdr0tdW S d| jv rA| jd d krA| jd nd }d	| jv rT| jd	 d krT| jd	 nd }| j	d
ry| j	d
 }t
|dkrx|ddd }|| jd< d| }n"| jdr|rdt| jd  d }ndt| jd  d }nd}| jdr| jdsd}	d}
d}d}nd}	d}
d}d}|jtjtjfv }d| jv r| jd dkrdnd}t }t }t }t }|rt nt }t }tt }d}ttjtjtjtjtj d}| jd }t!|d}dtt"#d }i dtj$dtj%d|dddtj&dtj'dtj(d tj)d!tj*d|d"|d#|d$tj+d%tj,d&|	d'|
d(|i d)|d|d*|d|d+|d,|d-|d.|d/|d0|d1|d2|d3|d4tj)dtj'd!tj*}t-| d5|}|.d
 |W S  t/y } zt0d6t| d7d8W  Y d }~S d }~ww )9Nrv   r   r   rn   rr  rour  mobilebrowserVersionmapHashr"   rv  rw   z#ROr   rB  TFisMobile)originalrd  votablepathbeginnodepathendnodemapsettingsz?__=r   node_pin_layoutengineuseFirebasecurrentUsernameuserAuthenticatedguestUsernamer   what_a_node_is_calledwhat_a_cluster_is_calledr   noMinifyrw  cluster_label_lengthseconds_to_staleshowOpenMenushowNewMenushowMapInfoMenushowTeamCollaborationMenusr   nodeManageInstructionsnodeCreateInstructionsemptyNodeTooltipemptyMapTooltipnodeTooltiptunnelTooltipnode_shapespossiblenodetypesmyrandomnumrm  zmap_page.htmlra  r`   r^   )1r{   r|   r    r   r   r)   rn   r   r   COOKIESr  r  rd   r  r   r  r   rM   node_manage_instructionsnode_create_instructionsempty_node_tooltipempty_map_tooltipnode_tooltip_for_readonlynode_tooltiptunnel_tooltipr}   r  r  ORIGINAL_NODEr  r^  rG  rH  r  r   r   NODE_PINNED_LAYOUT_ENGINEr   ro   r   r   ro  r   CLUSTER_LABEL_LENGTHr  r   delete_cookierc   r   )re   r   rp   r$  rr  
dataMobiledataBrowserVersiontemprw  r  r  r  r  r   r  r  r  r  r  r  r  r  r  r  rn   r  r  r   responserf   rg   rg   rh   map  s   
&&

  

	
 !#
 r  c              
   C   s   zt | }t| | || jd< tjt|d}tt|dW S  t	y< } zd}t
|}t||W  Y d }~S d }~w tyO } ztdt
| d }~w tyj } ztdt
| ddW  Y d }~S d }~ww )	Nrw   zchangeMessages.jsonr   r`  r   ra  r`   r^   )r  r  r|   r  r  r  r1  r   r   rN   rd   rh  r   rc   )re   rw   r  rf   r_   r   rg   rg   rh   mapPullImport  s$   

 r  c              
   C   s   zt | | || jd< ttt|tjdW S  ty3 } zd}t|}t	||W  Y d }~S d }~w t
yF } ztdtt d }~w tya } ztdt| ddW  Y d }~S d }~ww )Nrw   r   r`  r   ra  r`   r^   )r  r|   r   r   r  r   r  rN   rd   rh  r   rc   r   )re   rw   rf   r_   r   rg   rg   rh   mapPull1  s    

 r  c                 C   s*   zt jj|djddddW S     )NrP  r  TrY  r  )Nodesr   r   rf  r  r'  rw   rg   rg   rh   allNodesInMapN  s    r  c                 C   s   z
t j j|dW S     )N)origin__mapId)r$   r   allr   r  rg   rg   rh   allEdgesInMapX  s   r  c              
   C   sH  t jjt| jd d}tjj|d}|jtjtj	fv }d|i}zT| j
drSt jj|jd}t| j
|d}|d|i | rL|  |dd	i t| d
|W S t|j|j|jd}| rp|d|i t| d
|W S t|j ty } zt|ddW  Y d }~S d }~w ty } zt|ddW  Y d }~S d }~ww )Nrv   r   r   r   r   r^  r   r>  zYour info has been saved.zideatree/myAccount.html)r   r   r   r`   r^   )r    r   r   r{   r|   r)   r  r   r  r   r   r  rA   r   r   r  r   r   r   r   rc   r   r   r   )re   r  r$  r   r   r_  r   rf   rg   rg   rh   	myAccountb  s2   
r  c                 C   s8   zt jjt| jd tjd }tt|W S     )Nrv   )r  r_   )	r%   r   r   r{   r|   r   r  r  r   )re   myPendingInvitesrg   rg   rh   r    s
    r  c              
   C   s  zt | | d| jv rttj|sC|r&tjj|d}tjj||dj	j
}n|r:tjj|d}tjj||dj	j
}n	tjj|dj	j
}| j sLtdd| jv rbt| jd t| jd krbd}n	||krid}nd}tjj||d	}	|	jsd
| v rt jd7  _ttjW dS  tjy }
 zttjd }
~
w tjy }
 zt|
d }
~
w tjy }
 zt|
d }
~
w tjy }
 zt|
d }
~
w    )Nrr  r   rZ  zTCan't check permissions. Has your access been revoked? Or is it time to login again?r}  rv   TF)actioniownremovezD  NOTE: in general, you must be the creator of an item to delete it.)r  r|   rc   r   NOT_PERMITTED_PROMPTr&   r   r   r#   r  r  r$   r   r{   r-   	permittedr  rg  rI  )re   submitterID
methodNamerw   nodeIDrl  r  r  iOwn
permissionrf   rg   rg   rh   rI    sN   



&

rI  c                 C   sd   z-d}d| j v rd}|W S |tjkrtj }|W S |tjkr$d}|W S |tjkr+d}|W S     )Nr  fromBookmarkletzOK to Insert?TunnelzSolution to be Voted Upon)r   r   r  r   
capitalizer  r^  )re   r  
popupTitlerg   rg   rh   makePopupTitle  s    




r  c                    s   z>g }t |  t| jd }t|dd d}ddg}|D ] |r/| fdd|D  q| fd	d|D  q|W S     )
Nr  c                 S      | d S )NrW  rg   krg   rg   rh   <lambda>      zgetMapList.<locals>.<lambda>rO  r  rW  c                    s"   i | ]} d  kr| | qS r  rg   rG  r  amaprw   rg   rh   
<dictcomp>  s   " zgetMapList.<locals>.<dictcomp>c                    s   i | ]}| | qS rg   rg   r  )r  rg   rh   r        )r  r}   r~   r|   sortedr   )re   rw   excludeSelfmapListmymapsmymapsSortedwanted_keysrg   r   rh   
getMapList  s   r
  c                 C   s4   zi }dt j d |d< t| ||d< |W S     )Nz	Create a z which tunnels...titletunnelOriginMapname)r   r   rg  )re   rw   r   rg   rg   rh   getTunnelDialogContext  s   r  c              
   C   s  zdt ji}d }t| }tjj|d}|j}||t jd | j	dr,| j	dnt
| j	d d}|t jkrL|t jkrJt| t| jd ddnd }t| ||d	< | j	d
s^|t jv r|t jkrlt| j	|dd}nt| j	dd}| rt| |dd i }||j | j	drt| j	d|d< |jdr|jdj|d< |dt| |jd ji t|g}	tt|	gW S ||d< |jd t jkr|t| | t| d|W S t| d|W S | j	drAt| j	d}
tjj|
|d}|
|d< |jt jkr#|t| | t|d|d}|  ||d< t| d|W S td|d}|  ||t j t j!t jd t| d|W S |t jkrjt| j	|dd}|t| | | j	d|d< ||d< t| d|W S | j	drt| j	dd}||d< t| d|W S t"d t#y } zdt$|i}t| d|ddW  Y d }~S d }~w t"y } zt|ddW  Y d }~S d }~ww ) Nr   r   )r[  r  r  r  rv   T)r  r  r   r  )querysetlabel_suffix)r  )forEditDisplayr  r  r   zideatree/tunnelDialog.htmlzideatree/nodeDialog.htmlrZ  r  )r  r  r_  )r  r_  )r   	urlLengthdescriptionLengthr   zInvalid request.r  r^  r_  r   r`   r^   )%r   r   r  r&   r   r   r[  r   r   r   r  r  r  r{   r|   r  r`  r5   r4   r   rF  r   r  rg  issueJsExecr   r}   r  r  r   r#   r  NODE_URLFIELD_LENGTHNODE_DESCRIPTION_LENGTHrc   rg  rd   )re   r   r  rw   r  r[  maps4selectr   argsForClientjsToExecr  r  rf   rg   rg   rh   
nodeDialog   s   
(
&

	r  c                 C   sN   z"|s|j dksttj| jds| jdr tdW d S W d S     )Nr   r  r5  z$Need a label if address is provided.)r[  rg  r   MAP_FULL_PROMPTr   r   )re   r  r  rg   rg   rh   rF  v  s   
rF  c              
   C   sL  zg }i }| D ]}i }| dr| d}|d nHd}| dr%d}n>| dtjkr0d}n3| dtjkr;d}n(| dtjkrFd}n| dtjkrQd}n| dtjkr\d}n| d	rcd
}| drn|d |d< i }| D ]
\}}	|	r~|	||< qt||d< ||d< |	| q|s||d< |W S |W S  t
y }
 z d }
~
ww )Nr  r  r  	alterNoder  r  createTunnelcreateVotableNoder  r  r  rd  r=  execute)r   rk  r   r  r  r^  rG  rH  rD  r   rc   )
listOfArgs	forAppendcmdsr  r  r)  r  	cleanArgsrO  r7  rf   rg   rg   rh   r    sR   




r  c              
   C   s\  z(||d< | dr|d dd|d< | drH|d t|d< |d d}dt|d }dt|d	 }t|d t| |d< | d
rXdt|d
 |d
< | drhdt|d |d< | dr|d d}	dt|	d |d
< dt|	d	 |d< d |d< | dr|d dd|d< | dr|d dd|d< | drt	|d t
j|d< |d dd|d< t|}
d|
v r|
d tjj ||d}|
 D ])\}}|dkr||krtdtjj |d}|dkrtjj |d}t||| qt|dt
j z|  W W d S  ty) } zt|d }~ww     )Nr  r5  r  _r  r  z{:.2f}r   r"   r  z{:.3f}r  r  r  rv  r  	fontcolorr  "r  rZ  r  z5A tunnel can't lead to itself, i.e. the origin graph.r   r_   )r   replacer  r   r  formatfloatrd   r   truncateStrr   NODE_LABEL_LENGTHfilterNodeQueryrk  r#   r   rD  rc   r&   r    rE  rj  r  rR   )re   rw   r  itemIDr  callerFuncNamer  dimWdimHxyposr   nodeToUpdaterO  r7  rf   rg   rg   rh   rJ    s^   









rJ  c                 C   sR   z$i }dd t j D }| D ]}| |v r | | || < q	 q|W S     )Nc                 S      g | ]}|j qS rg   )rL  rG  frg   rg   rh   rI  +      z#filterNodeQuery.<locals>.<listcomp>)r#   _meta
get_fieldsr  )r  r   	fieldListr  rg   rg   rh   r+  (  s   r+  c                 C   s   zMg }| d | |j | d tjj|tjd }tjj|j|dj	|d | | t
|d |}|t|7 }|d7 }t| t||| W d S     )Nr  r  r  r_   rZ  )r  r  )r   r  r+   r   r   r   NODE_COMMENT_ACTIVEr  r#   r   r  r}   r  r#  r~   )re   r  rw   r  outr  r  rg   rg   rh   broadcastNumCommentsToClients9  s   


r<  c              
   C   s  z8t jjt| jd d}t| }tjj|d}t| jd}tjj||d}|j	}t
|dkr:|d d d n|}| jdrIt| jd }d| jv r~tjj||d	}	t| j|	d
}
|
 r}t }|
  t| ||| | jdr}t| d|d nod| jv r| jd }||||d}t| d|W S d| jv sd| jv rtjj|||d}	t| j|	d
}
d| jv r|
 r|
  | jdrt| d|d n"d| jv r|
 rt }tjj|||djtjd t| ||| t }g }g }|tjj|tjdd7 }|r|D ]}|t|d
 qtjj|tjdj|jd}d|i}||||||jtj d t| d|W S  t!yR } zt"|ddW  Y d }~S d }~w t#yl } zt"t$|ddW  Y d }~S d }~ww )Nrv   r   r  rZ  K   z..	commentIdsubmitNewComment)r  rp   r^  notifySharersF)showUI	regardingsubmitToDeletecomment)	nodeLabelr  r>  rD  z)ideatree/nodeCommentDeleteAreYouSure.htmlsubmitToUpdatereallyDelete)r   r  rp   r^   r9  z-dater  r  sharers)rE  formsr   r  
thisUserIdr   zideatree/nodeCommentEdit.htmlr`   )%r    r   r   r{   r|   r  r&   r   r#   r  r  r+   r   r6   r   r   r  r  r<  notifyr   r   r   r   r!  r:  r  r   r'   r  r  r  r   r   r   rc   rd   )re   r  rw   r  r  r  rE  rB  r>  r_  r   r  rD  r   	emptyformprevNodeCommentsrJ  rI  rf   rg   rg   rh   crudNodeCommentsL  sp   
 




rO  c                 C   s    | j dr| j d S t|dS )Norientation)r   r   r  )re   rw   rg   rg   rh   getOrientation  s    rQ  c                 C   s   | j dr| j d S tjS )Nlayoutengine)r   r   r   DEFAULT_LAYOUT_ENGINErt   rg   rg   rh   getLayoutengine  s   rT  c              
   C   s   zQt | }t| |}t| }t|d|d t| jd }t| |d| t|}|d7 }t|t	j
}	|s<t|||||| t|||	| tjj|dj||d |	W S  ty^ }
 z d }
~
w tyz }
 zttt|
dd	W  Y d }
~
S d }
~
ww )
NrR  )r  r  rv   prettifyz/uploaded.dotr  )rP  rR  r`   r^   )r  rQ  rT  r  r{   r|   rI  r1  r  r   GRAPHVIZ_OUTPUT_FILE_SUFFIXGraph2dotFilegraphvizLayoutr&   r   r   r   rg  rc   r   r}   dumprd   )re   haveGraphvizSrcnodeListOfDictsedgeListOfDictsrw   rP  rR  r   dotInputFilelayoutResultFilerf   rg   rg   rh   makeLayoutFile  s,   
"r_  c              
   C   s|  zt | }t| }t| }|tjtjfv r=tjjtj	|tj
d }|dkr=dtj d tj d tj d }	td|	W S t| |}
i }|
D ]*}t|dkrW|d	 |d
 i}n|d	 }t|d d t|d  |i}|| qF|ddi || tt|ddddW S  ty } ztdt|iddW  Y d }~S d }~w ty } ztt|ddW  Y d }~S d }~ww )N)r  r  r_   r   zCircular or Radial layouts aren't free to<br> reposition certain nodes.

Consequently, Circular and Radial layouts are<br> not enabled when z=s are present.<br><br>To enable such layouts to work, remove z2s by<br> right-clicking each one and selecting 'Unz Entities'.r`  r1  r0  r  r  r"   r  r  r]   r  r  r  r  r`   r^   )r_  rT  r  r   CIRCULAR_LAYOUT_ENGINERADIAL_LAYOUT_ENGINEr#   r   r   r  rj  r  ro  rh  parseLayoutr  rd   r   r   r}   r  rg  rX   rc   )re   provisionalNodeIdsprovisionalEdgeIdsfromGraphvizSrcr'  r^  rR  rw   numClustersr   rQ  r;  r~  r  chrf   rg   rg   rh   rU    s6   "
 
 rU  c           +      C   s^  dd l }zht| }t| |}t| }	|	tjkrdnd}
|	dv r"dnd}t|  t|ddd}| }W d    n1 s>w   Y  ||}i }g }d}i }d	|v r |
s |d	 D ]}|	d
pm|	dpm|	d}|r{|	ddd |d< q\|d 
ds|d 
tjr|rq\|	dp|	d}d|v r|||d i tj|d< |d krtd|r| |d< |t||d ff7 }n||d< d|v r|d tjkr|d |v r||d ||d < n|D ]}|d || v r||d< qd|v r|d dkr|d }nd|v r|d }nd }|rt|tj}d|v r+td|d |nd }|r=|d }|d }|d }n%d|v rJtd|d |nd }d|v rU|d nd }d|v r`|d nd }|	d}|rnt|nd }|	dpz|	d}|r|
dr|dd  n|}|rzt|d W n" ty   z
tjj	|d j}W n tjy   d }Y nw Y nw |rt||d!}d|v r|dt|d i |r|dt|i |r|dt|i |t|d | |sd"}|t|d t|t|t|d# d|v r|t|d |d  q\d$|v re|d$ D ]:}|r;|	d$dd |d$< q)|rE| |d%< n|	dpU|	d
pU|	d|d%< d&|v rb|d& }nd'|v rl|d' }nd }d(|v rx|d( } nd)|v r|d) } nd } d }!}"t |rt!t |D ]/}#||# }$|!s|$d t|krd}!|$d |d&< |"s|$d t| kr|$d |d(< d}"q|!s|"std*t|d%  d+|v r|d+ nd }%d|v r|d nd }d,|v r|d, nd }&d }'|r|"d-d#d.d/$ }'d0d1 |'"d2D }'|&rc|'r3|&t |&d  	d3}(|(r/|(  |(|' ntd4td,|&|}&|rS|rS| rS|t%|d% |d& |d( d5 |&rc|t&|d% d,t|& q)|rk|W S |W S  t'y }) ztd6t|* d })~)w ty }) z|)}*t|*d })~)w t(y }) z d })~)w ty }) z d })~)ww )7Nr   TF)fdpr   utf-8r  rg   r   r  ID_gvidr  r"   rL  clusterr  z'parseLayout:  Could not find a node ID.r  r  r  z\Nbbr  r  r  r  r  r  rv     )	colorname)r  r  z0,0)r  r  r  r  rl  r  tailr<  headzEndpoint not found for edgeID:pincolorr  r  ze,r  c                 S   s   g | ]}t |qS rg   )r(  r3  rg   rg   rh   rI    rJ  zparseLayout.<locals>.<listcomp>r  pointszUnable to parse _draw_ points.)r  r<  r   ))
simplejsonr  rQ  rT  r   r  r   r   r~   r   
startswith)CLUSTER_INVISIBLE_NODE_FOR_EDGE_PLACEMENTr   r  rc   rk  rd   r   r)  r*  convertGraphvizUnitsr  r{   rA  r1   r   hexvaluerI  r   r  r  r  r  r  r  r&  r  r  r  r   rg  )+re   
layoutFiler  rc  rd  	makeItemsr}   rw   rP  rR  	edgesOnlyusingfdpjsonMapmapdatar  	itemCountrQ  reassignedNodeIdsclusterContentsr  r  rm  r  convBBr  r  r  r  r  r  r  r  r<  originFoundtargetFoundndxpairrs  r  	lastPointrt  rf   r   rg   rg   rh   rb    s8  








"

(

&








"rb  c                 C   s  zP|sW dS | dkrr| d}t|d }t|d }t|d }t|d }|| }|| }	i }
d|tj  |
d	< d|	tj  |
d
< d||d   }|rYdd||	d    }nd||	d   }t|d t| }||
d< |
W S | dkr| d}tt|d d}|rtdt|d  d}n	tt|d d}t|d t| W S | dkrOd}|D ]} | d}| dkr|d| 7 }|dtt| d 7 }|d| d 7 }n"| dkr|d| 7 }|dtt| d 7 }|d| d 7 }| dkrK|d|	  7 }|dtt| d 7 }| dD ].}|r7|dt|d  d td|d   7 }q|dt|d  d t|d  7 }qq|W S W d S     )Nr  rn  r  r   r"   r0  r  z%.2fr  r  r)  r  r  opsr  r  z -cr  brt  )
r  r(  r   rz  rd   r  r   r  r  upper)attrr7  r}  valsvals0vals1vals2vals3sizeXsizeYrn  r  r  r  drawCmdr  pointrg   rg   rh   rx    sh   



,(rx  c              
   C   s  zt j|d dd  }|dv rdttj nd}|tjkrM|| d | d | d | }t|}t	|ddd	}|j
d
krJ|jd}	t|	W d S |tjkrzt|d W d    n1 scw   Y  W n ty{   t|d}
|
  Y nw tj|tjtjB d tdttj d | d tj d | gdd}tj|tjtjB d W d S td|  ty } ztdtt d }~w ty } zt|d }~w ty } ztdt| d }~w ty    w )Nr"   )neatorh  z -n -sr  z -Tz -o r  T)capture_outputtextr   ri  r   wtr  zfdp -sz
 -n -Tdot z | gvpr -c -f z! | fdp -s72  -Tps2  | ps2pdf  -  r'  zUnknown output file format:r   zOSError:)r  r  r  rd   r   rz  rV  shlexr  r   
returncoder   r   rg  PUBLISH_FILE_SUFFIXr   r   r   r   r!  r"  r#  r$  r   GVPR_FLIPY_PATHrc   r   r   OSError)rw   r]  
resultFilerR  resultFileTypeflagslayoutcommandr=  outputerrStrr   r;  rf   rg   rg   rh   rX    sJ   
 



2rX  c                 C   s   zDdd l }g  }}t|  t|ddd}| }||}	W d    n1 s(w   Y  |	d }
|	d }t| |
|| t| |
| W d S     )Nr   r   ri  rj  r  r   )ru  r  r   r   r~   _makeEdgesFromImport_makeNodesFromImport)re   r^  provisionalNodeIdListprovisionalEdgeIdListr}   r  r  r~  r  r  importedNodesimportedEdgesrg   rg   rh   jsonToJScommands4  s   r  c                 C   s   zt | dW S     )Nzideatree/imports.html)r   rt   rg   rg   rh   importsF  r;  r  c           
      C   s:  zddl m} ddlm} t| }| jd }|tj	 tj
 fv r-t||}d}n |tjkr;t|tj}d}n|tjkrIt|tj}d}ntdtjj|d	j}t|d
kra|d d
 n|}|dd}tdd|}|d| 7 }d}||t|d|dd}	tj||	d< d| |	d< |	W S  ty    w )Nr   )StreamingHttpResponse)FileWrapperr'  z"application/octet-stream"zC"application/vnd.openxmlformats-officedocument.spreadsheetml.sheet"z"application/pdf"z!File format not found in request.r      r  r#  z[^a-zA-Z0-9_]r  r  i    rbzapplication/octet-streamr   zContent-Lengthzattachment; filename="%s"zContent-Disposition)django.httpr  wsgiref.utilr  r  r   r   r  r   GRAPHVIZ_GVGRAPHVIZ_DOTr  EXCEL_FILE_SUFFIXr  rc   r&   r   rW  r  r&  r3  subr   r  r  getsize)
re   r  r  rw   r'  the_filer   r  
chunk_sizer  rg   rg   rh   downloadN  s8   


r  c              	   C   s  z| d}| }|d | }|d g df}d}d}|d D ]}	||||	 |d7 }q&d}d}tjj|tjdj	tj
d}
|
D ]}||||j| |d7 }|jrd||||j n|||tj |d7 }|jtjkr~|||d n)|jtjkr|||d	 n|jtjkr|||d
 n|jtjkr|||d |d7 }|jr|||d|jd d   |d7 }|jr||||j| |d7 }|jr||||j| |d7 }n|d7 }|jr|||t|j |d7 }|jr||||j| |d7 }|jr||||j |d7 }|jr$||||j| |d7 }|jr4||||j |d7 }|jrE||||j| |d7 }|jrV||||j| |d7 }|j rh|||t|j  |d7 }|j!ry||||j!| |d7 }|j"r|||t#|j" |d7 }|j$r||||j$ |d7 }|j%r||||j% |d7 }|j&r||||j& |d7 }|j'r||||j'| |d7 }|j(r||||j( |d7 }|j)r||||j) |d7 }d}qH| d}g df}d}d}|d D ]}	||||	 |d7 }qd}d}t*jj|tj+d,dd}|D ]}||||j| |d7 }|j-jrE||||j-j n|||d |d7 }|j.jr_||||j.j n|||d |d7 }|j-rv||||j/ |d7 }|j-r||||j/ |d7 }|j.r||||j0 |d7 }|jr||||j |d7 }|j1r|||d|j1d d   |d7 }|j2r||||j2| |d7 }|j3r||||j3| |d7 }d}q'W d S     )Nr  r"   z0000000.000)rk  r  r  r  groupr  r  r  r  r  r_   r  r  r  r  r  r  r  r$  r  r5  rX  r   )r  r_   r  r#   r  VotableClusterrv     r0  links)
rk  FromToSourcer  TargetLabelColoredgecostr  r  r<  r  )4add_worksheet
add_formatset_num_formatwrite_stringr#   r   r   r   rj  r  r  write_numberr  r  r  r  r  r  r^  r  r  r  r  rd   r  rX  r  r  tunnelfarendmap_idr_   r  r  r  r  r  r  r  r  r$  r  r5  rX  r$   r  r  r  r<  	origin_id	target_idr  r  r  )re   rw   workbook	worksheetcell_integer_formatcell_float_formatcolumnHeadersrowcolheadernodeDatar  edgeDatar  rg   rg   rh   makeExcelFile  s  










$r  c                    s  z|D ]   dr d  d<   drR d  dkr#tj d< n/ d  dkr1tj d< n! d  dkr?tj d< n d  dkrMtj d< ntj d<  D ]}ttj	|sat
dqT|sht
d	t|  d
<   dr fdd|D d  d< d d< qW d S     )Nr  r  r  r  rd  r  rm  z\Illegal characters found.  Only AlphaNumberic characters are allowed, for security purposes.zT_makeNodesFromImport: ran out of provisional node ids. Cannot continue, so aborting.r  r  c                    s$   g | ]}|d   d kr|d qS )r  r  r  rg   )rG  nodeDictndrg   rh   rI    s   $ z(_makeNodesFromImport.<locals>.<listcomp>r   r  r  )r   r  r   r  r  r^  r  r3  r4  r5  rc   rd   rk  )re   r  r  r  rg   r  rh   r  c  s6   




*r  c           
         s  zddl m} |D ]ډ d } dr!t d |r!t d  d<  dr5t d |r5t d  d< d}d}|D ]G}|dr` dr`|d  d ksW|d  d kr`|d  d< d	}q;|dr dr|d  d ksz|d  d kr|d  d< d	}q;|dkrd  d< d
t d  d t d  }	t|	tjd t	|	|dkrd  d< dt d  d t d  }	t|	tjd t	|	|r|sׇ fdd|D }q	t|
  d< d d< q	W d S     )Nr   )Numberr  r<  Fr  r  r  Tz,During Import:  No origin found for edge id=z Looking for:r   z,During Import:  No target found for edge id=c                    s    g | ]}|d   d  kr|qS r  rg   )rG  rK  edgrg   rh   rI    rN  z(_makeEdgesFromImport.<locals>.<listcomp>r  r  r  )numbersr  r   r+  r{   rd   r   r   r   rc   rk  )
re   r  r  r  r  r  foundOriginfoundTargetimportedNoder   rg   r  rh   r    sF   44  
(r  c                 C   s<   zi }d}t | jD ]
}|dkr|d7 }q
||iW S     )Nr   r"   )r  nrows)sheetelemTypeelems	elemCountrowxrg   rg   rh   _worksheetToElemCount  s   
r  z<[^>]+>c                 C   s   t d| S )Nr  )TAG_REr  )r  rg   rg   rh   remove_tags  s   r  c                 C   s  zg }g }g }g }|j ddddD ]}	|	}
qdd |
D }td|jd D ]}i }g }|j ||ddD ]}|D ]}|| q7q3t|D ]A\}}|sN|dkr|| |v rt|trx|dd	}t|	 }t
|tj}ttj|swtd
nt|}||| |i qD|r|dr|d  dkr|ds|| q%|dr|d  dkr|dr|| q%|| q%|r|rdd |D }dd |D }t||||d || W S     )Nr"   T)min_rowmax_rowvalues_onlyc                 S   s   g | ]}|  qS rg   )r  )rG  rL  rg   rg   rh   rI     rJ  z$_worksheetToList.<locals>.<listcomp>r0  r   &nbsp;r  zrIllegal characters found in imported node list.  Only AlphaNumberic characters are allowed, for security purposes.r  rm  r  c                 S   rE  r  rg   rG  itemrg   rg   rh   rI  "  rJ  c                 S   rE  rW  rg   r  rg   rg   rh   rI  $  rJ  )	iter_rowsr  r  r   	enumerater+  rd   r&  r  r  r   r)  r   r*  r3  r4  r5  rc   r{   r   r   r  findClusterParent)re   rw   r   r  r8  itemListmasterClusterListchildClusterListcolnamesr  r  r  rowDictcellvalsr  cellr  r7  masterClusterListIdschildClusterParentIdsrg   rg   rh   _worksheetToList  sT   
$$

r  c                    sp   z3|t |k r1||   | v r fdd|D d }|| |t |k r1|d7 }t| |||| W d S     )Nc                    s   g | ]
}|d   kr|qS rW  rg   )rG  clustr  rg   rh   rI  3  s    z%findClusterParent.<locals>.<listcomp>r   r"   )r  r   r  )r  r   r  r  r  currentChildrg   r  rh   r  -  s   
r  c                 C   s   zgg }d}t |jD ]Z}i }dd |dD }	|	s ddg}	d}||kr]||}
tttt}t|
D ](\}}|r\t| |v r\|}t	|t
rS|dd}t| }|t| |i q4|rd|| q
|W S     )	Nr"   c                 S   s   g | ]	}t |tr|qS rg   )r+  rd   )rG  r  rg   rg   rh   rI  N  s    z _edgesToList.<locals>.<listcomp>r   r  r<  r  r  )r  r  
row_valuesr2  zip
fieldnamesr  r  r  r+  rd   r&  r  r  r   r   )re   rw   r   r  r8  elemListfirstDataRowr  elemDicthasColnamesr  oneEdgeDictr  cvrP  rg   rg   rh   _edgesToListF  s4   


r  c              
   C   s   z(| j d}|r| }t| j }| std||dtjd}t| d|W S  tyB } zt	t
|ddW  Y d }~S d }~ww )Nr'  zInvalid FileUploadForm.r"   )r   r'  needsProvisionalsr   zfileuploadform.htmlr`   r^   )r   r   r  rC   r   rc   r   r   r   r   rd   )re   r'  r   r   rf   rg   rg   rh   getFileUploadFormf  s   
r  c              
   C   s  zt | }| jdkrt| j| jd}| st|j| jd}|r'|	 }t
j| jd j\}}|dd  	 |krEtd| d |tjvrQtdd	d
W S t|}|tj	 tj	 fv rftj	 }|d | }t|d}| jd  D ]}	||	 qyW d    n1 sw   Y  t| W S W d S  ty }
 ztddt|
 id	d
W  Y d }
~
S d }
~
w ty }
 ztdt|
id	d
W  Y d }
~
S d }
~
w ty }
 ztdt|
id	d
W  Y d }
~
S d }
~
ww )Nr   )r  filesr'  file_sourcer"   zlThe file extension doesn't match the type you selected from the Import menu.<br/>Please select a file with 'z' extension.zNot a valid import file format.r`   r^   
/uploaded.zwb+r  r   r  )r  r   rC   r   FILESr   rg  r   r   r  r  r  r  rL  r   VALID_IMPORT_FORMATSr   r1  r  r  r   chunksr  	getImportr   rX   rd   rc   )re   rw   r   r'  r  file_extensionr0  writeTodestinationchunkrf   rg   rg   rh   
uploadFilev  sF   




$  r  c              	      s   zqt | || |D ]2}zd|v r(tdt|d   |d }|d t| | W q	 ty;    fdd|D }Y q	w t| ||| |D ]}|d qE|D ]}	|	d qOt|dd}
t|dd}|D ]	}	|
d	 	|	 qe|
W S     )
Nr  zTUNNEL FAR ENDr  c                    s   g | ]}| d  kr|qS r  )r   )rG  dthisIdrg   rh   rI    s    z makeCommands.<locals>.<listcomp>F)r   Tr  )
r  r   rd   r   r  rN   r  rk  r  r   )re   rw   r   r  r  rc  rd  r  	targetMapr  cmnds	edgeCmndsrg   r  rh   makeCommands  s4   

r"  c                 C   sF   z| j dd}d}|D ]}|d d kr|d7 }q|d8 }|W S     )NT)r  r   r"   )r  )r  rowsneededItemsr  rg   rg   rh   countSpreadsheetRows  s   r%  c                 C   sR   |D ]$}| D ]}|d |d kr|d |d< q|d |d kr%|d |d< qq|S )Nr  r  r  r<  rg   )r  r  r  r  rg   rg   rh   makeNumericEndpoints  s   r&  c                 C   s:   zt | }t|d}|t|7 }|d7 }|W S     )N[})r  r   r  r}   r  )rw   r  dataStrrg   rg   rh   makeTransactionWithData  s   r*  c                 C   s:   zt | |}t|ddd}|| |  W d S     )Nr  r  rj  )r*  r   r  r   )rw   r  r  r)  chngMsgs_fprg   rg   rh   writeFileToBePulled  s   

r,  c              
   C   sN  zlt | jd }t| }| jdkr?| jdr?| jd}|r$| }t|}|tj	 tj
 fv r9tj
 }|d | }| jdr|tj	 tj
 fv rlt| dd}t| |dd}||d< tt|d	d
W S |tj krddlm} ||d}	t|	jd }
t|	jd }tt|
||dW S td| jdrkt| jd}|d }|d }|tj	 tj
 fv rt| dd}t| |d||dd}t|d }t||| tdd	d
W S |tj kr]ddlm} ||dd}	|	jd }dd tj D }|d |d |d |d t| ||||}g d}|	jd }t| ||||}t||}t| d||d }t| |d||dd}t|d }t||| tdd	d
W S d!d"i}tt|d	d
W S W d S  ty } ztd#t |id$d
W  Y d }~S d }~w ty } ztd!t |id$d
W  Y d }~S d }~ww )%Nrv   r   r'  r  countNeededProvisionalElementsT)rZ  rK  r]   r^   r   )load_workbook)r  r"   )r  r  r'  z#Unknown format in getImport step 1.provisionalElementsnodeIdsedgeIdsF)r  rc  rd  r{  z/changeMessages.jsonOK)r  	data_onlyc                 S   s   g | ]}|j  qS rg   )rL  r  r3  rg   rg   rh   rI  +  r  zgetImport.<locals>.<listcomp>rB  r  r  rL  )r  r  r  r  r  r  r<  )rZ  r[  r\  r  z)Error: This file format is not supported.r  r`   )!r{   r|   r  r   r   r   r  r1  r   r  r  r_  rb  r   r}   r  r  openpyxlr.  r%  
worksheetsrc   r~   r,  r#   r6  r7  r   r  r&  rg  rX   rd   )re   r   rw   r'  r0  importedFiler^  r  r.  r  neededNodesneededEdges	provElemsprovNodeIdsprovEdgeIds
importPathr  r8  r  r  r   rf   rg   rg   rh   r    s~   








7  r  c              
   C   s   z8t tjj|d}t|tjdd}t|tjdd}tj	|r-t
| dtj||ddW S t
| dtj|d	dW S  tyR } ztt |d
dW  Y d }~S d }~ww )Nr   Fr  Tzpublish.html)r   publishResultFile
graphtitler   zpublishEmpty.htmlr   r?  r`   r^   )rd   r&   r   r   r  r   r  r  r  r  r   r   rc   r   )re   rw   r?  publishFileabsPublishFilerf   rg   rg   rh   publishR  s   rD  c              
   C   s   z?t | }ttjj|d}t|tjdd}tj|d}t	j
|r2zt	| W n ty1    w t| d|W S t| d|W S  tyY } ztt|ddW  Y d }~S d }~w tyr } ztt|ddW  Y d }~S d }~ww )	Nr   Tr=  rA  zpublishFileNotFound.htmlzunPublishSuccess.htmlr`   r^   )r  rd   r&   r   r   r  r   r  r   r  r  r  r  r  r   r   rc   )re   rw   r?  rB  r   rf   rg   rg   rh   	unpublisha  s(   rE  c              
   C   s  z| j drt| ddtjidW S t| jd }| j d}t| }|tj	 tj
	 fv rit| |d| t||}| j drG| j d nt|d}| j d	rW| j d	 nt|d	}t||||d d |d
d n|tj	 krt| |d| t|tj}| j dr| j d nt|d}| j d	r| j d	 nt|d	}t||||d d |d
d t|tj}t|||| t| dtjdt|d tjddW S |tj	 krt| |d| t|tj}	dd l}
|
|	}t| || W d    n1 sw   Y  ntdd|d}t| d|ddW S  ty& } z	t| t|d }~w ty; } z	t| t|d }~w t yW } zt!dt|iddW  Y d }~S d }~w tyx } zt| t!dt|iddW  Y d }~S d }~ww )Nstep1zideatree/publishAreYouSure.htmlr   r@  rv   exportFormat	exportDotrP  rR  T)	exportingrD  zideatree/publishLink.htmlr  )linkToPublishedr   exportEXCELr   zUnsupported or missing format.z	download/)r  r'  zideatree/download.htmlz	text/htmlr   r  r`   r^   sysErr)"r   r   r   r   r   r{   r|   r  r  r  r  rI  r  r  rW  r  r  r  rX  r  r  r  rd   r  
xlsxwriterWorkbookr  rc   r   r   writeErrr  rg  rX   )re   r   rG  rw   dotOutputFilerP  rR  r]  r>  exportResultFilerM  r  r   rf   rg   rg   rh   exportx  s`   
    *


 
 rR  c                   @   sZ   e Zd ZdZejZg Zg Zg Z	dZ
dddZdd Zd	d
 Zde_ejfddZde_dS )rW  r  r   NFc	              
   C   s   z>|| _ || _|| _|| _|| _|| _|| _| | |   | 	  |  j
d7  _
t| jddd}	|	| j
 |	  W d S  tyR }
 ztdtt d }
~
w    )N}
r  r  rj  r   )_Graph2dotFile__mapIdoutfiler[  r\  rI  rR  rG  graphDefaults4Layout	nodes2dot	edges2dot_Graph2dotFile__graphSpecr   r  r   r   rc   rd   r   )r'  rw   rP  rR  dotFiler[  r\  rG  rI  dot_fprf   rg   rg   rh   r:    s(   
zGraph2dotFile.__init__c                 C   sv  z5t j}t j}t j}| jr| jt j krdnd}| jr'| jt j kr'dnd}d}| jr>| jt j kr>dt| d nd}| jrM| jt j krMdnd	}	tt j	}
| j
t jkr\d
nd}| j
t jfv rgdnd}| j
t jkrqd}| j
t jkrydnd}dtt j	 d }d}d}d}d}d}d}d}d}d}d}| jr| jt j krdndt j d }| jr| jt j krdndt j d }|  jd| | | | | d  | | | | d! | | d" |
 d | d# | d$ 7  _|  jd%| | |	 | d& | d$ 7  _| js| jt j ksd'nd(}|  jd)| | | d* | d+ | d, | d- | d$ 7  _W d.S     )/NzNimbusSans-BoldzDejaVuSans.ttfzratio="compress"r  g@z size="13.3," z fixedsize="false"z fixedsize="true"z splines="line" z splines="spline" z overlap="voronoi" z overlap="prism" z overlap="scale" z ranksep="4.0"  z ranksep="1.0" z inputscale="z sep="+16.0" z esep="+12.0" z nodesep="0.50" z margin="0.05" z weight="300" z len="0.5" z pin="true" z mindist="2.0" z  z pad="0.5" z fontsize ="42.0"z fontsize="z fontsize ="18.0"z/digraph IdeaTree {
graph [ notranslate="true"  z& compound="true"  concentrate="false" z maxiter="500" z truecolor="false" dpi="z
 rankdir="z"]
znode [z fontname="z arrowsize="2.0" z arrowsize="3.0" zedge [z arrowhead="normal" z= labeldistance="1.5" tailclip="true" headclip="true" color="#z" penwidth="z" fontname="T)r   NODEFONTSIZEr  r  rI  rG  r  r  rd   rz  rR  r`  ra  EDGEFONTSIZErY  )r'  rP  fontsizedefaultEdgePenwidthdefaultEdgePencolorfontpaspectratioheightInInchesr  	fixedsizedpisplinesoverlapranksep
inputscalesepedgesepnodesep
nodemargin
edgeweightedgelenpinmindistgraphmargingraphpadedgefontsizearrowheadsizerg   rg   rh   rV    sF   *
((^*">z"Graph2dotFile.graphDefaults4Layoutc                    s  fdd dd  fddzt jjjtjddjtjd	jtjd		d
}|D ]c}|j
r:j|j |j}|jd}d|d   d |d   d } jdt|j d | d |j d tj d tj d t|j d | d 7  _|j|j  jd7  _q.jst jjjddjtjd	jtjdjtjd	dd
}nj}|D ])}jrtjdi |}t|dr|j
dkrՈj|j  jd7  _ | qjstdW dS     ) Nc                    s  zt | dr
| jnd } jr| jtjkrd}t | dr%dt| j d nd}t | dr3d| j d nd}t | d	rAd
| j d nd}t | drOd| j	 d nd}t | dr]d| j
 d nd}t | drk| jd krkdnd}t | dr| jd krt | dr| jtjkr| jnd }|rd| d | d nd}	t | drt | drdt| j d t| j d }
nd}
d}t | dr| jd}d|d   d |d   d }t | dr  jdt| j d  t| j d |
 | | | | | | d! t| d |	 d" 7  _W d#S     )$Nr  r  r  z shape="r%  r  r  z style="r$  z fontcolor="#r  z fillcolor="#r  z pencolor="#r  _blank_selfr5  z URL="
" target="r  r  z pos="r  r   width="r   
" height="r"   r\  r  z" [ ID=" label="]
T)hasattrr  rI  r   r  r  r  r  r$  r  r  r  r5  r  rd   r  r  r  r  r  rY  r  )r  r  r  r  r$  r  r  r<  r5  hrefr  widthAndHeightr  )r'  rg   rh   	dot4Anode  s0    4"
$^z*Graph2dotFile.nodes2dot.<locals>.dot4Anodec                 S   s*   z| rd|  d } | W S d} | W S     )Nr|  r%  r  rg   )r  rg   rg   rh   makeLabelTagC  s   z-Graph2dotFile.nodes2dot.<locals>.makeLabelTagc                    s   zpj |  tjjj| djtjdjtj	d
d}|D ]N} jd7  _|jtjkr3 | q|} jdt|j d |j d tj d tj d	 t|j d
 | d 7  _|j|j  jd7  _qW dS     )Nr  r  r^   r  r"   subgraph clusterz' {
 style="filled,rounded" fillcolor="#
" lwidth="" fontsize="z" ID="clusterr%  
rS  T)_Graph2dotFile__clusterListr   r#   r   r   rT  r  r   r   r  r  _Graph2dotFile__totalNodesr  r  rY  rd   r  r  CLUSTER_LABEL_WIDTH_INCHESCLUSTER_LABEL_FONTSIZEr  )clustIdr  r  r  r  getClusterContentsr  r'  rg   rh   r  N  s   ,
Pz3Graph2dotFile.nodes2dot.<locals>.getClusterContentsr   )r  r  r  r^   r  r  rz  r{  r"   r\  r  z {
 z$ style="filled,rounded" fillcolor="#r  r  z" ID="r%  r  rS  r  r  z
-clusteridr  TzTYou can create a topic by dragging one of the icons at the upper right to this area.rg   )r#   r   r   rT  r   r  r  r   r  r  r  _Graph2dotFile__hidden_nodesr   r  r  r  r  r  rY  rd   r  r  r  r[  r   Structr~  r  rg  )r'  clustersr  r  r  r  r  r  rg   r  rh   rW    s:   '0
$X:
zGraph2dotFile.nodes2dotTc                 C   s  z | j stjj| jtjddddddd}n| j }|D ]}|d }|d }d|v r;| jtj	kr;dt
|d  d	 nd
}d|v rM| jrMt|d |d nd
}d| d	 }d|v rad|d  d	 nd
}d
}	d
}
|| jv rdt
| d	 }	dt
| d	 }	t
|}|| jv rdt
| d	 }
t
|}d
}d}| jsd}| jr| jr|| jv r|| jvrd}n|| jv s|| jv rd}d}|  jdt
| d t
| d t
| d t
| d |	 d |
 d t
|d  d | d | d | d | d | d 7  _qW dS     )Nr  r  r  r<  r  r  r  z cost="r\  r  r|  z	 color="#z lhead="z lhead="clusterz ltail="z style="solid" FTz style="invis" r%  z" -> "z" [ origin="ry  r  z ID="r}  )r\  r$   r   r   rT  r   r  r  rR  ra  rd   rI  r  r  r  _Graph2dotFile__branchHeadsrY  )r'  enginer  r  r  r<  r  r  r  edgeHeadClippingedgeTailClipping
constraintr  
collapsingrg   rg   rh   rX    sD   &,$

zGraph2dotFile.edges2dot)NNNF)r<  r=  r>  rY  r   rw  _Graph2dotFile__TEMPINVISFLAGr  r  r  r  r:  rV  rW  r  rS  rX  rg   rg   rg   rh   rW    s    
@u
*rW  c                 C   s    | rt | dkrdt|  S dS )Nr   wr  )r{   rd   )r  r  rg   rg   rh   r    s   r  c                    s8   zt    jt  fdd| D }t|W S     )Nc                 3   s$    | ]}| v s|r|V  qd S r  rg   )rG  r	  seenseen_addrg   rh   	<genexpr>  s   " z$_duplicatesInList.<locals>.<genexpr>)setaddr  )seq
seen_twicerg   r  rh   _duplicatesInList  s   
r  c                 C   s   z
dd |   D W S     )Nc                 S   s&   g | ]\}}|  D ]\}}|q
qS rg   )rD  )rG  rM  nbrsdictnbrkeydictrg   rg   rh   rI    s   & z"_adjacentNodes.<locals>.<listcomp>)	adjacency)Grg   rg   rh   _adjacentNodes  s   r  c              
   C   s  zdd l }t| }t|}t|}| }t| |dddd}|dd |D  ~| jddkr<| jd	d	kr<dnd}t	|d|d
}| jd	d	krS|
| n|| ~| jddkrtjj|d}	|	jstdtj d tj d tj d |	jstdtj d tj d tj d |||	jj|	jj}
~dd t|
dd  |
d d D }dd |D }tjjtj|d}tt }ttd}t |||}t!|d}g }|D ]}|"t#|jdtj$ q|D ]}|"t#|jdtj% q|t&'|7 }|d7 }t(|ddddW S t)d tj*yO   dtj d tj d tj d tj d  tj d }d!t| d" }t(t&'d#|d$dd% Y S  |j+j,y } z-d&tj d tj d' tj- d( tj d) tj- d* }t(t&'d#|d$dd%W  Y d }~S d }~w ty } zd!t| d" }t(t&'d#|d$dd%W  Y d }~S d }~w t.y } zd+}t|}t/||W  Y d }~S d }~w t)y } zt(t|d,d%W  Y d }~S d }~ww )-Nr   TF)r  r  r  c                 S   r2  rg   r  rL  rg   rg   rh   rI    r5  zanalyze.<locals>.<listcomp>	algorithmshortest_pathcosted)r  r  r[  zPlease right-click in the z and create a z,<br/>then connect it to one r  c                 S   s   g | ]}|qS rg   rg   )rG  zrg   rg   rh   rI    s    r"   r)  c                 S   s,   g | ]}t jj|d  |d tjdd  qS )r   r"   )r<  r  r_   )r$   r   r   r   r  )rG  r  rg   rg   rh   rI    s   , )r_   r  r   r'  r  r(  r]   r  r  r  zNo algorithm given.z and z,<br/>then connect each to one z on the r  r  r  )r  r  r^   zH<div class='prompt centerText eighteenChMINwidth'>No path found between z<br/><br/>NOTE: z can't be part of a path, but z
 within a z can.</div>r`  r`   )0networkxr  r  rd   MultiDiGraphr  add_nodes_fromr   r   r  add_weighted_edges_fromadd_edges_fromr0   r   r\  rg  r   r   rt  r   r]  ru  dijkstra_pathr  r  r$   r   r  r   r  r   r   r  r  r   r  r  EDGE_ANALYSIS_COLORr}   r  r   rc   rI  	exceptionNetworkXNoPathro  rN   rh  )re   nx__mapIdoutdirrL  bigGr  r  r  	endpoints	shortpathshortPathEdgesallEdgesr  r  r)  changesListr  rf   r_   r   rg   rg   rh   analyze  sx   (
&&$66$$r  c              
   C   s   z t | }tjj|tjddd}|tjd}t| d|W S  t	y@ } zdt
|i}t| d|dd	W  Y d }~S d }~w tyY } ztt
|d
dW  Y d }~S d }~ww )Nnode__ofmapr_   r  date)commentsr   z ideatree/nodeCommentSummary.htmlr  r^  r_  r   r`   r^   )r  r+   r   r   r   r:  r  r   r   rg  rd   rc   r   )re   rw   r  r   rf   rg   rg   rh   commentSummary0  s   r  c              
   C   s   z(t |  t| jd }|D ]}tjj|d dj|d< qt| d|t	j
dW S  tyB } ztt|ddW  Y d }~S d }~ww )	Nr  r  r   	ownernamezideatree/mapSummary.html)mapsr   r`   r^   )r  r}   r~   r|   r    r   r   rn   r   r   r   rc   r   rd   )re   r  r  rf   rg   rg   rh   
mapSummaryE  s   r  c              
   C   s   zFt | }| jdrtdtjjt| jd d}t| j}|	 r@|j
d }|j
d }tjj||d|id tdd	d
W S tddd
W S  tya } zd}t|t|W  Y d }~S d }~w tyz } ztt|ddW  Y d }~S d }~ww )Nrr  <Sorry, you are viewing in read-only mode, so you can't vote.rv   r   r  vote)rp   r  rC  r`  zThank you for your vote!r  r`   z$Internal error: invalid vote format.r^   )r  r|   r   rg  r    r   r{   rB   r   r   r   r,   r5  rh  rd   rc   r   )re   rw   
votingUserr   votableNodeId	voteLevelrf   r_   rg   rg   rh   r  V  s(   


r  c              
   C   s   zAt | }d| jv rtdt|t| jd vr#tdtj d tj	j
|tjd}| }|dd}t| d	||tjd
W S  tya } zdt|i}t| d|ddW  Y d }~S d }~w tyz } ztt|ddW  Y d }~S d }~ww )Nrr  r  r  zBSorry, this function is reserved for the original creator of this r  r  node__labelr  zideatree/tallyvotes.html)votes
totalVotesr   r  r^  r_  r   r`   r^   )r  r|   rg  rd   r}   r  r   r   r,   r   r   VOTABLE_ACTIVEr  r  r   rc   r   )re   rw   r  r  rf   r   rg   rg   rh   
tallyVotess  s$   
r  c              
   C   s   z>t | }t| jd }d| jd v r-| jd }tjjtj|tj	dj
tjdj
tjd}d| jv r3	 d| jv r<	 W d S W d S  ty^ } zdt|i}t| d|d	d
W  Y d }~S d }~w tyw } ztt|ddW  Y d }~S d }~ww )Nrv   f_id)r_   r  friend__status)friend__accounttypeallowdenyr  r^  r_  r   r`   r^   )r  r{   r|   r   r%   r   r   r   r  USER_ACTIVEr  r   READONLY_ACCTrg  rd   r   rc   r   )re   rw   r   friendfriendsrf   r   rg   rg   rh   mapAccessTable  s&   
*

r  c              
   C   s2  zt | }d| jvrt }nt| j}| r|jd f}t|rsd}tj}d}z"t||||dd d|d< t	j
jt| jd	 d
}tj
j|d W nw tyX   td Y W S  tyr }	 zdt|	j |d< W Y d }	~	nTd }	~	ww |jd }
|jd }d|dt|
i}tjstdt	j
jd&i |jt| jd	 d
jtjd}| }t|}t| | ||ddd}t| d|W S dd tt dt dd D }|d|d}t| d|W S  t!y }	 zd t|	i}t| d!|d"d#W  Y d }	~	S d }	~	w ty }	 ztt|	d$d%W  Y d }	~	S d }	~	ww )'NdoSearchr   zCome join us.z*Invitation To Collaborate From A ColleagueFfail_silentlyz+Your invitation has been sent successfully!r>  rv   r   )r  zInvalid header found.z$Error while sending the invitation: 
searchTerm
searchTypez{0}__{1}istartswithz%Missing guest username for exclusion.)rn   zSearch ResultszSearch Again)numUsersFoundtabler  navbuttontextideatree/searchUserResults.htmlc                 S   s   g | ]}|t |fqS rg   )chr)rG  alphaOrdrg   rg   rh   rI    s    zsearchUsers.<locals>.<listcomp>AZr"   zSearch Users)r   r  alphabetListzideatree/searchUsers.htmlr  r^  r_  r   r`   r^   rg   )"r  r   r<   r   r   anyr   DEFAULT_FROM_EMAILr!   r    r   r   r{   r|   r%   r5  r   r   r   rd   reasonr'  ro   rc   r   r  r  r:   rV   	configurer   r  ordrg  )re   rw   r   r   r   fromAddrsubjectr   r  rf   r  r  r   
foundUsersr  r  r  rg   rg   rh   searchUsers  sX   



. r  c              
   C   s  zt | jd }d| jv r| jd nd }g }tjj|tjd}|D ]A}tjj|j	|tj
ddd}|D ]-}i }|jj|d< |jj|d< |jj|d	< |jj|d
< |jj|d< |jj|d< || q4q!|rmt|dd d}t|}	t| |	 |	tj d dtj  d d}
t| d|
W S  ty } zdt|i}
t| d|
ddW  Y d }~S d }~w ty } ztt|ddW  Y d }~S d }~w ty } ztt|ddW  Y d }~S d }~ww )Nrv   z?sort)initiator_idr_   )r  ofmap__owner_idr_   r  r  rW  mapidr  rn   r   r   c                 S   r  )Nrn   rg   r  rg   rg   rh   r    r  zshareMap.<locals>.<lambda>r  zs You've SharedzShare Current r  )r  r  r  r  r  r^  r_  r   r`   r^   ) r{   r|   r   r%   r   r   r   r  r'   r  r  r  r  rW  r  r  rn   r   r   r   r  r9   rV   r  r   r  r   rg  rd   rQ   r   rc   )re   rK  sortby
sharedWith	myfriendsfrmmrH  r  r  r   rf   rg   rg   rh   shareMap  sD   	
$r  c           	   
   C   s   zFt | }t| jd }t| | tjj|d }t| j	|d}|
 rB|jd j}tjj||tjd tjj||d t| W S t|j ty` } ztt|ddW  Y d }~S d }~w ty| } zd	}t|}t||W  Y d }~S d }~ww )
Nrv   )r  r^  r  )r  r  r_   r  r`   r^   r`  )r  r{   r|   r  r%   r   r   firstr@   r   r   r   r  r5  r   r  r'   r   r  rc   r   r   rd   rN   rh  )	re   rw   myUserIdr_  r   newFriendIdrf   r_   r   rg   rg   rh   addUserToMap,  s*   


r   c              
   C   s   z%t | jd }t | jd }t| | tjj||djtjd t	| W S  t
y? } ztt|ddW  Y d }~S d }~w ty[ } zd}t|}t||W  Y d }~S d }~ww )Nrw   r   r  r^   r`   r`  )r{   r   r  r'   r   r   r   r   rS  r  rc   r   rd   rN   rh  )re   rw   r   rf   r_   r   rg   rg   rh   removeFromMapJ  s   

r  c              
      s   z6t | jd }t | jd  t|}t fdd|D r0tjj| djt	j
d t| W S tdddW S  tyP } ztt|d	dW  Y d }~S d }~ww )
Nrv   teamMemberIdc                 3   s     | ]}|d  t  kV  qdS )r  N)r{   )rG  r  
teamMemberrg   rh   r  l  s    z"removeFromGroup.<locals>.<genexpr>)r  r  r^   z*Internal Error: this user is not a friend.i  r`   )r{   r|   r   r  r  r%   r   r   r   r   FRIEND_DELETED
manageTeamr   rc   rd   )re   r  r  rf   rg   r  rh   removeFromGroupb  s   
r  c              
   C   sN  zt | }t| | d}t| jd }d| jd i}tjj|tjdj	|d}|r0|
ddi | jd	s>t|d
d
d}nt| jd
|dd}| rd}tj}	d}
tjj| jd d}d|j d }|rm|d| d 7 }|d|jd  7 }g }|jd D ]}|jjr||jj q}|stdzt|
||	|d
d t|dd
d}W n2 ty } z&|rdt|i}t| d|ddW  Y d }~W S tdt|dW  Y d }~W S d }~ww |r|
||tjd t| d|W S W d S  ty } zdt|i}t| d|ddW  Y d }~S d }~w ty& } ztt|d d!W  Y d }~S d }~ww )"Nr  rv   thisMapNamerW  r  rH  mapHasSharersTr   F)r  clearemailbody_required)r
  r  r  z(Your message has been sent successfully!z"Notice From A Fellow IdeaTree Userr   zFrom: r  zRe: z

Message:
	emailbodyr  z,No email address found for selected user(s).r  r  r^  r_  r   r`  r  )r   r>  r   zideatree/notify.htmlr`   r^   )r  r  r{   r|   r'   r   r   r   r  r  r   r   r   r;   r   r  r    rn   r   r  r   r   rg  r!   rc   rd   r   rh  r   r   )re   rA  rB  rw   r>  rK  r   r  r   r  r  r   r   emailsselectedUserrf   rg   rg   rh   rL  v  sd   
rL  c              
   C   s  zXt | jd }t| j}| stdt|j	d}|s-t
jj|djtjd n&tt
jj	|dj}| D ]\}}|||< q<t
jj|djt|d tddW S  t
jyh   tdt|  ty } ztt|d	d
W  Y d }~S d }~ww )Nrv   z"Internal error: Invalid data sent.r  r  )r  r]   r  z#User profile does not exist for id:r`   r^   )r{   r|   r=   r   r   rc   r}   r~   r   r   r)   r   r   r   r   USER_DEFAULT_MAP_SETTINGSr  rD  r  rh  rI  rd   r   )re   r   r   new_mapsettingsr  rO  r7  rf   rg   rg   rh   saveMapSettings  s&   

r  c              
   C   s   z%t | }g }tjdj|d}|D ]	}||jj qtdd|idW S  t	y? } zt
t|ddW  Y d }~S d }~ww )Nrp   )rz   r]   r  r  r`   r^   )r  r.   r   r  r   r   rp   rn   rh  rc   r   rd   )re   rw   vListviewersvrf   rg   rg   rh   whosLoggedIn  s   r  c              
   C   sv   dd l }ddlm} z|| }||j}|d}t|r'|d j}|W S W dS  |j	y: } zt
dd }~ww )Nr   )htmlz/html/head/titler  z1Looks like that site may have refused connection.)requestslxmlr  r   
fromstringr   xpathr  r  RequestExceptionrg  )r5  r  r  pagetreer  rf   rg   rg   rh   get_remote_title  s   


r  c              
   C   s   zFdd l }| jdr| jd }n	tdddidW S || ttj|s/t	dtj
 d t|}|r>ttj|s>d	}td
d|idW S  t	y` } ztdt|dW  Y d }~S d }~w tyy } ztt|ddW  Y d }~S d }~ww )Nr   	remoteURIr`   r  NO_URI_SUPPLIEDr  zaSorry, that site's link did not pass the safety test,<br/>so it can't be used to create a linked z&.<br/><br/>Always looking out for you.r  r]   r`  r^   )
validatorsr   r   rh  r5  r3  r4  r   URL_SAFETY_REGEXrg  r   r  r5  rd   rc   r   )re   r!  r5  r  rf   rg   rg   rh   getRemoteSiteTitle  s(   
r#  rm   r  r  )FF)r  FF)T)NN)FTFF)FFN)r9  Nr  )NNNrs   )FNN)r   r   FN)FNNF)TN(H  r  r  r  r"  r}   r  r  r3  r  django.views.decorators.csrfr   r  
subprocessr   r   r   stringr   rb  r   r   ideatree.itreeFirebaser	   r
   r   ra   r   django.contrib.auth.signalsr   django.dispatchr   copyr   django.corer   r   r   django.utilsr   dateutil.relativedeltar   	django.dbr   r   django.core.mailr   smtplibr   django.confr   r  r   r   r  rc  r   r   django.urlsr   django.forms.utilsr   django.contrib.auth.modelsr    r!   modelsr#   r$   r%   r&   r'   r(   r)   r*   r+   r,   r-   r.   r/   r0   r1   rJ  r2   r3   r4   r5   r6   r7   r8   r9   r:   r;   r<   r=   r>   r?   r@   rA   rB   rC   rD   rE   rF   rG   django.contrib.auth.decoratorsrH   allauth.account.decoratorsrI   rJ   %django.contrib.admin.views.decoratorsrK   django.formsrL   r  rM   django.core.exceptionsrN   rO   rP   rQ   rR   rS   collectionsrT   django.db.modelsrU   django_tables2rV   rW   rX   r   r   rY   pdbrZ   ri   rl   rr   ru   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r  r  r  r'  r8  rR  rk  r  rp  rs  rt  rw  rx  ry  rz  r{  r|  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r
  r  r  r  r  r  r  r  r  r  r1  r2  r3  r6  r  r   rA  r;  r<  rD  rV  rW  r  rd  rg  rq  r|  ra  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r
  r  rh  r#  r$  r  r  r  r  r  r  r  r  r  r  r  r  rI  r  r
  r  r  rF  r  rJ  r+  r<  rO  rQ  rT  r_  rU  rb  rx  rS  rX  r  r  r  r  r  r  r  compiler  r  r  r  r  r  r  r"  r%  r&  r*  r,  r  rD  rE  rR  rW  r  r  r  r  r  r  r  r  r  r  r  r   r  r  rL  r  r  r  r#  rg   rg   rg   rh   <module>   sF   D` 




		
&
$5(
 
M
(
			
	
$
6	)
A
S\'#S    .(;Jn>s>
[F \J/J J156 '$

a8  E-1.7