Compare commits

..

No commits in common. "master" and "v1.9.1" have entirely different histories.

27 changed files with 286 additions and 750 deletions

View File

@ -10,7 +10,7 @@ Serveur web (basé sur Flask) pour gérer sa collection de partitions musicales
- Thème sombre - Thème sombre
- dashboard administrateur: gestion de tous les albums, partitions et utilisateurs - dashboard administrateur: gestion de tous les albums, partitions et utilisateurs
- [CLI](https://github.com/partitioncloud/partitioncloud-cli) uniquement à des fins de synchronisation. Il serait bon d'ajouter une BDD locale avec les UUIDs des partitions - [CLI](https://github.com/partitioncloud/partitioncloud-cli) uniquement à des fins de synchronisation. Il serait bon d'ajouter une BDD locale avec les UUIDs des partitions
- ~~Pas de Javascript~~ Complètement fonctionnel sans JavaScript, cela vient juste ajouter des [toutes petites améliorations](partitioncloud/static/scripts) - ~~Pas de Javascript~~ Complètement fonctionnel sans JavaScript, cela vient juste ajouter des [toutes petites améliorations](partitioncloud/static/main.js)
## Points à noter ## Points à noter
- Les partitions ajoutées sont accessibles à tous les utilisateurs depuis la recherche même si ils ne sont pas dans un album leur y donnant accès, pour limiter la redondance - Les partitions ajoutées sont accessibles à tous les utilisateurs depuis la recherche même si ils ne sont pas dans un album leur y donnant accès, pour limiter la redondance
@ -20,26 +20,6 @@ Serveur web (basé sur Flask) pour gérer sa collection de partitions musicales
## Installation ## Installation
### Installation via Docker (recommandé)
```bash
# Clone this repo
git clone https://github.com/partitioncloud/partitioncloud-server.git
cd partitioncloud-server
# Create an image named "partitioncloud"
docker build -t partitioncloud .
# You can then run the container, replace $PORT with the port you want to be exposed
PORT=5000
docker run -d \
-p $PORT:5000 \
--restart=unless-stopped \
--name partitioncloud \
partitioncloud:latest
```
L'utilisateur par défaut est `root` avec le mot de passe `root`
### Installation manuelle
Installer le serveur Installer le serveur
```bash ```bash
# Clone this repo # Clone this repo

View File

@ -1,5 +1,2 @@
[extractors]
jinja2 = jinja2.ext:babel_extract
[python: partitioncloud/**.py] [python: partitioncloud/**.py]
[jinja2: partitioncloud/templates/**.html] [jinja2: partitioncloud/templates/**.html]

View File

@ -14,12 +14,6 @@ MAX_ONLINE_QUERIES=3
# Disable registration of new users via /auth/register (they can still be added by root) # Disable registration of new users via /auth/register (they can still be added by root)
DISABLE_REGISTER=False DISABLE_REGISTER=False
# Disable account deletion for users (still possible for admins)
DISABLE_ACCOUNT_DELETION=False
# Set this to True if you want local search to be across all albums (not just those the user belong to)
PRIVATE_SEARCH=False
# Front URL of the application (for QRCodes generation) # Front URL of the application (for QRCodes generation)
BASE_URL="http://localhost:5000" BASE_URL="http://localhost:5000"
@ -39,6 +33,3 @@ LANGUAGES=['en', 'fr']
# Show Launch page # Show Launch page
LAUNCH_PAGE=True LAUNCH_PAGE=True
# Check if account is logged in before serving zipped album/groupe
ZIP_REQUIRE_LOGIN=True

View File

@ -50,8 +50,7 @@ def user_inspect(user_id):
"settings/index.html", "settings/index.html",
skip_old_password=True, skip_old_password=True,
inspected_user=inspected_user, inspected_user=inspected_user,
user=current_user, user=current_user
deletion_allowed=True
) )

View File

@ -5,12 +5,12 @@ Albums module
import os import os
import pypdf import pypdf
import shutil import shutil
from uuid import uuid4 from uuid import uuid4
from typing import TypeVar from typing import TypeVar
from flask import (Blueprint, abort, flash, redirect, render_template, from flask import (Blueprint, abort, flash, redirect, render_template,
request, session, current_app, send_file, g, url_for) request, session, current_app)
from werkzeug.utils import secure_filename
from flask_babel import _ from flask_babel import _
from .auth import login_required from .auth import login_required
@ -43,18 +43,12 @@ def search_page():
flash(_("Missing search query")) flash(_("Missing search query"))
return redirect("/albums") return redirect("/albums")
user = User(user_id=session.get("user_id"))
query = request.form["query"] query = request.form["query"]
nb_queries = abs(int(request.form["nb-queries"])) nb_queries = abs(int(request.form["nb-queries"]))
search.flush_cache(current_app.instance_path) search.flush_cache(current_app.instance_path)
partitions_local = search.local_search(query, utils.get_all_partitions())
partitions_list = None user = User(user_id=session.get("user_id"))
if current_app.config["PRIVATE_SEARCH"]:
partitions_list = utils.get_all_partitions()
else:
partitions_list = user.get_accessible_partitions()
partitions_local = search.local_search(query, partitions_list)
if nb_queries > 0: if nb_queries > 0:
if user.access_level != 1: if user.access_level != 1:
@ -89,7 +83,7 @@ def get_album(uuid):
except LookupError: except LookupError:
return abort(404) return abort(404)
album.users = [User(user_id=u_id) for u_id in album.get_users()] album.users = [User(user_id=i["id"]) for i in album.get_users()]
user = User(user_id=session.get("user_id")) user = User(user_id=session.get("user_id"))
partitions = album.get_partitions() partitions = album.get_partitions()
if user.id is None: if user.id is None:
@ -115,30 +109,6 @@ def qr_code(uuid):
return utils.get_qrcode(f"/albums/{uuid}") return utils.get_qrcode(f"/albums/{uuid}")
@bp.route("/<uuid>/zip")
def zip_download(uuid):
"""
Télécharger un album comme fichier zip
"""
if g.user is None and current_app.config["ZIP_REQUIRE_LOGIN"]:
flash(_("You need to login to access this resource."))
return redirect(url_for("auth.login"))
try:
album = Album(uuid=uuid)
except LookupError:
try:
album = Album(uuid=utils.format_uuid(uuid))
return redirect(f"/albums/{utils.format_uuid(uuid)}")
except LookupError:
return abort(404)
return send_file(
album.to_zip(current_app.instance_path),
download_name=secure_filename(f"{album.name}.zip")
)
@bp.route("/create-album", methods=["POST"]) @bp.route("/create-album", methods=["POST"])
@login_required @login_required
def create_album_req(): def create_album_req():
@ -204,9 +174,8 @@ def quit_album(uuid):
""" """
user = User(user_id=session.get("user_id")) user = User(user_id=session.get("user_id"))
album = Album(uuid=uuid) album = Album(uuid=uuid)
users = album.get_users() users = album.get_users()
if user.id not in users: if user.id not in [u["id"] for u in users]:
flash(_("You are not a member of this album")) flash(_("You are not a member of this album"))
return redirect(request.referrer) return redirect(request.referrer)
@ -235,7 +204,7 @@ def delete_album(uuid):
users = album.get_users() users = album.get_users()
if len(users) > 1: if len(users) > 1:
error = _("You are not alone in this album.") error = _("You are not alone in this album.")
elif len(users) == 1 and users[0] != user.id: elif len(users) == 1 and users[0]["id"] != user.id:
error = _("You don't own this album.") error = _("You don't own this album.")
if user.access_level == 1: if user.access_level == 1:

View File

@ -2,10 +2,6 @@
Classe Album Classe Album
""" """
import os import os
import io
import zipfile
from werkzeug.utils import secure_filename
from ..db import get_db from ..db import get_db
from ..utils import new_uuid from ..utils import new_uuid
@ -51,11 +47,11 @@ class Album():
def get_users(self, force_reload=False): def get_users(self, force_reload=False):
""" """
Renvoie les data["id"] des utilisateurs liés à l'album Renvoie les utilisateurs liés à l'album
""" """
if self.users is None or force_reload: if self.users is None or force_reload:
db = get_db() db = get_db()
data = db.execute( self.users = db.execute(
""" """
SELECT * FROM user SELECT * FROM user
JOIN contient_user ON user_id = user.id JOIN contient_user ON user_id = user.id
@ -64,7 +60,6 @@ class Album():
""", """,
(self.uuid,) (self.uuid,)
).fetchall() ).fetchall()
self.users = [i["id"] for i in data]
return self.users return self.users
def get_partitions(self): def get_partitions(self):
@ -171,23 +166,6 @@ class Album():
db.commit() db.commit()
def to_zip(self, instance_path):
data = io.BytesIO()
with zipfile.ZipFile(data, mode="w") as z:
for partition in self.get_partitions():
z.write(os.path.join(
instance_path,
"partitions",
f"{partition['uuid']}.pdf"
), arcname=secure_filename(partition['name']+".pdf")
)
# Spooling back to the beginning of the buffer
data.seek(0)
return data
def create(name: str) -> str: def create(name: str) -> str:
"""Créer un nouvel album""" """Créer un nouvel album"""
db = get_db() db = get_db()

View File

@ -1,12 +1,3 @@
"""
Classe Groupe
"""
import io
import os
import zipfile
from werkzeug.utils import secure_filename
from ..db import get_db from ..db import get_db
from .album import Album from .album import Album
@ -75,23 +66,21 @@ class Groupe():
album.delete(instance_path) album.delete(instance_path)
def get_users(self, force_reload=False): def get_users(self):
""" """
Renvoie les data["id"] des utilisateurs liés au groupe Renvoie les data["id"] des utilisateurs liés au groupe
TODO: uniformiser le tout
""" """
if self.users is None or force_reload: db = get_db()
db = get_db() return db.execute(
data = db.execute( """
""" SELECT * FROM user
SELECT * FROM user JOIN groupe_contient_user ON user_id = user.id
JOIN groupe_contient_user ON user_id = user.id JOIN groupe ON groupe.id = groupe_id
JOIN groupe ON groupe.id = groupe_id WHERE groupe.id = ?
WHERE groupe.id = ? """,
""", (self.id,)
(self.id,) ).fetchall()
).fetchall()
self.users = [i["id"] for i in data]
return self.users
def get_albums(self, force_reload=False): def get_albums(self, force_reload=False):
""" """
@ -127,36 +116,3 @@ class Groupe():
(self.id,) (self.id,)
).fetchall() ).fetchall()
return [i["id"] for i in data] return [i["id"] for i in data]
def set_admin(self, user_id, value):
"""
Rend un utilisateur administrateur du groupe
"""
db = get_db()
data = db.execute(
"""
UPDATE groupe_contient_user
SET is_admin=?
WHERE user_id=? AND groupe_id=?
""",
(value, user_id, self.id)
)
db.commit()
def to_zip(self, instance_path):
data = io.BytesIO()
with zipfile.ZipFile(data, mode="w") as z:
for album in self.get_albums():
for partition in album.get_partitions():
z.write(os.path.join(
instance_path,
"partitions",
f"{partition['uuid']}.pdf"
), arcname=secure_filename(album.name)+"/"
+secure_filename(partition['name']+".pdf")
)
# Spooling back to the beginning of the buffer
data.seek(0)
return data

View File

@ -75,16 +75,6 @@ class Partition():
) )
db.commit() db.commit()
def update_file(self, file, instance_path):
partition_path = os.path.join(
instance_path,
"partitions",
f"{self.uuid}.pdf"
)
file.save(partition_path)
if os.path.exists(f"{instance_path}/cache/thumbnails/{self.uuid}.jpg"):
os.remove(f"{instance_path}/cache/thumbnails/{self.uuid}.jpg")
def get_user(self): def get_user(self):
db = get_db() db = get_db()
user = db.execute( user = db.execute(

View File

@ -33,7 +33,6 @@ class User():
self.albums = None self.albums = None
self.groupes = None self.groupes = None
self.partitions = None self.partitions = None
self.accessible_partitions = None
self.max_queries = 0 self.max_queries = 0
db = get_db() db = get_db()
@ -170,44 +169,6 @@ class User():
).fetchall() ).fetchall()
return self.partitions return self.partitions
def get_accessible_partitions(self, force_reload=False):
if self.accessible_partitions is None or force_reload:
db = get_db()
if self.access_level == 1:
self.accessible_partitions = db.execute(
"""
SELECT * FROM partition
"""
).fetchall()
else:
self.accessible_partitions = db.execute(
"""
SELECT DISTINCT partition.uuid, partition.name,
partition.author, partition.body,
partition.user_id, partition.source
FROM partition
JOIN album
JOIN contient_partition
ON album.id=album_id
AND partition.uuid=partition_uuid
WHERE album.id IN (
SELECT album.id FROM album
JOIN contient_user
ON contient_user.user_id=?
AND album_id=album.id
UNION
SELECT DISTINCT album.id FROM album
JOIN groupe_contient_user
JOIN groupe_contient_album
ON groupe_contient_user.user_id=?
AND groupe_contient_album.album_id=album.id
AND groupe_contient_user.groupe_id=groupe_contient_album.groupe_id
)
""",
(self.id, self.id,),
).fetchall()
return self.accessible_partitions
def join_album(self, album_uuid): def join_album(self, album_uuid):
db = get_db() db = get_db()
album = Album(uuid=album_uuid) album = Album(uuid=album_uuid)

View File

@ -3,8 +3,7 @@
Groupe module Groupe module
""" """
from flask import (Blueprint, abort, flash, redirect, render_template, from flask import (Blueprint, abort, flash, redirect, render_template,
request, session, current_app, send_file, g, url_for) request, session, current_app)
from werkzeug.utils import secure_filename
from flask_babel import _ from flask_babel import _
from .auth import login_required from .auth import login_required
@ -35,7 +34,7 @@ def get_groupe(uuid):
except LookupError: except LookupError:
return abort(404) return abort(404)
groupe.users = [User(user_id=u_id) for u_id in groupe.get_users()] groupe.users = [User(user_id=i["id"]) for i in groupe.get_users()]
groupe.get_albums() groupe.get_albums()
user = User(user_id=session.get("user_id")) user = User(user_id=session.get("user_id"))
@ -131,7 +130,7 @@ def quit_groupe(uuid):
user = User(user_id=session.get("user_id")) user = User(user_id=session.get("user_id"))
groupe = Groupe(uuid=uuid) groupe = Groupe(uuid=uuid)
users = groupe.get_users() users = groupe.get_users()
if user.id not in users: if user.id not in [u["id"] for u in users]:
flash(_("You are not a member of this group.")) flash(_("You are not a member of this group."))
return redirect(f"/groupe/{uuid}") return redirect(f"/groupe/{uuid}")
@ -140,11 +139,6 @@ def quit_groupe(uuid):
return redirect(f"/groupe/{uuid}#delete") return redirect(f"/groupe/{uuid}#delete")
user.quit_groupe(groupe.uuid) user.quit_groupe(groupe.uuid)
if len(groupe.get_admins()) == 0: # On s'assure que le groupe contient toujours des administrateurs
for user_id in groupe.get_users(force_reload=True):
groupe.set_admin(user_id, True)
flash(_("Group quitted.")) flash(_("Group quitted."))
return redirect("/albums") return redirect("/albums")
@ -156,7 +150,8 @@ def delete_groupe(uuid):
user = User(user_id=session.get("user_id")) user = User(user_id=session.get("user_id"))
error = None error = None
if len(groupe.get_users()) > 1: users = groupe.get_users()
if len(users) > 1:
error = _("You are not alone in this group.") error = _("You are not alone in this group.")
if user.access_level == 1 or user.id not in groupe.get_admins(): if user.access_level == 1 or user.id not in groupe.get_admins():
@ -189,7 +184,7 @@ def create_album_req(groupe_uuid):
if not name or name.strip() == "": if not name or name.strip() == "":
error = _("Missing name.") error = _("Missing name.")
if user.id not in groupe.get_admins() and user.access_level != 1: if user.id not in groupe.get_admins():
error = _("You are not admin of this group.") error = _("You are not admin of this group.")
if error is None: if error is None:
@ -245,7 +240,7 @@ def get_album(groupe_uuid, album_uuid):
user = User(user_id=session.get("user_id")) user = User(user_id=session.get("user_id"))
# List of users without duplicate # List of users without duplicate
users_id = list(set(album.get_users()+groupe.get_users())) users_id = list({i["id"] for i in album.get_users()+groupe.get_users()})
album.users = [User(user_id=id) for id in users_id] album.users = [User(user_id=id) for id in users_id]
partitions = album.get_partitions() partitions = album.get_partitions()
@ -266,31 +261,6 @@ def get_album(groupe_uuid, album_uuid):
) )
@bp.route("/<groupe_uuid>/zip")
def zip_download(groupe_uuid):
"""
Télécharger un groupe comme fichier zip
"""
if g.user is None and current_app.config["ZIP_REQUIRE_LOGIN"]:
flash(_("You need to login to access this resource."))
return redirect(url_for("auth.login"))
try:
groupe = Groupe(uuid=groupe_uuid)
except LookupError:
try:
groupe = Groupe(uuid=utils.format_uuid(groupe_uuid))
return redirect(f"/groupe/{utils.format_uuid(groupe_uuid)}/zip")
except LookupError:
return abort(404)
return send_file(
groupe.to_zip(current_app.instance_path),
download_name=secure_filename(f"{groupe.name}.zip")
)
@bp.route("/<groupe_uuid>/<album_uuid>/qr") @bp.route("/<groupe_uuid>/<album_uuid>/qr")
def groupe_qr_code(groupe_uuid, album_uuid): def groupe_qr_code(groupe_uuid, album_uuid):
return utils.get_qrcode(f"/groupe/{groupe_uuid}/{album_uuid}") return utils.get_qrcode(f"/groupe/{groupe_uuid}/{album_uuid}")

View File

@ -3,7 +3,6 @@
Partition module Partition module
""" """
import os import os
import pypdf
from uuid import uuid4 from uuid import uuid4
from flask import (Blueprint, abort, send_file, render_template, from flask import (Blueprint, abort, send_file, render_template,
request, redirect, flash, session, current_app) request, redirect, flash, session, current_app)
@ -161,17 +160,6 @@ def edit(uuid):
flash(error) flash(error)
return redirect(f"/partition/{ uuid }/edit") return redirect(f"/partition/{ uuid }/edit")
if request.files.get('file', None):
new_file = request.files["file"]
try:
pypdf.PdfReader(new_file)
new_file.seek(0)
except (pypdf.errors.PdfReadError, pypdf.errors.PdfStreamError):
flash(_("Invalid PDF file"))
return redirect(request.referrer)
partition.update_file(new_file, current_app.instance_path)
partition.update( partition.update(
name=request.form["name"], name=request.form["name"],
author=request.form["author"], author=request.form["author"],

View File

@ -10,7 +10,6 @@ import os
import pypdf import pypdf
import googlesearch import googlesearch
from unidecode import unidecode
from .db import get_db from .db import get_db
@ -21,20 +20,20 @@ def local_search(query, partitions):
""" """
Renvoie les 5 résultats les plus pertinents parmi une liste donnée Renvoie les 5 résultats les plus pertinents parmi une liste donnée
""" """
query_words = [word.lower() for word in unidecode(query).split()] query_words = [word.lower() for word in query.split(" ")]
def score_attribution(partition): def score_attribution(partition):
score = 0 score = 0
for word in query_words: for word in query_words:
if word != "": if word != "":
if word in unidecode(partition["name"]).lower(): if word in partition["name"].lower():
score += 6 score += 6
elif word in unidecode(partition["author"]).lower(): elif word in partition["author"].lower():
score += 4 score += 4
elif word in unidecode(partition["body"]).lower(): elif word in partition["body"].lower():
score += 2 score += 2
else: else:
score -= 6 score -= 1
for word in unidecode(partition["name"]).split(): for word in partition["name"].split(" "):
if word != "" and word.lower() not in query_words: if word != "" and word.lower() not in query_words:
score -= 1 score -= 1
return score return score

View File

@ -27,8 +27,7 @@ def index():
return render_template( return render_template(
"settings/index.html", "settings/index.html",
inspected_user=user, inspected_user=user,
user=user, user=user
deletion_allowed=not current_app.config["DISABLE_ACCOUNT_DELETION"]
) )
@ -49,10 +48,6 @@ def delete_account():
if cur_user.id != mod_user.id: if cur_user.id != mod_user.id:
flash(_("Missing rights.")) flash(_("Missing rights."))
return redirect(request.referrer) return redirect(request.referrer)
if current_app.config["DISABLE_ACCOUNT_DELETION"]:
flash(_("You are not allowed to delete your account."))
return redirect(request.referrer)
else: else:
log_data = [mod_user.username, mod_user.id, cur_user.username] log_data = [mod_user.username, mod_user.id, cur_user.username]

View File

@ -718,56 +718,3 @@ midi-player {
border-radius: 5px; border-radius: 5px;
background-color: var(--color-crust); background-color: var(--color-crust);
} }
/** Input[file] */
.file-area {
position: relative;
}
.file-area input[type=file] {
position: absolute;
height: 100%;
top: 0;
left: 0;
right: 0;
bottom: 0;
opacity: 0;
cursor: pointer;
}
.file-area .inner-file-area {
padding: 30px;
background: var(--color-mantle);
border: 2px dashed var(--color-red);
text-align: center;
transition: background 0.3s ease-in-out;
}
.file-area .inner-file-area .success {
display: none;
}
.file-area:hover > .inner-file-area {
background: var(--color-surface0);
}
.file-area input[type=file]:valid + .inner-file-area {
border-color: var(--color-green);
}
.file-area input[type=file]:not(:required) + .inner-file-area {
border-color: var(--color-blue);
}
.file-area input[type=file]:valid + .inner-file-area .success {
display: inline-block;
}
.file-area input[type=file]:valid + .inner-file-area .default {
display: none;
}
.file-area input[type=file]:not(:required) + .inner-file-area .success {
display: none;
}
.file-area input[type=file]:not(:required) + .inner-file-area .default {
display: inline-block;
}

View File

@ -35,8 +35,8 @@
{% endif %} {% endif %}
{{ album.name }} {{ album.name }}
</h2> </h2>
<div id="header-actions"> {% if g.user %}
{% if g.user %} <div id="header-actions">
<section id="users"> <section id="users">
{% for album_user in album.users %} {% for album_user in album.users %}
<div class="user-profile-picture" style="background-color:{{ album_user.color }};" title="{{ album_user.username }}"> <div class="user-profile-picture" style="background-color:{{ album_user.color }};" title="{{ album_user.username }}">
@ -44,28 +44,25 @@
</div> </div>
{% endfor %} {% endfor %}
</section> </section>
{% endif %} <div class="dropdown dp1">
<div class="dropdown dp1"> +
+ <div class="dropdown-content dp1">
<div class="dropdown-content dp1"> {% if g.user %}
{% if g.user %} <a href="#add-partition">{{ _("Add a score") }}</a>
<a href="#add-partition">{{ _("Add a score") }}</a> {% endif %}
{% endif %} {% if not_participant %}
{% if not_participant %} <a href="/albums/{{ album.uuid }}/join">{{ _("Join") }}</a>
<a href="/albums/{{ album.uuid }}/join">{{ _("Join") }}</a> {% elif album.users | length > 1 %}
{% elif g.user and not not_participant %} <a href="/albums/{{ album.uuid }}/quit">{{ _("Quit") }}</a>
<a href="/albums/{{ album.uuid }}/quit">{{ _("Quit") }}</a> {% endif %}
{% endif %} <a href="#share">{{ _("Share") }}</a>
<a href="#share">{{ _("Share") }}</a> {% if g.user.access_level == 1 or (not not_participant and album.users | length == 1) %}
{% if g.user or not config["ZIP_REQUIRE_LOGIN"] %} <a id="delete-album" href="#delete">{{ _("Delete") }}</a>
<a href="/albums/{{ album.uuid }}/zip">{{ _("Download as zip") }}</a> {% endif %}
{% endif %} </div>
{% if g.user.access_level == 1 or (g.user and not not_participant and album.users | length == 1) %}
<a id="delete-album" href="#delete">{{ _("Delete") }}</a>
{% endif %}
</div> </div>
</div> </div>
</div> {% endif %}
</header> </header>
<hr/> <hr/>
{% if partitions|length != 0 %} {% if partitions|length != 0 %}

View File

@ -7,11 +7,7 @@
{% if partition_uuid %} {% if partition_uuid %}
<input name="partition-uuid" value="{{ partition_uuid }}" type="hidden"> <input name="partition-uuid" value="{{ partition_uuid }}" type="hidden">
{% else %} {% else %}
{% block input_file %} <input name="file" type="file" accept=".pdf" required=""><br/>
{% set required=true %}
{% set filetype=".pdf" %}
{% include 'components/input_file.html' %}
{% endblock %}
{% endif %} {% endif %}
<input type="submit" value="{{ _('Add') }}" /> <input type="submit" value="{{ _('Add') }}" />
</form> </form>

View File

@ -1,7 +0,0 @@
<div class="file-area">
<input name="file" type="file" accept="{{ filetype }}" {% if required %}required=""{% endif %}>
<div class="inner-file-area">
<div class="success">{{ _("Your file is selected.") }}</div>
<div class="default">{{ _("Select or drag & drop your file") }} ({{ filetype }}).</div>
</div>
</div>

View File

@ -30,8 +30,8 @@
{% block content %} {% block content %}
<header id="album-header"> <header id="album-header">
<h2 id="groupe-title">{{ groupe.name }}</h2> <h2 id="groupe-title">{{ groupe.name }}</h2>
<div id="header-actions"> {% if g.user %}
{% if g.user %} <div id="header-actions">
<section id="users"> <section id="users">
{% for groupe_user in groupe.users %} {% for groupe_user in groupe.users %}
<div class="user-profile-picture" style="background-color:{{ groupe_user.color }};" title="{{ groupe_user.username }}"> <div class="user-profile-picture" style="background-color:{{ groupe_user.color }};" title="{{ groupe_user.username }}">
@ -39,26 +39,23 @@
</div> </div>
{% endfor %} {% endfor %}
</section> </section>
{% endif %} <div class="dropdown dp1">
<div class="dropdown dp1"> +
+ <div class="dropdown-content dp1">
<div class="dropdown-content dp1"> {% if not_participant %}
{% if not_participant %} <a href="/groupe/{{ groupe.uuid }}/join">{{ _("Join") }}</a>
<a href="/groupe/{{ groupe.uuid }}/join">{{ _("Join") }}</a> {% elif groupe.users | length > 1 %}
{% elif g.user and not not_participant %} <a href="/groupe/{{ groupe.uuid }}/quit">{{ _("Quit") }}</a>
<a href="/groupe/{{ groupe.uuid }}/quit">{{ _("Quit") }}</a> {% endif %}
{% endif %} <a href="#share">{{ _("Share") }}</a>
<a href="#share">{{ _("Share") }}</a> {% if g.user.access_level == 1 or user.id in groupe.get_admins() %}
{% if g.user or not config["ZIP_REQUIRE_LOGIN"] %} <a href="#create-groupe-album">{{ _("Add an album") }}</a>
<a href="/groupe/{{ groupe.uuid }}/zip">{{ _("Download as zip") }}</a> <a id="delete-album" href="#delete">{{ _("Delete") }}</a>
{% endif %} {% endif %}
{% if g.user.access_level == 1 or (g.user and user.id in groupe.get_admins()) %} </div>
<a href="#create-groupe-album">{{ _("Add an album") }}</a>
<a id="delete-album" href="#delete">{{ _("Delete") }}</a>
{% endif %}
</div> </div>
</div> </div>
</div> {% endif %}
</header> </header>
<hr/> <hr/>
{% if groupe.albums|length != 0 %} {% if groupe.albums|length != 0 %}

View File

@ -9,11 +9,7 @@
<h2>{{ _("Add an attachment to %(name)s", name=partition.name) }}</h2> <h2>{{ _("Add an attachment to %(name)s", name=partition.name) }}</h2>
<form action="/partition/{{ partition.uuid }}/add-attachment" method="post" enctype="multipart/form-data"> <form action="/partition/{{ partition.uuid }}/add-attachment" method="post" enctype="multipart/form-data">
<input type="text" name="name" id="name" placeholder="{{ _('Name') }}"><br/> <input type="text" name="name" id="name" placeholder="{{ _('Name') }}"><br/>
{% block input_file %} <input name="file" type="file" accept=".mp3,.mid" required=""><br/>
{% set required=true %}
{% set filetype=".mp3,.mid" %}
{% include 'components/input_file.html' %}
{% endblock %}
<input type="submit" value="{{ _('Add') }}"> <input type="submit" value="{{ _('Add') }}">
</form> </form>
<a href="#!" class="close-dialog">Close</a> <a href="#!" class="close-dialog">Close</a>
@ -59,7 +55,7 @@
{% endif %} {% endif %}
<br/> <br/>
{% if g.user %} {% if user %}
<div class="centered"> <div class="centered">
<a href="#create-attachment"><button>{{ _("Add an attachment") }}</button></a> <a href="#create-attachment"><button>{{ _("Add an attachment") }}</button></a>
</div> </div>

View File

@ -52,13 +52,7 @@
<td>{{ _("File") }}</td> <td>{{ _("File") }}</td>
<td><a href="/partition/{{ partition.uuid }}"> <td><a href="/partition/{{ partition.uuid }}">
<img class="partition-thumbnail" src="/thumbnails/{{ partition.uuid }}.jpg" loading="lazy"> <img class="partition-thumbnail" src="/thumbnails/{{ partition.uuid }}.jpg" loading="lazy">
</a><br/> </a></td>
{% block input_file %}
{% set required=false %}
{% set filetype=".pdf" %}
{% include 'components/input_file.html' %}
{% endblock %}
</td>
</tr> </tr>
<tr> <tr>
<td>{{ _("Title") }}</td> <td>{{ _("Title") }}</td>

View File

@ -13,13 +13,7 @@
<td>{{ _("File") }}</td> <td>{{ _("File") }}</td>
<td><a href="/partition/{{ partition.uuid }}"> <td><a href="/partition/{{ partition.uuid }}">
<img class="partition-thumbnail" src="/thumbnails/{{ partition.uuid }}.jpg" loading="lazy"> <img class="partition-thumbnail" src="/thumbnails/{{ partition.uuid }}.jpg" loading="lazy">
</a><br/> </a></td>
{% block input_file %}
{% set required=false %}
{% set filetype=".pdf" %}
{% include 'components/input_file.html' %}
{% endblock %}
</td>
</tr> </tr>
{% if partition.source != "unknown" and partition.source != "upload" %} {% if partition.source != "unknown" and partition.source != "upload" %}
<tr> <tr>

View File

@ -35,9 +35,8 @@
<input type="hidden" id="user_id" name="user_id" value="{{ inspected_user.id }}"> <input type="hidden" id="user_id" name="user_id" value="{{ inspected_user.id }}">
<input type="Submit" value="{{ _('confirm') }}"> <input type="Submit" value="{{ _('confirm') }}">
</form> </form>
{% if deletion_allowed %}
<h3>{{ _("Delete account") }}</h3> <h3>{{ _("Delete account") }}</h3>
<a href="#delete-account"><button class="red-confirm">{{ _("Delete account") }}</button></a> <a href="#delete-account"><button class="red-confirm">{{ _("Delete account") }}</button></a>
{% endif %}
{% endblock %} {% endblock %}

View File

@ -7,7 +7,7 @@ msgid ""
msgstr "" msgstr ""
"Project-Id-Version: PROJECT VERSION\n" "Project-Id-Version: PROJECT VERSION\n"
"Report-Msgid-Bugs-To: EMAIL@ADDRESS\n" "Report-Msgid-Bugs-To: EMAIL@ADDRESS\n"
"POT-Creation-Date: 2024-04-10 18:47+0200\n" "POT-Creation-Date: 2024-02-25 15:18+0100\n"
"PO-Revision-Date: 2024-01-22 15:38+0100\n" "PO-Revision-Date: 2024-01-22 15:38+0100\n"
"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n" "Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
"Language: en\n" "Language: en\n"
@ -28,101 +28,96 @@ msgstr "Created user %(username)s"
msgid "This album does not exists, but user %(username)s has been created" msgid "This album does not exists, but user %(username)s has been created"
msgstr "This album does not exists, but user %(username)s has been created" msgstr "This album does not exists, but user %(username)s has been created"
#: partitioncloud/modules/albums.py:43 #: partitioncloud/modules/albums.py:41
msgid "Missing search query" msgid "Missing search query"
msgstr "Missing search query" msgstr "Missing search query"
#: partitioncloud/modules/albums.py:124 partitioncloud/modules/auth.py:27 #: partitioncloud/modules/albums.py:123 partitioncloud/modules/groupe.py:71
#: partitioncloud/modules/auth.py:54 partitioncloud/modules/groupe.py:271 #: partitioncloud/modules/groupe.py:185
msgid "You need to login to access this resource."
msgstr "You need to login to access this resource."
#: partitioncloud/modules/albums.py:155 partitioncloud/modules/groupe.py:72
#: partitioncloud/modules/groupe.py:186
msgid "Missing name." msgid "Missing name."
msgstr "Missing name." msgstr "Missing name."
#: partitioncloud/modules/albums.py:192 #: partitioncloud/modules/albums.py:160
msgid "This album does not exist." msgid "This album does not exist."
msgstr "This album does not exist." msgstr "This album does not exist."
#: partitioncloud/modules/albums.py:195 #: partitioncloud/modules/albums.py:163
msgid "Album added to collection." msgid "Album added to collection."
msgstr "Album added to collection." msgstr "Album added to collection."
#: partitioncloud/modules/albums.py:209 partitioncloud/modules/albums.py:272 #: partitioncloud/modules/albums.py:177 partitioncloud/modules/albums.py:240
#: partitioncloud/modules/albums.py:384 #: partitioncloud/modules/albums.py:346
msgid "You are not a member of this album" msgid "You are not a member of this album"
msgstr "You are not a member of this album" msgstr "You are not a member of this album"
#: partitioncloud/modules/albums.py:213 #: partitioncloud/modules/albums.py:181
msgid "You are alone here, quitting means deleting this album." msgid "You are alone here, quitting means deleting this album."
msgstr "You are alone here, quitting means deleting this album." msgstr "You are alone here, quitting means deleting this album."
#: partitioncloud/modules/albums.py:217 #: partitioncloud/modules/albums.py:185
msgid "Album quitted." msgid "Album quitted."
msgstr "Album quitted." msgstr "Album quitted."
#: partitioncloud/modules/albums.py:236 #: partitioncloud/modules/albums.py:204
msgid "You are not alone in this album." msgid "You are not alone in this album."
msgstr "You are not alone in this album." msgstr "You are not alone in this album."
#: partitioncloud/modules/albums.py:238 #: partitioncloud/modules/albums.py:206
msgid "You don't own this album." msgid "You don't own this album."
msgstr "You don't own this album." msgstr "You don't own this album."
#: partitioncloud/modules/albums.py:249 #: partitioncloud/modules/albums.py:217
msgid "Album deleted." msgid "Album deleted."
msgstr "Album deleted." msgstr "Album deleted."
#: partitioncloud/modules/albums.py:278 partitioncloud/modules/partition.py:154 #: partitioncloud/modules/albums.py:246 partitioncloud/modules/partition.py:153
#: partitioncloud/modules/partition.py:211 #: partitioncloud/modules/partition.py:199
msgid "Missing title" msgid "Missing title"
msgstr "Missing title" msgstr "Missing title"
#: partitioncloud/modules/albums.py:280 partitioncloud/modules/partition.py:64 #: partitioncloud/modules/albums.py:248 partitioncloud/modules/partition.py:63
msgid "Missing file" msgid "Missing file"
msgstr "Missing file" msgstr "Missing file"
#: partitioncloud/modules/albums.py:292 #: partitioncloud/modules/albums.py:260
msgid "Search results expired" msgid "Search results expired"
msgstr "Search results expired" msgstr "Search results expired"
#: partitioncloud/modules/albums.py:302 partitioncloud/modules/partition.py:170 #: partitioncloud/modules/albums.py:326
msgid "Invalid PDF file"
msgstr ""
#: partitioncloud/modules/albums.py:364
#, python-format #, python-format
msgid "Score %(partition_name)s added" msgid "Score %(partition_name)s added"
msgstr "Score %(partition_name)s added" msgstr "Score %(partition_name)s added"
#: partitioncloud/modules/albums.py:378 #: partitioncloud/modules/albums.py:340
msgid "Selecting an album is mandatory." msgid "Selecting an album is mandatory."
msgstr "Selecting an album is mandatory." msgstr "Selecting an album is mandatory."
#: partitioncloud/modules/albums.py:380 #: partitioncloud/modules/albums.py:342
msgid "Selecting a score is mandatory." msgid "Selecting a score is mandatory."
msgstr "Selecting a score is mandatory." msgstr "Selecting a score is mandatory."
#: partitioncloud/modules/albums.py:382 #: partitioncloud/modules/albums.py:344
msgid "Please specify a score type." msgid "Please specify a score type."
msgstr "Please specify a score type." msgstr "Please specify a score type."
#: partitioncloud/modules/albums.py:404 #: partitioncloud/modules/albums.py:366
msgid "Score added" msgid "Score added"
msgstr "Score added" msgstr "Score added"
#: partitioncloud/modules/albums.py:406 #: partitioncloud/modules/albums.py:368
msgid "Score is already in the album." msgid "Score is already in the album."
msgstr "Score is already in the album." msgstr "Score is already in the album."
#: partitioncloud/modules/albums.py:418 #: partitioncloud/modules/albums.py:380
msgid "Unknown score type." msgid "Unknown score type."
msgstr "Unknown score type." msgstr "Unknown score type."
#: partitioncloud/modules/auth.py:59 partitioncloud/modules/settings.py:50 #: partitioncloud/modules/auth.py:27 partitioncloud/modules/auth.py:54
#: partitioncloud/modules/settings.py:82 msgid "You need to login to access this resource."
msgstr "You need to login to access this resource."
#: partitioncloud/modules/auth.py:59 partitioncloud/modules/settings.py:46
#: partitioncloud/modules/settings.py:69
msgid "Missing rights." msgid "Missing rights."
msgstr "Missing rights." msgstr "Missing rights."
@ -130,7 +125,7 @@ msgstr "Missing rights."
msgid "Missing username." msgid "Missing username."
msgstr "Missing username." msgstr "Missing username."
#: partitioncloud/modules/auth.py:87 partitioncloud/modules/settings.py:96 #: partitioncloud/modules/auth.py:87 partitioncloud/modules/settings.py:81
msgid "Missing password." msgid "Missing password."
msgstr "Missing password." msgstr "Missing password."
@ -151,103 +146,99 @@ msgstr "Successfully created new user. You can log in."
msgid "Incorrect username or password" msgid "Incorrect username or password"
msgstr "Incorrect username or password" msgstr "Incorrect username or password"
#: partitioncloud/modules/groupe.py:121 #: partitioncloud/modules/groupe.py:120
msgid "Unknown group." msgid "Unknown group."
msgstr "Unknown group." msgstr "Unknown group."
#: partitioncloud/modules/groupe.py:124 #: partitioncloud/modules/groupe.py:123
msgid "Group added to collection." msgid "Group added to collection."
msgstr "Group added to collection." msgstr "Group added to collection."
#: partitioncloud/modules/groupe.py:135 #: partitioncloud/modules/groupe.py:134
msgid "You are not a member of this group." msgid "You are not a member of this group."
msgstr "You are not a member of this group." msgstr "You are not a member of this group."
#: partitioncloud/modules/groupe.py:139 #: partitioncloud/modules/groupe.py:138
msgid "You are alone here, quitting means deleting this group." msgid "You are alone here, quitting means deleting this group."
msgstr "You are alone here, quitting means deleting this group." msgstr "You are alone here, quitting means deleting this group."
#: partitioncloud/modules/groupe.py:143 #: partitioncloud/modules/groupe.py:142
msgid "Group quitted." msgid "Group quitted."
msgstr "Group quitted." msgstr "Group quitted."
#: partitioncloud/modules/groupe.py:156 #: partitioncloud/modules/groupe.py:155
msgid "You are not alone in this group." msgid "You are not alone in this group."
msgstr "You are not alone in this group." msgstr "You are not alone in this group."
#: partitioncloud/modules/groupe.py:167 #: partitioncloud/modules/groupe.py:166
msgid "Group deleted." msgid "Group deleted."
msgstr "Group deleted." msgstr "Group deleted."
#: partitioncloud/modules/groupe.py:189 #: partitioncloud/modules/groupe.py:188
msgid "You are not admin of this group." msgid "You are not admin of this group."
msgstr "You are not admin of this group." msgstr "You are not admin of this group."
#: partitioncloud/modules/partition.py:59 #: partitioncloud/modules/partition.py:58
msgid "You don't own this score." msgid "You don't own this score."
msgstr "You don't own this score." msgstr "You don't own this score."
#: partitioncloud/modules/partition.py:72 #: partitioncloud/modules/partition.py:71
msgid "Missing filename." msgid "Missing filename."
msgstr "Missing filename." msgstr "Missing filename."
#: partitioncloud/modules/partition.py:77 #: partitioncloud/modules/partition.py:76
msgid "Unsupported file type." msgid "Unsupported file type."
msgstr "Unsupported file type." msgstr "Unsupported file type."
#: partitioncloud/modules/partition.py:145 #: partitioncloud/modules/partition.py:144
msgid "You are not allowed to edit this file." msgid "You are not allowed to edit this file."
msgstr "You are not allowed to edit this file." msgstr "You are not allowed to edit this file."
#: partitioncloud/modules/partition.py:156 #: partitioncloud/modules/partition.py:155
#: partitioncloud/modules/partition.py:213 #: partitioncloud/modules/partition.py:201
msgid "Missing author in request body (can be null)." msgid "Missing author in request body (can be null)."
msgstr "Missing author in request body (can be null)." msgstr "Missing author in request body (can be null)."
#: partitioncloud/modules/partition.py:158 #: partitioncloud/modules/partition.py:157
#: partitioncloud/modules/partition.py:215 #: partitioncloud/modules/partition.py:203
msgid "Missing lyrics (can be null)." msgid "Missing lyrics (can be null)."
msgstr "Missing lyrics (can be null)." msgstr "Missing lyrics (can be null)."
#: partitioncloud/modules/partition.py:181 #: partitioncloud/modules/partition.py:169
#: partitioncloud/modules/partition.py:227 #: partitioncloud/modules/partition.py:215
#, python-format #, python-format
msgid "Successfully modified %(name)s" msgid "Successfully modified %(name)s"
msgstr "Successfully modified %(name)s" msgstr "Successfully modified %(name)s"
#: partitioncloud/modules/partition.py:242 #: partitioncloud/modules/partition.py:230
msgid "You are not allowed to delete this score." msgid "You are not allowed to delete this score."
msgstr "You are not allowed to delete this score." msgstr "You are not allowed to delete this score."
#: partitioncloud/modules/partition.py:250 #: partitioncloud/modules/partition.py:238
msgid "Score deleted." msgid "Score deleted."
msgstr "Score deleted." msgstr "Score deleted."
#: partitioncloud/modules/settings.py:40 partitioncloud/modules/settings.py:72 #: partitioncloud/modules/settings.py:37 partitioncloud/modules/settings.py:60
msgid "Missing user id." msgid "Missing user id."
msgstr "Missing user id." msgstr "Missing user id."
#: partitioncloud/modules/settings.py:54 #: partitioncloud/modules/settings.py:50
msgid "You are not allowed to delete your account."
msgstr "You are not allowed to delete your account."
#: partitioncloud/modules/settings.py:60
msgid "User successfully deleted." msgid "User successfully deleted."
msgstr "User successfully deleted." msgstr "User successfully deleted."
#: partitioncloud/modules/settings.py:86 #: partitioncloud/modules/settings.py:73
msgid "Missing old password." msgid "Missing old password."
msgstr "Missing old password." msgstr "Missing old password."
#: partitioncloud/modules/settings.py:90 #: partitioncloud/modules/settings.py:77
msgid "Incorrect password." msgid "Incorrect password."
msgstr "Incorrect password." msgstr "Incorrect password."
#: partitioncloud/modules/settings.py:100 #: partitioncloud/modules/settings.py:85
msgid "Password and its confirmation differ." msgid "Password and its confirmation differ."
msgstr "Password and its confirmation differ." msgstr "Password and its confirmation differ."
#: partitioncloud/modules/settings.py:104 #: partitioncloud/modules/settings.py:89
msgid "Successfully updated password." msgid "Successfully updated password."
msgstr "Successfully updated password." msgstr "Successfully updated password."
@ -388,7 +379,7 @@ msgid "Scores list"
msgstr "Scores list" msgstr "Scores list"
#: partitioncloud/templates/admin/partitions.html:31 #: partitioncloud/templates/admin/partitions.html:31
#: partitioncloud/templates/albums/album.html:97 #: partitioncloud/templates/albums/album.html:94
msgid "No available scores" msgid "No available scores"
msgstr "No available scores" msgstr "No available scores"
@ -406,41 +397,35 @@ msgid "Do you really want to delete this album?"
msgstr "Do you really want to delete this album?" msgstr "Do you really want to delete this album?"
#: partitioncloud/templates/albums/album.html:16 #: partitioncloud/templates/albums/album.html:16
#: partitioncloud/templates/albums/album.html:64 #: partitioncloud/templates/albums/album.html:60
#: partitioncloud/templates/albums/delete-album.html:8 #: partitioncloud/templates/albums/delete-album.html:8
#: partitioncloud/templates/groupe/index.html:20 #: partitioncloud/templates/groupe/index.html:20
#: partitioncloud/templates/groupe/index.html:57 #: partitioncloud/templates/groupe/index.html:53
#: partitioncloud/templates/partition/delete.html:10 #: partitioncloud/templates/partition/delete.html:10
#: partitioncloud/templates/partition/details.html:92 #: partitioncloud/templates/partition/details.html:86
#: partitioncloud/templates/partition/edit.html:63 #: partitioncloud/templates/partition/edit.html:57
#: partitioncloud/templates/settings/index.html:19
msgid "Delete" msgid "Delete"
msgstr "Delete" msgstr "Delete"
#: partitioncloud/templates/albums/album.html:52 #: partitioncloud/templates/albums/album.html:51
msgid "Add a score" msgid "Add a score"
msgstr "Add a score" msgstr "Add a score"
#: partitioncloud/templates/albums/album.html:55 #: partitioncloud/templates/albums/album.html:54
#: partitioncloud/templates/groupe/index.html:47 #: partitioncloud/templates/groupe/index.html:46
msgid "Join" msgid "Join"
msgstr "Join" msgstr "Join"
#: partitioncloud/templates/albums/album.html:57 #: partitioncloud/templates/albums/album.html:56
#: partitioncloud/templates/groupe/index.html:49 #: partitioncloud/templates/groupe/index.html:48
msgid "Quit" msgid "Quit"
msgstr "Quit" msgstr "Quit"
#: partitioncloud/templates/albums/album.html:59 #: partitioncloud/templates/albums/album.html:58
#: partitioncloud/templates/groupe/index.html:51 #: partitioncloud/templates/groupe/index.html:50
msgid "Share" msgid "Share"
msgstr "Share" msgstr "Share"
#: partitioncloud/templates/albums/album.html:61
#: partitioncloud/templates/groupe/index.html:53
msgid "Download as zip"
msgstr "Download as zip"
#: partitioncloud/templates/albums/delete-album.html:3 #: partitioncloud/templates/albums/delete-album.html:3
#: partitioncloud/templates/partition/delete.html:4 #: partitioncloud/templates/partition/delete.html:4
#, python-format #, python-format
@ -526,20 +511,12 @@ msgstr "author"
msgid "lyrics" msgid "lyrics"
msgstr "lyrics" msgstr "lyrics"
#: partitioncloud/templates/components/add_partition.html:16 #: partitioncloud/templates/components/add_partition.html:12
#: partitioncloud/templates/groupe/index.html:11 #: partitioncloud/templates/groupe/index.html:11
#: partitioncloud/templates/partition/attachments.html:17 #: partitioncloud/templates/partition/attachments.html:13
msgid "Add" msgid "Add"
msgstr "Add" msgstr "Add"
#: partitioncloud/templates/components/input_file.html:4
msgid "Your file is selected."
msgstr "Your file is selected."
#: partitioncloud/templates/components/input_file.html:5
msgid "Select or drag & drop your file"
msgstr "Select or drag & drop your file"
#: partitioncloud/templates/groupe/index.html:8 #: partitioncloud/templates/groupe/index.html:8
#, python-format #, python-format
msgid "Add an album to group %(name)s" msgid "Add an album to group %(name)s"
@ -553,15 +530,15 @@ msgstr "Delete group"
msgid "Do you really want to delete this group and the albums it contains?" msgid "Do you really want to delete this group and the albums it contains?"
msgstr "Do you really want to delete this group and the albums it contains?" msgstr "Do you really want to delete this group and the albums it contains?"
#: partitioncloud/templates/groupe/index.html:56 #: partitioncloud/templates/groupe/index.html:52
msgid "Add an album" msgid "Add an album"
msgstr "Add an album" msgstr "Add an album"
#: partitioncloud/templates/groupe/index.html:77 #: partitioncloud/templates/groupe/index.html:74
msgid "Create one" msgid "Create one"
msgstr "Create one" msgstr "Create one"
#: partitioncloud/templates/groupe/index.html:80 #: partitioncloud/templates/groupe/index.html:77
#, python-format #, python-format
msgid "No available album. %(create)s" msgid "No available album. %(create)s"
msgstr "No available album. %(create)s" msgstr "No available album. %(create)s"
@ -576,7 +553,7 @@ msgstr "Attachments of %(name)s"
msgid "Add an attachment to %(name)s" msgid "Add an attachment to %(name)s"
msgstr "Add an attachment to %(name)s" msgstr "Add an attachment to %(name)s"
#: partitioncloud/templates/partition/attachments.html:26 #: partitioncloud/templates/partition/attachments.html:22
msgid "" msgid ""
"No pdf viewer available in this browser.\n" "No pdf viewer available in this browser.\n"
" You can use Firefox on Android." " You can use Firefox on Android."
@ -584,11 +561,11 @@ msgstr ""
"No pdf viewer available in this browser.\n" "No pdf viewer available in this browser.\n"
" You can use Firefox on Android." " You can use Firefox on Android."
#: partitioncloud/templates/partition/attachments.html:50 #: partitioncloud/templates/partition/attachments.html:46
msgid "JavaScript is mandatory to read MIDI files" msgid "JavaScript is mandatory to read MIDI files"
msgstr "JavaScript is mandatory to read MIDI files" msgstr "JavaScript is mandatory to read MIDI files"
#: partitioncloud/templates/partition/attachments.html:64 #: partitioncloud/templates/partition/attachments.html:60
msgid "Add an attachment" msgid "Add an attachment"
msgstr "Add an attachment" msgstr "Add an attachment"
@ -618,45 +595,45 @@ msgstr "Type"
msgid "File" msgid "File"
msgstr "File" msgstr "File"
#: partitioncloud/templates/partition/details.html:64 #: partitioncloud/templates/partition/details.html:58
#: partitioncloud/templates/partition/details.html:65 #: partitioncloud/templates/partition/details.html:59
#: partitioncloud/templates/partition/edit.html:35 #: partitioncloud/templates/partition/edit.html:29
#: partitioncloud/templates/partition/edit.html:36 #: partitioncloud/templates/partition/edit.html:30
msgid "Title" msgid "Title"
msgstr "Title" msgstr "Title"
#: partitioncloud/templates/partition/details.html:68 #: partitioncloud/templates/partition/details.html:62
#: partitioncloud/templates/partition/details.html:69 #: partitioncloud/templates/partition/details.html:63
#: partitioncloud/templates/partition/edit.html:39 #: partitioncloud/templates/partition/edit.html:33
#: partitioncloud/templates/partition/edit.html:40 #: partitioncloud/templates/partition/edit.html:34
msgid "Author" msgid "Author"
msgstr "Author" msgstr "Author"
#: partitioncloud/templates/partition/details.html:72 #: partitioncloud/templates/partition/details.html:66
#: partitioncloud/templates/partition/details.html:73 #: partitioncloud/templates/partition/details.html:67
#: partitioncloud/templates/partition/edit.html:43 #: partitioncloud/templates/partition/edit.html:37
#: partitioncloud/templates/partition/edit.html:44 #: partitioncloud/templates/partition/edit.html:38
msgid "Lyrics" msgid "Lyrics"
msgstr "Lyrics" msgstr "Lyrics"
#: partitioncloud/templates/partition/details.html:76 #: partitioncloud/templates/partition/details.html:70
#: partitioncloud/templates/partition/edit.html:47 #: partitioncloud/templates/partition/edit.html:41
msgid "Attachments" msgid "Attachments"
msgstr "Attachments" msgstr "Attachments"
#: partitioncloud/templates/partition/details.html:81 #: partitioncloud/templates/partition/details.html:75
#: partitioncloud/templates/partition/edit.html:52 #: partitioncloud/templates/partition/edit.html:46
#, python-format #, python-format
msgid "Yes, %(number)s" msgid "Yes, %(number)s"
msgstr "Yes, %(number)s" msgstr "Yes, %(number)s"
#: partitioncloud/templates/partition/details.html:83 #: partitioncloud/templates/partition/details.html:77
#: partitioncloud/templates/partition/edit.html:54 #: partitioncloud/templates/partition/edit.html:48
msgid "Add one" msgid "Add one"
msgstr "Add one" msgstr "Add one"
#: partitioncloud/templates/partition/details.html:89 #: partitioncloud/templates/partition/details.html:83
#: partitioncloud/templates/partition/edit.html:60 #: partitioncloud/templates/partition/edit.html:54
msgid "Update" msgid "Update"
msgstr "Update" msgstr "Update"
@ -665,51 +642,7 @@ msgstr "Update"
msgid "Modify \"%(name)s\"" msgid "Modify \"%(name)s\""
msgstr "Modify \"%(name)s\"" msgstr "Modify \"%(name)s\""
#: partitioncloud/templates/partition/edit.html:27 #: partitioncloud/templates/partition/edit.html:21
msgid "Source" msgid "Source"
msgstr "Source" msgstr "Source"
#: partitioncloud/templates/settings/index.html:3
msgid "Settings"
msgstr "Settings"
#: partitioncloud/templates/settings/index.html:8
#: partitioncloud/templates/settings/index.html:39
#: partitioncloud/templates/settings/index.html:40
msgid "Delete account"
msgstr "Delete account"
#: partitioncloud/templates/settings/index.html:15
#, python-format
msgid ""
"Do you really want to delete %(username)s's account ? This action is "
"%(irreversible_bold)s."
msgstr ""
"Do you really want to delete %(username)s's account ? This action is "
"%(irreversible_bold)s."
#: partitioncloud/templates/settings/index.html:27
#, python-format
msgid "User %(username)s has %(album_count)s albums"
msgstr "User %(username)s has %(album_count)s albums"
#: partitioncloud/templates/settings/index.html:29
msgid "Change password"
msgstr "Change password"
#: partitioncloud/templates/settings/index.html:31
msgid "old password"
msgstr "old password"
#: partitioncloud/templates/settings/index.html:33
msgid "new password"
msgstr "new password"
#: partitioncloud/templates/settings/index.html:34
msgid "confirm new password"
msgstr "confirm new password"
#: partitioncloud/templates/settings/index.html:36
msgid "confirm"
msgstr "confirm"

View File

@ -7,7 +7,7 @@ msgid ""
msgstr "" msgstr ""
"Project-Id-Version: PROJECT VERSION\n" "Project-Id-Version: PROJECT VERSION\n"
"Report-Msgid-Bugs-To: EMAIL@ADDRESS\n" "Report-Msgid-Bugs-To: EMAIL@ADDRESS\n"
"POT-Creation-Date: 2024-04-10 18:47+0200\n" "POT-Creation-Date: 2024-02-25 15:18+0100\n"
"PO-Revision-Date: 2024-01-22 15:24+0100\n" "PO-Revision-Date: 2024-01-22 15:24+0100\n"
"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n" "Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
"Language: fr\n" "Language: fr\n"
@ -28,101 +28,96 @@ msgstr "Utilisateur %(username)s créé"
msgid "This album does not exists, but user %(username)s has been created" msgid "This album does not exists, but user %(username)s has been created"
msgstr "Cet album n'existe pas. L'utilisateur %(username)s a été créé" msgstr "Cet album n'existe pas. L'utilisateur %(username)s a été créé"
#: partitioncloud/modules/albums.py:43 #: partitioncloud/modules/albums.py:41
msgid "Missing search query" msgid "Missing search query"
msgstr "Aucun terme de recherche spécifié." msgstr "Aucun terme de recherche spécifié."
#: partitioncloud/modules/albums.py:124 partitioncloud/modules/auth.py:27 #: partitioncloud/modules/albums.py:123 partitioncloud/modules/groupe.py:71
#: partitioncloud/modules/auth.py:54 partitioncloud/modules/groupe.py:271 #: partitioncloud/modules/groupe.py:185
msgid "You need to login to access this resource."
msgstr "Vous devez être connecté pour accéder à cette page."
#: partitioncloud/modules/albums.py:155 partitioncloud/modules/groupe.py:72
#: partitioncloud/modules/groupe.py:186
msgid "Missing name." msgid "Missing name."
msgstr "Un nom est requis." msgstr "Un nom est requis."
#: partitioncloud/modules/albums.py:192 #: partitioncloud/modules/albums.py:160
msgid "This album does not exist." msgid "This album does not exist."
msgstr "Cet album n'existe pas." msgstr "Cet album n'existe pas."
#: partitioncloud/modules/albums.py:195 #: partitioncloud/modules/albums.py:163
msgid "Album added to collection." msgid "Album added to collection."
msgstr "Album ajouté à la collection." msgstr "Album ajouté à la collection."
#: partitioncloud/modules/albums.py:209 partitioncloud/modules/albums.py:272 #: partitioncloud/modules/albums.py:177 partitioncloud/modules/albums.py:240
#: partitioncloud/modules/albums.py:384 #: partitioncloud/modules/albums.py:346
msgid "You are not a member of this album" msgid "You are not a member of this album"
msgstr "Vous ne faites pas partie de cet album" msgstr "Vous ne faites pas partie de cet album"
#: partitioncloud/modules/albums.py:213 #: partitioncloud/modules/albums.py:181
msgid "You are alone here, quitting means deleting this album." msgid "You are alone here, quitting means deleting this album."
msgstr "Vous êtes seul dans cet album, le quitter entraînera sa suppression." msgstr "Vous êtes seul dans cet album, le quitter entraînera sa suppression."
#: partitioncloud/modules/albums.py:217 #: partitioncloud/modules/albums.py:185
msgid "Album quitted." msgid "Album quitted."
msgstr "Album quitté." msgstr "Album quitté."
#: partitioncloud/modules/albums.py:236 #: partitioncloud/modules/albums.py:204
msgid "You are not alone in this album." msgid "You are not alone in this album."
msgstr "Vous n'êtes pas seul dans cet album." msgstr "Vous n'êtes pas seul dans cet album."
#: partitioncloud/modules/albums.py:238 #: partitioncloud/modules/albums.py:206
msgid "You don't own this album." msgid "You don't own this album."
msgstr "Vous ne possédez pas cet album." msgstr "Vous ne possédez pas cet album."
#: partitioncloud/modules/albums.py:249 #: partitioncloud/modules/albums.py:217
msgid "Album deleted." msgid "Album deleted."
msgstr "Album supprimé." msgstr "Album supprimé."
#: partitioncloud/modules/albums.py:278 partitioncloud/modules/partition.py:154 #: partitioncloud/modules/albums.py:246 partitioncloud/modules/partition.py:153
#: partitioncloud/modules/partition.py:211 #: partitioncloud/modules/partition.py:199
msgid "Missing title" msgid "Missing title"
msgstr "Un titre est requis." msgstr "Un titre est requis."
#: partitioncloud/modules/albums.py:280 partitioncloud/modules/partition.py:64 #: partitioncloud/modules/albums.py:248 partitioncloud/modules/partition.py:63
msgid "Missing file" msgid "Missing file"
msgstr "Aucun fichier n'a été fourni." msgstr "Aucun fichier n'a été fourni."
#: partitioncloud/modules/albums.py:292 #: partitioncloud/modules/albums.py:260
msgid "Search results expired" msgid "Search results expired"
msgstr "Les résultats de la recherche ont expiré." msgstr "Les résultats de la recherche ont expiré."
#: partitioncloud/modules/albums.py:302 partitioncloud/modules/partition.py:170 #: partitioncloud/modules/albums.py:326
msgid "Invalid PDF file"
msgstr "Fichier PDF invalide"
#: partitioncloud/modules/albums.py:364
#, python-format #, python-format
msgid "Score %(partition_name)s added" msgid "Score %(partition_name)s added"
msgstr "Partition %(partition_name)s ajoutée" msgstr "Partition %(partition_name)s ajoutée"
#: partitioncloud/modules/albums.py:378 #: partitioncloud/modules/albums.py:340
msgid "Selecting an album is mandatory." msgid "Selecting an album is mandatory."
msgstr "Il est nécessaire de sélectionner un album." msgstr "Il est nécessaire de sélectionner un album."
#: partitioncloud/modules/albums.py:380 #: partitioncloud/modules/albums.py:342
msgid "Selecting a score is mandatory." msgid "Selecting a score is mandatory."
msgstr "Il est nécessaire de sélectionner une partition." msgstr "Il est nécessaire de sélectionner une partition."
#: partitioncloud/modules/albums.py:382 #: partitioncloud/modules/albums.py:344
msgid "Please specify a score type." msgid "Please specify a score type."
msgstr "Il est nécessaire de spécifier un type de partition." msgstr "Il est nécessaire de spécifier un type de partition."
#: partitioncloud/modules/albums.py:404 #: partitioncloud/modules/albums.py:366
msgid "Score added" msgid "Score added"
msgstr "Partition ajoutée." msgstr "Partition ajoutée."
#: partitioncloud/modules/albums.py:406 #: partitioncloud/modules/albums.py:368
msgid "Score is already in the album." msgid "Score is already in the album."
msgstr "Partition déjà dans l'album." msgstr "Partition déjà dans l'album."
#: partitioncloud/modules/albums.py:418 #: partitioncloud/modules/albums.py:380
msgid "Unknown score type." msgid "Unknown score type."
msgstr "Type de partition inconnu." msgstr "Type de partition inconnu."
#: partitioncloud/modules/auth.py:59 partitioncloud/modules/settings.py:50 #: partitioncloud/modules/auth.py:27 partitioncloud/modules/auth.py:54
#: partitioncloud/modules/settings.py:82 msgid "You need to login to access this resource."
msgstr "Vous devez être connecté pour accéder à cette page."
#: partitioncloud/modules/auth.py:59 partitioncloud/modules/settings.py:46
#: partitioncloud/modules/settings.py:69
msgid "Missing rights." msgid "Missing rights."
msgstr "Droits insuffisants." msgstr "Droits insuffisants."
@ -130,7 +125,7 @@ msgstr "Droits insuffisants."
msgid "Missing username." msgid "Missing username."
msgstr "Un nom d'utilisateur est requis." msgstr "Un nom d'utilisateur est requis."
#: partitioncloud/modules/auth.py:87 partitioncloud/modules/settings.py:96 #: partitioncloud/modules/auth.py:87 partitioncloud/modules/settings.py:81
msgid "Missing password." msgid "Missing password."
msgstr "Un mot de passe est requis." msgstr "Un mot de passe est requis."
@ -153,103 +148,99 @@ msgstr "Utilisateur créé avec succès. Vous pouvez vous connecter."
msgid "Incorrect username or password" msgid "Incorrect username or password"
msgstr "Nom d'utilisateur ou mot de passe incorrect." msgstr "Nom d'utilisateur ou mot de passe incorrect."
#: partitioncloud/modules/groupe.py:121 #: partitioncloud/modules/groupe.py:120
msgid "Unknown group." msgid "Unknown group."
msgstr "Ce groupe n'existe pas." msgstr "Ce groupe n'existe pas."
#: partitioncloud/modules/groupe.py:124 #: partitioncloud/modules/groupe.py:123
msgid "Group added to collection." msgid "Group added to collection."
msgstr "Groupe ajouté à la collection." msgstr "Groupe ajouté à la collection."
#: partitioncloud/modules/groupe.py:135 #: partitioncloud/modules/groupe.py:134
msgid "You are not a member of this group." msgid "You are not a member of this group."
msgstr "Vous ne faites pas partie de ce groupe" msgstr "Vous ne faites pas partie de ce groupe"
#: partitioncloud/modules/groupe.py:139 #: partitioncloud/modules/groupe.py:138
msgid "You are alone here, quitting means deleting this group." msgid "You are alone here, quitting means deleting this group."
msgstr "Vous êtes seul dans ce groupe, le quitter entraînera sa suppression." msgstr "Vous êtes seul dans ce groupe, le quitter entraînera sa suppression."
#: partitioncloud/modules/groupe.py:143 #: partitioncloud/modules/groupe.py:142
msgid "Group quitted." msgid "Group quitted."
msgstr "Groupe quitté." msgstr "Groupe quitté."
#: partitioncloud/modules/groupe.py:156 #: partitioncloud/modules/groupe.py:155
msgid "You are not alone in this group." msgid "You are not alone in this group."
msgstr "Vous n'êtes pas seul dans ce groupe." msgstr "Vous n'êtes pas seul dans ce groupe."
#: partitioncloud/modules/groupe.py:167 #: partitioncloud/modules/groupe.py:166
msgid "Group deleted." msgid "Group deleted."
msgstr "Groupe supprimé." msgstr "Groupe supprimé."
#: partitioncloud/modules/groupe.py:189 #: partitioncloud/modules/groupe.py:188
msgid "You are not admin of this group." msgid "You are not admin of this group."
msgstr "Vous n'êtes pas administrateur de ce groupe" msgstr "Vous n'êtes pas administrateur de ce groupe"
#: partitioncloud/modules/partition.py:59 #: partitioncloud/modules/partition.py:58
msgid "You don't own this score." msgid "You don't own this score."
msgstr "Cette partition ne vous appartient pas" msgstr "Cette partition ne vous appartient pas"
#: partitioncloud/modules/partition.py:72 #: partitioncloud/modules/partition.py:71
msgid "Missing filename." msgid "Missing filename."
msgstr "Pas de nom de fichier" msgstr "Pas de nom de fichier"
#: partitioncloud/modules/partition.py:77 #: partitioncloud/modules/partition.py:76
msgid "Unsupported file type." msgid "Unsupported file type."
msgstr "Extension de fichier non supportée" msgstr "Extension de fichier non supportée"
#: partitioncloud/modules/partition.py:145 #: partitioncloud/modules/partition.py:144
msgid "You are not allowed to edit this file." msgid "You are not allowed to edit this file."
msgstr "Vous n'êtes pas autorisé à modifier cette partition." msgstr "Vous n'êtes pas autorisé à modifier cette partition."
#: partitioncloud/modules/partition.py:156 #: partitioncloud/modules/partition.py:155
#: partitioncloud/modules/partition.py:213 #: partitioncloud/modules/partition.py:201
msgid "Missing author in request body (can be null)." msgid "Missing author in request body (can be null)."
msgstr "Un nom d'auteur est requis (à minima nul)" msgstr "Un nom d'auteur est requis (à minima nul)"
#: partitioncloud/modules/partition.py:158 #: partitioncloud/modules/partition.py:157
#: partitioncloud/modules/partition.py:215 #: partitioncloud/modules/partition.py:203
msgid "Missing lyrics (can be null)." msgid "Missing lyrics (can be null)."
msgstr "Des paroles sont requises (à minima nulles)" msgstr "Des paroles sont requises (à minima nulles)"
#: partitioncloud/modules/partition.py:181 #: partitioncloud/modules/partition.py:169
#: partitioncloud/modules/partition.py:227 #: partitioncloud/modules/partition.py:215
#, python-format #, python-format
msgid "Successfully modified %(name)s" msgid "Successfully modified %(name)s"
msgstr "Partition %(name)s modifiée avec succès." msgstr "Partition %(name)s modifiée avec succès."
#: partitioncloud/modules/partition.py:242 #: partitioncloud/modules/partition.py:230
msgid "You are not allowed to delete this score." msgid "You are not allowed to delete this score."
msgstr "Vous n'êtes pas autorisé à supprimer cette partition." msgstr "Vous n'êtes pas autorisé à supprimer cette partition."
#: partitioncloud/modules/partition.py:250 #: partitioncloud/modules/partition.py:238
msgid "Score deleted." msgid "Score deleted."
msgstr "Partition supprimée." msgstr "Partition supprimée."
#: partitioncloud/modules/settings.py:40 partitioncloud/modules/settings.py:72 #: partitioncloud/modules/settings.py:37 partitioncloud/modules/settings.py:60
msgid "Missing user id." msgid "Missing user id."
msgstr "Identifiant d'utilisateur manquant." msgstr "Identifiant d'utilisateur manquant."
#: partitioncloud/modules/settings.py:54 #: partitioncloud/modules/settings.py:50
msgid "You are not allowed to delete your account."
msgstr "Vous n'êtes pas autorisé à supprimer votre compte."
#: partitioncloud/modules/settings.py:60
msgid "User successfully deleted." msgid "User successfully deleted."
msgstr "Utilisateur supprimé." msgstr "Utilisateur supprimée."
#: partitioncloud/modules/settings.py:86 #: partitioncloud/modules/settings.py:73
msgid "Missing old password." msgid "Missing old password."
msgstr "Ancien mot de passe manquant." msgstr "Ancien mot de passe manquant."
#: partitioncloud/modules/settings.py:90 #: partitioncloud/modules/settings.py:77
msgid "Incorrect password." msgid "Incorrect password."
msgstr "Mot de passe incorrect." msgstr "Mot de passe incorrect."
#: partitioncloud/modules/settings.py:100 #: partitioncloud/modules/settings.py:85
msgid "Password and its confirmation differ." msgid "Password and its confirmation differ."
msgstr "Le mot de passe et sa confirmation diffèrent" msgstr "Le mot de passe et sa confirmation diffèrent"
#: partitioncloud/modules/settings.py:104 #: partitioncloud/modules/settings.py:89
msgid "Successfully updated password." msgid "Successfully updated password."
msgstr "Mot de passe mis à jour." msgstr "Mot de passe mis à jour."
@ -394,7 +385,7 @@ msgid "Scores list"
msgstr "Liste des partitions" msgstr "Liste des partitions"
#: partitioncloud/templates/admin/partitions.html:31 #: partitioncloud/templates/admin/partitions.html:31
#: partitioncloud/templates/albums/album.html:97 #: partitioncloud/templates/albums/album.html:94
msgid "No available scores" msgid "No available scores"
msgstr "Aucune partition disponible" msgstr "Aucune partition disponible"
@ -412,41 +403,35 @@ msgid "Do you really want to delete this album?"
msgstr "Êtes vous sûr de vouloir supprimer cet album ?" msgstr "Êtes vous sûr de vouloir supprimer cet album ?"
#: partitioncloud/templates/albums/album.html:16 #: partitioncloud/templates/albums/album.html:16
#: partitioncloud/templates/albums/album.html:64 #: partitioncloud/templates/albums/album.html:60
#: partitioncloud/templates/albums/delete-album.html:8 #: partitioncloud/templates/albums/delete-album.html:8
#: partitioncloud/templates/groupe/index.html:20 #: partitioncloud/templates/groupe/index.html:20
#: partitioncloud/templates/groupe/index.html:57 #: partitioncloud/templates/groupe/index.html:53
#: partitioncloud/templates/partition/delete.html:10 #: partitioncloud/templates/partition/delete.html:10
#: partitioncloud/templates/partition/details.html:92 #: partitioncloud/templates/partition/details.html:86
#: partitioncloud/templates/partition/edit.html:63 #: partitioncloud/templates/partition/edit.html:57
#: partitioncloud/templates/settings/index.html:19
msgid "Delete" msgid "Delete"
msgstr "Supprimer" msgstr "Supprimer"
#: partitioncloud/templates/albums/album.html:52 #: partitioncloud/templates/albums/album.html:51
msgid "Add a score" msgid "Add a score"
msgstr "Ajouter une partition" msgstr "Ajouter une partition"
#: partitioncloud/templates/albums/album.html:55 #: partitioncloud/templates/albums/album.html:54
#: partitioncloud/templates/groupe/index.html:47 #: partitioncloud/templates/groupe/index.html:46
msgid "Join" msgid "Join"
msgstr "Rejoindre" msgstr "Rejoindre"
#: partitioncloud/templates/albums/album.html:57 #: partitioncloud/templates/albums/album.html:56
#: partitioncloud/templates/groupe/index.html:49 #: partitioncloud/templates/groupe/index.html:48
msgid "Quit" msgid "Quit"
msgstr "Quitter" msgstr "Quitter"
#: partitioncloud/templates/albums/album.html:59 #: partitioncloud/templates/albums/album.html:58
#: partitioncloud/templates/groupe/index.html:51 #: partitioncloud/templates/groupe/index.html:50
msgid "Share" msgid "Share"
msgstr "Partager" msgstr "Partager"
#: partitioncloud/templates/albums/album.html:61
#: partitioncloud/templates/groupe/index.html:53
msgid "Download as zip"
msgstr "Télécharger le zip"
#: partitioncloud/templates/albums/delete-album.html:3 #: partitioncloud/templates/albums/delete-album.html:3
#: partitioncloud/templates/partition/delete.html:4 #: partitioncloud/templates/partition/delete.html:4
#, python-format #, python-format
@ -532,20 +517,12 @@ msgstr "auteur"
msgid "lyrics" msgid "lyrics"
msgstr "paroles" msgstr "paroles"
#: partitioncloud/templates/components/add_partition.html:16 #: partitioncloud/templates/components/add_partition.html:12
#: partitioncloud/templates/groupe/index.html:11 #: partitioncloud/templates/groupe/index.html:11
#: partitioncloud/templates/partition/attachments.html:17 #: partitioncloud/templates/partition/attachments.html:13
msgid "Add" msgid "Add"
msgstr "Ajouter" msgstr "Ajouter"
#: partitioncloud/templates/components/input_file.html:4
msgid "Your file is selected."
msgstr "Fichier sélectionné."
#: partitioncloud/templates/components/input_file.html:5
msgid "Select or drag & drop your file"
msgstr "Sélectionner ou déposer un fichier"
#: partitioncloud/templates/groupe/index.html:8 #: partitioncloud/templates/groupe/index.html:8
#, python-format #, python-format
msgid "Add an album to group %(name)s" msgid "Add an album to group %(name)s"
@ -562,15 +539,15 @@ msgstr ""
" sous-jacents et leurs partitions si personne ne les a rejoints " " sous-jacents et leurs partitions si personne ne les a rejoints "
"(indépendamment du groupe)." "(indépendamment du groupe)."
#: partitioncloud/templates/groupe/index.html:56 #: partitioncloud/templates/groupe/index.html:52
msgid "Add an album" msgid "Add an album"
msgstr "Ajouter un album" msgstr "Ajouter un album"
#: partitioncloud/templates/groupe/index.html:77 #: partitioncloud/templates/groupe/index.html:74
msgid "Create one" msgid "Create one"
msgstr "En créer un" msgstr "En créer un"
#: partitioncloud/templates/groupe/index.html:80 #: partitioncloud/templates/groupe/index.html:77
#, python-format #, python-format
msgid "No available album. %(create)s" msgid "No available album. %(create)s"
msgstr "Aucun album disponible. %(create)s" msgstr "Aucun album disponible. %(create)s"
@ -585,7 +562,7 @@ msgstr "Attachments de %(name)s"
msgid "Add an attachment to %(name)s" msgid "Add an attachment to %(name)s"
msgstr "Ajouter un attachment à %(name)s" msgstr "Ajouter un attachment à %(name)s"
#: partitioncloud/templates/partition/attachments.html:26 #: partitioncloud/templates/partition/attachments.html:22
msgid "" msgid ""
"No pdf viewer available in this browser.\n" "No pdf viewer available in this browser.\n"
" You can use Firefox on Android." " You can use Firefox on Android."
@ -593,11 +570,11 @@ msgstr ""
"Impossible d'afficher le pdf dans ce navigateur.\n" "Impossible d'afficher le pdf dans ce navigateur.\n"
" Il est conseillé d'utiliser Firefox sur Android." " Il est conseillé d'utiliser Firefox sur Android."
#: partitioncloud/templates/partition/attachments.html:50 #: partitioncloud/templates/partition/attachments.html:46
msgid "JavaScript is mandatory to read MIDI files" msgid "JavaScript is mandatory to read MIDI files"
msgstr "JavaScript est nécessaire pour lire les fichiers MIDI" msgstr "JavaScript est nécessaire pour lire les fichiers MIDI"
#: partitioncloud/templates/partition/attachments.html:64 #: partitioncloud/templates/partition/attachments.html:60
msgid "Add an attachment" msgid "Add an attachment"
msgstr "Ajouter un attachment" msgstr "Ajouter un attachment"
@ -627,45 +604,45 @@ msgstr "Type d'ajout"
msgid "File" msgid "File"
msgstr "Fichier" msgstr "Fichier"
#: partitioncloud/templates/partition/details.html:64 #: partitioncloud/templates/partition/details.html:58
#: partitioncloud/templates/partition/details.html:65 #: partitioncloud/templates/partition/details.html:59
#: partitioncloud/templates/partition/edit.html:35 #: partitioncloud/templates/partition/edit.html:29
#: partitioncloud/templates/partition/edit.html:36 #: partitioncloud/templates/partition/edit.html:30
msgid "Title" msgid "Title"
msgstr "Titre" msgstr "Titre"
#: partitioncloud/templates/partition/details.html:68 #: partitioncloud/templates/partition/details.html:62
#: partitioncloud/templates/partition/details.html:69 #: partitioncloud/templates/partition/details.html:63
#: partitioncloud/templates/partition/edit.html:39 #: partitioncloud/templates/partition/edit.html:33
#: partitioncloud/templates/partition/edit.html:40 #: partitioncloud/templates/partition/edit.html:34
msgid "Author" msgid "Author"
msgstr "Auteur" msgstr "Auteur"
#: partitioncloud/templates/partition/details.html:72 #: partitioncloud/templates/partition/details.html:66
#: partitioncloud/templates/partition/details.html:73 #: partitioncloud/templates/partition/details.html:67
#: partitioncloud/templates/partition/edit.html:43 #: partitioncloud/templates/partition/edit.html:37
#: partitioncloud/templates/partition/edit.html:44 #: partitioncloud/templates/partition/edit.html:38
msgid "Lyrics" msgid "Lyrics"
msgstr "Paroles" msgstr "Paroles"
#: partitioncloud/templates/partition/details.html:76 #: partitioncloud/templates/partition/details.html:70
#: partitioncloud/templates/partition/edit.html:47 #: partitioncloud/templates/partition/edit.html:41
msgid "Attachments" msgid "Attachments"
msgstr "Pièces jointes" msgstr "Pièces jointes"
#: partitioncloud/templates/partition/details.html:81 #: partitioncloud/templates/partition/details.html:75
#: partitioncloud/templates/partition/edit.html:52 #: partitioncloud/templates/partition/edit.html:46
#, python-format #, python-format
msgid "Yes, %(number)s" msgid "Yes, %(number)s"
msgstr "Oui, %(number)s" msgstr "Oui, %(number)s"
#: partitioncloud/templates/partition/details.html:83 #: partitioncloud/templates/partition/details.html:77
#: partitioncloud/templates/partition/edit.html:54 #: partitioncloud/templates/partition/edit.html:48
msgid "Add one" msgid "Add one"
msgstr "En rajouter" msgstr "En rajouter"
#: partitioncloud/templates/partition/details.html:89 #: partitioncloud/templates/partition/details.html:83
#: partitioncloud/templates/partition/edit.html:60 #: partitioncloud/templates/partition/edit.html:54
msgid "Update" msgid "Update"
msgstr "Mettre à jour" msgstr "Mettre à jour"
@ -674,51 +651,7 @@ msgstr "Mettre à jour"
msgid "Modify \"%(name)s\"" msgid "Modify \"%(name)s\""
msgstr "Modifier \"%(name)s\"" msgstr "Modifier \"%(name)s\""
#: partitioncloud/templates/partition/edit.html:27 #: partitioncloud/templates/partition/edit.html:21
msgid "Source" msgid "Source"
msgstr "Source" msgstr "Source"
#: partitioncloud/templates/settings/index.html:3
msgid "Settings"
msgstr "Paramètres"
#: partitioncloud/templates/settings/index.html:8
#: partitioncloud/templates/settings/index.html:39
#: partitioncloud/templates/settings/index.html:40
msgid "Delete account"
msgstr "Supprimer le compte"
#: partitioncloud/templates/settings/index.html:15
#, python-format
msgid ""
"Do you really want to delete %(username)s's account ? This action is "
"%(irreversible_bold)s."
msgstr ""
"Souhaitez-vous vraiment supprimer le compte de %(username)s ? Cette "
"action est %(irreversible_bold)s."
#: partitioncloud/templates/settings/index.html:27
#, python-format
msgid "User %(username)s has %(album_count)s albums"
msgstr "L'utilisateur %(username)s a %(album_count)s albums"
#: partitioncloud/templates/settings/index.html:29
msgid "Change password"
msgstr "Changer de mot de passe"
#: partitioncloud/templates/settings/index.html:31
msgid "old password"
msgstr "ancien mot de passe"
#: partitioncloud/templates/settings/index.html:33
msgid "new password"
msgstr "nouveau mot de passe"
#: partitioncloud/templates/settings/index.html:34
msgid "confirm new password"
msgstr "confirmer le nouveau mot de passe"
#: partitioncloud/templates/settings/index.html:36
msgid "confirm"
msgstr "confirmer"

View File

@ -4,4 +4,3 @@ google
colorama colorama
pypdf pypdf
qrcode qrcode
unidecode

View File

@ -188,10 +188,3 @@ def install_babel():
def install_pypdf(): def install_pypdf():
utils.install_package("pypdf") utils.install_package("pypdf")
"""
v1.10.*
"""
def install_unidecode():
utils.install_package("unidecode")

View File

@ -36,8 +36,7 @@ hooks = [
("v1.5.0", [("Move to instance directory", v1_hooks.move_instance)]), ("v1.5.0", [("Move to instance directory", v1_hooks.move_instance)]),
("v1.5.1", [("Move thumbnails", v1_hooks.move_thumbnails)]), ("v1.5.1", [("Move thumbnails", v1_hooks.move_thumbnails)]),
("v1.7.0", [("Install babel", v1_hooks.install_babel)]), ("v1.7.0", [("Install babel", v1_hooks.install_babel)]),
("v1.8.2", [("Install pypdf", v1_hooks.install_pypdf)]), ("v1.8.2", [("Install pypdf", v1_hooks.install_pypdf)])
("v1.10.3", [("Install unidecode", v1_hooks.install_unidecode)]),
] ]
@ -202,18 +201,11 @@ if __name__ == "__main__":
"--restore", "--restore",
help="restore from specific version backup, will not apply any hook (vx.y.z)", help="restore from specific version backup, will not apply any hook (vx.y.z)",
) )
parser.add_argument(
"-b",
"--backup",
help="backup current version, without running any hooks",
)
args = parser.parse_args() args = parser.parse_args()
config.instance = os.path.abspath(args.instance) config.instance = os.path.abspath(args.instance)
if args.restore is not None: if args.restore is None:
restore(args.restore)
elif args.backup is not None:
backup_instance(args.backup, verbose=True)
else:
migrate(args.current, args.target, skip_backup=args.skip_backup) migrate(args.current, args.target, skip_backup=args.skip_backup)
else:
restore(args.restore)