From 97ca12331ec019aa1b47ee4110a45dbfc7729fb9 Mon Sep 17 00:00:00 2001 From: Nicolas Joyard Date: Sat, 8 Oct 2016 22:19:38 +0200 Subject: [PATCH] Squash all migrations --- src/core/migrations/0001_initial_site.py | 22 -- src/core/migrations/__init__.py | 0 src/memopol_scores/migrations/0001_initial.py | 259 +++++++++++++++++- .../migrations/0002_create_views.py | 186 ------------- .../migrations/0003_themescore.py | 152 ---------- .../migrations/0004_refine_themescore.py | 72 ----- .../migrations/0001_initial.py | 22 ++ .../migrations/0002_score_settings.py | 34 --- src/memopol_themes/migrations/0001_initial.py | 16 +- .../migrations/0002_themescore.py | 80 ------ .../migrations/0003_remove_themescore.py | 19 -- .../migrations/0001_initial.py | 233 +++++++++++++++- .../migrations/0002_fixtures.py | 41 --- .../migrations/0003_auto_20150702_1827.py | 165 ----------- .../migrations/0004_auto_20150709_1601.py | 18 -- .../migrations/0005_auto_20151212_2251.py | 19 -- .../migrations/0006_auto_20151213_0139.py | 23 -- .../migrations/0007_auto_20151213_0156.py | 19 -- .../migrations/0008_constituency_country.py | 19 -- ...9_order_mandates_by_end_date_descendant.py | 18 -- .../0010_index_group_kind_and_abbreviation.py | 28 -- .../migrations/0011_auto_20151226_1938.py | 18 -- .../migrations/0012_index_group_name.py | 19 -- .../0013_constituency_country_related_name.py | 19 -- .../migrations/0014_chamber.py | 31 --- .../migrations/0015_chamber_abbreviation.py | 19 -- .../migrations/0016_chamber_migrate_data.py | 120 -------- .../migrations/0017_auto_20160623_2201.py | 30 -- .../migrations/0018_auto_20160624_0517.py | 19 -- .../migrations/0019_remove_fingerprints.py | 34 --- .../0020_rep_unique_slug_remove_remoteid.py | 103 ------- .../migrations/0021_update_fr_committees.py | 72 ----- .../migrations/0001_initial.py | 10 +- .../migrations/0002_increase_link_length.py | 19 -- .../migrations/0003_remove_position_tags.py | 18 -- .../migrations/0004_add_kind_score_title.py | 29 -- .../migrations/0005_set_title.py | 29 -- .../migrations/0006_positionscore.py | 49 ---- .../migrations/0007_remove_positionscore.py | 19 -- .../migrations/0001_initial.py | 21 +- .../migrations/0002_dossierscore.py | 47 ---- .../migrations/0003_votescore.py | 50 ---- .../migrations/0004_dossierscore_rewrite.py | 35 --- .../migrations/0005_representativescore.py | 39 --- .../migrations/0006_score_formula.py | 78 ------ .../migrations/0007_fix_underflow.py | 72 ----- .../0008_representativescore_use_positions.py | 37 --- ...9_representativescore_use_positionscore.py | 38 --- .../migrations/0010_remove_views.py | 30 -- .../migrations/0001_initial.py | 57 +++- .../migrations/0002_auto_20150707_1611.py | 43 --- .../migrations/0003_auto_20150708_1358.py | 26 -- .../migrations/0004_auto_20150709_0819.py | 32 --- .../0005_make_dossier_reference_unique.py | 19 -- .../migrations/0006_duplicates.py | 30 -- ...unique_together_proposal_representative.py | 18 -- .../migrations/0008_unique_proposal_title.py | 19 -- .../migrations/0009_dossier_ext_link.py | 19 -- .../0010_proposal_datetime_index.py | 19 -- .../migrations/0011_remove_fingerprints.py | 30 -- .../migrations/0012_document.py | 103 ------- 61 files changed, 563 insertions(+), 2401 deletions(-) delete mode 100644 src/core/migrations/0001_initial_site.py delete mode 100644 src/core/migrations/__init__.py delete mode 100644 src/memopol_scores/migrations/0002_create_views.py delete mode 100644 src/memopol_scores/migrations/0003_themescore.py delete mode 100644 src/memopol_scores/migrations/0004_refine_themescore.py delete mode 100644 src/memopol_settings/migrations/0002_score_settings.py delete mode 100644 src/memopol_themes/migrations/0002_themescore.py delete mode 100644 src/memopol_themes/migrations/0003_remove_themescore.py delete mode 100644 src/representatives/migrations/0002_fixtures.py delete mode 100644 src/representatives/migrations/0003_auto_20150702_1827.py delete mode 100644 src/representatives/migrations/0004_auto_20150709_1601.py delete mode 100644 src/representatives/migrations/0005_auto_20151212_2251.py delete mode 100644 src/representatives/migrations/0006_auto_20151213_0139.py delete mode 100644 src/representatives/migrations/0007_auto_20151213_0156.py delete mode 100644 src/representatives/migrations/0008_constituency_country.py delete mode 100644 src/representatives/migrations/0009_order_mandates_by_end_date_descendant.py delete mode 100644 src/representatives/migrations/0010_index_group_kind_and_abbreviation.py delete mode 100644 src/representatives/migrations/0011_auto_20151226_1938.py delete mode 100644 src/representatives/migrations/0012_index_group_name.py delete mode 100644 src/representatives/migrations/0013_constituency_country_related_name.py delete mode 100644 src/representatives/migrations/0014_chamber.py delete mode 100644 src/representatives/migrations/0015_chamber_abbreviation.py delete mode 100644 src/representatives/migrations/0016_chamber_migrate_data.py delete mode 100644 src/representatives/migrations/0017_auto_20160623_2201.py delete mode 100644 src/representatives/migrations/0018_auto_20160624_0517.py delete mode 100644 src/representatives/migrations/0019_remove_fingerprints.py delete mode 100644 src/representatives/migrations/0020_rep_unique_slug_remove_remoteid.py delete mode 100644 src/representatives/migrations/0021_update_fr_committees.py delete mode 100644 src/representatives_positions/migrations/0002_increase_link_length.py delete mode 100644 src/representatives_positions/migrations/0003_remove_position_tags.py delete mode 100644 src/representatives_positions/migrations/0004_add_kind_score_title.py delete mode 100644 src/representatives_positions/migrations/0005_set_title.py delete mode 100644 src/representatives_positions/migrations/0006_positionscore.py delete mode 100644 src/representatives_positions/migrations/0007_remove_positionscore.py delete mode 100644 src/representatives_recommendations/migrations/0002_dossierscore.py delete mode 100644 src/representatives_recommendations/migrations/0003_votescore.py delete mode 100644 src/representatives_recommendations/migrations/0004_dossierscore_rewrite.py delete mode 100644 src/representatives_recommendations/migrations/0005_representativescore.py delete mode 100644 src/representatives_recommendations/migrations/0006_score_formula.py delete mode 100644 src/representatives_recommendations/migrations/0007_fix_underflow.py delete mode 100644 src/representatives_recommendations/migrations/0008_representativescore_use_positions.py delete mode 100644 src/representatives_recommendations/migrations/0009_representativescore_use_positionscore.py delete mode 100644 src/representatives_recommendations/migrations/0010_remove_views.py delete mode 100644 src/representatives_votes/migrations/0002_auto_20150707_1611.py delete mode 100644 src/representatives_votes/migrations/0003_auto_20150708_1358.py delete mode 100644 src/representatives_votes/migrations/0004_auto_20150709_0819.py delete mode 100644 src/representatives_votes/migrations/0005_make_dossier_reference_unique.py delete mode 100644 src/representatives_votes/migrations/0006_duplicates.py delete mode 100644 src/representatives_votes/migrations/0007_vote_unique_together_proposal_representative.py delete mode 100644 src/representatives_votes/migrations/0008_unique_proposal_title.py delete mode 100644 src/representatives_votes/migrations/0009_dossier_ext_link.py delete mode 100644 src/representatives_votes/migrations/0010_proposal_datetime_index.py delete mode 100644 src/representatives_votes/migrations/0011_remove_fingerprints.py delete mode 100644 src/representatives_votes/migrations/0012_document.py diff --git a/src/core/migrations/0001_initial_site.py b/src/core/migrations/0001_initial_site.py deleted file mode 100644 index f93e26d..0000000 --- a/src/core/migrations/0001_initial_site.py +++ /dev/null @@ -1,22 +0,0 @@ -# -*- coding: utf-8 -*- -from __future__ import unicode_literals - -from django.db import migrations, models -from django.conf import settings - - -def set_site_name(apps, schema_editor): - Site = apps.get_model('sites', 'Site') - Site.objects.filter(pk=settings.SITE_ID).update( - name=settings.SITE_NAME, domain=settings.SITE_DOMAIN) - - -class Migration(migrations.Migration): - - dependencies = [ - ('sites', '0001_initial'), - ] - - operations = [ - migrations.RunPython(set_site_name), - ] diff --git a/src/core/migrations/__init__.py b/src/core/migrations/__init__.py deleted file mode 100644 index e69de29..0000000 diff --git a/src/memopol_scores/migrations/0001_initial.py b/src/memopol_scores/migrations/0001_initial.py index 44ab09a..8123c6b 100644 --- a/src/memopol_scores/migrations/0001_initial.py +++ b/src/memopol_scores/migrations/0001_initial.py @@ -7,12 +7,12 @@ from django.db import migrations, models class Migration(migrations.Migration): dependencies = [ - ('representatives', '0020_rep_unique_slug_remove_remoteid'), - ('representatives_votes', '0012_document'), - ('representatives_positions', '0007_remove_positionscore'), - ('representatives_recommendations', '0010_remove_views'), - ('memopol_themes', '0003_remove_themescore'), - ('memopol_settings', '0002_score_settings'), + ('memopol_settings', '0001_initial'), + ('memopol_themes', '0001_initial'), + ('representatives', '0001_initial'), + ('representatives_votes', '0001_initial'), + ('representatives_positions', '0001_initial'), + ('representatives_recommendations', '0001_initial'), ] operations = [ @@ -41,6 +41,15 @@ class Migration(migrations.Migration): ('representative', models.OneToOneField(related_name='representative_score', to='representatives.Representative')), ], ), + migrations.CreateModel( + name='ThemeScore', + fields=[ + ('id', models.AutoField(verbose_name='ID', serialize=False, auto_created=True, primary_key=True)), + ('score', models.FloatField()), + ('representative', models.ForeignKey(related_name='theme_scores', to='representatives.Representative')), + ('theme', models.ForeignKey(to='memopol_themes.Theme')), + ], + ), migrations.CreateModel( name='VoteScore', fields=[ @@ -49,4 +58,242 @@ class Migration(migrations.Migration): ('vote', models.OneToOneField(related_name='vote_score', to='representatives_votes.Vote')), ], ), + + migrations.RunSQL( + """ + CREATE FUNCTION decay_score( + score NUMERIC, + vote_date timestamp with time zone, + decay_num NUMERIC, + decay_denom NUMERIC, + exponent NUMERIC, + decimals integer) + RETURNS NUMERIC AS $$ + SELECT ROUND( + CAST( + $1 * EXP( + GREATEST( + -700, + LEAST( + 700, + -(($3 * EXTRACT(days FROM CURRENT_DATE - $2) / $4) ^ (2 * $5)) + ) + ) + ) + AS NUMERIC + ), + $6 + ) + $$ LANGUAGE SQL; + """ + ), + + migrations.RunSQL( + """ + CREATE OR REPLACE VIEW "memopol_scores_v_vote_score" + AS SELECT + "representatives_votes_vote"."id" AS "vote_id", + decay_score( + CAST(CASE + WHEN "representatives_votes_vote"."position"::text = "representatives_recommendations_recommendation"."recommendation"::text + THEN "representatives_recommendations_recommendation"."weight" + ELSE 0 - "representatives_recommendations_recommendation"."weight" + END AS NUMERIC), + "representatives_votes_proposal"."datetime", + "decay_num"."value", + "decay_denom"."value", + "exponent"."value", + "decimals"."value" + ) AS "score" + FROM "representatives_votes_vote" + JOIN (SELECT CAST(TO_NUMBER("value", '99999') AS NUMERIC) AS "value" FROM "memopol_settings_setting" WHERE "key" = 'SCORE_DECAY_NUM') "decay_num" ON 1=1 + JOIN (SELECT CAST(TO_NUMBER("value", '99999') AS NUMERIC) AS "value" FROM "memopol_settings_setting" WHERE "key" = 'SCORE_DECAY_DENOM') "decay_denom" ON 1=1 + JOIN (SELECT CAST(TO_NUMBER("value", '99999') AS NUMERIC) AS "value" FROM "memopol_settings_setting" WHERE "key" = 'SCORE_EXPONENT') "exponent" ON 1=1 + JOIN (SELECT CAST(TO_NUMBER("value", '99999') AS INTEGER) AS "value" FROM "memopol_settings_setting" WHERE "key" = 'SCORE_DECIMALS') "decimals" ON 1=1 + JOIN "representatives_votes_proposal" ON "representatives_votes_vote"."proposal_id" = "representatives_votes_proposal"."id" + LEFT JOIN "representatives_recommendations_recommendation" ON "representatives_votes_proposal"."id" = "representatives_recommendations_recommendation"."proposal_id" + WHERE "representatives_recommendations_recommendation"."id" IS NOT NULL; + """ + ), + + migrations.RunSQL( + """ + CREATE OR REPLACE VIEW "memopol_scores_v_dossier_score" + AS SELECT + "representatives_votes_vote"."representative_id" AS "representative_id", + "representatives_votes_proposal"."dossier_id" AS "dossier_id", + SUM("memopol_scores_votescore"."score") AS "score" + FROM + "memopol_scores_votescore" + INNER JOIN "representatives_votes_vote" + ON "memopol_scores_votescore"."vote_id" = "representatives_votes_vote"."id" + INNER JOIN "representatives_votes_proposal" + ON "representatives_votes_vote"."proposal_id" = "representatives_votes_proposal"."id" + GROUP BY + "representatives_votes_vote"."representative_id", + "representatives_votes_proposal"."dossier_id" + """ + ), + + migrations.RunSQL( + """ + CREATE OR REPLACE VIEW "memopol_scores_v_position_score" + AS SELECT + "representatives_positions_position"."id" AS "position_id", + decay_score( + "representatives_positions_position"."score", + "representatives_positions_position"."datetime", + "decay_num"."value", + "decay_denom"."value", + "exponent"."value", + "decimals"."value" + ) AS "score" + FROM + "representatives_positions_position" + JOIN (SELECT CAST(TO_NUMBER("value", '99999') AS NUMERIC) AS "value" FROM "memopol_settings_setting" WHERE "key" = 'SCORE_DECAY_NUM') "decay_num" ON 1=1 + JOIN (SELECT CAST(TO_NUMBER("value", '99999') AS NUMERIC) AS "value" FROM "memopol_settings_setting" WHERE "key" = 'SCORE_DECAY_DENOM') "decay_denom" ON 1=1 + JOIN (SELECT CAST(TO_NUMBER("value", '99999') AS NUMERIC) AS "value" FROM "memopol_settings_setting" WHERE "key" = 'SCORE_EXPONENT') "exponent" ON 1=1 + JOIN (SELECT CAST(TO_NUMBER("value", '99999') AS INTEGER) AS "value" FROM "memopol_settings_setting" WHERE "key" = 'SCORE_DECIMALS') "decimals" ON 1=1; + """ + ), + + migrations.RunSQL( + """ + CREATE OR REPLACE VIEW "memopol_scores_v_representative_score" + AS SELECT + "source"."representative_id" AS "representative_id" , + SUM("source"."score") AS "score" + FROM + ( + SELECT + "memopol_scores_dossierscore"."representative_id" AS "representative_id", + "memopol_scores_dossierscore"."score" AS "score" + FROM "memopol_scores_dossierscore" + UNION ALL + SELECT + "representatives_positions_position"."representative_id" AS "representative_id", + "memopol_scores_positionscore"."score" AS "score" + FROM + "memopol_scores_positionscore" + INNER JOIN "representatives_positions_position" + ON "memopol_scores_positionscore"."position_id" = "representatives_positions_position"."id" + ) "source" + GROUP BY + "source"."representative_id" + """ + ), + + migrations.RunSQL( + """ + CREATE OR REPLACE VIEW "memopol_scores_v_theme_score" + AS SELECT + "scoresource"."representative_id" AS "representative_id", + "scoresource"."theme_id" AS "theme_id", + SUM("scoresource"."score") AS "score" + FROM + ( + -- Score contribution for proposals + SELECT + "representatives_votes_vote"."representative_id" AS "representative_id", + "proposal_themes"."theme_id" AS "theme_id", + "memopol_scores_votescore"."score" AS "score" + FROM + "memopol_scores_votescore" + INNER JOIN "representatives_votes_vote" + ON "representatives_votes_vote"."id" = "memopol_scores_votescore"."vote_id" + INNER JOIN ( + -- Proposals with a theme + SELECT + "representatives_votes_proposal"."id" AS "proposal_id", + "memopol_themes_theme_proposals"."theme_id" AS "theme_id" + FROM + "representatives_votes_proposal" + INNER JOIN "memopol_themes_theme_proposals" + ON "representatives_votes_proposal"."id" = "memopol_themes_theme_proposals"."proposal_id" + UNION + -- Proposals in a dossier with a theme + SELECT + "representatives_votes_proposal"."id" AS "proposal_id", + "memopol_themes_theme_dossiers"."theme_id" AS "theme_id" + FROM + "representatives_votes_proposal" + INNER JOIN "representatives_votes_dossier" + ON "representatives_votes_dossier"."id" = "representatives_votes_proposal"."dossier_id" + INNER JOIN "memopol_themes_theme_dossiers" + ON "memopol_themes_theme_dossiers"."dossier_id" = "representatives_votes_dossier"."id" + ) "proposal_themes" + ON "proposal_themes"."proposal_id" = "representatives_votes_vote"."proposal_id" + UNION ALL + -- Score contribution for positions + SELECT + "representatives_positions_position"."representative_id" AS "representative_id", + "memopol_themes_theme_positions"."theme_id" AS "theme_id", + "memopol_scores_positionscore"."score" AS "score" + FROM + "memopol_scores_positionscore" + INNER JOIN "representatives_positions_position" + ON "representatives_positions_position"."id" = "memopol_scores_positionscore"."position_id" + INNER JOIN "memopol_themes_theme_positions" + ON "memopol_themes_theme_positions"."position_id" = "memopol_scores_positionscore"."position_id" + ) "scoresource" + GROUP BY + "scoresource"."representative_id", + "scoresource"."theme_id" + """ + ), + + migrations.RunSQL( + """ + CREATE OR REPLACE FUNCTION refresh_scores() + RETURNS VOID AS $$ + BEGIN + TRUNCATE TABLE "memopol_scores_representativescore"; + + TRUNCATE TABLE "memopol_scores_dossierscore"; + + TRUNCATE TABLE "memopol_scores_votescore"; + + INSERT INTO "memopol_scores_votescore" ("vote_id", "score") + SELECT "vote_id", "score" FROM "memopol_scores_v_vote_score"; + + INSERT INTO "memopol_scores_dossierscore" ("representative_id", "dossier_id", "score") + SELECT "representative_id", "dossier_id", "score" FROM "memopol_scores_v_dossier_score"; + + TRUNCATE TABLE "memopol_scores_positionscore"; + + INSERT INTO "memopol_scores_positionscore" ("position_id", "score") + SELECT "position_id", "score" FROM "memopol_scores_v_position_score"; + + TRUNCATE TABLE "memopol_scores_themescore"; + + INSERT INTO "memopol_scores_themescore" ("representative_id", "theme_id", "score") + SELECT + "representatives_representative"."id", + "memopol_themes_theme"."id", + COALESCE("memopol_scores_v_theme_score"."score", 0) + FROM + "representatives_representative" + INNER JOIN "memopol_themes_theme" ON 1=1 + LEFT OUTER JOIN "memopol_scores_v_theme_score" + ON "memopol_scores_v_theme_score"."representative_id" = "representatives_representative"."id" + AND "memopol_scores_v_theme_score"."theme_id" = "memopol_themes_theme"."id"; + + INSERT INTO "memopol_scores_representativescore" ("representative_id", "score") + SELECT + "representatives_representative"."id", + COALESCE("memopol_scores_v_representative_score"."score", 0) + FROM + "representatives_representative" + LEFT OUTER JOIN "memopol_scores_v_representative_score" + ON "memopol_scores_v_representative_score"."representative_id" = "representatives_representative"."id"; + END; + $$ LANGUAGE PLPGSQL; + """ + ), + + migrations.RunSQL( + """ + SELECT refresh_scores(); + """ + ) ] diff --git a/src/memopol_scores/migrations/0002_create_views.py b/src/memopol_scores/migrations/0002_create_views.py deleted file mode 100644 index ffb65ee..0000000 --- a/src/memopol_scores/migrations/0002_create_views.py +++ /dev/null @@ -1,186 +0,0 @@ -# -*- coding: utf-8 -*- -from __future__ import unicode_literals - -from django.db import migrations, models - - -class Migration(migrations.Migration): - - dependencies = [ - ('memopol_scores', '0001_initial'), - ] - - operations = [ - migrations.RunSQL( - """ - CREATE OR REPLACE VIEW "memopol_scores_v_vote_score" - AS SELECT - "representatives_votes_vote"."id" AS "vote_id", - decay_score( - CAST(CASE - WHEN "representatives_votes_vote"."position"::text = "representatives_recommendations_recommendation"."recommendation"::text - THEN "representatives_recommendations_recommendation"."weight" - ELSE 0 - "representatives_recommendations_recommendation"."weight" - END AS NUMERIC), - "representatives_votes_proposal"."datetime", - "decay_num"."value", - "decay_denom"."value", - "exponent"."value", - "decimals"."value" - ) AS "score" - FROM "representatives_votes_vote" - JOIN (SELECT CAST(TO_NUMBER("value", '99999') AS NUMERIC) AS "value" FROM "memopol_settings_setting" WHERE "key" = 'SCORE_DECAY_NUM') "decay_num" ON 1=1 - JOIN (SELECT CAST(TO_NUMBER("value", '99999') AS NUMERIC) AS "value" FROM "memopol_settings_setting" WHERE "key" = 'SCORE_DECAY_DENOM') "decay_denom" ON 1=1 - JOIN (SELECT CAST(TO_NUMBER("value", '99999') AS NUMERIC) AS "value" FROM "memopol_settings_setting" WHERE "key" = 'SCORE_EXPONENT') "exponent" ON 1=1 - JOIN (SELECT CAST(TO_NUMBER("value", '99999') AS INTEGER) AS "value" FROM "memopol_settings_setting" WHERE "key" = 'SCORE_DECIMALS') "decimals" ON 1=1 - JOIN "representatives_votes_proposal" ON "representatives_votes_vote"."proposal_id" = "representatives_votes_proposal"."id" - LEFT JOIN "representatives_recommendations_recommendation" ON "representatives_votes_proposal"."id" = "representatives_recommendations_recommendation"."proposal_id" - WHERE "representatives_recommendations_recommendation"."id" IS NOT NULL; - """ - ), - - migrations.RunSQL( - """ - CREATE OR REPLACE VIEW "memopol_scores_v_dossier_score" - AS SELECT - "representatives_votes_vote"."representative_id" AS "representative_id", - "representatives_votes_proposal"."dossier_id" AS "dossier_id", - SUM("memopol_scores_votescore"."score") AS "score" - FROM - "memopol_scores_votescore" - INNER JOIN "representatives_votes_vote" - ON "memopol_scores_votescore"."vote_id" = "representatives_votes_vote"."id" - INNER JOIN "representatives_votes_proposal" - ON "representatives_votes_vote"."proposal_id" = "representatives_votes_proposal"."id" - GROUP BY - "representatives_votes_vote"."representative_id", - "representatives_votes_proposal"."dossier_id" - """ - ), - - migrations.RunSQL( - """ - CREATE OR REPLACE VIEW "memopol_scores_v_position_score" - AS SELECT - "representatives_positions_position"."id" AS "position_id", - decay_score( - "representatives_positions_position"."score", - "representatives_positions_position"."datetime", - "decay_num"."value", - "decay_denom"."value", - "exponent"."value", - "decimals"."value" - ) AS "score" - FROM - "representatives_positions_position" - JOIN (SELECT CAST(TO_NUMBER("value", '99999') AS NUMERIC) AS "value" FROM "memopol_settings_setting" WHERE "key" = 'SCORE_DECAY_NUM') "decay_num" ON 1=1 - JOIN (SELECT CAST(TO_NUMBER("value", '99999') AS NUMERIC) AS "value" FROM "memopol_settings_setting" WHERE "key" = 'SCORE_DECAY_DENOM') "decay_denom" ON 1=1 - JOIN (SELECT CAST(TO_NUMBER("value", '99999') AS NUMERIC) AS "value" FROM "memopol_settings_setting" WHERE "key" = 'SCORE_EXPONENT') "exponent" ON 1=1 - JOIN (SELECT CAST(TO_NUMBER("value", '99999') AS INTEGER) AS "value" FROM "memopol_settings_setting" WHERE "key" = 'SCORE_DECIMALS') "decimals" ON 1=1; - """ - ), - - migrations.RunSQL( - """ - CREATE OR REPLACE VIEW "memopol_scores_v_representative_score" - AS SELECT - "source"."representative_id" AS "representative_id" , - SUM("source"."score") AS "score" - FROM - ( - SELECT - "memopol_scores_dossierscore"."representative_id" AS "representative_id", - "memopol_scores_dossierscore"."score" AS "score" - FROM "memopol_scores_dossierscore" - UNION ALL - SELECT - "representatives_positions_position"."representative_id" AS "representative_id", - "memopol_scores_positionscore"."score" AS "score" - FROM - "memopol_scores_positionscore" - INNER JOIN "representatives_positions_position" - ON "memopol_scores_positionscore"."position_id" = "representatives_positions_position"."id" - ) "source" - GROUP BY - "source"."representative_id" - """ - ), - - migrations.RunSQL( - """ - CREATE OR REPLACE FUNCTION refresh_vote_scores() - RETURNS VOID AS $$ - BEGIN - TRUNCATE TABLE "memopol_scores_votescore"; - - INSERT INTO "memopol_scores_votescore" ("vote_id", "score") - SELECT "vote_id", "score" FROM "memopol_scores_v_vote_score"; - END; - $$ LANGUAGE PLPGSQL; - """ - ), - - migrations.RunSQL( - """ - CREATE OR REPLACE FUNCTION refresh_dossier_scores() - RETURNS VOID AS $$ - BEGIN - TRUNCATE TABLE "memopol_scores_dossierscore"; - - PERFORM refresh_vote_scores(); - - INSERT INTO "memopol_scores_dossierscore" ("representative_id", "dossier_id", "score") - SELECT "representative_id", "dossier_id", "score" FROM "memopol_scores_v_dossier_score"; - END; - $$ LANGUAGE PLPGSQL; - """ - ), - - migrations.RunSQL( - """ - CREATE OR REPLACE FUNCTION refresh_position_scores() - RETURNS VOID AS $$ - BEGIN - TRUNCATE TABLE "memopol_scores_positionscore"; - - INSERT INTO "memopol_scores_positionscore" ("position_id", "score") - SELECT "position_id", "score" FROM "memopol_scores_v_position_score"; - END; - $$ LANGUAGE PLPGSQL; - """ - ), - - migrations.RunSQL( - """ - CREATE OR REPLACE FUNCTION refresh_representative_scores() - RETURNS VOID AS $$ - BEGIN - TRUNCATE TABLE "memopol_scores_representativescore"; - - PERFORM refresh_dossier_scores(); - PERFORM refresh_position_scores(); - - INSERT INTO "memopol_scores_representativescore" ("representative_id", "score") - SELECT - "representatives_representative"."id", - COALESCE("memopol_scores_v_representative_score"."score", 0) - FROM - "representatives_representative" - LEFT OUTER JOIN "memopol_scores_v_representative_score" - ON "memopol_scores_v_representative_score"."representative_id" = "representatives_representative"."id"; - END; - $$ LANGUAGE PLPGSQL; - """ - ), - - migrations.RunSQL( - """ - CREATE OR REPLACE FUNCTION refresh_scores() - RETURNS VOID AS $$ - BEGIN - PERFORM refresh_representative_scores(); - END; - $$ LANGUAGE PLPGSQL; - """ - ), - ] diff --git a/src/memopol_scores/migrations/0003_themescore.py b/src/memopol_scores/migrations/0003_themescore.py deleted file mode 100644 index 906dc0f..0000000 --- a/src/memopol_scores/migrations/0003_themescore.py +++ /dev/null @@ -1,152 +0,0 @@ -# -*- coding: utf-8 -*- -from __future__ import unicode_literals - -from django.db import migrations, models - - -class Migration(migrations.Migration): - - dependencies = [ - ('representatives', '0020_rep_unique_slug_remove_remoteid'), - ('memopol_themes', '0003_remove_themescore'), - ('memopol_scores', '0002_create_views'), - ] - - operations = [ - migrations.CreateModel( - name='ThemeScore', - fields=[ - ('id', models.AutoField(verbose_name='ID', serialize=False, auto_created=True, primary_key=True)), - ('score', models.FloatField()), - ('representative', models.ForeignKey(related_name='theme_scores', to='representatives.Representative')), - ('theme', models.ForeignKey(to='memopol_themes.Theme')), - ], - ), - - migrations.RunSQL( - """ - CREATE OR REPLACE VIEW "memopol_scores_v_theme_score" - AS SELECT - "scoresource"."representative_id" AS "representative_id", - "scoresource"."theme_id" AS "theme_id", - SUM("scoresource"."score") AS "score" - FROM - ( - SELECT - "memopol_scores_dossierscore"."representative_id" AS "representative_id", - "memopol_themes_theme_dossiers"."theme_id" AS "theme_id", - "memopol_scores_dossierscore"."score" AS "score" - FROM - "memopol_scores_dossierscore" - INNER JOIN "memopol_themes_theme_dossiers" - ON "memopol_themes_theme_dossiers"."dossier_id" = "memopol_scores_dossierscore"."dossier_id" - UNION ALL - SELECT - "representatives_votes_vote"."representative_id" AS "representative_id", - "memopol_themes_theme_proposals"."theme_id" AS "theme_id", - "memopol_scores_votescore"."score" AS "score" - FROM - "memopol_scores_votescore" - INNER JOIN "representatives_votes_vote" - ON "representatives_votes_vote"."id" = "memopol_scores_votescore"."vote_id" - INNER JOIN "memopol_themes_theme_proposals" - ON "memopol_themes_theme_proposals"."proposal_id" = "representatives_votes_vote"."proposal_id" - UNION ALL - SELECT - "representatives_positions_position"."representative_id" AS "representative_id", - "memopol_themes_theme_positions"."theme_id" AS "theme_id", - "memopol_scores_positionscore"."score" AS "score" - FROM - "memopol_scores_positionscore" - INNER JOIN "representatives_positions_position" - ON "representatives_positions_position"."id" = "memopol_scores_positionscore"."position_id" - INNER JOIN "memopol_themes_theme_positions" - ON "memopol_themes_theme_positions"."position_id" = "memopol_scores_positionscore"."position_id" - ) "scoresource" - GROUP BY - "scoresource"."representative_id", - "scoresource"."theme_id" - """ - ), - - - migrations.RunSQL( - """ - DROP FUNCTION refresh_vote_scores(); - """ - ), - - migrations.RunSQL( - """ - DROP FUNCTION refresh_dossier_scores(); - """ - ), - - migrations.RunSQL( - """ - DROP FUNCTION refresh_position_scores(); - """ - ), - - migrations.RunSQL( - """ - DROP FUNCTION refresh_representative_scores(); - """ - ), - - migrations.RunSQL( - """ - CREATE OR REPLACE FUNCTION refresh_scores() - RETURNS VOID AS $$ - BEGIN - TRUNCATE TABLE "memopol_scores_representativescore"; - - TRUNCATE TABLE "memopol_scores_dossierscore"; - - TRUNCATE TABLE "memopol_scores_votescore"; - - INSERT INTO "memopol_scores_votescore" ("vote_id", "score") - SELECT "vote_id", "score" FROM "memopol_scores_v_vote_score"; - - INSERT INTO "memopol_scores_dossierscore" ("representative_id", "dossier_id", "score") - SELECT "representative_id", "dossier_id", "score" FROM "memopol_scores_v_dossier_score"; - - TRUNCATE TABLE "memopol_scores_positionscore"; - - INSERT INTO "memopol_scores_positionscore" ("position_id", "score") - SELECT "position_id", "score" FROM "memopol_scores_v_position_score"; - - TRUNCATE TABLE "memopol_scores_themescore"; - - INSERT INTO "memopol_scores_themescore" ("representative_id", "theme_id", "score") - SELECT - "representatives_representative"."id", - "memopol_themes_theme"."id", - COALESCE("memopol_scores_v_theme_score"."score", 0) - FROM - "representatives_representative" - INNER JOIN "memopol_themes_theme" ON 1=1 - LEFT OUTER JOIN "memopol_scores_v_theme_score" - ON "memopol_scores_v_theme_score"."representative_id" = "representatives_representative"."id" - AND "memopol_scores_v_theme_score"."theme_id" = "memopol_themes_theme"."id"; - - INSERT INTO "memopol_scores_representativescore" ("representative_id", "score") - SELECT - "representatives_representative"."id", - COALESCE("memopol_scores_v_representative_score"."score", 0) - FROM - "representatives_representative" - LEFT OUTER JOIN "memopol_scores_v_representative_score" - ON "memopol_scores_v_representative_score"."representative_id" = "representatives_representative"."id"; - END; - $$ LANGUAGE PLPGSQL; - """ - ), - - migrations.RunSQL( - """ - SELECT refresh_scores(); - """ - ) - - ] diff --git a/src/memopol_scores/migrations/0004_refine_themescore.py b/src/memopol_scores/migrations/0004_refine_themescore.py deleted file mode 100644 index 83b8382..0000000 --- a/src/memopol_scores/migrations/0004_refine_themescore.py +++ /dev/null @@ -1,72 +0,0 @@ -# -*- coding: utf-8 -*- -from __future__ import unicode_literals - -from django.db import migrations, models - - -class Migration(migrations.Migration): - - dependencies = [ - ('memopol_scores', '0003_themescore'), - ] - - operations = [ - migrations.RunSQL( - """ - CREATE OR REPLACE VIEW "memopol_scores_v_theme_score" - AS SELECT - "scoresource"."representative_id" AS "representative_id", - "scoresource"."theme_id" AS "theme_id", - SUM("scoresource"."score") AS "score" - FROM - ( - -- Score contribution for proposals - SELECT - "representatives_votes_vote"."representative_id" AS "representative_id", - "proposal_themes"."theme_id" AS "theme_id", - "memopol_scores_votescore"."score" AS "score" - FROM - "memopol_scores_votescore" - INNER JOIN "representatives_votes_vote" - ON "representatives_votes_vote"."id" = "memopol_scores_votescore"."vote_id" - INNER JOIN ( - -- Proposals with a theme - SELECT - "representatives_votes_proposal"."id" AS "proposal_id", - "memopol_themes_theme_proposals"."theme_id" AS "theme_id" - FROM - "representatives_votes_proposal" - INNER JOIN "memopol_themes_theme_proposals" - ON "representatives_votes_proposal"."id" = "memopol_themes_theme_proposals"."proposal_id" - UNION - -- Proposals in a dossier with a theme - SELECT - "representatives_votes_proposal"."id" AS "proposal_id", - "memopol_themes_theme_dossiers"."theme_id" AS "theme_id" - FROM - "representatives_votes_proposal" - INNER JOIN "representatives_votes_dossier" - ON "representatives_votes_dossier"."id" = "representatives_votes_proposal"."dossier_id" - INNER JOIN "memopol_themes_theme_dossiers" - ON "memopol_themes_theme_dossiers"."dossier_id" = "representatives_votes_dossier"."id" - ) "proposal_themes" - ON "proposal_themes"."proposal_id" = "representatives_votes_vote"."proposal_id" - UNION ALL - -- Score contribution for positions - SELECT - "representatives_positions_position"."representative_id" AS "representative_id", - "memopol_themes_theme_positions"."theme_id" AS "theme_id", - "memopol_scores_positionscore"."score" AS "score" - FROM - "memopol_scores_positionscore" - INNER JOIN "representatives_positions_position" - ON "representatives_positions_position"."id" = "memopol_scores_positionscore"."position_id" - INNER JOIN "memopol_themes_theme_positions" - ON "memopol_themes_theme_positions"."position_id" = "memopol_scores_positionscore"."position_id" - ) "scoresource" - GROUP BY - "scoresource"."representative_id", - "scoresource"."theme_id" - """ - ), - ] diff --git a/src/memopol_settings/migrations/0001_initial.py b/src/memopol_settings/migrations/0001_initial.py index 8c5caa8..4949fa3 100644 --- a/src/memopol_settings/migrations/0001_initial.py +++ b/src/memopol_settings/migrations/0001_initial.py @@ -1,9 +1,29 @@ # -*- coding: utf-8 -*- from __future__ import unicode_literals +import os + +from django.core import serializers from django.db import migrations, models +fixture_dir = os.path.abspath( + os.path.join( + os.path.dirname(__file__), + '../fixtures')) +fixture_filename = 'score_settings.json' + + +def load_fixture(apps, schema_editor): + fixture_file = os.path.join(fixture_dir, fixture_filename) + + fixture = open(fixture_file, 'rb') + objects = serializers.deserialize('json', fixture, ignorenonexistent=True) + for obj in objects: + obj.save() + fixture.close() + + class Migration(migrations.Migration): dependencies = [ @@ -18,4 +38,6 @@ class Migration(migrations.Migration): ('comment', models.TextField()), ], ), + + migrations.RunPython(load_fixture), ] diff --git a/src/memopol_settings/migrations/0002_score_settings.py b/src/memopol_settings/migrations/0002_score_settings.py deleted file mode 100644 index 00c7098..0000000 --- a/src/memopol_settings/migrations/0002_score_settings.py +++ /dev/null @@ -1,34 +0,0 @@ -# -*- coding: utf-8 -*- -from __future__ import unicode_literals - -import os - -from django.core import serializers -from django.db import migrations - -fixture_dir = os.path.abspath( - os.path.join( - os.path.dirname(__file__), - '../fixtures')) -fixture_filename = 'score_settings.json' - - -def load_fixture(apps, schema_editor): - fixture_file = os.path.join(fixture_dir, fixture_filename) - - fixture = open(fixture_file, 'rb') - objects = serializers.deserialize('json', fixture, ignorenonexistent=True) - for obj in objects: - obj.save() - fixture.close() - - -class Migration(migrations.Migration): - - dependencies = [ - ('memopol_settings', '0001_initial'), - ] - - operations = [ - migrations.RunPython(load_fixture), - ] diff --git a/src/memopol_themes/migrations/0001_initial.py b/src/memopol_themes/migrations/0001_initial.py index 410bab8..566529b 100644 --- a/src/memopol_themes/migrations/0001_initial.py +++ b/src/memopol_themes/migrations/0001_initial.py @@ -8,11 +8,23 @@ import autoslug.fields class Migration(migrations.Migration): dependencies = [ - ('representatives_votes', '0012_document'), - ('representatives_positions', '0003_remove_position_tags'), + ('representatives_votes', '0001_initial'), + ('representatives_positions', '0001_initial'), ] operations = [ + migrations.CreateModel( + name='ThemeScore', + fields=[ + ('id', models.AutoField(verbose_name='ID', serialize=False, auto_created=True, primary_key=True)), + ('score', models.FloatField(default=0)), + ], + options={ + 'ordering': ['theme__slug'], + 'db_table': 'memopol_themes_themescore', + 'managed': False, + }, + ), migrations.CreateModel( name='Theme', fields=[ diff --git a/src/memopol_themes/migrations/0002_themescore.py b/src/memopol_themes/migrations/0002_themescore.py deleted file mode 100644 index 0d73cf4..0000000 --- a/src/memopol_themes/migrations/0002_themescore.py +++ /dev/null @@ -1,80 +0,0 @@ -# -*- coding: utf-8 -*- -from __future__ import unicode_literals - -from django.db import migrations, models - - -class Migration(migrations.Migration): - - dependencies = [ - ('memopol_themes', '0001_initial'), - ('representatives_positions', '0006_positionscore'), - ] - - operations = [ - migrations.CreateModel( - name='ThemeScore', - fields=[ - ('id', models.AutoField(verbose_name='ID', serialize=False, auto_created=True, primary_key=True)), - ('score', models.FloatField(default=0)), - ], - options={ - 'ordering': ['theme__slug'], - 'db_table': 'memopol_themes_themescore', - 'managed': False, - }, - ), - - migrations.RunSQL( - """ - CREATE VIEW "memopol_themes_themescore" - AS SELECT - "representatives_representative"."id" AS "representative_id", - "memopol_themes_theme"."id" AS "theme_id", - SUM(COALESCE("scoresource"."score", 0)) AS "score" - FROM - "representatives_representative" - LEFT OUTER JOIN "memopol_themes_theme" - ON 1=1 - LEFT OUTER JOIN ( - SELECT - "representatives_recommendations_dossierscores"."representative_id" AS "representative_id", - "memopol_themes_theme"."id" AS "theme_id", - "representatives_recommendations_dossierscores"."score" AS "score" - FROM - "representatives_recommendations_dossierscores" - INNER JOIN "memopol_themes_theme_dossiers" - ON "memopol_themes_theme_dossiers"."dossier_id" = "representatives_recommendations_dossierscores"."dossier_id" - INNER JOIN "memopol_themes_theme" - ON "memopol_themes_theme"."id" = "memopol_themes_theme_dossiers"."theme_id" - UNION ALL - SELECT - "representatives_recommendations_votescores"."representative_id" AS "representative_id", - "memopol_themes_theme"."id" AS "theme_id", - "representatives_recommendations_votescores"."score" AS "score" - FROM - "representatives_recommendations_votescores" - INNER JOIN "memopol_themes_theme_proposals" - ON "memopol_themes_theme_proposals"."proposal_id" = "representatives_recommendations_votescores"."proposal_id" - INNER JOIN "memopol_themes_theme" - ON "memopol_themes_theme"."id" = "memopol_themes_theme_proposals"."theme_id" - UNION ALL - SELECT - "representatives_positions_positionscore"."representative_id" AS "representative_id", - "memopol_themes_theme"."id" AS "theme_id", - "representatives_positions_positionscore"."score" AS "score" - FROM - "representatives_positions_positionscore" - INNER JOIN "memopol_themes_theme_positions" - ON "memopol_themes_theme_positions"."position_id" = "representatives_positions_positionscore"."position_id" - INNER JOIN "memopol_themes_theme" - ON "memopol_themes_theme"."id" = "memopol_themes_theme_positions"."theme_id" - ) "scoresource" - ON "scoresource"."theme_id" = "memopol_themes_theme"."id" - AND "scoresource"."representative_id" = "representatives_representative"."id" - GROUP BY - "representatives_representative"."id", - "memopol_themes_theme"."id" - """ - ), - ] diff --git a/src/memopol_themes/migrations/0003_remove_themescore.py b/src/memopol_themes/migrations/0003_remove_themescore.py deleted file mode 100644 index 3daf2f8..0000000 --- a/src/memopol_themes/migrations/0003_remove_themescore.py +++ /dev/null @@ -1,19 +0,0 @@ -# -*- coding: utf-8 -*- -from __future__ import unicode_literals - -from django.db import migrations, models - - -class Migration(migrations.Migration): - - dependencies = [ - ('memopol_themes', '0002_themescore'), - ] - - operations = [ - migrations.RunSQL( - """ - DROP VIEW "memopol_themes_themescore"; - """ - ), - ] diff --git a/src/representatives/migrations/0001_initial.py b/src/representatives/migrations/0001_initial.py index 52ebdc0..d3d644f 100644 --- a/src/representatives/migrations/0001_initial.py +++ b/src/representatives/migrations/0001_initial.py @@ -1,30 +1,239 @@ # -*- coding: utf-8 -*- from __future__ import unicode_literals +import os + +from django.core import serializers from django.db import migrations, models +fixture_dir = os.path.abspath( + os.path.join( + os.path.dirname(__file__), + '../fixtures')) +fixture_filename = 'country_initial_data.json' + + +def load_fixture(apps, schema_editor): + fixture_file = os.path.join(fixture_dir, fixture_filename) + + fixture = open(fixture_file, 'rb') + objects = serializers.deserialize('json', fixture, ignorenonexistent=True) + for obj in objects: + obj.save() + fixture.close() + + +def unload_fixture(apps, schema_editor): + "Brutally deleting all entries for this model..." + + MyModel = apps.get_model("representatives", "Country") + MyModel.objects.all().delete() + + +def create_ep_chamber(apps, schema_editor): + name = 'European Parliament' + abbr = 'EP' + + Chamber = apps.get_model("representatives", "Chamber") + Constituency = apps.get_model("representatives", "Constituency") + Group = apps.get_model("representatives", "Group") + + ep_chamber, _ = Chamber.objects.get_or_create(name=name, abbreviation=abbr) + ep_constituency, _ = Constituency.objects.get_or_create(name=name) + ep_group, _ = Group.objects.get_or_create(name=name, kind='chamber', + abbreviation=abbr, chamber=ep_chamber) + + ep_chamber.save() + ep_constituency.save() + ep_group.save() + + class Migration(migrations.Migration): dependencies = [ ] operations = [ + migrations.CreateModel( + name='Address', + fields=[ + ('id', models.AutoField(verbose_name='ID', serialize=False, auto_created=True, primary_key=True)), + ('created', models.DateTimeField(auto_now_add=True)), + ('updated', models.DateTimeField(auto_now=True)), + ('city', models.CharField(default=b'', max_length=255, blank=True)), + ('street', models.CharField(default=b'', max_length=255, blank=True)), + ('number', models.CharField(default=b'', max_length=255, blank=True)), + ('postcode', models.CharField(default=b'', max_length=255, blank=True)), + ('floor', models.CharField(default=b'', max_length=255, blank=True)), + ('office_number', models.CharField(default=b'', max_length=255, blank=True)), + ('kind', models.CharField(default=b'', max_length=255, blank=True)), + ('name', models.CharField(default=b'', max_length=255, blank=True)), + ('location', models.CharField(default=b'', max_length=255, blank=True)), + ], + options={ + 'abstract': False, + }, + ), + migrations.CreateModel( + name='Chamber', + fields=[ + ('id', models.AutoField(verbose_name='ID', serialize=False, auto_created=True, primary_key=True)), + ('name', models.CharField(max_length=255)), + ('abbreviation', models.CharField(default=b'', max_length=10, db_index=True, blank=True)), + ], + ), + migrations.CreateModel( + name='Constituency', + fields=[ + ('id', models.AutoField(verbose_name='ID', serialize=False, auto_created=True, primary_key=True)), + ('created', models.DateTimeField(auto_now_add=True)), + ('updated', models.DateTimeField(auto_now=True)), + ('name', models.CharField(max_length=255)), + ], + options={ + 'abstract': False, + }, + ), migrations.CreateModel( name='Country', fields=[ - ('id', - models.AutoField( - verbose_name='ID', - serialize=False, - auto_created=True, - primary_key=True)), - ('name', - models.CharField( - max_length=255)), - ('code', - models.CharField( - max_length=2)), + ('id', models.AutoField(verbose_name='ID', serialize=False, auto_created=True, primary_key=True)), + ('name', models.CharField(max_length=255)), + ('code', models.CharField(unique=True, max_length=2)), + ], + ), + migrations.CreateModel( + name='Email', + fields=[ + ('id', models.AutoField(verbose_name='ID', serialize=False, auto_created=True, primary_key=True)), + ('created', models.DateTimeField(auto_now_add=True)), + ('updated', models.DateTimeField(auto_now=True)), + ('email', models.EmailField(max_length=254)), + ('kind', models.CharField(default=b'', max_length=255, blank=True)), ], + options={ + 'abstract': False, + }, ), + migrations.CreateModel( + name='Group', + fields=[ + ('id', models.AutoField(verbose_name='ID', serialize=False, auto_created=True, primary_key=True)), + ('created', models.DateTimeField(auto_now_add=True)), + ('updated', models.DateTimeField(auto_now=True)), + ('name', models.CharField(max_length=511, db_index=True)), + ('abbreviation', models.CharField(default=b'', max_length=10, db_index=True, blank=True)), + ('kind', models.CharField(max_length=255, db_index=True)), + ('chamber', models.ForeignKey(related_name='groups', to='representatives.Chamber', null=True)), + ], + options={ + 'ordering': ('name',), + }, + ), + migrations.CreateModel( + name='Mandate', + fields=[ + ('id', models.AutoField(verbose_name='ID', serialize=False, auto_created=True, primary_key=True)), + ('created', models.DateTimeField(auto_now_add=True)), + ('updated', models.DateTimeField(auto_now=True)), + ('role', models.CharField(default=b'', help_text=b'Eg.: president of a political group', max_length=255, blank=True)), + ('begin_date', models.DateField(null=True, blank=True)), + ('end_date', models.DateField(null=True, blank=True)), + ('link', models.URLField()), + ('constituency', models.ForeignKey(related_name='mandates', to='representatives.Constituency', null=True)), + ('group', models.ForeignKey(related_name='mandates', to='representatives.Group', null=True)), + ], + options={ + 'ordering': ('-end_date',), + }, + ), + migrations.CreateModel( + name='Phone', + fields=[ + ('id', models.AutoField(verbose_name='ID', serialize=False, auto_created=True, primary_key=True)), + ('created', models.DateTimeField(auto_now_add=True)), + ('updated', models.DateTimeField(auto_now=True)), + ('number', models.CharField(default=b'', max_length=255, blank=True)), + ('kind', models.CharField(default=b'', max_length=255, blank=True)), + ('address', models.ForeignKey(related_name='phones', to='representatives.Address', null=True)), + ], + options={ + 'abstract': False, + }, + ), + migrations.CreateModel( + name='Representative', + fields=[ + ('id', models.AutoField(verbose_name='ID', serialize=False, auto_created=True, primary_key=True)), + ('created', models.DateTimeField(auto_now_add=True)), + ('updated', models.DateTimeField(auto_now=True)), + ('slug', models.SlugField(unique=True, max_length=100)), + ('first_name', models.CharField(default=b'', max_length=255, blank=True)), + ('last_name', models.CharField(default=b'', max_length=255, blank=True)), + ('full_name', models.CharField(max_length=255)), + ('gender', models.SmallIntegerField(default=0, choices=[(0, b'N/A'), (1, b'F'), (2, b'M')])), + ('birth_place', models.CharField(default=b'', max_length=255, blank=True)), + ('birth_date', models.DateField(null=True, blank=True)), + ('cv', models.TextField(default=b'', blank=True)), + ('photo', models.CharField(max_length=512, null=True)), + ('active', models.BooleanField(default=False)), + ], + options={ + 'ordering': ['last_name', 'first_name'], + }, + ), + migrations.CreateModel( + name='WebSite', + fields=[ + ('id', models.AutoField(verbose_name='ID', serialize=False, auto_created=True, primary_key=True)), + ('created', models.DateTimeField(auto_now_add=True)), + ('updated', models.DateTimeField(auto_now=True)), + ('url', models.CharField(default=b'', max_length=2048, blank=True)), + ('kind', models.CharField(default=b'', max_length=255, blank=True)), + ('representative', models.ForeignKey(to='representatives.Representative')), + ], + options={ + 'abstract': False, + }, + ), + migrations.AddField( + model_name='phone', + name='representative', + field=models.ForeignKey(to='representatives.Representative'), + ), + migrations.AddField( + model_name='mandate', + name='representative', + field=models.ForeignKey(related_name='mandates', to='representatives.Representative'), + ), + migrations.AddField( + model_name='email', + name='representative', + field=models.ForeignKey(to='representatives.Representative'), + ), + migrations.AddField( + model_name='constituency', + name='country', + field=models.ForeignKey(related_name='constituencies', blank=True, to='representatives.Country', null=True), + ), + migrations.AddField( + model_name='chamber', + name='country', + field=models.ForeignKey(related_name='chambers', to='representatives.Country', null=True), + ), + migrations.AddField( + model_name='address', + name='country', + field=models.ForeignKey(to='representatives.Country'), + ), + migrations.AddField( + model_name='address', + name='representative', + field=models.ForeignKey(to='representatives.Representative'), + ), + + migrations.RunPython(load_fixture, reverse_code=unload_fixture), + + migrations.RunPython(create_ep_chamber), ] diff --git a/src/representatives/migrations/0002_fixtures.py b/src/representatives/migrations/0002_fixtures.py deleted file mode 100644 index 499124e..0000000 --- a/src/representatives/migrations/0002_fixtures.py +++ /dev/null @@ -1,41 +0,0 @@ -# -*- coding: utf-8 -*- -from __future__ import unicode_literals - -import os - -from django.core import serializers -from django.db import migrations - -fixture_dir = os.path.abspath( - os.path.join( - os.path.dirname(__file__), - '../fixtures')) -fixture_filename = 'country_initial_data.json' - - -def load_fixture(apps, schema_editor): - fixture_file = os.path.join(fixture_dir, fixture_filename) - - fixture = open(fixture_file, 'rb') - objects = serializers.deserialize('json', fixture, ignorenonexistent=True) - for obj in objects: - obj.save() - fixture.close() - - -def unload_fixture(apps, schema_editor): - "Brutally deleting all entries for this model..." - - MyModel = apps.get_model("representatives", "Country") - MyModel.objects.all().delete() - - -class Migration(migrations.Migration): - - dependencies = [ - ('representatives', '0001_initial'), - ] - - operations = [ - migrations.RunPython(load_fixture, reverse_code=unload_fixture), - ] diff --git a/src/representatives/migrations/0003_auto_20150702_1827.py b/src/representatives/migrations/0003_auto_20150702_1827.py deleted file mode 100644 index 8990b6d..0000000 --- a/src/representatives/migrations/0003_auto_20150702_1827.py +++ /dev/null @@ -1,165 +0,0 @@ -# -*- coding: utf-8 -*- -from __future__ import unicode_literals - -from django.db import migrations, models - - -class Migration(migrations.Migration): - - dependencies = [ - ('representatives', '0002_fixtures'), - ] - - operations = [ - migrations.CreateModel( - name='Address', - fields=[ - ('id', models.AutoField(verbose_name='ID', serialize=False, auto_created=True, primary_key=True)), - ('created', models.DateTimeField(auto_now_add=True)), - ('updated', models.DateTimeField(auto_now=True)), - ('city', models.CharField(default=b'', max_length=255, blank=True)), - ('street', models.CharField(default=b'', max_length=255, blank=True)), - ('number', models.CharField(default=b'', max_length=255, blank=True)), - ('postcode', models.CharField(default=b'', max_length=255, blank=True)), - ('floor', models.CharField(default=b'', max_length=255, blank=True)), - ('office_number', models.CharField(default=b'', max_length=255, blank=True)), - ('kind', models.CharField(default=b'', max_length=255, blank=True)), - ('name', models.CharField(default=b'', max_length=255, blank=True)), - ('location', models.CharField(default=b'', max_length=255, blank=True)), - ('country', models.ForeignKey(to='representatives.Country')), - ], - options={ - 'abstract': False, - }, - ), - migrations.CreateModel( - name='Constituency', - fields=[ - ('id', models.AutoField(verbose_name='ID', serialize=False, auto_created=True, primary_key=True)), - ('created', models.DateTimeField(auto_now_add=True)), - ('updated', models.DateTimeField(auto_now=True)), - ('fingerprint', models.CharField(unique=True, max_length=40)), - ('name', models.CharField(max_length=255)), - ], - options={ - 'abstract': False, - }, - ), - migrations.CreateModel( - name='Email', - fields=[ - ('id', models.AutoField(verbose_name='ID', serialize=False, auto_created=True, primary_key=True)), - ('created', models.DateTimeField(auto_now_add=True)), - ('updated', models.DateTimeField(auto_now=True)), - ('email', models.EmailField(max_length=254)), - ('kind', models.CharField(default=b'', max_length=255, blank=True)), - ], - options={ - 'abstract': False, - }, - ), - migrations.CreateModel( - name='Group', - fields=[ - ('id', models.AutoField(verbose_name='ID', serialize=False, auto_created=True, primary_key=True)), - ('created', models.DateTimeField(auto_now_add=True)), - ('updated', models.DateTimeField(auto_now=True)), - ('fingerprint', models.CharField(unique=True, max_length=40)), - ('name', models.CharField(max_length=255)), - ('abbreviation', models.CharField(default=b'', max_length=10, blank=True)), - ('kind', models.CharField(default=b'', max_length=255, blank=True)), - ], - options={ - 'abstract': False, - }, - ), - migrations.CreateModel( - name='Mandate', - fields=[ - ('id', models.AutoField(verbose_name='ID', serialize=False, auto_created=True, primary_key=True)), - ('created', models.DateTimeField(auto_now_add=True)), - ('updated', models.DateTimeField(auto_now=True)), - ('fingerprint', models.CharField(unique=True, max_length=40)), - ('role', models.CharField(default=b'', help_text=b'Eg.: president of a political group at the European Parliament', max_length=25, blank=True)), - ('begin_date', models.DateField(null=True, blank=True)), - ('end_date', models.DateField(null=True, blank=True)), - ('link', models.URLField()), - ('constituency', models.ForeignKey(related_name='mandates', to='representatives.Constituency', null=True)), - ('group', models.ForeignKey(related_name='mandates', to='representatives.Group', null=True)), - ], - options={ - 'abstract': False, - }, - ), - migrations.CreateModel( - name='Phone', - fields=[ - ('id', models.AutoField(verbose_name='ID', serialize=False, auto_created=True, primary_key=True)), - ('created', models.DateTimeField(auto_now_add=True)), - ('updated', models.DateTimeField(auto_now=True)), - ('number', models.CharField(default=b'', max_length=255, blank=True)), - ('kind', models.CharField(default=b'', max_length=255, blank=True)), - ('address', models.ForeignKey(related_name='phones', to='representatives.Address', null=True)), - ], - options={ - 'abstract': False, - }, - ), - migrations.CreateModel( - name='Representative', - fields=[ - ('id', models.AutoField(verbose_name='ID', serialize=False, auto_created=True, primary_key=True)), - ('created', models.DateTimeField(auto_now_add=True)), - ('updated', models.DateTimeField(auto_now=True)), - ('fingerprint', models.CharField(unique=True, max_length=40)), - ('slug', models.SlugField(max_length=100)), - ('remote_id', models.CharField(unique=True, max_length=255)), - ('first_name', models.CharField(default=b'', max_length=255, blank=True)), - ('last_name', models.CharField(default=b'', max_length=255, blank=True)), - ('full_name', models.CharField(max_length=255)), - ('gender', models.SmallIntegerField(default=0, choices=[(0, b'N/A'), (1, b'F'), (2, b'M')])), - ('birth_place', models.CharField(default=b'', max_length=255, blank=True)), - ('birth_date', models.DateField(null=True, blank=True)), - ('cv', models.TextField(default=b'', blank=True)), - ('photo', models.CharField(max_length=512, null=True)), - ('active', models.BooleanField(default=False)), - ], - options={ - 'abstract': False, - }, - ), - migrations.CreateModel( - name='WebSite', - fields=[ - ('id', models.AutoField(verbose_name='ID', serialize=False, auto_created=True, primary_key=True)), - ('created', models.DateTimeField(auto_now_add=True)), - ('updated', models.DateTimeField(auto_now=True)), - ('url', models.CharField(default=b'', max_length=2048, blank=True)), - ('kind', models.CharField(default=b'', max_length=255, blank=True)), - ('representative', models.ForeignKey(to='representatives.Representative')), - ], - options={ - 'abstract': False, - }, - ), - migrations.AddField( - model_name='phone', - name='representative', - field=models.ForeignKey(to='representatives.Representative'), - ), - migrations.AddField( - model_name='mandate', - name='representative', - field=models.ForeignKey(related_name='mandates', to='representatives.Representative'), - ), - migrations.AddField( - model_name='email', - name='representative', - field=models.ForeignKey(to='representatives.Representative'), - ), - migrations.AddField( - model_name='address', - name='representative', - field=models.ForeignKey(to='representatives.Representative'), - ), - ] diff --git a/src/representatives/migrations/0004_auto_20150709_1601.py b/src/representatives/migrations/0004_auto_20150709_1601.py deleted file mode 100644 index 87889e9..0000000 --- a/src/representatives/migrations/0004_auto_20150709_1601.py +++ /dev/null @@ -1,18 +0,0 @@ -# -*- coding: utf-8 -*- -from __future__ import unicode_literals - -from django.db import migrations, models - - -class Migration(migrations.Migration): - - dependencies = [ - ('representatives', '0003_auto_20150702_1827'), - ] - - operations = [ - migrations.AlterModelOptions( - name='representative', - options={'ordering': ['last_name', 'first_name']}, - ), - ] diff --git a/src/representatives/migrations/0005_auto_20151212_2251.py b/src/representatives/migrations/0005_auto_20151212_2251.py deleted file mode 100644 index d7df7d6..0000000 --- a/src/representatives/migrations/0005_auto_20151212_2251.py +++ /dev/null @@ -1,19 +0,0 @@ -# -*- coding: utf-8 -*- -from __future__ import unicode_literals - -from django.db import migrations, models - - -class Migration(migrations.Migration): - - dependencies = [ - ('representatives', '0004_auto_20150709_1601'), - ] - - operations = [ - migrations.AlterField( - model_name='mandate', - name='role', - field=models.CharField(default=b'', help_text=b'Eg.: president of a political group', max_length=25, blank=True), - ), - ] diff --git a/src/representatives/migrations/0006_auto_20151213_0139.py b/src/representatives/migrations/0006_auto_20151213_0139.py deleted file mode 100644 index feda28d..0000000 --- a/src/representatives/migrations/0006_auto_20151213_0139.py +++ /dev/null @@ -1,23 +0,0 @@ -# -*- coding: utf-8 -*- -from __future__ import unicode_literals - -from django.db import migrations, models - - -def remove_duplicate(apps, schema_editor): - Country = apps.get_model('representatives', 'country') - Address = apps.get_model('representatives', 'address') - if Country.objects.filter(pk=12, code='IL').count(): - Address.objects.filter(country_id=12).update(country_id=1121) - Country.objects.get(pk=12).delete() - - -class Migration(migrations.Migration): - - dependencies = [ - ('representatives', '0005_auto_20151212_2251'), - ] - - operations = [ - migrations.RunPython(remove_duplicate) - ] diff --git a/src/representatives/migrations/0007_auto_20151213_0156.py b/src/representatives/migrations/0007_auto_20151213_0156.py deleted file mode 100644 index 59c32d6..0000000 --- a/src/representatives/migrations/0007_auto_20151213_0156.py +++ /dev/null @@ -1,19 +0,0 @@ -# -*- coding: utf-8 -*- -from __future__ import unicode_literals - -from django.db import migrations, models - - -class Migration(migrations.Migration): - - dependencies = [ - ('representatives', '0006_auto_20151213_0139'), - ] - - operations = [ - migrations.AlterField( - model_name='country', - name='code', - field=models.CharField(unique=True, max_length=2), - ), - ] diff --git a/src/representatives/migrations/0008_constituency_country.py b/src/representatives/migrations/0008_constituency_country.py deleted file mode 100644 index d9d0e4b..0000000 --- a/src/representatives/migrations/0008_constituency_country.py +++ /dev/null @@ -1,19 +0,0 @@ -# -*- coding: utf-8 -*- -from __future__ import unicode_literals - -from django.db import migrations, models - - -class Migration(migrations.Migration): - - dependencies = [ - ('representatives', '0007_auto_20151213_0156'), - ] - - operations = [ - migrations.AddField( - model_name='constituency', - name='country', - field=models.ForeignKey(blank=True, to='representatives.Country', null=True), - ), - ] diff --git a/src/representatives/migrations/0009_order_mandates_by_end_date_descendant.py b/src/representatives/migrations/0009_order_mandates_by_end_date_descendant.py deleted file mode 100644 index e4ff327..0000000 --- a/src/representatives/migrations/0009_order_mandates_by_end_date_descendant.py +++ /dev/null @@ -1,18 +0,0 @@ -# -*- coding: utf-8 -*- -from __future__ import unicode_literals - -from django.db import migrations, models - - -class Migration(migrations.Migration): - - dependencies = [ - ('representatives', '0008_constituency_country'), - ] - - operations = [ - migrations.AlterModelOptions( - name='mandate', - options={'ordering': ('end_date',)}, - ), - ] diff --git a/src/representatives/migrations/0010_index_group_kind_and_abbreviation.py b/src/representatives/migrations/0010_index_group_kind_and_abbreviation.py deleted file mode 100644 index 93324a9..0000000 --- a/src/representatives/migrations/0010_index_group_kind_and_abbreviation.py +++ /dev/null @@ -1,28 +0,0 @@ -# -*- coding: utf-8 -*- -from __future__ import unicode_literals - -from django.db import migrations, models - - -class Migration(migrations.Migration): - - dependencies = [ - ('representatives', '0009_order_mandates_by_end_date_descendant'), - ] - - operations = [ - migrations.AlterModelOptions( - name='mandate', - options={'ordering': ('-end_date',)}, - ), - migrations.AlterField( - model_name='group', - name='abbreviation', - field=models.CharField(default=b'', max_length=10, db_index=True, blank=True), - ), - migrations.AlterField( - model_name='group', - name='kind', - field=models.CharField(max_length=255, db_index=True), - ), - ] diff --git a/src/representatives/migrations/0011_auto_20151226_1938.py b/src/representatives/migrations/0011_auto_20151226_1938.py deleted file mode 100644 index 1b83fab..0000000 --- a/src/representatives/migrations/0011_auto_20151226_1938.py +++ /dev/null @@ -1,18 +0,0 @@ -# -*- coding: utf-8 -*- -from __future__ import unicode_literals - -from django.db import migrations, models - - -class Migration(migrations.Migration): - - dependencies = [ - ('representatives', '0010_index_group_kind_and_abbreviation'), - ] - - operations = [ - migrations.AlterModelOptions( - name='group', - options={'ordering': ('name',)}, - ), - ] diff --git a/src/representatives/migrations/0012_index_group_name.py b/src/representatives/migrations/0012_index_group_name.py deleted file mode 100644 index 1fe899f..0000000 --- a/src/representatives/migrations/0012_index_group_name.py +++ /dev/null @@ -1,19 +0,0 @@ -# -*- coding: utf-8 -*- -from __future__ import unicode_literals - -from django.db import migrations, models - - -class Migration(migrations.Migration): - - dependencies = [ - ('representatives', '0011_auto_20151226_1938'), - ] - - operations = [ - migrations.AlterField( - model_name='group', - name='name', - field=models.CharField(max_length=255, db_index=True), - ), - ] diff --git a/src/representatives/migrations/0013_constituency_country_related_name.py b/src/representatives/migrations/0013_constituency_country_related_name.py deleted file mode 100644 index c103861..0000000 --- a/src/representatives/migrations/0013_constituency_country_related_name.py +++ /dev/null @@ -1,19 +0,0 @@ -# -*- coding: utf-8 -*- -from __future__ import unicode_literals - -from django.db import migrations, models - - -class Migration(migrations.Migration): - - dependencies = [ - ('representatives', '0012_index_group_name'), - ] - - operations = [ - migrations.AlterField( - model_name='constituency', - name='country', - field=models.ForeignKey(related_name='constituencies', blank=True, to='representatives.Country', null=True), - ), - ] diff --git a/src/representatives/migrations/0014_chamber.py b/src/representatives/migrations/0014_chamber.py deleted file mode 100644 index 8047939..0000000 --- a/src/representatives/migrations/0014_chamber.py +++ /dev/null @@ -1,31 +0,0 @@ -# -*- coding: utf-8 -*- -from __future__ import unicode_literals - -from django.db import migrations, models - - -class Migration(migrations.Migration): - - dependencies = [ - ('representatives', '0013_constituency_country_related_name'), - ] - - operations = [ - migrations.CreateModel( - name='Chamber', - fields=[ - ('id', models.AutoField(verbose_name='ID', serialize=False, auto_created=True, primary_key=True)), - ('fingerprint', models.CharField(unique=True, max_length=40)), - ('name', models.CharField(max_length=255)), - ('country', models.ForeignKey(related_name='chambers', to='representatives.Country', null=True)), - ], - options={ - 'abstract': False, - }, - ), - migrations.AddField( - model_name='group', - name='chamber', - field=models.ForeignKey(related_name='groups', to='representatives.Chamber', null=True), - ), - ] diff --git a/src/representatives/migrations/0015_chamber_abbreviation.py b/src/representatives/migrations/0015_chamber_abbreviation.py deleted file mode 100644 index 865b7a2..0000000 --- a/src/representatives/migrations/0015_chamber_abbreviation.py +++ /dev/null @@ -1,19 +0,0 @@ -# -*- coding: utf-8 -*- -from __future__ import unicode_literals - -from django.db import migrations, models - - -class Migration(migrations.Migration): - - dependencies = [ - ('representatives', '0014_chamber'), - ] - - operations = [ - migrations.AddField( - model_name='chamber', - name='abbreviation', - field=models.CharField(default=b'', max_length=10, db_index=True, blank=True), - ), - ] diff --git a/src/representatives/migrations/0016_chamber_migrate_data.py b/src/representatives/migrations/0016_chamber_migrate_data.py deleted file mode 100644 index d42bf4f..0000000 --- a/src/representatives/migrations/0016_chamber_migrate_data.py +++ /dev/null @@ -1,120 +0,0 @@ -# -*- coding: utf-8 -*- -from __future__ import unicode_literals -import hashlib - -from django.db import migrations, models -from django.utils.encoding import smart_str - - -def calculate_hash(obj): - """ - Computes fingerprint for an object, this code is duplicated from - representatives.models.HashableModel because we don't have access to model - methods in a migration scenario. - """ - - hashable_fields = { - 'Chamber': ['name', 'country', 'abbreviation'], - 'Constituency': ['name'], - 'Group': ['name', 'abbreviation', 'kind', 'chamber'], - 'Mandate': ['group', 'constituency', 'role', 'begin_date', 'end_date', - 'representative'] - } - - fingerprint = hashlib.sha1() - for field_name in hashable_fields[obj.__class__.__name__]: - field = obj._meta.get_field(field_name) - if field.is_relation: - related = getattr(obj, field_name) - if related is None: - fingerprint.update(smart_str(related)) - else: - fingerprint.update(related.fingerprint) - else: - fingerprint.update(smart_str(getattr(obj, field_name))) - obj.fingerprint = fingerprint.hexdigest() - return obj.fingerprint - - -def get_or_create(cls, **kwargs): - """ - Implements get_or_create logic for models that inherit from - representatives.models.HashableModel because we don't have access to model - methods in a migration scenario. - """ - - try: - obj = cls.objects.get(**kwargs) - created = False - except cls.DoesNotExist: - obj = cls(**kwargs) - created = True - calculate_hash(obj) - obj.save() - - return (obj, created) - - -def migrate_ep_chamber(apps, schema_editor): - # Get model managers - - Chamber = apps.get_model("representatives", "Chamber") - Constituency = apps.get_model("representatives", "Constituency") - Group = apps.get_model("representatives", "Group") - Mandate = apps.get_model("representatives", "Mandate") - - # Create EP chamber, constituency and group - - name = 'European Parliament' - abbr = 'EP' - - ep_chamber, _ = get_or_create(Chamber, name=name, abbreviation=abbr) - ep_constituency, _ = get_or_create(Constituency, name=name) - ep_group, _ = get_or_create(Group, name=name, kind='chamber', - abbreviation=abbr, chamber=ep_chamber) - - # Set chamber on groups - - ep_group_kinds = [ - 'committee', - 'delegation', - 'group' - ] - - Group.objects.filter(kind__in=ep_group_kinds).update(chamber=ep_chamber) - - # Set constituency on EP mandates - - ep_mandate_kinds = [ - 'committee', - 'delegation', - 'group', - 'organization' - ] - - Mandate.objects.filter(group__kind__in=ep_mandate_kinds).update( - constituency=ep_constituency) - - # Create EP mandates with EP constituency & group with same timespan as - # the country mandate - - for m in Mandate.objects.filter(group__kind__exact='country'): - mandate, _ = get_or_create(Mandate, - representative=m.representative, - group=ep_group, - constituency=ep_constituency, - role=m.role, - begin_date=m.begin_date, - end_date=m.end_date - ) - - -class Migration(migrations.Migration): - - dependencies = [ - ('representatives', '0015_chamber_abbreviation'), - ] - - operations = [ - migrations.RunPython(migrate_ep_chamber) - ] diff --git a/src/representatives/migrations/0017_auto_20160623_2201.py b/src/representatives/migrations/0017_auto_20160623_2201.py deleted file mode 100644 index 201d885..0000000 --- a/src/representatives/migrations/0017_auto_20160623_2201.py +++ /dev/null @@ -1,30 +0,0 @@ -# -*- coding: utf-8 -*- -from __future__ import unicode_literals - -from django.db import migrations, models - - -def migrate_constituencies(apps, schema_editor): - """ - Re-save constituencies to recompute fingerprints - """ - Constituency = apps.get_model("representatives", "Constituency") - for c in Constituency.objects.all(): - c.save() - - -class Migration(migrations.Migration): - - dependencies = [ - ('representatives', '0016_chamber_migrate_data'), - ] - - operations = [ - migrations.AlterField( - model_name='mandate', - name='role', - field=models.CharField(default=b'', help_text=b'Eg.: president of a political group', max_length=255, blank=True), - ), - - migrations.RunPython(migrate_constituencies) - ] diff --git a/src/representatives/migrations/0018_auto_20160624_0517.py b/src/representatives/migrations/0018_auto_20160624_0517.py deleted file mode 100644 index 0330121..0000000 --- a/src/representatives/migrations/0018_auto_20160624_0517.py +++ /dev/null @@ -1,19 +0,0 @@ -# -*- coding: utf-8 -*- -from __future__ import unicode_literals - -from django.db import migrations, models - - -class Migration(migrations.Migration): - - dependencies = [ - ('representatives', '0017_auto_20160623_2201'), - ] - - operations = [ - migrations.AlterField( - model_name='group', - name='name', - field=models.CharField(max_length=511, db_index=True), - ), - ] diff --git a/src/representatives/migrations/0019_remove_fingerprints.py b/src/representatives/migrations/0019_remove_fingerprints.py deleted file mode 100644 index f7be7e0..0000000 --- a/src/representatives/migrations/0019_remove_fingerprints.py +++ /dev/null @@ -1,34 +0,0 @@ -# -*- coding: utf-8 -*- -from __future__ import unicode_literals - -from django.db import migrations, models - - -class Migration(migrations.Migration): - - dependencies = [ - ('representatives', '0018_auto_20160624_0517'), - ] - - operations = [ - migrations.RemoveField( - model_name='chamber', - name='fingerprint', - ), - migrations.RemoveField( - model_name='constituency', - name='fingerprint', - ), - migrations.RemoveField( - model_name='group', - name='fingerprint', - ), - migrations.RemoveField( - model_name='mandate', - name='fingerprint', - ), - migrations.RemoveField( - model_name='representative', - name='fingerprint', - ), - ] diff --git a/src/representatives/migrations/0020_rep_unique_slug_remove_remoteid.py b/src/representatives/migrations/0020_rep_unique_slug_remove_remoteid.py deleted file mode 100644 index 5a70957..0000000 --- a/src/representatives/migrations/0020_rep_unique_slug_remove_remoteid.py +++ /dev/null @@ -1,103 +0,0 @@ -# -*- coding: utf-8 -*- -from __future__ import unicode_literals - -import datetime - -from django.db import connection, migrations, models - - -def update_slugs(apps, schema_editor): - """ - Include birthdate in slugs - """ - - # Get model managers - Representative = apps.get_model("representatives", "Representative") - - for rep in Representative.objects.all(): - rep.slug = '%s-%s' % (rep.slug, rep.birth_date) - rep.save() - - -def create_parl_websites(apps, schema_editor): - """ - Prepare for remote_id removal by creating WebSite entities from it. - """ - - # Get model managers - Representative = apps.get_model("representatives", "Representative") - WebSite = apps.get_model("representatives", "WebSite") - - today = datetime.date.today() - - # EP - ep_url = 'http://www.europarl.europa.eu/meps/en/%s/_home.html' - qs = Representative.objects.filter( - models.Q(mandates__end_date__gte=today) | - models.Q(mandates__end_date__isnull=True), - mandates__group__chamber__abbreviation='EP' - ) - for rep in qs: - changed = False - url = ep_url % rep.remote_id - - try: - site = WebSite.objects.get(representative=rep, kind='EP') - except WebSite.DoesNotExist: - site = WebSite(representative=rep, kind='EP', url=url) - changed = True - - if site.url != url: - site.url = url - changed = True - - if changed: - site.save() - - # AN/SEN - for chamber in ['AN', 'SEN']: - qs = Representative.objects.filter( - models.Q(mandates__end_date__gte=today) | - models.Q(mandates__end_date__isnull=True), - mandates__group__chamber__abbreviation=chamber - ) - for rep in qs: - changed = False - url = rep.remote_id - - try: - site = WebSite.objects.get(representative=rep, kind=chamber) - except WebSite.DoesNotExist: - site = WebSite(representative=rep, kind=chamber, url=url) - changed = True - - if site.url != url: - site.url = url - changed = True - - if changed: - site.save() - - -class Migration(migrations.Migration): - - dependencies = [ - ('representatives', '0019_remove_fingerprints'), - ] - - operations = [ - migrations.RunPython(update_slugs), - - migrations.RunPython(create_parl_websites), - - migrations.RemoveField( - model_name='representative', - name='remote_id', - ), - - migrations.AlterField( - model_name='representative', - name='slug', - field=models.SlugField(unique=True, max_length=100), - ), - ] diff --git a/src/representatives/migrations/0021_update_fr_committees.py b/src/representatives/migrations/0021_update_fr_committees.py deleted file mode 100644 index 5d35a47..0000000 --- a/src/representatives/migrations/0021_update_fr_committees.py +++ /dev/null @@ -1,72 +0,0 @@ -# -*- coding: utf-8 -*- -from __future__ import unicode_literals - -from django.db import migrations, models - - -def update_kinds(apps, schema_editor): - """ - Downgrade FR special committees to delegations - """ - - # Get model managers - Group = apps.get_model("representatives", "Group") - - qs = Group.objects.filter( - models.Q(name__iregex=ur'^commission d\'enquête') | - models.Q(name__iregex=ur'^commission spéciale') - ) - - for g in qs: - g.kind = 'delegation' - g.save() - - -def update_abbreviations(apps, schema_editor): - """ - Migrate to new FR committee abbreviations - """ - - # Get model managers - Group = apps.get_model("representatives", "Group") - - # Abbreviation mapping - amap = { - u'SenComCult': u'Culture', - u'SenComEco': u'Économie', - u'SenComDef': u'Défense', - u'SenComEU': u'Europe', - u'SenComSoc': u'Social', - u'SenComFin': u'Finances', - u'SenComLois': u'Lois', - u'SenComDevD': u'', - u'SenComAppL': u'', - u'AnComCult': u'Culture', - u'AnComEco': u'Économie', - u'AnComEtrg': u'Étranger', - u'AnComDef': u'Défense', - u'AnComEU': u'Europe', - u'AnComSoc': u'Social', - u'AnComFin': u'Finances', - u'AnComLois': u'Lois', - u'AnComDevD': u'', - u'AnComImmu': u'', - } - - for old, new in amap.iteritems(): - for g in Group.objects.filter(abbreviation=old): - g.abbreviation = new - g.save() - - -class Migration(migrations.Migration): - - dependencies = [ - ('representatives', '0020_rep_unique_slug_remove_remoteid'), - ] - - operations = [ - migrations.RunPython(update_kinds), - - migrations.RunPython(update_abbreviations), - ] diff --git a/src/representatives_positions/migrations/0001_initial.py b/src/representatives_positions/migrations/0001_initial.py index 4c4fcf5..149c423 100644 --- a/src/representatives_positions/migrations/0001_initial.py +++ b/src/representatives_positions/migrations/0001_initial.py @@ -2,14 +2,12 @@ from __future__ import unicode_literals from django.db import migrations, models -import taggit.managers class Migration(migrations.Migration): dependencies = [ - ('representatives', '0011_auto_20151226_1938'), - ('taggit', '0002_auto_20150616_2121'), + ('representatives', '0001_initial'), ] operations = [ @@ -18,11 +16,13 @@ class Migration(migrations.Migration): fields=[ ('id', models.AutoField(verbose_name='ID', serialize=False, auto_created=True, primary_key=True)), ('datetime', models.DateField()), + ('kind', models.CharField(default=b'other', max_length=64, choices=[(b'other', b'Other'), (b'blog', b'Blog post'), (b'social', b'Social network'), (b'press', b'Press interview'), (b'parliament', b'Parliament debate')])), + ('title', models.CharField(max_length=500, null=True)), ('text', models.TextField()), - ('link', models.URLField()), + ('link', models.URLField(max_length=500)), + ('score', models.IntegerField(default=0)), ('published', models.BooleanField(default=False)), ('representative', models.ForeignKey(related_name='positions', to='representatives.Representative')), - ('tags', taggit.managers.TaggableManager(to='taggit.Tag', through='taggit.TaggedItem', help_text='A comma-separated list of tags.', verbose_name='Tags')), ], ), ] diff --git a/src/representatives_positions/migrations/0002_increase_link_length.py b/src/representatives_positions/migrations/0002_increase_link_length.py deleted file mode 100644 index c1d5e49..0000000 --- a/src/representatives_positions/migrations/0002_increase_link_length.py +++ /dev/null @@ -1,19 +0,0 @@ -# -*- coding: utf-8 -*- -from __future__ import unicode_literals - -from django.db import migrations, models - - -class Migration(migrations.Migration): - - dependencies = [ - ('representatives_positions', '0001_initial'), - ] - - operations = [ - migrations.AlterField( - model_name='position', - name='link', - field=models.URLField(max_length=500), - ), - ] diff --git a/src/representatives_positions/migrations/0003_remove_position_tags.py b/src/representatives_positions/migrations/0003_remove_position_tags.py deleted file mode 100644 index e398968..0000000 --- a/src/representatives_positions/migrations/0003_remove_position_tags.py +++ /dev/null @@ -1,18 +0,0 @@ -# -*- coding: utf-8 -*- -from __future__ import unicode_literals - -from django.db import migrations, models - - -class Migration(migrations.Migration): - - dependencies = [ - ('representatives_positions', '0002_increase_link_length'), - ] - - operations = [ - migrations.RemoveField( - model_name='position', - name='tags', - ), - ] diff --git a/src/representatives_positions/migrations/0004_add_kind_score_title.py b/src/representatives_positions/migrations/0004_add_kind_score_title.py deleted file mode 100644 index e5ba557..0000000 --- a/src/representatives_positions/migrations/0004_add_kind_score_title.py +++ /dev/null @@ -1,29 +0,0 @@ -# -*- coding: utf-8 -*- -from __future__ import unicode_literals - -from django.db import migrations, models - - -class Migration(migrations.Migration): - - dependencies = [ - ('representatives_positions', '0003_remove_position_tags'), - ] - - operations = [ - migrations.AddField( - model_name='position', - name='kind', - field=models.CharField(default=b'other', max_length=64, choices=[(b'other', b'Other'), (b'blog', b'Blog post'), (b'social', b'Social network'), (b'press', b'Press interview'), (b'parliament', b'Parliament debate')]), - ), - migrations.AddField( - model_name='position', - name='score', - field=models.IntegerField(default=0), - ), - migrations.AddField( - model_name='position', - name='title', - field=models.CharField(max_length=500, null=True), - ), - ] diff --git a/src/representatives_positions/migrations/0005_set_title.py b/src/representatives_positions/migrations/0005_set_title.py deleted file mode 100644 index b3338a9..0000000 --- a/src/representatives_positions/migrations/0005_set_title.py +++ /dev/null @@ -1,29 +0,0 @@ -# -*- coding: utf-8 -*- -from __future__ import unicode_literals - -from django.db import migrations, models - - -def set_titles(apps, schema_editor): - """ - Set position title to first line for multiline positions - """ - - Position = apps.get_model("representatives_positions", "Position") - - for pos in Position.objects.all(): - lines = pos.text.split('\n') - if len(lines) > 1: - pos.title = lines[0][0:500] - pos.save() - - -class Migration(migrations.Migration): - - dependencies = [ - ('representatives_positions', '0004_add_kind_score_title'), - ] - - operations = [ - migrations.RunPython(set_titles) - ] diff --git a/src/representatives_positions/migrations/0006_positionscore.py b/src/representatives_positions/migrations/0006_positionscore.py deleted file mode 100644 index a3912a0..0000000 --- a/src/representatives_positions/migrations/0006_positionscore.py +++ /dev/null @@ -1,49 +0,0 @@ -# -*- coding: utf-8 -*- -from __future__ import unicode_literals - -from django.db import migrations, models - - -class Migration(migrations.Migration): - - dependencies = [ - ('representatives_positions', '0005_set_title'), - ('representatives_recommendations', '0007_fix_underflow'), - ] - - operations = [ - migrations.CreateModel( - name='PositionScore', - fields=[ - ('id', models.AutoField(verbose_name='ID', serialize=False, auto_created=True, primary_key=True)), - ('score', models.FloatField(default=0)), - ], - options={ - 'db_table': 'representatives_positions_positionscore', - 'managed': False, - }, - ), - - migrations.RunSQL( - """ - CREATE OR REPLACE VIEW "representatives_positions_positionscore" - AS SELECT - "representatives_positions_position"."id" AS "id", - "representatives_positions_position"."id" AS "position_id", - "representatives_positions_position"."representative_id" AS "representative_id", - decay_score( - "representatives_positions_position"."score", - "representatives_positions_position"."datetime", - "decay_num"."value", - "decay_denom"."value", - "exponent"."value", - "decimals"."value" - ) AS "score" - FROM "representatives_positions_position" - JOIN (SELECT CAST(TO_NUMBER(value, '99999') AS NUMERIC) AS value FROM memopol_settings_setting WHERE key = 'SCORE_DECAY_NUM') decay_num ON 1=1 - JOIN (SELECT CAST(TO_NUMBER(value, '99999') AS NUMERIC) AS value FROM memopol_settings_setting WHERE key = 'SCORE_DECAY_DENOM') decay_denom ON 1=1 - JOIN (SELECT CAST(TO_NUMBER(value, '99999') AS NUMERIC) AS value FROM memopol_settings_setting WHERE key = 'SCORE_EXPONENT') exponent ON 1=1 - JOIN (SELECT CAST(TO_NUMBER(value, '99999') AS INTEGER) AS value FROM memopol_settings_setting WHERE key = 'SCORE_DECIMALS') decimals ON 1=1; - """ - ), - ] diff --git a/src/representatives_positions/migrations/0007_remove_positionscore.py b/src/representatives_positions/migrations/0007_remove_positionscore.py deleted file mode 100644 index 55e2221..0000000 --- a/src/representatives_positions/migrations/0007_remove_positionscore.py +++ /dev/null @@ -1,19 +0,0 @@ -# -*- coding: utf-8 -*- -from __future__ import unicode_literals - -from django.db import migrations, models - - -class Migration(migrations.Migration): - - dependencies = [ - ('representatives_positions', '0006_positionscore'), - ] - - operations = [ - migrations.RunSQL( - """ - DROP VIEW "representatives_positions_positionscore"; - """ - ), - ] diff --git a/src/representatives_recommendations/migrations/0001_initial.py b/src/representatives_recommendations/migrations/0001_initial.py index f87350f..ede9fd2 100644 --- a/src/representatives_recommendations/migrations/0001_initial.py +++ b/src/representatives_recommendations/migrations/0001_initial.py @@ -7,8 +7,7 @@ from django.db import migrations, models class Migration(migrations.Migration): dependencies = [ - ('representatives_votes', '0008_unique_proposal_title'), - ('representatives', '0012_index_group_name'), + ('representatives_votes', '0001_initial'), ] operations = [ @@ -19,27 +18,11 @@ class Migration(migrations.Migration): ('recommendation', models.CharField(max_length=10, choices=[(b'abstain', b'abstain'), (b'for', b'for'), (b'against', b'against')])), ('title', models.CharField(max_length=1000, blank=True)), ('description', models.TextField(blank=True)), - ('weight', models.IntegerField(default=0)), + ('weight', models.FloatField(default=0)), ('proposal', models.OneToOneField(related_name='recommendation', to='representatives_votes.Proposal')), ], options={ 'ordering': ['proposal__datetime'], }, ), - migrations.CreateModel( - name='RepresentativeScore', - fields=[ - ('representative', models.OneToOneField(related_name='score', primary_key=True, serialize=False, to='representatives.Representative')), - ('score', models.IntegerField(default=0)), - ], - ), - migrations.CreateModel( - name='ScoredVote', - fields=[ - ], - options={ - 'proxy': True, - }, - bases=('representatives_votes.vote',), - ), ] diff --git a/src/representatives_recommendations/migrations/0002_dossierscore.py b/src/representatives_recommendations/migrations/0002_dossierscore.py deleted file mode 100644 index 72ebd2c..0000000 --- a/src/representatives_recommendations/migrations/0002_dossierscore.py +++ /dev/null @@ -1,47 +0,0 @@ -# -*- coding: utf-8 -*- -from __future__ import unicode_literals - -from django.db import migrations, models - - -class Migration(migrations.Migration): - - dependencies = [ - ('representatives_recommendations', '0001_initial'), - ] - - operations = [ - migrations.CreateModel( - name='DossierScore', - fields=[ - ('id', models.AutoField(verbose_name='ID', serialize=False, auto_created=True, primary_key=True)), - ('score', models.IntegerField(default=0)), - ], - options={ - 'db_table': 'representatives_recommendations_dossierscores', - 'managed': False, - }, - ), - migrations.RunSQL( - """ - CREATE VIEW "representatives_recommendations_dossierscores" - AS SELECT - "representatives_votes_vote"."representative_id" || ':' || "representatives_votes_proposal"."dossier_id" AS "id", - "representatives_votes_vote"."representative_id", - "representatives_votes_proposal"."dossier_id", - SUM(CASE WHEN "representatives_votes_vote"."position" = ("representatives_recommendations_recommendation"."recommendation") - THEN "representatives_recommendations_recommendation"."weight" - ELSE (0 - "representatives_recommendations_recommendation"."weight") - END) AS "score" - FROM "representatives_votes_vote" - INNER JOIN "representatives_votes_proposal" - ON ( "representatives_votes_vote"."proposal_id" = "representatives_votes_proposal"."id" ) - LEFT OUTER JOIN "representatives_recommendations_recommendation" - ON ( "representatives_votes_proposal"."id" = "representatives_recommendations_recommendation"."proposal_id" ) - WHERE "representatives_recommendations_recommendation"."id" IS NOT NULL - GROUP BY - "representatives_votes_vote"."representative_id", - "representatives_votes_proposal"."dossier_id" - """ - ), - ] diff --git a/src/representatives_recommendations/migrations/0003_votescore.py b/src/representatives_recommendations/migrations/0003_votescore.py deleted file mode 100644 index 7fee085..0000000 --- a/src/representatives_recommendations/migrations/0003_votescore.py +++ /dev/null @@ -1,50 +0,0 @@ -# -*- coding: utf-8 -*- -from __future__ import unicode_literals - -from django.db import migrations, models - - -class Migration(migrations.Migration): - - dependencies = [ - ('representatives_recommendations', '0002_dossierscore'), - ] - - operations = [ - migrations.CreateModel( - name='VoteScore', - fields=[ - ('id', models.AutoField(verbose_name='ID', serialize=False, auto_created=True, primary_key=True)), - ('position', models.CharField(max_length=10)), - ('score', models.IntegerField(default=0)), - ], - options={ - 'ordering': ['proposal__datetime'], - 'db_table': 'representatives_recommendations_votescores', - 'managed': False, - }, - ), - migrations.DeleteModel( - name='ScoredVote', - ), - migrations.RunSQL( - """ - CREATE VIEW "representatives_recommendations_votescores" - AS SELECT - "representatives_votes_vote"."id", - "representatives_votes_vote"."position", - "representatives_votes_vote"."proposal_id", - "representatives_votes_vote"."representative_id", - CASE WHEN "representatives_votes_vote"."position" = ("representatives_recommendations_recommendation"."recommendation") - THEN "representatives_recommendations_recommendation"."weight" - ELSE (0 - "representatives_recommendations_recommendation"."weight") - END AS "score" - FROM "representatives_votes_vote" - INNER JOIN "representatives_votes_proposal" - ON ( "representatives_votes_vote"."proposal_id" = "representatives_votes_proposal"."id" ) - LEFT OUTER JOIN "representatives_recommendations_recommendation" - ON ( "representatives_votes_proposal"."id" = "representatives_recommendations_recommendation"."proposal_id" ) - WHERE "representatives_recommendations_recommendation"."id" IS NOT NULL - """ - ) - ] diff --git a/src/representatives_recommendations/migrations/0004_dossierscore_rewrite.py b/src/representatives_recommendations/migrations/0004_dossierscore_rewrite.py deleted file mode 100644 index 6879a96..0000000 --- a/src/representatives_recommendations/migrations/0004_dossierscore_rewrite.py +++ /dev/null @@ -1,35 +0,0 @@ -# -*- coding: utf-8 -*- -from __future__ import unicode_literals - -from django.db import migrations, models - - -class Migration(migrations.Migration): - - dependencies = [ - ('representatives_recommendations', '0003_votescore'), - ] - - operations = [ - migrations.RunSQL( - """ - DROP VIEW "representatives_recommendations_dossierscores" - """ - ), - migrations.RunSQL( - """ - CREATE VIEW "representatives_recommendations_dossierscores" - AS SELECT - "representatives_recommendations_votescores"."representative_id" || ':' || "representatives_votes_proposal"."dossier_id" AS "id", - "representatives_recommendations_votescores"."representative_id", - "representatives_votes_proposal"."dossier_id", - SUM("representatives_recommendations_votescores"."score") AS "score" - FROM "representatives_recommendations_votescores" - INNER JOIN "representatives_votes_proposal" - ON ( "representatives_recommendations_votescores"."proposal_id" = "representatives_votes_proposal"."id" ) - GROUP BY - "representatives_recommendations_votescores"."representative_id", - "representatives_votes_proposal"."dossier_id" - """ - ), - ] diff --git a/src/representatives_recommendations/migrations/0005_representativescore.py b/src/representatives_recommendations/migrations/0005_representativescore.py deleted file mode 100644 index 292af62..0000000 --- a/src/representatives_recommendations/migrations/0005_representativescore.py +++ /dev/null @@ -1,39 +0,0 @@ -# -*- coding: utf-8 -*- -from __future__ import unicode_literals - -from django.db import migrations, models - - -class Migration(migrations.Migration): - - dependencies = [ - ('representatives_recommendations', '0004_dossierscore_rewrite'), - ] - - operations = [ - migrations.AlterModelOptions( - name='representativescore', - options={ - 'managed': False, - 'db_table': 'representatives_recommendations_representativescore', - }, - ), - migrations.RunSQL( - """ - DROP TABLE "representatives_recommendations_representativescore" - """ - ), - migrations.RunSQL( - """ - CREATE VIEW "representatives_recommendations_representativescore" - AS SELECT - "representatives_representative"."id" as "representative_id", - COALESCE(SUM("representatives_recommendations_votescores"."score"), 0) AS "score" - FROM - "representatives_representative" - LEFT OUTER JOIN "representatives_recommendations_votescores" - ON "representatives_recommendations_votescores"."representative_id" = "representatives_representative"."id" - GROUP BY "representatives_representative"."id" - """ - ) - ] diff --git a/src/representatives_recommendations/migrations/0006_score_formula.py b/src/representatives_recommendations/migrations/0006_score_formula.py deleted file mode 100644 index 32b748c..0000000 --- a/src/representatives_recommendations/migrations/0006_score_formula.py +++ /dev/null @@ -1,78 +0,0 @@ -# -*- coding: utf-8 -*- -from __future__ import unicode_literals - -from django.db import migrations, models - - -class Migration(migrations.Migration): - - dependencies = [ - ('representatives_recommendations', '0005_representativescore'), - ('representatives_positions', '0004_add_kind_score_title'), - ('memopol_settings', '0002_score_settings'), - ] - - operations = [ - migrations.RunSQL( - """ - DROP VIEW "representatives_recommendations_votescores" CASCADE; - """ - ), - migrations.AlterField( - model_name='recommendation', - name='weight', - field=models.FloatField(default=0), - ), - migrations.RunSQL( - """ - CREATE VIEW "representatives_recommendations_votescores" - AS SELECT - representatives_votes_vote.id, - representatives_votes_vote."position", - representatives_votes_vote.proposal_id, - representatives_votes_vote.representative_id, - ROUND(CAST(EXP(-((decay_num.value * EXTRACT(days FROM CURRENT_DATE - representatives_votes_proposal.datetime) / decay_denom.value) ^ (2 * exponent.value))) - * (CASE - WHEN representatives_votes_vote."position"::text = representatives_recommendations_recommendation.recommendation::text THEN representatives_recommendations_recommendation.weight - ELSE 0 - representatives_recommendations_recommendation.weight - END) AS NUMERIC), decimals.value) AS score - FROM representatives_votes_vote - JOIN (SELECT CAST(TO_NUMBER(value, '99999') AS FLOAT) AS value FROM memopol_settings_setting WHERE key = 'SCORE_DECAY_NUM') decay_num ON 1=1 - JOIN (SELECT CAST(TO_NUMBER(value, '99999') AS FLOAT) AS value FROM memopol_settings_setting WHERE key = 'SCORE_DECAY_DENOM') decay_denom ON 1=1 - JOIN (SELECT CAST(TO_NUMBER(value, '99999') AS FLOAT) AS value FROM memopol_settings_setting WHERE key = 'SCORE_EXPONENT') exponent ON 1=1 - JOIN (SELECT CAST(TO_NUMBER(value, '99999') AS INTEGER) AS value FROM memopol_settings_setting WHERE key = 'SCORE_DECIMALS') decimals ON 1=1 - JOIN representatives_votes_proposal ON representatives_votes_vote.proposal_id = representatives_votes_proposal.id - LEFT JOIN representatives_recommendations_recommendation ON representatives_votes_proposal.id = representatives_recommendations_recommendation.proposal_id - WHERE representatives_recommendations_recommendation.id IS NOT NULL; - """ - ), - migrations.RunSQL( - """ - CREATE VIEW "representatives_recommendations_dossierscores" - AS SELECT - "representatives_recommendations_votescores"."representative_id" || ':' || "representatives_votes_proposal"."dossier_id" AS "id", - "representatives_recommendations_votescores"."representative_id", - "representatives_votes_proposal"."dossier_id", - SUM("representatives_recommendations_votescores"."score") AS "score" - FROM "representatives_recommendations_votescores" - INNER JOIN "representatives_votes_proposal" - ON ( "representatives_recommendations_votescores"."proposal_id" = "representatives_votes_proposal"."id" ) - GROUP BY - "representatives_recommendations_votescores"."representative_id", - "representatives_votes_proposal"."dossier_id" - """ - ), - migrations.RunSQL( - """ - CREATE VIEW "representatives_recommendations_representativescore" - AS SELECT - "representatives_representative"."id" as "representative_id", - COALESCE(SUM("representatives_recommendations_votescores"."score"), 0) AS "score" - FROM - "representatives_representative" - LEFT OUTER JOIN "representatives_recommendations_votescores" - ON "representatives_recommendations_votescores"."representative_id" = "representatives_representative"."id" - GROUP BY "representatives_representative"."id" - """ - ) - ] diff --git a/src/representatives_recommendations/migrations/0007_fix_underflow.py b/src/representatives_recommendations/migrations/0007_fix_underflow.py deleted file mode 100644 index 8510fd8..0000000 --- a/src/representatives_recommendations/migrations/0007_fix_underflow.py +++ /dev/null @@ -1,72 +0,0 @@ -# -*- coding: utf-8 -*- -from __future__ import unicode_literals - -from django.db import migrations, models - - -class Migration(migrations.Migration): - - dependencies = [ - ('representatives_recommendations', '0006_score_formula'), - ] - - operations = [ - migrations.RunSQL( - """ - CREATE FUNCTION decay_score( - score NUMERIC, - vote_date timestamp with time zone, - decay_num NUMERIC, - decay_denom NUMERIC, - exponent NUMERIC, - decimals integer) - RETURNS NUMERIC AS $$ - SELECT ROUND( - CAST( - $1 * EXP( - GREATEST( - -700, - LEAST( - 700, - -(($3 * EXTRACT(days FROM CURRENT_DATE - $2) / $4) ^ (2 * $5)) - ) - ) - ) - AS NUMERIC - ), - $6 - ) - $$ LANGUAGE SQL; - """ - ), - - migrations.RunSQL( - """ - CREATE OR REPLACE VIEW "representatives_recommendations_votescores" - AS SELECT - representatives_votes_vote.id, - representatives_votes_vote."position", - representatives_votes_vote.proposal_id, - representatives_votes_vote.representative_id, - decay_score( - CAST(CASE - WHEN representatives_votes_vote."position"::text = representatives_recommendations_recommendation.recommendation::text THEN representatives_recommendations_recommendation.weight - ELSE 0 - representatives_recommendations_recommendation.weight - END AS NUMERIC), - representatives_votes_proposal.datetime, - decay_num.value, - decay_denom.value, - exponent.value, - decimals.value - ) AS score - FROM representatives_votes_vote - JOIN (SELECT CAST(TO_NUMBER(value, '99999') AS NUMERIC) AS value FROM memopol_settings_setting WHERE key = 'SCORE_DECAY_NUM') decay_num ON 1=1 - JOIN (SELECT CAST(TO_NUMBER(value, '99999') AS NUMERIC) AS value FROM memopol_settings_setting WHERE key = 'SCORE_DECAY_DENOM') decay_denom ON 1=1 - JOIN (SELECT CAST(TO_NUMBER(value, '99999') AS NUMERIC) AS value FROM memopol_settings_setting WHERE key = 'SCORE_EXPONENT') exponent ON 1=1 - JOIN (SELECT CAST(TO_NUMBER(value, '99999') AS INTEGER) AS value FROM memopol_settings_setting WHERE key = 'SCORE_DECIMALS') decimals ON 1=1 - JOIN representatives_votes_proposal ON representatives_votes_vote.proposal_id = representatives_votes_proposal.id - LEFT JOIN representatives_recommendations_recommendation ON representatives_votes_proposal.id = representatives_recommendations_recommendation.proposal_id - WHERE representatives_recommendations_recommendation.id IS NOT NULL; - """ - ), - ] diff --git a/src/representatives_recommendations/migrations/0008_representativescore_use_positions.py b/src/representatives_recommendations/migrations/0008_representativescore_use_positions.py deleted file mode 100644 index ed4bd34..0000000 --- a/src/representatives_recommendations/migrations/0008_representativescore_use_positions.py +++ /dev/null @@ -1,37 +0,0 @@ -# -*- coding: utf-8 -*- -from __future__ import unicode_literals - -from django.db import migrations, models - - -class Migration(migrations.Migration): - - dependencies = [ - ('representatives_recommendations', '0007_fix_underflow'), - ] - - operations = [ - migrations.RunSQL( - """ - CREATE OR REPLACE VIEW "representatives_recommendations_representativescore" - AS - SELECT - "representatives_representative"."id" AS "representative_id", - COALESCE(SUM("scoresource"."score"), 0) AS "score" - FROM - "representatives_representative" - LEFT OUTER JOIN ( - SELECT - "representatives_recommendations_votescores"."representative_id" AS "representative_id", - "representatives_recommendations_votescores"."score" AS "score" - FROM "representatives_recommendations_votescores" - UNION ALL - SELECT - "representatives_positions_position"."representative_id" AS "representative_id", - "representatives_positions_position"."score" AS "score" - FROM "representatives_positions_position" - ) "scoresource" ON "scoresource"."representative_id" = "representatives_representative"."id" - GROUP BY "representatives_representative"."id" - """ - ) - ] diff --git a/src/representatives_recommendations/migrations/0009_representativescore_use_positionscore.py b/src/representatives_recommendations/migrations/0009_representativescore_use_positionscore.py deleted file mode 100644 index 92f5b16..0000000 --- a/src/representatives_recommendations/migrations/0009_representativescore_use_positionscore.py +++ /dev/null @@ -1,38 +0,0 @@ -# -*- coding: utf-8 -*- -from __future__ import unicode_literals - -from django.db import migrations, models - - -class Migration(migrations.Migration): - - dependencies = [ - ('representatives_recommendations', '0008_representativescore_use_positions'), - ('representatives_positions', '0006_positionscore'), - ] - - operations = [ - migrations.RunSQL( - """ - CREATE OR REPLACE VIEW "representatives_recommendations_representativescore" - AS - SELECT - "representatives_representative"."id" AS "representative_id", - COALESCE(SUM("scoresource"."score"), 0) AS "score" - FROM - "representatives_representative" - LEFT OUTER JOIN ( - SELECT - "representatives_recommendations_votescores"."representative_id" AS "representative_id", - "representatives_recommendations_votescores"."score" AS "score" - FROM "representatives_recommendations_votescores" - UNION ALL - SELECT - "representatives_positions_positionscore"."representative_id" AS "representative_id", - "representatives_positions_positionscore"."score" AS "score" - FROM "representatives_positions_positionscore" - ) "scoresource" ON "scoresource"."representative_id" = "representatives_representative"."id" - GROUP BY "representatives_representative"."id" - """ - ) - ] diff --git a/src/representatives_recommendations/migrations/0010_remove_views.py b/src/representatives_recommendations/migrations/0010_remove_views.py deleted file mode 100644 index 0af6ff3..0000000 --- a/src/representatives_recommendations/migrations/0010_remove_views.py +++ /dev/null @@ -1,30 +0,0 @@ -# -*- coding: utf-8 -*- -from __future__ import unicode_literals - -from django.db import migrations, models - - -class Migration(migrations.Migration): - - dependencies = [ - ('representatives_recommendations', '0009_representativescore_use_positionscore'), - ('memopol_themes', '0003_remove_themescore'), - ] - - operations = [ - migrations.RunSQL( - """ - DROP VIEW "representatives_recommendations_representativescore"; - """ - ), - migrations.RunSQL( - """ - DROP VIEW "representatives_recommendations_dossierscores"; - """ - ), - migrations.RunSQL( - """ - DROP VIEW "representatives_recommendations_votescores"; - """ - ), - ] diff --git a/src/representatives_votes/migrations/0001_initial.py b/src/representatives_votes/migrations/0001_initial.py index ebf94c0..7ee8b58 100644 --- a/src/representatives_votes/migrations/0001_initial.py +++ b/src/representatives_votes/migrations/0001_initial.py @@ -7,36 +7,46 @@ from django.db import migrations, models class Migration(migrations.Migration): dependencies = [ + ('representatives', '0001_initial'), ] operations = [ migrations.CreateModel( - name='Dossier', + name='Document', fields=[ ('id', models.AutoField(verbose_name='ID', serialize=False, auto_created=True, primary_key=True)), ('created', models.DateTimeField(auto_now_add=True)), ('updated', models.DateTimeField(auto_now=True)), - ('fingerprint', models.CharField(unique=True, max_length=40)), ('title', models.CharField(max_length=1000)), - ('reference', models.CharField(max_length=200)), - ('text', models.TextField(default=b'', blank=True)), - ('link', models.URLField()), + ('kind', models.CharField(default=b'', max_length=255, blank=True)), + ('link', models.URLField(max_length=1000)), + ('chamber', models.ForeignKey(to='representatives.Chamber')), ], options={ 'abstract': False, }, ), migrations.CreateModel( - name='Proposal', + name='Dossier', fields=[ ('id', models.AutoField(verbose_name='ID', serialize=False, auto_created=True, primary_key=True)), ('created', models.DateTimeField(auto_now_add=True)), ('updated', models.DateTimeField(auto_now=True)), - ('fingerprint', models.CharField(unique=True, max_length=40)), ('title', models.CharField(max_length=1000)), + ('reference', models.CharField(unique=True, max_length=200)), + ('text', models.TextField(default=b'', blank=True)), + ], + ), + migrations.CreateModel( + name='Proposal', + fields=[ + ('id', models.AutoField(verbose_name='ID', serialize=False, auto_created=True, primary_key=True)), + ('created', models.DateTimeField(auto_now_add=True)), + ('updated', models.DateTimeField(auto_now=True)), + ('title', models.CharField(unique=True, max_length=1000)), ('description', models.TextField(default=b'', blank=True)), ('reference', models.CharField(max_length=200, null=True, blank=True)), - ('datetime', models.DateTimeField()), + ('datetime', models.DateTimeField(db_index=True)), ('kind', models.CharField(default=b'', max_length=200, blank=True)), ('total_abstain', models.IntegerField()), ('total_against', models.IntegerField()), @@ -44,17 +54,42 @@ class Migration(migrations.Migration): ('dossier', models.ForeignKey(related_name='proposals', to='representatives_votes.Dossier')), ], options={ - 'abstract': False, + 'ordering': ['datetime'], }, ), migrations.CreateModel( name='Vote', fields=[ ('id', models.AutoField(verbose_name='ID', serialize=False, auto_created=True, primary_key=True)), - ('representative_name', models.CharField(max_length=200, null=True, blank=True)), - ('representative_remote_id', models.CharField(max_length=200, null=True, blank=True)), + ('representative_name', models.CharField(max_length=200, blank=True)), ('position', models.CharField(max_length=10, choices=[(b'abstain', b'abstain'), (b'for', b'for'), (b'against', b'against')])), ('proposal', models.ForeignKey(related_name='votes', to='representatives_votes.Proposal')), + ('representative', models.ForeignKey(related_name='votes', to='representatives.Representative', null=True)), ], + options={ + 'ordering': ['proposal__datetime'], + }, + ), + migrations.AddField( + model_name='proposal', + name='representatives', + field=models.ManyToManyField(related_name='proposals', through='representatives_votes.Vote', to='representatives.Representative'), + ), + migrations.AlterUniqueTogether( + name='dossier', + unique_together=set([('title', 'reference')]), + ), + migrations.AddField( + model_name='document', + name='dossier', + field=models.ForeignKey(related_name='documents', to='representatives_votes.Dossier'), + ), + migrations.AlterUniqueTogether( + name='vote', + unique_together=set([('proposal', 'representative')]), + ), + migrations.AlterUniqueTogether( + name='proposal', + unique_together=set([('dossier', 'title', 'reference', 'kind', 'total_abstain', 'total_against', 'total_for')]), ), ] diff --git a/src/representatives_votes/migrations/0002_auto_20150707_1611.py b/src/representatives_votes/migrations/0002_auto_20150707_1611.py deleted file mode 100644 index 5565949..0000000 --- a/src/representatives_votes/migrations/0002_auto_20150707_1611.py +++ /dev/null @@ -1,43 +0,0 @@ -# -*- coding: utf-8 -*- -from __future__ import unicode_literals - -from django.db import migrations, models - - -class Migration(migrations.Migration): - - dependencies = [ - ('representatives', '0003_auto_20150702_1827'), - ('representatives_votes', '0001_initial'), - ] - - operations = [ - migrations.RemoveField( - model_name='vote', - name='representative_remote_id', - ), - migrations.AddField( - model_name='vote', - name='representative', - field=models.ForeignKey( - related_name='votes', - to='representatives.Representative', - null=True), - ), - migrations.AddField( - model_name='vote', - name='representative_fingerprint', - field=models.CharField( - max_length=200, - blank=True), - ), - migrations.AlterField( - model_name='vote', - name='representative_name', - field=models.CharField( - default='', - max_length=200, - blank=True), - preserve_default=False, - ), - ] diff --git a/src/representatives_votes/migrations/0003_auto_20150708_1358.py b/src/representatives_votes/migrations/0003_auto_20150708_1358.py deleted file mode 100644 index 390f1ec..0000000 --- a/src/representatives_votes/migrations/0003_auto_20150708_1358.py +++ /dev/null @@ -1,26 +0,0 @@ -# -*- coding: utf-8 -*- -from __future__ import unicode_literals - -from django.db import migrations, models - - -class Migration(migrations.Migration): - - dependencies = [ - ('representatives', '0003_auto_20150702_1827'), - ('representatives_votes', '0002_auto_20150707_1611'), - ] - - operations = [ - migrations.RemoveField( - model_name='vote', - name='representative_fingerprint', - ), - migrations.AddField( - model_name='proposal', - name='representatives', - field=models.ManyToManyField( - to='representatives.Representative', - through='representatives_votes.Vote'), - ), - ] diff --git a/src/representatives_votes/migrations/0004_auto_20150709_0819.py b/src/representatives_votes/migrations/0004_auto_20150709_0819.py deleted file mode 100644 index 9437c23..0000000 --- a/src/representatives_votes/migrations/0004_auto_20150709_0819.py +++ /dev/null @@ -1,32 +0,0 @@ -# -*- coding: utf-8 -*- -from __future__ import unicode_literals - -from django.db import migrations, models - - -class Migration(migrations.Migration): - - dependencies = [ - ('representatives_votes', '0003_auto_20150708_1358'), - ] - - operations = [ - migrations.AlterModelOptions( - name='proposal', - options={ - 'ordering': ['datetime']}, - ), - migrations.AlterModelOptions( - name='vote', - options={ - 'ordering': ['proposal__datetime']}, - ), - migrations.AlterField( - model_name='proposal', - name='representatives', - field=models.ManyToManyField( - related_name='proposals', - through='representatives_votes.Vote', - to='representatives.Representative'), - ), - ] diff --git a/src/representatives_votes/migrations/0005_make_dossier_reference_unique.py b/src/representatives_votes/migrations/0005_make_dossier_reference_unique.py deleted file mode 100644 index 57f4f83..0000000 --- a/src/representatives_votes/migrations/0005_make_dossier_reference_unique.py +++ /dev/null @@ -1,19 +0,0 @@ -# -*- coding: utf-8 -*- -from __future__ import unicode_literals - -from django.db import migrations, models - - -class Migration(migrations.Migration): - - dependencies = [ - ('representatives_votes', '0004_auto_20150709_0819'), - ] - - operations = [ - migrations.AlterField( - model_name='dossier', - name='reference', - field=models.CharField(unique=True, max_length=200), - ), - ] diff --git a/src/representatives_votes/migrations/0006_duplicates.py b/src/representatives_votes/migrations/0006_duplicates.py deleted file mode 100644 index 9a13adf..0000000 --- a/src/representatives_votes/migrations/0006_duplicates.py +++ /dev/null @@ -1,30 +0,0 @@ -# -*- coding: utf-8 -*- -from __future__ import unicode_literals - -from django.db import migrations, models -from django.db.models import Count - - -def remove_duplicate(apps, schema_editor): - Vote = apps.get_model('representatives_votes', 'Vote') - duplicates = Vote.objects.values('proposal_id', - 'representative_id').annotate(Count('id')).filter(id__count__gt=1) - - for duplicate in duplicates: - remove = Vote.objects.filter( - proposal_id=duplicate['proposal_id'], - representative_id=duplicate['representative_id']) - - for i in remove.values_list('pk')[1:]: - Vote.objects.get(pk=i[0]).delete() - - -class Migration(migrations.Migration): - - dependencies = [ - ('representatives_votes', '0005_make_dossier_reference_unique'), - ] - - operations = [ - migrations.RunPython(remove_duplicate) - ] diff --git a/src/representatives_votes/migrations/0007_vote_unique_together_proposal_representative.py b/src/representatives_votes/migrations/0007_vote_unique_together_proposal_representative.py deleted file mode 100644 index 1ffb38d..0000000 --- a/src/representatives_votes/migrations/0007_vote_unique_together_proposal_representative.py +++ /dev/null @@ -1,18 +0,0 @@ -# -*- coding: utf-8 -*- -from __future__ import unicode_literals - -from django.db import migrations, models - - -class Migration(migrations.Migration): - - dependencies = [ - ('representatives_votes', '0006_duplicates'), - ] - - operations = [ - migrations.AlterUniqueTogether( - name='vote', - unique_together=set([('proposal', 'representative')]), - ), - ] diff --git a/src/representatives_votes/migrations/0008_unique_proposal_title.py b/src/representatives_votes/migrations/0008_unique_proposal_title.py deleted file mode 100644 index faae473..0000000 --- a/src/representatives_votes/migrations/0008_unique_proposal_title.py +++ /dev/null @@ -1,19 +0,0 @@ -# -*- coding: utf-8 -*- -from __future__ import unicode_literals - -from django.db import migrations, models - - -class Migration(migrations.Migration): - - dependencies = [ - ('representatives_votes', '0007_vote_unique_together_proposal_representative'), - ] - - operations = [ - migrations.AlterField( - model_name='proposal', - name='title', - field=models.CharField(unique=True, max_length=1000), - ), - ] diff --git a/src/representatives_votes/migrations/0009_dossier_ext_link.py b/src/representatives_votes/migrations/0009_dossier_ext_link.py deleted file mode 100644 index f8adc18..0000000 --- a/src/representatives_votes/migrations/0009_dossier_ext_link.py +++ /dev/null @@ -1,19 +0,0 @@ -# -*- coding: utf-8 -*- -from __future__ import unicode_literals - -from django.db import migrations, models - - -class Migration(migrations.Migration): - - dependencies = [ - ('representatives_votes', '0008_unique_proposal_title'), - ] - - operations = [ - migrations.AddField( - model_name='dossier', - name='ext_link', - field=models.URLField(default=b'', blank=True), - ), - ] diff --git a/src/representatives_votes/migrations/0010_proposal_datetime_index.py b/src/representatives_votes/migrations/0010_proposal_datetime_index.py deleted file mode 100644 index 617eab7..0000000 --- a/src/representatives_votes/migrations/0010_proposal_datetime_index.py +++ /dev/null @@ -1,19 +0,0 @@ -# -*- coding: utf-8 -*- -from __future__ import unicode_literals - -from django.db import migrations, models - - -class Migration(migrations.Migration): - - dependencies = [ - ('representatives_votes', '0009_dossier_ext_link'), - ] - - operations = [ - migrations.AlterField( - model_name='proposal', - name='datetime', - field=models.DateTimeField(db_index=True), - ), - ] diff --git a/src/representatives_votes/migrations/0011_remove_fingerprints.py b/src/representatives_votes/migrations/0011_remove_fingerprints.py deleted file mode 100644 index ffe37fc..0000000 --- a/src/representatives_votes/migrations/0011_remove_fingerprints.py +++ /dev/null @@ -1,30 +0,0 @@ -# -*- coding: utf-8 -*- -from __future__ import unicode_literals - -from django.db import migrations, models - - -class Migration(migrations.Migration): - - dependencies = [ - ('representatives_votes', '0010_proposal_datetime_index'), - ] - - operations = [ - migrations.AlterUniqueTogether( - name='dossier', - unique_together=set([('title', 'reference')]), - ), - migrations.AlterUniqueTogether( - name='proposal', - unique_together=set([('dossier', 'title', 'reference', 'kind', 'total_abstain', 'total_against', 'total_for')]), - ), - migrations.RemoveField( - model_name='dossier', - name='fingerprint', - ), - migrations.RemoveField( - model_name='proposal', - name='fingerprint', - ), - ] diff --git a/src/representatives_votes/migrations/0012_document.py b/src/representatives_votes/migrations/0012_document.py deleted file mode 100644 index a88cf97..0000000 --- a/src/representatives_votes/migrations/0012_document.py +++ /dev/null @@ -1,103 +0,0 @@ -# -*- coding: utf-8 -*- -from __future__ import unicode_literals - -import logging - -from django.db import migrations, models - - -def migrate_dossier_links(apps, schema_editor): - logger = logging.getLogger('migrate_dossier_links') - - # Get model managers - Chamber = apps.get_model("representatives", "Chamber") - Dossier = apps.get_model("representatives_votes", "Dossier") - Document = apps.get_model("representatives_votes", "Document") - - docs = [] - - # EP dossiers - ep_chamber = Chamber.objects.get(abbreviation='EP') - ep_link = 'europarl.europa.eu' - for dossier in Dossier.objects.filter(link__icontains=ep_link): - logger.info('Create document %s for dossier %s' % (dossier.link, - dossier.reference)) - docs.append(Document(chamber=ep_chamber, dossier=dossier, - link=dossier.link, kind='procedure-file')) - - # France dossiers - try: - an_chamber = Chamber.objects.get(abbreviation='AN') - sen_chamber = Chamber.objects.get(abbreviation='SEN') - except Chamber.DoesNotExist: - return - - an_link = 'assemblee-nationale.fr' - sen_link = 'senat.fr' - - for dossier in Dossier.objects.filter(link__icontains=an_link): - logger.info('Create document %s for dossier %s' % (dossier.link, - dossier.reference)) - docs.append(Document(chamber=an_chamber, dossier=dossier, - link=dossier.link, kind='procedure-file')) - - for dossier in Dossier.objects.filter(ext_link__icontains=an_link): - logger.info('Create document %s for dossier %s' % (dossier.link, - dossier.reference)) - docs.append(Document(chamber=an_chamber, dossier=dossier, - link=dossier.ext_link, kind='procedure-file')) - - for dossier in Dossier.objects.filter(link__icontains=sen_link): - logger.info('Create document %s for dossier %s' % (dossier.link, - dossier.reference)) - docs.append(Document(chamber=sen_chamber, dossier=dossier, - link=dossier.link, kind='procedure-file')) - - for dossier in Dossier.objects.filter(ext_link__icontains=an_link): - logger.info('Create document %s for dossier %s' % (dossier.link, - dossier.reference)) - docs.append(Document(chamber=sen_chamber, dossier=dossier, - link=dossier.ext_link, kind='procedure-file')) - - # Create all dossiers - logger.info('Saving %s documents...' % len(docs)) - Document.objects.bulk_create(docs) - - -class Migration(migrations.Migration): - - dependencies = [ - ('representatives', '0019_remove_fingerprints'), - ('representatives_votes', '0011_remove_fingerprints'), - ] - - operations = [ - migrations.CreateModel( - name='Document', - fields=[ - ('id', models.AutoField(verbose_name='ID', serialize=False, auto_created=True, primary_key=True)), - ('created', models.DateTimeField(auto_now_add=True)), - ('updated', models.DateTimeField(auto_now=True)), - ('title', models.CharField(max_length=1000)), - ('kind', models.CharField(default=b'', max_length=255, blank=True)), - ('link', models.URLField(max_length=1000)), - ('chamber', models.ForeignKey(to='representatives.Chamber')), - ('dossier', models.ForeignKey(related_name='documents', to='representatives_votes.Dossier')), - ], - options={ - 'abstract': False, - }, - ), - - migrations.RunPython(migrate_dossier_links), - - migrations.RemoveField( - model_name='dossier', - name='link', - ), - - migrations.RemoveField( - model_name='dossier', - name='ext_link', - ), - ] -- GitLab