Start to build edit user form
This commit is contained in:
		@@ -1,3 +1,5 @@
 | 
			
		||||
use std::ops::Deref;
 | 
			
		||||
 | 
			
		||||
use actix::Addr;
 | 
			
		||||
use actix_web::{HttpResponse, Responder, web};
 | 
			
		||||
use askama::Template;
 | 
			
		||||
@@ -23,6 +25,14 @@ struct UsersListTemplate {
 | 
			
		||||
    users: Vec<User>,
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
#[derive(Template)]
 | 
			
		||||
#[template(path = "settings/edit_user.html")]
 | 
			
		||||
struct EditUserTemplate {
 | 
			
		||||
    _parent: BaseSettingsPage,
 | 
			
		||||
    u: User,
 | 
			
		||||
    clients: Vec<Client>,
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
pub async fn clients_route(user: CurrentUser, clients: web::Data<ClientManager>) -> impl Responder {
 | 
			
		||||
    HttpResponse::Ok().body(ClientsListTemplate {
 | 
			
		||||
@@ -48,4 +58,12 @@ pub async fn users_route(user: CurrentUser, users: web::Data<Addr<UsersActor>>)
 | 
			
		||||
        ),
 | 
			
		||||
        users,
 | 
			
		||||
    }.render().unwrap())
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
pub async fn create_user(user: CurrentUser, clients: web::Data<ClientManager>) -> impl Responder {
 | 
			
		||||
    HttpResponse::Ok().body(EditUserTemplate {
 | 
			
		||||
        _parent: BaseSettingsPage::get("Create a new user", user.deref(), None, None),
 | 
			
		||||
        u: Default::default(),
 | 
			
		||||
        clients: clients.cloned(),
 | 
			
		||||
    }.render().unwrap())
 | 
			
		||||
}
 | 
			
		||||
@@ -1,6 +1,5 @@
 | 
			
		||||
pub mod app_config;
 | 
			
		||||
pub mod entity_manager;
 | 
			
		||||
pub mod service;
 | 
			
		||||
pub mod session_identity;
 | 
			
		||||
pub mod user;
 | 
			
		||||
pub mod client;
 | 
			
		||||
 
 | 
			
		||||
@@ -1,2 +0,0 @@
 | 
			
		||||
#[derive(Debug, Clone, serde::Serialize, serde::Deserialize, PartialEq, Eq)]
 | 
			
		||||
pub struct ServiceID(String);
 | 
			
		||||
@@ -1,5 +1,5 @@
 | 
			
		||||
use crate::data::client::ClientID;
 | 
			
		||||
use crate::data::entity_manager::EntityManager;
 | 
			
		||||
use crate::data::service::ServiceID;
 | 
			
		||||
use crate::utils::err::Res;
 | 
			
		||||
 | 
			
		||||
pub type UserID = String;
 | 
			
		||||
@@ -18,10 +18,17 @@ pub struct User {
 | 
			
		||||
 | 
			
		||||
    /// None = all services
 | 
			
		||||
    /// Some([]) = no service
 | 
			
		||||
    pub authorized_services: Option<Vec<ServiceID>>,
 | 
			
		||||
    pub authorized_services: Option<Vec<ClientID>>,
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
impl User {
 | 
			
		||||
    pub fn can_access_app(&self, id: &ClientID) -> bool {
 | 
			
		||||
        match &self.authorized_services {
 | 
			
		||||
            None => true,
 | 
			
		||||
            Some(c) => c.contains(id)
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    pub fn verify_password<P: AsRef<[u8]>>(&self, pass: P) -> bool {
 | 
			
		||||
        verify_password(pass, &self.password)
 | 
			
		||||
    }
 | 
			
		||||
@@ -47,7 +54,7 @@ impl Default for User {
 | 
			
		||||
            need_reset_password: false,
 | 
			
		||||
            enabled: true,
 | 
			
		||||
            admin: false,
 | 
			
		||||
            authorized_services: None,
 | 
			
		||||
            authorized_services: Some(Vec::new()),
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
 
 | 
			
		||||
@@ -119,6 +119,7 @@ async fn main() -> std::io::Result<()> {
 | 
			
		||||
                .to(|| async { HttpResponse::Found().append_header(("Location", "/settings")).finish() }))
 | 
			
		||||
            .route("/admin/clients", web::get().to(admin_controller::clients_route))
 | 
			
		||||
            .route("/admin/users", web::get().to(admin_controller::users_route))
 | 
			
		||||
            .route("/admin/create_user", web::get().to(admin_controller::create_user))
 | 
			
		||||
    })
 | 
			
		||||
        .bind(listen_address)?
 | 
			
		||||
        .run()
 | 
			
		||||
 
 | 
			
		||||
							
								
								
									
										99
									
								
								templates/settings/edit_user.html
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										99
									
								
								templates/settings/edit_user.html
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,99 @@
 | 
			
		||||
{% extends "base_settings_page.html" %}
 | 
			
		||||
{% block content %}
 | 
			
		||||
 | 
			
		||||
<form method="post" target="/admin/users">
 | 
			
		||||
    <!-- User ID -->
 | 
			
		||||
    <div class="form-group">
 | 
			
		||||
        <label class="form-label mt-4" for="userID">User ID</label>
 | 
			
		||||
        <input class="form-control" id="userID" type="text" readonly=""
 | 
			
		||||
               name="uid" value="{{ u.uid }}"/>
 | 
			
		||||
    </div>
 | 
			
		||||
 | 
			
		||||
    <!-- User name -->
 | 
			
		||||
    <div class="form-group">
 | 
			
		||||
        <label class="form-label mt-4" for="username">User name</label>
 | 
			
		||||
        <input class="form-control" id="username" type="text"
 | 
			
		||||
               name="username" value="{{ u.username }}" required/>
 | 
			
		||||
    </div>
 | 
			
		||||
 | 
			
		||||
    <!-- First name -->
 | 
			
		||||
    <div class="form-group">
 | 
			
		||||
        <label class="form-label mt-4" for="first_name">First name</label>
 | 
			
		||||
        <input class="form-control" id="first_name" type="text"
 | 
			
		||||
               name="first_name" value="{{ u.first_name }}"/>
 | 
			
		||||
    </div>
 | 
			
		||||
 | 
			
		||||
    <!-- Last name -->
 | 
			
		||||
    <div class="form-group">
 | 
			
		||||
        <label class="form-label mt-4" for="last_name">Last name</label>
 | 
			
		||||
        <input class="form-control" id="last_name" type="text"
 | 
			
		||||
               name="last_name" value="{{ u.last_name }}"/>
 | 
			
		||||
    </div>
 | 
			
		||||
 | 
			
		||||
    <!-- Email -->
 | 
			
		||||
    <div class="form-group">
 | 
			
		||||
        <label class="form-label mt-4" for="email">Email address</label>
 | 
			
		||||
        <input class="form-control" id="email" type="email"
 | 
			
		||||
               name="email" value="{{ u.email }}"/>
 | 
			
		||||
    </div>
 | 
			
		||||
 | 
			
		||||
    <div class="form-group mt-4">
 | 
			
		||||
        <!-- Generate new password -->
 | 
			
		||||
        <div class="form-check">
 | 
			
		||||
            <input class="form-check-input" type="checkbox" name="gen_new_password" id="gen_new_password" {% if
 | 
			
		||||
                   u.password.is_empty() %} checked="" {% endif %}>
 | 
			
		||||
            <label class="form-check-label" for="gen_new_password">
 | 
			
		||||
                Generate a new temporary password
 | 
			
		||||
            </label>
 | 
			
		||||
        </div>
 | 
			
		||||
 | 
			
		||||
        <!-- Enabled -->
 | 
			
		||||
        <div class="form-check">
 | 
			
		||||
            <input class="form-check-input" type="checkbox" name="enabled" id="enabled" {% if u.enabled %} checked="" {%
 | 
			
		||||
                   endif %}>
 | 
			
		||||
            <label class="form-check-label" for="enabled">
 | 
			
		||||
                Enabled
 | 
			
		||||
            </label>
 | 
			
		||||
        </div>
 | 
			
		||||
 | 
			
		||||
        <!-- Admin -->
 | 
			
		||||
        <div class="form-check">
 | 
			
		||||
            <input class="form-check-input" type="checkbox" name="admin" id="admin" {% if u.admin %} checked="" {% endif
 | 
			
		||||
                   %}>
 | 
			
		||||
            <label class="form-check-label" for="admin">
 | 
			
		||||
                Grant admin privileges
 | 
			
		||||
            </label>
 | 
			
		||||
        </div>
 | 
			
		||||
    </div>
 | 
			
		||||
 | 
			
		||||
    <!-- Granted services -->
 | 
			
		||||
    <fieldset class="form-group">
 | 
			
		||||
        <legend class="mt-4">Granted services</legend>
 | 
			
		||||
        <div class="form-check">
 | 
			
		||||
            <label class="form-check-label">
 | 
			
		||||
                <input type="radio" class="form-check-input" name="granted_services"
 | 
			
		||||
                       value="all_services" {% if u.authorized_services== None %} checked="" {% endif %}>
 | 
			
		||||
                Grant all services
 | 
			
		||||
            </label>
 | 
			
		||||
        </div>
 | 
			
		||||
        <div class="form-check">
 | 
			
		||||
            <label class="form-check-label">
 | 
			
		||||
                <input type="radio" class="form-check-input" name="granted_services"
 | 
			
		||||
                       value="custom_services" {% if u.authorized_services !=None %} checked="checked" {% endif %}>
 | 
			
		||||
                Manually specify allowed services
 | 
			
		||||
            </label>
 | 
			
		||||
        </div>
 | 
			
		||||
 | 
			
		||||
        {% for c in clients %}
 | 
			
		||||
        <div class="form-check">
 | 
			
		||||
            <input class="form-check-input" type="checkbox" class="authorize_client" data-id="{{ c.id.0 }}"
 | 
			
		||||
                   {% if u.can_access_app(c.id) %} checked="" {% endif %}>
 | 
			
		||||
            <label class="form-check-label" for="admin">
 | 
			
		||||
                {{ c.name }}
 | 
			
		||||
            </label>
 | 
			
		||||
        </div>
 | 
			
		||||
        {% endfor %}
 | 
			
		||||
    </fieldset>
 | 
			
		||||
</form>
 | 
			
		||||
 | 
			
		||||
{% endblock content %}
 | 
			
		||||
		Reference in New Issue
	
	Block a user