forked from Plume/Plume
Add some configuration options for instance admins
This commit is contained in:
parent
826772ca20
commit
74ec59e77c
21 changed files with 200 additions and 9 deletions
|
@ -0,0 +1,5 @@
|
|||
-- This file should undo anything in `up.sql`
|
||||
ALTER TABLE instances DROP COLUMN open_registrations;
|
||||
ALTER TABLE instances DROP COLUMN short_description;
|
||||
ALTER TABLE instances DROP COLUMN long_description;
|
||||
ALTER TABLE instances DROP COLUMN default_license;
|
|
@ -0,0 +1,5 @@
|
|||
-- Your SQL goes here
|
||||
ALTER TABLE instances ADD COLUMN open_registrations BOOLEAN NOT NULL DEFAULT 't';
|
||||
ALTER TABLE instances ADD COLUMN short_description TEXT NOT NULL DEFAULT '';
|
||||
ALTER TABLE instances ADD COLUMN long_description TEXT NOT NULL DEFAULT '';
|
||||
ALTER TABLE instances ADD COLUMN default_license TEXT NOT NULL DEFAULT 'CC-0';
|
19
plume-models/src/admin.rs
Normal file
19
plume-models/src/admin.rs
Normal file
|
@ -0,0 +1,19 @@
|
|||
use rocket::{Outcome, http::Status, request::{self, FromRequest, Request}};
|
||||
|
||||
use users::User;
|
||||
|
||||
/// Wrapper around User to use as a request guard on pages reserved to admins.
|
||||
pub struct Admin(pub User);
|
||||
|
||||
impl<'a, 'r> FromRequest<'a, 'r> for Admin {
|
||||
type Error = ();
|
||||
|
||||
fn from_request(request: &'a Request<'r>) -> request::Outcome<Admin, ()> {
|
||||
let user = request.guard::<User>()?;
|
||||
if user.is_admin {
|
||||
Outcome::Success(Admin(user))
|
||||
} else {
|
||||
Outcome::Failure((Status::Unauthorized, ()))
|
||||
}
|
||||
}
|
||||
}
|
|
@ -140,7 +140,12 @@ impl Blog {
|
|||
Instance::insert(conn, NewInstance {
|
||||
public_domain: inst.clone(),
|
||||
name: inst.clone(),
|
||||
local: false
|
||||
local: false,
|
||||
// We don't really care about all the following for remote instances
|
||||
long_description: String::new(),
|
||||
short_description: String::new(),
|
||||
default_license: String::new(),
|
||||
open_registrations: true
|
||||
})
|
||||
}
|
||||
};
|
||||
|
|
|
@ -13,7 +13,11 @@ pub struct Instance {
|
|||
pub name: String,
|
||||
pub local: bool,
|
||||
pub blocked: bool,
|
||||
pub creation_date: NaiveDateTime
|
||||
pub creation_date: NaiveDateTime,
|
||||
pub open_registrations: bool,
|
||||
pub short_description: String,
|
||||
pub long_description: String,
|
||||
pub default_license : String
|
||||
}
|
||||
|
||||
#[derive(Insertable)]
|
||||
|
@ -21,7 +25,11 @@ pub struct Instance {
|
|||
pub struct NewInstance {
|
||||
pub public_domain: String,
|
||||
pub name: String,
|
||||
pub local: bool
|
||||
pub local: bool,
|
||||
pub open_registrations: bool,
|
||||
pub short_description: String,
|
||||
pub long_description: String,
|
||||
pub default_license : String
|
||||
}
|
||||
|
||||
impl Instance {
|
||||
|
@ -68,4 +76,15 @@ impl Instance {
|
|||
box_name = box_name
|
||||
))
|
||||
}
|
||||
|
||||
pub fn update(&self, conn: &PgConnection, name: String, open_registrations: bool, short_description: String, long_description: String) -> Instance {
|
||||
diesel::update(self)
|
||||
.set((
|
||||
instances::name.eq(name),
|
||||
instances::open_registrations.eq(open_registrations),
|
||||
instances::short_description.eq(short_description),
|
||||
instances::long_description.eq(long_description),
|
||||
)).get_result::<Instance>(conn)
|
||||
.expect("Couldn't update instance")
|
||||
}
|
||||
}
|
||||
|
|
|
@ -103,6 +103,7 @@ pub fn ap_url(url: String) -> String {
|
|||
format!("{}://{}", scheme, url)
|
||||
}
|
||||
|
||||
pub mod admin;
|
||||
pub mod blog_authors;
|
||||
pub mod blogs;
|
||||
pub mod comments;
|
||||
|
|
|
@ -53,6 +53,10 @@ table! {
|
|||
local -> Bool,
|
||||
blocked -> Bool,
|
||||
creation_date -> Timestamp,
|
||||
open_registrations -> Bool,
|
||||
short_description -> Text,
|
||||
long_description -> Text,
|
||||
default_license -> Text,
|
||||
}
|
||||
}
|
||||
|
||||
|
|
|
@ -184,7 +184,12 @@ impl User {
|
|||
Instance::insert(conn, NewInstance {
|
||||
name: inst.clone(),
|
||||
public_domain: inst.clone(),
|
||||
local: false
|
||||
local: false,
|
||||
// We don't really care about all the following for remote instances
|
||||
long_description: String::new(),
|
||||
short_description: String::new(),
|
||||
default_license: String::new(),
|
||||
open_registrations: true
|
||||
})
|
||||
}
|
||||
};
|
||||
|
|
6
po/de.po
6
po/de.po
|
@ -377,3 +377,9 @@ msgstr ""
|
|||
|
||||
msgid "Matrix room"
|
||||
msgstr ""
|
||||
|
||||
msgid "Administration"
|
||||
msgstr ""
|
||||
|
||||
msgid "Instance settings"
|
||||
msgstr ""
|
||||
|
|
6
po/en.po
6
po/en.po
|
@ -364,3 +364,9 @@ msgstr ""
|
|||
|
||||
msgid "Matrix room"
|
||||
msgstr ""
|
||||
|
||||
msgid "Administration"
|
||||
msgstr ""
|
||||
|
||||
msgid "Instance settings"
|
||||
msgstr ""
|
||||
|
|
6
po/fr.po
6
po/fr.po
|
@ -373,3 +373,9 @@ msgstr ""
|
|||
|
||||
msgid "Matrix room"
|
||||
msgstr ""
|
||||
|
||||
msgid "Administration"
|
||||
msgstr ""
|
||||
|
||||
msgid "Instance settings"
|
||||
msgstr ""
|
||||
|
|
6
po/pl.po
6
po/pl.po
|
@ -382,5 +382,11 @@ msgstr ""
|
|||
msgid "Matrix room"
|
||||
msgstr ""
|
||||
|
||||
msgid "Administration"
|
||||
msgstr ""
|
||||
|
||||
msgid "Instance settings"
|
||||
msgstr ""
|
||||
|
||||
#~ msgid "Logowanie"
|
||||
#~ msgstr "Zaloguj się"
|
||||
|
|
|
@ -357,3 +357,9 @@ msgstr ""
|
|||
|
||||
msgid "Matrix room"
|
||||
msgstr ""
|
||||
|
||||
msgid "Administration"
|
||||
msgstr ""
|
||||
|
||||
msgid "Instance settings"
|
||||
msgstr ""
|
||||
|
|
|
@ -50,6 +50,8 @@ fn main() {
|
|||
|
||||
routes::instance::paginated_index,
|
||||
routes::instance::index,
|
||||
routes::instance::admin,
|
||||
routes::instance::update_settings,
|
||||
routes::instance::shared_inbox,
|
||||
routes::instance::nodeinfo,
|
||||
|
||||
|
|
|
@ -1,8 +1,11 @@
|
|||
use gettextrs::gettext;
|
||||
use rocket::{request::LenientForm, response::Redirect};
|
||||
use rocket_contrib::{Json, Template};
|
||||
use serde_json;
|
||||
use validator::{Validate};
|
||||
|
||||
use plume_models::{
|
||||
admin::Admin,
|
||||
comments::Comment,
|
||||
db_conn::DbConn,
|
||||
posts::Post,
|
||||
|
@ -39,6 +42,48 @@ fn index(conn: DbConn, user: Option<User>) -> Template {
|
|||
paginated_index(conn, user, Page::first())
|
||||
}
|
||||
|
||||
#[get("/admin")]
|
||||
fn admin(conn: DbConn, admin: Admin) -> Template {
|
||||
Template::render("instance/admin", json!({
|
||||
"account": admin.0,
|
||||
"instance": Instance::get_local(&*conn),
|
||||
"errors": null,
|
||||
"form": null
|
||||
}))
|
||||
}
|
||||
|
||||
#[derive(FromForm, Validate, Serialize)]
|
||||
struct InstanceSettingsForm {
|
||||
#[validate(length(min = "1"))]
|
||||
name: String,
|
||||
open_registrations: bool,
|
||||
short_description: String,
|
||||
long_description: String,
|
||||
#[validate(length(min = "1"))]
|
||||
default_license: String
|
||||
}
|
||||
|
||||
#[post("/admin", data = "<form>")]
|
||||
fn update_settings(conn: DbConn, admin: Admin, form: LenientForm<InstanceSettingsForm>) -> Result<Redirect, Template> {
|
||||
let form = form.get();
|
||||
form.validate()
|
||||
.map(|_| {
|
||||
let instance = Instance::get_local(&*conn).unwrap();
|
||||
instance.update(&*conn,
|
||||
form.name.clone(),
|
||||
form.open_registrations,
|
||||
form.short_description.clone(),
|
||||
form.long_description.clone());
|
||||
Redirect::to(uri!(admin))
|
||||
})
|
||||
.map_err(|e| Template::render("instance/admin", json!({
|
||||
"account": admin.0,
|
||||
"instance": Instance::get_local(&*conn),
|
||||
"errors": e.inner(),
|
||||
"form": form
|
||||
})))
|
||||
}
|
||||
|
||||
#[post("/inbox", data = "<data>")]
|
||||
fn shared_inbox(conn: DbConn, data: String) -> String {
|
||||
let act: serde_json::Value = serde_json::from_str(&data[..]).unwrap();
|
||||
|
|
|
@ -151,7 +151,11 @@ fn quick_setup(conn: DbConn) {
|
|||
let instance = Instance::insert(&*conn, NewInstance {
|
||||
public_domain: domain,
|
||||
name: name,
|
||||
local: true
|
||||
local: true,
|
||||
long_description: String::new(),
|
||||
short_description: String::new(),
|
||||
default_license: String::from("CC-0"),
|
||||
open_registrations: true
|
||||
});
|
||||
|
||||
println!("{}\n", " ✔️ Your instance was succesfully created!".green());
|
||||
|
|
|
@ -362,7 +362,14 @@ textarea {
|
|||
font-size: 1.1em;
|
||||
line-height: 1.5em;
|
||||
}
|
||||
|
||||
|
||||
input[type="checkbox"] {
|
||||
display: inline;
|
||||
margin: initial;
|
||||
min-width: initial;
|
||||
width: initial;
|
||||
}
|
||||
|
||||
/* Button & Submit */
|
||||
|
||||
.button, input[type="submit"], button {
|
||||
|
|
|
@ -36,6 +36,11 @@
|
|||
<span>Plume 0.1.0</span>
|
||||
<a href="https://github.com/Plume-org/Plume">{{ "Source code" | _ }}</a>
|
||||
<a href="https://riot.im/app/#/room/#funkwhale-troubleshooting:matrix.org">{{ "Matrix room" | _ }}</a>
|
||||
{% if account %}
|
||||
{% if account.is_admin %}
|
||||
<a href="/admin">{{ "Administration" | _ }}</a>
|
||||
{% endif %}
|
||||
{% endif %}
|
||||
</footer>
|
||||
</body>
|
||||
</html>
|
||||
|
|
34
templates/instance/admin.html.tera
Normal file
34
templates/instance/admin.html.tera
Normal file
|
@ -0,0 +1,34 @@
|
|||
{% extends "base" %}
|
||||
{% import "macros" as macros %}
|
||||
|
||||
{% block title %}
|
||||
Administration of {{ instance.name }}
|
||||
{% endblock title %}
|
||||
|
||||
{% block content %}
|
||||
<h1>{{ "Administration" | _ }}</h1>
|
||||
|
||||
<h2>{{ "Instance settings" | _ }}</h2>
|
||||
<form method="post">
|
||||
{{ macros::input(name="name", label="Name", errors=errors, form=form, props='minlenght="1"', default=instance) }}
|
||||
|
||||
<label for="open_registrations">
|
||||
{% if instance.open_registrations %}
|
||||
<input type="checkbox" name="open_registrations" id="open_registrations" checked>
|
||||
{% else %}
|
||||
<input type="checkbox" name="open_registrations" id="open_registrations">
|
||||
{% endif %}
|
||||
{{ "Allow anyone to register" | _ }}
|
||||
</label>
|
||||
|
||||
<label for="short_description">{{ "Short description" | _ }}<small>{{ "Markdown is supported" }}</small></label>
|
||||
<textarea id="short_description" name="short_description">{{ form.short_description | default(value=instance.short_description) }}</textarea>
|
||||
|
||||
<label for="long_description">{{ "Long description" | _ }}<small>{{ "Markdown is supported" }}</small></label>
|
||||
<textarea id="long_description" name="long_description">{{ form.long_description | default(value=instance.long_description) }}</textarea>
|
||||
|
||||
{{ macros::input(name="default_license", label="Default license", errors=errors, form=form, props='minlenght="1"', default=instance) }}
|
||||
|
||||
<input type="submit" value="{{ "Save settings" | _ }}"/>
|
||||
</form>
|
||||
{% endblock content %}
|
|
@ -17,7 +17,7 @@
|
|||
</p>
|
||||
</div>
|
||||
{% endmacro post_card %}
|
||||
{% macro input(name, label, errors, form, type="text", props="", optional=false) %}
|
||||
{% macro input(name, label, errors, form, type="text", props="", optional=false, default='') %}
|
||||
<label for="{{ name }}">
|
||||
{{ label | _ }}
|
||||
{% if optional %}
|
||||
|
@ -29,7 +29,8 @@
|
|||
<p class="error">{{ err.message | default(value="Unknown error") | _ }}</p>
|
||||
{% endfor %}
|
||||
{% endif %}
|
||||
<input type="{{ type }}" id="{{ name }}" name="{{ name }}" value="{{ form[name] | default(value="") }}" {{ props | safe }}/>
|
||||
{% set default = default[name] | default(value="") %}
|
||||
<input type="{{ type }}" id="{{ name }}" name="{{ name }}" value="{{ form[name] | default(value=default) }}" {{ props | safe }}/>
|
||||
{% endmacro input %}
|
||||
{% macro paginate(page, total, previous="Previous page", next="Next page") %}
|
||||
<div class="pagination">
|
||||
|
|
|
@ -19,6 +19,6 @@
|
|||
<label for="summary">{{ "Summary" | _ }}</label>
|
||||
<input name="summary" value="{{ account.summary }}">
|
||||
|
||||
<input type="submit" value="{{ "Update account" | _ }}"/>
|
||||
<input type="submit" value="{{ "Update account" | _ }}"/>
|
||||
</form>
|
||||
{% endblock content %}
|
||||
|
|
Loading…
Reference in a new issue