Skip to content
Snippets Groups Projects

Compare revisions

Changes are shown as if the source revision was being merged into the target revision. Learn more about comparing revisions.

Source

Select target project
No results found
Select Git revision

Target

Select target project
  • mj/mo-submit
1 result
Select Git revision
Show changes
Commits on Source (6)
......@@ -34,6 +34,7 @@ def import_schools(path: Path, nuts: str):
for line in file:
f = line.split('\t')
red_izo = f[columns['Red IZO']]
ico = f[columns['IČO']]
druh = f[columns['Druh školy/zařízení']]
# Address of legal entity
......@@ -85,6 +86,7 @@ def import_schools(path: Path, nuts: str):
school = db.School(
place=place,
red_izo=red_izo,
ico=ico,
official_name=nazev,
address=addr2,
is_zs=is_zs,
......
SQLALCHEMY_DATABASE_URI = "postgresql:///mo_submit"
SQLALCHEMY_DATABASE_URI = "postgresql:///mo_osmo"
SQLALCHEMY_TRACK_MODIFICATIONS = False
SQLALCHEMY_ECHO = False
......
-- CREATE ROLE mo_submit LOGIN PASSWORD 'pass';
-- CREATE DATABASE mo_submit WITH OWNER=mo_submit;
-- GRANT mo_submit TO some_admin;
-- CREATE ROLE mo_osmo LOGIN PASSWORD 'pass';
-- CREATE DATABASE mo_osmo WITH OWNER=mo_osmo;
-- GRANT mo_osmo TO some_admin;
SET ROLE mo_submit;
SET ROLE mo_osmo;
-- Uživatelský účet
CREATE TABLE users (
......@@ -60,6 +60,7 @@ CREATE TABLE places (
CREATE TABLE schools (
place_id int PRIMARY KEY REFERENCES places(place_id) ON DELETE CASCADE,
red_izo varchar(255) DEFAULT NULL,
ico varchar(255) DEFAULT NULL,
official_name varchar(255) DEFAULT NULL,
address varchar(255) DEFAULT NULL,
is_zs boolean NOT NULL DEFAULT false,
......
-- Delete all tables and types
SET ROLE mo_submit;
SET ROLE mo_osmo;
DO $$ DECLARE
r RECORD;
......
......@@ -3,12 +3,13 @@
import datetime
from enum import Enum as PythonEnum, auto
import re
from sqlalchemy import \
Boolean, Column, DateTime, Enum, ForeignKey, Integer, String, Text, UniqueConstraint, \
text, \
create_engine, inspect
from sqlalchemy.engine import Engine
from sqlalchemy.orm import relationship, sessionmaker, Session, class_mapper
from sqlalchemy.orm import relationship, sessionmaker, Session, class_mapper, joinedload
from sqlalchemy.orm.attributes import get_history
from sqlalchemy.dialects.postgresql import JSONB
from sqlalchemy.ext.declarative import declarative_base
......@@ -106,14 +107,23 @@ class Place(Base):
return len(PlaceType.choices(level=self.level + 1)) > 0
def place_by_code(code: str) -> Optional[Place]:
if code.startswith("#"):
try:
id = int(code[1:])
return get_session().query(Place).get(id)
except ValueError:
def get_root_place():
return get_session().query(Place).filter_by(parent=None).one()
def get_place_by_code(code: str, fetch_school: bool = False) -> Optional[Place]:
if code == "":
return None
return get_session().query(Place).filter_by(code=code).first()
q = get_session().query(Place)
if fetch_school:
q = q.options(joinedload(Place.school))
m = re.fullmatch(r'#(\d+)', code)
if m:
return q.get(int(m[1]))
else:
return q.filter_by(code=code).one_or_none()
class School(Base):
......@@ -121,6 +131,7 @@ class School(Base):
place_id = Column(Integer, ForeignKey('places.place_id', ondelete='CASCADE'), primary_key=True)
red_izo = Column(String(255), server_default=text("NULL::character varying"))
ico = Column(String(255), server_default=text("NULL::character varying"))
official_name = Column(String(255), server_default=text("NULL::character varying"))
address = Column(String(255), server_default=text("NULL::character varying"))
is_zs = Column(Boolean, nullable=False, server_default=text("false"))
......
......@@ -60,7 +60,7 @@ def parse_school(kod: str, errs: List[str]) -> Optional[db.Place]:
errs.append('Škola je povinná')
return None
place = mo.util.get_place_by_code(kod, fetch_school=True)
place = db.get_place_by_code(kod, fetch_school=True)
if not place:
errs.append('Škola nenalezena')
return None
......
......@@ -64,23 +64,3 @@ def send_password_reset_email(user: db.User, link: str):
if sm.returncode != 0:
raise RuntimeError('Sendmail failed with return code {}'.format(sm.returncode))
def get_root_place():
return db.get_session().query(db.Place).filter_by(parent=None).one()
# FIXME: Duplikuje mo.db.place_by_code()
def get_place_by_code(code: str, fetch_school: bool = False) -> Optional[db.Place]:
if code == "":
return None
q = db.get_session().query(db.Place)
if fetch_school:
q = q.options(joinedload(db.Place.school))
m = re.fullmatch(r'#(\d+)', code)
if m:
return q.get(int(m[1]))
else:
return q.filter_by(code=code).one_or_none()
......@@ -73,6 +73,7 @@ class PlaceEditForm(FlaskForm):
class PlaceSchoolEditForm(PlaceEditForm):
red_izo = wtforms.StringField('RED_IZO')
ico = wtforms.StringField('IČO')
official_name = wtforms.StringField('Oficiální název')
address = wtforms.StringField('Adresa')
is_zs = wtforms.BooleanField('')
......@@ -201,7 +202,7 @@ def org_place_move(id: int):
if form.reset.data:
return redirect(url_for('org_place_move', id=id))
new_parent = db.place_by_code(form.code.data)
new_parent = db.get_place_by_code(form.code.data)
if not new_parent:
search_error = 'Místo s tímto kódem se nepovedlo nalézt'
else:
......@@ -350,7 +351,7 @@ def org_place_new_child(id: int):
@app.route('/org/place/')
def org_place_root():
root = mo.util.get_root_place()
root = db.get_root_place()
return redirect(url_for('org_place', id=root.place_id))
......
......@@ -7,6 +7,7 @@
<tr><td>Kód:<td>{{ place.code or '#' + place.place_id|string }}
{% if school %}
<tr><td>RED_IZO:<td>{{ school.red_izo or '–' }}
<tr><td>IČO:<td>{{ school.ico or '–' }}
<tr><td>Ofic. název:<td>{{ school.official_name or '–' }}
<tr><td>Adresa:<td>{{ school.address or '–' }}
<tr><td>Druh školy:<td>{{ "ZŠ" if school.is_zs else "" }} {{ "SŠ" if school.is_ss else "" }}
......