Skip to content

Commit

Permalink
Merge with master
Browse files Browse the repository at this point in the history
  • Loading branch information
amanda-anderson committed Nov 24, 2023
2 parents 4cba3f3 + 9d62043 commit b6d86fd
Show file tree
Hide file tree
Showing 251 changed files with 6,227 additions and 1,985 deletions.
1 change: 1 addition & 0 deletions back/Gemfile.lock
Original file line number Diff line number Diff line change
Expand Up @@ -282,6 +282,7 @@ PATH
remote: engines/commercial/report_builder
specs:
report_builder (0.1.0)
analytics
content_builder
rails (~> 7.0)

Expand Down
2 changes: 1 addition & 1 deletion back/app/controllers/omniauth_callback_controller.rb
Original file line number Diff line number Diff line change
Expand Up @@ -190,7 +190,7 @@ def update_user!(auth, user, authver_method)
attrs = authver_method.updateable_user_attrs
update_hash = authver_method.profile_to_user_attrs(auth).slice(*attrs).compact
update_hash.delete(:remote_avatar_url) if user.avatar.present? # don't overwrite avatar if already present
user.confirm! # confirm user email if not already confirmed
user.confirm! if authver_method.email_confirmed?(auth) # confirm user email if not already confirmed

if authver_method.overwrite_user_attrs?
user.update_merging_custom_fields!(update_hash)
Expand Down
4 changes: 4 additions & 0 deletions back/app/models/phase.rb
Original file line number Diff line number Diff line change
Expand Up @@ -127,6 +127,10 @@ def previous_phase_end_at_updated?
@previous_phase_end_at_updated || false
end

def started?
start_at <= Time.zone.now
end

private

def sanitize_description_multiloc
Expand Down
8 changes: 7 additions & 1 deletion back/app/policies/user_policy.rb
Original file line number Diff line number Diff line change
Expand Up @@ -103,10 +103,16 @@ def view_private_attributes?
!!((user && (instance&.id == user.id || user.admin?)) || instance&.invite_pending?)
end

def permitted_attributes
def permitted_attributes_for_create
[:email] + shared_permitted_attributes
end

def permitted_attributes_for_update
shared_permitted_attributes.tap do |attrs|
attrs.push :email if !AppConfiguration.instance.feature_activated?('user_confirmation')
end
end

private

def shared_permitted_attributes
Expand Down
4 changes: 2 additions & 2 deletions back/config/locales/fr-BE.yml
Original file line number Diff line number Diff line change
Expand Up @@ -227,8 +227,8 @@ fr-BE:
description: "Veuillez soumettre vos réponses en sélectionnant « Envoyer l'enquête » ci-dessous."
pdf_export:
personal_data: 'Données personnelles'
personal_data_explanation_ideation: "Nous soumettrons votre contribution à la plateforme de participation en ligne %{organizationName}. Si vous souhaitez que votre nom soit affiché en tant qu'auteur de cette contribution et que vous receviez par courriel les mises à jour relatives à votre contribution, veuillez remplir les champs suivants sur cette page et nous créerons un compte pour vous. Votre adresse électronique ne sera pas rendue publique et ne sera utilisée que par %{organizationName}. Si vous souhaitez rester anonyme ou si vous n'acceptez pas que nous utilisions vos données personnelles de cette manière, vous pouvez laisser ces champs vides."
personal_data_explanation_native_survey: "Nous soumettrons votre contribution à la plateforme de participation en ligne %{organizationName}. Si vous souhaitez recevoir par courriel les mises à jour relatives à votre contribution, veuillez remplir les champs suivants sur cette page et nous créerons un compte pour vous. Vos données ne seront pas rendues publiques et ne seront utilisées que par %{organizationName}. Si vous n'acceptez pas que nous utilisions vos données personnelles de cette manière, vous pouvez les laisser vides."
personal_data_explanation_ideation: "Cette contribution sera soumise sur la plateforme de participation en ligne de %{organizationName}. Si vous souhaitez que votre nom soit affiché en tant qu'auteur et recevoir par e-mail des mises à jours concernant votre soumission, veuillez remplir les champs suivants et nous créerons un compte pour vous. Votre adresse e-mail ne sera pas publique et ne sera uniquement utilisée par %{organizationName}. Si vous préférez rester anonyme ou ne souhaitez pas que nous utilisions vos données personnelles à cette fin, vous pouvez laisser ces champs vides."
personal_data_explanation_native_survey: "Vos réponses seront enregistrées sur la plateforme de participation en ligne de %{organizationName}. Si vous souhaitez recevoir des mises à jour concernant le projet par e-mail, veuillez remplir les champs suivants et nous créerons un compte pour vous. Vos données ne seront pas publiques et ne seront utilisées que par %{organizationName}. Si vous ne souhaitez pas que nous utilisions vos données personnelles à cette fin, vous pouvez laisser ces champs vides."
first_name: 'Prénom'
last_name: 'Nom'
email_address: 'Adresse e-mail'
Expand Down
4 changes: 2 additions & 2 deletions back/config/locales/fr-FR.yml
Original file line number Diff line number Diff line change
Expand Up @@ -227,8 +227,8 @@ fr:
description: "Veuillez soumettre vos réponses en sélectionnant « Envoyer l'enquête » ci-dessous."
pdf_export:
personal_data: 'Données personnelles'
personal_data_explanation_ideation: "Nous soumettrons votre contribution à la plateforme de participation en ligne %{organizationName}. Si vous souhaitez que votre nom soit affiché en tant qu'auteur de cette contribution et que vous receviez par courriel les mises à jour relatives à votre contribution, veuillez remplir les champs suivants sur cette page et nous créerons un compte pour vous. Votre adresse électronique ne sera pas rendue publique et ne sera utilisée que par %{organizationName}. Si vous souhaitez rester anonyme ou si vous n'acceptez pas que nous utilisions vos données personnelles de cette manière, vous pouvez laisser ces champs vides."
personal_data_explanation_native_survey: "Nous soumettrons votre contribution à la plateforme de participation en ligne %{organizationName}. Si vous souhaitez recevoir par courriel les mises à jour relatives à votre contribution, veuillez remplir les champs suivants sur cette page et nous créerons un compte pour vous. Vos données ne seront pas rendues publiques et ne seront utilisées que par %{organizationName}. Si vous n'acceptez pas que nous utilisions vos données personnelles de cette manière, vous pouvez les laisser vides."
personal_data_explanation_ideation: "Cette contribution sera soumise sur la plateforme de participation en ligne de %{organizationName}. Si vous souhaitez que votre nom soit affiché en tant qu'auteur et recevoir par e-mail des mises à jours concernant votre soumission, veuillez remplir les champs suivants et nous créerons un compte pour vous. Votre adresse e-mail ne sera pas publique et ne sera uniquement utilisée par %{organizationName}. Si vous préférez rester anonyme ou ne souhaitez pas que nous utilisions vos données personnelles à cette fin, vous pouvez laisser ces champs vides."
personal_data_explanation_native_survey: "Vos réponses seront enregistrées sur la plateforme de participation en ligne de %{organizationName}. Si vous souhaitez recevoir des mises à jour concernant le projet par e-mail, veuillez remplir les champs suivants et nous créerons un compte pour vous. Vos données ne seront pas publiques et ne seront utilisées que par %{organizationName}. Si vous ne souhaitez pas que nous utilisions vos données personnelles à cette fin, vous pouvez laisser ces champs vides."
first_name: 'Prénom'
last_name: 'Nom'
email_address: 'Adresse e-mail'
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,8 @@
# frozen_string_literal: true

# This migration comes from analytics (originally 20231031174154)
class CreateDimensionUserCustomFieldValues < ActiveRecord::Migration[7.0]
def change
create_view :analytics_dimension_user_custom_field_values
end
end
Original file line number Diff line number Diff line change
@@ -0,0 +1,13 @@
class CreatePublishedGraphDataUnits < ActiveRecord::Migration[7.0]
def change
create_table :report_builder_published_graph_data_units, id: :uuid do |t|
t.uuid :report_id, null: false, index: { name: :report_builder_published_data_units_report_id_idx }
t.foreign_key :report_builder_reports, column: :report_id

t.string :graph_id, null: false
t.jsonb :data, null: false

t.timestamps
end
end
end
122 changes: 91 additions & 31 deletions back/db/structure.sql
Original file line number Diff line number Diff line change
Expand Up @@ -14,6 +14,7 @@ ALTER TABLE IF EXISTS ONLY public.ideas_topics DROP CONSTRAINT IF EXISTS fk_rail
ALTER TABLE IF EXISTS ONLY public.events_attendances DROP CONSTRAINT IF EXISTS fk_rails_fba307ba3b;
ALTER TABLE IF EXISTS ONLY public.comments DROP CONSTRAINT IF EXISTS fk_rails_f44b1e3c8a;
ALTER TABLE IF EXISTS ONLY public.insights_text_networks DROP CONSTRAINT IF EXISTS fk_rails_f3e4924881;
ALTER TABLE IF EXISTS ONLY public.report_builder_published_graph_data_units DROP CONSTRAINT IF EXISTS fk_rails_f21a19c203;
ALTER TABLE IF EXISTS ONLY public.idea_files DROP CONSTRAINT IF EXISTS fk_rails_efb12f53ad;
ALTER TABLE IF EXISTS ONLY public.insights_zeroshot_classification_tasks_inputs DROP CONSTRAINT IF EXISTS fk_rails_ee8a3a2c3d;
ALTER TABLE IF EXISTS ONLY public.static_pages_topics DROP CONSTRAINT IF EXISTS fk_rails_edc8786515;
Expand Down Expand Up @@ -141,6 +142,7 @@ DROP TRIGGER IF EXISTS que_state_notify ON public.que_jobs;
DROP TRIGGER IF EXISTS que_job_notify ON public.que_jobs;
DROP INDEX IF EXISTS public.users_unique_lower_email_idx;
DROP INDEX IF EXISTS public.spam_reportable_index;
DROP INDEX IF EXISTS public.report_builder_published_data_units_report_id_idx;
DROP INDEX IF EXISTS public.que_poll_idx_with_job_schema_version;
DROP INDEX IF EXISTS public.que_poll_idx;
DROP INDEX IF EXISTS public.que_jobs_data_gin_idx;
Expand Down Expand Up @@ -431,6 +433,7 @@ ALTER TABLE IF EXISTS ONLY public.static_pages_topics DROP CONSTRAINT IF EXISTS
ALTER TABLE IF EXISTS ONLY public.spam_reports DROP CONSTRAINT IF EXISTS spam_reports_pkey;
ALTER TABLE IF EXISTS ONLY public.schema_migrations DROP CONSTRAINT IF EXISTS schema_migrations_pkey;
ALTER TABLE IF EXISTS ONLY public.report_builder_reports DROP CONSTRAINT IF EXISTS report_builder_reports_pkey;
ALTER TABLE IF EXISTS ONLY public.report_builder_published_graph_data_units DROP CONSTRAINT IF EXISTS report_builder_published_graph_data_units_pkey;
ALTER TABLE IF EXISTS ONLY public.que_values DROP CONSTRAINT IF EXISTS que_values_pkey;
ALTER TABLE IF EXISTS ONLY public.que_lockers DROP CONSTRAINT IF EXISTS que_lockers_pkey;
ALTER TABLE IF EXISTS ONLY public.que_jobs DROP CONSTRAINT IF EXISTS que_jobs_pkey;
Expand Down Expand Up @@ -560,6 +563,7 @@ DROP TABLE IF EXISTS public.static_page_files;
DROP TABLE IF EXISTS public.spam_reports;
DROP TABLE IF EXISTS public.schema_migrations;
DROP TABLE IF EXISTS public.report_builder_reports;
DROP TABLE IF EXISTS public.report_builder_published_graph_data_units;
DROP TABLE IF EXISTS public.que_values;
DROP TABLE IF EXISTS public.que_lockers;
DROP SEQUENCE IF EXISTS public.que_jobs_id_seq;
Expand Down Expand Up @@ -631,7 +635,6 @@ DROP TABLE IF EXISTS public.email_campaigns_consents;
DROP TABLE IF EXISTS public.email_campaigns_campaigns_groups;
DROP TABLE IF EXISTS public.email_campaigns_campaign_email_commands;
DROP TABLE IF EXISTS public.custom_forms;
DROP TABLE IF EXISTS public.custom_fields;
DROP TABLE IF EXISTS public.custom_field_options;
DROP TABLE IF EXISTS public.cosponsors_initiatives;
DROP TABLE IF EXISTS public.content_builder_layouts;
Expand Down Expand Up @@ -669,7 +672,9 @@ DROP VIEW IF EXISTS public.analytics_fact_email_deliveries;
DROP TABLE IF EXISTS public.email_campaigns_deliveries;
DROP TABLE IF EXISTS public.email_campaigns_campaigns;
DROP VIEW IF EXISTS public.analytics_dimension_users;
DROP VIEW IF EXISTS public.analytics_dimension_user_custom_field_values;
DROP TABLE IF EXISTS public.users;
DROP TABLE IF EXISTS public.custom_fields;
DROP TABLE IF EXISTS public.analytics_dimension_types;
DROP VIEW IF EXISTS public.analytics_dimension_statuses;
DROP TABLE IF EXISTS public.initiative_statuses;
Expand Down Expand Up @@ -1356,6 +1361,36 @@ CREATE TABLE public.analytics_dimension_types (
);


--
-- Name: custom_fields; Type: TABLE; Schema: public; Owner: -
--

CREATE TABLE public.custom_fields (
id uuid DEFAULT shared_extensions.gen_random_uuid() NOT NULL,
resource_type character varying,
key character varying,
input_type character varying,
title_multiloc jsonb DEFAULT '{}'::jsonb,
description_multiloc jsonb DEFAULT '{}'::jsonb,
required boolean DEFAULT false,
ordering integer,
created_at timestamp without time zone NOT NULL,
updated_at timestamp without time zone NOT NULL,
enabled boolean DEFAULT true NOT NULL,
code character varying,
resource_id uuid,
hidden boolean DEFAULT false NOT NULL,
maximum integer,
minimum_label_multiloc jsonb DEFAULT '{}'::jsonb NOT NULL,
maximum_label_multiloc jsonb DEFAULT '{}'::jsonb NOT NULL,
logic jsonb DEFAULT '{}'::jsonb NOT NULL,
answer_visible_to character varying,
select_count_enabled boolean DEFAULT false NOT NULL,
maximum_select_count integer,
minimum_select_count integer
);


--
-- Name: users; Type: TABLE; Schema: public; Owner: -
--
Expand Down Expand Up @@ -1395,6 +1430,22 @@ CREATE TABLE public.users (
);


--
-- Name: analytics_dimension_user_custom_field_values; Type: VIEW; Schema: public; Owner: -
--

CREATE VIEW public.analytics_dimension_user_custom_field_values AS
SELECT DISTINCT u.id AS dimension_user_id,
cf.key,
cf.value
FROM ((public.users u
LEFT JOIN LATERAL ( SELECT custom_fields.key,
(u.custom_field_values ->> (custom_fields.key)::text) AS value
FROM public.custom_fields
WHERE ((custom_fields.resource_type)::text = 'User'::text)) cf ON (true))
LEFT JOIN LATERAL ( SELECT jsonb_object_keys(u.custom_field_values) AS key) cfv ON (true));


--
-- Name: analytics_dimension_users; Type: VIEW; Schema: public; Owner: -
--
Expand Down Expand Up @@ -2152,36 +2203,6 @@ CREATE TABLE public.custom_field_options (
);


--
-- Name: custom_fields; Type: TABLE; Schema: public; Owner: -
--

CREATE TABLE public.custom_fields (
id uuid DEFAULT shared_extensions.gen_random_uuid() NOT NULL,
resource_type character varying,
key character varying,
input_type character varying,
title_multiloc jsonb DEFAULT '{}'::jsonb,
description_multiloc jsonb DEFAULT '{}'::jsonb,
required boolean DEFAULT false,
ordering integer,
created_at timestamp without time zone NOT NULL,
updated_at timestamp without time zone NOT NULL,
enabled boolean DEFAULT true NOT NULL,
code character varying,
resource_id uuid,
hidden boolean DEFAULT false NOT NULL,
maximum integer,
minimum_label_multiloc jsonb DEFAULT '{}'::jsonb NOT NULL,
maximum_label_multiloc jsonb DEFAULT '{}'::jsonb NOT NULL,
logic jsonb DEFAULT '{}'::jsonb NOT NULL,
answer_visible_to character varying,
select_count_enabled boolean DEFAULT false NOT NULL,
maximum_select_count integer,
minimum_select_count integer
);


--
-- Name: custom_forms; Type: TABLE; Schema: public; Owner: -
--
Expand Down Expand Up @@ -3316,6 +3337,20 @@ CREATE TABLE public.que_values (
WITH (fillfactor='90');


--
-- Name: report_builder_published_graph_data_units; Type: TABLE; Schema: public; Owner: -
--

CREATE TABLE public.report_builder_published_graph_data_units (
id uuid DEFAULT shared_extensions.gen_random_uuid() NOT NULL,
report_id uuid NOT NULL,
graph_id character varying NOT NULL,
data jsonb NOT NULL,
created_at timestamp(6) without time zone NOT NULL,
updated_at timestamp(6) without time zone NOT NULL
);


--
-- Name: report_builder_reports; Type: TABLE; Schema: public; Owner: -
--
Expand Down Expand Up @@ -4489,6 +4524,14 @@ ALTER TABLE ONLY public.que_values
ADD CONSTRAINT que_values_pkey PRIMARY KEY (key);


--
-- Name: report_builder_published_graph_data_units report_builder_published_graph_data_units_pkey; Type: CONSTRAINT; Schema: public; Owner: -
--

ALTER TABLE ONLY public.report_builder_published_graph_data_units
ADD CONSTRAINT report_builder_published_graph_data_units_pkey PRIMARY KEY (id);


--
-- Name: report_builder_reports report_builder_reports_pkey; Type: CONSTRAINT; Schema: public; Owner: -
--
Expand Down Expand Up @@ -6535,6 +6578,13 @@ CREATE INDEX que_poll_idx ON public.que_jobs USING btree (queue, priority, run_a
CREATE INDEX que_poll_idx_with_job_schema_version ON public.que_jobs USING btree (job_schema_version, queue, priority, run_at, id) WHERE ((finished_at IS NULL) AND (expired_at IS NULL));


--
-- Name: report_builder_published_data_units_report_id_idx; Type: INDEX; Schema: public; Owner: -
--

CREATE INDEX report_builder_published_data_units_report_id_idx ON public.report_builder_published_graph_data_units USING btree (report_id);


--
-- Name: spam_reportable_index; Type: INDEX; Schema: public; Owner: -
--
Expand Down Expand Up @@ -7547,6 +7597,14 @@ ALTER TABLE ONLY public.idea_files
ADD CONSTRAINT fk_rails_efb12f53ad FOREIGN KEY (idea_id) REFERENCES public.ideas(id);


--
-- Name: report_builder_published_graph_data_units fk_rails_f21a19c203; Type: FK CONSTRAINT; Schema: public; Owner: -
--

ALTER TABLE ONLY public.report_builder_published_graph_data_units
ADD CONSTRAINT fk_rails_f21a19c203 FOREIGN KEY (report_id) REFERENCES public.report_builder_reports(id);


--
-- Name: insights_text_networks fk_rails_f3e4924881; Type: FK CONSTRAINT; Schema: public; Owner: -
--
Expand Down Expand Up @@ -7981,6 +8039,8 @@ INSERT INTO "schema_migrations" (version) VALUES
('20231003095622'),
('20231018083110'),
('20231024082513'),
('20231031175023'),
('20231103094549'),
('20231109101517'),
('20231110112415');

Expand Down
23 changes: 23 additions & 0 deletions back/db/views/analytics_dimension_user_custom_field_values_v01.sql
Original file line number Diff line number Diff line change
@@ -0,0 +1,23 @@
SELECT
u.id as dimension_user_id,
cf.key,
cf.value
FROM
users u
LEFT JOIN LATERAL (
SELECT
key,
custom_field_values ->> key AS value
FROM
custom_fields
where
custom_fields.resource_type = 'User'
) cf ON true
LEFT JOIN LATERAL (
SELECT
jsonb_object_keys(u.custom_field_values) AS key
) cfv ON true
GROUP BY
dimension_user_id,
cf.key,
cf.value;
33 changes: 31 additions & 2 deletions back/engines/commercial/analytics/README.md
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
# Analytics
This is a separate analytics engine, which separates out the data for dashboard from the main operational data
using both database views on the existing data tables and data copied from other sources.
using both database views on the existing data tables and data copied from other sources.
The data is modelled following the conventions of a **star schema**.

These views and tables sit in the same tenant schema. However, in the future it is intended
Expand All @@ -21,6 +21,35 @@ Views are copied across when the migration is run.
Views and tables should be named as follows:

* analytics_dimension_* - holds dimensions by which the facts can be filtered
* analytics_fact_* - holds 'facts' - the actual data we're interested in
* analytics_fact_* - holds 'facts' - the actual data we're interested in
such as posts, participations, visits

### Testing queries in your dev env

You can use this request in the browser developer console.
```js
fetch(window.location.origin + "/web_api/v1/analytics", {
headers: {
authorization: `Bearer ${document.cookie.split("; ").find((x) => x.startsWith("cl2_jwt")).replace("cl2_jwt=", "")}`,
"content-type": "application/json",
},
body: `{
"query": {
"fact": "participation",
"groups": "dimension_user_custom_field_values.value",
"filters": {
"dimension_user_custom_field_values.key": "gender"
},
"aggregations": {
"dimension_user_custom_field_values.dimension_user_id": "count"
}
}
}`,
method: "POST",
})
.then((response) => response.json())
.then((data) => {
console.log(JSON.stringify(data.data, null, 2));
console.log(data);
});
```
Loading

0 comments on commit b6d86fd

Please sign in to comment.