Merge pull request #1 from Luxray5474/file-last-modifed-time
File last modifed time
This commit is contained in:
commit
a385b93f0c
11 changed files with 48 additions and 0 deletions
|
@ -26,6 +26,11 @@
|
||||||
<%= ctx.makeRelativeTime(ctx.post.creationTime) %>
|
<%= ctx.makeRelativeTime(ctx.post.creationTime) %>
|
||||||
</section>
|
</section>
|
||||||
|
|
||||||
|
<section class='file-last-modified-time'>
|
||||||
|
<i class='fa fa-clock-o'></i>Source last modified
|
||||||
|
<%= ctx.makeRelativeTime(ctx.post.fileLastModifiedTime) %>
|
||||||
|
</section>
|
||||||
|
|
||||||
<% if (ctx.enableSafety) { %>
|
<% if (ctx.enableSafety) { %>
|
||||||
<section class='safety'>
|
<section class='safety'>
|
||||||
<i class='fa fa-circle safety-<%- ctx.post.safety %>'></i><!--
|
<i class='fa fa-circle safety-<%- ctx.post.safety %>'></i><!--
|
||||||
|
|
|
@ -177,6 +177,7 @@ class PostUploadController {
|
||||||
if (uploadable.url) {
|
if (uploadable.url) {
|
||||||
post.source = uploadable.url;
|
post.source = uploadable.url;
|
||||||
}
|
}
|
||||||
|
post.fileLastModifiedTime = uploadable.file.lastModified; // The client already reads the data anyway, which is convenient
|
||||||
return post;
|
return post;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -42,6 +42,10 @@ class Post extends events.EventTarget {
|
||||||
return this._creationTime;
|
return this._creationTime;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
get fileLastModifiedTime() {
|
||||||
|
return this._fileLastModifiedTime;
|
||||||
|
}
|
||||||
|
|
||||||
get user() {
|
get user() {
|
||||||
return this._user;
|
return this._user;
|
||||||
}
|
}
|
||||||
|
@ -142,6 +146,10 @@ class Post extends events.EventTarget {
|
||||||
return this._hasCustomThumbnail;
|
return this._hasCustomThumbnail;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
set fileLastModifiedTime(value) {
|
||||||
|
this._fileLastModifiedTime = value;
|
||||||
|
}
|
||||||
|
|
||||||
set flags(value) {
|
set flags(value) {
|
||||||
this._flags = value;
|
this._flags = value;
|
||||||
}
|
}
|
||||||
|
@ -269,6 +277,9 @@ class Post extends events.EventTarget {
|
||||||
if (this._source !== this._orig._source) {
|
if (this._source !== this._orig._source) {
|
||||||
detail.source = this._source;
|
detail.source = this._source;
|
||||||
}
|
}
|
||||||
|
if (this._fileLastModifiedTime !== this._orig._fileLastModifiedTime) {
|
||||||
|
detail.fileLastModifiedTime = this._fileLastModifiedTime;
|
||||||
|
}
|
||||||
|
|
||||||
let apiPromise = this._id
|
let apiPromise = this._id
|
||||||
? api.put(uri.formatApiLink("post", this.id), detail, files)
|
? api.put(uri.formatApiLink("post", this.id), detail, files)
|
||||||
|
@ -460,6 +471,7 @@ class Post extends events.EventTarget {
|
||||||
_type: response.type,
|
_type: response.type,
|
||||||
_mimeType: response.mimeType,
|
_mimeType: response.mimeType,
|
||||||
_creationTime: response.creationTime,
|
_creationTime: response.creationTime,
|
||||||
|
_fileLastModifiedTime: response.fileLastModifiedTime,
|
||||||
_user: response.user,
|
_user: response.user,
|
||||||
_safety: response.safety,
|
_safety: response.safety,
|
||||||
_contentUrl: response.contentUrl,
|
_contentUrl: response.contentUrl,
|
||||||
|
|
|
@ -82,6 +82,10 @@ class File extends Uploadable {
|
||||||
return this.file.type;
|
return this.file.type;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
get fileLastModifiedTime() {
|
||||||
|
return this.file.fileLastModifiedTime;
|
||||||
|
}
|
||||||
|
|
||||||
get previewUrl() {
|
get previewUrl() {
|
||||||
return this._previewUrl;
|
return this._previewUrl;
|
||||||
}
|
}
|
||||||
|
|
|
@ -1,3 +1,4 @@
|
||||||
|
import time
|
||||||
from datetime import datetime
|
from datetime import datetime
|
||||||
from typing import Dict, List, Optional
|
from typing import Dict, List, Optional
|
||||||
|
|
||||||
|
@ -86,6 +87,10 @@ def create_post(
|
||||||
posts.update_post_relations(post, relations)
|
posts.update_post_relations(post, relations)
|
||||||
posts.update_post_notes(post, notes)
|
posts.update_post_notes(post, notes)
|
||||||
posts.update_post_flags(post, flags)
|
posts.update_post_flags(post, flags)
|
||||||
|
if ctx.has_param("fileLastModifiedTime"):
|
||||||
|
posts.update_post_file_last_modified_time(
|
||||||
|
post, ctx.get_as_param("file_last_modified_time")
|
||||||
|
)
|
||||||
if ctx.has_file("thumbnail"):
|
if ctx.has_file("thumbnail"):
|
||||||
posts.update_post_thumbnail(post, ctx.get_file("thumbnail"))
|
posts.update_post_thumbnail(post, ctx.get_file("thumbnail"))
|
||||||
ctx.session.add(post)
|
ctx.session.add(post)
|
||||||
|
|
|
@ -169,6 +169,7 @@ class PostSerializer(serialization.BaseSerializer):
|
||||||
"version": self.serialize_version,
|
"version": self.serialize_version,
|
||||||
"creationTime": self.serialize_creation_time,
|
"creationTime": self.serialize_creation_time,
|
||||||
"lastEditTime": self.serialize_last_edit_time,
|
"lastEditTime": self.serialize_last_edit_time,
|
||||||
|
"fileLastModifiedTime": self.serialize_file_last_modified_time,
|
||||||
"safety": self.serialize_safety,
|
"safety": self.serialize_safety,
|
||||||
"source": self.serialize_source,
|
"source": self.serialize_source,
|
||||||
"type": self.serialize_type,
|
"type": self.serialize_type,
|
||||||
|
@ -212,6 +213,9 @@ class PostSerializer(serialization.BaseSerializer):
|
||||||
def serialize_last_edit_time(self) -> Any:
|
def serialize_last_edit_time(self) -> Any:
|
||||||
return self.post.last_edit_time
|
return self.post.last_edit_time
|
||||||
|
|
||||||
|
def serialize_file_last_modified_time(self) -> Any:
|
||||||
|
return self.post.file_last_modified_time
|
||||||
|
|
||||||
def serialize_safety(self) -> Any:
|
def serialize_safety(self) -> Any:
|
||||||
return SAFETY_MAP[self.post.safety]
|
return SAFETY_MAP[self.post.safety]
|
||||||
|
|
||||||
|
@ -408,6 +412,7 @@ def create_post(
|
||||||
post.safety = model.Post.SAFETY_SAFE
|
post.safety = model.Post.SAFETY_SAFE
|
||||||
post.user = user
|
post.user = user
|
||||||
post.creation_time = datetime.utcnow()
|
post.creation_time = datetime.utcnow()
|
||||||
|
post.file_last_modified_time = datetime.utcnow()
|
||||||
post.flags = []
|
post.flags = []
|
||||||
|
|
||||||
post.type = ""
|
post.type = ""
|
||||||
|
@ -421,6 +426,15 @@ def create_post(
|
||||||
return post, new_tags
|
return post, new_tags
|
||||||
|
|
||||||
|
|
||||||
|
def update_post_file_last_modified_time(
|
||||||
|
post: model.Post, timestamp: int
|
||||||
|
) -> None:
|
||||||
|
assert post
|
||||||
|
|
||||||
|
# Timestamp is in ms, so it must be divided by 1000 otherwise out of range
|
||||||
|
post.file_last_modified_time = datetime.fromtimestamp(timestamp / 1000)
|
||||||
|
|
||||||
|
|
||||||
def update_post_safety(post: model.Post, safety: str) -> None:
|
def update_post_safety(post: model.Post, safety: str) -> None:
|
||||||
assert post
|
assert post
|
||||||
safety = util.flip(SAFETY_MAP).get(safety, None)
|
safety = util.flip(SAFETY_MAP).get(safety, None)
|
||||||
|
|
|
@ -20,6 +20,7 @@ def upgrade():
|
||||||
sa.Column("id", sa.Integer(), nullable=False),
|
sa.Column("id", sa.Integer(), nullable=False),
|
||||||
sa.Column("user_id", sa.Integer(), nullable=True),
|
sa.Column("user_id", sa.Integer(), nullable=True),
|
||||||
sa.Column("creation_time", sa.DateTime(), nullable=False),
|
sa.Column("creation_time", sa.DateTime(), nullable=False),
|
||||||
|
sa.Column("file_last_modified_time", sa.DateTime(), nullable=False),
|
||||||
sa.Column("last_edit_time", sa.DateTime(), nullable=True),
|
sa.Column("last_edit_time", sa.DateTime(), nullable=True),
|
||||||
sa.Column("safety", sa.Unicode(length=32), nullable=False),
|
sa.Column("safety", sa.Unicode(length=32), nullable=False),
|
||||||
sa.Column("type", sa.Unicode(length=32), nullable=False),
|
sa.Column("type", sa.Unicode(length=32), nullable=False),
|
||||||
|
|
|
@ -210,6 +210,7 @@ class Post(Base):
|
||||||
version = sa.Column("version", sa.Integer, default=1, nullable=False)
|
version = sa.Column("version", sa.Integer, default=1, nullable=False)
|
||||||
creation_time = sa.Column("creation_time", sa.DateTime, nullable=False)
|
creation_time = sa.Column("creation_time", sa.DateTime, nullable=False)
|
||||||
last_edit_time = sa.Column("last_edit_time", sa.DateTime)
|
last_edit_time = sa.Column("last_edit_time", sa.DateTime)
|
||||||
|
file_last_modified_time = sa.Column("file_last_modified_time", sa.DateTime, nullable=False)
|
||||||
safety = sa.Column("safety", sa.Unicode(32), nullable=False)
|
safety = sa.Column("safety", sa.Unicode(32), nullable=False)
|
||||||
source = sa.Column("source", sa.Unicode(2048))
|
source = sa.Column("source", sa.Unicode(2048))
|
||||||
flags_string = sa.Column("flags", sa.Unicode(32), default="")
|
flags_string = sa.Column("flags", sa.Unicode(32), default="")
|
||||||
|
|
|
@ -168,6 +168,7 @@ def post_factory():
|
||||||
post.flags = []
|
post.flags = []
|
||||||
post.mime_type = "application/octet-stream"
|
post.mime_type = "application/octet-stream"
|
||||||
post.creation_time = datetime(1996, 1, 1)
|
post.creation_time = datetime(1996, 1, 1)
|
||||||
|
post.file_last_modified_time = datetime(1997, 1, 1)
|
||||||
return post
|
return post
|
||||||
|
|
||||||
return factory
|
return factory
|
||||||
|
|
|
@ -122,6 +122,7 @@ def test_serialize_post(
|
||||||
post.post_id = 1
|
post.post_id = 1
|
||||||
post.creation_time = datetime(1997, 1, 1)
|
post.creation_time = datetime(1997, 1, 1)
|
||||||
post.last_edit_time = datetime(1998, 1, 1)
|
post.last_edit_time = datetime(1998, 1, 1)
|
||||||
|
post.file_last_modified_time = datetime(1999, 1, 1)
|
||||||
post.tags = [
|
post.tags = [
|
||||||
tag_factory(
|
tag_factory(
|
||||||
names=["tag1", "tag2"],
|
names=["tag1", "tag2"],
|
||||||
|
@ -215,6 +216,7 @@ def test_serialize_post(
|
||||||
"version": 1,
|
"version": 1,
|
||||||
"creationTime": datetime(1997, 1, 1),
|
"creationTime": datetime(1997, 1, 1),
|
||||||
"lastEditTime": datetime(1998, 1, 1),
|
"lastEditTime": datetime(1998, 1, 1),
|
||||||
|
"fileLastModifiedTime": datetime(1999, 1, 1),
|
||||||
"safety": "safe",
|
"safety": "safe",
|
||||||
"source": "4gag",
|
"source": "4gag",
|
||||||
"type": "image",
|
"type": "image",
|
||||||
|
|
|
@ -24,6 +24,7 @@ def test_saving_post(post_factory, user_factory, tag_factory):
|
||||||
post.checksum = "deadbeef"
|
post.checksum = "deadbeef"
|
||||||
post.creation_time = datetime(1997, 1, 1)
|
post.creation_time = datetime(1997, 1, 1)
|
||||||
post.last_edit_time = datetime(1998, 1, 1)
|
post.last_edit_time = datetime(1998, 1, 1)
|
||||||
|
post.file_last_modified_time = datetime(1999, 1, 1)
|
||||||
post.mime_type = "application/whatever"
|
post.mime_type = "application/whatever"
|
||||||
db.session.add_all([user, tag1, tag2, related_post1, related_post2, post])
|
db.session.add_all([user, tag1, tag2, related_post1, related_post2, post])
|
||||||
|
|
||||||
|
@ -44,6 +45,7 @@ def test_saving_post(post_factory, user_factory, tag_factory):
|
||||||
assert post.checksum == "deadbeef"
|
assert post.checksum == "deadbeef"
|
||||||
assert post.creation_time == datetime(1997, 1, 1)
|
assert post.creation_time == datetime(1997, 1, 1)
|
||||||
assert post.last_edit_time == datetime(1998, 1, 1)
|
assert post.last_edit_time == datetime(1998, 1, 1)
|
||||||
|
assert post.file_last_modified_time == datetime(1999, 1, 1)
|
||||||
assert len(post.relations) == 2
|
assert len(post.relations) == 2
|
||||||
# relation bidirectionality is realized on business level in func.posts
|
# relation bidirectionality is realized on business level in func.posts
|
||||||
assert len(related_post1.relations) == 0
|
assert len(related_post1.relations) == 0
|
||||||
|
|
Reference in a new issue