mobile dash layout provided; other styling inconsistencies corrected across views, scss & _applets.html template partial
All checks were successful
ci/woodpecker/push/woodpecker Pipeline was successful
All checks were successful
ci/woodpecker/push/woodpecker Pipeline was successful
This commit is contained in:
@@ -1,5 +1,6 @@
|
|||||||
from django.contrib import messages
|
from django.contrib import messages
|
||||||
from django.contrib.auth.decorators import login_required
|
from django.contrib.auth.decorators import login_required
|
||||||
|
from django.db.models import Max, Q
|
||||||
from django.http import HttpResponse, HttpResponseForbidden
|
from django.http import HttpResponse, HttpResponseForbidden
|
||||||
from django.shortcuts import redirect, render
|
from django.shortcuts import redirect, render
|
||||||
|
|
||||||
@@ -17,6 +18,16 @@ PALETTES = [
|
|||||||
]
|
]
|
||||||
|
|
||||||
|
|
||||||
|
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):
|
def _applet_context(user):
|
||||||
ua_map = {ua.applet_id: ua.visible for ua in user.user_applets.all()}
|
ua_map = {ua.applet_id: ua.visible for ua in user.user_applets.all()}
|
||||||
applets = {a.slug: a for a in Applet.objects.all()}
|
applets = {a.slug: a for a in Applet.objects.all()}
|
||||||
@@ -26,10 +37,16 @@ def _applet_context(user):
|
|||||||
if slug in applets
|
if slug in applets
|
||||||
]
|
]
|
||||||
|
|
||||||
|
|
||||||
def home_page(request):
|
def home_page(request):
|
||||||
context = {"form": ItemForm(), "palettes": PALETTES, "page_class": "page-dashboard"}
|
context = {
|
||||||
|
"form": ItemForm(),
|
||||||
|
"palettes": PALETTES,
|
||||||
|
"page_class": "page-dashboard",
|
||||||
|
}
|
||||||
if request.user.is_authenticated:
|
if request.user.is_authenticated:
|
||||||
context["applets"] = _applet_context(request.user)
|
context["applets"] = _applet_context(request.user)
|
||||||
|
context["recent_lists"] = _recent_lists(request.user)
|
||||||
return render(request, "apps/dashboard/home.html", context)
|
return render(request, "apps/dashboard/home.html", context)
|
||||||
|
|
||||||
def new_list(request):
|
def new_list(request):
|
||||||
@@ -42,9 +59,14 @@ def new_list(request):
|
|||||||
form.save(for_list=nulist)
|
form.save(for_list=nulist)
|
||||||
return redirect(nulist)
|
return redirect(nulist)
|
||||||
else:
|
else:
|
||||||
context = {"form": form, "palettes": PALETTES, "page_class": "page-dashboard"}
|
context = {
|
||||||
|
"form": form,
|
||||||
|
"palettes": PALETTES,
|
||||||
|
"page_class": "page-dashboard",
|
||||||
|
}
|
||||||
if request.user.is_authenticated:
|
if request.user.is_authenticated:
|
||||||
context["applets"] = _applet_context(request.user)
|
context["applets"] = _applet_context(request.user)
|
||||||
|
context["recent_lists"] = _recent_lists(request.user)
|
||||||
return render(request, "apps/dashboard/home.html", context)
|
return render(request, "apps/dashboard/home.html", context)
|
||||||
|
|
||||||
def view_list(request, list_id):
|
def view_list(request, list_id):
|
||||||
@@ -116,5 +138,6 @@ def toggle_applets(request):
|
|||||||
"applets": _applet_context(request.user),
|
"applets": _applet_context(request.user),
|
||||||
"palettes": PALETTES,
|
"palettes": PALETTES,
|
||||||
"form": ItemForm(),
|
"form": ItemForm(),
|
||||||
|
"recent_lists": _recent_lists(request.user),
|
||||||
})
|
})
|
||||||
return redirect("home")
|
return redirect("home")
|
||||||
|
|||||||
@@ -1,5 +1,7 @@
|
|||||||
from selenium.webdriver.common.by import By
|
from selenium.webdriver.common.by import By
|
||||||
|
|
||||||
|
from apps.lyric.models import User
|
||||||
|
|
||||||
|
|
||||||
class MyListsPage:
|
class MyListsPage:
|
||||||
def __init__(self, test):
|
def __init__(self, test):
|
||||||
@@ -7,7 +9,10 @@ class MyListsPage:
|
|||||||
|
|
||||||
def go_to_my_lists_page(self, email):
|
def go_to_my_lists_page(self, email):
|
||||||
self.test.browser.get(self.test.live_server_url)
|
self.test.browser.get(self.test.live_server_url)
|
||||||
self.test.browser.find_element(By.LINK_TEXT, "My lists").click()
|
user = User.objects.get(email=email)
|
||||||
|
self.test.browser.get(
|
||||||
|
self.test.live_server_url + f'/dashboard/users/{user.id}/'
|
||||||
|
)
|
||||||
self.test.wait_for(
|
self.test.wait_for(
|
||||||
lambda: self.test.assertIn(
|
lambda: self.test.assertIn(
|
||||||
email,
|
email,
|
||||||
|
|||||||
@@ -3,6 +3,7 @@ from selenium.webdriver.common.by import By
|
|||||||
from .base import FunctionalTest
|
from .base import FunctionalTest
|
||||||
from .list_page import ListPage
|
from .list_page import ListPage
|
||||||
from .my_lists_page import MyListsPage
|
from .my_lists_page import MyListsPage
|
||||||
|
from apps.lyric.models import User
|
||||||
|
|
||||||
|
|
||||||
class MyListsTest(FunctionalTest):
|
class MyListsTest(FunctionalTest):
|
||||||
@@ -30,11 +31,10 @@ class MyListsTest(FunctionalTest):
|
|||||||
list_page.add_list_item("Ribbon of death")
|
list_page.add_list_item("Ribbon of death")
|
||||||
second_list_url = self.browser.current_url
|
second_list_url = self.browser.current_url
|
||||||
|
|
||||||
self.browser.find_element(By.LINK_TEXT, "My lists").click()
|
MyListsPage(self).go_to_my_lists_page("disco@test.io")
|
||||||
self.wait_for(
|
self.wait_for(
|
||||||
lambda: self.browser.find_element(By.LINK_TEXT, "Ribbon of death")
|
lambda: self.browser.find_element(By.LINK_TEXT, "Ribbon of death")
|
||||||
)
|
)
|
||||||
MyListsPage(self).go_to_my_lists_page("disco@test.io")
|
|
||||||
|
|
||||||
self.browser.find_element(By.CSS_SELECTOR, "#id_logout").click()
|
self.browser.find_element(By.CSS_SELECTOR, "#id_logout").click()
|
||||||
self.wait_for(
|
self.wait_for(
|
||||||
|
|||||||
@@ -119,6 +119,12 @@ body.page-dashboard {
|
|||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@container (max-width: 480px) {
|
||||||
|
section {
|
||||||
|
grid-column: span 12;
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@media (max-height: 500px) {
|
@media (max-height: 500px) {
|
||||||
|
|||||||
@@ -25,10 +25,10 @@
|
|||||||
border-radius: 0.5rem;
|
border-radius: 0.5rem;
|
||||||
background: linear-gradient(
|
background: linear-gradient(
|
||||||
to bottom,
|
to bottom,
|
||||||
rgba(var(--priUser), 1) 0%,
|
rgba(var(--terUser), 1) 0%,
|
||||||
rgba(var(--priUser), 1) 33%,
|
|
||||||
rgba(var(--terUser), 1) 33%,
|
rgba(var(--terUser), 1) 33%,
|
||||||
rgba(var(--terUser), 1) 66%,
|
rgba(var(--priUser), 1) 33%,
|
||||||
|
rgba(var(--priUser), 1) 66%,
|
||||||
rgba(var(--quiUser), 1) 66%,
|
rgba(var(--quiUser), 1) 66%,
|
||||||
rgba(var(--quiUser), 1) 100%
|
rgba(var(--quiUser), 1) 100%
|
||||||
);
|
);
|
||||||
|
|||||||
@@ -38,15 +38,17 @@
|
|||||||
id="id_applet_my_lists"
|
id="id_applet_my_lists"
|
||||||
style="--applet-cols: {{ entry.applet.grid_cols }}; --applet-rows: {{ entry.applet.grid_rows }};"
|
style="--applet-cols: {{ entry.applet.grid_cols }}; --applet-rows: {{ entry.applet.grid_rows }};"
|
||||||
>
|
>
|
||||||
{% for list in user.lists.all %}
|
<a href="{% url 'my_lists' user.id %}">My lists:</a>
|
||||||
|
<ul>
|
||||||
|
{% for list in recent_lists %}
|
||||||
<li>
|
<li>
|
||||||
<a href="{{ list.get_absolute_url }}">{{ list.name }}</a>
|
<a href="{{ list.get_absolute_url }}">{{ list.name }}</a>
|
||||||
</li>
|
</li>
|
||||||
|
{% empty %}
|
||||||
|
<li>No lists yet.</li>
|
||||||
{% endfor %}
|
{% endfor %}
|
||||||
{% for list in user.shared_lists.all %}
|
</ul>
|
||||||
<li>
|
{% for list in user.lists.all %}
|
||||||
<a href="{{ list.get_absolute_url }}">{{ list.name }}</a>
|
|
||||||
</li>
|
|
||||||
{% endfor %}
|
{% endfor %}
|
||||||
</section>
|
</section>
|
||||||
{% elif entry.applet.slug == "username" %}
|
{% elif entry.applet.slug == "username" %}
|
||||||
|
|||||||
@@ -24,7 +24,6 @@
|
|||||||
<h1>Welcome, Earthman</h1>
|
<h1>Welcome, Earthman</h1>
|
||||||
</a>
|
</a>
|
||||||
{% if user.email %}
|
{% if user.email %}
|
||||||
<a class="navbar-link" href="{% url 'my_lists' user.id %}">My lists</a>
|
|
||||||
<span class="navbar-text">Logged in as {{ user|display_name }}</span>
|
<span class="navbar-text">Logged in as {{ user|display_name }}</span>
|
||||||
<form method="POST" action="{% url "logout" %}">
|
<form method="POST" action="{% url "logout" %}">
|
||||||
{% csrf_token %}
|
{% csrf_token %}
|
||||||
|
|||||||
Reference in New Issue
Block a user