mirror of
https://0xacab.org/sutty/sutty
synced 2025-01-19 11:13:38 +00:00
implementar uuid como metadata
This commit is contained in:
parent
0437444247
commit
5c8d8aafdf
9 changed files with 37 additions and 14 deletions
|
@ -11,7 +11,7 @@ class Post < OpenStruct
|
||||||
DEFAULT_ATTRIBUTES = %i[site document layout].freeze
|
DEFAULT_ATTRIBUTES = %i[site document layout].freeze
|
||||||
# Otros atributos que no vienen en los metadatos
|
# Otros atributos que no vienen en los metadatos
|
||||||
PRIVATE_ATTRIBUTES = %i[path slug attributes errors].freeze
|
PRIVATE_ATTRIBUTES = %i[path slug attributes errors].freeze
|
||||||
PUBLIC_ATTRIBUTES = %i[lang date].freeze
|
PUBLIC_ATTRIBUTES = %i[lang date uuid].freeze
|
||||||
|
|
||||||
class << self
|
class << self
|
||||||
# Obtiene el layout sin leer el Document
|
# Obtiene el layout sin leer el Document
|
||||||
|
@ -63,18 +63,20 @@ class Post < OpenStruct
|
||||||
load_slug!
|
load_slug!
|
||||||
load_date!
|
load_date!
|
||||||
load_path!
|
load_path!
|
||||||
|
load_uuid!
|
||||||
|
|
||||||
# XXX: No usamos Post#read porque a esta altura todavía no sabemos
|
# XXX: No usamos Post#read porque a esta altura todavía no sabemos
|
||||||
# nada del Document
|
# nada del Document
|
||||||
document.read! if File.exist? document.path
|
document.read! if File.exist? document.path
|
||||||
end
|
end
|
||||||
|
|
||||||
|
# TODO: Convertir a UUID?
|
||||||
def id
|
def id
|
||||||
path.basename
|
path.basename
|
||||||
end
|
end
|
||||||
|
|
||||||
def sha1
|
def updated_at
|
||||||
Digest::SHA1.hexdigest id
|
File.mtime(path.absolute)
|
||||||
end
|
end
|
||||||
|
|
||||||
|
|
||||||
|
@ -142,8 +144,10 @@ class Post < OpenStruct
|
||||||
{ metadata.to_s => template.value }
|
{ metadata.to_s => template.value }
|
||||||
end.compact.inject(:merge)
|
end.compact.inject(:merge)
|
||||||
|
|
||||||
|
# TODO: Convertir a Metadata?
|
||||||
# Asegurarse que haya un layout
|
# Asegurarse que haya un layout
|
||||||
yaml['layout'] = layout.name.to_s
|
yaml['layout'] = layout.name.to_s
|
||||||
|
yaml['uuid'] = uuid.value
|
||||||
# Y que no se procese liquid
|
# Y que no se procese liquid
|
||||||
yaml['liquid'] = false
|
yaml['liquid'] = false
|
||||||
yaml['usuaries'] = usuaries.map(&:id).uniq
|
yaml['usuaries'] = usuaries.map(&:id).uniq
|
||||||
|
@ -335,6 +339,13 @@ class Post < OpenStruct
|
||||||
required: true)
|
required: true)
|
||||||
end
|
end
|
||||||
|
|
||||||
|
def load_uuid!
|
||||||
|
self.uuid = MetadataUuid.new(document: document, site: site,
|
||||||
|
layout: layout, name: :uuid,
|
||||||
|
type: :uuid, post: self,
|
||||||
|
required: true)
|
||||||
|
end
|
||||||
|
|
||||||
# Ejecuta la acción de guardado en cada atributo
|
# Ejecuta la acción de guardado en cada atributo
|
||||||
def save_attributes!
|
def save_attributes!
|
||||||
attributes.map do |attr|
|
attributes.map do |attr|
|
||||||
|
|
|
@ -56,10 +56,14 @@ class PostRelation < Array
|
||||||
|
|
||||||
alias find_generic find
|
alias find_generic find
|
||||||
|
|
||||||
# Encontra un post por su id convertido a SHA1
|
# Encontrar un post por su UUID
|
||||||
def find(id, sha1: false)
|
def find(id, uuid: false)
|
||||||
find_generic do |p|
|
find_generic do |p|
|
||||||
p.sha1 == (sha1 ? id : Digest::SHA1.hexdigest(id))
|
if uuid
|
||||||
|
p.uuid.value == id
|
||||||
|
else
|
||||||
|
p.id == id
|
||||||
|
end
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
|
|
|
@ -40,18 +40,18 @@ PostService = Struct.new(:site, :usuarie, :post, :params, keyword_init: true) do
|
||||||
end
|
end
|
||||||
|
|
||||||
# Reordena todos los posts que soporten orden de acuerdo a un hash de
|
# Reordena todos los posts que soporten orden de acuerdo a un hash de
|
||||||
# ids y nuevas posiciones. La posición actual la da la posición en
|
# uuids y nuevas posiciones. La posición actual la da la posición en
|
||||||
# el array.
|
# el array.
|
||||||
#
|
#
|
||||||
# { sha1 => 2, sha1 => 1, sha1 => 0 }
|
# { uuid => 2, uuid => 1, uuid => 0 }
|
||||||
def reorder
|
def reorder
|
||||||
posts = site.posts(lang: lang)
|
posts = site.posts(lang: lang)
|
||||||
reorder = params.require(:post).permit(reorder: {}).try(:[], :reorder)
|
reorder = params.require(:post).permit(reorder: {}).try(:[], :reorder)
|
||||||
modified = PostRelation.new(site: site)
|
modified = PostRelation.new(site: site)
|
||||||
|
|
||||||
files = reorder.keys.map do |id|
|
files = reorder.keys.map do |uuid|
|
||||||
post = posts.find(id, sha1: true)
|
post = posts.find(uuid, uuid: true)
|
||||||
order = reorder[id].to_i
|
order = reorder[uuid].to_i
|
||||||
|
|
||||||
next unless post.attributes.include? :order
|
next unless post.attributes.include? :order
|
||||||
next if post.order.value == order
|
next if post.order.value == order
|
||||||
|
|
3
app/views/posts/attribute_ro/_uuid.haml
Normal file
3
app/views/posts/attribute_ro/_uuid.haml
Normal file
|
@ -0,0 +1,3 @@
|
||||||
|
%tr{ id: attribute }
|
||||||
|
%th= post_label_t(attribute, post: post)
|
||||||
|
%td= metadata.value
|
1
app/views/posts/attributes/_uuid.haml
Normal file
1
app/views/posts/attributes/_uuid.haml
Normal file
|
@ -0,0 +1 @@
|
||||||
|
-# nada
|
|
@ -48,7 +48,7 @@
|
||||||
.handle
|
.handle
|
||||||
= image_tag 'arrows-alt-v.svg'
|
= image_tag 'arrows-alt-v.svg'
|
||||||
-# Orden más alto es mayor prioridad
|
-# Orden más alto es mayor prioridad
|
||||||
= hidden_field 'post[reorder]', post.sha1,
|
= hidden_field 'post[reorder]', post.uuid.value,
|
||||||
value: @posts.length - i, class: 'reorder'
|
value: @posts.length - i, class: 'reorder'
|
||||||
%td
|
%td
|
||||||
%small
|
%small
|
||||||
|
|
|
@ -348,6 +348,8 @@ en:
|
||||||
required:
|
required:
|
||||||
label: ' (required)'
|
label: ' (required)'
|
||||||
feedback: 'This field cannot be empty!'
|
feedback: 'This field cannot be empty!'
|
||||||
|
uuid:
|
||||||
|
label: 'Unique identifier'
|
||||||
reorder: 'Reorder posts'
|
reorder: 'Reorder posts'
|
||||||
sort:
|
sort:
|
||||||
by: 'Sort by'
|
by: 'Sort by'
|
||||||
|
|
|
@ -358,6 +358,8 @@ es:
|
||||||
required:
|
required:
|
||||||
label: ' (requerido)'
|
label: ' (requerido)'
|
||||||
feedback: '¡Este campo no puede estar vacío!'
|
feedback: '¡Este campo no puede estar vacío!'
|
||||||
|
uuid:
|
||||||
|
label: 'Identificador único'
|
||||||
reorder: 'Reordenar artículos'
|
reorder: 'Reordenar artículos'
|
||||||
sort:
|
sort:
|
||||||
by: 'Ordenar por'
|
by: 'Ordenar por'
|
||||||
|
|
|
@ -145,7 +145,7 @@ class PostsControllerTest < ActionDispatch::IntegrationTest
|
||||||
test 'se pueden reordenar' do
|
test 'se pueden reordenar' do
|
||||||
lang = I18n.available_locales.sample
|
lang = I18n.available_locales.sample
|
||||||
posts = @site.posts(lang: lang)
|
posts = @site.posts(lang: lang)
|
||||||
reorder = Hash[posts.map(&:sha1).shuffle.each_with_index.to_a]
|
reorder = Hash[posts.map { |p| p.uuid.value }.shuffle.each_with_index.to_a]
|
||||||
|
|
||||||
post site_posts_reorder_url(@site),
|
post site_posts_reorder_url(@site),
|
||||||
headers: @authorization,
|
headers: @authorization,
|
||||||
|
@ -157,7 +157,7 @@ class PostsControllerTest < ActionDispatch::IntegrationTest
|
||||||
@site.repository.rugged.head.target.message
|
@site.repository.rugged.head.target.message
|
||||||
assert_equal reorder,
|
assert_equal reorder,
|
||||||
Hash[@site.posts(lang: lang).map do |p|
|
Hash[@site.posts(lang: lang).map do |p|
|
||||||
[p.sha1, p.order.value]
|
[p.uuid.value, p.order.value]
|
||||||
end]
|
end]
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
Loading…
Reference in a new issue