mirror of
https://github.com/partitioncloud/partitioncloud-server.git
synced 2025-04-22 13:43:55 +02:00
Compare commits
No commits in common. "master" and "v1.9.1" have entirely different histories.
22
README.md
22
README.md
@ -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
|
||||||
|
@ -1,5 +1,2 @@
|
|||||||
[extractors]
|
|
||||||
jinja2 = jinja2.ext:babel_extract
|
|
||||||
|
|
||||||
[python: partitioncloud/**.py]
|
[python: partitioncloud/**.py]
|
||||||
[jinja2: partitioncloud/templates/**.html]
|
[jinja2: partitioncloud/templates/**.html]
|
@ -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
|
|
@ -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
|
|
||||||
)
|
)
|
||||||
|
|
||||||
|
|
||||||
|
@ -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:
|
||||||
|
@ -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()
|
||||||
|
@ -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
|
|
@ -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(
|
||||||
|
@ -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)
|
||||||
|
@ -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}")
|
||||||
|
@ -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"],
|
||||||
|
@ -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
|
||||||
|
@ -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]
|
||||||
|
|
||||||
|
@ -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;
|
|
||||||
}
|
|
@ -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 %}
|
||||||
|
@ -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>
|
@ -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>
|
|
@ -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 %}
|
||||||
|
@ -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>
|
||||||
|
@ -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>
|
||||||
|
@ -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>
|
||||||
|
@ -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 %}
|
||||||
|
@ -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"
|
|
||||||
|
|
||||||
|
@ -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"
|
|
||||||
|
|
||||||
|
@ -4,4 +4,3 @@ google
|
|||||||
colorama
|
colorama
|
||||||
pypdf
|
pypdf
|
||||||
qrcode
|
qrcode
|
||||||
unidecode
|
|
@ -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")
|
|
@ -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)
|
||||||
|
Loading…
x
Reference in New Issue
Block a user