-
Notifications
You must be signed in to change notification settings - Fork 7
Correction des timezones des RDV dans l’API #6207
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
base: production
Are you sure you want to change the base?
Changes from all commits
File filter
Filter by extension
Conversations
Jump to
Diff view
Diff view
There are no files selected for viewing
| Original file line number | Diff line number | Diff line change |
|---|---|---|
| @@ -1,7 +1,7 @@ | ||
| class RdvBlueprint < Blueprinter::Base | ||
| identifier :id | ||
|
|
||
| fields :uuid, :status, :starts_at, :ends_at, :duration_in_min, :address, :context, :cancelled_at, | ||
| fields :uuid, :status, :duration_in_min, :address, :context, :cancelled_at, | ||
| :max_participants_count, :users_count, :name, :collectif, :created_by_type, :created_by_id, :created_at, | ||
| :visio_url | ||
|
|
||
|
|
@@ -21,6 +21,22 @@ class RdvBlueprint < Blueprinter::Base | |
| Rails.application.routes.url_helpers.agents_rdv_url(rdv, host: rdv.domain.host_name) | ||
| end | ||
|
|
||
| field :starts_at do |rdv, _options| | ||
| if rdv.motif.organisation.time_zone | ||
|
Collaborator
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. Question de perf : est-ce que le motif et l'orga est préloadé ? D'ailleurs on peut direct choper l'orga car les |
||
| rdv.starts_at.in_time_zone(rdv.motif.organisation.time_zone) | ||
|
Collaborator
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. Cette implémentation continue de retourner à peu près la même valeur fausse, simplement sous une autre forme.
Avec ce nouveau code, nous allons avoir cet effet : Time.zone.parse("2026-02-28 14:30").in_time_zone("America/Guadeloupe").to_s
=> "2026-02-28 09:30:00 -0400"Cette valeur correspond au même instant erroné que celui que l'API renvoie actuellement, juste formaté pour exprimer qu'il a lieu en Ce que nous voulons faire plutôt, c'est savoir que nous stockons en base une heure naïve, et nous le faisons en utilisant l'heure locale de Paris. Pour convertir cette heure naïve en heure locale guadeloupéenne, il faut l’interpréter naïvement dans la timezone guadeloupéenne : Nous avons bien une représentation de l'instant auquel le RDV a lieu : aujourd'hui à 14h30 en Guadeloupe.
Member
Author
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. Tu as raison, je suis allé beaucoup trop vite sur le sujet, et j’ai pondu ce truc erroné. |
||
| else | ||
| rdv.starts_at | ||
| end | ||
| end | ||
|
|
||
| field :ends_at do |rdv, _options| | ||
| if rdv.motif.organisation.time_zone | ||
| rdv.ends_at.in_time_zone(rdv.motif.organisation.time_zone) | ||
| else | ||
| rdv.ends_at | ||
| end | ||
| end | ||
|
|
||
| # On permet des associations optionnelles, mais on les charge toutes si le paramètre `include` n'est pas utilisé | ||
| def self.conditional_association(association_name, blueprint_class) | ||
| field(association_name, if: ->(_field_name, _rdv, options) { !options["include"].is_a?(Array) || association_name.to_s.in?(options["include"]) }) do |rdv, _options| | ||
|
|
||
| Original file line number | Diff line number | Diff line change |
|---|---|---|
|
|
@@ -104,6 +104,25 @@ | |
| expect(rdv).not_to have_key("organisation") | ||
| end | ||
| end | ||
|
|
||
| describe "utilise la bonne timezone" do | ||
| context "lorsque la timezone de l'organisation n'est pas définie" do | ||
| it "utilise la timezone de l'instance" do | ||
| get "/api/v1/rdvs", headers: headers, params: { user_id: user.id, agent_id: agent.id }, as: :json | ||
| expect(parsed_response_body["rdvs"].first["starts_at"]).to eq rdv_with_user_and_agent.starts_at.to_s | ||
| expect(parsed_response_body["rdvs"].first["ends_at"]).to eq rdv_with_user_and_agent.ends_at.to_s | ||
| end | ||
| end | ||
|
|
||
| context "lorsque la timezone de l'organisation est définie" do | ||
| let(:organisation) { create(:organisation, time_zone: "America/Guadeloupe") } | ||
|
|
||
| it "utilise la timezone de l'organisation" do | ||
| get "/api/v1/rdvs", headers: headers, params: { user_id: user.id, agent_id: agent.id }, as: :json | ||
| expect(parsed_response_body["rdvs"].first["ends_at"]).to eq rdv_with_user_and_agent.ends_at.in_time_zone("America/Guadeloupe").to_s | ||
| end | ||
| end | ||
| end | ||
|
Comment on lines
+107
to
+125
Collaborator
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. Ces tests n'explicitent pas le comportement attendu, mais vérifient uniquement que l'on utilise Est-on d'accord que le comportement attendu est celui-ci ? describe "utilise la bonne timezone" do
context "lorsque la timezone de l'organisation n'est pas définie" do
it "utilise la timezone de l'instance" do
rdv = create(:rdv, starts_at: ActiveSupport::TimeZone["Paris"].parse("2026-02-28 14:30"), organisation:, agents: [agent])
get "/api/v1/rdvs", headers: headers, params: { agent_id: agent.id }, as: :json
api_rdv = parsed_response_body["rdvs"].find { _1["id"].to_i == rdv.id }
expect(api_rdv["starts_at"]).to eq "2026-02-28 14:30:00 +0100"
expect(api_rdv["ends_at"]).to eq "2026-02-28 15:15:00 +0100"
end
end
context "lorsque la timezone de l'organisation est définie" do
let(:organisation) { create(:organisation, time_zone: "America/Guadeloupe") }
it "utilise la timezone de l'organisation" do
rdv = create(:rdv, starts_at: ActiveSupport::TimeZone["Paris"].parse("2026-02-28 14:30"), organisation:, agents: [agent])
get "/api/v1/rdvs", headers: headers, params: { agent_id: agent.id }, as: :json
api_rdv = parsed_response_body["rdvs"].find { _1["id"].to_i == rdv.id }
expect(api_rdv["starts_at"]).to eq "2026-02-28 14:30:00 -0400"
expect(api_rdv["ends_at"]).to eq "2026-02-28 15:15:00 -0400"
end
end
end |
||
| end | ||
|
|
||
| describe "#create" do | ||
|
|
||
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Il faudra aussi modifier
RdvPlanBlueprintqui retournerdv.starts_at. Peut-être que ça incite à mettre ces logiques de gestion de timezone dans un module séparé qui explique le problème.