B
    YfN/                 @   s   d Z ddlZddlZddlmZ ddlZddlmZ ddl	T 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 G dd dejjeZdS )u  
Документация по выдаче VM: https://bcrm.carbonsoft.ru/project/Document/DOC-000884
Если кратко:
+----------+--------+-----------------------+
|   Этап   |  View  |      Supervisor       |
+----------+--------+-----------------------+
| Register | Signup | ---                   |
| Assign   | CRM    | cloud_assign_vm.sh    |
| Prepare  | CRM    | vm_assign_prepare.sh  |
| Branding | CRM    | vm_assign_branding.sh |
+----------+--------+-----------------------+
    N)abort)commit_all_ds)*)ResponseMixin   )
send_emailnormalize_email_address)normalize_phone)
Supervisor)validate_org_namec               @   s   e Zd ZdZdej dZde  dZe	j
jdd Ze	j
jdd	 Zed
d Ze	j
jdd Ze	j
jdd Zdd ZdS )
SignupViewz/signupu,   Обратитесь в <a href="https://wwwu9   /support/">техническую поддержку</a>.u   Перейти в <a href="u   ">Ваш профиль</a>?c             C   s   t jr
dS | dS )Nu{   Регистрация без приглашения не поддерживается в коробочной версииzsignup.html)configIS_BOX_VERSIONZrender)self r   ./modules/auth/views/signup.pyget$   s    zSignupView.getc             C   s   t jr
dS ttjd }tjd }tjd }tjd }tjj|d}|rZtdd| d	 tj	|||}|s~t
d
 td ||_|  |j  dS )Nu{   Регистрация без приглашения не поддерживается в коробочной версииloginhashsaltphone)r   i  u   Пользователь u'    уже зарегистрирован.znot authzSigned up successfully)r   r   r   requestvaluesmodelsCmfAuthr   r   Znew_from_login_hash_saltr   r   saveZdpZcommit)r   r   _hashr   r   authr   r   r   post*   s"    



zSignupView.postc             C   s*   t j| | ||d}| }|  ||fS )N)r   emailorg_namer   )r   r   reset_passwordr   )r   r    r   r   passwordr   r   r   _create_authC   s    zSignupView._create_authc          
   C   s  t jr
dS tjs| ddS tjjj}tjj	|d}|sD| ddS |j
sP|jrb| dd| j S |jj}ddd	}|sd
|d< x,| D ] \}}tj	|s| d|S qW tjd dddd}tjd  }tj	d}	|	stj	d}	tj	dd}
|s^tj	dr^tj	d}t|}y||_|  W n" tk
r\   | jddddS X t|\}}|s|| d|S t  yt|||||	|
\}}}W n2 tk
r } ztd |W dd}~X Y nX | tddt j  d i|S )u  
        Запрос приходит от авторизованного пользователя из account.evacrm.ru
        Позволяем продолжить выдачу виртуалки в случае если первая попытка провалилась, но учётку создали
        Не отправляем запрос напрямую в cloud_assign_supervisor_call, здесь валидируем то что:
        1. Юзер авторизован.
        2. Его учётка есть в БД.
        3. У него нет виртуалки (иногда происходит, сделали хак _cloud_assign_continue_crm_already_exists).
        u{   Регистрация без приглашения не поддерживается в коробочной версииi  uV   Зарегистрируйтесь, чтобы получить демо-версию.)r   uL   Ваша учётная запись, похоже, была удалена.u*   У вас уже есть продукт. u=   Укажите адрес входа для продукта.uO   Укажите название компании для регистрации.)r    companyu   Проверьте введенные данные, номер телефона должен содержать от 11 до 14 символов.r   r$   " 'r    	user_nameZlead_contact_namelanding_projectZ
evaprojectu@   Введите корректный номер телефона.)Zproblem_fielduD   Не удалось выдать виртуальную машинуNhostnameZaccountz/auth/signin?action=proceed)!r   r   gr   _errorr   valuer   r   r   Zscopegroups__support__r   itemsr   ZjsonreplacestripZcookiesr	   r   ZCmfValidationErrorr   r   r
   Zcloud_assign	Exceptionlogging	exceptionZ_okZjsonifyAUTH_SESSION_COOKIE_DOMAIN)r   r   r   r   Zerror_messageskeymessager$   r    r(   r)   ZresZerr_textr*   outerrr   r   r   cloud_assign_continueJ   sX    


z SignupView.cloud_assign_continuec          
   C   s  t tjd }tjdd}t|dkr,d}tjd }tj|}t	|d d }||dt
|d	  |dt
|d	   krtjr|dt
|d	  }ytjj|d
gd}|r|jjrtd|| | }|jdd}| ||jj n$td|| tdd d| }nNtd|| tj||d}| }|rJd|_|jdd}| ||jj dtj }	| jd|dg}
t|
|	|jj W n@ tk
r } z td | ddt| S d}~X Y nX t  dS )u   
        Приглашение по email. В эту функцию долбится CRM с уже подготовленным JWT-токеном.
        :return:
        r   invite_must_change_passwordN)FalseZfalseNone0Finvite_tokenZpayloadissr   	pass_hash)r   Zfieldsu   INVITE. Отправляем существующему пользователю {} письмо с инвайтом в crm {} и высылаем ему письмо с паролемZinvite)Zendpointu~   INVITE. Отправляем существующему пользователю {} письмо с инвайтом в crm {}T)absolutezauth/signin?next_url=https://uz   INVITE. Создаем пользователя {} для crm {} и высылаем ему письмо с паролем)r   r      u&   Ссылка для доступа к zinvite_by_email.html)Z
invite_urlu8   Не удалось зарегистрироватьсяi  u:   Не удалось зарегистрироваться: zSigned up successfully) r   r   r   r   strr   r   Zcheck_tokenshlexZquotelenr   r   rB   Zis_nullprintformatr!   Zreset_pass_linksend_passwordr   r-   auth_base_hrefZpassword_expires_must_changeHOSTNAME_FQDNrender_with_paramsr   r3   r4   r5   r,   r   )r   r   r<   r@   ZjwtrA   r   r"   Zurlsubjectmsg_contentser   r   r   invite_by_email   sH    
2

$zSignupView.invite_by_emailc             C   s<   t dd d}| jd||d}dtj }t||| dS )u   
        Некрасивый дубль models.CmfAuth.send_password(), потому что неясно как делать вызов View -> Model -> View
        T)rC   zauth/signin?action=proceedzsend_password.html)r"   proceed_linku&   Пароль для доступа к N)rK   rM   r   rL   r   )r   r"   r   rR   rO   rN   r   r   r   rJ      s    zSignupView.send_passwordN)__name__
__module____qualname__Z__url__r   r6   r/   rK   Z__profile__cmfviewsactionr   r   staticmethodr#   r;   rQ   rJ   r   r   r   r   r      s   D9r   )__doc__rF   ZidnaZflaskr   Z	cmf.viewsrV   Zcmf.data_providers.baser   Zcmf.includeZmodules.auth.views.responser   Zmodels.emailr   r   Zmodels.phoner	   Zmodels.supervisorr
   Zmodels.org_namer   rW   ZBaseViewr   r   r   r   r   <module>   s   