From a0ec2eae2ed7aaba18ed6e1c6b04e80e2ada89f1 Mon Sep 17 00:00:00 2001 From: j-jzk Date: Tue, 25 May 2021 14:39:25 +0200 Subject: [PATCH 01/17] =?UTF-8?q?p=C5=99id=C3=A1na=20infrastruktura=20pro?= =?UTF-8?q?=20p=C5=99episov=C3=A1n=C3=AD=20udaj=C5=AF=20d=C3=A1rce?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - přidána tabulka donors_override - přidán formulář pro obsluhu tabulky Záznamy z tabulky donors_override se zatím neprojeví v donors_overview. --- .../60a681c463a2_create_donors_override.py | 33 +++++++++ registry/donor/forms.py | 72 ++++++++++++++++++- registry/donor/models.py | 11 +++ registry/donor/views.py | 41 ++++++++++- registry/templates/donor/detail.html | 31 ++++++++ 5 files changed, 186 insertions(+), 2 deletions(-) create mode 100644 migrations/versions/60a681c463a2_create_donors_override.py diff --git a/migrations/versions/60a681c463a2_create_donors_override.py b/migrations/versions/60a681c463a2_create_donors_override.py new file mode 100644 index 00000000..a7c7362e --- /dev/null +++ b/migrations/versions/60a681c463a2_create_donors_override.py @@ -0,0 +1,33 @@ +"""create_donors_override + +Revision ID: 60a681c463a2 +Revises: 6fe71f4f1aba +Create Date: 2021-05-25 12:50:58.779359 + +""" +import sqlalchemy as sa +from alembic import op + +# revision identifiers, used by Alembic. +revision = "60a681c463a2" +down_revision = "6fe71f4f1aba" +branch_labels = None +depends_on = None + + +def upgrade(): + op.create_table( + "donors_override", + sa.Column("rodne_cislo", sa.CHAR(length=10), nullable=False), + sa.Column("first_name", sa.String(), nullable=True), + sa.Column("last_name", sa.String(), nullable=True), + sa.Column("address", sa.String(), nullable=True), + sa.Column("city", sa.String(), nullable=True), + sa.Column("postal_code", sa.CHAR(length=5), nullable=True), + sa.Column("kod_pojistovny", sa.CHAR(length=3), nullable=True), + sa.PrimaryKeyConstraint("rodne_cislo"), + ) + + +def downgrade(): + op.drop_table("donors_override") diff --git a/registry/donor/forms.py b/registry/donor/forms.py index a70b6984..d886a9a0 100644 --- a/registry/donor/forms.py +++ b/registry/donor/forms.py @@ -2,7 +2,7 @@ from wtforms import BooleanField, HiddenField, StringField, TextAreaField from wtforms.validators import DataRequired -from registry.donor.models import AwardedMedals +from registry.donor.models import AwardedMedals, DonorsOverride class RemoveMedalForm(FlaskForm): @@ -46,3 +46,73 @@ class IgnoreDonorForm(FlaskForm): class RemoveFromIgnoredForm(FlaskForm): rodne_cislo = HiddenField(validators=[DataRequired()]) + + +class DonorsOverrideForm(FlaskForm): + rodne_cislo = StringField("Rodné číslo", validators=[DataRequired()]) + first_name = StringField("Jméno") + last_name = StringField("Příjmení") + address = StringField("Adresa") + city = StringField("Město") + postal_code = StringField("PSČ") + kod_pojistovny = StringField("Pojišťovna") + + _fields_ = [ + "rodne_cislo", + "first_name", + "last_name", + "address", + "city", + "postal_code", + "kod_pojistovny", + ] + + def validate(self): + initial_validation = super(DonorsOverrideForm, self).validate() + if not initial_validation: + return False + + valid = True + + if self.postal_code.data: + self.postal_code.data = self.postal_code.data.replace(" ", "") + if not self.postal_code.data.isdigit(): + self.postal_code.errors.append( + "PSČ může obsahovat pouze číslice a mezeru" + ) + valid = False + if len(self.postal_code.data) != 5: + self.postal_code.errors.append("PSČ musí mít 5 znaků kromě mezer") + valid = False + + if self.kod_pojistovny.data: + if not self.kod_pojistovny.data.isdigit(): + self.kod_pojistovny.errors.append("Kód pojišťovny musí být číslo") + valid = False + if len(self.kod_pojistovny.data) != 3: + self.kod_pojistovny.errors.append("Kód pojišťovny musí být třímístný") + valid = False + + self._get_field_data() + + return valid + + def init_fields(self, rodne_cislo): + override = DonorsOverride.query.get(rodne_cislo) + + if override is not None: + for field in self._fields_: + data = getattr(override, field) + if data is not None: + getattr(self, field).data = data + + self.rodne_cislo.data = rodne_cislo + + return self + + def _get_field_data(self): + self.field_data = {} + for field in self._fields_: + data = getattr(self, field).data + if data != "": + self.field_data[field] = data diff --git a/registry/donor/models.py b/registry/donor/models.py index 897aeee3..e6aba6e2 100644 --- a/registry/donor/models.py +++ b/registry/donor/models.py @@ -445,3 +445,14 @@ class Note(db.Model): __tablename__ = "notes" rodne_cislo = db.Column(db.String(10), primary_key=True) note = db.Column(db.Text) + + +class DonorsOverride(db.Model): + __tablename__ = "donors_override" + rodne_cislo = db.Column(db.String(10), primary_key=True) + first_name = db.Column(db.String) + last_name = db.Column(db.String) + address = db.Column(db.String) + city = db.Column(db.String) + postal_code = db.Column(db.String(5)) + kod_pojistovny = db.Column(db.String(3)) diff --git a/registry/donor/views.py b/registry/donor/views.py index 6b260eb1..e25c6fd7 100644 --- a/registry/donor/views.py +++ b/registry/donor/views.py @@ -15,15 +15,25 @@ from registry.extensions import db from registry.list.models import DonationCenter, Medals +from registry.utils import flash_errors from .forms import ( AwardMedalForm, + DonorsOverrideForm, IgnoreDonorForm, NoteForm, RemoveFromIgnoredForm, RemoveMedalForm, ) -from .models import AwardedMedals, DonorsOverview, IgnoredDonors, Note, Record +from .models import ( + AwardedMedals, + DonorsOverride, + DonorsOverview, + IgnoredDonors, + Note, + Record, +) + blueprint = Blueprint("donor", __name__, static_folder="../static") @@ -105,6 +115,8 @@ def detail(rc): note_form = NoteForm() if overview.note: note_form.note.data = overview.note.note + donors_override_form = DonorsOverrideForm().init_fields(rc) + return render_template( "donor/detail.html", overview=overview, @@ -115,6 +127,7 @@ def detail(rc): remove_medal_form=remove_medal_form, award_medal_form=award_medal_form, note_form=note_form, + donors_override_form=donors_override_form, ) @@ -263,3 +276,29 @@ def unignore_donor(): else: flash("Při odebírání ze seznamu ignorovaných dárců došlo k chybě", "danger") return redirect(url_for("donor.show_ignored")) + + +@blueprint.post("/override") +@login_required +def save_override(): + override_form = DonorsOverrideForm() + delete = True if "delete_btn" in request.form else False + + if override_form.validate_on_submit(): + if not delete: + override = DonorsOverride(**override_form.field_data) + db.session.add(override) + db.session.commit() + flash("Výjimka uložena", "success") + else: + override = DonorsOverride.query.get(override_form.rodne_cislo.data) + if override is not None: + db.session.delete(override) + db.session.commit() + flash("Výjimka smazána", "success") + else: + flash("Není co mazat", "warning") + else: + flash_errors(override_form) + + return redirect(url_for("donor.detail", rc=override_form.rodne_cislo.data)) diff --git a/registry/templates/donor/detail.html b/registry/templates/donor/detail.html index 6443bcff..178ae053 100644 --- a/registry/templates/donor/detail.html +++ b/registry/templates/donor/detail.html @@ -150,6 +150,37 @@

Poznámky

+

Přepsání údajů

+{% with form=donors_override_form %} +
+ {{ form.csrf_token }} + + + + + + + + + + + + + + + + + + + + + +
Rodné čísloJménoPříjmeníAdresaMěstoPSČPojišťovna
{{ form.rodne_cislo(readonly=True, size=8, class_="form-control") }}{{ form.first_name(size=8, class_="form-control") }}{{ form.last_name(size=8, class_="form-control") }}{{ form.address(size=10, class_="form-control") }}{{ form.city(size=8, class_="form-control") }}{{ form.postal_code(size=3, class_="form-control") }}{{ form.kod_pojistovny(size=3, class_="form-control") }} + + +
+
+{% endwith %}

Historie importů

From 6a2ed3c1f9c279f6d8c48ba754bba959eefff8be Mon Sep 17 00:00:00 2001 From: j-jzk Date: Wed, 26 May 2021 10:33:09 +0200 Subject: [PATCH 02/17] =?UTF-8?q?p=C5=99id=C3=A1no=20p=C5=99episov=C3=A1n?= =?UTF-8?q?=C3=AD=20tabulky=20donors=5Foverview?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Data z tabulky donors_overview se přepisují daty z tabulky donors_override. --- registry/donor/models.py | 108 +++++++++++++++++++++++++++++++++++++++ registry/donor/views.py | 4 ++ 2 files changed, 112 insertions(+) diff --git a/registry/donor/models.py b/registry/donor/models.py index e6aba6e2..6a2f4d94 100644 --- a/registry/donor/models.py +++ b/registry/donor/models.py @@ -1,3 +1,5 @@ +import sqlite3 + from registry.extensions import db from registry.list.models import DonationCenter, Medals @@ -186,6 +188,110 @@ def dict_for_frontend(self): donor_dict["donations"]["total"] = self.donation_count_total return donor_dict + def refresh_override(cls, commit=True): + if sqlite3.sqlite_version_info[0] >= 3 and sqlite3.sqlite_version_info[1] >= 33: + # The UPDATE - FROM syntax is supported from SQLite version 3.33.0 + db.session.execute( + """ +-- Rewrite rows in "donors_overview" that have a record in "donors_override" +-- with the corresponding values. +UPDATE "donors_overview" +SET + "first_name" = COALESCE( + "donors_override"."first_name", + "donors_overview"."first_name" + ), + "last_name" = COALESCE( + "donors_override"."last_name", + "donors_overview"."last_name" + ), + "address" = COALESCE( + "donors_override"."address", + "donors_overview"."address" + ), + "city" = COALESCE( + "donors_override"."city", + "donors_overview"."city" + ), + "postal_code" = COALESCE( + "donors_override"."postal_code", + "donors_overview"."postal_code" + ), + "kod_pojistovny" = COALESCE( + "donors_override"."kod_pojistovny", + "donors_overview"."kod_pojistovny" + ) +FROM "donors_override" +WHERE "donors_override"."rodne_cislo" = "donors_overview"."rodne_cislo"; + """ + ) + + # Note: because UPDATE - FROM is not a standard SQL construct, it is + # implemented differently in each database system. The SQLite query + # should be complatible with PostgreSQL, but for MySQL it would look + # something like this: + # UPDATE "donors_overview" + # INNER JOIN "donors_override" + # ON "donors_overview"."rodne_cislo" = + # "donors_override"."rodne_cislo" + # and there would be no FROM of WHERE clause. + + # TODO?: build this into the refresh_overview query, like this: + # INSERT INTO donors_overview (...) + # SELECT records.rodne_cislo, + # COALESCE(donors_override.first_name, + # records.first_name), + # ... + # FROM ... + # LEFT JOIN donors_override + # ON donors_override.rodne_cislo = records.rodne_cislo + else: + db.session.execute( + """ +UPDATE "donors_overview" +SET +"first_name" = COALESCE( + (SELECT "first_name" + FROM "donors_override" + WHERE "donors_override"."rodne_cislo" = "donors_overview"."rodne_cislo"), + "donors_overview"."first_name" +), +"last_name" = COALESCE( + (SELECT "last_name" + FROM "donors_override" + WHERE "donors_override"."rodne_cislo" = "donors_overview"."rodne_cislo"), + "donors_overview"."last_name" +), +"address" = COALESCE( + (SELECT "address" + FROM "donors_override" + WHERE "donors_override"."rodne_cislo" = "donors_overview"."rodne_cislo"), + "donors_overview"."address" +), +"city" = COALESCE( + (SELECT "city" + FROM "donors_override" + WHERE "donors_override"."rodne_cislo" = "donors_overview"."rodne_cislo"), + "donors_overview"."city" +), +"postal_code" = COALESCE( + (SELECT "postal_code" + FROM "donors_override" + WHERE "donors_override"."rodne_cislo" = "donors_overview"."rodne_cislo"), + "donors_overview"."postal_code" +), +"kod_pojistovny" = COALESCE( + (SELECT "kod_pojistovny" + FROM "donors_override" + WHERE "donors_override"."rodne_cislo" = "donors_overview"."rodne_cislo"), + "donors_overview"."kod_pojistovny" +); + """ + ) + + if commit: + db.session.commit() + @classmethod def refresh_overview(cls): cls.query.delete() @@ -437,7 +543,9 @@ def refresh_overview(cls): JOIN "records" ON "records"."id" = "recent_records"."record_id";""" ) + cls.remove_ignored() + cls.refresh_override(commit=False) db.session.commit() diff --git a/registry/donor/views.py b/registry/donor/views.py index e25c6fd7..3ebe084c 100644 --- a/registry/donor/views.py +++ b/registry/donor/views.py @@ -289,12 +289,16 @@ def save_override(): override = DonorsOverride(**override_form.field_data) db.session.add(override) db.session.commit() + + DonorsOverview.refresh_overview() flash("Výjimka uložena", "success") else: override = DonorsOverride.query.get(override_form.rodne_cislo.data) if override is not None: db.session.delete(override) db.session.commit() + + DonorsOverview.refresh_overview() flash("Výjimka smazána", "success") else: flash("Není co mazat", "warning") From b4ff6a2700dd9fb2d8a88d3f7a10d749e377aee3 Mon Sep 17 00:00:00 2001 From: j-jzk Date: Wed, 26 May 2021 10:35:24 +0200 Subject: [PATCH 03/17] opraveny chyby (donors_override) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - nešlo vícekrát uložit (přepsat) záznam u jednoho dárce - u sloupců, které měly záznam v donors_override, který byl následně smazán, se záznam v donors_overview nepřepsal na původní hodnotu (mějme např. Jana Nováka, kterého přejmenujeme na Josefa Vomáčku. Když smažeme ve formuláři donors_override křestní jméno a uložíme, zůstane dárce jako Josef Vomáčka a ne Jan Vomáčka, jak jsme chtěli) --- registry/donor/forms.py | 4 +++- registry/donor/views.py | 2 +- 2 files changed, 4 insertions(+), 2 deletions(-) diff --git a/registry/donor/forms.py b/registry/donor/forms.py index d886a9a0..0133747b 100644 --- a/registry/donor/forms.py +++ b/registry/donor/forms.py @@ -114,5 +114,7 @@ def _get_field_data(self): self.field_data = {} for field in self._fields_: data = getattr(self, field).data - if data != "": + if data: self.field_data[field] = data + else: + self.field_data[field] = None diff --git a/registry/donor/views.py b/registry/donor/views.py index 3ebe084c..ede55560 100644 --- a/registry/donor/views.py +++ b/registry/donor/views.py @@ -287,7 +287,7 @@ def save_override(): if override_form.validate_on_submit(): if not delete: override = DonorsOverride(**override_form.field_data) - db.session.add(override) + db.session.merge(override) db.session.commit() DonorsOverview.refresh_overview() From f2ac0470aa32a2af1212f220ca19cca5230ba8b1 Mon Sep 17 00:00:00 2001 From: j-jzk Date: Wed, 26 May 2021 08:59:21 +0000 Subject: [PATCH 04/17] =?UTF-8?q?upraven=20vzhled=20tabulky=20pro=20p?= =?UTF-8?q?=C5=99epis=20=C3=BAdaj=C5=AF?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Co-authored-by: Lumír 'Frenzy' Balhar --- registry/templates/donor/detail.html | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/registry/templates/donor/detail.html b/registry/templates/donor/detail.html index 178ae053..0fb56146 100644 --- a/registry/templates/donor/detail.html +++ b/registry/templates/donor/detail.html @@ -154,7 +154,7 @@

Přepsání údajů

{% with form=donors_override_form %}
{{ form.csrf_token }} - +
From 18cbdf5b4c3bfc24f89a63965399dc51cfb80b66 Mon Sep 17 00:00:00 2001 From: j-jzk Date: Wed, 26 May 2021 14:58:27 +0200 Subject: [PATCH 05/17] =?UTF-8?q?p=C5=99id=C3=A1no=20zv=C3=BDraznov=C3=A1n?= =?UTF-8?q?=C3=AD=20d=C3=A1rc=C5=AF=20(donors=5Foverride)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Přidáno zvýraznování dárců se záznamem v donors_override. --- registry/donor/models.py | 18 ++++++++ registry/donor/views.py | 13 +++++- registry/templates/donor/overview.html | 59 +++++++++++++++++++++----- 3 files changed, 79 insertions(+), 11 deletions(-) diff --git a/registry/donor/models.py b/registry/donor/models.py index 6a2f4d94..92d25f4a 100644 --- a/registry/donor/models.py +++ b/registry/donor/models.py @@ -564,3 +564,21 @@ class DonorsOverride(db.Model): city = db.Column(db.String) postal_code = db.Column(db.String(5)) kod_pojistovny = db.Column(db.String(3)) + + def to_dict(self): + result = {} + for field in [ + "rodne_cislo", + "first_name", + "last_name", + "address", + "city", + "postal_code", + "kod_pojistovny", + ]: + if getattr(self, field) is not None: + result[field] = str(getattr(self, field)) + else: + result[field] = None + + return result diff --git a/registry/donor/views.py b/registry/donor/views.py index ede55560..be35c717 100644 --- a/registry/donor/views.py +++ b/registry/donor/views.py @@ -278,7 +278,7 @@ def unignore_donor(): return redirect(url_for("donor.show_ignored")) -@blueprint.post("/override") +@blueprint.post("/override/") @login_required def save_override(): override_form = DonorsOverrideForm() @@ -306,3 +306,14 @@ def save_override(): flash_errors(override_form) return redirect(url_for("donor.detail", rc=override_form.rodne_cislo.data)) + + +@blueprint.get("/override/all") +@login_required +def get_overrides(): + overrides_dict = {} + + for override in DonorsOverride.query.all(): + overrides_dict[str(override.rodne_cislo)] = override.to_dict() + + return jsonify(overrides_dict) diff --git a/registry/templates/donor/overview.html b/registry/templates/donor/overview.html index 7d3c15a1..33383cde 100644 --- a/registry/templates/donor/overview.html +++ b/registry/templates/donor/overview.html @@ -29,7 +29,54 @@

Přehled dárců

} $(document).ready( function () { - $('#overview').DataTable({ + const columnDefs = [ + { + "targets": "rodne_cislo", + "render": function (data, type, row, meta) { + if (type == "display") + return "" + row.rodne_cislo + "" + else + return data; + } + }, { + "targets": "donations", + "render": function (data, type, row, meta) { + return data.total + create_tooltip_for_donations(data); + } + }, + ]; + + // Highlight fields that have a corresponding record in donors_override + let overrides = {}; // Will be set by an AJAX request + + for (const column of ["first_name", "last_name", "address", "city", "postal_code", "kod_pojistovny"]) { + columnDefs.push({ + "targets": column, + "render": function (data, type, row, meta) { + // We only want to highlight the value that is displayed + // to the user, not the ones used for searching and sorting + if (type != "display") return data; + + if (overrides.hasOwnProperty(row.rodne_cislo) && overrides[row.rodne_cislo][column]) { + return `${data}`; + } else { + return data; + } + } + }); + } + + // Forward declaration of the DataTable + let dataTable = null; + + // Request the list of overrides + $.getJSON("{{ url_for('donor.get_overrides') }}", function (data) { + overrides = data; + if (dataTable !== null) + dataTable.draw(); + }); + + dataTable = $('#overview').DataTable({ language: { url: '//cdn.datatables.net/plug-ins/1.10.21/i18n/Czech.json' }, @@ -41,15 +88,7 @@

Přehled dárců

{"data": "{{ column_class }}"}, {%- endfor %} ], - "columnDefs": [{ - "targets": "rodne_cislo", - "render": function ( data, type, row, meta ) { - return "" + row.rodne_cislo + "";} - },{ - "targets": "donations", - "render": function ( data, type, row, meta ) { - return data.total + create_tooltip_for_donations(data);} - },] + "columnDefs": columnDefs }); } ); From 1321ca317f69ee69c876704c1c5b57209df28138 Mon Sep 17 00:00:00 2001 From: j-jzk Date: Thu, 27 May 2021 10:34:25 +0200 Subject: [PATCH 06/17] =?UTF-8?q?p=C5=99id=C3=A1ny=20testy=20pro=20p=C5=99?= =?UTF-8?q?eps=C3=A1n=C3=AD=20udaj=C5=AF=20d=C3=A1rce?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- tests/test_donor.py | 45 +++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 45 insertions(+) diff --git a/tests/test_donor.py b/tests/test_donor.py index da3c9dbd..94ee9f1f 100644 --- a/tests/test_donor.py +++ b/tests/test_donor.py @@ -87,3 +87,48 @@ def test_ignore(self, user, testapp, rodne_cislo): do = testapp.get(url_for("donor.detail", rc=rodne_cislo), status=200) assert do.status_code == 200 + + +class TestOverride: + @pytest.mark.parametrize("rodne_cislo", sample_of_rc(5)) + def test_override(self, user, testapp, rodne_cislo): + login(user, testapp) + res = testapp.get(url_for("donor.detail", rc=rodne_cislo)) + + old_first_name = re.search(r"
  • \s*Jméno: (.*)\s*
  • ", str(res)).group(1) + old_last_name = re.search(r"
  • \s*Příjmení: (.*)\s*
  • ", str(res)).group(1) + + # Test save + form = res.forms["donorsOverrideForm"] + form["first_name"] = "--First--" + form["last_name"] = "--Last--" + res = form.submit("save_btn").follow() + + assert "Výjimka uložena" in res + assert "Jméno: --First--" in res + assert "Příjmení: --Last--" in res + + # Test repeated save + form = res.forms["donorsOverrideForm"] + res = form.submit("save_btn").follow() + + assert "Výjimka uložena" in res + assert "Jméno: --First--" in res + assert "Příjmení: --Last--" in res + + # Test removing one field's value but keeping the other + form = res.forms["donorsOverrideForm"] + form["first_name"] = "" + res = form.submit("save_btn").follow() + + assert "Výjimka uložena" in res + assert ("Jméno: " + old_first_name) in res + assert "Příjmení: --Last--" in res + + # Test deleting the override + form = res.forms["donorsOverrideForm"] + res = form.submit("delete_btn").follow() + + assert "Výjimka smazána" in res + assert ("Jméno: " + old_first_name) in res + assert ("Příjmení: " + old_last_name) in res From a37a36f654dcddad4d47c167aae33548ffb8cd76 Mon Sep 17 00:00:00 2001 From: j-jzk Date: Thu, 27 May 2021 08:39:34 +0000 Subject: [PATCH 07/17] =?UTF-8?q?mal=C3=A9=20=C3=BApravy=20(donors=5Foverr?= =?UTF-8?q?ide)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - změněny verze migrací - porovnávání verzí SQLite změněno na porovnávání tuplů Co-authored-by: Lumír 'Frenzy' Balhar --- migrations/versions/60a681c463a2_create_donors_override.py | 4 ++-- registry/donor/models.py | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/migrations/versions/60a681c463a2_create_donors_override.py b/migrations/versions/60a681c463a2_create_donors_override.py index a7c7362e..b76f3fc0 100644 --- a/migrations/versions/60a681c463a2_create_donors_override.py +++ b/migrations/versions/60a681c463a2_create_donors_override.py @@ -1,7 +1,7 @@ """create_donors_override Revision ID: 60a681c463a2 -Revises: 6fe71f4f1aba +Revises: 971ddb205e0c Create Date: 2021-05-25 12:50:58.779359 """ @@ -10,7 +10,7 @@ # revision identifiers, used by Alembic. revision = "60a681c463a2" -down_revision = "6fe71f4f1aba" +down_revision = "971ddb205e0c" branch_labels = None depends_on = None diff --git a/registry/donor/models.py b/registry/donor/models.py index 92d25f4a..add60f75 100644 --- a/registry/donor/models.py +++ b/registry/donor/models.py @@ -189,7 +189,7 @@ def dict_for_frontend(self): return donor_dict def refresh_override(cls, commit=True): - if sqlite3.sqlite_version_info[0] >= 3 and sqlite3.sqlite_version_info[1] >= 33: + if sqlite3.sqlite_version_info >= (3, 33): # The UPDATE - FROM syntax is supported from SQLite version 3.33.0 db.session.execute( """ From 5a39650de8da4ebb21f66475860ab9471bdf479a Mon Sep 17 00:00:00 2001 From: j-jzk Date: Thu, 27 May 2021 15:38:03 +0200 Subject: [PATCH 08/17] =?UTF-8?q?p=C5=99id=C3=A1no=20zv=C3=BDraznov=C3=A1n?= =?UTF-8?q?=C3=AD=20d=C3=A1rc=C5=AF=20p=C5=99i=20ud=C4=9Blov=C3=A1n=C3=AD?= =?UTF-8?q?=20medail=C3=AD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- registry/static/donors_override_highlight.js | 39 ++++++++++++ registry/templates/donor/award_prep.html | 63 +++++++++++--------- registry/templates/donor/overview.html | 28 +-------- 3 files changed, 78 insertions(+), 52 deletions(-) create mode 100644 registry/static/donors_override_highlight.js diff --git a/registry/static/donors_override_highlight.js b/registry/static/donors_override_highlight.js new file mode 100644 index 00000000..c3835a04 --- /dev/null +++ b/registry/static/donors_override_highlight.js @@ -0,0 +1,39 @@ +/** + * Sets up highlighting of values overriden in donors_override + * @param {string} url The URL to request (url_for('donor.get_overrides')) + * @param {object} columnDefs DataTables columnDefs + * @param {Function} onDataReady Called when information about overrides is downloaded + */ +function highlightOverridenValues(url, columnDefs, onDataReady) { + let overrides = {}; // Will be set by an AJAX request + + for (const column of ["first_name", "last_name", "address", "city", "postal_code", "kod_pojistovny"]) { + columnDefs.push({ + "targets": column, + "name": column, + "render": function (data, type, row, meta) { + // We only want to highlight the value that is displayed + // to the user, not the ones used for searching and sorting + if (type != "display") return data; + + let rodneCislo; + if (row instanceof Array) + rodneCislo = row[0] + else + rodneCislo = row.rodne_cislo; + + if (overrides.hasOwnProperty(rodneCislo) && overrides[rodneCislo][column]) { + return `${data}`; + } else { + return data; + } + } + }); + } + + // Request the list of overrides + $.getJSON(url, function (data) { + overrides = data; + onDataReady && onDataReady(); + }); +} \ No newline at end of file diff --git a/registry/templates/donor/award_prep.html b/registry/templates/donor/award_prep.html index e8189471..17da6896 100644 --- a/registry/templates/donor/award_prep.html +++ b/registry/templates/donor/award_prep.html @@ -14,13 +14,13 @@

    Přehled dárců k ocenění: {{ medal.title }}

    Rodné číslo Jméno
    - - - - - - - + + + + + + + @@ -51,33 +51,42 @@

    Přehled dárců k ocenění: {{ medal.title }}

    {% endblock %} {% block js %} +
    Rodné čísloJménoPřijmeníAdresaMěstoPSČPojišťovnaRodné čísloJménoPřijmeníAdresaMěstoPSČPojišťovna Darování Podpis Vybrat vše