From 8457a07664ea914f4d18ef0d1cf39fffcfc4d8a9 Mon Sep 17 00:00:00 2001 From: f Date: Tue, 11 Apr 2023 17:49:45 -0300 Subject: [PATCH 01/57] fix: al usar alert tenemos que cambiar i18n #13034 --- app/views/posts/_submit.haml | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/app/views/posts/_submit.haml b/app/views/posts/_submit.haml index cad43320..944694c1 100644 --- a/app/views/posts/_submit.haml +++ b/app/views/posts/_submit.haml @@ -1,6 +1,8 @@ +- invalid_help = site.config.fetch('invalid_help', t('.invalid_help')) +- sending_help = site.config.fetch('sending_help', t('.sending_help')) .form-group = submit_tag t('.save'), class: 'btn submit-post' = render 'bootstrap/alert', class: 'invalid-help d-none' do - = site.config.fetch('invalid_help', t('.invalid_help')) + = invalid_help = render 'bootstrap/alert', class: 'sending-help d-none' do - = site.config.fetch('sending_help', t('.sending_help')) + = sending_help From f5aae98b91d0b8c269f461a804674de0f4ae7af4 Mon Sep 17 00:00:00 2001 From: f Date: Thu, 13 Apr 2023 14:25:56 -0300 Subject: [PATCH 02/57] =?UTF-8?q?feat:=20mover=20el=20bot=C3=B3n=20de=20pu?= =?UTF-8?q?blicaci=C3=B3n=20a=20una=20zona=20m=C3=A1s=20visible=20#13071?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- app/views/posts/index.haml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/app/views/posts/index.haml b/app/views/posts/index.haml index 4f814cda..49a55f55 100644 --- a/app/views/posts/index.haml +++ b/app/views/posts/index.haml @@ -5,6 +5,8 @@ - cache_if @usuarie, [@site, I18n.locale] do = render 'sites/status', site: @site + = render 'sites/build', site: @site + %h3= t('posts.new') %table.mb-3 - @site.layouts.sort_by(&:humanized_name).each do |layout| @@ -33,8 +35,6 @@ type: 'info', link: site_usuaries_path(@site) - = render 'sites/build', site: @site - - if @site.design.credits = render 'bootstrap/alert' do = sanitize_markdown @site.design.credits From 8aed1edaff81544ecfd6ac21559db5af5048229b Mon Sep 17 00:00:00 2001 From: f Date: Thu, 13 Apr 2023 14:27:51 -0300 Subject: [PATCH 03/57] feat: ocupar todo el ancho --- app/views/posts/index.haml | 2 +- app/views/sites/_build.haml | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/app/views/posts/index.haml b/app/views/posts/index.haml index 49a55f55..591f5795 100644 --- a/app/views/posts/index.haml +++ b/app/views/posts/index.haml @@ -5,7 +5,7 @@ - cache_if @usuarie, [@site, I18n.locale] do = render 'sites/status', site: @site - = render 'sites/build', site: @site + = render 'sites/build', site: @site, class: 'btn-block' %h3= t('posts.new') %table.mb-3 diff --git a/app/views/sites/_build.haml b/app/views/sites/_build.haml index 6bc4d11b..5911e908 100644 --- a/app/views/sites/_build.haml +++ b/app/views/sites/_build.haml @@ -3,7 +3,7 @@ method: :post, class: 'form-inline inline' do = submit_tag site.enqueued? ? t('sites.enqueued') : t('sites.enqueue'), - class: 'btn no-border-radius', + class: "btn no-border-radius #{local_assigns[:class]}", title: site.enqueued? ? t('help.sites.enqueued') : t('help.sites.enqueue'), data: { disable_with: t('sites.enqueued') }, disabled: site.enqueued? From 6e567787681b5177e31e0ccef83b52e54635cb9b Mon Sep 17 00:00:00 2001 From: f Date: Sat, 15 Apr 2023 11:16:58 -0300 Subject: [PATCH 04/57] fix: renovar el token #13105 `touch` no corre `before_save`, con lo que el token nunca se renovaba --- app/jobs/renew_distributed_press_tokens_job.rb | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/jobs/renew_distributed_press_tokens_job.rb b/app/jobs/renew_distributed_press_tokens_job.rb index 5664d9fa..86086ac7 100644 --- a/app/jobs/renew_distributed_press_tokens_job.rb +++ b/app/jobs/renew_distributed_press_tokens_job.rb @@ -7,7 +7,7 @@ class RenewDistributedPressTokensJob < ApplicationJob # detener la tarea si algo pasa. def perform DistributedPressPublisher.with_about_to_expire_tokens.find_each do |publisher| - publisher.touch + publisher.save rescue DistributedPress::V1::Error => e data = { instance: publisher.instance, expires_at: publisher.client.token.expires_at } From d59fa43082a119eb2f0a478d14539ba76436d29a Mon Sep 17 00:00:00 2001 From: jazzari Date: Sat, 15 Apr 2023 13:31:09 -0300 Subject: [PATCH 05/57] feat: reorder template designs according to complexity # 13091 --- app/views/sites/_form.haml | 2 +- .../20230415153231_add_priority_to_designs.rb | 5 + db/schema.rb | 222 +++++++++++++++++- db/seeds/designs.yml | 11 +- 4 files changed, 235 insertions(+), 5 deletions(-) create mode 100644 db/migrate/20230415153231_add_priority_to_designs.rb diff --git a/app/views/sites/_form.haml b/app/views/sites/_form.haml index 001f542e..50391871 100644 --- a/app/views/sites/_form.haml +++ b/app/views/sites/_form.haml @@ -55,7 +55,7 @@ layouts: site.incompatible_layouts.to_sentence) .row.row-cols-1.row-cols-md-2.designs -# Demasiado complejo para un f.collection_radio_buttons - - Design.all.find_each do |design| + - Design.all.order(priority: :desc).find_each do |design| .design.col.d-flex.flex-column .custom-control.custom-radio = f.radio_button :design_id, design.id, diff --git a/db/migrate/20230415153231_add_priority_to_designs.rb b/db/migrate/20230415153231_add_priority_to_designs.rb new file mode 100644 index 00000000..7fc45558 --- /dev/null +++ b/db/migrate/20230415153231_add_priority_to_designs.rb @@ -0,0 +1,5 @@ +class AddPriorityToDesigns < ActiveRecord::Migration[6.1] + def change + add_column :designs, :priority, :integer + end +end diff --git a/db/schema.rb b/db/schema.rb index a395329d..f659f11d 100644 --- a/db/schema.rb +++ b/db/schema.rb @@ -10,7 +10,7 @@ # # It's strongly recommended that you check this file into your version control system. -ActiveRecord::Schema.define(version: 2021_10_22_225449) do +ActiveRecord::Schema.define(version: 2023_04_15_153231) do # These are extensions that must be enabled in order to support this database enable_extension "pg_trgm" @@ -65,6 +65,11 @@ ActiveRecord::Schema.define(version: 2021_10_22_225449) do t.boolean "crawler", default: false t.string "http_referer" t.datetime "created_at", precision: 6 + t.decimal "datacenter_co2" + t.decimal "network_co2" + t.decimal "consumer_device_co2" + t.decimal "production_co2" + t.decimal "total_co2" t.index ["geoip2_data_city_name"], name: "index_access_logs_on_geoip2_data_city_name" t.index ["geoip2_data_country_name"], name: "index_access_logs_on_geoip2_data_country_name" t.index ["host"], name: "index_access_logs_on_host" @@ -103,7 +108,7 @@ ActiveRecord::Schema.define(version: 2021_10_22_225449) do t.string "checksum", null: false t.datetime "created_at", null: false t.string "service_name", null: false - t.index ["key"], name: "index_active_storage_blobs_on_key", unique: true + t.index ["key", "service_name"], name: "index_active_storage_blobs_on_key_and_service_name", unique: true end create_table "active_storage_variant_records", force: :cascade do |t| @@ -179,6 +184,14 @@ ActiveRecord::Schema.define(version: 2021_10_22_225449) do t.index ["deploy_id"], name: "index_build_stats_on_deploy_id" end + create_table "codes_of_conduct", force: :cascade do |t| + t.datetime "created_at", precision: 6, null: false + t.datetime "updated_at", precision: 6, null: false + t.string "title" + t.text "description" + t.text "content" + end + create_table "csp_reports", id: :uuid, default: nil, force: :cascade do |t| t.datetime "created_at", precision: 6, null: false t.datetime "updated_at", precision: 6, null: false @@ -217,6 +230,15 @@ ActiveRecord::Schema.define(version: 2021_10_22_225449) do t.boolean "disabled", default: false t.text "credits" t.string "designer_url" + t.integer "priority" + end + + create_table "distributed_press_publishers", force: :cascade do |t| + t.datetime "created_at", precision: 6, null: false + t.datetime "updated_at", precision: 6, null: false + t.string "instance" + t.text "token_ciphertext", null: false + t.datetime "expires_at" end create_table "indexed_posts", id: :uuid, default: -> { "gen_random_uuid()" }, force: :cascade do |t| @@ -232,6 +254,7 @@ ActiveRecord::Schema.define(version: 2021_10_22_225449) do t.tsvector "indexed_content" t.integer "order", default: 0 t.string "dictionary" + t.uuid "post_id" t.index ["front_matter"], name: "index_indexed_posts_on_front_matter", using: :gin t.index ["indexed_content"], name: "index_indexed_posts_on_indexed_content", using: :gin t.index ["layout"], name: "index_indexed_posts_on_layout" @@ -247,6 +270,7 @@ ActiveRecord::Schema.define(version: 2021_10_22_225449) do t.text "deed" t.string "url" t.string "icons" + t.string "short_description" end create_table "log_entries", force: :cascade do |t| @@ -292,6 +316,56 @@ ActiveRecord::Schema.define(version: 2021_10_22_225449) do t.index ["translatable_id", "translatable_type", "locale", "key"], name: "index_mobility_text_translations_on_keys", unique: true end + create_table "privacy_policies", force: :cascade do |t| + t.datetime "created_at", precision: 6, null: false + t.datetime "updated_at", precision: 6, null: false + t.string "title" + t.text "description" + t.text "content" + end + + create_table "que_jobs", comment: "7", force: :cascade do |t| + t.integer "priority", limit: 2, default: 100, null: false + t.datetime "run_at", default: -> { "now()" }, null: false + t.text "job_class", null: false + t.integer "error_count", default: 0, null: false + t.text "last_error_message" + t.text "queue", default: "default", null: false + t.text "last_error_backtrace" + t.datetime "finished_at" + t.datetime "expired_at" + t.jsonb "args", default: [], null: false + t.jsonb "data", default: {}, null: false + t.integer "job_schema_version", null: false + t.jsonb "kwargs", default: {}, null: false + t.index ["args"], name: "que_jobs_args_gin_idx", opclass: :jsonb_path_ops, using: :gin + t.index ["data"], name: "que_jobs_data_gin_idx", opclass: :jsonb_path_ops, using: :gin + t.index ["job_schema_version", "queue", "priority", "run_at", "id"], name: "que_poll_idx", where: "((finished_at IS NULL) AND (expired_at IS NULL))" + t.index ["kwargs"], name: "que_jobs_kwargs_gin_idx", opclass: :jsonb_path_ops, using: :gin + t.check_constraint "(char_length(last_error_message) <= 500) AND (char_length(last_error_backtrace) <= 10000)", name: "error_length" + t.check_constraint "(jsonb_typeof(data) = 'object'::text) AND ((NOT (data ? 'tags'::text)) OR ((jsonb_typeof((data -> 'tags'::text)) = 'array'::text) AND (jsonb_array_length((data -> 'tags'::text)) <= 5) AND que_validate_tags((data -> 'tags'::text))))", name: "valid_data" + t.check_constraint "char_length(queue) <= 100", name: "queue_length" + t.check_constraint "jsonb_typeof(args) = 'array'::text", name: "valid_args" + t.check_constraint nil, name: "job_class_length" + end + + create_table "que_lockers", primary_key: "pid", id: :integer, default: nil, force: :cascade do |t| + t.integer "worker_count", null: false + t.integer "worker_priorities", null: false, array: true + t.integer "ruby_pid", null: false + t.text "ruby_hostname", null: false + t.text "queues", null: false, array: true + t.boolean "listening", null: false + t.integer "job_schema_version", default: 1 + t.check_constraint "(array_ndims(queues) = 1) AND (array_length(queues, 1) IS NOT NULL)", name: "valid_queues" + t.check_constraint "(array_ndims(worker_priorities) = 1) AND (array_length(worker_priorities, 1) IS NOT NULL)", name: "valid_worker_priorities" + end + + create_table "que_values", primary_key: "key", id: :text, force: :cascade do |t| + t.jsonb "value", default: {}, null: false + t.check_constraint "jsonb_typeof(value) = 'object'::text", name: "valid_value" + end + create_table "roles", force: :cascade do |t| t.datetime "created_at", null: false t.datetime "updated_at", null: false @@ -329,6 +403,7 @@ ActiveRecord::Schema.define(version: 2021_10_22_225449) do t.string "tienda_api_key_ciphertext", default: "" t.string "tienda_url", default: "" t.string "api_key_ciphertext" + t.string "slugify_mode", default: "default" t.index ["design_id"], name: "index_sites_on_design_id" t.index ["licencia_id"], name: "index_sites_on_licencia_id" t.index ["name"], name: "index_sites_on_name", unique: true @@ -358,7 +433,6 @@ ActiveRecord::Schema.define(version: 2021_10_22_225449) do t.integer "failed_attempts", default: 0, null: false t.string "unlock_token" t.datetime "locked_at" - t.boolean "acepta_politicas_de_privacidad", default: false t.string "invitation_token" t.datetime "invitation_created_at" t.datetime "invitation_sent_at" @@ -368,6 +442,10 @@ ActiveRecord::Schema.define(version: 2021_10_22_225449) do t.bigint "invited_by_id" t.integer "invitations_count", default: 0 t.string "lang", default: "es" + t.datetime "privacy_policy_accepted_at" + t.datetime "terms_of_service_accepted_at" + t.datetime "code_of_conduct_accepted_at" + t.datetime "available_for_feedback_accepted_at" t.index ["confirmation_token"], name: "index_usuaries_on_confirmation_token", unique: true t.index ["email"], name: "index_usuaries_on_email", unique: true t.index ["invitation_token"], name: "index_usuaries_on_invitation_token", unique: true @@ -380,6 +458,144 @@ ActiveRecord::Schema.define(version: 2021_10_22_225449) do add_foreign_key "active_storage_attachments", "active_storage_blobs", column: "blob_id" add_foreign_key "active_storage_variant_records", "active_storage_blobs", column: "blob_id" + # no candidate create_trigger statement could be found, creating an adapter-specific one + execute(<<-SQL) +CREATE OR REPLACE FUNCTION public.que_job_notify() + RETURNS trigger + LANGUAGE plpgsql +AS $function$ + DECLARE + locker_pid integer; + sort_key json; + BEGIN + -- Don't do anything if the job is scheduled for a future time. + IF NEW.run_at IS NOT NULL AND NEW.run_at > now() THEN + RETURN null; + END IF; + + -- Pick a locker to notify of the job's insertion, weighted by their number + -- of workers. Should bounce pseudorandomly between lockers on each + -- invocation, hence the md5-ordering, but still touch each one equally, + -- hence the modulo using the job_id. + SELECT pid + INTO locker_pid + FROM ( + SELECT *, last_value(row_number) OVER () + 1 AS count + FROM ( + SELECT *, row_number() OVER () - 1 AS row_number + FROM ( + SELECT * + FROM public.que_lockers ql, generate_series(1, ql.worker_count) AS id + WHERE + listening AND + queues @> ARRAY[NEW.queue] AND + ql.job_schema_version = NEW.job_schema_version + ORDER BY md5(pid::text || id::text) + ) t1 + ) t2 + ) t3 + WHERE NEW.id % count = row_number; + + IF locker_pid IS NOT NULL THEN + -- There's a size limit to what can be broadcast via LISTEN/NOTIFY, so + -- rather than throw errors when someone enqueues a big job, just + -- broadcast the most pertinent information, and let the locker query for + -- the record after it's taken the lock. The worker will have to hit the + -- DB in order to make sure the job is still visible anyway. + SELECT row_to_json(t) + INTO sort_key + FROM ( + SELECT + 'job_available' AS message_type, + NEW.queue AS queue, + NEW.priority AS priority, + NEW.id AS id, + -- Make sure we output timestamps as UTC ISO 8601 + to_char(NEW.run_at AT TIME ZONE 'UTC', 'YYYY-MM-DD"T"HH24:MI:SS.US"Z"') AS run_at + ) t; + + PERFORM pg_notify('que_listener_' || locker_pid::text, sort_key::text); + END IF; + + RETURN null; + END +$function$ + SQL + + # no candidate create_trigger statement could be found, creating an adapter-specific one + execute("CREATE TRIGGER que_job_notify AFTER INSERT ON \"que_jobs\" FOR EACH ROW WHEN (NOT COALESCE(current_setting('que.skip_notify'::text, true), ''::text) = 'true'::text) EXECUTE FUNCTION que_job_notify()") + + # no candidate create_trigger statement could be found, creating an adapter-specific one + execute(<<-SQL) +CREATE OR REPLACE FUNCTION public.que_state_notify() + RETURNS trigger + LANGUAGE plpgsql +AS $function$ + DECLARE + row record; + message json; + previous_state text; + current_state text; + BEGIN + IF TG_OP = 'INSERT' THEN + previous_state := 'nonexistent'; + current_state := public.que_determine_job_state(NEW); + row := NEW; + ELSIF TG_OP = 'DELETE' THEN + previous_state := public.que_determine_job_state(OLD); + current_state := 'nonexistent'; + row := OLD; + ELSIF TG_OP = 'UPDATE' THEN + previous_state := public.que_determine_job_state(OLD); + current_state := public.que_determine_job_state(NEW); + + -- If the state didn't change, short-circuit. + IF previous_state = current_state THEN + RETURN null; + END IF; + + row := NEW; + ELSE + RAISE EXCEPTION 'Unrecognized TG_OP: %', TG_OP; + END IF; + + SELECT row_to_json(t) + INTO message + FROM ( + SELECT + 'job_change' AS message_type, + row.id AS id, + row.queue AS queue, + + coalesce(row.data->'tags', '[]'::jsonb) AS tags, + + to_char(row.run_at AT TIME ZONE 'UTC', 'YYYY-MM-DD"T"HH24:MI:SS.US"Z"') AS run_at, + to_char(now() AT TIME ZONE 'UTC', 'YYYY-MM-DD"T"HH24:MI:SS.US"Z"') AS time, + + CASE row.job_class + WHEN 'ActiveJob::QueueAdapters::QueAdapter::JobWrapper' THEN + coalesce( + row.args->0->>'job_class', + 'ActiveJob::QueueAdapters::QueAdapter::JobWrapper' + ) + ELSE + row.job_class + END AS job_class, + + previous_state AS previous_state, + current_state AS current_state + ) t; + + PERFORM pg_notify('que_state', message::text); + + RETURN null; + END +$function$ + SQL + + # no candidate create_trigger statement could be found, creating an adapter-specific one + execute("CREATE TRIGGER que_state_notify AFTER INSERT OR DELETE OR UPDATE ON \"que_jobs\" FOR EACH ROW WHEN (NOT COALESCE(current_setting('que.skip_notify'::text, true), ''::text) = 'true'::text) EXECUTE FUNCTION que_state_notify()") + create_trigger("indexed_posts_before_insert_update_row_tr", :compatibility => 1). on("indexed_posts"). before(:insert, :update) do diff --git a/db/seeds/designs.yml b/db/seeds/designs.yml index b1508b84..22615638 100644 --- a/db/seeds/designs.yml +++ b/db/seeds/designs.yml @@ -6,6 +6,7 @@ disabled: true description_en: "Upload your own theme. [This feature is in development, help us!](https://sutty.nl/en/#contact)" description_es: "Subir tu propio diseño. [Esta posibilidad está en desarrollo, ¡ayudanos!](https://sutty.nl/#contacto)" + priority: '8' - name_en: 'I want you to develop a site for me' name_es: 'Quiero que desarrollen mi sitio' gem: 'sutty-theme-custom' @@ -13,6 +14,7 @@ disabled: true description_en: "If you want us to develop your site, you're welcome to [contact us!](https://sutty.nl/en/#contact) :)" description_es: "Si querés que desarrollemos tu sitio, [escribinos](https://sutty.nl/#contacto) :)" + priority: '7' - name_en: 'Minima' name_es: 'Mínima' gem: 'sutty-minima' @@ -20,6 +22,7 @@ description_en: "Sutty Minima is based on [Minima](https://jekyll.github.io/minima/), a blog-focused theme for Jekyll." description_es: 'Sutty Mínima es una plantilla para blogs basada en [Mínima](https://jekyll.github.io/minima/).' license: 'https://0xacab.org/sutty/jekyll/minima/-/blob/master/LICENSE.txt' + priority: '1' - name_en: 'Sutty' name_es: 'Sutty' gem: 'sutty-jekyll-theme' @@ -29,6 +32,7 @@ license: 'https://0xacab.org/sutty/jekyll/sutty-jekyll-theme/-/blob/master/LICENSE.txt' credits_es: 'Sutty es parte de la economía solidaria :)' credits_en: 'Sutty is a solidarity economy project!' + priority: '2' - name_en: 'Self-managed Book Publisher' name_es: 'Editorial Autogestiva' gem: 'editorial-autogestiva-jekyll-theme' @@ -38,6 +42,7 @@ license: 'https://0xacab.org/sutty/jekyll/editorial-autogestiva-jekyll-theme/-/blob/master/LICENSE.txt' credits_es: 'Esta plantilla fue inspirada en el trabajo de las [editoriales autogestivas](https://sutty.nl/plantillas-para-crear-cat%C3%A1logos-de-editoriales-autogestivas/)' credits_en: 'This theme is inspired by [independent publishing projects](https://sutty.nl/en/new-template-for-publishing-projects/)' + priority: '6' - name_en: 'Donations' name_es: 'Donaciones' gem: 'sutty-donaciones-jekyll-theme' @@ -47,6 +52,7 @@ license: 'https://0xacab.org/sutty/jekyll/sutty-donaciones-jekyll-theme/-/blob/master/LICENSE.txt' credits_es: 'Diseñamos esta plantilla para [visibilizar campañas de donaciones](https://sutty.nl/plantilla-para-donaciones/) durante la cuarentena.' credits_en: 'We designed this theme to increase [visibility for donation requests](https://sutty.nl/template-for-donations/) during the quarantine.' + priority: '3' - name_en: 'Support campaign' name_es: 'Adhesiones' gem: 'adhesiones-jekyll-theme' @@ -57,6 +63,7 @@ credits_es: 'Desarrollamos esta plantilla junto con [Librenauta](https://sutty.nl/plantilla-para-campa%C3%B1as-de-adhesiones/)' credits_en: 'This template was made in collaboration with Librenauta' designer_url: 'https://copiona.com/donaunbit/' + priority: '5' - name_en: 'Community Radio' name_es: 'Radio comunitaria' gem: 'radios-comunitarias-jekyll-theme' @@ -67,6 +74,7 @@ credits_es: 'Desarrollamos esta plantilla junto con Librenauta en 15 horas :)' credits_en: 'This template was made in collaboration with Librenauta in 15 hours!' designer_url: 'https://copiona.com/donaunbit/' + priority: '4' - name_en: 'Resource toolkit' name_es: 'Recursero' gem: 'recursero-jekyll-theme' @@ -75,9 +83,10 @@ description_en: "We're working towards adding more themes for you to use. [Contact us!](https://sutty.nl/en/#contact)" description_es: "Estamos trabajando para que puedas tener más diseños. [¡Escribinos!](https://sutty.nl/#contacto)" - name_en: 'Other themes' - name_es: 'Mi propio diseño' + name_es: 'Otros temas' gem: 'sutty-theme-own' url: 'https://jekyllthemes.org' disabled: true description_en: "We're working towards adding more themes for you to use. [Contact us!](https://sutty.nl/en/#contact)" description_es: "Estamos trabajando para que puedas tener más diseños. [¡Escribinos!](https://sutty.nl/#contacto)" + priority: '9' \ No newline at end of file From bdac1fb0b834ac8b00025c754b6c03c455703bdb Mon Sep 17 00:00:00 2001 From: f Date: Sat, 15 Apr 2023 14:39:55 -0300 Subject: [PATCH 06/57] fix: estos cambios no pertenecen a esta rama --- db/schema.rb | 211 +-------------------------------------------------- 1 file changed, 1 insertion(+), 210 deletions(-) diff --git a/db/schema.rb b/db/schema.rb index f659f11d..fd8e5b48 100644 --- a/db/schema.rb +++ b/db/schema.rb @@ -184,14 +184,6 @@ ActiveRecord::Schema.define(version: 2023_04_15_153231) do t.index ["deploy_id"], name: "index_build_stats_on_deploy_id" end - create_table "codes_of_conduct", force: :cascade do |t| - t.datetime "created_at", precision: 6, null: false - t.datetime "updated_at", precision: 6, null: false - t.string "title" - t.text "description" - t.text "content" - end - create_table "csp_reports", id: :uuid, default: nil, force: :cascade do |t| t.datetime "created_at", precision: 6, null: false t.datetime "updated_at", precision: 6, null: false @@ -233,14 +225,6 @@ ActiveRecord::Schema.define(version: 2023_04_15_153231) do t.integer "priority" end - create_table "distributed_press_publishers", force: :cascade do |t| - t.datetime "created_at", precision: 6, null: false - t.datetime "updated_at", precision: 6, null: false - t.string "instance" - t.text "token_ciphertext", null: false - t.datetime "expires_at" - end - create_table "indexed_posts", id: :uuid, default: -> { "gen_random_uuid()" }, force: :cascade do |t| t.bigint "site_id" t.datetime "created_at", precision: 6, null: false @@ -254,7 +238,6 @@ ActiveRecord::Schema.define(version: 2023_04_15_153231) do t.tsvector "indexed_content" t.integer "order", default: 0 t.string "dictionary" - t.uuid "post_id" t.index ["front_matter"], name: "index_indexed_posts_on_front_matter", using: :gin t.index ["indexed_content"], name: "index_indexed_posts_on_indexed_content", using: :gin t.index ["layout"], name: "index_indexed_posts_on_layout" @@ -270,7 +253,6 @@ ActiveRecord::Schema.define(version: 2023_04_15_153231) do t.text "deed" t.string "url" t.string "icons" - t.string "short_description" end create_table "log_entries", force: :cascade do |t| @@ -316,56 +298,6 @@ ActiveRecord::Schema.define(version: 2023_04_15_153231) do t.index ["translatable_id", "translatable_type", "locale", "key"], name: "index_mobility_text_translations_on_keys", unique: true end - create_table "privacy_policies", force: :cascade do |t| - t.datetime "created_at", precision: 6, null: false - t.datetime "updated_at", precision: 6, null: false - t.string "title" - t.text "description" - t.text "content" - end - - create_table "que_jobs", comment: "7", force: :cascade do |t| - t.integer "priority", limit: 2, default: 100, null: false - t.datetime "run_at", default: -> { "now()" }, null: false - t.text "job_class", null: false - t.integer "error_count", default: 0, null: false - t.text "last_error_message" - t.text "queue", default: "default", null: false - t.text "last_error_backtrace" - t.datetime "finished_at" - t.datetime "expired_at" - t.jsonb "args", default: [], null: false - t.jsonb "data", default: {}, null: false - t.integer "job_schema_version", null: false - t.jsonb "kwargs", default: {}, null: false - t.index ["args"], name: "que_jobs_args_gin_idx", opclass: :jsonb_path_ops, using: :gin - t.index ["data"], name: "que_jobs_data_gin_idx", opclass: :jsonb_path_ops, using: :gin - t.index ["job_schema_version", "queue", "priority", "run_at", "id"], name: "que_poll_idx", where: "((finished_at IS NULL) AND (expired_at IS NULL))" - t.index ["kwargs"], name: "que_jobs_kwargs_gin_idx", opclass: :jsonb_path_ops, using: :gin - t.check_constraint "(char_length(last_error_message) <= 500) AND (char_length(last_error_backtrace) <= 10000)", name: "error_length" - t.check_constraint "(jsonb_typeof(data) = 'object'::text) AND ((NOT (data ? 'tags'::text)) OR ((jsonb_typeof((data -> 'tags'::text)) = 'array'::text) AND (jsonb_array_length((data -> 'tags'::text)) <= 5) AND que_validate_tags((data -> 'tags'::text))))", name: "valid_data" - t.check_constraint "char_length(queue) <= 100", name: "queue_length" - t.check_constraint "jsonb_typeof(args) = 'array'::text", name: "valid_args" - t.check_constraint nil, name: "job_class_length" - end - - create_table "que_lockers", primary_key: "pid", id: :integer, default: nil, force: :cascade do |t| - t.integer "worker_count", null: false - t.integer "worker_priorities", null: false, array: true - t.integer "ruby_pid", null: false - t.text "ruby_hostname", null: false - t.text "queues", null: false, array: true - t.boolean "listening", null: false - t.integer "job_schema_version", default: 1 - t.check_constraint "(array_ndims(queues) = 1) AND (array_length(queues, 1) IS NOT NULL)", name: "valid_queues" - t.check_constraint "(array_ndims(worker_priorities) = 1) AND (array_length(worker_priorities, 1) IS NOT NULL)", name: "valid_worker_priorities" - end - - create_table "que_values", primary_key: "key", id: :text, force: :cascade do |t| - t.jsonb "value", default: {}, null: false - t.check_constraint "jsonb_typeof(value) = 'object'::text", name: "valid_value" - end - create_table "roles", force: :cascade do |t| t.datetime "created_at", null: false t.datetime "updated_at", null: false @@ -403,7 +335,6 @@ ActiveRecord::Schema.define(version: 2023_04_15_153231) do t.string "tienda_api_key_ciphertext", default: "" t.string "tienda_url", default: "" t.string "api_key_ciphertext" - t.string "slugify_mode", default: "default" t.index ["design_id"], name: "index_sites_on_design_id" t.index ["licencia_id"], name: "index_sites_on_licencia_id" t.index ["name"], name: "index_sites_on_name", unique: true @@ -433,6 +364,7 @@ ActiveRecord::Schema.define(version: 2023_04_15_153231) do t.integer "failed_attempts", default: 0, null: false t.string "unlock_token" t.datetime "locked_at" + t.boolean "acepta_politicas_de_privacidad", default: false t.string "invitation_token" t.datetime "invitation_created_at" t.datetime "invitation_sent_at" @@ -442,10 +374,6 @@ ActiveRecord::Schema.define(version: 2023_04_15_153231) do t.bigint "invited_by_id" t.integer "invitations_count", default: 0 t.string "lang", default: "es" - t.datetime "privacy_policy_accepted_at" - t.datetime "terms_of_service_accepted_at" - t.datetime "code_of_conduct_accepted_at" - t.datetime "available_for_feedback_accepted_at" t.index ["confirmation_token"], name: "index_usuaries_on_confirmation_token", unique: true t.index ["email"], name: "index_usuaries_on_email", unique: true t.index ["invitation_token"], name: "index_usuaries_on_invitation_token", unique: true @@ -458,143 +386,6 @@ ActiveRecord::Schema.define(version: 2023_04_15_153231) do add_foreign_key "active_storage_attachments", "active_storage_blobs", column: "blob_id" add_foreign_key "active_storage_variant_records", "active_storage_blobs", column: "blob_id" - # no candidate create_trigger statement could be found, creating an adapter-specific one - execute(<<-SQL) -CREATE OR REPLACE FUNCTION public.que_job_notify() - RETURNS trigger - LANGUAGE plpgsql -AS $function$ - DECLARE - locker_pid integer; - sort_key json; - BEGIN - -- Don't do anything if the job is scheduled for a future time. - IF NEW.run_at IS NOT NULL AND NEW.run_at > now() THEN - RETURN null; - END IF; - - -- Pick a locker to notify of the job's insertion, weighted by their number - -- of workers. Should bounce pseudorandomly between lockers on each - -- invocation, hence the md5-ordering, but still touch each one equally, - -- hence the modulo using the job_id. - SELECT pid - INTO locker_pid - FROM ( - SELECT *, last_value(row_number) OVER () + 1 AS count - FROM ( - SELECT *, row_number() OVER () - 1 AS row_number - FROM ( - SELECT * - FROM public.que_lockers ql, generate_series(1, ql.worker_count) AS id - WHERE - listening AND - queues @> ARRAY[NEW.queue] AND - ql.job_schema_version = NEW.job_schema_version - ORDER BY md5(pid::text || id::text) - ) t1 - ) t2 - ) t3 - WHERE NEW.id % count = row_number; - - IF locker_pid IS NOT NULL THEN - -- There's a size limit to what can be broadcast via LISTEN/NOTIFY, so - -- rather than throw errors when someone enqueues a big job, just - -- broadcast the most pertinent information, and let the locker query for - -- the record after it's taken the lock. The worker will have to hit the - -- DB in order to make sure the job is still visible anyway. - SELECT row_to_json(t) - INTO sort_key - FROM ( - SELECT - 'job_available' AS message_type, - NEW.queue AS queue, - NEW.priority AS priority, - NEW.id AS id, - -- Make sure we output timestamps as UTC ISO 8601 - to_char(NEW.run_at AT TIME ZONE 'UTC', 'YYYY-MM-DD"T"HH24:MI:SS.US"Z"') AS run_at - ) t; - - PERFORM pg_notify('que_listener_' || locker_pid::text, sort_key::text); - END IF; - - RETURN null; - END -$function$ - SQL - - # no candidate create_trigger statement could be found, creating an adapter-specific one - execute("CREATE TRIGGER que_job_notify AFTER INSERT ON \"que_jobs\" FOR EACH ROW WHEN (NOT COALESCE(current_setting('que.skip_notify'::text, true), ''::text) = 'true'::text) EXECUTE FUNCTION que_job_notify()") - - # no candidate create_trigger statement could be found, creating an adapter-specific one - execute(<<-SQL) -CREATE OR REPLACE FUNCTION public.que_state_notify() - RETURNS trigger - LANGUAGE plpgsql -AS $function$ - DECLARE - row record; - message json; - previous_state text; - current_state text; - BEGIN - IF TG_OP = 'INSERT' THEN - previous_state := 'nonexistent'; - current_state := public.que_determine_job_state(NEW); - row := NEW; - ELSIF TG_OP = 'DELETE' THEN - previous_state := public.que_determine_job_state(OLD); - current_state := 'nonexistent'; - row := OLD; - ELSIF TG_OP = 'UPDATE' THEN - previous_state := public.que_determine_job_state(OLD); - current_state := public.que_determine_job_state(NEW); - - -- If the state didn't change, short-circuit. - IF previous_state = current_state THEN - RETURN null; - END IF; - - row := NEW; - ELSE - RAISE EXCEPTION 'Unrecognized TG_OP: %', TG_OP; - END IF; - - SELECT row_to_json(t) - INTO message - FROM ( - SELECT - 'job_change' AS message_type, - row.id AS id, - row.queue AS queue, - - coalesce(row.data->'tags', '[]'::jsonb) AS tags, - - to_char(row.run_at AT TIME ZONE 'UTC', 'YYYY-MM-DD"T"HH24:MI:SS.US"Z"') AS run_at, - to_char(now() AT TIME ZONE 'UTC', 'YYYY-MM-DD"T"HH24:MI:SS.US"Z"') AS time, - - CASE row.job_class - WHEN 'ActiveJob::QueueAdapters::QueAdapter::JobWrapper' THEN - coalesce( - row.args->0->>'job_class', - 'ActiveJob::QueueAdapters::QueAdapter::JobWrapper' - ) - ELSE - row.job_class - END AS job_class, - - previous_state AS previous_state, - current_state AS current_state - ) t; - - PERFORM pg_notify('que_state', message::text); - - RETURN null; - END -$function$ - SQL - - # no candidate create_trigger statement could be found, creating an adapter-specific one - execute("CREATE TRIGGER que_state_notify AFTER INSERT OR DELETE OR UPDATE ON \"que_jobs\" FOR EACH ROW WHEN (NOT COALESCE(current_setting('que.skip_notify'::text, true), ''::text) = 'true'::text) EXECUTE FUNCTION que_state_notify()") create_trigger("indexed_posts_before_insert_update_row_tr", :compatibility => 1). on("indexed_posts"). From bc74f85ba2c4b3b943cc1999b56de1032b302d08 Mon Sep 17 00:00:00 2001 From: f Date: Sat, 15 Apr 2023 14:56:58 -0300 Subject: [PATCH 07/57] =?UTF-8?q?fix:=20mejorar=20el=20t=C3=ADtulo?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- db/seeds/designs.yml | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/db/seeds/designs.yml b/db/seeds/designs.yml index 22615638..67bccad3 100644 --- a/db/seeds/designs.yml +++ b/db/seeds/designs.yml @@ -82,11 +82,11 @@ disabled: true description_en: "We're working towards adding more themes for you to use. [Contact us!](https://sutty.nl/en/#contact)" description_es: "Estamos trabajando para que puedas tener más diseños. [¡Escribinos!](https://sutty.nl/#contacto)" -- name_en: 'Other themes' - name_es: 'Otros temas' +- name_en: 'More themes' + name_es: 'Más plantillas' gem: 'sutty-theme-own' url: 'https://jekyllthemes.org' disabled: true description_en: "We're working towards adding more themes for you to use. [Contact us!](https://sutty.nl/en/#contact)" description_es: "Estamos trabajando para que puedas tener más diseños. [¡Escribinos!](https://sutty.nl/#contacto)" - priority: '9' \ No newline at end of file + priority: '9' From fd41242985cf43912d0224444defb3f55963a9dc Mon Sep 17 00:00:00 2001 From: f Date: Sat, 15 Apr 2023 15:03:38 -0300 Subject: [PATCH 08/57] fix: el orden es de mayor a menor prioridad dejando espacio entre algunos para poder intercalar otras plantillas --- db/seeds/designs.yml | 19 ++++++++++--------- 1 file changed, 10 insertions(+), 9 deletions(-) diff --git a/db/seeds/designs.yml b/db/seeds/designs.yml index 67bccad3..a04c99c1 100644 --- a/db/seeds/designs.yml +++ b/db/seeds/designs.yml @@ -6,7 +6,7 @@ disabled: true description_en: "Upload your own theme. [This feature is in development, help us!](https://sutty.nl/en/#contact)" description_es: "Subir tu propio diseño. [Esta posibilidad está en desarrollo, ¡ayudanos!](https://sutty.nl/#contacto)" - priority: '8' + priority: '0' - name_en: 'I want you to develop a site for me' name_es: 'Quiero que desarrollen mi sitio' gem: 'sutty-theme-custom' @@ -14,7 +14,7 @@ disabled: true description_en: "If you want us to develop your site, you're welcome to [contact us!](https://sutty.nl/en/#contact) :)" description_es: "Si querés que desarrollemos tu sitio, [escribinos](https://sutty.nl/#contacto) :)" - priority: '7' + priority: '2' - name_en: 'Minima' name_es: 'Mínima' gem: 'sutty-minima' @@ -22,7 +22,7 @@ description_en: "Sutty Minima is based on [Minima](https://jekyll.github.io/minima/), a blog-focused theme for Jekyll." description_es: 'Sutty Mínima es una plantilla para blogs basada en [Mínima](https://jekyll.github.io/minima/).' license: 'https://0xacab.org/sutty/jekyll/minima/-/blob/master/LICENSE.txt' - priority: '1' + priority: '100' - name_en: 'Sutty' name_es: 'Sutty' gem: 'sutty-jekyll-theme' @@ -32,7 +32,7 @@ license: 'https://0xacab.org/sutty/jekyll/sutty-jekyll-theme/-/blob/master/LICENSE.txt' credits_es: 'Sutty es parte de la economía solidaria :)' credits_en: 'Sutty is a solidarity economy project!' - priority: '2' + priority: '90' - name_en: 'Self-managed Book Publisher' name_es: 'Editorial Autogestiva' gem: 'editorial-autogestiva-jekyll-theme' @@ -42,7 +42,7 @@ license: 'https://0xacab.org/sutty/jekyll/editorial-autogestiva-jekyll-theme/-/blob/master/LICENSE.txt' credits_es: 'Esta plantilla fue inspirada en el trabajo de las [editoriales autogestivas](https://sutty.nl/plantillas-para-crear-cat%C3%A1logos-de-editoriales-autogestivas/)' credits_en: 'This theme is inspired by [independent publishing projects](https://sutty.nl/en/new-template-for-publishing-projects/)' - priority: '6' + priority: '50' - name_en: 'Donations' name_es: 'Donaciones' gem: 'sutty-donaciones-jekyll-theme' @@ -52,7 +52,7 @@ license: 'https://0xacab.org/sutty/jekyll/sutty-donaciones-jekyll-theme/-/blob/master/LICENSE.txt' credits_es: 'Diseñamos esta plantilla para [visibilizar campañas de donaciones](https://sutty.nl/plantilla-para-donaciones/) durante la cuarentena.' credits_en: 'We designed this theme to increase [visibility for donation requests](https://sutty.nl/template-for-donations/) during the quarantine.' - priority: '3' + priority: '80' - name_en: 'Support campaign' name_es: 'Adhesiones' gem: 'adhesiones-jekyll-theme' @@ -63,7 +63,7 @@ credits_es: 'Desarrollamos esta plantilla junto con [Librenauta](https://sutty.nl/plantilla-para-campa%C3%B1as-de-adhesiones/)' credits_en: 'This template was made in collaboration with Librenauta' designer_url: 'https://copiona.com/donaunbit/' - priority: '5' + priority: '60' - name_en: 'Community Radio' name_es: 'Radio comunitaria' gem: 'radios-comunitarias-jekyll-theme' @@ -74,7 +74,7 @@ credits_es: 'Desarrollamos esta plantilla junto con Librenauta en 15 horas :)' credits_en: 'This template was made in collaboration with Librenauta in 15 hours!' designer_url: 'https://copiona.com/donaunbit/' - priority: '4' + priority: '70' - name_en: 'Resource toolkit' name_es: 'Recursero' gem: 'recursero-jekyll-theme' @@ -82,6 +82,7 @@ disabled: true description_en: "We're working towards adding more themes for you to use. [Contact us!](https://sutty.nl/en/#contact)" description_es: "Estamos trabajando para que puedas tener más diseños. [¡Escribinos!](https://sutty.nl/#contacto)" + priority: '3' - name_en: 'More themes' name_es: 'Más plantillas' gem: 'sutty-theme-own' @@ -89,4 +90,4 @@ disabled: true description_en: "We're working towards adding more themes for you to use. [Contact us!](https://sutty.nl/en/#contact)" description_es: "Estamos trabajando para que puedas tener más diseños. [¡Escribinos!](https://sutty.nl/#contacto)" - priority: '9' + priority: '1' From 020fb250b496112265407281be0b003837f13a50 Mon Sep 17 00:00:00 2001 From: f Date: Sat, 15 Apr 2023 15:12:08 -0300 Subject: [PATCH 09/57] fix: #find_each no respeta el orden --- app/views/sites/_form.haml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/views/sites/_form.haml b/app/views/sites/_form.haml index 50391871..69997ffa 100644 --- a/app/views/sites/_form.haml +++ b/app/views/sites/_form.haml @@ -55,7 +55,7 @@ layouts: site.incompatible_layouts.to_sentence) .row.row-cols-1.row-cols-md-2.designs -# Demasiado complejo para un f.collection_radio_buttons - - Design.all.order(priority: :desc).find_each do |design| + - Design.all.order(priority: :desc).each do |design| .design.col.d-flex.flex-column .custom-control.custom-radio = f.radio_button :design_id, design.id, From 2d6e3443d7664a7440eaada0ae3ebfdffb773e9d Mon Sep 17 00:00:00 2001 From: f Date: Sat, 15 Apr 2023 15:16:31 -0300 Subject: [PATCH 10/57] fix: estos cambios tampoco --- db/schema.rb | 7 +------ 1 file changed, 1 insertion(+), 6 deletions(-) diff --git a/db/schema.rb b/db/schema.rb index fd8e5b48..fd82d447 100644 --- a/db/schema.rb +++ b/db/schema.rb @@ -65,11 +65,6 @@ ActiveRecord::Schema.define(version: 2023_04_15_153231) do t.boolean "crawler", default: false t.string "http_referer" t.datetime "created_at", precision: 6 - t.decimal "datacenter_co2" - t.decimal "network_co2" - t.decimal "consumer_device_co2" - t.decimal "production_co2" - t.decimal "total_co2" t.index ["geoip2_data_city_name"], name: "index_access_logs_on_geoip2_data_city_name" t.index ["geoip2_data_country_name"], name: "index_access_logs_on_geoip2_data_country_name" t.index ["host"], name: "index_access_logs_on_host" @@ -108,7 +103,7 @@ ActiveRecord::Schema.define(version: 2023_04_15_153231) do t.string "checksum", null: false t.datetime "created_at", null: false t.string "service_name", null: false - t.index ["key", "service_name"], name: "index_active_storage_blobs_on_key_and_service_name", unique: true + t.index ["key"], name: "index_active_storage_blobs_on_key", unique: true end create_table "active_storage_variant_records", force: :cascade do |t| From 4eb23a787bbdf66fbf9d26d1c44f4413fe0f4ab9 Mon Sep 17 00:00:00 2001 From: f Date: Sat, 15 Apr 2023 18:36:56 -0300 Subject: [PATCH 11/57] feat: lista de links #13096 --- app/controllers/application_controller.rb | 4 +++ app/controllers/build_stats_controller.rb | 41 +++++++++++++++++++++++ app/controllers/posts_controller.rb | 4 --- app/policies/site_build_stat_policy.rb | 16 +++++++++ app/views/build_stats/index.haml | 21 ++++++++++++ config/locales/en.yml | 3 ++ config/locales/es.yml | 3 ++ config/routes.rb | 2 ++ 8 files changed, 90 insertions(+), 4 deletions(-) create mode 100644 app/controllers/build_stats_controller.rb create mode 100644 app/policies/site_build_stat_policy.rb create mode 100644 app/views/build_stats/index.haml diff --git a/app/controllers/application_controller.rb b/app/controllers/application_controller.rb index b4be5a97..ee153394 100644 --- a/app/controllers/application_controller.rb +++ b/app/controllers/application_controller.rb @@ -91,6 +91,10 @@ class ApplicationController < ActionController::Base breadcrumb 'stats.index', root_path, match: :exact end + def site + @site ||= find_site + end + protected def configure_permitted_parameters diff --git a/app/controllers/build_stats_controller.rb b/app/controllers/build_stats_controller.rb new file mode 100644 index 00000000..31a4c5d6 --- /dev/null +++ b/app/controllers/build_stats_controller.rb @@ -0,0 +1,41 @@ +# frozen_string_literal: true + +# La lista de estados de compilación, por ahora solo mostramos el último +# estado. +class BuildStatsController < ApplicationController + include ActionView::Helpers::NumberHelper + include ActionView::Helpers::DateHelper + + before_action :authenticate_usuarie! + + breadcrumb -> { current_usuarie.email }, :edit_usuarie_registration_path + breadcrumb 'sites.index', :sites_path, match: :exact + breadcrumb -> { site.title }, -> { site_posts_path(site, locale: locale) }, match: :exact + + def index + authorize SiteBuildStat.new(site) + breadcrumb I18n.t('build_stats.index.title'), '' + + @headers = %w[type url seconds size].map do |header| + t("deploy_mailer.deployed.th.#{header}") + end + + @table = site.deployment_list.map do |deploy| + type = deploy.class.name.underscore + urls = deploy.respond_to?(:urls) ? deploy.urls : [deploy.url].compact + urls = [nil] if urls.empty? + build_stat = deploy.build_stats.where(status: true).last + seconds = build_stat&.seconds || 0 + + { + title: t("deploy_mailer.deployed.#{type}.title"), + urls: urls, + seconds: { + human: distance_of_time_in_words(seconds), + machine: "PT#{seconds}S" + }, + size: number_to_human_size(build_stat&.bytes || 0, precision: 2) + } + end + end +end diff --git a/app/controllers/posts_controller.rb b/app/controllers/posts_controller.rb index 3c529c24..9720fe13 100644 --- a/app/controllers/posts_controller.rb +++ b/app/controllers/posts_controller.rb @@ -159,10 +159,6 @@ class PostsController < ApplicationController end.transform_keys(&:to_sym) end - def site - @site ||= find_site - end - def post @post ||= site.posts(lang: locale).find(params[:post_id] || params[:id]) end diff --git a/app/policies/site_build_stat_policy.rb b/app/policies/site_build_stat_policy.rb new file mode 100644 index 00000000..03f09d21 --- /dev/null +++ b/app/policies/site_build_stat_policy.rb @@ -0,0 +1,16 @@ +# frozen_string_literal: true + +# Quiénes pueden ver estados de compilación de un sitio +class SiteBuildStatPolicy + attr_reader :site_build_stat, :usuarie + + def initialize(usuarie, site_build_stat) + @usuarie = usuarie + @site_build_stat = site_build_stat + end + + # Todes les usuaries e invitades de este sitio + def index? + site_build_stat.site.usuarie?(usuarie) || site_build_stat.site.invitade?(usuarie) + end +end diff --git a/app/views/build_stats/index.haml b/app/views/build_stats/index.haml new file mode 100644 index 00000000..dab5fc9a --- /dev/null +++ b/app/views/build_stats/index.haml @@ -0,0 +1,21 @@ +%main.row + %aside.menu.col-md-3 + %h1= @site.title + %p.lead= @site.description + .col + %h1= t('.title') + + %table.table + %thead + %tr + - @headers.each do |header| + %th{ scope: 'col' }= header + %tbody + - @table.each do |row| + - row[:urls].each do |url| + %tr + %th{ scope: 'row' }= row[:title] + %td= link_to_if url.present?, url, url + %td + %time{ datetime: row[:seconds][:machine] }= row[:seconds][:human] + %td= row[:size] diff --git a/config/locales/en.yml b/config/locales/en.yml index 3ddf681d..d92aa42a 100644 --- a/config/locales/en.yml +++ b/config/locales/en.yml @@ -697,3 +697,6 @@ en: queries: show: empty: '(empty)' + build_stats: + index: + title: "Publications" diff --git a/config/locales/es.yml b/config/locales/es.yml index 01f1085c..db116e37 100644 --- a/config/locales/es.yml +++ b/config/locales/es.yml @@ -705,3 +705,6 @@ es: queries: show: empty: '(vacío)' + build_stats: + index: + title: "Publicaciones" diff --git a/config/routes.rb b/config/routes.rb index 511ca654..3828915c 100644 --- a/config/routes.rb +++ b/config/routes.rb @@ -75,5 +75,7 @@ Rails.application.routes.draw do get :'stats/host', to: 'stats#host' get :'stats/uris', to: 'stats#uris' get :'stats/resources', to: 'stats#resources' + + resources :build_stats, only: %i[index] end end From 5d541ebee64c34885baba12f7a4370984138f257 Mon Sep 17 00:00:00 2001 From: f Date: Sat, 15 Apr 2023 19:06:20 -0300 Subject: [PATCH 12/57] fixup! feat: lista de links #13096 --- app/models/site_build_stat.rb | 3 +++ 1 file changed, 3 insertions(+) create mode 100644 app/models/site_build_stat.rb diff --git a/app/models/site_build_stat.rb b/app/models/site_build_stat.rb new file mode 100644 index 00000000..1a63a0bb --- /dev/null +++ b/app/models/site_build_stat.rb @@ -0,0 +1,3 @@ +# frozen_string_literal: true + +SiteBuildStat = Struct.new(:site) From 251dde865b534f93a2fd8a090d13676a34d0814f Mon Sep 17 00:00:00 2001 From: f Date: Sat, 15 Apr 2023 19:13:23 -0300 Subject: [PATCH 13/57] fix: siempre devolver un array --- app/models/deploy_distributed_press.rb | 14 ++++++++------ 1 file changed, 8 insertions(+), 6 deletions(-) diff --git a/app/models/deploy_distributed_press.rb b/app/models/deploy_distributed_press.rb index 32a3049e..ff2f7325 100644 --- a/app/models/deploy_distributed_press.rb +++ b/app/models/deploy_distributed_press.rb @@ -85,20 +85,22 @@ class DeployDistributedPress < Deploy private + # @return [Array] def gateway_urls - remote_info.dig(:distributed_press, :links).values.map do |protocol| + remote_info.dig(:distributed_press, :links)&.values&.map do |protocol| [ protocol[:link], protocol[:gateway] ] - end.flatten.compact.select do |link| + end&.flatten&.compact&.select do |link| link.include? '://' - end + end || [] end + # @return [Array] def protocol_urls - remote_info.dig(:distributed_press, :protocols).select do |_, enabled| + remote_info.dig(:distributed_press, :protocols)&.select do |_, enabled| enabled - end.map do |protocol, _| + end&.map do |protocol, _| "#{protocol}://#{site.hostname}" - end + end || [] end # El cliente de la API From 07d6b14b872d50c4bcca1b092a1599eee72a4199 Mon Sep 17 00:00:00 2001 From: f Date: Sat, 15 Apr 2023 19:24:45 -0300 Subject: [PATCH 14/57] fix: cortar los links largos --- app/assets/stylesheets/application.scss | 4 ++++ app/views/build_stats/index.haml | 2 +- 2 files changed, 5 insertions(+), 1 deletion(-) diff --git a/app/assets/stylesheets/application.scss b/app/assets/stylesheets/application.scss index bba48558..fadbcbab 100644 --- a/app/assets/stylesheets/application.scss +++ b/app/assets/stylesheets/application.scss @@ -383,6 +383,8 @@ $bezier: cubic-bezier(0.75, 0, 0.25, 1); } } +.word-break-all { word-break: break-all !important; } + /* * Modificadores de Bootstrap que no tienen versión responsive. */ @@ -405,6 +407,8 @@ $bezier: cubic-bezier(0.75, 0, 0.25, 1); .text-#{$grid-breakpoint}-right { text-align: right !important; } .text-#{$grid-breakpoint}-center { text-align: center !important; } + .word-break-#{$grid-breakpoint}-all { word-break: break-all !important; } + // posición @each $position in $positions { .position-#{$grid-breakpoint}-#{$position} { position: $position !important; } diff --git a/app/views/build_stats/index.haml b/app/views/build_stats/index.haml index dab5fc9a..27dc20d1 100644 --- a/app/views/build_stats/index.haml +++ b/app/views/build_stats/index.haml @@ -15,7 +15,7 @@ - row[:urls].each do |url| %tr %th{ scope: 'row' }= row[:title] - %td= link_to_if url.present?, url, url + %td= link_to_if url.present?, url, url, class: 'word-break-all' %td %time{ datetime: row[:seconds][:machine] }= row[:seconds][:human] %td= row[:size] From 56d5ee3dfec628bd006cdbfb2de7f3230d313f1c Mon Sep 17 00:00:00 2001 From: jazzari Date: Sun, 16 Apr 2023 18:01:17 -0300 Subject: [PATCH 15/57] fix: change key in line 433 from licencia to license in en.yml #13092 --- config/locales/en.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/config/locales/en.yml b/config/locales/en.yml index 3ddf681d..7059b79b 100644 --- a/config/locales/en.yml +++ b/config/locales/en.yml @@ -430,7 +430,7 @@ en: title: 'Design' actions: 'Information about this design' url: 'Demo' - licencia: 'License' + license: 'License' licencia: title: 'License for the site and everything published on it' url: 'Read the license' From 6651781cac78f169cc220d16cc680748694dad72 Mon Sep 17 00:00:00 2001 From: f Date: Mon, 17 Apr 2023 14:45:12 -0300 Subject: [PATCH 16/57] feat: poder ir a la lista de publicaciones del sitio --- app/views/sites/_status.haml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/views/sites/_status.haml b/app/views/sites/_status.haml index a731aa7d..4cf480df 100644 --- a/app/views/sites/_status.haml +++ b/app/views/sites/_status.haml @@ -16,4 +16,4 @@ - link = true = render 'bootstrap/alert' do - = link_to_if link, message.html_safe, site.url, class: 'alert-link' + = link_to_if link, message.html_safe, site_build_stats_path(site), class: 'alert-link' From 31b66373aec1073e1742f33585e568bddf6c7aff Mon Sep 17 00:00:00 2001 From: f Date: Mon, 17 Apr 2023 15:03:00 -0300 Subject: [PATCH 17/57] fix: mejorar el mensaje de espera, dando un accionable --- config/locales/en.yml | 4 ++-- config/locales/es.yml | 4 ++-- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/config/locales/en.yml b/config/locales/en.yml index d92aa42a..76fc20ab 100644 --- a/config/locales/en.yml +++ b/config/locales/en.yml @@ -362,9 +362,9 @@ en: static_file_migration: 'File migration' find_and_replace: 'Search and replace' status: - building: "Your site is building, please wait to refresh this page..." + building: "Your site is building, refresh this page in ." not_published_yet: "Your site is being published for the first time, please wait up to 1 minute..." - available: "Your site is available! Click here to visit it." + available: "Your site is available! Click here to visit find all the different ways to visit it." index: title: 'My Sites' pull: 'Upgrade' diff --git a/config/locales/es.yml b/config/locales/es.yml index db116e37..f4c579f1 100644 --- a/config/locales/es.yml +++ b/config/locales/es.yml @@ -367,9 +367,9 @@ es: static_file_migration: 'Migración de archivos' find_and_replace: 'Búsqueda y reemplazo' status: - building: "Tu sitio se está publicando, por favor espera para recargar esta página..." + building: "Tu sitio se está publicando, recargá esta página en ." not_published_yet: "Tu sitio se está publicando por primera vez, por favor espera hasta un minuto..." - available: "¡Tu sitio está disponible! Cliquea aquí para visitarlo." + available: "¡Tu sitio está disponible! Cliqueá aquí para encontrar todas las formas en que podés visitarlo." index: title: 'Mis sitios' pull: 'Actualizar' From 6b9eead0abfe8b35fcd083d9f7270e2f668628b2 Mon Sep 17 00:00:00 2001 From: jazzari Date: Mon, 17 Apr 2023 15:13:37 -0300 Subject: [PATCH 18/57] fix: search placeholder in index.haml view #13095 --- app/views/posts/index.haml | 3 ++- config/locales/en.yml | 3 ++- config/locales/es.yml | 3 ++- 3 files changed, 6 insertions(+), 3 deletions(-) diff --git a/app/views/posts/index.haml b/app/views/posts/index.haml index 4f814cda..1a12e405 100644 --- a/app/views/posts/index.haml +++ b/app/views/posts/index.haml @@ -49,7 +49,8 @@ - next if param == 'q' %input{ type: 'hidden', name: param, value: value } .form-group.flex-grow-0.m-0 - %input.form-control.border.border-magenta{ type: 'search', placeholder: 'Buscar', name: 'q', value: @filter_params[:q] } + .label.sr-only t('.search') + %input.form-control.border.border-magenta{ type: 'search', placeholder: t('.search'), name: 'q', value: @filter_params[:q] } %input.sr-only{ type: 'submit' } - if @site.locales.size > 1 diff --git a/config/locales/en.yml b/config/locales/en.yml index 3ddf681d..163d6021 100644 --- a/config/locales/en.yml +++ b/config/locales/en.yml @@ -544,7 +544,8 @@ en: remove_filter: 'Back' remove_filter_help: 'Remove the filter: %{filter}' categories: 'Everything' - index: 'Posts' + index: + search: 'search' edit: 'Edit' preview: btn: 'Preliminary version' diff --git a/config/locales/es.yml b/config/locales/es.yml index 01f1085c..b67db8ca 100644 --- a/config/locales/es.yml +++ b/config/locales/es.yml @@ -552,7 +552,8 @@ es: filter: 'Filtrar' remove_filter: 'Volver' remove_filter_help: 'Quitar este filtro: %{filter}' - index: 'Artículos' + index: + search: 'buscar' edit: 'Editar' preview: btn: 'Versión preliminar' From fcbed5003e28953a90d1ac317b5016dd012f74a9 Mon Sep 17 00:00:00 2001 From: jazzari Date: Mon, 17 Apr 2023 16:15:09 -0300 Subject: [PATCH 19/57] fix: add missing sign = in view #13095 --- app/views/posts/index.haml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/views/posts/index.haml b/app/views/posts/index.haml index 1a12e405..ac2932f8 100644 --- a/app/views/posts/index.haml +++ b/app/views/posts/index.haml @@ -49,7 +49,7 @@ - next if param == 'q' %input{ type: 'hidden', name: param, value: value } .form-group.flex-grow-0.m-0 - .label.sr-only t('.search') + .label.sr-only = t('.search') %input.form-control.border.border-magenta{ type: 'search', placeholder: t('.search'), name: 'q', value: @filter_params[:q] } %input.sr-only{ type: 'submit' } From 19bf8fb8bf682381db1815a8f8836cdd564ffae9 Mon Sep 17 00:00:00 2001 From: jazzari Date: Mon, 17 Apr 2023 16:37:10 -0300 Subject: [PATCH 20/57] fix: capitalization en yml & fix in view #13095 --- app/views/posts/index.haml | 2 +- config/locales/en.yml | 2 +- config/locales/es.yml | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/app/views/posts/index.haml b/app/views/posts/index.haml index ac2932f8..bceb0a24 100644 --- a/app/views/posts/index.haml +++ b/app/views/posts/index.haml @@ -49,7 +49,7 @@ - next if param == 'q' %input{ type: 'hidden', name: param, value: value } .form-group.flex-grow-0.m-0 - .label.sr-only = t('.search') + .label.sr-only= t('.search') %input.form-control.border.border-magenta{ type: 'search', placeholder: t('.search'), name: 'q', value: @filter_params[:q] } %input.sr-only{ type: 'submit' } diff --git a/config/locales/en.yml b/config/locales/en.yml index 163d6021..64f596d7 100644 --- a/config/locales/en.yml +++ b/config/locales/en.yml @@ -545,7 +545,7 @@ en: remove_filter_help: 'Remove the filter: %{filter}' categories: 'Everything' index: - search: 'search' + search: 'Search' edit: 'Edit' preview: btn: 'Preliminary version' diff --git a/config/locales/es.yml b/config/locales/es.yml index b67db8ca..6ad61228 100644 --- a/config/locales/es.yml +++ b/config/locales/es.yml @@ -553,7 +553,7 @@ es: remove_filter: 'Volver' remove_filter_help: 'Quitar este filtro: %{filter}' index: - search: 'buscar' + search: 'Buscar' edit: 'Editar' preview: btn: 'Versión preliminar' From 219c0f4fb6837808e415cff5142cae5921bf2916 Mon Sep 17 00:00:00 2001 From: jazzari Date: Mon, 17 Apr 2023 16:47:09 -0300 Subject: [PATCH 21/57] fix: label tag in view #13095 --- app/views/posts/index.haml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/views/posts/index.haml b/app/views/posts/index.haml index bceb0a24..62760e85 100644 --- a/app/views/posts/index.haml +++ b/app/views/posts/index.haml @@ -49,7 +49,7 @@ - next if param == 'q' %input{ type: 'hidden', name: param, value: value } .form-group.flex-grow-0.m-0 - .label.sr-only= t('.search') + %label.sr-only= t('.search') %input.form-control.border.border-magenta{ type: 'search', placeholder: t('.search'), name: 'q', value: @filter_params[:q] } %input.sr-only{ type: 'submit' } From 85f959071912af407bb707cf4956d6211b88f673 Mon Sep 17 00:00:00 2001 From: jazzari Date: Mon, 17 Apr 2023 17:49:39 -0300 Subject: [PATCH 22/57] fix label in view #13095 --- app/views/posts/index.haml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/views/posts/index.haml b/app/views/posts/index.haml index 62760e85..d1a4f84d 100644 --- a/app/views/posts/index.haml +++ b/app/views/posts/index.haml @@ -49,7 +49,7 @@ - next if param == 'q' %input{ type: 'hidden', name: param, value: value } .form-group.flex-grow-0.m-0 - %label.sr-only= t('.search') + %label{for: 'q'}.sr-only= t('.search') %input.form-control.border.border-magenta{ type: 'search', placeholder: t('.search'), name: 'q', value: @filter_params[:q] } %input.sr-only{ type: 'submit' } From 6921a33f61ecd38c6726f9af7f3371e5d4d6009c Mon Sep 17 00:00:00 2001 From: jazzari Date: Mon, 17 Apr 2023 17:59:35 -0300 Subject: [PATCH 23/57] fix: add id to input in view #13095 --- app/views/posts/index.haml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/views/posts/index.haml b/app/views/posts/index.haml index d1a4f84d..60cc6245 100644 --- a/app/views/posts/index.haml +++ b/app/views/posts/index.haml @@ -50,7 +50,7 @@ %input{ type: 'hidden', name: param, value: value } .form-group.flex-grow-0.m-0 %label{for: 'q'}.sr-only= t('.search') - %input.form-control.border.border-magenta{ type: 'search', placeholder: t('.search'), name: 'q', value: @filter_params[:q] } + %input#q.form-control.border.border-magenta{ type: 'search', placeholder: t('.search'), name: 'q', value: @filter_params[:q] } %input.sr-only{ type: 'submit' } - if @site.locales.size > 1 From fbc822ba5ddda3d92a1b50f887756f75618819c6 Mon Sep 17 00:00:00 2001 From: jazzari Date: Mon, 17 Apr 2023 20:02:00 -0300 Subject: [PATCH 24/57] fix: attributes on label in view #13095 --- app/views/posts/index.haml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/views/posts/index.haml b/app/views/posts/index.haml index 60cc6245..9159d5e7 100644 --- a/app/views/posts/index.haml +++ b/app/views/posts/index.haml @@ -49,7 +49,7 @@ - next if param == 'q' %input{ type: 'hidden', name: param, value: value } .form-group.flex-grow-0.m-0 - %label{for: 'q'}.sr-only= t('.search') + %label.sr-only{for: 'q'}= t('.search') %input#q.form-control.border.border-magenta{ type: 'search', placeholder: t('.search'), name: 'q', value: @filter_params[:q] } %input.sr-only{ type: 'submit' } From 6e5fcc17ff25adedbbb9c5f5f4ad1a085cc6ef15 Mon Sep 17 00:00:00 2001 From: f Date: Tue, 18 Apr 2023 17:38:45 -0300 Subject: [PATCH 25/57] fix: palabra sobrante --- config/locales/en.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/config/locales/en.yml b/config/locales/en.yml index 76fc20ab..2423ab61 100644 --- a/config/locales/en.yml +++ b/config/locales/en.yml @@ -364,7 +364,7 @@ en: status: building: "Your site is building, refresh this page in ." not_published_yet: "Your site is being published for the first time, please wait up to 1 minute..." - available: "Your site is available! Click here to visit find all the different ways to visit it." + available: "Your site is available! Click here to find all the different ways to visit it." index: title: 'My Sites' pull: 'Upgrade' From bd48b8561cfbf9a01bde04e41d5a95b76ad63a2b Mon Sep 17 00:00:00 2001 From: f Date: Wed, 19 Apr 2023 18:04:22 -0300 Subject: [PATCH 26/57] fix: no generar urls a partir de los protocolos #13163 porque ipfs es ipns (!) --- app/models/deploy_distributed_press.rb | 10 +--------- 1 file changed, 1 insertion(+), 9 deletions(-) diff --git a/app/models/deploy_distributed_press.rb b/app/models/deploy_distributed_press.rb index 32a3049e..a9494658 100644 --- a/app/models/deploy_distributed_press.rb +++ b/app/models/deploy_distributed_press.rb @@ -80,7 +80,7 @@ class DeployDistributedPress < Deploy # Devuelve las URLs de todos los protocolos def urls - protocol_urls + gateway_urls + gateway_urls end private @@ -93,14 +93,6 @@ class DeployDistributedPress < Deploy end end - def protocol_urls - remote_info.dig(:distributed_press, :protocols).select do |_, enabled| - enabled - end.map do |protocol, _| - "#{protocol}://#{site.hostname}" - end - end - # El cliente de la API # # TODO: cuando soportemos más, tiene que haber una relación entre From 76ddbaf5ab90272daaad862e1e7488ffccc5834f Mon Sep 17 00:00:00 2001 From: f Date: Thu, 20 Apr 2023 18:14:48 -0300 Subject: [PATCH 27/57] =?UTF-8?q?fix:=20vincular=20a=20saber=20m=C3=A1s=20?= =?UTF-8?q?#10449?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- config/locales/en.yml | 2 +- config/locales/es.yml | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/config/locales/en.yml b/config/locales/en.yml index 3ddf681d..941280c0 100644 --- a/config/locales/en.yml +++ b/config/locales/en.yml @@ -302,7 +302,7 @@ en: storage network may continue retaining copies of the data indefinitely. - [Learn more](https://ffdweb.org/building-distributed-press-a-publishing-tool-for-the-decentralized-web/) + [Learn more](https://sutty.nl/learn-more-about-publish-to-dweb-functionality/) stats: index: title: Statistics diff --git a/config/locales/es.yml b/config/locales/es.yml index 01f1085c..af84b474 100644 --- a/config/locales/es.yml +++ b/config/locales/es.yml @@ -307,7 +307,7 @@ es: nodos en la red de almacenamiento distribuida puedan retener copias de tu contenido indefinidamente. - [Saber más (en inglés)](https://ffdweb.org/building-distributed-press-a-publishing-tool-for-the-decentralized-web/) + [Saber más](https://sutty.nl/saber-mas-sobre-publicar-a-la-web-distribuida/) stats: index: title: Estadísticas From f35df41d1be8b0e699246a27091a499c8ff4a752 Mon Sep 17 00:00:00 2001 From: f Date: Thu, 20 Apr 2023 18:17:41 -0300 Subject: [PATCH 28/57] =?UTF-8?q?fix:=20usar=20guionado=20en=20t=C3=ADtulo?= =?UTF-8?q?=20y=20descripci=C3=B3n=20#13160?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- app/assets/stylesheets/application.scss | 2 ++ app/views/posts/index.haml | 6 ++++-- 2 files changed, 6 insertions(+), 2 deletions(-) diff --git a/app/assets/stylesheets/application.scss b/app/assets/stylesheets/application.scss index bba48558..fa07a185 100644 --- a/app/assets/stylesheets/application.scss +++ b/app/assets/stylesheets/application.scss @@ -383,6 +383,8 @@ $bezier: cubic-bezier(0.75, 0, 0.25, 1); } } +.hyphens { hyphens: auto; } + /* * Modificadores de Bootstrap que no tienen versión responsive. */ diff --git a/app/views/posts/index.haml b/app/views/posts/index.haml index 4f814cda..ba8f3ee5 100644 --- a/app/views/posts/index.haml +++ b/app/views/posts/index.haml @@ -1,7 +1,9 @@ %main.row %aside.menu.col-md-3 - %h1= @site.title - %p.lead= @site.description + .hyphens{ lang: @site.default_locale } + %h1= @site.title + %p.lead= @site.description + - cache_if @usuarie, [@site, I18n.locale] do = render 'sites/status', site: @site From 7e8bcc55a11ab2fbdbf5dbba93e3cec6d072aafc Mon Sep 17 00:00:00 2001 From: f Date: Thu, 20 Apr 2023 18:22:00 -0300 Subject: [PATCH 29/57] feat: indicar que se puede publicar el sitio #13178 --- app/models/site/build_stats.rb | 7 +++++++ app/views/sites/_status.haml | 2 ++ config/locales/en.yml | 1 + config/locales/es.yml | 1 + 4 files changed, 11 insertions(+) diff --git a/app/models/site/build_stats.rb b/app/models/site/build_stats.rb index 6eebcc84..64e689b6 100644 --- a/app/models/site/build_stats.rb +++ b/app/models/site/build_stats.rb @@ -40,6 +40,13 @@ class Site def not_published_yet? build_stats.jekyll.where(status: true).count.zero? end + + # Hubo cambios desde la última publicación? + # + # @return [Boolean] + def awaiting_publication? + updated_at > (build_stats.jekyll.where(status: true).last&.created_at || updated_at) + end end end end diff --git a/app/views/sites/_status.haml b/app/views/sites/_status.haml index a731aa7d..2d0de7b9 100644 --- a/app/views/sites/_status.haml +++ b/app/views/sites/_status.haml @@ -1,6 +1,8 @@ - link = nil - if site.not_published_yet? - message = t('.not_published_yet') +- elsif site.awaiting_publication? + - message = t('.awaiting_publication') - if site.building? - if site.average_publication_time_calculable? - average_building_time = site.average_publication_time diff --git a/config/locales/en.yml b/config/locales/en.yml index 3ddf681d..afb470c8 100644 --- a/config/locales/en.yml +++ b/config/locales/en.yml @@ -365,6 +365,7 @@ en: building: "Your site is building, please wait to refresh this page..." not_published_yet: "Your site is being published for the first time, please wait up to 1 minute..." available: "Your site is available! Click here to visit it." + awaiting_publication: "There are unpublished changes. Click the button below and wait a moment to find them on your site." index: title: 'My Sites' pull: 'Upgrade' diff --git a/config/locales/es.yml b/config/locales/es.yml index 01f1085c..d80e2676 100644 --- a/config/locales/es.yml +++ b/config/locales/es.yml @@ -370,6 +370,7 @@ es: building: "Tu sitio se está publicando, por favor espera para recargar esta página..." not_published_yet: "Tu sitio se está publicando por primera vez, por favor espera hasta un minuto..." available: "¡Tu sitio está disponible! Cliquea aquí para visitarlo." + awaiting_publication: "Hay cambios sin publicar, cliqueá el botón debajo y espera un momento para encontrarlos en tu sitio." index: title: 'Mis sitios' pull: 'Actualizar' From 0567e491eedb6c7bf59718b4b684c8c7796b7a53 Mon Sep 17 00:00:00 2001 From: f Date: Thu, 20 Apr 2023 18:22:21 -0300 Subject: [PATCH 30/57] fix: poder ver los mensajes en el orden correcto --- app/views/sites/_status.haml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/views/sites/_status.haml b/app/views/sites/_status.haml index 2d0de7b9..9a671d71 100644 --- a/app/views/sites/_status.haml +++ b/app/views/sites/_status.haml @@ -3,7 +3,7 @@ - message = t('.not_published_yet') - elsif site.awaiting_publication? - message = t('.awaiting_publication') -- if site.building? +- elsif site.building? - if site.average_publication_time_calculable? - average_building_time = site.average_publication_time - elsif !site.similar_sites? From 498c8cc5ad5653631b7d8b9d3133111eb4ce3832 Mon Sep 17 00:00:00 2001 From: f Date: Thu, 20 Apr 2023 21:14:12 -0300 Subject: [PATCH 31/57] fix: usar los posts indexados para obtener la diferencia --- app/models/site/build_stats.rb | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/models/site/build_stats.rb b/app/models/site/build_stats.rb index 64e689b6..63761bae 100644 --- a/app/models/site/build_stats.rb +++ b/app/models/site/build_stats.rb @@ -45,7 +45,7 @@ class Site # # @return [Boolean] def awaiting_publication? - updated_at > (build_stats.jekyll.where(status: true).last&.created_at || updated_at) + waiting? && updated_at >= (indexed_posts.order(updated_at: :desc).select(:updated_at).first&.updated_at || 1.second.ago) end end end From da873d2efe41ae63d5bb3f63eebfdf6e490a2b10 Mon Sep 17 00:00:00 2001 From: f Date: Fri, 21 Apr 2023 12:10:03 -0300 Subject: [PATCH 32/57] =?UTF-8?q?fix:=20detectar=20si=20el=20sitio=20o=20l?= =?UTF-8?q?os=20art=C3=ADculos=20fueron=20modificados=20luego=20de=20publi?= =?UTF-8?q?car?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- app/models/site/build_stats.rb | 41 ++++++++++++++++++++++++++++++++-- 1 file changed, 39 insertions(+), 2 deletions(-) diff --git a/app/models/site/build_stats.rb b/app/models/site/build_stats.rb index 63761bae..23931140 100644 --- a/app/models/site/build_stats.rb +++ b/app/models/site/build_stats.rb @@ -41,11 +41,48 @@ class Site build_stats.jekyll.where(status: true).count.zero? end - # Hubo cambios desde la última publicación? + # Cambios posibles luego de la última publicación exitosa: + # + # * Artículos modificados + # * Configuración modificada + # * Métodos de publicación añadidos # # @return [Boolean] def awaiting_publication? - waiting? && updated_at >= (indexed_posts.order(updated_at: :desc).select(:updated_at).first&.updated_at || 1.second.ago) + waiting? && (post_publication_pending? || configuration_publication_pending?) + end + + # Se modificaron artículos después de publicar el sitio por última + # vez + # + # @return [Boolean] + def post_publication_pending? + last_indexed_post_time > last_publication_time + end + + # Se modificó el sitio después de publicarlo por última vez + # + # @return [Boolean] + def configuration_publication_pending? + updated_at > last_publication_time + end + + private + + # Encuentra el último artículo modificado. Si no hay ninguno, + # devuelve la fecha de modificación del sitio. + # + # @return [Time] + def last_indexed_post_time + indexed_posts.order(updated_at: :desc).select(:updated_at).first&.updated_at || updated_at + end + + # Encuentra la fecha de última publicación exitosa, si no hay + # ninguno, devuelve la fecha de modificación del sitio. + # + # @return [Time] + def last_publication_time + build_stats.jekyll.where(status: true).order(created_at: :desc).select(:created_at).first&.created_at || updated_at end end end From 04c9ff5319000c27f404682d712c2f1738886871 Mon Sep 17 00:00:00 2001 From: f Date: Fri, 21 Apr 2023 12:15:22 -0300 Subject: [PATCH 33/57] =?UTF-8?q?fix:=20detectar=20cambios=20de=20configur?= =?UTF-8?q?aci=C3=B3n=20por=20separado?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- app/models/site/build_stats.rb | 34 ++++++++++++++++++++++++++++------ 1 file changed, 28 insertions(+), 6 deletions(-) diff --git a/app/models/site/build_stats.rb b/app/models/site/build_stats.rb index 23931140..0d1d5a57 100644 --- a/app/models/site/build_stats.rb +++ b/app/models/site/build_stats.rb @@ -49,34 +49,49 @@ class Site # # @return [Boolean] def awaiting_publication? - waiting? && (post_publication_pending? || configuration_publication_pending?) + waiting? && (post_pending? || deploy_pending? || configuration_pending?) end # Se modificaron artículos después de publicar el sitio por última # vez # # @return [Boolean] - def post_publication_pending? + def post_pending? last_indexed_post_time > last_publication_time end # Se modificó el sitio después de publicarlo por última vez # # @return [Boolean] - def configuration_publication_pending? - updated_at > last_publication_time + def deploy_pending? + last_deploy_time > last_publication_time + end + + # Se modificó la configuración del sitio + # + # @return [Boolean] + def configuration_pending? + last_configuration_time > last_publication_time end private - # Encuentra el último artículo modificado. Si no hay ninguno, - # devuelve la fecha de modificación del sitio. + # Encuentra la fecha del último artículo modificado. Si no hay + # ninguno, devuelve la fecha de modificación del sitio. # # @return [Time] def last_indexed_post_time indexed_posts.order(updated_at: :desc).select(:updated_at).first&.updated_at || updated_at end + # Encuentra la fecha de última modificación de los métodos de + # publicación. + # + # @return [Time] + def last_deploy_time + deploys.order(updated_at: :desc).select(:updated_at).first&.updated_at || updated_at + end + # Encuentra la fecha de última publicación exitosa, si no hay # ninguno, devuelve la fecha de modificación del sitio. # @@ -84,6 +99,13 @@ class Site def last_publication_time build_stats.jekyll.where(status: true).order(created_at: :desc).select(:created_at).first&.created_at || updated_at end + + # Fecha de última modificación de la configuración + # + # @return [Time] + def last_configuration_time + File.mtime(config.path) + end end end end From 8ed5aedf757db07da0cbfbabe156913886c1ea5f Mon Sep 17 00:00:00 2001 From: f Date: Fri, 21 Apr 2023 12:31:46 -0300 Subject: [PATCH 34/57] feat: componente de cabecera de sitio --- app/views/posts/index.haml | 4 +--- app/views/sites/_header.haml | 3 +++ 2 files changed, 4 insertions(+), 3 deletions(-) create mode 100644 app/views/sites/_header.haml diff --git a/app/views/posts/index.haml b/app/views/posts/index.haml index ba8f3ee5..dd0bf052 100644 --- a/app/views/posts/index.haml +++ b/app/views/posts/index.haml @@ -1,8 +1,6 @@ %main.row %aside.menu.col-md-3 - .hyphens{ lang: @site.default_locale } - %h1= @site.title - %p.lead= @site.description + = render 'sites/header', site: @site - cache_if @usuarie, [@site, I18n.locale] do = render 'sites/status', site: @site diff --git a/app/views/sites/_header.haml b/app/views/sites/_header.haml new file mode 100644 index 00000000..c8931041 --- /dev/null +++ b/app/views/sites/_header.haml @@ -0,0 +1,3 @@ +.hyphens{ lang: site.default_locale } + %h1= site.title + %p.lead= site.description From f1aefbcb34526a02acdd41b9bba80bcb9de6c4d5 Mon Sep 17 00:00:00 2001 From: f Date: Fri, 21 Apr 2023 12:36:40 -0300 Subject: [PATCH 35/57] fix: guionar titulo y descripciones largas #13096 --- app/views/build_stats/index.haml | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/app/views/build_stats/index.haml b/app/views/build_stats/index.haml index 27dc20d1..27c063f9 100644 --- a/app/views/build_stats/index.haml +++ b/app/views/build_stats/index.haml @@ -1,7 +1,6 @@ %main.row %aside.menu.col-md-3 - %h1= @site.title - %p.lead= @site.description + = render 'sites/header', site: @site .col %h1= t('.title') From 3f4517b4272ee4a3cc10ef7602359f41dc4b79c7 Mon Sep 17 00:00:00 2001 From: f Date: Fri, 21 Apr 2023 12:40:36 -0300 Subject: [PATCH 36/57] fix: no cachear el estado --- app/views/posts/index.haml | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/app/views/posts/index.haml b/app/views/posts/index.haml index 4f814cda..2a0b92f8 100644 --- a/app/views/posts/index.haml +++ b/app/views/posts/index.haml @@ -2,8 +2,7 @@ %aside.menu.col-md-3 %h1= @site.title %p.lead= @site.description - - cache_if @usuarie, [@site, I18n.locale] do - = render 'sites/status', site: @site + = render 'sites/status', site: @site %h3= t('posts.new') %table.mb-3 From 04ad7e2324096378d1aa3ac0489b68e79d05b2ef Mon Sep 17 00:00:00 2001 From: f Date: Fri, 21 Apr 2023 13:47:02 -0300 Subject: [PATCH 37/57] =?UTF-8?q?fix:=20usar=20la=20fecha=20de=20creaci?= =?UTF-8?q?=C3=B3n=20del=20deploy?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit para saber si hubo publicaciones después de su creación. no usamos la fecha de modificación porque la configuración manual solo los crea o los elimina y los métodos pueden automodificarse durante la publicación. --- app/models/site/build_stats.rb | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/models/site/build_stats.rb b/app/models/site/build_stats.rb index 0d1d5a57..071b1eab 100644 --- a/app/models/site/build_stats.rb +++ b/app/models/site/build_stats.rb @@ -89,7 +89,7 @@ class Site # # @return [Time] def last_deploy_time - deploys.order(updated_at: :desc).select(:updated_at).first&.updated_at || updated_at + deploys.order(created_at: :desc).select(:created_at).first&.created_at || updated_at end # Encuentra la fecha de última publicación exitosa, si no hay From 79fd1b7fbbc6e7fcc92c143e775a3490adde187d Mon Sep 17 00:00:00 2001 From: f Date: Fri, 21 Apr 2023 15:24:40 -0300 Subject: [PATCH 38/57] BREAKING CHANGE: usar rsyncd en lugar de ssh #13171 --- app/services/site_service.rb | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/services/site_service.rb b/app/services/site_service.rb index 5d28bf91..d9c7783e 100644 --- a/app/services/site_service.rb +++ b/app/services/site_service.rb @@ -215,7 +215,7 @@ SiteService = Struct.new(:site, :usuarie, :params, keyword_init: true) do # Crea los deploys necesarios para sincronizar a otros nodos de Sutty def sync_nodes Rails.application.nodes.each do |node| - site.deploys.build(type: 'DeployFullRsync', destination: "sutty@#{node}:") + site.deploys.build(type: 'DeployFullRsync', destination: "rsync://#{node}/deploys/") end end From a6bba8c3cbb84051fd709fb45be3eb6ae7e3ce14 Mon Sep 17 00:00:00 2001 From: f Date: Fri, 21 Apr 2023 15:42:16 -0300 Subject: [PATCH 39/57] =?UTF-8?q?fix:=20cambiar=20las=20direcciones=20de?= =?UTF-8?q?=20sincronizaci=C3=B3n=20a=20rsyncd?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...421182627_change_full_rsync_destination.rb | 22 +++++++++++++++++++ 1 file changed, 22 insertions(+) create mode 100644 db/migrate/20230421182627_change_full_rsync_destination.rb diff --git a/db/migrate/20230421182627_change_full_rsync_destination.rb b/db/migrate/20230421182627_change_full_rsync_destination.rb new file mode 100644 index 00000000..47352139 --- /dev/null +++ b/db/migrate/20230421182627_change_full_rsync_destination.rb @@ -0,0 +1,22 @@ +# frozen_string_literal: true + +# Envía los cambios a través de rsyncd +class ChangeFullRsyncDestination < ActiveRecord::Migration[6.1] + def up + DeployFullRsync.find_each do |deploy| + Rails.application.nodes.each do |node| + deploy.destination = "rsync://#{node}/deploys/" + deploy.save + end + end + end + + def down + DeployFullRsync.find_each do |deploy| + Rails.application.nodes.each do |node| + deploy.destination = "sutty@#{node}:" + deploy.save + end + end + end +end From 79398d0448bd707906c2a15e719fc76acb72db98 Mon Sep 17 00:00:00 2001 From: f Date: Fri, 21 Apr 2023 15:44:22 -0300 Subject: [PATCH 40/57] =?UTF-8?q?fixup!=20fix:=20cambiar=20las=20direccion?= =?UTF-8?q?es=20de=20sincronizaci=C3=B3n=20a=20rsyncd?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- db/migrate/20230421182627_change_full_rsync_destination.rb | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/db/migrate/20230421182627_change_full_rsync_destination.rb b/db/migrate/20230421182627_change_full_rsync_destination.rb index 47352139..3a22aea6 100644 --- a/db/migrate/20230421182627_change_full_rsync_destination.rb +++ b/db/migrate/20230421182627_change_full_rsync_destination.rb @@ -5,7 +5,7 @@ class ChangeFullRsyncDestination < ActiveRecord::Migration[6.1] def up DeployFullRsync.find_each do |deploy| Rails.application.nodes.each do |node| - deploy.destination = "rsync://#{node}/deploys/" + deploy.destination = "rsync://rsyncd.#{node}/deploys/" deploy.save end end From 4f74c6f6cad3e62d2841e3811e9f31add3f8b566 Mon Sep 17 00:00:00 2001 From: f Date: Fri, 21 Apr 2023 15:48:09 -0300 Subject: [PATCH 41/57] fix: no configurar ssh para rsyncd --- app/models/deploy_rsync.rb | 1 + 1 file changed, 1 insertion(+) diff --git a/app/models/deploy_rsync.rb b/app/models/deploy_rsync.rb index 1dff2d99..fcc5a65d 100644 --- a/app/models/deploy_rsync.rb +++ b/app/models/deploy_rsync.rb @@ -38,6 +38,7 @@ class DeployRsync < Deploy # # @return [Boolean] def ssh? + return true if destination.start_with? 'rsync://' user, host = user_host ssh_available = false From f1e53c04db1a59d8f15f46e6d839eb21d586d946 Mon Sep 17 00:00:00 2001 From: f Date: Sat, 22 Apr 2023 18:18:30 -0300 Subject: [PATCH 42/57] fix: ir al contenedor de rsyncd --- app/services/site_service.rb | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/services/site_service.rb b/app/services/site_service.rb index d9c7783e..5a2b7dde 100644 --- a/app/services/site_service.rb +++ b/app/services/site_service.rb @@ -215,7 +215,7 @@ SiteService = Struct.new(:site, :usuarie, :params, keyword_init: true) do # Crea los deploys necesarios para sincronizar a otros nodos de Sutty def sync_nodes Rails.application.nodes.each do |node| - site.deploys.build(type: 'DeployFullRsync', destination: "rsync://#{node}/deploys/") + site.deploys.build(type: 'DeployFullRsync', destination: "rsync://rsyncd.#{node}/deploys/") end end From b78dd1661ad1a98be8fdbd535a157d6d16a61eb5 Mon Sep 17 00:00:00 2001 From: f Date: Mon, 24 Apr 2023 14:41:45 -0300 Subject: [PATCH 43/57] fix: guardar el hostname --- app/services/site_service.rb | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/services/site_service.rb b/app/services/site_service.rb index 5a2b7dde..696acd57 100644 --- a/app/services/site_service.rb +++ b/app/services/site_service.rb @@ -215,7 +215,7 @@ SiteService = Struct.new(:site, :usuarie, :params, keyword_init: true) do # Crea los deploys necesarios para sincronizar a otros nodos de Sutty def sync_nodes Rails.application.nodes.each do |node| - site.deploys.build(type: 'DeployFullRsync', destination: "rsync://rsyncd.#{node}/deploys/") + site.deploys.build(type: 'DeployFullRsync', destination: "rsync://rsyncd.#{node}/deploys/", hostname: node) end end From 3a99e1a8677e3a3ec13212394eac6d7418846efe Mon Sep 17 00:00:00 2001 From: f Date: Mon, 24 Apr 2023 14:42:02 -0300 Subject: [PATCH 44/57] fix: usar el hostname como url --- app/models/deploy_full_rsync.rb | 4 ---- 1 file changed, 4 deletions(-) diff --git a/app/models/deploy_full_rsync.rb b/app/models/deploy_full_rsync.rb index b8c48eab..b417470a 100644 --- a/app/models/deploy_full_rsync.rb +++ b/app/models/deploy_full_rsync.rb @@ -27,8 +27,4 @@ class DeployFullRsync < DeployRsync result.present? && result.all? end - - def url - "https://#{user_host.last}/" - end end From 47969cc410c42fe912e5cd0634db54b0f58b26b7 Mon Sep 17 00:00:00 2001 From: f Date: Mon, 24 Apr 2023 14:46:56 -0300 Subject: [PATCH 45/57] fix: no sincronizar los sitios de testeo --- app/services/site_service.rb | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/app/services/site_service.rb b/app/services/site_service.rb index 696acd57..2c29538c 100644 --- a/app/services/site_service.rb +++ b/app/services/site_service.rb @@ -15,7 +15,8 @@ SiteService = Struct.new(:site, :usuarie, :params, keyword_init: true) do add_role temporal: false, rol: 'usuarie' site.deploys.build type: 'DeployLocal' - sync_nodes + # Los sitios de testing no se sincronizan + sync_nodes unless site.name.end_with? '.testing' I18n.with_locale(usuarie.lang.to_sym || I18n.default_locale) do # No se puede llamar a site.config antes de save porque el sitio From 61bc23babec3e4b6ec4f265eccada5e8bd77a4a6 Mon Sep 17 00:00:00 2001 From: f Date: Mon, 24 Apr 2023 14:55:46 -0300 Subject: [PATCH 46/57] feat: agregar nodo en los logs --- db/migrate/20230424174544_add_node_to_access_logs.rb | 8 ++++++++ 1 file changed, 8 insertions(+) create mode 100644 db/migrate/20230424174544_add_node_to_access_logs.rb diff --git a/db/migrate/20230424174544_add_node_to_access_logs.rb b/db/migrate/20230424174544_add_node_to_access_logs.rb new file mode 100644 index 00000000..805fbc27 --- /dev/null +++ b/db/migrate/20230424174544_add_node_to_access_logs.rb @@ -0,0 +1,8 @@ +# frozen_string_literal: true + +# Agrega la columna de nodo a los logs +class AddNodeToAccessLogs < ActiveRecord::Migration[6.1] + def change + add_column :access_logs, :node, :string, index: true + end +end From 1cf5ca5953da4f54f18b2951a2781b325f77d05c Mon Sep 17 00:00:00 2001 From: f Date: Mon, 24 Apr 2023 17:03:38 -0300 Subject: [PATCH 47/57] =?UTF-8?q?fix:=20aceptar=20la=20invitaci=C3=B3n=20a?= =?UTF-8?q?l=20confirmar=20la=20cuenta=20#13247?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- app/models/usuarie.rb | 10 ++++++++++ 1 file changed, 10 insertions(+) diff --git a/app/models/usuarie.rb b/app/models/usuarie.rb index 9b9fd4e6..0dcf917d 100644 --- a/app/models/usuarie.rb +++ b/app/models/usuarie.rb @@ -12,6 +12,7 @@ class Usuarie < ApplicationRecord validates_with EmailAddress::ActiveRecordValidator, field: :email before_create :lang_from_locale! + before_update :accept_invitation_after_confirmation! has_many :roles has_many :sites, through: :roles @@ -54,4 +55,13 @@ class Usuarie < ApplicationRecord def lang_from_locale! self.lang = I18n.locale.to_s end + + # Si le usuarie (re)confirma su cuenta con una invitación pendiente, + # considerarla aceptada también. + def accept_invitation_after_confirmation! + if confirmed? + self.invitation_token = nil + self.invitation_accepted_at ||= Time.now.utc + end + end end From 5c467e08b88d3c0db22d496fee1c7591adfcd3ec Mon Sep 17 00:00:00 2001 From: f Date: Mon, 24 Apr 2023 17:21:24 -0300 Subject: [PATCH 48/57] =?UTF-8?q?fix:=20aceptar=20la=20invitaci=C3=B3n=20t?= =?UTF-8?q?ambi=C3=A9n=20confirma=20el=20correo=20#13247?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit les usuaries que no confirmaron su correo quedaban en un loop si luego eran invitades a un sitio. --- app/models/usuarie.rb | 6 ++++++ app/views/devise/mailer/invitation_instructions.html.haml | 2 +- app/views/devise/mailer/invitation_instructions.text.haml | 2 +- 3 files changed, 8 insertions(+), 2 deletions(-) diff --git a/app/models/usuarie.rb b/app/models/usuarie.rb index 0dcf917d..ef13239b 100644 --- a/app/models/usuarie.rb +++ b/app/models/usuarie.rb @@ -50,6 +50,12 @@ class Usuarie < ApplicationRecord end end + # Les usuaries necesitan link de invitación si no tenían cuenta + # o todavía no la confirmaron + def needs_invitation_link? + (created_by_invite? && !invitation_accepted?) || !confirmed? + end + private def lang_from_locale! diff --git a/app/views/devise/mailer/invitation_instructions.html.haml b/app/views/devise/mailer/invitation_instructions.html.haml index b12cef64..1cdcb2a9 100644 --- a/app/views/devise/mailer/invitation_instructions.html.haml +++ b/app/views/devise/mailer/invitation_instructions.html.haml @@ -8,7 +8,7 @@ %h1= site.title %p= site.description -- if @resource.created_by_invite? && !@resource.invitation_accepted? +- if @resource.needs_invitation_link? %p= link_to t('devise.mailer.invitation_instructions.accept'), accept_invitation_url(@resource, invitation_token: @token, change_locale_to: @resource.lang) diff --git a/app/views/devise/mailer/invitation_instructions.text.haml b/app/views/devise/mailer/invitation_instructions.text.haml index bb496733..eab021ef 100644 --- a/app/views/devise/mailer/invitation_instructions.text.haml +++ b/app/views/devise/mailer/invitation_instructions.text.haml @@ -9,7 +9,7 @@ \ = site.description \ -- if @resource.created_by_invite? && !@resource.invitation_accepted? +- if @resource.needs_invitation_link? = accept_invitation_url(@resource, invitation_token: @token, change_locale_to: @resource.lang) \ - if @resource.invitation_due_at From 229914e8493a158192c5ee9bc10ede0516bbe0cc Mon Sep 17 00:00:00 2001 From: f Date: Mon, 24 Apr 2023 17:44:04 -0300 Subject: [PATCH 49/57] =?UTF-8?q?fix:=20confirmar=20usuaries=20en=20la=20i?= =?UTF-8?q?nvitaci=C3=B3n=20#13247?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- app/controllers/usuaries_controller.rb | 6 ++++++ app/models/usuarie.rb | 4 ++-- app/views/devise/mailer/invitation_instructions.html.haml | 4 ++++ app/views/devise/mailer/invitation_instructions.text.haml | 4 ++++ 4 files changed, 16 insertions(+), 2 deletions(-) diff --git a/app/controllers/usuaries_controller.rb b/app/controllers/usuaries_controller.rb index 9e9cac71..28513e63 100644 --- a/app/controllers/usuaries_controller.rb +++ b/app/controllers/usuaries_controller.rb @@ -96,6 +96,12 @@ class UsuariesController < ApplicationController # XXX: La invitación tiene que ser enviada luego de crear el rol if role.persisted? + # Si es una cuenta manual que no está confirmada aun, + # aprovechar para reconfirmarla. + if !usuarie.confirmed? && !usuarie.created_by_invite? + usuarie.generate_confirmation_token! + end + usuarie.deliver_invitation else raise ArgumentError, role.errors.full_messages diff --git a/app/models/usuarie.rb b/app/models/usuarie.rb index ef13239b..e25a6785 100644 --- a/app/models/usuarie.rb +++ b/app/models/usuarie.rb @@ -51,9 +51,9 @@ class Usuarie < ApplicationRecord end # Les usuaries necesitan link de invitación si no tenían cuenta - # o todavía no la confirmaron + # y todavía no aceptaron la invitación anterior. def needs_invitation_link? - (created_by_invite? && !invitation_accepted?) || !confirmed? + created_by_invite? && !invitation_accepted? end private diff --git a/app/views/devise/mailer/invitation_instructions.html.haml b/app/views/devise/mailer/invitation_instructions.html.haml index 1cdcb2a9..6370ed1a 100644 --- a/app/views/devise/mailer/invitation_instructions.html.haml +++ b/app/views/devise/mailer/invitation_instructions.html.haml @@ -18,5 +18,9 @@ format: :'devise.mailer.invitation_instructions.accept_until_format')) %p= t('devise.mailer.invitation_instructions.ignore') +- elsif !@resource.confirmed? && @resource.confirmation_token + = confirmation_url(@resource, confirmation_token: @token, change_locale_to: @resource.lang) + \ + = t('devise.mailer.invitation_instructions.ignore') - else %p= link_to t('devise.mailer.invitation_instructions.sign_in'), root_url diff --git a/app/views/devise/mailer/invitation_instructions.text.haml b/app/views/devise/mailer/invitation_instructions.text.haml index eab021ef..719c7cd2 100644 --- a/app/views/devise/mailer/invitation_instructions.text.haml +++ b/app/views/devise/mailer/invitation_instructions.text.haml @@ -18,6 +18,10 @@ format: :'devise.mailer.invitation_instructions.accept_until_format')) \ = t('devise.mailer.invitation_instructions.ignore') +- elsif !@resource.confirmed? && @resource.confirmation_token + = confirmation_url(@resource, confirmation_token: @token, change_locale_to: @resource.lang) + \ + = t('devise.mailer.invitation_instructions.ignore') - else = root_url(change_locale_to: @resource.lang) = t('devise.mailer.invitation_instructions.sign_in') From e35d09e343fa79232edeae617de849e958f64781 Mon Sep 17 00:00:00 2001 From: f Date: Mon, 24 Apr 2023 18:07:57 -0300 Subject: [PATCH 50/57] fix: si le usuarie creo su cuenta manualmente no necesita ser invitade --- app/models/usuarie.rb | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/app/models/usuarie.rb b/app/models/usuarie.rb index e25a6785..2bc7a1b5 100644 --- a/app/models/usuarie.rb +++ b/app/models/usuarie.rb @@ -12,6 +12,7 @@ class Usuarie < ApplicationRecord validates_with EmailAddress::ActiveRecordValidator, field: :email before_create :lang_from_locale! + before_update :remove_confirmation_invitation_inconsistencies! before_update :accept_invitation_after_confirmation! has_many :roles @@ -62,6 +63,13 @@ class Usuarie < ApplicationRecord self.lang = I18n.locale.to_s end + # El invitation_token solo es necesario cuando fue creade por otre + # usuarie. De lo contrario lo que queremos es un proceso de + # confirmación. + def remove_confirmation_invitation_inconsistencies! + self.invitation_token = nil unless created_by_invite? + end + # Si le usuarie (re)confirma su cuenta con una invitación pendiente, # considerarla aceptada también. def accept_invitation_after_confirmation! From 3a7c9c6b623f68a445441e58de8b98094401c357 Mon Sep 17 00:00:00 2001 From: f Date: Mon, 24 Apr 2023 18:12:40 -0300 Subject: [PATCH 51/57] =?UTF-8?q?fixup!=20fix:=20confirmar=20usuaries=20en?= =?UTF-8?q?=20la=20invitaci=C3=B3n=20#13247?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- app/controllers/usuaries_controller.rb | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/controllers/usuaries_controller.rb b/app/controllers/usuaries_controller.rb index 28513e63..76d17541 100644 --- a/app/controllers/usuaries_controller.rb +++ b/app/controllers/usuaries_controller.rb @@ -99,7 +99,7 @@ class UsuariesController < ApplicationController # Si es una cuenta manual que no está confirmada aun, # aprovechar para reconfirmarla. if !usuarie.confirmed? && !usuarie.created_by_invite? - usuarie.generate_confirmation_token! + usuarie.send :generate_confirmation_token! end usuarie.deliver_invitation From 838b398f289be22158ea81857d664cebc95398b7 Mon Sep 17 00:00:00 2001 From: f Date: Mon, 24 Apr 2023 18:58:05 -0300 Subject: [PATCH 52/57] =?UTF-8?q?fix:=20cambiar=20el=20token=20de=20confir?= =?UTF-8?q?maci=C3=B3n?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- app/controllers/usuaries_controller.rb | 1 + 1 file changed, 1 insertion(+) diff --git a/app/controllers/usuaries_controller.rb b/app/controllers/usuaries_controller.rb index 76d17541..6924c860 100644 --- a/app/controllers/usuaries_controller.rb +++ b/app/controllers/usuaries_controller.rb @@ -99,6 +99,7 @@ class UsuariesController < ApplicationController # Si es una cuenta manual que no está confirmada aun, # aprovechar para reconfirmarla. if !usuarie.confirmed? && !usuarie.created_by_invite? + usuarie.confirmation_token = nil usuarie.send :generate_confirmation_token! end From 18de36939f50266ba6b1707c41dc769bd51cd65d Mon Sep 17 00:00:00 2001 From: f Date: Mon, 24 Apr 2023 19:00:23 -0300 Subject: [PATCH 53/57] fix: usar el token correcto --- app/views/devise/mailer/invitation_instructions.html.haml | 2 +- app/views/devise/mailer/invitation_instructions.text.haml | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/app/views/devise/mailer/invitation_instructions.html.haml b/app/views/devise/mailer/invitation_instructions.html.haml index 6370ed1a..5c10c433 100644 --- a/app/views/devise/mailer/invitation_instructions.html.haml +++ b/app/views/devise/mailer/invitation_instructions.html.haml @@ -19,7 +19,7 @@ %p= t('devise.mailer.invitation_instructions.ignore') - elsif !@resource.confirmed? && @resource.confirmation_token - = confirmation_url(@resource, confirmation_token: @token, change_locale_to: @resource.lang) + = confirmation_url(@resource, confirmation_token: @resource.confirmation_token, change_locale_to: @resource.lang) \ = t('devise.mailer.invitation_instructions.ignore') - else diff --git a/app/views/devise/mailer/invitation_instructions.text.haml b/app/views/devise/mailer/invitation_instructions.text.haml index 719c7cd2..ee0247a0 100644 --- a/app/views/devise/mailer/invitation_instructions.text.haml +++ b/app/views/devise/mailer/invitation_instructions.text.haml @@ -19,7 +19,7 @@ \ = t('devise.mailer.invitation_instructions.ignore') - elsif !@resource.confirmed? && @resource.confirmation_token - = confirmation_url(@resource, confirmation_token: @token, change_locale_to: @resource.lang) + = confirmation_url(@resource, confirmation_token: @resource.confirmation_token, change_locale_to: @resource.lang) \ = t('devise.mailer.invitation_instructions.ignore') - else From 34947ffd4e9069f787973cfc9fd009ec3f94c394 Mon Sep 17 00:00:00 2001 From: f Date: Mon, 24 Apr 2023 19:01:02 -0300 Subject: [PATCH 54/57] fix: typo --- config/locales/devise_invitable.es.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/config/locales/devise_invitable.es.yml b/config/locales/devise_invitable.es.yml index e83a703c..860ee4f8 100644 --- a/config/locales/devise_invitable.es.yml +++ b/config/locales/devise_invitable.es.yml @@ -22,7 +22,7 @@ es: someone_invited_you: "Alguien te ha invitado a colaborar en %{url}, podés aceptar la invitación con el enlace a continuación." accept: "Aceptar la invitación" accept_until: "La invitación vencerá el %{due_date}." - ignore: "Si no querés aceptar la invitación, por favor ignora este correo. Tu cuenta no será creada hasta que aceptes la invitación y configures una contraseña." + ignore: "Si no querés aceptar la invitación, por favor ignorá este correo. Tu cuenta no será creada hasta que aceptes la invitación y configures una contraseña." sign_in: "Iniciá sesión con tu cuenta para aceptar o rechazar la invitación." time: formats: From 5c44a4f15ee0a6af0fe14664c1d9f7bfe4a9a41c Mon Sep 17 00:00:00 2001 From: f Date: Mon, 24 Apr 2023 19:01:19 -0300 Subject: [PATCH 55/57] fix: el mensaje de ignorar no es el correcto --- app/views/devise/mailer/invitation_instructions.html.haml | 2 -- app/views/devise/mailer/invitation_instructions.text.haml | 2 -- 2 files changed, 4 deletions(-) diff --git a/app/views/devise/mailer/invitation_instructions.html.haml b/app/views/devise/mailer/invitation_instructions.html.haml index 5c10c433..e87d99d9 100644 --- a/app/views/devise/mailer/invitation_instructions.html.haml +++ b/app/views/devise/mailer/invitation_instructions.html.haml @@ -20,7 +20,5 @@ %p= t('devise.mailer.invitation_instructions.ignore') - elsif !@resource.confirmed? && @resource.confirmation_token = confirmation_url(@resource, confirmation_token: @resource.confirmation_token, change_locale_to: @resource.lang) - \ - = t('devise.mailer.invitation_instructions.ignore') - else %p= link_to t('devise.mailer.invitation_instructions.sign_in'), root_url diff --git a/app/views/devise/mailer/invitation_instructions.text.haml b/app/views/devise/mailer/invitation_instructions.text.haml index ee0247a0..5cb007de 100644 --- a/app/views/devise/mailer/invitation_instructions.text.haml +++ b/app/views/devise/mailer/invitation_instructions.text.haml @@ -20,8 +20,6 @@ = t('devise.mailer.invitation_instructions.ignore') - elsif !@resource.confirmed? && @resource.confirmation_token = confirmation_url(@resource, confirmation_token: @resource.confirmation_token, change_locale_to: @resource.lang) - \ - = t('devise.mailer.invitation_instructions.ignore') - else = root_url(change_locale_to: @resource.lang) = t('devise.mailer.invitation_instructions.sign_in') From fb7fb080d1628aaa6fd87eefccdb6dd8f6d48bea Mon Sep 17 00:00:00 2001 From: f Date: Tue, 25 Apr 2023 13:12:07 -0300 Subject: [PATCH 56/57] =?UTF-8?q?feat:=20vincular=20al=20formulario=20de?= =?UTF-8?q?=20contacto=20desde=20la=20p=C3=A1gina=20de=20error?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- public/500.html | 12 ++++++++++-- 1 file changed, 10 insertions(+), 2 deletions(-) diff --git a/public/500.html b/public/500.html index 2d69baf6..9e8ea780 100644 --- a/public/500.html +++ b/public/500.html @@ -19,7 +19,11 @@

Gracias por ayudarnos a encontrar errores :)

-

Volver al panel

+

+ Volver al panel + | + Contáctanos +

@@ -31,7 +35,11 @@

Thanks for helping us in finding errors! :)

-

Go back to panel

+

+ Go back to panel + | + Contact us +

From 0b2cc38691356fcac3dc1cbf86c3aeada5417773 Mon Sep 17 00:00:00 2001 From: f Date: Tue, 25 Apr 2023 13:14:29 -0300 Subject: [PATCH 57/57] =?UTF-8?q?feat:=20bot=C3=B3n=20de=20contacto?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- app/views/layouts/_breadcrumb.haml | 4 ++++ config/locales/en.yml | 2 ++ config/locales/es.yml | 2 ++ 3 files changed, 8 insertions(+) diff --git a/app/views/layouts/_breadcrumb.haml b/app/views/layouts/_breadcrumb.haml index b1c42cb2..6281404a 100644 --- a/app/views/layouts/_breadcrumb.haml +++ b/app/views/layouts/_breadcrumb.haml @@ -19,6 +19,10 @@ = link_to t('.tienda'), @site.tienda_url, role: 'button', class: 'btn' + %li.nav-item + = link_to t('.contact_us'), t('.contact_us_href'), + class: 'btn', rel: 'me', target: '_blank' + %li.nav-item = link_to t('.logout'), main_app.destroy_usuarie_session_path, method: :delete, role: 'button', class: 'btn' diff --git a/config/locales/en.yml b/config/locales/en.yml index 941280c0..5b65f42e 100644 --- a/config/locales/en.yml +++ b/config/locales/en.yml @@ -206,6 +206,8 @@ en: title: 'Your location in Sutty' logout: Log out mutual_aid: Mutual aid + contact_us: "Contact us" + contact_us_href: "https://sutty.nl/en/#contact" collaborations: collaborate: submit: Register diff --git a/config/locales/es.yml b/config/locales/es.yml index af84b474..bef67311 100644 --- a/config/locales/es.yml +++ b/config/locales/es.yml @@ -206,6 +206,8 @@ es: title: 'Tu ubicación en Sutty' logout: Cerrar sesión mutual_aid: Ayuda mutua + contact_us: "Contacto" + contact_us_href: "https://sutty.nl/#contacto" collaborations: collaborate: submit: Registrarme