Commit 46d52300 authored by shadMod's avatar shadMod 💬

Merge branch 'dev-shadmod-231010-1348' into merge-cherry

parents 93af9b6e 2b20b436
...@@ -12,5 +12,5 @@ __pycache__ ...@@ -12,5 +12,5 @@ __pycache__
.py[co] .py[co]
# Compiled assets # Compiled assets
/uitwww/static/website.css /uitwww/static/assets/
/uitwww/static/website.js /uitwww/static/website.js
...@@ -3,7 +3,7 @@ div.page div.row.background-wallpaper { ...@@ -3,7 +3,7 @@ div.page div.row.background-wallpaper {
background: rgba(255, 255, 255, 0.5); background: rgba(255, 255, 255, 0.5);
} }
background: url("images/wallpapers/dotted.png") no-repeat 130% 10%; background: url("../../images/wallpapers/dotted.png") no-repeat 130% 10%;
@media all and (max-width: 60rem) { @media all and (max-width: 60rem) {
background: transparent; background: transparent;
...@@ -35,41 +35,41 @@ div.page div.row.background-wallpaper { ...@@ -35,41 +35,41 @@ div.page div.row.background-wallpaper {
} }
&.ubuntu, &.desktop { &.ubuntu, &.desktop {
background: url("images/wallpapers/ubuntu.jpg") 100% 0%; background: url("../../images/wallpapers/ubuntu.jpg") 200% 0%;
} }
&.kubuntu { &.kubuntu {
background: url("images/wallpapers/kubuntu.jpg") 100% 50%; background: url("../../images/wallpapers/kubuntu.jpg") 200% 50%;
} }
&.xubuntu { &.xubuntu {
background: background:
linear-gradient(rgba(100, 100, 100, 0.3), rgba(100, 100, 100, 0.3)), linear-gradient(rgba(100, 100, 100, 0.3), rgba(100, 100, 100, 0.3)),
url("images/wallpapers/xubuntu.jpg") 100% 50%; url("../../images/wallpapers/xubuntu.jpg") 200% 50%;
} }
&.lubuntu { &.lubuntu {
background: url("images/wallpapers/lubuntu.jpg") 100% 50%; background: url("../../images/wallpapers/lubuntu.jpg") 200% 50%;
} }
&.ubuntu-mate { &.ubuntu-mate {
background: background:
linear-gradient(rgba(85, 85, 85, 0.3), rgba(85, 85, 85, 0.3)), linear-gradient(rgba(85, 85, 85, 0.3), rgba(85, 85, 85, 0.3)),
url("images/wallpapers/ubuntu-mate.jpg") 100% 50%; url("../../images/wallpapers/ubuntu-mate.jpg") 200% 50%;
} }
&.ubuntu-budgie { &.ubuntu-budgie {
background: background:
linear-gradient(rgba(0, 0, 0, 0.3), rgba(0, 0, 0, 0.3)), linear-gradient(rgba(0, 0, 0, 0.3), rgba(0, 0, 0, 0.3)),
url("images/wallpapers/ubuntu-budgie.jpg") 100% 50%; url("../../images/wallpapers/ubuntu-budgie.jpg") 200% 50%;
} }
&.ubuntukylin { &.ubuntukylin {
background: url("images/wallpapers/ubuntu-kylin.jpg") 100% 50%; background: url("../../images/wallpapers/ubuntu-kylin.jpg") 200% 50%;
} }
&.ubuntustudio { &.ubuntustudio {
background: url("images/wallpapers/ubuntustudio.jpg") 100% 50%; background: url("../../images/wallpapers/ubuntustudio.jpg") 200% 50%;
.box { .box {
background: rgba(100, 100, 100, 0.25); background: rgba(100, 100, 100, 0.25);
...@@ -77,16 +77,17 @@ div.page div.row.background-wallpaper { ...@@ -77,16 +77,17 @@ div.page div.row.background-wallpaper {
} }
&.ubuntu-touch { &.ubuntu-touch {
background: url("images/wallpapers/ubuntu-touch.jpg") 100% 0%; background: url("../../images/wallpapers/ubuntu-touch.jpg") 100% 0%;
} }
&.nuovo-rilascio { &.nuovo-rilascio {
background: url("images/wallpapers/nuovo-rilascio.png") 100% 0%; background: url("../../images/versions/jammy-jellyfish-desktop.jpg") 100% 0%;
} }
&.banner-latest { &.banner-latest {
background: url("images/wallpapers/banner-latest.png") 100% 50%; background: url("../../images/versions/jammy-jellyfish.jpg") 50% 50%;
} }
} }
div.page div.row.download-index-distro { div.page div.row.download-index-distro {
...@@ -174,3 +175,20 @@ div.page div.row div.col.image-attach-corner { ...@@ -174,3 +175,20 @@ div.page div.row div.col.image-attach-corner {
} }
} }
} }
div.cookie-policy {
z-index: 10;
}
div.p-100 {
padding: 100px !important;
}
ul.item-list li {
margin: 0 0 0.25em 1.5em;
padding: 0 0 0 20px;
list-style-type: none;
background: url('https://www.ubuntu-it.org/sites/all/themes/light-drupal-theme/images/ubuntu-li.png') no-repeat left 4px;
font-size: 14px;
line-height: 20px;
}
\ No newline at end of file
:root {
--bs-blue: #0d6efd;
--bs-indigo: #6610f2;
--bs-purple: #6f42c1;
--bs-pink: #d63384;
--bs-red: #dc3545;
--bs-orange: #fd7e14;
--bs-yellow: #ffc107;
--bs-green: #198754;
--bs-teal: #20c997;
--bs-cyan: #0dcaf0;
--bs-black: #000;
--bs-white: #fff;
--bs-gray: #6c757d;
--bs-gray-dark: #343a40;
--bs-gray-100: #f8f9fa;
--bs-gray-200: #e9ecef;
--bs-gray-300: #dee2e6;
--bs-gray-400: #ced4da;
--bs-gray-500: #adb5bd;
--bs-gray-600: #6c757d;
--bs-gray-700: #495057;
--bs-gray-800: #343a40;
--bs-gray-900: #212529;
--bs-primary: #0d6efd;
--bs-secondary: #6c757d;
--bs-success: #198754;
--bs-info: #0dcaf0;
--bs-warning: #ffc107;
--bs-danger: #dc3545;
--bs-light: #f8f9fa;
--bs-dark: #212529;
--bs-primary-rgb: 13, 110, 253;
--bs-secondary-rgb: 108, 117, 125;
--bs-success-rgb: 25, 135, 84;
--bs-info-rgb: 13, 202, 240;
--bs-warning-rgb: 255, 193, 7;
--bs-danger-rgb: 220, 53, 69;
--bs-light-rgb: 248, 249, 250;
--bs-dark-rgb: 33, 37, 41;
--bs-white-rgb: 255, 255, 255;
--bs-black-rgb: 0, 0, 0;
--bs-body-color-rgb: 33, 37, 41;
--bs-body-bg-rgb: 255, 255, 255;
--bs-font-sans-serif: system-ui, -apple-system, "Segoe UI", Roboto, "Helvetica Neue", "Noto Sans", "Liberation Sans", Arial, sans-serif, "Apple Color Emoji", "Segoe UI Emoji", "Segoe UI Symbol", "Noto Color Emoji";
--bs-font-monospace: SFMono-Regular, Menlo, Monaco, Consolas, "Liberation Mono", "Courier New", monospace;
--bs-gradient: linear-gradient(180deg, rgba(255, 255, 255, 0.15), rgba(255, 255, 255, 0));
--bs-body-font-family: var(--bs-font-sans-serif);
--bs-body-font-size: 1rem;
--bs-body-font-weight: 400;
--bs-body-line-height: 1.5;
--bs-body-color: #212529;
--bs-body-bg: #fff;
--bs-border-width: 1px;
--bs-border-style: solid;
--bs-border-color: #dee2e6;
--bs-border-color-translucent: rgba(0, 0, 0, 0.175);
--bs-border-radius: 0.375rem;
--bs-border-radius-sm: 0.25rem;
--bs-border-radius-lg: 0.5rem;
--bs-border-radius-xl: 1rem;
--bs-border-radius-2xl: 2rem;
--bs-border-radius-pill: 50rem;
--bs-link-color: #0d6efd;
--bs-link-hover-color: #0a58ca;
--bs-code-color: #d63384;
--bs-highlight-bg: #fff3cd;
}
.container,
.container-fluid,
.container-xxl,
.container-xl,
.container-lg,
.container-md,
.container-sm {
--bs-gutter-x: 1.5rem;
--bs-gutter-y: 0;
width: 100%;
padding-right: calc(var(--bs-gutter-x) * 0.5);
padding-left: calc(var(--bs-gutter-x) * 0.5);
margin-right: auto;
margin-left: auto;
}
@media (min-width: 576px) {
.container-sm, .container {
max-width: 540px;
}
}
@media (min-width: 768px) {
.container-md, .container-sm, .container {
max-width: 720px;
}
}
@media (min-width: 992px) {
.container-lg, .container-md, .container-sm, .container {
max-width: 960px;
}
}
@media (min-width: 1200px) {
.container-xl, .container-lg, .container-md, .container-sm, .container {
max-width: 1140px;
}
}
@media (min-width: 1400px) {
.container-xxl, .container-xl, .container-lg, .container-md, .container-sm, .container {
max-width: 1320px;
}
}
.row {
--bs-gutter-x: 1.5rem;
--bs-gutter-y: 0;
display: flex;
flex-wrap: wrap;
margin-top: calc(-1 * var(--bs-gutter-y));
margin-right: calc(-0.5 * var(--bs-gutter-x));
margin-left: calc(-0.5 * var(--bs-gutter-x));
}
.row > * {
box-sizing: border-box;
flex-shrink: 0;
width: 100%;
max-width: 100%;
padding-right: calc(var(--bs-gutter-x) * 0.5);
padding-left: calc(var(--bs-gutter-x) * 0.5);
margin-top: var(--bs-gutter-y);
}
$size_width: ("sm": 576, "md": 768, "lg": 992, "xl": 1200, "xxl": 1400);
$list_cols: ("auto": "auto", "1": "8.33333333%", "2": "16.66666667%", "3": "25%", "4": "33.33333333%", "5": "41.66666667%", "6": "50%", "7": "58.33333333%", "8": "66.66666667%", "9": "75%", "10": "83.33333333%", "11": "91.66666667%", "12": "100%");
@each $col, $width in $list_cols {
.col-#{$col} {
flex: 0 0 auto;
width: #{$width};
}
}
@each $typology, $size in $size_width {
@media (min-width: #{$size}px) {
.col-#{$typology} {
flex: 1 0 0%;
}
@each $col, $width in $list_cols {
.col-#{$typology}-#{$col} {
flex: 0 0 auto;
width: #{$width};
}
}
}
}
$sizes: (25: "25%", 50: "50%", 75: "75%", 100: "100%", "auto": "auto");
@each $size, $width in $sizes {
.w-#{$size} {
width: #{$width} !important;
}
}
.m-auto {
margin: auto;
}
.text-justify {
text-align: justify !important;
}
...@@ -65,7 +65,7 @@ def clean(ctx): ...@@ -65,7 +65,7 @@ def clean(ctx):
exclude = ["%s/.git" % BASE, "%s/build" % BASE] exclude = ["%s/.git" % BASE, "%s/build" % BASE]
remove_files = [ remove_files = [
re.compile(r'.py[co]$'), re.compile(r'.mo$'), re.compile(r'.py[co]$'), re.compile(r'.mo$'),
"%s/uitwww/static/website.css" % BASE, "%s/uitwww/static/libs/main.css" % BASE,
] ]
remove_dirs = [ remove_dirs = [
re.compile('__pycache__'), re.compile('__pycache__'),
......
...@@ -29,7 +29,7 @@ from . import redirects ...@@ -29,7 +29,7 @@ from . import redirects
from . import utils from . import utils
def create_app(data_path): def create_app(data_path, debug=False):
"""Create a new instance of the application""" """Create a new instance of the application"""
# Normalize the data path # Normalize the data path
data_path = os.path.expanduser(os.path.abspath(data_path)) data_path = os.path.expanduser(os.path.abspath(data_path))
...@@ -41,11 +41,11 @@ def create_app(data_path): ...@@ -41,11 +41,11 @@ def create_app(data_path):
) )
# Prepare the data directory # Prepare the data directory
init_data_directory(data_path) init_data_directory(data_path, debug)
# Load the secret key # Load the secret key
with open(os.path.join(data_path, "secret_key")) as f: with open(os.path.join(data_path, "secret_key")) as fn:
app.secret_key = f.read().strip() app.secret_key = fn.read().strip()
# Initialize the database # Initialize the database
app.db = db.Database(os.path.join(data_path, "database.db")) app.db = db.Database(os.path.join(data_path, "database.db"))
...@@ -79,14 +79,14 @@ def create_app(data_path): ...@@ -79,14 +79,14 @@ def create_app(data_path):
return app return app
def init_data_directory(data_path): def init_data_directory(data_path, debug=False):
"""Initialize the data directory""" """Initialize the data directory"""
src_directory = os.path.dirname(os.path.abspath(__file__)) src_directory = os.path.dirname(os.path.abspath(__file__))
# Create all the directories # Create all the directories
dirs = ["", "cache"] dirs = ["", "cache"]
for dir in dirs: for name in dirs:
os.makedirs(os.path.join(data_path, dir), exist_ok=True) os.makedirs(os.path.join(data_path, name), exist_ok=True)
# Initialize the cache # Initialize the cache
static_dirs = {"static": "+assets"} static_dirs = {"static": "+assets"}
...@@ -105,6 +105,7 @@ def init_data_directory(data_path): ...@@ -105,6 +105,7 @@ def init_data_directory(data_path):
f.write("%s\n" % utils.random_key(64)) f.write("%s\n" % utils.random_key(64))
os.chmod(secret_key_path, 0o400) os.chmod(secret_key_path, 0o400)
# Initialize the download files if debug is False:
download_inst = download.Downloads(data_path) # Initialize the download files
download_inst.store_cache_file() download_inst = download.Downloads(data_path)
download_inst.store_cache_file()
...@@ -14,18 +14,16 @@ ...@@ -14,18 +14,16 @@
# You should have received a copy of the GNU Affero General Public License # You should have received a copy of the GNU Affero General Public License
# along with this program. If not, see <http://www.gnu.org/licenses/>. # along with this program. If not, see <http://www.gnu.org/licenses/>.
import functools import time
import uuid import uuid
import yaml
import flask import flask
import functools
import flask_openid import flask_openid
import pkg_resources
import time
import yaml
from .constants import UITWWW_DIR
from uitwww.third_party import openid_teams from uitwww.third_party import openid_teams
SESSION_EXPIRES_AFTER = 86400 SESSION_EXPIRES_AFTER = 86400
...@@ -148,8 +146,8 @@ class Sessions: ...@@ -148,8 +146,8 @@ class Sessions:
class Permissions: class Permissions:
def __init__(self): def __init__(self):
raw = pkg_resources.resource_string("uitwww", "data/permissions.yml") with open(UITWWW_DIR + "/data/permissions.yml") as fn:
self.config = yaml.safe_load(raw.decode("utf-8")) self.config = yaml.safe_load(fn.read())
def allowed_teams(self): def allowed_teams(self):
"""Return a list of teams allowed to log in""" """Return a list of teams allowed to log in"""
...@@ -177,6 +175,7 @@ class Permissions: ...@@ -177,6 +175,7 @@ class Permissions:
def permission(perms): def permission(perms):
"""Process the endpoint only if the user has permission""" """Process the endpoint only if the user has permission"""
def decorator(func): def decorator(func):
@functools.wraps(func) @functools.wraps(func)
def wrapper(*args, **kwargs): def wrapper(*args, **kwargs):
...@@ -200,6 +199,7 @@ def permission(perms): ...@@ -200,6 +199,7 @@ def permission(perms):
return flask.abort(403) return flask.abort(403)
return wrapper return wrapper
return decorator return decorator
...@@ -277,7 +277,6 @@ def prepare_blueprint(app): ...@@ -277,7 +277,6 @@ def prepare_blueprint(app):
flask.flash("La sessione è stata terminata correttamente.", "success") flask.flash("La sessione è stata terminata correttamente.", "success")
return flask.redirect(flask.url_for("pages.index")) return flask.redirect(flask.url_for("pages.index"))
@bp.route("/sessions") @bp.route("/sessions")
@permission("auth.sessions.manage") @permission("auth.sessions.manage")
def sessions_list(): def sessions_list():
......
import os
UITWWW_DIR = os.path.dirname(os.path.abspath(__file__))
BASE_DIR = os.path.join(UITWWW_DIR, "..")
...@@ -8,8 +8,8 @@ codename = "impish" ...@@ -8,8 +8,8 @@ codename = "impish"
lts = false lts = false
[releases.lts] [releases.lts]
version = "20.04.3" version = "22.04.3"
codename = "focal" codename = "jammy"
lts = true lts = true
......
...@@ -21,7 +21,7 @@ ...@@ -21,7 +21,7 @@
- name: Smartphone e tablet - name: Smartphone e tablet
endpoint: pages.scopri-ubuntu_ubuntu-touch endpoint: pages.scopri-ubuntu_ubuntu-touch
- name: 20.04 LTS Focal Fossa - name: 22.04 LTS Jammy Jellyfish
endpoint: pages.scopri-ubuntu_nuovo-rilascio endpoint: pages.scopri-ubuntu_nuovo-rilascio
- name: Derivate - name: Derivate
......
...@@ -17,9 +17,6 @@ ...@@ -17,9 +17,6 @@
import threading import threading
import sqlite3 import sqlite3
import pkg_resources
_LOCAL = threading.local() _LOCAL = threading.local()
......
...@@ -22,15 +22,14 @@ import random ...@@ -22,15 +22,14 @@ import random
import collections import collections
import flask import flask
import itsdangerous
import requests import requests
import pkg_resources import itsdangerous
from . import cache from . import cache
from . import launchpad from . import launchpad
from .constants import UITWWW_DIR
CONFIG_FILE = "/data/downloads.toml"
CONFIG_FILE = "data/downloads.toml"
CACHE_FILE = "download-cache.json" CACHE_FILE = "download-cache.json"
CACHE_FILE_VERSION = 1 CACHE_FILE_VERSION = 1
...@@ -39,16 +38,16 @@ class Downloads: ...@@ -39,16 +38,16 @@ class Downloads:
def __init__(self, data_path): def __init__(self, data_path):
# Load the configuration # Load the configuration
raw = pkg_resources.resource_string("uitwww", CONFIG_FILE) path = UITWWW_DIR + CONFIG_FILE
self.config = toml.loads( self.config = toml.load(
raw.decode("utf-8"), path, _dict=collections.OrderedDict,
_dict=collections.OrderedDict,
) )
self._strip_non_lts_releases() self._strip_non_lts_releases()
# Save the hash of the configuration # Save the hash of the configuration
self._config_hash = "sha1=%s" % hashlib.sha1(raw).hexdigest() with open(path, "rb") as raw:
self._config_hash = "sha1=%s" % hashlib.sha1(raw.read()).hexdigest()
self._cache_file = os.path.join(data_path, CACHE_FILE) self._cache_file = os.path.join(data_path, CACHE_FILE)
...@@ -69,7 +68,7 @@ class Downloads: ...@@ -69,7 +68,7 @@ class Downloads:
self._mirrors = {} self._mirrors = {}
for distro in self.config["mirrors"]["for"]: for distro in self.config["mirrors"]["for"]:
found_mirrors = list(sorted(launchpad.get_cdimage_mirrors( found_mirrors = list(sorted(launchpad.get_cdimage_mirrors(
distro, self.config["mirrors"]["country"] distro, self.config["mirrors"]["country"]
))) )))
if found_mirrors: if found_mirrors:
self._mirrors[distro] = found_mirrors self._mirrors[distro] = found_mirrors
......
...@@ -15,13 +15,15 @@ ...@@ -15,13 +15,15 @@
# along with this program. If not, see <http://www.gnu.org/licenses/>. # along with this program. If not, see <http://www.gnu.org/licenses/>.
import os import os
import sys
import click import click
import subprocess
import uitwww import uitwww
from uitwww import utils
from scss.compiler import compile_file
from htmlmin import minify
from .constants import UITWWW_DIR, BASE_DIR
from .utils import ReverseProxied, GunicornInstance
@click.group() @click.group()
...@@ -33,18 +35,15 @@ def cli(): ...@@ -33,18 +35,15 @@ def cli():
@cli.command("run") @cli.command("run")
@click.argument("data") @click.argument("data")
@click.option("-g", "--gunicorn-config", default=None, help="Path to a" @click.option("-g", "--gunicorn-config", default=None, help="Path to a"
"gunicorn config file") "gunicorn config file")
@click.option("-p", "--port", default=8000, help="Bind that port") @click.option("-p", "--port", default=8000, help="Bind that port")
@click.option("--public", help="Make available to the public", is_flag=True) @click.option("--public", help="Make available to the public", is_flag=True)
@click.option("-w", "--workers", help="Number of workers to start", default=3) @click.option("-w", "--workers", help="Number of workers to start", default=3)
@click.option("-d", "--debug", help="Enable debug mode", is_flag=True) @click.option("-d", "--debug", help="Enable debug mode", is_flag=True)
def run(data, gunicorn_config, port, public, workers, debug): def run(data, gunicorn_config, port, public, workers, debug):
"""Run the application""" """Run the application"""
# Create the application instance app = uitwww.create_app(data, debug)
src_directory = os.path.dirname(os.path.abspath(__file__)) app.wsgi_app = ReverseProxied(app.wsgi_app)
app = uitwww.create_app(data)
app.wsgi_app = utils.ReverseProxied(app.wsgi_app)
host = "127.0.0.1" host = "127.0.0.1"
if public: if public:
...@@ -53,22 +52,22 @@ def run(data, gunicorn_config, port, public, workers, debug): ...@@ -53,22 +52,22 @@ def run(data, gunicorn_config, port, public, workers, debug):
# In debug mode, run the flask builtin webserver # In debug mode, run the flask builtin webserver
if debug: if debug:
extra_files = [ extra_files = [
os.path.join(src_directory, "data/navbar.yml"), os.path.join(UITWWW_DIR, "data/navbar.yml"),
os.path.join(src_directory, "data/permissions.yml"), os.path.join(UITWWW_DIR, "data/permissions.yml"),
os.path.join(src_directory, "data/redirects.yml"), os.path.join(UITWWW_DIR, "data/redirects.yml"),
os.path.join(src_directory, "data/downloads.toml"), os.path.join(UITWWW_DIR, "data/downloads.toml"),
] ]
app.run(debug=True, port=port, host=host, extra_files=extra_files) app.run(debug=True, port=port, host=host, extra_files=extra_files)
# Else run the application with gunicorn # Else run the application with gunicorn
else: else:
options = { options = {
"bind": host+":"+str(port), "bind": host + ":" + str(port),
"workers": workers, "workers": workers,
"accesslog": "-", "accesslog": "-",
"errorlog": "-", "errorlog": "-",
} }
server = utils.GunicornInstance(gunicorn_config, options) server = GunicornInstance(gunicorn_config, options)
server.app = app server.app = app
try: try:
...@@ -79,25 +78,28 @@ def run(data, gunicorn_config, port, public, workers, debug): ...@@ -79,25 +78,28 @@ def run(data, gunicorn_config, port, public, workers, debug):
@cli.command("init") @cli.command("init")
@click.argument("data") @click.argument("data")
def init(data): @click.option("-d", "--debug", help="Enable debug mode", is_flag=True)
def init(data, debug):
"""Initialize the data directory""" """Initialize the data directory"""
print("Initializing data directory:", data) print("Initializing data directory:", data)
data_path = os.path.expanduser(os.path.abspath(data)) data_path = os.path.expanduser(os.path.abspath(data))
uitwww.init_data_directory(data_path) uitwww.init_data_directory(data_path, debug)
@cli.command("build_scss") @cli.command("build_scss")
def build_scss(): def build_scss():
"""Build the scss file""" """Compile the scss file"""
base_dir = os.path.join(os.path.dirname(os.path.abspath(__file__)), '..') print("Compile the scss file")
scss_file = open('%s/assets/scss/www.scss' % base_dir, 'rb') # init list of css path
css_file = open('%s/uitwww/static/website.css' % base_dir, 'wb') css_path = ["libs/main", "vendor/bootstrap_v5"]
subprocess.run( for val in css_path:
[sys.executable, '-mscss'], # init path css
stdin=scss_file, path = f"{UITWWW_DIR}/static/assets/{val}.css"
stdout=css_file, # check and mk dir if dir_ not exists
check=True, if not os.path.isdir(os.path.dirname(path)):
) os.makedirs(os.path.dirname(path))
css_file.flush() # open file, compile and write css
scss_file.close() with open(path, "w") as fn:
css_file.close() fn.write(minify(compile_file(
f"{BASE_DIR}/assets/scss/{val}.scss"
)))
...@@ -14,10 +14,10 @@ ...@@ -14,10 +14,10 @@
# You should have received a copy of the GNU Affero General Public License # You should have received a copy of the GNU Affero General Public License
# along with this program. If not, see <http://www.gnu.org/licenses/>. # along with this program. If not, see <http://www.gnu.org/licenses/>.
import flask
import json
import pkg_resources
import yaml import yaml
import flask
from .constants import UITWWW_DIR
class Navbar: class Navbar:
...@@ -55,8 +55,8 @@ class Navbar: ...@@ -55,8 +55,8 @@ class Navbar:
def install(self, app): def install(self, app):
"""Install this navbar on the app""" """Install this navbar on the app"""
raw = pkg_resources.resource_string("uitwww", "data/navbar.yml") with open(UITWWW_DIR + "/data/navbar.yml") as fn:
config = yaml.safe_load(raw.decode("utf-8")) config = yaml.safe_load(fn.read())
self._prepare_navbar_cache(config, []) self._prepare_navbar_cache(config, [])
# Add the _navbars variable to the templates # Add the _navbars variable to the templates
......
...@@ -15,10 +15,7 @@ ...@@ -15,10 +15,7 @@
# along with this program. If not, see <http://www.gnu.org/licenses/>. # along with this program. If not, see <http://www.gnu.org/licenses/>.
import os import os
import json
import flask import flask
import pkg_resources
from uitwww import cache from uitwww import cache
......
...@@ -14,16 +14,17 @@ ...@@ -14,16 +14,17 @@
# You should have received a copy of the GNU Affero General Public License # You should have received a copy of the GNU Affero General Public License
# along with this program. If not, see <http://www.gnu.org/licenses/>. # along with this program. If not, see <http://www.gnu.org/licenses/>.
import flask
import pkg_resources
import yaml import yaml
import flask
import hashlib import hashlib
from .constants import UITWWW_DIR
def prepare_blueprint(app): def prepare_blueprint(app):
"""Prepare a blueprint containing all the redirects""" """Prepare a blueprint containing all the redirects"""
raw = pkg_resources.resource_string("uitwww", "data/redirects.yml") with open(UITWWW_DIR + "/data/redirects.yml") as fn:
config = yaml.safe_load(raw.decode("utf-8")) config = yaml.safe_load(fn.read())
bp = flask.Blueprint("redirects", __name__) bp = flask.Blueprint("redirects", __name__)
......
{# Source code of the Ubuntu-it website {# Source code of the Ubuntu-it website
# Copyright (C) 2015 Pietro Albini <pietroalbini@ubuntu.com> # Copyright (C) 2015 Pietro Albini <pietroalbini@ubuntu.com>
# Copyright (C) 2020 Alessandro Viprati <vipri.alessandro@gmail.com> # Copyright (C) 2020 Alessandro Viprati <vipri.alessandro@gmail.com>
# # Copyright (C) 2023 shadMod
# This program is free software: you can redistribute it and/or modify #
# it under the terms of the GNU Affero General Public License as published # This program is free software: you can redistribute it and/or modify
# by the Free Software Foundation, either version 3 of the License, or # it under the terms of the GNU Affero General Public License as published
# (at your option) any later version. # by the Free Software Foundation, either version 3 of the License, or
# # (at your option) any later version.
# This program is distributed in the hope that it will be useful, #
# but WITHOUT ANY WARRANTY; witout even the implied warranty of # This program is distributed in the hope that it will be useful,
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # but WITHOUT ANY WARRANTY; witout even the implied warranty of
# GNU Affero General Public License for more details. # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
# # GNU Affero General Public License for more details.
# You should have received a copy of the GNU Affero General Public License #
# along with this program. If not, see <http://www.gnu.org/licenses/>. # You should have received a copy of the GNU Affero General Public License
#} # along with this program. If not, see <http://www.gnu.org/licenses/>.
#}
{% extends "layout.html" %} {% extends "layout.html" %}
{% block title %}Download{% endblock %} {% block title %}
Download
{% endblock %}
{% block content %} {% block content %}
<div class="page"> <div class="page">
<div class="row"> <div class="row w-100 m-auto">
<div class="col text-center"> <div class="col text-center">
<h1>Scarica Ubuntu</h1> <h1>
<p class="intro">Entra subito nel mondo Ubuntu. Scaricalo ora!</p> Scarica Ubuntu
</div> </h1>
</div> <p class="intro">
</div> Entra subito nel mondo Ubuntu. Scaricalo ora!
</p>
</div>
</div>
</div>
<div class="page"> <div class="page">
{% for name, data in distros.items() %} {% for name, data in distros.items() %}
<div class="row download-index-distro background-wallpaper {{ name }}"> <div class="row download-index-distro background-wallpaper {{ name }} w-100 m-auto">
<div class="col"> <div class="col">
<h2>{{ data["name"] }}</h2> <h2>
<p>{{ data["description"] }}</p> {{ data["name"] }}
</div> </h2>
<div class="col col-center col-quarter"> <p>
<a class="btn" href="{{ url_for("download.landing", distro = name) }}"> {{ data["description"] }}
Scaricalo ora </p>
</a> </div>
</div> <div class="col col-center col-quarter">
</div> <a class="btn" href="{{ url_for('download.landing', distro = name) }}">
{% endfor %} Scaricalo ora
</div> </a>
</div>
</div>
{% endfor %}
</div>
{% endblock %} {% endblock %}
This diff is collapsed.
This diff is collapsed.
{# Source code of the Ubuntu-it website {# Source code of the Ubuntu-it website
# Copyright (C) 2015 Pietro Albini <pietroalbini@ubuntu.com> # Copyright (C) 2015 Pietro Albini
# 2015 Marco Montabone <montabone.mrc@gmail.com> <pietroalbini@ubuntu.com>
# 2019-2020 Alessandro Viprati <vipri.alessandro@gmail.com> # 2015 Marco Montabone
# <montabone.mrc@gmail.com>
# This program is free software: you can redistribute it and/or modify # 2019-2020 Alessandro Viprati
# it under the terms of the GNU Affero General Public License as published <vipri.alessandro@gmail.com>
# by the Free Software Foundation, either version 3 of the License, or #
# (at your option) any later version. # This program is free software: you can redistribute it and/or modify
# # it under the terms of the GNU Affero General Public License as published
# This program is distributed in the hope that it will be useful, # by the Free Software Foundation, either version 3 of the License, or
# but WITHOUT ANY WARRANTY; witout even the implied warranty of # (at your option) any later version.
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the #
# GNU Affero General Public License for more details. # This program is distributed in the hope that it will be useful,
# # but WITHOUT ANY WARRANTY; witout even the implied warranty of
# You should have received a copy of the GNU Affero General Public License # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
# along with this program. If not, see <http://www.gnu.org/licenses/>. # GNU Affero General Public License for more details.
#} #
# You should have received a copy of the GNU Affero General Public License
# along with this program. If not, see
<http://www.gnu.org/licenses/>.
#}
{% extends "layout.html" %} {% extends "layout.html" %}
{% block title %}Ubuntu Budgie{% endblock %} {% block title %}Ubuntu Budgie{% endblock %}
{% block content %} {% block content %}
<div class="page"> <div class="page">
<div class="row background-wallpaper ubuntu-budgie"> <div class="row background-wallpaper ubuntu-budgie">
<div class="col"> <div class="col">
<h1 class="text-center">Ubuntu Budgie</h1> <h1 class="text-center">
<p class="intro text-center"><a href="https://ubuntubudgie.org/" target="_blank">Ubuntu Budgie</a> è la versione di Ubuntu basata sull'ambiente grafico <a href="https://github.com/solus-project/budgie-desktop" target="_blank">Budgie</a>.</p> Ubuntu Budgie
</div> </h1>
</div> <p class="intro text-center">
<a href="https://ubuntubudgie.org/" target="_blank">
Ubuntu Budgie
</a>
è la versione di Ubuntu basata sull'ambiente grafico
<a href="https://github.com/solus-project/budgie-desktop" target="_blank">
Budgie
</a>.
</p>
</div>
</div>
</div> </div>
<div class="page"> <div class="page">
<div class="row"> <div class="row">
<div class="col"> <div class="col">
<p> <p>
Ubuntu Budgie combina la semplicità e l'eleganza dell'interfaccia Ubuntu Budgie combina la semplicità e l'eleganza dell'interfaccia
grafica Budgie per produrre un sistema operativo moderno e pulito. grafica Budgie per produrre un sistema operativo moderno e pulito.
Ubuntu Budgie include le migliori applicazioni per renderti Ubuntu Budgie include le migliori applicazioni per renderti
immediatamente produttivo. immediatamente produttivo.
</p> </p>
</div> </div>
<div class="col col-quarter"> <div class="col col-quarter">
<img src="{{ url_for("static", filename="images/derivate/ubuntu-budgie/ubuntu-budgie-logo.png") }}" alt="Logo di Ubuntu Budgie"> <img src="{{ url_for('static', filename='images/derivate/ubuntu-budgie/ubuntu-budgie-logo.png') }}"
</div> alt="Logo di Ubuntu Budgie">
</div> </div>
<div class="row"> </div>
<div class="col" align="justify"> <div class="row">
<h2>Titolo2</h2> <div class="col" align="justify">
<p> <h2>
Testo. Flessibile
</p> </h2>
<p> <p>
<ul> L'utilizzo di Ubuntu Budgie offre la libertà di eseguire un sistema operativo completo e ricco di
<li>Testo.</li> funzionalità, preconfigurato con la maggior parte, se non tutte, le applicazioni necessarie per
<li>Testo.</li> l'attività informatica quotidiana, o di modificare l'aspetto, il funzionamento o le applicazioni
<li>Testo.</li> eseguite in base ai propri gusti.
</ul> </p>
</p> </div>
</div> <div class="col">
<div class="col"> <img src="{{ url_for('static', filename='images/derivate/ubuntu-budgie/ubuntu-budgie-desktop.png') }}">
<img src="{{ url_for("static", filename="images/derivate/ubuntu-budgie/file.png") }}" alt="Nome"> </div>
</div> </div>
</div> <div class="row">
<div class="row"> <div class="col" align="justify">
<div class="col" align="justify"> <h2>
<h2>Titolo2</h2> Sicuro
<p> </h2>
Testo. <p>
</p> Ubuntu Budgie è stato progettato pensando alla sicurezza. A differenza dei sistemi operativi che si
<p> aggiornano solo una volta al mese, Ubuntu Budgie riceve aggiornamenti continui. Gli aggiornamenti
<ul> includono patch di sicurezza per Ubuntu Budgie e tutti i suoi componenti. Anche gli aggiornamenti di
<li>Testo.</li> sicurezza per tutte le applicazioni installate vengono forniti con la stessa frequenza. In questo modo
<li>Testo.</li> si ha la certezza di avere la protezione più recente per tutto il software del computer, non appena
<li>Testo.</li> disponibile!
</ul> </p>
</p> </div>
</div> <div class="col">
<div class="col"> <img src="{{ url_for('static', filename='images/derivate/ubuntu-budgie/ubuntu-budgie-security.png') }}">
<img src="{{ url_for("static", filename="images/derivate/ubuntu-budgie/file.png") }}" alt="Nome"> </div>
</div> </div>
</div> <div class="row">
<div class="row"> <div class="col" align="justify">
<div class="col" align="justify"> <h2>
<h2>Titolo2</h2> Software per ogni esigenza
<p> </h2>
Testo. <p>
</p> Ubuntu Budgie aggiunge una raccolta di applicazioni aggiuntive per trasformare il computer in una
<p> workstation davvero potente: dalla produttività all'intrattenimento!
<ul> </p>
<li>Testo.</li> </div>
<li>Testo.</li> <div class="col">
<li>Testo.</li> <img src="{{ url_for('static', filename='images/derivate/ubuntu-budgie/ubuntu-budgie-everything.jpg') }}">
</ul> </div>
</p> </div>
</div> <div class="row">
<div class="col"> <div class="col" align="justify">
<img src="{{ url_for("static", filename="images/derivate/ubuntu-budgie/file.png") }}" alt="Nome"> <h2>
</div> Powered by Steam
</div> </h2>
<div class="row"> <p>
<div class="col" align="justify"> Negli ultimi due anni Linux è diventato una piattaforma di gioco di prima classe grazie all'arrivo della
<h2>Titolo2</h2> piattaforma Steam su Linux. Al momento in cui scriviamo, Steam ha più di 2000 titoli indie e AAA di alta
<p> qualità pronti per Ubuntu Budgie. Se Steam è un importante passo avanti per il gioco su Linux, ci sono
Testo. anche molti titoli Open Source di alta qualità e divertenti disponibili per Ubuntu Budgie. Non importa
</p> se vi piacciono i simulatori di volo, le corse automobilistiche, gli sparatutto in prima persona, i
<p> giochi di salto e corsa o di carte, troverete qualcosa che vi intratterrà.
<ul> </p>
<li>Testo.</li> </div>
<li>Testo.</li> <div class="col">
<li>Testo.</li> <img src="{{ url_for('static', filename='images/derivate/ubuntu-budgie/ubuntu-budgie-steam.jpg') }}">
</ul> </div>
</p> </div>
</div> <div class="row text-center">
<div class="col"> <div>
<img src="{{ url_for("static", filename="images/derivate/ubuntu-budgie/file.png") }}" alt="Nome"> <a class="btn" href="{{ url_for('download.landing', distro='ubuntu-budgie') }}">
</div> Scarica Ubuntu Budgie
</div> </a>
<div class="row"> <a class="btn" href="https://ubuntubudgie.org/">
<div class="col" align="justify"> Sito internazionale
<h2>Titolo2</h2> </a>
<p> <a class="btn" href="https://ubuntubudgie.org/about">
Testo. Per saperne di più
</p> </a>
<p> </div>
<ul> </div>
<li>Testo.</li>
<li>Testo.</li>
<li>Testo.</li>
</ul>
</p>
</div>
<div class="col">
<img src="{{ url_for("static", filename="images/derivate/ubuntu-budgie/file.png") }}" alt="Nome">
</div>
</div>
<div class="row text-center">
<div>
<a class="btn" href="{{ url_for("download.landing", distro="ubuntu-budgie") }}">Scarica Ubuntu Budgie</a>
<a class="btn" href="https://ubuntubudgie.org/">Sito internazionale</a>
<a class="btn" href="https://ubuntubudgie.org/about">Per saperne di più</a>
</div>
</div>
</div> </div>
{% endblock %} {% endblock %}
...@@ -40,97 +40,7 @@ ...@@ -40,97 +40,7 @@
</p> </p>
</div> </div>
<div class="col col-quarter"> <div class="col col-quarter">
<img src="{{ url_for("static", filename="images/derivate/ubuntu-kylin/ubuntu-kylin-logo.png") }}" alt="Logo di Ubuntu Kylin"> <img src="{{ url_for('static', filename='images/derivate/ubuntu-kylin/ubuntu-kylin-logo.png') }}" alt="Logo di Ubuntu Kylin">
</div>
</div>
<div class="row">
<div class="col" align="justify">
<h2>Titolo2</h2>
<p>
Testo.
</p>
<p>
<ul>
<li>Testo.</li>
<li>Testo.</li>
<li>Testo.</li>
</ul>
</p>
</div>
<div class="col">
<img src="{{ url_for("static", filename="images/derivate/ubuntu-kylin/file.png") }}" alt="Nome">
</div>
</div>
<div class="row">
<div class="col" align="justify">
<h2>Titolo2</h2>
<p>
Testo.
</p>
<p>
<ul>
<li>Testo.</li>
<li>Testo.</li>
<li>Testo.</li>
</ul>
</p>
</div>
<div class="col">
<img src="{{ url_for("static", filename="images/derivate/ubuntu-kylin/file.png") }}" alt="Nome">
</div>
</div>
<div class="row">
<div class="col" align="justify">
<h2>Titolo2</h2>
<p>
Testo.
</p>
<p>
<ul>
<li>Testo.</li>
<li>Testo.</li>
<li>Testo.</li>
</ul>
</p>
</div>
<div class="col">
<img src="{{ url_for("static", filename="images/derivate/ubuntu-kylin/file.png") }}" alt="Nome">
</div>
</div>
<div class="row">
<div class="col" align="justify">
<h2>Titolo2</h2>
<p>
Testo.
</p>
<p>
<ul>
<li>Testo.</li>
<li>Testo.</li>
<li>Testo.</li>
</ul>
</p>
</div>
<div class="col">
<img src="{{ url_for("static", filename="images/derivate/ubuntu-kylin/file.png") }}" alt="Nome">
</div>
</div>
<div class="row">
<div class="col" align="justify">
<h2>Titolo2</h2>
<p>
Testo.
</p>
<p>
<ul>
<li>Testo.</li>
<li>Testo.</li>
<li>Testo.</li>
</ul>
</p>
</div>
<div class="col">
<img src="{{ url_for("static", filename="images/derivate/ubuntu-kylin/file.png") }}" alt="Nome">
</div> </div>
</div> </div>
<div class="row text-center"> <div class="row text-center">
......
...@@ -44,96 +44,6 @@ ...@@ -44,96 +44,6 @@
<img src="{{ url_for("static", filename="images/derivate/ubuntu-mate/ubuntu-mate-logo.png") }}" alt="Logo di Ubuntu MATE"> <img src="{{ url_for("static", filename="images/derivate/ubuntu-mate/ubuntu-mate-logo.png") }}" alt="Logo di Ubuntu MATE">
</div> </div>
</div> </div>
<div class="row">
<div class="col" align="justify">
<h2>Titolo2</h2>
<p>
Testo.
</p>
<p>
<ul>
<li>Testo.</li>
<li>Testo.</li>
<li>Testo.</li>
</ul>
</p>
</div>
<div class="col">
<img src="{{ url_for("static", filename="images/derivate/ubuntu-mate/file.png") }}" alt="Nome">
</div>
</div>
<div class="row">
<div class="col" align="justify">
<h2>Titolo2</h2>
<p>
Testo.
</p>
<p>
<ul>
<li>Testo.</li>
<li>Testo.</li>
<li>Testo.</li>
</ul>
</p>
</div>
<div class="col">
<img src="{{ url_for("static", filename="images/derivate/ubuntu-mate/file.png") }}" alt="Nome">
</div>
</div>
<div class="row">
<div class="col" align="justify">
<h2>Titolo2</h2>
<p>
Testo.
</p>
<p>
<ul>
<li>Testo.</li>
<li>Testo.</li>
<li>Testo.</li>
</ul>
</p>
</div>
<div class="col">
<img src="{{ url_for("static", filename="images/derivate/ubuntu-mate/file.png") }}" alt="Nome">
</div>
</div>
<div class="row">
<div class="col" align="justify">
<h2>Titolo2</h2>
<p>
Testo.
</p>
<p>
<ul>
<li>Testo.</li>
<li>Testo.</li>
<li>Testo.</li>
</ul>
</p>
</div>
<div class="col">
<img src="{{ url_for("static", filename="images/derivate/ubuntu-mate/file.png") }}" alt="Nome">
</div>
</div>
<div class="row">
<div class="col" align="justify">
<h2>Titolo2</h2>
<p>
Testo.
</p>
<p>
<ul>
<li>Testo.</li>
<li>Testo.</li>
<li>Testo.</li>
</ul>
</p>
</div>
<div class="col">
<img src="{{ url_for("static", filename="images/derivate/ubuntu-mate/file.png") }}" alt="Nome">
</div>
</div>
<div class="row text-center"> <div class="row text-center">
<div> <div>
<a class="btn" href="{{ url_for("download.landing", distro="ubuntu-mate") }}">Scarica Ubuntu MATE</a> <a class="btn" href="{{ url_for("download.landing", distro="ubuntu-mate") }}">Scarica Ubuntu MATE</a>
......
...@@ -44,96 +44,6 @@ ...@@ -44,96 +44,6 @@
<img src="{{ url_for("static", filename="images/derivate/ubuntu-studio/ubuntu-studio-logo.png") }}" alt="Logo di Ubuntu Studio"> <img src="{{ url_for("static", filename="images/derivate/ubuntu-studio/ubuntu-studio-logo.png") }}" alt="Logo di Ubuntu Studio">
</div> </div>
</div> </div>
<div class="row">
<div class="col" align="justify">
<h2>Titolo2</h2>
<p>
Testo.
</p>
<p>
<ul>
<li>Testo.</li>
<li>Testo.</li>
<li>Testo.</li>
</ul>
</p>
</div>
<div class="col">
<img src="{{ url_for("static", filename="images/derivate/ubuntu-studio/file.png") }}" alt="Nome">
</div>
</div>
<div class="row">
<div class="col" align="justify">
<h2>Titolo2</h2>
<p>
Testo.
</p>
<p>
<ul>
<li>Testo.</li>
<li>Testo.</li>
<li>Testo.</li>
</ul>
</p>
</div>
<div class="col">
<img src="{{ url_for("static", filename="images/derivate/ubuntu-studio/file.png") }}" alt="Nome">
</div>
</div>
<div class="row">
<div class="col" align="justify">
<h2>Titolo2</h2>
<p>
Testo.
</p>
<p>
<ul>
<li>Testo.</li>
<li>Testo.</li>
<li>Testo.</li>
</ul>
</p>
</div>
<div class="col">
<img src="{{ url_for("static", filename="images/derivate/ubuntu-studio/file.png") }}" alt="Nome">
</div>
</div>
<div class="row">
<div class="col" align="justify">
<h2>Titolo2</h2>
<p>
Testo.
</p>
<p>
<ul>
<li>Testo.</li>
<li>Testo.</li>
<li>Testo.</li>
</ul>
</p>
</div>
<div class="col">
<img src="{{ url_for("static", filename="images/derivate/ubuntu-studio/file.png") }}" alt="Nome">
</div>
</div>
<div class="row">
<div class="col" align="justify">
<h2>Titolo2</h2>
<p>
Testo.
</p>
<p>
<ul>
<li>Testo.</li>
<li>Testo.</li>
<li>Testo.</li>
</ul>
</p>
</div>
<div class="col">
<img src="{{ url_for("static", filename="images/derivate/ubuntu-studio/file.png") }}" alt="Nome">
</div>
</div>
<div class="row text-center"> <div class="row text-center">
<div> <div>
<a class="btn" href="{{ url_for("download.landing", distro="ubuntu-studio") }}">Scarica Ubuntu Studio</a> <a class="btn" href="{{ url_for("download.landing", distro="ubuntu-studio") }}">Scarica Ubuntu Studio</a>
......
{# Source code of the Ubuntu-it website {# Source code of the Ubuntu-it website
# Copyright (C) 2015 Pietro Albini <pietroalbini@ubuntu.com> # Copyright (C) 2015 Pietro Albini <pietroalbini@ubuntu.com>
# Copyright (C) 2021 Alessandro Viprati <vipri.alessandro@gmail.com> # Copyright (C) 2021 Alessandro Viprati <vipri.alessandro@gmail.com>
# # Copyright (C) 2023 shadMod
# This program is free software: you can redistribute it and/or modify #
# it under the terms of the GNU Affero General Public License as published # This program is free software: you can redistribute it and/or modify
# by the Free Software Foundation, either version 3 of the License, or # it under the terms of the GNU Affero General Public License as published
# (at your option) any later version. # by the Free Software Foundation, either version 3 of the License, or
# # (at your option) any later version.
# This program is distributed in the hope that it will be useful, #
# but WITHOUT ANY WARRANTY; witout even the implied warranty of # This program is distributed in the hope that it will be useful,
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # but WITHOUT ANY WARRANTY; witout even the implied warranty of
# GNU Affero General Public License for more details. # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
# # GNU Affero General Public License for more details.
# You should have received a copy of the GNU Affero General Public License #
# along with this program. If not, see <http://www.gnu.org/licenses/>. # You should have received a copy of the GNU Affero General Public License
#} # along with this program. If not, see <http://www.gnu.org/licenses/>.
#}
{% extends "layout.html" %} {% extends "layout.html" %}
{% block title %}Home page{% endblock %} {% block title %}
Home page
{% endblock %}
{% block content %} {% block content %}
<div class="page"> <div class="page">
<div class="row background-wallpaper banner-latest" style="padding: 80px;"> <div class="row background-wallpaper banner-latest p-100">
<div class="col text-center"> <div class="col text-center">
<h1>Ubuntu 21.10</h1> <h1>
<p class="intro text-center">Le ultime novità dal mondo del software Ubuntu 22.04
libero, con stile.</p> </h1>
<a class="btn" href="{{ url_for("pages.scopri-ubuntu_nuovo-rilascio") }}">Scopri di più</a> <p class="intro text-center">
<a class="btn" href="{{ url_for("download.landing", distro="desktop") }}">Scarica Ubuntu</a> Le ultime novità dal mondo del software libero, con stile.
</p>
<a class="btn" href="{{ url_for('pages.scopri-ubuntu_nuovo-rilascio') }}">
Scopri di più
</a>
<a class="btn" href="{{ url_for('download.landing', distro='desktop') }}">
Scarica Ubuntu
</a>
</div>
</div> </div>
</div>
</div> </div>
<div class="page"> <div class="page">
<div class="row"> <div class="row">
<div class="col"> <div class="col">
<h2>Comunità italiana</h2> <h2>
<p>Ubuntu-it è la comunità italiana di Ubuntu organizzata in Comunità italiana
<a href="{{ url_for('pages.comunita_index') }}">gruppi di lavoro</a>, </h2>
ciascuno con obbiettivi diversi: dallo sviluppo <p>
al supporto, alla documentazione, alla promozione...</p> Ubuntu-it è la comunità italiana di Ubuntu.
</div> </p>
<div class="col"> <p>
<h2>Derivate</h2> Essa è organizzata in diversi
<p>Interfacce diverse ma sotto batte lo stesso cuore, per essere <a href="{{ url_for('pages.comunita_index') }}">
libero di scegliere. Scopri le differenze e gli obiettivi nella gruppi di lavoro
<a href="{{ url_for('pages.derivate_index') }}">pagina dedicata</a>.</p> </a>,
</div> coordinati dal Consiglio della comunità, ciascuno con un obiettivo diverso:
<div class="col"> dallo sviluppo, al supporto fino alla promozione.
<h2>Supporto</h2> </p>
<p>Cerca risposte alle tue domande nei
<a href="{{ url_for('pages.supporto') }}">portali di Ubuntu-it</a> e </div>
aiutaci a fornire supporto a chi ne ha bisogno.</p> <div class="col">
</div> <h2>
</div> Derivate
</h2>
<p>
Interfacce diverse ma sotto batte lo stesso cuore, per essere libero di scegliere.
</p>
<p>
Scopri le differenze e gli obiettivi nella
<a href="{{ url_for('pages.derivate_index') }}">
pagina dedicata
</a>.
</p>
</div>
<div class="col">
<h2>
Supporto
</h2>
<p>
Cerca risposte alle tue domande nei
<a href="{{ url_for('pages.supporto') }}">
portali di Ubuntu-it
</a>
e aiutaci a fornire supporto a chi ne ha bisogno.
</p>
</div>
</div>
</div> </div>
<div class="page"> <div class="page">
<div class="row"> <div class="row">
<div class="col"> <div class="col">
<h2>Ultime novità</h2> <h2>
</div> Scopri Ubuntu
<div class="col"> </h2>
<p>inserire link ultimi articoli <a href="/news">blog</a>.</p> <p>
</div> Veloce, sicuro ed elegantemente semplice.
</div> </p>
<p>
Ubuntu è usato da più di 20 milioni di persone in tutto il mondo ogni giorno.
</p>
</div>
<div class="col">
<h2>
Ultime novità
</h2>
<ul class="item-list">
<li>
<a href="{{ url_for('pages.derivate_index') }}">
Newsletter Italiana #Ubuntu - 2023.030
</a>
</li>
<li>
<a href="{{ url_for('pages.derivate_index') }}">
Newsletter Italiana #Ubuntu - 2023.029
</a>
</li>
<li>
<a href="{{ url_for('pages.derivate_index') }}">
Newsletter Italiana #Ubuntu - 2023.028
</a>
</li>
</ul>
</div>
</div>
</div> </div>
<div class="page"> <div class="page">
<div class="row"> <div class="row">
<div class="col col-fourth col-center"> <div class="col">
</div> <h2 class="text-center">
<div class="col col-fourth col-center"> Sponsor tecnici
<h2>Sponsor tecnico</h2> </h2>
</div> <div class="row">
<div class="col col-fourth col-center"> <div class="col text-center">
<p><a href="http://www.top-ix.org"><img src="{{ url_for("static", filename="images/logo/topix-logo.jpg") }}" style="width:203px; height:150px;" alt="Top-ix logo" /></a></p> <a href="https://www.infomaniak.com/it">
</div> <img src="{{ url_for('static', filename='images/sponsor/infomaniak.png')}}"
<div class="col col-fourth col-center"> style="height:150px;" alt="infomaniak logo"/>
</div> </a>
</div> </div>
<div class="col text-center">
<a href="https://www.top-ix.org/it/home/">
<img src="{{ url_for('static', filename='images/sponsor/topix-logo.png')}}"
style="height:150px;" alt="Top-ix logo"/>
</a>
</div>
</div>
</div>
</div>
</div> </div>
{% endblock %} {% endblock %}
{# Source code of the Ubuntu-it website {# Source code of the Ubuntu-it website
# Copyright (C) 2015 Pietro Albini <pietroalbini@ubuntu.com> # Copyright (C) 2015 Pietro Albini <pietroalbini@ubuntu.com>
# 2015 Riccardo Padovani <rpadovani@ubuntu.com> # Copyright (C) 2021 Alessandro Viprati <vipri.alessandro@gmail.com>
# # Copyright (C) 2023 shadMod
# This program is free software: you can redistribute it and/or modify #
# it under the terms of the GNU Affero General Public License as published # This program is free software: you can redistribute it and/or modify
# by the Free Software Foundation, either version 3 of the License, or # it under the terms of the GNU Affero General Public License as published
# (at your option) any later version. # by the Free Software Foundation, either version 3 of the License, or
# # (at your option) any later version.
# This program is distributed in the hope that it will be useful, #
# but WITHOUT ANY WARRANTY; witout even the implied warranty of # This program is distributed in the hope that it will be useful,
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # but WITHOUT ANY WARRANTY; witout even the implied warranty of
# GNU Affero General Public License for more details. # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
# # GNU Affero General Public License for more details.
# You should have received a copy of the GNU Affero General Public License #
# along with this program. If not, see <http://www.gnu.org/licenses/>. # You should have received a copy of the GNU Affero General Public License
#} # along with this program. If not, see <http://www.gnu.org/licenses/>.
#}
{% extends "layout.html" %} {% extends "layout.html" %}
{% block title %}Server{% endblock %} {% block title %}Server{% endblock %}
{% block content %} {% block content %}
<div class="page"> <div class="page container">
<div class="row background-wallpaper server"> <div class="row background-wallpaper server">
<div class="col"> <div class="col">
<h1 class="text-center">Server</h1> <h1 class="text-center">
<p class="intro text-center"> Server
Il sistema operativo per server aziendali di tutti i tipi e dimensioni. </h1>
</p> <p class="intro text-center">
</div> Il sistema operativo per server aziendali di tutti i tipi e dimensioni.
</div> </p>
<div class="row"> </div>
<div class="col"> </div>
<h2 class="text-center">Performante</h2> </div>
<p> <div class="page container">
Ubuntu Server è progettato per server aziendali, ogni suo <div class="row">
elemento si integra perfettamente sulla macchina ospitante. <div class="col">
</p> <h2 class="text-center">
</div> Performante
<div class="col"> </h2>
<h2 class="text-center">Sicuro</h2> <p>
<p> Ubuntu Server è progettato per server aziendali, ogni suo elemento si integra perfettamente sulla
Dopo l'installazione Ubuntu Server non presenta nessuna porta macchina ospitante.
aperta verso l'esterno e contiene solo il software necessario </p>
per un server sicuro. </div>
</p> <div class="col">
</div> <h2 class="text-center">
</div> Sicuro
<div class="row"> </h2>
<div class="col"> <p>
<h2 class="text-center">Integrato</h2> Dopo l'installazione Ubuntu Server non presenta nessuna porta aperta verso l'esterno e contiene solo il
<p> software necessario per un server sicuro.
Anche se in azienda non si utilizzano computer con Ubuntu </p>
desktop non c'è alcun problema. Ubuntu Server permette </div>
l'autenticazione da qualsiasi sistema: Linux, Mac Os o Windows. </div>
</p> <div class="row">
</div> <div class="col">
<div class="col"> <h2 class="text-center">
<h2 class="text-center">Una scelta strategica</h2> Integrato
<p> </h2>
Basata su Debian, famosa per la robustezza, l'edizione Server di <p>
Ubuntu ne eredita le ottime prestazioni e aggiornamenti regolari. Anche se in azienda non si utilizzano computer con Ubuntu desktop non c'è alcun problema. Ubuntu Server
Ubuntu Server fornisce un'ottima piattaforma per sviluppare server permette l'autenticazione da qualsiasi sistema: Linux, Mac Os o Windows.
con i più diffusi servizi internet: mail, web, DNS, server di file o database. </p>
</p> </div>
</div> <div class="col">
</div> <h2 class="text-center">
<div class="row"> Una scelta strategica
<div class="col"> </h2>
<h2 class="text-center">Rilasci programmati su cui poter contare</h2> <p>
<p> Basata su Debian, famosa per la robustezza, l'edizione Server di Ubuntu ne eredita le ottime prestazioni
I rilasci a lungo termine (LTS) sono supportati da Canonical e aggiornamenti regolari. Ubuntu Server fornisce un'ottima piattaforma per sviluppare server con i più
per cinque anni. Ogni sei mesi, i rilasci intermedi forniscono diffusi servizi internet: mail, web, DNS, server di file o database.
nuovo software, mentre gli </p>
<a href="https://wiki.ubuntu-it.org/Rilasci/PointRelease">aggiornamenti HWE</a> </div>
forniscono supporto per le nuove macchine a tutti i rilasci LTS. </div>
</p><br> </div>
<img src="{{ url_for("static", filename="images/scopri-ubuntu/server/releases.png") }}"> <div class="page container">
</div> <div class="row">
</div> <div class="col">
<div class="row text-center"> <h2 class="text-center">
<div> Rilasci programmati su cui poter contare
<a class="btn" href="{{ url_for("download.landing", distro="server") }}">Scarica Ubuntu server</a> </h2>
<a class="btn" href="https://www.ubuntu.com/server">Scopri di più sul sito internazionale</a> <p>
</div> I rilasci a lungo termine (LTS) sono supportati da Canonical per cinque anni. Ogni sei mesi, i rilasci
</div> intermedi forniscono nuovo software, mentre gli
<a href="https://wiki.ubuntu-it.org/Rilasci/PointRelease">
aggiornamenti HWE
</a>
forniscono supporto per le nuove macchine a tutti i rilasci LTS.
</p><br>
<img src="{{ url_for('static', filename='images/scopri-ubuntu/server/releases.png') }}">
</div>
</div>
<div class="row text-center">
<div>
<a class="btn" href="{{ url_for('download.landing', distro='server') }}">
Scarica Ubuntu server
</a>
<a class="btn" href="https://www.ubuntu.com/server">
Scopri di più sul sito internazionale
</a>
</div>
</div>
</div> </div>
{% endblock %} {% endblock %}
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment