user may change mark date

This commit is contained in:
Your Name 2023-01-10 22:36:13 -05:00 committed by Henri Dickson
parent 49e8fb8d36
commit 1550e3421a
10 changed files with 103 additions and 20 deletions

View file

@ -50,6 +50,7 @@ INSTALLED_APPS = [
"django.contrib.postgres",
"django_sass",
"django_rq",
"tz_detect",
"simple_history",
"markdownx",
"polymorphic",
@ -78,6 +79,7 @@ MIDDLEWARE = [
"django.contrib.messages.middleware.MessageMiddleware",
"django.middleware.clickjacking.XFrameOptionsMiddleware",
"hijack.middleware.HijackUserMiddleware",
"tz_detect.middleware.TimezoneMiddleware",
"simple_history.middleware.HistoryRequestMiddleware",
"maintenance_mode.middleware.MaintenanceModeMiddleware", # this should be last
]

View file

@ -30,6 +30,7 @@ urlpatterns = [
path("hijack/", include("hijack.urls")),
path("", include("common.urls")),
path("", include("legacy.urls")),
path("tz_detect/", include("tz_detect.urls")),
]
urlpatterns += [path(settings.ADMIN_URL + "-rq/", include("django_rq.urls"))]

View file

@ -1,4 +1,6 @@
{% load static %}
{% load tz_detect %}
{% tz_detect %}
{% if sentry_dsn %}
<script src="https://browser.sentry-cdn.com/7.7.0/bundle.min.js"></script>
<script>

View file

@ -139,9 +139,9 @@
{% endif %}
{% if others_mark.shelfmember.metadata.shared_link %}
<a href="{{ others_mark.shelfmember.metadata.shared_link }}" target="_blank"><span class="entity-marks__mark-time">{{ others_mark.created_time }}</span></a>
<a href="{{ others_mark.shelfmember.metadata.shared_link }}" target="_blank"><span class="entity-marks__mark-time">{{ others_mark.created_time | date }}</span></a>
{% else %}
<span class="entity-marks__mark-time">{{ others_mark.created_time }}</span>
<span class="entity-marks__mark-time">{{ others_mark.created_time | date }}</span>
{% endif %}
{% if others_mark.text %}
@ -205,10 +205,15 @@
<div class="mark-panel__clear"></div>
<div class="mark-panel__time">
<!-- <div>
{% for log in mark.logs %}
{{ log.timestamp|date }} {{ log.action_label }}<br>
{% endfor %}
</div> -->
{% if mark.metadata.shared_link %}
<a href="{{ mark.metadata.shared_link }}">{{ mark.created_time }}</a>
<a href="{{ mark.metadata.shared_link }}">{{ mark.created_time|date }}</a>
{% else %}
{{ mark.created_time }}
{{ mark.created_time|date }}
{% endif %}
</div>

View file

@ -45,9 +45,9 @@
{% endif %}
{% if others_mark.metadata.shared_link %}
<a href="{{ others_mark.metadata.shared_link }}" target="_blank"><span class="entity-marks__mark-time">{{ others_mark.mark.created_time }}</span></a>
<a href="{{ others_mark.metadata.shared_link }}" target="_blank"><span class="entity-marks__mark-time">{{ others_mark.mark.created_time|date }}</span></a>
{% else %}
<span class="entity-marks__mark-time">{{ others_mark.mark.created_time }}</span>
<span class="entity-marks__mark-time">{{ others_mark.mark.created_time|date }}</span>
{% endif %}
{% if others_mark.mark.text %}

View file

@ -514,9 +514,7 @@ class ShelfLogEntry(models.Model):
owner = models.ForeignKey(User, on_delete=models.PROTECT)
shelf_type = models.CharField(choices=ShelfType.choices, max_length=100, null=True)
item = models.ForeignKey(Item, on_delete=models.PROTECT)
timestamp = models.DateTimeField(
default=timezone.now
) # this may later be changed by user
timestamp = models.DateTimeField() # this may later be changed by user
metadata = models.JSONField(default=dict)
created_time = models.DateTimeField(auto_now_add=True)
edited_time = models.DateTimeField(auto_now=True)
@ -524,6 +522,15 @@ class ShelfLogEntry(models.Model):
def __str__(self):
return f"{self.owner}:{self.shelf}:{self.item}:{self.metadata}"
@property
def action_label(self):
if self.shelf:
return ShelfManager.get_action_label(
self.shelf.shelf_type, self.item.category
)
else:
return _("移除标记")
class ShelfManager:
"""
@ -584,11 +591,15 @@ class ShelfManager:
if changed:
if metadata is None:
metadata = last_metadata or {}
log_time = (
new_shelfmember.created_time if new_shelfmember else timezone.now()
)
ShelfLogEntry.objects.create(
owner=self.owner,
shelf_type=shelf_type,
item=item,
metadata=metadata,
timestamp=log_time,
)
return new_shelfmember
@ -614,7 +625,8 @@ class ShelfManager:
# )
# return shelf.members.all().order_by
def get_action_label(self, shelf_type, item_category):
@classmethod
def get_action_label(cls, shelf_type, item_category):
sts = [
n[2] for n in ShelfTypeNames if n[0] == item_category and n[1] == shelf_type
]
@ -908,13 +920,30 @@ class Mark:
or rating_grade != self.rating
)
)
share_as_new_post = shelf_type != self.shelf_type
if shelf_type != self.shelf_type or visibility != self.visibility:
self.shelfmember = self.owner.shelf_manager.move_item(
self.item, shelf_type, visibility=visibility, metadata=metadata
)
if self.shelfmember and created_time:
self.shelfmember.created_time = created_time
self.shelfmember.save()
if self.shelfmember and created_time:
log = ShelfLogEntry.objects.filter(
owner=self.owner,
item=self.item,
created_time=self.shelfmember.created_time,
)
self.shelfmember.created_time = created_time
self.shelfmember.save(update_fields=["created_time"])
if log:
log.timestamp = created_time
log.save(update_fields=["timestamp"])
else:
ShelfLogEntry.objects.create(
owner=self.owner,
shelf=self.shelf,
item=self.item,
metadata=self.metadata,
timestamp=created_time,
)
if comment_text != self.text or visibility != self.visibility:
self.comment = Comment.comment_item_by_user(
self.item, self.owner, comment_text, visibility
@ -929,7 +958,7 @@ class Mark:
self.shared_link = (
self.shelfmember.metadata.get("shared_link")
if self.shelfmember.metadata
if self.shelfmember.metadata and not share_as_new_post
else None
)
self.translated_status = self.action_label
@ -941,10 +970,21 @@ class Mark:
if self.shelfmember.metadata.get("shared_link") != self.shared_link:
self.shelfmember.metadata["shared_link"] = self.shared_link
self.shelfmember.save()
elif share_as_new_post and self.shelfmember:
if not self.shelfmember.metadata:
self.shelfmember.metadata = {}
self.shelfmember.metadata["shared_link"] = None
self.shelfmember.save()
def delete(self):
self.update(None, None, None, 0)
@property
def logs(self):
return ShelfLogEntry.objects.filter(owner=self.owner, item=self.item).order_by(
"timestamp"
)
def reset_visibility_for_user(user: User, visibility: int):
ShelfMember.objects.filter(owner=user).update(visibility=visibility)

View file

@ -92,7 +92,7 @@
</svg></span>
{% endif %}
<span class="entity-marks__mark-time" style="float:right;">
{% trans '标记于' %} {{ member.created_time }}
{% trans '标记于' %} {{ member.created_time|date }}
</span>
<p class="entity-marks__mark-content">&nbsp;
{% if mark.text %}
@ -103,7 +103,7 @@
{% if mark.review %}
<li class="entity-marks__mark">
<span class="entity-marks__mark-time" style="float:right;">
{% trans '评论于' %} {{ mark.review.created_time }}
{% trans '评论于' %} {{ mark.review.created_time|date }}
</span>
<p class="entity-marks__mark-content">
<a href="{{ mark.review.url }}">{{ mark.review.title }}</a>

View file

@ -51,7 +51,7 @@
</div>
<div class="mark-modal__share-checkbox float-right">
<input type="checkbox" name="share_to_mastodon" id="id_share_to_mastodon" value="1" checked>分享到联邦网络
<label for="id_share_to_mastodon"><input type="checkbox" name="share_to_mastodon" id="id_share_to_mastodon" value="1" checked>分享到联邦网络</label>
</div>
<div class="mark-modal__option">
@ -64,11 +64,20 @@
</ul>
</span>
</div>
</div>
<div class="mark-modal__confirm-button">
<input type="submit" class="button float-right" value="保存">
</div>
<div class="mark-modal__option">
<div class="mark-modal__visibility-radio">
<span>更改标记日期:
<label for="mark_anotherday"><input type="checkbox" name="mark_anotherday" value="1" id="mark_anotherday"> </label>
<input type="date" name="mark_date" id="mark_date" min="1900-01-01" max="{{date_today}}" value="{{date_today}}" style="display: none;">
</span>
</div>
</div>
</form>
</div>
<script>
@ -80,7 +89,7 @@
duplicateTime: 300,
onTagRemove : function (tag) {},
});
// editable rating star in modal
// editable rating star in modal
ratingLabels = $("#modal .rating-star-edit");
$(ratingLabels).each( function(index, value) {
let ratingScore = $("input[type='hidden'][name='rating']").val() / 2;
@ -97,7 +106,16 @@
});
});
// hide rating star when select wish
//show date picker if mark yesterday
$("#modal #mark_anotherday").on('click', function(e) {
if ($("#modal #mark_anotherday:checked").val() == '1') {
$("#modal #mark_date").show()
} else {
$("#modal #mark_date").hide()
}
});
// hide rating star when select wish
const WISH_CODE = "wishlist";
if ($("#statusSelection input[type='radio']:checked").val() == WISH_CODE) {
$("#modal .rating-star-edit").hide();

View file

@ -11,6 +11,7 @@ from django.http import (
from django.core.exceptions import ObjectDoesNotExist, PermissionDenied
from django.db.models import Count
from django.utils import timezone
from django.utils.dateparse import parse_datetime
from django.core.paginator import Paginator
from .models import *
from django.conf import settings
@ -126,6 +127,7 @@ def mark(request, item_uuid):
"shelf_type": shelf_type,
"tags": ",".join(tags),
"shelf_types": shelf_types,
"date_today": timezone.localdate().isoformat(),
},
)
elif request.method == "POST":
@ -143,6 +145,13 @@ def mark(request, item_uuid):
share_to_mastodon = bool(
request.POST.get("share_to_mastodon", default=False)
)
mark_date = None
if request.POST.get("mark_anotherday"):
mark_date = timezone.get_current_timezone().localize(
parse_datetime(request.POST.get("mark_date") + " 20:00:00")
)
if mark_date and mark_date >= timezone.now():
mark_date = None
TagManager.tag_item_by_user(item, request.user, tags, visibility)
try:
mark.update(
@ -151,6 +160,7 @@ def mark(request, item_uuid):
rating,
visibility,
share_to_mastodon=share_to_mastodon,
created_time=mark_date,
)
except Exception as e:
_logger.warn(f"post to mastodon error {e}")

View file

@ -10,7 +10,12 @@ django-user-messages
django-slack
django-ninja
django-polymorphic
<<<<<<< HEAD
django-maintenance-mode
=======
django-debug-toolbar
django-tz-detect
>>>>>>> 1a1c053 (user may change mark date)
meilisearch
easy-thumbnails
lxml