actix_admin/routes/
create_or_edit_get.rs

1use actix_web::{error, web, Error, HttpRequest, HttpResponse};
2use sea_orm::DatabaseConnection;
3use tera::Context;
4use actix_session::Session;
5use crate::ActixAdminError;
6use crate::ActixAdminNotification;
7use crate::prelude::*;
8
9use super::helpers::add_default_context;
10use super::helpers::SearchParams;
11use super::Params;
12use super::{ add_auth_context, user_can_access_page, render_unauthorized};
13
14pub async fn create_get<E: ActixAdminViewModelTrait>(
15    session: Session,
16    req: HttpRequest,
17    data: web::Data<ActixAdmin>,
18    db: web::Data<DatabaseConnection>,
19    _body: web::Payload,
20    _text: String,
21) -> Result<HttpResponse, Error> {
22    let db = db.get_ref();
23    let model = ActixAdminModel::create_empty();
24    
25    create_or_edit_get::<E>(&session, req, &data, db, Ok(model), false).await
26}
27
28pub async fn edit_get<E: ActixAdminViewModelTrait>(
29    session: Session,
30    req: HttpRequest,
31    data: web::Data<ActixAdmin>,
32    db: web::Data<DatabaseConnection>,
33    _text: String,
34    id: web::Path<i32>
35) -> Result<HttpResponse, Error> {
36    let db = db.get_ref();
37    let actix_admin = &data.get_ref();
38    let tenant_ref = actix_admin
39        .configuration
40        .user_tenant_ref
41        .map_or(None, |f| f(&session));
42
43    let model = E::get_entity(db, id.into_inner(), tenant_ref).await;
44    let entity_name = E::get_entity_name();
45    let view_model = actix_admin.view_models.get(&entity_name).unwrap();
46
47    create_or_edit_get::<E>(&session, req, &data, db, model, view_model.inline_edit).await
48}
49
50async fn create_or_edit_get<E: ActixAdminViewModelTrait>(session: &Session, req: HttpRequest, data: &web::Data<ActixAdmin>, db: &sea_orm::DatabaseConnection, model_result: Result<ActixAdminModel, ActixAdminError>, is_inline: bool) -> Result<HttpResponse, Error>{
51    let actix_admin = &data.get_ref();
52    let mut ctx = Context::new();
53    add_auth_context(&session, actix_admin, &mut ctx);
54    let entity_name = E::get_entity_name();
55    let mut errors: Vec<crate::ActixAdminError> = Vec::new();
56
57    let view_model = actix_admin.view_models.get(&entity_name).unwrap();
58
59    if !user_can_access_page(&session, actix_admin, view_model) {
60        return render_unauthorized(&ctx, &actix_admin);
61    }
62
63    let model;
64    match model_result {
65        Ok(res) => {
66            model = res;
67        },
68        Err(e) => {
69            errors.push(e);
70            model = ActixAdminModel::create_empty();
71        }
72    }
73
74    let mut http_response_code = match errors.is_empty() {
75        true => HttpResponse::Ok(),
76        false => HttpResponse::InternalServerError(),
77    };    
78    let notifications: Vec<ActixAdminNotification> = errors.into_iter()
79        .map(|err| ActixAdminNotification::from(err))
80        .collect();
81
82    let params = web::Query::<Params>::from_query(req.query_string()).unwrap();
83
84    let search_params = SearchParams::from_params(&params, view_model);
85    add_default_context(&mut ctx, req, view_model, entity_name, actix_admin, notifications, &search_params);
86
87    let tenant_ref = actix_admin
88        .configuration
89        .user_tenant_ref
90        .map_or(None, |f| f(&session));
91
92    ctx.insert("view_model", &ActixAdminViewModelSerializable::from(view_model.clone()));
93    ctx.insert("select_lists", &E::get_select_lists(db, tenant_ref).await?);
94    ctx.insert("model", &model);
95    
96    let template_path = match is_inline {
97        true => "create_or_edit/inline.html",
98        false => "create_or_edit.html",
99    };
100    let body = actix_admin.tera
101        .render(template_path, &ctx)
102        .map_err(|err| error::ErrorInternalServerError(err))?;
103    Ok(http_response_code.content_type("text/html").body(body))
104}