Næster version

This commit is contained in:
2026-04-14 14:05:11 +02:00
parent 9257f198eb
commit 66804681da
11 changed files with 647 additions and 364 deletions

View File

@@ -1,5 +1,6 @@
"""
share_dialog.py — Del en playliste med andre brugere eller sæt den public.
share_dialog.py — Forenklet del-dialog.
Kun ejer kan dele. Delte brugere får listen ved næste sync.
"""
from PyQt6.QtWidgets import (
QDialog, QVBoxLayout, QHBoxLayout, QLabel, QLineEdit,
@@ -19,7 +20,7 @@ class ShareDialog(QDialog):
self._token = token
self.setWindowTitle(f"Del — {playlist_name}")
self.setMinimumWidth(480)
self.setMinimumWidth(440)
self._build_ui()
self._load_shares()
self._load_visibility()
@@ -42,9 +43,9 @@ class ShareDialog(QDialog):
vis_layout.setContentsMargins(10, 8, 10, 8)
vis_layout.addWidget(QLabel("Synlighed:"))
self._vis_combo = QComboBox()
self._vis_combo.addItem("🔒 Privat (kun mig)", "private")
self._vis_combo.addItem("👥 Delt (inviterede)", "shared")
self._vis_combo.addItem("🌐 Public (alle kan se)", "public")
self._vis_combo.addItem("Privat kun dig", "private")
self._vis_combo.addItem("Delt — kun inviterede", "shared")
self._vis_combo.addItem("Public — hjemmesiden", "public")
vis_layout.addWidget(self._vis_combo, stretch=1)
btn_vis = QPushButton("Gem")
btn_vis.setFixedHeight(28)
@@ -52,38 +53,34 @@ class ShareDialog(QDialog):
vis_layout.addWidget(btn_vis)
layout.addWidget(vis_frame)
# Invitér bruger
# Del med bruger
inv_frame = QFrame()
inv_frame.setObjectName("track_display")
inv_layout = QVBoxLayout(inv_frame)
inv_layout.setContentsMargins(10, 8, 10, 8)
inv_layout.setSpacing(6)
inv_layout.addWidget(QLabel("Invitér via e-mail:"))
inv_layout.addWidget(QLabel("Del med (e-mail):"))
row = QHBoxLayout()
self._email_input = QLineEdit()
self._email_input.setPlaceholderText("bruger@eksempel.dk")
row.addWidget(self._email_input)
self._perm_combo = QComboBox()
self._perm_combo.addItem("Se", "view")
self._perm_combo.addItem("Kopiere", "copy")
self._perm_combo.addItem("Redigere","edit")
self._perm_combo.setFixedWidth(90)
row.addWidget(self._perm_combo)
btn_inv = QPushButton("Invitér")
btn_inv = QPushButton("Del")
btn_inv.setFixedHeight(28)
btn_inv.clicked.connect(self._invite)
row.addWidget(btn_inv)
inv_layout.addLayout(row)
note = QLabel("Brugeren får listen ved næste synkronisering.\nKun du kan redigere listen.")
note.setObjectName("result_count")
note.setWordWrap(True)
inv_layout.addWidget(note)
layout.addWidget(inv_frame)
# Liste over delinger
# Liste
lbl = QLabel("Delt med:")
lbl.setObjectName("track_meta")
layout.addWidget(lbl)
self._shares_list = QListWidget()
self._shares_list.setMaximumHeight(150)
self._shares_list.setMaximumHeight(120)
layout.addWidget(self._shares_list)
btn_remove = QPushButton("✕ Fjern valgt deling")
@@ -116,6 +113,19 @@ class ShareDialog(QDialog):
except Exception:
pass
def _set_visibility(self):
vis = self._vis_combo.currentData()
try:
import urllib.request, json
req = urllib.request.Request(
f"{self._server_url}/sharing/playlists/{self._playlist_id}/visibility?visibility={vis}",
data=b"", headers=self._headers(), method="PATCH"
)
urllib.request.urlopen(req, timeout=8)
self._status.setText(f"✓ Synlighed gemt")
except Exception as e:
self._status.setText(f"{e}")
def _load_shares(self):
try:
import urllib.request, json
@@ -127,52 +137,30 @@ class ShareDialog(QDialog):
shares = json.loads(resp.read())
self._shares_list.clear()
for s in shares:
perm = {"view": "Se", "copy": "Kopiere", "edit": "Redigere"}.get(
s["permission"], s["permission"]
)
accepted = "" if s["accepted"] else ""
item = QListWidgetItem(f"{accepted} {s['email']}{perm}")
item = QListWidgetItem(s["email"])
item.setData(Qt.ItemDataRole.UserRole, s["id"])
self._shares_list.addItem(item)
except Exception as e:
self._status.setText(f"Kunne ikke hente delinger: {e}")
def _set_visibility(self):
vis = self._vis_combo.currentData()
try:
import urllib.request, json
req = urllib.request.Request(
f"{self._server_url}/sharing/playlists/{self._playlist_id}/visibility?visibility={vis}",
data=b"",
headers=self._headers(),
method="PATCH"
)
with urllib.request.urlopen(req, timeout=8) as resp:
json.loads(resp.read())
self._status.setText(f"✓ Synlighed sat til {self._vis_combo.currentText()}")
except Exception as e:
self._status.setText(f"⚠ Fejl: {e}")
def _invite(self):
email = self._email_input.text().strip()
perm = self._perm_combo.currentData()
if not email or "@" not in email:
self._status.setText("⚠ Ugyldig e-mailadresse")
return
try:
import urllib.request, json
data = json.dumps({"email": email, "permission": perm}).encode()
data = json.dumps({"email": email}).encode()
req = urllib.request.Request(
f"{self._server_url}/sharing/playlists/{self._playlist_id}/share",
data=data, headers=self._headers(), method="POST"
)
with urllib.request.urlopen(req, timeout=8) as resp:
json.loads(resp.read())
urllib.request.urlopen(req, timeout=8)
self._email_input.clear()
self._status.setText(f"Invitation sendt til {email}")
self._status.setText(f"Delt med {email}")
self._load_shares()
except Exception as e:
self._status.setText(f" Fejl: {e}")
self._status.setText(f"{e}")
def _remove_share(self):
item = self._shares_list.currentItem()
@@ -189,4 +177,4 @@ class ShareDialog(QDialog):
self._status.setText("✓ Deling fjernet")
self._load_shares()
except Exception as e:
self._status.setText(f" Fejl: {e}")
self._status.setText(f"{e}")