add list of services on main page
This commit is contained in:
parent
789762dd51
commit
471a49a80f
|
@ -32,6 +32,8 @@ ADMINS = [
|
||||||
[LENTICULAR_CLOUD_SERVICES.jabber]
|
[LENTICULAR_CLOUD_SERVICES.jabber]
|
||||||
app_token = true
|
app_token = true
|
||||||
# client_cert= true
|
# client_cert= true
|
||||||
|
icon = "https://seafile.milliways.info/media/favicons/favicon.png"
|
||||||
|
href = "https://seafile.milliways.info"
|
||||||
|
|
||||||
|
|
||||||
[LENTICULAR_CLOUD_SERVICES.mail-cardav]
|
[LENTICULAR_CLOUD_SERVICES.mail-cardav]
|
||||||
|
|
|
@ -1,11 +1,12 @@
|
||||||
from flask import Flask
|
from flask import Flask
|
||||||
from .model import Service
|
|
||||||
import logging
|
import logging
|
||||||
|
|
||||||
|
from .model import Service
|
||||||
|
|
||||||
logger = logging.getLogger(__name__)
|
logger = logging.getLogger(__name__)
|
||||||
|
|
||||||
|
|
||||||
class LenticularServices(dict):
|
class LenticularServices(dict[str, Service]):
|
||||||
|
|
||||||
def init_app(self, app: Flask) -> None:
|
def init_app(self, app: Flask) -> None:
|
||||||
for service_name, service_config in app.config['LENTICULAR_CLOUD_SERVICES'].items():
|
for service_name, service_config in app.config['LENTICULAR_CLOUD_SERVICES'].items():
|
||||||
|
|
|
@ -58,6 +58,9 @@ class Service(object):
|
||||||
def __init__(self, name: str):
|
def __init__(self, name: str):
|
||||||
self._name = name
|
self._name = name
|
||||||
self._app_token = False
|
self._app_token = False
|
||||||
|
self._icon: Optional[str] = None
|
||||||
|
self._href: Optional[str] = None
|
||||||
|
|
||||||
self._client_cert = False
|
self._client_cert = False
|
||||||
self._pki_config = {
|
self._pki_config = {
|
||||||
'cn': '{username}',
|
'cn': '{username}',
|
||||||
|
@ -66,8 +69,6 @@ class Service(object):
|
||||||
|
|
||||||
@staticmethod
|
@staticmethod
|
||||||
def from_config(name, config) -> 'Service':
|
def from_config(name, config) -> 'Service':
|
||||||
"""
|
|
||||||
"""
|
|
||||||
service = Service(name)
|
service = Service(name)
|
||||||
if 'app_token' in config:
|
if 'app_token' in config:
|
||||||
service._app_token = bool(config['app_token'])
|
service._app_token = bool(config['app_token'])
|
||||||
|
@ -75,6 +76,10 @@ class Service(object):
|
||||||
service._client_cert = bool(config['client_cert'])
|
service._client_cert = bool(config['client_cert'])
|
||||||
if 'pki_config' in config:
|
if 'pki_config' in config:
|
||||||
service._pki_config.update(config['pki_config'])
|
service._pki_config.update(config['pki_config'])
|
||||||
|
if 'icon' in config:
|
||||||
|
service._icon = str(config['icon'])
|
||||||
|
if 'href' in config:
|
||||||
|
service._href = str(config['href'])
|
||||||
|
|
||||||
return service
|
return service
|
||||||
|
|
||||||
|
@ -96,6 +101,14 @@ class Service(object):
|
||||||
raise Exception('invalid call')
|
raise Exception('invalid call')
|
||||||
return self._pki_config
|
return self._pki_config
|
||||||
|
|
||||||
|
@property
|
||||||
|
def icon(self) -> Optional[str]:
|
||||||
|
return self._icon
|
||||||
|
|
||||||
|
@property
|
||||||
|
def href(self) -> Optional[str]:
|
||||||
|
return self._href
|
||||||
|
|
||||||
|
|
||||||
class Certificate(object):
|
class Certificate(object):
|
||||||
|
|
||||||
|
|
|
@ -1,2 +1,19 @@
|
||||||
|
|
||||||
{% extends 'frontend/base.html.j2' %}
|
{% extends 'frontend/base.html.j2' %}
|
||||||
|
|
||||||
|
|
||||||
|
{% block content %}
|
||||||
|
<div class="users">
|
||||||
|
<h1>Available Services</h1>
|
||||||
|
|
||||||
|
<div class="row">
|
||||||
|
{% for service_name, service in lenticular_services.items() %}
|
||||||
|
<div class="col-md-3 col-sm-6">
|
||||||
|
<a href="{{ service.href }}">
|
||||||
|
<img class="img-thumbnail" style="width: 100%;" alt="{{ service_name }}" src="{{ service.icon }}"/>
|
||||||
|
</a>
|
||||||
|
</div>
|
||||||
|
{% endfor %}
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
{% endblock %}
|
||||||
|
|
|
@ -76,7 +76,10 @@ def index() -> ResponseReturnValue:
|
||||||
next_url = session['next_url']
|
next_url = session['next_url']
|
||||||
del session['next_url']
|
del session['next_url']
|
||||||
return redirect(next_url)
|
return redirect(next_url)
|
||||||
return render_template('frontend/index.html.j2')
|
return render_template(
|
||||||
|
'frontend/index.html.j2',
|
||||||
|
lenticular_services=lenticular_services,
|
||||||
|
)
|
||||||
|
|
||||||
|
|
||||||
@frontend_views.route('/client_cert')
|
@frontend_views.route('/client_cert')
|
||||||
|
|
24
module.nix
24
module.nix
|
@ -68,7 +68,29 @@ in
|
||||||
HYDRA_PUBLIC_URL = mkOption {
|
HYDRA_PUBLIC_URL = mkOption {
|
||||||
type = types.str;
|
type = types.str;
|
||||||
default = "https://${config.services.ory-hydra.public_domain}";
|
default = "https://${config.services.ory-hydra.public_domain}";
|
||||||
};
|
};
|
||||||
|
LENTICULAR_CLOUD_SERVICES = mkOption {
|
||||||
|
type = types.attrsOf (types.submodule {
|
||||||
|
options = {
|
||||||
|
app_token = mkOption {
|
||||||
|
type = types.bool;
|
||||||
|
default = false;
|
||||||
|
description = "enables the app token function for this service";
|
||||||
|
};
|
||||||
|
href = mkOption {
|
||||||
|
type = types.str;
|
||||||
|
example = "https://service.example.com";
|
||||||
|
description = "Link to the hosted service";
|
||||||
|
};
|
||||||
|
icon = mkOption {
|
||||||
|
type = types.str;
|
||||||
|
example = "https://service.example.com/favicon.png";
|
||||||
|
description = "Link to an icon of the service";
|
||||||
|
};
|
||||||
|
};
|
||||||
|
});
|
||||||
|
default = {};
|
||||||
|
};
|
||||||
};
|
};
|
||||||
};
|
};
|
||||||
};
|
};
|
||||||
|
|
Loading…
Reference in a new issue