actix_admin/routes/
create_or_edit_get.rs1use 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(¶ms, 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}