from django.contrib import messages from django.contrib.auth.decorators import login_required from django.db.models import Max, Q from django.http import HttpResponse, HttpResponseForbidden from django.shortcuts import redirect, render from apps.dashboard.forms import ExistingListItemForm, ItemForm from apps.dashboard.models import Applet, Item, List, UserApplet from apps.lyric.models import User APPLET_ORDER = ["new-list", "my-lists", "username", "palette"] UNLOCKED_PALETTES = frozenset(["palette-default"]) PALETTES = [ {"name": "palette-default", "label": "Earthman", "locked": False}, {"name": "palette-nirvana", "label": "Nirvana", "locked": True}, {"name": "palette-sheol", "label": "Sheol", "locked": True}, ] def _recent_lists(user, limit=3): return ( List .objects .filter(Q(owner=user) | Q(shared_with=user)) .annotate(last_item=Max('item__id')) .order_by('-last_item') .distinct()[:limit] ) def _applet_context(user): ua_map = {ua.applet_id: ua.visible for ua in user.user_applets.all()} applets = {a.slug: a for a in Applet.objects.all()} return [ {"applet": applets[slug], "visible": ua_map.get(applets[slug].pk, applets[slug].default_visible)} for slug in APPLET_ORDER if slug in applets ] def home_page(request): context = { "form": ItemForm(), "palettes": PALETTES, "page_class": "page-dashboard", } if request.user.is_authenticated: context["applets"] = _applet_context(request.user) context["recent_lists"] = _recent_lists(request.user) return render(request, "apps/dashboard/home.html", context) def new_list(request): form = ItemForm(data=request.POST) if form.is_valid(): nulist = List.objects.create() if request.user.is_authenticated: nulist.owner = request.user nulist.save() form.save(for_list=nulist) return redirect(nulist) else: context = { "form": form, "palettes": PALETTES, "page_class": "page-dashboard", } if request.user.is_authenticated: context["applets"] = _applet_context(request.user) context["recent_lists"] = _recent_lists(request.user) return render(request, "apps/dashboard/home.html", context) def view_list(request, list_id): our_list = List.objects.get(id=list_id) if our_list.owner: if not request.user.is_authenticated: return redirect("/") if request.user != our_list.owner and request.user not in our_list.shared_with.all(): return HttpResponseForbidden() form = ExistingListItemForm(for_list=our_list) if request.method == "POST": form = ExistingListItemForm(for_list=our_list, data=request.POST) if form.is_valid(): form.save() return redirect(our_list) return render(request, "apps/dashboard/list.html", {"list": our_list, "form": form}) def my_lists(request, user_id): owner = User.objects.get(id=user_id) if not request.user.is_authenticated: return redirect("/") if request.user.id != owner.id: return HttpResponseForbidden() return render(request, "apps/dashboard/my_lists.html", {"owner": owner}) def share_list(request, list_id): our_list = List.objects.get(id=list_id) try: recipient = User.objects.get(email=request.POST["recipient"]) if recipient == request.user: return redirect(our_list) our_list.shared_with.add(recipient) except User.DoesNotExist: pass messages.success(request, "An invite has been sent if that address is registered.") return redirect(our_list) @login_required(login_url="/") def set_palette(request): if request.method == "POST": palette = request.POST.get("palette", "") if palette in UNLOCKED_PALETTES: request.user.palette = palette request.user.save(update_fields=["palette"]) return redirect("home") @login_required(login_url="/") def set_profile(request): if request.method == "POST": username = request.POST.get("username", "") request.user.username = username request.user.save(update_fields=["username"]) return redirect("/") @login_required(login_url="/") def toggle_applets(request): checked = request.POST.getlist("applets") for applet in Applet.objects.all(): UserApplet.objects.update_or_create( user=request.user, applet=applet, defaults={"visible": applet.slug in checked}, ) if request.headers.get("HX-Request"): return render(request, "apps/dashboard/_partials/_applets.html", { "applets": _applet_context(request.user), "palettes": PALETTES, "form": ItemForm(), "recent_lists": _recent_lists(request.user), }) return redirect("home")