From d48ecde4e1a67bd89da7588f0c2cc91b24d898c2 Mon Sep 17 00:00:00 2001 From: Michael Collins Date: Tue, 14 Dec 2021 12:09:22 +0000 Subject: [PATCH 1/4] Fix dependecy error in old migration file - Adds dependency to the Person model in people add to resolve a dependency error when attempting to reset the duplicates table to zero - Reverts changes made in previous commit which caused an error when trying to reset the moderation_queue table back to zero https://github.com/DemocracyClub/yournextrepresentative/commit/2bcdef4d95139d26c9f23a523b02f45741035277#diff-08fed5bc216bd87881c23595b3f49c415b29b39ff68680f4ec405858683791ca --- .../migrations/0001_initial_squashed_0003_auto_20180322_1445.py | 1 + ynr/apps/moderation_queue/migrations/0014_queuedimage_person.py | 2 +- .../migrations/0015_migrate_queuedimage_person.py | 2 +- 3 files changed, 3 insertions(+), 2 deletions(-) diff --git a/ynr/apps/duplicates/migrations/0001_initial_squashed_0003_auto_20180322_1445.py b/ynr/apps/duplicates/migrations/0001_initial_squashed_0003_auto_20180322_1445.py index 7aa8930b32..5e5103c425 100644 --- a/ynr/apps/duplicates/migrations/0001_initial_squashed_0003_auto_20180322_1445.py +++ b/ynr/apps/duplicates/migrations/0001_initial_squashed_0003_auto_20180322_1445.py @@ -14,6 +14,7 @@ class Migration(migrations.Migration): dependencies = [ ("popolo", "0002_update_models_from_upstream"), + ("people", "0003_add_person_model"), migrations.swappable_dependency(settings.AUTH_USER_MODEL), ] diff --git a/ynr/apps/moderation_queue/migrations/0014_queuedimage_person.py b/ynr/apps/moderation_queue/migrations/0014_queuedimage_person.py index 944efce468..46098f2278 100644 --- a/ynr/apps/moderation_queue/migrations/0014_queuedimage_person.py +++ b/ynr/apps/moderation_queue/migrations/0014_queuedimage_person.py @@ -15,7 +15,7 @@ class Migration(migrations.Migration): field=models.ForeignKey( blank=True, null=True, - to="people.Person", + to="popolo.Person", on_delete=models.CASCADE, ), preserve_default=False, diff --git a/ynr/apps/moderation_queue/migrations/0015_migrate_queuedimage_person.py b/ynr/apps/moderation_queue/migrations/0015_migrate_queuedimage_person.py index 8fcedf6601..765babbef4 100644 --- a/ynr/apps/moderation_queue/migrations/0015_migrate_queuedimage_person.py +++ b/ynr/apps/moderation_queue/migrations/0015_migrate_queuedimage_person.py @@ -2,7 +2,7 @@ def popit_to_db(apps, schema_editor): - Person = apps.get_model("people", "Person") + Person = apps.get_model("popolo", "Person") QueuedImage = apps.get_model("moderation_queue", "queuedimage") for qi in QueuedImage.objects.all(): try: From 1c2781a48836ffddeec1ff52d4dea4923e9f9cb9 Mon Sep 17 00:00:00 2001 From: Michael Collins Date: Tue, 14 Dec 2021 16:29:22 +0000 Subject: [PATCH 2/4] Add bash script to run through steps --- reset_migrations.sh | 26 ++++++++++++++++++++++++++ 1 file changed, 26 insertions(+) create mode 100755 reset_migrations.sh diff --git a/reset_migrations.sh b/reset_migrations.sh new file mode 100755 index 0000000000..368955ef3f --- /dev/null +++ b/reset_migrations.sh @@ -0,0 +1,26 @@ +#!/usr/bin/env bash + +# exit script on an error code +set -e + +# before running this script it is recommended that you take a backup of your +# local database e.g. using pg_dump -Fc ynr > ynr_backup.dump +# then if anything goes wrong you can restore easily + +# ensure there are no pending migrations +python manage.py makemigrations --check --dry-run + +# go through all apps and clear the migrations history in the database +for APPNAME in bulk_adding cached_counts candidates duplicates elections facebook_data frontend moderation_queue official_documents parties people popolo results search sopn_parsing twitterbot uk uk_results wombles ynr_refactoring +do + python manage.py migrate --fake $APPNAME zero +done + +# delete all existing migrations +find ./ynr -path "*/migrations/*.py" -not -name "__init__.py" -delete + +# recreate them +python manage.py makemigrations + +# fake the new initial migrations +python manage.py migrate --fake \ No newline at end of file From fc2c88528dd87cb5a4da501410ab4abfbfce6406 Mon Sep 17 00:00:00 2001 From: Michael Collins Date: Tue, 14 Dec 2021 17:14:09 +0000 Subject: [PATCH 3/4] Only reset migrations in script --- reset_migrations.sh | 9 --------- 1 file changed, 9 deletions(-) diff --git a/reset_migrations.sh b/reset_migrations.sh index 368955ef3f..d815ebe689 100755 --- a/reset_migrations.sh +++ b/reset_migrations.sh @@ -15,12 +15,3 @@ for APPNAME in bulk_adding cached_counts candidates duplicates elections faceboo do python manage.py migrate --fake $APPNAME zero done - -# delete all existing migrations -find ./ynr -path "*/migrations/*.py" -not -name "__init__.py" -delete - -# recreate them -python manage.py makemigrations - -# fake the new initial migrations -python manage.py migrate --fake \ No newline at end of file From d25cd3f61d78d4f4a0de3c573b3304fcbb783d6d Mon Sep 17 00:00:00 2001 From: Michael Collins Date: Tue, 14 Dec 2021 17:22:41 +0000 Subject: [PATCH 4/4] Delete and recreate migrations ready to apply with --fake --- .../0001_add_trusted_to_bulk_add_group.py | 16 - .../{0002_rawpeople.py => 0001_initial.py} | 29 +- .../migrations/0002_rawpeople_ballot.py | 25 + .../migrations/0003_rawpeople_source_type.py | 25 - .../migrations/0004_move_to_jsonfield.py | 19 - .../migrations/0005_source_max_length.py | 18 - .../migrations/0006_auto_20210401_0811.py | 24 - .../migrations/0007_alter_rawpeople_data.py | 14 - .../cached_counts/migrations/0001_initial.py | 29 - .../migrations/0002_cachedcount_election.py | 15 - .../migrations/0003_set_default_election.py | 25 - .../migrations/0004_constituency_to_post.py | 16 - .../migrations/0005_delete_cachedcount.py | 8 - .../candidates/migrations/0001_initial.py | 215 +++- .../candidates/migrations/0002_initial.py | 93 ++ .../migrations/0002_usertermsagreement.py | 38 - .../0003_create_user_terms_agreements.py | 15 - .../0004_add_trusted_to_merge_group.py | 19 - .../0005_add_trusted_to_lock_group.py | 19 - .../0006_auto_add_trusted_to_rename_group.py | 20 - .../0007_add_result_recorders_group.py | 19 - ...organizationextra_personextra_postextra.py | 199 ---- .../0009_migrate_to_django_popolo.py | 18 - .../migrations/0010_loggedaction_person.py | 22 - .../0011_migrate_loggedaction_person.py | 34 - ...012_remove_loggedaction_popit_person_id.py | 12 - .../migrations/0013_remove_max_popit_ids.py | 8 - .../0014_make_extra_slugs_unique.py | 24 - .../0015_add_configurable_extra_fields.py | 71 -- .../0016_migrate_data_to_extra_fields.py | 61 -- .../0017_remove_cv_and_program_fields.py | 11 - .../0018_cr_add_important_posts_field.py | 25 - .../0019_add_yesno_to_extra_field_types.py | 22 - .../0020_cr_add_reelection_field.py | 25 - .../migrations/0021_simplepopolofield.py | 59 -- .../0022_create_standard_simple_fields.py | 60 -- ...post_to_elections_m2m_with_extra_fields.py | 48 - ...port_existing_post_to_election_m2m_data.py | 32 - ...old_post_to_election_m2m_and_rename_new.py | 22 - .../migrations/0026_complexpopolofield.py | 80 -- .../0027_create_standard_complex_fields.py | 97 -- .../migrations/0028_auto_20160411_1055.py | 34 - .../0028_create_order_attr_of_extra.py | 14 - .../0029_add_ordering_to_fields_meta.py | 18 - ynr/apps/candidates/migrations/0030_merge.py | 11 - .../migrations/0031_loggedaction_post.py | 22 - .../migrations/0032_migrate_org_slugs.py | 62 -- ...033_postextraelection_candidates_locked.py | 14 - .../migrations/0034_candidates_locked_data.py | 53 - ...0035_remove_postextra_candidates_locked.py | 10 - .../0036_postextra_election_unique_togther.py | 13 - .../migrations/0037_auto_20170510_2200.py | 14 - .../0038_postextraelection_ballot_paper_id.py | 14 - ..._create_ballot_paper_ids_and_set_unique.py | 28 - .../0040_membershipextra_post_election.py | 46 - .../migrations/0041_auto_20180323_1400.py | 21 - .../0043_remove_simple_popolo_field.py | 14 - .../0044_remove_membership_fk_to_election.py | 13 - .../0045_delete_membership_extra.py | 15 - .../migrations/0046_delete_person_extra.py | 15 - .../migrations/0047_add_post_to_pee.py | 29 - .../0048_move_pee_postextra_to_post.py | 26 - .../migrations/0049_cleanup_post_extra.py | 35 - .../migrations/0050_delete_imageextra.py | 19 - .../migrations/0051_remove_areaextra.py | 16 - .../migrations/0052_python_3_changes.py | 26 - .../0053_move_person_fk_to_people_app.py | 36 - .../0054_postextraelection_cancelled.py | 18 - .../0055_delete_complexpopolofield.py | 15 - .../migrations/0056_tmp_ids_to_ballot_id.py | 37 - .../migrations/0057_remove_extra_field.py | 28 - .../migrations/0058_pee_to_ballot.py | 17 - .../0059_rename_logged_action_fk_to_ballot.py | 18 - .../migrations/0060_add_flagged_type.py | 29 - .../migrations/0061_positive_int_field.py | 16 - .../migrations/0062_loggedaction_edit_type.py | 25 - .../0063_populate_loggedaction_edit_types.py | 21 - .../migrations/0064_loggedaction_approved.py | 17 - .../migrations/0065_ballot_replaces.py | 23 - .../0066_drop_unique_on_election_post.py | 12 - .../candidates/migrations/0067_ballot_tags.py | 17 - .../migrations/0068_add_blank_to_tags.py | 19 - .../migrations/0069_ballot_voting_system.py | 16 - .../migrations/0070_auto_20210617_1506.py | 37 - .../migrations/0071_add_created_data.py | 25 - .../migrations/0072_alter_ballot_options.py | 14 - .../0073_alter_loggedaction_action_type.py | 49 - .../migrations/0074_auto_20211006_1027.py | 20 - .../0075_use_jsonfield_from_django.py | 21 - .../migrations/0076_ballot_ee_modified.py | 28 - .../migrations/0077_loggedaction_person_pk.py | 20 - ...0078_populate_person_pk_on_loggedaction.py | 22 - ...9_change_logged_action_person_on_delete.py | 25 - .../0080_add_person_delete_action_type.py | 52 - .../duplicates/migrations/0001_initial.py | 70 ++ ...nitial_squashed_0003_auto_20180322_1445.py | 100 -- .../migrations/0002_add_reasoning_field.py | 22 - .../duplicates/migrations/0002_initial.py | 49 + .../migrations/0003_reasoning_as_textfield.py | 19 - ynr/apps/elections/migrations/0001_initial.py | 82 +- .../migrations/0002_auto_20151012_1731.py | 318 ------ .../migrations/0002_election_organization.py} | 16 +- .../0003_allow_null_winner_membership_role.py | 14 - .../0004_election_new_organization.py | 22 - .../0005_migrate_to_popolo_organizations.py | 39 - .../0006_remove_old_organization_fields.py | 11 - ...rename_new_organization_to_organization.py | 14 - ...8_remove_artificial_start_and_end_dates.py | 20 - .../0009_make_election_slug_unique.py | 14 - .../0010_make_post_id_format_optional.py | 14 - .../0011_remove_election_post_id_format.py | 10 - .../0012_election_people_elected_per_post.py | 17 - .../elections/migrations/0013_remove_area.py | 19 - .../migrations/0014_cleanup_for_post_role.py | 33 - .../migrations/0015_election_date_index.py | 18 - .../migrations/0016_positive_int_field.py | 34 - .../migrations/0017_election_modgov_url.py | 20 - .../0018_add_timestamps_to_election.py | 42 - .../elections/migrations/0019_add_created.py | 23 - .../0020_alter_election_modified.py | 19 - .../uk/migrations/0001_migrate_area_ids.py | 69 -- .../uk/migrations/0002_remove-gb-prefix.py | 40 - .../0003_adjust_roles_for_grouping.py | 24 - .../uk/migrations/0004_add_biography.py | 25 - .../migrations/0005_add_favourite_biscuits.py | 23 - .../facebook_data/migrations/0001_initial.py | 44 +- .../migrations/0002_facebookadvert_image.py | 21 - .../migrations/0003_auto_20210401_0811.py | 44 - .../0004_alter_facebookadvert_ad_json.py | 18 - ynr/apps/frontend/migrations/0001_initial.py | 8 +- .../migrations/0002_auto_20210401_0811.py | 14 - .../migrations/0001_initial.py | 131 ++- .../migrations/0002_auto_20150213_0838.py | 32 - .../migrations/0003_auto_20150301_2035.py | 15 - .../0004_queuedimage_why_allowed.py | 32 - .../0005_migrate_data_to_why_allowed.py | 32 - .../migrations/0006_auto_20150303_0838.py | 13 - .../migrations/0007_auto_20150303_1420.py | 33 - .../0008_add_ignore_to_decision_choices.py | 24 - .../0008_add_photo_review_permissions.py | 21 - .../moderation_queue/migrations/0009_merge.py | 11 - .../migrations/0010_auto_add_crop_bounds.py | 33 - .../0011_queuedimage_face_detection_tried.py | 15 - .../migrations/0012_auto_20150717_0811.py | 21 - .../migrations/0013_auto_20150916_1753.py | 32 - .../migrations/0014_queuedimage_person.py | 23 - .../0015_migrate_queuedimage_person.py | 32 - ...0016_remove_queuedimage_popit_person_id.py | 10 - .../migrations/0017_suggestedpostlock.py | 49 - ...018_suggestedpostlock_postextraelection.py | 22 - ...migrate_post_extra_to_postextraelection.py | 84 -- .../0020_postextraelection_not_null.py | 18 - ...021_remove_suggestedpostlock_post_extra.py | 12 - .../migrations/0022_add_detection_metadata.py | 20 - .../migrations/0023_python_3_changes.py | 57 - .../0024_move_person_fk_to_people_app.py | 27 - .../0025_cleanup_old_lock_suggestions.py | 23 - .../migrations/0026_rename_pee_to_ballot.py | 18 - ...0027_positive_int_field_update_existing.py | 20 - ...0028_positive_int_field_update_existing.py | 33 - .../migrations/0029_update_image_upload_to.py | 22 - .../0030_add_very_trusted_user_group.py | 22 - .../0031_suggestedpostlock_ballot_hash.py | 17 - .../migrations/0001_initial.py | 59 +- .../0002_officialdocument_document_type.py | 19 - .../migrations/0003_add_group.py | 25 - .../migrations/0004_auto_20150410_1054.py | 18 - .../migrations/0005_auto_20150410_1307.py | 19 - .../0006_rename_mapit_id_to_post_id.py | 14 - .../0007_officialdocument_election.py | 15 - .../migrations/0008_set_default_election.py | 25 - .../0009_officialdocument_document_post.py | 23 - .../0010_post_id_to_officialdocument.py | 26 - ..._officaldocument_to_post_remove_post_id.py | 15 - .../0012_officialdocument_election_model.py | 22 - .../0013_election_id_to_election_model.py | 29 - .../0014_remove_officialdocument_election.py | 12 - .../0015_rename_election_model_to_election.py | 16 - .../migrations/0016_election_not_null.py | 18 - ...pdate_django_extensions_datetime_fields.py | 24 - .../0018_make_source_url_required.py | 19 - .../0019_officialdocument_post_election.py | 25 - .../0020_add_post_election_values.py | 29 - .../migrations/0021_auto_20180406_1555.py | 21 - .../migrations/0022_python_3_changes.py | 21 - .../0023_remove_election_and_post.py | 15 - .../migrations/0024_add_relevant_pages.py | 25 - .../0025_rename_post_election_fk_to_ballot.py | 18 - ynr/apps/parties/migrations/0001_initial.py | 132 ++- .../migrations/0002_add_independent_party.py | 22 - .../parties/migrations/0003_party_ordering.py | 16 - .../migrations/0004_party_legacy_slug.py | 18 - .../migrations/0005_popolate_legacy_slug.py | 29 - .../migrations/0006_legacy_slug_unique.py | 18 - .../parties/migrations/0007_add_speaker.py | 24 - .../parties/migrations/0008_unique_ec_id.py | 18 - .../parties/migrations/0009_slug_help_text.py | 23 - .../migrations/0010_add_candidate_totals.py | 23 - .../0011_add_initial_candidates_counts.py | 27 - .../parties/migrations/0012_add_party_docs.py | 78 -- .../0013_add_independent_descriptions.py | 21 - .../0014_alter_partydescription_options.py | 14 - ynr/apps/people/migrations/0001_initial.py | 327 +++++- .../migrations/0002_change_related_name.py | 23 - .../migrations/0003_add_person_model.py | 240 ----- .../migrations/0004_move_person_data.py | 55 - ...0005_move_person_image_fk_to_person_app.py | 23 - .../migrations/0006_move_person_gfks.py | 38 - .../migrations/0007_remove_dateframe.py | 15 - .../0008_person_identifier_model.py | 87 -- ...opy_popolo_fields_to_person_identifiers.py | 117 --- .../0010_copy_email_to_person_identifier.py | 32 - .../0011_set_tmp_unique_constraints.py | 37 - .../0012_add_person_favourite_biscuit.py | 20 - .../0013_populate_favourite_biscuit.py | 51 - .../migrations/0014_remove_person_email.py | 12 - .../people/migrations/0015_date_lengths.py | 31 - .../migrations/0016_add_edit_limitations.py | 24 - .../migrations/0017_set_vandalism_list.py | 212 ---- .../people/migrations/0018_gender_guess.py | 36 - .../0019_move_to_ballot_in_version_history.py | 170 --- .../migrations/0020_add_json_versions.py | 17 - .../migrations/0021_populate_json_versions.py | 23 - .../0022_rename_json_versions_field.py | 15 - .../0023_add_search_vector_field.py | 18 - .../0024_add_gist_index_for_search.py | 19 - .../0025_add_name_search_trigger.py | 12 - .../0026_add_person_name_synonym.py | 41 - .../migrations/0027_auto_20210401_0811.py | 23 - .../0028_add_default_to_extra_data.py | 20 - .../0029_default_versions_to_list.py | 17 - .../migrations/0030_auto_20210616_1642.py | 30 - .../people/migrations/0031_copy_created.py | 26 - .../migrations/0032_auto_20210616_1700.py | 13 - .../migrations/0033_auto_20210928_1007.py | 24 - .../people/migrations/0034_get_birth_year.py | 20 - .../0035_alter_person_birth_date.py | 21 - ynr/apps/popolo/migrations/0001_initial.py | 978 +++++++++--------- .../0002_update_models_from_upstream.py | 618 ----------- .../0003_move-extra-fields-to-base.py | 36 - .../0004_move-extra-data-to-base.py | 28 - .../0005_set_post_election_not_null_.py | 23 - .../0006_membership_unique_together.py | 15 - .../migrations/0007_python_3_migrations.py | 339 ------ .../0008_add_person_extra_fields.py | 25 - .../0009_move_extra_person_data_to_base.py | 16 - .../0010_rename_not_standing_related_name.py | 23 - .../migrations/0011_add_post_extra_fields.py | 43 - .../0012_move_post_extra_data_to_base.py | 32 - .../0013_clean_up_after_postextra_move.py | 27 - .../migrations/0014_membership_party.py | 27 - .../0015_move_organization_to_parties.py | 124 --- .../0016_remove_membership_organization.py | 14 - .../0017_remove_membership_on_behalf_of.py | 14 - ...18_protect_membership_on_party_deletion.py | 24 - ..._move_organization_extra_fields_to_base.py | 23 - ...20_move_extra_organization_data_to_base.py | 16 - .../migrations/0021_auto_20180918_1534.py | 18 - .../0022_populate_person_image_from_image.py | 19 - .../migrations/0023_remove_area_model.py | 25 - .../migrations/0024_remove_person_image.py | 12 - .../0025_move_person_fk_to_people_app.py | 27 - .../migrations/0026_remove_stale_models.py | 21 - .../0027_slug_org_unique_together.py | 31 - .../0028_rename_post_election_to_ballot.py | 23 - .../migrations/0029_positive_int_field.py | 16 - .../0030_remove_duplicate_other_names.py | 32 - .../0031_other_names_unique_constraint.py | 18 - .../migrations/0032_add_post_identifiers.py | 72 -- .../migrations/0033_unique_on_start_date.py | 15 - .../0034_populate_from_ee_divisions.py | 147 --- .../0035_attach_memberships_to_posts.py | 22 - .../0036_add_party_name_and_description.py | 44 - .../0037_data_migration_add_party_name.py | 43 - .../migrations/0038_auto_20210401_0811.py | 14 - .../migrations/0039_auto_20210616_1642.py | 85 -- .../popolo/migrations/0040_copy_created.py | 30 - .../migrations/0041_auto_20210616_1705.py | 19 - .../migrations/0042_add_timestamps_to_post.py | 35 - .../0043_alter_membership_elected.py | 16 - .../0044_add_indexes_to_modified.py | 26 - .../0045_clean_up_blank_party_names.py | 22 - .../0046_remove_blank_from_party_name.py | 19 - ynr/apps/results/migrations/0001_initial.py | 69 +- .../0002_resultevent_parlparse_id.py | 15 - .../migrations/0003_resultevent_post_name.py | 15 - .../migrations/0004_resultevent_election.py | 15 - .../0005_auto_fill_election_and_post_name.py | 682 ------------ .../migrations/0006_resultevent_winner.py | 20 - ...0007_update_winner_from_popit_person_id.py | 29 - ...move_resultevent_winner_popit_person_id.py | 12 - .../0009_resultevent_election_new.py | 22 - .../0010_resultevent_winner_party_new.py | 22 - .../migrations/0011_resultevent_post_new.py | 22 - .../0012_migrate_resultevent_data.py | 42 - .../migrations/0013_remove_old_fields.py | 16 - .../0014_rename_election_new_to_election.py | 14 - .../migrations/0015_rename_to_winner_party.py | 14 - .../0016_rename_post_id_to_old_post_id.py | 12 - .../0017_rename_post_name_to_old_post_name.py | 14 - .../0018_fix_2015_resultevent_winners.py | 25 - .../0019_rename_post_new_to_post.py | 12 - ...ve_resultevent_proxy_image_url_template.py | 12 - .../migrations/0021_resultevent_retraction.py | 16 - .../0022_resultevent_winner_party_tmp.py | 26 - ...023_migrate_winner_party_to_party_model.py | 44 - .../migrations/0024_rename_tmp_field.py | 19 - .../migrations/0025_winner_party_not_null.py | 21 - .../0026_move_person_fk_to_people_app.py | 24 - .../0027_alter_resultevent_source.py | 16 - ynr/apps/search/migrations/0001_initial.py | 6 - .../sopn_parsing/migrations/0001_initial.py | 10 +- .../twitterbot/migrations/0001_initial.py | 17 - .../uk_results/migrations/0001_initial.py | 127 ++- .../migrations/0002_auto_20160425_2110.py | 118 --- .../migrations/0003_auto_20160425_2151.py | 23 - .../0004_councilelection_party_set.py | 20 - .../migrations/0005_auto_20160426_1058.py | 35 - .../migrations/0006_add_admin_persmissions.py | 39 - .../0007_councilelectionresultset_noc.py | 14 - .../migrations/0008_auto_20160426_1629.py | 23 - .../migrations/0009_auto_20160427_0858.py | 43 - .../migrations/0010_auto_20160427_0926.py | 53 - .../migrations/0011_auto_20160427_1305.py | 42 - .../migrations/0012_auto_20160427_1339.py | 12 - .../migrations/0013_auto_20160427_1410.py | 55 - .../migrations/0014_auto_20160427_1429.py | 32 - .../migrations/0015_auto_20160428_0805.py | 47 - .../migrations/0016_auto_20160429_0938.py | 36 - .../migrations/0017_auto_20160429_0938.py | 32 - .../migrations/0018_electionarea_noc.py | 14 - ...9_councilelection_confirming_result_set.py | 18 - .../migrations/0020_auto_20160503_1920.py | 16 - .../migrations/0021_auto_20160503_1923.py | 14 - .../0022_postresult_confirmed_resultset.py | 16 - .../migrations/0023_auto_20160505_1636.py | 13 - .../migrations/0024_auto_20160505_2334.py | 19 - .../0025_minus-1-to-null-on-num-fields.py | 18 - .../migrations/0026_auto_20170130_1541.py | 16 - .../migrations/0027_auto_20170502_2130.py | 16 - .../migrations/0028_auto_20170503_1633.py | 12 - .../0029_add_postresult_post_election.py | 22 - .../0030_populate_postresult_post_election.py | 78 -- .../migrations/0031_remove_postresult_post.py | 19 - ...rename_postresult_to_postelectionresult.py | 8 - .../migrations/0033_auto_20170506_2042.py | 16 - .../migrations/0034_auto_20180130_1243.py | 49 - .../migrations/0035_auto_20180406_1555.py | 40 - .../migrations/0036_auto_20180424_1926.py | 36 - .../migrations/0037_delete_rejected_data.py | 18 - .../migrations/0038_auto_20180424_1949.py | 14 - .../0039_resultset_post_election.py | 25 - .../migrations/0040_add_pee_to_resultset.py | 43 - .../migrations/0041_auto_20180424_2049.py | 32 - .../migrations/0042_auto_20180424_2053.py | 22 - .../migrations/0043_auto_20180424_2148.py | 21 - .../migrations/0044_auto_20180424_2149.py | 20 - .../migrations/0045_auto_20180424_2150.py | 17 - .../migrations/0046_auto_20180501_1052.py | 30 - .../migrations/0047_auto_20180501_1359.py | 22 - .../0048_rename_post_election_fk_to_ballot.py | 16 - .../migrations/0049_positive_int_field.py | 30 - .../0050_candidateresult_tied_vote_winner.py | 19 - .../0051_resultset_total_electorate.py | 16 - .../migrations/0052_add_turnout_percentage.py | 31 - .../migrations/0053_auto_20210928_1007.py | 19 - .../0054_update_is_winner_to_elected.py | 37 - .../0055_migrate_is_winner_to_elected.py | 40 - .../0056_remove_candidateresult_is_winner.py | 12 - ynr/apps/wombles/migrations/0001_initial.py | 38 +- .../migrations/0002_add_initial_profiles.py | 24 - .../migrations/0003_auto_20210401_0811.py | 14 - .../migrations/0001_initial.py | 6 +- .../0002_move_old_election_slugs.py | 196 ---- .../0003_move_person_identifiers.py | 36 - 375 files changed, 1724 insertions(+), 12981 deletions(-) delete mode 100644 ynr/apps/bulk_adding/migrations/0001_add_trusted_to_bulk_add_group.py rename ynr/apps/bulk_adding/migrations/{0002_rawpeople.py => 0001_initial.py} (69%) create mode 100644 ynr/apps/bulk_adding/migrations/0002_rawpeople_ballot.py delete mode 100644 ynr/apps/bulk_adding/migrations/0003_rawpeople_source_type.py delete mode 100644 ynr/apps/bulk_adding/migrations/0004_move_to_jsonfield.py delete mode 100644 ynr/apps/bulk_adding/migrations/0005_source_max_length.py delete mode 100644 ynr/apps/bulk_adding/migrations/0006_auto_20210401_0811.py delete mode 100644 ynr/apps/bulk_adding/migrations/0007_alter_rawpeople_data.py delete mode 100644 ynr/apps/cached_counts/migrations/0001_initial.py delete mode 100644 ynr/apps/cached_counts/migrations/0002_cachedcount_election.py delete mode 100644 ynr/apps/cached_counts/migrations/0003_set_default_election.py delete mode 100644 ynr/apps/cached_counts/migrations/0004_constituency_to_post.py delete mode 100644 ynr/apps/cached_counts/migrations/0005_delete_cachedcount.py create mode 100644 ynr/apps/candidates/migrations/0002_initial.py delete mode 100644 ynr/apps/candidates/migrations/0002_usertermsagreement.py delete mode 100644 ynr/apps/candidates/migrations/0003_create_user_terms_agreements.py delete mode 100644 ynr/apps/candidates/migrations/0004_add_trusted_to_merge_group.py delete mode 100644 ynr/apps/candidates/migrations/0005_add_trusted_to_lock_group.py delete mode 100644 ynr/apps/candidates/migrations/0006_auto_add_trusted_to_rename_group.py delete mode 100644 ynr/apps/candidates/migrations/0007_add_result_recorders_group.py delete mode 100644 ynr/apps/candidates/migrations/0008_membershipextra_organizationextra_personextra_postextra.py delete mode 100644 ynr/apps/candidates/migrations/0009_migrate_to_django_popolo.py delete mode 100644 ynr/apps/candidates/migrations/0010_loggedaction_person.py delete mode 100644 ynr/apps/candidates/migrations/0011_migrate_loggedaction_person.py delete mode 100644 ynr/apps/candidates/migrations/0012_remove_loggedaction_popit_person_id.py delete mode 100644 ynr/apps/candidates/migrations/0013_remove_max_popit_ids.py delete mode 100644 ynr/apps/candidates/migrations/0014_make_extra_slugs_unique.py delete mode 100644 ynr/apps/candidates/migrations/0015_add_configurable_extra_fields.py delete mode 100644 ynr/apps/candidates/migrations/0016_migrate_data_to_extra_fields.py delete mode 100644 ynr/apps/candidates/migrations/0017_remove_cv_and_program_fields.py delete mode 100644 ynr/apps/candidates/migrations/0018_cr_add_important_posts_field.py delete mode 100644 ynr/apps/candidates/migrations/0019_add_yesno_to_extra_field_types.py delete mode 100644 ynr/apps/candidates/migrations/0020_cr_add_reelection_field.py delete mode 100644 ynr/apps/candidates/migrations/0021_simplepopolofield.py delete mode 100644 ynr/apps/candidates/migrations/0022_create_standard_simple_fields.py delete mode 100644 ynr/apps/candidates/migrations/0023_create_post_to_elections_m2m_with_extra_fields.py delete mode 100644 ynr/apps/candidates/migrations/0024_port_existing_post_to_election_m2m_data.py delete mode 100644 ynr/apps/candidates/migrations/0025_remove_old_post_to_election_m2m_and_rename_new.py delete mode 100644 ynr/apps/candidates/migrations/0026_complexpopolofield.py delete mode 100644 ynr/apps/candidates/migrations/0027_create_standard_complex_fields.py delete mode 100644 ynr/apps/candidates/migrations/0028_auto_20160411_1055.py delete mode 100644 ynr/apps/candidates/migrations/0028_create_order_attr_of_extra.py delete mode 100644 ynr/apps/candidates/migrations/0029_add_ordering_to_fields_meta.py delete mode 100644 ynr/apps/candidates/migrations/0030_merge.py delete mode 100644 ynr/apps/candidates/migrations/0031_loggedaction_post.py delete mode 100644 ynr/apps/candidates/migrations/0032_migrate_org_slugs.py delete mode 100644 ynr/apps/candidates/migrations/0033_postextraelection_candidates_locked.py delete mode 100644 ynr/apps/candidates/migrations/0034_candidates_locked_data.py delete mode 100644 ynr/apps/candidates/migrations/0035_remove_postextra_candidates_locked.py delete mode 100644 ynr/apps/candidates/migrations/0036_postextra_election_unique_togther.py delete mode 100644 ynr/apps/candidates/migrations/0037_auto_20170510_2200.py delete mode 100644 ynr/apps/candidates/migrations/0038_postextraelection_ballot_paper_id.py delete mode 100644 ynr/apps/candidates/migrations/0039_create_ballot_paper_ids_and_set_unique.py delete mode 100644 ynr/apps/candidates/migrations/0040_membershipextra_post_election.py delete mode 100644 ynr/apps/candidates/migrations/0041_auto_20180323_1400.py delete mode 100644 ynr/apps/candidates/migrations/0043_remove_simple_popolo_field.py delete mode 100644 ynr/apps/candidates/migrations/0044_remove_membership_fk_to_election.py delete mode 100644 ynr/apps/candidates/migrations/0045_delete_membership_extra.py delete mode 100644 ynr/apps/candidates/migrations/0046_delete_person_extra.py delete mode 100644 ynr/apps/candidates/migrations/0047_add_post_to_pee.py delete mode 100644 ynr/apps/candidates/migrations/0048_move_pee_postextra_to_post.py delete mode 100644 ynr/apps/candidates/migrations/0049_cleanup_post_extra.py delete mode 100644 ynr/apps/candidates/migrations/0050_delete_imageextra.py delete mode 100644 ynr/apps/candidates/migrations/0051_remove_areaextra.py delete mode 100644 ynr/apps/candidates/migrations/0052_python_3_changes.py delete mode 100644 ynr/apps/candidates/migrations/0053_move_person_fk_to_people_app.py delete mode 100644 ynr/apps/candidates/migrations/0054_postextraelection_cancelled.py delete mode 100644 ynr/apps/candidates/migrations/0055_delete_complexpopolofield.py delete mode 100644 ynr/apps/candidates/migrations/0056_tmp_ids_to_ballot_id.py delete mode 100644 ynr/apps/candidates/migrations/0057_remove_extra_field.py delete mode 100644 ynr/apps/candidates/migrations/0058_pee_to_ballot.py delete mode 100644 ynr/apps/candidates/migrations/0059_rename_logged_action_fk_to_ballot.py delete mode 100644 ynr/apps/candidates/migrations/0060_add_flagged_type.py delete mode 100644 ynr/apps/candidates/migrations/0061_positive_int_field.py delete mode 100644 ynr/apps/candidates/migrations/0062_loggedaction_edit_type.py delete mode 100644 ynr/apps/candidates/migrations/0063_populate_loggedaction_edit_types.py delete mode 100644 ynr/apps/candidates/migrations/0064_loggedaction_approved.py delete mode 100644 ynr/apps/candidates/migrations/0065_ballot_replaces.py delete mode 100644 ynr/apps/candidates/migrations/0066_drop_unique_on_election_post.py delete mode 100644 ynr/apps/candidates/migrations/0067_ballot_tags.py delete mode 100644 ynr/apps/candidates/migrations/0068_add_blank_to_tags.py delete mode 100644 ynr/apps/candidates/migrations/0069_ballot_voting_system.py delete mode 100644 ynr/apps/candidates/migrations/0070_auto_20210617_1506.py delete mode 100644 ynr/apps/candidates/migrations/0071_add_created_data.py delete mode 100644 ynr/apps/candidates/migrations/0072_alter_ballot_options.py delete mode 100644 ynr/apps/candidates/migrations/0073_alter_loggedaction_action_type.py delete mode 100644 ynr/apps/candidates/migrations/0074_auto_20211006_1027.py delete mode 100644 ynr/apps/candidates/migrations/0075_use_jsonfield_from_django.py delete mode 100644 ynr/apps/candidates/migrations/0076_ballot_ee_modified.py delete mode 100644 ynr/apps/candidates/migrations/0077_loggedaction_person_pk.py delete mode 100644 ynr/apps/candidates/migrations/0078_populate_person_pk_on_loggedaction.py delete mode 100644 ynr/apps/candidates/migrations/0079_change_logged_action_person_on_delete.py delete mode 100644 ynr/apps/candidates/migrations/0080_add_person_delete_action_type.py create mode 100644 ynr/apps/duplicates/migrations/0001_initial.py delete mode 100644 ynr/apps/duplicates/migrations/0001_initial_squashed_0003_auto_20180322_1445.py delete mode 100644 ynr/apps/duplicates/migrations/0002_add_reasoning_field.py create mode 100644 ynr/apps/duplicates/migrations/0002_initial.py delete mode 100644 ynr/apps/duplicates/migrations/0003_reasoning_as_textfield.py delete mode 100644 ynr/apps/elections/migrations/0002_auto_20151012_1731.py rename ynr/apps/{candidates/migrations/0042_loggedaction_post_election.py => elections/migrations/0002_election_organization.py} (53%) delete mode 100644 ynr/apps/elections/migrations/0003_allow_null_winner_membership_role.py delete mode 100644 ynr/apps/elections/migrations/0004_election_new_organization.py delete mode 100644 ynr/apps/elections/migrations/0005_migrate_to_popolo_organizations.py delete mode 100644 ynr/apps/elections/migrations/0006_remove_old_organization_fields.py delete mode 100644 ynr/apps/elections/migrations/0007_rename_new_organization_to_organization.py delete mode 100644 ynr/apps/elections/migrations/0008_remove_artificial_start_and_end_dates.py delete mode 100644 ynr/apps/elections/migrations/0009_make_election_slug_unique.py delete mode 100644 ynr/apps/elections/migrations/0010_make_post_id_format_optional.py delete mode 100644 ynr/apps/elections/migrations/0011_remove_election_post_id_format.py delete mode 100644 ynr/apps/elections/migrations/0012_election_people_elected_per_post.py delete mode 100644 ynr/apps/elections/migrations/0013_remove_area.py delete mode 100644 ynr/apps/elections/migrations/0014_cleanup_for_post_role.py delete mode 100644 ynr/apps/elections/migrations/0015_election_date_index.py delete mode 100644 ynr/apps/elections/migrations/0016_positive_int_field.py delete mode 100644 ynr/apps/elections/migrations/0017_election_modgov_url.py delete mode 100644 ynr/apps/elections/migrations/0018_add_timestamps_to_election.py delete mode 100644 ynr/apps/elections/migrations/0019_add_created.py delete mode 100644 ynr/apps/elections/migrations/0020_alter_election_modified.py delete mode 100644 ynr/apps/elections/uk/migrations/0001_migrate_area_ids.py delete mode 100644 ynr/apps/elections/uk/migrations/0002_remove-gb-prefix.py delete mode 100644 ynr/apps/elections/uk/migrations/0003_adjust_roles_for_grouping.py delete mode 100644 ynr/apps/elections/uk/migrations/0004_add_biography.py delete mode 100644 ynr/apps/elections/uk/migrations/0005_add_favourite_biscuits.py delete mode 100644 ynr/apps/facebook_data/migrations/0002_facebookadvert_image.py delete mode 100644 ynr/apps/facebook_data/migrations/0003_auto_20210401_0811.py delete mode 100644 ynr/apps/facebook_data/migrations/0004_alter_facebookadvert_ad_json.py delete mode 100644 ynr/apps/frontend/migrations/0002_auto_20210401_0811.py delete mode 100644 ynr/apps/moderation_queue/migrations/0002_auto_20150213_0838.py delete mode 100644 ynr/apps/moderation_queue/migrations/0003_auto_20150301_2035.py delete mode 100644 ynr/apps/moderation_queue/migrations/0004_queuedimage_why_allowed.py delete mode 100644 ynr/apps/moderation_queue/migrations/0005_migrate_data_to_why_allowed.py delete mode 100644 ynr/apps/moderation_queue/migrations/0006_auto_20150303_0838.py delete mode 100644 ynr/apps/moderation_queue/migrations/0007_auto_20150303_1420.py delete mode 100644 ynr/apps/moderation_queue/migrations/0008_add_ignore_to_decision_choices.py delete mode 100644 ynr/apps/moderation_queue/migrations/0008_add_photo_review_permissions.py delete mode 100644 ynr/apps/moderation_queue/migrations/0009_merge.py delete mode 100644 ynr/apps/moderation_queue/migrations/0010_auto_add_crop_bounds.py delete mode 100644 ynr/apps/moderation_queue/migrations/0011_queuedimage_face_detection_tried.py delete mode 100644 ynr/apps/moderation_queue/migrations/0012_auto_20150717_0811.py delete mode 100644 ynr/apps/moderation_queue/migrations/0013_auto_20150916_1753.py delete mode 100644 ynr/apps/moderation_queue/migrations/0014_queuedimage_person.py delete mode 100644 ynr/apps/moderation_queue/migrations/0015_migrate_queuedimage_person.py delete mode 100644 ynr/apps/moderation_queue/migrations/0016_remove_queuedimage_popit_person_id.py delete mode 100644 ynr/apps/moderation_queue/migrations/0017_suggestedpostlock.py delete mode 100644 ynr/apps/moderation_queue/migrations/0018_suggestedpostlock_postextraelection.py delete mode 100644 ynr/apps/moderation_queue/migrations/0019_migrate_post_extra_to_postextraelection.py delete mode 100644 ynr/apps/moderation_queue/migrations/0020_postextraelection_not_null.py delete mode 100644 ynr/apps/moderation_queue/migrations/0021_remove_suggestedpostlock_post_extra.py delete mode 100644 ynr/apps/moderation_queue/migrations/0022_add_detection_metadata.py delete mode 100644 ynr/apps/moderation_queue/migrations/0023_python_3_changes.py delete mode 100644 ynr/apps/moderation_queue/migrations/0024_move_person_fk_to_people_app.py delete mode 100644 ynr/apps/moderation_queue/migrations/0025_cleanup_old_lock_suggestions.py delete mode 100644 ynr/apps/moderation_queue/migrations/0026_rename_pee_to_ballot.py delete mode 100644 ynr/apps/moderation_queue/migrations/0027_positive_int_field_update_existing.py delete mode 100644 ynr/apps/moderation_queue/migrations/0028_positive_int_field_update_existing.py delete mode 100644 ynr/apps/moderation_queue/migrations/0029_update_image_upload_to.py delete mode 100644 ynr/apps/moderation_queue/migrations/0030_add_very_trusted_user_group.py delete mode 100644 ynr/apps/moderation_queue/migrations/0031_suggestedpostlock_ballot_hash.py delete mode 100644 ynr/apps/official_documents/migrations/0002_officialdocument_document_type.py delete mode 100644 ynr/apps/official_documents/migrations/0003_add_group.py delete mode 100644 ynr/apps/official_documents/migrations/0004_auto_20150410_1054.py delete mode 100644 ynr/apps/official_documents/migrations/0005_auto_20150410_1307.py delete mode 100644 ynr/apps/official_documents/migrations/0006_rename_mapit_id_to_post_id.py delete mode 100644 ynr/apps/official_documents/migrations/0007_officialdocument_election.py delete mode 100644 ynr/apps/official_documents/migrations/0008_set_default_election.py delete mode 100644 ynr/apps/official_documents/migrations/0009_officialdocument_document_post.py delete mode 100644 ynr/apps/official_documents/migrations/0010_post_id_to_officialdocument.py delete mode 100644 ynr/apps/official_documents/migrations/0011_officaldocument_to_post_remove_post_id.py delete mode 100644 ynr/apps/official_documents/migrations/0012_officialdocument_election_model.py delete mode 100644 ynr/apps/official_documents/migrations/0013_election_id_to_election_model.py delete mode 100644 ynr/apps/official_documents/migrations/0014_remove_officialdocument_election.py delete mode 100644 ynr/apps/official_documents/migrations/0015_rename_election_model_to_election.py delete mode 100644 ynr/apps/official_documents/migrations/0016_election_not_null.py delete mode 100644 ynr/apps/official_documents/migrations/0017_update_django_extensions_datetime_fields.py delete mode 100644 ynr/apps/official_documents/migrations/0018_make_source_url_required.py delete mode 100644 ynr/apps/official_documents/migrations/0019_officialdocument_post_election.py delete mode 100644 ynr/apps/official_documents/migrations/0020_add_post_election_values.py delete mode 100644 ynr/apps/official_documents/migrations/0021_auto_20180406_1555.py delete mode 100644 ynr/apps/official_documents/migrations/0022_python_3_changes.py delete mode 100644 ynr/apps/official_documents/migrations/0023_remove_election_and_post.py delete mode 100644 ynr/apps/official_documents/migrations/0024_add_relevant_pages.py delete mode 100644 ynr/apps/official_documents/migrations/0025_rename_post_election_fk_to_ballot.py delete mode 100644 ynr/apps/parties/migrations/0002_add_independent_party.py delete mode 100644 ynr/apps/parties/migrations/0003_party_ordering.py delete mode 100644 ynr/apps/parties/migrations/0004_party_legacy_slug.py delete mode 100644 ynr/apps/parties/migrations/0005_popolate_legacy_slug.py delete mode 100644 ynr/apps/parties/migrations/0006_legacy_slug_unique.py delete mode 100644 ynr/apps/parties/migrations/0007_add_speaker.py delete mode 100644 ynr/apps/parties/migrations/0008_unique_ec_id.py delete mode 100644 ynr/apps/parties/migrations/0009_slug_help_text.py delete mode 100644 ynr/apps/parties/migrations/0010_add_candidate_totals.py delete mode 100644 ynr/apps/parties/migrations/0011_add_initial_candidates_counts.py delete mode 100644 ynr/apps/parties/migrations/0012_add_party_docs.py delete mode 100644 ynr/apps/parties/migrations/0013_add_independent_descriptions.py delete mode 100644 ynr/apps/parties/migrations/0014_alter_partydescription_options.py delete mode 100644 ynr/apps/people/migrations/0002_change_related_name.py delete mode 100644 ynr/apps/people/migrations/0003_add_person_model.py delete mode 100644 ynr/apps/people/migrations/0004_move_person_data.py delete mode 100644 ynr/apps/people/migrations/0005_move_person_image_fk_to_person_app.py delete mode 100644 ynr/apps/people/migrations/0006_move_person_gfks.py delete mode 100644 ynr/apps/people/migrations/0007_remove_dateframe.py delete mode 100644 ynr/apps/people/migrations/0008_person_identifier_model.py delete mode 100644 ynr/apps/people/migrations/0009_copy_popolo_fields_to_person_identifiers.py delete mode 100644 ynr/apps/people/migrations/0010_copy_email_to_person_identifier.py delete mode 100644 ynr/apps/people/migrations/0011_set_tmp_unique_constraints.py delete mode 100644 ynr/apps/people/migrations/0012_add_person_favourite_biscuit.py delete mode 100644 ynr/apps/people/migrations/0013_populate_favourite_biscuit.py delete mode 100644 ynr/apps/people/migrations/0014_remove_person_email.py delete mode 100644 ynr/apps/people/migrations/0015_date_lengths.py delete mode 100644 ynr/apps/people/migrations/0016_add_edit_limitations.py delete mode 100644 ynr/apps/people/migrations/0017_set_vandalism_list.py delete mode 100644 ynr/apps/people/migrations/0018_gender_guess.py delete mode 100644 ynr/apps/people/migrations/0019_move_to_ballot_in_version_history.py delete mode 100644 ynr/apps/people/migrations/0020_add_json_versions.py delete mode 100644 ynr/apps/people/migrations/0021_populate_json_versions.py delete mode 100644 ynr/apps/people/migrations/0022_rename_json_versions_field.py delete mode 100644 ynr/apps/people/migrations/0023_add_search_vector_field.py delete mode 100644 ynr/apps/people/migrations/0024_add_gist_index_for_search.py delete mode 100644 ynr/apps/people/migrations/0025_add_name_search_trigger.py delete mode 100644 ynr/apps/people/migrations/0026_add_person_name_synonym.py delete mode 100644 ynr/apps/people/migrations/0027_auto_20210401_0811.py delete mode 100644 ynr/apps/people/migrations/0028_add_default_to_extra_data.py delete mode 100644 ynr/apps/people/migrations/0029_default_versions_to_list.py delete mode 100644 ynr/apps/people/migrations/0030_auto_20210616_1642.py delete mode 100644 ynr/apps/people/migrations/0031_copy_created.py delete mode 100644 ynr/apps/people/migrations/0032_auto_20210616_1700.py delete mode 100644 ynr/apps/people/migrations/0033_auto_20210928_1007.py delete mode 100644 ynr/apps/people/migrations/0034_get_birth_year.py delete mode 100644 ynr/apps/people/migrations/0035_alter_person_birth_date.py delete mode 100644 ynr/apps/popolo/migrations/0002_update_models_from_upstream.py delete mode 100644 ynr/apps/popolo/migrations/0003_move-extra-fields-to-base.py delete mode 100644 ynr/apps/popolo/migrations/0004_move-extra-data-to-base.py delete mode 100644 ynr/apps/popolo/migrations/0005_set_post_election_not_null_.py delete mode 100644 ynr/apps/popolo/migrations/0006_membership_unique_together.py delete mode 100644 ynr/apps/popolo/migrations/0007_python_3_migrations.py delete mode 100644 ynr/apps/popolo/migrations/0008_add_person_extra_fields.py delete mode 100644 ynr/apps/popolo/migrations/0009_move_extra_person_data_to_base.py delete mode 100644 ynr/apps/popolo/migrations/0010_rename_not_standing_related_name.py delete mode 100644 ynr/apps/popolo/migrations/0011_add_post_extra_fields.py delete mode 100644 ynr/apps/popolo/migrations/0012_move_post_extra_data_to_base.py delete mode 100644 ynr/apps/popolo/migrations/0013_clean_up_after_postextra_move.py delete mode 100644 ynr/apps/popolo/migrations/0014_membership_party.py delete mode 100644 ynr/apps/popolo/migrations/0015_move_organization_to_parties.py delete mode 100644 ynr/apps/popolo/migrations/0016_remove_membership_organization.py delete mode 100644 ynr/apps/popolo/migrations/0017_remove_membership_on_behalf_of.py delete mode 100644 ynr/apps/popolo/migrations/0018_protect_membership_on_party_deletion.py delete mode 100644 ynr/apps/popolo/migrations/0019_move_organization_extra_fields_to_base.py delete mode 100644 ynr/apps/popolo/migrations/0020_move_extra_organization_data_to_base.py delete mode 100644 ynr/apps/popolo/migrations/0021_auto_20180918_1534.py delete mode 100644 ynr/apps/popolo/migrations/0022_populate_person_image_from_image.py delete mode 100644 ynr/apps/popolo/migrations/0023_remove_area_model.py delete mode 100644 ynr/apps/popolo/migrations/0024_remove_person_image.py delete mode 100644 ynr/apps/popolo/migrations/0025_move_person_fk_to_people_app.py delete mode 100644 ynr/apps/popolo/migrations/0026_remove_stale_models.py delete mode 100644 ynr/apps/popolo/migrations/0027_slug_org_unique_together.py delete mode 100644 ynr/apps/popolo/migrations/0028_rename_post_election_to_ballot.py delete mode 100644 ynr/apps/popolo/migrations/0029_positive_int_field.py delete mode 100644 ynr/apps/popolo/migrations/0030_remove_duplicate_other_names.py delete mode 100644 ynr/apps/popolo/migrations/0031_other_names_unique_constraint.py delete mode 100644 ynr/apps/popolo/migrations/0032_add_post_identifiers.py delete mode 100644 ynr/apps/popolo/migrations/0033_unique_on_start_date.py delete mode 100644 ynr/apps/popolo/migrations/0034_populate_from_ee_divisions.py delete mode 100644 ynr/apps/popolo/migrations/0035_attach_memberships_to_posts.py delete mode 100644 ynr/apps/popolo/migrations/0036_add_party_name_and_description.py delete mode 100644 ynr/apps/popolo/migrations/0037_data_migration_add_party_name.py delete mode 100644 ynr/apps/popolo/migrations/0038_auto_20210401_0811.py delete mode 100644 ynr/apps/popolo/migrations/0039_auto_20210616_1642.py delete mode 100644 ynr/apps/popolo/migrations/0040_copy_created.py delete mode 100644 ynr/apps/popolo/migrations/0041_auto_20210616_1705.py delete mode 100644 ynr/apps/popolo/migrations/0042_add_timestamps_to_post.py delete mode 100644 ynr/apps/popolo/migrations/0043_alter_membership_elected.py delete mode 100644 ynr/apps/popolo/migrations/0044_add_indexes_to_modified.py delete mode 100644 ynr/apps/popolo/migrations/0045_clean_up_blank_party_names.py delete mode 100644 ynr/apps/popolo/migrations/0046_remove_blank_from_party_name.py delete mode 100644 ynr/apps/results/migrations/0002_resultevent_parlparse_id.py delete mode 100644 ynr/apps/results/migrations/0003_resultevent_post_name.py delete mode 100644 ynr/apps/results/migrations/0004_resultevent_election.py delete mode 100644 ynr/apps/results/migrations/0005_auto_fill_election_and_post_name.py delete mode 100644 ynr/apps/results/migrations/0006_resultevent_winner.py delete mode 100644 ynr/apps/results/migrations/0007_update_winner_from_popit_person_id.py delete mode 100644 ynr/apps/results/migrations/0008_remove_resultevent_winner_popit_person_id.py delete mode 100644 ynr/apps/results/migrations/0009_resultevent_election_new.py delete mode 100644 ynr/apps/results/migrations/0010_resultevent_winner_party_new.py delete mode 100644 ynr/apps/results/migrations/0011_resultevent_post_new.py delete mode 100644 ynr/apps/results/migrations/0012_migrate_resultevent_data.py delete mode 100644 ynr/apps/results/migrations/0013_remove_old_fields.py delete mode 100644 ynr/apps/results/migrations/0014_rename_election_new_to_election.py delete mode 100644 ynr/apps/results/migrations/0015_rename_to_winner_party.py delete mode 100644 ynr/apps/results/migrations/0016_rename_post_id_to_old_post_id.py delete mode 100644 ynr/apps/results/migrations/0017_rename_post_name_to_old_post_name.py delete mode 100644 ynr/apps/results/migrations/0018_fix_2015_resultevent_winners.py delete mode 100644 ynr/apps/results/migrations/0019_rename_post_new_to_post.py delete mode 100644 ynr/apps/results/migrations/0020_remove_resultevent_proxy_image_url_template.py delete mode 100644 ynr/apps/results/migrations/0021_resultevent_retraction.py delete mode 100644 ynr/apps/results/migrations/0022_resultevent_winner_party_tmp.py delete mode 100644 ynr/apps/results/migrations/0023_migrate_winner_party_to_party_model.py delete mode 100644 ynr/apps/results/migrations/0024_rename_tmp_field.py delete mode 100644 ynr/apps/results/migrations/0025_winner_party_not_null.py delete mode 100644 ynr/apps/results/migrations/0026_move_person_fk_to_people_app.py delete mode 100644 ynr/apps/results/migrations/0027_alter_resultevent_source.py delete mode 100644 ynr/apps/search/migrations/0001_initial.py delete mode 100644 ynr/apps/twitterbot/migrations/0001_initial.py delete mode 100644 ynr/apps/uk_results/migrations/0002_auto_20160425_2110.py delete mode 100644 ynr/apps/uk_results/migrations/0003_auto_20160425_2151.py delete mode 100644 ynr/apps/uk_results/migrations/0004_councilelection_party_set.py delete mode 100644 ynr/apps/uk_results/migrations/0005_auto_20160426_1058.py delete mode 100644 ynr/apps/uk_results/migrations/0006_add_admin_persmissions.py delete mode 100644 ynr/apps/uk_results/migrations/0007_councilelectionresultset_noc.py delete mode 100644 ynr/apps/uk_results/migrations/0008_auto_20160426_1629.py delete mode 100644 ynr/apps/uk_results/migrations/0009_auto_20160427_0858.py delete mode 100644 ynr/apps/uk_results/migrations/0010_auto_20160427_0926.py delete mode 100644 ynr/apps/uk_results/migrations/0011_auto_20160427_1305.py delete mode 100644 ynr/apps/uk_results/migrations/0012_auto_20160427_1339.py delete mode 100644 ynr/apps/uk_results/migrations/0013_auto_20160427_1410.py delete mode 100644 ynr/apps/uk_results/migrations/0014_auto_20160427_1429.py delete mode 100644 ynr/apps/uk_results/migrations/0015_auto_20160428_0805.py delete mode 100644 ynr/apps/uk_results/migrations/0016_auto_20160429_0938.py delete mode 100644 ynr/apps/uk_results/migrations/0017_auto_20160429_0938.py delete mode 100644 ynr/apps/uk_results/migrations/0018_electionarea_noc.py delete mode 100644 ynr/apps/uk_results/migrations/0019_councilelection_confirming_result_set.py delete mode 100644 ynr/apps/uk_results/migrations/0020_auto_20160503_1920.py delete mode 100644 ynr/apps/uk_results/migrations/0021_auto_20160503_1923.py delete mode 100644 ynr/apps/uk_results/migrations/0022_postresult_confirmed_resultset.py delete mode 100644 ynr/apps/uk_results/migrations/0023_auto_20160505_1636.py delete mode 100644 ynr/apps/uk_results/migrations/0024_auto_20160505_2334.py delete mode 100644 ynr/apps/uk_results/migrations/0025_minus-1-to-null-on-num-fields.py delete mode 100644 ynr/apps/uk_results/migrations/0026_auto_20170130_1541.py delete mode 100644 ynr/apps/uk_results/migrations/0027_auto_20170502_2130.py delete mode 100644 ynr/apps/uk_results/migrations/0028_auto_20170503_1633.py delete mode 100644 ynr/apps/uk_results/migrations/0029_add_postresult_post_election.py delete mode 100644 ynr/apps/uk_results/migrations/0030_populate_postresult_post_election.py delete mode 100644 ynr/apps/uk_results/migrations/0031_remove_postresult_post.py delete mode 100644 ynr/apps/uk_results/migrations/0032_rename_postresult_to_postelectionresult.py delete mode 100644 ynr/apps/uk_results/migrations/0033_auto_20170506_2042.py delete mode 100644 ynr/apps/uk_results/migrations/0034_auto_20180130_1243.py delete mode 100644 ynr/apps/uk_results/migrations/0035_auto_20180406_1555.py delete mode 100644 ynr/apps/uk_results/migrations/0036_auto_20180424_1926.py delete mode 100644 ynr/apps/uk_results/migrations/0037_delete_rejected_data.py delete mode 100644 ynr/apps/uk_results/migrations/0038_auto_20180424_1949.py delete mode 100644 ynr/apps/uk_results/migrations/0039_resultset_post_election.py delete mode 100644 ynr/apps/uk_results/migrations/0040_add_pee_to_resultset.py delete mode 100644 ynr/apps/uk_results/migrations/0041_auto_20180424_2049.py delete mode 100644 ynr/apps/uk_results/migrations/0042_auto_20180424_2053.py delete mode 100644 ynr/apps/uk_results/migrations/0043_auto_20180424_2148.py delete mode 100644 ynr/apps/uk_results/migrations/0044_auto_20180424_2149.py delete mode 100644 ynr/apps/uk_results/migrations/0045_auto_20180424_2150.py delete mode 100644 ynr/apps/uk_results/migrations/0046_auto_20180501_1052.py delete mode 100644 ynr/apps/uk_results/migrations/0047_auto_20180501_1359.py delete mode 100644 ynr/apps/uk_results/migrations/0048_rename_post_election_fk_to_ballot.py delete mode 100644 ynr/apps/uk_results/migrations/0049_positive_int_field.py delete mode 100644 ynr/apps/uk_results/migrations/0050_candidateresult_tied_vote_winner.py delete mode 100644 ynr/apps/uk_results/migrations/0051_resultset_total_electorate.py delete mode 100644 ynr/apps/uk_results/migrations/0052_add_turnout_percentage.py delete mode 100644 ynr/apps/uk_results/migrations/0053_auto_20210928_1007.py delete mode 100644 ynr/apps/uk_results/migrations/0054_update_is_winner_to_elected.py delete mode 100644 ynr/apps/uk_results/migrations/0055_migrate_is_winner_to_elected.py delete mode 100644 ynr/apps/uk_results/migrations/0056_remove_candidateresult_is_winner.py delete mode 100644 ynr/apps/wombles/migrations/0002_add_initial_profiles.py delete mode 100644 ynr/apps/wombles/migrations/0003_auto_20210401_0811.py delete mode 100644 ynr/apps/ynr_refactoring/migrations/0002_move_old_election_slugs.py delete mode 100644 ynr/apps/ynr_refactoring/migrations/0003_move_person_identifiers.py diff --git a/ynr/apps/bulk_adding/migrations/0001_add_trusted_to_bulk_add_group.py b/ynr/apps/bulk_adding/migrations/0001_add_trusted_to_bulk_add_group.py deleted file mode 100644 index 4c6b493b9a..0000000000 --- a/ynr/apps/bulk_adding/migrations/0001_add_trusted_to_bulk_add_group.py +++ /dev/null @@ -1,16 +0,0 @@ -from django.db import migrations - -from auth_helpers.migrations import ( - get_migration_group_create, - get_migration_group_delete, -) -from bulk_adding.models import TRUSTED_TO_BULK_ADD_GROUP_NAME - - -class Migration(migrations.Migration): - operations = [ - migrations.RunPython( - get_migration_group_create(TRUSTED_TO_BULK_ADD_GROUP_NAME, []), - get_migration_group_delete(TRUSTED_TO_BULK_ADD_GROUP_NAME), - ) - ] diff --git a/ynr/apps/bulk_adding/migrations/0002_rawpeople.py b/ynr/apps/bulk_adding/migrations/0001_initial.py similarity index 69% rename from ynr/apps/bulk_adding/migrations/0002_rawpeople.py rename to ynr/apps/bulk_adding/migrations/0001_initial.py index 5ab7b50a4d..5d1b8428ca 100644 --- a/ynr/apps/bulk_adding/migrations/0002_rawpeople.py +++ b/ynr/apps/bulk_adding/migrations/0001_initial.py @@ -1,21 +1,15 @@ -# -*- coding: utf-8 -*- -# Generated by Django 1.11.20 on 2019-03-07 18:19 -from __future__ import unicode_literals +# Generated by Django 3.2.10 on 2021-12-14 17:21 -import django.db.models.deletion +from django.db import migrations, models import django.utils.timezone import model_utils.fields -from django.db import migrations, models class Migration(migrations.Migration): initial = True - dependencies = [ - ("bulk_adding", "0001_add_trusted_to_bulk_add_group"), - ("candidates", "0056_tmp_ids_to_ballot_id"), - ] + dependencies = [] operations = [ migrations.CreateModel( @@ -46,13 +40,18 @@ class Migration(migrations.Migration): verbose_name="modified", ), ), - ("data", models.TextField()), - ("source", models.CharField(max_length=255)), + ("data", models.JSONField()), + ("source", models.CharField(max_length=512)), ( - "ballot", - models.OneToOneField( - on_delete=django.db.models.deletion.CASCADE, - to="candidates.PostExtraElection", + "source_type", + models.CharField( + choices=[ + ("bulk_add_form", "Bulk Add form"), + ("council_csv", "Council CSV"), + ("parsed_pdf", "Parsed from a PDF"), + ], + default="bulk_add_form", + max_length=255, ), ), ], diff --git a/ynr/apps/bulk_adding/migrations/0002_rawpeople_ballot.py b/ynr/apps/bulk_adding/migrations/0002_rawpeople_ballot.py new file mode 100644 index 0000000000..c5446bf97c --- /dev/null +++ b/ynr/apps/bulk_adding/migrations/0002_rawpeople_ballot.py @@ -0,0 +1,25 @@ +# Generated by Django 3.2.10 on 2021-12-14 17:21 + +from django.db import migrations, models +import django.db.models.deletion + + +class Migration(migrations.Migration): + + initial = True + + dependencies = [ + ("bulk_adding", "0001_initial"), + ("candidates", "0001_initial"), + ] + + operations = [ + migrations.AddField( + model_name="rawpeople", + name="ballot", + field=models.OneToOneField( + on_delete=django.db.models.deletion.CASCADE, + to="candidates.ballot", + ), + ) + ] diff --git a/ynr/apps/bulk_adding/migrations/0003_rawpeople_source_type.py b/ynr/apps/bulk_adding/migrations/0003_rawpeople_source_type.py deleted file mode 100644 index b0d8c4ccbd..0000000000 --- a/ynr/apps/bulk_adding/migrations/0003_rawpeople_source_type.py +++ /dev/null @@ -1,25 +0,0 @@ -# -*- coding: utf-8 -*- -# Generated by Django 1.11.20 on 2019-03-09 08:40 -from __future__ import unicode_literals - -from django.db import migrations, models - - -class Migration(migrations.Migration): - - dependencies = [("bulk_adding", "0002_rawpeople")] - - operations = [ - migrations.AddField( - model_name="rawpeople", - name="source_type", - field=models.CharField( - choices=[ - ("bulk_add_form", "Bulk Add form"), - ("council_csv", "Council CSV"), - ], - default="bulk_add_form", - max_length=255, - ), - ) - ] diff --git a/ynr/apps/bulk_adding/migrations/0004_move_to_jsonfield.py b/ynr/apps/bulk_adding/migrations/0004_move_to_jsonfield.py deleted file mode 100644 index f649657d03..0000000000 --- a/ynr/apps/bulk_adding/migrations/0004_move_to_jsonfield.py +++ /dev/null @@ -1,19 +0,0 @@ -# -*- coding: utf-8 -*- -# Generated by Django 1.11.20 on 2019-03-14 16:12 -from __future__ import unicode_literals - -import django.contrib.postgres.fields.jsonb -from django.db import migrations - - -class Migration(migrations.Migration): - - dependencies = [("bulk_adding", "0003_rawpeople_source_type")] - - operations = [ - migrations.AlterField( - model_name="rawpeople", - name="data", - field=django.contrib.postgres.fields.jsonb.JSONField(), - ) - ] diff --git a/ynr/apps/bulk_adding/migrations/0005_source_max_length.py b/ynr/apps/bulk_adding/migrations/0005_source_max_length.py deleted file mode 100644 index bf1338d4c0..0000000000 --- a/ynr/apps/bulk_adding/migrations/0005_source_max_length.py +++ /dev/null @@ -1,18 +0,0 @@ -# -*- coding: utf-8 -*- -# Generated by Django 1.11.20 on 2019-04-05 10:56 -from __future__ import unicode_literals - -from django.db import migrations, models - - -class Migration(migrations.Migration): - - dependencies = [("bulk_adding", "0004_move_to_jsonfield")] - - operations = [ - migrations.AlterField( - model_name="rawpeople", - name="source", - field=models.CharField(max_length=512), - ) - ] diff --git a/ynr/apps/bulk_adding/migrations/0006_auto_20210401_0811.py b/ynr/apps/bulk_adding/migrations/0006_auto_20210401_0811.py deleted file mode 100644 index c7279d6da5..0000000000 --- a/ynr/apps/bulk_adding/migrations/0006_auto_20210401_0811.py +++ /dev/null @@ -1,24 +0,0 @@ -# Generated by Django 2.2.16 on 2021-04-01 07:11 - -from django.db import migrations, models - - -class Migration(migrations.Migration): - - dependencies = [("bulk_adding", "0005_source_max_length")] - - operations = [ - migrations.AlterField( - model_name="rawpeople", - name="source_type", - field=models.CharField( - choices=[ - ("bulk_add_form", "Bulk Add form"), - ("council_csv", "Council CSV"), - ("parsed_pdf", "Parsed from a PDF"), - ], - default="bulk_add_form", - max_length=255, - ), - ) - ] diff --git a/ynr/apps/bulk_adding/migrations/0007_alter_rawpeople_data.py b/ynr/apps/bulk_adding/migrations/0007_alter_rawpeople_data.py deleted file mode 100644 index 706a7d644b..0000000000 --- a/ynr/apps/bulk_adding/migrations/0007_alter_rawpeople_data.py +++ /dev/null @@ -1,14 +0,0 @@ -# Generated by Django 3.2.4 on 2021-09-28 09:07 - -from django.db import migrations, models - - -class Migration(migrations.Migration): - - dependencies = [("bulk_adding", "0006_auto_20210401_0811")] - - operations = [ - migrations.AlterField( - model_name="rawpeople", name="data", field=models.JSONField() - ) - ] diff --git a/ynr/apps/cached_counts/migrations/0001_initial.py b/ynr/apps/cached_counts/migrations/0001_initial.py deleted file mode 100644 index 4857b7ed31..0000000000 --- a/ynr/apps/cached_counts/migrations/0001_initial.py +++ /dev/null @@ -1,29 +0,0 @@ -from django.db import migrations, models - - -class Migration(migrations.Migration): - - dependencies = [] - - operations = [ - migrations.CreateModel( - name="CachedCount", - fields=[ - ( - "id", - models.AutoField( - verbose_name="ID", - serialize=False, - auto_created=True, - primary_key=True, - ), - ), - ("count_type", models.CharField(max_length=100, db_index=True)), - ("name", models.CharField(max_length=100)), - ("count", models.IntegerField()), - ("object_id", models.CharField(max_length=100, blank=True)), - ], - options={"ordering": ["-count", "name"]}, - bases=(models.Model,), - ) - ] diff --git a/ynr/apps/cached_counts/migrations/0002_cachedcount_election.py b/ynr/apps/cached_counts/migrations/0002_cachedcount_election.py deleted file mode 100644 index 38c24bb554..0000000000 --- a/ynr/apps/cached_counts/migrations/0002_cachedcount_election.py +++ /dev/null @@ -1,15 +0,0 @@ -from django.db import migrations, models - - -class Migration(migrations.Migration): - - dependencies = [("cached_counts", "0001_initial")] - - operations = [ - migrations.AddField( - model_name="cachedcount", - name="election", - field=models.CharField(max_length=512, null=True, blank=True), - preserve_default=True, - ) - ] diff --git a/ynr/apps/cached_counts/migrations/0003_set_default_election.py b/ynr/apps/cached_counts/migrations/0003_set_default_election.py deleted file mode 100644 index 619201c795..0000000000 --- a/ynr/apps/cached_counts/migrations/0003_set_default_election.py +++ /dev/null @@ -1,25 +0,0 @@ -from django.db import migrations - -# This migration should only need to run by original YourNextMP -# installations, for the UK 2015 General Election; any future -# installations will set the right election when creating CachedCount -# objects. - - -def set_uk_2015_election(apps, schema_editor): - CachedCount = apps.get_model("cached_counts", "CachedCount") - for cc in CachedCount.objects.all(): - if not cc.election: - cc.election = "2015" - cc.save() - - -class Migration(migrations.Migration): - - dependencies = [("cached_counts", "0002_cachedcount_election")] - - operations = [ - migrations.RunPython( - set_uk_2015_election, lambda apps, schema_editor: None - ) - ] diff --git a/ynr/apps/cached_counts/migrations/0004_constituency_to_post.py b/ynr/apps/cached_counts/migrations/0004_constituency_to_post.py deleted file mode 100644 index 995200e1c0..0000000000 --- a/ynr/apps/cached_counts/migrations/0004_constituency_to_post.py +++ /dev/null @@ -1,16 +0,0 @@ -from django.db import migrations - - -def change_constituency_to_post(apps, schema_editor): - CachedCount = apps.get_model("cached_counts", "CachedCount") - for cc in CachedCount.objects.all(): - if cc.count_type == "constituency": - cc.count_type = "post" - cc.save() - - -class Migration(migrations.Migration): - - dependencies = [("cached_counts", "0003_set_default_election")] - - operations = [migrations.RunPython(change_constituency_to_post)] diff --git a/ynr/apps/cached_counts/migrations/0005_delete_cachedcount.py b/ynr/apps/cached_counts/migrations/0005_delete_cachedcount.py deleted file mode 100644 index a71706e447..0000000000 --- a/ynr/apps/cached_counts/migrations/0005_delete_cachedcount.py +++ /dev/null @@ -1,8 +0,0 @@ -from django.db import migrations - - -class Migration(migrations.Migration): - - dependencies = [("cached_counts", "0004_constituency_to_post")] - - operations = [migrations.DeleteModel(name="CachedCount")] diff --git a/ynr/apps/candidates/migrations/0001_initial.py b/ynr/apps/candidates/migrations/0001_initial.py index e33b149987..1fbf97485f 100644 --- a/ynr/apps/candidates/migrations/0001_initial.py +++ b/ynr/apps/candidates/migrations/0001_initial.py @@ -1,64 +1,210 @@ +# Generated by Django 3.2.10 on 2021-12-14 17:21 + from django.conf import settings from django.db import migrations, models +import django.db.models.deletion +import django_extensions.db.fields class Migration(migrations.Migration): + initial = True + dependencies = [migrations.swappable_dependency(settings.AUTH_USER_MODEL)] operations = [ migrations.CreateModel( - name="LoggedAction", + name="Ballot", fields=[ ( "id", models.AutoField( - verbose_name="ID", + auto_created=True, + primary_key=True, serialize=False, + verbose_name="ID", + ), + ), + ( + "created", + django_extensions.db.fields.CreationDateTimeField( + auto_now_add=True, verbose_name="created" + ), + ), + ( + "modified", + django_extensions.db.fields.ModificationDateTimeField( + auto_now=True, db_index=True, verbose_name="modified" + ), + ), + ( + "ee_modified", + models.DateTimeField( + blank=True, + help_text="Stores the modified timestamp from EE", + null=True, + ), + ), + ( + "ballot_paper_id", + models.CharField(blank=True, max_length=255, unique=True), + ), + ("candidates_locked", models.BooleanField(default=False)), + ( + "winner_count", + models.PositiveSmallIntegerField(blank=True, null=True), + ), + ("cancelled", models.BooleanField(default=False)), + ("voting_system", models.CharField(blank=True, max_length=255)), + ("tags", models.JSONField(blank=True, default=dict)), + ], + options={"get_latest_by": "modified", "abstract": False}, + ), + migrations.CreateModel( + name="LoggedAction", + fields=[ + ( + "id", + models.AutoField( auto_created=True, primary_key=True, + serialize=False, + verbose_name="ID", + ), + ), + ( + "person_pk", + models.PositiveIntegerField( + blank=True, + help_text="This is stored to help us identify the related person an action was for after the Person has been deleted", + null=True, + ), + ), + ( + "action_type", + models.CharField( + choices=[ + ("entered-results-data", "Entered results"), + ("set-candidate-elected", "Set Candidate elected"), + ( + "set-candidate-not-elected", + "Set Candidate not elected", + ), + ("person-lock", "Person locked"), + ("person-update", "Person updated"), + ("person-create", "Person created"), + ("person-delete", "Person deleted"), + ( + "person-other-name-create", + "Person Other name created", + ), + ( + "person-other-name-delete", + "Person Other name deleted", + ), + ( + "person-other-name-update", + "Person Other name updated", + ), + ("person-revert", "Person reverted"), + ("constituency-lock", "Constituency locked"), + ("constituency-unlock", "Constituency unlocked"), + ("candidacy-create", "Candidacy created"), + ("candidacy-delete", "Candidacy deleted"), + ("photo-approve", "Photo approved"), + ("photo-upload", "Photo uploaded"), + ("photo-reject", "Photo rejected"), + ("photo-ignore", "Photo ignored"), + ("suggest-ballot-lock", "Suggested ballot lock"), + ("person-merge", "Person merged"), + ( + "record-council-result", + "Recorded council result", + ), + ( + "confirm-council-result", + "Confirmed council result ", + ), + ("sopn-upload", "SOPN uploaded"), + ( + "record-council-control", + "Recorded council control", + ), + ( + "confirm-council-control", + "Confirmed council control", + ), + ("retract-winner", "Retracted winner"), + ("duplicate-suggest", "Duplicate suggested"), + ( + "change-edit-limitations", + "Changed edit limitations", + ), + ( + "suspended-twitter-account", + "Suspended Twitter account", + ), + ], + max_length=64, ), ), - ("action_type", models.CharField(max_length=64)), ("popit_person_new_version", models.CharField(max_length=32)), - ("popit_person_id", models.CharField(max_length=256)), - ("created", models.DateTimeField(auto_now_add=True)), + ( + "created", + models.DateTimeField(auto_now_add=True, db_index=True), + ), ("updated", models.DateTimeField(auto_now=True)), ( "ip_address", - models.CharField(max_length=50, null=True, blank=True), + models.CharField(blank=True, max_length=50, null=True), ), ("source", models.TextField()), ( - "user", - models.ForeignKey( + "flagged_type", + models.CharField( blank=True, - to=settings.AUTH_USER_MODEL, - null=True, - on_delete=models.CASCADE, + help_text="If NOT NULL, a type of flag that marks this edit as needing review by a human", + max_length=100, + ), + ), + ( + "flagged_reason", + models.CharField( + blank=True, + help_text="An explaination of the reason for flagging this edit", + max_length=255, ), ), + ( + "edit_type", + models.CharField( + choices=[ + ("USER", "User"), + ("BOT", "Bot"), + ("BULK_ADD", "Bulk Add"), + ], + default="USER", + max_length=20, + ), + ), + ("approved", models.JSONField(null=True)), ], - options={}, - bases=(models.Model,), ), migrations.CreateModel( - name="MaxPopItIds", + name="PartySet", fields=[ ( "id", models.AutoField( - verbose_name="ID", - serialize=False, auto_created=True, primary_key=True, + serialize=False, + verbose_name="ID", ), ), - ("popit_collection_name", models.CharField(max_length=255)), - ("max_id", models.IntegerField(default=0)), + ("slug", models.CharField(max_length=256, unique=True)), + ("name", models.CharField(max_length=1024)), ], - options={}, - bases=(models.Model,), ), migrations.CreateModel( name="PersonRedirect", @@ -66,16 +212,37 @@ class Migration(migrations.Migration): ( "id", models.AutoField( - verbose_name="ID", - serialize=False, auto_created=True, primary_key=True, + serialize=False, + verbose_name="ID", ), ), ("old_person_id", models.IntegerField()), ("new_person_id", models.IntegerField()), ], - options={}, - bases=(models.Model,), + ), + migrations.CreateModel( + name="UserTermsAgreement", + fields=[ + ( + "id", + models.AutoField( + auto_created=True, + primary_key=True, + serialize=False, + verbose_name="ID", + ), + ), + ("assigned_to_dc", models.BooleanField(default=False)), + ( + "user", + models.OneToOneField( + on_delete=django.db.models.deletion.CASCADE, + related_name="terms_agreement", + to=settings.AUTH_USER_MODEL, + ), + ), + ], ), ] diff --git a/ynr/apps/candidates/migrations/0002_initial.py b/ynr/apps/candidates/migrations/0002_initial.py new file mode 100644 index 0000000000..9b63d7d3be --- /dev/null +++ b/ynr/apps/candidates/migrations/0002_initial.py @@ -0,0 +1,93 @@ +# Generated by Django 3.2.10 on 2021-12-14 17:21 + +from django.conf import settings +from django.db import migrations, models +import django.db.models.deletion + + +class Migration(migrations.Migration): + + initial = True + + dependencies = [ + ("popolo", "0001_initial"), + ("people", "0001_initial"), + ("candidates", "0001_initial"), + ("elections", "0001_initial"), + migrations.swappable_dependency(settings.AUTH_USER_MODEL), + ] + + operations = [ + migrations.AddField( + model_name="partyset", + name="parties", + field=models.ManyToManyField( + related_name="party_sets", to="popolo.Organization" + ), + ), + migrations.AddField( + model_name="loggedaction", + name="ballot", + field=models.ForeignKey( + null=True, + on_delete=django.db.models.deletion.CASCADE, + to="candidates.ballot", + ), + ), + migrations.AddField( + model_name="loggedaction", + name="person", + field=models.ForeignKey( + blank=True, + null=True, + on_delete=django.db.models.deletion.SET_NULL, + to="people.person", + ), + ), + migrations.AddField( + model_name="loggedaction", + name="post", + field=models.ForeignKey( + blank=True, + null=True, + on_delete=django.db.models.deletion.CASCADE, + to="popolo.post", + ), + ), + migrations.AddField( + model_name="loggedaction", + name="user", + field=models.ForeignKey( + blank=True, + null=True, + on_delete=django.db.models.deletion.CASCADE, + to=settings.AUTH_USER_MODEL, + ), + ), + migrations.AddField( + model_name="ballot", + name="election", + field=models.ForeignKey( + on_delete=django.db.models.deletion.CASCADE, + to="elections.election", + ), + ), + migrations.AddField( + model_name="ballot", + name="post", + field=models.ForeignKey( + on_delete=django.db.models.deletion.CASCADE, to="popolo.post" + ), + ), + migrations.AddField( + model_name="ballot", + name="replaces", + field=models.OneToOneField( + blank=True, + null=True, + on_delete=django.db.models.deletion.DO_NOTHING, + related_name="replaced_by", + to="candidates.ballot", + ), + ), + ] diff --git a/ynr/apps/candidates/migrations/0002_usertermsagreement.py b/ynr/apps/candidates/migrations/0002_usertermsagreement.py deleted file mode 100644 index 44004b926d..0000000000 --- a/ynr/apps/candidates/migrations/0002_usertermsagreement.py +++ /dev/null @@ -1,38 +0,0 @@ -from django.conf import settings -from django.db import migrations, models - - -class Migration(migrations.Migration): - - dependencies = [ - migrations.swappable_dependency(settings.AUTH_USER_MODEL), - ("candidates", "0001_initial"), - ] - - operations = [ - migrations.CreateModel( - name="UserTermsAgreement", - fields=[ - ( - "id", - models.AutoField( - verbose_name="ID", - serialize=False, - auto_created=True, - primary_key=True, - ), - ), - ("assigned_to_dc", models.BooleanField(default=False)), - ( - "user", - models.OneToOneField( - related_name="terms_agreement", - to=settings.AUTH_USER_MODEL, - on_delete=models.CASCADE, - ), - ), - ], - options={}, - bases=(models.Model,), - ) - ] diff --git a/ynr/apps/candidates/migrations/0003_create_user_terms_agreements.py b/ynr/apps/candidates/migrations/0003_create_user_terms_agreements.py deleted file mode 100644 index 681f6baf05..0000000000 --- a/ynr/apps/candidates/migrations/0003_create_user_terms_agreements.py +++ /dev/null @@ -1,15 +0,0 @@ -from django.db import migrations - - -def create_user_terms_agreements(apps, schema_editor): - User = apps.get_model("auth", "User") - UserTermsAgreement = apps.get_model("candidates", "UserTermsAgreement") - for u in User.objects.all(): - UserTermsAgreement.objects.get_or_create(user=u) - - -class Migration(migrations.Migration): - - dependencies = [("candidates", "0002_usertermsagreement")] - - operations = [migrations.RunPython(create_user_terms_agreements)] diff --git a/ynr/apps/candidates/migrations/0004_add_trusted_to_merge_group.py b/ynr/apps/candidates/migrations/0004_add_trusted_to_merge_group.py deleted file mode 100644 index 2577fece7f..0000000000 --- a/ynr/apps/candidates/migrations/0004_add_trusted_to_merge_group.py +++ /dev/null @@ -1,19 +0,0 @@ -from django.db import migrations - -from auth_helpers.migrations import ( - get_migration_group_create, - get_migration_group_delete, -) -from candidates.models import TRUSTED_TO_MERGE_GROUP_NAME - - -class Migration(migrations.Migration): - - dependencies = [("candidates", "0003_create_user_terms_agreements")] - - operations = [ - migrations.RunPython( - get_migration_group_create(TRUSTED_TO_MERGE_GROUP_NAME, []), - get_migration_group_delete(TRUSTED_TO_MERGE_GROUP_NAME), - ) - ] diff --git a/ynr/apps/candidates/migrations/0005_add_trusted_to_lock_group.py b/ynr/apps/candidates/migrations/0005_add_trusted_to_lock_group.py deleted file mode 100644 index c7891c02ae..0000000000 --- a/ynr/apps/candidates/migrations/0005_add_trusted_to_lock_group.py +++ /dev/null @@ -1,19 +0,0 @@ -from django.db import migrations - -from auth_helpers.migrations import ( - get_migration_group_create, - get_migration_group_delete, -) -from candidates.models import TRUSTED_TO_LOCK_GROUP_NAME - - -class Migration(migrations.Migration): - - dependencies = [("candidates", "0004_add_trusted_to_merge_group")] - - operations = [ - migrations.RunPython( - get_migration_group_create(TRUSTED_TO_LOCK_GROUP_NAME, []), - get_migration_group_delete(TRUSTED_TO_LOCK_GROUP_NAME), - ) - ] diff --git a/ynr/apps/candidates/migrations/0006_auto_add_trusted_to_rename_group.py b/ynr/apps/candidates/migrations/0006_auto_add_trusted_to_rename_group.py deleted file mode 100644 index 68f620f91d..0000000000 --- a/ynr/apps/candidates/migrations/0006_auto_add_trusted_to_rename_group.py +++ /dev/null @@ -1,20 +0,0 @@ -from django.db import migrations - -from auth_helpers.migrations import ( - get_migration_group_create, - get_migration_group_delete, -) - -TRUSTED_TO_RENAME_GROUP_NAME = "Trusted To Rename" - - -class Migration(migrations.Migration): - - dependencies = [("candidates", "0005_add_trusted_to_lock_group")] - - operations = [ - migrations.RunPython( - get_migration_group_create(TRUSTED_TO_RENAME_GROUP_NAME, []), - get_migration_group_delete(TRUSTED_TO_RENAME_GROUP_NAME), - ) - ] diff --git a/ynr/apps/candidates/migrations/0007_add_result_recorders_group.py b/ynr/apps/candidates/migrations/0007_add_result_recorders_group.py deleted file mode 100644 index ae711a07b0..0000000000 --- a/ynr/apps/candidates/migrations/0007_add_result_recorders_group.py +++ /dev/null @@ -1,19 +0,0 @@ -from django.db import migrations - -from auth_helpers.migrations import ( - get_migration_group_create, - get_migration_group_delete, -) -from candidates.models import RESULT_RECORDERS_GROUP_NAME - - -class Migration(migrations.Migration): - - dependencies = [("candidates", "0006_auto_add_trusted_to_rename_group")] - - operations = [ - migrations.RunPython( - get_migration_group_create(RESULT_RECORDERS_GROUP_NAME, []), - get_migration_group_delete(RESULT_RECORDERS_GROUP_NAME), - ) - ] diff --git a/ynr/apps/candidates/migrations/0008_membershipextra_organizationextra_personextra_postextra.py b/ynr/apps/candidates/migrations/0008_membershipextra_organizationextra_personextra_postextra.py deleted file mode 100644 index c22aeb049f..0000000000 --- a/ynr/apps/candidates/migrations/0008_membershipextra_organizationextra_personextra_postextra.py +++ /dev/null @@ -1,199 +0,0 @@ -from django.conf import settings -from django.db import migrations, models - - -class Migration(migrations.Migration): - - dependencies = [ - migrations.swappable_dependency(settings.AUTH_USER_MODEL), - ("popolo", "0002_update_models_from_upstream"), - ("elections", "0003_allow_null_winner_membership_role"), - ("candidates", "0007_add_result_recorders_group"), - ] - - operations = [ - migrations.CreateModel( - name="MembershipExtra", - fields=[ - ( - "id", - models.AutoField( - verbose_name="ID", - serialize=False, - auto_created=True, - primary_key=True, - ), - ), - ( - "base", - models.OneToOneField( - related_name="extra", - to="popolo.Membership", - on_delete=models.CASCADE, - ), - ), - ( - "election", - models.ForeignKey( - related_name="candidacies", - blank=True, - to="elections.Election", - null=True, - on_delete=models.CASCADE, - ), - ), - ("party_list_position", models.IntegerField(null=True)), - ("elected", models.NullBooleanField()), - ], - ), - migrations.CreateModel( - name="OrganizationExtra", - fields=[ - ( - "id", - models.AutoField( - verbose_name="ID", - serialize=False, - auto_created=True, - primary_key=True, - ), - ), - ("register", models.CharField(max_length=512, blank=True)), - ( - "base", - models.OneToOneField( - related_name="extra", - to="popolo.Organization", - on_delete=models.CASCADE, - ), - ), - ("slug", models.CharField(max_length=256, blank=True)), - ], - ), - migrations.CreateModel( - name="PersonExtra", - fields=[ - ( - "id", - models.AutoField( - verbose_name="ID", - serialize=False, - auto_created=True, - primary_key=True, - ), - ), - ("cv", models.TextField(blank=True)), - ("program", models.TextField(blank=True)), - ("versions", models.TextField(blank=True)), - ( - "base", - models.OneToOneField( - related_name="extra", - to="popolo.Person", - on_delete=models.CASCADE, - ), - ), - ( - "not_standing", - models.ManyToManyField( - related_name="persons_not_standing", - to="elections.Election", - ), - ), - ], - ), - migrations.CreateModel( - name="PartySet", - fields=[ - ( - "id", - models.AutoField( - verbose_name="ID", - serialize=False, - auto_created=True, - primary_key=True, - ), - ), - ("slug", models.CharField(max_length=256)), - ("name", models.CharField(max_length=1024)), - ( - "parties", - models.ManyToManyField( - related_name="party_sets", to="popolo.Organization" - ), - ), - ], - ), - migrations.CreateModel( - name="PostExtra", - fields=[ - ( - "id", - models.AutoField( - verbose_name="ID", - serialize=False, - auto_created=True, - primary_key=True, - ), - ), - ( - "base", - models.OneToOneField( - related_name="extra", - to="popolo.Post", - on_delete=models.CASCADE, - ), - ), - ("slug", models.CharField(max_length=256, blank=True)), - ("candidates_locked", models.BooleanField(default=False)), - ( - "elections", - models.ManyToManyField( - related_name="posts", to="elections.Election" - ), - ), - ("group", models.CharField(max_length=1024, blank=True)), - ( - "party_set", - models.ForeignKey( - blank=True, - to="candidates.PartySet", - null=True, - on_delete=models.CASCADE, - ), - ), - ], - ), - migrations.CreateModel( - name="AreaExtra", - fields=[ - ( - "id", - models.AutoField( - verbose_name="ID", - serialize=False, - auto_created=True, - primary_key=True, - ), - ), - ( - "base", - models.OneToOneField( - related_name="extra", - to="popolo.Area", - on_delete=models.CASCADE, - ), - ), - ( - "type", - models.ForeignKey( - related_name="areas", - blank=True, - to="elections.AreaType", - null=True, - on_delete=models.CASCADE, - ), - ), - ], - ), - ] diff --git a/ynr/apps/candidates/migrations/0009_migrate_to_django_popolo.py b/ynr/apps/candidates/migrations/0009_migrate_to_django_popolo.py deleted file mode 100644 index 0082eab45f..0000000000 --- a/ynr/apps/candidates/migrations/0009_migrate_to_django_popolo.py +++ /dev/null @@ -1,18 +0,0 @@ -from django.db import migrations - - -class Migration(migrations.Migration): - - dependencies = [ - ( - "candidates", - "0008_membershipextra_organizationextra_personextra_postextra", - ), - ("popolo", "0002_update_models_from_upstream"), - ] - - operations = [ - migrations.RunPython( - migrations.RunPython.noop, migrations.RunPython.noop - ) - ] diff --git a/ynr/apps/candidates/migrations/0010_loggedaction_person.py b/ynr/apps/candidates/migrations/0010_loggedaction_person.py deleted file mode 100644 index 710476ff2b..0000000000 --- a/ynr/apps/candidates/migrations/0010_loggedaction_person.py +++ /dev/null @@ -1,22 +0,0 @@ -from django.db import migrations, models - - -class Migration(migrations.Migration): - - dependencies = [ - ("popolo", "0002_update_models_from_upstream"), - ("candidates", "0009_migrate_to_django_popolo"), - ] - - operations = [ - migrations.AddField( - model_name="loggedaction", - name="person", - field=models.ForeignKey( - blank=True, - to="popolo.Person", - null=True, - on_delete=models.CASCADE, - ), - ) - ] diff --git a/ynr/apps/candidates/migrations/0011_migrate_loggedaction_person.py b/ynr/apps/candidates/migrations/0011_migrate_loggedaction_person.py deleted file mode 100644 index e2e4aeff4f..0000000000 --- a/ynr/apps/candidates/migrations/0011_migrate_loggedaction_person.py +++ /dev/null @@ -1,34 +0,0 @@ -from django.db import migrations - - -def popit_to_db(apps, schema_editor): - Person = apps.get_model("popolo", "person") - LoggedAction = apps.get_model("candidates", "loggedaction") - for la in LoggedAction.objects.all(): - if la.popit_person_id: - try: - la.person = Person.objects.get(pk=la.popit_person_id) - except Person.DoesNotExist: - # LoggedAction objects may refer to someone who has - # since been deleted from PopIt. - la.person = None - else: - la.person = None - la.save() - - -def db_to_popit(apps, schema_editor): - LoggedAction = apps.get_model("candidates", "loggedaction") - for la in LoggedAction.objects.all(): - if la.person: - la.popit_person_id = la.person.id - else: - la.popit_person_id = "" - la.save() - - -class Migration(migrations.Migration): - - dependencies = [("candidates", "0010_loggedaction_person")] - - operations = [migrations.RunPython(popit_to_db, db_to_popit)] diff --git a/ynr/apps/candidates/migrations/0012_remove_loggedaction_popit_person_id.py b/ynr/apps/candidates/migrations/0012_remove_loggedaction_popit_person_id.py deleted file mode 100644 index bdc6af0b5d..0000000000 --- a/ynr/apps/candidates/migrations/0012_remove_loggedaction_popit_person_id.py +++ /dev/null @@ -1,12 +0,0 @@ -from django.db import migrations - - -class Migration(migrations.Migration): - - dependencies = [("candidates", "0011_migrate_loggedaction_person")] - - operations = [ - migrations.RemoveField( - model_name="loggedaction", name="popit_person_id" - ) - ] diff --git a/ynr/apps/candidates/migrations/0013_remove_max_popit_ids.py b/ynr/apps/candidates/migrations/0013_remove_max_popit_ids.py deleted file mode 100644 index 493c7821ee..0000000000 --- a/ynr/apps/candidates/migrations/0013_remove_max_popit_ids.py +++ /dev/null @@ -1,8 +0,0 @@ -from django.db import migrations - - -class Migration(migrations.Migration): - - dependencies = [("candidates", "0012_remove_loggedaction_popit_person_id")] - - operations = [migrations.DeleteModel(name="MaxPopItIds")] diff --git a/ynr/apps/candidates/migrations/0014_make_extra_slugs_unique.py b/ynr/apps/candidates/migrations/0014_make_extra_slugs_unique.py deleted file mode 100644 index 26e46f1b98..0000000000 --- a/ynr/apps/candidates/migrations/0014_make_extra_slugs_unique.py +++ /dev/null @@ -1,24 +0,0 @@ -from django.db import migrations, models - - -class Migration(migrations.Migration): - - dependencies = [("candidates", "0013_remove_max_popit_ids")] - - operations = [ - migrations.AlterField( - model_name="organizationextra", - name="slug", - field=models.CharField(unique=True, max_length=256, blank=True), - ), - migrations.AlterField( - model_name="partyset", - name="slug", - field=models.CharField(unique=True, max_length=256), - ), - migrations.AlterField( - model_name="postextra", - name="slug", - field=models.CharField(unique=True, max_length=256, blank=True), - ), - ] diff --git a/ynr/apps/candidates/migrations/0015_add_configurable_extra_fields.py b/ynr/apps/candidates/migrations/0015_add_configurable_extra_fields.py deleted file mode 100644 index ad1d483f1c..0000000000 --- a/ynr/apps/candidates/migrations/0015_add_configurable_extra_fields.py +++ /dev/null @@ -1,71 +0,0 @@ -from django.db import migrations, models - - -class Migration(migrations.Migration): - - dependencies = [ - ("popolo", "0002_update_models_from_upstream"), - ("candidates", "0014_make_extra_slugs_unique"), - ] - - operations = [ - migrations.CreateModel( - name="ExtraField", - fields=[ - ( - "id", - models.AutoField( - verbose_name="ID", - serialize=False, - auto_created=True, - primary_key=True, - ), - ), - ("key", models.CharField(max_length=256)), - ( - "type", - models.CharField( - max_length=64, - choices=[ - (b"line", b"A single line of text"), - (b"longer-text", b"One or more paragraphs of text"), - (b"url", b"A URL"), - ], - ), - ), - ("label", models.CharField(max_length=1024)), - ], - ), - migrations.CreateModel( - name="PersonExtraFieldValue", - fields=[ - ( - "id", - models.AutoField( - verbose_name="ID", - serialize=False, - auto_created=True, - primary_key=True, - ), - ), - ("value", models.TextField(blank=True)), - ( - "field", - models.ForeignKey( - to="candidates.ExtraField", on_delete=models.CASCADE - ), - ), - ( - "person", - models.ForeignKey( - related_name="extra_field_values", - to="popolo.Person", - on_delete=models.CASCADE, - ), - ), - ], - ), - migrations.AlterUniqueTogether( - name="personextrafieldvalue", unique_together={("person", "field")} - ), - ] diff --git a/ynr/apps/candidates/migrations/0016_migrate_data_to_extra_fields.py b/ynr/apps/candidates/migrations/0016_migrate_data_to_extra_fields.py deleted file mode 100644 index 0e3f9bb468..0000000000 --- a/ynr/apps/candidates/migrations/0016_migrate_data_to_extra_fields.py +++ /dev/null @@ -1,61 +0,0 @@ -from django.conf import settings -from django.db import migrations - - -def from_person_extra_to_generic_fields(apps, schema_editor): - ExtraField = apps.get_model("candidates", "ExtraField") - PersonExtraFieldValue = apps.get_model( - "candidates", "PersonExtraFieldValue" - ) - PersonExtra = apps.get_model("candidates", "PersonExtra") - if settings.ELECTION_APP == "cr": - p_field = ExtraField.objects.create( - key="profession", type="line", label="Profession" - ) - elif settings.ELECTION_APP == "bf_elections_2015": - c_field = ExtraField.objects.create( - key="cv", type="longer-text", label="CV or Résumé" - ) - p_field = ExtraField.objects.create( - key="program", type="longer-text", label="Program" - ) - for pe in PersonExtra.objects.all(): - person = pe.base - PersonExtraFieldValue.objects.create( - person=person, field=c_field, value=pe.cv - ) - PersonExtraFieldValue.objects.create( - person=person, field=p_field, value=pe.program - ) - - -def from_generic_fields_to_person_extra(apps, schema_editor): - ExtraField = apps.get_model("candidates", "ExtraField") - PersonExtraFieldValue = apps.get_model( - "candidates", "PersonExtraFieldValue" - ) - if settings.ELECTION_APP == "bf_elections_2015": - for pefv in PersonExtraFieldValue.objects.select_related("field"): - pe = pefv.person.extra - if pefv.field.key == "cv": - pe.cv = pefv.value - pe.save() - elif pefv.field.key == "program": - pe.program = pefv.value - pe.save() - else: - print("Ignoring field with unknown key:", pefv.field.key) - PersonExtraFieldValue.objects.all().delete() - ExtraField.objects.all().delete() - - -class Migration(migrations.Migration): - - dependencies = [("candidates", "0015_add_configurable_extra_fields")] - - operations = [ - migrations.RunPython( - from_person_extra_to_generic_fields, - from_generic_fields_to_person_extra, - ) - ] diff --git a/ynr/apps/candidates/migrations/0017_remove_cv_and_program_fields.py b/ynr/apps/candidates/migrations/0017_remove_cv_and_program_fields.py deleted file mode 100644 index a8b9f018d2..0000000000 --- a/ynr/apps/candidates/migrations/0017_remove_cv_and_program_fields.py +++ /dev/null @@ -1,11 +0,0 @@ -from django.db import migrations - - -class Migration(migrations.Migration): - - dependencies = [("candidates", "0016_migrate_data_to_extra_fields")] - - operations = [ - migrations.RemoveField(model_name="personextra", name="cv"), - migrations.RemoveField(model_name="personextra", name="program"), - ] diff --git a/ynr/apps/candidates/migrations/0018_cr_add_important_posts_field.py b/ynr/apps/candidates/migrations/0018_cr_add_important_posts_field.py deleted file mode 100644 index 007f484ddd..0000000000 --- a/ynr/apps/candidates/migrations/0018_cr_add_important_posts_field.py +++ /dev/null @@ -1,25 +0,0 @@ -from django.conf import settings -from django.db import migrations - - -def add_extra_field(apps, schema_editor): - ExtraField = apps.get_model("candidates", "ExtraField") - if settings.ELECTION_APP == "cr": - ExtraField.objects.create( - key="important_roles", type="longer-text", label="Important Roles" - ) - - -def remove_extra_field(apps, schema_editor): - ExtraField = apps.get_model("candidates", "ExtraField") - if settings.ELECTION_APP == "cr": - extra_field = ExtraField.objects.get("important_roles") - extra_field.personextrafieldvalue_set.all().delete() - extra_field.delete() - - -class Migration(migrations.Migration): - - dependencies = [("candidates", "0017_remove_cv_and_program_fields")] - - operations = [migrations.RunPython(add_extra_field, remove_extra_field)] diff --git a/ynr/apps/candidates/migrations/0019_add_yesno_to_extra_field_types.py b/ynr/apps/candidates/migrations/0019_add_yesno_to_extra_field_types.py deleted file mode 100644 index 01eb753574..0000000000 --- a/ynr/apps/candidates/migrations/0019_add_yesno_to_extra_field_types.py +++ /dev/null @@ -1,22 +0,0 @@ -from django.db import migrations, models - - -class Migration(migrations.Migration): - - dependencies = [("candidates", "0018_cr_add_important_posts_field")] - - operations = [ - migrations.AlterField( - model_name="extrafield", - name="type", - field=models.CharField( - max_length=64, - choices=[ - (b"line", b"A single line of text"), - (b"longer-text", b"One or more paragraphs of text"), - (b"url", b"A URL"), - (b"yesno", b"A Yes/No/Don't know dropdown"), - ], - ), - ) - ] diff --git a/ynr/apps/candidates/migrations/0020_cr_add_reelection_field.py b/ynr/apps/candidates/migrations/0020_cr_add_reelection_field.py deleted file mode 100644 index 4f85c12b0d..0000000000 --- a/ynr/apps/candidates/migrations/0020_cr_add_reelection_field.py +++ /dev/null @@ -1,25 +0,0 @@ -from django.conf import settings -from django.db import migrations - - -def add_extra_field(apps, schema_editor): - ExtraField = apps.get_model("candidates", "ExtraField") - if settings.ELECTION_APP == "cr": - ExtraField.objects.create( - key="reelection", type="yesno", label="Standing for re-election" - ) - - -def remove_extra_field(apps, schema_editor): - ExtraField = apps.get_model("candidates", "ExtraField") - if settings.ELECTION_APP == "cr": - extra_field = ExtraField.objects.get("reelection") - extra_field.personextrafieldvalue_set.all().delete() - extra_field.delete() - - -class Migration(migrations.Migration): - - dependencies = [("candidates", "0019_add_yesno_to_extra_field_types")] - - operations = [migrations.RunPython(add_extra_field, remove_extra_field)] diff --git a/ynr/apps/candidates/migrations/0021_simplepopolofield.py b/ynr/apps/candidates/migrations/0021_simplepopolofield.py deleted file mode 100644 index 2576d25c09..0000000000 --- a/ynr/apps/candidates/migrations/0021_simplepopolofield.py +++ /dev/null @@ -1,59 +0,0 @@ -from django.db import migrations, models - - -class Migration(migrations.Migration): - - dependencies = [("candidates", "0020_cr_add_reelection_field")] - - operations = [ - migrations.CreateModel( - name="SimplePopoloField", - fields=[ - ( - "id", - models.AutoField( - verbose_name="ID", - serialize=False, - auto_created=True, - primary_key=True, - ), - ), - ( - "name", - models.CharField( - max_length=256, - choices=[ - (b"name", "Name"), - (b"family_name", "Family Name"), - (b"given_name", "Given Name"), - (b"additional_name", "Additional Name"), - (b"honorific_prefix", "Honorific Prefix"), - (b"honorific_suffix", "Honorific Suffix"), - (b"patronymic_name", "Patronymic Name"), - (b"sort_name", "Sort Name"), - (b"email", "Email"), - (b"gender", "Gender"), - (b"birth_date", "Birth Date"), - (b"death_date", "Death Date"), - (b"summary", "Summary"), - (b"biography", "Biography"), - (b"national_identity", "National Identity"), - ], - ), - ), - ("label", models.CharField(max_length=256)), - ("required", models.BooleanField(default=False)), - ( - "info_type_key", - models.CharField( - max_length=256, - choices=[ - (b"text", "Text Field"), - (b"email", "Email Field"), - ], - ), - ), - ("order", models.IntegerField(blank=True)), - ], - ) - ] diff --git a/ynr/apps/candidates/migrations/0022_create_standard_simple_fields.py b/ynr/apps/candidates/migrations/0022_create_standard_simple_fields.py deleted file mode 100644 index 99bf346a1c..0000000000 --- a/ynr/apps/candidates/migrations/0022_create_standard_simple_fields.py +++ /dev/null @@ -1,60 +0,0 @@ -from django.db import migrations - - -def create_simple_fields(apps, schema_editor): - SimpleField = apps.get_model("candidates", "SimplePopoloField") - db_alias = schema_editor.connection.alias - - SimpleField.objects.using(db_alias).bulk_create( - [ - SimpleField( - name="honorific_prefix", - label="Title / pre-nominal honorific (e.g. Dr, Sir, etc.)", - required=False, - info_type_key="text", - order=1, - ), - SimpleField( - name="name", - label="Full name", - required=True, - info_type_key="text", - order=2, - ), - SimpleField( - name="honorific_suffix", - label="Post-nominal letters (e.g. CBE, DSO, etc.)", - required=False, - info_type_key="text", - order=3, - ), - SimpleField( - name="email", - label="Email", - required=False, - info_type_key="email", - order=4, - ), - SimpleField( - name="gender", - label="Gender (e.g. “male”, “female”)", - required=False, - info_type_key="text", - order=5, - ), - SimpleField( - name="birth_date", - label="Date of birth (a four digit year or a full date)", - required=False, - info_type_key="text", - order=6, - ), - ] - ) - - -class Migration(migrations.Migration): - - dependencies = [("candidates", "0021_simplepopolofield")] - - operations = [migrations.RunPython(create_simple_fields)] diff --git a/ynr/apps/candidates/migrations/0023_create_post_to_elections_m2m_with_extra_fields.py b/ynr/apps/candidates/migrations/0023_create_post_to_elections_m2m_with_extra_fields.py deleted file mode 100644 index 414faaa8e4..0000000000 --- a/ynr/apps/candidates/migrations/0023_create_post_to_elections_m2m_with_extra_fields.py +++ /dev/null @@ -1,48 +0,0 @@ -from django.db import migrations, models - - -class Migration(migrations.Migration): - - dependencies = [ - ("elections", "0012_election_people_elected_per_post"), - ("candidates", "0022_create_standard_simple_fields"), - ] - - operations = [ - migrations.CreateModel( - name="PostExtraElection", - fields=[ - ( - "id", - models.AutoField( - verbose_name="ID", - serialize=False, - auto_created=True, - primary_key=True, - ), - ), - ("winner_count", models.IntegerField(null=True, blank=True)), - ( - "election", - models.ForeignKey( - to="elections.Election", on_delete=models.CASCADE - ), - ), - ( - "postextra", - models.ForeignKey( - to="candidates.PostExtra", on_delete=models.CASCADE - ), - ), - ], - ), - migrations.AddField( - model_name="postextra", - name="new_elections", - field=models.ManyToManyField( - related_name="new_posts", - through="candidates.PostExtraElection", - to="elections.Election", - ), - ), - ] diff --git a/ynr/apps/candidates/migrations/0024_port_existing_post_to_election_m2m_data.py b/ynr/apps/candidates/migrations/0024_port_existing_post_to_election_m2m_data.py deleted file mode 100644 index fafa065fab..0000000000 --- a/ynr/apps/candidates/migrations/0024_port_existing_post_to_election_m2m_data.py +++ /dev/null @@ -1,32 +0,0 @@ -from django.db import migrations - - -def old_post_election_m2m_to_new(apps, schema_editor): - PostExtraElection = apps.get_model("candidates", "PostExtraElection") - PostExtra = apps.get_model("candidates", "PostExtra") - for post in PostExtra.objects.all(): - for election in post.elections.all(): - PostExtraElection.objects.get_or_create( - postextra=post, election=election - ) - - -def new_post_election_m2m_to_old(apps, schema_editor): - PostExtra = apps.get_model("candidates", "PostExtra") - - for post in PostExtra.objects.all(): - for election in post.new_elections.all(): - post.elections.add(election) - - -class Migration(migrations.Migration): - - dependencies = [ - ("candidates", "0023_create_post_to_elections_m2m_with_extra_fields") - ] - - operations = [ - migrations.RunPython( - old_post_election_m2m_to_new, new_post_election_m2m_to_old - ) - ] diff --git a/ynr/apps/candidates/migrations/0025_remove_old_post_to_election_m2m_and_rename_new.py b/ynr/apps/candidates/migrations/0025_remove_old_post_to_election_m2m_and_rename_new.py deleted file mode 100644 index 8713a43281..0000000000 --- a/ynr/apps/candidates/migrations/0025_remove_old_post_to_election_m2m_and_rename_new.py +++ /dev/null @@ -1,22 +0,0 @@ -from django.db import migrations, models - - -class Migration(migrations.Migration): - - dependencies = [ - ("candidates", "0024_port_existing_post_to_election_m2m_data") - ] - - operations = [ - migrations.RemoveField(model_name="postextra", name="elections"), - migrations.RenameField("PostExtra", "new_elections", "elections"), - migrations.AlterField( - model_name="postextra", - name="elections", - field=models.ManyToManyField( - related_name="posts", - through="candidates.PostExtraElection", - to="elections.Election", - ), - ), - ] diff --git a/ynr/apps/candidates/migrations/0026_complexpopolofield.py b/ynr/apps/candidates/migrations/0026_complexpopolofield.py deleted file mode 100644 index ec814d8755..0000000000 --- a/ynr/apps/candidates/migrations/0026_complexpopolofield.py +++ /dev/null @@ -1,80 +0,0 @@ -from django.db import migrations, models - - -class Migration(migrations.Migration): - - dependencies = [ - ("candidates", "0025_remove_old_post_to_election_m2m_and_rename_new") - ] - - operations = [ - migrations.CreateModel( - name="ComplexPopoloField", - fields=[ - ( - "id", - models.AutoField( - verbose_name="ID", - serialize=False, - auto_created=True, - primary_key=True, - ), - ), - ("name", models.CharField(max_length=256)), - ( - "label", - models.CharField( - help_text="User facing description of the information", - max_length=256, - ), - ), - ( - "popolo_array", - models.CharField( - help_text="Name of the Popolo related type", - max_length=256, - choices=[ - ("links", "Links"), - ("contact_details", "Contact Details"), - ("identifier", "Identifier"), - ], - ), - ), - ( - "field_type", - models.CharField( - help_text="Type of HTML field the user will see", - max_length=256, - choices=[ - ("text", "Text Field"), - ("url", "URL Field"), - ("email", "Email Field"), - ], - ), - ), - ( - "info_type_key", - models.CharField( - help_text="Name of the field in the array that stores the type (note for links, contact_type for contacts, scheme for identifiers)", - max_length=100, - ), - ), - ( - "info_type", - models.CharField( - help_text="Value to put in the info_type_key e.g. twitter", - max_length=100, - ), - ), - ("old_info_type", models.CharField(max_length=100, blank=True)), - ( - "info_value_key", - models.CharField( - help_text="Name of the field in the array that stores the value, e.g url for links, value for contact_type, identifier for identifiers", - max_length=100, - ), - ), - ("order", models.IntegerField(blank=True, default=0)), - ], - ) - ] diff --git a/ynr/apps/candidates/migrations/0027_create_standard_complex_fields.py b/ynr/apps/candidates/migrations/0027_create_standard_complex_fields.py deleted file mode 100644 index e247e3e0ed..0000000000 --- a/ynr/apps/candidates/migrations/0027_create_standard_complex_fields.py +++ /dev/null @@ -1,97 +0,0 @@ -from django.db import migrations - - -def remove_standard_fields(apps, schema_editor): - ComplexField = apps.get_model("candidates", "ComplexPopoloField") - db_alias = schema_editor.connection.alias - ComplexField.objects.using(db_alias).all().delete() - - -def create_complex_fields(apps, schema_editor): - ComplexField = apps.get_model("candidates", "ComplexPopoloField") - db_alias = schema_editor.connection.alias - - ComplexField.objects.using(db_alias).bulk_create( - [ - ComplexField( - name="twitter_username", - label="Twitter username (e.g. democlub)", - field_type="text", - popolo_array="contact_details", - info_type_key="contact_type", - info_type="twitter", - info_value_key="value", - order=1, - ), - ComplexField( - name="facebook_personal_url", - label="Facebook profile URL", - field_type="url", - popolo_array="links", - info_type_key="note", - info_type="facebook personal", - info_value_key="url", - order=2, - ), - ComplexField( - name="facebook_page_url", - label="Facebook page (e.g. for their campaign)", - field_type="url", - popolo_array="links", - info_type_key="note", - info_type="facebook page", - info_value_key="url", - order=3, - ), - ComplexField( - name="homepage_url", - label="Homepage URL", - field_type="url", - popolo_array="links", - info_type_key="note", - info_type="homepage", - info_value_key="url", - order=4, - ), - ComplexField( - name="wikipedia_url", - label="Wikipedia URL", - field_type="url", - popolo_array="links", - info_type_key="note", - info_type="wikipedia", - info_value_key="url", - order=5, - ), - ComplexField( - name="linkedin_url", - label="LinkedIn URL", - field_type="url", - popolo_array="links", - info_type_key="note", - info_type="linkedin", - info_value_key="url", - order=6, - ), - ComplexField( - name="party_ppc_page_url", - label="The party's candidate page for this person", - field_type="url", - popolo_array="links", - info_type_key="note", - info_type="party candidate page", - old_info_type="party PPC page", - info_value_key="url", - order=7, - ), - ] - ) - - -class Migration(migrations.Migration): - - dependencies = [("candidates", "0026_complexpopolofield")] - - operations = [ - migrations.RunPython(create_complex_fields, remove_standard_fields) - ] diff --git a/ynr/apps/candidates/migrations/0028_auto_20160411_1055.py b/ynr/apps/candidates/migrations/0028_auto_20160411_1055.py deleted file mode 100644 index c3bf63f9fd..0000000000 --- a/ynr/apps/candidates/migrations/0028_auto_20160411_1055.py +++ /dev/null @@ -1,34 +0,0 @@ -from django.db import migrations, models - - -class Migration(migrations.Migration): - - dependencies = [("candidates", "0027_create_standard_complex_fields")] - - operations = [ - migrations.AlterField( - model_name="complexpopolofield", - name="info_type_key", - field=models.CharField( - help_text="Name of the field in the array that stores the type ('note' for links, 'contact_type' for contacts, 'scheme' for identifiers)", - max_length=100, - ), - ), - migrations.AlterField( - model_name="complexpopolofield", - name="info_value_key", - field=models.CharField( - help_text="Name of the field in the array that stores the value, e.g 'url' for links, 'value' for contact_type, 'identifier' for identifiers", - max_length=100, - ), - ), - migrations.AlterField( - model_name="complexpopolofield", - name="old_info_type", - field=models.CharField( - help_text="Used for supporting info_types that have been renamed. As such it's rarely used.", - max_length=100, - blank=True, - ), - ), - ] diff --git a/ynr/apps/candidates/migrations/0028_create_order_attr_of_extra.py b/ynr/apps/candidates/migrations/0028_create_order_attr_of_extra.py deleted file mode 100644 index 3c1c902df5..0000000000 --- a/ynr/apps/candidates/migrations/0028_create_order_attr_of_extra.py +++ /dev/null @@ -1,14 +0,0 @@ -from django.db import migrations, models - - -class Migration(migrations.Migration): - - dependencies = [("candidates", "0027_create_standard_complex_fields")] - - operations = [ - migrations.AddField( - model_name="extrafield", - name="order", - field=models.IntegerField(default=0, blank=True), - ) - ] diff --git a/ynr/apps/candidates/migrations/0029_add_ordering_to_fields_meta.py b/ynr/apps/candidates/migrations/0029_add_ordering_to_fields_meta.py deleted file mode 100644 index b63fce9e56..0000000000 --- a/ynr/apps/candidates/migrations/0029_add_ordering_to_fields_meta.py +++ /dev/null @@ -1,18 +0,0 @@ -from django.db import migrations - - -class Migration(migrations.Migration): - - dependencies = [("candidates", "0028_create_order_attr_of_extra")] - - operations = [ - migrations.AlterModelOptions( - name="complexpopolofield", options={"ordering": ("order",)} - ), - migrations.AlterModelOptions( - name="extrafield", options={"ordering": ("order",)} - ), - migrations.AlterModelOptions( - name="simplepopolofield", options={"ordering": ("order",)} - ), - ] diff --git a/ynr/apps/candidates/migrations/0030_merge.py b/ynr/apps/candidates/migrations/0030_merge.py deleted file mode 100644 index b2992a6ce1..0000000000 --- a/ynr/apps/candidates/migrations/0030_merge.py +++ /dev/null @@ -1,11 +0,0 @@ -from django.db import migrations - - -class Migration(migrations.Migration): - - dependencies = [ - ("candidates", "0029_add_ordering_to_fields_meta"), - ("candidates", "0028_auto_20160411_1055"), - ] - - operations = [] diff --git a/ynr/apps/candidates/migrations/0031_loggedaction_post.py b/ynr/apps/candidates/migrations/0031_loggedaction_post.py deleted file mode 100644 index 5d3e24928d..0000000000 --- a/ynr/apps/candidates/migrations/0031_loggedaction_post.py +++ /dev/null @@ -1,22 +0,0 @@ -from django.db import migrations, models - - -class Migration(migrations.Migration): - - dependencies = [ - ("popolo", "0002_update_models_from_upstream"), - ("candidates", "0030_merge"), - ] - - operations = [ - migrations.AddField( - model_name="loggedaction", - name="post", - field=models.ForeignKey( - blank=True, - to="popolo.Post", - null=True, - on_delete=models.CASCADE, - ), - ) - ] diff --git a/ynr/apps/candidates/migrations/0032_migrate_org_slugs.py b/ynr/apps/candidates/migrations/0032_migrate_org_slugs.py deleted file mode 100644 index f862177ffc..0000000000 --- a/ynr/apps/candidates/migrations/0032_migrate_org_slugs.py +++ /dev/null @@ -1,62 +0,0 @@ -from django.conf import settings -from django.db import migrations - - -def add_missing_classifications(apps): - Organization = apps.get_model("popolo", "Organization") - - for org in Organization.objects.filter(classification=""): - if org.name.endswith(" Police") or org.name.endswith(" Constabulary"): - org.classification = "police_area" - org.save() - - mapping = { - "London Assembly": "gla", - "Greater London Authority": "gla", - "National Assembly for Wales": "naw", - "Northern Ireland Assembly": "nia", - "Scottish Parliament": "sp", - } - for name, classification in mapping.items(): - Organization.objects.filter(name=name).update( - classification=classification - ) - - for org in Organization.objects.filter(classification=""): - org.classification = "local-authority" - org.save() - - -def add_classification_to_slugs(apps, schema_editor): - if settings.ELECTION_APP != "uk": - return - add_missing_classifications(apps) - OrganizationExtra = apps.get_model("candidates", "OrganizationExtra") - - for ox in OrganizationExtra.objects.exclude(base__classification="Party"): - if not ox.slug.startswith(ox.base.classification): - ox.slug = ":".join([ox.base.classification, ox.slug]) - ox.save() - - -def remove_classification_from_slugs(apps, schema_editor): - if settings.ELECTION_APP != "uk": - return - OrganizationExtra = apps.get_model("candidates", "OrganizationExtra") - - for ox in OrganizationExtra.objects.all(): - if ox.slug.startswith(ox.base.classification) and ":" in ox.slug: - ox.slug = ox.slug.split(":")[1] - if not OrganizationExtra.objects.filter(slug=ox.slug).exists(): - ox.save() - - -class Migration(migrations.Migration): - - dependencies = [("candidates", "0031_loggedaction_post")] - - operations = [ - migrations.RunPython( - add_classification_to_slugs, remove_classification_from_slugs - ) - ] diff --git a/ynr/apps/candidates/migrations/0033_postextraelection_candidates_locked.py b/ynr/apps/candidates/migrations/0033_postextraelection_candidates_locked.py deleted file mode 100644 index 4bf597c8fa..0000000000 --- a/ynr/apps/candidates/migrations/0033_postextraelection_candidates_locked.py +++ /dev/null @@ -1,14 +0,0 @@ -from django.db import migrations, models - - -class Migration(migrations.Migration): - - dependencies = [("candidates", "0032_migrate_org_slugs")] - - operations = [ - migrations.AddField( - model_name="postextraelection", - name="candidates_locked", - field=models.BooleanField(default=False), - ) - ] diff --git a/ynr/apps/candidates/migrations/0034_candidates_locked_data.py b/ynr/apps/candidates/migrations/0034_candidates_locked_data.py deleted file mode 100644 index ee03cc5016..0000000000 --- a/ynr/apps/candidates/migrations/0034_candidates_locked_data.py +++ /dev/null @@ -1,53 +0,0 @@ -import os - -from django.db import migrations - - -def move_candidates_locked_to_postextraelection(apps, schema_editor): - PostExtra = apps.get_model("candidates", "PostExtra") - PostExtraElection = apps.get_model("candidates", "PostExtraElection") - - locks = PostExtra.objects.filter(candidates_locked=True) - for lock in locks: - for election in lock.elections.all(): - new_lock = PostExtraElection.objects.get( - postextra=lock, election=election - ) - new_lock.candidates_locked = True - new_lock.save() - - -def move_candidates_locked_to_postextra(apps, schema_editor): - """ - Because this locks at a post level it means the reverse migration - is potentially lossy. In cases where a post has been in more than one - election and not all of them are locked that data will be lost. - However, it seemed better to be permissive in locking as I think it's - easier to spot "Hey, why can't I edit this" that "Hey, I should not be - able to edit this". Hopefully. Regardless, if you want to do this - you need to set an env variable `ALLOW_LOSSY_REVERSE_MIGRATIONS=1` - """ - if os.environ.get("ALLOW_LOSSY_REVERSE_MIGRATIONS") != "1": - raise Exception( - "Cannot reverse 0034_candidates_locked_data migration as it will \ - lose data. See the migration file for more details." - ) - PostExtraElection = apps.get_model("candidates", "PostExtraElection") - - locks = PostExtraElection.objects.filter(candidates_locked=True) - for lock in locks: - pe = lock.postextra - pe.candidates_locked = True - pe.save() - - -class Migration(migrations.Migration): - - dependencies = [("candidates", "0033_postextraelection_candidates_locked")] - - operations = [ - migrations.RunPython( - move_candidates_locked_to_postextraelection, - move_candidates_locked_to_postextra, - ) - ] diff --git a/ynr/apps/candidates/migrations/0035_remove_postextra_candidates_locked.py b/ynr/apps/candidates/migrations/0035_remove_postextra_candidates_locked.py deleted file mode 100644 index 5dbc142c22..0000000000 --- a/ynr/apps/candidates/migrations/0035_remove_postextra_candidates_locked.py +++ /dev/null @@ -1,10 +0,0 @@ -from django.db import migrations - - -class Migration(migrations.Migration): - - dependencies = [("candidates", "0034_candidates_locked_data")] - - operations = [ - migrations.RemoveField(model_name="postextra", name="candidates_locked") - ] diff --git a/ynr/apps/candidates/migrations/0036_postextra_election_unique_togther.py b/ynr/apps/candidates/migrations/0036_postextra_election_unique_togther.py deleted file mode 100644 index 319bf6edbd..0000000000 --- a/ynr/apps/candidates/migrations/0036_postextra_election_unique_togther.py +++ /dev/null @@ -1,13 +0,0 @@ -from django.db import migrations - - -class Migration(migrations.Migration): - - dependencies = [("candidates", "0035_remove_postextra_candidates_locked")] - - operations = [ - migrations.AlterUniqueTogether( - name="postextraelection", - unique_together={("election", "postextra")}, - ) - ] diff --git a/ynr/apps/candidates/migrations/0037_auto_20170510_2200.py b/ynr/apps/candidates/migrations/0037_auto_20170510_2200.py deleted file mode 100644 index a5958d3ba6..0000000000 --- a/ynr/apps/candidates/migrations/0037_auto_20170510_2200.py +++ /dev/null @@ -1,14 +0,0 @@ -from django.db import migrations, models - - -class Migration(migrations.Migration): - - dependencies = [("candidates", "0036_postextra_election_unique_togther")] - - operations = [ - migrations.AlterField( - model_name="loggedaction", - name="created", - field=models.DateTimeField(auto_now_add=True, db_index=True), - ) - ] diff --git a/ynr/apps/candidates/migrations/0038_postextraelection_ballot_paper_id.py b/ynr/apps/candidates/migrations/0038_postextraelection_ballot_paper_id.py deleted file mode 100644 index bab2ef4656..0000000000 --- a/ynr/apps/candidates/migrations/0038_postextraelection_ballot_paper_id.py +++ /dev/null @@ -1,14 +0,0 @@ -from django.db import migrations, models - - -class Migration(migrations.Migration): - - dependencies = [("candidates", "0037_auto_20170510_2200")] - - operations = [ - migrations.AddField( - model_name="postextraelection", - name="ballot_paper_id", - field=models.CharField(max_length=255, blank=True), - ) - ] diff --git a/ynr/apps/candidates/migrations/0039_create_ballot_paper_ids_and_set_unique.py b/ynr/apps/candidates/migrations/0039_create_ballot_paper_ids_and_set_unique.py deleted file mode 100644 index 17d24dcefb..0000000000 --- a/ynr/apps/candidates/migrations/0039_create_ballot_paper_ids_and_set_unique.py +++ /dev/null @@ -1,28 +0,0 @@ -from django.db import migrations, models - - -def create_tmp_ballot_paper_id_from_pee(apps, schema_editor): - PostExtraElection = apps.get_model("candidates", "PostExtraElection") - for pee in PostExtraElection.objects.all(): - pee.ballot_paper_id = "tmp_{}.{}".format( - pee.election.slug, pee.postextra.slug - ) - pee.save() - - -def do_nothing(apps, schema_editor): - pass - - -class Migration(migrations.Migration): - - dependencies = [("candidates", "0038_postextraelection_ballot_paper_id")] - - operations = [ - migrations.RunPython(create_tmp_ballot_paper_id_from_pee, do_nothing), - migrations.AlterField( - model_name="postextraelection", - name="ballot_paper_id", - field=models.CharField(unique=True, max_length=255, blank=True), - ), - ] diff --git a/ynr/apps/candidates/migrations/0040_membershipextra_post_election.py b/ynr/apps/candidates/migrations/0040_membershipextra_post_election.py deleted file mode 100644 index c5bb6d428a..0000000000 --- a/ynr/apps/candidates/migrations/0040_membershipextra_post_election.py +++ /dev/null @@ -1,46 +0,0 @@ -# Generated by Django 1.9.13 on 2018-03-23 13:49 - - -import django.db.models.deletion -from django.db import migrations, models - - -def populate_post_election_from_membership(apps, schema_editor): - PostExtraElection = apps.get_model("candidates", "PostExtraElection") - MembershipExtra = apps.get_model("candidates", "MembershipExtra") - qs = MembershipExtra.objects.filter(post_election=None).select_related( - "base__post__extra" - ) - for me in qs: - # Get the PostExtraElection - pee = PostExtraElection.objects.get( - postextra=me.base.post.extra, election=me.election - ) - me.post_election = pee - me.save() - - -def do_nothing(apps, schema_editor): - pass - - -class Migration(migrations.Migration): - - dependencies = [ - ("candidates", "0039_create_ballot_paper_ids_and_set_unique") - ] - - operations = [ - migrations.AddField( - model_name="membershipextra", - name="post_election", - field=models.ForeignKey( - null=True, - on_delete=django.db.models.deletion.CASCADE, - to="candidates.PostExtraElection", - ), - ), - migrations.RunPython( - populate_post_election_from_membership, do_nothing - ), - ] diff --git a/ynr/apps/candidates/migrations/0041_auto_20180323_1400.py b/ynr/apps/candidates/migrations/0041_auto_20180323_1400.py deleted file mode 100644 index 0fece14a33..0000000000 --- a/ynr/apps/candidates/migrations/0041_auto_20180323_1400.py +++ /dev/null @@ -1,21 +0,0 @@ -# Generated by Django 1.9.13 on 2018-03-23 14:00 - - -import django.db.models.deletion -from django.db import migrations, models - - -class Migration(migrations.Migration): - - dependencies = [("candidates", "0040_membershipextra_post_election")] - - operations = [ - migrations.AlterField( - model_name="membershipextra", - name="post_election", - field=models.ForeignKey( - on_delete=django.db.models.deletion.CASCADE, - to="candidates.PostExtraElection", - ), - ) - ] diff --git a/ynr/apps/candidates/migrations/0043_remove_simple_popolo_field.py b/ynr/apps/candidates/migrations/0043_remove_simple_popolo_field.py deleted file mode 100644 index be2cc70c30..0000000000 --- a/ynr/apps/candidates/migrations/0043_remove_simple_popolo_field.py +++ /dev/null @@ -1,14 +0,0 @@ -# Generated by Django 1.9.13 on 2018-05-21 14:47 - - -from django.db import migrations - - -class Migration(migrations.Migration): - - dependencies = [ - ("candidates", "0042_loggedaction_post_election"), - ("uk", "0004_add_biography"), - ] - - operations = [migrations.DeleteModel(name="SimplePopoloField")] diff --git a/ynr/apps/candidates/migrations/0044_remove_membership_fk_to_election.py b/ynr/apps/candidates/migrations/0044_remove_membership_fk_to_election.py deleted file mode 100644 index 8bee3869f9..0000000000 --- a/ynr/apps/candidates/migrations/0044_remove_membership_fk_to_election.py +++ /dev/null @@ -1,13 +0,0 @@ -# Generated by Django 1.9.13 on 2018-05-15 15:55 - - -from django.db import migrations - - -class Migration(migrations.Migration): - - dependencies = [("candidates", "0043_remove_simple_popolo_field")] - - operations = [ - migrations.RemoveField(model_name="membershipextra", name="election") - ] diff --git a/ynr/apps/candidates/migrations/0045_delete_membership_extra.py b/ynr/apps/candidates/migrations/0045_delete_membership_extra.py deleted file mode 100644 index 3a50993325..0000000000 --- a/ynr/apps/candidates/migrations/0045_delete_membership_extra.py +++ /dev/null @@ -1,15 +0,0 @@ -# Generated by Django 1.9.13 on 2018-05-21 15:52 - - -from django.db import migrations - - -class Migration(migrations.Migration): - - dependencies = [ - ("candidates", "0044_remove_membership_fk_to_election"), - ("popolo", "0004_move-extra-data-to-base"), - ("candidates", "0040_membershipextra_post_election"), - ] - - operations = [migrations.DeleteModel(name="MembershipExtra")] diff --git a/ynr/apps/candidates/migrations/0046_delete_person_extra.py b/ynr/apps/candidates/migrations/0046_delete_person_extra.py deleted file mode 100644 index dc20968e24..0000000000 --- a/ynr/apps/candidates/migrations/0046_delete_person_extra.py +++ /dev/null @@ -1,15 +0,0 @@ -# -*- coding: utf-8 -*- -# Generated by Django 1.10.8 on 2018-08-14 17:25 -from __future__ import unicode_literals - -from django.db import migrations - - -class Migration(migrations.Migration): - - dependencies = [ - ("popolo", "0009_move_extra_person_data_to_base"), - ("candidates", "0045_delete_membership_extra"), - ] - - operations = [migrations.DeleteModel(name="PersonExtra")] diff --git a/ynr/apps/candidates/migrations/0047_add_post_to_pee.py b/ynr/apps/candidates/migrations/0047_add_post_to_pee.py deleted file mode 100644 index ec3aae875e..0000000000 --- a/ynr/apps/candidates/migrations/0047_add_post_to_pee.py +++ /dev/null @@ -1,29 +0,0 @@ -# -*- coding: utf-8 -*- -# Generated by Django 1.10.8 on 2018-08-21 20:32 -from __future__ import unicode_literals - -import django.db.models.deletion -from django.db import migrations, models - - -class Migration(migrations.Migration): - - dependencies = [ - ("popolo", "0010_rename_not_standing_related_name"), - ("candidates", "0046_delete_person_extra"), - ("moderation_queue", "0022_add_detection_metadata"), - ("official_documents", "0020_add_post_election_values"), - ("uk_results", "0047_auto_20180501_1359"), - ] - - operations = [ - migrations.AddField( - model_name="postextraelection", - name="post", - field=models.ForeignKey( - null=True, - on_delete=django.db.models.deletion.CASCADE, - to="popolo.Post", - ), - ) - ] diff --git a/ynr/apps/candidates/migrations/0048_move_pee_postextra_to_post.py b/ynr/apps/candidates/migrations/0048_move_pee_postextra_to_post.py deleted file mode 100644 index d0908f2362..0000000000 --- a/ynr/apps/candidates/migrations/0048_move_pee_postextra_to_post.py +++ /dev/null @@ -1,26 +0,0 @@ -# -*- coding: utf-8 -*- -# Generated by Django 1.10.8 on 2018-08-21 20:34 -from __future__ import unicode_literals - -from django.db import migrations - - -def add_extra_fields_to_base(apps, schema_editor): - PostExtraElection = apps.get_model("candidates", "PostExtraElection") - - for pee in PostExtraElection.objects.all().select_related( - "postextra__base" - ): - pee.post = pee.postextra.base - pee.save() - - -class Migration(migrations.Migration): - - dependencies = [("candidates", "0047_add_post_to_pee")] - - operations = [ - migrations.RunPython( - add_extra_fields_to_base, migrations.RunPython.noop - ) - ] diff --git a/ynr/apps/candidates/migrations/0049_cleanup_post_extra.py b/ynr/apps/candidates/migrations/0049_cleanup_post_extra.py deleted file mode 100644 index 2834fa53d3..0000000000 --- a/ynr/apps/candidates/migrations/0049_cleanup_post_extra.py +++ /dev/null @@ -1,35 +0,0 @@ -# -*- coding: utf-8 -*- -# Generated by Django 1.10.8 on 2018-08-21 21:14 -from __future__ import unicode_literals - -import django.db.models.deletion -from django.db import migrations, models - - -class Migration(migrations.Migration): - - dependencies = [ - ("popolo", "0012_move_post_extra_data_to_base"), - ("candidates", "0048_move_pee_postextra_to_post"), - ] - - operations = [ - migrations.AlterUniqueTogether( - name="postextraelection", - unique_together=set([("election", "post")]), - ), - migrations.RemoveField(model_name="postextra", name="base"), - migrations.RemoveField(model_name="postextra", name="elections"), - migrations.RemoveField(model_name="postextra", name="party_set"), - migrations.RemoveField( - model_name="postextraelection", name="postextra" - ), - migrations.AlterField( - model_name="postextraelection", - name="post", - field=models.ForeignKey( - on_delete=django.db.models.deletion.CASCADE, to="popolo.Post" - ), - ), - migrations.DeleteModel(name="PostExtra"), - ] diff --git a/ynr/apps/candidates/migrations/0050_delete_imageextra.py b/ynr/apps/candidates/migrations/0050_delete_imageextra.py deleted file mode 100644 index 6175c798e3..0000000000 --- a/ynr/apps/candidates/migrations/0050_delete_imageextra.py +++ /dev/null @@ -1,19 +0,0 @@ -# -*- coding: utf-8 -*- -# Generated by Django 1.10.8 on 2018-09-20 15:41 -from __future__ import unicode_literals - -from django.db import migrations - - -class Migration(migrations.Migration): - - dependencies = [ - ("candidates", "0049_cleanup_post_extra"), - ("popolo", "0022_populate_person_image_from_image"), - ("results", "0023_migrate_winner_party_to_party_model"), - ] - - operations = [ - migrations.RemoveField(model_name="organizationextra", name="base"), - migrations.DeleteModel(name="OrganizationExtra"), - ] diff --git a/ynr/apps/candidates/migrations/0051_remove_areaextra.py b/ynr/apps/candidates/migrations/0051_remove_areaextra.py deleted file mode 100644 index d65acd479b..0000000000 --- a/ynr/apps/candidates/migrations/0051_remove_areaextra.py +++ /dev/null @@ -1,16 +0,0 @@ -# -*- coding: utf-8 -*- -# Generated by Django 1.10.8 on 2018-09-26 14:56 -from __future__ import unicode_literals - -from django.db import migrations - - -class Migration(migrations.Migration): - - dependencies = [("candidates", "0050_delete_imageextra")] - - operations = [ - migrations.RemoveField(model_name="areaextra", name="base"), - migrations.RemoveField(model_name="areaextra", name="type"), - migrations.DeleteModel(name="AreaExtra"), - ] diff --git a/ynr/apps/candidates/migrations/0052_python_3_changes.py b/ynr/apps/candidates/migrations/0052_python_3_changes.py deleted file mode 100644 index b33f50f910..0000000000 --- a/ynr/apps/candidates/migrations/0052_python_3_changes.py +++ /dev/null @@ -1,26 +0,0 @@ -# -*- coding: utf-8 -*- -# Generated by Django 1.10.8 on 2018-10-03 18:31 -from __future__ import unicode_literals - -from django.db import migrations, models - - -class Migration(migrations.Migration): - - dependencies = [("candidates", "0051_remove_areaextra")] - - operations = [ - migrations.AlterField( - model_name="extrafield", - name="type", - field=models.CharField( - choices=[ - ("line", "A single line of text"), - ("longer-text", "One or more paragraphs of text"), - ("url", "A URL"), - ("yesno", "A Yes/No/Don't know dropdown"), - ], - max_length=64, - ), - ) - ] diff --git a/ynr/apps/candidates/migrations/0053_move_person_fk_to_people_app.py b/ynr/apps/candidates/migrations/0053_move_person_fk_to_people_app.py deleted file mode 100644 index 70476a52fa..0000000000 --- a/ynr/apps/candidates/migrations/0053_move_person_fk_to_people_app.py +++ /dev/null @@ -1,36 +0,0 @@ -# -*- coding: utf-8 -*- -# Generated by Django 1.10.8 on 2018-10-24 07:42 -from __future__ import unicode_literals - -import django.db.models.deletion -from django.db import migrations, models - - -class Migration(migrations.Migration): - - dependencies = [ - ("people", "0004_move_person_data"), - ("candidates", "0052_python_3_changes"), - ] - - operations = [ - migrations.AlterField( - model_name="loggedaction", - name="person", - field=models.ForeignKey( - blank=True, - null=True, - on_delete=django.db.models.deletion.CASCADE, - to="people.Person", - ), - ), - migrations.AlterField( - model_name="personextrafieldvalue", - name="person", - field=models.ForeignKey( - on_delete=django.db.models.deletion.CASCADE, - related_name="extra_field_values", - to="people.Person", - ), - ), - ] diff --git a/ynr/apps/candidates/migrations/0054_postextraelection_cancelled.py b/ynr/apps/candidates/migrations/0054_postextraelection_cancelled.py deleted file mode 100644 index 707b3c67c0..0000000000 --- a/ynr/apps/candidates/migrations/0054_postextraelection_cancelled.py +++ /dev/null @@ -1,18 +0,0 @@ -# -*- coding: utf-8 -*- -# Generated by Django 1.10.8 on 2018-10-25 14:07 -from __future__ import unicode_literals - -from django.db import migrations, models - - -class Migration(migrations.Migration): - - dependencies = [("candidates", "0053_move_person_fk_to_people_app")] - - operations = [ - migrations.AddField( - model_name="postextraelection", - name="cancelled", - field=models.BooleanField(default=False), - ) - ] diff --git a/ynr/apps/candidates/migrations/0055_delete_complexpopolofield.py b/ynr/apps/candidates/migrations/0055_delete_complexpopolofield.py deleted file mode 100644 index 30beb62a62..0000000000 --- a/ynr/apps/candidates/migrations/0055_delete_complexpopolofield.py +++ /dev/null @@ -1,15 +0,0 @@ -# -*- coding: utf-8 -*- -# Generated by Django 1.11.16 on 2018-11-14 16:32 -from __future__ import unicode_literals - -from django.db import migrations - - -class Migration(migrations.Migration): - - dependencies = [ - ("candidates", "0054_postextraelection_cancelled"), - ("people", "0009_copy_popolo_fields_to_person_identifiers"), - ] - - operations = [migrations.DeleteModel(name="ComplexPopoloField")] diff --git a/ynr/apps/candidates/migrations/0056_tmp_ids_to_ballot_id.py b/ynr/apps/candidates/migrations/0056_tmp_ids_to_ballot_id.py deleted file mode 100644 index 710e47c1c9..0000000000 --- a/ynr/apps/candidates/migrations/0056_tmp_ids_to_ballot_id.py +++ /dev/null @@ -1,37 +0,0 @@ -# -*- coding: utf-8 -*- -# Generated by Django 1.11.16 on 2019-01-02 14:03 -from __future__ import unicode_literals - -from django.db import migrations - - -def move_tmp_ids_to_actual_ids(apps, schema_editor): - PostExtraElection = apps.get_model("candidates", "PostExtraElection") - - pees_with_tmp_ids = PostExtraElection.objects.filter( - ballot_paper_id__startswith="tmp_" - ) - if not pees_with_tmp_ids.exists(): - # Return quickly if no tmp ids exist, to save iterating over the file - # needlessly - return - - data_file = open( - "ynr/apps/candidates/migrations/0056_tmp_ids_to_ballot_id.csv" - ) - for line in data_file: - tmp_id, new_id = line.split(",") - PostExtraElection.objects.filter(ballot_paper_id=tmp_id).update( - ballot_paper_id=new_id.strip() - ) - - -class Migration(migrations.Migration): - - dependencies = [("candidates", "0055_delete_complexpopolofield")] - - operations = [ - migrations.RunPython( - move_tmp_ids_to_actual_ids, migrations.RunPython.noop - ) - ] diff --git a/ynr/apps/candidates/migrations/0057_remove_extra_field.py b/ynr/apps/candidates/migrations/0057_remove_extra_field.py deleted file mode 100644 index 66a9f65265..0000000000 --- a/ynr/apps/candidates/migrations/0057_remove_extra_field.py +++ /dev/null @@ -1,28 +0,0 @@ -# -*- coding: utf-8 -*- -# Generated by Django 1.11.20 on 2019-04-16 06:43 -from __future__ import unicode_literals - -from django.db import migrations - - -class Migration(migrations.Migration): - - dependencies = [ - ("candidates", "0056_tmp_ids_to_ballot_id"), - ("people", "0014_remove_person_email"), - ("uk", "0005_add_favourite_biscuits"), - ] - - operations = [ - migrations.AlterUniqueTogether( - name="personextrafieldvalue", unique_together=set([]) - ), - migrations.RemoveField( - model_name="personextrafieldvalue", name="field" - ), - migrations.RemoveField( - model_name="personextrafieldvalue", name="person" - ), - migrations.DeleteModel(name="ExtraField"), - migrations.DeleteModel(name="PersonExtraFieldValue"), - ] diff --git a/ynr/apps/candidates/migrations/0058_pee_to_ballot.py b/ynr/apps/candidates/migrations/0058_pee_to_ballot.py deleted file mode 100644 index 2b2c6a402c..0000000000 --- a/ynr/apps/candidates/migrations/0058_pee_to_ballot.py +++ /dev/null @@ -1,17 +0,0 @@ -# -*- coding: utf-8 -*- -# Generated by Django 1.11.20 on 2019-06-27 09:39 -from __future__ import unicode_literals - -from django.db import migrations - - -class Migration(migrations.Migration): - - dependencies = [ - ("candidates", "0057_remove_extra_field"), - ("official_documents", "0024_add_relevant_pages"), - ] - - operations = [ - migrations.RenameModel(old_name="PostExtraElection", new_name="Ballot") - ] diff --git a/ynr/apps/candidates/migrations/0059_rename_logged_action_fk_to_ballot.py b/ynr/apps/candidates/migrations/0059_rename_logged_action_fk_to_ballot.py deleted file mode 100644 index cdeab9fa14..0000000000 --- a/ynr/apps/candidates/migrations/0059_rename_logged_action_fk_to_ballot.py +++ /dev/null @@ -1,18 +0,0 @@ -# -*- coding: utf-8 -*- -# Generated by Django 1.11.20 on 2019-07-16 13:57 -from __future__ import unicode_literals - -from django.db import migrations - - -class Migration(migrations.Migration): - - dependencies = [("candidates", "0058_pee_to_ballot")] - - operations = [ - migrations.RenameField( - model_name="loggedaction", - old_name="post_election", - new_name="ballot", - ) - ] diff --git a/ynr/apps/candidates/migrations/0060_add_flagged_type.py b/ynr/apps/candidates/migrations/0060_add_flagged_type.py deleted file mode 100644 index 5b59181869..0000000000 --- a/ynr/apps/candidates/migrations/0060_add_flagged_type.py +++ /dev/null @@ -1,29 +0,0 @@ -# Generated by Django 2.2.4 on 2019-09-06 14:02 - -from django.db import migrations, models - - -class Migration(migrations.Migration): - - dependencies = [("candidates", "0059_rename_logged_action_fk_to_ballot")] - - operations = [ - migrations.AddField( - model_name="loggedaction", - name="flagged_reason", - field=models.CharField( - blank=True, - help_text="An explaination of the reason for flagging this edit", - max_length=255, - ), - ), - migrations.AddField( - model_name="loggedaction", - name="flagged_type", - field=models.CharField( - blank=True, - help_text="If NOT NULL, a type of flag that marks this edit as needing review by a human", - max_length=100, - ), - ), - ] diff --git a/ynr/apps/candidates/migrations/0061_positive_int_field.py b/ynr/apps/candidates/migrations/0061_positive_int_field.py deleted file mode 100644 index 6424c7cfd9..0000000000 --- a/ynr/apps/candidates/migrations/0061_positive_int_field.py +++ /dev/null @@ -1,16 +0,0 @@ -# Generated by Django 2.2.4 on 2019-10-29 17:04 - -from django.db import migrations, models - - -class Migration(migrations.Migration): - - dependencies = [("candidates", "0060_add_flagged_type")] - - operations = [ - migrations.AlterField( - model_name="ballot", - name="winner_count", - field=models.PositiveSmallIntegerField(blank=True, null=True), - ) - ] diff --git a/ynr/apps/candidates/migrations/0062_loggedaction_edit_type.py b/ynr/apps/candidates/migrations/0062_loggedaction_edit_type.py deleted file mode 100644 index a545d9fed2..0000000000 --- a/ynr/apps/candidates/migrations/0062_loggedaction_edit_type.py +++ /dev/null @@ -1,25 +0,0 @@ -# Generated by Django 2.2.4 on 2019-11-13 22:27 - -import candidates.models.db -from django.db import migrations, models - - -class Migration(migrations.Migration): - - dependencies = [("candidates", "0061_positive_int_field")] - - operations = [ - migrations.AddField( - model_name="loggedaction", - name="edit_type", - field=models.CharField( - choices=[ - ("USER", "User"), - ("BOT", "Bot"), - ("BULK_ADD", "Bulk Add"), - ], - default=candidates.models.db.EditType("User").name, - max_length=20, - ), - ) - ] diff --git a/ynr/apps/candidates/migrations/0063_populate_loggedaction_edit_types.py b/ynr/apps/candidates/migrations/0063_populate_loggedaction_edit_types.py deleted file mode 100644 index 621d3a0018..0000000000 --- a/ynr/apps/candidates/migrations/0063_populate_loggedaction_edit_types.py +++ /dev/null @@ -1,21 +0,0 @@ -# Generated by Django 2.2.4 on 2019-11-13 22:37 - -from django.db import migrations - - -def populate_edit_types(apps, schema_editor): - LoggedAction = apps.get_model("candidates", "LoggedAction") - KNOWN_BOT_USERS = ["CandidateBot", "ResultsBot", "TwitterBot"] - - LoggedAction.objects.filter(user__username__in=KNOWN_BOT_USERS).update( - edit_type="BOT" - ) - - -class Migration(migrations.Migration): - - dependencies = [("candidates", "0062_loggedaction_edit_type")] - - operations = [ - migrations.RunPython(populate_edit_types, migrations.RunPython.noop) - ] diff --git a/ynr/apps/candidates/migrations/0064_loggedaction_approved.py b/ynr/apps/candidates/migrations/0064_loggedaction_approved.py deleted file mode 100644 index 91f177c6c2..0000000000 --- a/ynr/apps/candidates/migrations/0064_loggedaction_approved.py +++ /dev/null @@ -1,17 +0,0 @@ -# Generated by Django 2.2.4 on 2019-11-16 10:59 - -import django.contrib.postgres.fields.jsonb -from django.db import migrations - - -class Migration(migrations.Migration): - - dependencies = [("candidates", "0063_populate_loggedaction_edit_types")] - - operations = [ - migrations.AddField( - model_name="loggedaction", - name="approved", - field=django.contrib.postgres.fields.jsonb.JSONField(null=True), - ) - ] diff --git a/ynr/apps/candidates/migrations/0065_ballot_replaces.py b/ynr/apps/candidates/migrations/0065_ballot_replaces.py deleted file mode 100644 index 53bdb3d4da..0000000000 --- a/ynr/apps/candidates/migrations/0065_ballot_replaces.py +++ /dev/null @@ -1,23 +0,0 @@ -# Generated by Django 2.2.16 on 2021-02-05 14:07 - -from django.db import migrations, models -import django.db.models.deletion - - -class Migration(migrations.Migration): - - dependencies = [("candidates", "0064_loggedaction_approved")] - - operations = [ - migrations.AddField( - model_name="ballot", - name="replaces", - field=models.OneToOneField( - blank=True, - null=True, - on_delete=django.db.models.deletion.DO_NOTHING, - related_name="replaced_by", - to="candidates.Ballot", - ), - ) - ] diff --git a/ynr/apps/candidates/migrations/0066_drop_unique_on_election_post.py b/ynr/apps/candidates/migrations/0066_drop_unique_on_election_post.py deleted file mode 100644 index e786a38f4a..0000000000 --- a/ynr/apps/candidates/migrations/0066_drop_unique_on_election_post.py +++ /dev/null @@ -1,12 +0,0 @@ -# Generated by Django 2.2.16 on 2021-03-18 18:46 - -from django.db import migrations - - -class Migration(migrations.Migration): - - dependencies = [("candidates", "0065_ballot_replaces")] - - operations = [ - migrations.AlterUniqueTogether(name="ballot", unique_together=set()) - ] diff --git a/ynr/apps/candidates/migrations/0067_ballot_tags.py b/ynr/apps/candidates/migrations/0067_ballot_tags.py deleted file mode 100644 index 324e542017..0000000000 --- a/ynr/apps/candidates/migrations/0067_ballot_tags.py +++ /dev/null @@ -1,17 +0,0 @@ -# Generated by Django 2.2.18 on 2021-04-01 14:09 - -import django.contrib.postgres.fields.jsonb -from django.db import migrations - - -class Migration(migrations.Migration): - - dependencies = [("candidates", "0066_drop_unique_on_election_post")] - - operations = [ - migrations.AddField( - model_name="ballot", - name="tags", - field=django.contrib.postgres.fields.jsonb.JSONField(default=dict), - ) - ] diff --git a/ynr/apps/candidates/migrations/0068_add_blank_to_tags.py b/ynr/apps/candidates/migrations/0068_add_blank_to_tags.py deleted file mode 100644 index ea4ba15c01..0000000000 --- a/ynr/apps/candidates/migrations/0068_add_blank_to_tags.py +++ /dev/null @@ -1,19 +0,0 @@ -# Generated by Django 2.2.18 on 2021-04-07 09:01 - -import django.contrib.postgres.fields.jsonb -from django.db import migrations - - -class Migration(migrations.Migration): - - dependencies = [("candidates", "0067_ballot_tags")] - - operations = [ - migrations.AlterField( - model_name="ballot", - name="tags", - field=django.contrib.postgres.fields.jsonb.JSONField( - blank=True, default=dict - ), - ) - ] diff --git a/ynr/apps/candidates/migrations/0069_ballot_voting_system.py b/ynr/apps/candidates/migrations/0069_ballot_voting_system.py deleted file mode 100644 index 35b878d233..0000000000 --- a/ynr/apps/candidates/migrations/0069_ballot_voting_system.py +++ /dev/null @@ -1,16 +0,0 @@ -# Generated by Django 2.2.18 on 2021-05-04 14:15 - -from django.db import migrations, models - - -class Migration(migrations.Migration): - - dependencies = [("candidates", "0068_add_blank_to_tags")] - - operations = [ - migrations.AddField( - model_name="ballot", - name="voting_system", - field=models.CharField(blank=True, max_length=255), - ) - ] diff --git a/ynr/apps/candidates/migrations/0070_auto_20210617_1506.py b/ynr/apps/candidates/migrations/0070_auto_20210617_1506.py deleted file mode 100644 index e8a89a2ea0..0000000000 --- a/ynr/apps/candidates/migrations/0070_auto_20210617_1506.py +++ /dev/null @@ -1,37 +0,0 @@ -# Generated by Django 2.2.20 on 2021-06-17 14:06 - -from django.db import migrations -import django.utils.timezone -import django_extensions.db.fields - - -class Migration(migrations.Migration): - - dependencies = [("candidates", "0069_ballot_voting_system")] - - operations = [ - migrations.AlterModelOptions( - name="ballot", - options={ - "get_latest_by": "modified", - "ordering": ("-modified", "-created"), - }, - ), - migrations.AddField( - model_name="ballot", - name="created", - field=django_extensions.db.fields.CreationDateTimeField( - auto_now_add=True, - default=django.utils.timezone.now, - verbose_name="created", - ), - preserve_default=False, - ), - migrations.AddField( - model_name="ballot", - name="modified", - field=django_extensions.db.fields.ModificationDateTimeField( - auto_now=True, verbose_name="modified" - ), - ), - ] diff --git a/ynr/apps/candidates/migrations/0071_add_created_data.py b/ynr/apps/candidates/migrations/0071_add_created_data.py deleted file mode 100644 index 0ad1548e86..0000000000 --- a/ynr/apps/candidates/migrations/0071_add_created_data.py +++ /dev/null @@ -1,25 +0,0 @@ -# Generated by Django 2.2.20 on 2021-06-17 14:08 - -from django.db import migrations - -from elections.helpers import four_weeks_before_election_date - - -def add_created_date(apps, schema_editor): - Ballot = apps.get_model("candidates", "Ballot") - for ballot in Ballot.objects.select_related("election").iterator(): - ballot.created = four_weeks_before_election_date( - election=ballot.election - ) - ballot.save() - - -class Migration(migrations.Migration): - - dependencies = [("candidates", "0070_auto_20210617_1506")] - - operations = [ - migrations.RunPython( - code=add_created_date, reverse_code=migrations.RunPython.noop - ) - ] diff --git a/ynr/apps/candidates/migrations/0072_alter_ballot_options.py b/ynr/apps/candidates/migrations/0072_alter_ballot_options.py deleted file mode 100644 index c93f568194..0000000000 --- a/ynr/apps/candidates/migrations/0072_alter_ballot_options.py +++ /dev/null @@ -1,14 +0,0 @@ -# Generated by Django 3.2.4 on 2021-09-28 09:07 - -from django.db import migrations - - -class Migration(migrations.Migration): - - dependencies = [("candidates", "0071_add_created_data")] - - operations = [ - migrations.AlterModelOptions( - name="ballot", options={"get_latest_by": "modified"} - ) - ] diff --git a/ynr/apps/candidates/migrations/0073_alter_loggedaction_action_type.py b/ynr/apps/candidates/migrations/0073_alter_loggedaction_action_type.py deleted file mode 100644 index 306f19d293..0000000000 --- a/ynr/apps/candidates/migrations/0073_alter_loggedaction_action_type.py +++ /dev/null @@ -1,49 +0,0 @@ -# Generated by Django 3.2.4 on 2021-09-30 17:52 - -from django.db import migrations, models - - -class Migration(migrations.Migration): - - dependencies = [("candidates", "0072_alter_ballot_options")] - - operations = [ - migrations.AlterField( - model_name="loggedaction", - name="action_type", - field=models.CharField( - choices=[ - ("entered-results-data", "Entered results"), - ("set-candidate-elected", "Set Candidate elected"), - ("set-candidate-not-elected", "Set Candidate not elected"), - ("person-lock", "Person locked"), - ("person-update", "Person updated"), - ("person-create", "Person created"), - ("person-other-name-create", "Person Other name created"), - ("person-other-name-delete", "Person Other name deleted"), - ("person-other-name-update", "Person Other name updated"), - ("person-revert", "Person reverted"), - ("constituency-lock", "Constituency locked"), - ("constituency-unlock", "Constituency unlocked"), - ("candidacy-create", "Candidacy created"), - ("candidacy-delete", "Candidacy deleted"), - ("photo-approve", "Photo approved"), - ("photo-upload", "Photo uploaded"), - ("photo-reject", "Photo rejected"), - ("photo-ignore", "Photo ignored"), - ("suggest-ballot-lock", "Suggested ballot lock"), - ("person-merge", "Person merged"), - ("record-council-result", "Recorded council result"), - ("confirm-council-result", "Confirmed council result "), - ("sopn-upload", "SOPN uploaded"), - ("record-council-control", "Recorded council control"), - ("confirm-council-control", "Confirmed council control"), - ("retract-winner", "Retracted winner"), - ("duplicate-suggest", "Duplicate suggested"), - ("change-edit-limitations", "Changed edit limitations"), - ("suspended-twitter-account", "Suspended Twitter account"), - ], - max_length=64, - ), - ) - ] diff --git a/ynr/apps/candidates/migrations/0074_auto_20211006_1027.py b/ynr/apps/candidates/migrations/0074_auto_20211006_1027.py deleted file mode 100644 index 8510b13d6b..0000000000 --- a/ynr/apps/candidates/migrations/0074_auto_20211006_1027.py +++ /dev/null @@ -1,20 +0,0 @@ -# Generated by Django 3.2.4 on 2021-10-06 09:27 - -from django.db import migrations - - -def clean_up_action_types(apps, schema_editor): - LoggedAction = apps.get_model("candidates", "LoggedAction") - action_types = LoggedAction.objects.filter( - action_type=["constituency--lock"] - ) - action_types.update(action_type="constituency-lock") - - -class Migration(migrations.Migration): - - dependencies = [("candidates", "0073_alter_loggedaction_action_type")] - - operations = [ - migrations.RunPython(clean_up_action_types, migrations.RunPython.noop) - ] diff --git a/ynr/apps/candidates/migrations/0075_use_jsonfield_from_django.py b/ynr/apps/candidates/migrations/0075_use_jsonfield_from_django.py deleted file mode 100644 index d0c1fac532..0000000000 --- a/ynr/apps/candidates/migrations/0075_use_jsonfield_from_django.py +++ /dev/null @@ -1,21 +0,0 @@ -# Generated by Django 3.2.4 on 2021-09-29 16:30 - -from django.db import migrations, models - - -class Migration(migrations.Migration): - - dependencies = [("candidates", "0074_auto_20211006_1027")] - - operations = [ - migrations.AlterField( - model_name="ballot", - name="tags", - field=models.JSONField(blank=True, default=dict), - ), - migrations.AlterField( - model_name="loggedaction", - name="approved", - field=models.JSONField(null=True), - ), - ] diff --git a/ynr/apps/candidates/migrations/0076_ballot_ee_modified.py b/ynr/apps/candidates/migrations/0076_ballot_ee_modified.py deleted file mode 100644 index ce2b5a06a4..0000000000 --- a/ynr/apps/candidates/migrations/0076_ballot_ee_modified.py +++ /dev/null @@ -1,28 +0,0 @@ -# Generated by Django 3.2.4 on 2021-09-29 16:10 - -from django.db import migrations, models -import django_extensions.db.fields - - -class Migration(migrations.Migration): - - dependencies = [("candidates", "0075_use_jsonfield_from_django")] - - operations = [ - migrations.AddField( - model_name="ballot", - name="ee_modified", - field=models.DateTimeField( - blank=True, - help_text="Stores the modified timestamp from EE", - null=True, - ), - ), - migrations.AlterField( - model_name="ballot", - name="modified", - field=django_extensions.db.fields.ModificationDateTimeField( - auto_now=True, db_index=True, verbose_name="modified" - ), - ), - ] diff --git a/ynr/apps/candidates/migrations/0077_loggedaction_person_pk.py b/ynr/apps/candidates/migrations/0077_loggedaction_person_pk.py deleted file mode 100644 index dd75f532f5..0000000000 --- a/ynr/apps/candidates/migrations/0077_loggedaction_person_pk.py +++ /dev/null @@ -1,20 +0,0 @@ -# Generated by Django 3.2.4 on 2021-10-25 16:57 - -from django.db import migrations, models - - -class Migration(migrations.Migration): - - dependencies = [("candidates", "0076_ballot_ee_modified")] - - operations = [ - migrations.AddField( - model_name="loggedaction", - name="person_pk", - field=models.PositiveIntegerField( - blank=True, - help_text="This is stored to help us identify the related person an action was for after the Person has been deleted", - null=True, - ), - ) - ] diff --git a/ynr/apps/candidates/migrations/0078_populate_person_pk_on_loggedaction.py b/ynr/apps/candidates/migrations/0078_populate_person_pk_on_loggedaction.py deleted file mode 100644 index dd4a9c2685..0000000000 --- a/ynr/apps/candidates/migrations/0078_populate_person_pk_on_loggedaction.py +++ /dev/null @@ -1,22 +0,0 @@ -# Generated by Django 3.2.4 on 2021-10-25 16:58 - -from django.db import migrations -from django.db.models import F - - -def forwards(apps, schema_editor): - LoggedAction = apps.get_model("candidates", "LoggedAction") - LoggedAction.objects.filter(person__isnull=False).update( - person_pk=F("person__pk") - ) - - -class Migration(migrations.Migration): - - dependencies = [("candidates", "0077_loggedaction_person_pk")] - - operations = [ - migrations.RunPython( - code=forwards, reverse_code=migrations.RunPython.noop - ) - ] diff --git a/ynr/apps/candidates/migrations/0079_change_logged_action_person_on_delete.py b/ynr/apps/candidates/migrations/0079_change_logged_action_person_on_delete.py deleted file mode 100644 index c4160b43ba..0000000000 --- a/ynr/apps/candidates/migrations/0079_change_logged_action_person_on_delete.py +++ /dev/null @@ -1,25 +0,0 @@ -# Generated by Django 3.2.4 on 2021-10-25 17:15 - -from django.db import migrations, models -import django.db.models.deletion - - -class Migration(migrations.Migration): - - dependencies = [ - ("people", "0033_auto_20210928_1007"), - ("candidates", "0078_populate_person_pk_on_loggedaction"), - ] - - operations = [ - migrations.AlterField( - model_name="loggedaction", - name="person", - field=models.ForeignKey( - blank=True, - null=True, - on_delete=django.db.models.deletion.SET_NULL, - to="people.person", - ), - ) - ] diff --git a/ynr/apps/candidates/migrations/0080_add_person_delete_action_type.py b/ynr/apps/candidates/migrations/0080_add_person_delete_action_type.py deleted file mode 100644 index 313c16ae90..0000000000 --- a/ynr/apps/candidates/migrations/0080_add_person_delete_action_type.py +++ /dev/null @@ -1,52 +0,0 @@ -# Generated by Django 3.2.4 on 2021-10-29 09:31 - -from django.db import migrations, models - - -class Migration(migrations.Migration): - - dependencies = [ - ("candidates", "0079_change_logged_action_person_on_delete") - ] - - operations = [ - migrations.AlterField( - model_name="loggedaction", - name="action_type", - field=models.CharField( - choices=[ - ("entered-results-data", "Entered results"), - ("set-candidate-elected", "Set Candidate elected"), - ("set-candidate-not-elected", "Set Candidate not elected"), - ("person-lock", "Person locked"), - ("person-update", "Person updated"), - ("person-create", "Person created"), - ("person-delete", "Person deleted"), - ("person-other-name-create", "Person Other name created"), - ("person-other-name-delete", "Person Other name deleted"), - ("person-other-name-update", "Person Other name updated"), - ("person-revert", "Person reverted"), - ("constituency-lock", "Constituency locked"), - ("constituency-unlock", "Constituency unlocked"), - ("candidacy-create", "Candidacy created"), - ("candidacy-delete", "Candidacy deleted"), - ("photo-approve", "Photo approved"), - ("photo-upload", "Photo uploaded"), - ("photo-reject", "Photo rejected"), - ("photo-ignore", "Photo ignored"), - ("suggest-ballot-lock", "Suggested ballot lock"), - ("person-merge", "Person merged"), - ("record-council-result", "Recorded council result"), - ("confirm-council-result", "Confirmed council result "), - ("sopn-upload", "SOPN uploaded"), - ("record-council-control", "Recorded council control"), - ("confirm-council-control", "Confirmed council control"), - ("retract-winner", "Retracted winner"), - ("duplicate-suggest", "Duplicate suggested"), - ("change-edit-limitations", "Changed edit limitations"), - ("suspended-twitter-account", "Suspended Twitter account"), - ], - max_length=64, - ), - ) - ] diff --git a/ynr/apps/duplicates/migrations/0001_initial.py b/ynr/apps/duplicates/migrations/0001_initial.py new file mode 100644 index 0000000000..80aed7bad8 --- /dev/null +++ b/ynr/apps/duplicates/migrations/0001_initial.py @@ -0,0 +1,70 @@ +# Generated by Django 3.2.10 on 2021-12-14 17:21 + +from django.db import migrations, models +import django.utils.timezone +import django_extensions.db.fields +import model_utils.fields + + +class Migration(migrations.Migration): + + initial = True + + dependencies = [] + + operations = [ + migrations.CreateModel( + name="DuplicateSuggestion", + fields=[ + ( + "id", + models.AutoField( + auto_created=True, + primary_key=True, + serialize=False, + verbose_name="ID", + ), + ), + ( + "created", + django_extensions.db.fields.CreationDateTimeField( + auto_now_add=True, verbose_name="created" + ), + ), + ( + "modified", + django_extensions.db.fields.ModificationDateTimeField( + auto_now=True, verbose_name="modified" + ), + ), + ( + "status", + model_utils.fields.StatusField( + choices=[ + ("suggested", "Suggested"), + ("not_duplicate", "Not duplicate"), + ], + default="suggested", + max_length=100, + no_check_for_status=True, + verbose_name="status", + ), + ), + ( + "status_changed", + model_utils.fields.MonitorField( + default=django.utils.timezone.now, + monitor="status", + verbose_name="status changed", + ), + ), + ( + "rejection_reasoning", + models.TextField( + blank=True, + help_text="Reason for rejecting duplicate suggestion", + ), + ), + ], + ) + ] diff --git a/ynr/apps/duplicates/migrations/0001_initial_squashed_0003_auto_20180322_1445.py b/ynr/apps/duplicates/migrations/0001_initial_squashed_0003_auto_20180322_1445.py deleted file mode 100644 index 5e5103c425..0000000000 --- a/ynr/apps/duplicates/migrations/0001_initial_squashed_0003_auto_20180322_1445.py +++ /dev/null @@ -1,100 +0,0 @@ -# -*- coding: utf-8 -*- -# Generated by Django 1.9.13 on 2018-03-22 15:08 -from __future__ import unicode_literals - -from django.conf import settings -from django.db import migrations, models -import django.db.models.deletion -import django.utils.timezone -import django_extensions.db.fields -import model_utils.fields - - -class Migration(migrations.Migration): - - dependencies = [ - ("popolo", "0002_update_models_from_upstream"), - ("people", "0003_add_person_model"), - migrations.swappable_dependency(settings.AUTH_USER_MODEL), - ] - - operations = [ - migrations.CreateModel( - name="DuplicateSuggestion", - fields=[ - ( - "id", - models.AutoField( - auto_created=True, - primary_key=True, - serialize=False, - verbose_name="ID", - ), - ), - ( - "created", - django_extensions.db.fields.CreationDateTimeField( - auto_now_add=True, verbose_name="created" - ), - ), - ( - "modified", - django_extensions.db.fields.ModificationDateTimeField( - auto_now=True, verbose_name="modified" - ), - ), - ( - "other_person", - models.ForeignKey( - on_delete=django.db.models.deletion.CASCADE, - related_name="duplicate_suggestion_other_person", - to="people.Person", - ), - ), - ( - "person", - models.ForeignKey( - on_delete=django.db.models.deletion.CASCADE, - related_name="duplicate_suggestion", - to="people.Person", - ), - ), - ( - "user", - models.ForeignKey( - on_delete=django.db.models.deletion.CASCADE, - to=settings.AUTH_USER_MODEL, - ), - ), - ], - options={ - "ordering": ("-modified", "-created"), - "abstract": False, - "get_latest_by": "modified", - }, - ), - migrations.AlterModelOptions(name="duplicatesuggestion", options={}), - migrations.AddField( - model_name="duplicatesuggestion", - name="status", - field=model_utils.fields.StatusField( - default="suggested", - max_length=100, - no_check_for_status=True, - verbose_name="status", - ), - ), - migrations.AddField( - model_name="duplicatesuggestion", - name="status_changed", - field=model_utils.fields.MonitorField( - default=django.utils.timezone.now, - monitor="status", - verbose_name="status changed", - ), - ), - migrations.AlterUniqueTogether( - name="duplicatesuggestion", - unique_together=set([("person", "other_person")]), - ), - ] diff --git a/ynr/apps/duplicates/migrations/0002_add_reasoning_field.py b/ynr/apps/duplicates/migrations/0002_add_reasoning_field.py deleted file mode 100644 index 0c719186a9..0000000000 --- a/ynr/apps/duplicates/migrations/0002_add_reasoning_field.py +++ /dev/null @@ -1,22 +0,0 @@ -# Generated by Django 2.2.18 on 2021-04-23 11:02 - -from django.db import migrations, models - - -class Migration(migrations.Migration): - - dependencies = [ - ("duplicates", "0001_initial_squashed_0003_auto_20180322_1445") - ] - - operations = [ - migrations.AddField( - model_name="duplicatesuggestion", - name="rejection_reasoning", - field=models.CharField( - blank=True, - help_text="Reason for rejecting duplicate suggestion", - max_length=255, - ), - ) - ] diff --git a/ynr/apps/duplicates/migrations/0002_initial.py b/ynr/apps/duplicates/migrations/0002_initial.py new file mode 100644 index 0000000000..ba6edcc57e --- /dev/null +++ b/ynr/apps/duplicates/migrations/0002_initial.py @@ -0,0 +1,49 @@ +# Generated by Django 3.2.10 on 2021-12-14 17:21 + +from django.conf import settings +from django.db import migrations, models +import django.db.models.deletion + + +class Migration(migrations.Migration): + + initial = True + + dependencies = [ + ("people", "0001_initial"), + migrations.swappable_dependency(settings.AUTH_USER_MODEL), + ("duplicates", "0001_initial"), + ] + + operations = [ + migrations.AddField( + model_name="duplicatesuggestion", + name="other_person", + field=models.ForeignKey( + on_delete=django.db.models.deletion.CASCADE, + related_name="duplicate_suggestion_other_person", + to="people.person", + ), + ), + migrations.AddField( + model_name="duplicatesuggestion", + name="person", + field=models.ForeignKey( + on_delete=django.db.models.deletion.CASCADE, + related_name="duplicate_suggestion", + to="people.person", + ), + ), + migrations.AddField( + model_name="duplicatesuggestion", + name="user", + field=models.ForeignKey( + on_delete=django.db.models.deletion.CASCADE, + to=settings.AUTH_USER_MODEL, + ), + ), + migrations.AlterUniqueTogether( + name="duplicatesuggestion", + unique_together={("person", "other_person")}, + ), + ] diff --git a/ynr/apps/duplicates/migrations/0003_reasoning_as_textfield.py b/ynr/apps/duplicates/migrations/0003_reasoning_as_textfield.py deleted file mode 100644 index 762d9fa06b..0000000000 --- a/ynr/apps/duplicates/migrations/0003_reasoning_as_textfield.py +++ /dev/null @@ -1,19 +0,0 @@ -# Generated by Django 2.2.18 on 2021-04-26 10:36 - -from django.db import migrations, models - - -class Migration(migrations.Migration): - - dependencies = [("duplicates", "0002_add_reasoning_field")] - - operations = [ - migrations.AlterField( - model_name="duplicatesuggestion", - name="rejection_reasoning", - field=models.TextField( - blank=True, - help_text="Reason for rejecting duplicate suggestion", - ), - ) - ] diff --git a/ynr/apps/elections/migrations/0001_initial.py b/ynr/apps/elections/migrations/0001_initial.py index 544a3b6c33..0a34d3bc04 100644 --- a/ynr/apps/elections/migrations/0001_initial.py +++ b/ynr/apps/elections/migrations/0001_initial.py @@ -1,80 +1,86 @@ +# Generated by Django 3.2.10 on 2021-12-14 17:21 + from django.db import migrations, models +import django_extensions.db.fields class Migration(migrations.Migration): + initial = True + dependencies = [] operations = [ migrations.CreateModel( - name="AreaType", + name="Election", fields=[ ( "id", models.AutoField( - verbose_name="ID", - serialize=False, auto_created=True, primary_key=True, + serialize=False, + verbose_name="ID", ), ), - ("name", models.CharField(max_length=128)), ( - "source", - models.CharField( - help_text=b"e.g MapIt", max_length=128, blank=True + "created", + django_extensions.db.fields.CreationDateTimeField( + auto_now_add=True, verbose_name="created" ), ), - ], - ), - migrations.CreateModel( - name="Election", - fields=[ ( - "id", - models.AutoField( - verbose_name="ID", - serialize=False, - auto_created=True, - primary_key=True, + "modified", + django_extensions.db.fields.ModificationDateTimeField( + auto_now=True, db_index=True, verbose_name="modified" ), ), - ("slug", models.CharField(max_length=128)), + ( + "ee_modified", + models.DateTimeField( + blank=True, + help_text="Stores the modified timestamp from EE", + null=True, + ), + ), + ("slug", models.CharField(max_length=128, unique=True)), ("for_post_role", models.CharField(max_length=128)), ( "winner_membership_role", - models.CharField(max_length=128, blank=True), + models.CharField(blank=True, max_length=128, null=True), ), ("candidate_membership_role", models.CharField(max_length=128)), - ("election_date", models.DateField()), - ("candidacy_start_date", models.DateField()), + ("election_date", models.DateField(db_index=True)), ("name", models.CharField(max_length=128)), ("current", models.BooleanField()), ( "use_for_candidate_suggestions", models.BooleanField(default=False), ), - ("party_membership_start_date", models.DateField()), - ("party_membership_end_date", models.DateField()), - ( - "area_generation", - models.CharField(max_length=128, blank=True), - ), - ("organization_id", models.CharField(max_length=128)), + ("party_lists_in_use", models.BooleanField(default=False)), ( - "organization_name", - models.CharField(max_length=128, blank=True), + "people_elected_per_post", + models.PositiveSmallIntegerField( + default=1, + help_text="The number of people who are elected per post in this election. 0 means a variable number of winners", + ), ), - ("post_id_format", models.CharField(max_length=128)), - ("description", models.CharField(max_length=500, blank=True)), - ("area_types", models.ManyToManyField(to="elections.AreaType")), - ("party_lists_in_use", models.BooleanField(default=False)), ( "default_party_list_members_to_show", - models.IntegerField(default=0), + models.PositiveSmallIntegerField(default=0), ), ("show_official_documents", models.BooleanField(default=False)), - ("ocd_division", models.CharField(max_length=250, blank=True)), + ("ocd_division", models.CharField(blank=True, max_length=250)), + ("description", models.CharField(blank=True, max_length=500)), + ( + "modgov_url", + models.URLField( + blank=True, + help_text="Used to store a possible ModGov url that can be used to scrape information for this election", + null=True, + ), + ), ], - ), + options={"get_latest_by": "modified", "abstract": False}, + ) ] diff --git a/ynr/apps/elections/migrations/0002_auto_20151012_1731.py b/ynr/apps/elections/migrations/0002_auto_20151012_1731.py deleted file mode 100644 index 2428a876ef..0000000000 --- a/ynr/apps/elections/migrations/0002_auto_20151012_1731.py +++ /dev/null @@ -1,318 +0,0 @@ -from datetime import date - -from django.conf import settings -from django.db import migrations - - -def load_election_data(apps, schema_editor): - Election = apps.get_model("elections", "Election") - AreaType = apps.get_model("elections", "AreaType") - db_alias = schema_editor.connection.alias - if settings.ELECTION_APP == "uk_general_election_2015": - area, created = AreaType.objects.using(db_alias).get_or_create( - name="WMC" - ) - - Election.objects.using(db_alias).bulk_create( - [ - Election( - candidate_membership_role="Candidate", - use_for_candidate_suggestions=False, - name="2015 General Election", - election_date=date(2015, 5, 7), - organization_name="House of Commons", - area_generation="22", - winner_membership_role="", - current=True, - party_membership_end_date=date(9999, 12, 31), - post_id_format="{area_id}", - candidacy_start_date=date(2010, 5, 7), - party_membership_start_date=date(2010, 5, 7), - organization_id="commons", - slug="2015", - for_post_role="Member of Parliament", - description="2015 General Election", - show_official_documents=True, - ), - Election( - candidate_membership_role="Candidate", - use_for_candidate_suggestions=True, - name="2010 General Election", - election_date=date(2010, 5, 6), - organization_name="House of Commons", - area_generation="22", - winner_membership_role="", - for_post_role="Member of Parliament", - current=False, - party_membership_end_date=date(2010, 5, 6), - post_id_format="{area_id}", - candidacy_start_date=date(2005, 5, 6), - party_membership_start_date=date(2005, 5, 6), - organization_id="commons", - slug="2010", - description="2010 General Election", - show_official_documents=True, - ), - ] - ) - for election in Election.objects.using(db_alias).all(): - election.area_types.add(area) - - elif settings.ELECTION_APP == "ar_elections_2015": - prv, created = AreaType.objects.using(db_alias).get_or_create( - name="PRV" - ) - nat, created = AreaType.objects.using(db_alias).get_or_create( - name="NAT" - ) - - Election.objects.using(db_alias).bulk_create( - [ - Election( - slug="diputados-argentina-paso-2015", - for_post_role="Diputado Nacional", - candidate_membership_role="Primary Candidate", - winner_membership_role="Candidate", - election_date=date(2015, 8, 9), - candidacy_start_date=date(2015, 6, 22), - name="Diputados Nacionales PASO 2015", - current=True, - use_for_candidate_suggestions=False, - party_membership_start_date=date(2015, 6, 22), - party_membership_end_date=date(9999, 12, 31), - area_generation="1", - organization_id="hcdn", - organization_name="Cámara de Diputados", - post_id_format="dip-{area_id}", - ), - Election( - slug="gobernadores-argentina-paso-2015", - for_post_role="Gobernador", - candidate_membership_role="Primary Candidate", - winner_membership_role="Candidate", - election_date=date(2015, 8, 9), - candidacy_start_date=date(2015, 6, 22), - name="Gobernador PASO 2015", - current=True, - party_membership_start_date=date(2015, 6, 22), - party_membership_end_date=date(9999, 12, 31), - area_generation="1", - organization_id="gobernador", - organization_name="Gobernador", - post_id_format="gob-{area_id}", - ), - Election( - slug="senadores-argentina-paso-2015", - for_post_role="Senador Nacional", - candidate_membership_role="Primary Candidate", - winner_membership_role="Candidate", - election_date=date(2015, 8, 9), - candidacy_start_date=date(2015, 6, 22), - name="Senadores Nacionales PASO 2015", - current=True, - party_membership_start_date=date(2015, 6, 22), - party_membership_end_date=date(9999, 12, 31), - area_generation="1", - organization_id="hcsn", - organization_name="Senado de la Nación", - post_id_format="sen-{area_id}", - ), - Election( - slug="presidentes-argentina-paso-2015", - for_post_role="Presidente", - candidate_membership_role="Primary Candidate", - winner_membership_role="Candidate", - election_date=date(2015, 8, 9), - candidacy_start_date=date(2015, 6, 22), - organization_id="pen", - organization_name="Presidencia de la Nación Argentina", - name="Presidentes PASO 2015", - current=True, - party_membership_start_date=date(2015, 6, 22), - party_membership_end_date=date(9999, 12, 31), - area_generation="1", - post_id_format="presidente", - ), - Election( - slug="parlamentarios-mercosur-regional-paso-2015", - for_post_role="Parlamentario Mercosur", - candidate_membership_role="Primary Candidate", - winner_membership_role="Candidate", - election_date=date(2015, 8, 9), - candidacy_start_date=date(2015, 6, 22), - name="Parlamentario Mercosur PASO 2015", - current=True, - party_membership_start_date=date(2015, 6, 22), - party_membership_end_date=date(9999, 12, 31), - area_generation=1, - organization_id="parlmercosur", - organization_name="Parlamento del Mercosur", - post_id_format="pmer-{area_id}", - party_lists_in_use=True, - default_party_list_members_to_show=3, - ), - Election( - slug="parlamentarios-mercosur-unico-paso-2015", - for_post_role="Parlamentario Mercosur", - candidate_membership_role="Primary Candidate", - winner_membership_role="Candidate", - election_date=date(2015, 8, 9), - candidacy_start_date=date(2015, 6, 22), - name="Parlamentario Mercosur PASO 2015", - current=True, - party_membership_start_date=date(2015, 6, 22), - party_membership_end_date=date(9999, 12, 31), - area_generation=1, - organization_id="parlmercosur", - organization_name="Parlamento del Mercosur", - post_id_format="pmeu", - party_lists_in_use=True, - default_party_list_members_to_show=3, - ), - ] - ) - - for election in Election.objects.using(db_alias).all(): - if ( - election.slug == "presidentes-argentina-paso-2015" - or election.slug == "parlamentarios-mercosur-unico-paso-2015" - ): - election.area_types.add(nat) - else: - election.area_types.add(prv) - - elif settings.ELECTION_APP == "bf_elections_2015": - national, created = AreaType.objects.using(db_alias).get_or_create( - name="NATIONAL" - ) - province, created = AreaType.objects.using(db_alias).get_or_create( - name="PROVINCE" - ) - - Election.objects.using(db_alias).bulk_create( - [ - Election( - slug="pres-2015", - current=True, - for_post_role="Président du Faso", - candidate_membership_role="Candidat", - election_date=date(2015, 10, 11), - candidacy_start_date=date(2010, 11, 22), - organization_id="presidence", - organization_name="Présidence", - party_membership_start_date=date(2010, 11, 22), - party_membership_end_date=date(9999, 12, 31), - party_lists_in_use=False, - name="Elections Présidentielles de 2015", - area_generation=2, - post_id_format="president", - show_official_documents=False, - ), - Election( - slug="nat-2015", - current=True, - for_post_role="Député National", - candidate_membership_role="Candidat", - election_date=date(2015, 10, 11), - candidacy_start_date=date(2012, 12, 3), - organization_id="assemblee-nationale", - organization_name="Assemblée nationale", - party_membership_start_date=date(2012, 12, 3), - party_membership_end_date=date(9999, 12, 31), - party_lists_in_use=True, - default_party_list_members_to_show=2, - name="Elections Législative de 2015", - area_generation=2, - post_id_format="nat-{area_id}", - show_official_documents=False, - ), - Election( - slug="prv-2015", - current=True, - for_post_role="Député Provincial", - candidate_membership_role="Candidat", - election_date=date(2015, 10, 11), - candidacy_start_date=date(2012, 12, 3), - organization_id="assemblee-nationale", - organization_name="Assemblée nationale", - party_membership_start_date=date(2012, 12, 3), - party_membership_end_date=date(9999, 12, 31), - party_lists_in_use=True, - default_party_list_members_to_show=2, - name="Elections Législative de 2015", - area_generation=2, - post_id_format="prv-{area_id}", - show_official_documents=False, - ), - ] - ) - - for election in Election.objects.using(db_alias).all(): - if election.slug == "prv-2015": - election.area_types.add(province) - else: - election.area_types.add(national) - - elif settings.ELECTION_APP == "st_paul_municipal_2015": - muni, created = AreaType.objects.using(db_alias).get_or_create( - name="MUNI" - ) - ward, created = AreaType.objects.using(db_alias).get_or_create( - name="WARD" - ) - - Election.objects.using(db_alias).bulk_create( - [ - Election( - slug="council-member-2015", - for_post_role="Council Member", - candidate_membership_role="Candidate", - winner_membership_role="Candidate", - election_date=date(2015, 11, 3), - candidacy_start_date=date(2015, 6, 22), - name="City Council Election", - current=True, - use_for_candidate_suggestions=False, - party_membership_start_date=date(2015, 6, 22), - party_membership_end_date=date(9999, 12, 31), - party_lists_in_use=False, - organization_id="saint-paul-city-council", - organization_name="Saint Paul City Council", - post_id_format="ocd-division,country:us,state:mn,place:st_paul,ward:{area_id}", - ocd_division="ocd-division/country:us/state:mn/place:st_paul/ward", - area_generation=1, - ), - Election( - slug="school-board-2015", - for_post_role="School Board Member", - candidate_membership_role="Candidate", - winner_membership_role="Candidate", - election_date=date(2015, 11, 3), - candidacy_start_date=date(2015, 6, 22), - name="School Board Election", - current=True, - use_for_candidate_suggestions=False, - party_membership_start_date=date(2015, 6, 22), - party_membership_end_date=date(9999, 12, 31), - party_lists_in_use=False, - area_generation=1, - organization_id="saint-paul-school-board", - organization_name="Saint Paul School Board", - post_id_format="ocd-division,country:us,state:mn,place:st_paul", - ocd_division="ocd-division/country:us/state:mn/place:st_paul", - ), - ] - ) - - for election in Election.objects.using(db_alias).all(): - if election.slug == "council-member-2015": - election.area_types.add(ward) - else: - election.area_types.add(muni) - - -class Migration(migrations.Migration): - - dependencies = [("elections", "0001_initial")] - - operations = [migrations.RunPython(load_election_data)] diff --git a/ynr/apps/candidates/migrations/0042_loggedaction_post_election.py b/ynr/apps/elections/migrations/0002_election_organization.py similarity index 53% rename from ynr/apps/candidates/migrations/0042_loggedaction_post_election.py rename to ynr/apps/elections/migrations/0002_election_organization.py index 7495f17cf4..eb5573c0ef 100644 --- a/ynr/apps/candidates/migrations/0042_loggedaction_post_election.py +++ b/ynr/apps/elections/migrations/0002_election_organization.py @@ -1,22 +1,24 @@ -# Generated by Django 1.9.13 on 2018-05-01 16:37 +# Generated by Django 3.2.10 on 2021-12-14 17:21 - -import django.db.models.deletion from django.db import migrations, models +import django.db.models.deletion class Migration(migrations.Migration): - dependencies = [("candidates", "0041_auto_20180323_1400")] + initial = True + + dependencies = [("popolo", "0001_initial"), ("elections", "0001_initial")] operations = [ migrations.AddField( - model_name="loggedaction", - name="post_election", + model_name="election", + name="organization", field=models.ForeignKey( + blank=True, null=True, on_delete=django.db.models.deletion.CASCADE, - to="candidates.PostExtraElection", + to="popolo.organization", ), ) ] diff --git a/ynr/apps/elections/migrations/0003_allow_null_winner_membership_role.py b/ynr/apps/elections/migrations/0003_allow_null_winner_membership_role.py deleted file mode 100644 index e9278aad21..0000000000 --- a/ynr/apps/elections/migrations/0003_allow_null_winner_membership_role.py +++ /dev/null @@ -1,14 +0,0 @@ -from django.db import migrations, models - - -class Migration(migrations.Migration): - - dependencies = [("elections", "0002_auto_20151012_1731")] - - operations = [ - migrations.AlterField( - model_name="election", - name="winner_membership_role", - field=models.CharField(max_length=128, null=True, blank=True), - ) - ] diff --git a/ynr/apps/elections/migrations/0004_election_new_organization.py b/ynr/apps/elections/migrations/0004_election_new_organization.py deleted file mode 100644 index b6b50bc247..0000000000 --- a/ynr/apps/elections/migrations/0004_election_new_organization.py +++ /dev/null @@ -1,22 +0,0 @@ -from django.db import migrations, models - - -class Migration(migrations.Migration): - - dependencies = [ - ("popolo", "0002_update_models_from_upstream"), - ("elections", "0003_allow_null_winner_membership_role"), - ] - - operations = [ - migrations.AddField( - model_name="election", - name="new_organization", - field=models.ForeignKey( - blank=True, - to="popolo.Organization", - null=True, - on_delete=models.CASCADE, - ), - ) - ] diff --git a/ynr/apps/elections/migrations/0005_migrate_to_popolo_organizations.py b/ynr/apps/elections/migrations/0005_migrate_to_popolo_organizations.py deleted file mode 100644 index ad7374a327..0000000000 --- a/ynr/apps/elections/migrations/0005_migrate_to_popolo_organizations.py +++ /dev/null @@ -1,39 +0,0 @@ -from django.db import migrations - - -def migrate_to_popolo_organizations(apps, schema_editor): - Election = apps.get_model("elections", "Election") - Organization = apps.get_model("popolo", "Organization") - OrganizationExtra = apps.get_model("candidates", "OrganizationExtra") - for e in Election.objects.all(): - # This is a get_or_create, rather than just get, because when - # running tests with an ELECTION_APP that has a case in - # 0002_auto_20151012_1731 it will have Election objects with - # an organization_id set, but no corresponding Organization - # object. So that the migration doesn't fail when creating - # the database for tests, create the organization if it - # doesn't exist. - try: - o_extra = OrganizationExtra.objects.get(slug=e.organization_id) - o = o_extra.base - except OrganizationExtra.DoesNotExist: - o = Organization.objects.create(name=e.organization_name) - o_extra = OrganizationExtra.objects.create( - base=o, slug=e.organization_id - ) - e.new_organization = o - e.save() - - -class Migration(migrations.Migration): - - dependencies = [ - ("elections", "0004_election_new_organization"), - ("candidates", "0009_migrate_to_django_popolo"), - ] - - operations = [ - migrations.RunPython( - migrate_to_popolo_organizations, lambda apps, schema_editor: None - ) - ] diff --git a/ynr/apps/elections/migrations/0006_remove_old_organization_fields.py b/ynr/apps/elections/migrations/0006_remove_old_organization_fields.py deleted file mode 100644 index aaa20e6a35..0000000000 --- a/ynr/apps/elections/migrations/0006_remove_old_organization_fields.py +++ /dev/null @@ -1,11 +0,0 @@ -from django.db import migrations - - -class Migration(migrations.Migration): - - dependencies = [("elections", "0005_migrate_to_popolo_organizations")] - - operations = [ - migrations.RemoveField(model_name="election", name="organization_id"), - migrations.RemoveField(model_name="election", name="organization_name"), - ] diff --git a/ynr/apps/elections/migrations/0007_rename_new_organization_to_organization.py b/ynr/apps/elections/migrations/0007_rename_new_organization_to_organization.py deleted file mode 100644 index 45fc667f68..0000000000 --- a/ynr/apps/elections/migrations/0007_rename_new_organization_to_organization.py +++ /dev/null @@ -1,14 +0,0 @@ -from django.db import migrations - - -class Migration(migrations.Migration): - - dependencies = [("elections", "0006_remove_old_organization_fields")] - - operations = [ - migrations.RenameField( - model_name="election", - old_name="new_organization", - new_name="organization", - ) - ] diff --git a/ynr/apps/elections/migrations/0008_remove_artificial_start_and_end_dates.py b/ynr/apps/elections/migrations/0008_remove_artificial_start_and_end_dates.py deleted file mode 100644 index f351492de9..0000000000 --- a/ynr/apps/elections/migrations/0008_remove_artificial_start_and_end_dates.py +++ /dev/null @@ -1,20 +0,0 @@ -from django.db import migrations - - -class Migration(migrations.Migration): - - dependencies = [ - ("elections", "0007_rename_new_organization_to_organization") - ] - - operations = [ - migrations.RemoveField( - model_name="election", name="candidacy_start_date" - ), - migrations.RemoveField( - model_name="election", name="party_membership_end_date" - ), - migrations.RemoveField( - model_name="election", name="party_membership_start_date" - ), - ] diff --git a/ynr/apps/elections/migrations/0009_make_election_slug_unique.py b/ynr/apps/elections/migrations/0009_make_election_slug_unique.py deleted file mode 100644 index 77534e08f4..0000000000 --- a/ynr/apps/elections/migrations/0009_make_election_slug_unique.py +++ /dev/null @@ -1,14 +0,0 @@ -from django.db import migrations, models - - -class Migration(migrations.Migration): - - dependencies = [("elections", "0008_remove_artificial_start_and_end_dates")] - - operations = [ - migrations.AlterField( - model_name="election", - name="slug", - field=models.CharField(unique=True, max_length=128), - ) - ] diff --git a/ynr/apps/elections/migrations/0010_make_post_id_format_optional.py b/ynr/apps/elections/migrations/0010_make_post_id_format_optional.py deleted file mode 100644 index 5cfb954097..0000000000 --- a/ynr/apps/elections/migrations/0010_make_post_id_format_optional.py +++ /dev/null @@ -1,14 +0,0 @@ -from django.db import migrations, models - - -class Migration(migrations.Migration): - - dependencies = [("elections", "0009_make_election_slug_unique")] - - operations = [ - migrations.AlterField( - model_name="election", - name="post_id_format", - field=models.CharField(max_length=128, blank=True), - ) - ] diff --git a/ynr/apps/elections/migrations/0011_remove_election_post_id_format.py b/ynr/apps/elections/migrations/0011_remove_election_post_id_format.py deleted file mode 100644 index 3045c6beb0..0000000000 --- a/ynr/apps/elections/migrations/0011_remove_election_post_id_format.py +++ /dev/null @@ -1,10 +0,0 @@ -from django.db import migrations - - -class Migration(migrations.Migration): - - dependencies = [("elections", "0010_make_post_id_format_optional")] - - operations = [ - migrations.RemoveField(model_name="election", name="post_id_format") - ] diff --git a/ynr/apps/elections/migrations/0012_election_people_elected_per_post.py b/ynr/apps/elections/migrations/0012_election_people_elected_per_post.py deleted file mode 100644 index 93f66e9dd3..0000000000 --- a/ynr/apps/elections/migrations/0012_election_people_elected_per_post.py +++ /dev/null @@ -1,17 +0,0 @@ -from django.db import migrations, models - - -class Migration(migrations.Migration): - - dependencies = [("elections", "0011_remove_election_post_id_format")] - - operations = [ - migrations.AddField( - model_name="election", - name="people_elected_per_post", - field=models.IntegerField( - default=1, - help_text="The number of people who are elected to this post in the election. -1 means a variable number of winners", - ), - ) - ] diff --git a/ynr/apps/elections/migrations/0013_remove_area.py b/ynr/apps/elections/migrations/0013_remove_area.py deleted file mode 100644 index 654a1e3058..0000000000 --- a/ynr/apps/elections/migrations/0013_remove_area.py +++ /dev/null @@ -1,19 +0,0 @@ -# -*- coding: utf-8 -*- -# Generated by Django 1.10.8 on 2018-09-26 14:56 -from __future__ import unicode_literals - -from django.db import migrations - - -class Migration(migrations.Migration): - - dependencies = [ - ("candidates", "0051_remove_areaextra"), - ("elections", "0012_election_people_elected_per_post"), - ] - - operations = [ - migrations.RemoveField(model_name="election", name="area_generation"), - migrations.RemoveField(model_name="election", name="area_types"), - migrations.DeleteModel(name="AreaType"), - ] diff --git a/ynr/apps/elections/migrations/0014_cleanup_for_post_role.py b/ynr/apps/elections/migrations/0014_cleanup_for_post_role.py deleted file mode 100644 index 9245d478b3..0000000000 --- a/ynr/apps/elections/migrations/0014_cleanup_for_post_role.py +++ /dev/null @@ -1,33 +0,0 @@ -# -*- coding: utf-8 -*- -# Generated by Django 1.11.20 on 2019-03-29 15:34 -from __future__ import unicode_literals - -from django.db import migrations - -ROLES_BY_TYPE = { - "parl": "UK Parliament elections", - "nia": "Northern Ireland Assembly elections", - "naw": "National Assembly for Wales elections", - "sp": "Scottish Parliament elections", - "gla": "Greater London Assembly elections", - "local": "Local elections", - "pcc": "Police and Crime Commissioner elections", - "mayor": "Mayoral elections", -} - - -def update_for_post_role(apps, schema_editor): - Election = apps.get_model("elections", "Election") - for election_type, text in ROLES_BY_TYPE.items(): - Election.objects.filter(slug__startswith=election_type).update( - for_post_role=text - ) - - -class Migration(migrations.Migration): - - dependencies = [("elections", "0013_remove_area")] - - operations = [ - migrations.RunPython(update_for_post_role, migrations.RunPython.noop) - ] diff --git a/ynr/apps/elections/migrations/0015_election_date_index.py b/ynr/apps/elections/migrations/0015_election_date_index.py deleted file mode 100644 index d3590f3299..0000000000 --- a/ynr/apps/elections/migrations/0015_election_date_index.py +++ /dev/null @@ -1,18 +0,0 @@ -# -*- coding: utf-8 -*- -# Generated by Django 1.11.20 on 2019-05-03 10:49 -from __future__ import unicode_literals - -from django.db import migrations, models - - -class Migration(migrations.Migration): - - dependencies = [("elections", "0014_cleanup_for_post_role")] - - operations = [ - migrations.AlterField( - model_name="election", - name="election_date", - field=models.DateField(db_index=True), - ) - ] diff --git a/ynr/apps/elections/migrations/0016_positive_int_field.py b/ynr/apps/elections/migrations/0016_positive_int_field.py deleted file mode 100644 index d3b89ec5e2..0000000000 --- a/ynr/apps/elections/migrations/0016_positive_int_field.py +++ /dev/null @@ -1,34 +0,0 @@ -# Generated by Django 2.2.4 on 2019-10-29 17:04 - -from django.db import migrations, models - - -def set_people_elected_per_post_to_zero(apps, schema_editor): - Election = apps.get_model("elections", "Election") - Election.objects.filter(people_elected_per_post__lt=0).update( - people_elected_per_post=0 - ) - - -class Migration(migrations.Migration): - - dependencies = [("elections", "0015_election_date_index")] - - operations = [ - migrations.RunPython( - set_people_elected_per_post_to_zero, migrations.RunPython.noop - ), - migrations.AlterField( - model_name="election", - name="default_party_list_members_to_show", - field=models.PositiveSmallIntegerField(default=0), - ), - migrations.AlterField( - model_name="election", - name="people_elected_per_post", - field=models.PositiveSmallIntegerField( - default=1, - help_text="The number of people who are elected per post in this election. 0 means a variable number of winners", - ), - ), - ] diff --git a/ynr/apps/elections/migrations/0017_election_modgov_url.py b/ynr/apps/elections/migrations/0017_election_modgov_url.py deleted file mode 100644 index 49c46046af..0000000000 --- a/ynr/apps/elections/migrations/0017_election_modgov_url.py +++ /dev/null @@ -1,20 +0,0 @@ -# Generated by Django 2.2.18 on 2021-05-05 14:40 - -from django.db import migrations, models - - -class Migration(migrations.Migration): - - dependencies = [("elections", "0016_positive_int_field")] - - operations = [ - migrations.AddField( - model_name="election", - name="modgov_url", - field=models.URLField( - blank=True, - help_text="Used to store a possible ModGov url that can be used to scrape information for this election", - null=True, - ), - ) - ] diff --git a/ynr/apps/elections/migrations/0018_add_timestamps_to_election.py b/ynr/apps/elections/migrations/0018_add_timestamps_to_election.py deleted file mode 100644 index 012dca6a0d..0000000000 --- a/ynr/apps/elections/migrations/0018_add_timestamps_to_election.py +++ /dev/null @@ -1,42 +0,0 @@ -# Generated by Django 3.2.4 on 2021-09-29 16:10 - -from django.db import migrations, models -import django.utils.timezone -import django_extensions.db.fields - - -class Migration(migrations.Migration): - - dependencies = [("elections", "0017_election_modgov_url")] - - operations = [ - migrations.AlterModelOptions( - name="election", options={"get_latest_by": "modified"} - ), - migrations.AddField( - model_name="election", - name="created", - field=django_extensions.db.fields.CreationDateTimeField( - auto_now_add=True, - default=django.utils.timezone.now, - verbose_name="created", - ), - preserve_default=False, - ), - migrations.AddField( - model_name="election", - name="ee_modified", - field=models.DateTimeField( - blank=True, - help_text="Stores the modified timestamp from EE", - null=True, - ), - ), - migrations.AddField( - model_name="election", - name="modified", - field=django_extensions.db.fields.ModificationDateTimeField( - auto_now=True, verbose_name="modified" - ), - ), - ] diff --git a/ynr/apps/elections/migrations/0019_add_created.py b/ynr/apps/elections/migrations/0019_add_created.py deleted file mode 100644 index b8103dd07f..0000000000 --- a/ynr/apps/elections/migrations/0019_add_created.py +++ /dev/null @@ -1,23 +0,0 @@ -# Generated by Django 3.2.4 on 2021-09-29 16:12 - -from django.db import migrations - -from elections.helpers import four_weeks_before_election_date - - -def add_created_date(apps, schema_editor): - Election = apps.get_model("elections", "Election") - for election in Election.objects.iterator(): - election.created = four_weeks_before_election_date(election=election) - election.save() - - -class Migration(migrations.Migration): - - dependencies = [("elections", "0018_add_timestamps_to_election")] - - operations = [ - migrations.RunPython( - code=add_created_date, reverse_code=migrations.RunPython.noop - ) - ] diff --git a/ynr/apps/elections/migrations/0020_alter_election_modified.py b/ynr/apps/elections/migrations/0020_alter_election_modified.py deleted file mode 100644 index 6a1c57b069..0000000000 --- a/ynr/apps/elections/migrations/0020_alter_election_modified.py +++ /dev/null @@ -1,19 +0,0 @@ -# Generated by Django 3.2.4 on 2021-10-20 10:26 - -from django.db import migrations -import django_extensions.db.fields - - -class Migration(migrations.Migration): - - dependencies = [("elections", "0019_add_created")] - - operations = [ - migrations.AlterField( - model_name="election", - name="modified", - field=django_extensions.db.fields.ModificationDateTimeField( - auto_now=True, db_index=True, verbose_name="modified" - ), - ) - ] diff --git a/ynr/apps/elections/uk/migrations/0001_migrate_area_ids.py b/ynr/apps/elections/uk/migrations/0001_migrate_area_ids.py deleted file mode 100644 index cbc0a31352..0000000000 --- a/ynr/apps/elections/uk/migrations/0001_migrate_area_ids.py +++ /dev/null @@ -1,69 +0,0 @@ -# -*- coding: utf-8 -*- -from __future__ import print_function, unicode_literals - -import json -import logging -import os - -from django.db import migrations - -logger = logging.getLogger(__name__) - - -def get_mapit_data(): - old_mapit_data_filename = os.path.join( - os.path.dirname(os.path.realpath(__file__)), - "0001_mapit_data_cache.json", - ) - with open(old_mapit_data_filename) as f: - return json.load(f) - - -def mapit_ids_to_gss(apps, schema_editor): - Area = apps.get_model("popolo", "Area") - - mapit_data = get_mapit_data() - - for area in Area.objects.all(): - old_id = area.identifier - try: - mapit_area = mapit_data[area.identifier] - new_id = mapit.format_code_from_area(mapit_area) # noqa - - if old_id != new_id: - area.identifier = new_id - area.save() - - except KeyError: - print("No GSS code found for {}".format(area.identifier)) - - -def gss_to_old_mapit_ids(apps, schema_editor): - Area = apps.get_model("popolo", "Area") - - code_to_old_mapit_area_id = {} - old_mapit_data = get_mapit_data() - - for old_mapit_id, area_data in old_mapit_data.items(): - for code_type, code_id in area_data.get("codes", {}).items(): - key = "{}:{}".format(code_type, code_id) - code_to_old_mapit_area_id[key] = old_mapit_id - - for area in Area.objects.all(): - gss_id = area.identifier - try: - old_mapit_area_id = code_to_old_mapit_area_id[gss_id] - area.identifier = old_mapit_area_id - area.save() - except KeyError: - print("No old MapIt Area ID found for {}".format(area.identifier)) - - -class Migration(migrations.Migration): - - dependencies = [ - ("popolo", "0002_update_models_from_upstream"), - ("candidates", "0009_migrate_to_django_popolo"), - ] - - operations = [migrations.RunPython(mapit_ids_to_gss, gss_to_old_mapit_ids)] diff --git a/ynr/apps/elections/uk/migrations/0002_remove-gb-prefix.py b/ynr/apps/elections/uk/migrations/0002_remove-gb-prefix.py deleted file mode 100644 index ff1ef13e80..0000000000 --- a/ynr/apps/elections/uk/migrations/0002_remove-gb-prefix.py +++ /dev/null @@ -1,40 +0,0 @@ -# -*- coding: utf-8 -*- -from __future__ import unicode_literals - -from django.db import migrations - -IDS_TO_ALTER = { - "gb-nia-2016-05-05": "nia-2016-05-05", - "gb-sp-2016-05-05-c": "sp-2016-05-05-c", - "gb-naw-2016-05-05-c": "naw-2016-05-05-c", - "gb-sp-2016-05-05-r": "sp-2016-05-05-r", - "gb-naw-2016-05-05-r": "naw-2016-05-05-r", - "gb-gla-2016-05-05-a": "gla-2016-05-05-a", - "gb-gla-2016-05-05-c": "gla-2016-05-05-c", -} - - -def remove_gb_prefix(apps, schema_editor): - Election = apps.get_model("elections", "Election") - - for election in Election.objects.filter(slug__in=IDS_TO_ALTER.keys()): - election.slug = IDS_TO_ALTER[election.slug] - election.save() - - -def add_gb_prefix(apps, schema_editor): - Election = apps.get_model("elections", "Election") - reversed_ids_to_alter = {v: k for k, v in IDS_TO_ALTER.iteritems()} - - for election in Election.objects.filter( - slug__in=reversed_ids_to_alter.keys() - ): - election.slug = reversed_ids_to_alter[election.slug] - election.save() - - -class Migration(migrations.Migration): - - dependencies = [("uk", "0001_migrate_area_ids")] - - operations = [migrations.RunPython(remove_gb_prefix, add_gb_prefix)] diff --git a/ynr/apps/elections/uk/migrations/0003_adjust_roles_for_grouping.py b/ynr/apps/elections/uk/migrations/0003_adjust_roles_for_grouping.py deleted file mode 100644 index 150b5e7c6f..0000000000 --- a/ynr/apps/elections/uk/migrations/0003_adjust_roles_for_grouping.py +++ /dev/null @@ -1,24 +0,0 @@ -# -*- coding: utf-8 -*- -from __future__ import unicode_literals - -import re - -from django.db import migrations - - -def adjust_roles_for_grouping(apps, schema_editor): - Election = apps.get_model("elections", "Election") - for election in Election.objects.all(): - if re.search(r"^local\.[^.]+\.2016", election.slug): - election.for_post_role = "Local Councillor" - election.save() - if re.search(r"^mayor\.[^.]+\.2016", election.slug): - election.for_post_role = "Mayor" - election.save() - - -class Migration(migrations.Migration): - - dependencies = [("uk", "0002_remove-gb-prefix")] - - operations = [migrations.RunPython(adjust_roles_for_grouping)] diff --git a/ynr/apps/elections/uk/migrations/0004_add_biography.py b/ynr/apps/elections/uk/migrations/0004_add_biography.py deleted file mode 100644 index d79f3828cc..0000000000 --- a/ynr/apps/elections/uk/migrations/0004_add_biography.py +++ /dev/null @@ -1,25 +0,0 @@ -# -*- coding: utf-8 -*- -from __future__ import unicode_literals - -from django.db import migrations - - -class Migration(migrations.Migration): - def create_simple_fields(apps, schema_editor): - SimpleField = apps.get_model("candidates", "SimplePopoloField") - db_alias = schema_editor.connection.alias - - SimpleField.objects.using(db_alias).create( - name="biography", - label="Biography", - required=False, - info_type_key="text_multiline", - order=10, - ) - - dependencies = [ - ("uk", "0003_adjust_roles_for_grouping"), - ("candidates", "0021_simplepopolofield"), - ] - - operations = [migrations.RunPython(create_simple_fields)] diff --git a/ynr/apps/elections/uk/migrations/0005_add_favourite_biscuits.py b/ynr/apps/elections/uk/migrations/0005_add_favourite_biscuits.py deleted file mode 100644 index d206f2b98a..0000000000 --- a/ynr/apps/elections/uk/migrations/0005_add_favourite_biscuits.py +++ /dev/null @@ -1,23 +0,0 @@ -# -*- coding: utf-8 -*- -from __future__ import unicode_literals - -from django.db import migrations - - -class Migration(migrations.Migration): - def create_simple_fields(apps, schema_editor): - ExtraField = apps.get_model("candidates", "ExtraField") - db_alias = schema_editor.connection.alias - - ExtraField.objects.using(db_alias).update_or_create( - key="favourite_biscuits", - defaults={ - "label": "Favourite biscuit 🍪", - "type": "line", - "order": 1, - }, - ) - - dependencies = [("uk", "0004_add_biography")] - - operations = [migrations.RunPython(create_simple_fields)] diff --git a/ynr/apps/facebook_data/migrations/0001_initial.py b/ynr/apps/facebook_data/migrations/0001_initial.py index b72125e59a..a83416ea0c 100644 --- a/ynr/apps/facebook_data/migrations/0001_initial.py +++ b/ynr/apps/facebook_data/migrations/0001_initial.py @@ -1,15 +1,15 @@ -# Generated by Django 2.2.4 on 2019-09-15 16:04 +# Generated by Django 3.2.10 on 2021-12-14 17:21 -import django.contrib.postgres.fields.jsonb -import django.db.models.deletion from django.db import migrations, models +import django.db.models.deletion +import facebook_data.models class Migration(migrations.Migration): initial = True - dependencies = [("people", "0017_set_vandalism_list")] + dependencies = [("people", "0001_initial")] operations = [ migrations.CreateModel( @@ -24,13 +24,17 @@ class Migration(migrations.Migration): verbose_name="ID", ), ), - ("ad_id", models.CharField(max_length=500)), - ("ad_json", django.contrib.postgres.fields.jsonb.JSONField()), ( - "person", - models.ForeignKey( - on_delete=django.db.models.deletion.CASCADE, - to="people.Person", + "ad_id", + models.CharField( + help_text="The Facebook ID for this advert", + max_length=500, + ), + ), + ( + "ad_json", + models.JSONField( + help_text="The JSON returned from the Facebook Graph API for this advert" ), ), ( @@ -41,6 +45,26 @@ class Migration(migrations.Migration): max_length=800, ), ), + ( + "image", + models.ImageField( + blank=True, + help_text="A screenshot of the rendered advert", + max_length=512, + upload_to=facebook_data.models.advert_image_path, + ), + ), + ( + "person", + models.ForeignKey( + on_delete=django.db.models.deletion.CASCADE, + to="people.person", + ), + ), ], + options={ + "ordering": ("-ad_json__ad_delivery_start_time",), + "get_latest_by": "ad_json__ad_delivery_start_time", + }, ) ] diff --git a/ynr/apps/facebook_data/migrations/0002_facebookadvert_image.py b/ynr/apps/facebook_data/migrations/0002_facebookadvert_image.py deleted file mode 100644 index 0cb1dcc4ce..0000000000 --- a/ynr/apps/facebook_data/migrations/0002_facebookadvert_image.py +++ /dev/null @@ -1,21 +0,0 @@ -# Generated by Django 2.2.4 on 2019-12-08 14:05 - -from django.db import migrations, models -import facebook_data.models - - -class Migration(migrations.Migration): - - dependencies = [("facebook_data", "0001_initial")] - - operations = [ - migrations.AddField( - model_name="facebookadvert", - name="image", - field=models.ImageField( - blank=True, - max_length=512, - upload_to=facebook_data.models.advert_image_path, - ), - ) - ] diff --git a/ynr/apps/facebook_data/migrations/0003_auto_20210401_0811.py b/ynr/apps/facebook_data/migrations/0003_auto_20210401_0811.py deleted file mode 100644 index d97284d325..0000000000 --- a/ynr/apps/facebook_data/migrations/0003_auto_20210401_0811.py +++ /dev/null @@ -1,44 +0,0 @@ -# Generated by Django 2.2.16 on 2021-04-01 07:11 - -import django.contrib.postgres.fields.jsonb -from django.db import migrations, models -import facebook_data.models - - -class Migration(migrations.Migration): - - dependencies = [("facebook_data", "0002_facebookadvert_image")] - - operations = [ - migrations.AlterModelOptions( - name="facebookadvert", - options={ - "get_latest_by": "ad_json__ad_delivery_start_time", - "ordering": ("-ad_json__ad_delivery_start_time",), - }, - ), - migrations.AlterField( - model_name="facebookadvert", - name="ad_id", - field=models.CharField( - help_text="The Facebook ID for this advert", max_length=500 - ), - ), - migrations.AlterField( - model_name="facebookadvert", - name="ad_json", - field=django.contrib.postgres.fields.jsonb.JSONField( - help_text="The JSON returned from the Facebook Graph API for this advert" - ), - ), - migrations.AlterField( - model_name="facebookadvert", - name="image", - field=models.ImageField( - blank=True, - help_text="A screenshot of the rendered advert", - max_length=512, - upload_to=facebook_data.models.advert_image_path, - ), - ), - ] diff --git a/ynr/apps/facebook_data/migrations/0004_alter_facebookadvert_ad_json.py b/ynr/apps/facebook_data/migrations/0004_alter_facebookadvert_ad_json.py deleted file mode 100644 index 2ad9a6b06b..0000000000 --- a/ynr/apps/facebook_data/migrations/0004_alter_facebookadvert_ad_json.py +++ /dev/null @@ -1,18 +0,0 @@ -# Generated by Django 3.2.4 on 2021-09-29 16:30 - -from django.db import migrations, models - - -class Migration(migrations.Migration): - - dependencies = [("facebook_data", "0003_auto_20210401_0811")] - - operations = [ - migrations.AlterField( - model_name="facebookadvert", - name="ad_json", - field=models.JSONField( - help_text="The JSON returned from the Facebook Graph API for this advert" - ), - ) - ] diff --git a/ynr/apps/frontend/migrations/0001_initial.py b/ynr/apps/frontend/migrations/0001_initial.py index 6b1ef522b8..2448eb62ce 100644 --- a/ynr/apps/frontend/migrations/0001_initial.py +++ b/ynr/apps/frontend/migrations/0001_initial.py @@ -1,10 +1,8 @@ -# -*- coding: utf-8 -*- -# Generated by Django 1.11.20 on 2019-03-28 13:26 -from __future__ import unicode_literals +# Generated by Django 3.2.10 on 2021-12-14 17:21 +from django.db import migrations, models import django.utils.timezone import model_utils.fields -from django.db import migrations, models class Migration(migrations.Migration): @@ -51,6 +49,6 @@ class Migration(migrations.Migration): ("published", models.BooleanField(default=False)), ("show_until", models.DateTimeField()), ], - options={"abstract": False}, + options={"get_latest_by": "modified"}, ) ] diff --git a/ynr/apps/frontend/migrations/0002_auto_20210401_0811.py b/ynr/apps/frontend/migrations/0002_auto_20210401_0811.py deleted file mode 100644 index a2b73dc17c..0000000000 --- a/ynr/apps/frontend/migrations/0002_auto_20210401_0811.py +++ /dev/null @@ -1,14 +0,0 @@ -# Generated by Django 2.2.16 on 2021-04-01 07:11 - -from django.db import migrations - - -class Migration(migrations.Migration): - - dependencies = [("frontend", "0001_initial")] - - operations = [ - migrations.AlterModelOptions( - name="sitebanner", options={"get_latest_by": "modified"} - ) - ] diff --git a/ynr/apps/moderation_queue/migrations/0001_initial.py b/ynr/apps/moderation_queue/migrations/0001_initial.py index 748a7993dc..85d11683e5 100644 --- a/ynr/apps/moderation_queue/migrations/0001_initial.py +++ b/ynr/apps/moderation_queue/migrations/0001_initial.py @@ -1,56 +1,153 @@ +# Generated by Django 3.2.10 on 2021-12-14 17:21 + from django.conf import settings from django.db import migrations, models +import django.db.models.deletion +import moderation_queue.models class Migration(migrations.Migration): - dependencies = [migrations.swappable_dependency(settings.AUTH_USER_MODEL)] + initial = True + + dependencies = [ + ("people", "0001_initial"), + migrations.swappable_dependency(settings.AUTH_USER_MODEL), + ("candidates", "0001_initial"), + ] operations = [ migrations.CreateModel( - name="QueuedImage", + name="SuggestedPostLock", fields=[ ( "id", models.AutoField( - verbose_name="ID", + auto_created=True, + primary_key=True, serialize=False, + verbose_name="ID", + ), + ), + ("created", models.DateTimeField(auto_now_add=True)), + ("updated", models.DateTimeField(auto_now=True)), + ( + "justification", + models.TextField( + blank=True, + help_text="e.g I've reviewed the nomination paper for this area", + ), + ), + ("ballot_hash", models.CharField(max_length=255)), + ( + "ballot", + models.ForeignKey( + on_delete=django.db.models.deletion.CASCADE, + to="candidates.ballot", + ), + ), + ( + "user", + models.ForeignKey( + on_delete=django.db.models.deletion.CASCADE, + to=settings.AUTH_USER_MODEL, + ), + ), + ], + ), + migrations.CreateModel( + name="QueuedImage", + fields=[ + ( + "id", + models.AutoField( auto_created=True, primary_key=True, + serialize=False, + verbose_name="ID", + ), + ), + ( + "why_allowed", + models.CharField( + choices=[ + ( + "public-domain", + "This photograph is free of any copyright restrictions", + ), + ( + "copyright-assigned", + "I own copyright of this photo and I assign the copyright to Democracy Club Limited in return for it being displayed on this site", + ), + ( + "profile-photo", + "This is the candidate's public profile photo from social media (e.g. Twitter, Facebook) or their official campaign page", + ), + ("other", "Other"), + ], + default="other", + max_length=64, ), ), - ("copyright_assigned", models.BooleanField(default=False)), + ("justification_for_use", models.TextField(blank=True)), ( "decision", models.CharField( - default=b"undecided", - max_length=32, choices=[ - (b"approved", b"Approved"), - (b"rejected", b"Rejected"), - (b"undecided", b"Undecided"), + ("approved", "Approved"), + ("rejected", "Rejected"), + ("undecided", "Undecided"), + ("ignore", "Ignore"), ], + default="undecided", + max_length=32, ), ), - ("justification_for_use", models.TextField()), ( "image", models.ImageField( - max_length=512, upload_to=b"queued-images/%Y/%m/%d" + max_length=512, + upload_to=moderation_queue.models.queued_image_filename, + ), + ), + ( + "crop_min_x", + models.PositiveIntegerField(blank=True, null=True), + ), + ( + "crop_min_y", + models.PositiveIntegerField(blank=True, null=True), + ), + ( + "crop_max_x", + models.PositiveIntegerField(blank=True, null=True), + ), + ( + "crop_max_y", + models.PositiveIntegerField(blank=True, null=True), + ), + ("detection_metadata", models.TextField(blank=True)), + ("face_detection_tried", models.BooleanField(default=False)), + ("created", models.DateTimeField(auto_now_add=True)), + ("updated", models.DateTimeField(auto_now=True)), + ( + "person", + models.ForeignKey( + blank=True, + null=True, + on_delete=django.db.models.deletion.CASCADE, + to="people.person", ), ), - ("popit_person_id", models.CharField(max_length=256)), ( "user", models.ForeignKey( blank=True, - to=settings.AUTH_USER_MODEL, null=True, - on_delete=models.CASCADE, + on_delete=django.db.models.deletion.CASCADE, + to=settings.AUTH_USER_MODEL, ), ), ], - options={}, - bases=(models.Model,), - ) + ), ] diff --git a/ynr/apps/moderation_queue/migrations/0002_auto_20150213_0838.py b/ynr/apps/moderation_queue/migrations/0002_auto_20150213_0838.py deleted file mode 100644 index 0b0db53e30..0000000000 --- a/ynr/apps/moderation_queue/migrations/0002_auto_20150213_0838.py +++ /dev/null @@ -1,32 +0,0 @@ -from django.db import migrations, models - - -class Migration(migrations.Migration): - - dependencies = [("moderation_queue", "0001_initial")] - - operations = [ - migrations.RenameField( - model_name="queuedimage", - old_name="copyright_assigned", - new_name="use_allowed_by_owner", - ), - migrations.AddField( - model_name="queuedimage", - name="created", - field=models.DateTimeField(auto_now_add=True), - preserve_default=True, - ), - migrations.AddField( - model_name="queuedimage", - name="public_domain", - field=models.BooleanField(default=False), - preserve_default=True, - ), - migrations.AddField( - model_name="queuedimage", - name="updated", - field=models.DateTimeField(auto_now=True), - preserve_default=True, - ), - ] diff --git a/ynr/apps/moderation_queue/migrations/0003_auto_20150301_2035.py b/ynr/apps/moderation_queue/migrations/0003_auto_20150301_2035.py deleted file mode 100644 index 094740fdad..0000000000 --- a/ynr/apps/moderation_queue/migrations/0003_auto_20150301_2035.py +++ /dev/null @@ -1,15 +0,0 @@ -from django.db import migrations, models - - -class Migration(migrations.Migration): - - dependencies = [("moderation_queue", "0002_auto_20150213_0838")] - - operations = [ - migrations.AlterField( - model_name="queuedimage", - name="justification_for_use", - field=models.TextField(blank=True), - preserve_default=True, - ) - ] diff --git a/ynr/apps/moderation_queue/migrations/0004_queuedimage_why_allowed.py b/ynr/apps/moderation_queue/migrations/0004_queuedimage_why_allowed.py deleted file mode 100644 index 11e728aa2b..0000000000 --- a/ynr/apps/moderation_queue/migrations/0004_queuedimage_why_allowed.py +++ /dev/null @@ -1,32 +0,0 @@ -from django.db import migrations, models - - -class Migration(migrations.Migration): - - dependencies = [("moderation_queue", "0003_auto_20150301_2035")] - - operations = [ - migrations.AddField( - model_name="queuedimage", - name="why_allowed", - field=models.CharField( - default=b"other", - max_length=64, - choices=[ - ( - b"public-domain", - b"This photograph is free of any copyright restrictions", - ), - ( - b"copyright-assigned", - b"I own copyright of this photo and I assign the copyright to Democracy Club Limited in return for it being displayed on YourNextMP", - ), - ( - b"profile-photo", - b"This is the candidate's public profile photo from social media (e.g. Twitter, Facebook) or their official campaign page", - ), - ], - ), - preserve_default=True, - ) - ] diff --git a/ynr/apps/moderation_queue/migrations/0005_migrate_data_to_why_allowed.py b/ynr/apps/moderation_queue/migrations/0005_migrate_data_to_why_allowed.py deleted file mode 100644 index 444af94075..0000000000 --- a/ynr/apps/moderation_queue/migrations/0005_migrate_data_to_why_allowed.py +++ /dev/null @@ -1,32 +0,0 @@ -from django.db import migrations - - -def forward_to_why_allowed(apps, schema_editor): - QueuedImage = apps.get_model("moderation_queue", "QueuedImage") - for qi in QueuedImage.objects.all(): - if qi.public_domain: - qi.why_allowed = "public-domain" - elif qi.use_allowed_by_owner: - qi.why_allowed = "copyright-assigned" - else: - qi.why_allowed = "other" - qi.save() - - -def backwards_from_why_allowed(apps, schema_editor): - QueuedImage = apps.get_model("moderation_queue", "QueuedImage") - for qi in QueuedImage.objects.all(): - if qi.why_allowed == "public-domain": - qi.public_domain = True - elif qi.why_allowed == "copyright-assigned": - qi.use_allowed_by_owner = True - qi.save() - - -class Migration(migrations.Migration): - - dependencies = [("moderation_queue", "0004_queuedimage_why_allowed")] - - operations = [ - migrations.RunPython(forward_to_why_allowed, backwards_from_why_allowed) - ] diff --git a/ynr/apps/moderation_queue/migrations/0006_auto_20150303_0838.py b/ynr/apps/moderation_queue/migrations/0006_auto_20150303_0838.py deleted file mode 100644 index 799f947987..0000000000 --- a/ynr/apps/moderation_queue/migrations/0006_auto_20150303_0838.py +++ /dev/null @@ -1,13 +0,0 @@ -from django.db import migrations - - -class Migration(migrations.Migration): - - dependencies = [("moderation_queue", "0005_migrate_data_to_why_allowed")] - - operations = [ - migrations.RemoveField(model_name="queuedimage", name="public_domain"), - migrations.RemoveField( - model_name="queuedimage", name="use_allowed_by_owner" - ), - ] diff --git a/ynr/apps/moderation_queue/migrations/0007_auto_20150303_1420.py b/ynr/apps/moderation_queue/migrations/0007_auto_20150303_1420.py deleted file mode 100644 index c4f7ea3837..0000000000 --- a/ynr/apps/moderation_queue/migrations/0007_auto_20150303_1420.py +++ /dev/null @@ -1,33 +0,0 @@ -from django.db import migrations, models - - -class Migration(migrations.Migration): - - dependencies = [("moderation_queue", "0006_auto_20150303_0838")] - - operations = [ - migrations.AlterField( - model_name="queuedimage", - name="why_allowed", - field=models.CharField( - default=b"other", - max_length=64, - choices=[ - ( - b"public-domain", - b"This photograph is free of any copyright restrictions", - ), - ( - b"copyright-assigned", - b"I own copyright of this photo and I assign the copyright to Democracy Club Limited in return for it being displayed on YourNextMP", - ), - ( - b"profile-photo", - b"This is the candidate's public profile photo from social media (e.g. Twitter, Facebook) or their official campaign page", - ), - (b"other", b"Other"), - ], - ), - preserve_default=True, - ) - ] diff --git a/ynr/apps/moderation_queue/migrations/0008_add_ignore_to_decision_choices.py b/ynr/apps/moderation_queue/migrations/0008_add_ignore_to_decision_choices.py deleted file mode 100644 index 1dd60b73a9..0000000000 --- a/ynr/apps/moderation_queue/migrations/0008_add_ignore_to_decision_choices.py +++ /dev/null @@ -1,24 +0,0 @@ -from django.db import migrations, models - - -class Migration(migrations.Migration): - - dependencies = [("moderation_queue", "0007_auto_20150303_1420")] - - operations = [ - migrations.AlterField( - model_name="queuedimage", - name="decision", - field=models.CharField( - default=b"undecided", - max_length=32, - choices=[ - (b"approved", b"Approved"), - (b"rejected", b"Rejected"), - (b"undecided", b"Undecided"), - (b"ignore", b"Ignore"), - ], - ), - preserve_default=True, - ) - ] diff --git a/ynr/apps/moderation_queue/migrations/0008_add_photo_review_permissions.py b/ynr/apps/moderation_queue/migrations/0008_add_photo_review_permissions.py deleted file mode 100644 index 799e11479d..0000000000 --- a/ynr/apps/moderation_queue/migrations/0008_add_photo_review_permissions.py +++ /dev/null @@ -1,21 +0,0 @@ -from django.db import migrations - -from auth_helpers.migrations import ( - get_migration_group_create, - get_migration_group_delete, -) -from moderation_queue.models import PHOTO_REVIEWERS_GROUP_NAME - - -class Migration(migrations.Migration): - - dependencies = [("moderation_queue", "0007_auto_20150303_1420")] - - operations = [ - migrations.RunPython( - get_migration_group_create( - PHOTO_REVIEWERS_GROUP_NAME, ["change_queuedimage"] - ), - get_migration_group_delete(PHOTO_REVIEWERS_GROUP_NAME), - ) - ] diff --git a/ynr/apps/moderation_queue/migrations/0009_merge.py b/ynr/apps/moderation_queue/migrations/0009_merge.py deleted file mode 100644 index 0098810778..0000000000 --- a/ynr/apps/moderation_queue/migrations/0009_merge.py +++ /dev/null @@ -1,11 +0,0 @@ -from django.db import migrations - - -class Migration(migrations.Migration): - - dependencies = [ - ("moderation_queue", "0008_add_photo_review_permissions"), - ("moderation_queue", "0008_add_ignore_to_decision_choices"), - ] - - operations = [] diff --git a/ynr/apps/moderation_queue/migrations/0010_auto_add_crop_bounds.py b/ynr/apps/moderation_queue/migrations/0010_auto_add_crop_bounds.py deleted file mode 100644 index c52e1722a0..0000000000 --- a/ynr/apps/moderation_queue/migrations/0010_auto_add_crop_bounds.py +++ /dev/null @@ -1,33 +0,0 @@ -from django.db import migrations, models - - -class Migration(migrations.Migration): - - dependencies = [("moderation_queue", "0009_merge")] - - operations = [ - migrations.AddField( - model_name="queuedimage", - name="crop_max_x", - field=models.IntegerField(null=True, blank=True), - preserve_default=True, - ), - migrations.AddField( - model_name="queuedimage", - name="crop_max_y", - field=models.IntegerField(null=True, blank=True), - preserve_default=True, - ), - migrations.AddField( - model_name="queuedimage", - name="crop_min_x", - field=models.IntegerField(null=True, blank=True), - preserve_default=True, - ), - migrations.AddField( - model_name="queuedimage", - name="crop_min_y", - field=models.IntegerField(null=True, blank=True), - preserve_default=True, - ), - ] diff --git a/ynr/apps/moderation_queue/migrations/0011_queuedimage_face_detection_tried.py b/ynr/apps/moderation_queue/migrations/0011_queuedimage_face_detection_tried.py deleted file mode 100644 index cf86bdc0d8..0000000000 --- a/ynr/apps/moderation_queue/migrations/0011_queuedimage_face_detection_tried.py +++ /dev/null @@ -1,15 +0,0 @@ -from django.db import migrations, models - - -class Migration(migrations.Migration): - - dependencies = [("moderation_queue", "0010_auto_add_crop_bounds")] - - operations = [ - migrations.AddField( - model_name="queuedimage", - name="face_detection_tried", - field=models.BooleanField(default=False), - preserve_default=True, - ) - ] diff --git a/ynr/apps/moderation_queue/migrations/0012_auto_20150717_0811.py b/ynr/apps/moderation_queue/migrations/0012_auto_20150717_0811.py deleted file mode 100644 index 2b07d5cfd7..0000000000 --- a/ynr/apps/moderation_queue/migrations/0012_auto_20150717_0811.py +++ /dev/null @@ -1,21 +0,0 @@ -from django.db import migrations, models - - -class Migration(migrations.Migration): - - dependencies = [ - ("moderation_queue", "0011_queuedimage_face_detection_tried") - ] - - operations = [ - migrations.AlterField( - model_name="queuedimage", - name="created", - field=models.DateTimeField(auto_now_add=True), - ), - migrations.AlterField( - model_name="queuedimage", - name="updated", - field=models.DateTimeField(auto_now=True), - ), - ] diff --git a/ynr/apps/moderation_queue/migrations/0013_auto_20150916_1753.py b/ynr/apps/moderation_queue/migrations/0013_auto_20150916_1753.py deleted file mode 100644 index b16312e6b3..0000000000 --- a/ynr/apps/moderation_queue/migrations/0013_auto_20150916_1753.py +++ /dev/null @@ -1,32 +0,0 @@ -from django.db import migrations, models - - -class Migration(migrations.Migration): - - dependencies = [("moderation_queue", "0012_auto_20150717_0811")] - - operations = [ - migrations.AlterField( - model_name="queuedimage", - name="why_allowed", - field=models.CharField( - default=b"other", - max_length=64, - choices=[ - ( - b"public-domain", - "This photograph is free of any copyright restrictions", - ), - ( - b"copyright-assigned", - "I own copyright of this photo and I assign the copyright to Democracy Club Limited in return for it being displayed on this site", - ), - ( - b"profile-photo", - "This is the candidate's public profile photo from social media (e.g. Twitter, Facebook) or their official campaign page", - ), - (b"other", "Other"), - ], - ), - ) - ] diff --git a/ynr/apps/moderation_queue/migrations/0014_queuedimage_person.py b/ynr/apps/moderation_queue/migrations/0014_queuedimage_person.py deleted file mode 100644 index 46098f2278..0000000000 --- a/ynr/apps/moderation_queue/migrations/0014_queuedimage_person.py +++ /dev/null @@ -1,23 +0,0 @@ -from django.db import migrations, models - - -class Migration(migrations.Migration): - - dependencies = [ - ("popolo", "0002_update_models_from_upstream"), - ("moderation_queue", "0013_auto_20150916_1753"), - ] - - operations = [ - migrations.AddField( - model_name="queuedimage", - name="person", - field=models.ForeignKey( - blank=True, - null=True, - to="popolo.Person", - on_delete=models.CASCADE, - ), - preserve_default=False, - ) - ] diff --git a/ynr/apps/moderation_queue/migrations/0015_migrate_queuedimage_person.py b/ynr/apps/moderation_queue/migrations/0015_migrate_queuedimage_person.py deleted file mode 100644 index 765babbef4..0000000000 --- a/ynr/apps/moderation_queue/migrations/0015_migrate_queuedimage_person.py +++ /dev/null @@ -1,32 +0,0 @@ -from django.db import migrations - - -def popit_to_db(apps, schema_editor): - Person = apps.get_model("popolo", "Person") - QueuedImage = apps.get_model("moderation_queue", "queuedimage") - for qi in QueuedImage.objects.all(): - try: - qi.person = Person.objects.get(pk=qi.popit_person_id) - qi.save() - except Person.DoesNotExist: - # QueueImage objects may refer to someone who has since - # been deleted from PopIt. - pass - - -def db_to_popit(apps, schema_editor): - QueuedImage = apps.get_model("moderation_queue", "queuedimage") - for qi in QueuedImage.objects.all(): - if qi.person: - qi.popit_person_id = qi.person.id - qi.save() - - -class Migration(migrations.Migration): - - dependencies = [ - ("popolo", "0002_update_models_from_upstream"), - ("moderation_queue", "0014_queuedimage_person"), - ] - - operations = [migrations.RunPython(popit_to_db, db_to_popit)] diff --git a/ynr/apps/moderation_queue/migrations/0016_remove_queuedimage_popit_person_id.py b/ynr/apps/moderation_queue/migrations/0016_remove_queuedimage_popit_person_id.py deleted file mode 100644 index def238e737..0000000000 --- a/ynr/apps/moderation_queue/migrations/0016_remove_queuedimage_popit_person_id.py +++ /dev/null @@ -1,10 +0,0 @@ -from django.db import migrations - - -class Migration(migrations.Migration): - - dependencies = [("moderation_queue", "0015_migrate_queuedimage_person")] - - operations = [ - migrations.RemoveField(model_name="queuedimage", name="popit_person_id") - ] diff --git a/ynr/apps/moderation_queue/migrations/0017_suggestedpostlock.py b/ynr/apps/moderation_queue/migrations/0017_suggestedpostlock.py deleted file mode 100644 index 16b923b463..0000000000 --- a/ynr/apps/moderation_queue/migrations/0017_suggestedpostlock.py +++ /dev/null @@ -1,49 +0,0 @@ -from django.conf import settings -from django.db import migrations, models - - -class Migration(migrations.Migration): - - dependencies = [ - ("candidates", "0028_auto_20160411_1055"), - migrations.swappable_dependency(settings.AUTH_USER_MODEL), - ("moderation_queue", "0016_remove_queuedimage_popit_person_id"), - ] - - operations = [ - migrations.CreateModel( - name="SuggestedPostLock", - 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)), - ( - "justification", - models.TextField( - help_text="e.g I've reviewed the nomination paper for this area", - blank=True, - ), - ), - ( - "post_extra", - models.ForeignKey( - to="candidates.PostExtra", on_delete=models.CASCADE - ), - ), - ( - "user", - models.ForeignKey( - to=settings.AUTH_USER_MODEL, on_delete=models.CASCADE - ), - ), - ], - ) - ] diff --git a/ynr/apps/moderation_queue/migrations/0018_suggestedpostlock_postextraelection.py b/ynr/apps/moderation_queue/migrations/0018_suggestedpostlock_postextraelection.py deleted file mode 100644 index 9871f9cca3..0000000000 --- a/ynr/apps/moderation_queue/migrations/0018_suggestedpostlock_postextraelection.py +++ /dev/null @@ -1,22 +0,0 @@ -from django.db import migrations, models - - -class Migration(migrations.Migration): - - dependencies = [ - ("candidates", "0036_postextra_election_unique_togther"), - ("moderation_queue", "0017_suggestedpostlock"), - ] - - operations = [ - migrations.AddField( - model_name="suggestedpostlock", - name="postextraelection", - field=models.ForeignKey( - blank=True, - to="candidates.PostExtraElection", - null=True, - on_delete=models.CASCADE, - ), - ) - ] diff --git a/ynr/apps/moderation_queue/migrations/0019_migrate_post_extra_to_postextraelection.py b/ynr/apps/moderation_queue/migrations/0019_migrate_post_extra_to_postextraelection.py deleted file mode 100644 index 389d4dbc62..0000000000 --- a/ynr/apps/moderation_queue/migrations/0019_migrate_post_extra_to_postextraelection.py +++ /dev/null @@ -1,84 +0,0 @@ -import os -from collections import defaultdict - -from django.db import migrations - - -def migrate_post_extra_to_postextraelection(apps, schema_editor): - SuggestedPostLock = apps.get_model("moderation_queue", "SuggestedPostLock") - for spl in SuggestedPostLock.objects.all(): - # If there's more than one postextraelection, then make sure - # that we create new SuggestedPostLocks for the rest of them: - postextraelections = spl.post_extra.ballot_set.all() - - if not postextraelections.exists(): - continue - try: - use_for_original, use_for_new_list = ( - postextraelections[0], - postextraelections[1:], - ) - except IndexError: - use_for_original = postextraelections[0] - use_for_new_list = [] - - # Update the SuggestedPostLock on the original: - spl.postextraelection = use_for_original - spl.save() - # Then if there are any other PostExtraElection objects - # associated with the post, create new SuggestPostLocks with - # the same metadata for those as well. - for postextraelection in use_for_new_list: - SuggestedPostLock.objects.create( - postextraelection=postextraelection, - post_extra=spl.post_extra, - user=spl.user, - justification=spl.justification, - ) - - -def migrate_postextraelection_to_post_extra(apps, schema_editor): - # The reverse migration here will probably lose data, since we're - # moving from the more expressive model (you can have a suggested - # post lock for just one election that a post is associated with) - # to the less expressive mmodel (a suggested post lock is for a - # post, not specifying which election it applies to). So by - # default, this migration will raise an exception to stop you - # losing data on rolling back. If you wish to run this reverse - # migration anyway, (e.g. in your local dev environment) please - # set the environment variable ALLOW_LOSSY_REVERSE_MIGRATIONS to - # '1', in which case the exception won't be raised, and a rollback - # will be attempted anyway. - if os.environ.get("ALLOW_LOSSY_REVERSE_MIGRATIONS") != "1": - raise Exception( - "Cannot reverse the 0019_migrate_post_extra_to_postextraelection " - "migration as it will lose data. See the migration file for " - "details on how to do this anyway." - ) - SuggestedPostLock = apps.get_model("moderation_queue", "SuggestedPostLock") - # Group these by postextra, user and justification: - grouped = defaultdict(list) - for spl in list(SuggestedPostLock.objects.all()): - key = (spl.postextraelection.postextra, spl.user, spl.justification) - grouped[key].append(spl) - # Now just keep one SuggestedPostLock in each of these groups: - for t, spls_in_group in grouped.items(): - to_keep, to_delete_list = spls_in_group[0], spls_in_group[1:] - to_keep.post_extra = to_keep.postextraelection.postextra - to_keep.save() - for to_delete in to_delete_list: - to_delete.delete() - - -class Migration(migrations.Migration): - - dependencies = [ - ("moderation_queue", "0018_suggestedpostlock_postextraelection") - ] - - operations = [ - migrations.RunPython( - migrate_post_extra_to_postextraelection, - migrate_postextraelection_to_post_extra, - ) - ] diff --git a/ynr/apps/moderation_queue/migrations/0020_postextraelection_not_null.py b/ynr/apps/moderation_queue/migrations/0020_postextraelection_not_null.py deleted file mode 100644 index c7b2602edc..0000000000 --- a/ynr/apps/moderation_queue/migrations/0020_postextraelection_not_null.py +++ /dev/null @@ -1,18 +0,0 @@ -from django.db import migrations, models - - -class Migration(migrations.Migration): - - dependencies = [ - ("moderation_queue", "0019_migrate_post_extra_to_postextraelection") - ] - - operations = [ - migrations.AlterField( - model_name="suggestedpostlock", - name="postextraelection", - field=models.ForeignKey( - to="candidates.PostExtraElection", on_delete=models.CASCADE - ), - ) - ] diff --git a/ynr/apps/moderation_queue/migrations/0021_remove_suggestedpostlock_post_extra.py b/ynr/apps/moderation_queue/migrations/0021_remove_suggestedpostlock_post_extra.py deleted file mode 100644 index caaadee91d..0000000000 --- a/ynr/apps/moderation_queue/migrations/0021_remove_suggestedpostlock_post_extra.py +++ /dev/null @@ -1,12 +0,0 @@ -from django.db import migrations - - -class Migration(migrations.Migration): - - dependencies = [("moderation_queue", "0020_postextraelection_not_null")] - - operations = [ - migrations.RemoveField( - model_name="suggestedpostlock", name="post_extra" - ) - ] diff --git a/ynr/apps/moderation_queue/migrations/0022_add_detection_metadata.py b/ynr/apps/moderation_queue/migrations/0022_add_detection_metadata.py deleted file mode 100644 index 85f1d87016..0000000000 --- a/ynr/apps/moderation_queue/migrations/0022_add_detection_metadata.py +++ /dev/null @@ -1,20 +0,0 @@ -# -*- coding: utf-8 -*- -# Generated by Django 1.9.13 on 2018-07-11 14:07 -from __future__ import unicode_literals - -from django.db import migrations, models - - -class Migration(migrations.Migration): - - dependencies = [ - ("moderation_queue", "0021_remove_suggestedpostlock_post_extra") - ] - - operations = [ - migrations.AddField( - model_name="queuedimage", - name="detection_metadata", - field=models.TextField(blank=True), - ) - ] diff --git a/ynr/apps/moderation_queue/migrations/0023_python_3_changes.py b/ynr/apps/moderation_queue/migrations/0023_python_3_changes.py deleted file mode 100644 index ce0abcce57..0000000000 --- a/ynr/apps/moderation_queue/migrations/0023_python_3_changes.py +++ /dev/null @@ -1,57 +0,0 @@ -# -*- coding: utf-8 -*- -# Generated by Django 1.10.8 on 2018-10-03 18:31 -from __future__ import unicode_literals - -from django.db import migrations, models - - -class Migration(migrations.Migration): - - dependencies = [("moderation_queue", "0022_add_detection_metadata")] - - operations = [ - migrations.AlterField( - model_name="queuedimage", - name="decision", - field=models.CharField( - choices=[ - ("approved", "Approved"), - ("rejected", "Rejected"), - ("undecided", "Undecided"), - ("ignore", "Ignore"), - ], - default="undecided", - max_length=32, - ), - ), - migrations.AlterField( - model_name="queuedimage", - name="image", - field=models.ImageField( - max_length=512, upload_to="queued-images/%Y/%m/%d" - ), - ), - migrations.AlterField( - model_name="queuedimage", - name="why_allowed", - field=models.CharField( - choices=[ - ( - "public-domain", - "This photograph is free of any copyright restrictions", - ), - ( - "copyright-assigned", - "I own copyright of this photo and I assign the copyright to Democracy Club Limited in return for it being displayed on this site", - ), - ( - "profile-photo", - "This is the candidate's public profile photo from social media (e.g. Twitter, Facebook) or their official campaign page", - ), - ("other", "Other"), - ], - default="other", - max_length=64, - ), - ), - ] diff --git a/ynr/apps/moderation_queue/migrations/0024_move_person_fk_to_people_app.py b/ynr/apps/moderation_queue/migrations/0024_move_person_fk_to_people_app.py deleted file mode 100644 index f53bf18c2b..0000000000 --- a/ynr/apps/moderation_queue/migrations/0024_move_person_fk_to_people_app.py +++ /dev/null @@ -1,27 +0,0 @@ -# -*- coding: utf-8 -*- -# Generated by Django 1.10.8 on 2018-10-23 19:36 -from __future__ import unicode_literals - -import django.db.models.deletion -from django.db import migrations, models - - -class Migration(migrations.Migration): - - dependencies = [ - ("moderation_queue", "0023_python_3_changes"), - ("people", "0004_move_person_data"), - ] - - operations = [ - migrations.AlterField( - model_name="queuedimage", - name="person", - field=models.ForeignKey( - blank=True, - null=True, - on_delete=django.db.models.deletion.CASCADE, - to="people.Person", - ), - ) - ] diff --git a/ynr/apps/moderation_queue/migrations/0025_cleanup_old_lock_suggestions.py b/ynr/apps/moderation_queue/migrations/0025_cleanup_old_lock_suggestions.py deleted file mode 100644 index b2b3f6b9f8..0000000000 --- a/ynr/apps/moderation_queue/migrations/0025_cleanup_old_lock_suggestions.py +++ /dev/null @@ -1,23 +0,0 @@ -# -*- coding: utf-8 -*- -# Generated by Django 1.11.20 on 2019-03-20 11:03 -from __future__ import unicode_literals - -from django.db import migrations - - -def clean_up_lock_suggestions(apps, schema_editor): - SuggestedPostLock = apps.get_model("moderation_queue", "SuggestedPostLock") - SuggestedPostLock.objects.filter( - postextraelection__election__current=False - ).delete() - - -class Migration(migrations.Migration): - - dependencies = [("moderation_queue", "0024_move_person_fk_to_people_app")] - - operations = [ - migrations.RunPython( - clean_up_lock_suggestions, migrations.RunPython.noop - ) - ] diff --git a/ynr/apps/moderation_queue/migrations/0026_rename_pee_to_ballot.py b/ynr/apps/moderation_queue/migrations/0026_rename_pee_to_ballot.py deleted file mode 100644 index cbfe2fa1de..0000000000 --- a/ynr/apps/moderation_queue/migrations/0026_rename_pee_to_ballot.py +++ /dev/null @@ -1,18 +0,0 @@ -# -*- coding: utf-8 -*- -# Generated by Django 1.11.20 on 2019-06-27 21:06 -from __future__ import unicode_literals - -from django.db import migrations - - -class Migration(migrations.Migration): - - dependencies = [("moderation_queue", "0025_cleanup_old_lock_suggestions")] - - operations = [ - migrations.RenameField( - model_name="suggestedpostlock", - old_name="postextraelection", - new_name="ballot", - ) - ] diff --git a/ynr/apps/moderation_queue/migrations/0027_positive_int_field_update_existing.py b/ynr/apps/moderation_queue/migrations/0027_positive_int_field_update_existing.py deleted file mode 100644 index 0e0e8271d1..0000000000 --- a/ynr/apps/moderation_queue/migrations/0027_positive_int_field_update_existing.py +++ /dev/null @@ -1,20 +0,0 @@ -# Generated by Django 2.2.4 on 2019-10-29 17:04 - -from django.db import migrations - - -def set_ints_to_zero(apps, schema_editor): - QueuedImage = apps.get_model("moderation_queue", "QueuedImage") - for field in ("crop_max_x", "crop_max_y", "crop_min_x", "crop_min_y"): - filter_kwargs = {"{}__lt".format(field): 0} - update_kwargs = {"{}".format(field): 0} - QueuedImage.objects.filter(**filter_kwargs).update(**update_kwargs) - - -class Migration(migrations.Migration): - - dependencies = [("moderation_queue", "0026_rename_pee_to_ballot")] - - operations = [ - migrations.RunPython(set_ints_to_zero, migrations.RunPython.noop) - ] diff --git a/ynr/apps/moderation_queue/migrations/0028_positive_int_field_update_existing.py b/ynr/apps/moderation_queue/migrations/0028_positive_int_field_update_existing.py deleted file mode 100644 index dbe0fa0ee0..0000000000 --- a/ynr/apps/moderation_queue/migrations/0028_positive_int_field_update_existing.py +++ /dev/null @@ -1,33 +0,0 @@ -# Generated by Django 2.2.4 on 2019-10-29 17:33 - -from django.db import migrations, models - - -class Migration(migrations.Migration): - - dependencies = [ - ("moderation_queue", "0027_positive_int_field_update_existing") - ] - - operations = [ - migrations.AlterField( - model_name="queuedimage", - name="crop_max_x", - field=models.PositiveIntegerField(blank=True, null=True), - ), - migrations.AlterField( - model_name="queuedimage", - name="crop_max_y", - field=models.PositiveIntegerField(blank=True, null=True), - ), - migrations.AlterField( - model_name="queuedimage", - name="crop_min_x", - field=models.PositiveIntegerField(blank=True, null=True), - ), - migrations.AlterField( - model_name="queuedimage", - name="crop_min_y", - field=models.PositiveIntegerField(blank=True, null=True), - ), - ] diff --git a/ynr/apps/moderation_queue/migrations/0029_update_image_upload_to.py b/ynr/apps/moderation_queue/migrations/0029_update_image_upload_to.py deleted file mode 100644 index c6a670ab25..0000000000 --- a/ynr/apps/moderation_queue/migrations/0029_update_image_upload_to.py +++ /dev/null @@ -1,22 +0,0 @@ -# Generated by Django 2.2.4 on 2019-11-13 17:29 - -from django.db import migrations, models -import moderation_queue.models - - -class Migration(migrations.Migration): - - dependencies = [ - ("moderation_queue", "0028_positive_int_field_update_existing") - ] - - operations = [ - migrations.AlterField( - model_name="queuedimage", - name="image", - field=models.ImageField( - max_length=512, - upload_to=moderation_queue.models.queued_image_filename, - ), - ) - ] diff --git a/ynr/apps/moderation_queue/migrations/0030_add_very_trusted_user_group.py b/ynr/apps/moderation_queue/migrations/0030_add_very_trusted_user_group.py deleted file mode 100644 index af908ed5c8..0000000000 --- a/ynr/apps/moderation_queue/migrations/0030_add_very_trusted_user_group.py +++ /dev/null @@ -1,22 +0,0 @@ -from django.db import migrations - -from moderation_queue.models import VERY_TRUSTED_USER_GROUP_NAME - - -def add_group(apps, schema_editor): - Group = apps.get_model("auth", "Group") - Group.objects.update_or_create(name=VERY_TRUSTED_USER_GROUP_NAME) - - -def remove_group(apps, schema_editor): - Group = apps.get_model("auth", "Group") - try: - Group.objects.get(name=VERY_TRUSTED_USER_GROUP_NAME).delete() - except Group.DoesNotExist: - pass - - -class Migration(migrations.Migration): - dependencies = [("moderation_queue", "0029_update_image_upload_to")] - - operations = [migrations.RunPython(add_group, remove_group)] diff --git a/ynr/apps/moderation_queue/migrations/0031_suggestedpostlock_ballot_hash.py b/ynr/apps/moderation_queue/migrations/0031_suggestedpostlock_ballot_hash.py deleted file mode 100644 index a473b4b4f5..0000000000 --- a/ynr/apps/moderation_queue/migrations/0031_suggestedpostlock_ballot_hash.py +++ /dev/null @@ -1,17 +0,0 @@ -# Generated by Django 2.2.16 on 2021-03-15 17:10 - -from django.db import migrations, models - - -class Migration(migrations.Migration): - - dependencies = [("moderation_queue", "0030_add_very_trusted_user_group")] - - operations = [ - migrations.AddField( - model_name="suggestedpostlock", - name="ballot_hash", - field=models.CharField(default="", max_length=255), - preserve_default=False, - ) - ] diff --git a/ynr/apps/official_documents/migrations/0001_initial.py b/ynr/apps/official_documents/migrations/0001_initial.py index 4dcf4a92bd..9d0102f0a3 100644 --- a/ynr/apps/official_documents/migrations/0001_initial.py +++ b/ynr/apps/official_documents/migrations/0001_initial.py @@ -1,13 +1,16 @@ -import django.utils.timezone -import django_extensions.db.fields -from django.db import migrations, models +# Generated by Django 3.2.10 on 2021-12-14 17:21 +from django.db import migrations, models +import django.db.models.deletion +import django_extensions.db.fields import official_documents.models class Migration(migrations.Migration): - dependencies = [("candidates", "0041_auto_20180323_1400")] + initial = True + + dependencies = [("candidates", "0001_initial")] operations = [ migrations.CreateModel( @@ -16,28 +19,29 @@ class Migration(migrations.Migration): ( "id", models.AutoField( - verbose_name="ID", - serialize=False, auto_created=True, primary_key=True, + serialize=False, + verbose_name="ID", ), ), ( "created", django_extensions.db.fields.CreationDateTimeField( - default=django.utils.timezone.now, - verbose_name="created", - editable=False, - blank=True, + auto_now_add=True, verbose_name="created" ), ), ( "modified", django_extensions.db.fields.ModificationDateTimeField( - default=django.utils.timezone.now, - verbose_name="modified", - editable=False, - blank=True, + auto_now=True, verbose_name="modified" + ), + ), + ( + "document_type", + models.CharField( + choices=[("Nomination paper", "Nomination paper")], + max_length=100, ), ), ( @@ -47,20 +51,29 @@ class Migration(migrations.Migration): upload_to=official_documents.models.document_file_name, ), ), - ("mapit_id", models.CharField(max_length=50)), ( "source_url", models.URLField( - help_text=b"The page that links to this document", - blank=True, + help_text="The page that links to this document", + max_length=1000, + ), + ), + ( + "relevant_pages", + models.CharField( + max_length=50, + null=True, + verbose_name="The pages containing information about this ballot", + ), + ), + ( + "ballot", + models.ForeignKey( + on_delete=django.db.models.deletion.CASCADE, + to="candidates.ballot", ), ), ], - options={ - "ordering": ("-modified", "-created"), - "abstract": False, - "get_latest_by": "modified", - }, - bases=(models.Model,), + options={"get_latest_by": "modified"}, ) ] diff --git a/ynr/apps/official_documents/migrations/0002_officialdocument_document_type.py b/ynr/apps/official_documents/migrations/0002_officialdocument_document_type.py deleted file mode 100644 index 616a31a768..0000000000 --- a/ynr/apps/official_documents/migrations/0002_officialdocument_document_type.py +++ /dev/null @@ -1,19 +0,0 @@ -from django.db import migrations, models - - -class Migration(migrations.Migration): - - dependencies = [("official_documents", "0001_initial")] - - operations = [ - migrations.AddField( - model_name="officialdocument", - name="document_type", - field=models.CharField( - default="Nomination paper", - max_length=100, - choices=[(b"nomination_paper", b"Nomination paper")], - ), - preserve_default=False, - ) - ] diff --git a/ynr/apps/official_documents/migrations/0003_add_group.py b/ynr/apps/official_documents/migrations/0003_add_group.py deleted file mode 100644 index d092902530..0000000000 --- a/ynr/apps/official_documents/migrations/0003_add_group.py +++ /dev/null @@ -1,25 +0,0 @@ -from django.conf import settings -from django.db import migrations - -from auth_helpers.migrations import ( - get_migration_group_create, - get_migration_group_delete, -) -from official_documents.models import DOCUMENT_UPLOADERS_GROUP_NAME - - -class Migration(migrations.Migration): - - dependencies = [ - migrations.swappable_dependency(settings.AUTH_USER_MODEL), - ("official_documents", "0002_officialdocument_document_type"), - ] - - operations = [ - migrations.RunPython( - get_migration_group_create( - DOCUMENT_UPLOADERS_GROUP_NAME, ["add_officialdocument"] - ), - get_migration_group_delete(DOCUMENT_UPLOADERS_GROUP_NAME), - ) - ] diff --git a/ynr/apps/official_documents/migrations/0004_auto_20150410_1054.py b/ynr/apps/official_documents/migrations/0004_auto_20150410_1054.py deleted file mode 100644 index e2b6e773b5..0000000000 --- a/ynr/apps/official_documents/migrations/0004_auto_20150410_1054.py +++ /dev/null @@ -1,18 +0,0 @@ -from django.db import migrations, models - - -class Migration(migrations.Migration): - - dependencies = [("official_documents", "0003_add_group")] - - operations = [ - migrations.AlterField( - model_name="officialdocument", - name="document_type", - field=models.CharField( - max_length=100, - choices=[(b"Nomination paper", b"Nomination paper")], - ), - preserve_default=True, - ) - ] diff --git a/ynr/apps/official_documents/migrations/0005_auto_20150410_1307.py b/ynr/apps/official_documents/migrations/0005_auto_20150410_1307.py deleted file mode 100644 index 3b67cb1e91..0000000000 --- a/ynr/apps/official_documents/migrations/0005_auto_20150410_1307.py +++ /dev/null @@ -1,19 +0,0 @@ -from django.db import migrations, models - - -class Migration(migrations.Migration): - - dependencies = [("official_documents", "0004_auto_20150410_1054")] - - operations = [ - migrations.AlterField( - model_name="officialdocument", - name="source_url", - field=models.URLField( - help_text=b"The page that links to this document", - max_length=1000, - blank=True, - ), - preserve_default=True, - ) - ] diff --git a/ynr/apps/official_documents/migrations/0006_rename_mapit_id_to_post_id.py b/ynr/apps/official_documents/migrations/0006_rename_mapit_id_to_post_id.py deleted file mode 100644 index 85eadd1e22..0000000000 --- a/ynr/apps/official_documents/migrations/0006_rename_mapit_id_to_post_id.py +++ /dev/null @@ -1,14 +0,0 @@ -from django.db import migrations - - -class Migration(migrations.Migration): - - dependencies = [("official_documents", "0005_auto_20150410_1307")] - - operations = [ - migrations.RenameField( - model_name="officialdocument", - old_name="mapit_id", - new_name="post_id", - ) - ] diff --git a/ynr/apps/official_documents/migrations/0007_officialdocument_election.py b/ynr/apps/official_documents/migrations/0007_officialdocument_election.py deleted file mode 100644 index 6b5d87746e..0000000000 --- a/ynr/apps/official_documents/migrations/0007_officialdocument_election.py +++ /dev/null @@ -1,15 +0,0 @@ -from django.db import migrations, models - - -class Migration(migrations.Migration): - - dependencies = [("official_documents", "0006_rename_mapit_id_to_post_id")] - - operations = [ - migrations.AddField( - model_name="officialdocument", - name="election", - field=models.CharField(max_length=512, null=True, blank=True), - preserve_default=True, - ) - ] diff --git a/ynr/apps/official_documents/migrations/0008_set_default_election.py b/ynr/apps/official_documents/migrations/0008_set_default_election.py deleted file mode 100644 index 7b80363214..0000000000 --- a/ynr/apps/official_documents/migrations/0008_set_default_election.py +++ /dev/null @@ -1,25 +0,0 @@ -from django.db import migrations - -# This migration should only need to run by original YourNextMP -# installations, for the UK 2015 General Election; any future -# installations will set the right election when creating official -# documents. - - -def set_uk_2015_election(apps, schema_editor): - OfficialDocument = apps.get_model("official_documents", "OfficialDocument") - for od in OfficialDocument.objects.all(): - if not od.election: - od.election = "2015" - od.save() - - -class Migration(migrations.Migration): - - dependencies = [("official_documents", "0007_officialdocument_election")] - - operations = [ - migrations.RunPython( - set_uk_2015_election, lambda apps, schema_editor: None - ) - ] diff --git a/ynr/apps/official_documents/migrations/0009_officialdocument_document_post.py b/ynr/apps/official_documents/migrations/0009_officialdocument_document_post.py deleted file mode 100644 index 7650ec2b35..0000000000 --- a/ynr/apps/official_documents/migrations/0009_officialdocument_document_post.py +++ /dev/null @@ -1,23 +0,0 @@ -from django.db import migrations, models - - -class Migration(migrations.Migration): - - dependencies = [ - ("popolo", "0002_update_models_from_upstream"), - ("official_documents", "0008_set_default_election"), - ] - - operations = [ - migrations.AddField( - model_name="officialdocument", - name="document_post", - field=models.ForeignKey( - to="popolo.Post", - blank=True, - null=True, - on_delete=models.CASCADE, - ), - preserve_default=False, - ) - ] diff --git a/ynr/apps/official_documents/migrations/0010_post_id_to_officialdocument.py b/ynr/apps/official_documents/migrations/0010_post_id_to_officialdocument.py deleted file mode 100644 index e35e4ecf6e..0000000000 --- a/ynr/apps/official_documents/migrations/0010_post_id_to_officialdocument.py +++ /dev/null @@ -1,26 +0,0 @@ -from django.db import migrations - - -def post_id_to_post(apps, schema_editor): - Post = apps.get_model("popolo", "post") - Document = apps.get_model("official_documents", "officialdocument") - for d in Document.objects.all(): - d.document_post = Post.objects.get(extra__slug=d.post_id) - d.save() - - -def post_to_post_id(apps, schema_editor): - Document = apps.get_model("official_documents", "officialdocument") - for d in Document.objects.all(): - d.post_id = d.document_post.extra.slug - d.save() - - -class Migration(migrations.Migration): - - dependencies = [ - ("official_documents", "0009_officialdocument_document_post"), - ("candidates", "0009_migrate_to_django_popolo"), - ] - - operations = [migrations.RunPython(post_id_to_post, post_to_post_id)] diff --git a/ynr/apps/official_documents/migrations/0011_officaldocument_to_post_remove_post_id.py b/ynr/apps/official_documents/migrations/0011_officaldocument_to_post_remove_post_id.py deleted file mode 100644 index 6752dd6706..0000000000 --- a/ynr/apps/official_documents/migrations/0011_officaldocument_to_post_remove_post_id.py +++ /dev/null @@ -1,15 +0,0 @@ -from django.db import migrations - - -class Migration(migrations.Migration): - - dependencies = [("official_documents", "0010_post_id_to_officialdocument")] - - operations = [ - migrations.RemoveField(model_name="officialdocument", name="post_id"), - migrations.RenameField( - model_name="officialdocument", - old_name="document_post", - new_name="post", - ), - ] diff --git a/ynr/apps/official_documents/migrations/0012_officialdocument_election_model.py b/ynr/apps/official_documents/migrations/0012_officialdocument_election_model.py deleted file mode 100644 index 60181f41c1..0000000000 --- a/ynr/apps/official_documents/migrations/0012_officialdocument_election_model.py +++ /dev/null @@ -1,22 +0,0 @@ -from django.db import migrations, models - - -class Migration(migrations.Migration): - - dependencies = [ - ("elections", "0007_rename_new_organization_to_organization"), - ("official_documents", "0011_officaldocument_to_post_remove_post_id"), - ] - - operations = [ - migrations.AddField( - model_name="officialdocument", - name="election_model", - field=models.ForeignKey( - blank=True, - to="elections.Election", - null=True, - on_delete=models.CASCADE, - ), - ) - ] diff --git a/ynr/apps/official_documents/migrations/0013_election_id_to_election_model.py b/ynr/apps/official_documents/migrations/0013_election_id_to_election_model.py deleted file mode 100644 index 280526f4eb..0000000000 --- a/ynr/apps/official_documents/migrations/0013_election_id_to_election_model.py +++ /dev/null @@ -1,29 +0,0 @@ -from django.db import migrations - - -def election_to_election_model(apps, schema_editor): - Election = apps.get_model("elections", "election") - Document = apps.get_model("official_documents", "officialdocument") - for doc in Document.objects.all(): - doc.election_model = Election.objects.get(slug=doc.election) - doc.save() - - -def election_model_to_election(apps, schema_editor): - Document = apps.get_model("official_documents", "officialdocument") - for doc in Document.objects.all(): - doc.election = doc.election_model.id - doc.save() - - -class Migration(migrations.Migration): - - dependencies = [ - ("official_documents", "0012_officialdocument_election_model") - ] - - operations = [ - migrations.RunPython( - election_to_election_model, election_model_to_election - ) - ] diff --git a/ynr/apps/official_documents/migrations/0014_remove_officialdocument_election.py b/ynr/apps/official_documents/migrations/0014_remove_officialdocument_election.py deleted file mode 100644 index c0aae468c9..0000000000 --- a/ynr/apps/official_documents/migrations/0014_remove_officialdocument_election.py +++ /dev/null @@ -1,12 +0,0 @@ -from django.db import migrations - - -class Migration(migrations.Migration): - - dependencies = [ - ("official_documents", "0013_election_id_to_election_model") - ] - - operations = [ - migrations.RemoveField(model_name="officialdocument", name="election") - ] diff --git a/ynr/apps/official_documents/migrations/0015_rename_election_model_to_election.py b/ynr/apps/official_documents/migrations/0015_rename_election_model_to_election.py deleted file mode 100644 index 750dab5f6f..0000000000 --- a/ynr/apps/official_documents/migrations/0015_rename_election_model_to_election.py +++ /dev/null @@ -1,16 +0,0 @@ -from django.db import migrations - - -class Migration(migrations.Migration): - - dependencies = [ - ("official_documents", "0014_remove_officialdocument_election") - ] - - operations = [ - migrations.RenameField( - model_name="officialdocument", - old_name="election_model", - new_name="election", - ) - ] diff --git a/ynr/apps/official_documents/migrations/0016_election_not_null.py b/ynr/apps/official_documents/migrations/0016_election_not_null.py deleted file mode 100644 index 3bc4b591db..0000000000 --- a/ynr/apps/official_documents/migrations/0016_election_not_null.py +++ /dev/null @@ -1,18 +0,0 @@ -from django.db import migrations, models - - -class Migration(migrations.Migration): - - dependencies = [ - ("official_documents", "0015_rename_election_model_to_election") - ] - - operations = [ - migrations.AlterField( - model_name="officialdocument", - name="election", - field=models.ForeignKey( - to="elections.Election", on_delete=models.CASCADE - ), - ) - ] diff --git a/ynr/apps/official_documents/migrations/0017_update_django_extensions_datetime_fields.py b/ynr/apps/official_documents/migrations/0017_update_django_extensions_datetime_fields.py deleted file mode 100644 index f500acdd38..0000000000 --- a/ynr/apps/official_documents/migrations/0017_update_django_extensions_datetime_fields.py +++ /dev/null @@ -1,24 +0,0 @@ -import django_extensions.db.fields -from django.db import migrations - - -class Migration(migrations.Migration): - - dependencies = [("official_documents", "0016_election_not_null")] - - operations = [ - migrations.AlterField( - model_name="officialdocument", - name="created", - field=django_extensions.db.fields.CreationDateTimeField( - auto_now_add=True, verbose_name="created" - ), - ), - migrations.AlterField( - model_name="officialdocument", - name="modified", - field=django_extensions.db.fields.ModificationDateTimeField( - auto_now=True, verbose_name="modified" - ), - ), - ] diff --git a/ynr/apps/official_documents/migrations/0018_make_source_url_required.py b/ynr/apps/official_documents/migrations/0018_make_source_url_required.py deleted file mode 100644 index 241512ede7..0000000000 --- a/ynr/apps/official_documents/migrations/0018_make_source_url_required.py +++ /dev/null @@ -1,19 +0,0 @@ -from django.db import migrations, models - - -class Migration(migrations.Migration): - - dependencies = [ - ("official_documents", "0017_update_django_extensions_datetime_fields") - ] - - operations = [ - migrations.AlterField( - model_name="officialdocument", - name="source_url", - field=models.URLField( - help_text="The page that links to this document", - max_length=1000, - ), - ) - ] diff --git a/ynr/apps/official_documents/migrations/0019_officialdocument_post_election.py b/ynr/apps/official_documents/migrations/0019_officialdocument_post_election.py deleted file mode 100644 index a7e4b90b35..0000000000 --- a/ynr/apps/official_documents/migrations/0019_officialdocument_post_election.py +++ /dev/null @@ -1,25 +0,0 @@ -# Generated by Django 1.9.13 on 2018-04-06 10:22 - - -import django.db.models.deletion -from django.db import migrations, models - - -class Migration(migrations.Migration): - - dependencies = [ - ("candidates", "0041_auto_20180323_1400"), - ("official_documents", "0018_make_source_url_required"), - ] - - operations = [ - migrations.AddField( - model_name="officialdocument", - name="post_election", - field=models.ForeignKey( - null=True, - on_delete=django.db.models.deletion.CASCADE, - to="candidates.PostExtraElection", - ), - ) - ] diff --git a/ynr/apps/official_documents/migrations/0020_add_post_election_values.py b/ynr/apps/official_documents/migrations/0020_add_post_election_values.py deleted file mode 100644 index 39c668ff0e..0000000000 --- a/ynr/apps/official_documents/migrations/0020_add_post_election_values.py +++ /dev/null @@ -1,29 +0,0 @@ -# Generated by Django 1.9.13 on 2018-04-06 10:23 - - -from django.db import migrations - - -def add_post_elections(apps, schema_editor): - PostExtraElection = apps.get_model("candidates", "PostExtraElection") - OfficialDocument = apps.get_model("official_documents", "OfficialDocument") - - for doc in OfficialDocument.objects.all().select_related("post__extra"): - pee = PostExtraElection.objects.get( - election=doc.election, postextra=doc.post.extra - ) - doc.post_election = pee - doc.save() - - -def do_nothing(apps, schema_editor): - pass - - -class Migration(migrations.Migration): - - dependencies = [ - ("official_documents", "0019_officialdocument_post_election") - ] - - operations = [migrations.RunPython(add_post_elections, do_nothing)] diff --git a/ynr/apps/official_documents/migrations/0021_auto_20180406_1555.py b/ynr/apps/official_documents/migrations/0021_auto_20180406_1555.py deleted file mode 100644 index 1bd81f1485..0000000000 --- a/ynr/apps/official_documents/migrations/0021_auto_20180406_1555.py +++ /dev/null @@ -1,21 +0,0 @@ -# Generated by Django 1.9.13 on 2018-04-06 14:55 - - -import django.db.models.deletion -from django.db import migrations, models - - -class Migration(migrations.Migration): - - dependencies = [("official_documents", "0020_add_post_election_values")] - - operations = [ - migrations.AlterField( - model_name="officialdocument", - name="post_election", - field=models.ForeignKey( - on_delete=django.db.models.deletion.CASCADE, - to="candidates.PostExtraElection", - ), - ) - ] diff --git a/ynr/apps/official_documents/migrations/0022_python_3_changes.py b/ynr/apps/official_documents/migrations/0022_python_3_changes.py deleted file mode 100644 index a15c5ce0a2..0000000000 --- a/ynr/apps/official_documents/migrations/0022_python_3_changes.py +++ /dev/null @@ -1,21 +0,0 @@ -# -*- coding: utf-8 -*- -# Generated by Django 1.10.8 on 2018-10-03 18:31 -from __future__ import unicode_literals - -from django.db import migrations, models - - -class Migration(migrations.Migration): - - dependencies = [("official_documents", "0021_auto_20180406_1555")] - - operations = [ - migrations.AlterField( - model_name="officialdocument", - name="document_type", - field=models.CharField( - choices=[("Nomination paper", "Nomination paper")], - max_length=100, - ), - ) - ] diff --git a/ynr/apps/official_documents/migrations/0023_remove_election_and_post.py b/ynr/apps/official_documents/migrations/0023_remove_election_and_post.py deleted file mode 100644 index f2515f8e9a..0000000000 --- a/ynr/apps/official_documents/migrations/0023_remove_election_and_post.py +++ /dev/null @@ -1,15 +0,0 @@ -# -*- coding: utf-8 -*- -# Generated by Django 1.11.18 on 2019-02-06 08:13 -from __future__ import unicode_literals - -from django.db import migrations - - -class Migration(migrations.Migration): - - dependencies = [("official_documents", "0022_python_3_changes")] - - operations = [ - migrations.RemoveField(model_name="officialdocument", name="election"), - migrations.RemoveField(model_name="officialdocument", name="post"), - ] diff --git a/ynr/apps/official_documents/migrations/0024_add_relevant_pages.py b/ynr/apps/official_documents/migrations/0024_add_relevant_pages.py deleted file mode 100644 index 096671eac7..0000000000 --- a/ynr/apps/official_documents/migrations/0024_add_relevant_pages.py +++ /dev/null @@ -1,25 +0,0 @@ -# -*- coding: utf-8 -*- -# Generated by Django 1.11.18 on 2019-02-14 10:24 -from __future__ import unicode_literals - -from django.db import migrations, models - - -class Migration(migrations.Migration): - - dependencies = [("official_documents", "0023_remove_election_and_post")] - - operations = [ - migrations.AlterModelOptions( - name="officialdocument", options={"get_latest_by": "modified"} - ), - migrations.AddField( - model_name="officialdocument", - name="relevant_pages", - field=models.CharField( - max_length=50, - null=True, - verbose_name="The pages containing information about this ballot", - ), - ), - ] diff --git a/ynr/apps/official_documents/migrations/0025_rename_post_election_fk_to_ballot.py b/ynr/apps/official_documents/migrations/0025_rename_post_election_fk_to_ballot.py deleted file mode 100644 index 4de1666c31..0000000000 --- a/ynr/apps/official_documents/migrations/0025_rename_post_election_fk_to_ballot.py +++ /dev/null @@ -1,18 +0,0 @@ -# -*- coding: utf-8 -*- -# Generated by Django 1.11.20 on 2019-07-16 13:16 -from __future__ import unicode_literals - -from django.db import migrations - - -class Migration(migrations.Migration): - - dependencies = [("official_documents", "0024_add_relevant_pages")] - - operations = [ - migrations.RenameField( - model_name="officialdocument", - old_name="post_election", - new_name="ballot", - ) - ] diff --git a/ynr/apps/parties/migrations/0001_initial.py b/ynr/apps/parties/migrations/0001_initial.py index 11fe43f9b7..2ba5ec7a47 100644 --- a/ynr/apps/parties/migrations/0001_initial.py +++ b/ynr/apps/parties/migrations/0001_initial.py @@ -1,11 +1,8 @@ -# -*- coding: utf-8 -*- -# Generated by Django 1.10.8 on 2018-09-01 07:31 -from __future__ import unicode_literals +# Generated by Django 3.2.10 on 2021-12-14 17:21 +from django.db import migrations, models import django.db.models.deletion import django_extensions.db.fields -from django.db import migrations, models - import parties.models @@ -40,62 +37,60 @@ class Migration(migrations.Migration): auto_now=True, verbose_name="modified" ), ), - ("ec_id", models.CharField(db_index=True, max_length=20)), - ("name", models.CharField(max_length=255)), ( - "register", - models.CharField(db_index=True, max_length=2, null=True), + "ec_id", + models.CharField( + db_index=True, + help_text="\n An ID issued by The Electoral Commission in their party register,\n with the exception of Democracy Club psuedo IDs for special parties\n ", + max_length=20, + unique=True, + verbose_name="Electoral Commission Idenfitier", + ), ), - ("status", models.CharField(db_index=True, max_length=255)), - ("date_registered", models.DateField()), - ("date_deregistered", models.DateField(null=True)), - ], - options={ - "ordering": ("-modified", "-created"), - "get_latest_by": "modified", - "abstract": False, - }, - ), - migrations.CreateModel( - name="PartyDescription", - fields=[ ( - "id", - models.AutoField( - auto_created=True, - primary_key=True, - serialize=False, - verbose_name="ID", - ), + "name", + models.CharField(max_length=255, verbose_name="Party name"), ), ( - "created", - django_extensions.db.fields.CreationDateTimeField( - auto_now_add=True, verbose_name="created" + "register", + models.CharField( + db_index=True, + help_text="\n Normally either `GB` or `NI` depending on the\n country the party is registered in. Pseudo-parties don't have a\n register, so this field is nullable.\n ", + max_length=2, + null=True, + verbose_name="Party register", ), ), ( - "modified", - django_extensions.db.fields.ModificationDateTimeField( - auto_now=True, verbose_name="modified" + "status", + models.CharField( + choices=[ + ("Registered", "Registered"), + ("Deregistered", "Deregistered"), + ], + db_index=True, + max_length=255, + verbose_name="Party registration status", ), ), - ("description", models.CharField(max_length=800)), - ("date_description_approved", models.DateField(null=True)), + ("date_registered", models.DateField()), + ("date_deregistered", models.DateField(null=True)), ( - "party", - models.ForeignKey( - on_delete=django.db.models.deletion.CASCADE, - related_name="descriptions", - to="parties.Party", + "legacy_slug", + models.CharField( + blank=True, + help_text="\n DEPRECATED: A slug used in URLs that comes from a previous way of modelling parties.\n This field will be removed in the future in favour of the `ec_id`.\n ", + max_length=256, + unique=True, ), ), + ( + "current_candidates", + models.PositiveSmallIntegerField(default=0), + ), + ("total_candidates", models.PositiveIntegerField(default=0)), ], - options={ - "ordering": ("-modified", "-created"), - "get_latest_by": "modified", - "abstract": False, - }, + options={"ordering": ("name",)}, ), migrations.CreateModel( name="PartyEmblem", @@ -114,7 +109,9 @@ class Migration(migrations.Migration): ), ( "ec_emblem_id", - models.IntegerField(primary_key=True, serialize=False), + models.PositiveIntegerField( + primary_key=True, serialize=False + ), ), ( "image", @@ -130,10 +127,47 @@ class Migration(migrations.Migration): models.ForeignKey( on_delete=django.db.models.deletion.CASCADE, related_name="emblems", - to="parties.Party", + to="parties.party", ), ), ], options={"ordering": ("-default", "ec_emblem_id")}, ), + migrations.CreateModel( + name="PartyDescription", + fields=[ + ( + "id", + models.AutoField( + auto_created=True, + primary_key=True, + serialize=False, + verbose_name="ID", + ), + ), + ( + "created", + django_extensions.db.fields.CreationDateTimeField( + auto_now_add=True, verbose_name="created" + ), + ), + ( + "modified", + django_extensions.db.fields.ModificationDateTimeField( + auto_now=True, verbose_name="modified" + ), + ), + ("description", models.CharField(max_length=800)), + ("date_description_approved", models.DateField(null=True)), + ( + "party", + models.ForeignKey( + on_delete=django.db.models.deletion.CASCADE, + related_name="descriptions", + to="parties.party", + ), + ), + ], + options={"get_latest_by": "modified", "abstract": False}, + ), ] diff --git a/ynr/apps/parties/migrations/0002_add_independent_party.py b/ynr/apps/parties/migrations/0002_add_independent_party.py deleted file mode 100644 index dffedb02f4..0000000000 --- a/ynr/apps/parties/migrations/0002_add_independent_party.py +++ /dev/null @@ -1,22 +0,0 @@ -# -*- coding: utf-8 -*- -# Generated by Django 1.10.8 on 2018-09-03 12:14 -from __future__ import unicode_literals - -from django.db import migrations - - -def add_independent_party(apps, schema_editor): - Party = apps.get_model("parties", "Party") - Party.objects.update_or_create( - ec_id="ynmp-party:2", - defaults={"name": "Independent", "date_registered": "1832-06-07"}, - ) - - -class Migration(migrations.Migration): - - dependencies = [("parties", "0001_initial")] - - operations = [ - migrations.RunPython(add_independent_party, migrations.RunPython.noop) - ] diff --git a/ynr/apps/parties/migrations/0003_party_ordering.py b/ynr/apps/parties/migrations/0003_party_ordering.py deleted file mode 100644 index af0203e0b7..0000000000 --- a/ynr/apps/parties/migrations/0003_party_ordering.py +++ /dev/null @@ -1,16 +0,0 @@ -# -*- coding: utf-8 -*- -# Generated by Django 1.10.8 on 2018-09-03 13:46 -from __future__ import unicode_literals - -from django.db import migrations - - -class Migration(migrations.Migration): - - dependencies = [("parties", "0002_add_independent_party")] - - operations = [ - migrations.AlterModelOptions( - name="party", options={"ordering": ("name",)} - ) - ] diff --git a/ynr/apps/parties/migrations/0004_party_legacy_slug.py b/ynr/apps/parties/migrations/0004_party_legacy_slug.py deleted file mode 100644 index c6f4540843..0000000000 --- a/ynr/apps/parties/migrations/0004_party_legacy_slug.py +++ /dev/null @@ -1,18 +0,0 @@ -# -*- coding: utf-8 -*- -# Generated by Django 1.10.8 on 2018-09-03 18:33 -from __future__ import unicode_literals - -from django.db import migrations, models - - -class Migration(migrations.Migration): - - dependencies = [("parties", "0003_party_ordering")] - - operations = [ - migrations.AddField( - model_name="party", - name="legacy_slug", - field=models.CharField(blank=True, max_length=256, unique=False), - ) - ] diff --git a/ynr/apps/parties/migrations/0005_popolate_legacy_slug.py b/ynr/apps/parties/migrations/0005_popolate_legacy_slug.py deleted file mode 100644 index 93352e9bf0..0000000000 --- a/ynr/apps/parties/migrations/0005_popolate_legacy_slug.py +++ /dev/null @@ -1,29 +0,0 @@ -# -*- coding: utf-8 -*- -# Generated by Django 1.10.8 on 2018-09-03 18:33 -from __future__ import unicode_literals - -from django.db import migrations - -from parties.importer import make_slug - - -def add_legacy_slug(apps, schema_editor): - Party = apps.get_model("parties", "Party") - for party in Party.objects.all(): - party.legacy_slug = make_slug(party.ec_id) - party.save() - ind = Party.objects.get(ec_id="ynmp-party:2") - ind.legacy_slug = "ynmp-party:2" - ind.save() - - -class Migration(migrations.Migration): - - dependencies = [ - ("parties", "0004_party_legacy_slug"), - ("popolo", "0015_move_organization_to_parties"), - ] - - operations = [ - migrations.RunPython(add_legacy_slug, migrations.RunPython.noop) - ] diff --git a/ynr/apps/parties/migrations/0006_legacy_slug_unique.py b/ynr/apps/parties/migrations/0006_legacy_slug_unique.py deleted file mode 100644 index f40d00c1e3..0000000000 --- a/ynr/apps/parties/migrations/0006_legacy_slug_unique.py +++ /dev/null @@ -1,18 +0,0 @@ -# -*- coding: utf-8 -*- -# Generated by Django 1.10.8 on 2018-09-03 18:37 -from __future__ import unicode_literals - -from django.db import migrations, models - - -class Migration(migrations.Migration): - - dependencies = [("parties", "0005_popolate_legacy_slug")] - - operations = [ - migrations.AlterField( - model_name="party", - name="legacy_slug", - field=models.CharField(blank=True, max_length=256, unique=True), - ) - ] diff --git a/ynr/apps/parties/migrations/0007_add_speaker.py b/ynr/apps/parties/migrations/0007_add_speaker.py deleted file mode 100644 index 8f9ce1e793..0000000000 --- a/ynr/apps/parties/migrations/0007_add_speaker.py +++ /dev/null @@ -1,24 +0,0 @@ -# -*- coding: utf-8 -*- -# Generated by Django 1.10.8 on 2018-09-03 12:14 -from __future__ import unicode_literals - -from django.db import migrations - - -def add_speaker(apps, schema_editor): - Party = apps.get_model("parties", "Party") - Party.objects.update_or_create( - ec_id="ynmp-party:12522", - legacy_slug="ynmp-party:12522", - defaults={ - "name": "Speaker seeking re-election", - "date_registered": "1376-04-28", - }, - ) - - -class Migration(migrations.Migration): - - dependencies = [("parties", "0006_legacy_slug_unique")] - - operations = [migrations.RunPython(add_speaker, migrations.RunPython.noop)] diff --git a/ynr/apps/parties/migrations/0008_unique_ec_id.py b/ynr/apps/parties/migrations/0008_unique_ec_id.py deleted file mode 100644 index 189bbc4f6c..0000000000 --- a/ynr/apps/parties/migrations/0008_unique_ec_id.py +++ /dev/null @@ -1,18 +0,0 @@ -# -*- coding: utf-8 -*- -# Generated by Django 1.10.8 on 2018-09-06 14:51 -from __future__ import unicode_literals - -from django.db import migrations, models - - -class Migration(migrations.Migration): - - dependencies = [("parties", "0007_add_speaker")] - - operations = [ - migrations.AlterField( - model_name="party", - name="ec_id", - field=models.CharField(db_index=True, max_length=20, unique=True), - ) - ] diff --git a/ynr/apps/parties/migrations/0009_slug_help_text.py b/ynr/apps/parties/migrations/0009_slug_help_text.py deleted file mode 100644 index f8f7ce4222..0000000000 --- a/ynr/apps/parties/migrations/0009_slug_help_text.py +++ /dev/null @@ -1,23 +0,0 @@ -# -*- coding: utf-8 -*- -# Generated by Django 1.10.8 on 2018-10-03 18:31 -from __future__ import unicode_literals - -from django.db import migrations, models - - -class Migration(migrations.Migration): - - dependencies = [("parties", "0008_unique_ec_id")] - - operations = [ - migrations.AlterField( - model_name="party", - name="legacy_slug", - field=models.CharField( - blank=True, - help_text="\n A slug used in URLs that comes from the old OrganizationExtra model. \n This field will be removed in the future in favour of the ec_id, \n but it's required until then", - max_length=256, - unique=True, - ), - ) - ] diff --git a/ynr/apps/parties/migrations/0010_add_candidate_totals.py b/ynr/apps/parties/migrations/0010_add_candidate_totals.py deleted file mode 100644 index 94aab25f09..0000000000 --- a/ynr/apps/parties/migrations/0010_add_candidate_totals.py +++ /dev/null @@ -1,23 +0,0 @@ -# -*- coding: utf-8 -*- -# Generated by Django 1.11.20 on 2019-03-20 10:09 -from __future__ import unicode_literals - -from django.db import migrations, models - - -class Migration(migrations.Migration): - - dependencies = [("parties", "0009_slug_help_text")] - - operations = [ - migrations.AddField( - model_name="party", - name="current_candidates", - field=models.IntegerField(default=0), - ), - migrations.AddField( - model_name="party", - name="total_candidates", - field=models.IntegerField(default=0), - ), - ] diff --git a/ynr/apps/parties/migrations/0011_add_initial_candidates_counts.py b/ynr/apps/parties/migrations/0011_add_initial_candidates_counts.py deleted file mode 100644 index 61ede113b9..0000000000 --- a/ynr/apps/parties/migrations/0011_add_initial_candidates_counts.py +++ /dev/null @@ -1,27 +0,0 @@ -# -*- coding: utf-8 -*- -# Generated by Django 1.11.20 on 2019-03-22 11:39 -from __future__ import unicode_literals - -from django.db import migrations - - -def populate_initial_candidate_counts(apps, schema_editor): - Party = apps.get_model("parties", "Party") - parties_qs = Party.objects.all() - for party in parties_qs: - party.total_candidates = party.membership_set.count() - party.current_candidates = party.membership_set.filter( - post_election__election__current=True - ).count() - party.save() - - -class Migration(migrations.Migration): - - dependencies = [("parties", "0010_add_candidate_totals")] - - operations = [ - migrations.RunPython( - populate_initial_candidate_counts, migrations.RunPython.noop - ) - ] diff --git a/ynr/apps/parties/migrations/0012_add_party_docs.py b/ynr/apps/parties/migrations/0012_add_party_docs.py deleted file mode 100644 index aa0ee5972b..0000000000 --- a/ynr/apps/parties/migrations/0012_add_party_docs.py +++ /dev/null @@ -1,78 +0,0 @@ -# Generated by Django 2.2.4 on 2019-10-29 17:04 - -from django.db import migrations, models - - -class Migration(migrations.Migration): - - dependencies = [("parties", "0011_add_initial_candidates_counts")] - - operations = [ - migrations.AlterField( - model_name="party", - name="current_candidates", - field=models.PositiveSmallIntegerField(default=0), - ), - migrations.AlterField( - model_name="party", - name="ec_id", - field=models.CharField( - db_index=True, - help_text="\n An ID issued by The Electoral Commission in their party register,\n with the exception of Democracy Club psuedo IDs for special parties\n ", - max_length=20, - unique=True, - verbose_name="Electoral Commission Idenfitier", - ), - ), - migrations.AlterField( - model_name="party", - name="legacy_slug", - field=models.CharField( - blank=True, - help_text="\n DEPRECATED: A slug used in URLs that comes from a previous way of modelling parties.\n This field will be removed in the future in favour of the `ec_id`.\n ", - max_length=256, - unique=True, - ), - ), - migrations.AlterField( - model_name="party", - name="name", - field=models.CharField(max_length=255, verbose_name="Party name"), - ), - migrations.AlterField( - model_name="party", - name="register", - field=models.CharField( - db_index=True, - help_text="\n Normally either `GB` or `NI` depending on the\n country the party is registered in. Pseudo-parties don't have a\n register, so this field is nullable.\n ", - max_length=2, - null=True, - verbose_name="Party register", - ), - ), - migrations.AlterField( - model_name="party", - name="status", - field=models.CharField( - choices=[ - ("Registered", "Registered"), - ("Deregistered", "Deregistered"), - ], - db_index=True, - max_length=255, - verbose_name="Party registration status", - ), - ), - migrations.AlterField( - model_name="party", - name="total_candidates", - field=models.PositiveIntegerField(default=0), - ), - migrations.AlterField( - model_name="partyemblem", - name="ec_emblem_id", - field=models.PositiveIntegerField( - primary_key=True, serialize=False - ), - ), - ] diff --git a/ynr/apps/parties/migrations/0013_add_independent_descriptions.py b/ynr/apps/parties/migrations/0013_add_independent_descriptions.py deleted file mode 100644 index f221ea9334..0000000000 --- a/ynr/apps/parties/migrations/0013_add_independent_descriptions.py +++ /dev/null @@ -1,21 +0,0 @@ -# Generated by Django 2.2.18 on 2021-04-06 07:47 - -from django.db import migrations - - -def add_independent_party_descriptions(apps, schema_editor): - Party = apps.get_model("parties", "Party") - party = Party.objects.get(ec_id="ynmp-party:2") - for i, desc in enumerate(["[blank]", "[No party listed]"]): - party.descriptions.update_or_create(description=desc) - - -class Migration(migrations.Migration): - - dependencies = [("parties", "0012_add_party_docs")] - - operations = [ - migrations.RunPython( - add_independent_party_descriptions, migrations.RunPython.noop - ) - ] diff --git a/ynr/apps/parties/migrations/0014_alter_partydescription_options.py b/ynr/apps/parties/migrations/0014_alter_partydescription_options.py deleted file mode 100644 index ddf68ab831..0000000000 --- a/ynr/apps/parties/migrations/0014_alter_partydescription_options.py +++ /dev/null @@ -1,14 +0,0 @@ -# Generated by Django 3.2.4 on 2021-09-28 09:07 - -from django.db import migrations - - -class Migration(migrations.Migration): - - dependencies = [("parties", "0013_add_independent_descriptions")] - - operations = [ - migrations.AlterModelOptions( - name="partydescription", options={"get_latest_by": "modified"} - ) - ] diff --git a/ynr/apps/people/migrations/0001_initial.py b/ynr/apps/people/migrations/0001_initial.py index dd021a11a7..1c18cd554e 100644 --- a/ynr/apps/people/migrations/0001_initial.py +++ b/ynr/apps/people/migrations/0001_initial.py @@ -1,11 +1,11 @@ -# -*- coding: utf-8 -*- -# Generated by Django 1.10.8 on 2018-09-20 11:20 -from __future__ import unicode_literals +# Generated by Django 3.2.10 on 2021-12-14 17:21 -import django.db.models.deletion from django.conf import settings +import django.contrib.postgres.indexes +import django.contrib.postgres.search from django.db import migrations, models - +import django.db.models.deletion +import django_extensions.db.fields import people.models @@ -14,11 +14,221 @@ class Migration(migrations.Migration): initial = True dependencies = [ + ("elections", "0001_initial"), migrations.swappable_dependency(settings.AUTH_USER_MODEL), - ("popolo", "0021_auto_20180918_1534"), ] operations = [ + migrations.CreateModel( + name="Person", + fields=[ + ( + "id", + models.AutoField( + auto_created=True, + primary_key=True, + serialize=False, + verbose_name="ID", + ), + ), + ( + "created", + django_extensions.db.fields.CreationDateTimeField( + auto_now_add=True, verbose_name="created" + ), + ), + ( + "modified", + django_extensions.db.fields.ModificationDateTimeField( + auto_now=True, verbose_name="modified" + ), + ), + ( + "name", + models.CharField( + help_text="A person's preferred full name", + max_length=512, + verbose_name="name", + ), + ), + ( + "family_name", + models.CharField( + blank=True, + help_text="One or more family names", + max_length=128, + verbose_name="family name", + ), + ), + ( + "given_name", + models.CharField( + blank=True, + help_text="One or more primary given names", + max_length=128, + verbose_name="given name", + ), + ), + ( + "additional_name", + models.CharField( + blank=True, + help_text="One or more secondary given names", + max_length=128, + verbose_name="additional name", + ), + ), + ( + "honorific_prefix", + models.CharField( + blank=True, + help_text="One or more honorifics preceding a person's name", + max_length=128, + verbose_name="honorific prefix", + ), + ), + ( + "honorific_suffix", + models.CharField( + blank=True, + help_text="One or more honorifics following a person's name", + max_length=128, + verbose_name="honorific suffix", + ), + ), + ( + "patronymic_name", + models.CharField( + blank=True, + help_text="One or more patronymic names", + max_length=128, + verbose_name="patronymic name", + ), + ), + ( + "sort_name", + models.CharField( + blank=True, + help_text="A name to use in an lexicographically ordered list", + max_length=128, + verbose_name="sort name", + ), + ), + ( + "gender", + models.CharField( + blank=True, + help_text="A gender", + max_length=128, + verbose_name="gender", + ), + ), + ( + "birth_date", + models.CharField( + blank=True, + help_text="A year of birth", + max_length=4, + verbose_name="birth date", + ), + ), + ( + "death_date", + models.CharField( + blank=True, + help_text="A date of death", + max_length=20, + verbose_name="death date", + ), + ), + ( + "summary", + models.CharField( + blank=True, + help_text="A one-line account of a person's life", + max_length=1024, + verbose_name="summary", + ), + ), + ( + "biography", + models.TextField( + blank=True, + help_text="An extended account of a person's life", + verbose_name="biography", + ), + ), + ( + "national_identity", + models.CharField( + blank=True, + help_text="A national identity", + max_length=128, + null=True, + verbose_name="national identity", + ), + ), + ("versions", models.JSONField(default=list)), + ( + "favourite_biscuit", + models.CharField( + max_length=255, + null=True, + verbose_name="Favourite biscuit 🍪", + ), + ), + ( + "edit_limitations", + models.CharField( + blank=True, + choices=[ + ("NEEDS_REVIEW", "Needs review"), + ("EDITS_PREVENTED", "Edits prevented"), + ], + max_length=100, + ), + ), + ( + "name_search_vector", + django.contrib.postgres.search.SearchVectorField(null=True), + ), + ( + "not_standing", + models.ManyToManyField( + related_name="persons_not_standing_tmp", + to="elections.Election", + ), + ), + ], + options={"verbose_name_plural": "People"}, + ), + migrations.CreateModel( + name="PersonNameSynonym", + fields=[ + ( + "id", + models.AutoField( + auto_created=True, + primary_key=True, + serialize=False, + verbose_name="ID", + ), + ), + ( + "term", + django.contrib.postgres.search.SearchQueryField( + help_text="The term entered" + ), + ), + ( + "synonym", + django.contrib.postgres.search.SearchQueryField( + help_text="An alternative word for the term" + ), + ), + ], + options={"ordering": ("-term",)}, + ), migrations.CreateModel( name="PersonImage", fields=[ @@ -57,7 +267,8 @@ class Migration(migrations.Migration): "person", models.ForeignKey( on_delete=django.db.models.deletion.CASCADE, - to="popolo.Person", + related_name="images", + to="people.person", ), ), ( @@ -70,5 +281,105 @@ class Migration(migrations.Migration): ), ), ], - ) + ), + migrations.CreateModel( + name="GenderGuess", + fields=[ + ( + "id", + models.AutoField( + auto_created=True, + primary_key=True, + serialize=False, + verbose_name="ID", + ), + ), + ("gender", models.CharField(max_length=1)), + ( + "person", + models.OneToOneField( + on_delete=django.db.models.deletion.CASCADE, + related_name="gender_guess", + to="people.person", + ), + ), + ], + ), + migrations.CreateModel( + name="PersonIdentifier", + fields=[ + ( + "id", + models.AutoField( + auto_created=True, + primary_key=True, + serialize=False, + verbose_name="ID", + ), + ), + ( + "created", + django_extensions.db.fields.CreationDateTimeField( + auto_now_add=True, verbose_name="created" + ), + ), + ( + "modified", + django_extensions.db.fields.ModificationDateTimeField( + auto_now=True, verbose_name="modified" + ), + ), + ( + "value", + models.CharField( + help_text="An identifier e.g a URL or username provided by a 3rd party", + max_length=800, + ), + ), + ( + "internal_identifier", + models.CharField( + help_text="An optional internal identifier from the 3rd party", + max_length=800, + null=True, + ), + ), + ( + "value_type", + models.CharField( + help_text="A label for the type of value e.g. 'Twitter', 'Person blog'", + max_length=100, + ), + ), + ( + "extra_data", + models.JSONField( + default=dict, + help_text="For storing any additional data against this field.\n Used by bots, not humans.", + ), + ), + ( + "person", + models.ForeignKey( + on_delete=django.db.models.deletion.CASCADE, + related_name="tmp_person_identifiers", + to="people.person", + ), + ), + ], + options={ + "ordering": ("value_type", "-modified"), + "unique_together": { + ("person", "internal_identifier", "value_type"), + ("person", "value"), + ("person", "value_type"), + }, + }, + ), + migrations.AddIndex( + model_name="person", + index=django.contrib.postgres.indexes.GistIndex( + fields=["name_search_vector"], name="name_vector_search_index" + ), + ), ] diff --git a/ynr/apps/people/migrations/0002_change_related_name.py b/ynr/apps/people/migrations/0002_change_related_name.py deleted file mode 100644 index 56f31f29f2..0000000000 --- a/ynr/apps/people/migrations/0002_change_related_name.py +++ /dev/null @@ -1,23 +0,0 @@ -# -*- coding: utf-8 -*- -# Generated by Django 1.10.8 on 2018-10-03 18:31 -from __future__ import unicode_literals - -import django.db.models.deletion -from django.db import migrations, models - - -class Migration(migrations.Migration): - - dependencies = [("people", "0001_initial")] - - operations = [ - migrations.AlterField( - model_name="personimage", - name="person", - field=models.ForeignKey( - on_delete=django.db.models.deletion.CASCADE, - related_name="images", - to="popolo.Person", - ), - ) - ] diff --git a/ynr/apps/people/migrations/0003_add_person_model.py b/ynr/apps/people/migrations/0003_add_person_model.py deleted file mode 100644 index 91cbb3a67b..0000000000 --- a/ynr/apps/people/migrations/0003_add_person_model.py +++ /dev/null @@ -1,240 +0,0 @@ -# -*- coding: utf-8 -*- -# Generated by Django 1.10.8 on 2018-10-23 17:46 -from __future__ import unicode_literals - -import django.core.validators -import django.db.models.deletion -import django.utils.timezone -import model_utils.fields -from django.db import migrations, models - -import popolo.behaviors.models - - -class Migration(migrations.Migration): - - dependencies = [ - ("elections", "0013_remove_area"), - ("elections", "0013_remove_area"), - ("people", "0002_change_related_name"), - ] - - operations = [ - migrations.CreateModel( - name="Person", - fields=[ - ( - "id", - models.AutoField( - auto_created=True, - primary_key=True, - serialize=False, - verbose_name="ID", - ), - ), - ( - "start_date", - models.CharField( - blank=True, - help_text="The date when the validity of the item starts", - max_length=10, - null=True, - validators=[ - django.core.validators.RegexValidator( - message="Date has wrong format", - regex="^[0-9]{4}(-[0-9]{2}){0,2}$", - ), - popolo.behaviors.models.validate_partial_date, - ], - verbose_name="start date", - ), - ), - ( - "end_date", - models.CharField( - blank=True, - help_text="The date when the validity of the item ends", - max_length=10, - null=True, - validators=[ - django.core.validators.RegexValidator( - message="Date has wrong format", - regex="^[0-9]{4}(-[0-9]{2}){0,2}$", - ), - popolo.behaviors.models.validate_partial_date, - ], - verbose_name="end date", - ), - ), - ( - "created_at", - model_utils.fields.AutoCreatedField( - default=django.utils.timezone.now, - editable=False, - verbose_name="creation time", - ), - ), - ( - "updated_at", - model_utils.fields.AutoLastModifiedField( - default=django.utils.timezone.now, - editable=False, - verbose_name="last modification time", - ), - ), - ( - "name", - models.CharField( - help_text="A person's preferred full name", - max_length=512, - verbose_name="name", - ), - ), - ( - "family_name", - models.CharField( - blank=True, - help_text="One or more family names", - max_length=128, - verbose_name="family name", - ), - ), - ( - "given_name", - models.CharField( - blank=True, - help_text="One or more primary given names", - max_length=128, - verbose_name="given name", - ), - ), - ( - "additional_name", - models.CharField( - blank=True, - help_text="One or more secondary given names", - max_length=128, - verbose_name="additional name", - ), - ), - ( - "honorific_prefix", - models.CharField( - blank=True, - help_text="One or more honorifics preceding a person's name", - max_length=128, - verbose_name="honorific prefix", - ), - ), - ( - "honorific_suffix", - models.CharField( - blank=True, - help_text="One or more honorifics following a person's name", - max_length=128, - verbose_name="honorific suffix", - ), - ), - ( - "patronymic_name", - models.CharField( - blank=True, - help_text="One or more patronymic names", - max_length=128, - verbose_name="patronymic name", - ), - ), - ( - "sort_name", - models.CharField( - blank=True, - help_text="A name to use in an lexicographically ordered list", - max_length=128, - verbose_name="sort name", - ), - ), - ( - "email", - models.EmailField( - blank=True, - help_text="A preferred email address", - max_length=254, - null=True, - verbose_name="email", - ), - ), - ( - "gender", - models.CharField( - blank=True, - help_text="A gender", - max_length=128, - verbose_name="gender", - ), - ), - ( - "birth_date", - models.CharField( - blank=True, - help_text="A date of birth", - max_length=10, - verbose_name="birth date", - ), - ), - ( - "death_date", - models.CharField( - blank=True, - help_text="A date of death", - max_length=10, - verbose_name="death date", - ), - ), - ( - "summary", - models.CharField( - blank=True, - help_text="A one-line account of a person's life", - max_length=1024, - verbose_name="summary", - ), - ), - ( - "biography", - models.TextField( - blank=True, - help_text="An extended account of a person's life", - verbose_name="biography", - ), - ), - ( - "national_identity", - models.CharField( - blank=True, - help_text="A national identity", - max_length=128, - null=True, - verbose_name="national identity", - ), - ), - ("versions", models.TextField(blank=True)), - ( - "not_standing", - models.ManyToManyField( - related_name="persons_not_standing_tmp", - to="elections.Election", - ), - ), - ], - options={"verbose_name_plural": "People"}, - ), - migrations.AlterField( - model_name="personimage", - name="person", - field=models.ForeignKey( - on_delete=django.db.models.deletion.CASCADE, - related_name="images", - to="popolo.Person", - ), - ), - ] diff --git a/ynr/apps/people/migrations/0004_move_person_data.py b/ynr/apps/people/migrations/0004_move_person_data.py deleted file mode 100644 index a49545c59e..0000000000 --- a/ynr/apps/people/migrations/0004_move_person_data.py +++ /dev/null @@ -1,55 +0,0 @@ -# -*- coding: utf-8 -*- -# Generated by Django 1.10.8 on 2018-10-23 18:45 -from __future__ import unicode_literals - -from django.db import migrations - - -def move_person_from_popolo(apps, schema_editor): - PopoloPerson = apps.get_model("popolo", "Person") - PeoplePerson = apps.get_model("people", "Person") - - for pperson in PopoloPerson.objects.all(): - people_person = PeoplePerson.objects.create( - pk=pperson.pk, - start_date=pperson.start_date, - end_date=pperson.end_date, - created_at=pperson.created_at, - updated_at=pperson.updated_at, - name=pperson.name, - family_name=pperson.family_name, - given_name=pperson.given_name, - additional_name=pperson.additional_name, - honorific_prefix=pperson.honorific_prefix, - honorific_suffix=pperson.honorific_suffix, - patronymic_name=pperson.patronymic_name, - sort_name=pperson.sort_name, - email=pperson.email, - gender=pperson.gender, - birth_date=pperson.birth_date, - death_date=pperson.death_date, - summary=pperson.summary, - biography=pperson.biography, - national_identity=pperson.national_identity, - versions=pperson.versions, - ) - for election in pperson.not_standing.all(): - people_person.not_standing.add(election) - - -class Migration(migrations.Migration): - - dependencies = [("people", "0003_add_person_model")] - - operations = [ - migrations.RunPython( - move_person_from_popolo, migrations.RunPython.noop - ), - migrations.RunSQL( - """ - SELECT setval('people_person_id_seq', COALESCE((SELECT MAX(id)+1 - FROM people_person), 1)); - """, - migrations.RunSQL.noop, - ), - ] diff --git a/ynr/apps/people/migrations/0005_move_person_image_fk_to_person_app.py b/ynr/apps/people/migrations/0005_move_person_image_fk_to_person_app.py deleted file mode 100644 index 4459811436..0000000000 --- a/ynr/apps/people/migrations/0005_move_person_image_fk_to_person_app.py +++ /dev/null @@ -1,23 +0,0 @@ -# -*- coding: utf-8 -*- -# Generated by Django 1.10.8 on 2018-10-23 19:54 -from __future__ import unicode_literals - -import django.db.models.deletion -from django.db import migrations, models - - -class Migration(migrations.Migration): - - dependencies = [("people", "0004_move_person_data")] - - operations = [ - migrations.AlterField( - model_name="personimage", - name="person", - field=models.ForeignKey( - on_delete=django.db.models.deletion.CASCADE, - related_name="images", - to="people.Person", - ), - ) - ] diff --git a/ynr/apps/people/migrations/0006_move_person_gfks.py b/ynr/apps/people/migrations/0006_move_person_gfks.py deleted file mode 100644 index 753875e598..0000000000 --- a/ynr/apps/people/migrations/0006_move_person_gfks.py +++ /dev/null @@ -1,38 +0,0 @@ -# -*- coding: utf-8 -*- -# Generated by Django 1.10.8 on 2018-10-29 15:10 -from __future__ import unicode_literals - -from django.db import migrations - - -def move_popolo_person_gfks_to_people_person(apps, schema_editor): - PeoplePerson = apps.get_model("people", "Person") - PopoloPerson = apps.get_model("popolo", "Person") - ContentType = apps.get_model("contenttypes", "ContentType") - - models = [ - apps.get_model("popolo", "Link"), - apps.get_model("popolo", "OtherName"), - apps.get_model("popolo", "ContactDetail"), - apps.get_model("popolo", "Identifier"), - apps.get_model("popolo", "Source"), - ] - - people_person_ct = ContentType.objects.get_for_model(PeoplePerson).pk - popolo_person_ct = ContentType.objects.get_for_model(PopoloPerson).pk - - for model in models: - model.objects.filter(content_type=popolo_person_ct).update( - content_type=people_person_ct - ) - - -class Migration(migrations.Migration): - - dependencies = [("people", "0005_move_person_image_fk_to_person_app")] - - operations = [ - migrations.RunPython( - move_popolo_person_gfks_to_people_person, migrations.RunPython.noop - ) - ] diff --git a/ynr/apps/people/migrations/0007_remove_dateframe.py b/ynr/apps/people/migrations/0007_remove_dateframe.py deleted file mode 100644 index d63cafb74a..0000000000 --- a/ynr/apps/people/migrations/0007_remove_dateframe.py +++ /dev/null @@ -1,15 +0,0 @@ -# -*- coding: utf-8 -*- -# Generated by Django 1.10.8 on 2018-10-24 18:02 -from __future__ import unicode_literals - -from django.db import migrations - - -class Migration(migrations.Migration): - - dependencies = [("people", "0006_move_person_gfks")] - - operations = [ - migrations.RemoveField(model_name="person", name="end_date"), - migrations.RemoveField(model_name="person", name="start_date"), - ] diff --git a/ynr/apps/people/migrations/0008_person_identifier_model.py b/ynr/apps/people/migrations/0008_person_identifier_model.py deleted file mode 100644 index d2a7032aa1..0000000000 --- a/ynr/apps/people/migrations/0008_person_identifier_model.py +++ /dev/null @@ -1,87 +0,0 @@ -# -*- coding: utf-8 -*- -# Generated by Django 1.10.8 on 2018-10-29 14:47 -from __future__ import unicode_literals - -import django.contrib.postgres.fields.jsonb -import django.db.models.deletion -import django_extensions.db.fields -from django.db import migrations, models - - -class Migration(migrations.Migration): - - dependencies = [("people", "0007_remove_dateframe")] - - operations = [ - migrations.CreateModel( - name="PersonIdentifier", - fields=[ - ( - "id", - models.AutoField( - auto_created=True, - primary_key=True, - serialize=False, - verbose_name="ID", - ), - ), - ( - "created", - django_extensions.db.fields.CreationDateTimeField( - auto_now_add=True, verbose_name="created" - ), - ), - ( - "modified", - django_extensions.db.fields.ModificationDateTimeField( - auto_now=True, verbose_name="modified" - ), - ), - ( - "value", - models.CharField( - help_text="An identifier e.g a URL or username provided by a 3rd party", - max_length=800, - ), - ), - ( - "internal_identifier", - models.CharField( - help_text="An optional internal identifier from the 3rd party", - max_length=800, - null=True, - ), - ), - ( - "value_type", - models.CharField( - help_text="A label for the type of value e.g. 'Twitter', 'Person blog'", - max_length=100, - ), - ), - ( - "extra_data", - django.contrib.postgres.fields.jsonb.JSONField( - help_text="For storing any additional data against this field. \n Used by bots, not humans.", - null=True, - ), - ), - ( - "person", - models.ForeignKey( - on_delete=django.db.models.deletion.CASCADE, - to="people.Person", - ), - ), - ], - ), - migrations.AlterUniqueTogether( - name="personidentifier", - unique_together=set( - [ - ("person", "internal_identifier", "value_type"), - ("person", "value"), - ] - ), - ), - ] diff --git a/ynr/apps/people/migrations/0009_copy_popolo_fields_to_person_identifiers.py b/ynr/apps/people/migrations/0009_copy_popolo_fields_to_person_identifiers.py deleted file mode 100644 index 46ac7b0375..0000000000 --- a/ynr/apps/people/migrations/0009_copy_popolo_fields_to_person_identifiers.py +++ /dev/null @@ -1,117 +0,0 @@ -# -*- coding: utf-8 -*- -# Generated by Django 1.10.8 on 2018-10-29 15:30 -from __future__ import unicode_literals - -from django.db import migrations - - -def populate_person_identifier_from_popolo_models(apps, schema_editor): - Person = apps.get_model("people", "Person") - PersonIdentifier = apps.get_model("people", "PersonIdentifier") - ContentType = apps.get_model("contenttypes", "ContentType") - ComplexPopoloField = apps.get_model("candidates", "ComplexPopoloField") - - person_ct = ContentType.objects.get_for_model(Person).pk - - # The ComplexPopoloField model stores "name" and "info_type" for each field - # we care about. The "note" field on e.g. the Link model stores the value - # of "info_type", but we want to convert that to using "name", so we'll - # make a mapping here. - - # The reason for this is that the "note" /"info_type" value is something - # like `party candidate page` whereas the "name" is a python-var-safe - # `party_ppc_page_url`. - cpf_info_type_to_name = { - cpf.info_type: cpf.name for cpf in ComplexPopoloField.objects.all() - } - # Add this manually as the value was changed in the past - cpf_info_type_to_name["party PPC page"] = "party_ppc_page_url" - - # Models we want to move - Link = apps.get_model("popolo", "Link") - ContactDetail = apps.get_model("popolo", "ContactDetail") - Identifier = apps.get_model("popolo", "Identifier") - - # Links - # We can't simply copy the links over as there is a new unique constraint - # on (person, value) that didn't exist on popolo.Link. - # In the live data there are over 300 people with duplicate links - # This method will only copy one of them. No link data will be lost, - # but it's possible that the wrong `value_type` will be selected. - # This is something that a human needs to look at, and not something we're - # making worse by removing a duplicate. A list of all the problem values - # can be made before running this migration. - qs = Link.objects.filter(content_type=person_ct) - links_by_person = {} - links_to_move = [] - for link in qs: - person_id = link.object_id - if person_id not in links_by_person: - links_by_person[person_id] = set() - - if link.url in links_by_person[person_id]: - # Ignore this link if we've seen it for this person before - # and assume the previous `value_type` is ok to use (it won't - # always be) - continue - - links_by_person[person_id].add(link.url) - - links_to_move.append( - PersonIdentifier( - value=link.url, - person_id=link.object_id, - value_type=cpf_info_type_to_name[link.note], - ) - ) - PersonIdentifier.objects.bulk_create(links_to_move) - - # Contact Detail - # Exclude contact_type="TWITTER" (upper case) as there is some old data - # with this value that's duplicated in contact_type="twitter" (lower case) - # We can safely delete this data. (4 rows at the time of writing) - # AFIK "TWITTER" was a legacy from some older version of YNR/Popit - qs = ContactDetail.objects.filter(content_type=person_ct).exclude( - contact_type="TWITTER" - ) - contact_detail_to_move = [] - for contact_detail in qs: - - contact_detail_to_move.append( - PersonIdentifier( - value=contact_detail.value, - person_id=contact_detail.object_id, - value_type=cpf_info_type_to_name[contact_detail.contact_type], - ) - ) - PersonIdentifier.objects.bulk_create(contact_detail_to_move) - - # Twitter IDs - # This is a special case. We're storing Twitter IDs in one model, - # and Twitter usernames in another. The below will merge the two - # but make an assumption that only one Twitter ID exists per person - # (This is the case with all the current live data) - qs = Identifier.objects.filter(scheme="twitter") - for popolo_identifier in qs: - try: - pi = PersonIdentifier.objects.get( - person_id=popolo_identifier.object_id, - value_type="twitter_username", - ) - except PersonIdentifier.DoesNotExist: - continue - - pi.internal_identifier = popolo_identifier.identifier - pi.save() - - -class Migration(migrations.Migration): - - dependencies = [("people", "0008_person_identifier_model")] - - operations = [ - migrations.RunPython( - populate_person_identifier_from_popolo_models, - migrations.RunPython.noop, - ) - ] diff --git a/ynr/apps/people/migrations/0010_copy_email_to_person_identifier.py b/ynr/apps/people/migrations/0010_copy_email_to_person_identifier.py deleted file mode 100644 index ba3a86929a..0000000000 --- a/ynr/apps/people/migrations/0010_copy_email_to_person_identifier.py +++ /dev/null @@ -1,32 +0,0 @@ -# -*- coding: utf-8 -*- -# Generated by Django 1.10.8 on 2018-10-31 07:55 -from __future__ import unicode_literals - -from django.db import migrations - - -def populate_person_identifier_from_person_email(apps, schema_editor): - Person = apps.get_model("people", "Person") - PersonIdentifier = apps.get_model("people", "PersonIdentifier") - - ids_to_make = [] - for person in Person.objects.exclude(email=None): - ids_to_make.append( - PersonIdentifier( - person_id=person.pk, value=person.email, value_type="email" - ) - ) - - PersonIdentifier.objects.bulk_create(ids_to_make) - - -class Migration(migrations.Migration): - - dependencies = [("people", "0009_copy_popolo_fields_to_person_identifiers")] - - operations = [ - migrations.RunPython( - populate_person_identifier_from_person_email, - migrations.RunPython.noop, - ) - ] diff --git a/ynr/apps/people/migrations/0011_set_tmp_unique_constraints.py b/ynr/apps/people/migrations/0011_set_tmp_unique_constraints.py deleted file mode 100644 index 208d7fc07b..0000000000 --- a/ynr/apps/people/migrations/0011_set_tmp_unique_constraints.py +++ /dev/null @@ -1,37 +0,0 @@ -# -*- coding: utf-8 -*- -# Generated by Django 1.10.8 on 2018-11-02 11:40 -from __future__ import unicode_literals - -import django.db.models.deletion -from django.db import migrations, models - - -class Migration(migrations.Migration): - - dependencies = [("people", "0010_copy_email_to_person_identifier")] - - operations = [ - migrations.AlterModelOptions( - name="personidentifier", - options={"ordering": ("value_type", "-modified")}, - ), - migrations.AlterField( - model_name="personidentifier", - name="person", - field=models.ForeignKey( - on_delete=django.db.models.deletion.CASCADE, - related_name="tmp_person_identifiers", - to="people.Person", - ), - ), - migrations.AlterUniqueTogether( - name="personidentifier", - unique_together=set( - [ - ("person", "internal_identifier", "value_type"), - ("person", "value"), - ("person", "value_type"), - ] - ), - ), - ] diff --git a/ynr/apps/people/migrations/0012_add_person_favourite_biscuit.py b/ynr/apps/people/migrations/0012_add_person_favourite_biscuit.py deleted file mode 100644 index 414b05f563..0000000000 --- a/ynr/apps/people/migrations/0012_add_person_favourite_biscuit.py +++ /dev/null @@ -1,20 +0,0 @@ -# -*- coding: utf-8 -*- -# Generated by Django 1.11.16 on 2018-11-27 08:25 -from __future__ import unicode_literals - -from django.db import migrations, models - - -class Migration(migrations.Migration): - - dependencies = [("people", "0011_set_tmp_unique_constraints")] - - operations = [ - migrations.AddField( - model_name="person", - name="favourite_biscuit", - field=models.CharField( - max_length=255, null=True, verbose_name="Favourite biscuit 🍪" - ), - ) - ] diff --git a/ynr/apps/people/migrations/0013_populate_favourite_biscuit.py b/ynr/apps/people/migrations/0013_populate_favourite_biscuit.py deleted file mode 100644 index 0e3a40537b..0000000000 --- a/ynr/apps/people/migrations/0013_populate_favourite_biscuit.py +++ /dev/null @@ -1,51 +0,0 @@ -# -*- coding: utf-8 -*- -# Generated by Django 1.11.16 on 2018-11-27 08:19 - -from django.db import migrations -from django.db.models.functions import Length - - -def populate_favourite_biscuit_from_extrafieldvalue(apps, schema_editor): - PersonExtraFieldValue = apps.get_model( - "candidates", "PersonExtraFieldValue" - ) - ExtraField = apps.get_model("candidates", "ExtraField") - - try: - biscuit_field = ExtraField.objects.prefetch_related( - "personextrafieldvalue_set" - ).get(key="favourite_biscuits") - except ExtraField.DoesNotExist: - # This DB hasn't got a `favourite_biscuits` field defined, - # so there's nothing we can do here. Just skip the rest of the migration - return - - too_long = PersonExtraFieldValue.objects.annotate( - value_len=Length("value") - ).filter(field_id=biscuit_field.pk, value_len__gt=254) - - if too_long.exists(): - msg = [ - "Value is too long for the following people. " - "Please manually fix:" - ] - for value_field in too_long: - msg.append(str(value_field.person.pk)) - raise ValueError("\n".join(msg)) - - for value in biscuit_field.personextrafieldvalue_set.all(): - person = value.person - person.favourite_biscuit = value.value - person.save() - - -class Migration(migrations.Migration): - - dependencies = [("people", "0012_add_person_favourite_biscuit")] - - operations = [ - migrations.RunPython( - populate_favourite_biscuit_from_extrafieldvalue, - migrations.RunPython.noop, - ) - ] diff --git a/ynr/apps/people/migrations/0014_remove_person_email.py b/ynr/apps/people/migrations/0014_remove_person_email.py deleted file mode 100644 index ecf1884323..0000000000 --- a/ynr/apps/people/migrations/0014_remove_person_email.py +++ /dev/null @@ -1,12 +0,0 @@ -# -*- coding: utf-8 -*- -# Generated by Django 1.11.18 on 2019-02-12 09:19 -from __future__ import unicode_literals - -from django.db import migrations - - -class Migration(migrations.Migration): - - dependencies = [("people", "0013_populate_favourite_biscuit")] - - operations = [migrations.RemoveField(model_name="person", name="email")] diff --git a/ynr/apps/people/migrations/0015_date_lengths.py b/ynr/apps/people/migrations/0015_date_lengths.py deleted file mode 100644 index 58efd73856..0000000000 --- a/ynr/apps/people/migrations/0015_date_lengths.py +++ /dev/null @@ -1,31 +0,0 @@ -# Generated by Django 2.2.4 on 2019-08-22 09:58 - -from django.db import migrations, models - - -class Migration(migrations.Migration): - - dependencies = [("people", "0014_remove_person_email")] - - operations = [ - migrations.AlterField( - model_name="person", - name="birth_date", - field=models.CharField( - blank=True, - help_text="A date of birth", - max_length=20, - verbose_name="birth date", - ), - ), - migrations.AlterField( - model_name="person", - name="death_date", - field=models.CharField( - blank=True, - help_text="A date of death", - max_length=20, - verbose_name="death date", - ), - ), - ] diff --git a/ynr/apps/people/migrations/0016_add_edit_limitations.py b/ynr/apps/people/migrations/0016_add_edit_limitations.py deleted file mode 100644 index a5f924d9f4..0000000000 --- a/ynr/apps/people/migrations/0016_add_edit_limitations.py +++ /dev/null @@ -1,24 +0,0 @@ -# Generated by Django 2.2.4 on 2019-09-09 19:25 - -from django.db import migrations, models - - -class Migration(migrations.Migration): - - dependencies = [("people", "0015_date_lengths")] - - operations = [ - migrations.AddField( - model_name="person", - name="edit_limitations", - field=models.CharField( - blank=True, - choices=[ - ("NO_STATUS", ""), - ("NEEDS_REVIEW", "Liable to vandalism"), - ("EDITS_PREVENTED", "Edits prevented"), - ], - max_length=100, - ), - ) - ] diff --git a/ynr/apps/people/migrations/0017_set_vandalism_list.py b/ynr/apps/people/migrations/0017_set_vandalism_list.py deleted file mode 100644 index 1900e94a5f..0000000000 --- a/ynr/apps/people/migrations/0017_set_vandalism_list.py +++ /dev/null @@ -1,212 +0,0 @@ -# Generated by Django 2.2.4 on 2019-09-10 11:45 - -from django.db import migrations - -PEOPLE_LIABLE_TO_VANDALISM = { - 2811, # Theresa May - 1120, # Jeremy Corbyn - 4546, # Boris Johnson - 6035, # Paul Nuttall - 8372, # Nicola Sturgeon - 737, # Ruth Davidson - 34605, # Matt Furey-King (due to a vandalism incident) - 31705, # Lance Charles Quantrill (due to a vandalism incident) - 1528, # Janus Polenceus - 25402, # Giles Game - 4230, # Craig Mackinlay - # Below we include the person ID of anyone who is currently a minister. - # This list was generated by running moderation_queue_generate_ministers_liable_to_vandalism: - 1018, # Anne Milton (Minister of State (Education)) - 1104, # Edward Timpson (Minister of State (Department for Education)) - 1303, # Karen Bradley (The Secretary of State for Northern Ireland) - 1326, # Priti Patel (The Secretary of State for International Development) - 1476, # Harriett Baldwin (Minister of State (Foreign and Commonwealth Office) (Joint with the Department for International Development)) - 155, # John Glen (Minister of State (Treasury) (City)) - 1557, # George Hollingbery (Minister of State (International Trade)) - 1573, # Claire Perry (Minister of State (Business, Energy and Industrial Strategy) (Energy and Clean Growth)) - 1592, # David Mundell (The Secretary of State for Scotland) - 1604, # Jeremy Wright (The Secretary of State for Digital, Culture, Media and Sport) - 1692, # Penny Mordaunt (The Secretary of State for International Development) - 1918, # Greg Clark (The Secretary of State for Business, Energy and Industrial Strategy ) - 1923, # Alun Cairns (The Secretary of State for Wales) - 212, # Alan Duncan (Minister of State) - 2204, # Jo Johnson (Minister of State (Department for Education) (Universities and Science) (Joint with the Department for Business, Energy and Industrial Strategy)) - 2253, # Stephen Hammond (Minister of State (Department of Health and Social Care)) - 239, # Stephen Barclay (The Secretary of State for Exiting the European Union) - 2534, # James Brokenshire (The Secretary of State for Housing, Communities and Local Government) - 2811, # Theresa May (The Prime Minister) - 2832, # Michael Fallon (The Secretary of State for Defence) - 2875, # Andrea Leadsom (The Secretary of State for Environment, Food and Rural Affairs) - 2885, # David Davis (The Secretary of State for Exiting the European Union) - 2937, # Caroline Dinenage (Minister of State (Department of Health and Social Care)) - 3151, # David Jones (Minister of State (Department for Exiting the European Union)) - 3155, # Jeremy Hunt (The Secretary of State for Health) - 3238, # Ben Wallace (Minister of State (Home Office) (Security)) - 3284, # Chris Grayling (The Secretary of State for Transport) - 3417, # Jesse Norman (Minister of State (Department for Transport)) - 3445, # John Hayes (Minister of State (Department for Transport)) - 3449, # Damian Hinds (The Secretary of State for Education) - 3486, # Damian Green (The Secretary of State for Work and Pensions) - 349, # Sajid Javid (The Secretary of State for the Home Department) - 3533, # Brandon Lewis (Minister without Portfolio ) - 3737, # Matthew Hancock (Minister of State (Department for Culture, Media and Sport) (Digital Policy)) - 3741, # Robert Halfon (Minister of State (Department of Education) (Apprenticeships and Skills)) - 3745, # Chris Skidmore (Minister of State (Department for Business, Energy and Industrial Strategy) (Universities and Science) (Joint with the Department for Education)) - 4014, # Michael Gove (The Secretary of State for Environment, Food and Rural Affairs) - 4021, # Justine Greening (The Secretary of State for Education) - 4099, # David Lidington (Minister of State (Cabinet Office)) - 451, # Liam Fox (The Secretary of State for International Trade and President of the Board of Trade) - 4881, # Gavin Barwell (Minister of State (Department for Communities and Local Government) (Housing, Planning and London)) - 4893, # Victoria Atkins (Minister for Women) - 519, # Amber Rudd (The Secretary of State for Work and Pensions) - 5272, # Kit Malthouse (Minister of State (Housing, Communities and Local Government)) - 600, # Mark Field (Minister of State) - 769, # Gavin Williamson (The Secretary of State for Defence) - 918, # Nick Gibb (Minister of State (Education)) - # europarl.2019-05-023 MEP candidates in list position 1 - 11857, # Colum Eastwood - 12218, # Magid Magid - 12326, # Shaffaq Mohammed - 1516, # Donald Mackay - 16, # Stephen Dorrell - 183, # Gerard Batten - 19920, # Jackie Jones - 21119, # Barbara Gibson - 2126, # Stuart Agnew - 2351, # Mike Hookem - 2454, # Naomi Long - 26664, # Caroline Voaden - 26849, # Sam Bennett - 31, # Danny Kennedy - 34111, # Molly Scott Cato - 34506, # Bill Newton Dunn - 34830, # Fiona Hall - 3526, # Lawrence Webb - 3594, # Richard Elvin - 36075, # Irina von Wiese - 37323, # Scott Ainslie - 5247, # Piers Wauchope - 5824, # Clare Bailey - 5828, # Ernest John Valentine - 5998, # Catherine Rowett - 6550, # Robert Hill - 67695, # Alexandra Phillips - 6951, # Phil Bennion - 69533, # Jill Evans - 69537, # Catherine Bearder - 69696, # Emma McClarkin - 69708, # Syed Salah Kamall - 69720, # Sajjad Karim - 69730, # Nosheena Mobarik - 69734, # Daniel Hannan - 69744, # Ashley Fox - 69943, # Rory Palmer - 69948, # Alex Mayer - 69954, # Claude Moraes - 69962, # Judith Kirton-Darling - 69965, # Theresa Griffin - 69973, # David Martin - 69980, # John Howarth - 69989, # Clare Moody - 69999, # Neena Gill - 70007, # Richard Corbett - 70035, # Chris Davies - 7011, # Stephen Morris - 70176, # Alyn Smith - 70323, # Alan Graves Snr - 70325, # Adam Richardson - 70336, # Kris Hicks - 70343, # Sheila Ritchie - 70354, # Rachel Johnson - 70360, # Catherine Mayer - 70367, # Neville Seed - 70368, # Mothiur Rahman - 70369, # Larch Ian Albert Frank Maxey - 70370, # Gavin Esler - 70375, # Ann Widdecombe - 70381, # Andrea Cooper - 70399, # Claire Regina Fox - 70407, # Sophie Catherine Larroque - 70408, # Neil Patrick McCann - 70413, # Kate Godfrey - 70430, # Pierre Edmond Kirk - 70447, # Benyamin Naeem Habib - 7065, # Amandeep Singh Bhogal - 7233, # Jenny Knight - 7400, # Vanessa Helen Hudson - 986, # Gina Dowding - 70456, # Tommy Robinson - 70330, # Mark Meechan (alias CountDankula) - 70334, # Carl Benjamin (alias Sargon of Akkad) - 70307, # Andrew Adonis (alias Lord Adonis) - # September 2019 cabinet - 918, # Nick Gibb (Minister of State (Education)) - 4546, # Boris Johnson (The Prime Minister) - 1022, # Andrew Murrison (Minister of State (Foreign and Commonwealth Office) (Joint with the Department for International Development)) - 3369, # Theresa Villiers (The Secretary of State for Environment, Food and Rural Affairs) - 3238, # Ben Wallace (The Secretary of State for Defence) - 2595, # Grant Shapps (The Secretary of State for Transport) - 2253, # Stephen Hammond (Minister of State (Department of Health and Social Care)) - 3745, # Chris Skidmore (Minister of State (Department of Health and Social Care)) - 769, # Gavin Williamson (The Secretary of State for Education) - 2783, # Nicky Morgan (The Secretary of State for Digital, Culture, Media and Sport) - 1923, # Alun Cairns (The Secretary of State for Wales) - 3706, # Christopher Pincher (Minister of State) - 2871, # Andrew Stephenson (Minister of State (Foreign and Commonwealth Office) (Joint with the Department for International Development)) - 1326, # Priti Patel (The Secretary of State for the Home Department) - 519, # Amber Rudd (The Secretary of State for Work and Pensions) - 3451, # Dominic Raab (The Secretary of State for Foreign and Commonwealth Affairs) - 2827, # George Freeman (Minister of State (Department for Transport)) - 2875, # Andrea Leadsom (The Secretary of State for Business, Energy and Industrial Strategy ) - 155, # John Glen (Minister of State (Treasury) (City)) - 1729, # Chris Heaton-Harris (Minister of State (Department for Transport)) - 4079, # Jake Berry (Minister of State (Cabinet Office) (jointly with the Ministry of Housing, Communities and Local Government)) - 2937, # Caroline Dinenage (Minister of State (Department of Health and Social Care)) - 1959, # Nigel Adams (Minister of State) - 3524, # Esther Louise McVey (Minister of State (Housing, Communities and Local Government)) - 2204, # Jo Johnson (Minister of State (Department for Business, Energy and Industrial Strategy) (Jointly with the Department for Education)) - 3636, # Alok Sharma (The Secretary of State for International Development) - 239, # Stephen Barclay (The Secretary of State for Exiting the European Union) - 188, # Elizabeth Truss (The Secretary of State for International Trade and President of the Board of Trade) - 2798, # Julian Smith (The Secretary of State for Northern Ireland) - 5031, # Robert Jenrick (The Secretary of State for Housing, Communities and Local Government) - 4796, # Oliver Dowden (Minister of State (Cabinet Office)) - 5464, # James Cleverly (Minister without Portfolio ) - 4893, # Victoria Atkins (Minister for Women) -} - - -def get_by_id_with_redirects(person_id, Person, PersonRedirect): - try: - person = Person.objects.get(id=person_id) - except Person.DoesNotExist: - try: - person_id = PersonRedirect.objects.get( - old_person_id=person_id - ).new_person_id - person = get_by_id_with_redirects(person_id, Person, PersonRedirect) - except PersonRedirect.DoesNotExist: - person = None - return person - - -def set_liable_to_vandalism(apps, schema_editor): - Person = apps.get_model("people", "Person") - PersonRedirect = apps.get_model("candidates", "PersonRedirect") - for person_id in PEOPLE_LIABLE_TO_VANDALISM: - person = get_by_id_with_redirects(person_id, Person, PersonRedirect) - if person: - # We can't use the Enum here, because the `Person` object isn't the - # actual class in the code. The Enum values might change over time, - # so it's best to hard code this. - person.edit_limitations = "NEEDS_REVIEW" - person.save() - - -class Migration(migrations.Migration): - - dependencies = [("people", "0016_add_edit_limitations")] - - operations = [ - migrations.RunPython(set_liable_to_vandalism, migrations.RunPython.noop) - ] diff --git a/ynr/apps/people/migrations/0018_gender_guess.py b/ynr/apps/people/migrations/0018_gender_guess.py deleted file mode 100644 index 302d1ace29..0000000000 --- a/ynr/apps/people/migrations/0018_gender_guess.py +++ /dev/null @@ -1,36 +0,0 @@ -# Generated by Django 2.2.4 on 2019-11-13 20:37 - -import django.contrib.postgres.fields.jsonb -from django.db import migrations, models -import django.db.models.deletion - - -class Migration(migrations.Migration): - - dependencies = [("people", "0017_set_vandalism_list")] - - operations = [ - migrations.CreateModel( - name="GenderGuess", - fields=[ - ( - "id", - models.AutoField( - auto_created=True, - primary_key=True, - serialize=False, - verbose_name="ID", - ), - ), - ("gender", models.CharField(max_length=1)), - ( - "person", - models.OneToOneField( - on_delete=django.db.models.deletion.CASCADE, - related_name="gender_guess", - to="people.Person", - ), - ), - ], - ) - ] diff --git a/ynr/apps/people/migrations/0019_move_to_ballot_in_version_history.py b/ynr/apps/people/migrations/0019_move_to_ballot_in_version_history.py deleted file mode 100644 index 2554a28515..0000000000 --- a/ynr/apps/people/migrations/0019_move_to_ballot_in_version_history.py +++ /dev/null @@ -1,170 +0,0 @@ -# Generated by Django 2.2.9 on 2020-02-23 10:42 -import json - -from django.db import migrations -from django.db.models import Q - -election_slug_fixes = { - "local.st-edmondsbury.haverhill-north.2016-05-05": "local.st-edmundsbury.2016-05-05", - "mayor.liverpool.2017-05-04": "mayor.liverpool-city-ca.2017-05-04", - "mayor.greater-manchester.2017-05-04": "mayor.greater-manchester-ca.2017-05-04", - "local.hampshire.headley.2016-05-05": "local.hampshire.2016-05-05", - "naw-2016-05-05-r": "naw.c.2016-05-05", - "naw-2016-05-05-c": "naw.r.2016-05-05", - "gb-sp-2016-05-05-r": "sp.r.2016-05-05", - "gb-sp-2016-05-05-c": "sp.c.2016-05-05", - "sp-2016-05-05-c": "sp.r.2016-05-05", - "local.north-dorset.hill-forts.2016-05-05": "local.north-dorset.2016-05-05", - "local.havering.heaton.2016-05-05": "local.havering.2016-05-05", - "local.romford.heaton.2016-05-05": "local.havering.2016-05-05", - "local.lancaster.john-ogaunt.2016-05-05": "local.lancaster.2016-05-05", - "local.southwark.newington.2016-05-05": "local.southwark.2016-05-05", - "parl.sheffield.sheffield-brightside-and-hillsborough.2016-05-05": "parl.2016-05-05", - "local.hackney.stoke-newington.2016-05-05": "local.hackney.2016-05-05", - "parl.copeland.2017-02-23": "parl.2017-02-23", - "local.greenwich.glyndon-ward.2016-05-05": "local.greenwich.2016-05-05", - "local.suffolk.haverhill-cangle.2016-05-05": "local.suffolk.2016-05-05", - "local.hackney.hackney-downs.2016-05-05": "local.hackney.2016-05-05", - "local.torquay.tormohun.2016-05-05": "local.torbay.2016-05-05", - "local.forest-heath.brandon-west.2016-05-05": "local.forest-heath.2016-05-05", - "local.forest-heath.south.2016-05-05": "local.forest-heath.2016-05-05", - "local.hampshire.fareham-town.2016-05-05": "local.hampshire.2016-05-05", - "local.lancaster.carnforth-and-millhead.2016-05-05": "local.lancaster.2016-05-05", - "local.north-dorset.blandford-hilltop.2016-05-05": "local.north-dorset.2016-05-05", - "local.southwark.college.2016-05-05": "local.southwark.2016-05-05", - "local.suffolk.bixley.2016-05-05": "local.suffolk.2016-05-05", - "parl.stoke-on-trent-central.2017-02-23": "parl.2017-02-23", - "parl.bridgend.ogmore.2016-05-05": "parl.2016-05-05", - "local.glasgow.2016-05-05": "local.glasgow-city.2016-05-05", -} - -post_slug_fixes = json.load( - open("ynr/apps/people/migrations/0019_post_slug_fixes.json") -) - - -mapit_id_to_gss = json.load( - open("ynr/apps/people/migrations/parl_mapit_to_gss.json") -) - - -def move_to_ballot_in_version_history(apps, schema_editor): - Person = apps.get_model("people", "Person") - Ballot = apps.get_model("candidates", "Ballot") - Party = apps.get_model("parties", "Party") - - party_legacy_id_to_ec_id = {} - for party in Party.objects.all(): - party_legacy_id_to_ec_id[party.legacy_slug] = party.ec_id - - def get_party_from_version(election_id, version): - party_id = version["data"]["party_memberships"][election_id]["id"] - try: - return party_legacy_id_to_ec_id[party_id] - except KeyError: - return party_legacy_id_to_ec_id["minor-{}".format(party_id)] - - ballot_cache = {} - - def get_ballot_from_cache(election_id, post_id): - key = "--".join([election_id, post_id]) - if key not in ballot_cache: - ballot_cache[key] = ( - Ballot.objects.filter( - Q(post__postidentifier__identifier=post_id) - | Q(post__slug=post_id) - ) - .distinct() - .get(election__slug=election_id) - ) - return ballot_cache[key] - - for person in Person.objects.all(): - versions = person.versions - for i, version in enumerate(versions): - data = version["data"] - data["candidacies"] = {} - for election_id, candidacy in data.get("standing_in", {}).items(): - if not candidacy: - continue - - election_slugs = [ - "local.glasgow-city.2017-05-04", - "local.wyre-forest.2016-05-05", - "local.torfaen.2017-05-04", - "local.south-derbyshire.2017-05-04", - ] - post_slugs = [ - "UTW:S13002652", - "UTE:W05000778", - "NODATA:E07000239-greenhill", - "NODATA:E07000239-rock", - "DIW:E05008823", - ] - - if election_id in election_slugs: - if candidacy["post_id"] in post_slugs: - """ - These are versions with a very special set of - circumstances: - - 1. A post was made incorrectly in YNR (incorrect because - it stoped existing after a boundary change, but we - imported it to the site before knowing that) - 2. The post was in place over SOPN day - 3. A user used the “bulk adding form” and didn’t spot - that the post name and the ward name on the SOPN - didn’t match (“The First Page Problem”) - 4. The post was removed at some point, but the version - history shows the old, incorrect nomination still - - In this case, we'll just delete the version, as it's not - useful at all. - """ - del versions[i] - continue - - initial_election_id = election_id - election_id = election_slug_fixes.get(election_id, election_id) - if not candidacy: - not_standing = data.get("not_standing", set()) - not_standing.add(election_id) - data["not_standing"] = not_standing - continue - post_id = candidacy["post_id"] - if election_id.startswith("parl."): - post_id = mapit_id_to_gss.get(post_id, post_id) - key = "--".join([election_id, post_id]) - post_id = post_slug_fixes.get(key, post_id) - - ballot = get_ballot_from_cache(election_id, post_id) - - new_candidacy = {} - new_candidacy["party"] = get_party_from_version( - initial_election_id, version - ) - if "elected" in candidacy: - new_candidacy["elected"] = candidacy["elected"] - if "party_list_position" in candidacy: - new_candidacy["party_list_position"] = candidacy[ - "party_list_position" - ] - data["candidacies"][ballot.ballot_paper_id] = new_candidacy - data.pop("standing_in", None) - data.pop("party_memberships", None) - person.versions = json.dumps(versions) - person.save() - - -class Migration(migrations.Migration): - - dependencies = [ - ("people", "0018_gender_guess"), - ("popolo", "0035_attach_memberships_to_posts"), - ] - - operations = [ - migrations.RunPython( - move_to_ballot_in_version_history, migrations.RunPython.noop - ) - ] diff --git a/ynr/apps/people/migrations/0020_add_json_versions.py b/ynr/apps/people/migrations/0020_add_json_versions.py deleted file mode 100644 index 378ea26f31..0000000000 --- a/ynr/apps/people/migrations/0020_add_json_versions.py +++ /dev/null @@ -1,17 +0,0 @@ -# Generated by Django 2.2.16 on 2021-01-06 19:02 - -import django.contrib.postgres.fields.jsonb -from django.db import migrations - - -class Migration(migrations.Migration): - - dependencies = [("people", "0019_move_to_ballot_in_version_history")] - - operations = [ - migrations.AddField( - model_name="person", - name="json_versions", - field=django.contrib.postgres.fields.jsonb.JSONField(null=True), - ) - ] diff --git a/ynr/apps/people/migrations/0021_populate_json_versions.py b/ynr/apps/people/migrations/0021_populate_json_versions.py deleted file mode 100644 index d29d89a4b0..0000000000 --- a/ynr/apps/people/migrations/0021_populate_json_versions.py +++ /dev/null @@ -1,23 +0,0 @@ -# Generated by Django 2.2.16 on 2021-01-06 19:03 -import json - -from django.db import migrations - - -def populate_json_versions(apps, schema): - Person = apps.get_model("people", "Person") - for person in Person.objects.all(): - try: - person.json_versions = json.loads(person.versions) - except json.decoder.JSONDecodeError: - person.json_versions = {} - person.save() - - -class Migration(migrations.Migration): - - dependencies = [("people", "0020_add_json_versions")] - - operations = [ - migrations.RunPython(populate_json_versions, migrations.RunPython.noop) - ] diff --git a/ynr/apps/people/migrations/0022_rename_json_versions_field.py b/ynr/apps/people/migrations/0022_rename_json_versions_field.py deleted file mode 100644 index fe65bd3df8..0000000000 --- a/ynr/apps/people/migrations/0022_rename_json_versions_field.py +++ /dev/null @@ -1,15 +0,0 @@ -# Generated by Django 2.2.16 on 2021-01-07 09:25 - -from django.db import migrations - - -class Migration(migrations.Migration): - - dependencies = [("people", "0021_populate_json_versions")] - - operations = [ - migrations.RemoveField(model_name="person", name="versions"), - migrations.RenameField( - model_name="person", old_name="json_versions", new_name="versions" - ), - ] diff --git a/ynr/apps/people/migrations/0023_add_search_vector_field.py b/ynr/apps/people/migrations/0023_add_search_vector_field.py deleted file mode 100644 index 57428ae198..0000000000 --- a/ynr/apps/people/migrations/0023_add_search_vector_field.py +++ /dev/null @@ -1,18 +0,0 @@ -# Generated by Django 2.2.16 on 2021-03-13 08:51 - -import django.contrib.postgres.fields.jsonb -import django.contrib.postgres.search -from django.db import migrations - - -class Migration(migrations.Migration): - - dependencies = [("people", "0022_rename_json_versions_field")] - - operations = [ - migrations.AddField( - model_name="person", - name="name_search_vector", - field=django.contrib.postgres.search.SearchVectorField(null=True), - ) - ] diff --git a/ynr/apps/people/migrations/0024_add_gist_index_for_search.py b/ynr/apps/people/migrations/0024_add_gist_index_for_search.py deleted file mode 100644 index 94b1fdeae6..0000000000 --- a/ynr/apps/people/migrations/0024_add_gist_index_for_search.py +++ /dev/null @@ -1,19 +0,0 @@ -# Generated by Django 2.2.16 on 2021-03-13 15:19 - -import django.contrib.postgres.fields.jsonb -import django.contrib.postgres.indexes -from django.db import migrations - - -class Migration(migrations.Migration): - - dependencies = [("people", "0023_add_search_vector_field")] - - operations = [ - migrations.AddIndex( - model_name="person", - index=django.contrib.postgres.indexes.GistIndex( - fields=["name_search_vector"], name="name_vector_search_index" - ), - ) - ] diff --git a/ynr/apps/people/migrations/0025_add_name_search_trigger.py b/ynr/apps/people/migrations/0025_add_name_search_trigger.py deleted file mode 100644 index d53c6e76ac..0000000000 --- a/ynr/apps/people/migrations/0025_add_name_search_trigger.py +++ /dev/null @@ -1,12 +0,0 @@ -# Generated by Django 2.2.19 on 2021-03-28 11:55 - -from django.db import migrations - -from people.managers import NAME_SEARCH_TRIGGER_SQL - - -class Migration(migrations.Migration): - - dependencies = [("people", "0024_add_gist_index_for_search")] - - operations = [migrations.RunSQL(NAME_SEARCH_TRIGGER_SQL)] diff --git a/ynr/apps/people/migrations/0026_add_person_name_synonym.py b/ynr/apps/people/migrations/0026_add_person_name_synonym.py deleted file mode 100644 index 5fe0d2a77b..0000000000 --- a/ynr/apps/people/migrations/0026_add_person_name_synonym.py +++ /dev/null @@ -1,41 +0,0 @@ -# Generated by Django 2.2.19 on 2021-03-30 07:43 - -import django.contrib.postgres.fields.jsonb -import django.contrib.postgres.indexes -import django.contrib.postgres.search -from django.db import migrations, models - - -class Migration(migrations.Migration): - - dependencies = [("people", "0025_add_name_search_trigger")] - - operations = [ - migrations.CreateModel( - name="PersonNameSynonym", - fields=[ - ( - "id", - models.AutoField( - auto_created=True, - primary_key=True, - serialize=False, - verbose_name="ID", - ), - ), - ( - "term", - django.contrib.postgres.search.SearchQueryField( - help_text="The term entered" - ), - ), - ( - "synonym", - django.contrib.postgres.search.SearchQueryField( - help_text="An alternative word for the term" - ), - ), - ], - options={"ordering": ("-term",)}, - ) - ] diff --git a/ynr/apps/people/migrations/0027_auto_20210401_0811.py b/ynr/apps/people/migrations/0027_auto_20210401_0811.py deleted file mode 100644 index b1870b4db9..0000000000 --- a/ynr/apps/people/migrations/0027_auto_20210401_0811.py +++ /dev/null @@ -1,23 +0,0 @@ -# Generated by Django 2.2.16 on 2021-04-01 07:11 - -from django.db import migrations, models - - -class Migration(migrations.Migration): - - dependencies = [("people", "0026_add_person_name_synonym")] - - operations = [ - migrations.AlterField( - model_name="person", - name="edit_limitations", - field=models.CharField( - blank=True, - choices=[ - ("NEEDS_REVIEW", "Needs review"), - ("EDITS_PREVENTED", "Edits prevented"), - ], - max_length=100, - ), - ) - ] diff --git a/ynr/apps/people/migrations/0028_add_default_to_extra_data.py b/ynr/apps/people/migrations/0028_add_default_to_extra_data.py deleted file mode 100644 index 55a28ce079..0000000000 --- a/ynr/apps/people/migrations/0028_add_default_to_extra_data.py +++ /dev/null @@ -1,20 +0,0 @@ -# Generated by Django 2.2.18 on 2021-04-06 12:01 - -import django.contrib.postgres.fields.jsonb -from django.db import migrations - - -class Migration(migrations.Migration): - - dependencies = [("people", "0027_auto_20210401_0811")] - - operations = [ - migrations.AlterField( - model_name="personidentifier", - name="extra_data", - field=django.contrib.postgres.fields.jsonb.JSONField( - default=dict, - help_text="For storing any additional data against this field.\n Used by bots, not humans.", - ), - ) - ] diff --git a/ynr/apps/people/migrations/0029_default_versions_to_list.py b/ynr/apps/people/migrations/0029_default_versions_to_list.py deleted file mode 100644 index 90b46b503d..0000000000 --- a/ynr/apps/people/migrations/0029_default_versions_to_list.py +++ /dev/null @@ -1,17 +0,0 @@ -# Generated by Django 2.2.18 on 2021-04-23 13:44 - -import django.contrib.postgres.fields.jsonb -from django.db import migrations - - -class Migration(migrations.Migration): - - dependencies = [("people", "0028_add_default_to_extra_data")] - - operations = [ - migrations.AlterField( - model_name="person", - name="versions", - field=django.contrib.postgres.fields.jsonb.JSONField(default=list), - ) - ] diff --git a/ynr/apps/people/migrations/0030_auto_20210616_1642.py b/ynr/apps/people/migrations/0030_auto_20210616_1642.py deleted file mode 100644 index c453563624..0000000000 --- a/ynr/apps/people/migrations/0030_auto_20210616_1642.py +++ /dev/null @@ -1,30 +0,0 @@ -# Generated by Django 2.2.20 on 2021-06-16 15:42 - -from django.db import migrations -import django.utils.timezone -import django_extensions.db.fields - - -class Migration(migrations.Migration): - - dependencies = [("people", "0029_default_versions_to_list")] - - operations = [ - migrations.AddField( - model_name="person", - name="created", - field=django_extensions.db.fields.CreationDateTimeField( - auto_now_add=True, - default=django.utils.timezone.now, - verbose_name="created", - ), - preserve_default=False, - ), - migrations.AddField( - model_name="person", - name="modified", - field=django_extensions.db.fields.ModificationDateTimeField( - auto_now=True, verbose_name="modified" - ), - ), - ] diff --git a/ynr/apps/people/migrations/0031_copy_created.py b/ynr/apps/people/migrations/0031_copy_created.py deleted file mode 100644 index 05700baa68..0000000000 --- a/ynr/apps/people/migrations/0031_copy_created.py +++ /dev/null @@ -1,26 +0,0 @@ -# Generated by Django 2.2.20 on 2021-06-16 15:59 - -from django.db import migrations - - -def copy_created_at(apps, schema_editor): - Person = apps.get_model("people", "Person") - for person in Person.objects.iterator(): - person.created = person.created_at - person.save() - - -def copy_created(apps, schema_editor): - Person = apps.get_model("people", "Person") - for person in Person.objects.iterator(): - person.created_at = person.created - person.save() - - -class Migration(migrations.Migration): - - dependencies = [("people", "0030_auto_20210616_1642")] - - operations = [ - migrations.RunPython(code=copy_created_at, reverse_code=copy_created) - ] diff --git a/ynr/apps/people/migrations/0032_auto_20210616_1700.py b/ynr/apps/people/migrations/0032_auto_20210616_1700.py deleted file mode 100644 index c12d01d179..0000000000 --- a/ynr/apps/people/migrations/0032_auto_20210616_1700.py +++ /dev/null @@ -1,13 +0,0 @@ -# Generated by Django 2.2.20 on 2021-06-16 16:00 - -from django.db import migrations - - -class Migration(migrations.Migration): - - dependencies = [("people", "0031_copy_created")] - - operations = [ - migrations.RemoveField(model_name="person", name="created_at"), - migrations.RemoveField(model_name="person", name="updated_at"), - ] diff --git a/ynr/apps/people/migrations/0033_auto_20210928_1007.py b/ynr/apps/people/migrations/0033_auto_20210928_1007.py deleted file mode 100644 index 057c74303b..0000000000 --- a/ynr/apps/people/migrations/0033_auto_20210928_1007.py +++ /dev/null @@ -1,24 +0,0 @@ -# Generated by Django 3.2.4 on 2021-09-28 09:07 - -from django.db import migrations, models - - -class Migration(migrations.Migration): - - dependencies = [("people", "0032_auto_20210616_1700")] - - operations = [ - migrations.AlterField( - model_name="person", - name="versions", - field=models.JSONField(default=list), - ), - migrations.AlterField( - model_name="personidentifier", - name="extra_data", - field=models.JSONField( - default=dict, - help_text="For storing any additional data against this field.\n Used by bots, not humans.", - ), - ), - ] diff --git a/ynr/apps/people/migrations/0034_get_birth_year.py b/ynr/apps/people/migrations/0034_get_birth_year.py deleted file mode 100644 index 684080db70..0000000000 --- a/ynr/apps/people/migrations/0034_get_birth_year.py +++ /dev/null @@ -1,20 +0,0 @@ -# Generated by Django 3.2.4 on 2021-10-27 14:41 - -from django.db import migrations - - -def get_birth_year(apps, schema_editor): - Person = apps.get_model("people", "Person") - for person in Person.objects.exclude(birth_date="").iterator(): - birth_year = person.birth_date.split("-")[0] - person.birth_date = birth_year - person.save() - - -class Migration(migrations.Migration): - - dependencies = [("people", "0033_auto_20210928_1007")] - - operations = [ - migrations.RunPython(get_birth_year, migrations.RunPython.noop) - ] diff --git a/ynr/apps/people/migrations/0035_alter_person_birth_date.py b/ynr/apps/people/migrations/0035_alter_person_birth_date.py deleted file mode 100644 index cf42d6a073..0000000000 --- a/ynr/apps/people/migrations/0035_alter_person_birth_date.py +++ /dev/null @@ -1,21 +0,0 @@ -# Generated by Django 3.2.4 on 2021-10-25 16:44 - -from django.db import migrations, models - - -class Migration(migrations.Migration): - - dependencies = [("people", "0034_get_birth_year")] - - operations = [ - migrations.AlterField( - model_name="person", - name="birth_date", - field=models.CharField( - blank=True, - help_text="A year of birth", - max_length=4, - verbose_name="birth date", - ), - ) - ] diff --git a/ynr/apps/popolo/migrations/0001_initial.py b/ynr/apps/popolo/migrations/0001_initial.py index 7f41404fe7..db43199d37 100644 --- a/ynr/apps/popolo/migrations/0001_initial.py +++ b/ynr/apps/popolo/migrations/0001_initial.py @@ -1,847 +1,843 @@ +# Generated by Django 3.2.10 on 2021-12-14 17:21 + import django.core.validators +from django.db import migrations, models +import django.db.models.deletion import django.utils.timezone +import django_extensions.db.fields import model_utils.fields -from django.db import migrations, models - import popolo.behaviors.models class Migration(migrations.Migration): - dependencies = [("contenttypes", "0001_initial")] + initial = True + + dependencies = [ + ("contenttypes", "0002_remove_content_type_name"), + ("parties", "0001_initial"), + ("people", "0001_initial"), + ("candidates", "0001_initial"), + ("elections", "0001_initial"), + ] operations = [ migrations.CreateModel( - name="ContactDetail", + name="Language", fields=[ ( "id", models.AutoField( - verbose_name="ID", - serialize=False, auto_created=True, primary_key=True, + serialize=False, + verbose_name="ID", ), ), - ("object_id", models.PositiveIntegerField()), ( - "start_date", + "dbpedia_resource", models.CharField( - validators=[ - django.core.validators.RegexValidator( - regex=b"^[0-9]{4}(-[0-9]{2}){0,2}$", - message=b"Date has wrong format", - ), - popolo.behaviors.models.validate_partial_date, - ], - max_length=10, - blank=True, - help_text="The date when the validity of the item starts", - null=True, - verbose_name="start date", + help_text="DbPedia URI of the resource", + max_length=255, + unique=True, ), ), + ("iso639_1_code", models.CharField(max_length=2)), ( - "end_date", + "name", models.CharField( - validators=[ - django.core.validators.RegexValidator( - regex=b"^[0-9]{4}(-[0-9]{2}){0,2}$", - message=b"Date has wrong format", - ), - popolo.behaviors.models.validate_partial_date, - ], - max_length=10, - blank=True, - help_text="The date when the validity of the item ends", - null=True, - verbose_name="end date", + help_text="English name of the language", max_length=128 + ), + ), + ], + ), + migrations.CreateModel( + name="Organization", + fields=[ + ( + "id", + models.AutoField( + auto_created=True, + primary_key=True, + serialize=False, + verbose_name="ID", ), ), ( - "created_at", + "created", model_utils.fields.AutoCreatedField( default=django.utils.timezone.now, - verbose_name="creation time", editable=False, + verbose_name="created", ), ), ( - "updated_at", + "modified", model_utils.fields.AutoLastModifiedField( default=django.utils.timezone.now, - verbose_name="last modification time", editable=False, + verbose_name="modified", ), ), ( - "label", + "start_date", models.CharField( - help_text="A human-readable label for the contact detail", - max_length=128, - verbose_name="label", blank=True, + help_text="The date when the validity of the item starts", + max_length=10, + null=True, + validators=[ + django.core.validators.RegexValidator( + message="Date has wrong format", + regex="^[0-9]{4}(-[0-9]{2}){0,2}$", + ), + popolo.behaviors.models.validate_partial_date, + ], + verbose_name="start date", ), ), ( - "contact_type", + "end_date", models.CharField( - help_text="A type of medium, e.g. 'fax' or 'email'", - max_length=12, - verbose_name="type", - choices=[ - (b"FAX", "Fax"), - (b"PHONE", "Telephone"), - (b"MOBILE", "Mobile"), - (b"EMAIL", "Email"), - (b"MAIL", "Snail mail"), - (b"TWITTER", "Twitter"), - (b"FACEBOOK", "Facebook"), + blank=True, + help_text="The date when the validity of the item ends", + max_length=10, + null=True, + validators=[ + django.core.validators.RegexValidator( + message="Date has wrong format", + regex="^[0-9]{4}(-[0-9]{2}){0,2}$", + ), + popolo.behaviors.models.validate_partial_date, ], + verbose_name="end date", ), ), ( - "value", + "name", models.CharField( - help_text="A value, e.g. a phone number or email address", - max_length=128, - verbose_name="value", + help_text="A primary name, e.g. a legally recognized name", + max_length=512, + verbose_name="name", ), ), ( - "note", + "summary", models.CharField( - help_text="A note, e.g. for grouping contact details by physical location", - max_length=128, - verbose_name="note", blank=True, + help_text="A one-line description of an organization", + max_length=1024, + verbose_name="summary", ), ), ( - "content_type", - models.ForeignKey( - to="contenttypes.ContentType", on_delete=models.CASCADE + "description", + models.TextField( + blank=True, + help_text="An extended description of an organization", + verbose_name="biography", ), ), - ], - options={"abstract": False}, - ), - migrations.CreateModel( - name="Identifier", - fields=[ ( - "id", - models.AutoField( - verbose_name="ID", - serialize=False, - auto_created=True, - primary_key=True, + "classification", + models.CharField( + blank=True, + help_text="An organization category, e.g. committee", + max_length=512, + verbose_name="classification", ), ), - ("object_id", models.PositiveIntegerField()), ( - "identifier", + "founding_date", models.CharField( - help_text="An issued identifier, e.g. a DUNS number", - max_length=128, - verbose_name="identifier", + blank=True, + help_text="A date of founding", + max_length=10, + null=True, + validators=[ + django.core.validators.RegexValidator( + code="invalid_founding_date", + message="founding date must follow the given pattern: ^[0-9]{4}(-[0-9]{2}){0,2}$", + regex="^[0-9]{4}(-[0-9]{2}){0,2}$", + ) + ], + verbose_name="founding date", ), ), ( - "scheme", + "dissolution_date", models.CharField( - help_text="An identifier scheme, e.g. DUNS", - max_length=128, - verbose_name="scheme", blank=True, + help_text="A date of dissolution", + max_length=10, + null=True, + validators=[ + django.core.validators.RegexValidator( + code="invalid_dissolution_date", + message="dissolution date must follow the given pattern: ^[0-9]{4}(-[0-9]{2}){0,2}$", + regex="^[0-9]{4}(-[0-9]{2}){0,2}$", + ) + ], + verbose_name="dissolution date", ), ), ( - "content_type", + "image", + models.URLField( + blank=True, + help_text="A URL of an image, to identify the organization visually", + null=True, + verbose_name="image", + ), + ), + ( + "slug", + models.CharField(blank=True, max_length=256, unique=True), + ), + ("register", models.CharField(blank=True, max_length=512)), + ( + "parent", models.ForeignKey( - to="contenttypes.ContentType", on_delete=models.CASCADE + blank=True, + help_text="The organization that contains this organization", + null=True, + on_delete=django.db.models.deletion.CASCADE, + related_name="children", + to="popolo.organization", ), ), ], options={"abstract": False}, ), migrations.CreateModel( - name="Link", + name="Post", fields=[ ( "id", models.AutoField( - verbose_name="ID", - serialize=False, auto_created=True, primary_key=True, + serialize=False, + verbose_name="ID", ), ), - ("object_id", models.PositiveIntegerField()), - ("url", models.URLField(help_text="A URL", verbose_name="url")), ( - "note", - models.CharField( - help_text="A note, e.g. 'Wikipedia page'", - max_length=128, - verbose_name="note", - blank=True, + "created", + django_extensions.db.fields.CreationDateTimeField( + auto_now_add=True, verbose_name="created" ), ), ( - "content_type", - models.ForeignKey( - to="contenttypes.ContentType", on_delete=models.CASCADE + "modified", + django_extensions.db.fields.ModificationDateTimeField( + auto_now=True, db_index=True, verbose_name="modified" ), ), - ], - options={"abstract": False}, - ), - migrations.CreateModel( - name="Membership", - fields=[ ( - "id", - models.AutoField( - verbose_name="ID", - serialize=False, - auto_created=True, - primary_key=True, + "ee_modified", + models.DateTimeField( + blank=True, + help_text="Stores the modified timestamp from EE", + null=True, ), ), ( "start_date", models.CharField( + blank=True, + help_text="The date when the validity of the item starts", + max_length=10, + null=True, validators=[ django.core.validators.RegexValidator( - regex=b"^[0-9]{4}(-[0-9]{2}){0,2}$", - message=b"Date has wrong format", + message="Date has wrong format", + regex="^[0-9]{4}(-[0-9]{2}){0,2}$", ), popolo.behaviors.models.validate_partial_date, ], - max_length=10, - blank=True, - help_text="The date when the validity of the item starts", - null=True, verbose_name="start date", ), ), ( "end_date", models.CharField( + blank=True, + help_text="The date when the validity of the item ends", + max_length=10, + null=True, validators=[ django.core.validators.RegexValidator( - regex=b"^[0-9]{4}(-[0-9]{2}){0,2}$", - message=b"Date has wrong format", + message="Date has wrong format", + regex="^[0-9]{4}(-[0-9]{2}){0,2}$", ), popolo.behaviors.models.validate_partial_date, ], - max_length=10, - blank=True, - help_text="The date when the validity of the item ends", - null=True, verbose_name="end date", ), ), ( - "created_at", - model_utils.fields.AutoCreatedField( - default=django.utils.timezone.now, - verbose_name="creation time", - editable=False, + "identifier", + models.CharField( + help_text="\n The identifier used in EveryElection for this division. This might\n change over time, as some divisions don't have official IDs at the\n point we create them.\n ", + max_length=100, + null=True, ), ), ( - "updated_at", - model_utils.fields.AutoLastModifiedField( - default=django.utils.timezone.now, - verbose_name="last modification time", - editable=False, + "label", + models.CharField( + blank=True, + help_text="A label describing the post", + max_length=512, + verbose_name="label", ), ), ( - "label", + "other_label", models.CharField( - help_text="A label describing the membership", - max_length=128, - verbose_name="label", blank=True, + help_text="An alternate label, such as an abbreviation", + max_length=512, + null=True, + verbose_name="other label", ), ), ( "role", models.CharField( - help_text="The role that the person fulfills in the organization", - max_length=128, + blank=True, + help_text="The function that the holder of the post fulfills", + max_length=512, verbose_name="role", + ), + ), + ("slug", models.CharField(blank=True, max_length=256)), + ("group", models.CharField(blank=True, max_length=1024)), + ( + "territory_code", + models.CharField( blank=True, + help_text="\n The territory within Great Britain that this post is in.\n One of SCT, WLS, ENG, NIR\n ", + max_length=10, + ), + ), + ( + "elections", + models.ManyToManyField( + related_name="posts", + through="candidates.Ballot", + to="elections.Election", + ), + ), + ( + "organization", + models.ForeignKey( + help_text="The organization in which the post is held", + on_delete=django.db.models.deletion.CASCADE, + related_name="posts", + to="popolo.organization", + ), + ), + ( + "party_set", + models.ForeignKey( + blank=True, + null=True, + on_delete=django.db.models.deletion.CASCADE, + to="candidates.partyset", ), ), ], - options={"abstract": False}, + options={ + "unique_together": {("slug", "organization", "start_date")} + }, ), migrations.CreateModel( - name="Organization", + name="Source", fields=[ ( "id", models.AutoField( - verbose_name="ID", - serialize=False, auto_created=True, primary_key=True, + serialize=False, + verbose_name="ID", ), ), ( - "start_date", + "object_id", + models.PositiveIntegerField(blank=True, null=True), + ), + ("url", models.URLField(help_text="A URL", verbose_name="url")), + ( + "note", models.CharField( - validators=[ - django.core.validators.RegexValidator( - regex=b"^[0-9]{4}(-[0-9]{2}){0,2}$", - message=b"Date has wrong format", - ), - popolo.behaviors.models.validate_partial_date, - ], - max_length=10, blank=True, - help_text="The date when the validity of the item starts", - null=True, - verbose_name="start date", + help_text="A note, e.g. 'Parliament website'", + max_length=512, + verbose_name="note", ), ), ( - "end_date", - models.CharField( - validators=[ - django.core.validators.RegexValidator( - regex=b"^[0-9]{4}(-[0-9]{2}){0,2}$", - message=b"Date has wrong format", - ), - popolo.behaviors.models.validate_partial_date, - ], - max_length=10, + "content_type", + models.ForeignKey( blank=True, - help_text="The date when the validity of the item ends", null=True, - verbose_name="end date", + on_delete=django.db.models.deletion.CASCADE, + to="contenttypes.contenttype", ), ), + ], + options={"abstract": False}, + ), + migrations.CreateModel( + name="PostIdentifier", + fields=[ ( - "created_at", + "id", + models.AutoField( + auto_created=True, + primary_key=True, + serialize=False, + verbose_name="ID", + ), + ), + ( + "created", model_utils.fields.AutoCreatedField( default=django.utils.timezone.now, - verbose_name="creation time", editable=False, + verbose_name="created", ), ), ( - "updated_at", + "modified", model_utils.fields.AutoLastModifiedField( default=django.utils.timezone.now, - verbose_name="last modification time", editable=False, + verbose_name="modified", ), ), + ("identifier", models.CharField(max_length=256)), + ("label", models.CharField(blank=True, max_length=255)), ( - "name", - models.CharField( - help_text="A primary name, e.g. a legally recognized name", - max_length=128, - verbose_name="name", - ), - ), - ( - "classification", - models.CharField( - help_text="An organization category, e.g. committee", - max_length=128, - verbose_name="classification", - blank=True, - ), - ), - ( - "dissolution_date", - models.CharField( - blank=True, - help_text="A date of dissolution", - max_length=10, - verbose_name="dissolution date", - validators=[ - django.core.validators.RegexValidator( - regex=b"^[0-9]{4}(-[0-9]{2}){0,2}$", - message=b"dissolution date must follow the given pattern: ^[0-9]{4}(-[0-9]{2}){0,2}$", - code=b"invalid_dissolution_date", - ) - ], - ), - ), - ( - "founding_date", - models.CharField( - blank=True, - help_text="A date of founding", - max_length=10, - verbose_name="founding date", - validators=[ - django.core.validators.RegexValidator( - regex=b"^[0-9]{4}(-[0-9]{2}){0,2}$", - message=b"founding date must follow the given pattern: ^[0-9]{4}(-[0-9]{2}){0,2}$", - code=b"invalid_founding_date", - ) - ], - ), - ), - ( - "parent", + "post", models.ForeignKey( - related_name="children", - blank=True, - to="popolo.Organization", - help_text="The organization that contains this organization", - null=True, - on_delete=models.CASCADE, + on_delete=django.db.models.deletion.CASCADE, + to="popolo.post", ), ), ], options={"abstract": False}, ), migrations.CreateModel( - name="OtherName", + name="Identifier", fields=[ ( "id", models.AutoField( - verbose_name="ID", - serialize=False, auto_created=True, primary_key=True, - ), - ), - ("object_id", models.PositiveIntegerField()), - ( - "start_date", - models.CharField( - validators=[ - django.core.validators.RegexValidator( - regex=b"^[0-9]{4}(-[0-9]{2}){0,2}$", - message=b"Date has wrong format", - ), - popolo.behaviors.models.validate_partial_date, - ], - max_length=10, - blank=True, - help_text="The date when the validity of the item starts", - null=True, - verbose_name="start date", + serialize=False, + verbose_name="ID", ), ), ( - "end_date", - models.CharField( - validators=[ - django.core.validators.RegexValidator( - regex=b"^[0-9]{4}(-[0-9]{2}){0,2}$", - message=b"Date has wrong format", - ), - popolo.behaviors.models.validate_partial_date, - ], - max_length=10, - blank=True, - help_text="The date when the validity of the item ends", - null=True, - verbose_name="end date", - ), + "object_id", + models.PositiveIntegerField(blank=True, null=True), ), ( - "name", + "identifier", models.CharField( - help_text="An alternate or former name", - max_length=128, - verbose_name="name", + help_text="An issued identifier, e.g. a DUNS number", + max_length=512, + verbose_name="identifier", ), ), ( - "note", + "scheme", models.CharField( - help_text="A note, e.g. 'Birth name'", - max_length=256, - verbose_name="note", blank=True, + help_text="An identifier scheme, e.g. DUNS", + max_length=128, + verbose_name="scheme", ), ), ( "content_type", models.ForeignKey( - to="contenttypes.ContentType", on_delete=models.CASCADE + blank=True, + null=True, + on_delete=django.db.models.deletion.CASCADE, + to="contenttypes.contenttype", ), ), ], options={"abstract": False}, ), migrations.CreateModel( - name="Person", + name="ContactDetail", fields=[ ( "id", models.AutoField( - verbose_name="ID", - serialize=False, auto_created=True, primary_key=True, + serialize=False, + verbose_name="ID", ), ), ( - "start_date", - models.CharField( - validators=[ - django.core.validators.RegexValidator( - regex=b"^[0-9]{4}(-[0-9]{2}){0,2}$", - message=b"Date has wrong format", - ), - popolo.behaviors.models.validate_partial_date, - ], - max_length=10, - blank=True, - help_text="The date when the validity of the item starts", - null=True, - verbose_name="start date", - ), - ), - ( - "end_date", - models.CharField( - validators=[ - django.core.validators.RegexValidator( - regex=b"^[0-9]{4}(-[0-9]{2}){0,2}$", - message=b"Date has wrong format", - ), - popolo.behaviors.models.validate_partial_date, - ], - max_length=10, - blank=True, - help_text="The date when the validity of the item ends", - null=True, - verbose_name="end date", - ), - ), - ( - "created_at", + "created", model_utils.fields.AutoCreatedField( default=django.utils.timezone.now, - verbose_name="creation time", editable=False, + verbose_name="created", ), ), ( - "updated_at", + "modified", model_utils.fields.AutoLastModifiedField( default=django.utils.timezone.now, - verbose_name="last modification time", editable=False, + verbose_name="modified", ), ), ( - "name", - models.CharField( - help_text="A person's preferred full name", - max_length=128, - verbose_name="name", - ), + "object_id", + models.PositiveIntegerField(blank=True, null=True), ), ( - "family_name", + "start_date", models.CharField( - help_text="One or more family names", - max_length=128, - verbose_name="family name", blank=True, + help_text="The date when the validity of the item starts", + max_length=10, + null=True, + validators=[ + django.core.validators.RegexValidator( + message="Date has wrong format", + regex="^[0-9]{4}(-[0-9]{2}){0,2}$", + ), + popolo.behaviors.models.validate_partial_date, + ], + verbose_name="start date", ), ), ( - "given_name", + "end_date", models.CharField( - help_text="One or more primary given names", - max_length=128, - verbose_name="given name", blank=True, + help_text="The date when the validity of the item ends", + max_length=10, + null=True, + validators=[ + django.core.validators.RegexValidator( + message="Date has wrong format", + regex="^[0-9]{4}(-[0-9]{2}){0,2}$", + ), + popolo.behaviors.models.validate_partial_date, + ], + verbose_name="end date", ), ), ( - "additional_name", + "label", models.CharField( - help_text="One or more secondary given names", - max_length=128, - verbose_name="additional name", blank=True, + help_text="A human-readable label for the contact detail", + max_length=512, + verbose_name="label", ), ), ( - "honorific_prefix", + "contact_type", models.CharField( - help_text="One or more honorifics preceding a person's name", - max_length=128, - verbose_name="honorific prefix", - blank=True, + choices=[ + ("ADDRESS", "Address"), + ("EMAIL", "Email"), + ("URL", "Url"), + ("MAIL", "Snail mail"), + ("TWITTER", "Twitter"), + ("FACEBOOK", "Facebook"), + ("PHONE", "Telephone"), + ("MOBILE", "Mobile"), + ("TEXT", "Text"), + ("VOICE", "Voice"), + ("FAX", "Fax"), + ("CELL", "Cell"), + ("VIDEO", "Video"), + ("PAGER", "Pager"), + ("TEXTPHONE", "Textphone"), + ], + help_text="A type of medium, e.g. 'fax' or 'email'", + max_length=12, + verbose_name="type", ), ), ( - "honorific_suffix", + "value", models.CharField( - help_text="One or more honorifics following a person's name", - max_length=128, - verbose_name="honorific suffix", - blank=True, + help_text="A value, e.g. a phone number or email address", + max_length=512, + verbose_name="value", ), ), ( - "patronymic_name", + "note", models.CharField( - help_text="One or more patronymic names", - max_length=128, - verbose_name="patronymic name", blank=True, + help_text="A note, e.g. for grouping contact details by physical location", + max_length=512, + verbose_name="note", ), ), ( - "sort_name", - models.CharField( - help_text="A name to use in an lexicographically ordered list", - max_length=128, - verbose_name="sort name", + "content_type", + models.ForeignKey( blank=True, + null=True, + on_delete=django.db.models.deletion.CASCADE, + to="contenttypes.contenttype", ), ), + ], + options={"abstract": False}, + ), + migrations.CreateModel( + name="OtherName", + fields=[ ( - "email", - models.EmailField( - help_text="A preferred email address", - max_length=254, - null=True, - verbose_name="email", - blank=True, + "id", + models.AutoField( + auto_created=True, + primary_key=True, + serialize=False, + verbose_name="ID", ), ), ( - "gender", - models.CharField( - help_text="A gender", - max_length=128, - verbose_name="gender", - blank=True, - ), + "object_id", + models.PositiveIntegerField(blank=True, null=True), ), ( - "birth_date", + "start_date", models.CharField( - help_text="A date of birth", - max_length=10, - verbose_name="birth date", blank=True, + help_text="The date when the validity of the item starts", + max_length=10, + null=True, + validators=[ + django.core.validators.RegexValidator( + message="Date has wrong format", + regex="^[0-9]{4}(-[0-9]{2}){0,2}$", + ), + popolo.behaviors.models.validate_partial_date, + ], + verbose_name="start date", ), ), ( - "death_date", + "end_date", models.CharField( - help_text="A date of death", - max_length=10, - verbose_name="death date", blank=True, + help_text="The date when the validity of the item ends", + max_length=10, + null=True, + validators=[ + django.core.validators.RegexValidator( + message="Date has wrong format", + regex="^[0-9]{4}(-[0-9]{2}){0,2}$", + ), + popolo.behaviors.models.validate_partial_date, + ], + verbose_name="end date", ), ), ( - "summary", + "name", models.CharField( - help_text="A one-line account of a person's life", + help_text="An alternate or former name", max_length=512, - verbose_name="summary", - blank=True, + verbose_name="name", ), ), ( - "biography", - models.TextField( - help_text="An extended account of a person's life", - verbose_name="biography", + "note", + models.CharField( blank=True, + help_text="A note, e.g. 'Birth name'", + max_length=1024, + verbose_name="note", ), ), ( - "image", - models.URLField( - help_text="A URL of a head shot", - null=True, - verbose_name="image", + "content_type", + models.ForeignKey( blank=True, + null=True, + on_delete=django.db.models.deletion.CASCADE, + to="contenttypes.contenttype", ), ), ], - options={"abstract": False}, + options={ + "ordering": ("name",), + "unique_together": {("name", "object_id", "content_type")}, + }, ), migrations.CreateModel( - name="Post", + name="Membership", fields=[ ( "id", models.AutoField( - verbose_name="ID", - serialize=False, auto_created=True, primary_key=True, + serialize=False, + verbose_name="ID", + ), + ), + ( + "created", + model_utils.fields.AutoCreatedField( + default=django.utils.timezone.now, + editable=False, + verbose_name="created", ), ), ( "start_date", models.CharField( + blank=True, + help_text="The date when the validity of the item starts", + max_length=10, + null=True, validators=[ django.core.validators.RegexValidator( - regex=b"^[0-9]{4}(-[0-9]{2}){0,2}$", - message=b"Date has wrong format", + message="Date has wrong format", + regex="^[0-9]{4}(-[0-9]{2}){0,2}$", ), popolo.behaviors.models.validate_partial_date, ], - max_length=10, - blank=True, - help_text="The date when the validity of the item starts", - null=True, verbose_name="start date", ), ), ( "end_date", models.CharField( + blank=True, + help_text="The date when the validity of the item ends", + max_length=10, + null=True, validators=[ django.core.validators.RegexValidator( - regex=b"^[0-9]{4}(-[0-9]{2}){0,2}$", - message=b"Date has wrong format", + message="Date has wrong format", + regex="^[0-9]{4}(-[0-9]{2}){0,2}$", ), popolo.behaviors.models.validate_partial_date, ], - max_length=10, - blank=True, - help_text="The date when the validity of the item ends", - null=True, verbose_name="end date", ), ), ( - "created_at", - model_utils.fields.AutoCreatedField( - default=django.utils.timezone.now, - verbose_name="creation time", - editable=False, - ), - ), - ( - "updated_at", - model_utils.fields.AutoLastModifiedField( - default=django.utils.timezone.now, - verbose_name="last modification time", - editable=False, + "modified", + django_extensions.db.fields.ModificationDateTimeField( + auto_now=True, db_index=True, verbose_name="modified" ), ), ( "label", models.CharField( - help_text="A label describing the post", - max_length=128, + blank=True, + help_text="A label describing the membership", + max_length=512, verbose_name="label", ), ), ( "role", models.CharField( - help_text="The function that the holder of the post fulfills", - max_length=128, + blank=True, + help_text="The role that the person fulfills in the organization", + max_length=512, verbose_name="role", + ), + ), + ( + "party_name", + models.CharField( + help_text="The name of the associated party at the time of this membership. This is useful if the associated party subsequently changed name", + max_length=255, + ), + ), + ( + "party_description_text", + models.CharField( blank=True, + help_text="The text of the party description at the time of this membership. This is useful if the associated party description subsequently changed", + max_length=800, ), ), + ("elected", models.BooleanField(null=True)), ( - "organization", + "party_list_position", + models.PositiveSmallIntegerField(null=True), + ), + ( + "ballot", models.ForeignKey( - related_name="posts", - to="popolo.Organization", - help_text="The organization in which the post is held", - on_delete=models.CASCADE, + on_delete=django.db.models.deletion.CASCADE, + to="candidates.ballot", ), ), - ], - options={"abstract": False}, - ), - migrations.CreateModel( - name="Source", - fields=[ ( - "id", - models.AutoField( - verbose_name="ID", - serialize=False, - auto_created=True, - primary_key=True, + "party", + models.ForeignKey( + help_text="The political party for this membership", + null=True, + on_delete=django.db.models.deletion.PROTECT, + to="parties.party", ), ), - ("object_id", models.PositiveIntegerField()), - ("url", models.URLField(help_text="A URL", verbose_name="url")), ( - "note", - models.CharField( - help_text="A note, e.g. 'Parliament website'", - max_length=128, - verbose_name="note", + "party_description", + models.ForeignKey( blank=True, + help_text="The party description for this membership", + null=True, + on_delete=django.db.models.deletion.SET_NULL, + to="parties.partydescription", ), ), ( - "content_type", + "person", + models.ForeignKey( + help_text="The person who is a party to the relationship", + on_delete=django.db.models.deletion.CASCADE, + related_name="memberships", + to="people.person", + ), + ), + ( + "post", models.ForeignKey( - to="contenttypes.ContentType", on_delete=models.CASCADE + blank=True, + help_text="The post held by the person in the organization through this membership", + null=True, + on_delete=django.db.models.deletion.CASCADE, + related_name="memberships", + to="popolo.post", ), ), ], - options={"abstract": False}, - ), - migrations.AddField( - model_name="membership", - name="on_behalf_of", - field=models.ForeignKey( - related_name="memberships_on_behalf_of", - blank=True, - to="popolo.Organization", - help_text="The organization on whose behalf the person is a party to the relationship", - null=True, - on_delete=models.CASCADE, - ), - ), - migrations.AddField( - model_name="membership", - name="organization", - field=models.ForeignKey( - related_name="memberships", - to="popolo.Organization", - help_text="The organization that is a party to the relationship", - on_delete=models.CASCADE, - ), - ), - migrations.AddField( - model_name="membership", - name="person", - field=models.ForeignKey( - related_name="memberships", - to="popolo.Person", - help_text="The person who is a party to the relationship", - on_delete=models.CASCADE, - ), - ), - migrations.AddField( - model_name="membership", - name="post", - field=models.ForeignKey( - related_name="memberships", - blank=True, - to="popolo.Post", - help_text="The post held by the person in the organization through this membership", - null=True, - on_delete=models.CASCADE, - ), + options={ + "ordering": ( + "party__name", + "party_list_position", + "person__name", + ), + "unique_together": {("person", "ballot")}, + }, ), ] diff --git a/ynr/apps/popolo/migrations/0002_update_models_from_upstream.py b/ynr/apps/popolo/migrations/0002_update_models_from_upstream.py deleted file mode 100644 index 72ded1cfb1..0000000000 --- a/ynr/apps/popolo/migrations/0002_update_models_from_upstream.py +++ /dev/null @@ -1,618 +0,0 @@ -import django.core.validators -import django.utils.timezone -import model_utils.fields -from django.db import migrations, models - -import popolo.behaviors.models - - -class Migration(migrations.Migration): - - dependencies = [ - ("contenttypes", "0001_initial"), - ("popolo", "0001_initial"), - ] - - operations = [ - migrations.CreateModel( - name="Area", - fields=[ - ( - "id", - models.AutoField( - verbose_name="ID", - serialize=False, - auto_created=True, - primary_key=True, - ), - ), - ( - "object_id", - models.PositiveIntegerField(null=True, blank=True), - ), - ( - "start_date", - models.CharField( - validators=[ - django.core.validators.RegexValidator( - regex=b"^[0-9]{4}(-[0-9]{2}){0,2}$", - message=b"Date has wrong format", - ), - popolo.behaviors.models.validate_partial_date, - ], - max_length=10, - blank=True, - help_text="The date when the validity of the item starts", - null=True, - verbose_name="start date", - ), - ), - ( - "end_date", - models.CharField( - validators=[ - django.core.validators.RegexValidator( - regex=b"^[0-9]{4}(-[0-9]{2}){0,2}$", - message=b"Date has wrong format", - ), - popolo.behaviors.models.validate_partial_date, - ], - max_length=10, - blank=True, - help_text="The date when the validity of the item ends", - null=True, - verbose_name="end date", - ), - ), - ( - "created_at", - model_utils.fields.AutoCreatedField( - default=django.utils.timezone.now, - verbose_name="creation time", - editable=False, - ), - ), - ( - "updated_at", - model_utils.fields.AutoLastModifiedField( - default=django.utils.timezone.now, - verbose_name="last modification time", - editable=False, - ), - ), - ( - "name", - models.CharField( - help_text="A primary name", - max_length=256, - verbose_name="name", - blank=True, - ), - ), - ( - "identifier", - models.CharField( - help_text="An issued identifier", - max_length=512, - verbose_name="identifier", - blank=True, - ), - ), - ( - "classification", - models.CharField( - help_text="An area category, e.g. city", - max_length=512, - verbose_name="identifier", - blank=True, - ), - ), - ( - "geom", - models.TextField( - help_text="A geometry", - null=True, - verbose_name="geom", - blank=True, - ), - ), - ( - "inhabitants", - models.IntegerField( - help_text="The total number of inhabitants", - null=True, - verbose_name="inhabitants", - blank=True, - ), - ), - ( - "content_type", - models.ForeignKey( - blank=True, - to="contenttypes.ContentType", - null=True, - on_delete=models.CASCADE, - ), - ), - ( - "parent", - models.ForeignKey( - related_name="children", - blank=True, - to="popolo.Area", - help_text="The area that contains this area", - null=True, - on_delete=models.CASCADE, - ), - ), - ], - options={"abstract": False}, - ), - migrations.CreateModel( - name="AreaI18Name", - fields=[ - ( - "id", - models.AutoField( - verbose_name="ID", - serialize=False, - auto_created=True, - primary_key=True, - ), - ), - ("name", models.CharField(max_length=255, verbose_name="name")), - ( - "area", - models.ForeignKey( - related_name="i18n_names", - to="popolo.Area", - on_delete=models.CASCADE, - ), - ), - ], - options={ - "verbose_name": "I18N Name", - "verbose_name_plural": "I18N Names", - }, - ), - migrations.CreateModel( - name="Language", - fields=[ - ( - "id", - models.AutoField( - verbose_name="ID", - serialize=False, - auto_created=True, - primary_key=True, - ), - ), - ( - "dbpedia_resource", - models.CharField( - help_text="DbPedia URI of the resource", - unique=True, - max_length=255, - ), - ), - ("iso639_1_code", models.CharField(max_length=2)), - ( - "name", - models.CharField( - help_text="English name of the language", max_length=128 - ), - ), - ], - ), - migrations.AlterModelOptions( - name="person", options={"verbose_name_plural": "People"} - ), - migrations.AddField( - model_name="organization", - name="description", - field=models.TextField( - help_text="An extended description of an organization", - verbose_name="biography", - blank=True, - ), - ), - migrations.AddField( - model_name="organization", - name="image", - field=models.URLField( - help_text="A URL of an image, to identify the organization visually", - null=True, - verbose_name="image", - blank=True, - ), - ), - migrations.AddField( - model_name="organization", - name="summary", - field=models.CharField( - help_text="A one-line description of an organization", - max_length=1024, - verbose_name="summary", - blank=True, - ), - ), - migrations.AddField( - model_name="person", - name="national_identity", - field=models.CharField( - help_text="A national identity", - max_length=128, - null=True, - verbose_name="national identity", - blank=True, - ), - ), - migrations.AddField( - model_name="post", - name="other_label", - field=models.CharField( - help_text="An alternate label, such as an abbreviation", - max_length=512, - null=True, - verbose_name="other label", - blank=True, - ), - ), - migrations.AlterField( - model_name="contactdetail", - name="contact_type", - field=models.CharField( - help_text="A type of medium, e.g. 'fax' or 'email'", - max_length=12, - verbose_name="type", - choices=[ - (b"ADDRESS", "Address"), - (b"EMAIL", "Email"), - (b"URL", "Url"), - (b"MAIL", "Snail mail"), - (b"TWITTER", "Twitter"), - (b"FACEBOOK", "Facebook"), - (b"PHONE", "Telephone"), - (b"MOBILE", "Mobile"), - (b"TEXT", "Text"), - (b"VOICE", "Voice"), - (b"FAX", "Fax"), - (b"CELL", "Cell"), - (b"VIDEO", "Video"), - (b"PAGER", "Pager"), - (b"TEXTPHONE", "Textphone"), - ], - ), - ), - migrations.AlterField( - model_name="contactdetail", - name="content_type", - field=models.ForeignKey( - blank=True, - to="contenttypes.ContentType", - null=True, - on_delete=models.CASCADE, - ), - ), - migrations.AlterField( - model_name="contactdetail", - name="label", - field=models.CharField( - help_text="A human-readable label for the contact detail", - max_length=512, - verbose_name="label", - blank=True, - ), - ), - migrations.AlterField( - model_name="contactdetail", - name="note", - field=models.CharField( - help_text="A note, e.g. for grouping contact details by physical location", - max_length=512, - verbose_name="note", - blank=True, - ), - ), - migrations.AlterField( - model_name="contactdetail", - name="object_id", - field=models.PositiveIntegerField(null=True, blank=True), - ), - migrations.AlterField( - model_name="contactdetail", - name="value", - field=models.CharField( - help_text="A value, e.g. a phone number or email address", - max_length=512, - verbose_name="value", - ), - ), - migrations.AlterField( - model_name="identifier", - name="content_type", - field=models.ForeignKey( - blank=True, - to="contenttypes.ContentType", - null=True, - on_delete=models.CASCADE, - ), - ), - migrations.AlterField( - model_name="identifier", - name="identifier", - field=models.CharField( - help_text="An issued identifier, e.g. a DUNS number", - max_length=512, - verbose_name="identifier", - ), - ), - migrations.AlterField( - model_name="identifier", - name="object_id", - field=models.PositiveIntegerField(null=True, blank=True), - ), - migrations.AlterField( - model_name="link", - name="content_type", - field=models.ForeignKey( - blank=True, - to="contenttypes.ContentType", - null=True, - on_delete=models.CASCADE, - ), - ), - migrations.AlterField( - model_name="link", - name="note", - field=models.CharField( - help_text="A note, e.g. 'Wikipedia page'", - max_length=512, - verbose_name="note", - blank=True, - ), - ), - migrations.AlterField( - model_name="link", - name="object_id", - field=models.PositiveIntegerField(null=True, blank=True), - ), - migrations.AlterField( - model_name="link", - name="url", - field=models.URLField( - help_text="A URL", max_length=350, verbose_name="url" - ), - ), - migrations.AlterField( - model_name="membership", - name="label", - field=models.CharField( - help_text="A label describing the membership", - max_length=512, - verbose_name="label", - blank=True, - ), - ), - migrations.AlterField( - model_name="membership", - name="organization", - field=models.ForeignKey( - related_name="memberships", - blank=True, - to="popolo.Organization", - help_text="The organization that is a party to the relationship", - null=True, - on_delete=models.CASCADE, - ), - ), - migrations.AlterField( - model_name="membership", - name="role", - field=models.CharField( - help_text="The role that the person fulfills in the organization", - max_length=512, - verbose_name="role", - blank=True, - ), - ), - migrations.AlterField( - model_name="organization", - name="classification", - field=models.CharField( - help_text="An organization category, e.g. committee", - max_length=512, - verbose_name="classification", - blank=True, - ), - ), - migrations.AlterField( - model_name="organization", - name="dissolution_date", - field=models.CharField( - validators=[ - django.core.validators.RegexValidator( - regex=b"^[0-9]{4}(-[0-9]{2}){0,2}$", - message=b"dissolution date must follow the given pattern: ^[0-9]{4}(-[0-9]{2}){0,2}$", - code=b"invalid_dissolution_date", - ) - ], - max_length=10, - blank=True, - help_text="A date of dissolution", - null=True, - verbose_name="dissolution date", - ), - ), - migrations.AlterField( - model_name="organization", - name="founding_date", - field=models.CharField( - validators=[ - django.core.validators.RegexValidator( - regex=b"^[0-9]{4}(-[0-9]{2}){0,2}$", - message=b"founding date must follow the given pattern: ^[0-9]{4}(-[0-9]{2}){0,2}$", - code=b"invalid_founding_date", - ) - ], - max_length=10, - blank=True, - help_text="A date of founding", - null=True, - verbose_name="founding date", - ), - ), - migrations.AlterField( - model_name="organization", - name="name", - field=models.CharField( - help_text="A primary name, e.g. a legally recognized name", - max_length=512, - verbose_name="name", - ), - ), - migrations.AlterField( - model_name="othername", - name="content_type", - field=models.ForeignKey( - blank=True, - to="contenttypes.ContentType", - null=True, - on_delete=models.CASCADE, - ), - ), - migrations.AlterField( - model_name="othername", - name="name", - field=models.CharField( - help_text="An alternate or former name", - max_length=512, - verbose_name="name", - ), - ), - migrations.AlterField( - model_name="othername", - name="note", - field=models.CharField( - help_text="A note, e.g. 'Birth name'", - max_length=1024, - verbose_name="note", - blank=True, - ), - ), - migrations.AlterField( - model_name="othername", - name="object_id", - field=models.PositiveIntegerField(null=True, blank=True), - ), - migrations.AlterField( - model_name="person", - name="name", - field=models.CharField( - help_text="A person's preferred full name", - max_length=512, - verbose_name="name", - ), - ), - migrations.AlterField( - model_name="person", - name="summary", - field=models.CharField( - help_text="A one-line account of a person's life", - max_length=1024, - verbose_name="summary", - blank=True, - ), - ), - migrations.AlterField( - model_name="post", - name="label", - field=models.CharField( - help_text="A label describing the post", - max_length=512, - verbose_name="label", - blank=True, - ), - ), - migrations.AlterField( - model_name="post", - name="role", - field=models.CharField( - help_text="The function that the holder of the post fulfills", - max_length=512, - verbose_name="role", - blank=True, - ), - ), - migrations.AlterField( - model_name="source", - name="content_type", - field=models.ForeignKey( - blank=True, - to="contenttypes.ContentType", - null=True, - on_delete=models.CASCADE, - ), - ), - migrations.AlterField( - model_name="source", - name="note", - field=models.CharField( - help_text="A note, e.g. 'Parliament website'", - max_length=512, - verbose_name="note", - blank=True, - ), - ), - migrations.AlterField( - model_name="source", - name="object_id", - field=models.PositiveIntegerField(null=True, blank=True), - ), - migrations.AddField( - model_name="areai18name", - name="language", - field=models.ForeignKey( - to="popolo.Language", on_delete=models.CASCADE - ), - ), - migrations.AddField( - model_name="membership", - name="area", - field=models.ForeignKey( - related_name="memberships", - blank=True, - to="popolo.Area", - help_text="The geographic area to which the post is related", - null=True, - on_delete=models.CASCADE, - ), - ), - migrations.AddField( - model_name="organization", - name="area", - field=models.ForeignKey( - related_name="organizations", - blank=True, - to="popolo.Area", - help_text="The geographic area to which this organization is related", - null=True, - on_delete=models.CASCADE, - ), - ), - migrations.AddField( - model_name="post", - name="area", - field=models.ForeignKey( - related_name="posts", - blank=True, - to="popolo.Area", - help_text="The geographic area to which the post is related", - null=True, - on_delete=models.CASCADE, - ), - ), - migrations.AlterUniqueTogether( - name="areai18name", unique_together={("area", "language", "name")} - ), - ] diff --git a/ynr/apps/popolo/migrations/0003_move-extra-fields-to-base.py b/ynr/apps/popolo/migrations/0003_move-extra-fields-to-base.py deleted file mode 100644 index f413fc452c..0000000000 --- a/ynr/apps/popolo/migrations/0003_move-extra-fields-to-base.py +++ /dev/null @@ -1,36 +0,0 @@ -# Generated by Django 1.9.13 on 2018-05-18 10:17 - - -import django.core.validators -import django.db.models.deletion -from django.db import migrations, models - - -class Migration(migrations.Migration): - - dependencies = [ - ("candidates", "0044_remove_membership_fk_to_election"), - ("popolo", "0002_update_models_from_upstream"), - ] - - operations = [ - migrations.AddField( - model_name="membership", - name="elected", - field=models.NullBooleanField(), - ), - migrations.AddField( - model_name="membership", - name="party_list_position", - field=models.IntegerField(null=True), - ), - migrations.AddField( - model_name="membership", - name="post_election", - field=models.ForeignKey( - null=True, - on_delete=django.db.models.deletion.CASCADE, - to="candidates.PostExtraElection", - ), - ), - ] diff --git a/ynr/apps/popolo/migrations/0004_move-extra-data-to-base.py b/ynr/apps/popolo/migrations/0004_move-extra-data-to-base.py deleted file mode 100644 index 457f738337..0000000000 --- a/ynr/apps/popolo/migrations/0004_move-extra-data-to-base.py +++ /dev/null @@ -1,28 +0,0 @@ -# Generated by Django 1.9.13 on 2018-05-18 10:40 - - -from django.db import migrations - - -def add_extra_fields_to_base(apps, schema_editor): - Membership = apps.get_model("popolo", "Membership") - - # First, delete any Membership objects with no extra - Membership.objects.filter(extra=None).delete() - - for base in Membership.objects.all().select_related("extra"): - base.elected = base.extra.elected - base.party_list_position = base.extra.party_list_position - base.post_election = base.extra.post_election - base.save() - - -class Migration(migrations.Migration): - - dependencies = [("popolo", "0003_move-extra-fields-to-base")] - - operations = [ - migrations.RunPython( - add_extra_fields_to_base, migrations.RunPython.noop - ) - ] diff --git a/ynr/apps/popolo/migrations/0005_set_post_election_not_null_.py b/ynr/apps/popolo/migrations/0005_set_post_election_not_null_.py deleted file mode 100644 index 6476735608..0000000000 --- a/ynr/apps/popolo/migrations/0005_set_post_election_not_null_.py +++ /dev/null @@ -1,23 +0,0 @@ -# Generated by Django 1.9.13 on 2018-05-18 10:44 - - -import django.core.validators -import django.db.models.deletion -from django.db import migrations, models - - -class Migration(migrations.Migration): - - dependencies = [("popolo", "0004_move-extra-data-to-base")] - - -operations = [ - migrations.AlterField( - model_name="membership", - name="post_election", - field=models.ForeignKey( - on_delete=django.db.models.deletion.CASCADE, - to="candidates.PostExtraElection", - ), - ) -] diff --git a/ynr/apps/popolo/migrations/0006_membership_unique_together.py b/ynr/apps/popolo/migrations/0006_membership_unique_together.py deleted file mode 100644 index 7018011400..0000000000 --- a/ynr/apps/popolo/migrations/0006_membership_unique_together.py +++ /dev/null @@ -1,15 +0,0 @@ -# Generated by Django 1.9.13 on 2018-05-31 15:09 - - -from django.db import migrations - - -class Migration(migrations.Migration): - - dependencies = [("popolo", "0005_set_post_election_not_null_")] - - operations = [ - migrations.AlterUniqueTogether( - name="membership", unique_together={("person", "post_election")} - ) - ] diff --git a/ynr/apps/popolo/migrations/0007_python_3_migrations.py b/ynr/apps/popolo/migrations/0007_python_3_migrations.py deleted file mode 100644 index dbc5dc29fe..0000000000 --- a/ynr/apps/popolo/migrations/0007_python_3_migrations.py +++ /dev/null @@ -1,339 +0,0 @@ -# -*- coding: utf-8 -*- -# Generated by Django 1.10.8 on 2018-08-14 16:59 -from __future__ import unicode_literals - -import django.core.validators -import django.db.models.deletion -from django.db import migrations, models - -import popolo.behaviors.models - - -class Migration(migrations.Migration): - - dependencies = [("popolo", "0006_membership_unique_together")] - - operations = [ - migrations.AlterField( - model_name="area", - name="end_date", - field=models.CharField( - blank=True, - help_text="The date when the validity of the item ends", - max_length=10, - null=True, - validators=[ - django.core.validators.RegexValidator( - message="Date has wrong format", - regex="^[0-9]{4}(-[0-9]{2}){0,2}$", - ), - popolo.behaviors.models.validate_partial_date, - ], - verbose_name="end date", - ), - ), - migrations.AlterField( - model_name="area", - name="start_date", - field=models.CharField( - blank=True, - help_text="The date when the validity of the item starts", - max_length=10, - null=True, - validators=[ - django.core.validators.RegexValidator( - message="Date has wrong format", - regex="^[0-9]{4}(-[0-9]{2}){0,2}$", - ), - popolo.behaviors.models.validate_partial_date, - ], - verbose_name="start date", - ), - ), - migrations.AlterField( - model_name="contactdetail", - name="contact_type", - field=models.CharField( - choices=[ - ("ADDRESS", "Address"), - ("EMAIL", "Email"), - ("URL", "Url"), - ("MAIL", "Snail mail"), - ("TWITTER", "Twitter"), - ("FACEBOOK", "Facebook"), - ("PHONE", "Telephone"), - ("MOBILE", "Mobile"), - ("TEXT", "Text"), - ("VOICE", "Voice"), - ("FAX", "Fax"), - ("CELL", "Cell"), - ("VIDEO", "Video"), - ("PAGER", "Pager"), - ("TEXTPHONE", "Textphone"), - ], - help_text="A type of medium, e.g. 'fax' or 'email'", - max_length=12, - verbose_name="type", - ), - ), - migrations.AlterField( - model_name="contactdetail", - name="end_date", - field=models.CharField( - blank=True, - help_text="The date when the validity of the item ends", - max_length=10, - null=True, - validators=[ - django.core.validators.RegexValidator( - message="Date has wrong format", - regex="^[0-9]{4}(-[0-9]{2}){0,2}$", - ), - popolo.behaviors.models.validate_partial_date, - ], - verbose_name="end date", - ), - ), - migrations.AlterField( - model_name="contactdetail", - name="start_date", - field=models.CharField( - blank=True, - help_text="The date when the validity of the item starts", - max_length=10, - null=True, - validators=[ - django.core.validators.RegexValidator( - message="Date has wrong format", - regex="^[0-9]{4}(-[0-9]{2}){0,2}$", - ), - popolo.behaviors.models.validate_partial_date, - ], - verbose_name="start date", - ), - ), - migrations.AlterField( - model_name="membership", - name="end_date", - field=models.CharField( - blank=True, - help_text="The date when the validity of the item ends", - max_length=10, - null=True, - validators=[ - django.core.validators.RegexValidator( - message="Date has wrong format", - regex="^[0-9]{4}(-[0-9]{2}){0,2}$", - ), - popolo.behaviors.models.validate_partial_date, - ], - verbose_name="end date", - ), - ), - migrations.AlterField( - model_name="membership", - name="post_election", - field=models.ForeignKey( - on_delete=django.db.models.deletion.CASCADE, - to="candidates.PostExtraElection", - ), - ), - migrations.AlterField( - model_name="membership", - name="start_date", - field=models.CharField( - blank=True, - help_text="The date when the validity of the item starts", - max_length=10, - null=True, - validators=[ - django.core.validators.RegexValidator( - message="Date has wrong format", - regex="^[0-9]{4}(-[0-9]{2}){0,2}$", - ), - popolo.behaviors.models.validate_partial_date, - ], - verbose_name="start date", - ), - ), - migrations.AlterField( - model_name="organization", - name="dissolution_date", - field=models.CharField( - blank=True, - help_text="A date of dissolution", - max_length=10, - null=True, - validators=[ - django.core.validators.RegexValidator( - code="invalid_dissolution_date", - message="dissolution date must follow the given pattern: ^[0-9]{4}(-[0-9]{2}){0,2}$", - regex="^[0-9]{4}(-[0-9]{2}){0,2}$", - ) - ], - verbose_name="dissolution date", - ), - ), - migrations.AlterField( - model_name="organization", - name="end_date", - field=models.CharField( - blank=True, - help_text="The date when the validity of the item ends", - max_length=10, - null=True, - validators=[ - django.core.validators.RegexValidator( - message="Date has wrong format", - regex="^[0-9]{4}(-[0-9]{2}){0,2}$", - ), - popolo.behaviors.models.validate_partial_date, - ], - verbose_name="end date", - ), - ), - migrations.AlterField( - model_name="organization", - name="founding_date", - field=models.CharField( - blank=True, - help_text="A date of founding", - max_length=10, - null=True, - validators=[ - django.core.validators.RegexValidator( - code="invalid_founding_date", - message="founding date must follow the given pattern: ^[0-9]{4}(-[0-9]{2}){0,2}$", - regex="^[0-9]{4}(-[0-9]{2}){0,2}$", - ) - ], - verbose_name="founding date", - ), - ), - migrations.AlterField( - model_name="organization", - name="start_date", - field=models.CharField( - blank=True, - help_text="The date when the validity of the item starts", - max_length=10, - null=True, - validators=[ - django.core.validators.RegexValidator( - message="Date has wrong format", - regex="^[0-9]{4}(-[0-9]{2}){0,2}$", - ), - popolo.behaviors.models.validate_partial_date, - ], - verbose_name="start date", - ), - ), - migrations.AlterField( - model_name="othername", - name="end_date", - field=models.CharField( - blank=True, - help_text="The date when the validity of the item ends", - max_length=10, - null=True, - validators=[ - django.core.validators.RegexValidator( - message="Date has wrong format", - regex="^[0-9]{4}(-[0-9]{2}){0,2}$", - ), - popolo.behaviors.models.validate_partial_date, - ], - verbose_name="end date", - ), - ), - migrations.AlterField( - model_name="othername", - name="start_date", - field=models.CharField( - blank=True, - help_text="The date when the validity of the item starts", - max_length=10, - null=True, - validators=[ - django.core.validators.RegexValidator( - message="Date has wrong format", - regex="^[0-9]{4}(-[0-9]{2}){0,2}$", - ), - popolo.behaviors.models.validate_partial_date, - ], - verbose_name="start date", - ), - ), - migrations.AlterField( - model_name="person", - name="end_date", - field=models.CharField( - blank=True, - help_text="The date when the validity of the item ends", - max_length=10, - null=True, - validators=[ - django.core.validators.RegexValidator( - message="Date has wrong format", - regex="^[0-9]{4}(-[0-9]{2}){0,2}$", - ), - popolo.behaviors.models.validate_partial_date, - ], - verbose_name="end date", - ), - ), - migrations.AlterField( - model_name="person", - name="start_date", - field=models.CharField( - blank=True, - help_text="The date when the validity of the item starts", - max_length=10, - null=True, - validators=[ - django.core.validators.RegexValidator( - message="Date has wrong format", - regex="^[0-9]{4}(-[0-9]{2}){0,2}$", - ), - popolo.behaviors.models.validate_partial_date, - ], - verbose_name="start date", - ), - ), - migrations.AlterField( - model_name="post", - name="end_date", - field=models.CharField( - blank=True, - help_text="The date when the validity of the item ends", - max_length=10, - null=True, - validators=[ - django.core.validators.RegexValidator( - message="Date has wrong format", - regex="^[0-9]{4}(-[0-9]{2}){0,2}$", - ), - popolo.behaviors.models.validate_partial_date, - ], - verbose_name="end date", - ), - ), - migrations.AlterField( - model_name="post", - name="start_date", - field=models.CharField( - blank=True, - help_text="The date when the validity of the item starts", - max_length=10, - null=True, - validators=[ - django.core.validators.RegexValidator( - message="Date has wrong format", - regex="^[0-9]{4}(-[0-9]{2}){0,2}$", - ), - popolo.behaviors.models.validate_partial_date, - ], - verbose_name="start date", - ), - ), - ] diff --git a/ynr/apps/popolo/migrations/0008_add_person_extra_fields.py b/ynr/apps/popolo/migrations/0008_add_person_extra_fields.py deleted file mode 100644 index 360a292f8a..0000000000 --- a/ynr/apps/popolo/migrations/0008_add_person_extra_fields.py +++ /dev/null @@ -1,25 +0,0 @@ -# -*- coding: utf-8 -*- -# Generated by Django 1.10.8 on 2018-08-14 17:04 -from __future__ import unicode_literals - -from django.db import migrations, models - - -class Migration(migrations.Migration): - - dependencies = [("popolo", "0007_python_3_migrations")] - - operations = [ - migrations.AddField( - model_name="person", - name="versions", - field=models.TextField(blank=True), - ), - migrations.AddField( - model_name="person", - name="not_standing", - field=models.ManyToManyField( - related_name="persons_not_standing_tmp", to="elections.Election" - ), - ), - ] diff --git a/ynr/apps/popolo/migrations/0009_move_extra_person_data_to_base.py b/ynr/apps/popolo/migrations/0009_move_extra_person_data_to_base.py deleted file mode 100644 index 776e2ee968..0000000000 --- a/ynr/apps/popolo/migrations/0009_move_extra_person_data_to_base.py +++ /dev/null @@ -1,16 +0,0 @@ -# -*- coding: utf-8 -*- -# Generated by Django 1.10.8 on 2018-08-14 17:04 -from __future__ import unicode_literals - -from django.db import migrations - - -class Migration(migrations.Migration): - - dependencies = [("popolo", "0008_add_person_extra_fields")] - - operations = [ - migrations.RunPython( - migrations.RunPython.noop, migrations.RunPython.noop - ) - ] diff --git a/ynr/apps/popolo/migrations/0010_rename_not_standing_related_name.py b/ynr/apps/popolo/migrations/0010_rename_not_standing_related_name.py deleted file mode 100644 index 98fc07c46e..0000000000 --- a/ynr/apps/popolo/migrations/0010_rename_not_standing_related_name.py +++ /dev/null @@ -1,23 +0,0 @@ -# -*- coding: utf-8 -*- -# Generated by Django 1.10.8 on 2018-08-17 10:56 -from __future__ import unicode_literals - -from django.db import migrations, models - - -class Migration(migrations.Migration): - - dependencies = [ - ("candidates", "0046_delete_person_extra"), - ("popolo", "0009_move_extra_person_data_to_base"), - ] - - operations = [ - migrations.AlterField( - model_name="person", - name="not_standing", - field=models.ManyToManyField( - related_name="persons_not_standing", to="elections.Election" - ), - ) - ] diff --git a/ynr/apps/popolo/migrations/0011_add_post_extra_fields.py b/ynr/apps/popolo/migrations/0011_add_post_extra_fields.py deleted file mode 100644 index e5c8097e94..0000000000 --- a/ynr/apps/popolo/migrations/0011_add_post_extra_fields.py +++ /dev/null @@ -1,43 +0,0 @@ -# -*- coding: utf-8 -*- -# Generated by Django 1.10.8 on 2018-08-21 20:42 -from __future__ import unicode_literals - -import django.db.models.deletion -from django.db import migrations, models - - -class Migration(migrations.Migration): - - dependencies = [("popolo", "0010_rename_not_standing_related_name")] - - operations = [ - migrations.AddField( - model_name="post", - name="elections", - field=models.ManyToManyField( - related_name="posts_tmp", - through="candidates.PostExtraElection", - to="elections.Election", - ), - ), - migrations.AddField( - model_name="post", - name="group", - field=models.CharField(blank=True, max_length=1024), - ), - migrations.AddField( - model_name="post", - name="party_set", - field=models.ForeignKey( - blank=True, - null=True, - on_delete=django.db.models.deletion.CASCADE, - to="candidates.PartySet", - ), - ), - migrations.AddField( - model_name="post", - name="slug", - field=models.CharField(blank=True, max_length=256, unique=False), - ), - ] diff --git a/ynr/apps/popolo/migrations/0012_move_post_extra_data_to_base.py b/ynr/apps/popolo/migrations/0012_move_post_extra_data_to_base.py deleted file mode 100644 index 352f488409..0000000000 --- a/ynr/apps/popolo/migrations/0012_move_post_extra_data_to_base.py +++ /dev/null @@ -1,32 +0,0 @@ -# -*- coding: utf-8 -*- -# Generated by Django 1.10.8 on 2018-08-21 20:44 -from __future__ import unicode_literals - -from django.db import migrations - - -def add_extra_fields_to_base(apps, schema_editor): - Post = apps.get_model("popolo", "Post") - - # First, delete any Post objects with no extra - Post.objects.filter(extra=None).delete() - - for base in Post.objects.all().select_related("extra"): - base.slug = base.extra.slug - base.group = base.extra.group - base.party_set = base.extra.party_set - base.save() - - -class Migration(migrations.Migration): - - dependencies = [ - ("candidates", "0048_move_pee_postextra_to_post"), - ("popolo", "0011_add_post_extra_fields"), - ] - - operations = [ - migrations.RunPython( - add_extra_fields_to_base, migrations.RunPython.noop - ) - ] diff --git a/ynr/apps/popolo/migrations/0013_clean_up_after_postextra_move.py b/ynr/apps/popolo/migrations/0013_clean_up_after_postextra_move.py deleted file mode 100644 index 63a2fcbe6c..0000000000 --- a/ynr/apps/popolo/migrations/0013_clean_up_after_postextra_move.py +++ /dev/null @@ -1,27 +0,0 @@ -# -*- coding: utf-8 -*- -# Generated by Django 1.10.8 on 2018-08-21 21:14 -from __future__ import unicode_literals - -from django.db import migrations, models - - -class Migration(migrations.Migration): - - dependencies = [("popolo", "0012_move_post_extra_data_to_base")] - - operations = [ - migrations.AlterField( - model_name="post", - name="slug", - field=models.CharField(blank=True, max_length=256, unique=True), - ), - migrations.AlterField( - model_name="post", - name="elections", - field=models.ManyToManyField( - related_name="posts", - through="candidates.PostExtraElection", - to="elections.Election", - ), - ), - ] diff --git a/ynr/apps/popolo/migrations/0014_membership_party.py b/ynr/apps/popolo/migrations/0014_membership_party.py deleted file mode 100644 index ded9f743d1..0000000000 --- a/ynr/apps/popolo/migrations/0014_membership_party.py +++ /dev/null @@ -1,27 +0,0 @@ -# -*- coding: utf-8 -*- -# Generated by Django 1.10.8 on 2018-09-03 13:46 -from __future__ import unicode_literals - -import django.db.models.deletion -from django.db import migrations, models - - -class Migration(migrations.Migration): - - dependencies = [ - ("parties", "0003_party_ordering"), - ("popolo", "0013_clean_up_after_postextra_move"), - ] - - operations = [ - migrations.AddField( - model_name="membership", - name="party", - field=models.ForeignKey( - help_text="The political party for this membership", - null=True, - on_delete=django.db.models.deletion.CASCADE, - to="parties.Party", - ), - ) - ] diff --git a/ynr/apps/popolo/migrations/0015_move_organization_to_parties.py b/ynr/apps/popolo/migrations/0015_move_organization_to_parties.py deleted file mode 100644 index e7373b0b0d..0000000000 --- a/ynr/apps/popolo/migrations/0015_move_organization_to_parties.py +++ /dev/null @@ -1,124 +0,0 @@ -# -*- coding: utf-8 -*- -# Generated by Django 1.10.8 on 2018-09-03 13:55 -from __future__ import unicode_literals - -from django.db import migrations - - -def copy_org_to_party(apps, schema_editor): - """ - This one is a little fiddly because: - - 1. We want to assign a Party object to each Membership. At the time this - migration runs, we might not have anything in the `Party` table. - - 2. Currently the "party" is an Organization object with a classification of - `Party`. The identifier for the party is a generic relation to - Identifier. - - 3. Because of the way that Django's `apps.get_model` works, it prevents - GenericRelations from working in migrations. This means we need to - construct some of the relation ourselves. - - To get around all of these, we need to: - - 1. Get the content type ID for Organization - 2. Get all Identifier objects with that content type - 3. Store all the Identifiers with the scheme "electoral-commission" in a - dict (ORG_PK_TO_EC_IDS) with the org PK as the key. - 4. Store all the Identifiers with a different scheme in a dict - (ORG_PK_TO_OTHER_IDS) with the org PK as the key. - 5. Iterate over all Organisations with the classification of "Party" and: - 1. Get the best ID for this party (prefer the EC ID, fall back to the - OTHER ID or slug) - 2. update_or_create a Party object - 3. Store all the parties and orgs in a dict with org as the key - 6. Iterate over the map between object types - 7. Filter Membership objects by the organisation object ID and update it - with the party object. - - Note that this migration doesn't remove any data, just copies it in to a - different format / model / field. - """ - - Membership = apps.get_model("popolo", "Membership") - Party = apps.get_model("parties", "Party") - Organization = apps.get_model("popolo", "Organization") - Identifier = apps.get_model("popolo", "Identifier") - ContentType = apps.get_model("contenttypes", "ContentType") - - organization_content_type_id = ContentType.objects.get_for_model( - Organization - ).pk - - # Set up the maps we'll need - ORG_PK_TO_EC_IDS = {} - ORG_OBJ_TO_PARTY_OBJ = {} - - # Get all the IDs used for Organizations - ids_qs = Identifier.objects.filter( - content_type_id=organization_content_type_id, - scheme="electoral-commission", - ) - - # Populate the maps with the IDs for each organisation - for identifier in ids_qs: - ORG_PK_TO_EC_IDS[identifier.object_id] = identifier.identifier - - # Get all Organisations that are parties - all_org_parties = Organization.objects.filter(classification="Party") - - for org_party in all_org_parties: - # First we need an ID for this party. - # This could take the form of an EC ID (PP01) or a psudo-party ID we've - # assigned in the past (ynmp-party:2), or a slug (joint-party:1-2) - # preferred in that order. - - if org_party.pk in ORG_PK_TO_EC_IDS: - party_id = ORG_PK_TO_EC_IDS[org_party.pk] - else: - party_id = org_party.extra.slug - - start_date = org_party.start_date - if not start_date: - # This is a hack around some parties in the live DB not having a - # start date. As we have no way of knowing in this migration what - # the correct value is, but the new Party model requires a - # `date_registered`, we have to use something. Let's just use - # the date the object was created. This has the benefit of not - # causing an internal integrity error as no memberships will exist - # for this party before it existed in our DB and should fix itself - # when the parties importer is run first / next - start_date = org_party.created_at - - # Update or create the party, using the "EC ID" that will be used by the - # party importer - party_obj, _ = Party.objects.update_or_create( - ec_id=party_id, - defaults={"name": org_party.name, "date_registered": start_date}, - ) - - # Populate the map from the org object to the party object - ORG_OBJ_TO_PARTY_OBJ[org_party] = party_obj - - for org_party, party_obj in ORG_OBJ_TO_PARTY_OBJ.items(): - # Update the memberships for this org - Membership.objects.filter(on_behalf_of_id=org_party).update( - party=party_obj - ) - - # Just make sure no memberships are left without a Party - assert Membership.objects.filter(party=None).count() == 0 - - # These numbers should be identical - if Party.objects.count() < all_org_parties.count(): - raise ValueError("More Organzation parties than Parties") - - -class Migration(migrations.Migration): - - dependencies = [("popolo", "0014_membership_party")] - - operations = [ - migrations.RunPython(copy_org_to_party, migrations.RunPython.noop) - ] diff --git a/ynr/apps/popolo/migrations/0016_remove_membership_organization.py b/ynr/apps/popolo/migrations/0016_remove_membership_organization.py deleted file mode 100644 index a65550100e..0000000000 --- a/ynr/apps/popolo/migrations/0016_remove_membership_organization.py +++ /dev/null @@ -1,14 +0,0 @@ -# -*- coding: utf-8 -*- -# Generated by Django 1.10.8 on 2018-09-03 18:53 -from __future__ import unicode_literals - -from django.db import migrations - - -class Migration(migrations.Migration): - - dependencies = [("popolo", "0015_move_organization_to_parties")] - - operations = [ - migrations.RemoveField(model_name="membership", name="organization") - ] diff --git a/ynr/apps/popolo/migrations/0017_remove_membership_on_behalf_of.py b/ynr/apps/popolo/migrations/0017_remove_membership_on_behalf_of.py deleted file mode 100644 index a5771a45a7..0000000000 --- a/ynr/apps/popolo/migrations/0017_remove_membership_on_behalf_of.py +++ /dev/null @@ -1,14 +0,0 @@ -# -*- coding: utf-8 -*- -# Generated by Django 1.10.8 on 2018-09-03 19:36 -from __future__ import unicode_literals - -from django.db import migrations - - -class Migration(migrations.Migration): - - dependencies = [("popolo", "0016_remove_membership_organization")] - - operations = [ - migrations.RemoveField(model_name="membership", name="on_behalf_of") - ] diff --git a/ynr/apps/popolo/migrations/0018_protect_membership_on_party_deletion.py b/ynr/apps/popolo/migrations/0018_protect_membership_on_party_deletion.py deleted file mode 100644 index e9a90ee2c5..0000000000 --- a/ynr/apps/popolo/migrations/0018_protect_membership_on_party_deletion.py +++ /dev/null @@ -1,24 +0,0 @@ -# -*- coding: utf-8 -*- -# Generated by Django 1.10.8 on 2018-09-13 14:37 -from __future__ import unicode_literals - -import django.db.models.deletion -from django.db import migrations, models - - -class Migration(migrations.Migration): - - dependencies = [("popolo", "0017_remove_membership_on_behalf_of")] - - operations = [ - migrations.AlterField( - model_name="membership", - name="party", - field=models.ForeignKey( - help_text="The political party for this membership", - null=True, - on_delete=django.db.models.deletion.PROTECT, - to="parties.Party", - ), - ) - ] diff --git a/ynr/apps/popolo/migrations/0019_move_organization_extra_fields_to_base.py b/ynr/apps/popolo/migrations/0019_move_organization_extra_fields_to_base.py deleted file mode 100644 index 7f6a877aab..0000000000 --- a/ynr/apps/popolo/migrations/0019_move_organization_extra_fields_to_base.py +++ /dev/null @@ -1,23 +0,0 @@ -# -*- coding: utf-8 -*- -# Generated by Django 1.10.8 on 2018-09-18 14:17 -from __future__ import unicode_literals - -from django.db import migrations, models - - -class Migration(migrations.Migration): - - dependencies = [("popolo", "0018_protect_membership_on_party_deletion")] - - operations = [ - migrations.AddField( - model_name="organization", - name="register", - field=models.CharField(blank=True, max_length=512), - ), - migrations.AddField( - model_name="organization", - name="slug", - field=models.CharField(blank=True, max_length=256, unique=False), - ), - ] diff --git a/ynr/apps/popolo/migrations/0020_move_extra_organization_data_to_base.py b/ynr/apps/popolo/migrations/0020_move_extra_organization_data_to_base.py deleted file mode 100644 index 6ca3c17704..0000000000 --- a/ynr/apps/popolo/migrations/0020_move_extra_organization_data_to_base.py +++ /dev/null @@ -1,16 +0,0 @@ -# -*- coding: utf-8 -*- -# Generated by Django 1.10.8 on 2018-09-18 14:27 -from __future__ import unicode_literals - -from django.db import migrations - - -class Migration(migrations.Migration): - - dependencies = [("popolo", "0019_move_organization_extra_fields_to_base")] - - operations = [ - migrations.RunPython( - migrations.RunPython.noop, migrations.RunPython.noop - ) - ] diff --git a/ynr/apps/popolo/migrations/0021_auto_20180918_1534.py b/ynr/apps/popolo/migrations/0021_auto_20180918_1534.py deleted file mode 100644 index 36c0f382de..0000000000 --- a/ynr/apps/popolo/migrations/0021_auto_20180918_1534.py +++ /dev/null @@ -1,18 +0,0 @@ -# -*- coding: utf-8 -*- -# Generated by Django 1.10.8 on 2018-09-18 14:34 -from __future__ import unicode_literals - -from django.db import migrations, models - - -class Migration(migrations.Migration): - - dependencies = [("popolo", "0020_move_extra_organization_data_to_base")] - - operations = [ - migrations.AlterField( - model_name="organization", - name="slug", - field=models.CharField(blank=True, max_length=256, unique=True), - ) - ] diff --git a/ynr/apps/popolo/migrations/0022_populate_person_image_from_image.py b/ynr/apps/popolo/migrations/0022_populate_person_image_from_image.py deleted file mode 100644 index 28d16b11e9..0000000000 --- a/ynr/apps/popolo/migrations/0022_populate_person_image_from_image.py +++ /dev/null @@ -1,19 +0,0 @@ -# -*- coding: utf-8 -*- -# Generated by Django 1.10.8 on 2018-09-20 11:22 -from __future__ import unicode_literals - -from django.db import migrations - - -class Migration(migrations.Migration): - - dependencies = [ - ("popolo", "0021_auto_20180918_1534"), - ("people", "0001_initial"), - ] - - operations = [ - migrations.RunPython( - migrations.RunPython.noop, migrations.RunPython.noop - ) - ] diff --git a/ynr/apps/popolo/migrations/0023_remove_area_model.py b/ynr/apps/popolo/migrations/0023_remove_area_model.py deleted file mode 100644 index f793594ee5..0000000000 --- a/ynr/apps/popolo/migrations/0023_remove_area_model.py +++ /dev/null @@ -1,25 +0,0 @@ -# -*- coding: utf-8 -*- -# Generated by Django 1.10.8 on 2018-09-26 15:37 -from __future__ import unicode_literals - -from django.db import migrations - - -class Migration(migrations.Migration): - - dependencies = [("popolo", "0022_populate_person_image_from_image")] - - operations = [ - migrations.RemoveField(model_name="area", name="content_type"), - migrations.RemoveField(model_name="area", name="parent"), - migrations.AlterUniqueTogether( - name="areai18name", unique_together=set([]) - ), - migrations.RemoveField(model_name="areai18name", name="area"), - migrations.RemoveField(model_name="areai18name", name="language"), - migrations.RemoveField(model_name="membership", name="area"), - migrations.RemoveField(model_name="organization", name="area"), - migrations.RemoveField(model_name="post", name="area"), - migrations.DeleteModel(name="Area"), - migrations.DeleteModel(name="AreaI18Name"), - ] diff --git a/ynr/apps/popolo/migrations/0024_remove_person_image.py b/ynr/apps/popolo/migrations/0024_remove_person_image.py deleted file mode 100644 index faef3daaaa..0000000000 --- a/ynr/apps/popolo/migrations/0024_remove_person_image.py +++ /dev/null @@ -1,12 +0,0 @@ -# -*- coding: utf-8 -*- -# Generated by Django 1.10.8 on 2018-10-03 18:31 -from __future__ import unicode_literals - -from django.db import migrations - - -class Migration(migrations.Migration): - - dependencies = [("popolo", "0023_remove_area_model")] - - operations = [migrations.RemoveField(model_name="person", name="image")] diff --git a/ynr/apps/popolo/migrations/0025_move_person_fk_to_people_app.py b/ynr/apps/popolo/migrations/0025_move_person_fk_to_people_app.py deleted file mode 100644 index 5ab0d37f78..0000000000 --- a/ynr/apps/popolo/migrations/0025_move_person_fk_to_people_app.py +++ /dev/null @@ -1,27 +0,0 @@ -# -*- coding: utf-8 -*- -# Generated by Django 1.10.8 on 2018-10-23 19:25 -from __future__ import unicode_literals - -import django.db.models.deletion -from django.db import migrations, models - - -class Migration(migrations.Migration): - - dependencies = [ - ("popolo", "0024_remove_person_image"), - ("people", "0004_move_person_data"), - ] - - operations = [ - migrations.AlterField( - model_name="membership", - name="person", - field=models.ForeignKey( - help_text="The person who is a party to the relationship", - on_delete=django.db.models.deletion.CASCADE, - related_name="memberships", - to="people.Person", - ), - ) - ] diff --git a/ynr/apps/popolo/migrations/0026_remove_stale_models.py b/ynr/apps/popolo/migrations/0026_remove_stale_models.py deleted file mode 100644 index 72c16b0924..0000000000 --- a/ynr/apps/popolo/migrations/0026_remove_stale_models.py +++ /dev/null @@ -1,21 +0,0 @@ -# -*- coding: utf-8 -*- -# Generated by Django 1.11.20 on 2019-04-16 11:27 -from __future__ import unicode_literals - -from django.db import migrations - - -class Migration(migrations.Migration): - - dependencies = [ - ("popolo", "0025_move_person_fk_to_people_app"), - ("uk_results", "0047_auto_20180501_1359"), - ("results", "0026_move_person_fk_to_people_app"), - ] - - operations = [ - migrations.RemoveField(model_name="link", name="content_type"), - migrations.RemoveField(model_name="person", name="not_standing"), - migrations.DeleteModel(name="Link"), - migrations.DeleteModel(name="Person"), - ] diff --git a/ynr/apps/popolo/migrations/0027_slug_org_unique_together.py b/ynr/apps/popolo/migrations/0027_slug_org_unique_together.py deleted file mode 100644 index 9c9a1034bc..0000000000 --- a/ynr/apps/popolo/migrations/0027_slug_org_unique_together.py +++ /dev/null @@ -1,31 +0,0 @@ -# -*- coding: utf-8 -*- -# Generated by Django 1.11.20 on 2019-04-22 10:03 -from __future__ import unicode_literals - -from django.db import migrations, models - - -class Migration(migrations.Migration): - - dependencies = [("popolo", "0026_remove_stale_models")] - - operations = [ - migrations.AlterModelOptions( - name="membership", - options={ - "ordering": ( - "party__name", - "party_list_position", - "person__name", - ) - }, - ), - migrations.AlterField( - model_name="post", - name="slug", - field=models.CharField(blank=True, max_length=256), - ), - migrations.AlterUniqueTogether( - name="post", unique_together=set([("slug", "organization")]) - ), - ] diff --git a/ynr/apps/popolo/migrations/0028_rename_post_election_to_ballot.py b/ynr/apps/popolo/migrations/0028_rename_post_election_to_ballot.py deleted file mode 100644 index e68b0491c5..0000000000 --- a/ynr/apps/popolo/migrations/0028_rename_post_election_to_ballot.py +++ /dev/null @@ -1,23 +0,0 @@ -# -*- coding: utf-8 -*- -# Generated by Django 1.11.20 on 2019-07-15 16:28 -from __future__ import unicode_literals - -from django.db import migrations - - -class Migration(migrations.Migration): - - dependencies = [ - ("people", "0014_remove_person_email"), - ("candidates", "0058_pee_to_ballot"), - ("popolo", "0027_slug_org_unique_together"), - ] - - operations = [ - migrations.RenameField( - model_name="membership", old_name="post_election", new_name="ballot" - ), - migrations.AlterUniqueTogether( - name="membership", unique_together=set([("person", "ballot")]) - ), - ] diff --git a/ynr/apps/popolo/migrations/0029_positive_int_field.py b/ynr/apps/popolo/migrations/0029_positive_int_field.py deleted file mode 100644 index ac42cc4396..0000000000 --- a/ynr/apps/popolo/migrations/0029_positive_int_field.py +++ /dev/null @@ -1,16 +0,0 @@ -# Generated by Django 2.2.4 on 2019-10-29 17:04 - -from django.db import migrations, models - - -class Migration(migrations.Migration): - - dependencies = [("popolo", "0028_rename_post_election_to_ballot")] - - operations = [ - migrations.AlterField( - model_name="membership", - name="party_list_position", - field=models.PositiveSmallIntegerField(null=True), - ) - ] diff --git a/ynr/apps/popolo/migrations/0030_remove_duplicate_other_names.py b/ynr/apps/popolo/migrations/0030_remove_duplicate_other_names.py deleted file mode 100644 index 7087fca64c..0000000000 --- a/ynr/apps/popolo/migrations/0030_remove_duplicate_other_names.py +++ /dev/null @@ -1,32 +0,0 @@ -# Generated by Django 2.2.4 on 2019-11-04 20:53 - -from django.db import migrations -from django.db.models import Count - - -def deduplicate_other_names(apps, schema_editor): - OtherName = apps.get_model("popolo", "OtherName") - - people_with_duplicate_names = ( - OtherName.objects.all() - .values("name", "object_id") - .annotate(count=Count("object_id")) - .filter(count__gt=1) - ) - - for dupe_name_person in people_with_duplicate_names: - other_names_for_person = OtherName.objects.filter( - object_id=dupe_name_person["object_id"], - name=dupe_name_person["name"], - ) - for other_name in other_names_for_person[1:]: - other_name.delete() - - -class Migration(migrations.Migration): - - dependencies = [("popolo", "0029_positive_int_field")] - - operations = [ - migrations.RunPython(deduplicate_other_names, migrations.RunPython.noop) - ] diff --git a/ynr/apps/popolo/migrations/0031_other_names_unique_constraint.py b/ynr/apps/popolo/migrations/0031_other_names_unique_constraint.py deleted file mode 100644 index 285b47ef16..0000000000 --- a/ynr/apps/popolo/migrations/0031_other_names_unique_constraint.py +++ /dev/null @@ -1,18 +0,0 @@ -# Generated by Django 2.2.4 on 2019-11-04 21:39 - -from django.db import migrations - - -class Migration(migrations.Migration): - - dependencies = [ - ("contenttypes", "0002_remove_content_type_name"), - ("popolo", "0030_remove_duplicate_other_names"), - ] - - operations = [ - migrations.AlterUniqueTogether( - name="othername", - unique_together={("name", "object_id", "content_type")}, - ) - ] diff --git a/ynr/apps/popolo/migrations/0032_add_post_identifiers.py b/ynr/apps/popolo/migrations/0032_add_post_identifiers.py deleted file mode 100644 index 753d35d112..0000000000 --- a/ynr/apps/popolo/migrations/0032_add_post_identifiers.py +++ /dev/null @@ -1,72 +0,0 @@ -# Generated by Django 2.2.4 on 2020-01-15 13:06 - -from django.db import migrations, models -import django.db.models.deletion -import django.utils.timezone -import model_utils.fields - - -class Migration(migrations.Migration): - - dependencies = [("popolo", "0031_other_names_unique_constraint")] - - operations = [ - migrations.AddField( - model_name="post", - name="identifier", - field=models.CharField( - help_text="\n The identifier used in EveryElection for this division. This might\n change over time, as some divisions don't have official IDs at the\n point we create them.\n ", - max_length=100, - null=True, - ), - ), - migrations.AddField( - model_name="post", - name="territory_code", - field=models.CharField( - blank=True, - help_text="\n The territory within Great Britain that this post is in.\n One of SCT, WLS, ENG, NIR\n ", - max_length=10, - ), - ), - migrations.CreateModel( - name="PostIdentifier", - fields=[ - ( - "id", - models.AutoField( - auto_created=True, - primary_key=True, - serialize=False, - verbose_name="ID", - ), - ), - ( - "created", - model_utils.fields.AutoCreatedField( - default=django.utils.timezone.now, - editable=False, - verbose_name="created", - ), - ), - ( - "modified", - model_utils.fields.AutoLastModifiedField( - default=django.utils.timezone.now, - editable=False, - verbose_name="modified", - ), - ), - ("identifier", models.CharField(max_length=256)), - ("label", models.CharField(blank=True, max_length=255)), - ( - "post", - models.ForeignKey( - on_delete=django.db.models.deletion.CASCADE, - to="popolo.Post", - ), - ), - ], - options={"abstract": False}, - ), - ] diff --git a/ynr/apps/popolo/migrations/0033_unique_on_start_date.py b/ynr/apps/popolo/migrations/0033_unique_on_start_date.py deleted file mode 100644 index eaefcd7bda..0000000000 --- a/ynr/apps/popolo/migrations/0033_unique_on_start_date.py +++ /dev/null @@ -1,15 +0,0 @@ -# Generated by Django 2.2.4 on 2020-01-16 22:13 - -from django.db import migrations - - -class Migration(migrations.Migration): - - dependencies = [("popolo", "0032_add_post_identifiers")] - - operations = [ - migrations.AlterUniqueTogether( - name="post", - unique_together={("slug", "organization", "start_date")}, - ) - ] diff --git a/ynr/apps/popolo/migrations/0034_populate_from_ee_divisions.py b/ynr/apps/popolo/migrations/0034_populate_from_ee_divisions.py deleted file mode 100644 index 1bd51b6e73..0000000000 --- a/ynr/apps/popolo/migrations/0034_populate_from_ee_divisions.py +++ /dev/null @@ -1,147 +0,0 @@ -""" -This data migration takes a CSV* exported from EveryElection -and uses it to match up and change the identifier for each post it finds. - -When it's found a post, it makes a new `PostIdentifier` model with -the previous `slug` value, updates the slug and sets other fields like -start and end dates, etc. - -* It's actually two files to deal with two cases: - -1. The ballot has a post that is a division of an organisation -2. The ballot has a post that's actually an organisation, but where - we created a pseudo-post for it at import time (for directly elected mayors, - PCCs, etc) - -""" - -from django.db import migrations -import csv -import re - - -def update_or_create_post_identifier(post): - identifier_label = None - - if post.identifier: - identifier_value = post.identifier - if identifier_value.startswith("unit_id"): - identifier_label = "unit_id" - if identifier_value.startswith("gla"): - identifier_label = "legacy_slug" - if identifier_value.startswith("gss"): - identifier_label = "gss" - if identifier_value.startswith("osni_oid"): - identifier_label = "osni_oid" - if re.match(r"^[A-Z]{3}", identifier_value.split(":")[0]): - identifier_label = "dc_slug" - else: - if re.match(r"[\d]+", post.slug): - identifier_label = "mapit_id" - identifier_value = post.slug - else: - identifier_label = "legacy_slug" - identifier_value = post.slug - - post.postidentifier_set.update_or_create( - identifier=identifier_value, - post=post, - defaults={"label": identifier_label}, - ) - - -def populate_from_ee_divisions(apps, schema_editor): - - Ballot = apps.get_model("candidates", "Ballot") - Post = apps.get_model("popolo", "Post") - data_file = open("data/ee_post_identifiers_2020-01.csv") - - for line in csv.DictReader(data_file.readlines()): - try: - ballot = Ballot.objects.get(ballot_paper_id=line["election_id"]) - except Ballot.DoesNotExist: - continue - - existing_post_qs = Post.objects.filter( - start_date=line["start_date"], - slug=line["slug"], - organization__slug="{}:{}".format( - line["organisation_type"], line["org_slug"] - ), - ) - if existing_post_qs.exists(): - post = existing_post_qs.first() - else: - post = ballot.post - post.start_date = line["start_date"] - post.end_date = line["end_date"] - post.territory_code = line["territory_code"] - post.name = line["name"] - - if line["official_identifier"] != post.identifier: - update_or_create_post_identifier(post) - post.identifier = line["official_identifier"] - post.slug = line["slug"] - - post.save() - ballot.post = post - ballot.save() - - -def populate_from_ee_no_divisions(apps, schema_editor): - - Ballot = apps.get_model("candidates", "Ballot") - Post = apps.get_model("popolo", "Post") - data_file = open("data/ee_post_identifiers_no_divisions_2020-01.csv") - - for line in csv.DictReader(data_file.readlines()): - try: - ballot = Ballot.objects.get(ballot_paper_id=line["election_id"]) - except Ballot.DoesNotExist: - continue - - existing_post_qs = Post.objects.filter( - start_date=line["start_date"], - slug=line["slug"], - organization__slug="{}:{}".format( - line["organisation_type"], line["slug"] - ), - ) - if existing_post_qs.exists(): - post = existing_post_qs.first() - else: - post = ballot.post - post.start_date = line["start_date"] - post.end_date = line["end_date"] - post.territory_code = line["territory_code"] - post.name = line["name"] - - if line["gss"] != post.identifier: - update_or_create_post_identifier(post) - post.identifier = "gss:{}".format(line["gss"]) - post.slug = line["slug"] - - post.save() - ballot.post = post - ballot.save() - - -def clean_up_tmp_ids(apps, schema_editor): - Post = apps.get_model("popolo", "Post") - posts = Post.objects.filter(slug__in=["UTW:boaness-and-blackness"]) - posts.update(identifier="gss:S13002936") - - -class Migration(migrations.Migration): - - dependencies = [("popolo", "0033_unique_on_start_date")] - - operations = [ - migrations.RunPython( - populate_from_ee_divisions, migrations.RunPython.noop - ), - migrations.RunPython( - populate_from_ee_no_divisions, migrations.RunPython.noop - ), - migrations.RunPython(clean_up_tmp_ids, migrations.RunPython.noop), - ] diff --git a/ynr/apps/popolo/migrations/0035_attach_memberships_to_posts.py b/ynr/apps/popolo/migrations/0035_attach_memberships_to_posts.py deleted file mode 100644 index fcf27b7022..0000000000 --- a/ynr/apps/popolo/migrations/0035_attach_memberships_to_posts.py +++ /dev/null @@ -1,22 +0,0 @@ -# Generated by Django 2.2.9 on 2020-01-27 21:19 - -from django.db import migrations - - -def attach_memberships_to_posts(apps, schema_editor): - Membership = apps.get_model("popolo", "Membership") - for membership in Membership.objects.all(): - if membership.post != membership.ballot.post: - membership.post = membership.ballot.post - membership.save() - - -class Migration(migrations.Migration): - - dependencies = [("popolo", "0034_populate_from_ee_divisions")] - - operations = [ - migrations.RunPython( - attach_memberships_to_posts, migrations.RunPython.noop - ) - ] diff --git a/ynr/apps/popolo/migrations/0036_add_party_name_and_description.py b/ynr/apps/popolo/migrations/0036_add_party_name_and_description.py deleted file mode 100644 index 3808b791ff..0000000000 --- a/ynr/apps/popolo/migrations/0036_add_party_name_and_description.py +++ /dev/null @@ -1,44 +0,0 @@ -# Generated by Django 2.2.16 on 2021-03-10 12:10 - -from django.db import migrations, models -import django.db.models.deletion - - -class Migration(migrations.Migration): - - dependencies = [ - ("parties", "0012_add_party_docs"), - ("popolo", "0035_attach_memberships_to_posts"), - ] - - operations = [ - migrations.AddField( - model_name="membership", - name="party_description", - field=models.ForeignKey( - blank=True, - null=True, - on_delete=django.db.models.deletion.SET_NULL, - to="parties.PartyDescription", - help_text="The party description for this membership", - ), - ), - migrations.AddField( - model_name="membership", - name="party_description_text", - field=models.CharField( - blank=True, - max_length=800, - help_text="The text of the party description at the time of this membership. This is useful if the associated party description subsequently changed", - ), - ), - migrations.AddField( - model_name="membership", - name="party_name", - field=models.CharField( - blank=True, - max_length=255, - help_text="The name of the associated party at the time of this membership. This is useful if the associated party subsequently changed name", - ), - ), - ] diff --git a/ynr/apps/popolo/migrations/0037_data_migration_add_party_name.py b/ynr/apps/popolo/migrations/0037_data_migration_add_party_name.py deleted file mode 100644 index bdab22edf1..0000000000 --- a/ynr/apps/popolo/migrations/0037_data_migration_add_party_name.py +++ /dev/null @@ -1,43 +0,0 @@ -# Generated by Django 2.2.16 on 2021-03-15 12:49 - -from django.db import migrations -from django.utils import timezone - -REFORM_UK_EC_ID = "PP7931" -CHANGE_DATE = timezone.datetime(2021, 1, 6).date() - - -def add_party_names(apps, schema_editor): - - Membership = apps.get_model("popolo", "Membership") - for membership in Membership.objects.all().select_related( - "party", "ballot__election" - ): - if not membership.party: - continue - - if ( - membership.party.ec_id == REFORM_UK_EC_ID - and membership.ballot.election.election_date < CHANGE_DATE - ): - membership.party_name = "Brexit Party" - else: - membership.party_name = membership.party.name - - membership.save() - - -def remove_party_names(apps, schema_editor): - Membership = apps.get_model("popolo", "Membership") - Membership.objects.update(party_name="") - - -class Migration(migrations.Migration): - - dependencies = [("popolo", "0036_add_party_name_and_description")] - - operations = [ - migrations.RunPython( - code=add_party_names, reverse_code=remove_party_names - ) - ] diff --git a/ynr/apps/popolo/migrations/0038_auto_20210401_0811.py b/ynr/apps/popolo/migrations/0038_auto_20210401_0811.py deleted file mode 100644 index c20d538bc8..0000000000 --- a/ynr/apps/popolo/migrations/0038_auto_20210401_0811.py +++ /dev/null @@ -1,14 +0,0 @@ -# Generated by Django 2.2.16 on 2021-04-01 07:11 - -from django.db import migrations - - -class Migration(migrations.Migration): - - dependencies = [("popolo", "0037_data_migration_add_party_name")] - - operations = [ - migrations.AlterModelOptions( - name="othername", options={"ordering": ("name",)} - ) - ] diff --git a/ynr/apps/popolo/migrations/0039_auto_20210616_1642.py b/ynr/apps/popolo/migrations/0039_auto_20210616_1642.py deleted file mode 100644 index 8bbbd61084..0000000000 --- a/ynr/apps/popolo/migrations/0039_auto_20210616_1642.py +++ /dev/null @@ -1,85 +0,0 @@ -# Generated by Django 2.2.20 on 2021-06-16 15:42 - -from django.db import migrations -import django.utils.timezone -import model_utils.fields - - -class Migration(migrations.Migration): - - dependencies = [("popolo", "0038_auto_20210401_0811")] - - operations = [ - migrations.AddField( - model_name="contactdetail", - name="created", - field=model_utils.fields.AutoCreatedField( - default=django.utils.timezone.now, - editable=False, - verbose_name="created", - ), - ), - migrations.AddField( - model_name="contactdetail", - name="modified", - field=model_utils.fields.AutoLastModifiedField( - default=django.utils.timezone.now, - editable=False, - verbose_name="modified", - ), - ), - migrations.AddField( - model_name="membership", - name="created", - field=model_utils.fields.AutoCreatedField( - default=django.utils.timezone.now, - editable=False, - verbose_name="created", - ), - ), - migrations.AddField( - model_name="membership", - name="modified", - field=model_utils.fields.AutoLastModifiedField( - default=django.utils.timezone.now, - editable=False, - verbose_name="modified", - ), - ), - migrations.AddField( - model_name="organization", - name="created", - field=model_utils.fields.AutoCreatedField( - default=django.utils.timezone.now, - editable=False, - verbose_name="created", - ), - ), - migrations.AddField( - model_name="organization", - name="modified", - field=model_utils.fields.AutoLastModifiedField( - default=django.utils.timezone.now, - editable=False, - verbose_name="modified", - ), - ), - migrations.AddField( - model_name="post", - name="created", - field=model_utils.fields.AutoCreatedField( - default=django.utils.timezone.now, - editable=False, - verbose_name="created", - ), - ), - migrations.AddField( - model_name="post", - name="modified", - field=model_utils.fields.AutoLastModifiedField( - default=django.utils.timezone.now, - editable=False, - verbose_name="modified", - ), - ), - ] diff --git a/ynr/apps/popolo/migrations/0040_copy_created.py b/ynr/apps/popolo/migrations/0040_copy_created.py deleted file mode 100644 index 2458749c29..0000000000 --- a/ynr/apps/popolo/migrations/0040_copy_created.py +++ /dev/null @@ -1,30 +0,0 @@ -# Generated by Django 2.2.20 on 2021-06-16 15:48 - -from django.db import migrations - -MODELS_TO_UPDATE = ["ContactDetail", "Membership", "Organization", "Post"] - - -def copy_created_at(apps, schema_editor): - for ModelClass in MODELS_TO_UPDATE: - ModelClass = apps.get_model("popolo", ModelClass) - for obj in ModelClass.objects.iterator(): - obj.created = obj.created_at - obj.save() - - -def copy_created(apps, schema_editor): - for ModelClass in MODELS_TO_UPDATE: - ModelClass = apps.get_model("popolo", ModelClass) - for obj in ModelClass.objects.iterator(): - obj.created_at = obj.created - obj.save() - - -class Migration(migrations.Migration): - - dependencies = [("popolo", "0039_auto_20210616_1642")] - - operations = [ - migrations.RunPython(code=copy_created_at, reverse_code=copy_created) - ] diff --git a/ynr/apps/popolo/migrations/0041_auto_20210616_1705.py b/ynr/apps/popolo/migrations/0041_auto_20210616_1705.py deleted file mode 100644 index b1cfff0874..0000000000 --- a/ynr/apps/popolo/migrations/0041_auto_20210616_1705.py +++ /dev/null @@ -1,19 +0,0 @@ -# Generated by Django 2.2.20 on 2021-06-16 16:05 - -from django.db import migrations - - -class Migration(migrations.Migration): - - dependencies = [("popolo", "0040_copy_created")] - - operations = [ - migrations.RemoveField(model_name="contactdetail", name="created_at"), - migrations.RemoveField(model_name="contactdetail", name="updated_at"), - migrations.RemoveField(model_name="membership", name="created_at"), - migrations.RemoveField(model_name="membership", name="updated_at"), - migrations.RemoveField(model_name="organization", name="created_at"), - migrations.RemoveField(model_name="organization", name="updated_at"), - migrations.RemoveField(model_name="post", name="created_at"), - migrations.RemoveField(model_name="post", name="updated_at"), - ] diff --git a/ynr/apps/popolo/migrations/0042_add_timestamps_to_post.py b/ynr/apps/popolo/migrations/0042_add_timestamps_to_post.py deleted file mode 100644 index 71bfc27264..0000000000 --- a/ynr/apps/popolo/migrations/0042_add_timestamps_to_post.py +++ /dev/null @@ -1,35 +0,0 @@ -# Generated by Django 3.2.4 on 2021-09-29 16:10 - -from django.db import migrations, models -import django_extensions.db.fields - - -class Migration(migrations.Migration): - - dependencies = [("popolo", "0041_auto_20210616_1705")] - - operations = [ - migrations.AddField( - model_name="post", - name="ee_modified", - field=models.DateTimeField( - blank=True, - help_text="Stores the modified timestamp from EE", - null=True, - ), - ), - migrations.AlterField( - model_name="post", - name="created", - field=django_extensions.db.fields.CreationDateTimeField( - auto_now_add=True, verbose_name="created" - ), - ), - migrations.AlterField( - model_name="post", - name="modified", - field=django_extensions.db.fields.ModificationDateTimeField( - auto_now=True, verbose_name="modified" - ), - ), - ] diff --git a/ynr/apps/popolo/migrations/0043_alter_membership_elected.py b/ynr/apps/popolo/migrations/0043_alter_membership_elected.py deleted file mode 100644 index f163b9a25d..0000000000 --- a/ynr/apps/popolo/migrations/0043_alter_membership_elected.py +++ /dev/null @@ -1,16 +0,0 @@ -# Generated by Django 3.2.4 on 2021-09-29 16:30 - -from django.db import migrations, models - - -class Migration(migrations.Migration): - - dependencies = [("popolo", "0042_add_timestamps_to_post")] - - operations = [ - migrations.AlterField( - model_name="membership", - name="elected", - field=models.BooleanField(null=True), - ) - ] diff --git a/ynr/apps/popolo/migrations/0044_add_indexes_to_modified.py b/ynr/apps/popolo/migrations/0044_add_indexes_to_modified.py deleted file mode 100644 index 67f1a9388c..0000000000 --- a/ynr/apps/popolo/migrations/0044_add_indexes_to_modified.py +++ /dev/null @@ -1,26 +0,0 @@ -# Generated by Django 3.2.4 on 2021-10-20 10:26 - -from django.db import migrations -import django_extensions.db.fields - - -class Migration(migrations.Migration): - - dependencies = [("popolo", "0043_alter_membership_elected")] - - operations = [ - migrations.AlterField( - model_name="membership", - name="modified", - field=django_extensions.db.fields.ModificationDateTimeField( - auto_now=True, db_index=True, verbose_name="modified" - ), - ), - migrations.AlterField( - model_name="post", - name="modified", - field=django_extensions.db.fields.ModificationDateTimeField( - auto_now=True, db_index=True, verbose_name="modified" - ), - ), - ] diff --git a/ynr/apps/popolo/migrations/0045_clean_up_blank_party_names.py b/ynr/apps/popolo/migrations/0045_clean_up_blank_party_names.py deleted file mode 100644 index b96b8ff99e..0000000000 --- a/ynr/apps/popolo/migrations/0045_clean_up_blank_party_names.py +++ /dev/null @@ -1,22 +0,0 @@ -# Generated by Django 3.2.4 on 2021-12-07 17:14 - -from django.db import migrations - - -def forwards(apps, schema_editor): - Membership = apps.get_model("popolo", "Membership") - - for candidacy in Membership.objects.filter(party_name=""): - candidacy.party_name = candidacy.party.name - candidacy.save() - - -class Migration(migrations.Migration): - - dependencies = [("popolo", "0044_add_indexes_to_modified")] - - operations = [ - migrations.RunPython( - code=forwards, reverse_code=migrations.RunPython.noop - ) - ] diff --git a/ynr/apps/popolo/migrations/0046_remove_blank_from_party_name.py b/ynr/apps/popolo/migrations/0046_remove_blank_from_party_name.py deleted file mode 100644 index 07813526d6..0000000000 --- a/ynr/apps/popolo/migrations/0046_remove_blank_from_party_name.py +++ /dev/null @@ -1,19 +0,0 @@ -# Generated by Django 3.2.4 on 2021-12-08 15:25 - -from django.db import migrations, models - - -class Migration(migrations.Migration): - - dependencies = [("popolo", "0045_clean_up_blank_party_names")] - - operations = [ - migrations.AlterField( - model_name="membership", - name="party_name", - field=models.CharField( - help_text="The name of the associated party at the time of this membership. This is useful if the associated party subsequently changed name", - max_length=255, - ), - ) - ] diff --git a/ynr/apps/results/migrations/0001_initial.py b/ynr/apps/results/migrations/0001_initial.py index ce5782d60b..fb2b6c7577 100644 --- a/ynr/apps/results/migrations/0001_initial.py +++ b/ynr/apps/results/migrations/0001_initial.py @@ -1,10 +1,21 @@ +# Generated by Django 3.2.10 on 2021-12-14 17:21 + from django.conf import settings from django.db import migrations, models +import django.db.models.deletion class Migration(migrations.Migration): - dependencies = [migrations.swappable_dependency(settings.AUTH_USER_MODEL)] + initial = True + + dependencies = [ + ("parties", "0001_initial"), + ("popolo", "0001_initial"), + ("people", "0001_initial"), + ("elections", "0001_initial"), + migrations.swappable_dependency(settings.AUTH_USER_MODEL), + ] operations = [ migrations.CreateModel( @@ -13,36 +24,66 @@ class Migration(migrations.Migration): ( "id", models.AutoField( - verbose_name="ID", - serialize=False, auto_created=True, primary_key=True, + serialize=False, + verbose_name="ID", ), ), ("created", models.DateTimeField(auto_now_add=True)), - ("winner_popit_person_id", models.CharField(max_length=256)), - ("winner_person_name", models.CharField(max_length=1024)), - ("post_id", models.CharField(max_length=256)), + ("old_post_id", models.CharField(max_length=256)), ( - "winner_party_id", - models.CharField(max_length=256, null=True, blank=True), + "old_post_name", + models.CharField(blank=True, max_length=1024, null=True), ), - ("source", models.CharField(max_length=512)), + ("source", models.CharField(max_length=2000)), ( - "proxy_image_url_template", - models.CharField(max_length=1024, null=True, blank=True), + "parlparse_id", + models.CharField(blank=True, max_length=256, null=True), + ), + ("retraction", models.BooleanField(default=False)), + ( + "election", + models.ForeignKey( + blank=True, + null=True, + on_delete=django.db.models.deletion.CASCADE, + to="elections.election", + ), + ), + ( + "post", + models.ForeignKey( + blank=True, + null=True, + on_delete=django.db.models.deletion.CASCADE, + to="popolo.post", + ), ), ( "user", models.ForeignKey( blank=True, - to=settings.AUTH_USER_MODEL, null=True, - on_delete=models.CASCADE, + on_delete=django.db.models.deletion.CASCADE, + to=settings.AUTH_USER_MODEL, + ), + ), + ( + "winner", + models.ForeignKey( + on_delete=django.db.models.deletion.CASCADE, + to="people.person", + ), + ), + ( + "winner_party", + models.ForeignKey( + on_delete=django.db.models.deletion.CASCADE, + to="parties.party", ), ), ], options={"ordering": ["created"]}, - bases=(models.Model,), ) ] diff --git a/ynr/apps/results/migrations/0002_resultevent_parlparse_id.py b/ynr/apps/results/migrations/0002_resultevent_parlparse_id.py deleted file mode 100644 index 5ca99c4a1d..0000000000 --- a/ynr/apps/results/migrations/0002_resultevent_parlparse_id.py +++ /dev/null @@ -1,15 +0,0 @@ -from django.db import migrations, models - - -class Migration(migrations.Migration): - - dependencies = [("results", "0001_initial")] - - operations = [ - migrations.AddField( - model_name="resultevent", - name="parlparse_id", - field=models.CharField(max_length=256, null=True, blank=True), - preserve_default=True, - ) - ] diff --git a/ynr/apps/results/migrations/0003_resultevent_post_name.py b/ynr/apps/results/migrations/0003_resultevent_post_name.py deleted file mode 100644 index e804f0858c..0000000000 --- a/ynr/apps/results/migrations/0003_resultevent_post_name.py +++ /dev/null @@ -1,15 +0,0 @@ -from django.db import migrations, models - - -class Migration(migrations.Migration): - - dependencies = [("results", "0002_resultevent_parlparse_id")] - - operations = [ - migrations.AddField( - model_name="resultevent", - name="post_name", - field=models.CharField(max_length=1024, null=True, blank=True), - preserve_default=True, - ) - ] diff --git a/ynr/apps/results/migrations/0004_resultevent_election.py b/ynr/apps/results/migrations/0004_resultevent_election.py deleted file mode 100644 index 2c238aa7ec..0000000000 --- a/ynr/apps/results/migrations/0004_resultevent_election.py +++ /dev/null @@ -1,15 +0,0 @@ -from django.db import migrations, models - - -class Migration(migrations.Migration): - - dependencies = [("results", "0003_resultevent_post_name")] - - operations = [ - migrations.AddField( - model_name="resultevent", - name="election", - field=models.CharField(max_length=512, null=True, blank=True), - preserve_default=True, - ) - ] diff --git a/ynr/apps/results/migrations/0005_auto_fill_election_and_post_name.py b/ynr/apps/results/migrations/0005_auto_fill_election_and_post_name.py deleted file mode 100644 index 208987e9cd..0000000000 --- a/ynr/apps/results/migrations/0005_auto_fill_election_and_post_name.py +++ /dev/null @@ -1,682 +0,0 @@ -from django.db import migrations - -# At the time this will be run, the only ResultEvent objects in any -# YNR database will be those from the 2015 UK General Election, so -# just populate 'election' and 'post_name' on that assumption: - - -def add_election_and_post_name(apps, schema_editor): - ResultEvent = apps.get_model("results", "ResultEvent") - for result_event in ResultEvent.objects.all(): - result_event.election = "2015" - result_event.post_name = post_id_to_post_name[result_event.post_id] - result_event.save() - - -class Migration(migrations.Migration): - - dependencies = [("results", "0004_resultevent_election")] - - operations = [ - migrations.RunPython( - add_election_and_post_name, lambda apps, schema_editor: None - ) - ] - - -# To avoid having to either go to MapIt or this migration's behaviour -# depending on the ELECTION_APP that's set, just include the mapping -# from post_id to post_name here: - -post_id_to_post_name = { - "14398": "Aberdeen North", - "14399": "Aberdeen South", - "14400": "Airdrie and Shotts", - "14401": "Angus", - "14402": "Argyll and Bute", - "14403": "Ayr, Carrick and Cumnock", - "14404": "Banff and Buchan", - "14405": "Berwickshire, Roxburgh and Selkirk", - "14406": "Caithness, Sutherland and Easter Ross", - "14407": "Central Ayrshire", - "14408": "Coatbridge, Chryston and Bellshill", - "14409": "Cumbernauld, Kilsyth and Kirkintilloch East", - "14410": "Dumfries and Galloway", - "14411": "Dumfriesshire, Clydesdale and Tweeddale", - "14412": "Dundee East", - "14413": "Dundee West", - "14414": "Dunfermline and West Fife", - "14415": "East Dunbartonshire", - "14416": "East Kilbride, Strathaven and Lesmahagow", - "14417": "East Lothian", - "14418": "East Renfrewshire", - "14419": "Edinburgh East", - "14420": "Edinburgh North and Leith", - "14421": "Edinburgh South", - "14422": "Edinburgh South West", - "14423": "Edinburgh West", - "14424": "Falkirk", - "14425": "Glasgow Central", - "14426": "Glasgow East", - "14427": "Glasgow North", - "14428": "Glasgow North East", - "14429": "Glasgow North West", - "14430": "Glasgow South", - "14431": "Glasgow South West", - "14432": "Glenrothes", - "14433": "Gordon", - "14434": "Inverclyde", - "14435": "Inverness, Nairn, Badenoch and Strathspey", - "14436": "Kilmarnock and Loudoun", - "14437": "Kirkcaldy and Cowdenbeath", - "14438": "Lanark and Hamilton East", - "14439": "Linlithgow and East Falkirk", - "14440": "Livingston", - "14441": "Midlothian", - "14442": "Moray", - "14443": "Motherwell and Wishaw", - "14444": "Na h-Eileanan an Iar", - "14445": "North Ayrshire and Arran", - "14446": "North East Fife", - "14447": "Ochil and South Perthshire", - "14448": "Orkney and Shetland", - "14449": "Paisley and Renfrewshire North", - "14450": "Paisley and Renfrewshire South", - "14451": "Perth and North Perthshire", - "14452": "Ross, Skye and Lochaber", - "14453": "Rutherglen and Hamilton West", - "14454": "Stirling", - "14455": "West Aberdeenshire and Kincardine", - "14456": "West Dunbartonshire", - "65549": "Sheffield, Heeley", - "65550": "Hackney North and Stoke Newington", - "65551": "Gedling", - "65552": "Windsor", - "65553": "Don Valley", - "65554": "Tooting", - "65555": "Dover", - "65556": "New Forest East", - "65557": "Hazel Grove", - "65558": "Chichester", - "65559": "Nottingham East", - "65560": "Wells", - "65561": "Bedford", - "65562": "Worthing West", - "65563": "Shrewsbury and Atcham", - "65564": "Oxford West and Abingdon", - "65565": "North West Cambridgeshire", - "65566": "Portsmouth North", - "65567": "Enfield, Southgate", - "65568": "Lancaster and Fleetwood", - "65569": "East Hampshire", - "65570": "Edmonton", - "65571": "Stevenage", - "65572": "Crewe and Nantwich", - "65573": "East Ham", - "65574": "Bristol West", - "65575": "Coventry North West", - "65576": "Hampstead and Kilburn", - "65577": "Worcester", - "65578": "Harrogate and Knaresborough", - "65579": "Ribble Valley", - "65580": "Southampton, Test", - "65581": "Birkenhead", - "65582": "Hereford and South Herefordshire", - "65583": "Blackley and Broughton", - "65584": "Rochford and Southend East", - "65585": "Ilford South", - "65586": "Sunderland Central", - "65587": "Leicester West", - "65588": "Wentworth and Dearne", - "65589": "Runnymede and Weybridge", - "65590": "Corby", - "65591": "St Austell and Newquay", - "65592": "Huntingdon", - "65593": "Wolverhampton South East", - "65594": "Newcastle upon Tyne East", - "65595": "Brent North", - "65596": "South West Hertfordshire", - "65597": "Birmingham, Hall Green", - "65598": "Richmond Park", - "65599": "Halifax", - "65600": "Great Grimsby", - "65601": "Sheffield, Brightside and Hillsborough", - "65602": "North Cornwall", - "65603": "Croydon Central", - "65604": "Leicester South", - "65605": "North Thanet", - "65606": "Stockport", - "65607": "Suffolk Coastal", - "65608": "Warwick and Leamington", - "65609": "Stourbridge", - "65610": "Sittingbourne and Sheppey", - "65611": "Bexleyheath and Crayford", - "65612": "Wigan", - "65613": "Uxbridge and South Ruislip", - "65614": "South Suffolk", - "65615": "Charnwood", - "65616": "Lewisham West and Penge", - "65617": "Bromsgrove", - "65618": "Kingston upon Hull North", - "65619": "North East Somerset", - "65620": "Bridgwater and West Somerset", - "65621": "Doncaster Central", - "65622": "Witney", - "65623": "Basingstoke", - "65624": "Huddersfield", - "65625": "Workington", - "65626": "Watford", - "65627": "Great Yarmouth", - "65628": "Bolsover", - "65629": "West Suffolk", - "65630": "Ilford North", - "65631": "Wansbeck", - "65632": "Sherwood", - "65633": "Morecambe and Lunesdale", - "65634": "Norwich South", - "65635": "Wallasey", - "65636": "Coventry North East", - "65637": "Pudsey", - "65638": "Wantage", - "65639": "Broxbourne", - "65640": "Hastings and Rye", - "65641": "Stockton North", - "65642": "North Herefordshire", - "65643": "Nottingham North", - "65644": "Liverpool, Wavertree", - "65645": "Makerfield", - "65646": "Bolton North East", - "65647": "Mansfield", - "65648": "Stratford-on-Avon", - "65649": "Peterborough", - "65650": "Harrow East", - "65651": "Walthamstow", - "65652": "South West Norfolk", - "65653": "Old Bexley and Sidcup", - "65654": "Saffron Walden", - "65655": "Feltham and Heston", - "65656": "Rugby", - "65657": "Middlesbrough South and East Cleveland", - "65658": "North Devon", - "65659": "Truro and Falmouth", - "65660": "Tunbridge Wells", - "65661": "Maldon", - "65662": "Barking", - "65663": "Nuneaton", - "65664": "Newcastle upon Tyne North", - "65665": "Barnsley Central", - "65666": "South Norfolk", - "65667": "Birmingham, Erdington", - "65668": "Pendle", - "65669": "Wythenshawe and Sale East", - "65670": "Braintree", - "65671": "Haltemprice and Howden", - "65672": "Doncaster North", - "65673": "Preston", - "65674": "Harwich and North Essex", - "65675": "Harborough", - "65676": "North East Derbyshire", - "65677": "Elmet and Rothwell", - "65678": "South West Surrey", - "65679": "Blackpool South", - "65680": "Slough", - "65681": "Ruislip, Northwood and Pinner", - "65682": "Orpington", - "65683": "Grantham and Stamford", - "65684": "South East Cornwall", - "65685": "Brentwood and Ongar", - "65686": "Thirsk and Malton", - "65687": "Beaconsfield", - "65688": "Salford and Eccles", - "65689": "Bermondsey and Old Southwark", - "65690": "Ludlow", - "65691": "Hove", - "65692": "Torbay", - "65693": "Mole Valley", - "65694": "Bradford East", - "65695": "Wyre and Preston North", - "65696": "Newark", - "65697": "Bracknell", - "65698": "Sevenoaks", - "65699": "Havant", - "65700": "Redditch", - "65701": "Ealing North", - "65702": "North Dorset", - "65703": "Sutton Coldfield", - "65704": "Lincoln", - "65705": "Lewisham East", - "65706": "Sefton Central", - "65707": "Birmingham, Yardley", - "65708": "Burton", - "65709": "Kingston upon Hull East", - "65710": "Stoke-on-Trent Central", - "65711": "Bassetlaw", - "65712": "Bolton South East", - "65713": "North West Norfolk", - "65714": "Eastbourne", - "65715": "St Albans", - "65716": "West Dorset", - "65717": "Horsham", - "65718": "Mid Bedfordshire", - "65719": "South Shields", - "65720": "North Tyneside", - "65721": "Chingford and Woodford Green", - "65722": "Richmond (Yorks)", - "65723": "Devizes", - "65724": "Hitchin and Harpenden", - "65725": "Beckenham", - "65726": "Berwick-upon-Tweed", - "65727": "Cheadle", - "65728": "Southport", - "65729": "North East Hampshire", - "65730": "Aldershot", - "65731": "Battersea", - "65732": "St Helens South and Whiston", - "65733": "Wakefield", - "65734": "City of Chester", - "65735": "Morley and Outwood", - "65736": "Rushcliffe", - "65737": "Plymouth, Sutton and Devonport", - "65738": "Bolton West", - "65739": "Aylesbury", - "65740": "Welwyn Hatfield", - "65741": "Sheffield, Hallam", - "65742": "Weston-Super-Mare", - "65743": "Erewash", - "65744": "Tonbridge and Malling", - "65745": "North Durham", - "65746": "Dewsbury", - "65747": "Surrey Heath", - "65748": "Central Suffolk and North Ipswich", - "65749": "Central Devon", - "65750": "Blackpool North and Cleveleys", - "65751": "Batley and Spen", - "65752": "Hackney South and Shoreditch", - "65753": "Blyth Valley", - "65754": "Hendon", - "65755": "Ealing Central and Acton", - "65756": "Eddisbury", - "65757": "Worsley and Eccles South", - "65758": "West Worcestershire", - "65759": "Cities of London and Westminster", - "65760": "North Swindon", - "65761": "Tiverton and Honiton", - "65762": "South Derbyshire", - "65763": "Sedgefield", - "65764": "Faversham and Mid Kent", - "65765": "Leeds Central", - "65766": "Liverpool, West Derby", - "65767": "Taunton Deane", - "65768": "Norwich North", - "65769": "Weaver Vale", - "65770": "Stoke-on-Trent South", - "65771": "Congleton", - "65772": "Meon Valley", - "65773": "Aldridge-Brownhills", - "65774": "Wokingham", - "65775": "South West Devon", - "65776": "North West Leicestershire", - "65777": "Wolverhampton North East", - "65778": "Kingston and Surbiton", - "65779": "Folkestone and Hythe", - "65780": "East Worthing and Shoreham", - "65781": "Crawley", - "65782": "Twickenham", - "65783": "Stoke-on-Trent North", - "65784": "Arundel and South Downs", - "65785": "Loughborough", - "65786": "Henley", - "65787": "Brighton, Pavilion", - "65788": "South Dorset", - "65789": "The Cotswolds", - "65790": "Cannock Chase", - "65791": "Isle of Wight", - "65792": "Chorley", - "65793": "Sheffield South East", - "65794": "Ealing, Southall", - "65795": "Rayleigh and Wickford", - "65796": "Harrow West", - "65797": "Chelmsford", - "65798": "Bath", - "65799": "Derbyshire Dales", - "65800": "South Swindon", - "65801": "Chesham and Amersham", - "65802": "Darlington", - "65803": "Epsom and Ewell", - "65804": "Birmingham, Selly Oak", - "65805": "Blaydon", - "65806": "Dudley North", - "65807": "Leicester East", - "65808": "Dulwich and West Norwood", - "65809": "Amber Valley", - "65810": "Totnes", - "65811": "Ashford", - "65812": "Somerton and Frome", - "65813": "East Devon", - "65814": "Heywood and Middleton", - "65815": "New Forest West", - "65816": "Eltham", - "65817": "North Somerset", - "65818": "Chelsea and Fulham", - "65819": "Manchester, Withington", - "65820": "Bishop Auckland", - "65821": "Bootle", - "65822": "North Wiltshire", - "65823": "Easington", - "65824": "Holborn and St Pancras", - "65825": "Vauxhall", - "65826": "Camborne and Redruth", - "65827": "Wimbledon", - "65828": "Newton Abbot", - "65829": "South Thanet", - "65830": "Wellingborough", - "65831": "Witham", - "65832": "Walsall South", - "65833": "Rutland and Melton", - "65834": "Manchester, Gorton", - "65835": "Colne Valley", - "65836": "Hammersmith", - "65837": "Greenwich and Woolwich", - "65838": "Guildford", - "65839": "Bristol East", - "65840": "North East Hertfordshire", - "65841": "Bognor Regis and Littlehampton", - "65842": "Selby and Ainsty", - "65843": "Rochdale", - "65844": "Brighton, Kemptown", - "65845": "Bexhill and Battle", - "65846": "Burnley", - "65847": "Wirral South", - "65848": "South West Bedfordshire", - "65849": "Broxtowe", - "65850": "Hexham", - "65851": "Westminster North", - "65852": "Broadland", - "65853": "Bethnal Green and Bow", - "65854": "St Ives", - "65855": "North East Bedfordshire", - "65856": "East Surrey", - "65857": "Fareham", - "65858": "Stroud", - "65859": "North West Durham", - "65860": "Poole", - "65861": "Newcastle-under-Lyme", - "65862": "Newbury", - "65863": "Derby South", - "65864": "Gillingham and Rainham", - "65865": "Filton and Bradley Stoke", - "65866": "Leeds North East", - "65867": "Croydon North", - "65868": "Tynemouth", - "65869": "Knowsley", - "65870": "Gateshead", - "65871": "Keighley", - "65872": "North Norfolk", - "65873": "West Lancashire", - "65874": "Warrington North", - "65875": "Harlow", - "65876": "Southend West", - "65877": "Coventry South", - "65878": "Canterbury", - "65879": "Solihull", - "65880": "Tamworth", - "65881": "Eastleigh", - "65882": "Islington South and Finsbury", - "65883": "Hornsey and Wood Green", - "65884": "Romsey and Southampton North", - "65885": "Christchurch", - "65886": "Chipping Barnet", - "65887": "Luton North", - "65888": "Mid Worcestershire", - "65889": "Salisbury", - "65890": "Walsall North", - "65891": "Scarborough and Whitby", - "65892": "Altrincham and Sale West", - "65893": "Copeland", - "65894": "North West Hampshire", - "65895": "Ashfield", - "65896": "Macclesfield", - "65897": "Wirral West", - "65898": "Basildon and Billericay", - "65899": "Hyndburn", - "65900": "Garston and Halewood", - "65901": "Maidenhead", - "65902": "South Northamptonshire", - "65903": "Oldham East and Saddleworth", - "65904": "Torridge and West Devon", - "65905": "Thornbury and Yate", - "65906": "Calder Valley", - "65907": "Staffordshire Moorlands", - "65908": "Stockton South", - "65909": "Buckingham", - "65910": "Northampton South", - "65911": "Stretford and Urmston", - "65912": "Hayes and Harlington", - "65913": "Camberwell and Peckham", - "65914": "Castle Point", - "65915": "Halton", - "65916": "Warrington South", - "65917": "Poplar and Limehouse", - "65918": "Normanton, Pontefract and Castleford", - "65919": "Thurrock", - "65920": "Sleaford and North Hykeham", - "65921": "Winchester", - "65922": "South Cambridgeshire", - "65923": "Croydon South", - "65924": "Denton and Reddish", - "65925": "Ipswich", - "65926": "Colchester", - "65927": "Cambridge", - "65928": "Gosport", - "65929": "Carlisle", - "65930": "Rother Valley", - "65931": "Birmingham, Edgbaston", - "65932": "Meriden", - "65933": "Bournemouth West", - "65934": "Beverley and Holderness", - "65935": "Yeovil", - "65936": "Maidstone and The Weald", - "65937": "Islington North", - "65938": "Finchley and Golders Green", - "65939": "Kensington", - "65940": "Chippenham", - "65941": "Leeds East", - "65942": "Spelthorne", - "65943": "South Staffordshire", - "65944": "Gravesham", - "65945": "Nottingham South", - "65946": "Cheltenham", - "65947": "Houghton and Sunderland South", - "65948": "Wolverhampton South West", - "65949": "Mid Norfolk", - "65950": "Stone", - "65951": "South Ribble", - "65952": "Gainsborough", - "65953": "Milton Keynes North", - "65954": "Bromley and Chislehurst", - "65955": "Fylde", - "65956": "South West Wiltshire", - "65957": "Sheffield Central", - "65958": "Brentford and Isleworth", - "65959": "Shipley", - "65960": "Stalybridge and Hyde", - "65961": "Wealden", - "65962": "South Basildon and East Thurrock", - "65963": "Westmorland and Lonsdale", - "65964": "Tatton", - "65965": "York Central", - "65966": "Birmingham, Northfield", - "65967": "Hemel Hempstead", - "65968": "Kenilworth and Southam", - "65969": "Boston and Skegness", - "65970": "Liverpool, Walton", - "65971": "Halesowen and Rowley Regis", - "65972": "Carshalton and Wallington", - "65973": "Reading East", - "65974": "Plymouth, Moor View", - "65975": "Bury South", - "65976": "Tewkesbury", - "65977": "The Wrekin", - "65978": "Leigh", - "65979": "East Yorkshire", - "65980": "Chesterfield", - "65981": "Blackburn", - "65982": "Reading West", - "65983": "West Bromwich East", - "65984": "Kingston upon Hull West and Hessle", - "65985": "Dagenham and Rainham", - "65986": "Skipton and Ripon", - "65987": "Louth and Horncastle", - "65988": "Leeds West", - "65989": "Birmingham, Ladywood", - "65990": "Hartlepool", - "65991": "Ellesmere Port and Neston", - "65992": "Telford", - "65993": "Bournemouth East", - "65994": "Hertsmere", - "65995": "Bradford South", - "65996": "Gloucester", - "65997": "South East Cambridgeshire", - "65998": "Middlesbrough", - "65999": "Mid Sussex", - "66000": "Brigg and Goole", - "66001": "Kettering", - "66002": "Penistone and Stocksbridge", - "66003": "Hertford and Stortford", - "66004": "Waveney", - "66005": "Reigate", - "66006": "Barrow and Furness", - "66007": "Mid Derbyshire", - "66008": "Banbury", - "66009": "Bristol North West", - "66010": "Wycombe", - "66011": "Dartford", - "66012": "Barnsley East", - "66013": "Leyton and Wanstead", - "66014": "Portsmouth South", - "66015": "Bury North", - "66016": "Southampton, Itchen", - "66017": "North Shropshire", - "66018": "Hemsworth", - "66019": "Rossendale and Darwen", - "66020": "Lewes", - "66021": "City of Durham", - "66022": "Oldham West and Royton", - "66023": "Erith and Thamesmead", - "66024": "North Warwickshire", - "66025": "Daventry", - "66026": "Jarrow", - "66027": "Scunthorpe", - "66028": "Birmingham, Perry Barr", - "66029": "Rotherham", - "66030": "Clacton", - "66031": "Bristol South", - "66032": "Redcar", - "66033": "Exeter", - "66034": "South Leicestershire", - "66035": "Bury St Edmunds", - "66036": "Bradford West", - "66037": "York Outer", - "66038": "Mitcham and Morden", - "66039": "Woking", - "66040": "Sutton and Cheam", - "66041": "Lewisham, Deptford", - "66042": "Streatham", - "66043": "Rochester and Strood", - "66044": "Epping Forest", - "66045": "Putney", - "66046": "Lichfield", - "66047": "West Bromwich West", - "66048": "Manchester Central", - "66049": "Washington and Sunderland West", - "66050": "Enfield North", - "66051": "South Holland and The Deepings", - "66052": "High Peak", - "66053": "Kingswood", - "66054": "Dudley South", - "66055": "Newcastle upon Tyne Central", - "66056": "Ashton-under-Lyne", - "66057": "Cleethorpes", - "66058": "West Ham", - "66059": "Northampton North", - "66060": "Oxford East", - "66061": "Mid Dorset and North Poole", - "66062": "Esher and Walton", - "66063": "North East Cambridgeshire", - "66064": "Forest of Dean", - "66065": "Brent Central", - "66066": "Liverpool, Riverside", - "66067": "Stafford", - "66068": "Leeds North West", - "66069": "Hornchurch and Upminster", - "66070": "Derby North", - "66071": "Bosworth", - "66072": "Birmingham, Hodge Hill", - "66073": "St Helens North", - "66074": "Tottenham", - "66075": "Chatham and Aylesford", - "66076": "Milton Keynes South", - "66077": "Romford", - "66078": "Wyre Forest", - "66079": "Warley", - "66080": "Luton South", - "66081": "Penrith and The Border", - "66082": "Neath", - "66083": "Gower", - "66084": "Monmouth", - "66085": "Aberconwy", - "66086": "Merthyr Tydfil and Rhymney", - "66087": "Pontypridd", - "66088": "Brecon and Radnorshire", - "66089": "Carmarthen East and Dinefwr", - "66090": "Cardiff Central", - "66091": "Swansea East", - "66092": "Rhondda", - "66093": "Blaenau Gwent", - "66094": "Newport East", - "66095": "Bridgend", - "66096": "Dwyfor Meirionnydd", - "66097": "Islwyn", - "66098": "Vale of Glamorgan", - "66099": "Newport West", - "66100": "Clwyd West", - "66101": "Aberavon", - "66102": "Preseli Pembrokeshire", - "66103": "Alyn and Deeside", - "66104": "Torfaen", - "66105": "Cynon Valley", - "66106": "Caerphilly", - "66107": "Ogmore", - "66108": "Arfon", - "66109": "Carmarthen West and South Pembrokeshire", - "66110": "Ceredigion", - "66111": "Montgomeryshire", - "66112": "Delyn", - "66113": "Wrexham", - "66114": "Cardiff West", - "66115": "Ynys M\xf4n", - "66116": "Vale of Clwyd", - "66117": "Llanelli", - "66118": "Swansea West", - "66119": "Cardiff South and Penarth", - "66120": "Cardiff North", - "66121": "Clwyd South", - "66124": "Belfast East", - "66125": "Belfast North", - "66126": "Belfast South", - "66127": "Belfast West", - "66128": "East Antrim", - "66129": "East Londonderry", - "66130": "Fermanagh and South Tyrone", - "66131": "Foyle", - "66132": "Lagan Valley", - "66133": "Mid Ulster", - "66134": "Newry and Armagh", - "66135": "North Antrim", - "66136": "North Down", - "66137": "South Antrim", - "66138": "South Down", - "66139": "Strangford", - "66140": "Upper Bann", - "66141": "West Tyrone", -} diff --git a/ynr/apps/results/migrations/0006_resultevent_winner.py b/ynr/apps/results/migrations/0006_resultevent_winner.py deleted file mode 100644 index e8b1023049..0000000000 --- a/ynr/apps/results/migrations/0006_resultevent_winner.py +++ /dev/null @@ -1,20 +0,0 @@ -from django.db import migrations, models - - -class Migration(migrations.Migration): - - dependencies = [ - ("popolo", "0002_update_models_from_upstream"), - ("results", "0005_auto_fill_election_and_post_name"), - ] - - operations = [ - migrations.AddField( - model_name="resultevent", - name="winner", - field=models.ForeignKey( - default=1, to="popolo.Person", on_delete=models.CASCADE - ), - preserve_default=False, - ) - ] diff --git a/ynr/apps/results/migrations/0007_update_winner_from_popit_person_id.py b/ynr/apps/results/migrations/0007_update_winner_from_popit_person_id.py deleted file mode 100644 index 0f30e3c1af..0000000000 --- a/ynr/apps/results/migrations/0007_update_winner_from_popit_person_id.py +++ /dev/null @@ -1,29 +0,0 @@ -from django.db import migrations - - -def popit_to_db(apps, schema_editor): - Person = apps.get_model("popolo", "person") - ResultEvent = apps.get_model("results", "resultevent") - for res in ResultEvent.objects.all(): - if res.winner_popit_person_id: - res.person = Person.objects.get(pk=res.winner_popit_person_id) - else: - res.person = None - res.save() - - -def db_to_popit(apps, schema_editor): - ResultEvent = apps.get_model("results", "resultevent") - for res in ResultEvent.objects.all(): - if res.person: - res.winner_popit_person_id = res.person.id - else: - res.winner_popit_person_id = "" - res.save() - - -class Migration(migrations.Migration): - - dependencies = [("results", "0006_resultevent_winner")] - - operations = [migrations.RunPython(popit_to_db, db_to_popit)] diff --git a/ynr/apps/results/migrations/0008_remove_resultevent_winner_popit_person_id.py b/ynr/apps/results/migrations/0008_remove_resultevent_winner_popit_person_id.py deleted file mode 100644 index 215ddb7b79..0000000000 --- a/ynr/apps/results/migrations/0008_remove_resultevent_winner_popit_person_id.py +++ /dev/null @@ -1,12 +0,0 @@ -from django.db import migrations - - -class Migration(migrations.Migration): - - dependencies = [("results", "0007_update_winner_from_popit_person_id")] - - operations = [ - migrations.RemoveField( - model_name="resultevent", name="winner_popit_person_id" - ) - ] diff --git a/ynr/apps/results/migrations/0009_resultevent_election_new.py b/ynr/apps/results/migrations/0009_resultevent_election_new.py deleted file mode 100644 index 586cb8ba97..0000000000 --- a/ynr/apps/results/migrations/0009_resultevent_election_new.py +++ /dev/null @@ -1,22 +0,0 @@ -from django.db import migrations, models - - -class Migration(migrations.Migration): - - dependencies = [ - ("elections", "0012_election_people_elected_per_post"), - ("results", "0008_remove_resultevent_winner_popit_person_id"), - ] - - operations = [ - migrations.AddField( - model_name="resultevent", - name="election_new", - field=models.ForeignKey( - blank=True, - to="elections.Election", - null=True, - on_delete=models.CASCADE, - ), - ) - ] diff --git a/ynr/apps/results/migrations/0010_resultevent_winner_party_new.py b/ynr/apps/results/migrations/0010_resultevent_winner_party_new.py deleted file mode 100644 index 6f03e3a6a7..0000000000 --- a/ynr/apps/results/migrations/0010_resultevent_winner_party_new.py +++ /dev/null @@ -1,22 +0,0 @@ -from django.db import migrations, models - - -class Migration(migrations.Migration): - - dependencies = [ - ("popolo", "0002_update_models_from_upstream"), - ("results", "0009_resultevent_election_new"), - ] - - operations = [ - migrations.AddField( - model_name="resultevent", - name="winner_party_new", - field=models.ForeignKey( - blank=True, - to="popolo.Organization", - null=True, - on_delete=models.CASCADE, - ), - ) - ] diff --git a/ynr/apps/results/migrations/0011_resultevent_post_new.py b/ynr/apps/results/migrations/0011_resultevent_post_new.py deleted file mode 100644 index f863fc28a3..0000000000 --- a/ynr/apps/results/migrations/0011_resultevent_post_new.py +++ /dev/null @@ -1,22 +0,0 @@ -from django.db import migrations, models - - -class Migration(migrations.Migration): - - dependencies = [ - ("popolo", "0002_update_models_from_upstream"), - ("results", "0010_resultevent_winner_party_new"), - ] - - operations = [ - migrations.AddField( - model_name="resultevent", - name="post_new", - field=models.ForeignKey( - blank=True, - to="popolo.Post", - null=True, - on_delete=models.CASCADE, - ), - ) - ] diff --git a/ynr/apps/results/migrations/0012_migrate_resultevent_data.py b/ynr/apps/results/migrations/0012_migrate_resultevent_data.py deleted file mode 100644 index 169acc41e3..0000000000 --- a/ynr/apps/results/migrations/0012_migrate_resultevent_data.py +++ /dev/null @@ -1,42 +0,0 @@ -from django.db import migrations - - -def migrate_remaining_fields_to_popolo_models(apps, schema_editor): - ResultEvent = apps.get_model("results", "ResultEvent") - Organization = apps.get_model("popolo", "Organization") - Post = apps.get_model("popolo", "Post") - Election = apps.get_model("elections", "Election") - for re in ResultEvent.objects.all(): - # Get the post, if possible (some have been deleted), and the - # election based on the existing text-based fields: - if re.election == "2015": - election_name = "2015 General Election" - else: - election_name = re.election - post = Post.objects.filter(extra__slug=re.post_id).first() - if post: - election = post.extra.elections.filter(name=election_name).first() - if not election: - election = post.extra.elections.get( - name=election_name, election_date__year=re.created.year - ) - else: - election = Election.objects.filter( - name=re.election, election_date__lte=re.created - ).first() - re.election_new = election - re.post_new = post - # Now get the party of the winner: - re.winner_party_new = Organization.objects.get( - extra__slug=re.winner_party_id - ) - re.save() - - -class Migration(migrations.Migration): - - dependencies = [("results", "0011_resultevent_post_new")] - - operations = [ - migrations.RunPython(migrate_remaining_fields_to_popolo_models) - ] diff --git a/ynr/apps/results/migrations/0013_remove_old_fields.py b/ynr/apps/results/migrations/0013_remove_old_fields.py deleted file mode 100644 index b49843b88b..0000000000 --- a/ynr/apps/results/migrations/0013_remove_old_fields.py +++ /dev/null @@ -1,16 +0,0 @@ -from django.db import migrations - - -class Migration(migrations.Migration): - - dependencies = [("results", "0012_migrate_resultevent_data")] - - operations = [ - migrations.RemoveField(model_name="resultevent", name="election"), - migrations.RemoveField( - model_name="resultevent", name="winner_party_id" - ), - migrations.RemoveField( - model_name="resultevent", name="winner_person_name" - ), - ] diff --git a/ynr/apps/results/migrations/0014_rename_election_new_to_election.py b/ynr/apps/results/migrations/0014_rename_election_new_to_election.py deleted file mode 100644 index dd68626228..0000000000 --- a/ynr/apps/results/migrations/0014_rename_election_new_to_election.py +++ /dev/null @@ -1,14 +0,0 @@ -from django.db import migrations - - -class Migration(migrations.Migration): - - dependencies = [("results", "0013_remove_old_fields")] - - operations = [ - migrations.RenameField( - model_name="resultevent", - old_name="election_new", - new_name="election", - ) - ] diff --git a/ynr/apps/results/migrations/0015_rename_to_winner_party.py b/ynr/apps/results/migrations/0015_rename_to_winner_party.py deleted file mode 100644 index 2b041a97f6..0000000000 --- a/ynr/apps/results/migrations/0015_rename_to_winner_party.py +++ /dev/null @@ -1,14 +0,0 @@ -from django.db import migrations - - -class Migration(migrations.Migration): - - dependencies = [("results", "0014_rename_election_new_to_election")] - - operations = [ - migrations.RenameField( - model_name="resultevent", - old_name="winner_party_new", - new_name="winner_party", - ) - ] diff --git a/ynr/apps/results/migrations/0016_rename_post_id_to_old_post_id.py b/ynr/apps/results/migrations/0016_rename_post_id_to_old_post_id.py deleted file mode 100644 index bab6a4cde9..0000000000 --- a/ynr/apps/results/migrations/0016_rename_post_id_to_old_post_id.py +++ /dev/null @@ -1,12 +0,0 @@ -from django.db import migrations - - -class Migration(migrations.Migration): - - dependencies = [("results", "0015_rename_to_winner_party")] - - operations = [ - migrations.RenameField( - model_name="resultevent", old_name="post_id", new_name="old_post_id" - ) - ] diff --git a/ynr/apps/results/migrations/0017_rename_post_name_to_old_post_name.py b/ynr/apps/results/migrations/0017_rename_post_name_to_old_post_name.py deleted file mode 100644 index a7d479508e..0000000000 --- a/ynr/apps/results/migrations/0017_rename_post_name_to_old_post_name.py +++ /dev/null @@ -1,14 +0,0 @@ -from django.db import migrations - - -class Migration(migrations.Migration): - - dependencies = [("results", "0016_rename_post_id_to_old_post_id")] - - operations = [ - migrations.RenameField( - model_name="resultevent", - old_name="post_name", - new_name="old_post_name", - ) - ] diff --git a/ynr/apps/results/migrations/0018_fix_2015_resultevent_winners.py b/ynr/apps/results/migrations/0018_fix_2015_resultevent_winners.py deleted file mode 100644 index 30a92cd44d..0000000000 --- a/ynr/apps/results/migrations/0018_fix_2015_resultevent_winners.py +++ /dev/null @@ -1,25 +0,0 @@ -from django.db import migrations - - -def fix_2015_winners(apps, schema_editor): - ResultEvent = apps.get_model("results", "ResultEvent") - Person = apps.get_model("popolo", "Person") - for re in ResultEvent.objects.filter(election__slug=2015): - # Through some mistake or other, all the winners of the 2015 - # were set to the person with ID 1. Find the right person - # instead: - if re.winner.id == 1: - re.winner = Person.objects.get( - memberships__extra__elected=True, - memberships__post_election__election=re.election, - memberships__post=re.post_new, - memberships__on_behalf_of=re.winner_party, - ) - re.save() - - -class Migration(migrations.Migration): - - dependencies = [("results", "0017_rename_post_name_to_old_post_name")] - - operations = [migrations.RunPython(fix_2015_winners)] diff --git a/ynr/apps/results/migrations/0019_rename_post_new_to_post.py b/ynr/apps/results/migrations/0019_rename_post_new_to_post.py deleted file mode 100644 index 12b0a779e6..0000000000 --- a/ynr/apps/results/migrations/0019_rename_post_new_to_post.py +++ /dev/null @@ -1,12 +0,0 @@ -from django.db import migrations - - -class Migration(migrations.Migration): - - dependencies = [("results", "0018_fix_2015_resultevent_winners")] - - operations = [ - migrations.RenameField( - model_name="resultevent", old_name="post_new", new_name="post" - ) - ] diff --git a/ynr/apps/results/migrations/0020_remove_resultevent_proxy_image_url_template.py b/ynr/apps/results/migrations/0020_remove_resultevent_proxy_image_url_template.py deleted file mode 100644 index e2d70a12b3..0000000000 --- a/ynr/apps/results/migrations/0020_remove_resultevent_proxy_image_url_template.py +++ /dev/null @@ -1,12 +0,0 @@ -from django.db import migrations - - -class Migration(migrations.Migration): - - dependencies = [("results", "0019_rename_post_new_to_post")] - - operations = [ - migrations.RemoveField( - model_name="resultevent", name="proxy_image_url_template" - ) - ] diff --git a/ynr/apps/results/migrations/0021_resultevent_retraction.py b/ynr/apps/results/migrations/0021_resultevent_retraction.py deleted file mode 100644 index 8bc92df59a..0000000000 --- a/ynr/apps/results/migrations/0021_resultevent_retraction.py +++ /dev/null @@ -1,16 +0,0 @@ -from django.db import migrations, models - - -class Migration(migrations.Migration): - - dependencies = [ - ("results", "0020_remove_resultevent_proxy_image_url_template") - ] - - operations = [ - migrations.AddField( - model_name="resultevent", - name="retraction", - field=models.BooleanField(default=False), - ) - ] diff --git a/ynr/apps/results/migrations/0022_resultevent_winner_party_tmp.py b/ynr/apps/results/migrations/0022_resultevent_winner_party_tmp.py deleted file mode 100644 index c99b18403a..0000000000 --- a/ynr/apps/results/migrations/0022_resultevent_winner_party_tmp.py +++ /dev/null @@ -1,26 +0,0 @@ -# -*- coding: utf-8 -*- -# Generated by Django 1.10.8 on 2018-09-05 19:27 -from __future__ import unicode_literals - -import django.db.models.deletion -from django.db import migrations, models - - -class Migration(migrations.Migration): - - dependencies = [ - ("results", "0021_resultevent_retraction"), - ("parties", "0008_unique_ec_id"), - ] - - operations = [ - migrations.AddField( - model_name="resultevent", - name="winner_party_tmp", - field=models.ForeignKey( - null=True, - on_delete=django.db.models.deletion.CASCADE, - to="parties.Party", - ), - ) - ] diff --git a/ynr/apps/results/migrations/0023_migrate_winner_party_to_party_model.py b/ynr/apps/results/migrations/0023_migrate_winner_party_to_party_model.py deleted file mode 100644 index 177af4ac63..0000000000 --- a/ynr/apps/results/migrations/0023_migrate_winner_party_to_party_model.py +++ /dev/null @@ -1,44 +0,0 @@ -# -*- coding: utf-8 -*- -# Generated by Django 1.10.8 on 2018-09-05 19:27 -from __future__ import unicode_literals - -from django.db import migrations - - -def add_tmp_party(apps, schema_editor): - Organzation = apps.get_model("popolo", "Organization") - ResultEvent = apps.get_model("results", "ResultEvent") - Party = apps.get_model("parties", "Party") - - parties_by_legacy_slug = {} - org_id_to_party_slug = {} - - for party in Party.objects.all(): - parties_by_legacy_slug[party.legacy_slug] = party - - org_qs = Organzation.objects.filter(classification="Party").select_related( - "extra" - ) - for org in org_qs: - org_id_to_party_slug[org.pk] = org.extra.slug - - for org_id, party_slug in org_id_to_party_slug.items(): - qs = ResultEvent.objects.filter(winner_party_id=org_id) - if qs.exists(): - qs.update(winner_party_tmp=parties_by_legacy_slug[party_slug]) - - if ResultEvent.objects.filter(winner_party_tmp=None).exists(): - print(ResultEvent.objects.filter(winner_party_tmp=None)) - raise ValueError("ReusltEvent objects without tmp winner party found") - - -class Migration(migrations.Migration): - - dependencies = [ - ("results", "0022_resultevent_winner_party_tmp"), - ("parties", "0008_unique_ec_id"), - ] - - operations = [ - migrations.RunPython(add_tmp_party, migrations.RunPython.noop) - ] diff --git a/ynr/apps/results/migrations/0024_rename_tmp_field.py b/ynr/apps/results/migrations/0024_rename_tmp_field.py deleted file mode 100644 index 765b277473..0000000000 --- a/ynr/apps/results/migrations/0024_rename_tmp_field.py +++ /dev/null @@ -1,19 +0,0 @@ -# -*- coding: utf-8 -*- -# Generated by Django 1.10.8 on 2018-09-05 20:20 -from __future__ import unicode_literals - -from django.db import migrations - - -class Migration(migrations.Migration): - - dependencies = [("results", "0023_migrate_winner_party_to_party_model")] - - operations = [ - migrations.RemoveField(model_name="resultevent", name="winner_party"), - migrations.RenameField( - model_name="resultevent", - old_name="winner_party_tmp", - new_name="winner_party", - ), - ] diff --git a/ynr/apps/results/migrations/0025_winner_party_not_null.py b/ynr/apps/results/migrations/0025_winner_party_not_null.py deleted file mode 100644 index f484b91b51..0000000000 --- a/ynr/apps/results/migrations/0025_winner_party_not_null.py +++ /dev/null @@ -1,21 +0,0 @@ -# -*- coding: utf-8 -*- -# Generated by Django 1.10.8 on 2018-09-06 11:19 -from __future__ import unicode_literals - -import django.db.models.deletion -from django.db import migrations, models - - -class Migration(migrations.Migration): - - dependencies = [("results", "0024_rename_tmp_field")] - - operations = [ - migrations.AlterField( - model_name="resultevent", - name="winner_party", - field=models.ForeignKey( - on_delete=django.db.models.deletion.CASCADE, to="parties.Party" - ), - ) - ] diff --git a/ynr/apps/results/migrations/0026_move_person_fk_to_people_app.py b/ynr/apps/results/migrations/0026_move_person_fk_to_people_app.py deleted file mode 100644 index 7acd1947d6..0000000000 --- a/ynr/apps/results/migrations/0026_move_person_fk_to_people_app.py +++ /dev/null @@ -1,24 +0,0 @@ -# -*- coding: utf-8 -*- -# Generated by Django 1.10.8 on 2018-10-23 19:36 -from __future__ import unicode_literals - -import django.db.models.deletion -from django.db import migrations, models - - -class Migration(migrations.Migration): - - dependencies = [ - ("results", "0025_winner_party_not_null"), - ("people", "0004_move_person_data"), - ] - - operations = [ - migrations.AlterField( - model_name="resultevent", - name="winner", - field=models.ForeignKey( - on_delete=django.db.models.deletion.CASCADE, to="people.Person" - ), - ) - ] diff --git a/ynr/apps/results/migrations/0027_alter_resultevent_source.py b/ynr/apps/results/migrations/0027_alter_resultevent_source.py deleted file mode 100644 index d7eefd1707..0000000000 --- a/ynr/apps/results/migrations/0027_alter_resultevent_source.py +++ /dev/null @@ -1,16 +0,0 @@ -# Generated by Django 3.2 on 2021-11-19 10:57 - -from django.db import migrations, models - - -class Migration(migrations.Migration): - - dependencies = [("results", "0026_move_person_fk_to_people_app")] - - operations = [ - migrations.AlterField( - model_name="resultevent", - name="source", - field=models.CharField(max_length=2000), - ) - ] diff --git a/ynr/apps/search/migrations/0001_initial.py b/ynr/apps/search/migrations/0001_initial.py deleted file mode 100644 index 75bb32d833..0000000000 --- a/ynr/apps/search/migrations/0001_initial.py +++ /dev/null @@ -1,6 +0,0 @@ -from django.db import migrations -from django.contrib.postgres.operations import TrigramExtension - - -class Migration(migrations.Migration): - operations = [TrigramExtension()] diff --git a/ynr/apps/sopn_parsing/migrations/0001_initial.py b/ynr/apps/sopn_parsing/migrations/0001_initial.py index 949dd149ed..275c87bad5 100644 --- a/ynr/apps/sopn_parsing/migrations/0001_initial.py +++ b/ynr/apps/sopn_parsing/migrations/0001_initial.py @@ -1,18 +1,16 @@ -# -*- coding: utf-8 -*- -# Generated by Django 1.11.20 on 2019-02-26 13:09 -from __future__ import unicode_literals +# Generated by Django 3.2.10 on 2021-12-14 17:21 +from django.db import migrations, models import django.db.models.deletion import django.utils.timezone import model_utils.fields -from django.db import migrations, models class Migration(migrations.Migration): initial = True - dependencies = [("official_documents", "0024_add_relevant_pages")] + dependencies = [("official_documents", "0001_initial")] operations = [ migrations.CreateModel( @@ -57,7 +55,7 @@ class Migration(migrations.Migration): "sopn", models.OneToOneField( on_delete=django.db.models.deletion.CASCADE, - to="official_documents.OfficialDocument", + to="official_documents.officialdocument", ), ), ], diff --git a/ynr/apps/twitterbot/migrations/0001_initial.py b/ynr/apps/twitterbot/migrations/0001_initial.py deleted file mode 100644 index f6a32379e4..0000000000 --- a/ynr/apps/twitterbot/migrations/0001_initial.py +++ /dev/null @@ -1,17 +0,0 @@ -# -*- coding: utf-8 -*- -# Generated by Django 1.10.8 on 2018-08-13 13:56 - -from django.conf import settings -from django.db import migrations - - -def create_user(apps, schema_editor): - User = apps.get_model("auth", "User") - User.objects.get_or_create(username=settings.TWITTER_BOT_USERNAME) - - -class Migration(migrations.Migration): - - dependencies = [] - - operations = [migrations.RunPython(create_user, migrations.RunPython.noop)] diff --git a/ynr/apps/uk_results/migrations/0001_initial.py b/ynr/apps/uk_results/migrations/0001_initial.py index ca30f30b91..cc2ce6cd0a 100644 --- a/ynr/apps/uk_results/migrations/0001_initial.py +++ b/ynr/apps/uk_results/migrations/0001_initial.py @@ -1,26 +1,33 @@ -import django_extensions.db.fields +# Generated by Django 3.2.10 on 2021-12-14 17:21 + from django.conf import settings +import django.core.validators from django.db import migrations, models +import django.db.models.deletion +import django_extensions.db.fields class Migration(migrations.Migration): + initial = True + dependencies = [ - ("popolo", "0002_update_models_from_upstream"), + ("popolo", "0001_initial"), migrations.swappable_dependency(settings.AUTH_USER_MODEL), + ("candidates", "0001_initial"), ] operations = [ migrations.CreateModel( - name="CandidateResult", + name="ResultSet", fields=[ ( "id", models.AutoField( - verbose_name="ID", - serialize=False, auto_created=True, primary_key=True, + serialize=False, + verbose_name="ID", ), ), ( @@ -35,29 +42,67 @@ class Migration(migrations.Migration): auto_now=True, verbose_name="modified" ), ), - ("num_ballots_reported", models.IntegerField()), - ("is_winner", models.BooleanField(default=False)), ( - "person", + "num_turnout_reported", + models.PositiveIntegerField( + null=True, verbose_name="Reported Turnout" + ), + ), + ( + "turnout_percentage", + models.FloatField( + blank=True, + null=True, + validators=[ + django.core.validators.MinValueValidator(0), + django.core.validators.MaxValueValidator(100), + ], + ), + ), + ( + "num_spoilt_ballots", + models.PositiveIntegerField( + null=True, verbose_name="Spoilt Ballots" + ), + ), + ( + "total_electorate", + models.PositiveIntegerField( + blank=True, null=True, verbose_name="Total Electorate" + ), + ), + ("source", models.TextField(null=True)), + ("versions", models.JSONField(default=list)), + ("ip_address", models.GenericIPAddressField(null=True)), + ( + "ballot", + models.OneToOneField( + on_delete=django.db.models.deletion.CASCADE, + to="candidates.ballot", + ), + ), + ( + "user", models.ForeignKey( - related_name="candidate_results", - to="popolo.Person", - on_delete=models.CASCADE, + null=True, + on_delete=django.db.models.deletion.CASCADE, + related_name="result_sets", + to=settings.AUTH_USER_MODEL, ), ), ], - options={"ordering": ("person",)}, + options={"get_latest_by": "modified", "abstract": False}, ), migrations.CreateModel( - name="ResultSet", + name="CandidateResult", fields=[ ( "id", models.AutoField( - verbose_name="ID", - serialize=False, auto_created=True, primary_key=True, + serialize=False, + verbose_name="ID", ), ), ( @@ -72,54 +117,34 @@ class Migration(migrations.Migration): auto_now=True, verbose_name="modified" ), ), - ("num_turnout_reported", models.IntegerField()), - ("num_spoilt_ballots", models.IntegerField()), - ("is_final", models.BooleanField(default=False)), - ("source", models.TextField()), - ("ip_address", models.GenericIPAddressField()), + ("num_ballots", models.PositiveIntegerField()), ( - "confirmed_by", - models.ForeignKey( - related_name="result_sets_confirmed", - to=settings.AUTH_USER_MODEL, - null=True, - on_delete=models.CASCADE, + "tied_vote_winner", + models.BooleanField( + default=False, + help_text="Did this person win after receiving same votes as another candidate, via coin toss, lots etc", ), ), ( - "post", - models.ForeignKey( - related_name="result_sets", - to="popolo.Post", - on_delete=models.CASCADE, + "membership", + models.OneToOneField( + on_delete=django.db.models.deletion.CASCADE, + related_name="result", + to="popolo.membership", ), ), ( - "user", + "result_set", models.ForeignKey( - related_name="result_sets", - to=settings.AUTH_USER_MODEL, - null=True, - on_delete=models.CASCADE, + on_delete=django.db.models.deletion.CASCADE, + related_name="candidate_results", + to="uk_results.resultset", ), ), ], options={ - "ordering": ("-modified", "-created"), - "abstract": False, - "get_latest_by": "modified", + "ordering": ("-num_ballots",), + "unique_together": {("result_set", "membership")}, }, ), - migrations.AddField( - model_name="candidateresult", - name="result_set", - field=models.ForeignKey( - related_name="candidate_results", - to="uk_results.ResultSet", - on_delete=models.CASCADE, - ), - ), - migrations.AlterUniqueTogether( - name="candidateresult", unique_together={("result_set", "person")} - ), ] diff --git a/ynr/apps/uk_results/migrations/0002_auto_20160425_2110.py b/ynr/apps/uk_results/migrations/0002_auto_20160425_2110.py deleted file mode 100644 index bcf65afc7b..0000000000 --- a/ynr/apps/uk_results/migrations/0002_auto_20160425_2110.py +++ /dev/null @@ -1,118 +0,0 @@ -import django_extensions.db.fields -from django.db import migrations, models - - -class Migration(migrations.Migration): - - dependencies = [ - ("popolo", "0002_update_models_from_upstream"), - ("elections", "0012_election_people_elected_per_post"), - ("uk_results", "0001_initial"), - ] - - operations = [ - migrations.CreateModel( - name="Council", - fields=[ - ( - "council_id", - models.CharField( - max_length=100, serialize=False, primary_key=True - ), - ), - ("council_type", models.CharField(max_length=10, blank=True)), - ("mapit_id", models.CharField(max_length=100, blank=True)), - ("name", models.CharField(max_length=255, blank=True)), - ("email", models.EmailField(max_length=254, blank=True)), - ("phone", models.CharField(max_length=100, blank=True)), - ("website", models.URLField(blank=True)), - ( - "postcode", - models.CharField(max_length=100, null=True, blank=True), - ), - ("address", models.TextField(null=True, blank=True)), - ], - ), - migrations.CreateModel( - name="CouncilElection", - fields=[ - ( - "id", - models.AutoField( - verbose_name="ID", - serialize=False, - auto_created=True, - primary_key=True, - ), - ), - ( - "council", - models.ForeignKey( - to="uk_results.Council", on_delete=models.CASCADE - ), - ), - ( - "election", - models.ForeignKey( - to="elections.Election", on_delete=models.CASCADE - ), - ), - ], - ), - migrations.CreateModel( - name="CouncilElectionResultSet", - fields=[ - ( - "id", - models.AutoField( - verbose_name="ID", - serialize=False, - auto_created=True, - primary_key=True, - ), - ), - ( - "created", - django_extensions.db.fields.CreationDateTimeField( - auto_now_add=True, verbose_name="created" - ), - ), - ( - "modified", - django_extensions.db.fields.ModificationDateTimeField( - auto_now=True, verbose_name="modified" - ), - ), - ("source", models.TextField(null=True)), - ( - "controller", - models.ForeignKey( - to="popolo.Organization", - null=True, - on_delete=models.CASCADE, - ), - ), - ( - "council_election", - models.ForeignKey( - to="uk_results.CouncilElection", - on_delete=models.CASCADE, - ), - ), - ], - options={"abstract": False}, - ), - migrations.AlterModelOptions(name="resultset", options={}), - migrations.RemoveField(model_name="resultset", name="confirmed_by"), - migrations.RemoveField(model_name="resultset", name="is_final"), - migrations.AddField( - model_name="candidateresult", - name="source", - field=models.TextField(null=True), - ), - migrations.AlterField( - model_name="resultset", - name="source", - field=models.TextField(null=True), - ), - ] diff --git a/ynr/apps/uk_results/migrations/0003_auto_20160425_2151.py b/ynr/apps/uk_results/migrations/0003_auto_20160425_2151.py deleted file mode 100644 index 9af7302673..0000000000 --- a/ynr/apps/uk_results/migrations/0003_auto_20160425_2151.py +++ /dev/null @@ -1,23 +0,0 @@ -from django.db import migrations, models - - -class Migration(migrations.Migration): - - dependencies = [("uk_results", "0002_auto_20160425_2110")] - - operations = [ - migrations.AlterField( - model_name="councilelection", - name="council", - field=models.OneToOneField( - to="uk_results.Council", on_delete=models.CASCADE - ), - ), - migrations.AlterField( - model_name="councilelection", - name="election", - field=models.OneToOneField( - to="elections.Election", on_delete=models.CASCADE - ), - ), - ] diff --git a/ynr/apps/uk_results/migrations/0004_councilelection_party_set.py b/ynr/apps/uk_results/migrations/0004_councilelection_party_set.py deleted file mode 100644 index 7efb87c229..0000000000 --- a/ynr/apps/uk_results/migrations/0004_councilelection_party_set.py +++ /dev/null @@ -1,20 +0,0 @@ -from django.db import migrations, models - - -class Migration(migrations.Migration): - - dependencies = [ - ("candidates", "0030_merge"), - ("uk_results", "0003_auto_20160425_2151"), - ] - - operations = [ - migrations.AddField( - model_name="councilelection", - name="party_set", - field=models.ForeignKey( - default=1, to="candidates.PartySet", on_delete=models.CASCADE - ), - preserve_default=False, - ) - ] diff --git a/ynr/apps/uk_results/migrations/0005_auto_20160426_1058.py b/ynr/apps/uk_results/migrations/0005_auto_20160426_1058.py deleted file mode 100644 index faec2dab82..0000000000 --- a/ynr/apps/uk_results/migrations/0005_auto_20160426_1058.py +++ /dev/null @@ -1,35 +0,0 @@ -from django.conf import settings -from django.db import migrations, models - - -class Migration(migrations.Migration): - - dependencies = [ - migrations.swappable_dependency(settings.AUTH_USER_MODEL), - ("uk_results", "0004_councilelection_party_set"), - ] - - operations = [ - migrations.AddField( - model_name="councilelectionresultset", - name="confirm_source", - field=models.TextField(null=True), - ), - migrations.AddField( - model_name="councilelectionresultset", - name="confirmed_by", - field=models.ForeignKey( - to=settings.AUTH_USER_MODEL, null=True, on_delete=models.CASCADE - ), - ), - migrations.AddField( - model_name="councilelectionresultset", - name="final_source", - field=models.TextField(null=True), - ), - migrations.AddField( - model_name="councilelectionresultset", - name="is_final", - field=models.BooleanField(default=False), - ), - ] diff --git a/ynr/apps/uk_results/migrations/0006_add_admin_persmissions.py b/ynr/apps/uk_results/migrations/0006_add_admin_persmissions.py deleted file mode 100644 index 4a836e0121..0000000000 --- a/ynr/apps/uk_results/migrations/0006_add_admin_persmissions.py +++ /dev/null @@ -1,39 +0,0 @@ -from django.db import migrations - -from auth_helpers.migrations import ( - get_migration_group_create, - get_migration_group_delete, -) - -try: - from uk_results.models import ( - TRUSTED_TO_CONFIRM_CONTROL_RESULTS_GROUP_NAME, - TRUSTED_TO_CONFIRM_VOTE_RESULTS_GROUP_NAME, - ) -except: - TRUSTED_TO_CONFIRM_CONTROL_RESULTS_GROUP_NAME = "trusted_to_confirm_control" - TRUSTED_TO_CONFIRM_VOTE_RESULTS_GROUP_NAME = "trusted_to_confirm_votes" - - -class Migration(migrations.Migration): - - dependencies = [("uk_results", "0005_auto_20160426_1058")] - - operations = [ - migrations.RunPython( - get_migration_group_create( - TRUSTED_TO_CONFIRM_CONTROL_RESULTS_GROUP_NAME, [] - ), - get_migration_group_delete( - TRUSTED_TO_CONFIRM_CONTROL_RESULTS_GROUP_NAME - ), - ), - migrations.RunPython( - get_migration_group_create( - TRUSTED_TO_CONFIRM_VOTE_RESULTS_GROUP_NAME, [] - ), - get_migration_group_delete( - TRUSTED_TO_CONFIRM_VOTE_RESULTS_GROUP_NAME - ), - ), - ] diff --git a/ynr/apps/uk_results/migrations/0007_councilelectionresultset_noc.py b/ynr/apps/uk_results/migrations/0007_councilelectionresultset_noc.py deleted file mode 100644 index 75f751eb41..0000000000 --- a/ynr/apps/uk_results/migrations/0007_councilelectionresultset_noc.py +++ /dev/null @@ -1,14 +0,0 @@ -from django.db import migrations, models - - -class Migration(migrations.Migration): - - dependencies = [("uk_results", "0006_add_admin_persmissions")] - - operations = [ - migrations.AddField( - model_name="councilelectionresultset", - name="noc", - field=models.BooleanField(default=False), - ) - ] diff --git a/ynr/apps/uk_results/migrations/0008_auto_20160426_1629.py b/ynr/apps/uk_results/migrations/0008_auto_20160426_1629.py deleted file mode 100644 index 976640f7fd..0000000000 --- a/ynr/apps/uk_results/migrations/0008_auto_20160426_1629.py +++ /dev/null @@ -1,23 +0,0 @@ -from django.db import migrations, models - - -class Migration(migrations.Migration): - - dependencies = [("uk_results", "0007_councilelectionresultset_noc")] - - operations = [ - migrations.AddField( - model_name="councilelection", - name="confirmed", - field=models.BooleanField(default=False), - ), - migrations.AlterField( - model_name="councilelectionresultset", - name="council_election", - field=models.ForeignKey( - related_name="reported_results", - to="uk_results.CouncilElection", - on_delete=models.CASCADE, - ), - ), - ] diff --git a/ynr/apps/uk_results/migrations/0009_auto_20160427_0858.py b/ynr/apps/uk_results/migrations/0009_auto_20160427_0858.py deleted file mode 100644 index d830325aab..0000000000 --- a/ynr/apps/uk_results/migrations/0009_auto_20160427_0858.py +++ /dev/null @@ -1,43 +0,0 @@ -from django.conf import settings -from django.db import migrations, models - - -class Migration(migrations.Migration): - - dependencies = [ - migrations.swappable_dependency(settings.AUTH_USER_MODEL), - ("uk_results", "0008_auto_20160426_1629"), - ] - - operations = [ - migrations.AddField( - model_name="councilelectionresultset", - name="is_rejected", - field=models.BooleanField(default=False), - ), - migrations.AddField( - model_name="councilelectionresultset", - name="rejected_by", - field=models.ForeignKey( - related_name="results_rejected", - to=settings.AUTH_USER_MODEL, - null=True, - on_delete=models.CASCADE, - ), - ), - migrations.AddField( - model_name="councilelectionresultset", - name="rejected_source", - field=models.TextField(null=True), - ), - migrations.AlterField( - model_name="councilelectionresultset", - name="confirmed_by", - field=models.ForeignKey( - related_name="results_confirmed", - to=settings.AUTH_USER_MODEL, - null=True, - on_delete=models.CASCADE, - ), - ), - ] diff --git a/ynr/apps/uk_results/migrations/0010_auto_20160427_0926.py b/ynr/apps/uk_results/migrations/0010_auto_20160427_0926.py deleted file mode 100644 index e923c25cde..0000000000 --- a/ynr/apps/uk_results/migrations/0010_auto_20160427_0926.py +++ /dev/null @@ -1,53 +0,0 @@ -from django.conf import settings -from django.db import migrations, models - - -class Migration(migrations.Migration): - - dependencies = [ - migrations.swappable_dependency(settings.AUTH_USER_MODEL), - ("uk_results", "0009_auto_20160427_0858"), - ] - - operations = [ - migrations.RenameField( - model_name="councilelectionresultset", - old_name="confirm_source", - new_name="review_source", - ), - migrations.RemoveField( - model_name="councilelectionresultset", name="confirmed_by" - ), - migrations.RemoveField( - model_name="councilelectionresultset", name="is_rejected" - ), - migrations.RemoveField( - model_name="councilelectionresultset", name="rejected_by" - ), - migrations.RemoveField( - model_name="councilelectionresultset", name="rejected_source" - ), - migrations.AddField( - model_name="councilelectionresultset", - name="review_status", - field=models.CharField( - blank=True, - max_length=100, - choices=[ - (b"unconfirmed", b"Unconfirmed"), - (b"confirmed", b"Confirmed"), - (b"rejected", b"Rejected"), - ], - ), - ), - migrations.AddField( - model_name="councilelectionresultset", - name="reviewed_by", - field=models.ForeignKey( - related_name="results_reviewed", - to=settings.AUTH_USER_MODEL, - null=True, - on_delete=models.CASCADE, - ), - ), - ] diff --git a/ynr/apps/uk_results/migrations/0011_auto_20160427_1305.py b/ynr/apps/uk_results/migrations/0011_auto_20160427_1305.py deleted file mode 100644 index 136a708801..0000000000 --- a/ynr/apps/uk_results/migrations/0011_auto_20160427_1305.py +++ /dev/null @@ -1,42 +0,0 @@ -from django.db import migrations, models - - -class Migration(migrations.Migration): - - dependencies = [ - ("popolo", "0002_update_models_from_upstream"), - ("uk_results", "0010_auto_20160427_0926"), - ] - - operations = [ - migrations.CreateModel( - name="PostResult", - fields=[ - ( - "id", - models.AutoField( - verbose_name="ID", - serialize=False, - auto_created=True, - primary_key=True, - ), - ), - ("confirmed", models.BooleanField(default=False)), - ( - "post", - models.ForeignKey( - to="popolo.Post", on_delete=models.CASCADE - ), - ), - ], - ), - migrations.AlterField( - model_name="resultset", - name="post", - field=models.ForeignKey( - related_name="result_sets", - to="uk_results.PostResult", - on_delete=models.CASCADE, - ), - ), - ] diff --git a/ynr/apps/uk_results/migrations/0012_auto_20160427_1339.py b/ynr/apps/uk_results/migrations/0012_auto_20160427_1339.py deleted file mode 100644 index 4b2733c0fc..0000000000 --- a/ynr/apps/uk_results/migrations/0012_auto_20160427_1339.py +++ /dev/null @@ -1,12 +0,0 @@ -from django.db import migrations - - -class Migration(migrations.Migration): - - dependencies = [("uk_results", "0011_auto_20160427_1305")] - - operations = [ - migrations.RenameField( - model_name="resultset", old_name="post", new_name="post_result" - ) - ] diff --git a/ynr/apps/uk_results/migrations/0013_auto_20160427_1410.py b/ynr/apps/uk_results/migrations/0013_auto_20160427_1410.py deleted file mode 100644 index 9ce0a3beb4..0000000000 --- a/ynr/apps/uk_results/migrations/0013_auto_20160427_1410.py +++ /dev/null @@ -1,55 +0,0 @@ -from django.conf import settings -from django.db import migrations, models - - -class Migration(migrations.Migration): - - dependencies = [ - migrations.swappable_dependency(settings.AUTH_USER_MODEL), - ("uk_results", "0012_auto_20160427_1339"), - ] - - operations = [ - migrations.AddField( - model_name="resultset", - name="final_source", - field=models.TextField(null=True), - ), - migrations.AddField( - model_name="resultset", - name="is_final", - field=models.BooleanField(default=False), - ), - migrations.AddField( - model_name="resultset", - name="review_source", - field=models.TextField(null=True), - ), - migrations.AddField( - model_name="resultset", - name="review_status", - field=models.CharField( - blank=True, - max_length=100, - choices=[ - (b"unconfirmed", b"Unconfirmed"), - (b"confirmed", b"Confirmed"), - (b"rejected", b"Rejected"), - ], - ), - ), - migrations.AddField( - model_name="resultset", - name="reviewed_by", - field=models.ForeignKey( - to=settings.AUTH_USER_MODEL, null=True, on_delete=models.CASCADE - ), - ), - migrations.AlterField( - model_name="councilelectionresultset", - name="reviewed_by", - field=models.ForeignKey( - to=settings.AUTH_USER_MODEL, null=True, on_delete=models.CASCADE - ), - ), - ] diff --git a/ynr/apps/uk_results/migrations/0014_auto_20160427_1429.py b/ynr/apps/uk_results/migrations/0014_auto_20160427_1429.py deleted file mode 100644 index a10f6c9a7f..0000000000 --- a/ynr/apps/uk_results/migrations/0014_auto_20160427_1429.py +++ /dev/null @@ -1,32 +0,0 @@ -from django.db import migrations, models - - -class Migration(migrations.Migration): - - dependencies = [ - ("popolo", "0002_update_models_from_upstream"), - ("uk_results", "0013_auto_20160427_1410"), - ] - - operations = [ - migrations.AlterModelOptions( - name="candidateresult", - options={"ordering": ("membership__person",)}, - ), - migrations.AddField( - model_name="candidateresult", - name="membership", - field=models.ForeignKey( - related_name="result", - default=1, - to="popolo.Membership", - on_delete=models.CASCADE, - ), - preserve_default=False, - ), - migrations.AlterUniqueTogether( - name="candidateresult", - unique_together={("result_set", "membership")}, - ), - migrations.RemoveField(model_name="candidateresult", name="person"), - ] diff --git a/ynr/apps/uk_results/migrations/0015_auto_20160428_0805.py b/ynr/apps/uk_results/migrations/0015_auto_20160428_0805.py deleted file mode 100644 index 91bdb2b46d..0000000000 --- a/ynr/apps/uk_results/migrations/0015_auto_20160428_0805.py +++ /dev/null @@ -1,47 +0,0 @@ -from django.db import migrations, models - - -class Migration(migrations.Migration): - - dependencies = [ - ("elections", "0012_election_people_elected_per_post"), - ("uk_results", "0014_auto_20160427_1429"), - ] - - operations = [ - migrations.CreateModel( - name="ElectionArea", - fields=[ - ( - "id", - models.AutoField( - verbose_name="ID", - serialize=False, - auto_created=True, - primary_key=True, - ), - ), - ("area_gss", models.CharField(max_length=100)), - ("area_name", models.CharField(max_length=255, blank=True)), - ("geo_json", models.TextField(blank=True)), - ( - "election", - models.ForeignKey( - to="elections.Election", on_delete=models.CASCADE - ), - ), - ( - "parent", - models.ForeignKey( - to="uk_results.ElectionArea", - null=True, - on_delete=models.CASCADE, - ), - ), - ], - ), - migrations.AlterModelOptions( - name="candidateresult", - options={"ordering": ("num_ballots_reported",)}, - ), - ] diff --git a/ynr/apps/uk_results/migrations/0016_auto_20160429_0938.py b/ynr/apps/uk_results/migrations/0016_auto_20160429_0938.py deleted file mode 100644 index 6a4eae65bb..0000000000 --- a/ynr/apps/uk_results/migrations/0016_auto_20160429_0938.py +++ /dev/null @@ -1,36 +0,0 @@ -from django.db import migrations, models - - -class Migration(migrations.Migration): - - dependencies = [ - ("popolo", "0002_update_models_from_upstream"), - ("uk_results", "0015_auto_20160428_0805"), - ] - - operations = [ - migrations.CreateModel( - name="PartyWithColour", - fields=[ - ("hex_value", models.CharField(max_length=100, blank=True)), - ( - "party", - models.OneToOneField( - primary_key=True, - serialize=False, - to="popolo.Organization", - on_delete=models.CASCADE, - ), - ), - ], - ), - migrations.AddField( - model_name="electionarea", - name="winning_party", - field=models.ForeignKey( - to="uk_results.PartyWithColour", - null=True, - on_delete=models.CASCADE, - ), - ), - ] diff --git a/ynr/apps/uk_results/migrations/0017_auto_20160429_0938.py b/ynr/apps/uk_results/migrations/0017_auto_20160429_0938.py deleted file mode 100644 index 8a08a44ee4..0000000000 --- a/ynr/apps/uk_results/migrations/0017_auto_20160429_0938.py +++ /dev/null @@ -1,32 +0,0 @@ -from django.db import migrations - -PARTY_COLOURS = { - "party:52": {"name": "Conservative and Unionist Party", "hex": "#0087DC"}, - "party:53": {"name": "Labour Party", "hex": "#D50000"}, - "party:63": {"name": "Green Party", "hex": "#008066"}, - "party:85": {"name": "UK Independence Party (UKIP)", "hex": "#B3009D"}, - "party:90": {"name": "Liberal Democrats", "hex": "#B3009D"}, - "party:77": {"name": "Plaid Cymru", "hex": "#3F8428"}, - "party:102": {"name": "Scottish National Party", "hex": "#FFF95D"}, -} - - -def add_party_colours(apps, schema_editor): - PartyWithColour = apps.get_model("uk_results", "PartyWithColour") - Organization = apps.get_model("popolo", "Organization") - for party_id, party_info in PARTY_COLOURS.items(): - try: - party = Organization.objects.get(extra__slug=party_id) - PartyWithColour.objects.get_or_create( - party=party, defaults={"hex_value": party_info["hex"]} - ) - except: - pass - - -class Migration(migrations.Migration): - initial = True - - dependencies = [("uk_results", "0016_auto_20160429_0938")] - - operations = [migrations.RunPython(add_party_colours)] diff --git a/ynr/apps/uk_results/migrations/0018_electionarea_noc.py b/ynr/apps/uk_results/migrations/0018_electionarea_noc.py deleted file mode 100644 index 7d410f9ee2..0000000000 --- a/ynr/apps/uk_results/migrations/0018_electionarea_noc.py +++ /dev/null @@ -1,14 +0,0 @@ -from django.db import migrations, models - - -class Migration(migrations.Migration): - - dependencies = [("uk_results", "0017_auto_20160429_0938")] - - operations = [ - migrations.AddField( - model_name="electionarea", - name="noc", - field=models.BooleanField(default=False), - ) - ] diff --git a/ynr/apps/uk_results/migrations/0019_councilelection_confirming_result_set.py b/ynr/apps/uk_results/migrations/0019_councilelection_confirming_result_set.py deleted file mode 100644 index 9591909c98..0000000000 --- a/ynr/apps/uk_results/migrations/0019_councilelection_confirming_result_set.py +++ /dev/null @@ -1,18 +0,0 @@ -from django.db import migrations, models - - -class Migration(migrations.Migration): - - dependencies = [("uk_results", "0018_electionarea_noc")] - - operations = [ - migrations.AddField( - model_name="councilelection", - name="confirming_result_set", - field=models.OneToOneField( - null=True, - to="uk_results.CouncilElectionResultSet", - on_delete=models.CASCADE, - ), - ) - ] diff --git a/ynr/apps/uk_results/migrations/0020_auto_20160503_1920.py b/ynr/apps/uk_results/migrations/0020_auto_20160503_1920.py deleted file mode 100644 index 4d05866274..0000000000 --- a/ynr/apps/uk_results/migrations/0020_auto_20160503_1920.py +++ /dev/null @@ -1,16 +0,0 @@ -from django.db import migrations - - -class Migration(migrations.Migration): - - dependencies = [ - ("uk_results", "0019_councilelection_confirming_result_set") - ] - - operations = [ - migrations.RenameField( - model_name="councilelection", - old_name="confirming_result_set", - new_name="controller", - ) - ] diff --git a/ynr/apps/uk_results/migrations/0021_auto_20160503_1923.py b/ynr/apps/uk_results/migrations/0021_auto_20160503_1923.py deleted file mode 100644 index c6a70795fb..0000000000 --- a/ynr/apps/uk_results/migrations/0021_auto_20160503_1923.py +++ /dev/null @@ -1,14 +0,0 @@ -from django.db import migrations - - -class Migration(migrations.Migration): - - dependencies = [("uk_results", "0020_auto_20160503_1920")] - - operations = [ - migrations.RenameField( - model_name="councilelection", - old_name="controller", - new_name="controller_resultset", - ) - ] diff --git a/ynr/apps/uk_results/migrations/0022_postresult_confirmed_resultset.py b/ynr/apps/uk_results/migrations/0022_postresult_confirmed_resultset.py deleted file mode 100644 index 1a22bf1453..0000000000 --- a/ynr/apps/uk_results/migrations/0022_postresult_confirmed_resultset.py +++ /dev/null @@ -1,16 +0,0 @@ -from django.db import migrations, models - - -class Migration(migrations.Migration): - - dependencies = [("uk_results", "0021_auto_20160503_1923")] - - operations = [ - migrations.AddField( - model_name="postresult", - name="confirmed_resultset", - field=models.OneToOneField( - null=True, to="uk_results.ResultSet", on_delete=models.CASCADE - ), - ) - ] diff --git a/ynr/apps/uk_results/migrations/0023_auto_20160505_1636.py b/ynr/apps/uk_results/migrations/0023_auto_20160505_1636.py deleted file mode 100644 index d44eef7f46..0000000000 --- a/ynr/apps/uk_results/migrations/0023_auto_20160505_1636.py +++ /dev/null @@ -1,13 +0,0 @@ -from django.db import migrations - - -class Migration(migrations.Migration): - - dependencies = [("uk_results", "0022_postresult_confirmed_resultset")] - - operations = [ - migrations.AlterModelOptions( - name="candidateresult", - options={"ordering": ("-num_ballots_reported",)}, - ) - ] diff --git a/ynr/apps/uk_results/migrations/0024_auto_20160505_2334.py b/ynr/apps/uk_results/migrations/0024_auto_20160505_2334.py deleted file mode 100644 index 3fb9eca500..0000000000 --- a/ynr/apps/uk_results/migrations/0024_auto_20160505_2334.py +++ /dev/null @@ -1,19 +0,0 @@ -from django.db import migrations, models - - -class Migration(migrations.Migration): - - dependencies = [("uk_results", "0023_auto_20160505_1636")] - - operations = [ - migrations.AlterField( - model_name="resultset", - name="num_spoilt_ballots", - field=models.IntegerField(null=True), - ), - migrations.AlterField( - model_name="resultset", - name="num_turnout_reported", - field=models.IntegerField(null=True), - ), - ] diff --git a/ynr/apps/uk_results/migrations/0025_minus-1-to-null-on-num-fields.py b/ynr/apps/uk_results/migrations/0025_minus-1-to-null-on-num-fields.py deleted file mode 100644 index d626c5a9ef..0000000000 --- a/ynr/apps/uk_results/migrations/0025_minus-1-to-null-on-num-fields.py +++ /dev/null @@ -1,18 +0,0 @@ -from django.db import migrations - - -def move_minus_one_to_null(apps, schema_editor): - ResultSet = apps.get_model("uk_results", "resultset") - ResultSet.objects.filter(num_turnout_reported=-1).update( - num_turnout_reported=None - ) - ResultSet.objects.filter(num_spoilt_ballots=-1).update( - num_spoilt_ballots=None - ) - - -class Migration(migrations.Migration): - - dependencies = [("uk_results", "0024_auto_20160505_2334")] - - operations = [migrations.RunPython(move_minus_one_to_null)] diff --git a/ynr/apps/uk_results/migrations/0026_auto_20170130_1541.py b/ynr/apps/uk_results/migrations/0026_auto_20170130_1541.py deleted file mode 100644 index 26783a3de3..0000000000 --- a/ynr/apps/uk_results/migrations/0026_auto_20170130_1541.py +++ /dev/null @@ -1,16 +0,0 @@ -from django.db import migrations - - -class Migration(migrations.Migration): - - dependencies = [("uk_results", "0025_minus-1-to-null-on-num-fields")] - - operations = [ - migrations.AlterModelOptions( - name="councilelectionresultset", - options={"get_latest_by": "modified"}, - ), - migrations.AlterModelOptions( - name="resultset", options={"get_latest_by": "modified"} - ), - ] diff --git a/ynr/apps/uk_results/migrations/0027_auto_20170502_2130.py b/ynr/apps/uk_results/migrations/0027_auto_20170502_2130.py deleted file mode 100644 index 13c7542a40..0000000000 --- a/ynr/apps/uk_results/migrations/0027_auto_20170502_2130.py +++ /dev/null @@ -1,16 +0,0 @@ -from django.db import migrations, models - - -class Migration(migrations.Migration): - - dependencies = [("uk_results", "0026_auto_20170130_1541")] - - operations = [ - migrations.AlterField( - model_name="councilelection", - name="council", - field=models.ForeignKey( - to="uk_results.Council", on_delete=models.CASCADE - ), - ) - ] diff --git a/ynr/apps/uk_results/migrations/0028_auto_20170503_1633.py b/ynr/apps/uk_results/migrations/0028_auto_20170503_1633.py deleted file mode 100644 index d5acb40318..0000000000 --- a/ynr/apps/uk_results/migrations/0028_auto_20170503_1633.py +++ /dev/null @@ -1,12 +0,0 @@ -from django.db import migrations - - -class Migration(migrations.Migration): - - dependencies = [("uk_results", "0027_auto_20170502_2130")] - - operations = [ - migrations.RenameField( - model_name="council", old_name="mapit_id", new_name="slug" - ) - ] diff --git a/ynr/apps/uk_results/migrations/0029_add_postresult_post_election.py b/ynr/apps/uk_results/migrations/0029_add_postresult_post_election.py deleted file mode 100644 index 63128c91b4..0000000000 --- a/ynr/apps/uk_results/migrations/0029_add_postresult_post_election.py +++ /dev/null @@ -1,22 +0,0 @@ -from django.db import migrations, models - - -class Migration(migrations.Migration): - - dependencies = [ - ("candidates", "0032_migrate_org_slugs"), - ("uk_results", "0028_auto_20170503_1633"), - ] - - operations = [ - migrations.AddField( - model_name="postresult", - name="post_election", - field=models.ForeignKey( - null=True, - to="candidates.PostExtraElection", - on_delete=models.CASCADE, - ), - preserve_default=False, - ) - ] diff --git a/ynr/apps/uk_results/migrations/0030_populate_postresult_post_election.py b/ynr/apps/uk_results/migrations/0030_populate_postresult_post_election.py deleted file mode 100644 index 2b220e2cfe..0000000000 --- a/ynr/apps/uk_results/migrations/0030_populate_postresult_post_election.py +++ /dev/null @@ -1,78 +0,0 @@ -from collections import defaultdict - -from django.db import migrations - - -def set_post_election_from_post(apps, schema_editor): - """ - This is far from ideal. Try to guess the PostExtraElection - that this PostResult relates to. This will have to be done by looking - and the related memberships and assuming they're correct (sometimes they - won't be, and that will have to be fixed manually later). - """ - PostResult = apps.get_model("uk_results", "PostResult") - PostExtraElection = apps.get_model("candidates", "PostExtraElection") - - qs = PostResult.objects.all().select_related("post__extra") - for post_result in qs: - pee = None - elections = post_result.post.extra.elections.all() - if not elections.exists(): - raise ValueError("Post with no elections found.") - if elections.count() == 1: - # This is an easy case – this post only has one known election - pee = PostExtraElection.objects.get( - election=elections.first(), postextra=post_result.post.extra - ) - post_result.post_election = pee - post_result.save() - - else: - if not post_result.result_sets.exists(): - # There are no results sets for this post_result - # so we can just delete it - post_result.delete() - continue - - result_sets_by_election = defaultdict(list) - # Work out how many elections we have results for. - # If it's only 1, then use that one - for result_set in post_result.result_sets.all(): - for candidate_result in result_set.candidate_results.all(): - this_election = candidate_result.membership.extra.election - result_sets_by_election[this_election].append(result_set) - - if len(set(result_sets_by_election.keys())) == 1: - election = result_sets_by_election.keys()[0] - pee = PostExtraElection.objects.get( - election=election, postextra=post_result.post.extra - ) - post_result.post_election = pee - post_result.save() - - else: - # We have results for more than one election, but only - # a single PostResult object. - # Split the result_sets up in to a new PostResult per election - for election, result_sets in result_sets_by_election.items(): - result_sets = set(result_sets) - pee = PostExtraElection.objects.get( - election=election, postextra=post_result.post.extra - ) - pr = PostResult.objects.create( - post_election=pee, - post=post_result.post, - confirmed=post_result.confirmed, - confirmed_resultset=post_result.confirmed_resultset, - ) - for result_set in result_sets: - result_set.post_result = pr - result_set.save() - post_result.delete() - - -class Migration(migrations.Migration): - - dependencies = [("uk_results", "0029_add_postresult_post_election")] - - operations = [migrations.RunPython(set_post_election_from_post)] diff --git a/ynr/apps/uk_results/migrations/0031_remove_postresult_post.py b/ynr/apps/uk_results/migrations/0031_remove_postresult_post.py deleted file mode 100644 index 6e636df345..0000000000 --- a/ynr/apps/uk_results/migrations/0031_remove_postresult_post.py +++ /dev/null @@ -1,19 +0,0 @@ -from django.db import migrations, models - - -class Migration(migrations.Migration): - - dependencies = [("uk_results", "0030_populate_postresult_post_election")] - - operations = [ - migrations.RemoveField(model_name="postresult", name="post"), - migrations.AlterField( - model_name="postresult", - name="post_election", - field=models.ForeignKey( - to="candidates.PostExtraElection", - null=False, - on_delete=models.CASCADE, - ), - ), - ] diff --git a/ynr/apps/uk_results/migrations/0032_rename_postresult_to_postelectionresult.py b/ynr/apps/uk_results/migrations/0032_rename_postresult_to_postelectionresult.py deleted file mode 100644 index d173fe9f3e..0000000000 --- a/ynr/apps/uk_results/migrations/0032_rename_postresult_to_postelectionresult.py +++ /dev/null @@ -1,8 +0,0 @@ -from django.db import migrations - - -class Migration(migrations.Migration): - - dependencies = [("uk_results", "0031_remove_postresult_post")] - - operations = [migrations.RenameModel("PostResult", "PostElectionResult")] diff --git a/ynr/apps/uk_results/migrations/0033_auto_20170506_2042.py b/ynr/apps/uk_results/migrations/0033_auto_20170506_2042.py deleted file mode 100644 index aaef38a48f..0000000000 --- a/ynr/apps/uk_results/migrations/0033_auto_20170506_2042.py +++ /dev/null @@ -1,16 +0,0 @@ -from django.db import migrations - - -class Migration(migrations.Migration): - - dependencies = [ - ("uk_results", "0032_rename_postresult_to_postelectionresult") - ] - - operations = [ - migrations.RenameField( - model_name="resultset", - old_name="post_result", - new_name="post_election_result", - ) - ] diff --git a/ynr/apps/uk_results/migrations/0034_auto_20180130_1243.py b/ynr/apps/uk_results/migrations/0034_auto_20180130_1243.py deleted file mode 100644 index 57d6f4d4ca..0000000000 --- a/ynr/apps/uk_results/migrations/0034_auto_20180130_1243.py +++ /dev/null @@ -1,49 +0,0 @@ -# Generated by Django 1.9.13 on 2018-01-30 12:43 - - -from django.db import migrations, models - - -class Migration(migrations.Migration): - - dependencies = [("uk_results", "0033_auto_20170506_2042")] - - operations = [ - migrations.AlterModelOptions( - name="postelectionresult", - options={"get_latest_by": "confirmed_resultset__created"}, - ), - migrations.AlterField( - model_name="councilelectionresultset", - name="review_status", - field=models.CharField( - blank=True, - choices=[ - (None, b"Unreviewed"), - (b"unconfirmed", b"Unconfirmed"), - (b"confirmed", b"Confirmed"), - (b"rejected", b"Rejected"), - ], - max_length=100, - ), - ), - migrations.AlterField( - model_name="postelectionresult", - name="confirmed", - field=models.BooleanField(default=True), - ), - migrations.AlterField( - model_name="resultset", - name="review_status", - field=models.CharField( - blank=True, - choices=[ - (None, b"Unreviewed"), - (b"unconfirmed", b"Unconfirmed"), - (b"confirmed", b"Confirmed"), - (b"rejected", b"Rejected"), - ], - max_length=100, - ), - ), - ] diff --git a/ynr/apps/uk_results/migrations/0035_auto_20180406_1555.py b/ynr/apps/uk_results/migrations/0035_auto_20180406_1555.py deleted file mode 100644 index f2d93d6473..0000000000 --- a/ynr/apps/uk_results/migrations/0035_auto_20180406_1555.py +++ /dev/null @@ -1,40 +0,0 @@ -# Generated by Django 1.9.13 on 2018-04-06 14:55 - - -from django.db import migrations, models - - -class Migration(migrations.Migration): - - dependencies = [("uk_results", "0034_auto_20180130_1243")] - - operations = [ - migrations.AlterField( - model_name="councilelectionresultset", - name="review_status", - field=models.CharField( - blank=True, - choices=[ - (None, "Unreviewed"), - ("unconfirmed", "Unconfirmed"), - ("confirmed", "Confirmed"), - ("rejected", "Rejected"), - ], - max_length=100, - ), - ), - migrations.AlterField( - model_name="resultset", - name="review_status", - field=models.CharField( - blank=True, - choices=[ - (None, "Unreviewed"), - ("unconfirmed", "Unconfirmed"), - ("confirmed", "Confirmed"), - ("rejected", "Rejected"), - ], - max_length=100, - ), - ), - ] diff --git a/ynr/apps/uk_results/migrations/0036_auto_20180424_1926.py b/ynr/apps/uk_results/migrations/0036_auto_20180424_1926.py deleted file mode 100644 index d71ec0d691..0000000000 --- a/ynr/apps/uk_results/migrations/0036_auto_20180424_1926.py +++ /dev/null @@ -1,36 +0,0 @@ -# Generated by Django 1.9.13 on 2018-04-24 18:26 - - -from django.db import migrations - - -class Migration(migrations.Migration): - - dependencies = [("uk_results", "0035_auto_20180406_1555")] - - operations = [ - migrations.RemoveField( - model_name="councilelection", name="controller_resultset" - ), - migrations.RemoveField(model_name="councilelection", name="council"), - migrations.RemoveField(model_name="councilelection", name="election"), - migrations.RemoveField(model_name="councilelection", name="party_set"), - migrations.RemoveField( - model_name="councilelectionresultset", name="controller" - ), - migrations.RemoveField( - model_name="councilelectionresultset", name="council_election" - ), - migrations.RemoveField( - model_name="councilelectionresultset", name="reviewed_by" - ), - migrations.RemoveField(model_name="electionarea", name="election"), - migrations.RemoveField(model_name="electionarea", name="parent"), - migrations.RemoveField(model_name="electionarea", name="winning_party"), - migrations.RemoveField(model_name="partywithcolour", name="party"), - migrations.DeleteModel(name="Council"), - migrations.DeleteModel(name="CouncilElection"), - migrations.DeleteModel(name="CouncilElectionResultSet"), - migrations.DeleteModel(name="ElectionArea"), - migrations.DeleteModel(name="PartyWithColour"), - ] diff --git a/ynr/apps/uk_results/migrations/0037_delete_rejected_data.py b/ynr/apps/uk_results/migrations/0037_delete_rejected_data.py deleted file mode 100644 index 163fd9cd8a..0000000000 --- a/ynr/apps/uk_results/migrations/0037_delete_rejected_data.py +++ /dev/null @@ -1,18 +0,0 @@ -# Generated by Django 1.9.13 on 2018-04-24 18:44 - - -from django.db import migrations - - -def delete_rejected_results(apps, schema_editor): - ResultSet = apps.get_model("uk_results", "ResultSet") - ResultSet.objects.filter(review_status="rejected").delete() - - -class Migration(migrations.Migration): - - dependencies = [("uk_results", "0036_auto_20180424_1926")] - - operations = [ - migrations.RunPython(delete_rejected_results, migrations.RunPython.noop) - ] diff --git a/ynr/apps/uk_results/migrations/0038_auto_20180424_1949.py b/ynr/apps/uk_results/migrations/0038_auto_20180424_1949.py deleted file mode 100644 index ff0131f1a2..0000000000 --- a/ynr/apps/uk_results/migrations/0038_auto_20180424_1949.py +++ /dev/null @@ -1,14 +0,0 @@ -# Generated by Django 1.9.13 on 2018-04-24 18:49 - - -from django.db import migrations - - -class Migration(migrations.Migration): - - dependencies = [("uk_results", "0037_delete_rejected_data")] - - operations = [ - migrations.RemoveField(model_name="resultset", name="final_source"), - migrations.RemoveField(model_name="resultset", name="is_final"), - ] diff --git a/ynr/apps/uk_results/migrations/0039_resultset_post_election.py b/ynr/apps/uk_results/migrations/0039_resultset_post_election.py deleted file mode 100644 index 8386c56b02..0000000000 --- a/ynr/apps/uk_results/migrations/0039_resultset_post_election.py +++ /dev/null @@ -1,25 +0,0 @@ -# Generated by Django 1.9.13 on 2018-04-24 19:18 - - -import django.db.models.deletion -from django.db import migrations, models - - -class Migration(migrations.Migration): - - dependencies = [ - ("candidates", "0041_auto_20180323_1400"), - ("uk_results", "0038_auto_20180424_1949"), - ] - - operations = [ - migrations.AddField( - model_name="resultset", - name="post_election", - field=models.ForeignKey( - null=True, - on_delete=django.db.models.deletion.CASCADE, - to="candidates.PostExtraElection", - ), - ) - ] diff --git a/ynr/apps/uk_results/migrations/0040_add_pee_to_resultset.py b/ynr/apps/uk_results/migrations/0040_add_pee_to_resultset.py deleted file mode 100644 index ebf81318ef..0000000000 --- a/ynr/apps/uk_results/migrations/0040_add_pee_to_resultset.py +++ /dev/null @@ -1,43 +0,0 @@ -# Generated by Django 1.9.13 on 2018-04-24 19:21 - - -from django.db import migrations -from django.db.models import Count - - -def add_pee_values(apps, schema_editor): - ResultSet = apps.get_model("uk_results", "ResultSet") - for rs in ResultSet.objects.all(): - rs.post_election = rs.post_election_result.post_election - rs.save() - - -def remove_duplicate_resultsets(apps, schema_editor): - ResultSet = apps.get_model("uk_results", "ResultSet") - duplicates = ( - ResultSet.objects.values("post_election") - .order_by("post_election") - .annotate(Count("post_election")) - .filter(post_election__count__gt=1) - .values_list("post_election", flat=True) - ) - for pee_id in duplicates: - resultsets = ResultSet.objects.filter(post_election_id=pee_id).order_by( - "-created" - ) - keep = resultsets[0] - for rs in resultsets[1:]: - assert rs.created < keep.created - rs.delete() - - -class Migration(migrations.Migration): - - dependencies = [("uk_results", "0039_resultset_post_election")] - - operations = [ - migrations.RunPython(add_pee_values, migrations.RunPython.noop), - migrations.RunPython( - remove_duplicate_resultsets, migrations.RunPython.noop - ), - ] diff --git a/ynr/apps/uk_results/migrations/0041_auto_20180424_2049.py b/ynr/apps/uk_results/migrations/0041_auto_20180424_2049.py deleted file mode 100644 index d8018fe6e4..0000000000 --- a/ynr/apps/uk_results/migrations/0041_auto_20180424_2049.py +++ /dev/null @@ -1,32 +0,0 @@ -# Generated by Django 1.9.13 on 2018-04-24 19:49 - - -import django.db.models.deletion -from django.db import migrations, models - - -class Migration(migrations.Migration): - - dependencies = [("uk_results", "0040_add_pee_to_resultset")] - - operations = [ - migrations.RemoveField( - model_name="postelectionresult", name="confirmed_resultset" - ), - migrations.RemoveField( - model_name="postelectionresult", name="post_election" - ), - migrations.RemoveField( - model_name="resultset", name="post_election_result" - ), - migrations.RemoveField(model_name="resultset", name="review_status"), - migrations.AlterField( - model_name="resultset", - name="post_election", - field=models.ForeignKey( - on_delete=django.db.models.deletion.CASCADE, - to="candidates.PostExtraElection", - ), - ), - migrations.DeleteModel(name="PostElectionResult"), - ] diff --git a/ynr/apps/uk_results/migrations/0042_auto_20180424_2053.py b/ynr/apps/uk_results/migrations/0042_auto_20180424_2053.py deleted file mode 100644 index c91c6ca5b7..0000000000 --- a/ynr/apps/uk_results/migrations/0042_auto_20180424_2053.py +++ /dev/null @@ -1,22 +0,0 @@ -# Generated by Django 1.9.13 on 2018-04-24 19:53 - - -from django.db import migrations - - -class Migration(migrations.Migration): - - dependencies = [("uk_results", "0041_auto_20180424_2049")] - - operations = [ - migrations.AlterModelOptions( - name="resultset", - options={ - "get_latest_by": "modified", - "ordering": ("-modified", "-created"), - }, - ), - migrations.RemoveField(model_name="candidateresult", name="source"), - migrations.RemoveField(model_name="resultset", name="review_source"), - migrations.RemoveField(model_name="resultset", name="reviewed_by"), - ] diff --git a/ynr/apps/uk_results/migrations/0043_auto_20180424_2148.py b/ynr/apps/uk_results/migrations/0043_auto_20180424_2148.py deleted file mode 100644 index 5f6fc13614..0000000000 --- a/ynr/apps/uk_results/migrations/0043_auto_20180424_2148.py +++ /dev/null @@ -1,21 +0,0 @@ -# Generated by Django 1.9.13 on 2018-04-24 20:48 - - -import django.db.models.deletion -from django.db import migrations, models - - -class Migration(migrations.Migration): - - dependencies = [("uk_results", "0042_auto_20180424_2053")] - - operations = [ - migrations.AlterField( - model_name="resultset", - name="post_election", - field=models.OneToOneField( - on_delete=django.db.models.deletion.CASCADE, - to="candidates.PostExtraElection", - ), - ) - ] diff --git a/ynr/apps/uk_results/migrations/0044_auto_20180424_2149.py b/ynr/apps/uk_results/migrations/0044_auto_20180424_2149.py deleted file mode 100644 index f512eada1e..0000000000 --- a/ynr/apps/uk_results/migrations/0044_auto_20180424_2149.py +++ /dev/null @@ -1,20 +0,0 @@ -# Generated by Django 1.9.13 on 2018-04-24 20:49 - - -from django.db import migrations - - -class Migration(migrations.Migration): - - dependencies = [("uk_results", "0043_auto_20180424_2148")] - - operations = [ - migrations.AlterModelOptions( - name="candidateresult", options={"ordering": ("-num_ballots",)} - ), - migrations.RenameField( - model_name="candidateresult", - old_name="num_ballots_reported", - new_name="num_ballots", - ), - ] diff --git a/ynr/apps/uk_results/migrations/0045_auto_20180424_2150.py b/ynr/apps/uk_results/migrations/0045_auto_20180424_2150.py deleted file mode 100644 index caa8d7cb37..0000000000 --- a/ynr/apps/uk_results/migrations/0045_auto_20180424_2150.py +++ /dev/null @@ -1,17 +0,0 @@ -# Generated by Django 1.9.13 on 2018-04-24 20:50 - - -from django.db import migrations, models - - -class Migration(migrations.Migration): - - dependencies = [("uk_results", "0044_auto_20180424_2149")] - - operations = [ - migrations.AlterField( - model_name="resultset", - name="ip_address", - field=models.GenericIPAddressField(null=True), - ) - ] diff --git a/ynr/apps/uk_results/migrations/0046_auto_20180501_1052.py b/ynr/apps/uk_results/migrations/0046_auto_20180501_1052.py deleted file mode 100644 index 0b31d4913c..0000000000 --- a/ynr/apps/uk_results/migrations/0046_auto_20180501_1052.py +++ /dev/null @@ -1,30 +0,0 @@ -# Generated by Django 1.9.13 on 2018-05-01 09:52 - - -import django.contrib.postgres.fields.jsonb -from django.db import migrations, models - - -class Migration(migrations.Migration): - - dependencies = [("uk_results", "0045_auto_20180424_2150")] - - operations = [ - migrations.AddField( - model_name="resultset", - name="versions", - field=django.contrib.postgres.fields.jsonb.JSONField(default=list), - ), - migrations.AlterField( - model_name="resultset", - name="num_spoilt_ballots", - field=models.IntegerField(null=True, verbose_name="Spoilt Ballots"), - ), - migrations.AlterField( - model_name="resultset", - name="num_turnout_reported", - field=models.IntegerField( - null=True, verbose_name="Reported Turnout" - ), - ), - ] diff --git a/ynr/apps/uk_results/migrations/0047_auto_20180501_1359.py b/ynr/apps/uk_results/migrations/0047_auto_20180501_1359.py deleted file mode 100644 index 665c560e33..0000000000 --- a/ynr/apps/uk_results/migrations/0047_auto_20180501_1359.py +++ /dev/null @@ -1,22 +0,0 @@ -# Generated by Django 1.9.13 on 2018-05-01 12:59 - - -import django.db.models.deletion -from django.db import migrations, models - - -class Migration(migrations.Migration): - - dependencies = [("uk_results", "0046_auto_20180501_1052")] - - operations = [ - migrations.AlterField( - model_name="candidateresult", - name="membership", - field=models.OneToOneField( - on_delete=django.db.models.deletion.CASCADE, - related_name="result", - to="popolo.Membership", - ), - ) - ] diff --git a/ynr/apps/uk_results/migrations/0048_rename_post_election_fk_to_ballot.py b/ynr/apps/uk_results/migrations/0048_rename_post_election_fk_to_ballot.py deleted file mode 100644 index 23eb1ce66d..0000000000 --- a/ynr/apps/uk_results/migrations/0048_rename_post_election_fk_to_ballot.py +++ /dev/null @@ -1,16 +0,0 @@ -# -*- coding: utf-8 -*- -# Generated by Django 1.11.20 on 2019-07-16 12:53 -from __future__ import unicode_literals - -from django.db import migrations - - -class Migration(migrations.Migration): - - dependencies = [("uk_results", "0047_auto_20180501_1359")] - - operations = [ - migrations.RenameField( - model_name="resultset", old_name="post_election", new_name="ballot" - ) - ] diff --git a/ynr/apps/uk_results/migrations/0049_positive_int_field.py b/ynr/apps/uk_results/migrations/0049_positive_int_field.py deleted file mode 100644 index 5b03fab4df..0000000000 --- a/ynr/apps/uk_results/migrations/0049_positive_int_field.py +++ /dev/null @@ -1,30 +0,0 @@ -# Generated by Django 2.2.4 on 2019-10-29 17:04 - -from django.db import migrations, models - - -class Migration(migrations.Migration): - - dependencies = [("uk_results", "0048_rename_post_election_fk_to_ballot")] - - operations = [ - migrations.AlterField( - model_name="candidateresult", - name="num_ballots", - field=models.PositiveIntegerField(), - ), - migrations.AlterField( - model_name="resultset", - name="num_spoilt_ballots", - field=models.PositiveIntegerField( - null=True, verbose_name="Spoilt Ballots" - ), - ), - migrations.AlterField( - model_name="resultset", - name="num_turnout_reported", - field=models.PositiveIntegerField( - null=True, verbose_name="Reported Turnout" - ), - ), - ] diff --git a/ynr/apps/uk_results/migrations/0050_candidateresult_tied_vote_winner.py b/ynr/apps/uk_results/migrations/0050_candidateresult_tied_vote_winner.py deleted file mode 100644 index af1f286cb7..0000000000 --- a/ynr/apps/uk_results/migrations/0050_candidateresult_tied_vote_winner.py +++ /dev/null @@ -1,19 +0,0 @@ -# Generated by Django 2.2.18 on 2021-04-29 10:24 - -from django.db import migrations, models - - -class Migration(migrations.Migration): - - dependencies = [("uk_results", "0049_positive_int_field")] - - operations = [ - migrations.AddField( - model_name="candidateresult", - name="tied_vote_winner", - field=models.BooleanField( - default=False, - help_text="Did this person win after receiving same votes as another candidate, via coin toss, lots etc", - ), - ) - ] diff --git a/ynr/apps/uk_results/migrations/0051_resultset_total_electorate.py b/ynr/apps/uk_results/migrations/0051_resultset_total_electorate.py deleted file mode 100644 index 7d4fca9c0f..0000000000 --- a/ynr/apps/uk_results/migrations/0051_resultset_total_electorate.py +++ /dev/null @@ -1,16 +0,0 @@ -# Generated by Django 2.2.18 on 2021-04-30 10:14 - -from django.db import migrations, models - - -class Migration(migrations.Migration): - - dependencies = [("uk_results", "0050_candidateresult_tied_vote_winner")] - - operations = [ - migrations.AddField( - model_name="resultset", - name="total_electorate", - field=models.PositiveIntegerField(blank=True, null=True), - ) - ] diff --git a/ynr/apps/uk_results/migrations/0052_add_turnout_percentage.py b/ynr/apps/uk_results/migrations/0052_add_turnout_percentage.py deleted file mode 100644 index 14338a431d..0000000000 --- a/ynr/apps/uk_results/migrations/0052_add_turnout_percentage.py +++ /dev/null @@ -1,31 +0,0 @@ -# Generated by Django 2.2.18 on 2021-05-06 10:50 - -import django.core.validators -from django.db import migrations, models - - -class Migration(migrations.Migration): - - dependencies = [("uk_results", "0051_resultset_total_electorate")] - - operations = [ - migrations.AddField( - model_name="resultset", - name="turnout_percentage", - field=models.FloatField( - blank=True, - null=True, - validators=[ - django.core.validators.MinValueValidator(0), - django.core.validators.MaxValueValidator(100), - ], - ), - ), - migrations.AlterField( - model_name="resultset", - name="total_electorate", - field=models.PositiveIntegerField( - blank=True, null=True, verbose_name="Total Electorate" - ), - ), - ] diff --git a/ynr/apps/uk_results/migrations/0053_auto_20210928_1007.py b/ynr/apps/uk_results/migrations/0053_auto_20210928_1007.py deleted file mode 100644 index c2f1f92568..0000000000 --- a/ynr/apps/uk_results/migrations/0053_auto_20210928_1007.py +++ /dev/null @@ -1,19 +0,0 @@ -# Generated by Django 3.2.4 on 2021-09-28 09:07 - -from django.db import migrations, models - - -class Migration(migrations.Migration): - - dependencies = [("uk_results", "0052_add_turnout_percentage")] - - operations = [ - migrations.AlterModelOptions( - name="resultset", options={"get_latest_by": "modified"} - ), - migrations.AlterField( - model_name="resultset", - name="versions", - field=models.JSONField(default=list), - ), - ] diff --git a/ynr/apps/uk_results/migrations/0054_update_is_winner_to_elected.py b/ynr/apps/uk_results/migrations/0054_update_is_winner_to_elected.py deleted file mode 100644 index 07a049b6bc..0000000000 --- a/ynr/apps/uk_results/migrations/0054_update_is_winner_to_elected.py +++ /dev/null @@ -1,37 +0,0 @@ -# Generated by Django 2.2.18 on 2021-05-13 11:27 - -from django.db import migrations - - -def update_versions(versions, current_key, new_key): - for version in versions: - for result in version["candidate_results"]: - try: - result[new_key] = result.pop(current_key) - except KeyError: - continue - - -def forwards(apps, schema_editor): - ResultSet = apps.get_model("uk_results", "ResultSet") - for result in ResultSet.objects.all().iterator(): - update_versions( - versions=result.versions, current_key="is_winner", new_key="elected" - ) - result.save() - - -def backwards(apps, schema_editor): - ResultSet = apps.get_model("uk_results", "ResultSet") - for result in ResultSet.objects.iterator(): - update_versions( - versions=result.versions, current_key="elected", new_key="is_winner" - ) - result.save() - - -class Migration(migrations.Migration): - - dependencies = [("uk_results", "0053_auto_20210928_1007")] - - operations = [migrations.RunPython(code=forwards, reverse_code=backwards)] diff --git a/ynr/apps/uk_results/migrations/0055_migrate_is_winner_to_elected.py b/ynr/apps/uk_results/migrations/0055_migrate_is_winner_to_elected.py deleted file mode 100644 index f049b2f428..0000000000 --- a/ynr/apps/uk_results/migrations/0055_migrate_is_winner_to_elected.py +++ /dev/null @@ -1,40 +0,0 @@ -# Generated by Django 2.2.18 on 2021-05-13 15:33 - -from django.db import migrations - - -def forwards(apps, schema_editor): - """ - Ensures that for every candidate result we have we store the definitive True - or False value for if they were elected against the related candidacy before - we throw this data away in next migration to remove the is_winner field - """ - Membership = apps.get_model("popolo", "Membership") - # get memberships where we have a result but elected isnt set - memberships = Membership.objects.filter(result__isnull=False, elected=None) - # seperate winners and losers - winners = memberships.filter(result__is_winner=True) - losers = memberships.filter(result__is_winner=False) - # update accordingly - winners.update(elected=True) - losers.update(elected=False) - # using update avoids the modified timestamp being updated - - -def backwards(apps, schema_editor): - """ - Applies the reverse of the above - takes the elected value, and stores it - against the result object - """ - CandidateResult = apps.get_model("uk_results", "CandidateResult") - winners = CandidateResult.objects.filter(membership__elected=True) - losers = CandidateResult.objects.filter(membership__elected=False) - winners.update(is_winner=True) - losers.update(is_winner=False) - - -class Migration(migrations.Migration): - - dependencies = [("uk_results", "0054_update_is_winner_to_elected")] - - operations = [migrations.RunPython(code=forwards, reverse_code=backwards)] diff --git a/ynr/apps/uk_results/migrations/0056_remove_candidateresult_is_winner.py b/ynr/apps/uk_results/migrations/0056_remove_candidateresult_is_winner.py deleted file mode 100644 index 20c97b4363..0000000000 --- a/ynr/apps/uk_results/migrations/0056_remove_candidateresult_is_winner.py +++ /dev/null @@ -1,12 +0,0 @@ -# Generated by Django 2.2.18 on 2021-05-13 15:41 - -from django.db import migrations - - -class Migration(migrations.Migration): - - dependencies = [("uk_results", "0055_migrate_is_winner_to_elected")] - - operations = [ - migrations.RemoveField(model_name="candidateresult", name="is_winner") - ] diff --git a/ynr/apps/wombles/migrations/0001_initial.py b/ynr/apps/wombles/migrations/0001_initial.py index 6836cf4749..778029768a 100644 --- a/ynr/apps/wombles/migrations/0001_initial.py +++ b/ynr/apps/wombles/migrations/0001_initial.py @@ -1,10 +1,8 @@ -# -*- coding: utf-8 -*- -# Generated by Django 1.11.20 on 2019-02-26 21:12 -from __future__ import unicode_literals +# Generated by Django 3.2.10 on 2021-12-14 17:21 -import django.db.models.deletion from django.conf import settings from django.db import migrations, models +import django.db.models.deletion class Migration(migrations.Migration): @@ -15,7 +13,7 @@ class Migration(migrations.Migration): operations = [ migrations.CreateModel( - name="WombleProfile", + name="WombleTags", fields=[ ( "id", @@ -25,11 +23,13 @@ class Migration(migrations.Migration): serialize=False, verbose_name="ID", ), - ) + ), + ("label", models.CharField(max_length=255)), ], + options={"ordering": ("label",)}, ), migrations.CreateModel( - name="WombleTags", + name="WombleProfile", fields=[ ( "id", @@ -40,21 +40,15 @@ class Migration(migrations.Migration): verbose_name="ID", ), ), - ("label", models.CharField(max_length=255)), + ("tags", models.ManyToManyField(to="wombles.WombleTags")), + ( + "user", + models.OneToOneField( + on_delete=django.db.models.deletion.CASCADE, + related_name="womble_profile", + to=settings.AUTH_USER_MODEL, + ), + ), ], ), - migrations.AddField( - model_name="wombleprofile", - name="tags", - field=models.ManyToManyField(to="wombles.WombleTags"), - ), - migrations.AddField( - model_name="wombleprofile", - name="user", - field=models.OneToOneField( - on_delete=django.db.models.deletion.CASCADE, - related_name="womble_profile", - to=settings.AUTH_USER_MODEL, - ), - ), ] diff --git a/ynr/apps/wombles/migrations/0002_add_initial_profiles.py b/ynr/apps/wombles/migrations/0002_add_initial_profiles.py deleted file mode 100644 index e4aeb41ba6..0000000000 --- a/ynr/apps/wombles/migrations/0002_add_initial_profiles.py +++ /dev/null @@ -1,24 +0,0 @@ -# -*- coding: utf-8 -*- -# Generated by Django 1.11.20 on 2019-02-26 21:15 -from __future__ import unicode_literals - -from django.db import migrations - - -def add_initial_profiles(apps, schema_editor): - User = apps.get_model("auth", "User") - WombleProfile = apps.get_model("wombles", "WombleProfile") - for user in User.objects.all(): - try: - WombleProfile.objects.create(user=user) - except: - pass - - -class Migration(migrations.Migration): - - dependencies = [("wombles", "0001_initial")] - - operations = [ - migrations.RunPython(add_initial_profiles, migrations.RunPython.noop) - ] diff --git a/ynr/apps/wombles/migrations/0003_auto_20210401_0811.py b/ynr/apps/wombles/migrations/0003_auto_20210401_0811.py deleted file mode 100644 index 9e20563b94..0000000000 --- a/ynr/apps/wombles/migrations/0003_auto_20210401_0811.py +++ /dev/null @@ -1,14 +0,0 @@ -# Generated by Django 2.2.16 on 2021-04-01 07:11 - -from django.db import migrations - - -class Migration(migrations.Migration): - - dependencies = [("wombles", "0002_add_initial_profiles")] - - operations = [ - migrations.AlterModelOptions( - name="wombletags", options={"ordering": ("label",)} - ) - ] diff --git a/ynr/apps/ynr_refactoring/migrations/0001_initial.py b/ynr/apps/ynr_refactoring/migrations/0001_initial.py index 690d56ff2e..b010c4537f 100644 --- a/ynr/apps/ynr_refactoring/migrations/0001_initial.py +++ b/ynr/apps/ynr_refactoring/migrations/0001_initial.py @@ -1,10 +1,8 @@ -# -*- coding: utf-8 -*- -# Generated by Django 1.11.16 on 2019-01-03 12:56 -from __future__ import unicode_literals +# Generated by Django 3.2.10 on 2021-12-14 17:21 +from django.db import migrations, models import django.utils.timezone import model_utils.fields -from django.db import migrations, models class Migration(migrations.Migration): diff --git a/ynr/apps/ynr_refactoring/migrations/0002_move_old_election_slugs.py b/ynr/apps/ynr_refactoring/migrations/0002_move_old_election_slugs.py deleted file mode 100644 index da59c278fb..0000000000 --- a/ynr/apps/ynr_refactoring/migrations/0002_move_old_election_slugs.py +++ /dev/null @@ -1,196 +0,0 @@ -# -*- coding: utf-8 -*- -# Generated by Django 1.11.16 on 2019-01-10 11:36 -from __future__ import unicode_literals - -import json - -from django.contrib.admin.utils import NestedObjects -from django.db import connection, migrations - -UPDATED_SLUGS = { - "2010": "parl.2010-05-06", - "2015": "parl.2015-05-07", - "gb-sp-2016-05-05-c": "sp.c.2016-05-05", - "gb-sp-2016-05-05-r": "sp.r.2016-05-05", - "gla-2016-05-05-a": "gla.a.2016-05-05", - "gla-2016-05-05-c": "gla.c.2016-05-05", - "local.barnet.underhill.2016-05-05": "local.barnet.2016-05-05", - "local.barrow.dalton-south.2016-05-05": "local.barrow-in-furness.2016-05-05", - "local.braintree.witham-south.2016-05-05": "local.braintree.2016-05-05", - "local.breckland.attleborough-queens-and-besthorpe.2016-05-05": "local.breckland.2016-05-05", - "local.brent.kilburn.2016-05-05": "local.brent.2016-05-05", - "local.cambridgeshire.st.-neots-eaton-scon-and-eynesbury.2016-05-05": "local.cambridgeshire.2016-05-05", - "local.canterbury.reculver.2016-05-05": "local.canterbury.2016-05-05", - "local.castle-point.st-georges.2016-05-05": "local.castle-point.2016-05-05", - "local.croydon.west-thornton.2016-05-05": "local.croydon.2016-05-05", - "local.doncaster.edenthorpe-and-kirk-sandall.2016-05-05": "local.doncaster.2016-05-05", - "local.east-hampshire.clanfield-and-finchdean.2016-05-05": "local.east-hampshire.2016-05-05", - "local.east-riding-of-yorkshire.east-wolds-and-coastal.2016-05-05": "local.east-riding-of-yorkshire.2016-05-05", - "local.east-sussex.st-helens-and-silverhill.2016-05-05": "local.east-sussex.2016-05-05", - "local.forest-heath.brandon-west.2016-05-05": "local.forest-heath.2016-05-05", - "local.forest-heath.south.2016-05-05": "local.forest-heath.2016-05-05", - "local.glasgow.anderston-city.2016-05-05": "local.glasgow.2016-05-05", - "local.gloucestershire.churchdown.2016-05-05": "local.gloucestershire.2016-05-05", - "local.greenwich.glyndon-ward.2016-05-05": "local.greenwich.2016-05-05", - "local.greenwich.glyndon.2016-05-05": "local.greenwich.2016-05-05", - "local.guildford.stoke.2016-05-05": "local.guildford.2016-05-05", - "local.hackney.hackney-downs.2016-05-05": "local.hackney.2016-05-05", - "local.hackney.stoke-newington.2016-05-05": "local.hackney.2016-05-05", - "local.hampshire.fareham-town.2016-05-05": "local.hampshire.2016-05-05", - "local.hampshire.headley.2016-05-05": "local.hampshire.2016-05-05", - "local.havering.heaton.2016-05-05": "local.havering.2016-05-05", - "local.kensington-and-chelsea.abingdon.2016-05-05": "local.kensington-and-chelsea.2016-05-05", - "local.lancashire.lancaster-east.2016-05-05": "local.lancashire.2016-05-05", - "local.lancaster.carnforth-and-millhead.2016-05-05": "local.lancaster.2016-05-05", - "local.lancaster.john-ogaunt.2016-05-05": "local.lancaster.2016-05-05", - "local.lincoln.2016-05-05": "local.city-of-lincoln.2016-05-05", - "local.melton.egerton.2016-05-05": "local.melton.2016-05-05", - "local.merton.figges-marsh.2016-05-05": "local.merton.2016-05-05", - "local.middlesbrough.coulby-newham.2016-05-05": "local.middlesbrough.2016-05-05", - "local.north-dorset.blandford-hilltop.2016-05-05": "local.north-dorset.2016-05-05", - "local.north-dorset.hill-forts.2016-05-05": "local.north-dorset.2016-05-05", - "local.redbridge.roding.2016-05-05": "local.redbridge.2016-05-05", - "local.romford.heaton.2016-05-05": "local.havering.2016-05-05", - "local.south-bucks.farnham-royal-and-hedgerley.2016-05-05": "local.south-bucks.2016-05-05", - "local.south-kestevan.deeping-st-james.2016-05-05": "local.south-kesteven.2016-05-05", - "local.south-ribble.seven-stars.2016-05-05": "local.south-ribble.2016-05-05", - "local.southwark.college.2016-05-05": "local.southwark.2016-05-05", - "local.southwark.newington.2016-05-05": "local.southwark.2016-05-05", - "local.spelthorne.ashford-north-and-stanwell-south.2016-05-05": "local.spelthorne.2016-05-05", - "local.st-edmundsbury.haverhill-north.2016-05-05": "local.st-edmundsbury.2016-05-05", - "local.staffordshire.uttoxeter-town.2016-05-05": "local.staffordshire.2016-05-05", - "local.suffolk.bixley.2016-05-05": "local.suffolk.2016-05-05", - "local.suffolk.haverhill-cangle.2016-05-05": "local.suffolk.2016-05-05", - "local.surrey.staines-south-and-ashford-west.2016-05-05": "local.surrey.2016-05-05", - "local.swansea.mynyddbach.2016-05-05": "local.swansea.2016-05-05", - "local.tendring.st-paul.2016-05-05": "local.tendring.2016-05-05", - "local.torbay.tormohun.2016-05-05": "local.torbay.2016-05-05", - "local.waveney.wrentham.2016-05-05": "local.waveney.2016-05-05", - "local.westminster.church-street.2016-05-05": "local.westminster.2016-05-05", - "local.wiltshire.amesbury-east.2016-05-05": "local.wiltshire.2016-05-05", - "mayor.greater-manchester.2017-05-04": "mayor.greater-manchester-ca.2017-05-04", - "mayor.liverpool.2017-05-04": "mayor.liverpool-city-ca.2017-05-04", - "naw-2016-05-05-c": "naw.c.2016-05-05", - "naw-2016-05-05-r": "naw.r.2016-05-05", - "nia-2016-05-05": "nia.2016-05-05", - "parl.bridgend.ogmore.2016-05-05": "parl.2016-05-05", - "parl.copeland.2017-02-23": "parl.2017-02-23", - "parl.sheffield.sheffield-brightside-and-hillsborough.2016-05-05": "parl.2016-05-05", - "parl.stoke-on-trent-central.2017-02-23": "parl.2017-02-23", - "sp-2016-05-05-c": "sp.c.2016-05-05", -} - - -def _merge_election(Election, old_list): - dest_slug = old_list.pop(0) - dest_model = None - while not dest_model and old_list: - try: - dest_model = Election.objects.get(slug=dest_slug) - except Election.DoesNotExist: - # This election doesn't exist, so it might just exist in - # the person versions. Because of this, it's safe to return - # here and leave the migration to rename the slug in the versions json - dest_slug = old_list.pop(0) - continue - for source_slug in old_list: - try: - source_model = Election.objects.get(slug=source_slug) - except Election.DoesNotExist: - # Same as above – if this election doesn't exist than there - # is nothing to merge - continue - - source_model.ballot_set.update(election=dest_model) - source_model.officialdocument_set.update(election=dest_model) - source_model.resultevent_set.update(election=dest_model) - - collector = NestedObjects(using=connection.cursor().db.alias) - collector.collect([source_model]) - if len(collector.nested()) > 1: - # A related object exist for this source election, - # something has gone wrong. - print(collector.nested()) - raise ValueError( - "Can't merge election {} with related objects".format( - source_slug - ) - ) - source_model.delete() - return dest_slug - - -def _update_versions(person, old, new): - versions = person.versions - for version in versions: - if version["data"].get("standing_in"): - if old in version["data"]["standing_in"]: - version["data"]["standing_in"][new] = version["data"][ - "standing_in" - ].pop(old) - if version["data"].get("party_memberships"): - if old in version["data"]["party_memberships"]: - version["data"]["party_memberships"][new] = version["data"][ - "party_memberships" - ].pop(old) - if "'{}'".format(old) in json.dumps(versions): - raise ValueError( - "'{}' found in versions for person {}".format(old, person.pk) - ) - person.versions = json.dumps(versions) - person.save() - - -def _move_election_slug(apps): - # Duplicate of `ynr_refactoring/views.py` because this migration is "static" - # and the view code might change one day. - Election = apps.get_model("elections", "Election") - Person = apps.get_model("people", "Person") - - # Group by destination ID so we can merge - elections_to_merge = {} - for old, new in UPDATED_SLUGS.items(): - if new in elections_to_merge: - elections_to_merge[new].append(old) - else: - elections_to_merge[new] = [old] - - for new, old_list in elections_to_merge.items(): - if len(old_list) > 1: - # We need to merge this election before moving the IDs - old = _merge_election(Election, old_list) - else: - old = old_list[0] - try: - election = Election.objects.get(slug=old) - except Election.DoesNotExist: - # Chances are this is a test run where we don't have these - # elections yet - continue - if Election.objects.filter(slug=new).exists(): - # The new election might already exist. In that case, merge and remove - # the old one - new_slug = _merge_election(Election, [new, old]) - election = Election.objects.get(slug=new_slug) - else: - election.slug = new - election.save() - - for old_slug in old_list: - for person in Person.objects.filter( - versions__contains='"{}"'.format(old_slug) - ): - _update_versions(person, old, new) - - -def update_election_slug(apps, schema_editor): - return _move_election_slug(apps) - - -class Migration(migrations.Migration): - - dependencies = [("ynr_refactoring", "0001_initial")] - - operations = [ - migrations.RunPython(update_election_slug, migrations.RunPython.noop) - ] diff --git a/ynr/apps/ynr_refactoring/migrations/0003_move_person_identifiers.py b/ynr/apps/ynr_refactoring/migrations/0003_move_person_identifiers.py deleted file mode 100644 index e21cadf506..0000000000 --- a/ynr/apps/ynr_refactoring/migrations/0003_move_person_identifiers.py +++ /dev/null @@ -1,36 +0,0 @@ -# -*- coding: utf-8 -*- -# Generated by Django 1.11.18 on 2019-01-19 18:25 -from __future__ import unicode_literals - -from django.db import migrations - - -def move_person_identifiers(apps, schema_editor): - ContentType = apps.get_model("contenttypes", "ContentType") - PersonIdentifier = apps.get_model("people", "PersonIdentifier") - Person = apps.get_model("people", "Person") - Identifier = apps.get_model("popolo", "Identifier") - - person_content_type_id = ContentType.objects.get_for_model(Person).pk - qs = Identifier.objects.filter( - content_type_id=person_content_type_id, scheme="uk.org.publicwhip" - ) - for identifier in qs: - public_whip_id = identifier.identifier.split("/")[-1] - PersonIdentifier.objects.update_or_create( - person_id=identifier.object_id, - value="https://www.theyworkforyou.com/mp/{}/".format( - public_whip_id - ), - value_type="theyworkforyou", - internal_identifier=identifier.identifier, - ) - - -class Migration(migrations.Migration): - - dependencies = [("ynr_refactoring", "0002_move_old_election_slugs")] - - operations = [ - migrations.RunPython(move_person_identifiers, migrations.RunPython.noop) - ]