user may change mark date
This commit is contained in:
parent
49e8fb8d36
commit
1550e3421a
10 changed files with 103 additions and 20 deletions
|
@ -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
|
||||
]
|
||||
|
|
|
@ -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"))]
|
||||
|
|
|
@ -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>
|
||||
|
|
|
@ -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>
|
||||
|
||||
|
|
|
@ -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 %}
|
||||
|
|
|
@ -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)
|
||||
|
|
|
@ -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">
|
||||
{% 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>
|
||||
|
|
|
@ -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();
|
||||
|
|
|
@ -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}")
|
||||
|
|
|
@ -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
|
||||
|
|
Loading…
Add table
Reference in a new issue