use umbral::migrate::{Column, ModelMeta};
pub(crate) fn discover_models() -> Vec<(String, ModelMeta)> {
let mut out: Vec<(String, ModelMeta)> = Vec::new();
for plugin in umbral::migrate::registered_plugins() {
for model in umbral::migrate::models_for_plugin(&plugin) {
out.push((plugin.clone(), model));
}
}
out
}
pub(crate) fn find_model(table: &str) -> Option<(String, ModelMeta)> {
discover_models()
.into_iter()
.find(|(_, m)| m.table == table)
}
pub(crate) fn pk_column(model: &ModelMeta) -> Option<&Column> {
model.fields.iter().find(|c| c.primary_key)
}
pub(crate) fn default_list_display(model: &ModelMeta) -> Vec<String> {
let str_field_idx = model
.fields
.iter()
.position(|c| c.is_string_repr && !c.primary_key);
let Some(idx) = str_field_idx else {
return model.fields.iter().map(|c| c.name.clone()).collect();
};
let str_name = model.fields[idx].name.clone();
let mut out = vec![str_name.clone()];
for col in &model.fields {
if col.primary_key {
continue;
}
if col.name == str_name {
continue;
}
if is_long_display_type(col) {
continue;
}
out.push(col.name.clone());
}
out
}
fn is_long_display_type(col: &Column) -> bool {
use umbral::orm::SqlType;
match col.ty {
SqlType::Text => col.max_length == 0,
SqlType::Json | SqlType::Array(_) | SqlType::FullText => true,
_ => false,
}
}
pub(crate) async fn user_theme(user: &umbral_auth::AuthUser) -> String {
crate::models::fetch_or_default(user.id)
.await
.map(|p| p.theme)
.unwrap_or_else(|_| "dark".to_string())
}