U
    L!fH/                     @   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j 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 )N{   Регистрация без приглашения не поддерживается в коробочной версии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 )Nr   loginhashsaltphoner     u   Пользователь u'    уже зарегистрирован.znot auth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< | D ]$\}}tj	|s| d|  S qtjd dddd}tjd  }tj	d}	|	stj	d}	tj	dd}
|sbtj	drbtj	d}t|}z||_|  W n& tk
r`   | jdddd Y S X t|\}}|s| d|S t  zt|||||	|
\}}}W n2 tk
r } ztd |W 5 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).
        r   r   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account/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-   resZerr_textr.   outerrr   r   r   cloud_assign_continueJ   s\    


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	  }ztjj|d
gd}|r|jjrtd|| | }|jdd}| ||jj n td|| tj d| }nNtd|| tj||d}| }|rFd|_|jdd}| ||jj dtj }	| jd|dg}
t|
|	|jj W nH tk
r } z(td | ddt|  W Y 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 {}z/auth/signin?next_url=https://uz   INVITE. Создаем пользователя {} для crm {} и высылаем ему письмо с паролем)r   r#      u&   Ссылка для доступа к zinvite_by_email.html)Z
invite_urlu8   Не удалось зарегистрироватьсяi  u:   Не удалось зарегистрироваться: r   ) r   r   r   r   strr   r   Zcheck_tokenshlexZquotelenr   r   rH   Zis_nullprintformatr%   Zreset_pass_linksend_passwordr#   r2   AUTH_SERVER_URLZpassword_expires_must_changeHOSTNAME_FQDNrender_with_paramsr   r8   r9   r:   r1   r   )r   r#   rB   rF   ZjwtrG   r!   r&   Zurlsubjectmsg_contentser   r   r   invite_by_email   sN    
2 
,zSignupView.invite_by_emailc                 C   s8   t j d}| jd||d}dt j }t||| dS )u   
        Некрасивый дубль models.CmfAuth.send_password(), потому что неясно как делать вызов View -> Model -> View
        r/   zsend_password.html)r&   proceed_linku&   Пароль для доступа к N)r   rP   rR   rQ   r   )r   r&   r#   rW   rT   rS   r   r   r   rO      s    zSignupView.send_passwordN)__name__
__module____qualname__Z__url__r   r;   r4   rP   Z__profile__cmfviewsactionr   r"   staticmethodr'   rA   rV   rO   r   r   r   r   r      s   



C
8r   )__doc__rK   ZidnaZflaskr   Z	cmf.viewsr[   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   r\   ZBaseViewr   r   r   r   r   <module>   s   