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