Skip to content
Open
9 changes: 7 additions & 2 deletions app/__init__.py
Original file line number Diff line number Diff line change
Expand Up @@ -14,9 +14,13 @@
from flask import Flask
from flask_babel import Babel

def create_app():
def create_app(config_class=None):
app = Flask(__name__)
app.config.from_object(Config)
if config_class:
app.config.from_object(config_class)
else:
app.config.from_object(Config)

app.config["SQLALCHEMY_ENGINES"] = {
"default": {
"url": app.config['SQLALCHEMY_DATABASE_URI'],
Expand All @@ -27,6 +31,7 @@ def create_app():

from app.models import db
db.init_app(app)

from app.email import mail
mail.init_app(app)
from app.ckan import ckan
Expand Down
2 changes: 1 addition & 1 deletion app/cli.py
Original file line number Diff line number Diff line change
Expand Up @@ -2,10 +2,10 @@
from app.models import Gemeente, User, Gemeente_user, Election, BAG, add_user, db
from app.ckan import ckan
from app.email import send_invite, send_update
from app.form_utils import create_record, kieskringen
from app.parser import UploadFileParser
from app.published_monitor import PublishedMonitor
from app.validator import Validator
from app.routes import create_record, kieskringen
from app.db_utils import db_delete, db_delete_all, db_exec_all, db_exec_one, db_exec_one_optional
from app.utils import get_gemeente, publish_gemeente_records, remove_id
from app.stembureaumanager import StembureauManager
Expand Down
4 changes: 3 additions & 1 deletion app/db_utils.py
Original file line number Diff line number Diff line change
@@ -1,6 +1,5 @@
from app.models import db
from sqlalchemy import select, delete, func
from flask import current_app

def db_exec_one(query):
return db.session.execute(query).scalar_one()
Expand Down Expand Up @@ -54,3 +53,6 @@ def db_delete(klass, **kwargs):

def db_delete_all(klass):
return db.session.execute(delete(klass)).rowcount

def db_commit():
db.session.commit()
114 changes: 114 additions & 0 deletions app/form_utils.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,114 @@
import csv
from decimal import Decimal

from app.db_utils import db_exec_first
from app.models import BAG
from flask import current_app

kieskringen = []
with open('app/data/kieskringen.csv') as IN:
reader = csv.reader(IN, delimiter=';')
# Skip header
next(reader)
kieskringen = list(reader)


def create_record(form, stemlokaal_id, gemeente, election):
ID = 'NLODS%sstembureaus%s%s' % (
gemeente.gemeente_code,
current_app.config['CKAN_CURRENT_ELECTIONS'][election]['election_date'],
current_app.config['CKAN_CURRENT_ELECTIONS'][election]['election_number']
)

kieskring_id = ''
hoofdstembureau = ''
if (election.startswith('gemeenteraadsverkiezingen') or
election.startswith('kiescollegeverkiezingen') or
election.startswith('eilandsraadsverkiezingen')):
kieskring_id = gemeente.gemeente_naam
hoofdstembureau = gemeente.gemeente_naam
elif (election.startswith('referendum') or
election.startswith('Tweede Kamerverkiezingen') or
election.startswith('Provinciale Statenverkiezingen')):
for row in kieskringen:
if row[2] == gemeente.gemeente_naam:
kieskring_id = row[0]
hoofdstembureau = row[1]
elif election.startswith('Europese Parlementsverkiezingen'):
kieskring_id = 'Nederland'
hoofdstembureau = 'Nederland'

record = {
'UUID': stemlokaal_id,
'Gemeente': gemeente.gemeente_naam,
'CBS gemeentecode': gemeente.gemeente_code,
'Kieskring ID': kieskring_id,
'Hoofdstembureau': hoofdstembureau,
'ID': ID
}

# Process the fields from the form
for f in form:
# Save the Verkiezingen by joining the list into a string
if f.label.text == 'Verkiezingen':
record[f.label.text] = ';'.join(f.data)
elif (f.type != 'SubmitField' and
f.type != 'CSRFTokenField' and f.type != 'RadioField'):
record[f.label.text[:62]] = f.data

# prevent this field from being saved as it is not a real form field.
del record['Adres stembureau']

bag_nummer = record['BAG Nummeraanduiding ID']
bag_record = db_exec_first(BAG, nummeraanduiding=bag_nummer)


if bag_record is not None:
bag_conversions = {
'verblijfsobjectgebruiksdoel': 'Gebruiksdoel van het gebouw',
'openbareruimte': 'Straatnaam',
'huisnummer': 'Huisnummer',
'huisletter': 'Huisletter',
'huisnummertoevoeging': 'Huisnummertoevoeging',
'postcode': 'Postcode',
'woonplaats': 'Plaats',
'lat': 'Latitude',
'lon': 'Longitude',
'x': 'X',
'y': 'Y'
}

for bag_field, record_field in bag_conversions.items():
bag_field_value = getattr(bag_record, bag_field, None)
if bag_field_value is not None:
if isinstance(bag_field_value, Decimal):
# do not overwrite geocoordinates if they were otherwise specified
if not record.get(record_field):
record[record_field] = float(bag_field_value)
else:
record[record_field] = bag_field_value.encode(
'utf-8'
).decode()
else:
record[record_field] = None

## We stopped adding the wijk and buurt data as the data
## supplied by CBS is not up to date enough as it is only
## released once a year and many months after changes
## have been made by the municipalities.
#wk_code, wk_naam, bu_code, bu_naam = find_buurt_and_wijk(
# bag_nummer,
# gemeente.gemeente_code,
# bag_record.lat,
# bag_record.lon
#)
#if wk_naam:
# record['Wijknaam'] = wk_naam
#if wk_code:
# record['CBS wijknummer'] = wk_code
#if bu_naam:
# record['Buurtnaam'] = bu_naam
#if bu_code:
# record['CBS buurtnummer'] = bu_code

return record
44 changes: 43 additions & 1 deletion app/forms.py
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
from datetime import datetime

from app.db_utils import db_exec_all, db_exec_one_optional
from app.models import BAG
from app.db_utils import db_exec_all, db_exec_one_optional
from flask import current_app
from flask_wtf import FlaskForm
from flask_wtf.file import FileField, FileRequired, FileAllowed
Expand Down Expand Up @@ -76,6 +76,48 @@ def process_formdata(self, valuelist):
self.data = value


class DeleteUserForm(FlaskForm):
hidden = HiddenField(
name="user_id",
id="user_id"
)

submit = SubmitField(
'Verwijderen',
render_kw={
'class': 'btn btn-danger'
}
)

submit_one = SubmitField(
'Verwijderen uit deze gemeente',
render_kw={
'class': 'btn btn-danger'
}
)

submit_all = SubmitField(
'Verwijderen uit alle gemeenten',
render_kw={
'class': 'btn btn-danger'
}
)


class DeleteStembureauForm(FlaskForm):
hidden = HiddenField(
name="stemlokaal_id",
id="stemlokaal_id"
)

submit = SubmitField(
'Verwijderen',
render_kw={
'class': 'btn btn-danger'
}
)


class ResetPasswordRequestForm(FlaskForm):
email = StringField('E-mailadres', validators=[DataRequired(), Email()])
submit = SubmitField(
Expand Down
2 changes: 1 addition & 1 deletion app/models.py
Original file line number Diff line number Diff line change
Expand Up @@ -9,7 +9,7 @@
from flask_login import UserMixin, LoginManager
from werkzeug.security import generate_password_hash, check_password_hash
from sqlalchemy import ForeignKey, String, DECIMAL, select
from sqlalchemy.orm import DeclarativeBase, Mapped, mapped_column, relationship
from sqlalchemy.orm import DeclarativeBase, Mapped, mapped_column, relationship, close_all_sessions
from flask_sqlalchemy_lite import SQLAlchemy
from typing import List
import jwt
Expand Down
Loading