filter marks by year

This commit is contained in:
Your Name 2023-10-30 00:59:54 -04:00 committed by Henri Dickson
parent c872af7ec7
commit c380220ab2
12 changed files with 65 additions and 11 deletions

View file

@ -210,6 +210,9 @@
</article> </article>
</section> </section>
{% endif %} {% endif %}
{% if sidebar_template %}
{% include sidebar_template %}
{% endif %}
</aside> </aside>
<script> <script>
$(function () { $(function () {

View file

@ -21,8 +21,8 @@
return this; return this;
}; };
</script> </script>
<script src="https://cdn.jsdelivr.net/npm/htmx.org@1.9.4/dist/htmx.min.js"></script> <script src="https://cdn.jsdelivr.net/npm/htmx.org@1.9.6/dist/htmx.min.js"></script>
<script src="https://cdn.jsdelivr.net/npm/hyperscript.org@0.9.5"></script> <script src="https://cdn.jsdelivr.net/npm/hyperscript.org@0.9.12"></script>
<link rel="stylesheet" <link rel="stylesheet"
href="https://cdn.jsdelivr.net/npm/@picocss/pico@2.0.0-alpha1/css/pico.min.css" /> href="https://cdn.jsdelivr.net/npm/@picocss/pico@2.0.0-alpha1/css/pico.min.css" />
<link href="{% sass_src 'scss/neodb.scss' %}" <link href="{% sass_src 'scss/neodb.scss' %}"

View file

@ -18,19 +18,21 @@
{% include "_header.html" %} {% include "_header.html" %}
<main> <main>
<div class="grid__main"> <div class="grid__main">
<h5> <h5 class="large-only">
{% block head %}{{ identity.display_name }}{% endblock %} {% block head %}{{ identity.display_name }}{% endblock %}
</h5> </h5>
<div> <div>
{% for member in members %} {% for member in members %}
{% include "_list_item.html" with item=member.item mark=member.mark hide_category=True %} {% include "_list_item.html" with item=member.item mark=member.mark hide_category=True %}
{% empty %} {% empty %}
<div>{% trans '无结果' %}</div> <div>{% trans '暂无匹配的条目' %}</div>
{% endfor %} {% endfor %}
</div> </div>
{% include "_pagination.html" %} {% include "_pagination.html" %}
</div> </div>
{% include "_sidebar.html" with show_profile=1 %} {% block sidebar %}
{% include "_sidebar.html" with show_profile=1 %}
{% endblock %}
</main> </main>
{% include "_footer.html" %} {% include "_footer.html" %}
</body> </body>

View file

@ -6,3 +6,6 @@
{% block head %} {% block head %}
{{ identity.display_name }} - {% trans '标记' %} {{ identity.display_name }} - {% trans '标记' %}
{% endblock %} {% endblock %}
{% block sidebar %}
{% include "_sidebar.html" with show_profile=1 sidebar_template="_sidebar_user_mark_list.html" %}
{% endblock %}

View file

@ -6,3 +6,6 @@
{% block head %} {% block head %}
{{ identity.display_name }} - {% trans '评论' %} {{ identity.display_name }} - {% trans '评论' %}
{% endblock %} {% endblock %}
{% block sidebar %}
{% include "_sidebar.html" with show_profile=1 sidebar_template="_sidebar_user_mark_list.html" %}
{% endblock %}

View file

@ -97,6 +97,15 @@ urlpatterns = [
user_mark_list, user_mark_list,
name="user_mark_list", name="user_mark_list",
), ),
re_path(
r"^users/(?P<user_name>[~A-Za-z0-9_\-.@]+)/(?P<shelf_type>"
+ _get_all_shelf_types()
+ ")/(?P<item_category>"
+ _get_all_categories()
+ r")/(?P<year>\d+)/$",
user_mark_list,
name="user_mark_list_year",
),
re_path( re_path(
r"^users/(?P<user_name>[~A-Za-z0-9_\-.@]+)/reviews/(?P<item_category>" r"^users/(?P<user_name>[~A-Za-z0-9_\-.@]+)/reviews/(?P<item_category>"
+ _get_all_categories() + _get_all_categories()
@ -104,6 +113,13 @@ urlpatterns = [
user_review_list, user_review_list,
name="user_review_list", name="user_review_list",
), ),
re_path(
r"^users/(?P<user_name>[~A-Za-z0-9_\-.@]+)/reviews/(?P<item_category>"
+ _get_all_categories()
+ r")/(?P<year>\d+)/$",
user_review_list,
name="user_review_list_year",
),
re_path( re_path(
r"^users/(?P<user_name>[~A-Za-z0-9_\-.@]+)/tags/(?P<tag_title>.+)/$", r"^users/(?P<user_name>[~A-Za-z0-9_\-.@]+)/tags/(?P<tag_title>.+)/$",
user_tag_member_list, user_tag_member_list,

View file

@ -1,6 +1,9 @@
import datetime
from django.contrib.auth.decorators import login_required from django.contrib.auth.decorators import login_required
from django.core.exceptions import BadRequest, ObjectDoesNotExist, PermissionDenied from django.core.exceptions import BadRequest, ObjectDoesNotExist, PermissionDenied
from django.core.paginator import Paginator from django.core.paginator import Paginator
from django.db.models import Min
from django.shortcuts import get_object_or_404, redirect, render from django.shortcuts import get_object_or_404, redirect, render
from django.urls import reverse from django.urls import reverse
from django.utils.translation import gettext_lazy as _ from django.utils.translation import gettext_lazy as _
@ -53,6 +56,7 @@ def render_list(
shelf_type=None, shelf_type=None,
item_category=None, item_category=None,
tag_title=None, tag_title=None,
year=None,
): ):
target = request.target_identity target = request.target_identity
viewer = request.user.identity viewer = request.user.identity
@ -72,9 +76,19 @@ def render_list(
queryset = Review.objects.filter(q_item_in_category(item_category)) queryset = Review.objects.filter(q_item_in_category(item_category))
else: else:
raise BadRequest() raise BadRequest()
start_date = queryset.aggregate(Min("created_time"))["created_time__min"]
if start_date:
start_year = start_date.year
current_year = datetime.datetime.now().year
years = reversed(range(start_year, current_year + 1))
else:
years = []
queryset = queryset.filter( queryset = queryset.filter(
q_owned_piece_visible_to_user(request.user, target) q_owned_piece_visible_to_user(request.user, target)
).order_by("-created_time") ).order_by("-created_time")
if year:
year = int(year)
queryset = queryset.filter(created_time__year=year)
paginator = Paginator(queryset, PAGE_SIZE) paginator = Paginator(queryset, PAGE_SIZE)
page_number = int(request.GET.get("page", default=1)) page_number = int(request.GET.get("page", default=1))
members = paginator.get_page(page_number) members = paginator.get_page(page_number)
@ -88,6 +102,10 @@ def render_list(
"members": members, "members": members,
"tag": tag, "tag": tag,
"pagination": pagination, "pagination": pagination,
"years": years,
"year": year,
"shelf": shelf_type,
"category": item_category,
}, },
) )

View file

@ -303,7 +303,14 @@ def comment(request: AuthedHttpRequest, item_uuid):
raise BadRequest() raise BadRequest()
def user_mark_list(request: AuthedHttpRequest, user_name, shelf_type, item_category): def user_mark_list(
request: AuthedHttpRequest, user_name, shelf_type, item_category, year=None
):
return render_list( return render_list(
request, user_name, "mark", shelf_type=shelf_type, item_category=item_category request,
user_name,
"mark",
shelf_type=shelf_type,
item_category=item_category,
year=year,
) )

View file

@ -96,8 +96,10 @@ def review_edit(request: AuthedHttpRequest, item_uuid, review_uuid=None):
raise BadRequest() raise BadRequest()
def user_review_list(request, user_name, item_category): def user_review_list(request, user_name, item_category, year=None):
return render_list(request, user_name, "review", item_category=item_category) return render_list(
request, user_name, "review", item_category=item_category, year=None
)
MAX_ITEM_PER_TYPE = 10 MAX_ITEM_PER_TYPE = 10

View file

@ -6,4 +6,4 @@ djlint~=1.32.1
isort~=5.12.0 isort~=5.12.0
lxml-stubs lxml-stubs
pre-commit pre-commit
pyright==1.1.332 pyright==1.1.333

View file

@ -306,6 +306,7 @@ def send_verification_link(user_id, action, email):
raise ValueError("Invalid action") raise ValueError("Invalid action")
try: try:
logger.info(f"Sending email to {email} with subject {subject}") logger.info(f"Sending email to {email} with subject {subject}")
logger.debug(msg)
send_mail( send_mail(
subject=subject, subject=subject,
message=msg, message=msg,

View file

@ -24,4 +24,3 @@ class Command(BaseCommand):
user.preference.save(update_fields=["import_status"]) user.preference.save(update_fields=["import_status"])
count += 1 count += 1
self.stdout.write(self.style.SUCCESS(f"{count} users reset")) self.stdout.write(self.style.SUCCESS(f"{count} users reset"))