From 000beceef0a36eb74beeb7fc94406cb78c061670 Mon Sep 17 00:00:00 2001 From: thomaswoehlke <thomas.woehlke@gmail.com> Date: Tue, 13 Apr 2021 19:48:04 +0200 Subject: [PATCH] working on 0.0.29 Release: Fixed #201 UML: blueprint user --- .../navigation/admin_navbar_dropdown.html | 4 +- .../application/application_service.py | 1 + .../application/application_services.py | 3 +- .../application/application_views.py | 3 + .../application/navigation/navbar.html | 2 + .../application/navigation/navtabs.html | 6 + .../ecdc/navigation/ecdc_navbar_dropdown.html | 4 +- .../owid/navigation/owid_navbar_dropdown.html | 4 +- .../rki_bundeslaender_navbar_dropdown.html | 4 +- .../rki_landkreise_navbar_dropdown.html | 4 +- .../rki_vaccination_navbar_dropdown.html | 4 +- src/covid19/blueprints/user/__init__.py | 0 .../blueprints/user/templates/__init__.py | 0 .../user/country/user_country_all.html | 0 .../user/country/user_country_one.html | 0 .../date_reported/user_date_reported_all.html | 0 .../date_reported/user_date_reported_one.html | 0 ...er_date_reported_one_cases_cumulative.html | 0 .../user_date_reported_one_cases_new.html | 0 ...r_date_reported_one_deaths_cumulative.html | 0 .../user_date_reported_one_deaths_new.html | 0 .../user/navigation/user_navbar_dropdown.html | 21 ++ .../user/navigation/user_navtabs.html | 18 + .../user/region/user_region_all.html | 0 .../user/region/user_region_one.html | 0 .../user/templates/user/user_info.html | 0 .../user/templates/user/user_tasks.html | 0 src/covid19/blueprints/user/user_model.py | 323 ++++++++++++++++++ src/covid19/blueprints/user/user_service.py | 14 + src/covid19/blueprints/user/user_views.py | 228 +++++++++++++ .../who/navigation/who_navbar_dropdown.html | 5 +- 31 files changed, 632 insertions(+), 16 deletions(-) create mode 100644 src/covid19/blueprints/user/__init__.py create mode 100644 src/covid19/blueprints/user/templates/__init__.py create mode 100644 src/covid19/blueprints/user/templates/user/country/user_country_all.html create mode 100644 src/covid19/blueprints/user/templates/user/country/user_country_one.html create mode 100644 src/covid19/blueprints/user/templates/user/date_reported/user_date_reported_all.html create mode 100644 src/covid19/blueprints/user/templates/user/date_reported/user_date_reported_one.html create mode 100644 src/covid19/blueprints/user/templates/user/date_reported/user_date_reported_one_cases_cumulative.html create mode 100644 src/covid19/blueprints/user/templates/user/date_reported/user_date_reported_one_cases_new.html create mode 100644 src/covid19/blueprints/user/templates/user/date_reported/user_date_reported_one_deaths_cumulative.html create mode 100644 src/covid19/blueprints/user/templates/user/date_reported/user_date_reported_one_deaths_new.html create mode 100644 src/covid19/blueprints/user/templates/user/navigation/user_navbar_dropdown.html create mode 100644 src/covid19/blueprints/user/templates/user/navigation/user_navtabs.html create mode 100644 src/covid19/blueprints/user/templates/user/region/user_region_all.html create mode 100644 src/covid19/blueprints/user/templates/user/region/user_region_one.html create mode 100644 src/covid19/blueprints/user/templates/user/user_info.html create mode 100644 src/covid19/blueprints/user/templates/user/user_tasks.html create mode 100644 src/covid19/blueprints/user/user_model.py create mode 100644 src/covid19/blueprints/user/user_service.py create mode 100644 src/covid19/blueprints/user/user_views.py diff --git a/src/covid19/blueprints/admin/templates/admin/navigation/admin_navbar_dropdown.html b/src/covid19/blueprints/admin/templates/admin/navigation/admin_navbar_dropdown.html index fd893d1a..ba500689 100644 --- a/src/covid19/blueprints/admin/templates/admin/navigation/admin_navbar_dropdown.html +++ b/src/covid19/blueprints/admin/templates/admin/navigation/admin_navbar_dropdown.html @@ -1,9 +1,9 @@ <li class="nav-item dropdown"> - <a class="nav-link dropdown-toggle" href="#" id="navbarDropdown" role="button" + <a class="nav-link dropdown-toggle" href="#" id="navbarDropdownAdmin" role="button" data-toggle="dropdown" aria-haspopup="true" aria-expanded="false"> Admin </a> - <div class="dropdown-menu" aria-labelledby="navbarDropdown"> + <div class="dropdown-menu" aria-labelledby="navbarDropdownAdmin"> <a class="dropdown-item" href="{{ url_for( 'app_admin.url_admin_tasks') }}"> Admin </a> diff --git a/src/covid19/blueprints/application/application_service.py b/src/covid19/blueprints/application/application_service.py index a7acebfb..ad21ff57 100644 --- a/src/covid19/blueprints/application/application_service.py +++ b/src/covid19/blueprints/application/application_service.py @@ -1,5 +1,6 @@ from database import app + #TODO: deprecated class ApplicationService: def __init__(self, database): diff --git a/src/covid19/blueprints/application/application_services.py b/src/covid19/blueprints/application/application_services.py index 0a294ac2..276c3581 100644 --- a/src/covid19/blueprints/application/application_services.py +++ b/src/covid19/blueprints/application/application_services.py @@ -8,6 +8,7 @@ from covid19.blueprints.rki.rki_bundeslaender.rki_bundeslaender_service import R from covid19.blueprints.rki.rki_landkreise.rki_landkreise_service import RkiLandkreiseService from covid19.blueprints.rki.rki_vaccination.rki_vaccination_service import RkiVaccinationService from covid19.blueprints.who.who_service import WhoService +from covid19.blueprints.user.user_service import UserService ############################################################################################ @@ -15,7 +16,6 @@ from covid19.blueprints.who.who_service import WhoService # Services # admin_service = AdminService(db) -#TODO: deprecated application_service = ApplicationService(db) ecdc_service = EcdcService(db) owid_service = OwidService(db) @@ -23,4 +23,5 @@ rki_service_bundeslaender = RkiBundeslaenderService(db) rki_service_landkreise = RkiLandkreiseService(db) rki_vaccination_service = RkiVaccinationService(db) who_service = WhoService(db) +user_service = UserService(db) db.create_all() diff --git a/src/covid19/blueprints/application/application_views.py b/src/covid19/blueprints/application/application_views.py index 22528f07..9bd09eea 100644 --- a/src/covid19/blueprints/application/application_views.py +++ b/src/covid19/blueprints/application/application_views.py @@ -19,6 +19,7 @@ from covid19.blueprints.rki.rki_landkreise.rki_landkreise_views import app_rki_l from covid19.blueprints.rki.rki_vaccination.rki_vaccination_views import app_rki_vaccination from covid19.blueprints.who.who_views import app_who from covid19.blueprints.owid.owid_views import app_owid +from covid19.blueprints.user.user_views import app_user app_application = Blueprint('application', __name__, template_folder='templates', url_prefix='/') @@ -30,6 +31,8 @@ app.register_blueprint(app_rki_landkreise, url_prefix='/rki/landkreise') app.register_blueprint(app_rki_vaccination, url_prefix='/rki/vaccination') app.register_blueprint(app_who, url_prefix='/who') app.register_blueprint(app_owid, url_prefix='/owid') +app.register_blueprint(app_user, url_prefix='/user') + ############################################################################################ # diff --git a/src/covid19/blueprints/application/templates/application/navigation/navbar.html b/src/covid19/blueprints/application/templates/application/navigation/navbar.html index 338c39e4..c5f152af 100644 --- a/src/covid19/blueprints/application/templates/application/navigation/navbar.html +++ b/src/covid19/blueprints/application/templates/application/navigation/navbar.html @@ -28,6 +28,8 @@ {% include 'admin/navigation/admin_navbar_dropdown.html' %} + {% include 'user/navigation/user_navbar_dropdown.html' %} + </ul> </div> </span> diff --git a/src/covid19/blueprints/application/templates/application/navigation/navtabs.html b/src/covid19/blueprints/application/templates/application/navigation/navtabs.html index 5ffb16c8..c06fab0f 100644 --- a/src/covid19/blueprints/application/templates/application/navigation/navtabs.html +++ b/src/covid19/blueprints/application/templates/application/navigation/navtabs.html @@ -48,5 +48,11 @@ Admin </a> </li> + <li class="nav-item"> + <a class="nav-link" + href="{{ url_for( 'user.url_user_info') }}"> + User + </a> + </li> </ul> </nav> \ No newline at end of file diff --git a/src/covid19/blueprints/ecdc/templates/ecdc/navigation/ecdc_navbar_dropdown.html b/src/covid19/blueprints/ecdc/templates/ecdc/navigation/ecdc_navbar_dropdown.html index 6718469e..304b399c 100644 --- a/src/covid19/blueprints/ecdc/templates/ecdc/navigation/ecdc_navbar_dropdown.html +++ b/src/covid19/blueprints/ecdc/templates/ecdc/navigation/ecdc_navbar_dropdown.html @@ -1,9 +1,9 @@ <li class="nav-item dropdown"> - <a class="nav-link dropdown-toggle" href="#" id="navbarDropdown" + <a class="nav-link dropdown-toggle" href="#" id="navbarDropdownEcdc" role="button" data-toggle="dropdown" aria-haspopup="true" aria-expanded="false"> ECDC </a> - <div class="dropdown-menu" aria-labelledby="navbarDropdown"> + <div class="dropdown-menu" aria-labelledby="navbarDropdownEcdc"> <a class="dropdown-item" href="{{ url_for( 'ecdc.url_ecdc_date_reported_all') }}">ECDC</a> <div class="dropdown-divider"></div> diff --git a/src/covid19/blueprints/owid/templates/owid/navigation/owid_navbar_dropdown.html b/src/covid19/blueprints/owid/templates/owid/navigation/owid_navbar_dropdown.html index 3ac42e88..eef84a17 100644 --- a/src/covid19/blueprints/owid/templates/owid/navigation/owid_navbar_dropdown.html +++ b/src/covid19/blueprints/owid/templates/owid/navigation/owid_navbar_dropdown.html @@ -1,9 +1,9 @@ <li class="nav-item dropdown"> - <a class="nav-link dropdown-toggle" href="#" id="navbarDropdown" + <a class="nav-link dropdown-toggle" href="#" id="navbarDropdownOwid" role="button" data-toggle="dropdown" aria-haspopup="true" aria-expanded="false"> OWID </a> - <div class="dropdown-menu" aria-labelledby="navbarDropdown"> + <div class="dropdown-menu" aria-labelledby="navbarDropdownOwid"> <a class="dropdown-item" href="{{ url_for( 'owid.url_owid_date_reported_all') }}"> OWID Date Reported diff --git a/src/covid19/blueprints/rki/rki_bundeslaender/templates/rki_bundeslaender/navigation/rki_bundeslaender_navbar_dropdown.html b/src/covid19/blueprints/rki/rki_bundeslaender/templates/rki_bundeslaender/navigation/rki_bundeslaender_navbar_dropdown.html index d72dd464..dc574594 100644 --- a/src/covid19/blueprints/rki/rki_bundeslaender/templates/rki_bundeslaender/navigation/rki_bundeslaender_navbar_dropdown.html +++ b/src/covid19/blueprints/rki/rki_bundeslaender/templates/rki_bundeslaender/navigation/rki_bundeslaender_navbar_dropdown.html @@ -1,9 +1,9 @@ <li class="nav-item dropdown"> - <a class="nav-link dropdown-toggle" href="#" id="navbarDropdown" role="button" + <a class="nav-link dropdown-toggle" href="#" id="navbarDropdownRkiBundeslaender" role="button" data-toggle="dropdown" aria-haspopup="true" aria-expanded="false"> RKI Bundeslaender </a> - <div class="dropdown-menu" aria-labelledby="navbarDropdown"> + <div class="dropdown-menu" aria-labelledby="navbarDropdownRkiBundeslaender"> <a class="dropdown-item" href="{{ url_for('rki_bundeslaender.url_rki_bundeslaender_info') }}"> RKI Bundeslaender Info diff --git a/src/covid19/blueprints/rki/rki_landkreise/templates/rki_landkreise/navigation/rki_landkreise_navbar_dropdown.html b/src/covid19/blueprints/rki/rki_landkreise/templates/rki_landkreise/navigation/rki_landkreise_navbar_dropdown.html index ef56d593..8a416470 100644 --- a/src/covid19/blueprints/rki/rki_landkreise/templates/rki_landkreise/navigation/rki_landkreise_navbar_dropdown.html +++ b/src/covid19/blueprints/rki/rki_landkreise/templates/rki_landkreise/navigation/rki_landkreise_navbar_dropdown.html @@ -1,9 +1,9 @@ <li class="nav-item dropdown"> - <a class="nav-link dropdown-toggle" href="#" id="navbarDropdown" role="button" + <a class="nav-link dropdown-toggle" href="#" id="navbarDropdownRkiLandkreise" role="button" data-toggle="dropdown" aria-haspopup="true" aria-expanded="false"> RKI Landkreise </a> - <div class="dropdown-menu" aria-labelledby="navbarDropdown"> + <div class="dropdown-menu" aria-labelledby="navbarDropdownRkiLandkreise"> <a class="dropdown-item" href="{{ url_for( 'rki_landkreise.url_rki_landkreise_info') }}"> RKI Landkreise diff --git a/src/covid19/blueprints/rki/rki_vaccination/templates/rki_vaccination/navigation/rki_vaccination_navbar_dropdown.html b/src/covid19/blueprints/rki/rki_vaccination/templates/rki_vaccination/navigation/rki_vaccination_navbar_dropdown.html index b85894a6..d86f2ea2 100644 --- a/src/covid19/blueprints/rki/rki_vaccination/templates/rki_vaccination/navigation/rki_vaccination_navbar_dropdown.html +++ b/src/covid19/blueprints/rki/rki_vaccination/templates/rki_vaccination/navigation/rki_vaccination_navbar_dropdown.html @@ -1,9 +1,9 @@ <li class="nav-item dropdown"> - <a class="nav-link dropdown-toggle" href="#" id="navbarDropdown" role="button" + <a class="nav-link dropdown-toggle" href="#" id="navbarDropdownRkiVaccination" role="button" data-toggle="dropdown" aria-haspopup="true" aria-expanded="false"> RKI Vaccination </a> - <div class="dropdown-menu" aria-labelledby="navbarDropdown"> + <div class="dropdown-menu" aria-labelledby="navbarDropdownRkiVaccination"> <a class="dropdown-item" href="{{ url_for( 'rki_vaccination.url_vaccination_info') }}"> RKI Vaccination diff --git a/src/covid19/blueprints/user/__init__.py b/src/covid19/blueprints/user/__init__.py new file mode 100644 index 00000000..e69de29b diff --git a/src/covid19/blueprints/user/templates/__init__.py b/src/covid19/blueprints/user/templates/__init__.py new file mode 100644 index 00000000..e69de29b diff --git a/src/covid19/blueprints/user/templates/user/country/user_country_all.html b/src/covid19/blueprints/user/templates/user/country/user_country_all.html new file mode 100644 index 00000000..e69de29b diff --git a/src/covid19/blueprints/user/templates/user/country/user_country_one.html b/src/covid19/blueprints/user/templates/user/country/user_country_one.html new file mode 100644 index 00000000..e69de29b diff --git a/src/covid19/blueprints/user/templates/user/date_reported/user_date_reported_all.html b/src/covid19/blueprints/user/templates/user/date_reported/user_date_reported_all.html new file mode 100644 index 00000000..e69de29b diff --git a/src/covid19/blueprints/user/templates/user/date_reported/user_date_reported_one.html b/src/covid19/blueprints/user/templates/user/date_reported/user_date_reported_one.html new file mode 100644 index 00000000..e69de29b diff --git a/src/covid19/blueprints/user/templates/user/date_reported/user_date_reported_one_cases_cumulative.html b/src/covid19/blueprints/user/templates/user/date_reported/user_date_reported_one_cases_cumulative.html new file mode 100644 index 00000000..e69de29b diff --git a/src/covid19/blueprints/user/templates/user/date_reported/user_date_reported_one_cases_new.html b/src/covid19/blueprints/user/templates/user/date_reported/user_date_reported_one_cases_new.html new file mode 100644 index 00000000..e69de29b diff --git a/src/covid19/blueprints/user/templates/user/date_reported/user_date_reported_one_deaths_cumulative.html b/src/covid19/blueprints/user/templates/user/date_reported/user_date_reported_one_deaths_cumulative.html new file mode 100644 index 00000000..e69de29b diff --git a/src/covid19/blueprints/user/templates/user/date_reported/user_date_reported_one_deaths_new.html b/src/covid19/blueprints/user/templates/user/date_reported/user_date_reported_one_deaths_new.html new file mode 100644 index 00000000..e69de29b diff --git a/src/covid19/blueprints/user/templates/user/navigation/user_navbar_dropdown.html b/src/covid19/blueprints/user/templates/user/navigation/user_navbar_dropdown.html new file mode 100644 index 00000000..11bca063 --- /dev/null +++ b/src/covid19/blueprints/user/templates/user/navigation/user_navbar_dropdown.html @@ -0,0 +1,21 @@ + <li class="nav-item dropdown"> + <a class="nav-link dropdown-toggle" href="#" id="navbarDropdownUser" + role="button" data-toggle="dropdown" aria-haspopup="true" aria-expanded="false"> + User + </a> + <div class="dropdown-menu" aria-labelledby="navbarDropdownUser"> + <a class="dropdown-item" + href="{{ url_for( 'user.url_user_info') }}"> + User + </a> + <div class="dropdown-divider"></div> + <a class="dropdown-item" + href="{{ url_for( 'user.url_user_info') }}"> + User Info + </a> + <a class="dropdown-item" + href="{{ url_for( 'user.url_user_tasks') }}"> + User Tasks + </a> + </div> + </li> \ No newline at end of file diff --git a/src/covid19/blueprints/user/templates/user/navigation/user_navtabs.html b/src/covid19/blueprints/user/templates/user/navigation/user_navtabs.html new file mode 100644 index 00000000..0d78a487 --- /dev/null +++ b/src/covid19/blueprints/user/templates/user/navigation/user_navtabs.html @@ -0,0 +1,18 @@ + + + <div class="container"> + <div class="row-cols-1"> + <nav> + <ul class="nav nav-tabs"> + <li class="nav-item"> + <a class="nav-link" + href="{{ url_for( 'user.url_user_info') }}">User Info</a> + </li> + <li class="nav-item"> + <a class="nav-link" + href="{{ url_for( 'user.url_user_tasks') }}">User tasks</a> + </li> + </ul> + </nav> + </div> + </div> \ No newline at end of file diff --git a/src/covid19/blueprints/user/templates/user/region/user_region_all.html b/src/covid19/blueprints/user/templates/user/region/user_region_all.html new file mode 100644 index 00000000..e69de29b diff --git a/src/covid19/blueprints/user/templates/user/region/user_region_one.html b/src/covid19/blueprints/user/templates/user/region/user_region_one.html new file mode 100644 index 00000000..e69de29b diff --git a/src/covid19/blueprints/user/templates/user/user_info.html b/src/covid19/blueprints/user/templates/user/user_info.html new file mode 100644 index 00000000..e69de29b diff --git a/src/covid19/blueprints/user/templates/user/user_tasks.html b/src/covid19/blueprints/user/templates/user/user_tasks.html new file mode 100644 index 00000000..e69de29b diff --git a/src/covid19/blueprints/user/user_model.py b/src/covid19/blueprints/user/user_model.py new file mode 100644 index 00000000..48845038 --- /dev/null +++ b/src/covid19/blueprints/user/user_model.py @@ -0,0 +1,323 @@ +from sqlalchemy import and_, func +from datetime import date +from database import db, ITEMS_PER_PAGE +from sqlalchemy.orm import joinedload +from covid19.blueprints.application.application_model import ApplicationDateReported, ApplicationRegion + + +class UserDateReported(ApplicationDateReported): + __tablename__ = 'usr_datereported' + __mapper_args__ = {'concrete': True} + __table_args__ = ( + db.UniqueConstraint('date_reported', 'datum', name="uix_usr_datereported"), + ) + + id = db.Column(db.Integer, primary_key=True) + date_reported = db.Column(db.String(255), nullable=False, unique=True) + year_week = db.Column(db.String(255), nullable=False) + datum = db.Column(db.Date, nullable=False, unique=True) + year = db.Column(db.Integer, nullable=False) + month = db.Column(db.Integer, nullable=False) + day_of_month = db.Column(db.Integer, nullable=False) + day_of_week = db.Column(db.Integer, nullable=False) + week_of_year = db.Column(db.Integer, nullable=False) + + @classmethod + def create_new_object_factory(cls, my_date_rep): + my_datum = date.fromisoformat(my_date_rep) + (my_iso_year, week_number, weekday) = my_datum.isocalendar() + my_year_week = "" + str(my_iso_year) + if week_number < 10: + my_year_week += "-0" + else: + my_year_week += "-" + my_year_week += str(week_number) + return UserDateReported( + date_reported=my_date_rep, + datum=my_datum, + year=my_datum.year, + month=my_datum.month, + day_of_month=my_datum.day, + day_of_week=weekday, + week_of_year=week_number, + year_week=my_year_week + ) + + +class UserRegion(ApplicationRegion): + __tablename__ = 'usr_country_region' + __mapper_args__ = {'concrete': True} + __table_args__ = ( + db.UniqueConstraint('region', name="uix_usr_country_region"), + ) + + id = db.Column(db.Integer, primary_key=True) + region = db.Column(db.String(255), nullable=False, unique=True) + + +class UserCountry(db.Model): + __tablename__ = 'usr_country' + __table_args__ = ( + db.UniqueConstraint('country_code', 'country', name="uix_usr_country"), + ) + + id = db.Column(db.Integer, primary_key=True) + country_code = db.Column(db.String(255), unique=True, nullable=False) + country = db.Column(db.String(255), unique=True, nullable=False) + region_id = db.Column(db.Integer, db.ForeignKey('usr_country_region.id'), nullable=False) + region = db.relationship( + 'UserRegion', + lazy='joined', + cascade='all, delete', + order_by='UserRegion.region') + + def __str__(self): + result = "" + result += self.country_code + result += " " + result += self.country + result += " " + result += self.region.region + result += " " + return result + + @classmethod + def remove_all(cls): + for one in cls.get_all(): + db.session.delete(one) + db.session.commit() + return None + + @classmethod + def get_all_as_page(cls, page): + return db.session.query(cls)\ + .order_by(cls.country)\ + .paginate(page, per_page=ITEMS_PER_PAGE) + + @classmethod + def get_all(cls): + return db.session.query(cls)\ + .order_by(cls.country)\ + .all() + + @classmethod + def get_all_as_dict(cls): + countries = {} + for my_country in cls.get_all(): + countries[my_country.country_code] = my_country + return countries + + @classmethod + def get_by_id(cls, other_id): + return db.session.query(cls)\ + .filter(cls.id == other_id)\ + .one() + + @classmethod + def get_germany(cls): + return db.session.query(cls)\ + .filter(cls.country_code == 'DE')\ + .one_or_none() + + @classmethod + def find_by_country_code_and_country_and_who_region_id(cls, i_country_code, i_country, my_region): + return db.session.query(cls).filter( + and_( + cls.country_code == i_country_code, + cls.country == i_country, + cls.region_id == my_region.id + ) + ).one_or_none() + + @classmethod + def find_by_country_code(cls, i_country_code): + return db.session.query(cls).filter( + cls.country_code == i_country_code + ).one_or_none() + + @classmethod + def find_by_country(cls, i_country): + return db.session.query(cls).filter( + cls.country == i_country + ).one_or_none() + + @classmethod + def get_by_country_code(cls, i_country_code): + return db.session.query(cls).filter( + cls.country_code == i_country_code + ).one() + + @classmethod + def get_by_country(cls, i_country): + return db.session.query(cls).filter( + cls.country == i_country + ).one() + + @classmethod + def get_who_countries_for_region(cls, region, page): + return db.session.query(cls).filter( + cls.region == region + ).order_by(cls.country).paginate(page, per_page=ITEMS_PER_PAGE) + + +class UserData(db.Model): + __tablename__ = 'usr' + + id = db.Column(db.Integer, primary_key=True) + cases_new = db.Column(db.Integer, nullable=False) + cases_cumulative = db.Column(db.Integer, nullable=False) + deaths_new = db.Column(db.Integer, nullable=False) + deaths_cumulative = db.Column(db.Integer, nullable=False) + date_reported_id = db.Column(db.Integer, + db.ForeignKey('usr_datereported.id'), nullable=False) + date_reported = db.relationship( + 'UserDateReported', + lazy='joined', + cascade='all, delete', + order_by='desc(UserDateReported.date_reported)') + country_id = db.Column(db.Integer, + db.ForeignKey('usr_country.id'), nullable=False) + country = db.relationship( + 'UserCountry', + lazy='joined', + cascade='all, delete', + order_by='asc(UserCountry.country)') + + @classmethod + def remove_all(cls): + for one in cls.get_all(): + db.session.delete(one) + db.session.commit() + return None + + @classmethod + def get_all_as_page(cls, page): + return db.session.query(cls).paginate(page, per_page=ITEMS_PER_PAGE) + + @classmethod + def get_all(cls): + return db.session.query(cls).all() + + @classmethod + def get_by_id(cls, other_id): + return db.session.query(cls).filter(cls.id == other_id).one() + + @classmethod + def find_one_or_none_by_date_and_country(cls, my_date_reported, my_country): + return db.session.query(cls).filter( + and_( + cls.date_reported_id == my_date_reported.id, + cls.country_id == my_country.id + ) + ).one_or_none() + + @classmethod + def get_data_for_country(cls, user_country, page): + return db.session.query(cls).filter( + cls.country_id == user_country.id + ).populate_existing().options( + joinedload(cls.country).joinedload(UserCountry.region), + joinedload(cls.date_reported) + ).paginate(page, per_page=ITEMS_PER_PAGE) + + @classmethod + def get_data_for_day(cls, date_reported, page): + return db.session.query(cls).filter( + cls.date_reported_id == date_reported.id + ).populate_existing().options( + joinedload(cls.country).joinedload(UserCountry.region), + joinedload(cls.date_reported) + ).order_by( + cls.deaths_new.desc(), + cls.cases_new.desc(), + cls.deaths_cumulative.desc(), + cls.cases_cumulative.desc() + ).paginate(page, per_page=ITEMS_PER_PAGE) + + @classmethod + def get_data_for_day_order_by_cases_new(cls, date_reported, page): + return db.session.query(cls).filter( + cls.date_reported_id == date_reported.id + ).populate_existing().options( + joinedload(cls.country).joinedload(UserCountry.region), + joinedload(cls.date_reported) + ).order_by( + cls.cases_new.desc() + ).paginate(page, per_page=ITEMS_PER_PAGE) + + @classmethod + def get_data_for_day_order_by_cases_cumulative(cls, date_reported, page): + return db.session.query(cls).filter( + cls.date_reported_id == date_reported.id + ).populate_existing().options( + joinedload(cls.country).joinedload(UserCountry.region), + joinedload(cls.date_reported) + ).order_by( + cls.cases_cumulative.desc() + ).paginate(page, per_page=ITEMS_PER_PAGE) + + @classmethod + def get_data_for_day_order_by_deaths_new(cls, date_reported, page): + return db.session.query(cls).filter( + cls.date_reported_id == date_reported.id + ).populate_existing().options( + joinedload(cls.country).joinedload(UserCountry.region), + joinedload(cls.date_reported) + ).order_by( + cls.deaths_new.desc() + ).paginate(page, per_page=ITEMS_PER_PAGE) + + @classmethod + def get_data_for_day_order_by_deaths_cumulative(cls, date_reported, page): + return db.session.query(cls).filter( + cls.date_reported_id == date_reported.id + ).populate_existing().options( + joinedload(cls.country).joinedload(UserCountry.region), + joinedload(cls.date_reported) + ).order_by( + cls.deaths_cumulative.desc() + ).paginate(page, per_page=ITEMS_PER_PAGE) + + @classmethod + def get_data_for_country_order_by_cases_new(cls, user_country, page): + return db.session.query(cls).filter( + cls.country_id == user_country.id + ).populate_existing().options( + joinedload(cls.country).joinedload(UserCountry.region), + joinedload(cls.date_reported) + ).order_by( + cls.cases_new.desc() + ).paginate(page, per_page=ITEMS_PER_PAGE) + + @classmethod + def get_data_for_country_order_by_cases_cumulative(cls, user_country, page): + return db.session.query(cls).filter( + cls.country_id == user_country.id + ).populate_existing().options( + joinedload(cls.country).joinedload(UserCountry.region), + joinedload(cls.date_reported) + ).order_by( + cls.cases_cumulative.desc() + ).paginate(page, per_page=ITEMS_PER_PAGE) + + @classmethod + def get_data_for_country_order_by_deaths_new(cls, user_country, page): + return db.session.query(cls).filter( + cls.country_id == user_country.id + ).populate_existing().options( + joinedload(cls.country).joinedload(UserCountry.region), + joinedload(cls.date_reported) + ).order_by( + cls.deaths_new.desc() + ).paginate(page, per_page=ITEMS_PER_PAGE) + + @classmethod + def get_data_for_country_order_by_deaths_cumulative(cls, user_country, page): + return db.session.query(cls).filter( + cls.country_id == user_country.id + ).populate_existing().options( + joinedload(cls.country).joinedload(UserCountry.region), + joinedload(cls.date_reported) + ).order_by( + cls.deaths_cumulative.desc() + ).paginate(page, per_page=ITEMS_PER_PAGE) diff --git a/src/covid19/blueprints/user/user_service.py b/src/covid19/blueprints/user/user_service.py new file mode 100644 index 00000000..bb801978 --- /dev/null +++ b/src/covid19/blueprints/user/user_service.py @@ -0,0 +1,14 @@ +from flask import flash + +from database import app + + +class UserService: + def __init__(self, database): + app.logger.debug("------------------------------------------------------------") + app.logger.debug(" User Service [init]") + app.logger.debug("------------------------------------------------------------") + self.__database = database + app.logger.debug("------------------------------------------------------------") + app.logger.info(" User Service [ready]") + diff --git a/src/covid19/blueprints/user/user_views.py b/src/covid19/blueprints/user/user_views.py new file mode 100644 index 00000000..ec4ce8c6 --- /dev/null +++ b/src/covid19/blueprints/user/user_views.py @@ -0,0 +1,228 @@ +from flask import render_template, redirect, url_for, flash, Blueprint +from sqlalchemy.exc import OperationalError +from celery import states +from celery.utils.log import get_task_logger +from flask_admin.contrib.sqla import ModelView + +from database import app, admin, db +from covid19.blueprints.application.application_services import user_service +from covid19.blueprints.application.application_workers import celery + +from covid19.blueprints.user.user_model import UserRegion, UserCountry, UserDateReported, UserData +from covid19.blueprints.application.application_model_transient import ApplicationPage + + +app_user = Blueprint('user', __name__, template_folder='templates', url_prefix='/user') + +# admin.add_view(ModelView(userImport, db.session, category="User")) +admin.add_view(ModelView(UserDateReported, db.session, category="User")) +admin.add_view(ModelView(UserRegion, db.session, category="User")) +admin.add_view(ModelView(UserCountry, db.session, category="User")) +admin.add_view(ModelView(UserData, db.session, category="User")) + + +# --------------------------------------------------------------------------------------------------------------- +# Url Routes Frontend +# --------------------------------------------------------------------------------------------------------------- + + +@app_user.route('/info') +def url_user_info(): + page_info = ApplicationPage('user', "Info") + return render_template( + 'user/user_info.html', + page_info=page_info) + + +@app_user.route('/tasks') +def url_user_tasks(): + page_info = ApplicationPage('user', "Tasks") + return render_template( + 'user/user_tasks.html', + page_info=page_info) + + +@app_user.route('/date_reported/all/page/<int:page>') +@app_user.route('/date_reported/all') +def url_user_date_reported_all(page: int = 1): + page_info = ApplicationPage('user', "Date Reported", "All") + try: + page_data = UserDateReported.get_all_as_page(page) + except OperationalError: + flash("No regions in the database.") + page_data = None + return render_template( + 'user/date_reported/user_date_reported_all.html', + page_data=page_data, + page_info=page_info) + + +@app_user.route('/date_reported/<int:date_reported_id>/page/<int:page>') +@app_user.route('/date_reported/<int:date_reported_id>') +def url_user_date_reported(date_reported_id: int, page: int = 1): + date_reported = UserDateReported.get_by_id(date_reported_id) + page_info = ApplicationPage( + "Date Reported: " + date_reported.date_reported, + 'user', + "data of all reported countries for User date reported " + date_reported.date_reported + " " + ) + try: + page_data = UserData.get_data_for_day(date_reported, page) + except OperationalError: + flash("No data in the database.") + page_data = None + return render_template( + 'user/date_reported/user_date_reported_one.html', + user_date_reported=date_reported, + page_data=page_data, + page_info=page_info) + + +@app_user.route('/date_reported/<int:date_reported_id>/cases_new/page/<int:page>') +@app_user.route('/date_reported/<int:date_reported_id>/cases_new') +def url_user_date_reported_cases_new(date_reported_id: int, page: int = 1): + date_reported = UserDateReported.get_by_id(date_reported_id) + page_info = ApplicationPage( + "Date Reported: " + date_reported.date_reported, + 'user', + "data of all reported countries for User date reported " + date_reported.date_reported + " " + ) + try: + page_data = UserData.get_data_for_day_order_by_cases_new(date_reported, page) + except OperationalError: + flash("No data in the database.") + page_data = None + return render_template( + 'user/date_reported/user_date_reported_one_cases_new.html', + user_date_reported=date_reported, + page_data=page_data, + page_info=page_info) + + +@app_user.route('/date_reported/<int:date_reported_id>/cases_cumulative/page/<int:page>') +@app_user.route('/date_reported/<int:date_reported_id>/cases_cumulative') +def url_user_date_reported_cases_cumulative(date_reported_id: int, page: int = 1): + date_reported = UserDateReported.get_by_id(date_reported_id) + page_info = ApplicationPage( + "Date Reported: " + date_reported.date_reported, + 'user', + "data of all reported countries for User date reported " + date_reported.date_reported + " " + ) + try: + page_data = UserData.get_data_for_day_order_by_cases_cumulative(date_reported, page) + except OperationalError: + flash("No data in the database.") + page_data = None + return render_template( + 'user/date_reported/user_date_reported_one_cases_cumulative.html', + user_date_reported=date_reported, + page_data=page_data, + page_info=page_info) + + +@app_user.route('/date_reported/<int:date_reported_id>/deaths_new/page/<int:page>') +@app_user.route('/date_reported/<int:date_reported_id>/deaths_new') +def url_user_date_reported_deaths_new(date_reported_id: int, page: int = 1): + date_reported = UserDateReported.get_by_id(date_reported_id) + page_info = ApplicationPage( + "Date Reported: " + date_reported.date_reported, + 'user', + "data of all reported countries for User date reported " + date_reported.date_reported + " " + ) + try: + page_data = UserData.get_data_for_day_order_by_deaths_new(date_reported, page) + except OperationalError: + flash("No data in the database.") + page_data = None + return render_template( + 'user/date_reported/user_date_reported_one_deaths_new.html', + user_date_reported=date_reported, + page_data=page_data, + page_info=page_info) + + +@app_user.route('/date_reported/<int:date_reported_id>/deaths_cumulative/page/<int:page>') +@app_user.route('/date_reported/<int:date_reported_id>/deaths_cumulative') +def url_user_date_reported_deaths_cumulative(date_reported_id: int, page: int = 1): + date_reported = UserDateReported.get_by_id(date_reported_id) + page_info = ApplicationPage( + "Date Reported: " + date_reported.date_reported, + 'user', + "data of all reported countries for User date reported " + date_reported.date_reported + " " + ) + try: + page_data = UserData.get_data_for_day_order_by_deaths_cumulative(date_reported, page) + except OperationalError: + flash("No data in the database.") + page_data = None + return render_template( + 'user/date_reported/user_date_reported_one_deaths_cumulative.html', + user_date_reported=date_reported, + page_data=page_data, + page_info=page_info) + + +@app_user.route('/region/all/page/<int:page>') +@app_user.route('/region/all') +def url_user_region_all(page: int = 1): + page_info = ApplicationPage('user', "Region", "All") + try: + page_data = UserRegion.get_all_as_page(page) + except OperationalError: + flash("No regions in the database.") + page_data = None + return render_template( + 'user/region/user_region_all.html', + page_data=page_data, + page_info=page_info) + + +@app_user.route('/region/<int:region_id>/page/<int:page>') +@app_user.route('/region/<int:region_id>') +def url_user_region(region_id: int, page: int = 1): + user_region = None + page_info = ApplicationPage("Countries", "User Region") + try: + user_region = UserRegion.get_by_id(region_id) + page_data = UserCountry.get_user_countries_for_region(user_region, page) + page_info.title = user_region.region + page_info.subtitle = "User Region" + page_info.subtitle_info = "Countries of User Region " + user_region.region + except OperationalError: + flash("No countries of that region in the database.") + page_data = None + return render_template( + 'user/region/user_region_one.html', + user_region=user_region, + page_data=page_data, + page_info=page_info) + + +@app_user.route('/country/all/page/<int:page>') +@app_user.route('/country/all') +def url_user_country_all(page: int = 1): + page_info = ApplicationPage('user', "Countries", "All") + try: + page_data = UserCountry.get_all_as_page(page) + except OperationalError: + flash("No regions in the database.") + page_data = None + return render_template( + 'user/country/user_country_all.html', + page_data=page_data, + page_info=page_info) + + +@app_user.route('/country/<int:country_id>/page/<int:page>') +@app_user.route('/country/<int:country_id>') +def url_user_country(country_id: int, page: int = 1): + user_country = UserCountry.get_by_id(country_id) + page_data = UserData.get_data_for_country(user_country, page) + page_info = ApplicationPage(user_country.country, + "Country "+user_country.country_code, + "Data per Day in Country "+user_country.country+" of User Region "+user_country.region.region) + return render_template( + 'user/country/user_country_one.html', + user_country=user_country, + page_data=page_data, + page_info=page_info) diff --git a/src/covid19/blueprints/who/templates/who/navigation/who_navbar_dropdown.html b/src/covid19/blueprints/who/templates/who/navigation/who_navbar_dropdown.html index 3f148443..a3426bfc 100644 --- a/src/covid19/blueprints/who/templates/who/navigation/who_navbar_dropdown.html +++ b/src/covid19/blueprints/who/templates/who/navigation/who_navbar_dropdown.html @@ -1,10 +1,9 @@ <li class="nav-item dropdown"> - <a class="nav-link dropdown-toggle" href="#" id="navbarDropdown" + <a class="nav-link dropdown-toggle" href="#" id="navbarDropdownWho" role="button" data-toggle="dropdown" aria-haspopup="true" aria-expanded="false"> WHO </a> - <div class="dropdown-menu" aria-labelledby="navbarDropdown"> - <!-- TODO: change URL to for_url() --> + <div class="dropdown-menu" aria-labelledby="navbarDropdownWho"> <a class="dropdown-item" href="{{ url_for( 'who.url_who_date_reported_all') }}"> WHO -- GitLab