U
    ✀d<                     @   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 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)*)acrm_register)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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   sv   t jr
dS ttjd }tjd }tjd }tjd }tj|||}|sZtd t	d ||_
|  |j  dS )	Nr   loginhashsaltphoneznot auth  Signed up successfully)r   r   r	   requestvaluesmodelsCmfAuthZnew_from_login_hash_saltr   r   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_auth>   s    zSignupView._create_authc                 C   s  t jr
dS dtjkr$| jddddS ttjd }tjj|d}|rjd}|dt j	 d	7 }| jd|ddS tjd
}|rt
|}ztj|d W n$ tk
r   | jddd
d Y S X tjd}|rt|\}}|s| jd|ddS z*t|d|\}}tf tjddi W n(   td | dd| j  Y S X z| ||jj W n   td| Y nX |s| dd| j S | d|S )u6  
        Регистрируем пользователя по одному лишь email
        Заодно создаём "отложенного" лида.
        :request.param: login - email.
        :return: билеты авторизации с пустым scope, но с логинам.
        r   r   r   u8   Укажите логин для регистрации.Zproblem_fieldr   uv   Этот e-mail уже зарегистрирован. Попробуйте другой или перейдите в z	<a href="u   ">Ваш профиль</a>r   )r   @   Введите корректный номер телефона.r$   NZ	lead_typeZ
email_onlyu?   Не удалось создать учётную запись.  u@   Не удалось создать учётную запись. ur   Не удалось отправить человеку %s пароль. Потом сам восстановит.8   Не удалось зарегистрироватьсяu3   Удалось зарегистрироваться)r   r   r   r   _errorr	   r   r   r   AUTH_SERVER_URLr
   CmfValidationErrorr   r   r'   r   logging	exception__support__send_passwordr#   value_ok)r   r   r!   Z
error_textr   r$   resr&   r   r   r   registerE   sF    

zSignupView.registerc              
   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   r8   " 'r$   	user_nameZlead_contact_namelanding_projectZ
evaprojectr*   r(   uD   Не удалось выдать виртуальную машинуNhostnameZaccount/auth/signin?action=proceed)!r   r   gr!   r-   r#   r4   r   r   r   Zscopegroupsr2   r   itemsr   ZjsonreplacestripZcookiesr
   r   r/   r   r   r   Zcloud_assign	Exceptionr0   r1   r5   ZjsonifyAUTH_SESSION_COOKIE_DOMAIN)r   r   r!   r   Zerror_messageskeymessager8   r$   r<   r=   r6   Zerr_textr>   outerrr   r   r   cloud_assign_continuex   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 }zt
|}W n* tk
r   td	 | d
d	 Y S X tj||}|std|| ||dt|d  |dt|d   krtjr|dt|d  }ztjj|dgd}|rp|jjrNtd|| | }	|jdd}
| |	|jj n td|| tj d| }
nNtd|| tj||d}| }	|rd|_|jdd}
| |	|jj dtj  }| j!d|
dg}t"|||jj W nH t#k
r4 } 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issuJ   Не удалось прочитать публичный ключ EvaTeamr+   uN   Не удалось валидировать токен для %s от CRM %s!r   	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_urlr,   u:   Не удалось зарегистрироваться: r   )%r	   r   r   r   strr   r   Zrsa_unpack_jwtshlexZquoter   Zread_crm_pub_keyRuntimeErrorr0   r1   r-   Zrsa_verify_jwterrorlenr   r   rR   Zis_nullprintformatr%   Zreset_pass_linkr3   r#   r4   r.   Zpassword_expires_must_changePROJECT_NAMErender_with_paramsr   rE   r   )r   r#   rL   rP   ZjwtrQ   Zcrm_pub_keyZverifyr!   r&   Zurlsubjectmsg_contentser   r   r   invite_by_email   s^    

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   r.   r\   r[   r   )r   r&   r#   ra   r^   r]   r   r   r   r3      s    zSignupView.send_passwordN)__name__
__module____qualname__Z__url__r   rF   r2   r.   Z__profile__cmfviewsactionr   r"   staticmethodr'   r7   rK   r`   r3   r   r   r   r   r      s    



2
C
Br   )__doc__rU   ZidnaZflaskr   Z	cmf.viewsre   Zcmf.data_providers.baser   Zcmf.includeZcommon.acrmr   Zmodules.auth.views.responser   Zmodels.emailr   r	   Zmodels.phoner
   Zmodels.supervisorr   Zmodels.org_namer   rf   ZBaseViewr   r   r   r   r   <module>   s   